//Javascript name: My Date Time Picker
//Date created: 16-Nov-2003 23:19
//Scripter: TengYong Ng
//Website: http://www.rainforestnet.com
//Copyright (c) 2003 TengYong Ng
//FileName: DateTimePicker.js
//Version: 0.8
//Contact: contact@rainforestnet.com
// Note: Permission given to use this script in ANY kind of applications if
//       header lines are left unchanged.


///////////////////////////////////////////////////////////////////////////
//
//  Customised by Netdesign.nl
//  New Media Solutions
//  - no poup anymaore, but in div
//  - multiple calendars per page possible
//
///////////////////////////////////////////////////////////////////////////


//Global variables
var dtToday = new Date();
var Cal;
var MonthName = ["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"];
var WeekDayName = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];	
var exDateTime; //Existing Date and Time
var destroyTimeoutId;

//Configurable parameters
var WeekChar = 3; //number of character for week day. if 2 then Mo,Tu,We. if 3 then Mon,Tue,Wed.
var CellWidth = 22; //Width of day cell.
var DateSeparator = "-"; //Date Separator, you can change it to "/" if you want.
var TimeMode = 24; //default TimeMode value. 12 or 24
var ShowLongMonth = true; //Show long month name in Calendar header. example: "January".
var ShowMonthYear = true; //Show Month and Year in Calendar header.

// ND
var ShowMonthYearBtns = true; 
var ShowForm = false;
var SwithchMonthImgForw = "/images/buttons/search_arrow.gif";
var SwithchMonthImgBack = "/images/buttons/search_arrow_back.gif";

var TableBorderColor = "#003366"; 
var MonthYearColor = "#003366"; //Font Color of Month and Year in Calendar header.
var WeekHeadColor = "#003366"; //Background Color in Week header.
var SundayColor = "#CBD8E7"; //Background color of Sunday.
var SaturdayColor = "#CBD8E7"; //Background color of Saturday.
var WeekDayColor = "#EEF3F8"; //Background color of weekdays.
var FontColor = "#003366"; //color of font in Calendar day cell.
var TodayColor = "#7F9DB9"; //Background color of today.
var SelDateColor = "#003366"; //Backgrond color of selected date in textbox.
var SelDateTextColor = "#FFFFFF";
var YrSelColor = "#003366"; //color of font of Year selector.
var ThemeBg = "#FFFFFF"; //Background of Calendar window.

//end Configurable parameters
//end Global variables

function hideDatePicker(time) {
	clearInterval(destroyTimeoutId);
	destroyTimeoutId = setTimeout("destroyDatePicker()", time);
}

function destroyDatePicker() {
	if (Cal && Cal.Ctrl && document.getElementById(Cal.Ctrl)) {
		document.getElementById(Cal.Ctrl).innerHTML = "";
	}
}

function keepDatePicker() {
	clearInterval(destroyTimeoutId);
}

