var	fixedX   = -1;
var	fixedY   = -1;
var startAt  = 1;

var today    = new Date();
var dateNow  = today.getDate();
var monthNow = today.getMonth();
var yearNow  = today.getFullYear();

var monthSelected, yearSelected, dateSelected, omonthSelected, oyearSelected, odateSelected, monthConstructed, yearConstructed, ctlToPlaceValue, ctlNow, dateFormat, nStartingYear;

var bShow       = false;

var monthName   = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October","November", "December");
var dayName     = new Array("Mo","Tu","We","Th","Fr","Sa","Su");


function padZero(str, len) {
	var result = '';
	for (var i = 0; i < (len - String(str).length); i++) {
		result += '0';
	}
	return result + str;
}

function constructDate(d, m, y) {
	var sTmp = dateFormat;
	// day
	sTmp = sTmp.replace	("dd",  "<e>");
	sTmp = sTmp.replace	("d",   "<d>");
	sTmp = sTmp.replace	("<e>", padZero(d, 2));
	sTmp = sTmp.replace	("<d>", d);

	// month
	sTmp = sTmp.replace	("mmm", "<o>");
	sTmp = sTmp.replace	("mm",  "<n>");
	sTmp = sTmp.replace	("m",   "<m>");
	sTmp = sTmp.replace	("<m>", m + 1);
	sTmp = sTmp.replace	("<n>", padZero(m + 1, 2));
	sTmp = sTmp.replace	("<o>", monthName[m]);

	// year
	return sTmp.replace ("yyyy", y);
}

function hideCalendar() {
	Element.hide('calendar');
	showIEObject('SELECT');
	showIEObject('APPLET');
}

function closeCalendar() {
	hideCalendar();
	ctlToPlaceValue.value = constructDate(dateSelected, monthSelected, yearSelected);
}

function incMonth () {
	monthSelected++;
	if (monthSelected > 11) {
		monthSelected = 0;
		yearSelected++;
	}
	constructCalendar();
}

function decMonth () {
	monthSelected--;
	if (monthSelected < 0) {
		monthSelected = 11;
		yearSelected--;
	}
	constructCalendar();
}

function incYear () {
	yearSelected++;
	constructCalendar();
}

function decYear () {
	yearSelected--;
	constructCalendar();
}

function daysInMonth(year, month) {
	var	next = new Date (year, month + 1, 1);
	next     = new Date (next - (24 * 60 * 60 * 1000));
	return next.getDate();
}

/*** calendar ***/

function constructCalendar () {
	var	startDate =	new	Date (yearSelected, monthSelected, 1);
	var days      = daysInMonth(yearSelected, monthSelected);

	datePointer	= 0;
	dayPointer  = startDate.getDay() - startAt;

	if (dayPointer < 0) {
		dayPointer = 6;
	}

	var sHTML = "<table class='date-table'><tr id='days-names'>";
	for	(var i = 0; i < 7; i++) {
		sHTML += "<td>"+ dayName[i]+"</td>";
	}
	sHTML +="</tr><tr>";

	for (var i = 1; i <= dayPointer; i++) {
		sHTML += "<td></td>";
	}

	for (datePointer = 1; datePointer <= days; datePointer++) {
		dayPointer++;

		// normal
		sStyle = 'cal-normal-day';
		// weekend
		if (((dayPointer + startAt) % 7 == startAt) || ((dayPointer + startAt) % 7 == startAt - 1)) {
			sStyle = 'cal-weekend';
		}
		// today
		if ((datePointer == dateNow) && (monthSelected == monthNow) && (yearSelected == yearNow)) {
			sStyle = 'cal-today';
		}
		// selected
		if ((datePointer == odateSelected) && (monthSelected == omonthSelected) && (yearSelected == oyearSelected)) {
			sStyle += ' cal-selected';
		}

		var regexp = /\"/g;
		sHint = datePointer + ' ' + monthName[monthSelected] + ' ' + yearSelected;
		sHint = sHint.replace(regexp, '&quot;');

		sHTML += "<td class='" + sStyle + "'>";
		sHTML += "<a title=\"" + sHint + "\" href='javascript:dateSelected=" + datePointer + ";closeCalendar();'>" + datePointer + "</a>";
		if ((dayPointer + startAt) % 7 == startAt) {
			sHTML += "</tr><tr>";
		}
	}

	$("cal-content").innerHTML = sHTML;
	$("spanMonth").innerHTML   = monthName[monthSelected];
	$("spanYear").innerHTML    = yearSelected;
}


