/************************************************************************************** htmlDatePicker v0.1 Copyright (c) 2005, Jason Powell All Rights Reserved Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the product nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Usage: calendar ***************************************************************************************/ // User Changeable Vars var HighlightToday = true; // use true or false to have the current day highlighted var DisablePast = false; // use true or false to allow past dates to be selectable var WeekStart = 1; //0 = week starts on sunday; 1 = week starts on monday // The month names in your native language can be substituted below var MonthNames = new Array( "Januar", "Februar", "March", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "December" ); // Global Vars var now = new Date(); var dest = null; var ny = now.getFullYear(); // Today's Date var nm = now.getMonth(); var nd = now.getDate(); var sy = 0; // currently Selected date var sm = 0; var sd = 0; var y = now.getFullYear(); // Working Date var m = now.getMonth(); var d = now.getDate(); var l = 0; var t = 0; var MonthLengths = new Array(31,28,31,30,31,30,31,31,30,31,30,31); /* Function: GetDate(control) Arguments: control = the ID of the control to receive the date */ function GetDate(control) { EnsureCalendarExists(); DestroyCalendar(); dest = document.getElementById(control); if (dest == null) return; y = now.getFullYear(); m = now.getMonth(); d = now.getDate(); sm = 0; sd = 0; sy = 0; var cdval = dest.value; if(/\d{4}.\d{1,2}.\d{1,2}/.test(dest.value)) { // element contains a date, so set the shown date var vParts = cdval.split("-"); // assume yyyy-mm-dd (original mm/dd/yyyy) // sm = vParts[0] - 1; // sd = vParts[1]; // sy = vParts[2]; sy = vParts[0]; sm = vParts[1] - 1; //Jan = 0 sd = vParts[2]; m=sm; d=sd; y=sy; } // l = dest.offsetLeft; // + dest.offsetWidth; // t = dest.offsetTop - 125; // Calendar is displayed 125 pixels above the destination element // if(t<0) { t=0; } // or (somewhat) over top of it. ;) /* Calendar is displayed 25 pixels below the destination element */ /*RDR: the number of offsetParent required to be used depends on the nesting level of the element */ l = dest.offsetLeft + dest.offsetParent.offsetLeft + dest.offsetParent.offsetParent.offsetLeft; t = dest.offsetTop + dest.offsetParent.offsetTop + dest.offsetParent.offsetParent.offsetTop + 25; if(t < 0) t = 0; // > DrawCalendar(); } /* function DestoryCalendar() Purpose: Destory any already drawn calendar so a new one can be drawn */ function DestroyCalendar() { var cal = document.getElementById("dpCalendar"); if(cal != null) { cal.innerHTML = null; cal.style.display = "none"; } return } function DrawCalendar() { DestroyCalendar(); cal = document.getElementById("dpCalendar"); cal.style.left = l + "px"; cal.style.top = t + "px"; var sCal = ""+ ""+ ""+ ""; if (WeekStart == 0) sCal += ""; //sunday sCal += ""+ ""+ ""+ ""+ ""+ ""; if (WeekStart == 1) sCal += ""; //sunday sCal += ""; var wDay = 1; var wDate = new Date(y,m,wDay); if(isLeapYear(wDate)) { MonthLengths[1] = 29; } else { MonthLengths[1] = 28; } var dayclass = ""; var isToday = false; for(var r=1; r<7; r++) { sCal = sCal + ""; for(var cc=0; cc<7; cc++) { var c = cc; if (WeekStart == 1) { c = cc + 1; if (c == 7) { c = 0; } } var wDate = new Date(y,m,wDay); if(wDate.getDay() == c && wDay<=MonthLengths[m]) { if(wDate.getDate()==sd && wDate.getMonth()==sm && wDate.getFullYear()==sy) { dayclass = "cellSelected"; isToday = true; // only matters if the selected day IS today, otherwise ignored. } else if(wDate.getDate()==nd && wDate.getMonth()==nm && wDate.getFullYear()==ny && HighlightToday) { dayclass = "cellToday"; isToday = true; } else { dayclass = "cellDay"; isToday = false; } if(((now > wDate) && !DisablePast) || (now <= wDate) || isToday) { // > // user wants past dates selectable sCal = sCal + ""; } else { // user wants past dates to be read only sCal = sCal + ""; } wDay++; } else { sCal = sCal + ""; } } sCal = sCal + ""; } sCal = sCal + "
<<"+MonthNames[m]+" "+y+">>
SMTOTFLS
"+wDay+""+wDay+"
Luk
" cal.innerHTML = sCal; // works in FireFox, opera cal.style.display = "inline"; } function PrevMonth() { m--; if(m==-1) { m = 11; y--; } DrawCalendar(); } function NextMonth() { m++; if(m==12) { m = 0; y++; } DrawCalendar(); } function ReturnDay(day) { //cDest = document.getElementById(dest); //dest.value = (m+1)+"/"+day+"/"+y; dest.value = y + "-" + (m+1) + "-" + day; DestroyCalendar(); } function EnsureCalendarExists() { if(document.getElementById("dpCalendar") == null) { var eCalendar = document.createElement("div"); eCalendar.setAttribute("id", "dpCalendar"); document.body.appendChild(eCalendar); } } function isLeapYear(dTest) { var y = dTest.getYear(); var bReturn = false; if(y % 4 == 0) { if(y % 100 != 0) { bReturn = true; } else { if (y % 400 == 0) { bReturn = true; } } } return bReturn; }