/*
This is a giant "class" declaration for the SelectedTrimsMonitor type, which monitors state
for the AIC UI. 

lots of function literal style.

debug in address bar ...
javascript: StateMonitor.report()
*/

function selectedTrimsMonitor(numOfColumns) {
	// declare a variable to reference 'this', so that closures will have access to object in scope
	//(backwards compatible for previous problem w/ ECMAScript)
	var self = this;
	
	var resetFunc = null;
	
	var compTabOnState = selectedTrimsMonitor.OFF;
	var ajaxInProgress = false;
	
	var haveCompareData = false;
	var haveCompareCallbacks = new Array();
	var noCompareCallbacks = new Array();
	
	this.numberSelected = 0;
	this.columnPointers = new Array(); //will contain trimColumn objects
	
	// hack to reload competitive vehicles when user selects new mitsu trim
	// robot is page load or user clicking tab
	var trimSetByRobot = false; 
	
	for(var i=0; i < numOfColumns; i++) {
		this.columnPointers[i] = new trimColumn(i + 1);
	}
	
	
	this.setResetFunction = function(func) {
		resetFunc = func;
	};
	
	
	this.getResetFunction = function() {
		return resetFunc;
	};
	
	
	this.getDataWrapperForColumn = function(colNum) {
		var ptr = null;
		if(!colNum < 1 && !(colNum > self.columnPointers.length)) {
			ptr = self.columnPointers[colNum - 1];
		}
		
		return ptr;
	};
	
	
	this.registerDataCallback = function(type, func) {
		switch(type) {
			case selectedTrimsMonitor.COMPARE_DATA:
				haveCompareCallbacks.push(func);
			break;
			
			case selectedTrimsMonitor.NO_COMPARE_DATA:
				noCompareCallbacks.push(func);
			break;
		}
	};
	
	
	function fireCallbacks(type) {
		var arrRef;
		switch(type) {
			case selectedTrimsMonitor.COMPARE_DATA:
				arrRef = haveCompareCallbacks;
			break;
			
			case selectedTrimsMonitor.NO_COMPARE_DATA:
				arrRef = noCompareCallbacks;
			break;
		}
		
		for(var i = 0; i < arrRef.length; i++) {
			var func = arrRef[i];
			func();
		}
	}
	
	
	this.setHaveCompareData = function(val) {
		
		if(val) {
			fireCallbacks(selectedTrimsMonitor.COMPARE_DATA);
		}
		else {
			//only fire the callback if the value has just changed, for efficiency's sake:
			if(val != self.getHaveCompareData()) {
				fireCallbacks(selectedTrimsMonitor.NO_COMPARE_DATA);
			}
		}
		haveCompareData = val;
	};
	
	
	this.getHaveCompareData = function() {
		return haveCompareData;
	};
	
	
	this.setIsAjaxInProgress = function(val) {
		ajaxInProgress = val;
	};
	
	
	this.getIsAjaxInProgress = function() {
		return ajaxInProgress;
	};
	
	
	this.setCompetitiveTabState = function(val) {
		if(val == selectedTrimsMonitor.OFF || val == selectedTrimsMonitor.ON) {
			compTabOnState = val;
		}
		else {
			alert("Error: selectedTrimsMonitor.setCompetitiveTabState ... illegal argument");
		}
	};
	
	
	this.getCompetitiveTabState = function() {
		return compTabOnState;
	};
	
	
	this.getNumberOfColumns = function() {
		return self.columnPointers.length;
	};
	
	
	this.isColumnSelected = function(id) {
		/*
		 @id is assumed to >= 1
		*/
		var selected = false;
		
		if(i >= 1 && i <= self.columnPointers.length) { 
			
			var colRef = self.columnPointers[id - 1];
			selected = colRef.selected;
		}
		
		return selected;
	};
	
	
	this.getColumnforID = function(id) {
		var column = null;
		for(var i = 0; i < self.columnPointers.length; i++) {
			 
			var colRef = self.columnPointers[i];
			//alert("passed in: " + id + " this iteration" + colRef.trimID);
			if(colRef.trimID == id) {
				column = colRef.columnNumber;
				break;
			}
		}
		return column;
	};
	
	
	this.report = function() {
		var reportBody = "Competitive Tab State: " + this.getCompetitiveTabState() + "\n";
		for(var i = 0; i < self.columnPointers.length; i++) {
			var colRef = self.columnPointers[i];
			if(colRef.selected) {
				reportBody += "\nColumn " + colRef.columnNumber + ": selected\n";
				reportBody += "Trim ID " + colRef.trimID + "\n";
				reportBody += "Parent ID " + colRef.parentID + "\n"; 
			}
			else {
				reportBody += "Column " + colRef.columnNumber + ": NOT selected\n";
			}
		}
		alert(reportBody);
	}
	
	
	this.clear = function() {
		for(var i = 0; i < self.columnPointers.length; i++) {
			var colRef = self.columnPointers[i];
			if(colRef.selected) {
				colRef.selected = false;
			}
		}
	}
	
	
	this.setColumnMarkedTrims = function(arrMarked) {
		//etc
	}
	
	
	//helper function for  internal consumption only:
	function markDuplicates(arr) {
		var a = [];
		var l = arr.length;
		for( i = 0; i < arr.length; i++ ) {
		if( a.toString().indexOf( arr[i], 0) < 0 ) {
			a.push( arr[i] ); 
		}
		else {
			//reset duplicate columns here:
			var refFunc = self.getResetFunction();
			if(refFunc != null) {
				refFunc(i + 1);
			}
		}
		}
		
		return a;
	}
	
	
	this.getNormalizedSelections = function() {
		var uniqueSet;
		
		ids = new Array();
		for(var i = 0; i < self.columnPointers.length; i++) {
			var refTrimColumn = self.columnPointers[i];
			if(refTrimColumn.selected) {
				ids.push(refTrimColumn.trimID);
			}
		}
		uniqueSet = markDuplicates(ids);
		return uniqueSet;
	};
	
	
	this.trimEvent = function(type, colNum, newID, pID) {
		/* 
		@newID is functionally optional; is only meaningfully passed in when
		@type equals selectedTrimsMonitor.TYPE_SELECTED
		*/
		
		var colRef = self.columnPointers[colNum - 1]; //remember, array is zero-indexed
		if(type == selectedTrimsMonitor.TYPE_SELECTED) {
			//alert("selected");
			//get the associated trimColumn
			
			if(!colRef.selected) {
				colRef.selected = true;
				self.numberSelected ++;
			}
			colRef.trimID = newID;
			colRef.parentID = pID;
			//alert("colRef.trimID: " + colRef.trimID + "\ncolRef.parentID: " + colRef.parentID);
		}
		else if(selectedTrimsMonitor.TYPE_CLEARED) {
			colRef.selected = false;
			if(self.numberSelected > 0) {
				self.numberSelected --;
			}
		}
	};


} // end of selectedTrimsMonitor constructor


/* Class Constants */
selectedTrimsMonitor.TYPE_SELECTED = "selected";
selectedTrimsMonitor.TYPE_CLEARED = "cleared";
selectedTrimsMonitor.ON = "on";
selectedTrimsMonitor.OFF = "off";
selectedTrimsMonitor.COMPARE_DATA = "compare-data";
selectedTrimsMonitor.NO_COMPARE_DATA = "no-compare-data";


function trimColumn(id) {
	/*
	This is a simple 'class' signature employed by the SelectedTrimsMonitor
	*/
	this.columnNumber = id;
	this.trimID;
	this.parentID;
	this.selected = false;
}



