var calIE = navigator.userAgent.indexOf("MSIE")!=-1;
var calGecko = navigator.userAgent.indexOf("Gecko")!=-1;
var calStyleDef = '<style>'+
'.calButton {'+
'	border-left:1px solid threedhighlight;'+
'	border-top:1px solid threedhighlight;'+
'	border-right:1px solid threedshadow;'+
'	border-bottom:1px solid threedshadow;'+
'	padding:6px 3px;'+
'	margin:1px;'+
'	text-decoration:none;'+
'	color:#000000;'+
'}'+
'.calDayout,.calDayin {'+
'	text-decoration:none;'+
'	padding:3px 4px;'+
'}'+
'.calDayout {'+
'	color:#888888;'+
'}'+
'.calDayin {'+
'	color:#000000;'+
'}'+
'TD.calSel {'+
'	background-color:threedface;'+
'}'+
'.calKop {'+
'	background-color:threedface;'+
'}'+
'HR.calHR {'+
'	color:#000000;'+
'	margin:0;'+
'	padding:0;'+
'	height:1px;'+
'}'+
'.cal {'+
'	padding:1px;'+
//'	border:2px groove;'+
'	border:1px solid threedshadow;'+
(calIE?'	width:1px;':'')+
'	background-color:threedhighlight;'+
'}'+
'#calGrid, #calKoptxt, .calSel, .calNS {'+
'	font:8pt MS Shell Dlg;'+
'}'+
'#calKoptxt {'+
'	font-weight: bold;'+
'	text-align: center;'+
'	padding:.75em;'+
'}'+
'</style>';
if (!window.calStyle)
	window.calStyle = calStyleDef;

var calMS = ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"];
var calDS = ["ma", "di", "wo", "do", "vr", "za", "zo"];
var calE;
var calSele;
var calSeld;
var cal, calvis;
var calFmtYMD, calValExtra;
var calValOrg, calValExtraOrg;
var calFmt;
var calClkHide, calOnHide;
var calIFrame = calIE; // && navigator.userAgent.match("MSIE [456]");
//var calf;
var calNoHideHook;

function calsube(n) {
	return calIFrame ? calf.document.all[n] : document.getElementById(n);
}

function calchcell(c) {
	if (c == calSele)
		return;
	if (calSele)
		calSele.className = "calNS";
	calSele = c;
	calSele.className = "calSel";
	if (calvis)
		calSele.firstChild.focus();
}

function calclk(e) {
	e = e.parentElement || e.parentNode;
	var ci = e.cellIndex;
	var ri = (e.parentElement || e.parentNode).rowIndex - 3;
	if (ri < 0) return;
	var dms = calInitdms();
	var n = (ri * 7 + ci + dms[0]); // day in prev month
	var m;
	if (n > dms[1]) {
		n -= dms[1];
		if (n > dms[2]) { n -= dms[2]; m = 1; } else m = 0;
	} else
		m = -1;
	var nd = new Date(calSeld.getTime());
	nd.setDate(1);
	nd.setMonth(calSeld.getMonth() + m);
	nd.setDate(n);
	calSetSeld(nd);
	if (calClkHide) calHide();
}

function calckey(e, ev) {
	var kc = (ev.keyCode || ev.which) +
		(ev.shiftKey ? 256 : 0) + (ev.ctrlKey ? 512 : 0) + (ev.altKey ? 1024 : 0);
	var cancel = true;
	e = e.parentNode;
	var nd = new Date(calSeld.getTime());
	if (kc == 9 || kc == 256 + 9) {
		calHide();
		cancel = false;
	} else if (kc == 33)
		nd.setMonth(nd.getMonth() - 1);
	else if (kc == 34)
		nd.setMonth(nd.getMonth() + 1);
	else if (kc == 36)
		nd.setDate(1);
	else if (kc == 35) {
		nd.setDate(1);
		nd.setMonth(nd.getMonth() + 1);
		nd.setDate(0);
	} else if (kc == 37)
		nd.setDate(nd.getDate() - 1);
	else if (kc == 38)
		nd.setDate(nd.getDate() - 7);
	else if (kc == 39)
		nd.setDate(nd.getDate() + 1);
	else if (kc == 40)
		nd.setDate(nd.getDate() + 7);
	else {
		nd = null;
		if (kc == 115)
			calHide();
		else
			cancel = false;
	}
	if (cancel) {
		if (nd)
			calSetSeld(nd);
		return false;
	}
}

