// Dynamic search handlers for GSM
// 
// @version 	1.0
// @package		gsm
// @author		Frederic Trudeau <ftrudeau@orangetango.com>
// @copyright   Copyright (c) 2006-2008 orangetango Studio Web Inc.
// @license		Proprietary

var gsmDynamicSearch = {
	
	// possible criterias
	criterias : ['teams', 'categories', 'years', 'locations'],
	
	// elements
	inputs : [],
	lists : [],
	selects : [],
	
	// selected criterias, by default
	selected : {
		teams : false,
		categories : false,
		years : false,
		locations : false
	},
	
	// selected elements
	selectedEls : {
		teams : false,
		categories : false,
		years : false,
		locations : false
	},
	
	hideSelectCount: 0,
	
	/*
	* Init
	*
	* Initialize ze thing. 
	*
	* 1) Get elements
	* 2) Activate listeners
	*
	* @author		Frederic Trudeau <ftrudeau@orangetango.com>
	* @copyright	Copyright (c) 2006-2008 orangetango Studio Web Inc.
	* @license		Proprietary
	*/
	init: function() {
		this.getElements();
		this.activateListeners();
	},
	
	/*
	* getElements
	*
	* Grab various elements from dom, needed throughout the script (inputs, containers, selects)
	* 
	* @author		Frederic Trudeau <ftrudeau@orangetango.com>
	* @copyright	Copyright (c) 2006-2008 orangetango Studio Web Inc.
	* @license		Proprietary
	*/
	getElements: function() {
		
		// define inputs by criterias
		this.inputs.teams	 	= 	$("input#teams-selectbox_input");
		this.inputs.categories	=	$("input#categories-selectbox_input");
		this.inputs.years		=	$("input#years-selectbox_input");
		this.inputs.locations	=	$("input#locations-selectbox_input");
		
		// define lists by criterias
		this.lists.teams		=	$("div#teams-selectbox_container");
		this.lists.categories	=	$("div#categories-selectbox_container");
		this.lists.years		=	$("div#years-selectbox_container");
		this.lists.locations	=	$("div#locations-selectbox_container");

		// define selects by criterias
		this.selects.teams		=	$("select#teams-selectbox");
		this.selects.categories	=	$("select#categories-selectbox");
		this.selects.years		=	$("select#years-selectbox");
		this.selects.locations	=	$("select#locations-selectbox");
		
	},
	
	/*
	* getcriterias
	*
	* Call the webservice to get criterias
	*
	* 1) Hide all input boxes, excluding the callee
	* 2) Call webservice
	* 3) Rebuild item list on success
	* 4) Re-initialize
	* 5) Show all input boxes, excluding the callee
	* 
	* @author		Frederic Trudeau <ftrudeau@orangetango.com>
	* @copyright	Copyright (c) 2006-2008 orangetango Studio Web Inc.
	* @license		Proprietary
	*/
	getcriterias: function(callee) {
		
		// hide select boxes
		// if (this.hideSelect(callee);
		
		gsmDynamicSearch.hideSelectCount = 1;
		
		$.each(this.criterias, function(i, criteria) {
			
			if (callee != criteria) {
				
				gsmDynamicSearch.inputs[criteria].fadeOut("slow", function() {
					
					if (gsmDynamicSearch.hideSelectCount == 3) {

						$.ajax ({
							url : "/webservice/getsearchcriterias",
							global : false,
							cache : false,
							dataType : "json",
							type : "POST",
							data : {
								idteam:		gsmDynamicSearch.selected.teams,
								idcategory:	gsmDynamicSearch.selected.categories,
								idyear: 	gsmDynamicSearch.selected.years,
								idlocation:	gsmDynamicSearch.selected.locations
							},
				  			error : function (XMLHttpRequest, textStatus, errorThrown) {
				  			},
				  			success : function(data) {
								
				  				$.each(data, function(criteria, data) {
				  					
				        			if (criteria != callee) {
				        			
				        				// remove input from DOM
				        				gsmDynamicSearch.inputs[criteria].remove();
				        				
				        				// remove list from DOM
				        				gsmDynamicSearch.lists[criteria].remove();
				        				
				        				// clone default, and remove "selected" attribute
				        				var resetCriteriaCaption = gsmDynamicSearch.selects[criteria].find('option:last').clone().html();
				        				
				        				/* @todo	buggy in Safari
				        				alert ('ajax: clone default');
				        				var lastitem = gsmDynamicSearch.selects[criteria].find('option:last').clone();
				        				lastitem.removeAttr("selected");
				        				*/
				        								        				
				        				// empty and recreate list
				        				var resetCriteria = true;
				        				gsmDynamicSearch.selects[criteria].empty();
				        				$.each(data, function(value, text) {
				        					var selected = '';
				        					if (gsmDynamicSearch.selected[criteria] == value) {
				        						selected = ' selected="selected"';
				        						resetCriteria = false;
				        					}
				        					
				        					gsmDynamicSearch.selects[criteria]
				        					.append('<option value="'+value+'"'+selected+'>'+text+'</option>');
				        					
				        				});
				        				
				        				// add reset option, and select it if we need to
				        				if (resetCriteria) {
				        					gsmDynamicSearch.selects[criteria]
				        					.append('<option value="" selected="selected">'+resetCriteriaCaption+'</option>');
				        				} else {
				        					gsmDynamicSearch.selects[criteria]
				        					.append('<option value="">'+resetCriteriaCaption+'</option>');
				        				}
				        				
				        				// recreate selectbox widget via plugin				        				
				        				gsmDynamicSearch.selects[criteria].selectbox();
				        				
				        			}
				        			
								});
				
				  			},
				  			complete : function() {
				  				
				  				// re-init the thing
								gsmDynamicSearch.init();
				  				
								// show select boxes once done
								gsmDynamicSearch.showSelect(callee);
								
				  			}
				  			
						});	
					}
					
					gsmDynamicSearch.hideSelectCount++;
					
				});
				
			}
			
		});

	},
	
	/*
	* activateListeners
	*
	* Bind click event on each LI in the list container, created by the selectbox plugin.
	* Onclick, the selected criteria id is saved, the container is hidden, and the ajax POST is called 
	* 
	* @author		Frederic Trudeau <ftrudeau@orangetango.com>
	* @copyright	Copyright (c) 2006-2008 orangetango Studio Web Inc.
	* @license		Proprietary
	*/
	activateListeners: function() {
		
		$.each(this.criterias, function(i, criteria) {
			
			gsmDynamicSearch.lists[criteria].children().find("li").unbind('click');
			
			gsmDynamicSearch.lists[criteria].children().find("li").one("click", function (li) {
				
				var idcriteria = $(this).attr("id");
				
				if (idcriteria == undefined) {
					gsmDynamicSearch.selected[criteria] = false;
				} else {
					gsmDynamicSearch.selected[criteria] = idcriteria;
				}
				
				$(this).addClass("selected");
				
				/////////////////////////////////
				// BEGIN selectbox mimic hack //
				///////////////////////////////
				
				gsmDynamicSearch.mimicSelectbox(criteria);
				
				///////////////////////////////
				// END selectbox mimic hack //
				/////////////////////////////
		
				// Hide selectbox
				gsmDynamicSearch.lists[criteria].hide();
				
				// Get criterias
				gsmDynamicSearch.getcriterias(criteria);
				
			});
			
		});
		
	},
	
	/*
	* hideSelect
	*
	* Hide all inputs, excluding the one that triggered the call
	* 
	* @author		Frederic Trudeau <ftrudeau@orangetango.com>
	* @copyright	Copyright (c) 2006-2008 orangetango Studio Web Inc.
	* @license		Proprietary
	*/
	hideSelect: function(exclude) {
		gsmDynamicSearch.hideSelectCount = 0;
		$.each(this.criterias, function(i, criteria) {
			if (exclude != criteria) {
				gsmDynamicSearch.inputs[criteria].fadeOut("slow", function() {
					if (gsmDynamicSearch.hideSelectCount == 3) return TRUE;
					gsmDynamicSearch.hideSelectCount++;
				});
			}
		});
	},
	
	/*
	* showSelect
	*
	* Show all inputs, excluding the one that triggered the call
	* 
	* @author		Frederic Trudeau <ftrudeau@orangetango.com>
	* @copyright	Copyright (c) 2006-2008 orangetango Studio Web Inc.
	* @license		Proprietary
	*/
	showSelect: function(exclude) {
		$.each(this.criterias, function(i, criteria) {
			if (exclude != criteria) {
				gsmDynamicSearch.inputs[criteria].fadeIn("slow");		// fadein input
			}
		});
	},
	
	/*
	* mimicSelectbox
	*
	* mimic of selectbox's plugin behaviour, which get overwritten when 
	* unbinding all click events in activateListeners function (workaround) ?
	* 
	* @author		Frederic Trudeau <ftrudeau@orangetango.com>
	* @copyright	Copyright (c) 2006-2008 orangetango Studio Web Inc.
	* @license		Proprietary
	*/
	mimicSelectbox: function(criteria) {
		
		var li = $("li.selected", gsmDynamicSearch.lists[criteria]).get(0);
		var el = li.id;
		
		gsmDynamicSearch.selects[criteria].val(el);
		gsmDynamicSearch.inputs[criteria].val($(li).text());
		
		var nameClass = "selectbox-selected";
		if (gsmDynamicSearch.selects[criteria].val() != '') {
			if (!gsmDynamicSearch.inputs[criteria].hasClass(nameClass)) {
				gsmDynamicSearch.inputs[criteria].addClass(nameClass);
			}
		} else {
			gsmDynamicSearch.inputs[criteria].removeClass(nameClass);
		}
		
		if (gsmDynamicSearch.selectedEls[criteria] != null) {
			$(gsmDynamicSearch.selectedEls[criteria]).toggleClass('selected-li');
		}
		
		$("li#"+el, gsmDynamicSearch.lists[criteria]).toggleClass('selected-li');
		gsmDynamicSearch.selectedEls[criteria] = $("li#"+el, gsmDynamicSearch.lists[criteria]).get(0);
	}
	
};

// init
$(document).ready(function () {
	gsmDynamicSearch.init();
});