function NewCal (pCtrl, pFormat, pShowTime, pTimeMode, pAlign, pGoal) {
	clearInterval(destroyTimeoutId);
	Cal = new Calendar(dtToday);
	if (pShowTime != null && pShowTime) {
		Cal.ShowTime = true;
		if (pTimeMode != null && (pTimeMode == '12' || pTimeMode == '24'))	{
			TimeMode = pTimeMode;
		}		
	}	
	if (pCtrl != null) Cal.Ctrl = pCtrl;
	if (pFormat != null) Cal.Format = pFormat.toUpperCase();
	if (pAlign != null) Cal.Align = pAlign;
	if (pGoal != null) {
		Cal.Goal = pGoal;
		exDateTime = document.getElementById(pGoal).value;
		if (exDateTime != null && exDateTime != "") { //Parse Date String
			var Sp1;//Index of Date Separator 1
			var Sp2;//Index of Date Separator 2 
			var tSp1;//Index of Time Separator 1
			var tSp1;//Index of Time Separator 2
			var strMonth;
			var strDate;
			var strYear;
			var intMonth;
			var YearPattern;
			var strHour;
			var strMinute;
			var strSecond;
			
			// parse month
			Sp1 = exDateTime.indexOf(DateSeparator, 0)
			Sp2 = exDateTime.indexOf(DateSeparator, parseInt(Sp1) + 1);
			
			if (Cal.Format.toUpperCase() == "DDMMYYYY" || Cal.Format.toUpperCase() == "DDMMMYYYY") {
				strMonth = exDateTime.substring(Sp1 + 1, Sp2);
				strDate = exDateTime.substring(0, Sp1);
			} else if (Cal.Format.toUpperCase() == "MMDDYYYY" || Cal.Format.toUpperCase() == "MMMDDYYYY") {
				strMonth = exDateTime.substring(0, Sp1);
				strDate = exDateTime.substring(Sp1 + 1, Sp2);
			}
			if (isNaN(strMonth)) {
				intMonth = Cal.GetMonthIndex(strMonth);
			} else {
				intMonth = parseInt(strMonth, 10) - 1;	
			}
			if ( parseInt(intMonth,10) >=0 && parseInt(intMonth, 10) < 12 ) Cal.Month=intMonth;
		
			//parse date
			if ( parseInt(strDate, 10) <= Cal.GetMonDays() && parseInt(strDate,10) >= 1 ) Cal.Date=strDate;

			//parse year
			strYear = exDateTime.substring(Sp2 + 1, Sp2 + 5);
			YearPattern = /^\d{4}$/;
			if (YearPattern.test(strYear)) Cal.Year = parseInt(strYear, 10);
		
			// parse time
			if (Cal.ShowTime == true) {
				tSp1 = exDateTime.indexOf(":", 0);
				tSp2 = exDateTime.indexOf(":", parseInt(tSp1) + 1);
				strHour = exDateTime.substring(tSp1, tSp1 - 2);
				Cal.SetHour(strHour);
				strMinute=exDateTime.substring(tSp1 + 1, tSp2);
				Cal.SetMinute(strMinute);
				strSecond=exDateTime.substring(tSp2 + 1, tSp2 + 3);
				Cal.SetSecond(strSecond);
			}
		}
	}
	
	// ND
	winMain = this;
	RenderCal();
}

