/*
Usage:
	<input type="text" name="jokunimi" value="10.07.2005" id="dd.mm.yyyy" class="cal-datefield">

Recognised tokens:
	d	= Day without padding (ie. 6)
	dd	= Day with padding (ie. 06)
	m	= Month without padding (ie. 2)
	mm	= Month with padding (ie. 02)
	yy	= Year with two digits (ie. 79). <50 is considered to be 20xx and >=50 is considered 19xx
	yyyy	= Year with four digits (ie. 2005)
	
Attributes:
	mindate = lower limit for selectable date
	maxdate = upper limit for selectable date
*/

if(appurl) var cal_buttonPath = appurl + "/buttons/";
else var cal_buttonPath = "buttons/";

var cal_id_calendar = "cal_id_calendar";
var cal_id_content = "cal_id_content";
var cal_activeCalendar = null;
var show_hours = false;
var show_minutes = false;

//  SET ARRAYS
var cal_day_of_week = new Array('Ma','Ti','Ke','To','Pe','La','Su');
var cal_month_of_year = new Array('Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu','Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu');

// ORIGINAL DATE
var cal_oMinute = null;
var cal_oHour = null;
var cal_oDate = null;
var cal_oMonth = null;
var cal_oYear = null;

var cal_min = [null, null, null];
var cal_max = [null, null, null];

var cal_initialized = 0;


function cal_getDay(Calendar) {
	tmp = Calendar.getDay();
	return (tmp==0)?6:tmp-1;
}

function cal_onblur(el) {
	function leap(y) {
		if (y%100 == 0) {
			if (y%400 == 0) { return true; }
		}
		else if ((y%4) == 0) { return true; }
		return false;
	}
	function swap(a, f, l) { var t=a[f]; a[f]=a[l]; a[l]=t; }

	if (el.formatted) { el.formatted = false; /*return;*/ }

	var value = el.value;
	if (value=="") return;
	var separators = value.replace(/1|2|3|4|5|6|7|8|9|0/g, "");	
	var numbers = new Array();
	var date = new Date();
	var days = new Array(31,(leap(date.getYear())?29:28),31,30,31,30,31,31,30,31,30,31);
	
	var prev = -1;
	var index=-1, tmp;
	for (var i=0; i<separators.length; i++) {
		index = value.indexOf(separators.charAt(i),index+1);
		if (index-prev > 1) {
			tmp = value.substring(prev+1, index);
			eval("numbers.push("+tmp+");");
		}
		prev = index;
	}
	if (value.length-prev > 1) {
		tmp = value.substring(prev+1, value.length);
		eval("numbers.push("+tmp+");");
	}

	var c = numbers.length;
	while (numbers.length < 3) numbers.push(0);
	switch (c) {
		case 1:
		if (numbers[0]>days[date.getMonth()]) swap(numbers,0,2);
		break;

		case 2:
		if (numbers[1]>12 && numbers[0]<=12) swap(numbers,0,1);
		if (numbers[1]>12) swap(numbers,1,2);
		else if (numbers[0]>days[numbers[1]-1]) swap(numbers,0,2);
		break;
		
		case 3:
		if (numbers[0]>31) swap(numbers,0,2);
		if (numbers[1]>12 && numbers[0]<=12) swap(numbers,0,1);
		if (numbers[1]>12 && numbers[2]<=12) swap(numbers,1,2);
		else if (numbers[0]>days[numbers[1]-1] && numbers[2]<=days[numbers[1]-1]) swap(numbers,0,2);
		break;

		default: break;
	}
	if (numbers[2]<=0) numbers[2]=date.getFullYear();
	else { if (numbers[2]<=50) numbers[2]+=2000; else if (numbers[2]<100) numbers[2]+=1900; }
	if (numbers[1]<=0) numbers[1]=date.getMonth()+1;
	else if (numbers[1]>12) numbers[1]=12;
	if (numbers[0]<=0) numbers[0]=date.getDate();
	else if (numbers[0]>days[numbers[1]-1]) numbers[0]=days[numbers[1]-1];
	
	el.value = cal_formatDate(el.id, numbers[0], numbers[1], numbers[2]);
	cal_update_date_limits(el);	
	if (ltMin(numbers[2], numbers[1], numbers[0])==1 || mtMax(numbers[2], numbers[1], numbers[0])==1)
	{
		alert("Päiväys ei suositelluissa rajoissa "+
			cal_formatDate(el.id, cal_min[2], cal_min[1], cal_min[0])+
			" - "+
			cal_formatDate(el.id, cal_max[2], cal_max[1], cal_max[0])
			);
	}
	if (el.onchange) el.onchange();
}

