
var calculator_searchform = Class.create({
	
	calculator: null,
	elements: {
		container: null,
		form: null,
		originalCategoryOptions: null,
		fields: {
			supercategory: null,
			category: null,
			persongroup: null,
			desireddate: null
		}
	},
	inProgress: false,
	
	initialize: function(calculator) {
	
		if(calculator) {
			this.calculator = calculator;
		}
		
		// get elements
		var main = this.calculator.mainframe;
		
		this.elements.container = main.getElementsBySelector(".t_searchform")[0];
		this.elements.form = $(this.elements.container.getElementsByTagName("form")[0]);
		
		
		this.elements.fields.supercategory = this.elements.form.getElementsBySelector('select[name="supercategory"]')[0];
		
		this.elements.fields.category = this.elements.form.getElementsBySelector('select[name="category"]')[0];
		this.elements.fields.persongroup = this.elements.form.getElementsBySelector('select[name="persongroup"]')[0];
		this.elements.fields.desireddate = this.elements.form.getElementsBySelector('input[name="desireddate"]')[0];
		this.elements.fields.validFromLabels = this.elements.form.getElementsBySelector(".t_valid label");
		this.elements.fields.validFromContainer = this.elements.form.getElementsBySelector(".t_valid")[0];
		
		this.elements.fields.category.disabled = true;
		
		this.elements.fields.supercategory.observe("change",this.onSupercategoryChange.bind(this))
		
		this.elements.form.onsubmit = this.search.bind(this);
		
		if(this.elements.fields.supercategory.options[0]) {
			this.elements.fields.supercategory.options[0].selected = true;
		}
		if(this.elements.fields.category.options[0]) {
			this.elements.fields.category.options[0].selected = true;
		}
		if(this.elements.fields.persongroup.options[2]) {
			this.elements.fields.persongroup.options[2].selected = true;
		}
		
		if($("ticketing_calendar")) {
			var cal = new elementsCalendar({
				button : 'ticketing_calendar',
				output : "singleinput",
				input: "desireddate",
				updateFieldOnStartup : true
			});
		}
		
		var today = new Date();
		var seasonStart = new Date(2009,10,7);
		if(today < seasonStart) {
			cal.calendar.date = seasonStart;
			cal.calendar.dateStr = cal.calendar.date;
			cal.updateDateField(cal.calendar.date);
		} 

		
		var categoryOptions = this.elements.fields.category.getElementsBySelector("option");
		this.elements.originalCategoryOptions = new Array(categoryOptions.length);
		for(var i=0; i<categoryOptions.length; i++) {
				
				var option = new Element('option', { 'value': categoryOptions[i].value});
				option.innerHTML= categoryOptions[i].innerHTML;
				option.className = categoryOptions[i].className;
				this.elements.originalCategoryOptions[i] = option;
				
		}
		
		// hide all valid from labels
		for(var e=0; e<this.elements.fields.validFromLabels.length; e++) {
			this.elements.fields.validFromLabels[e].setStyle({
				display: "none"
			});
		}
		
		this.elements.fields.validFromContainer.setStyle({visibility:"hidden"});
		
		this.onSupercategoryChange();
		
		// check if there is a direct entry an add eventlisteners to the ticket list
		if(this.calculator.mainframe.getElementsBySelector(".t_searchresults form").length > 0) {
			this.addEventListenerResults();
		}
	},
	
	search: function () {
		
		if(this.inProgress == false) {
			this.elements.form.setAttribute("action","/calculator/");
			this.elements.form.request({
				parameters: {snippet: true},
				onComplete: this.searchComplete.bind(this)
			});
			this.inProgress = true;
			
			var resultsContainer = this.calculator.mainframe.getElementsBySelector(".t_searchresults")[0];
			if(!resultsContainer) {
				this.calculator.mainframe.insert('<div class="t_searchresults"></div>');
				resultsContainer = this.calculator.mainframe.getElementsBySelector(".t_searchresults")[0];
			}
			resultsContainer.innerHTML = '<div class="t_progress">' + calculator_translate("loadingTicketsMessage") + '</div>';
		}
		
		return false;
	},
	
	searchComplete: function (transport) {
		
		var results = this.calculator.mainframe.getElementsBySelector(".t_searchresults")[0];
		results.replace(transport.responseText);
		
		this.addEventListenerResults();
		this.inProgress = false;
	},
	
	addEventListenerResults: function () {
	
		var forms = this.calculator.mainframe.getElementsBySelector(".t_searchresults form");
		for(var i=0; i<forms.length; i++) {
			forms[i].onsubmit = this.addToWatchlist.bind(this,forms[i]);
		}
		
		// check for collapseable containers
		var resultBoxes = this.calculator.mainframe.getElementsBySelector(".t_searchresults .t_resultbox");
		if(resultBoxes.length > 1) {
			// make them collapseable
			
			var handle = null;
			var results = null;
			
			for(var i=0; i<resultBoxes.length; i++) {
				handle = resultBoxes[i].getElementsBySelector(".t_handler")[0];
				results = resultBoxes[i].getElementsBySelector(".t_results")[0];
				
				handle.observe("click", this.resultBoxToogle.bind(this,resultBoxes[i],handle,results));
				resultBoxes[i].removeClassName("up");
				results.hide();
			}
			
			// open first box
			var firstResultBox = resultBoxes[0];
			this.resultBoxToogle(firstResultBox,firstResultBox.getElementsBySelector(".t_handler")[0],firstResultBox.getElementsBySelector(".t_results")[0]);
		}
	},
	
	resultBoxToogle: function (box,handle,results) {
		if(box.hasClassName("up")) {
			results.hide();
			box.removeClassName("up");
		}
		else {
			results.show();
			box.addClassName("up");
		}
	},
	
	addToWatchlist: function (form) {
		form.request({
			onComplete: this.addToWatchlistComplete.bind(this)
		});
		
		return false;
	},
	
	addToWatchlistComplete: function () {
		this.calculator.watchlist.refresh();
		window.location.href = "#t_watchlist";
	},
	
	onSupercategoryChange: function () {
		
		// display all form elements
		this.elements.fields.validFromContainer.setStyle({visibility:"visible"});
		this.elements.fields.persongroup.up().setStyle({visibility:"visible"});
		
		
		var selectedValue = this.elements.fields.supercategory.options[this.elements.fields.supercategory.selectedIndex].value;
		var selectedOption = $(this.elements.fields.supercategory.options[this.elements.fields.supercategory.selectedIndex]);
		var count = 0;
		var optionsWithValue = 0;	
		var lastOptionWithValue = null;
		
		// filter the subcategories dependend on the supercategory selection
		var categoryOptions = this.elements.fields.category.getElementsBySelector("option");

		for(var i=0; i<categoryOptions.length; i++) {
				categoryOptions[i].remove();
		}
		
		for(var i=0; i<this.elements.originalCategoryOptions.length; i++) {
				var option = this.elements.originalCategoryOptions[i];
				if(option.hasClassName(selectedValue)) {
					count++;
					if(count==1) {
						option.selected = true;
					}
					this.elements.fields.category.insert(option,this.elements.fields.category);
				
				if(option.value.length > 0) {
					optionsWithValue++;
					lastOptionWithValue = option;
				}
				}
		}
		
		this.elements.fields.category.disabled = false;
		
		if(count < 2 || selectedValue == "") {
			$(this.elements.fields.category.parentNode).setStyle({display:"none"});
		}
		else {
			$(this.elements.fields.category.parentNode).setStyle({display:""});
		}
		
		if(optionsWithValue < 2) {
			if(lastOptionWithValue) {
				$(lastOptionWithValue).setAttribute("selected","selected");
				$(this.elements.fields.category.parentNode).setStyle({display:"none"});
			}
		}
		
		
		
		// display suitable label for date selection
		for(var e=0; e<this.elements.fields.validFromLabels.length; e++) {
			if(this.elements.fields.validFromLabels[e].hasClassName(selectedValue) && selectedValue != "") {
				this.elements.fields.validFromLabels[e].setStyle({
					display: ""
				});
			}
			else {
				this.elements.fields.validFromLabels[e].setStyle({
					display: "none"
				});
			}			
		}
		
		// display valid from container if type matches
		if(selectedOption.hasClassName("t_nodate")) {
			this.elements.fields.validFromContainer.setStyle({visibility:"hidden"});
		}
		if(selectedOption.hasClassName("t_nopersongroup")) {
			this.elements.fields.persongroup.up().setStyle({visibility:"hidden"});
		}
		
		
		
	}
	
});


