//Javascript name: My Date Time Picker
//Date created: 16-Nov-2003 23:19
//Scripter: TengYong Ng
//Date updated: 18-Dec-2006 6:20
//Scripter: Bachir El Charif
//FileName: DateTimePicker.js
//Version: 1.0
//Contact: info@pixels-lab.com
//Copyright (c)2006 Pixels-Lab - (c)2003 TengYong Ng
// Note: Permission given to use this script in ANY kind of applications if header lines are left unchanged.

//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 exDateTime;
var cnTop = 200;
var cnLeft = 500;
var cnWidth = 301;
var cnHeight = 210;
var WindowTitle ="Pick a date";
var WeekChar = 3;
var CellWidth = 40;
var CellHeight = 22;
var DateSeparator = "/";
var TimeMode = 12;
var bodyMargin = 0;
var ShowLongMonth = true;
var ShowMonthYear = true;

//Colors
var cnBgColor = "#FFEEBA";//Background Color.
var aColor = "#555555";//Links color.
var ahColor = "#870000";//Hover links color.
var cellRollOverColor = "#FFBE00"//Color of roll over.
var MonthYearColor = "#870000";//Font Color of Month and Year in Calendar header.
var WeekHeadColor = "#FFD761";//Background Color in Week header.
var SundayColor = "#FFD761";//Background color of Sunday.
var SaturdayColor = "#FFDD79";//Background color of Saturday.
var WeekDayColor = "#FFE492";//Background color of weekdays.
var FontColor = "#555555";//color of font in Calendar day cell.
var TodayColor = "#870000";//Background color of today.
var todayTextColor = "#FFEEBA";//Font color of today.
var SelDateColor = "#555555";//Backgrond color of selected date in textbox.
var YrSelColor = "#6E6E6E";//color of font of Year selector.
var ThemeBg = "";//Background image of Calendar window.

function NewCal(pCtrl, pFormat, pShowTime, pTimeMode, cnTopu, cnLeftu, cnWidthu, cnHeightu){
	if(Number(cnWidthu)){
		cnWidth = cnWidthu;
	}
	if(Number(cnHeightu)){
		cnHeight = cnHeightu;
	}
	if(Number(cnTopu) || Number(cnTopu) == 0){
		if(Number(cnTopu)){
			cnTop = cnTopu;
		}else{
			cnTop = getVC(cnHeight)
		}
	}
	if(Number(cnLeftu) || Number(cnLeftu) == 0){
		if(Number(cnLeftu)){
			cnLeft = cnLeftu;
		}else{
			cnLeft = getHC(cnWidth)
		}
	}
	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 != ""){
		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;
		}
		if ((parseInt(strDate,10) <= Cal.GetMonDays()) && (parseInt(strDate,10) >= 1)){
			Cal.Date = strDate;
		}
		strYear = exDateTime.substring(Sp2+1,Sp2+5);
		YearPattern = /^\d{4}$/;
		if (YearPattern.test(strYear)){
			Cal.Year=parseInt(strYear,10);
		}
		if (Cal.ShowTime){
			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);
		}
	}
	winCal = window.open("","DateTimePicker","toolbar=0,status=0,menubar=0,fullscreen=no,width="+cnWidth+",height="+cnHeight+",top="+cnTop+",left="+cnLeft+",resizable=false");
	docCal = winCal.document;
	RenderCal();
}