function ltMin() {
	// arguments: year, month, day
	for (var i=0; i < arguments.length; i++)
	{
		if (cal_min[i] != null)
		{
			if (arguments[i] < cal_min[i]) return 1;
			if (arguments[i] > cal_min[i]) return -1;
		}
	}
	return 0;
}

function mtMax() {
	// arguments: year, month, day
	for (var i=0; i < arguments.length; i++)
	{
		if (cal_max[i] != null)
		{
			if (arguments[i] > cal_max[i]) return 1;
			if (arguments[i] < cal_max[i]) return -1;
		}
	}
	return 0;
}

function cal_writeCalendar(p_date,p_month,p_year) {

	//  DECLARE AND INITIALIZE VARIABLES
	var Calendar = new Date();

	if (cal_oHour == null) var hour = Calendar.getHours(); else hour = cal_oHour;
	if (cal_oMinute == null) var minute = Math.floor(Calendar.getMinutes()/5)*5; else minute = cal_oMinute;

	var date = p_date;
	var year = p_year;
	var month = p_month - 1;

	if (month<0) { month = 11; year--; }
	else if (month>11) { month = 0; year++; }

	if (ltMin(year, month+1)>0) { year = cal_min[0]; month = cal_min[1]-1; }
	else if (mtMax(year, month+1)>0) { year = cal_max[0]; month = cal_max[1]-1; }
	Calendar.setMonth(month);
	Calendar.setYear(year);

	var DAYS_OF_WEEK = 7;    // "constant" for number of days in a week

	var DAYS_OF_MONTH = 1;
	Calendar.setDate(2);
	while (Calendar.getDate() > DAYS_OF_MONTH) {
		Calendar.setDate(Calendar.getDate()+1);
		DAYS_OF_MONTH++;
	}

	var date = (date<1)?1:((date>DAYS_OF_MONTH)?DAYS_OF_MONTH:date);    // Returns day (1-31)

	var cal;    // Used for printing

	Calendar.setDate(1);    // Start the calendar day at '1'
	Calendar.setMonth(month);    // Set the calendar month
	Calendar.setYear(year);
	//var weekday = getDay(Calendar);    // Returns day (0-6)

	/* VARIABLES FOR FORMATTING
	NOTE: You can format the 'BORDER', 'BGCOLOR', 'CELLPADDING', 'BORDERCOLOR'
		  tags to customize your caledanr's look. */

	var TR_start = '<tr>';
	var TR_end = '</tr>';
	//var highlight_start = '<table cellspacing="0" cellpadding="0" border="1" bgcolor="#ffffff" bordercolor="#800000"><tr><td width="20" align="center" valign="middle"><strong>';
	//var highlight_end   = '</strong></td></tr></table>';
	var TD_start = '<td width="30" align="center" valign="middle" nowrap="nowrap">';
	var TD_end = '</td>';

	/* BEGIN CODE FOR CALENDAR
	NOTE: You can format the 'BORDER', 'BGCOLOR', 'CELLPADDING', 'BORDERCOLOR'
	tags to customize your calendar's look.*/

	var cal = '';
	cal += '<table border="0" cellpadding="0" cellspacing="0" width="100%" style="background-color:#ccd0d9;border-bottom:1px solid #abb2c0;"><tr>';
	cal += '<td width="25" align="left" valign="middle" style="padding:1px 0px 1px 0px;">';
	if (ltMin(year, month+1)<1) cal += '<a href="javascript:cal_change_calendar('+date+','+month+','+year+');" style="text-decoration:none;color:#000000;">&nbsp;&laquo;&nbsp;</a>';
	else cal += '&nbsp;&nbsp;&nbsp;';
	cal += '</td>';
	cal += '<td align="center" valign="middle" style="padding:1px 0px 1px 0px;">';
	cal += '<strong>' + cal_month_of_year[month]  + '   ' + year + '</strong>';
	cal += '</td>';
	cal += '<td width="25" align="right" valign="middle" style="padding:1px 0px 1px 0px;">';
	if (mtMax(year, month+1)<1) cal += '<a href="javascript:cal_change_calendar('+date+','+(month+2)+','+year+');" style="text-decoration:none;color:#000000;">&nbsp;&raquo;&nbsp;</a>';
	else cal += '&nbsp;&nbsp;&nbsp;';
	cal += '</td>';
	cal += '</tr></table>';
	cal += '<table border="0" cellpadding="0" cellspacing="0">';
	cal += TR_start;

	// LOOPS FOR EACH DAY OF WEEK
	for(index=0; index < DAYS_OF_WEEK; index++)
	{
		cal += '<td width="30" align="center" valign="middle" style="border-bottom:1px solid #abb2c0; padding:1px 0px 1px 0px;">';
		cal += cal_day_of_week[index]; // PRINTS DAY
		cal += TD_end;
	}

	cal += TR_end;
	if (cal_getDay(Calendar) != 0) cal += TR_start;

	// FILL IN BLANK GAPS UNTIL TODAY'S DAY
	for(index=0; index < cal_getDay(Calendar); index++)
	{
		cal += TD_start + '&nbsp;' + TD_end;
	}

	// LOOPS FOR EACH DAY IN CALENDAR
	for(index=0; index < DAYS_OF_MONTH; index++)
	{
		if( Calendar.getDate() > index )
		{
			// RETURNS THE NEXT DAY TO PRINT
			week_day = cal_getDay(Calendar);

			// START NEW ROW FOR FIRST DAY OF WEEK
			if(week_day == 0) {
				cal += TR_start;
			}

			if(week_day != DAYS_OF_WEEK)
			{
				var day  = Calendar.getDate(); // SET VARIABLE INSIDE LOOP FOR INCREMENTING PURPOSES
				var allowed = (ltMin(year, month+1, day)<1 && mtMax(year, month+1, day)<1);

				cal += '<td width="30" align="center" valign="middle" nowrap="nowrap" class="cal-date">';

				if (allowed) cal += '<a href="javascript:cal_selectDate('+day+','+(month+1)+','+year+');"'; else cal += '<span style="color:#cccccc;"';
				if ( (day==cal_oDate) && (month+1==cal_oMonth) && (year==cal_oYear) )
					cal += ' style="background-color: #3C5588; color: #ffffff;"';
				cal += '>';
				cal += day; // PRINTS DAY
				if (allowed) cal += '</a>'; else  cal += '</span>';
				cal += TD_end;
			}

			// END ROW FOR LAST DAY OF WEEK
			if(week_day == DAYS_OF_WEEK)
			{
				cal += '<td></td>';
				cal += TR_end;
			}
		}

		// INCREMENTS UNTIL END OF THE MONTH
		Calendar.setDate(Calendar.getDate()+1);

	}// end for loop

	cal += '</td>';

	if (show_hours || show_minutes) {
		cal += '</tr><tr><td colspan="7" align="center" valign="middle" style="border-top:1px solid #abb2c0; padding:1px 0px 1px 0px;">';
		cal += '<table border="0" cellpadding="0" cellspacing="0"><tr>';
		cal += '<td>Time&nbsp;</td>';
		if (show_hours) {
			cal += '<td><select id="cal_hours" name="cal_hours">';
			for (var i=0; i<24; i++) cal += '<option value="'+i+'"'+(i==hour?' selected':'')+'>'+(i<10?"0"+i:i);
			cal += '</select></td>';
			if (show_minutes) cal += "<td>:</td>";
		}
		if (show_minutes) {
			cal += '<td><select id="cal_minutes" name="cal_minutes">';
			for (var i=0; i<60; i+=5) cal += '<option value="'+i+'"'+(i==minute?' selected':'')+'>'+(i<10?"0"+i:i);
			cal += '</select></td>';
		}
		cal += '</tr></table>';
		cal += '</td>';
	}
	
	cal += '</tr></table>';
	cal += '<table border="0" cellpadding="0" cellspacing="0" width="100%" style="background-color:#ccd0d9;border-bottom:1px solid #abb2c0;margin-top:3px;"><tr>';
	cal += '<td align="left" valign="bottom" style="padding:0px 0px 2px 0px;">&nbsp;<a href="javascript:cal_selectDate();" style="font-size:11px;text-decoration:none;color:#000000;">Tyhjennä</a></td>';
	cal += '<td align="right" valign="bottom" style="padding:0px 0px 2px 0px;"><a href="javascript:cal_closeCalendar();" style="font-size:11px;text-decoration:none;color:#000000;">Sulje</a>&nbsp;</td>';
	cal += '</tr></table>';

	return cal;
}

