/* Javascript name: My Date Time Picker 
* Date created: 16-Nov-2003 23:19 
* Scripter: TengYong Ng 
* Copyright (c) 2003 TengYong Ng 
* FileName: DateTimePicker.js 
* Version: 0.8 
* Note: Permission given to use this script in ANY kind of applications if 
*header lines are left unchanged.  
* * Modified by: SirsiDynix, 2004 - 2008 */

var winCal;
var dtToday=new Date();
var Cal;
var docCal;
var MonthName = new Array();
var WeekDayName = new Array();
var exDateTime;/* Existing Date and Time */

/* Configurable parameters */
var cnTop="200";   /* Top coordinate of calendar window. */
var cnLeft="500";  /* Left coordinate of calendar window */
var WindowTitle;
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="/";
var TimeMode=24;   /* Default TimeMode value. 12 or 24 */
var ShowLongMonth=true;/* Show long month name in Calendar header. */
var ShowMonthYear=true;/* Show Month and Year in Calendar header. */
var MonthYearColor;  
var WeekHeadColor;   
var WeekendColor;   
var WeekDayColor; 
var FontColor; 
var SelDateColor;  
var ThemeBg="";/* Background image of Calendar window. */
var noDate;
var specificDate;
var localizedNever;
/* End Configurable parameters */

function setMonth(inMonth,inName)
{
	MonthName[inMonth] = inName;
}

function setWeekDayName(inDay,inName)
{
	WeekDayName[inDay] = inName;
}

function setWindowTitle(inTitle)
{
	WindowTitle = inTitle;
}

function setMonthYearColor(inColor)
{
	MonthYearColor = inColor;
}

function setWeekHeadColor(inColor)
{
	WeekHeadColor = inColor;
}

function setWeekendColor(inColor)
{
	WeekendColor = inColor;
}

function setWeekDayColor(inColor)
{
	WeekDayColor = inColor;
}

function setFontColor(inColor)
{
	FontColor = inColor;
}

function setSelDateColor(inColor)
{
	SelDateColor = inColor;
}

function setNoDate(inNoDate)
{
	noDate = inNoDate;
}

function setSpecificDate(inSpecificDate)
{
	specificDate = inSpecificDate;
}

