/* utility functions */
function apply(ctx, args) {
	var f = args[0];
	args.splice(0, 1);
	return f.apply(ctx, args);
}

function bind() {
	var args = Array();
	for (var i = 0; i < arguments.length; ) args.push(arguments[i++]);
	return function() { 
		return apply(this, args);
	};
}

function partial() {
	var args = Array();
	for (var i = 0; i < arguments.length; ) args.push(arguments[i++]);

	return function() { 
		var a = args.concat([]);
		for (var i = 0; i < arguments.length; ) a.push(arguments[i++]);
		return apply(this, a);
	};
}

function trim(txt) {
	return txt.replace(/^\s+|\s+$/, "");
}

/* menu implementation */
var _menuCurrentE = null;
var _menuCurrentMode = false;
var _menuNextE = null;
var _menuNextMode = false;

function _menuDisplay() {
	if (_menuNextE) {
		if (_menuNextE != _menuCurrentE || _menuNextMode != _menuCurrentMode) {
			_menuCurrentE = _menuNextE;
			_menuCurrentMode = _menuNextMode;
			if (_menuCurrentMode) {
				if (_menuCurrentE.className.indexOf("oXver") == -1 && _menuCurrentE.className.indexOf("over") == -1)
					_menuCurrentE.className += " oXver";
				_menuCurrentE.className = _menuCurrentE.className.replace("oXver", "over");
			} else {
				_menuCurrentE.className = _menuCurrentE.className.replace("over", "oXver");
			}
		}
		_menuNextE = null;
	}
}

function menuPopup(e, mode) {
	if (e == _menuNextE || (!_menuNextE && e == _menuCurrentE)) {
		_menuNextE = e;
		_menuNextMode = mode;	
		window.setTimeout("_menuDisplay()", 500);	
	} else {
		_menuDisplay();
		_menuNextE = e;
		_menuNextMode = mode;	
		_menuDisplay();
	}
}
	
function menuInit() {
	if (document.all && document.getElementById && document.charset) {
		var ul = document.getElementById("top-nav");
		if (ul)
			for (var i = 0; i < ul.childNodes.length; i++) {
				var li = ul.childNodes[i];
				if (li.nodeName == "LI") {
					li.onmouseover = function() { 
						menuPopup(this, true);					
					}
					li.onmouseout = function() { 
						menuPopup(this, false);					
					}
	   			}
	   		}
  	}
}

/* calendar implementation */
var calMonthNames = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
var calDayNames = new Array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag");

function _calDC(year, month, date) {
	var d = 0;
	if (year.getFullYear) {
		d = Date.UTC(year.getFullYear(), year.getMonth(), year.getDate());
	} else {
		d = Date.UTC(year, month, date);
	}
	return Math.round(d / (60 * 60 * 24 * 1000));
}

function _calDC2Date(v) {
	return new Date(v * (60 * 60 * 24 * 1000));
}	

function _calWeekOfYear(d) {
	var tail = (d + 3)% 7;
	var y = _calDC2Date(d - tail + 3).getUTCFullYear();		
	var d2 = _calDC(y, 0, 1) + tail - 10;
	var woy = Math.floor((d - d2) / 7);
	return woy;
}