function cal_closeCalendar() {
	if (document.getElementById) obj = document.getElementById(cal_id_calendar);
	else if (document.all) obj = document.all(cal_id_calendar);
	obj.style.visibility = "hidden";
	obj.style.display = "none";
	cal_activeCalendar = null;
	try {ch_toggle_dropdown_hack(false);} catch (e) {}
}

function cal_selectDate(day, month, year) {
/*
	if (ltMin(year, month+1, day)!=-1 || mtMax(year, month+1, day)!=-1)
	{
		alert("Päiväys ei suositelluissa rajoissa "+
			cal_formatDate(el.id, cal_min[2], cal_min[1], cal_min[0])+
			" - "+
			cal_formatDate(el.id, cal_max[2], cal_max[1], cal_max[0])
			);
	}
*/
	if (month) cal_activeCalendar.value = cal_formatDate(cal_activeCalendar.id, day, month, year);
	else cal_activeCalendar.value = "";
	cal_activeCalendar.formatted = true;
	if (cal_activeCalendar.onchange) cal_activeCalendar.onchange();
	cal_closeCalendar();
}

function cal_change_calendar(date, month, year)
{
	if (document.getElementById) obj = document.getElementById(cal_id_content);
	else if (document.all) obj = document.all(cal_id_content);
	else return;

	obj.innerHTML = cal_writeCalendar(date,month,year);
}

