/* FILE INFORMATION
-----------------------------------------------------------------------------
Author:				Dan Rouw
Created:			6/23/2011 By Dan Rouw
Purpose:			To update the mini search for the new homepage. Also to convert it over to JQuery
Update History:		

-----------------------------------------------------------------------------
*/
MiniSearch = function(obj){
	this.formControlIDs = obj.formControlIDs;
	this.numFormControls = this.formControlIDs.length;
	this.controls = [];
	
	this.recordCountControl = jQuery('#'+obj.recordCountControl + ' > strong');
	this.searchButtonControl = jQuery('#'+obj.searchButtonControl);
	this.spinnerControl = jQuery('#'+obj.spinnerControl);
	
	this.searchURL = obj.searchURL;
	this.wsURL = obj.wsURL;
	this.wsMethod = obj.wsMethod;
	
	this.activeFilters = [];
	
	if( navigator.userAgent.toLowerCase().indexOf("msie 6") != -1 ){
		this.isIE6 = true;
	} else {
		this.isIE6 = false;
	}
	
	this.init();
}

MiniSearch.prototype.init = function(){
	for(var i=0; i<this.numFormControls; i++){
		// USE THE FORM CONTROL ID TO GET THE CONTROLS. THEIR NAME SHOULD CORRESPOND TO THE APPROPRIATE SEARCH/URL VARIABLE
		this.controls[i] = {
			field: jQuery('#'+this.formControlIDs[i])
			,urlVar: jQuery('#'+this.formControlIDs[i]).attr('name')
			,filterControl: jQuery('#'+this.formControlIDs[i]+'_filter')
		};
	}
	
	// INITIALIZE, OR RESET, THE FORM. THIS HAS TO BE CALLED FOR BROWSERS LIKE FIREFOX THAT REMEMBER YOUR SELECTIONS WHEN YOU USE THE BACK BUTTON
	this.resetForm();
	  
	//INITIALIZE THE EVENTS FOR THE CONTROLS
	this.registerEvents();
}

MiniSearch.prototype.request = function(data){
	// RUN THE AJAX SEARCH
	jQuery.ajax({
		url: this.wsURL
		,data: data
		,cache: false
		,dataType: 'json'
		,context: this
		,timeout: 10000
		,beforeSend: function(){
			//alert('beforeSend');
			// IE6 HAS ISSUES WITH SELECT BOXES BEING ON TOP OF OVERLAYS, SO WE'LL HIDE THE CONTROLS FOR IE6 TO FORCE PEOPLE INTO SELECTING 1 OPTION AT A TIME
			if( this.isIE6 ) {
				this.hideControls();
			}
			
			// HIDE THE SPINNER UPON COMPLETION OF THE REQUEST
			this.spinnerControl.fadeIn();
		}
		,complete: function(){
			//alert('complete');
			// HIDE THE SPINNER UPON COMPLETION OF THE REQUEST
			this.spinnerControl.fadeOut();
			
			// SHOW THE CONTROLS AGAIN IN IE6
			if( this.isIE6 ) {
				this.showControls();
			}
		}
		,success: function(data, textStatus, jqXHR){
			//alert('success');
			//alert(data);
			this.updateControls(data);
		}
		,error: function(jqXHR, textStatus, errorThrown){
			alert('error: ' + textStatus);
			// HIDE THE SPINNER UPON COMPLETION OF THE REQUEST
			this.spinnerControl.fadeOut();
			
			// SHOW THE CONTROLS AGAIN IN IE6
			if( this.isIE6 ) {
				this.showControls();
			}
		}
	});
}

MiniSearch.prototype.registerEvents = function() {
	//IN ORDER TO CALL A METHOD WITIN THIS CLASS, WE MUST BIND THE THIS OBJECT TO THE EVENT. OTHERWISE THE
	//THIS OBJECT IN THE ONCHANGE FUNCTION WILL BE THE CONTROL OBJECT ITSELF INSTEAD OF THE CLASS OBJECT.
	for(var i=0; i<this.numFormControls; i++){
		this.controls[i].field.bind('change',{that: this, i: i},function(evt){
			evt.data.that.activeFilters[evt.data.i].value = jQuery(this).val();
			evt.data.that.activeFilters[evt.data.i].description = jQuery(this).find('option:selected').text();
			
			// EXECUTE THE SEARCH
			evt.data.that.executeSearch();
		});
	}
	
	this.searchButtonControl.bind('click',{that: this}, function(evt){
		var gotoUrl = evt.data.that.generateSearchURL();
		pageTracker._trackEvent('Homepage Promo', 'Mini-Search', gotoUrl);
		window.location.href = gotoUrl;
	});
}

