/**
 * @author Christian Trabold <christian.trabold@dkd.de>, Dimitri Ebert <dimitri.ebert@dkd.de>
 */

var ConnectionControler = new Class({

});

var CheckboxControler = new Class({

});

var MouseControler = new Class({

});

var CheckAllCheckbox = new Class({
	initialize: function(namespace, options){
		this.namespace = namespace;
		this.checkboxId = $(this.namespace + '-all');
		this.checksElements = $$('#'+ this.namespace +' input[type="checkbox"]');
	}
});


var JobSearch = new Class({
	allCheckboxes: '',
	requestTimer: 0.5,
	requestTimerCountdown: '',
	requestTimerCounter: '',
	checkAllBoxesItems: [],
	checkedCheckboxesRegister: [],
	neverDisabledTheseCheckboxes: [],

	options: {
		request_url: '/index.php?eID=tx_dkdhbsuip_search'
	},

	initialize: function(element, options){
		this.element = element;
		this.setOptions(options);
		
		this.options.request_url = this.options.request_url+'&configListId='+$('configListId').value+'&configFullId='+$('configFullId').value;
		
		this.requestTimerCountdown = 0;
		
		this.mainbox = $('jobs-search');
		
		if(this.mainbox.hasClass('jobs-search-ajax')){
			this.mode = 'uip';
		} else if(this.mainbox.hasClass('edu-search-ajax')){
			this.mode = 'edu';
		} else {
			return false;
		}
		
		this.activator = $('jobs-search-activator');
		this.bottomtoggler = $('jobs-search-bottomtoggler')
		this.searchbox = $('jobs-search-searchbox');

		this.scroll = new Fx.Scroll(window, {
			wait: false,
			duration: 1000,
			transition: Fx.Transitions.Quad.easeInOut
		});
		
		this.checkAllBoxesItems = Array();
		if($('jobs')){
			this.checkAllBoxesItems.extend([new CheckAllCheckbox('jobs')]);
		}
		if($('branchen')){
			this.checkAllBoxesItems.extend([new CheckAllCheckbox('branchen')]);
		}
		if($('fachrichtungen')){
			this.checkAllBoxesItems.extend([new CheckAllCheckbox('fachrichtungen')]);
		}
		
		this.registerNeverDisabledCheckboxes();
		this.allCheckboxes = $$('#job-search-form input[type="checkbox"]');
		
		this.allCheckboxesAndLabels = $$('#job-search-form input[type="checkbox"], #job-search-form label');
		
		this.allCheckboxesAndLabels.each(function(el){
			var elparent = el.getParent();

			el.addEvent('mouseenter',function(){
				if(elparent.hasClass('checkbox')){
					elparent.addClass('over');
				};
			});
			elparent.addEvent('mouseleave',function(){
				if(elparent.hasClass('checkbox')){
					elparent.removeClass('over');
				};
			});
		});

		this.addTimerClickEvent();
		this.addCheckAllClickEvent();
		this.initResultNavigation();
		
		this.submitForm();
		
		this.initToggler();
		
		//  var checked = $$('#job-search-form input[checked="checked"]');
		var  minimizeForm = false;
		this.allCheckboxes.each(function(checkbox){
			if(checkbox.getProperty('checked')){
				minimizeForm = true;
			}
		});
		
		if(minimizeForm){
			// TODO: dkd-ebert, 2008-07-10	implement of Observer-Pattern, to hide banner
			// init call, status -1, hide banner
			this.toggleSearchBox();
			// minimize call
			this.toggleSearchBox();		
		}
	},

	addTimerClickEvent: function(){
		this.allCheckboxes.each (
			function(el) {
				el.addEvent('click', function(e) {
					if(this.mode == 'uip'){
						this.resetCountdown();
					}
					if (el.checked) {
						this.registerCheckbox(el);
						if(this.togglerStatus === 0){
							this.toggleSearchBox();
						}
					} else {
						this.removeCheckboxFromRegister(el);
						this.updateAllClickCheckBoxes(el.getParent().getParent().getProperty('id'));
						if(this.togglerStatus === 0){
							this.toggleSearchBox();
						}
					}
				}.bind(this));
			}.bind(this)
		)
	},

	addCheckAllClickEvent: function(){
		this.checkAllBoxesItems.each(
			function(el) {
				el.checkboxId.addEvent('click', function(e) {
					this.toggleCheckboxStatus(el.checksElements, el.checkboxId.getProperty('checked'));
				}.bind(this));
			}.bind(this)
		)
	},

	updateAllClickCheckBoxes: function(namespace){
			this.checkAllBoxesItems.each(
			function(el) {
				if(el.namespace == namespace){
					this.removeCheckboxFromRegister(el.checkboxId);
					el.checkboxId.removeProperty('checked');
				}	
			}.bind(this));	
	},
	
	registerNeverDisabledCheckboxes: function(){
		this.checkAllBoxesItems.each(
			function(el) {
					// Add this checkbox-id so it never gets disabled
				this.neverDisabledTheseCheckboxes.include(el.checkboxId.getProperty('id'));
			}.bind(this)
		)
	},


	/***
	 * CHECKBOX METHODS
	 */
	registerCheckbox: function(el){
		if (!this.checkedCheckboxesRegister.contains(el.getProperty('id'))) {
			this.checkedCheckboxesRegister.include(el.getProperty('id'));
		}
	},

	removeCheckboxFromRegister: function(el){
		if (this.checkedCheckboxesRegister.contains(el.getProperty('id'))) {
			this.checkedCheckboxesRegister.remove(el.getProperty('id'));
		}
	},

	updateCheckboxRegister: function(el){
		if (this.checkedCheckboxesRegister.contains(el.getProperty('id')) || !el.checked) {
			this.checkedCheckboxesRegister.remove(el.getProperty('id'));
		} else {
			this.checkedCheckboxesRegister.include(el.getProperty('id'));
		}
	},

	toggleCheckboxStatus: function(itemsArray, checkedStatus){
		itemsArray.each (
			function(el) {
					// Set element status = checked
				el.checked = checkedStatus;
					// Update the global checkbox-register (used for JSON-Request)
				this.updateCheckboxRegister(el);
			}.bind(this)
		)
	},

	setCheckboxStatusDisabled: function(validCheckboxes){
		this.allCheckboxes.each (
			function(el) {
				key = el.getProperty('id');
				label = $('job-search-form').getElement('label[for='+ key +']');

				if(validCheckboxes[key]){
					el.removeProperty('disabled');
					label.removeClass('disabled');
				} else {
						// Do NOT process this.neverDisabledTheseCheckboxes
					if (this.neverDisabledTheseCheckboxes.contains(key)) {
						el.removeProperty('disabled');
						label.removeClass('disabled');
					} else {
						el.setProperty('disabled', 'disabled');
							// TODO ct 2007-11-07 Change fixed layout to class-name!
						label.addClass('disabled');
					}
				}
			}.bind(this)
		)
	},


	/***
	 * TIMER METHODS
	 */
	resetCountdown: function(){
		$clear(this.requestTimerCounter);
		this.requestTimerCountdown = this.requestTimer;
		this.requestTimerCounter = this.refreshRequestData.delay(this.requestTimerCountdown * 1000, this);
	},

	refreshRequestData: function(){
		this.startRequest();
		$clear(this.requestTimerCounter);
	},


	/***
	 * JSON METHODS
	 */
	startRequest: function(){
		this.getJSON();
	},

	getJSON: function(){
		var url = this.options.request_url;
		var formOptions = this.checkedCheckboxesRegister;
		var request = new Json.Remote(url, {
			onComplete: function(jsonObj) {
				this.setCheckboxStatusDisabled(jsonObj.checkboxes);
				this.setCounter(jsonObj.counter);
			}.bind(this),
			onFailure: function() {
				console.log('JSON FAILURE!');
			}.bind(this),
			onCancel: function() {
				console.log('JSON CANCEL!');
			}.bind(this)
		}).send(formOptions);
	},

	/***
	 * SUBMIT FORM METHODS
	 */
	submitForm: function(){
	
		/**
		 * add ajax request  special parameters
		 */
		 
		 var responseparameter  = new Element('input', {
		 	'value': 1,
		 	'name': 'response',
		 	'type': 'hidden'
		 });
		 var typeparameter  = new Element('input', {
		 	'value': 88,
		 	'name': 'type',
		 	'type': 'hidden'
		 });
		 
		 responseparameter.injectInside($('job-search-form'));
		 typeparameter.injectInside($('job-search-form'));
		
		var self = this;	 
		
		$('job-search-form').addEvent('submit', function(e) {
			/**
			 * Prevent the submit event
			 */
			new Event(e).stop();

			/**
			 * This empties the log and shows the spinning indicator
			 */
			var log = $('log_res').empty().addClass('ajax-loading');
			
			/**
			 * element to display search results
			 */
			var results = $('jobs-search-results');
			
			/**
			 * set force toggler status and close after this
			 */
			self.togglerStatus = 1;
			self.toggleSearchBox();
				
			self.scroll.toElement(self.mainbox);
			/**
			 * send takes care of encoding and returns the Ajax instance.
			 * onComplete removes the spinner from the log.
			 */
			 var url = '/'+this.getProperty('action');
			 var resultContent = new Ajax(	url, {
						method: 	 'get',
						data:		 this.toQueryString(), // Formulardaten in URL String umwandeln
						update: 	 results,
						evalScripts: 'true',
						onComplete: ( function(e){
							log.removeClass('ajax-loading');
							self.initResultNavigation();
						}),
						onFailure: (function(content) {
							
						})
			});
			resultContent.request();
		});
	},

	/***
	 * SHOW COUNTER
	 */
	setCounter: function(counter){
		el = $('counter');
		el.setHTML(counter);
	},
	
	/**
	 * Toggler initialisation
	 */
	initToggler: function(){
		this.togglerStatus  = -1;	
		
		var banner = $$('.content-ads-jobwizard');
		if(banner.length > 0){
			this.searchbox.setStyle('display','none');
			this.bottomtoggler.setStyle('display','none');
		}	
		
		this.activator.addEvent(
			'click',
			function(e){
				this.toggleSearchBox();
			}.bind(this)
		);
		this.bottomtoggler.addEvent(
			'click',
			function(e){
				this.toggleSearchBox();
			}.bind(this)
		);
	},
	
	/**
	 *  Funtion to hide/unhide not selected boxes 
	 */
	toggleSearchBox: function(){
		if(this.mode != 'uip') return false;
		
		var newTogglerStatus = this.togglerStatus;
		switch(this.togglerStatus){
			case -1:
				this.searchbox.setStyle('display','block');
				this.bottomtoggler.setStyle('display','block');
				
				this.minimizeSearchbox(false);
				newTogglerStatus = 1;
				
				var banner = $$('.content-ads-jobwizard');
				if(banner.length > 0){
					banner.each(function(elbanner){
						elbanner.setStyle('display','none');
					});
				}
				
				break;
				
			case 0:
				this.minimizeSearchbox(false);
				newTogglerStatus = 1;
				break;
			case 1:	
				this.minimizeSearchbox(true);
				newTogglerStatus = 0;
				break;
		}
		this.togglerStatus = newTogglerStatus;
		
	},
	
	/**
	 * Minimize search-options and show only selected checkboxes
	 */
	minimizeSearchbox: function(status){
		if(status){
			this.mainbox.addClass('jobs-search-searchbox-minimized');
		} else {
			this.mainbox.removeClass('jobs-search-searchbox-minimized');
		}
		
		this.checkAllBoxesItems.each(
			function(el) {
				var displayJustAll = 0;
				if(el.checkboxId.getProperty('checked')){
					displayJustAll = 1;
				}
				
				el.checksElements.each(function(checkbox){
					
					if(!checkbox.getProperty('checked') || checkbox.getProperty('disabled') || displayJustAll){
						if(status){
							if(!checkbox.getParent().hasClass('checkbox-all')){
								checkbox.getParent().setStyle('display','none');
							}
						} else {
							checkbox.getParent().setStyle('display','block');
						}
					} else {
							checkbox.getParent().setStyle('display','block');
					}
				});
			}.bind(this)
		)
	},
	
	
	/**
	 * init result navigation
	 */
	initResultNavigation: function(){
		this.resultletterboxesV = $$('.premiumportraets-box .navletter-result');
		this.resultletterboxesK = $$('.portraets-box .navletter-result');
		
		this.resultlabelV = $('premiumportraetslabel');
		this.resultlabelK = $('portraetslabel');
		
		this.resultletterbuttons = $$('.navletter');
		if(this.resultletterbuttons.lenght < 1){
			// break initialisation
			return false;
		}
		
		var self = this;
		
		this.resultletterbuttons.each(function(element){
			element.addEvent('click',function(e){
				e = new Event(e);
				e.stop();
				self.showFilteredResults(element.getProperty('id'));
				self.resultletterbuttons.each(function(el){
					el.removeClass('letter-active');
				});
				element.addClass('letter-active')
			});	
		});
		
		element = $('navletter-result');
		if(element){
			self.showFilteredResults(element.getProperty('id'));
			self.resultletterbuttons.each(function(el){
				el.removeClass('letter-active');
			});
			element.addClass('letter-active')
		}	
		
	},
	/**
	 * hide not selected results and show selected
	 */
	showFilteredResults: function(navletter){
			var counterV = 0;
			var counterK = 0;
			
			this.resultletterboxesV.each(function(element){
				if(element.hasClass(navletter)){
					element.setStyle('display','');
					counterV++;	
				} else {
					element.setStyle('display','none');
				}
			});
			
			this.resultletterboxesK.each(function(element){
				if(element.hasClass(navletter)){
					element.setStyle('display','');
					counterK++;
				} else {
					element.setStyle('display','none');
				}
			});
			
			if(counterV > 0){
				this.resultlabelV.setStyle('display','block');
			} else {
				this.resultlabelV.setStyle('display','none');
			}
			
			if(counterK > 0){
				this.resultlabelK.setStyle('display','block');
			} else {
				this.resultlabelK.setStyle('display','none');
			}
	}
});

JobSearch.implement(new Events);
JobSearch.implement(new Options);
JobSearch.implement(new Chain);

window.addEvent('domready', function(){
	if($('jobs-search')){
		new JobSearch();
	}
});
