//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.
// Modified by David Lovelace to work with day, month, year as separate variables

//Global variables
var winCal;
var dtToday = new Date();
var Cal;
var docCal;
var MonthName = ["January", "February", "March", "April", "May", "June","July",
	"August", "September", "October", "November", "December"];
var WeekDayName = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
var Format = "ddMMyyyy";    //My date format.  DJL
var Ctrl1 = "";    //Name of Day control. DJL
var Ctrl2 = "";    //Name of Month control.  DJL
var Ctrl3 = "";    //Name of Year control.  DJL
var Ctrl4 = "";    //Name of time control.  DJL

//Configurable parameters
var cnTop = "150";  //top coordinate of calendar window.
var cnLeft = "700"; //left coordinate of calendar window
var WindowTitle = "Select Date";    //Date Time Picker title.
var WeekChar = 2;           //number of character for week day. if 2 then Mo,Tu,We. if 3 then Mon,Tue,Wed.
var CellWidth = 20;         //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.
var MonthYearColor = "#cc0033"; //Font Color of Month and Year in Calendar header.
var WeekHeadColor  = "#0099CC"; //Background Color in Week header.
var SundayColor   = "#6699FF";  //Background color of Sunday.
var SaturdayColor = "#CCCCFF";  //Background color of Saturday.
var WeekDayColor  = "white";    //Background color of weekdays.
var FontColor  = "blue";    //color of font in Calendar day cell.
var TodayColor = "#FFFF33"; //Background color of today.
var SelDateColor = "#FFCC99";//Backgrond color of selected date in textbox.
var YrSelColor = "#cc0033"; //color of font of Year selector.
var ThemeBg = "";           //Background image of Calendar window.
//end Configurable parameters
//end Global variable


function NewCal(pDctrl, pMctrl, pYctrl, pTctrl, pTimstr, pShowTime, pTimeMode)
{
	Cal = new Calendar( dtToday );
	if ((pShowTime != null) && (pShowTime))
	{	Cal.ShowTime = true;
		if ((pTimeMode != null) && ((pTimeMode == '12') || (pTimeMode == '24')))
		{	TimeMode = pTimeMode;
		}		
	}	
    Cal.Format = Format.toUpperCase();
	
	if ( pDctrl != null && pMctrl != null && pYctrl != null )
	{
		var strDate;
		var strMonth;
		var strYear;
		var strHour;
		var strMinute;
		var strSecond;
        var intMonth;
        var YearPattern;

        Cal.Ctrl = "";  //Set to null.  use global vars below
        Ctrl1 = pDctrl;
        Ctrl2 = pMctrl;
        Ctrl3 = pYctrl;
        Ctrl4 = pTctrl;

        strDate  = document.getElementById(pDctrl).value;
        strMonth = document.getElementById(pMctrl).value;
        strYear  = document.getElementById(pYctrl).value;

        if ( Ctrl1.substring(0,2) == "AR" )
            WindowTitle = "Arrival Date";
        else
            if ( Ctrl1.substring(0,2) == "DP" )
                WindowTitle = "Departure Date";

        //parse Month
		if (isNaN(strMonth))
			intMonth = Cal.GetMonthIndex(strMonth);
		else
			intMonth = parseInt(strMonth, 10);
		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
		YearPattern = /^\d{4}$/;
		if (YearPattern.test(strYear))
			Cal.Year = parseInt(strYear,10);

		//parse time
		if (Cal.ShowTime == true && pTimstr != "")
		{	tSp1 = pTimstr.indexOf(":",0)
			tSp2 = pTimstr.indexOf(":",(parseInt(tSp1)+1));
			strHour = pTimstr.substring(tSp1,(tSp1)-2);
			Cal.SetHour(strHour);
			strMinute = pTimstr.substring(tSp1+1,tSp2);
			Cal.SetMinute(strMinute);
			strSecond = pTimstr.substring(tSp2+1,tSp2+3);
			Cal.SetSecond(strSecond);
		}	
	}
	winCal = window.open("","DatePicker","toolbar=0,status=0,menubar=0,fullscreen=no,width=220,height=245,resizable=0,top="+cnTop+",left="+cnLeft);
	docCal = winCal.document;
	RenderCal();
}