function RenderCal () {
	var vCalHeader;
	var vCalData;
	var vCalTime;
	var i;
	var j;
	var SelectStr;
	var vDayCount = 0;
	var vFirstDay;
		
	var strHTML2 = '' +
	'<table id="calHTML" cellspacing="0" style="border: 1px solid ' + TableBorderColor + '; background: ' + ThemeBg + '; font-size: 90%" align="' + Cal.Align + '">\n';
	
	//Calendar header shows Month and Year
	if (ShowMonthYear) {
		strHTML2 += "" +
			"<tr>" +
			"	<td colspan='7' height='20' align='center' valign='middle' style='color: " + MonthYearColor + "; font-weight: bold; font-size: 110%; font-style: normal; padding: 2px;'>" + 
			"	<a href=\"javascript:winMain.Cal.DecMonth();winMain.RenderCal()\">" +
			"		<img src=\"" +SwithchMonthImgBack+ "\" alt=\"<<\" align=\"left\" width=\"16\" height=\"16\" hspace=\"0\" border=\"0\">" +
			"	</a>" +
			"	<a href=\"javascript:winMain.Cal.IncMonth();winMain.RenderCal()\">" +
			"		<img src=\"" +SwithchMonthImgForw+ "\" alt=\">>\" align=\"right\" width=\"16\" height=\"16\" hspace=\"0\" border=\"0\">" +
			"	</a>" + Cal.GetMonthName(ShowLongMonth) + " " + Cal.Year + 
			"	</td>" +
			"</tr>\n";
	}
	//Week day header
	vCalHeader += "<tr bgcolor=" + WeekHeadColor + ">";
	for (i = 0; i < 7; i++) {
		strHTML2 += "<td align='center' style='padding: 2px 0px 2px 0px'>"+WeekDayName[i].substr(0, WeekChar)+"</td>\n";
	}
	strHTML2 += "</tr>\n";
		
	//Calendar detail
	CalDate = new Date(Cal.Year, Cal.Month);
	CalDate.setDate(1);
	vFirstDay = CalDate.getDay();
	strHTML2 += '<tr class="dayRow">';
	
	for (i = 0; i < vFirstDay; i++) {
		strHTML2 += '<td></td>';
		vDayCount++;
	}
	
	for (j = 1; j <= Cal.GetMonDays(); j++) {
		var strCell;
		vDayCount = vDayCount + 1;
		if (j == dtToday.getDate() && Cal.Month == dtToday.getMonth() && Cal.Year == dtToday.getFullYear()) {
			strCell = GenCell(j, true, TodayColor);//Highlight today's date
		} else {
			if (j == Cal.Date) {
				strCell=GenCell(j, true, SelDateColor, SelDateTextColor);
			} else {	 
				if (vDayCount % 7 == 0) {
					strCell = GenCell(j, false, SaturdayColor);
				} else if ((vDayCount + 6 ) % 7 == 0) {
					strCell=GenCell(j, false, SundayColor);
				} else {
					strCell=GenCell(j, null, WeekDayColor);
				}
			}		
		}						
		vCalData = vCalData+strCell;
		strHTML2 += strCell;
		
		if (vDayCount % 7 == 0 && j < Cal.GetMonDays()) {
			strHTML2 += '</tr>\n<tr class="dayRow">';
		}
	}
	
	document.getElementById(Cal.Ctrl).innerHTML = strHTML2;
	
	// Time picker
	// not altered by ND (not used), if want to use: alter vCalTime in strHTML2
	if (Cal.ShowTime) {
		var showHour;
		showHour = Cal.getShowHour();		
		vCalTime = "<tr>\n<td colspan='7' align='center'>";
		vCalTime += "<input type='text' name='hour' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+showHour+" onchange=\"javascript:winMain.Cal.SetHour(this.value)\">";
		vCalTime += " : ";
		vCalTime += "<input type='text' name='minute' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+Cal.Minutes+" onchange=\"javascript:winMain.Cal.SetMinute(this.value)\">";
		vCalTime += " : ";
		vCalTime += "<input type='text' name='second' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+Cal.Seconds+" onchange=\"javascript:winMain.Cal.SetSecond(this.value)\">";
		if (TimeMode == 12) {
			var SelectAm = (parseInt(Cal.Hours,10) < 12) ? "Selected" : "";
			var SelectPm = (parseInt(Cal.Hours,10) >= 12) ? "Selected" : "";

			vCalTime += "<select name=\"ampm\" onchange=\"javascript:winMain.Cal.SetAmPm(this.options[this.selectedIndex].value);\">";
			vCalTime += "<option "+SelectAm+" value=\"AM\">AM</option>";
			vCalTime += "<option "+SelectPm+" value=\"PM\">PM<option>";
			vCalTime += "</select>";
		}	
		vCalTime += "\n</td>\n</tr>";
	}	
	//end time picker
}


function setFormValue(value) {
	document.getElementById(Cal.Goal).value = value;
	document.getElementById(Cal.Ctrl).innerHTML = "";
}