function onseldchm() {
	calsube("calKoptxt").innerHTML = calKopt();
	var dms = calInitdms();

	var t = calsube("calGrid");
	for (var ri = 0; ri < 6; ri++)
		for (var ci = 0; ci < 7; ci++)
			t.rows[3 + ri].cells[ci].innerHTML = calCellHtm(ri, ci, dms);
}

function calSetSeld(d, disinit) {
	if (!calSeld ||
		d.getFullYear() != calSeld.getFullYear() ||
		d.getMonth() != calSeld.getMonth()) {
		calSeld = d;
		if (calSele)
			calSele.className = "calNS";
		calSele = null;
		onseldchm();
	} else if (calSele && d.getDate() == calSeld.getDate() && (disinit || !calE || calE.value != ""))
		return;
	else
		calSeld = d;
	if (calE && !disinit) {
		var v;
		if (calFmtYMD)
			v = d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
		else
			v = d.getDate() + "-" + (d.getMonth() + 1) + "-" + d.getFullYear();
		var nv = v + ((d.getTime() == calValOrg && calValExtraOrg) || calValExtra || "");
		if (nv != calE.value) {
			calE.value = nv;
			if (calE.onchange)
				calE.onchange();
		}
	}
	var dms = calInitdms();
	var n = calSeld.getDate() + dms[1] - dms[0];
	var ri = Math.floor(n / 7);
	var ci = n % 7;
	var e = calsube("calGrid").rows[3 + ri].cells[ci];
	calchcell(e);
	return e;
}

function calGoN() {
	var nd = new Date(calSeld.getTime());
	nd.setMonth(nd.getMonth() + 1);
	calSetSeld(nd);
}

function calGoP() {
	var nd = new Date(calSeld.getTime());
	nd.setMonth(nd.getMonth() - 1);
	calSetSeld(nd);
}

function calKopt() {
	return calMS[calSeld.getMonth()] + ' ' + calSeld.getFullYear();
}

var calSeld = new Date();

function calCellHtm(ri, ci, dms) {
	var n = (ri * 7 + ci + dms[0]);
	var cls;
	if (n > dms[1]) {
		n -= dms[1];
		if (n > dms[2]) { n -= dms[2]; cls = 'calDayout'; } else cls = 'calDayin';
	} else
		cls = 'calDayout';
	return '<a href="#" onclick="calclk(this);return false" onkeydown="calckey(this,event);return false"><span class=' + cls + '>' + n + '</span></a>';
}

// return current range: [prev month first show,prev month last day,cur month last day]
function calInitdms() {
	var ddmp = new Date(calSeld.getTime());
	ddmp.setDate(0);
	var dmp = ddmp.getDate();
	var dmps = dmp - (ddmp.getDay() + 6) % 7;
	var ddmn = new Date(calSeld.getTime());
	ddmn.setDate(1);
	ddmn.setMonth(ddmn.getMonth() + 1);
	ddmn.setDate(0);
	var dmn = ddmn.getDate();
	return [dmps, dmp, dmn];
}