MiniSearch.prototype.executeSearch = function() {
	var requestData = 'method=' + this.wsMethod;
	// ADD THE FILTERS
	for(var i=0; i<this.numFormControls; i++){
		requestData = requestData + '&' + this.controls[i].urlVar + '=' + this.activeFilters[i].value;
	}
	//alert(requestData);
	this.request(requestData);
}

MiniSearch.prototype.updateControls = function(data) {
	// CLEAR OUT THE FILTERS. THE UPDATESELECTOPTIONS METHOD WILL ADD THE FILTERS AS NECESSARY
	for(var i=0; i<this.numFormControls; i++){
		// THE LINE BELOW WORKS WITHOUT JQUERY() IN FF, BUT NOT IN IE
		jQuery(this.controls[i].filterControl).empty();
		this.updateSelectOptions(i,data[this.controls[i].field.attr('id')]);
	}
	
	// UPDATE THE RECORD COUNT CONTROL
	this.recordCountControl.html(data.record_count);
}

MiniSearch.prototype.updateSelectOptions = function(index,data) {
	var optionCount = 0;
	var option = '';
	var i = 0;
	
	// REMOVE ALL OF THE OPTIONS
	this.controls[index].field.empty();
	
	// GET THE NUMBER OF OPTIONS TO ADD
	optionCount = data.value.length;
	
	for(i = 0; i < optionCount; i++) {
		// CREATE A NEW OPTION ELEMENT
		option = jQuery(document.createElement('option'));
		option.attr('value',data.value[i]);
		option.html(data.description[i]);
		
		// IF THERE IS AN ACTIVE FILTER FOR THIS CONTROL, CHECK THE OPTIONS TO FIND A MATCH
		if( this.activeFilters[index].value != 0 && this.activeFilters[index].value != '') {
			if( data.value[i] == this.activeFilters[index].value ) {
				// IF THE OPTION VALUE MATCHES THE ACTIVE FILTER VALUE, SELECT THE OPTION
				option.attr('selected',true);
				
				// DISABLE THE DROPDOWN AND FORCE THEM TO REMOVE THE FILTER BY USING THE LINK BELOW THE FILTERS
				this.controls[index].field.attr('disabled',true);
				this.controls[index].field.hide();
				this.controls[index].filterControl.show();
			}
		} else {
			// IF THERE IS NO ACTIVE FILTER FOR THIS CONTROL, MAKE SURE IT IS ENABLED
			this.controls[index].field.attr('disabled',false);
				this.controls[index].field.show();
				this.controls[index].filterControl.hide();
		}
		
		// ADD THE OPTION TO THE SELECT CONTROL
		this.controls[index].field.append(option);
		
		// CLEAR THE OPTION
		option = '';
	}
	
	// ADD THE FILTER TO THE FILTER BOX
	this.addFilter(index);
	
}

MiniSearch.prototype.addFilter = function(index) {
	var a = '';
	var p = this.controls[index].filterControl;
	
	// IF THERE IS A REAL VALUE, ADD THE LI AND AN A TAG
	if( this.activeFilters[index].value != 0 && this.activeFilters[index].value != '') {
		a = jQuery(document.createElement('a'));
		a.text(this.activeFilters[index].description);
		a.attr('href','javascript:void(0);');
		a.attr('title','Remove '+a.text());
		a.addClass('icon remove');
		a.bind('click',{that: this},function(evt){
			evt.data.that.removeFilter(index);
		});
		
		jQuery(p).append(a);
	} else {
		jQuery(p).html(this.activeFilters[index].defaultFilterText);
	}
}

MiniSearch.prototype.removeFilter = function(index) {
	this.activeFilters[index].value = 0;
	this.activeFilters[index].description = '';
	
	// EXECUTE THE SEARCH
	this.executeSearch();
}