//Generate table cell with value
function GenCell (pValue, pHighLight, pColor, pTextColor) {
	var PValue;
	var PCellStr;
	var vColor;
	var vHLstr1;//HighLight string
	var vHlstr2;
	var vTimeStr;
	
	(pValue == null) ? PValue = "" : PValue = pValue;
 	(pColor != null) ? vColor = "bgcolor=\"" + pColor + "\"" : vColor = "";	
	(pTextColor != null) ? tColor = " style=\"color:" + pTextColor + "\"; " : tColor = "";	
	
	if (pHighLight != null && pHighLight) {
		vHLstr1 = "color='red'>"; 
		vHLstr2 = "";
	} else {
		vHLstr1 = ">";
		vHLstr2 = "";	
	}
	
	if (Cal.ShowTime) {
		vTimeStr = "winMain.document.getElementById('" + Cal.Ctrl + "').value+=' '+"+"winMain.Cal.getShowHour()"+"+':'+"+"winMain.Cal.Minutes"+"+':'+"+"winMain.Cal.Seconds";
		if (TimeMode == 12) vTimeStr += "+' '+winMain.Cal.AMorPM";
	} else {
		vTimeStr = "";		
	}
	
	PCellStr="<td " + vColor + " width=" + CellWidth + " align='center'>" +
		"<span " + vHLstr1 + "<a " + tColor + " href=\"javascript:setFormValue('" + Cal.FormatDate(PValue) + "');\">" + 
		PValue + "</a>" + 
		vHLstr2 + "</span>" +
		"</td>\n";
	return PCellStr;
}

function Calendar(pDate, pCtrl) {
	//Properties
	this.Date = pDate.getDate();//selected date
	this.Month = pDate.getMonth();//selected month number
	this.Year = pDate.getFullYear();//selected year in 4 digits
	this.Hours = pDate.getHours();	
	
	if (pDate.getMinutes() < 10) {
		this.Minutes = "0" + pDate.getMinutes();
	} else {
		this.Minutes = pDate.getMinutes();
	}
	
	if (pDate.getSeconds() < 10) {
		this.Seconds = "0" + pDate.getSeconds();
	} else {		
		this.Seconds = pDate.getSeconds();
	}
	
	this.Ctrl = pCtrl;
	this.Format = "ddMMyyyy";
	this.Separator = DateSeparator;
	this.ShowTime = false;
	(pDate.getHours() < 12) ? this.AMorPM = "AM" : this.AMorPM="PM";	
}

function GetMonthIndex(shortMonthName) {
	for (i = 0; i < 12; i++) {
		if (MonthName[i].substring(0, 3).toUpperCase() == shortMonthName.toUpperCase()) {	
			return i;
		}
	}
}
Calendar.prototype.GetMonthIndex=GetMonthIndex;

function IncYear() {	
	Cal.Year++;
}
Calendar.prototype.IncYear = IncYear;

function DecYear() {
	Cal.Year--;
}
Calendar.prototype.DecYear = DecYear;

function IncMonth() {
	Cal.Month++;
	if (Cal.Month > 11) {
		Cal.Month = 0;
		Cal.IncYear();
	}
}
Calendar.prototype.IncMonth = IncMonth;

function DecMonth() {
	Cal.Month--;
	if (Cal.Month < 0) {
		Cal.Month = 11;
		Cal.DecYear();
	}
}
Calendar.prototype.DecMonth = DecMonth;
	
function SwitchMth(intMth) {	
	Cal.Month = intMth;
}
Calendar.prototype.SwitchMth=SwitchMth;

function SetHour(intHour) {	
	var MaxHour;
	var MinHour;
	if (TimeMode == 24) {	
		MaxHour = 23;
		MinHour = 0;
	} else if (TimeMode==12) {
		MaxHour = 12;
		MinHour = 1;
	} else {
		alert("TimeMode can only be 12 or 24");		
	}
	var HourExp = new RegExp("^\\d\\d$");
	if (HourExp.test(intHour) && parseInt(intHour, 10) <= MaxHour && parseInt(intHour,10)>=MinHour) {
		if (TimeMode == 12 && Cal.AMorPM == "PM") {
			if (parseInt(intHour, 10) == 12) {
				Cal.Hours = 12;
			} else {	
				Cal.Hours = parseInt(intHour,10) + 12;
			}
		} else if (TimeMode == 12 && Cal.AMorPM == "AM") {
			if (intHour == 12) intHour -= 12;
			Cal.Hours = parseInt(intHour, 10);
		} else if (TimeMode == 24) {
			Cal.Hours = parseInt(intHour, 10);	
		}
	}
}
Calendar.prototype.SetHour=SetHour;