function calInitHtm() {
	var t = ''
	t += '<table cellspacing=0 cellpadding=0 border=0 id=calGrid>';
	for (var i = 0; i < calDS.length; i++)
		t += '<col width=14%>';
	t += '<tr><td colspan=7 class="calKop"><table cellpadding=0 cellspacing=0 width="100%"><tr>';
	//t += '<td onmouseup="calGoP()"><span class="calButton" unselectable><img src="/9000000/g/arwl3x5.gif" width=3 height=5 border=0></span></td>';
	t += '<td><a href="#" onmouseup="calGoP()" onclick="return false" class="calButton" hidefocus><img src="/9000000/g/arwl3x5.gif" width=3 height=5 border=0></a></td>';
	t += '<td id=calKoptxt>' + calKopt() + '</td>';
	t += '<td align=right><a href="#" onmouseup="calGoN()" onclick="return false" class="calButton" hidefocus><img src="/9000000/g/arwr3x5.gif" width=3 height=5 border=0></a></td>';
	t += '</tr></table></td></tr>';
	t += '<tr>';
	for (var i = 0; i < calDS.length; i++)
		t += '<td align=center class="calNS">' + calDS[i] + '</td>';
	t += '</tr>';
	t += '<tr><td colspan=7 height=1><hr class="calHR"></td></tr>';

	var dms = calInitdms();
	for (var ri = 0; ri < 6; ri++) {
		t += '<tr>';
		for (var ci = 0; ci < calDS.length; ci++)
			t += '<td align=center class="calNS">' + calCellHtm(ri, ci, dms) + '</td>';
		t += '</tr>';
	}
	t += '</table>';
	return t;
}

function calElCreate(w) {
	var e;
	if (!document.all && document.getElementById) {
		e = document.createElement("DIV");
		e.style.position = "absolute";
		//e.style.width = w + "px";
		e.style.top = "0px";
		e.style.left = "0px";
		e.style.zIndex = 1000;
		e.style.display = "none";
		document.body.appendChild(e);
	} else if (document.all) {
		var id = "pn"+new Date().getTime();
		document.body.insertAdjacentHTML("beforeEnd", '<div id="' + id + '" style="width:' + w + 'px;position:absolute;top:0px;left:0px;display:block"></div>');
		e = document.all[id];
		e.style.zIndex = 1000;
	} else if (document.layers) {
		e = new Layer(w);
		e.zIndex = 1000;
	}
	return e;
}

function calElMove(d, x, y) {
	if (document.all) { d.style.pixelLeft = x; d.style.pixelTop = y; }
	else if (document.layers) d.moveTo(x, y);
	else if (document.getElementById) { d.style.left = x + "px"; d.style.top = y + "px"; }
}

if (!calIFrame)
	document.write(calStyle);

function calElSet(e, html) {
	if(calIE||calGecko) {
		if (calIFrame) {
			e.innerHTML = '<iframe id="calf" frameborder=0 src="/9000000/v/empty.htm"></iframe>';
			calf.document.write('<head>' + calStyle + '</head><body style="margin:0px">' + html + '</body>');
			calf.document.close();
			calf.calclk = calclk;
			calf.calckey = calckey;
			calf.onseldchm = onseldchm;
			calf.calGoN = calGoN;
			calf.calGoP = calGoP;
			document.all.calf.style.width = calf.document.all.cal.offsetWidth;
			document.all.calf.style.height = calf.document.all.cal.offsetHeight;
		} else
			e.innerHTML = html;
	} else if (e.document) {
		e.document.write(html);
		e.document.close();
	}
}
function calElShow(d, s) {
	if (document.all || document.getElementById) {
		d.style.display = s ? "" : "none";
		if (s) d.style.visibility = "";
	}
	if (document.layers) d.visibility = s ? "show" : "hide";
}

