1 //Javascript name: My Date Time Picker
\r
2 //Date created: 16-Nov-2003 23:19
\r
3 //Scripter: TengYong Ng
\r
4 //Website: http://www.rainforestnet.com
\r
5 //Copyright (c) 2003 TengYong Ng
\r
6 //FileName: DateTimePicker.js
\r
8 //Contact: contact@rainforestnet.com
\r
9 // Note: Permission given to use this script in ANY kind of applications if
\r
10 // header lines are left unchanged.
\r
14 var dtToday=new Date();
\r
17 var MonthName=["January", "February", "March", "April", "May", "June","July",
\r
18 "August", "September", "October", "November", "December"];
\r
19 var WeekDayName=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
\r
20 var exDateTime;//Existing Date and Time
\r
22 //Configurable parameters
\r
23 var cnTop="200";//top coordinate of calendar window.
\r
24 var cnLeft="500";//left coordinate of calendar window
\r
25 var WindowTitle ="DateTime Picker";//Date Time Picker title.
\r
26 var WeekChar=2;//number of character for week day. if 2 then Mo,Tu,We. if 3 then Mon,Tue,Wed.
\r
27 var CellWidth=20;//Width of day cell.
\r
28 var DateSeparator="-";//Date Separator, you can change it to "/" if you want.
\r
29 var TimeMode=24;//default TimeMode value. 12 or 24
\r
31 var ShowLongMonth=true;//Show long month name in Calendar header. example: "January".
\r
32 var ShowMonthYear=true;//Show Month and Year in Calendar header.
\r
33 var MonthYearColor="#cc0033";//Font Color of Month and Year in Calendar header.
\r
34 var WeekHeadColor="#0099CC";//Background Color in Week header.
\r
35 var SundayColor="#6699FF";//Background color of Sunday.
\r
36 var SaturdayColor="#CCCCFF";//Background color of Saturday.
\r
37 var WeekDayColor="white";//Background color of weekdays.
\r
38 var FontColor="blue";//color of font in Calendar day cell.
\r
39 var TodayColor="#FFFF33";//Background color of today.
\r
40 var SelDateColor="#FFFF99";//Backgrond color of selected date in textbox.
\r
41 var YrSelColor="#cc0033";//color of font of Year selector.
\r
42 var ThemeBg="";//Background image of Calendar window.
\r
43 //end Configurable parameters
\r
44 //end Global variable
\r
46 function NewCal(pCtrl,pFormat,pShowTime,pTimeMode)
\r
48 Cal=new Calendar(dtToday);
\r
49 if ((pShowTime!=null) && (pShowTime))
\r
52 if ((pTimeMode!=null) &&((pTimeMode=='12')||(pTimeMode=='24')))
\r
60 Cal.Format=pFormat.toUpperCase();
\r
62 exDateTime=document.getElementById(pCtrl).value;
\r
63 if (exDateTime!="")//Parse Date String
\r
65 var Sp1;//Index of Date Separator 1
\r
66 var Sp2;//Index of Date Separator 2
\r
67 var tSp1;//Index of Time Separator 1
\r
68 var tSp1;//Index of Time Separator 2
\r
78 Sp1=exDateTime.indexOf(DateSeparator,0)
\r
79 Sp2=exDateTime.indexOf(DateSeparator,(parseInt(Sp1)+1));
\r
81 if ((Cal.Format.toUpperCase()=="DDMMYYYY") || (Cal.Format.toUpperCase()=="DDMMMYYYY"))
\r
82 //if ((Cal.Format.toUpperCase()=="YYYYMMDD") || (Cal.Format.toUpperCase()=="YYYYMMMDD"))
\r
84 strMonth=exDateTime.substring(Sp1+1,Sp2);
\r
85 strDate=exDateTime.substring(0,Sp1);
\r
87 else if ((Cal.Format.toUpperCase()=="MMDDYYYY") || (Cal.Format.toUpperCase()=="MMMDDYYYY"))
\r
89 strMonth=exDateTime.substring(0,Sp1);
\r
90 strDate=exDateTime.substring(Sp1+1,Sp2);
\r
92 if (isNaN(strMonth))
\r
93 intMonth=Cal.GetMonthIndex(strMonth);
\r
95 intMonth=parseInt(strMonth,10)-1;
\r
96 if ((parseInt(intMonth,10)>=0) && (parseInt(intMonth,10)<12))
\r
97 Cal.Month="0"+intMonth;
\r
100 if ((parseInt(strDate,10)<=Cal.GetMonDays()) && (parseInt(strDate,10)>=1))
\r
104 strYear=exDateTime.substring(Sp2+1,Sp2+5);
\r
105 YearPattern=/^\d{4}$/;
\r
106 if (YearPattern.test(strYear))
\r
107 Cal.Year=parseInt(strYear,10);
\r
110 if (Cal.ShowTime==true)
\r
112 tSp1=exDateTime.indexOf(":",0)
\r
113 tSp2=exDateTime.indexOf(":",(parseInt(tSp1)+1));
\r
114 strHour=exDateTime.substring(tSp1,(tSp1)-2);
\r
115 Cal.SetHour(strHour);
\r
116 strMinute=exDateTime.substring(tSp1+1,tSp2);
\r
117 Cal.SetMinute(strMinute);
\r
118 strSecond=exDateTime.substring(tSp2+1,tSp2+3);
\r
119 Cal.SetSecond(strSecond);
\r
122 winCal=window.open("","DateTimePicker","toolbar=0,status=0,menubar=0,fullscreen=no,width=195,height=245,resizable=0,top="+cnTop+",left="+cnLeft);
\r
123 docCal=winCal.document;
\r
127 function RenderCal()
\r
139 docCal.writeln("<html><head><title>"+WindowTitle+"</title>");
\r
140 docCal.writeln("<script>var winMain=window.opener;</script>");
\r
141 docCal.writeln("</head><body background='"+ThemeBg+"' link="+FontColor+" vlink="+FontColor+"><form name='Calendar'>");
\r
143 vCalHeader="<table border=1 cellpadding=1 cellspacing=1 width='100%' align=\"center\" valign=\"top\">\n";
\r
145 vCalHeader+="<tr>\n<td colspan='7'><table border=0 width='100%' cellpadding=0 cellspacing=0><tr><td align='left'>\n";
\r
146 vCalHeader+="<select name=\"MonthSelector\" onChange=\"javascript:winMain.Cal.SwitchMth(this.selectedIndex);winMain.RenderCal();\">\n";
\r
150 SelectStr="Selected";
\r
153 vCalHeader+="<option "+SelectStr+" value >"+MonthName[i]+"\n";
\r
155 vCalHeader+="</select></td>";
\r
157 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";
\r
158 vCalHeader+="</tr>";
\r
159 //Calendar header shows Month and Year
\r
161 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";
\r
163 vCalHeader+="<tr bgcolor="+WeekHeadColor+">";
\r
166 vCalHeader+="<td align='center'><font face='Verdana' size='2'>"+WeekDayName[i].substr(0,WeekChar)+"</font></td>";
\r
168 vCalHeader+="</tr>";
\r
169 docCal.write(vCalHeader);
\r
172 CalDate=new Date(Cal.Year,Cal.Month);
\r
173 CalDate.setDate(1);
\r
174 vFirstDay=CalDate.getDay();
\r
176 for (i=0;i<vFirstDay;i++)
\r
178 vCalData=vCalData+GenCell();
\r
179 vDayCount=vDayCount+1;
\r
181 for (j=1;j<=Cal.GetMonDays();j++)
\r
184 vDayCount=vDayCount+1;
\r
185 if ((j==dtToday.getDate())&&(Cal.Month==dtToday.getMonth())&&(Cal.Year==dtToday.getFullYear()))
\r
186 strCell=GenCell(j,true,TodayColor);//Highlight today's date
\r
191 strCell=GenCell(j,true,SelDateColor);
\r
195 if (vDayCount%7==0)
\r
196 strCell=GenCell(j,false,SaturdayColor);
\r
197 else if ((vDayCount+6)%7==0)
\r
198 strCell=GenCell(j,false,SundayColor);
\r
200 strCell=GenCell(j,null,WeekDayColor);
\r
203 vCalData=vCalData+strCell;
\r
205 if((vDayCount%7==0)&&(j<Cal.GetMonDays()))
\r
207 vCalData=vCalData+"</tr>\n<tr>";
\r
210 docCal.writeln(vCalData);
\r
215 showHour=Cal.getShowHour();
\r
216 vCalTime="<tr>\n<td colspan='7' align='center'>";
\r
217 vCalTime+="<input type='text' name='hour' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+showHour+" onchange=\"javascript:winMain.Cal.SetHour(this.value)\">";
\r
219 vCalTime+="<input type='text' name='minute' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+Cal.Minutes+" onchange=\"javascript:winMain.Cal.SetMinute(this.value)\">";
\r
221 vCalTime+="<input type='text' name='second' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+Cal.Seconds+" onchange=\"javascript:winMain.Cal.SetSecond(this.value)\">";
\r
224 var SelectAm =(parseInt(Cal.Hours,10)<12)? "Selected":"";
\r
225 var SelectPm =(parseInt(Cal.Hours,10)>=12)? "Selected":"";
\r
227 vCalTime+="<select name=\"ampm\" onchange=\"javascript:winMain.Cal.SetAmPm(this.options[this.selectedIndex].value);\">";
\r
228 vCalTime+="<option "+SelectAm+" value=\"AM\">AM</option>";
\r
229 vCalTime+="<option "+SelectPm+" value=\"PM\">PM<option>";
\r
230 vCalTime+="</select>";
\r
232 vCalTime+="\n</td>\n</tr>";
\r
233 docCal.write(vCalTime);
\r
236 docCal.writeln("\n</table>");
\r
237 docCal.writeln("</form></body></html>");
\r
241 function GenCell(pValue,pHighLight,pColor)//Generate table cell with value
\r
246 var vHLstr1;//HighLight string
\r
256 vColor="bgcolor=\""+pColor+"\"";
\r
259 if ((pHighLight!=null)&&(pHighLight))
\r
260 {vHLstr1="color='red'><b>";vHLstr2="</b>";}
\r
262 {vHLstr1=">";vHLstr2="";}
\r
266 vTimeStr="winMain.document.getElementById('"+Cal.Ctrl+"').value+=' '+"+"winMain.Cal.getShowHour()"+"+':'+"+"winMain.Cal.Minutes"+"+':'+"+"winMain.Cal.Seconds";
\r
268 vTimeStr+="+' '+winMain.Cal.AMorPM";
\r
272 PCellStr="<td "+vColor+" width="+CellWidth+" align='center'><font face='verdana' size='2'"+vHLstr1+"<a href=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(PValue)+"';"+vTimeStr+";window.close();\">"+PValue+"</a>"+vHLstr2+"</font></td>";
\r
276 function Calendar(pDate,pCtrl)
\r
279 this.Date=pDate.getDate();//selected date
\r
280 this.Month=pDate.getMonth();//selected month number
\r
281 this.Year=pDate.getFullYear();//selected year in 4 digits
\r
282 this.Hours=pDate.getHours();
\r
284 if (pDate.getMinutes()<10)
\r
285 this.Minutes="0"+pDate.getMinutes();
\r
287 this.Minutes=pDate.getMinutes();
\r
289 if (pDate.getSeconds()<10)
\r
290 this.Seconds="0"+pDate.getSeconds();
\r
292 this.Seconds=pDate.getSeconds();
\r
294 this.MyWindow=winCal;
\r
296 this.Format="ddMMyyyy";
\r
297 this.Separator=DateSeparator;
\r
298 this.ShowTime=false;
\r
300 if (pDate.getHours()<12)
\r
306 function GetMonthIndex(shortMonthName)
\r
310 if (MonthName[i].substring(0,3).toUpperCase()==shortMonthName.toUpperCase())
\r
314 Calendar.prototype.GetMonthIndex=GetMonthIndex;
\r
318 Calendar.prototype.IncYear=IncYear;
\r
322 Calendar.prototype.DecYear=DecYear;
\r
324 function SwitchMth(intMth)
\r
325 { Cal.Month=intMth;}
\r
326 Calendar.prototype.SwitchMth=SwitchMth;
\r
328 function SetHour(intHour)
\r
333 { MaxHour=23;MinHour=0}
\r
334 else if (TimeMode==12)
\r
335 { MaxHour=12;MinHour=1}
\r
337 alert("TimeMode can only be 12 or 24");
\r
338 var HourExp=new RegExp("^\\d\\d$");
\r
339 if (HourExp.test(intHour) && (parseInt(intHour,10)<=MaxHour) && (parseInt(intHour,10)>=MinHour))
\r
341 if ((TimeMode==12) && (Cal.AMorPM=="PM"))
\r
343 if (parseInt(intHour,10)==12)
\r
346 Cal.Hours=parseInt(intHour,10)+12;
\r
348 else if ((TimeMode==12) && (Cal.AMorPM=="AM"))
\r
352 Cal.Hours=parseInt(intHour,10);
\r
354 else if (TimeMode==24)
\r
355 Cal.Hours=parseInt(intHour,10);
\r
358 Calendar.prototype.SetHour=SetHour;
\r
360 function SetMinute(intMin)
\r
362 var MinExp=new RegExp("^\\d\\d$");
\r
363 if (MinExp.test(intMin) && (intMin<60))
\r
364 Cal.Minutes=intMin;
\r
366 Calendar.prototype.SetMinute=SetMinute;
\r
368 function SetSecond(intSec)
\r
370 var SecExp=new RegExp("^\\d\\d$");
\r
371 if (SecExp.test(intSec) && (intSec<60))
\r
372 Cal.Seconds=intSec;
\r
374 Calendar.prototype.SetSecond=SetSecond;
\r
376 function SetAmPm(pvalue)
\r
378 this.AMorPM=pvalue;
\r
381 this.Hours=(parseInt(this.Hours,10))+12;
\r
382 if (this.Hours==24)
\r
385 else if (pvalue=="AM")
\r
388 Calendar.prototype.SetAmPm=SetAmPm;
\r
390 function getShowHour()
\r
395 if (parseInt(this.Hours,10)==0)
\r
398 finalHour=parseInt(this.Hours,10)+12;
\r
400 else if (parseInt(this.Hours,10)==12)
\r
405 else if (this.Hours>12)
\r
408 if ((this.Hours-12)<10)
\r
409 finalHour="0"+((parseInt(this.Hours,10))-12);
\r
411 finalHour=parseInt(this.Hours,10)-12;
\r
417 finalHour="0"+parseInt(this.Hours,10);
\r
419 finalHour=this.Hours;
\r
422 else if (TimeMode==24)
\r
425 finalHour="0"+parseInt(this.Hours,10);
\r
427 finalHour=this.Hours;
\r
431 Calendar.prototype.getShowHour=getShowHour;
\r
433 function GetMonthName(IsLong)
\r
435 var Month=MonthName[this.Month];
\r
439 return Month.substr(0,3);
\r
441 Calendar.prototype.GetMonthName=GetMonthName;
\r
443 function GetMonDays()//Get number of days in a month
\r
445 var DaysInMonth=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
\r
446 if (this.IsLeapYear())
\r
450 return DaysInMonth[this.Month];
\r
452 Calendar.prototype.GetMonDays=GetMonDays;
\r
454 function IsLeapYear()
\r
456 if ((this.Year%4)==0)
\r
458 if ((this.Year%100==0) && (this.Year%400)!=0)
\r
472 Calendar.prototype.IsLeapYear=IsLeapYear;
\r
474 function FormatDate(pDate)
\r
477 if (this.Format.toUpperCase()=="DDMMYYYY")
\r
478 return (this.Year+DateSeparator+(this.Month+1)+DateSeparator+pDate);
\r
479 else if (this.Format.toUpperCase()=="DDMMMYYYY")
\r
480 return (pDate+DateSeparator+this.GetMonthName(false)+DateSeparator+this.Year);
\r
481 else if (this.Format.toUpperCase()=="MMDDYYYY")
\r
482 return ((this.Month+1)+DateSeparator+pDate+DateSeparator+this.Year);
\r
483 else if (this.Format.toUpperCase()=="MMMDDYYYY")
\r
484 return (this.GetMonthName(false)+DateSeparator+pDate+DateSeparator+this.Year);
\r
487 Calendar.prototype.FormatDate=FormatDate;