//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: 1.8.2 //Contact: contact@rainforestnet.com // Note: Permission given to use and modify this script in ANY kind of applications if // header lines are left unchanged. // // upgraded from version .8 in response to trouble ticket 8196 M. Bernaldo // // //Global variables var winCal; var dtToday=new Date(); var Cal; var YearName = [1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015] var MonthName=["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"]; var WeekDayName1=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]; var WeekDayName2=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]; var exDateTime;//Existing Date and Time var selDate;//selected date. version 1.7 //Configurable parameters var cnTop="200";//top coordinate of calendar window. var cnLeft="500";//left coordinate of calendar window var WindowTitle ="DateTime Picker";//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="FFFF99";//Backgrond color of selected date in textbox. var YrSelColor="#cc0033";//color of font of Year selector. var MthSelColor="#cc0033";//color of font of Month selector if "MonthSelector" is "arrow". var ThemeBg="";//Background image of Calendar window. var PrecedeZero=true;//Preceding zero [true|false] var MondayFirstDay=false;//true:Use Monday as first day; false:Sunday as first day. [true|false] //added in version 1.7 //end Configurable parameters //end Global variable function NewCal(pCtrl,pFormat,pShowTime,pTimeMode,pScroller,pHideSeconds) { Cal=new Calendar(dtToday); if ((pShowTime!=null) && (pShowTime)) { Cal.ShowTime=true; if ((pTimeMode!=null) &&((pTimeMode=='12')||(pTimeMode=='24'))) { TimeMode=pTimeMode; } if ((pHideSeconds!=null)&&(pHideSeconds)) { Cal.ShowSeconds=false; } } if (pCtrl!=null) Cal.Ctrl=pCtrl; if (pFormat!=null) Cal.Format=pFormat.toUpperCase(); if (pScroller!=null) { if (pScroller.toUpperCase()=="ARROW") Cal.Scroller="ARROW"; else Cal.Scroller="DROPDOWN"; } exDateTime=document.getElementById(pCtrl).value; if (exDateTime!="")//Parse existing 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; var winHeight; //parse month Sp1=exDateTime.indexOf(DateSeparator,0) Sp2=exDateTime.indexOf(DateSeparator,(parseInt(Sp1)+1)); var offset=parseInt(Cal.Format.toUpperCase().lastIndexOf("M"))-parseInt(Cal.Format.toUpperCase().indexOf("M"))-1; if ((Cal.Format.toUpperCase()=="DDMMYYYY") || (Cal.Format.toUpperCase()=="DDMMMYYYY")) { if (DateSeparator=="") { strMonth=exDateTime.substring(2,4+offset); strDate=exDateTime.substring(0,2); strYear=exDateTime.substring(4+offset,8+offset); } else { strMonth=exDateTime.substring(Sp1+1,Sp2); strDate=exDateTime.substring(0,Sp1); strYear=exDateTime.substring(Sp2+1,Sp2+5); } } else if ((Cal.Format.toUpperCase()=="MMDDYYYY") || (Cal.Format.toUpperCase()=="MMMDDYYYY")) { if (DateSeparator=="") { strMonth=exDateTime.substring(0,2+offset); strDate=exDateTime.substring(2+offset,4+offset); strYear=exDateTime.substring(4+offset,8+offset); } else { strMonth=exDateTime.substring(0,Sp1); strDate=exDateTime.substring(Sp1+1,Sp2); strYear=exDateTime.substring(Sp2+1,Sp2+5); } } else if ((Cal.Format.toUpperCase()=="YYYYMMDD") || (Cal.Format.toUpperCase()=="YYYYMMMDD")) { if (DateSeparator=="") { strMonth=exDateTime.substring(4,6+offset); strDate=exDateTime.substring(6+offset,8+offset); strYear=exDateTime.substring(0,4); } else { strMonth=exDateTime.substring(Sp1+1,Sp2); strDate=exDateTime.substring(Sp2+1,Sp2+3); strYear=exDateTime.substring(0,Sp1); } } 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; //end parse month //parse Date if ((parseInt(strDate,10)<=Cal.GetMonDays()) && (parseInt(strDate,10)>=1)) Cal.Date=strDate; //end parse Date //parse year YearPattern=/^\d{4}$/; if (YearPattern.test(strYear)) Cal.Year=parseInt(strYear,10); //end parse year //parse time if (Cal.ShowTime==true) { //parse AM or PM if (TimeMode==12) { strAMPM=exDateTime.substring(exDateTime.length-2,exDateTime.length) Cal.AMorPM=strAMPM; } tSp1=exDateTime.indexOf(":",0) tSp2=exDateTime.indexOf(":",(parseInt(tSp1)+1)); if (tSp1>0) { strHour=exDateTime.substring(tSp1,(tSp1)-2); Cal.SetHour(strHour); strMinute=exDateTime.substring(tSp1+1,tSp1+3); Cal.SetMinute(strMinute); strSecond=exDateTime.substring(tSp2+1,tSp2+3); Cal.SetSecond(strSecond); } //window.status=strHour+":"+strMinute+":"+strSecond; } } selDate=new Date(Cal.Year,Cal.Month,Cal.Date);//version 1.7 winCal=window.open("","DateTimePicker","toolbar=0,status=0,menubar=0,width=200,height=200,resizable=0,top="+cnTop+",left="+cnLeft); RenderCal(); winCal.focus(); } function RenderCal() { var vCalHeader; var vCalData; var vCalTime; var i; var j; var SelectStr; var vDayCount=0; var vFirstDay; winCal.document.open(); winCal.document.writeln(""+WindowTitle+""); winCal.document.writeln(""); winCal.document.writeln("");//winMain is window that open calendar window. winCal.document.writeln("
"); vCalHeader="\n"; //Table for Month & Year Selector vCalHeader+="\n\n"; vCalHeader+=""; } //******************End Month selector in dropdown list********************* //******************Month selector in arrow********************************* else if (Cal.Scroller=="ARROW") { vCalHeader+="";//Year scroller (decrease 1 year) vCalHeader+="";//Month scroller (decrease 1 month) vCalHeader+=""//Month and Year vCalHeader+="";//Month scroller (increase 1 month) vCalHeader+="";//Year scroller (increase 1 year) vCalHeader+="
\n"; //******************Month selector in dropdown list************************ if (Cal.Scroller=="DROPDOWN") { vCalHeader+=""; //Year selector vCalHeader+="
  