function RenderCal(){
	vDayCount = 0;
	docCal.open();
	docCal.writeln("<html><head><title>"+WindowTitle+"</title>");
	docCal.writeln("<script>var winMain=window.opener;</script>");
	docCal.writeln("<style type='text/css'>a{color:"+aColor+";text-decoration:none;}a:hover{color:"+ahColor+";}td{color:#555555;font-family:verdana;font-size:12px;}.celo{display:table-cell;width:"+CellWidth+";height:"+(CellHeight-2)+";padding-top:3px;}.celo:hover{background-color:"+cellRollOverColor+";}</style>");
	docCal.writeln("</head><body background='"+ThemeBg+"' bgcolor='"+cnBgColor+"' style='margin:"+bodyMargin+"px;'><form name='Calendar' style='margin:0px;'>");
	vCalHeader="<table border=0 cellpadding=1 cellspacing=1 width='100%' align='center' valign='top'>\n";
	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+">"+MonthName[i]+"\n";
	}
	vCalHeader+="</select></td>";
	vCalHeader+="\n<td align='right'><a href='javascript:winMain.Cal.DecYear(); winMain.RenderCal()' title='Previous'><img src='js/calimgs/arr_left.gif' width=12 height=9 border=0></a><span style='color:"+YrSelColor+"'><b> "+Cal.Year+" </b></span><a href='javascript:winMain.Cal.IncYear();winMain.RenderCal()' title='Next'><img src='js/calimgs/arr_right.gif' width=12 height=9 border=0></a></td></tr></table></td>\n";	
	vCalHeader+="</tr>";
	if (ShowMonthYear){
		vCalHeader+="<tr><td colspan='7'><span style='color:"+MonthYearColor+"'><b>"+Cal.GetMonthName(ShowLongMonth)+" "+Cal.Year+"</b></span></td></tr>\n";
	}
	vCalHeader+="<tr bgcolor="+WeekHeadColor+">";
	for (i=0;i<7;i++){
		vCalHeader+="<td align='center'><b>"+WeekDayName[i].substr(0,WeekChar)+"</b></td>";
	}
	vCalHeader+="</tr>";	
	docCal.write(vCalHeader);
	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);
		}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);
	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);
	}
	docCal.writeln("\n</table>");
	docCal.writeln("</form></body></html>");
	docCal.close();
}

function GenCell(pValue,pHighLight,pColor){
	if (pValue == null){
		PValue = "";
		classScript = "";
	}else{
		PValue = pValue;
		classScript = " class='celo'"
	}
	if (pColor != null){
		vColor = "bgcolor=\""+pColor+"\"";
	}else{
		vColor="";
	}
	if ((pHighLight != null) && (pHighLight)){
		extraScript = " style='color:"+todayTextColor+";font-weight:bold;'"
	}else{
		extraScript = ""
	}
	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+" align='center' style='width:"+CellWidth+"; height:"+CellHeight+";' va><a href='javascript:;' onClick=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(PValue)+"';"+vTimeStr+"; window.close();\""+classScript+extraScript+">"+PValue+"</a></td>";
	//PCellStr = "<td "+vColor+" align='center' style='width:"+CellWidth+"; height:"+CellHeight+";'><a href=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(PValue)+"';"+vTimeStr+"; window.close();\""+classScript+extraScript+">"+PValue+"</a></td>";
	return PCellStr;
}

function Calendar(pDate,pCtrl){
	this.Date = pDate.getDate();
	this.Month = pDate.getMonth();
	this.Year = pDate.getFullYear();
	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 = pCtrl;
	this.Format = "ddMMyyyy";
	this.Separator = DateSeparator;
	this.ShowTime = false;
	if (pDate.getHours() < 12){
		this.AMorPM = "AM";
	}else{
		this.AMorPM = "PM";
	}
}

function getHC(wi){
	sWidth = screen.width
	return (sWidth/2) - (wi/2)
}

function getVC(he){
	sHeight = screen.height
	return (sHeight/2) - (he/2)
}

Calendar.prototype.GetMonthIndex = function(shortMonthName){
	for (i=0;i<12;i++){
		if (MonthName[i].substring(0,3).toUpperCase() == shortMonthName.toUpperCase()){
			return i;
		}
	}
}

Calendar.prototype.IncYear = function(){
	Cal.Year++;
}

Calendar.prototype.DecYear = function(){
	Cal.Year--;
}

Calendar.prototype.SwitchMth = function(intMth){
	Cal.Month=intMth;
}

Calendar.prototype.SetHour = function(intHour){
	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.SetMinute = function(intMin){
	var MinExp = new RegExp("^\\d\\d$");
	if (MinExp.test(intMin) && (intMin < 60)){
		Cal.Minutes=intMin;
	}
}

Calendar.prototype.SetSecond = function(intSec){
	var SecExp = new RegExp("^\\d\\d$");
	if (SecExp.test(intSec) && (intSec < 60)){
		Cal.Seconds = intSec;
	}
}

Calendar.prototype.SetAmPm = function(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.getShowHour = function(){
    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.GetMonthName = function(IsLong){
	var Month = MonthName[this.Month];
	if (IsLong){
		return Month;
	}else{
		return Month.substr(0,3);
	}
}

Calendar.prototype.GetMonDays = function(){
	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.IsLeapYear = function(){
	if ((this.Year%4) == 0){
		if ((this.Year%100 == 0) && (this.Year%400) != 0){
			return false;
		}else{
			return true;
		}
	}else{
		return false;
	}
}

Calendar.prototype.FormatDate = function(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);
	}
}