//JS DatePicker @0-372DAD89 // Date formatting functions begin --------------------------------------------------- var listMonths = new Array("Janvier", "F vrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao t", "Septembre", "Octobre", "Novembre", "D cembre"); var listShortMonths = new Array("Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aou", "Sept", "Oct", "Nov", "Dec"); var firstWeekDay = "Dim"; var listWeekdays = new Array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"); var listShortWeekdays = new Array("Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"); var DateMasks = new Array(26); DateMasks["d"] = 0; DateMasks["dd"] = 2; DateMasks["m"] = 0; DateMasks["mm"] = 2; DateMasks["mmm"] = 3; DateMasks["mmmm"] = 0; DateMasks["M"] = 0; DateMasks["MM"] = 2; DateMasks["MMM"] = 3; DateMasks["MMMM"] = 0; DateMasks["yy"] = 2; DateMasks["yyyy"] = 4; DateMasks["h"] = 0; DateMasks["hh"] = 2; DateMasks["H"] = 0; DateMasks["HH"] = 2; DateMasks["n"] = 0; DateMasks["nn"] = 2; DateMasks["s"] = 0; DateMasks["ss"] = 2; DateMasks["am/pm"] = 2; DateMasks["AM/PM"] = 2; DateMasks["A/P"] = 1; DateMasks["a/p"] = 1; DateMasks["w"] = 0; DateMasks["q"] = 0; DateMasks["S"] = 0; function geckoGetRv() { if (navigator.product != 'Gecko') { return -1; } var rvValue = 0; var ua = navigator.userAgent.toLowerCase(); var rvStart = ua.indexOf('rv:'); var rvEnd = ua.indexOf(')', rvStart); var rv = ua.substring(rvStart+3, rvEnd); var rvParts = rv.split('.'); var exp = 1; for (var i = 0; i < rvParts.length; i++) { var val = parseInt(rvParts[i]); rvValue += val / exp; exp *= 100; } return rvValue; } function isInArray(strValue, arrArray) { var intResult = -1; for ( var j = 0; j < arrArray.length && (strValue != arrArray[j]); j++ ); if ( j != arrArray.length ) intResult = j; return intResult; } function parseDateFormat(strMask) { var UNDEF; var arrResult = new Array(); if (strMask == "" || typeof(strMask) == "undefined") return arrResult; var arrMaskTokens = new Array( "d", "w", "m", "M", "q", "y", "h", "H", "n", "s", "dd", "ww", "mm", "MM", "yy", "hh", "HH", "nn", "ss", "S", "ddd", "mmm", "MMM", "A/P", "a/p", "dddd", "mmmm", "MMMM", "yyyy", "AM/PM", "am/pm", "LongDate", "LongTime", "ShortDate", "ShortTime", "GeneralDate"); var arrMaskTokensFirstLetters = new Array("d", "w", "m", "M", "q", "y", "h", "H", "n", "s", "A", "a", "L", "S", "G"); var strMaskLength = strMask.length; var i = 0, intMaskPosition = 0; var arrMask = new Array(); var strToken = ""; while (i < strMaskLength) { if (strMask.charAt(i) == "\\") { strToken += strMask.charAt(++i); i ++; } else if (strMask.charAt(i) == "'") { i ++; while ((i < strMask.length) && (strMask.charAt(i) != "'")) strToken += strMask.charAt(i++); i ++; } else { var j = isInArray(strMask.charAt(i), arrMaskTokensFirstLetters); if ( j != -1 ) { var k; for (k = (arrMaskTokens.length - 1); k >= 0 && strMask.slice(i, i + arrMaskTokens[k].length) != arrMaskTokens[k]; k--); if (k != -1) { if (strToken.length > 0) { if ( isInArray(strToken, arrMaskTokens) == -1) arrMask[intMaskPosition ++] = strToken; else arrMask[intMaskPosition ++] = "\\" + strToken; strToken = ""; } arrMask[intMaskPosition ++] = arrMaskTokens[k]; i += arrMaskTokens[k].length; } else { strToken = strMask.charAt(i); i ++; } } else { strToken += strMask.charAt(i); i ++; } } } if (strToken.length > 0) { if ( isInArray(strToken, arrMaskTokens) == -1) arrMask[intMaskPosition ++] = strToken; else arrMask[intMaskPosition ++] = "\\" + strToken; strToken = ""; } arrResult = arrMask; return arrResult; } function getDayOfYear(year, month, day) { var firstDay = new Date(year, 0, 1); var date = new Date(year, month, day); return (date-firstDay)/(1000*60*60*24); } function get12Hour(hoursNumber) { if (hoursNumber == 0) hoursNumber = 12; else if (hoursNumber > 12) hoursNumber = hoursNumber - 12; return hoursNumber; } function addZero(value, resultLength) { var countZero = resultLength - String(value).length; var result = String(value); for (var i=0; i= 0 && HoursNumber < 12) return AnteMeridiem; else return PostMeridiem; } function formatDate(dateToFormat, parsedFormat) { var resultArray = new Array(parsedFormat.length); for (var i=0; i 0) { DatePart = String(dateToParse).substr(DatePosition, TokenLength); DatePosition = DatePosition + TokenLength; }else { if (MaskPosition < MaskLength) { Delimiter = parsedMask[MaskPosition + 1]; BeginDelimiter = dateToParse.indexOf(Delimiter, DatePosition); if (BeginDelimiter == -1) { //alert("ParseDate function: The number doesn't match the mask."); return null; }else { DatePart = String(dateToParse).substr(DatePosition, BeginDelimiter - DatePosition); DatePosition = BeginDelimiter; } }else DatePart = String(dateToParse).substr(DatePosition); } switch (MaskPart) { case "d": case "dd": resultDateArray[DAY_POS] = Math.floor(DatePart); resultDateArray[IS_DATE_POS] = true; break; case "m": case "mm": case "M": case "MM": resultDateArray[MONTH_POS] = Math.floor(DatePart); resultDateArray[IS_DATE_POS] = true; break; case "mmm": case "mmmm": case "MMM": case "MMMM": MonthNumber = 0; MonthName = String(DatePart).toUpperCase(); if (MaskPart == "mmm") MonthNamesArray = listMonths; else MonthNamesArray = listShortMonths; while (MonthNumber < 11 && String(MonthNamesArray[MonthNumber]).toUpperCase() != MonthName) { MonthNumber = MonthNumber + 1; } if (MonthNumber == 11) { if (String(MonthNamesArray[11]).toUpperCase() != MonthName) { //alert("ParseDate function: The number doesn't match the mask."); return null; } } resultDateArray[MONTH_POS] = MonthNumber + 1; resultDateArray[IS_DATE_POS] = true; break; case "yy": var last2Digits = Math.floor(DatePart); var centuryDigits = (last2Digits>=50)?1900:2000; resultDateArray[YEAR_POS] = centuryDigits + last2Digits; resultDateArray[IS_DATE_POS] = true; break; case "yyyy": resultDateArray[YEAR_POS] = Math.floor(DatePart); resultDateArray[IS_DATE_POS] = true; break; case "h": case "hh": if (Math.floor(DatePart) == 12) resultDateArray[HOUR_POS] = 0; else resultDateArray[HOUR_POS] = Math.floor(DatePart); resultDateArray[IS_TIME_POS] = true; break; case "H": case "HH": resultDateArray[HOUR_POS] = Math.floor(DatePart); resultDateArray[IS_TIME_POS] = true; break; case "n": case "nn": resultDateArray[MINUTE_POS] = Math.floor(DatePart); resultDateArray[IS_TIME_POS] = true; break; case "s": case "ss": resultDateArray[SECOND_POS] = Math.floor(DatePart); resultDateArray[IS_TIME_POS] = true; break; case "am/pm": case "a/p": case "AM/PM": case "A/P": if (String(DatePart).toLowerCase().charAt(0) == "p") resultDateArray[HOUR_POS] = resultDateArray[HOUR_POS] + 12; else if (String(DatePart).toLowerCase().charAt(0) == "a") Then resultDateArray[HOUR_POS] = resultDateArray[HOUR_POS]; resultDateArray[IS_TIME_POS] = true; break; case "w": case "q": case "S": //Do Nothing break; } }else DatePosition = DatePosition + parsedMask[MaskPosition].length; MaskPosition = MaskPosition + 1 } if (resultDateArray[IS_DATE_POS] && resultDateArray[IS_TIME_POS]) { resultDate = new Date(resultDateArray[YEAR_POS], resultDateArray[MONTH_POS] - 1, resultDateArray[DAY_POS], resultDateArray[HOUR_POS], resultDateArray[MINUTE_POS], resultDateArray[SECOND_POS]); }else if (resultDateArray[IS_DATE_POS]) { resultDate = new Date(resultDateArray[YEAR_POS], resultDateArray[MONTH_POS] - 1, resultDateArray[DAY_POS]); }else if (resultDateArray[IS_DATE_POS]) { resultDate = new Date(0, 0, 0, resultDateArray[HOUR_POS], resultDateArray[MINUTE_POS], resultDateArray[SECOND_POS]); } } return resultDate; } function checkDateRange(date) { var minDate = new Date(1753, 0, 1); var maxDate = new Date(9999, 11, 31); if (date < minDate) return minDate; if (date > maxDate) return maxDate; return date; } // Date formatting functions end --------------------------------------------------- var DatePickerObject = new Object(); var disableEvents = false; var disableUnload = false; // Determine browser brand var isNav = false; var isIE = false; // Assume it's either Netscape or MSIE if (navigator.appName == "Netscape") { isNav = true; } else { isIE = true; } // Get currently selected language selectedLanguage = navigator.language; // DatePicker functions begin here --------------------------------------------------- // Set the initial value of the global date field function setDateField(dateField) { // Assign the incoming field object to a global variable datepickerControl = eval(dateField); // Set DatePickerObject.selectedDate to the date in the incoming field or default to today's date setInitialDate(datepickerControl.value); datepickerDocumentTop = buildTop(); datepickerDocumentBottom = buildBottom(); } // Set the initial DatePicker date to today or to the existing value in dateField function setInitialDate(inDate) { // Create a new date object var date = parseDate(inDate, parseDateFormat(DatePickerObject.format)); if (date) date = checkDateRange(date); // If the incoming date is invalid, use the current date if (isNaN(date) || !date) { // Simply create a new date object which defaults to the current date date = new Date(); } DatePickerObject.selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); // KEEP TRACK OF THE CURRENT DAY VALUE DatePickerObject.selectedDay = date.getDate(); // Set day value to 1... to avoid javascript date calculation anomalies // (if the month changes to feb and the day is 30, the month would change to march // and the day would change to 2. setting the day to 1 will prevent that) date.setDate(1); DatePickerObject.currentMonth = date.getMonth(); DatePickerObject.currentYear = date.getFullYear(); } // Popup a window with the DatePicker in it function showDatePicker(object_name, form_name, form_control) { disableEvents = false; DatePickerObject = eval(object_name); if (typeof(DatePickerObject)!="object" || !DatePickerObject) return; DatePickerObject.control = String("document."+form_name+"."+form_control); DatePickerObject.themePath = DatePickerObject.style; DatePickerObject.selectedDate = new Date(); DatePickerObject.selectedDay = 1; DatePickerObject.currentMonth = DatePickerObject.selectedDate.getMonth(); DatePickerObject.currentYear = DatePickerObject.selectedDate.getFullYear(); if (DatePickerObject.themePath.lastIndexOf("/")!=-1) DatePickerObject.themePath = DatePickerObject.themePath.substr(0,DatePickerObject.themePath.lastIndexOf("/")+1); else if (DatePickerObject.themePath.lastIndexOf("\\")!=-1) DatePickerObject.themePath = DatePickerObject.themePath.substr(0,DatePickerObject.themePath.lastIndexOf("\\")+1); // Pre-build portions of the DatePicker when this js library loads into the browser !!!!!! buildDatePickerParts(); // Set initial value of the date field and create top and bottom part setDateField(DatePickerObject.control); // Use the javascript-generated documents (datepickerDocumentTop, datepickerDocumentBottom) datepickerSource = datepickerDocumentBottom; // Display the DatePicker in a new popup window if (typeof(top.newWinDatePickerObject) != "object") { var datepickerURL = DatePickerObject.relativePathPart?DatePickerObject.relativePathPart+"DatePicker.html":"DatePicker.html"; var w_left = Math.ceil(screen.width/2-120); var w_top = Math.ceil(screen.height/2-110); top.newWinDatePickerObject = window.open(datepickerURL+"?random="+Math.random(), "DatePickerWindow", "dependent=yes,left="+w_left+",top="+w_top+",width=250,height=210,screenX=200,screenY=300,titlebar=yes, center: yes, help: no, resizable: yes, status: no"); } top.newWinDatePickerObject.focus(); } // Create the top DatePicker part function buildTop() { // Create the top part of the DatePicker var imgPrevYear = DatePickerObject.themePath+"PrevYear.gif"; var imgPrevMonth = DatePickerObject.themePath+"PrevMonth.gif"; var imgNextMonth = DatePickerObject.themePath+"NextMonth.gif"; var imgNextYear = DatePickerObject.themePath+"NextYear.gif"; var datepickerDocument = "" + "" + "" + "" + "" + "" + "
" + "" + "" + "
" + " " + "
" + "
" + "" + "
"; return datepickerDocument; } // Create the bottom DatePicker part function buildBottom() { // Start DatePicker document var datepickerDocument = (isNav?"" + "" + // Stylesheet defines appearance of DatePicker "" + " Date Picker " + "" + "":"") + DatePickerBegin.replace(/{datepickerDocumentTop}/, datepickerDocumentTop); // Get month, and year from global DatePicker date month = DatePickerObject.currentMonth; year = DatePickerObject.currentYear; var date = new Date(); // Get globally-tracked day value (prevents javascript date anomalies) var selectedDay = DatePickerObject.selectedDay; var i = 0; // Determine the number of days in the current month var days = getDaysInMonth(); // If global day value is > than days in month, highlight last day in month if (selectedDay > days) selectedDay = days; // Determine what day of the week the DatePicker starts on var firstOfMonth = new Date (year, month, 1); // Get the day of the week the first day of the month falls on var startingPos = firstOfMonth.getDay() - firstWeekDayIndex; days += startingPos; // Keep track of the columns, start a new row after every 7 columns var columnCount = 0; // Make beginning non-date cells blank for (i = 0; i < startingPos; i++) { datepickerDocument += blankCell; columnCount++; } // Set values for days of the month var currentDay = 0; var dayType = "weekday"; var dayBackground = ""; // Date cells contain a number for (i = startingPos; i < days; i++) { var paddingChar = " "; dayBackground = ""; // Adjust spacing so that all links have relatively equal widths if (i-startingPos+1 < 10) padding = "  "; else padding = " "; // Get the day currently being written currentDay = i-startingPos+1; // Set the type of day, the selected day generally appears as a different color var currentDate = DatePickerObject.selectedDate; if (currentDay == selectedDay && month==currentDate.getMonth() && year==currentDate.getFullYear()) { dayType = "selectedDay"; dayBackground = "selectedDay"; } else if (currentDay == date.getDate() && month==date.getMonth() && year==date.getFullYear()) { dayType = "today"; dayBackground = "today"; } else { dayType = "weekDay"; } // Add the day to the DatePicker string depending on workday or not. if (columnCount % 7 == 0 || columnCount % 7 == 6 ) { datepickerDocument += "" + "" + padding + currentDay + paddingChar + ""; } else { datepickerDocument += "" + "" + padding + currentDay + paddingChar + ""; } columnCount++; // Start a new row when necessary if (columnCount % 7 == 0) datepickerDocument += ""; } // Make remaining non-date cells blank for (i=days; i<(startingPos<0?42+startingPos:42); i++) { datepickerDocument += blankCell; columnCount++; // Start a new row when necessary if (columnCount % 7 == 0) { datepickerDocument += ""; if (i<(startingPos<0?41+startingPos:41)) datepickerDocument += ""; } } // Finish the new DatePicker page datepickerDocument += DatePickerEnd + (isNav?"" + "":""); // Return the completed DatePicker page return datepickerDocument; } // Write the monthly DatePicker to the bottom DatePicker part function writeDatePicker() { // Create the new DatePicker for the selected month & year datepickerDocumentTop = buildTop(); datepickerDocumentBottom = buildBottom(); // Write the new DatePicker to the bottom part disableUnload = true; top.newWinDatePickerObject.document.open(); top.newWinDatePickerObject.document.write(datepickerDocumentBottom); top.newWinDatePickerObject.document.close(); disableUnload = false; } // Set the DatePicker to today's date and display the new DatePicker function setToday() { // Set global date to today's date var date = new Date(); // Set day month and year to today's date DatePickerObject.currentMonth = date.getMonth(); DatePickerObject.currentYear = date.getFullYear(); returnDate(date.getDate()); } // Set the global date to the previous year and redraw the DatePicker function setPreviousYear() { var year = DatePickerObject.currentYear - 1; var date = new Date(); date.setFullYear(year); date = checkDateRange(date); year = date.getFullYear(); DatePickerObject.currentYear = year; writeDatePicker(); } // Set the global date to the previous month and redraw the DatePicker function setPreviousMonth() { var year = DatePickerObject.currentYear; var month = DatePickerObject.currentMonth; // If month is january, set month to december and decrement the year if (month == 0) { month = 11; if (year > 1000) { year--; var date = new Date(); date.setFullYear(year); date = checkDateRange(date); year = date.getFullYear(); DatePickerObject.currentYear = year; } }else { month--; } DatePickerObject.currentMonth = month; writeDatePicker(); } // Set the global date to the next month and redraw the DatePicker function setNextMonth() { var year = DatePickerObject.currentYear; var month = DatePickerObject.currentMonth; // If month is december, set month to january and increment the year if (month == 11) { month = 0; year++; var date = new Date(); date.setFullYear(year); date = checkDateRange(date); year = date.getFullYear(); DatePickerObject.currentYear = year; } else { month++; } DatePickerObject.currentMonth = month; writeDatePicker(); } // Set the global date to the next year and redraw the DatePicker function setNextYear() { var year = DatePickerObject.currentYear + 1; var date = new Date(); date.setFullYear(year); date = checkDateRange(date); year = date.getFullYear(); DatePickerObject.currentYear = year; writeDatePicker(); } // Get number of days in month function getDaysInMonth() { var days; var month = DatePickerObject.currentMonth+1; var year = DatePickerObject.currentYear; // Return 31 days if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) { days=31; } // Return 30 days else if (month==4 || month==6 || month==9 || month==11) { days=30; } // Return 29 days else if (month==2) { if (isLeapYear(year)) { days=29; } // Return 28 days else { days=28; } } return (days); } // Check to see if year is a leap year function isLeapYear (Year) { if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) return true; else return false; } // Set days of the week depending on language function createWeekdayList() { firstWeekDayIndex = 0; newWeekdayArray = new Array(7); newWeekdayList = new Array(7); for (var i=0; i" + newWeekdayArray[i] + ""; } weekdays += ""; // Return table row of weekday abbreviations to display above the DatePicker return weekdays; } // Pre-build portions of the DatePicker (for performance reasons) function buildDatePickerParts() { // Generate weekday headers for the DatePicker weekdays = createWeekdayList(); // Build the blank cell rows blankCell = "   "; // Build the top portion of the DatePicker page using css to control some display elements DatePickerBegin = (isNav?"":"" + "" + // Stylesheet defines appearance of DatePicker "" + " Date Picker " + "" + "") + "
"; // Navigator needs a table container to display the table outlines properly DatePickerBegin += "
{datepickerDocumentTop}
"; // Build weekday headings DatePickerBegin += "" + weekdays + ""; // Build the bottom portion of the DatePicker page DatePickerEnd = ""; // Navigator needs a table container to display the borders properly DatePickerEnd += "
"; // End the table and html document DatePickerEnd += "
" + (isNav?"
":"") + "" + (isNav?"":"") + "" + (isNav?"":"")+ "
" + "" + "
" + (isNav?"":"")+ "
" + ""; } // Set field value to the date selected and close the DatePicker window function returnDate(inDay) { disableEvents = true; // inDay = the day the user clicked on var date = new Date(DatePickerObject.currentYear, DatePickerObject.currentMonth, 1); date.setDate(inDay); if (date) date = checkDateRange(date); // Set the date returned to the user var dateFormat = DatePickerObject.format; var outDate = formatDate(date, parseDateFormat(dateFormat)); // Set the value of the field that was passed to the DatePicker datepickerControl.value = String(outDate).replace(/\s*$/, ""); // Give focus back to the date field datepickerControl.focus(); // Close the DatePicker window top.newWinDatePickerObject.close() top.newWinDatePickerObject = ''; } function UnLoad() { if (disableUnload) return; disableEvents = true; top.newWinDatePickerObject = ''; } //End JS DatePicker