/**
 * format - format for date: 'yyyy-mm-dd'
 * correct word: d, dd, m, mm, mmm, yyyy
 */
function popUpCalendar(ctl,	ctl2, format) {
	var	leftpos = 0;
	var	toppos  = 0;

	DocumentRegisterEvents();
	if ($('header') && !($('calendar'))) {
		new Insertion.Before('header', '<div onclick="bShow=true" id="calendar" class="div-calendar"><div id="cal-caption"></div><div id="cal-content"></div></div>');
		hideCalendar();

		monthConstructed = false;
		yearConstructed  = false;

		$("cal-caption").innerHTML =
			"<div style='display: block;' class='date-caption'>"
			 + "<table class='date-table'>"
			 + "<tr>"
			 + "<td style='text-align: left;'><span onclick='javascript:decYear()'> &laquo; </span></td>\n"
			 + "<td style='text-align: center;'><span id='spanYear'></span></td>\n"
			 + "<td style='text-align: right;'><span onclick='javascript:incYear()'> &raquo; </span></td>\n"
			 + "</tr><tr>"
			 + "<td style='text-align: left;'><span onclick='javascript:decMonth()'> &laquo; </span></td>\n"
			 + "<td style='text-align: center;'><span id='spanMonth'></span></td>\n"
			 + "<td style='text-align: right;'><span onclick='javascript:incMonth()'> &raquo; </span></td>\n"
			 + "</tr></table>"
			 + "</div>";
	}
	if (!Element.visible('calendar')) {
		ctlToPlaceValue = ctl2;
		dateFormat = format;

		formatChar = " ";
		aFormat = dateFormat.split(formatChar);
		if (aFormat.length < 3) {
			formatChar = "/";
			aFormat = dateFormat.split(formatChar);
			if (aFormat.length < 3) {
				formatChar = ".";
				aFormat = dateFormat.split(formatChar);
				if (aFormat.length < 3) {
					formatChar = "-";
					aFormat = dateFormat.split(formatChar);
					if (aFormat.length < 3) {
						// invalid date format
						formatChar="";
					}
				}
			}
		}

		tokensChanged = 0;
		if ( formatChar != "" ) {
			// use user's date
			aData = ctl2.value.split(formatChar);

			for	(i = 0; i < 3; i++) {
				if ((aFormat[i] == "d") || (aFormat[i] == "dd")) {
					dateSelected = parseInt(aData[i], 10);
					tokensChanged++;
				} else if ((aFormat[i] == "m") || (aFormat[i] == "mm")) {
					monthSelected = parseInt(aData[i], 10) - 1;
					tokensChanged++;
				} else if (aFormat[i] == "yyyy") {
					yearSelected = parseInt(aData[i], 10);
					tokensChanged++;
				} else if (aFormat[i] == "mmm") {
					for	(j = 0; j < 12; j++) {
						if (aData[i] == monthName[j]) {
							monthSelected = j;
							tokensChanged++;
						}
					}
				}
			}
		}

		if ((tokensChanged != 3) || isNaN(dateSelected) || isNaN(monthSelected) || isNaN(yearSelected)) {
			dateSelected  = dateNow;
			monthSelected = monthNow;
			yearSelected  = yearNow;
		}

		odateSelected  = dateSelected;
		omonthSelected = monthSelected;
		oyearSelected  = yearSelected;

		aTag = ctl;
		if (IE) {
			do {
				aTag     = aTag.offsetParent;
				leftpos += aTag.offsetLeft;
				toppos  += aTag.offsetTop;
			}
			while (aTag.tagName != "BODY" && aTag.tagName != "HTML");
		} else {
			do {
				aTag     = aTag.offsetParent;
				leftpos += aTag.offsetLeft;
				toppos  += aTag.offsetTop;
			}
			while (aTag.tagName != "BODY");
			leftpos += 28;
			toppos += 8;
		}

		$('calendar').style.left = (fixedX == -1 ? ctl.offsetLeft + leftpos : fixedX) + 'px';
		$('calendar').style.top  = (fixedY == -1 ? ctl.offsetTop + toppos + ctl.offsetHeight + 2 : fixedY) + 'px';

		constructCalendar (1, monthSelected, yearSelected);

		Element.show('calendar');
		hideIEObject('SELECT', $("calendar"));
		hideIEObject('APPLET', $("calendar"));

		bShow = true;
	}
}

function openCalendar(ctl, fromInput, format) {
	popUpCalendar(ctl, $(fromInput), format);
}

function DocumentRegisterEvents() {
	document.onclick = function hideCalender_Trap() {
		if (!bShow) hideCalendar();
		bShow = false;
	}
}