function cal_parseDate(el) {
	/*
	JOS HALUAA ETTÄ ENNEN ENSIMMÄISTÄ PÄIVÄYSTIETOA (YYYY, YY, MM, M, DD, D) VOI OLLA MERKKEJÄ, ON KYSEISET MERKIT POISTETTAVA TÄSSÄ VÄLISSÄ
	*/
	if (el.id.toLowerCase().indexOf("h") >= 0) show_hours = true;
	if (el.id.toLowerCase().indexOf("i") >= 0) show_minutes = true;
	var s = el.id.toLowerCase().replace(/y|m|d|h|i/g, '');
	var s2 = el.id.toLowerCase();
	var v = el.value;
	var b, t, t2;
	for (var i=0; i<s.length; i++) {
		if (v.length <= 0) break;
		b = v.indexOf(s.charAt(i));
		if (b<0) break;
		t = v.substring(0, b);
		v = v.substring(b+1, v.length);

		b = s2.indexOf(s.charAt(i));
		t2 = s2.substring(0, b);
		s2 = s2.substring(b+1, s2.length);

		t = t.replace(/^0/, '');
		switch (t2) {
			case "yyyy": cal_oYear = parseInt(t); break;
			case "yy": cal_oYear = (parseInt(t) < 50)?2000+parseInt(t):1900+parseInt(t); break;
			case "mm": ;
			case "m": cal_oMonth = parseInt(t); break;
			case "dd": ;
			case "d": cal_oDate = parseInt(t); break;
			case "hh": ;
			case "h": cal_oHour = parseInt(t); break;
			case "ii": ;
			case "i": cal_oMinute = parseInt(t); break;
		}
	}

	if (v.length > 0) {
		switch (s2) {
			case "yyyy": cal_oYear = parseInt(v); break;
			case "yy": cal_oYear = (parseInt(v) < 50)?2000+parseInt(v):1900+parseInt(v); break;
			case "mm": ;
			case "m": cal_oMonth = parseInt(v); break;
			case "dd":
			case "d": cal_oDate = parseInt(v); break;
			case "hh": ;
			case "h": cal_oHour = parseInt(v); break;
			case "ii": ;
			case "i": cal_oMinute = parseInt(v); break;
		}
	}
}

