/*http://jqueryplugins.blogspot.com/#actualPlugin
selects elements based on custom data attributes. $(selector.data())
*/
(function($){
	var checkUndefined = function(a) {
		return typeof a === 'undefined';
	}
	$.expr[':'].data = function(elem, counter, params){
		if(checkUndefined(elem) || checkUndefined(params)) return false;
		var query = params[3]; 
		if(!query) return false; 
		var querySplitted = query.split('='); 
		var selectType = querySplitted[0].charAt( querySplitted[0].length-1 );
		if(selectType == '^' || selectType == '$' || selectType == '!' || selectType == '*'){
			querySplitted[0] = querySplitted[0].substring(0, querySplitted[0].length-1);
			if(!$.stringQuery && selectType != '!'){
				return false;
			}
		}
		else selectType = '=';
		var dataName = querySplitted[0]; 
		var dataNameSplitted = dataName.split('.');
		var data = $(elem).data(dataNameSplitted[0]);
		if(checkUndefined(data)) return false;
		if(dataNameSplitted[1]){
			for(i=1, x=dataNameSplitted.length; i<x; i++){ 
				data = data[dataNameSplitted[i]];
				if(checkUndefined(data)) return false;
			}
		}
		if(querySplitted[1]){ //should the data be of a specified value?
			var checkAgainst = (data+'');
			switch(selectType){
				case '=': //equals
					return checkAgainst == querySplitted[1]; 
				break;
				case '!': //does not equeal
					return checkAgainst != querySplitted[1];
				break;
				case '^': //starts with
					return $.stringQuery.startsWith(checkAgainst, querySplitted[1]);
				break;
				case '$': //ends with
					return $.stringQuery.endsWith(checkAgainst, querySplitted[1]);
				break;
				case '*': //contains
					return $.stringQuery.contains(checkAgainst, querySplitted[1]);
				break;
				default: //default should never happen
					return false;
				break;
			}			
		}
		else{ 
			return true;
		}
	}
})(jQuery);
