/*
	Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.data.CssClassStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.data.CssClassStore"] = true;
dojo.provide("dojox.data.CssClassStore");
dojo.require("dojox.data.CssRuleStore");


dojo.declare("dojox.data.CssClassStore", dojox.data.CssRuleStore, {
	//	summary:
	//		Basic store to display CSS information.
	//	description:
	//		The CssClassStore allows users to get information about active Css classes in the page running the CssClassStore.
	//		It can also filter out classes from specific stylesheets.  The attributes it exposes on classes are as follows:
	//			class:		The classname, including the '.'.
	//			classSans:	The classname without the '.'.

	_labelAttribute: 'class', // text representation of the Item [label and identifier may need to stay due to method names]
	_idAttribute: 'class',
	_cName: "dojox.data.CssClassStore",

	getFeatures: function(){
		//	summary:
		//		See dojo.data.api.Read.getFeatures()
		return {
			"dojo.data.api.Read" : true,
			"dojo.data.api.Identity" : true
		};
	},

	getAttributes: function(item){
		//	summary:
		//		See dojo.data.api.Read.getAttributes()
		this._assertIsItem(item);
		return ['class', 'classSans'];
	},

	getValue: function(item, attribute, defaultValue){
		//	summary:
		//		See dojo.data.api.Read.getValue()
		var values = this.getValues(item, attribute);
		if(values && values.length > 0){
			return values[0];
		}
		return defaultValue;
	},

	getValues: function(item, attribute){
		//	summary:
		//		See dojo.data.api.Read.getValues()
		this._assertIsItem(item);
		this._assertIsAttribute(attribute);
		var value = [];
		if(attribute === "class"){
			value = [item.className];
		}else if(attribute === "classSans"){
			value = [item.className.replace(/\./g,'')];
		}
		return value;
	},

	_handleRule: function(rule, styleSheet, href){
		//	summary:
		//		Handles the creation of an item based on the passed rule.  In this store, this implies
		//		parsing out all available class names.
		var obj = {};
		var s = rule['selectorText'].split(" ");
		for(var j=0; j<s.length; j++){
			var tmp = s[j];
			var first = tmp.indexOf('.');
			if(tmp && tmp.length > 0 && first !== -1){
				var last = tmp.indexOf(',') || tmp.indexOf('[');
				tmp = tmp.substring(first, ((last !== -1 && last > first)?last:tmp.length));
				obj[tmp] = true;
			}
		}
		for(var key in obj){
			if(!this._allItems[key]){
				var item = {};
				item.className = key;
				item[this._storeRef] = this;
				this._allItems[key] = item;
			}
		}
	},

	_handleReturn: function(){
		//	summary:
		//		Handles the return from a fetching action.  Delegates requests to act on the resulting
		//		item set to eitehr the _handleFetchReturn or _handleFetchByIdentityReturn depending on
		//		where the request originated.
		var _inProgress = [];
		
		var items = {};
		for(var i in this._allItems){
			items[i] = this._allItems[i];
		}
		var requestInfo;
		// One-level deep clone (can't use dojo.clone, since we don't want to clone all those store refs!)
		while(this._pending.length){
			requestInfo = this._pending.pop();
			requestInfo.request._items = items;
			_inProgress.push(requestInfo);
		}

		while(_inProgress.length){
			requestInfo = _inProgress.pop();
			if(requestInfo.fetch){
				this._handleFetchReturn(requestInfo.request);
			}else{
				this._handleFetchByIdentityReturn(requestInfo.request);
			}
		}
	},

	_handleFetchByIdentityReturn: function(request){
		//	summary:
		//		Handles a fetchByIdentity request by finding the correct item.
		var items = request._items;
		// Per https://bugs.webkit.org/show_bug.cgi?id=17935 , Safari 3.x always returns the selectorText
		// of a rule in full lowercase.
		var item = items[(dojo.isWebKit?request.identity.toLowerCase():request.identity)];
		if(!this.isItem(item)){
			item = null;
		}
		if(request.onItem){
			var scope = request.scope || dojo.global;
			request.onItem.call(scope, item);
		}
	},

	/* Identity API */
	getIdentity: function(/* item */ item){
		//	summary:
		//		See dojo.data.api.Identity.getIdentity()
		this._assertIsItem(item);
		return this.getValue(item, this._idAttribute);
	},

	getIdentityAttributes: function(/* item */ item){
		 //	summary:
		 //		See dojo.data.api.Identity.getIdentityAttributes()
		this._assertIsItem(item);
		return [this._idAttribute];
	},

	fetchItemByIdentity: function(/* request */ request){
		//	summary:
		//		See dojo.data.api.Identity.fetchItemByIdentity()
		request = request || {};
		if(!request.store){
			request.store = this;
		}
		if(this._pending && this._pending.length > 0){
			this._pending.push({request: request});
		}else{
			this._pending = [{request: request}];
			this._fetch(request);
		}
		return request;
	}
});

}
