/* * Date picker plugin for jQuery * http://kelvinluck.com/assets/jquery/datePicker * * Copyright (c) 2006 Kelvin Luck (kelvnluck.com) * Licensed under the MIT License: * http://www.opensource.org/licenses/mit-license.php * * $LastChangedDate: 2007-01-25 00:02:57 +0000 (Thu, 25 Jan 2007) $ * $Rev: 1190 $ */ jQuery.datePicker = function() { // so that firebug console.log statements don't break IE if (window.console == undefined) { window.console = {log:function(){}}; } var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; var navLinks = {p:'Prev', n:'Next', c:'Close', b:'Choose date'}; var dateFormat = 'dmy'; var dateSeparator = "/"; var _firstDayOfWeek; var _firstDate; var _lastDate; var _selectedDate; var _openCal; var _zeroPad = function(num) { var s = '0'+num; return s.substring(s.length-2); }; var _strToDate = function(dIn) { switch (dateFormat) { case 'ymd': dParts = dIn.split(dateSeparator); return new Date(dParts[0], Number(dParts[1])-1, dParts[2]); case 'dmy': dParts = dIn.split(dateSeparator); return new Date(dParts[2], Number(dParts[1])-1, Number(dParts[0])); case 'dmmy': dParts = dIn.split(dateSeparator); for (var m=0; m<12; m++) { if (dParts[1].toLowerCase() == months[m].substr(0,3).toLowerCase()) { return new Date(Number(dParts[2]), m, Number(dParts[0])); } } return undefined; case 'mdy': default: var parts = parts ? parts : [2, 1, 0]; dParts = dIn.split(dateSeparator); return new Date(dParts[2], Number(dParts[0])-1, Number(dParts[1])); } }; var _dateToStr = function(d) { var dY = d.getFullYear(); var dM = _zeroPad(d.getMonth()+1); var dD = _zeroPad(d.getDate()); switch (dateFormat) { case 'ymd': return dY + dateSeparator + dM + dateSeparator + dD; case 'dmy': return dD + dateSeparator + dM + dateSeparator + dY; case 'dmmy': return dD + dateSeparator + months[d.getMonth()].substr(0,3) + dateSeparator + dY; case 'mdy': default: return dM + dateSeparator + dD + dateSeparator + dY; } }; var _getMonthCalendarDiv = function(dIn) { var today = new Date(); if (dIn == undefined) { // start from this month. d = new Date(today.getFullYear(), today.getMonth(), 1); } else { // start from the passed in date d = dIn; d.setDate(1); } // check that date is within allowed limits: if ((d.getMonth() < _firstDate.getMonth() && d.getFullYear() == _firstDate.getFullYear()) || d.getFullYear() < _firstDate.getFullYear()) { d = new Date(_firstDate.getFullYear(), _firstDate.getMonth(), 1);; } else if ((d.getMonth() > _lastDate.getMonth() && d.getFullYear() == _lastDate.getFullYear()) || d.getFullYear() > _lastDate.getFullYear()) { d = new Date(_lastDate.getFullYear(), _lastDate.getMonth(), 1);; } var jCalDiv = jQuery("
").attr('class','popup-calendar'); var firstMonth = true; var firstDate = _firstDate.getDate(); // create prev and next links var navLinksDiv = ''; var prevLinkDiv = ''; if (!(d.getMonth() == _firstDate.getMonth() && d.getFullYear() == _firstDate.getFullYear())) { // not in first display month so show a previous link firstMonth = false; var lastMonth = new Date(d.getFullYear()-1, d.getMonth(), 1); var prevLink = jQuery("").attr('href', 'javascript:;').html(navLinks.p).click(function() { jQuery.datePicker.changeYear(lastMonth, this); return false; }); prevLinkDiv = jQuery("
").attr('class','link-prev').html('').append(prevLink); } var finalMonth = true; var lastDate = _lastDate.getDate(); nextLinkDiv = ''; if (!(d.getMonth() == _lastDate.getMonth() && d.getFullYear() == _lastDate.getFullYear())) { // in the last month - no next link finalMonth = false; var nextMonth = new Date(d.getFullYear()+1, d.getMonth(), 1); var nextLink = jQuery("").attr('href', 'javascript:;').html(navLinks.n).click(function() { jQuery.datePicker.changeYear(nextMonth, this); return false; }); nextLinkDiv = jQuery("
").attr('class','link-next').html('').prepend(nextLink); } navLinksDiv = jQuery("
").attr('class','div-navigation').append(prevLinkDiv).append(nextLinkDiv); var theFullDate = d.getFullYear(); var fullMonthLink = jQuery("").attr('href','javascript:;').html(theFullDate); var closeLink = jQuery("").attr('href','javascript:;').html(navLinks.c).click(function() { jQuery.datePicker.closeCalendar(); }); jCalDiv.append( jQuery("

").attr('class', 'fulldate').append(fullMonthLink), jQuery("
").attr('class', 'link-close').append(closeLink) ); var headRow = jQuery(""); for (var i=_firstDayOfWeek; i<_firstDayOfWeek+4; i++) { headRow.append( jQuery("").attr('class','weekday') ); } var tBody = jQuery(""); var curMonth = 0; var curYear = d.getYear(); var todayMonth = (new Date()).getMonth(); var todayYear = (new Date()).getYear(); var thisMonth = d.getMonth() == today.getMonth() && d.getFullYear() == today.getFullYear(); var w = 0; while (w++<3) { var thisRow = jQuery(""); for (var i=0; i<4; i++) { var weekday = (_firstDayOfWeek + i) % 4; var atts = {'class':(weekday == 0 ? 'month lastmonth ' : 'month ')}; d.setDate(1); d.setMonth(curMonth); var dStr = _dateToStr(d); var mStr = months[curMonth].substring(0,3); if (curMonth < _firstDate.getMonth() && curYear == _firstDate.getYear()) { dayStr = jQuery("").attr('class', 'inactive').html(mStr); atts['class'] += 'month inactive'; } else if (curMonth > _lastDate.getMonth() && curYear == _lastDate.getYear()) { dayStr = jQuery("").attr('class', 'inactive').html(mStr); atts['class'] += 'month'; } else { dayStr = jQuery("").attr({'href':'javascript:;', 'rel':d}).html(mStr).click(function(e) { jQuery.datePicker.changeMonth(new Date(jQuery.attr(this, 'rel')), null); return false; })[0]; if (_selectedDate && _selectedDate==dStr) { jQuery(dayStr).attr('class', 'selected'); } } if (curMonth == todayMonth && curYear == todayYear) { atts['class'] += 'today'; } thisRow.append(jQuery("").attr(atts).append(dayStr)); curMonth++; } tBody.append(thisRow); } var verticalSpacer = jQuery("
").attr('class', 'vertical-spacer'); jCalDiv.append( jQuery("").attr('cellspacing',2).append("") .find("thead").append(headRow).parent().append(tBody.children()) ).append(verticalSpacer).append(navLinksDiv); if (jQuery.browser.msie) { // we put a styled iframe behind the calendar so HTML SELECT elements don't show through var iframe = [ '