var TiCal = 
{
	minDate: new Date(),
	maxDate: new Date(),
	
	disablePast: true,
	disableWeekends: true,

	getDays: function() {
		return "Mo,Di,Mi,Do,Fr,Sa,So".split(",");
	},
	getMonths: function() {
		return "Januar,Februar,M&auml;rz,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember".split(",");
	},
	onSelect: function(s) {
		if(TiCal.inputBox)
			TiCal.inputBox.value = s;	
		TiCal.close();
	},
	open: function(inputBox) {
		TiCal.inputBox = inputBox;
		if(!TiCal.inited)
			TiCal.init();
		var date = (TiCal.inputBox) ? TiCal.parseDate(inputBox.value) : (new Date);
		TiCal.setDate(date);
		setTimeout(TiCal.update, 2);
	},
	close: function() {
		document.getElementById("TiCal").style.display = "none"
	},

	
	
	//

	date: new Date,
	inited: false,
	
	dmy: function(date) {
	  function fn(n) { return n < 10 ? '0' + n : n; }
		return [fn(date.getDate()), fn(date.getMonth() + 1), date.getFullYear()].join(".");
	},
	ymd: function(date) {
		function fn(n) { return n < 10 ? '0' + n : n; }
		return [date.getFullYear(), fn(date.getMonth() + 1), fn(date.getDate())].join("-");
	},
	ym: function(date) {
		return [date.getFullYear(), date.getMonth() + 100].join("-");
	},
	init: function() {
		var html = [];
		
		html.push('<table id="TiCalHead"><tr>');
		html.push('<td align=left><button onclick="TiCal.goMonth(-1);return false">&laquo;</button></td>');
		html.push('<td align=center id="TiCalMonth"></td>');
		html.push('<td align=right><button onclick="TiCal.goMonth(+1);return false">&raquo;</button></td>');
		html.push('</tr></table>');
		html.push('<div id="TiCalBox" onmouseover="TiCal.mouseEvent(event, 1)" onmouseout="TiCal.mouseEvent(event, 2)" onclick="TiCal.mouseEvent(event, 3)"></div>');
		html.push('<p><a href="#" onclick="TiCal.close();return false">schlie&szlig;en</a></p>');
		document.getElementById("TiCal").innerHTML = html.join("\n");

		TiCal.tabHead = "<tr>";
		var t = TiCal.getDays();
		for(var i = 0; i < t.length; i++)
			TiCal.tabHead += ((i > 4) ? "<th class='we'>" : "<th>") + t[i] + "</th>";
		TiCal.tabHead += "</tr>";

		TiCal.inited = 1;
	},
	parseDate: function(s) {
		var m;
		if(m = (s + "").match(/^(\d+)\.(\d+)\.(\d+)/)) {
			var d = new Date(Number(m[3]), Number(m[2]) - 1, Number(m[1]));
			return d || (new Date);
		}
		return new Date;
	},
	setDate: function(date) {
		var ym = TiCal.ym(date);
		if(ym < TiCal.ym(TiCal.minDate))
			date = TiCal.minDate;
		if(ym > TiCal.ym(TiCal.maxDate))
			date = TiCal.maxDate;
		TiCal.date = date;
	},
	update: function() {
		TiCal.draw();
		document.getElementById("TiCal").style.display = "block";
		document.getElementById("TiCalMonth").innerHTML = TiCal.getMonths()[TiCal.date.getMonth()] + " " + TiCal.date.getFullYear();
		TiCal.setPos(TiCal.inputBox);

	},
	draw: function() {
		var dnow = TiCal.ymd(new Date);
		var dmin = TiCal.ymd(TiCal.minDate);
		var dmax = TiCal.ymd(TiCal.maxDate);
		
		var d = new Date(TiCal.date);
		var e = "<td>&nbsp;</td>";
		
		var row = 0, tab = [], dow = 0;
		

		for(var day = 1; day < 32; day++) {
			d.setDate(day);
			if(d.getMonth() != TiCal.date.getMonth())
				break;
			dow = (d.getDay() || 7) - 1;
			if(!dow || !tab.length)
				tab[++row] = [e, e, e, e, e, e, e];
			
			var cls = 'day', dd = TiCal.ymd(d);

			if(dd < dmin ||  dd > dmax)
				cls = 'dis';
			else if(TiCal.disableWeekends && dow > 4)
				cls = 'dis';
			else if(dd == dnow)
				cls = 'now';
			tab[row][dow] = "<td class='" + cls + "'>" + day + "</td>";
		}

		var table = [TiCal.tabHead];

		for(var row = 1; row < tab.length; row++) {
			table.push("<tr>");
			table.push(tab[row].join("\n"));
			table.push("</tr>");
		}
		
		document.getElementById("TiCalBox").innerHTML = "<table>" + table.join("\n") + "</table>";
	},
	setPos: function(obj) {
		var div = document.getElementById("TiCal");
		var x = 0, y = obj.offsetHeight + 1;
		while(obj && obj != div.offsetParent) {
			x += obj.offsetLeft;
			y += obj.offsetTop;
			obj = obj.offsetParent;
		}
		div.style.left = x + "px";
		div.style.top = y + "px";
	},
	goMonth: function(n) {
		var d = new Date(TiCal.date);
		d.setMonth(d.getMonth() + n);
		TiCal.setDate(d);
		TiCal.update();
	},
	mouseEvent: function(event, type) {
		var e = window.event || event;
		var o = e.srcElement || e.target;
		if(o && !o.tagName) 
			o = o.parentNode;
		if(!o || o.tagName.toLowerCase() != "td")
			return;
		var day = Number(o.innerHTML);
		if(!day)
			return;
		if(!o.className.match(/\b(day|now)\b/))
			return;
		o.className = (o.className + "").replace(/\s+hover/, "");
		if(type == 1 || type == 3)
			o.className += " hover";
		if(type == 3) {
			var d = new Date(TiCal.date);
			d.setDate(day);
			TiCal.onSelect(TiCal.dmy(d));
		}
	}
	
}