function cal_formatDate(v, date, month, year) {
//	var v = cal_activeCalendar.id;
	v = v.toLowerCase();
	v = v.replace(/yyyy/g, year.toString());
	v = v.replace(/yy/g, year.toString().substring(2,3));
	v = v.replace(/mm/g, (month.toString().length==1)?"0"+month:month);
	v = v.replace(/m/g, month);
	v = v.replace(/dd/g, (date.toString().length==1)?"0"+date:date);
	v = v.replace(/d/g, date);
	
	var el = document.getElementById("cal_hours");
	if (el) var hours = el.options[el.selectedIndex].value+""; else var hours = "0";
	v = v.replace(/hh/g, (hours.toString().length==1)?"0"+hours:hours);
	v = v.replace(/h/g, hours);
	el = document.getElementById("cal_minutes");
	if (el) var minutes = el.options[el.selectedIndex].value+""; else var minutes = "0";
	v = v.replace(/ii/g, (minutes.toString().length==1)?"0"+minutes:minutes);
	v = v.replace(/i/g, minutes);
	v = v.replace(/ss/g, "00");
	v = v.replace(/s/g, "0");
	return v;
}

function cal_update_date_limits(el)
{
	cal_min = [null, null, null];
	cal_max = [null, null, null];
	if (el.getAttribute) {
		var tmp = el.getAttribute("mindate");
		if (tmp != null && tmp != "") {
			if (tmp.charAt(0) == "+" || tmp.charAt(0) == "-") { var d = new Date(); d.setTime(d.getTime()+(parseInt(tmp)*86400000)); cal_min[0]=d.getFullYear(); cal_min[1]=d.getMonth()+1; cal_min[2]=d.getDate(); }
			else { tmp = tmp.split("-"); for (var j=0; j in tmp; j++) cal_min[j] = parseInt(tmp[j]); }
		}
		tmp = el.getAttribute("maxdate");
		if (tmp != null && tmp != "") {
			if (tmp.charAt(0) == "+" || tmp.charAt(0) == "-") { var d = new Date(); d.setTime(d.getTime()+(parseInt(tmp)*86400000)); cal_max[0]=d.getFullYear(); cal_max[1]=d.getMonth()+1; cal_max[2]=d.getDate(); }
			else { tmp = tmp.split("-"); for (var j=0; j in tmp; j++) cal_max[j] = parseInt(tmp[j]); }
		}
	}
}

function cal_show_calendar(e, el) {
	var tmp = new Date();

	try {ch_toggle_dropdown_hack(true);} catch (e) {}

	cal_parseDate(el);

	if (cal_oDate>31 || cal_oDate<1) cal_oDate = tmp.getDate();
	if (cal_oMonth>12 || cal_oMonth<1) cal_oMonth = tmp.getMonth()+1;
	if (cal_oYear>3000 || cal_oYear<1) cal_oYear = tmp.getFullYear();

	cal_activeCalendar = el;
	cal_update_date_limits(el);	
			
	cal_change_calendar(cal_oDate,cal_oMonth,cal_oYear);

	cal_openRelDialog(el, cal_id_calendar);
}

function cal_getElement(elName) {
	var el = document.getElementsByName(elName);
	for (var i=0; i<el.length; i++) {
		if ((el[i].className == "cal-datefield")&&(el[i].nodeName == "INPUT")) {
			return el[i];
		}
	}
	return null;
}

