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('popupcalendar');
	showIEObject('SELECT');
	showIEObject('APPLET');
}

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

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();
}

/*** popupcalendar ***/

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;

	if ($('header') && !($('popupcalendar'))) {
		new Insertion.Before('header', '<div onclick="bShow=true" id="popupcalendar" 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>";
	}
	DocumentRegisterEvents('popupcalendar');
	if (!Element.visible('popupcalendar')) {
		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;
		}

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

		constructCalendar (1, monthSelected, yearSelected);

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

		bShow = true;
	}
}

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

function DocumentRegisterEvents(type) {
	document.onclick = function hideCalender_Trap() {
		if (type == 'popupcalendar') {
			if (!bShow) hideCalendar();
			bShow = false;
		}
		if (type == 'selecttime') {
			if (!btimeShow) hideTime();
			btimeShow = false;
		}
	}
}

/*** time ***/

var dateFormat, hourSelected, minuteSelected;

/* createtimefield 											*/

function openTime(ctl, fromInput, format) {
	popUpTime(ctl, $(fromInput), format);
}

/**
 * format - format for time: 'h:MM:ss'
 * correct word:
 *
 * h  	Hours; no leading zero for single-digit hours (12-hour clock).
 * hh 	Hours; leading zero for single-digit hours (12-hour clock).
 * H 	Hours; no leading zero for single-digit hours (24-hour clock).
 * HH 	Hours; leading zero for single-digit hours (24-hour clock).
 * M 	Minutes; no leading zero for single-digit minutes.
 * Uppercase M unlike CF timeFormat's m to avoid conflict with months.
 * MM 	Minutes; leading zero for single-digit minutes.
 * Uppercase MM unlike CF timeFormat's mm to avoid conflict with months.
 * s 	Seconds; no leading zero for single-digit seconds.
 * ss 	Seconds; leading zero for single-digit seconds.
 *
 *
 */
function popUpTime(ctl,	ctl2, format) {
	var	leftpos = 0;
	var	toppos  = 0;

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

		var monthConstructed = false;
		var yearConstructed  = false;

		var time = ctl2.value;
		var hourSelected = (time.split(':')[0]);
		var minuteSelected = (time.split(':')[1]);

		var hours_line1 = '';
		var class_ ='';
		for (i=0; i<12; i++) {
				hours_line1 += '<td><a '+ class_ +'id="hour'+i+'" href=\"javascript: void(0);\" onclick=\"event.cancelBubble = true; hourSelected=\''+ i +'\';\">'+i+'</a></td>';
		}
		var hours_line2 = '';
		for (i=12; i<24; i++) {
				hours_line2 += '<td><a class=\''+ class_ + '\' href=\"javascript: void(0);\" onclick=\" event.cancelBubble =  true; hourSelected=\''+ i +'\';\">'+i+'</a></td>';
		}
		var minutes_line1 = '';
		for (i=0; i<30; i = i +5) {
				minute = i < 10 ? "0" + i : i;
				minutes_line1 += '<td><a class=\''+ class_ + '\' href=\"javascript: void(0);\" onclick=\"minuteSelected=\''+ i +'\'; closeTime();\">:'+minute+'</a></td>';
		}
		var minutes_line2 = '';
		for (i=30; i<60; i = i+5) {
				minutes_line2 += '<td><a class=\''+ class_ + '\' href=\"javascript: void(0);\" onclick=\"minuteSelected=\''+ i +'\'; closeTime();\">:'+i+'</a></td>';
		}

		$("time-caption").innerHTML =
			"<div style='display: block;' class='date-caption'>"
			 + "<table>"
			 + "<tr><td>Wybór czasu:</td></tr>"
			 + "<tr>"
			 + "<td style='text-align: center;'>"
			 + "<table class='hours-table'>"
			 + "<tr>"
			 + hours_line1
			 + "</tr>"
			 + "<tr>"
			 + hours_line2
			 + "</tr>"
			 + "</table>"
			 + "</td>\n"
			 + "</tr><tr>"
			 + "<td style='text-align: center;'>"
			 + "<table class='minutes-table' width='100%'>"
			 + "<tr>"
			 + minutes_line1
			 + "</tr>"
			 + "<tr>"
			 + minutes_line2
			 + "</tr>"
			 + "</table>"
			 + "</td>\n"
			 + "</tr></table>"
			 + "</div>";
	}

	DocumentRegisterEvents('selecttime');

	if (!Element.visible('selecttime')) {
		ctlToPlaceValue = ctl2;
		timeFormat = format;
		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;
		}

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

		constructTime (1, monthSelected, yearSelected);

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

		btimeShow = true;
	}
}

function constructTime(h, m) {
	var sTmp = timeFormat;
	//h: MM
	//timeFormat;
	h = h < 10 ? "0" + h : h;
	m = m < 10 ? "0" + m : m;
	sTmp = sTmp.replace("H",h);
	sTmp = sTmp.replace("mm",m);
	return sTmp;
}

function closeTime() {
	hideTime();
	if (hourSelected == undefined)
		hourSelected = 0;
	ctlToPlaceValue.value = constructTime(hourSelected, minuteSelected);
	if (typeof ctlToPlaceValue.onchange == 'function') {
		ctlToPlaceValue.onchange();
	}
}

function hideTime() {
	Element.hide('selecttime');
	showIEObject('SELECT');
	showIEObject('APPLET');
}

function updateDateField(input, from, format) {
	var cur = getSelectionStart(input);
	var len = input.value.length;
	if (len == cur) {
		openCalendar(input, from, format);	
	} 
}

function updateTimeField(input, from, format) {
	var cur = getSelectionStart(input);
	var len = input.value.length;
	if (len == cur) {
		openTime(input, from, format);
	} 
}

function getSelectionStart(elem) {
	if (elem.createTextRange) {
		var r = document.selection.createRange().duplicate();
		r.moveEnd('character', elem.value.length);
		if (r.text == '') {
			return elem.value.length;
		}
		else {
			return elem.value.lastIndexOf(r.text);
		}
	}
	else {
		return elem.selectionStart;
	}
}

function getSelectionEnd(elem) {
	if (elem.createTextRange) {
		var r = document.selection.createRange().duplicate();
		r.moveStart('character', -elem.value.length);
		return r.text.length;
	}
	else {
		return elem.selectionEnd;
	}
}
