Ext.namespace("Ext.sai");
Ext.sai.SAIFiltering = function(config){
	Ext.apply(this, config);
	Ext.sai.SAIFiltering.superclass.constructor.call(this);
	this.init();
};
Ext.extend(Ext.sai.SAIFiltering, Ext.util.Observable, {
	
	init : Ext.emptyFn,
	sortHeaderCellMenu : null, 
	sortAscendingBtn : null,
	sortDescendingBtn : null, 
	clearAllFiltersBtn : null, 
	sortMenuItems : null, 
	sortMenuCurrentSortById : null, 
	sortMenuShowing : false,
	
	onActionBtnMenuItemCommit : function(item,b,e){
		item.associatedFilterItem.fireEvent("commit",item.associatedFilterItem);
		//item.parentMenu.hide(true);
	},
	
	onActionBtnMenuItemCancel : function(item,b,e){
		item.parentMenu.hide(true);
	},
	
	filterOptBtnHandler : function(menuItem){
		
	},
	
	onFilterOptCommit : function(menuItem, checked){
		//console.log(menuItem);
		if (checked === true){
			var origFilter, newFilter, sortArg;
			var stringSortFilterOptBtn = menuItem.findParentByType('menuitem');
			var associatedFilterItem = menuItem.associatedFilterItem;
			if (associatedFilterItem.sortArg == null){
				sortArg = "";
			} else {
				sortArg = associatedFilterItem.sortArg;
			}
			origFilter = associatedFilterItem.sortIdNum + ':' + associatedFilterItem.sortOp + ':' + sortArg;
			this.clearFilter(origFilter);
			associatedFilterItem.sortOp = menuItem.optName;
			//stringSortFilterOptBtn.text = "Filter Options ("+menuItem.text+")";
			if (associatedFilterItem.sortArg == null){
				sortArg = "";
			} else {
				sortArg = associatedFilterItem.sortArg;
			}
			newFilter = associatedFilterItem.sortIdNum + ':' + associatedFilterItem.sortOp + ':' + sortArg;
			this.checkFilter(newFilter);
			return true;
		}
	},
	
	onFilterMenuItemCommit : function(item){
		var parentMenu;
		if (item.mode == 'numeric'){
			var fields = item.menu.fields, field, gtText, ltText, eqText, filter, qString;
			gtText = fields.gt.getValue();		
			ltText = fields.lt.getValue();
			eqText = fields.eq.getValue();
			filter = item.sortIdNum + ':' + 'GT' + ':' + gtText;
			this.checkFilter(filter);
			filter = item.sortIdNum + ':' + 'LT' + ':' + ltText;
			this.checkFilter(filter);
			filter = item.sortIdNum + ':' + 'EQ' + ':' + eqText;
			this.checkFilter(filter);
			qString = this.createFilters();
			loadResults( qString );
			parentMenu = item.parentMenu;
			parentMenu.hide(true);
		} else if (item.mode == 'string'){
			var text = item.value.getValue();
			text=mgntescape(text);
			filter = item.sortIdNum + ':' + item.sortOp + ':' + text;
			this.checkFilter(filter);
			qString = this.createFilters();
			loadResults( qString );
			parentMenu = item.menu;
			parentMenu.hide(true);
		}
	},
	
	clearFilter : function(filter){
		var splits = filter.split(':',3);
		if (splits.length < 2){
			return;
		}
		var col = splits[0];
		var op = splits[1];
		var arg = "", blankArg = "";
		if (splits.length > 2) {
			arg = splits[2];
		}
		var tooFind = col + ":" + op + ":";
		var clearedFilter = col + ":" + op + ":" + blankArg;
		var isFound = false;
		for (var i = 0; i<workingFilters.length; i++) {
			if (workingFilters[i].indexOf(tooFind) == 0) {
				isFound = true;	
				workingFilters[i] = clearedFilter;
				break;
			}
		}
	},
	
	checkFilter : function(filter){
		var splits = filter.split(":",3);
		if (splits.length < 2){
			return;
		}
		var col = splits[0];
		var op = splits[1];
		// a no-arg is a deleted filter
		var arg = "";
		if (splits.length > 2) {
			arg = splits[2];
		}
		
		var tooFind = col + ":" + op + ":";
		var isFound = false;
		for (var i = 0; i<workingFilters.length; i++) {
			if (workingFilters[i].indexOf(tooFind) == 0) {
				isFound = true;	
				workingFilters[i] = filter;
				break;
			}
		}
		if (!isFound){
			workingFilters.push(filter);
		}
	},
	
	createFilters : function(){
		var qString = currentQueryNoFilters;
		for (var i=0; i<workingFilters.length; i++) {
			var wFilt = workingFilters[i];
			if (wFilt) {	
				var splits = wFilt.split(":",3);
				if (splits.length > 2) {
					var col = splits[0];
					var op = splits[1];
					var arg = encodeURI(splits[2]);
					
					qString = qString + "&filters=" 
						+ col + ":" 
						+ op + ":"
						+ arg;
				}
			}
		}
		return qString;
	},
	
	showSortHeaderCellBtn : function(cell){
		if (this.sortMenuShowing){
			return;
		};
		var sortHeaderCellBtnHolder = Ext.get('sortHeaderCellBtnHolder');
		if (sortHeaderCellBtnHolder){
			sortHeaderCellBtnHolder.remove();
		}
		// Btn positioner
		sortHeaderCellBtnHolder = Ext.get('sortHeaderCellBtnHolder');
		// Sort id
		sortMenuCurrentSortById = $(cell).attr('id');
		
	},
	hideSortHeaderCellBtn : function(cell){
		if(!this.sortMenuShowing){
			$(cell).find('#sortHeaderCellBtnHolder').remove();
		}
	},

	onSortMenuBtnClick : function(menuItem){
		executeSorting(sortMenuCurrentSortById, menuItem.sortByDirection);
	},
	
	sortHeaderCellBtnHandler : function(btn){
		executeSorting(btn.sortById, btn.sortByDirection);
	},
	
	onClearAllFiltersBtnClick : function(menuItem){
		var qString = currentQueryNoFilters;
		loadResults( qString );
	},
	
	onClearThisFilterBtnClick : function(menuItem){
		var origFilter, newFilter;
		var associatedFilterItem = menuItem.associatedFilterItem;
		origFilter = associatedFilterItem.sortIdNum + ':' + associatedFilterItem.sortOp + ':' + associatedFilterItem.sortArg;
		this.clearFilter(origFilter);
		if (associatedFilterItem.mode == 'numeric'){
			var fields = associatedFilterItem.menu.fields;
			associatedFilterItem.setValue( { 'gt' : null, 'lt' : null, 'eq' : null } );
		} else if (associatedFilterItem.mode == 'string'){
			associatedFilterItem.value.setValue('');
		}
		this.onFilterMenuItemCommit(associatedFilterItem);
		//associatedFilterItem.sortOp = menuItem.optName;
	},
	
	onBeforeFilterMenuCheckChange : function(item, checked){
		//var sortIdNum = item.sortIdNum;
		var btnChecked = item.checked;
		if (btnChecked){
			if (item.mode == 'numeric'){
				var fields = item.menu.fields;
				item.setValue( { 'gt' : null, 'lt' : null, 'eq' : null } );
			} else if (item.mode == 'string'){
				item.value.setValue('');
			}
			this.onFilterMenuItemCommit(item);
		}
		
	},
	
	performNewFilter : function(title, arg, opt, sortIdNum){
		// Text: EQ, EQIC, NEQ, NEQIC, CONT, CONTIC, STARTSWITH, STARTSWITHIC
		// Numeric: GT, LT, EQ
		// Date: BEFORE, BEFOREON, ON, ONAFTER, AFTER
		
		fltrOp = currentOps[sortIdNum];
		var previousArg = currentArgs[sortIdNum];
		var argIdx = previousArg.indexOf('=');
		var prevFltrArg = previousArg.substring(argIdx+1);
		fltrArg="fltrArgCol"+sortIdNum+"=" + mgntescape(prevFltrArg);
		
		var qString2 = currentQueryString.replace(fltrOp, "fltrOpCol"+sortIdNum+"=" + opt);
		var qString2 = currentQueryString;
		if(qString2.indexOf("fltrOpCol"+sortIdNum+"=") < 0){
			qString2 += "&fltrOpCol"+sortIdNum+"=" + opt;
		}

		qString2 = qString2.replace(fltrArg, "fltrArgCol"+sortIdNum+"=" + arg);
		if(qString2.indexOf("fltrArgCol"+sortIdNum+"=") < 0){
			qString2 += "&fltrArgCol"+sortIdNum+"=" + arg;
		}
		
		loadResults(qString2);
		
	}
	
});
