var baseinner, form = {}, selectedCell = null, isEditing = false;
var retime = /^\s*(\d\d?)[:\.,\s](\d\d)\s?([ap]m)?(\s*)$/;

window.onload = function() {
	baseinner		= document.getElementById("table");
	form.form		= document.getElementById("add-form");
	form.day		= document.getElementById("day");
	form.month		= document.getElementById("month");
	form.year		= document.getElementById("year");
	form.time1		= {
		h:document.getElementById("time1h"), 
		m:document.getElementById("time1m"),
		value: function(){
			return this.h.value + ":" + this.m.value;
		}
	};
	form.time2		= {
		h:document.getElementById("time2h"), 
		m:document.getElementById("time2m"),
		value: function(){
			return this.h.value + ":" + this.m.value;
		}
	};
	form.summary	= document.getElementById("summary");
	form.location	= document.getElementById("location");
	form.global		= document.getElementById("global");
	form.Cancel		= document.getElementById("cancel");
	form.Delete		= document.getElementById("delete");
	form.Export		= document.getElementById("export");
	form.Ok			= document.getElementById("ok");
	form.ResultOk	= document.getElementById("result-ok");
	form.result		= document.getElementById("result-code");
	form.valid		= false;
	
	form.form.onsubmit = function() {
		if (!form.valid) {
			return false;
		}
		if (selectedCell) {
			selectedCell.session.removeEvent(selectedCell.event);
		}
		var timeS = new Date(form.year.value, form.month.value - 1, form.day.value, form.time1.h.value, form.time1.m.value, 0, 0);
		var timeE = new Date(form.year.value, form.month.value - 1, form.day.value, form.time2.h.value, form.time2.m.value, 0, 0);
		timetable.addEvent(timeS, timeE, form.location.value, form.global.checked, form.summary.value);
		baseinner.innerHTML = timetable.toString(true);
		hijackTable();
		form.stopEditing();
		return false;
	};
	
	form.Cancel.onclick = function() {
		form.stopEditing();
	};
	
	form.Delete.onclick = function() {
		selectedCell.session.removeEvent(selectedCell.event);
		form.stopEditing();
		baseinner.innerHTML = timetable;
		hijackTable();
	};
	
	form.Export.onclick = function() {
		form.result.value = timetable;
		form.result.parentNode.className = "";
	};
	
	form.ResultOk.onclick = function() {
		form.result.parentNode.className = "hidden";
		form.result.value = "";
	};
	
	form.clear = function() {
		this.summary.value = "";
		this.location.value = "";
		this.global.checked = false;
	};
	
	form.stopEditing = function() {
		form.Ok.value = "Add Session";
		form.Cancel.className = "hidden";
		form.Delete.className = "hidden";
		isEditing = false;
		if (selectedCell) {
			selectedCell.td.className = selectedCell.td.className.replace(/(^|\s)selected($|\s)/g, "");
		}
		selectedCell = null;
		form.clear();
	};
	
	//fill up the date selectors
	var dt = new Date();
	var day = dt.getDate();
	while (form.day.firstChild) {
		form.day.removeChild(form.day.firstChild);
	}
	for (var i = 1; i < 32; i++) { //TODO fixing days for different months
		var option = document.createElement("option");
		option.appendChild(document.createTextNode(i));
		option.value = i;
		if (i == day) {
			option.selected = "selected";
		}
		form.day.appendChild(option);
	}
	
	form.month.value = dt.getMonth() + 1;
	
	var year = dt.getFullYear();
	while (form.year.firstChild) {
		form.year.removeChild(form.year.firstChild);
	}
	for (var i = year; i < year + 11; i++) {
		var option = document.createElement("option");
		option.appendChild(document.createTextNode(i));
		option.value = i;
		form.year.appendChild(option);
	}
	
	//fill up the time selectors
	while (form.time1.h.firstChild && form.time2.h.firstChild) {
		form.time1.h.removeChild(form.time1.h.firstChild);
		form.time2.h.removeChild(form.time2.h.firstChild);
	}
	for (var i = 0; i < 23; i++) {
		var option = document.createElement("option");
		option.appendChild(document.createTextNode(i));
		option.value = i;
		if (i == 8) {
			option.selected = "selected";
		}
		form.time1.h.appendChild(option);
		form.time2.h.appendChild(option.cloneNode(true));
	}
	for (var i = 5; i < 60; i += 5) {
		var option = document.createElement("option");
		option.appendChild(document.createTextNode(i.zero()));
		option.value = i.zero();
		form.time1.m.appendChild(option);
		form.time2.m.appendChild(option.cloneNode(true));
	}
	
	setInterval(ticker, 5);
};

