﻿var Settings = {

	hash: [],
	checkDateRange: false,
	pageURL: location.toString().split('#')[0],
	locationLabels: new Array(),
	locationInputs: new Array(),
	initialMonth: '',

	init: function() {
		Settings.initialMonth = currentMonth;
		Settings.locationLabels = $$('#cal-location-col label');
		Settings.locationInputs = $$('#cal-location-col input')
		if (location.hash.length > 2) {
			Settings.parse();
		};
		Settings.addEvents();
	},

	update: function() { // create location.hash and append it to the original location
		Settings.hash = [];
		for (var fn in Settings.getFormValues) {
			Settings.getFormValues[fn].call();
		};
		Settings.removeRedundantValues();
		var hash = Settings.hash.join('&');
		hash = (hash) ? hash : "/"; // putting just # moves the page to top
		location.replace(Settings.pageURL + "#" + hash);
		Settings.checkDateRange = false;
	},

	parse: function() {
		var hash = location.hash.slice(1);
		var isListView = (hash.indexOf('viewmode=List') != -1);
		var hasDateRange = (hash.indexOf('startdate=') != -1);
		Settings.hash = hash.split('&');
		Settings.removeRedundantValues();
		Settings.updateForm();

		if (isListView) {
			if (hasDateRange) {
				Settings.showListViewWithDateRange();
			}
			else {
				Settings.fireEvent(FORM.tabListView, 'click');
			};
		}
		else {
			Page.post(window);
		};
	},

	showListViewWithDateRange: function() {
		var loc = Settings.pageURL + "?";
		location.replace(loc + Settings.hash.join('&'));
	},

	updateForm: function() {
		for (var i = 0, len = Settings.hash.length; i < len; i++) {
			var param = Settings.hash[i].split('=');
			var qsName = param[0];
			var qsVal = param[1];
			if (Settings.setFormValues[qsName]) {
				Settings.setFormValues[qsName].call('', qsVal);
			};

		}
		//		Settings.hash.each(function(param) {
		//			param = param.split('=');
		//			var qsName = param[0];
		//			var qsVal = param[1];
		//			if (Settings.setFormValues[qsName]) {
		//				Settings.setFormValues[qsName].call('', qsVal);
		//			};
		//		});
	},

	getLocationName: function(index) {
		return Settings.locationLabels[index].innerHTML.strip();
	},

	getLocationInput: function(name) {
//		var label = '';
//		for (var i = 0, len = Settings.locationLabels.length; i < len; i++) {
//			var lbl = Settings.locationLabels[i];
//			if (lbl.innerHTML.indexOf(name) != -1) {
//				label = lbl;
//				break;
//			}
//		}
		var label = Settings.locationLabels.find(function(el) {
			return el.innerHTML.strip() == decodeURI(name);
		})
		if (!label) return false;
		var index = Settings.locationLabels.indexOf(label);
		return Settings.locationInputs[index];
	},

	removeRedundantValues: function() {
		// if there's already a server side query string, remove the redundant client side
		var serverQs = Settings.pageURL.split('?');
		if (serverQs[1]) {
			queryStrings = serverQs[1].split('&');
			try {
				queryStrings.each(function(qs){
					Settings.hash = Settings.hash.without(qs);
				});
			}
			catch (e) {
				// shouldn't break when ie / prototype issues fixed
			}
		};
		Settings.hash = Settings.hash.without("Month=" + Settings.initialMonth)
	},

	hasDateRange: function() {
		return (FORM.inputStartDate && FORM.inputEndDate && FORM.inputStartDate.value && FORM.inputEndDate.value) ? true : false;
	},

	addEvents: function() {
		Event.observe(FORM.buttonUpdate, 'click', function() {
			Settings.checkDateRange = true;
		});
		Settings.locationLabels = $$('#cal-location-col label');
		Settings.locationInputs = $$('#cal-location-col input')
	},

	fireEvent: function(element, event) {
		if (document.createEvent) {
			// standards
			var evt = document.createEvent("HTMLEvents");
			evt.initEvent(event, true, true); // event type,bubbling,cancelable
			return !element.dispatchEvent(evt);
		}
		else if (document.createEventObject) {
			// IE
			var evt = document.createEventObject();
			// delay to prevent race condition on tab event listening
			return setTimeout(function(){
				element.fireEvent('on' + event, evt)
			}, 200);
		};
	}
};

Settings.getFormValues = {

	viewmode: function() {
		if (FORM.tabListView.getAttribute('src').slice(-6) == "on.gif") {
			Settings.hash.push("viewmode=List");
		};
	},

	genreAndParking: function() {
		if (FORM.checkboxParking.checked) {
			Settings.hash.push('parking=y');
		}
		else {
			if (FORM.selectGenre.value) {
				Settings.hash.push('genre=' + FORM.selectGenre.value);
			};
		};
	},

	location: function() {
		var selections = []
		Settings.locationInputs.each(function(input,index) {
			if (input.checked) {
				selections.push(Settings.getLocationName(index));
			};
		});
		if (selections.length) {
			var locations = 'location=' + selections.join(',');
			Settings.hash.push(locations);
		}
	},

	currentMonth: function() {
		if (Settings.checkDateRange && Settings.hasDateRange()) {
			Settings.hash.push('startdate=' + FORM.inputStartDate.value);
			Settings.hash.push('enddate=' + FORM.inputEndDate.value);
		}
		else {
			Settings.hash.push('Month=' + $$('#cal-navigation select')[0].value);
		};
	}

};

Settings.setFormValues = {
	// set forms forms, select appropriate options based on query string

	location: function(vals) {
		vals = vals.split(',');
		for (var i = 0, len = vals.length; i < len; i++) {
			
			Settings.getLocationInput(vals[i]).checked = 'checked';
		}

	},

	parking: function() {

		FORM.checkboxParking.checked = 'checked';
		FORM.selectGenre.disabled = true;
	},

	genre: function(val) {
		var options = $$('#cal-event-col option');
		var option = $$('#cal-event-col option[value="' + val + '"]')[0];
		var index = options.indexOf(option);
		//console.log(FORM.selectMonth);
		//FORM.selectMonth.selectedIndex = index;
		option.selected = "selected";
	},

	Month: function(val) {
		$$('#cal-navigation option[value=' + val + ']')[0].selected = 'selected';
		currentMonth = val;
	}
};