function calInit(headId, bodyId, f, todayStr, dateStr, f2) {
	if (!document.getElementById) return false;
	
	var head = document.getElementById(headId);
	var body = document.getElementById(bodyId);

	/* calculate start date */
	var tmp = new Date();
	
	var okay = false;
	if (dateStr) {
		try {
			// FIXME parse date
			var dateParts = dateStr.split("-");
			year = Number(dateParts[0]);
			if (year < 50) year += 2000;
			else if (year < 100) year += 1900;
			month = Number(dateParts[1]) - 1;
			date = Number(dateParts[2]);
			okay = !(isNaN(month) || isNaN(date) || isNaN(year));
			okay = okay && month >= 0 && month <= 11;
			okay = okay && date >= 1 && date <= 31;
		} catch (e) {
			okay = false;
		}
	}
	if (!okay) {
		var year = tmp.getFullYear();
		var month = tmp.getMonth();
		var date = tmp.getDate();
	}

	var today = "";
	if (todayStr) {
		// FIXME parse date
		var dateParts = todayStr.split("-");
		today = Number(dateParts[0]) + "-" + (Number(dateParts[1])) + "-" + Number(dateParts[2]);
	}
		
	/* fill head */
	if (head && head.getElementsByTagName) {
		var nodes = head.getElementsByTagName("a");
		if (nodes.length > 1) {
			yp = yn = year;
			mp = month;
			if (mp < 1) { mp = 12; --yp;}
			mn = month + 2;
			if (mn > 12) { mn = 1; ++yn;}
			nodes[0].href = "?Open&day=" + yp + "-" + mp + "-1"; // FIXME js-less
			nodes[1].href = "?Open&day=" + yn + "-" + mn + "-1"; // FIXME js-less 
			nodes[0].onclick = bind(calInit, headId, bodyId, f, todayStr, yp + "-" + mp + "-1", f2);
			nodes[1].onclick = bind(calInit, headId, bodyId, f, todayStr, yn + "-" + mn + "-1", f2);
		}
		var nodes = head.getElementsByTagName("td");
		if (nodes.length > 1) {
			nodes[1].innerHTML = calMonthNames[month].toUpperCase() + " " + year;
		}
	}

	/* fill dates */
	if (body && body.getElementsByTagName) {
		var spans = body.getElementsByTagName("span");
		var links = body.getElementsByTagName("a");
		var woyLinks = false;
		if (spans.length == 0) {
			var allLinks = links;
			links = new Array();
			spans = new Array();
			for(var i = 0; i < allLinks.length; ++i) {
				if (allLinks[i].className == "woy") 
					spans.push(allLinks[i]);
				else
					links.push(allLinks[i]);
			}
			var woyLinks = true;
		}
		if (spans.length >= 6 && links.length >= 6 * 7) {
			var day = _calDC(year, month, 1);
			var offset = 1 + (_calDC2Date(day).getUTCDay() + 6) % 7;
			for (var w = 0, i = 1; w < 6; ++w) {
				for (var t = 1; t < 8; ++t, ++i) {
					var d = day + (i - offset);
					var dd = _calDC2Date(d);
					
					var dow = dd.getUTCDay();
					var m = dd.getUTCMonth();
		
					var ds = year + "-" + (month + 1) + "-" + ((i - offset) + 1);

					if (t == 1) {
						spans[w].innerHTML = _calWeekOfYear(d);
						if (woyLinks) {

							var dd2 = _calDC2Date(d + 6);
							var from = dd.getUTCFullYear() + "-" + (dd.getUTCMonth() + 1) + "-" + (dd.getUTCDate());
							var to = dd2.getUTCFullYear() + "-" + (dd2.getUTCMonth() + 1) + "-" + (dd2.getUTCDate());
							spans[w].onclick = bind(f2, from, to);						
						}
					}
					if (m != month) {
						links[i - 1].innerHTML = "";
						links[i - 1].href = "#"; // FIXME js-less
						links[i - 1].onclick = function() { return true;};
					} else {
						links[i - 1].innerHTML = (i - offset) + 1;
						links[i - 1].href = "#"; // FIXME js-less
						links[i - 1].onclick = bind(f, ds);
					}
					var td = links[i - 1].parentNode;
					if (td.className.indexOf("selected") != -1) {
						td.className = td.className.replace(/\s*selected/, "");
					}
					if (ds == today) {
						td.className += " selected";
					}
				}
			}
		}
	}
	return false;
}

function calShowDate(ds) {
	document.location.href = "?Open&day=" + ds
	return false;
}

function calShowDateRange(from, to) {
	var f = from.split("-");
	var t = to.split("-");
	document.location.href = "?Open" + "&from-year=" + f[0] + "&from-month=" + f[1] + "&from-day=" + f[2] + "&to-year=" + t[0] + "&to-month=" + t[1] + "&to-day=" + t[2];
	return false;
}

/* search implementation */
function searchSubmit() {
	return true;
}	

function searchOptionalText(input, pattern, substitute) {
	if (input && trim(input.value) == pattern) 
		input.value = substitute;
}

function searchOnlyDigitsCheck(input, n) {
	// FIXME searchOnlyDigitsCheck
}

function searchSetDate(id, dateStr) {
	var cal = document.getElementById("select-cal");
	var form = 	document.getElementById("search-form");
	var nodes = form.getElementsByTagName("select");

	cal.style.display = "none";
	for (var i = 0; i < nodes.length; ++i) nodes[i].style.visibility = "visible";
	
	var dateParts = dateStr.split("-");

	document.getElementsByName(id + "-year")[0].value = dateParts[0];
	document.getElementsByName(id + "-month")[0].value = dateParts[1];
	document.getElementsByName(id + "-day")[0].value = dateParts[2];
	return false;
}

function searchSelectDate(id, top) {
	if (!document.getElementById) return false;
	var cal = document.getElementById("select-cal");
	var form = 	document.getElementById("search-form");
	var nodes = form.getElementsByTagName("select");

	if (!cal || !form || !nodes) return false;

	d = trim(document.getElementsByName(id + "-year")[0].value) + "-" + trim(document.getElementsByName(id + "-month")[0].value) + "-" + trim(document.getElementsByName(id + "-day")[0].value);
	
	calInit("select-cal-head", "select-cal-body", partial(searchSetDate, id), d, d);

	if (cal.style.top == top && cal.style.display == "block") {
		cal.style.display = "none";
		for (var i = 0; i < nodes.length; ++i) nodes[i].style.visibility = "visible";
	} else {
		cal.style.top = top;
		cal.style.display = "block";
		for (var i = 0; i < nodes.length; ++i) nodes[i].style.visibility = "hidden";
	}
	return false;
}	

var lastTwist = "";
function twistShow(id) {
	if (lastTwist) {
		var e = document.getElementById('showstable-' + lastTwist)
		if (e) e.style.display='none';
	}
	var e = document.getElementById('showstable-' + id)
	if (e) e.style.display='';
	lastTwist = id;
	return false;
}