/**
	function, which ticks every 5 ms to validate the form.
*/
function ticker () {//@TODO error messages

	validate();
	//editing
	if (!isEditing && selectedCell) {
		isEditing = true;
		form.Cancel.className = "";
		form.Delete.className = "";
		form.Ok.value = "Update Session";
		form.summary.value = selectedCell.event.desc;
		form.location.value = selectedCell.event.location;
		var start = selectedCell.session.start;
		var end = selectedCell.session.end;
		form.time1.h.value = start.getHours();
		form.time1.m.value = start.getMinutes().zero();
		form.time2.h.value = end.getHours();
		form.time2.m.value = end.getMinutes().zero();
		form.day.value = start.getDate();
		form.month.value = start.getMonth() + 1;
		form.year.value = start.getFullYear();
	}
	form.Ok.disabled = !form.valid;
}


function validate()
{
	var valid = form.valid;
	var res;
	if (form.year.value != form.year.oldvalue || form.month.value != form.month.oldvalue || form.day.value != form.day.oldvalue ||
		form.time1.h.value != form.time1.h.oldvalue || form.time1.m.value != form.time1.m.oldvalue || 
		form.time2.h.value != form.time2.h.oldvalue || form.time2.m.value != form.time2.m.oldvalue) {
		
		res = true;
		var timeS = new Date(form.year.value, form.month.value - 1, form.day.value, form.time1.h.value, form.time1.m.value, 0, 0);
		var timeE = new Date(form.year.value, form.month.value - 1, form.day.value, form.time2.h.value, form.time2.m.value, 0, 0);
		var exists = timetable.isValidTime(timeS, timeE);
		if (timeS >= timeE) {
			res = false;
		}
		form.time1.h.parentNode.className = res?"valid":"invalid";
		if (exists && res) {
			form.time1.h.parentNode.className = "exisitng-location";
		}
		form.validdate = res;

		form.year.oldvalue = form.year.value;
		form.month.oldvalue = form.month.value;
		form.day.oldvalue = form.day.value;
		form.time1.h.oldvalue = form.time1.h.value;
		form.time1.m.oldvalue = form.time1.m.value;
		form.time2.h.oldvalue = form.time2.h.value;
		form.time2.m.oldvalue = form.time2.m.value;
	}	
	
	if (form.summary.value != form.summary.oldvalue) {
		form.summary.parentNode.className = form.summary.value?"valid":"invalid";
		form.validsummary = !!form.summary.value;

		form.summary.oldvalue = form.summary.value;
	}
	
	if (form.location.value != form.location.oldvalue) {
		res = form.location.value && 
				(selectedCell || 
					timetable.isValidLocation(new Date(form.year.value, 
														form.month.value - 1,
														form.day.value, 
														form.time1.h.value, 
														form.time1.m.value, 
														0, 
														0),
											  new Date(form.year.value, 
														form.month.value - 1,
														form.day.value, 
														form.time2.h.value, 
														form.time2.m.value, 
														0, 
														0),
												form.location.value)
				);
		form.location.parentNode.className = res?"valid":"invalid";
		form.validlocation = res;
		if (res && !selectedCell && timetable.getLocations4Output().inside(form.location.value)) {
			form.location.parentNode.className = "exisitng-location";
		}
		form.location.oldvalue = form.location.value;
	}
	form.valid = form.validdate && form.validsummary && form.validlocation;
}

/**
* adds onclick events to table cells for editing puposes
*/
function hijackTable () {
	var table = document.getElementsByTagName("table");
	if (table.length) {
		table = table[0];
	} else {
		return false;
	}
	var tds = table.getElementsByTagName("tbody")[0].getElementsByTagName("td");
	for (var i = 0, j = tds.length; i < j; i++) {
		var time = tds[i].headers.match(/^(time-\d+)($|\s)/);
		time = time && time.length && time[1];
		if (time && tds[i].id) {
			tds[i].time1 = document.getElementById(time).getElementsByTagName("abbr")[0].getAttribute("title");
			tds[i].time2 = document.getElementById(time).getElementsByTagName("abbr")[1].getAttribute("title");
			var id = tds[i].id.match(/^event-(\d+)-(\d+)$/);
			if (id.length == 3) {
				tds[i].i = id[1];
				tds[i].j = id[2];
			}
			
			tds[i].onclick = function() {
				if (!this.headers) {
					return false;
				}
				if (selectedCell) {
					selectedCell.td.className = selectedCell.td.className.replace(/(^|\s)selected($|\s)/g, "");
				}
				this.className += " selected";
				var session = timetable.items[this.i];
				var theevent = session.events[this.j];
				selectedCell = {td:this, session:session, event: theevent};
				isEditing = false;
				return false;
			};
		}
	}
	return true;
}