- <"+Cal.GetMonthName(ShowLongMonth)+" "+Cal.Year+">+
" } //******************End Month selector in arrow****************************** //Calendar header shows Month and Year if ((ShowMonthYear)&&(Cal.Scroller=="DROPDOWN")) vCalHeader+=""+Cal.GetMonthName(ShowLongMonth)+" " +Cal.Year+"\n"; //Week day header vCalHeader+=""; var WeekDayName=new Array();//Added version 1.7 if (MondayFirstDay==true) WeekDayName=WeekDayName2; else WeekDayName=WeekDayName1; for (i=0;i<7;i++) { vCalHeader+=""+WeekDayName[i].substr(0,WeekChar)+""; } vCalHeader+=""; winCal.document.write(vCalHeader); //Calendar detail CalDate=new Date(Cal.Year,Cal.Month); CalDate.setDate(1); vFirstDay=CalDate.getDay(); //Added version 1.7 if (MondayFirstDay==true) { vFirstDay-=1; if (vFirstDay==-1) vFirstDay=6; } //Added version 1.7 vCalData=""; for (i=0;i\n"; } } winCal.document.writeln(vCalData); //Time picker if (Cal.ShowTime) { var showHour; showHour=Cal.getShowHour(); vCalTime="\n"; vCalTime+=""; vCalTime+=" : "; vCalTime+=""; if (Cal.ShowSeconds) { vCalTime+=" : "; vCalTime+=""; } if (TimeMode==12) { var SelectAm =(Cal.AMorPM=="AM")? "Selected":""; var SelectPm =(Cal.AMorPM=="PM")? "Selected":""; vCalTime+=""; } vCalTime+="\n\n"; winCal.document.write(vCalTime); } //end time picker winCal.document.writeln("\n"); winCal.document.writeln(""); winCal.document.close(); } function GenCell(pValue,pHighLight,pColor)//Generate table cell with value { var PValue; var PCellStr; var vColor; var vHLstr1a; 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)) {vHLstr1a=" class='repBrdrHL' ";vHLstr1="";vHLstr2="";} else {vHLstr1a=" class='repBrdr' ";vHLstr1="";vHLstr2="";} if (Cal.ShowTime) { vTimeStr="winMain.document.getElementById('"+Cal.Ctrl+"').value+=' '+"+"winMain.Cal.getShowHour()"+"+':'+"+"winMain.Cal.Minutes"; if (Cal.ShowSeconds) vTimeStr+="+':'+"+"winMain.Cal.Seconds"; if (TimeMode==12) vTimeStr+="+' '+winMain.Cal.AMorPM"; } else vTimeStr=""; PCellStr=""+vHLstr1+""+PValue+""+vHLstr2+""; 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=pCtrl; this.Format="ddMMyyyy"; this.Separator=DateSeparator; this.ShowTime=false; this.Scroller="DROPDOWN"; if (pDate.getHours()<12) this.AMorPM="AM"; else this.AMorPM="PM"; this.ShowSeconds=true; } 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 SwitchYr(obj) { var yrsel = YearName[obj.selectedIndex]; Cal.Year = parseInt(yrsel,10);} Calendar.prototype.SwitchYr=SwitchYr; function IncYear() { Cal.Year++;} Calendar.prototype.IncYear=IncYear; function DecYear() { Cal.Year--} Calendar.prototype.DecYear=DecYear; function IncMonth() { Cal.Month++; if (Cal.Month>=12) { 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"); var SingleDigit=new RegExp("\\d"); alert(SingleDigit.test(intHour)); if (SingleDigit.test(intHour)) { intHour="0"+intHour+""; alert(intHour); } 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) { var MonthDigit=this.Month+1; if (PrecedeZero==true) { if (pDate<10) pDate="0"+pDate; if (MonthDigit<10) MonthDigit="0"+MonthDigit; } if (this.Format.toUpperCase()=="DDMMYYYY") return (pDate+DateSeparator+MonthDigit+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 (MonthDigit+DateSeparator+pDate+DateSeparator+this.Year); else if (this.Format.toUpperCase()=="MMMDDYYYY") return (this.GetMonthName(false)+DateSeparator+pDate+DateSeparator+this.Year); else if (this.Format.toUpperCase()=="YYYYMMDD") return (this.Year+DateSeparator+MonthDigit+DateSeparator+pDate); else if (this.Format.toUpperCase()=="YYYYMMMDD") return (this.Year+DateSeparator+this.GetMonthName(false)+DateSeparator+pDate); else return (pDate+DateSeparator+(this.Month+1)+DateSeparator+this.Year); } Calendar.prototype.FormatDate=FormatDate; /** * DHTML date validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/) */ // Declaring valid date character, minimum year and maximum year var dtCh= "/"; var minYear=1900; var maxYear=2999; function isInteger(s){ var i; for (i = 0; i < s.length; i++){ // Check that current character is number. var c = s.charAt(i); if (((c < "0") || (c > "9"))) return false; } // All characters are numbers. return true; } function stripCharsInBag(s, bag){ var i; var returnString = ""; // Search through string's characters one by one. // If character is not in bag, append to returnString. for (i = 0; i < s.length; i++){ var c = s.charAt(i); if (bag.indexOf(c) == -1) returnString += c; } return returnString; } function daysInFebruary (year){ // February has 29 days in any year evenly divisible by four, // EXCEPT for centurial years which are not also divisible by 400. return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 ); } function DaysArray(n) { for (var i = 1; i <= n; i++) { this[i] = 31 if (i==4 || i==6 || i==9 || i==11) {this[i] = 30} if (i==2) {this[i] = 29} } return this } function isDate(dtStr){ var daysInMonth = DaysArray(12) var pos1=dtStr.indexOf(dtCh) var pos2=dtStr.indexOf(dtCh,pos1+1) var strMonth=dtStr.substring(0,pos1) var strDay=dtStr.substring(pos1+1,pos2) var strYear=dtStr.substring(pos2+1) strYr=strYear if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1) if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1) for (var i = 1; i <= 3; i++) { if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1) } month=parseInt(strMonth) day=parseInt(strDay) year=parseInt(strYr) if (pos1==-1 || pos2==-1){ alert("The date format should be : mm/dd/yyyy") return false } if (strMonth.length<1 || month<1 || month>12){ alert("Please enter a valid month") return false } if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){ alert("Please enter a valid day") return false } if (strYear.length != 4 || year==0 || yearmaxYear){ alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear) return false } if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){ alert("Please enter a valid date") return false } return true }