function cal_init(refresh) {
	if ((!refresh||(typeof(refresh)=='object')) && cal_onload) cal_onload();
	if (document.getElementById) { } else return;
	var nocalendars = true;
	var img;
	var el = document.getElementsByTagName("INPUT");
	for (var i=0; i<el.length; i++) {
		if (el[i].className == "cal-datefield") {
/*
	POISTA TÄMÄ KOMMENTOINTI JOS HALUAT ETTÖ TEKSTIKENTÄN KLIKKAAMINEN AVAA KALENTERIN
			el[i].onfocus = function () { this.blur(); };
			el[i].onclick = function (event) { cal_show_calendar(event, this); };
*/
			el[i].onblur = function () { cal_onblur(this); }
			el[i].style.cursor = 'text';
//			cal_parseDate(el[i]);
//			el[i].value = cal_formatDate(el[i].id, cal_oDate, cal_oMonth, cal_oYear);

			cal_min = [null, null, null];
			cal_max = [null, null, null];
			if (el[i].getAttribute) {
				var tmp = el[i].getAttribute("mindate");
				if (tmp != null && tmp != "") {
					if (tmp.charAt(0) == "+" || tmp.charAt(0) == "-") { var d = new Date(); d.setTime(d.getTime()+(parseInt(tmp)*86400000)); cal_min[0]=d.getFullYear(); cal_min[1]=d.getMonth()+1; cal_min[2]=d.getDate(); }
					else { tmp = tmp.split("-"); for (var j=0; j in tmp; j++) cal_min[j] = parseInt(tmp[j]); }
				}
				tmp = el[i].getAttribute("maxdate");
				if (tmp != null && tmp != "") {
					if (tmp.charAt(0) == "+" || tmp.charAt(0) == "-") { var d = new Date(); d.setTime(d.getTime()+(parseInt(tmp)*86400000)); cal_max[0]=d.getFullYear(); cal_max[1]=d.getMonth()+1; cal_max[2]=d.getDate(); }
					else { tmp = tmp.split("-"); for (var j=0; j in tmp; j++) cal_max[j] = parseInt(tmp[j]); }
				}
			}
			
			img = document.createElement("IMG");
			img.src = cal_buttonPath + "b_cal_calendar.gif";
			img.style.cursor = "pointer";
			img.alt = "asdasd";
			eval ('img.onclick = function (event) { cal_show_calendar(event, cal_getElement("'+el[i].name+'")); };');
			el[i].parentNode.insertBefore(img, el[i].nextSibling);
			nocalendars = false;
		}
	}
	if (nocalendars) return;

	//if (cal_initialized) return;
	//cal_initialized++;

	var div = document.createElement("DIV");
	div.id = cal_id_calendar;
	div.className = "cal-dialog";
	div.style.display = "none";
	var html =
		'<table border="0" cellpadding="0" cellspacing="0" class="cal-dialog-bg">' +
		'<tr class="cal-dialog-head">' +
		'<th style="text-align:left;padding-right:20px;" id="head">Valitse päivä</th>' +
		'<th style="text-align:right;"><img src="'+cal_buttonPath+'b_cal_close.gif" alt="" width="14" height="13" border="0" class="cal-button" onmouseover="this.className=\'cal-button-hover\';" onmouseout="this.className=\'cal-button\';" onmousedown="this.className=\'cal-button-down\';" onmouseup="this.className=\'cal-button-hover\';" onclick="var cal_id_calendar=\''+cal_id_calendar+'\';cal_closeCalendar();;"></th>' +
		'</tr>' +
		'<tr>' +
		'<td colspan="2" class="cal-dialog-content"><div id="'+cal_id_content+'"></div></td>' +
		'</tr>' +
		'</table>';
	if (document.createRange) {
		var r = document.createRange();
		r.selectNode(document.body);
		var f = r.createContextualFragment(html);
		div.appendChild(f);
	} else div.innerHTML = html;
	document.body.appendChild(div);
}

if (window.onload) var cal_onload = window.onload;
window.onload = cal_init;











/******************************************************************************
*
* Positioning code
*
******************************************************************************/

function cal_openRelDialog(el, id)
{
	var x = 100, y = 100;

	x = pos_getAbsX(el);
	if ((x != 0) && (x != null)) { y = pos_getAbsY(el) + (el.style.pixelHeight>el.offsetHeight?el.style.pixelHeight:el.offsetHeight); }
	else { x = 100; y = 100; }

	var dl = document.getElementById(id);
	dl.style.display = "block";
	dl.style.left = x+"px";
	dl.style.top = y+"px";
	dl.style.visibility = "visible";
}