MiniSearch.prototype.hideControls = function(){
	for(var i=0; i<this.numFormControls; i++){
		// THIS FUNCTION IS USED FOR IE6 TO HIDE THE CONTROLS JUST BEFORE THE AJAX REQUEST STARTS
		this.controls[i].field.css('visibility','hidden');
		this.controls[i].filterControl.css('visibility','hidden');
	}
}

MiniSearch.prototype.showControls = function(){
	for(var i=0; i<this.numFormControls; i++){
		// THIS FUNCTION IS USED FOR IE6 TO SHOW THE CONTROLS AFTER THE AJAX REQUEST ENDS
		this.controls[i].field.css('visibility','visible');
		this.controls[i].filterControl.css('visibility','visible');
	}
}

MiniSearch.prototype.generateSearchURL = function(){
	
	// INITIALIZE THE URL TO START A NEW SEARCH
	var url = this.searchURL;
	// THE START URL COULD HAVE A QUERY STRING. IF IT DOES SET firstFilterFound TO TRUE
	var firstFilterFound = (url.indexOf('?') >= 0);
	
	// ADD FILTERS AS NEEDED
	for(var i=0; i<this.numFormControls; i++){
		if (this.activeFilters[i].value != 0 && this.activeFilters[i].value != ''){
			// IF WE HAVE FOUND AT LEAST 1 FILTER, ADD AN & BEFORE THE URL VAR
			if(firstFilterFound){
				url = url + '&';
			} else {
				// THE FIRST URL VAR WILL HAVE A ? BEFORE IT
				url = url + '?';
				// MARK THE FIRST FILTER AS FOUND
				firstFilterFound = true;
			}
			// THE DEPARTURE DATE FILTER IS A YEAR AND MONTH COMBINED. THE VALUES ARE DELIMITED BY AN _ CHARACTER.
			if(this.controls[i].urlVar.toLowerCase().indexOf('_') >= 0){
				var urlVars = this.controls[i].urlVar.split('_');
				var urlValues = this.activeFilters[i].value.split('_');
				if(urlVars.length != urlValues.length){
					// IF THE 2 ARRAYS ARE NOT THE SAME LENGTH, RETURN AS 1 PARAMETER
					url = url + this.controls[i].urlVar + '=' + this.activeFilters[i].value;
				} else {
					// IF THE LENGTHS MATCH, LOOP THROUGH THEM AND ADD THEM.
					for(var j=0; j<urlVars.length; j++){
						// SINCE WE KNOW THERE IS ALREADY EITHER A ? OR & WE DON'T NEED TO ADD THAT FOR THE FIRST ONE.
						if (j != 0){
							url = url + '&';
						}
						url = url + urlVars[j] + '=' + urlValues[j];
					}
				}
			} else {
				// THE URL VAR DOES NOT HAVE A DELIMITER
				url = url + this.controls[i].urlVar + '=' + this.activeFilters[i].value;
			}
		}
	}
	return url;
	
}

MiniSearch.prototype.resetForm = function() {
	for(var i=0; i<this.numFormControls; i++){
		// MAKE SURE ALL OF THE CONTROLS ARE ENABLED AND VISIBLE
		this.controls[i].field.removeAttr('disabled');
		this.controls[i].filterControl.hide();
		
		// RESET THE SELECTED INDEX FOR THE CONTROLS
		this.controls[i].field.attr('selectedIndex',0);
		
		// CLEAR THE ACTIVE FILTERS OBJECT
		
		this.activeFilters[i] = {
			value: 0
			,description: ''
			,defaultFilterText: this.controls[i].filterControl.html()
		}
		
		// FOR IE6, MAKE SURE ALL CONTROLS ARE VISIBLE
		if( this.isIE6 ){
			this.controls[i].field.css('visibility','visible');
		}
	}
	
	// RUN THE SEARCH TO GET VALID OPTIONS
	//this.executeSearch();
}

MiniSearch.prototype.status = function() {
	var msg = '';
	
	for(var i=0; i<this.numFormControls; i++){
		msg = msg + this.controls[i].urlVar + ': ' + this.controls[i].field.val() + '\nfilter: ' + this.controls[i].filterControl.html() + '\n';
	}
	msg = msg + 'record count: ' + this.recordCountControl.html() + '\n';
	alert(msg);
}