function calShow(x, y, d, yofs) {
	var disinit = false;
	if (!d) {
		d = new Date();
		d.setHours(0);
		d.setMinutes(0);
		d.setSeconds(0);
		d.setMilliseconds(0);
		disinit = true;
	}
	if (!cal) {
		cal = calElCreate(250);
		calSeld = d;
		calElSet(cal, 0 ? calInitHtm() : '<div id="cal" class="cal">' + calInitHtm() + '</div>');
	}
	var cell = calSetSeld(d, true);

	cal.style.visibility = "hidden";
	cal.style.display = "";
	if (document.body.clientHeight &&
		y + yofs + cal.offsetHeight > document.body.scrollTop + document.body.clientHeight) {
		//calElMove(cal, 0, document.body.scrollTop + document.body.clientHeight);
		//calElShow(cal, 1);
		//calElShow(cal, 0);
		//alert(cal.offsetHeight);
		yofs = -cal.offsetHeight - 2;
	}

	calElMove(cal, x, y + yofs);
	calElShow(cal, 1);
	if (!calNoHideHook) {
		cal.onmousedown = function(ev) { if(!ev)ev=event;ev.cancelBubble=true; }
		cal.prevdown = document.body.onmousedown;
		//cal.prevclick = document.body.onclick;
		document.body.onmousedown = function(e) { if (!e) e = window.event; var se = (e.srcElement||e.target); if (se.className == "calB" || se.tagName == "BUTTON" || (se.tagName == "INPUT" && se.type == "submit")) return; calHide(); }
		//document.body.onclick = function(e) { if (!e) e = window.event; if (e.srcElement.className = "calB") return; calHide(); }
	}
	calvis = 1;

	if (cell && cell.firstChild && cell.firstChild.focus)
		eval("try { cell.firstChild.focus(); } catch (e) {}");
}
function calHide() {
	if (!calvis)
		return;
	calvis = 0;
	if (!calNoHideHook) {
		document.body.onmousedown = cal.prevdown;
		//document.body.onclick = cal.prevclick;
	}
	calElShow(cal, 0);
	if (calSele)
		calSele.className = "calNS";
	calSele = null;
	if (calE && calE.focus)
		eval("try { calE.focus(); } catch (e) {}");
	if (calOnHide)
		calOnHide();
	calOnHide = null;
}
function calClientPos(e, ref) {
	var x = 0, y = 0;
	//var a = [];
	function pxw(s) { return s.charCodeAt(s.length - 1) == 120 ? parseInt(s) : 0; }
	while (e && e != ref) {
		x += e.offsetLeft - e.scrollLeft; y += e.offsetTop - e.scrollTop;
		if (calIE) {
			if (e.style.borderLeftWidth)
				x += pxw(e.style.borderLeftWidth)
			if (e.style.borderTopWidth)
				y += pxw(e.style.borderTopWidth)
		}
		//a.push([e.tagName, e.offsetLeft - e.scrollLeft, e.offsetTop - e.scrollTop]);
		e = e.tagName == "BODY" && e.ownerDocument ? e.ownerDocument.documentElement : e.offsetParent;
	}
	/*
	var ox = 0, oy = 0;
	var b = [];
	while (a.length) {
		var o = a.pop();
		ox += o[1]; oy += o[2];
		b.push([o[0], ox, oy]);
	}
	alert(b.join("\n"));
	*/
	return [x, y];
}

function calSetup() {
	calValExtra = null;
	calValExtraOrg = null;
	calValOrg = null;
	calFmtYMD = false;
	calSele = null;
	calSeld = null;
}

function calToggleEl(e,fmt,deft,clkhide,onhide) {
	calFmt = fmt;
	calClkHide = clkhide;
	calOnHide = onhide;
	//calDefT = fmt && fmt.indexOf("%H:%M") != -1 && deft;
	if (calvis) {
		calHide();
		calE = null;
	} else {
		calSetup();
		calE = e;
		p = calClientPos(e, document.body);
		var d;
		var v = e.value;
		var i;
		if (fmt && fmt.indexOf("%H:%M") != -1)
			 calValExtra = " " + (deft || "00:00");
		if ((i = v.indexOf(" ")) >= 0) {
			if (!calValExtra) {
				calValExtraOrg = v.substr(i);
				calValExtra = calValExtraOrg.replace(/[1-9]/g, "0");
			}
			v = v.substr(0, i);
		}
		var m = v.split("-");
		calFmtYMD = m[0].length == 4 || (fmt && fmt.substr(0, 2) == "%Y");
		if (m.length == 3)
			d = calFmtYMD ? new Date(m[0], m[1] - 1, m[2]) : new Date(m[2], m[1] - 1, m[0]);
		calValOrg = d && d.getTime();
		calShow(p[0], p[1], d, e.offsetHeight + 2);
	}
}