function RenderCal()
{	var vCalHeader;
	var vCalData;
	var vCalTime;
	var i;
	var j;
	var SelectStr;
	var vDayCount = 0;
	var vFirstDay;

	docCal.open();
	docCal.writeln("<html><head><title>"+WindowTitle+"</title>");
	docCal.writeln("<script>var winMain=window.opener;</script>");
	docCal.writeln("</head><body background='"+ThemeBg+"' link="+FontColor+" vlink="+FontColor+"><form name='Calendar'>");

	vCalHeader = "<table border=1 cellpadding=1 cellspacing=1 width='100%' align=\"center\" valign=\"top\">\n";
	//Month Selector
	vCalHeader += "<tr>\n<td colspan='7'><table border=0 width='100%' cellpadding=0 cellspacing=0><tr><td align='left'>\n";
	vCalHeader += "<select name=\"MonthSelector\" onChange=\"javascript:winMain.Cal.SwitchMth(this.selectedIndex);winMain.RenderCal();\">\n";
	for (i=0; i<12; i++)
	{	if (i == Cal.Month)
			SelectStr = "Selected";
		else
			SelectStr = "";
		vCalHeader += "<option "+SelectStr+" value >"+MonthName[i]+"\n";
	}
	vCalHeader += "</select></td>";
	//Year selector
	vCalHeader += "\n<td align='right'><a href=\"javascript:winMain.Cal.DecYear();winMain.RenderCal()\"><b><font color=\""+YrSelColor+"\"><</font></b></a><font face=\"Verdana\" color=\""+YrSelColor+"\" size=2><b> "+Cal.Year+" </b></font><a href=\"javascript:winMain.Cal.IncYear();winMain.RenderCal()\"><b><font color=\""+YrSelColor+"\">></font></b></a></td></tr></table></td>\n";
	vCalHeader += "</tr>";
	//Calendar header shows Month and Year
	if (ShowMonthYear)
		vCalHeader += "<tr><td colspan='7'><font face='Verdana' size='2' align='center' color='"+MonthYearColor+"'><b>"+Cal.GetMonthName(ShowLongMonth)+" "+Cal.Year+"</b></font></td></tr>\n";
	//Week day header
	vCalHeader += "<tr bgcolor="+WeekHeadColor+">";
	for (i = 0; i < 7; i++)
	{	vCalHeader += "<td align='center'><font face='Verdana' size='2'>"+WeekDayName[i].substr(0,WeekChar)+"</font></td>";
	}
	vCalHeader += "</tr>";
	docCal.write(vCalHeader);
	
	//Calendar detail
	CalDate = new Date(Cal.Year, Cal.Month);
	CalDate.setDate(1);
	vFirstDay = CalDate.getDay();
	vCalData = "<tr>";
	for (i = 0; i < vFirstDay; i++)
	{	vCalData = vCalData+GenCell();
		vDayCount = vDayCount+1;
	}
	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);
			}
			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;

		if ((vDayCount%7 == 0) && (j < Cal.GetMonDays()))
		{	vCalData = vCalData+"</tr>\n<tr>";
		}
	}
	docCal.writeln(vCalData);	
	//Time picker
	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>";
		docCal.write(vCalTime);
	}	
	//end time picker
	docCal.writeln("\n</table>");
	docCal.writeln("</form></body></html>");
	docCal.close();
}


function GenCell(pValue,pHighLight,pColor)  //Generate table cell with value
{	var PValue;
	var PCellStr;
	var vColor;
	var vHLstr1;   //HighLight string
	var vHlstr2;
	var vTimeStr;
	
	if (pValue == null)
		PValue = "";
	else
		PValue = pValue;
	
	if (pColor != null)
		vColor = "bgcolor=\""+pColor+"\"";
	else
		vColor = "";
	if ((pHighLight != null) && (pHighLight))
		{vHLstr1 = "color='red'><b>";vHLstr2="</b>";}
	else
		{vHLstr1 = ">";vHLstr2="";}
	
	if (Cal.ShowTime)
	{	vTimeStr = "winMain.document.getElementById('" + Ctrl4 + "').value+=' '+" +
            "winMain.Cal.getShowHour()" + "+':'+" + "winMain.Cal.Minutes" + "+':'+" + "winMain.Cal.Seconds";
		if (TimeMode == 12)
			vTimeStr += "+' '+winMain.Cal.AMorPM";
		vTimeStr += ";";
	}
	else
		vTimeStr = "";

	PCellStr = "<td " + vColor + " width=" + CellWidth + " align='center'><font face='verdana' size='2'" + vHLstr1 +
        "<a href=\"javascript:winMain.document.getElementById('" + Ctrl1 + "').value='" + PValue + "';" +
        "winMain.document.getElementById('" + Ctrl2 + "').value='" + Cal.Month + "';" +
        "winMain.document.getElementById('" + Ctrl3 + "').value='" + Cal.Year + "';" +
        vTimeStr + "window.close();\">" + PValue + "</a>" + vHLstr2 + "</font></td>";
	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.MyWindow = winCal;
	this.Ctrl = "";    //Name of calendar control.  Not used.
	this.Format = "ddMMyyyy";
	this.Separator = DateSeparator;
	this.ShowTime = false;
	if (pDate.getHours() < 12)
		this.AMorPM = "AM";
	else
		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()
{	if ( Cal.Year < dtToday.getFullYear() + 1 )
        Cal.Year++;
}
Calendar.prototype.IncYear = IncYear;


function DecYear()
{	if ( Cal.Year > dtToday.getFullYear() )
        Cal.Year--;
}
Calendar.prototype.DecYear = DecYear;

	
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()   //Get number of days in a month
{	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;
