/**
* Event AJAX search
* @author a.weeber, Wisdom
* @date 06-2009
* @namespace YAHOO.mijngenda 
* @module eventSearch
* @static
* @requires yahoo, dom, event,connection from YUI Library 2.x
*/ 


YAHOO.namespace("mijngenda");
YAHOO.mijngenda.eventSearch = (function() {
		
	/**
	* Yui shortcut variables 
	* @final 
	*/
	
	var Dom = YAHOO.util.Dom,
		Event = YAHOO.util.Event,
		Connect = YAHOO.util.Connect;
	
	/**
	* Module settings object 
	* @final 
	*/
	
	var settings = {

		moduleId						: "eventSearchModule",
		moduleFormId					: "eventSearchForm",
		searchResultsId					: "searchResults",
		searchButtonId					: "eventSearchButton",
		loadRegionId					: "eventSearchLoadRegion",
		loadIndicationId				: "eventSearchLoadIndication",
		pageFilterClass					: "pageFilter",
		categoryFilterClass				: "categoryFilter",
		deselectCategoryClass			: "deselectCategory",
		regionFilterClass				: "regionFilter",
		placeFilterClass				: "placeFilter",
		ajaxLoadClass					: "loading",
		resetFormClass					: "resetForm",
		rssLinkClass					: "rssLink",
		eventLinkClass					: "eventLink",
		ticketLinkClass					: "ticketLink",

		// fields
		pageField						: "pageNr",
		categoryField					: "eventType",
		placeField						: "city",
		regionField						: "region",
		staticDateField					: "dayStartDate",
		dateFromField					: "periodStartDate",
		dateTillField					: "periodEndDate",
		matchField						: "match"
	};


	/**
	* Initializes the module based on CSS context containers 
	* @method init
	* @static
	*/
	
	var init = function() {

		Event.addListener(settings.moduleId, "click", dispatchEvents);
		
		initFormElements();
	};

	/**
	* Dispatches all events 
	* @method dispatchEvents
	* @param e event
	* @static
	*/

	var dispatchEvents = function(e) {

		var target = Event.getTarget(e);

		switch(true) {

			// Pager
			case Dom.hasClass(target, settings.pageFilterClass) && e.type == "click":
			setField("page",target.rel);
			postForm();
			Event.stopEvent(e);
			break;
			
			// Submit button
			case target.id == settings.searchButtonId && e.type == "click":
			unsetField("page");	
			postForm();
			Event.stopEvent(e);
			break;
			
			// Category filter
			case Dom.hasClass(target, settings.categoryFilterClass) && e.type == "click":
			setField("category",target.rel);
			unsetField("page");
			postForm();
			Event.stopEvent(e);
			break;
			
			// Unset catagory
			case Dom.hasClass(target, settings.deselectCategoryClass) && e.type == "click":
			unsetField("category",target.rel);
			unsetField("page");
			postForm();
			Event.stopEvent(e);
			break;

			case Dom.hasClass(target, settings.resetFormClass) && e.type == "click":
			location.href='/';
			Event.stopEvent(e);
			break;
			
			case 
				Dom.hasClass(target, settings.rssLinkClass) || 
				Dom.hasClass(target, settings.eventLinkClass) ||
				Dom.hasClass(target, settings.ticketLinkClass):
			break;
			
			
			default:
			Event.stopEvent(e);
			break;
		}
	};
	
	/**
	* Suppresses all events within context node
	* @method suppressEvents
	* @static
	*/
	
	var suppressEvents = function(e) {
		
		var target = Event.getTarget(e);
		Event.stopEvent(e);
	};
	
	/**
	* Posts the form using Yui's Ajax connection manager 
	* @method postForm
	* @static
	*/

	var postForm = function() {
		
		// set loader
		setLoader("on");

		var callback =  {

			cache:false,

			success: function(o) {
				
				// put content in result container
				Dom.get(settings.loadRegionId).innerHTML = o.responseText;

				// set loader off
				setLoader("off");
				
				initContent();

			},

			failure: function(o) {
				// based on 4xx/5xx header status, something went wrong, print error message
				setLoader("off");
				
			},
	
			argument : {}
		};
		
		var targetForm = Dom.get(settings.moduleFormId);

		Connect.setForm(settings.moduleFormId);
		var transaction = Connect.asyncRequest('POST', targetForm.action , callback);

	};
	
	/**
	* Set AJAX visual load indicator 
	* @method setLoader
	* @param mode on/off mode
	* @static
	*/
	
	var setLoader = function(mode) {
		
		var loadRegion = Dom.get(settings.loadRegionId);
		
		if(mode == "on") {
			var fadeAnim = new YAHOO.util.Anim(loadRegion, { opacity: { to: 0.20 }},5);
			Dom.addClass(settings.moduleId, settings.ajaxLoadClass);
			
			disableSearchEvents();
			
		} else {
			var fadeAnim = new YAHOO.util.Anim(loadRegion, { opacity: { to: 1 }},5);
			Dom.removeClass(settings.moduleId, settings.ajaxLoadClass);
			
			enableSearchEvents();
		}

		fadeAnim.useSeconds = false;
		fadeAnim.animate();

	};


	/**
	* Sets a field
	* @method setField
	* @static
	* @param field form field
	* @param param optional multi purpose parameters
	*/

	var setField = function(field,param) {
		var targetForm = Dom.get(settings.moduleFormId);
		
		switch(field){
			case "page":
				targetForm[settings.pageField].value = param;
			break;

			case "category":
				var categoryField = targetForm[settings.categoryField];
				if((categoryField.value.indexOf(",") != -1) || (categoryField.value != "")) {
					categoryField.value += "," + param;
				} else {
					categoryField.value = param;
				}
			break;
	
		}
	};
	
	/**
	* Unsets a field
	* @method unsetField
	* @param field form field
	* @param param optional multi purpose parameters
	* @static
	*/

	var unsetField = function(field,param) {
		
		var targetForm = Dom.get(settings.moduleFormId);
		switch(field){
			case "category":
			var categoryField = targetForm[settings.categoryField];
			if(categoryField.value.indexOf(",") != -1) {
				var allCategories = categoryField.value.split(",");
				var newCategories = "";

				for(var i=0; i<allCategories.length; i++) {
					if(allCategories[i] != param) {
						newCategories += allCategories[i] + ",";
					}
				}
				newCategories = newCategories.substring(0,newCategories.length-1);
				categoryField.value = newCategories;

			} else {
				// only one value in list, make it empty
				categoryField.value = "";
			}
			break;
			
			case "date":
				var dateField = targetForm[settings.staticDateField];
				dateField.value = "";
			break;
			
			case "period":
				var fromField = targetForm[settings.dateFromField];
				fromField.value = "";
				var tillField = targetForm[settings.dateTillField];
				tillField.value = "";
			break;
			
			case "page":
				var pageNrField = targetForm[settings.pageField];
				pageNrField.value = "";
			break;
		
			
		}
	}

	/**
	* Initializes the content
	* @method initContent
	* @static
	*/
	
	var initContent = function() {

		// init tab
		YAHOO.mijngenda.tabHandler.init();

		// init form
		initFormElements();
		
		// init datapicker
		YAHOO.mijngenda.datePicker.init();

		// init toggle
		YAHOO.mijngenda.toggle.init();
	};

	
	/**
	* Initializes form elements
	* @method initFormElements
	* @static
	*/

	var initFormElements = function() {

		var targetForm = Dom.get(settings.moduleFormId);
		Event.addListener(targetForm[settings.placeField], "change", function(){
			targetForm[settings.regionField].selectedIndex  = 0;	
			unsetField("page");
			postForm()
			
					
			});

		Event.addListener(targetForm[settings.regionField], "change", function(){
			targetForm[settings.placeField].selectedIndex  = 0;
			unsetField("page");
			postForm();
			
					
		});	

	};
	
	/**
	* Disables all search controls
	* @method disableSearchEvents
	* @static
	*/
	
	var disableSearchEvents = function() {
		
		Event.removeListener(settings.moduleId, "click", dispatchEvents);
		Event.addListener(settings.moduleId, "click", suppressEvents);
	};
	
	/**
	* Enables all search controls
	* @method enableSearchEevents
	* @static
	*/
	
	var enableSearchEvents = function() {
		
		Event.addListener(settings.moduleId, "click", dispatchEvents);
		Event.removeListener(settings.moduleId, "click", suppressEvents);
	};
	/**
	* @return {obj} collection of public methods
	*/
	
	return  {
		init:init,
		postForm:postForm,
		unsetField:unsetField
		
	};

})();

YAHOO.util.Event.onDOMReady(YAHOO.mijngenda.eventSearch.init, YAHOO.mijngenda.eventSearch, true);