function NewCal(pCtrl,pFormat,pShowTime,pTimeMode,inLocalizedNever)
{
	if (inLocalizedNever != null)
	  {
	  localizedNever = getLocalizedValue(inLocalizedNever);
	  localizedNever = localizedNever.replace(/'/,"\\'");
	  }

	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();
	
	exDateTime=document.getElementById(pCtrl).value;
	if (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 tSp2;  /* Index of Time Separator 2 */
		var strMonth;
		var strDate;
		var strYear;
		var intMonth;
		var YearPattern;
		var strHour;
		var strMinute;
		/* 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);
		}
		else if ((Cal.Format.toUpperCase()=="YYYYMMDD") || (Cal.Format.toUpperCase()=="YYYYMMMDD"))
		{
			strMonth=exDateTime.substring(Sp1+1,Sp2);
			strDate=exDateTime.substring(Sp2+1);
		}
		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 */
		if ((Cal.Format.toUpperCase()=="YYYYMMDD") || (Cal.Format.toUpperCase()=="YYYYMMMDD"))
			strYear=exDateTime.substring(0,4);
		else
			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);
		}	
	}
	winCal=window.open("","DateTimePicker","toolbar=0,status=0,menubar=0,fullscreen=no,width=220,height=275 ,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('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
	docCal.writeln("<html><head><title>"+WindowTitle+"</title>");
	docCal.writeln("<script type='text/javascript'>winMain=window.opener;</script\>");
  
  docCal.writeln("<style type='text/css'>");
  docCal.writeln("body { font-family:Verdana; font-size:8pt; }");
  docCal.writeln("form { margin:0px; padding:0px; }");
  docCal.writeln("select, textarea { border:1px solid #8FA6FF; padding:2px; margin:0px 4px 0px 0px !important; }");
  docCal.writeln("select:focus, textarea:focus { background-color:#eaffe8; }");
  docCal.writeln("a { text-decoration:none; color:#3662E0; }");
  docCal.writeln(".table_container { width:200px; padding:0px; margin:0px; border:0px; text-align:center;}");
  docCal.writeln(".radio_button_container { width:200px; padding:0px; margin:0px;}");
  docCal.writeln(".month_selection_container { width:200px; padding:0px; margin:0px;}");
  docCal.writeln(".header { background-color:#dedede; height:16px; }");
  docCal.writeln(".day { background-color:#ffffff; border:1px solid #dedede; text-align:center; width:20px; height:24px;}");
  docCal.writeln(".selected_day { background-color:#CFEEFF; border:1px solid #3662E0; text-align:center; width:20px; height:20px;}");
  docCal.writeln("td { margin:0px; padding:0px; }");
  docCal.writeln("</style>");

	docCal.writeln("</head><body><form action='' name='Calendar'>");

	vCalHeader="<table class='table_container'>\n";

	if (localizedNever != null)
	  {
	  /* Add radio buttons for select date or no date */
	  vCalHeader+="<tr>\n<td colspan='7'><table class='radio_button_container'><tr><td align='left'> \n";
	  vCalHeader+="<input type='radio' name='datetype' id='selectdate' value='selectdate' checked='checked' />" + specificDate + "<br /> \n";
	  vCalHeader+="<input type='radio' name='datetype' id='selectnodate' value='nodate' onfocus=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"+localizedNever+"';window.close();\" onchange=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"+localizedNever+"';window.close();\"/>" + noDate + "\n";
	  vCalHeader+="</td></tr></table>";	
	  }

	/* Month Selector */
	vCalHeader+="<tr>\n<td colspan='7'><table class='month_selection_container'><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()\"><strong>&lt;</strong></a><strong> "+Cal.Year+" </strong><a href=\"javascript:winMain.Cal.IncYear();winMain.RenderCal()\"><strong>&gt;</strong></a></td></tr></table></td>\n";
	vCalHeader+="</tr>";

	/* Calendar header shows Month and Year */
	if (ShowMonthYear)
		vCalHeader+="<tr><td colspan='7'><strong>"+Cal.GetMonthName(ShowLongMonth)+" "+Cal.Year+"</strong></td></tr>\n";

	/* Week day header */
	vCalHeader+="<tr class='header'>";
	for (i=0;i<7;i++)
	{
		vCalHeader+="<td align='center'>"+WeekDayName[i].substr(0,WeekChar)+"</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,SelDateColor);
		else
		{
			if (j==Cal.Date)
			{
				strCell=GenCell(j,true,SelDateColor);
			}
			else
			{
				if ((vDayCount%7==0) | (vDayCount+6)%7==0)
					strCell=GenCell(j,false,WeekendColor);
				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'>\n<label for='hour'></label>";
		vCalTime+="<input type='text' name='hour' id='hour' maxlength=2 style=\"WIDTH: 22px\" value="+showHour+" onchange=\"javascript:winMain.Cal.SetHour(this.value)\">";
		vCalTime+=" : <label for='minute'></label>";
		vCalTime+="<input type='text' name='minute' id='minute' maxlength=2 style=\"WIDTH: 22px\" value="+Cal.Minutes+" onchange=\"javascript:winMain.Cal.SetMinute(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);
	}

	docCal.writeln("\n</table>");
	docCal.writeln("</form></body></html>");
	docCal.close();
}

/* Generate table cell with value */
function GenCell(pValue,pHighLight,pColor)
{
	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="class='day'";
	else
		vColor="";
	if ((pHighLight!=null)&&(pHighLight))
		{vHLstr1="class='selected_day'";vHLstr2="";}
	else
		{vHLstr1="class='day'";vHLstr2="";}
	
	if (Cal.ShowTime)
	{
		vTimeStr="winMain.document.getElementById('"+Cal.Ctrl+"').value+=''+"+"winMain.Cal.getShowHour()"+"+':'+"+"winMain.Cal.Minutes";
		if (TimeMode==12)
			vTimeStr+="+' '+winMain.Cal.AMorPM";
	}	
	else
		vTimeStr="";
	PCellStr="<td "+vHLstr1+">"+PValue+"</td>";
	PCellStr="<td "+vHLstr1+"><a href=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(PValue)+"';"+vTimeStr+";window.close();\">"+PValue+"</a></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();
	
	this.MyWindow=winCal;
	this.Ctrl=pCtrl;
	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()
{	Cal.Year++;}
Calendar.prototype.IncYear=IncYear;

function DecYear()
{	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 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.ShowTime)
	{
		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()=="YYYYMMDD")
			return (this.Year+DateSeparator+(this.Month+1)+DateSeparator+pDate+",");
		else if (this.Format.toUpperCase()=="MMMDDYYYY")
			return (this.GetMonthName(false)+DateSeparator+pDate+DateSeparator+this.Year);
	}
	else
	{
		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()=="YYYYMMDD")
			return (this.Year+DateSeparator+(this.Month+1)+DateSeparator+pDate);
		else if (this.Format.toUpperCase()=="MMMDDYYYY")
			return (this.GetMonthName(false)+DateSeparator+pDate+DateSeparator+this.Year);
	}
}
Calendar.prototype.FormatDate=FormatDate;	