function SetMinute(intMin) {
	var MinExp = new RegExp("^\\d\\d$");
	if (MinExp.test(intMin) && intMin < 60) {
		Cal.Minutes = intMin;
	}
}
Calendar.prototype.SetMinute=SetMinute;

function SetSecond(intSec) {	
	var SecExp = new RegExp("^\\d\\d$");
	if (SecExp.test(intSec) && intSec < 60) {
		Cal.Seconds = intSec;
	}
}
Calendar.prototype.SetSecond=SetSecond;

function SetAmPm(pvalue) {
	this.AMorPM = pvalue;
	if (pvalue == "PM") {
		this.Hours = parseInt(this.Hours, 10) + 12;
		if (this.Hours == 24) this.Hours = 12;
	} else if (pvalue == "AM") {
		this.Hours -= 12;
	}	
}
Calendar.prototype.SetAmPm = SetAmPm;

function getShowHour() {
	var finalHour;
    if (TimeMode == 12) {
    	if (parseInt(this.Hours, 10) == 0) {
			this.AMorPM = "AM";
			finalHour = parseInt(this.Hours, 10) + 12;	
		} else if (parseInt(this.Hours,10) == 12) {
			this.AMorPM = "PM";
			finalHour = 12;
		} else if (this.Hours > 12) {
			this.AMorPM = "PM";
			if ((this.Hours - 12) < 10) {
				finalHour = "0" + (parseInt(this.Hours,10) - 12);
			} else {
				finalHour = parseInt(this.Hours, 10) - 12;
			}	
		} else {
			this.AMorPM = "AM";
			if (this.Hours < 10) {
				finalHour = "0" + parseInt(this.Hours, 10);
			} else {
				finalHour = this.Hours;	
			}
		}
	} else if (TimeMode == 24) {
		if (this.Hours < 10) {
			finalHour = "0" + parseInt(this.Hours, 10);
		} else {	
			finalHour = this.Hours;
		}
	}	
	return finalHour;	
}				
Calendar.prototype.getShowHour = getShowHour;		

function GetMonthName(IsLong) {
	var Month = MonthName[this.Month];
	if (IsLong) {
		return Month;
	} else { 
		return Month.substr(0,3);
	}
}
Calendar.prototype.GetMonthName = GetMonthName;

function GetMonDays() {
	var DaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	if (this.IsLeapYear()) {
		DaysInMonth[1] = 29;
	}	
	return DaysInMonth[this.Month];	
}
Calendar.prototype.GetMonDays = GetMonDays;

function IsLeapYear() {
	if (this.Year % 4 == 0) {
		if (this.Year % 100 == 0 && this.Year % 400 != 0) {
			return false;
		} else {
			return true;
		}
	} else {
		return false;
	}
}
Calendar.prototype.IsLeapYear=IsLeapYear;

function FormatDate(pDate) {
	if (this.Format.toUpperCase()=="DDMMYYYY") {
		return (pDate + DateSeparator + (this.Month + 1) + DateSeparator + this.Year);
	} else if (this.Format.toUpperCase()=="DDMMMYYYY") {
		return (pDate + DateSeparator + this.GetMonthName(false) + DateSeparator + this.Year);
	} else if (this.Format.toUpperCase()=="MMDDYYYY") {
		return ((this.Month+1) + DateSeparator + pDate + DateSeparator + this.Year);
	} else if (this.Format.toUpperCase()=="MMMDDYYYY") {
		return (this.GetMonthName(false) + DateSeparator + pDate + DateSeparator + this.Year);			
	}
}
Calendar.prototype.FormatDate = FormatDate;	