/* * Original Code - Bazillyo's Spiffy DHTML Popup Calendar v. 1.0 @ 2000 S. Ousta * - freeware with this comment * - Thanks to Chris for the domlay() function * - this requires calendarcode.js, calendar.css, and calendarTest.htm * - works in IE4.x, IE5.x, NS4.75 possibly 4.x, NS6 (with slight cosmetic issues) * - Netscape does display some controls overtop of the layer so layout is important * * Vertebrae rewrite B. Ullman/P. Smith/K. Meaney * Major changes: * - Removal of month & year drop down menus, and dependancies on those items (which Netscape didn't handle well) * - Addition of month and year VCR-type controls. * - restyle layout to build smaller, neater calendar menu. * - Allow user to select non-current month values (the grayout dates) * - Provide method for menu to default to the date shown in the input box. * - Test on the Macs, and make changes to accomodate them. */ // initialize variables... document.write(""); var ppcIE=((navigator.appName == "Microsoft Internet Explorer") || ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion)==5))); var ppcNN6=((navigator.appName == "Netscape") && (parseInt(navigator.appVersion)==5)); var ppcNN=((navigator.appName == "Netscape")&&(document.layers)); is_mac= (navigator.userAgent.toLowerCase().indexOf("mac")!=-1); var is_mac4x=((navigator.userAgent.toLowerCase().indexOf("mac")!=-1)&&(navigator.appName == "Microsoft Internet Explorer")&&(navigator.appVersion.indexOf("5.0")==-1)); agt=navigator.userAgent.toLowerCase(); is_opera6 = ( (agt.indexOf("opera") != -1) && (parseInt(navigator.appVersion.substring(0,1)) < 7 ) ); is_NsFour = ( (agt.indexOf("msie") == -1) && (agt.indexOf("opera") == -1) && (agt.indexOf("mozilla/4.") != -1) ); var todayDate = new Date, curDate = new Date; var minDate = new Date, maxDate = new Date; var IsCalendarVisible=false, valid=true; var inputCount=0, inputNum=0; var ppcX = 4, ppcY = 4; var siteId=0; var curImg, curDateBox; var defaultD, gstrDefaultDate var dteBoxName1, dteBoxName2 var gwhatMonth, gwhatYear var setMin, setMax var IsUsingMinMax; var calfrmName; var gblnClearDate var grunFunc var names = new Array('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'); var longnames = new Array('January','February','March','April','May','June','July','August','September','October','November','December'); var days = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); var dow = new Array('S','M','T','W','T','F','S'); var dateChar="-"; var imagesDir = "" //is_mac4x=true; //uncomment for mac testing var months = new Array(); months = names //from date.js var now = new Date(); //from date.js document.write(""); var calenderX = 0; var calenderY = 0; // integrated functions from legacy date.js function y2k(number) { return (number < 1900) ? number + 1900 : number; } function getFirstofYearOffset(){ var firstofyear = (new Date((new Date().getYear()),0,1)).getTime(); var todaysDate = (new Date((new Date().getYear()),((new Date().getMonth())),(new Date().getDate()))).getTime(); returnedValue = Math.floor(((todaysDate - firstofyear)/(-24 * 60 * 60 * 1000))); return (returnedValue); } function setDate (dayOffset){ var selectedDate = new Date(((new Date()).getTime() + ((parseInt(dayOffset) * 24 * 60 * 60 * 1000)))); return ((selectedDate.getDate() < 10) ? '0' + selectedDate.getDate() : selectedDate.getDate()) + "-" + months[selectedDate.getMonth()] + "-" + y2k(selectedDate.getYear()); }//end integration date.js function getOffsetLeft (el) { if (siteId==6901) return getOffsetLeftDDN(el); var ol = el.offsetLeft; while ((el = el.offsetParent) != null) ol += el.offsetLeft; return ol; } function getOffsetTop (el) { if (siteId==6901) return getOffsetTopDDN(el); var ot = el.offsetTop; while((el = el.offsetParent) != null) ot += el.offsetTop; return ot; } // Kludge to fix DDN problems function getOffsetLeftDDN (el) { var ol = el.offsetLeft; while ((el = el.offsetParent) != null) { if ((el.nodeName=="FIELDSET") || (el.nodeName=="IMG")) ol += el.offsetLeft; } return ol; } function getOffsetTopDDN (el) { var ot = el.offsetTop; while((el = el.offsetParent) != null) { if ((el.nodeName=="FIELDSET") || (el.nodeName=="IMG")) ot += el.offsetTop; } return ot; } function calClick() { window.focus(); } function domlay(id,trigger,lax,lay,content) { // Layer visible if (trigger=="1"){ if (document.layers) document.layers[''+id+''].visibility = "show" else if (document.all) document.all[''+id+''].style.visibility = "visible" else if (document.getElementById) document.getElementById(''+id+'').style.visibility = "visible" } // Layer hidden else if (trigger=="0"){ if (document.layers) document.layers[''+id+''].visibility = "hide" else if (document.all) document.all[''+id+''].style.visibility = "hidden" else if (document.getElementById) document.getElementById(''+id+'').style.visibility = "hidden" } // Set horizontal position if (lax){ if (document.layers){document.layers[''+id+''].left = lax} else if (document.all){document.all[''+id+''].style.left=lax} else if (document.getElementById){document.getElementById(''+id+'').style.left=lax+"px"} } // Set vertical position if (lay){ if (document.layers){document.layers[''+id+''].top = lay} else if (document.all){document.all[''+id+''].style.top=lay} else if (document.getElementById){document.getElementById(''+id+'').style.top=lay+"px"} } // change content if (content){ if (document.layers){ var sprite=document.layers[''+id+'']; sprite.document.open(); sprite.document.write(content); sprite.document.close(); } else if (document.all) { //document.all[''+id+''].innerHTML = content; var container = document.getElementById(''+id+''); container.innerHTML = content; } else if (document.getElementById) { if ( is_opera6 ) { var container = document.getElementById(''+id+''); container.document.write(content); } else { rng = document.createRange(); el = document.getElementById(''+id+''); rng.setStartBefore(el); htmlFrag = rng.createContextualFragment(content) while(el.hasChildNodes()) el.removeChild(el.lastChild); el.appendChild(htmlFrag); } } } } function hideCalendar(){ domlay('popupcalendar',0,ppcX,ppcY); IsCalendarVisible = false; } function Calendar(whatMonth,whatYear) { var startMonth, startYear; var datecolwidth, output = ''; gwhatMonth=whatMonth; gwhatYear=whatYear startMonth=whatMonth; startYear=whatYear; curDate.setMonth(whatMonth); curDate.setFullYear(whatYear); curDate.setDate(todayDate.getDate()); if (ppcNN6) { output += '
'; } else { if ((is_mac)&&(ppcIE)) output += '
'; else output += '
'; }output += ''; firstDay = new Date(whatYear,whatMonth,1); startDay = firstDay.getDay(); if (((whatYear % 4 == 0) && (whatYear % 100 != 0)) || (whatYear % 400 == 0)) days[1] = 29; else days[1] = 28; for (i=0; i<7; i++) { var datecolwidth = (i==0 || i==6) ? "15%" : "14%" ; output += '\n'; var lastMonth = whatMonth - 1; var lastYear = whatYear; var column = 0; if (lastMonth == -1) { lastMonth = 11; lastYear=lastYear-1;} for (i=0; i 0) for (i=1; column<7; i++, column++) output += getDayLink(i,true,nextMonth,nextYear); else output = output.substr(0,output.length-20); output += '<\/td><\/tr>'; output += ''; if (ppcNN6) output += '
'; output += '
' if (gblnClearDate=="true") output += 'clear date value     '; else output += '     ' var tempYear = (parseInt(whatMonth - 1) == -1) ? parseInt(whatYear - 1) : whatYear; output += '' + parseInt(whatYear - 1) + '  '; output += '' + longnames[(whatMonth-1 < 0) ? 11 : whatMonth-1] + ''; output += '' + names[whatMonth] + ', '; output += '' + whatYear + ''; var tempYear = (parseInt(whatMonth + 1) == 12) ? parseInt(whatYear + 1) : whatYear; output += '' + longnames[(whatMonth+1 > 11) ? 0 : whatMonth+1] + '  '; output += '' + parseInt(whatYear + 1) + '     '; output += 'close calendar
'+ dow[i] +'<\/td>\n'; }output += '<\/tr>
Today is '; output += '' + longnames[todayDate.getMonth()] +' ' + todayDate.getDate() + ', ' + todayDate.getFullYear() + '
<\/table>'; else if ((is_mac)&&(ppcIE)) output += '
<\/table>'; else output += '
<\/table>'; curDate.setDate(1); curDate.setMonth(startMonth); curDate.setFullYear(startYear); return output; } function isDayValid(validDay, validMonth, validYear){ curDate.setDate(validDay); curDate.setMonth(validMonth); curDate.setFullYear(validYear); if ((setMin==1)||(setMax==1)){ if ((curDate>=minDate) && (curDate<=maxDate)) { return true; }else{ if ((setMin==1)&&(setMax!=1)){ if (curDate>=minDate) return true; else return false; } if ((setMax==1)&&(setMin!=1)){ if (curDate<=maxDate) return true; else return false; } } } } function isDayToday(isDay) { var objCompare; var objCompare2 if (gstrDefaultDate) { objCompare=today_date; objCompare2=today_date; } else{ objCompare=curDate; objCompare2=todayDate; } if (((curDate.getFullYear() == objCompare2.getFullYear()) && (curDate.getMonth() == objCompare2.getMonth()) && (isDay == objCompare2.getDate()))||(((curDate.getFullYear() == todayDate.getFullYear()) && (curDate.getMonth() == todayDate.getMonth()) && (isDay == todayDate.getDate())))) return true; else return false; } function padout(number) { return (number < 10) ? '0' + number : number; } function clearDay() { eval('document.' + calfrmName + '.' + curDateBox + '.value = \'\''); hideCalendar(); } function cDay(whatDay,greyFlag) { // chooseDay for input var monthModify=0, yearModify=0; if (greyFlag){ if (whatDay>15){ monthModify+=-1 if (gwhatMonth==0){ monthModify+=12; yearModify+=-1; } }else{ monthModify+=1 if (gwhatMonth==11){ monthModify+=-12; yearModify+=1; } } } if (whatDay<=9) whatDay="0"+whatDay eval('document.' + calfrmName + '.' + curDateBox + '.value = "'+ whatDay+ dateChar + names[curDate.getMonth()+monthModify] + dateChar + (curDate.getFullYear()+yearModify) + '"'); eval(grunFunc); hideCalendar(); } function changeDate(monthID, YearID){ curDate.setMonth(monthID); curDate.setFullYear(YearID); if ( !is_opera6 ) { domlay('popupcalendar',1,ppcX,ppcY,Calendar(curDate.getMonth(),curDate.getFullYear())); } else { //var strCurDate=curDate.getDate()+dateChar+names[curDate.getMonth()]+dateChar+curDate.getFullYear(); //strCurDate=formatDate(strCurDate,0,frmName,dteBox); var strCurDate=(curDate.getMonth()+1)+"/"+curDate.getDate()+"/"+curDate.getFullYear(); refreshPage(strCurDate); } } function makeArray0() { for (i = 0; i31))return false; if (isNaN(month) || (month<1 || month>12))return false; if ((year.length==3)||(isNaN(year)))return false; if(parseInt(year) < 70) year = parseInt(year)+2000; if ((parseFloat(year)>=3000 || parseFloat(year)<=1900)||((""+year).length>=5))return false; month=parseFloat(month)-1; if (month==1){ if (year == Math.round(year / 4) * 4){ if (day > 29)return false; }else{ if (day > 28)return false; } }else if (day>days[month]){ return false; } } /*formats date for date.parse for all but mac ie4x. For mac ie4x, checks valid date and populates the input value for mac ie4x */ function formatDate(dateVal,flag,frmName,dteBox){ if (!dateVal)dateVal="///" if (dateVal.indexOf("--")>-1) return false var pattern=eval("/"+dateChar+"/g"); dateVal=(dateVal.replace(pattern,"/")).toUpperCase(); var tempDate;i=0; if (flag==1 || flag==3){//mac ie4x var returnVal=true; if (dateVal.indexOf('/')==-1)return false; } var dateArray=dateVal.split('/'); defaultD=parseFloat(dateArray[0]); if (flag!=2 || flag!=3)dateArray[1]=dateArray[1].toUpperCase(); if (dateArray[1] < "0" || dateArray[1] > "9"){ while (i12)){//mac ie4x return false; } if (flag!=1 && flag!=3){ dateArray[2]=parseFloat(dateArray[2]) if(dateArray[2] < 70) dateArray[2] += 2000; } tempDate=dateArray[0]; dateArray[0]=dateArray[1];dateArray[1]=tempDate; if (!flag==1 && dateArray[1].length==1)dateArray[1]="0"+dateArray[1]; if (flag!=1 && flag!=3){//not mac ie4x if (dateArray[1].length==1)dateArray[1]="0"+dateArray[1]; if (flag!=2)eval("document."+frmName+"."+dteBox+".value='"+dateArray[1]+dateChar+names[dateArray[0]-1]+dateChar+dateArray[2]+"'"); return dateArray.join("/"); }else{//mac ie4x if (dateArray[1].substring(1,2)=="")dateArray[1]="0"+dateArray[1] if (validateDate(dateArray[1],dateArray[0],dateArray[2])==false){ return false; }else{ if (flag!=3)eval("document."+frmName+"."+dteBox+".value='"+dateArray[1]+dateChar+names[dateArray[0]-1]+dateChar+dateArray[2]+"'"); return true; } } } /*validates dates for all browsers- called from formatDate() Also handles y2k */ function checkPlatform(frmName,dteBox,btnName,strMin,strMax,blnClearDate,runFunc, overridePopup, imageDir){ return checkPlatform(frmName,dteBox,btnName,strMin,strMax,blnClearDate,runFunc, overridePopup, imageDir, 0) } /*writes proper page elements and their actions based on browser platform*/ function checkPlatform(frmName,dteBox,btnName,strMin,strMax,blnClearDate,runFunc, overridePopup, imageDir, site){ siteId = site; imagesDir = imageDir; //if mac ie4x if (is_mac4x) { document.write('(DD-MMM-YYYY)'); }else if(!is_mac4x) { var strVAlign = 'align="absmiddle" '; if ( (!overridePopup) && (is_opera6 || is_NsFour) ) { var range = 1; var strBoundaryVal = strMin; if ( (strMin == null) || (strMin.length == 0) ) { range = 2; strBoundaryVal = strMax; } if ( is_opera6 ) strVAlign = ' '; document.write('show/hide calendar'); } else { document.write('show/hide calendar'); } } } function openCalendarPopup( boundaryBoxValRef, valBox, range ) { var elemVal = ''; if ( !((boundaryBoxValRef == null) || (boundaryBoxValRef.length == 0) )) { if ( boundaryBoxValRef.toLowerCase().indexOf('document') != -1 ) elemVal = window.eval(boundaryBoxValRef); else elemVal = boundaryBoxValRef; } openCalendar( elemVal, valBox, range ); } /*blurs for ie*/ function checkBlur(frmObj){ if (!is_mac4x) frmObj.blur(); } /* processes results from checkFields, and returns true on valid entry*/ function checkInvalid(frmName){ if (valid){ return true; } else{ alert('Please enter a valid date in the format of DD-MM(MM)-YY(YY)'); eval("document."+frmName+".elements["+inputNum+"].focus();"); return false; } } function getDayLink(linkDay,isGreyDate,linkMonth,linkYear) { var templink; valid_day = isDayToday(linkDay); if (!(IsUsingMinMax)) { if (isGreyDate){ templink='' + '' + linkDay + '<\/a>' +'<\/td>\n'; }else{ if (valid_day){ if ((today_date.getDay()==curDate.getDay())&&(gstrDefaultDate)) templink='' + '' + linkDay + '<\/a>' +'<\/td>\n'; else templink='' + '' + linkDay + '<\/a>' +'<\/td>\n'; }else{ templink='' + '' + linkDay + '<\/a>' +'<\/td>\n'; } } } else { if (isDayValid(linkDay,linkMonth,linkYear)) { if (isGreyDate){ templink='' + '' + linkDay + '<\/a>' +'<\/td>\n'; } else { if (isDayToday(linkDay)) { if ((today_date.getDay()==curDate.getDay())&&(gstrDefaultDate)) templink='' + '' + linkDay + '<\/a>' +'<\/td>\n'; else templink='' + '' + linkDay + '<\/a>' +'<\/td>\n'; } else { templink='' + '' + linkDay + '<\/a>' +'<\/td>\n'; } } } else { templink=''+ linkDay + '<\/td>'; } }return templink; } function showCalendarDate(strDefaultDate, frmName, dteBox,btnImg, strMinDate, strMaxDate, blnClearDate,runFunc) { grunFunc=runFunc //strDefaultDate=formatDate(strDefaultDate,0,frmName,dteBox); today_date = new Date(strDefaultDate); if (strMinDate.indexOf("document")>-1){ dteBoxName1=strMinDate.match(/(.*\.)(.*\.)(.*\.)/) if (!formatDate(eval(strMinDate),3,frmName,(RegExp.$3).substring(0,(RegExp.$3).length-1)))strMinDate=strMaxDate="///"; strMinDate=eval(strMinDate); } if (strMaxDate.indexOf("document")>-1){ dteBoxName2=strMaxDate.match(/(.*\.)(.*\.)(.*\.)/) if (!formatDate(eval(strMaxDate),3,frmName,(RegExp.$3).substring(0,(RegExp.$3).length-1)))strMinDate=strMaxDate="///"; strMaxDate=eval(strMaxDate); } if (!is_mac4x){ strMinDate=formatDate(strMinDate,2,'','') strMaxDate=formatDate(strMaxDate,2,'','') } gstrDefaultDate=strDefaultDate start_month=today_date.getMonth() start_year=today_date.getFullYear() gblnClearDate=blnClearDate; var MnDtArray=strMinDate.split("/"); var MxDtArray=strMaxDate.split("/"); var MnDt="",MnMo="",MnYr="",MxDt="",MxMo="",MxYr=""; if (MnDtArray.length>=3) MnDt=MnDtArray[1];MnMo=MnDtArray[0];MnYr=MnDtArray[2]; if (MxDtArray.length>=3) MxDt=MxDtArray[1];MxMo=MxDtArray[0];MxYr=MxDtArray[2]; calfrmName = frmName; if (IsCalendarVisible) { hideCalendar(); } else { if (MnDt=="") setMin=0; else if (MxDt=="") setMax=0; if (((MnDt!="") && (MnMo!="") && (MnYr!="")) || ((MxDt!="") && (MxMo!="") && (MxYr!=""))) { IsUsingMinMax = true; if ((MnDt!="") && (MnMo!="") && (MnYr!="")){ setMin=1; minDate.setFullYear(MnYr); minDate.setMonth(MnMo-1); minDate.setDate(MnDt); } if ((MxDt!="") && (MxMo!="") && (MxYr!="")){ setMax=1; maxDate.setFullYear(MxYr); maxDate.setMonth(MxMo-1); maxDate.setDate(MxDt); } } else { IsUsingMinMax = false; } //curImg = btnImg; curDateBox = dteBox; if ( ppcIE ) { if(calenderX==0){ // ppcX = getOffsetLeft(document.images[btnImg]); ppcX = getOffsetLeft(document.getElementById(btnImg)); }else{ ppcX = calenderX; } if(calenderY==0){ // ppcY = getOffsetTop(document.images[btnImg]) + document.images[btnImg].height; ppcY = getOffsetTop(document.getElementById(btnImg));// + document.divs[btnImg].height; }else{ ppcY = calenderY; } } else if (ppcNN){ // ppcX = document.images[btnImg].x; // ppcY = document.images[btnImg].y + document.images[btnImg].height; ppcX = document.getElementById(btnImg).x; ppcY = document.getElementById(btnImg).y;// + document.divs[btnImg].height; } var calContent = Calendar(start_month,start_year); domlay('popupcalendar',1,ppcX,ppcY, calContent); IsCalendarVisible = true; } } function showCalendar(frmName, dteBox,btnImg, strMinDate, strMaxDate, blnClearDate,runFunc) { var strDefaultDate = ""; if (formatDate(eval("document."+frmName+"."+dteBox+".value"),1,frmName,eval("document."+frmName+"."+dteBox+".name"))){ strDefaultDate=formatDate(eval("document."+frmName+"."+dteBox+".value;"),0,frmName,dteBox); }else{ today_date = new Date(); strDefaultDate=today_date.getDate()+dateChar+names[today_date.getMonth()]+dateChar+today_date.getFullYear(); eval("document."+frmName+"."+dteBox+".value='"+strDefaultDate+"'"); strDefaultDate=(today_date.getMonth()+1)+"/"+today_date.getDate()+"/"+today_date.getFullYear(); } showCalendarDate(strDefaultDate, frmName, dteBox,btnImg, strMinDate, strMaxDate, blnClearDate,runFunc); }