r1026 - branches/1.5.3/ui

r1026 - branches/1.5.3/ui


Author: rdworth
Date: Fri Nov 28 13:13:13 2008
New Revision: 1026
Modified:
branches/1.5.3/ui/ui.datepicker.js
Log:
Applied Datepicker Daylight Saving patch to 1.5.3 branch. Thanks kbwood.
Modified: branches/1.5.3/ui/ui.datepicker.js
==============================================================================
--- branches/1.5.3/ui/ui.datepicker.js    (original)
+++ branches/1.5.3/ui/ui.datepicker.js    Fri Nov 28 13:13:13 2008
@@ -233,12 +233,6 @@
        this._updateDatepicker(inst);
    },
-    /* Tidy up after displaying the date picker. */
-    _inlineShow: function(inst) {
-        var numMonths = this._getNumberOfMonths(inst); // fix width for dynamic
number of date pickers
-        inst.dpDiv.width(numMonths[1] * $('.ui-datepicker',
inst.dpDiv[0]).width());
-    },
-
    /* Pop-up the date picker in a "dialog" box.
     @param input element - ignored
     @param dateText string - the initial date to display (in the current
format)
@@ -688,7 +682,8 @@
        this._selectDate(id, this._formatDate(inst,
            inst.currentDay, inst.currentMonth, inst.currentYear));
        if (this._stayOpen) {
-            inst.rangeStart = new Date(inst.currentYear, inst.currentMonth,
inst.currentDay);
+            inst.rangeStart = this._daylightSavingAdjust(
+                new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
            this._updateDatepicker(inst);
        }
        else if (rangeSelect) {
@@ -766,7 +761,7 @@
     @param date Date - the date to get the week for
     @return number - the number of the week within the year that contains
this date */
    iso8601Week: function(date) {
-        var checkDate = new Date(date.getFullYear(), date.getMonth(),
date.getDate(), (date.getTimezoneOffset() / -60));
+        var checkDate = new Date(date.getFullYear(), date.getMonth(),
date.getDate());
        var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4); // First
week always contains 4 Jan
        var firstDay = firstMon.getDay() || 7; // Day of week: Mon = 1, ..., Sun
= 7
        firstMon.setDate(firstMon.getDate() + 1 - firstDay); // Preceding Monday
@@ -907,7 +902,7 @@
        if (year < 100)
            year += new Date().getFullYear() - new Date().getFullYear() % 100 +
                (year <= shortYearCutoff ? 0 : -100);
-        var date = new Date(year, month - 1, day);
+        var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
        if (date.getFullYear() != year || date.getMonth() + 1 != month ||
date.getDate() != day)
            throw 'Invalid date'; // E.g. 31/02/*
        return date;
@@ -1094,7 +1089,7 @@
    _determineDate: function(date, defaultDate) {
        var offsetNumeric = function(offset) {
            var date = new Date();
-            date.setUTCDate(date.getUTCDate() + offset);
+            date.setDate(date.getDate() + offset);
            return date;
        };
        var offsetString = function(offset, getDaysInMonth) {
@@ -1123,9 +1118,29 @@
            }
            return new Date(year, month, day);
        };
-        return (date == null ? defaultDate :
+        date = (date == null ? defaultDate :
            (typeof date == 'string' ? offsetString(date, this._getDaysInMonth) :
-            (typeof date == 'number' ? offsetNumeric(date) : date)));
+            (typeof date == 'number' ? (isNaN(date) ? defaultDate :
offsetNumeric(date)) : date)));
+        date = (date && date.toString() == 'Invalid Date' ? defaultDate : date);
+        if (date) {
+            date.setHours(0);
+            date.setMinutes(0);
+            date.setSeconds(0);
+            date.setMilliseconds(0);
+        }
+        return this._daylightSavingAdjust(date);
+    },
+
+    /* Handle switch to/from daylight saving.
+     Hours may be non-zero on daylight saving cut-over:
+     > 12 when midnight changeover, but then cannot generate
+     midnight datetime, so jump to 1AM, otherwise reset.
+     @param date (Date) the date to check
+     @return (Date) the corrected date */
+    _daylightSavingAdjust: function(date) {
+        if (!date) return null;
+        date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+        return date;
    },
    /* Set the date(s) directly. */
@@ -1157,10 +1172,12 @@
    /* Retrieve the date(s) directly. */
    _getDate: function(inst) {
        var startDate = (!inst.currentYear || (inst.input && inst.input.val()
== '') ? null :
-            new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
+            this._daylightSavingAdjust(new Date(
+            inst.currentYear, inst.currentMonth, inst.currentDay)));
        if (this._get(inst, 'rangeSelect')) {
-            return [inst.rangeStart || startDate, (!inst.endYear ? null :
-                new Date(inst.endYear, inst.endMonth, inst.endDay))];
+            return [inst.rangeStart || startDate,
+                (!inst.endYear ? inst.rangeStart || startDate :
+                this._daylightSavingAdjust(new Date(inst.endYear, inst.endMonth,
inst.endDay)))];
        } else
            return startDate;
    },
@@ -1168,7 +1185,8 @@
    /* Generate the HTML for the current state of the date picker. */
    _generateDatepicker: function(inst) {
        var today = new Date();
-        today = new Date(today.getFullYear(), today.getMonth(),
today.getDate()); // clear time
+        today = this._daylightSavingAdjust(
+            new Date(today.getFullYear(), today.getMonth(), today.getDate())); //
clear time
        var showStatus = this._get(inst, 'showStatus');
        var isRTL = this._get(inst, 'isRTL');
        // build the date picker HTML
@@ -1187,17 +1205,17 @@
        var numMonths = this._getNumberOfMonths(inst);
        var stepMonths = this._get(inst, 'stepMonths');
        var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
-        var currentDate = (!inst.currentDay ? new Date(9999, 9, 9) :
-            new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
+        var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new
Date(9999, 9, 9) :
+            new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
        var minDate = this._getMinMaxDate(inst, 'min', true);
        var maxDate = this._getMinMaxDate(inst, 'max');
        var drawMonth = inst.drawMonth;
        var drawYear = inst.drawYear;
        if (maxDate) {
-            var maxDraw = new Date(maxDate.getFullYear(),
-                maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate());
+            var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+                maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate()));
            maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
-            while (new Date(drawYear, drawMonth, 1) > maxDraw) {
+            while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) >
maxDraw) {
                drawMonth--;
                if (drawMonth < 0) {
                    drawMonth = 11;
@@ -1207,15 +1225,17 @@
        }
        // controls and links
        var prevText = this._get(inst, 'prevText');
-        prevText = (!navigationAsDateFormat ? prevText : this.formatDate(
-            prevText, new Date(drawYear, drawMonth - stepMonths, 1),
this._getFormatConfig(inst)));
+        prevText = (!navigationAsDateFormat ? prevText :
this.formatDate(prevText,
+            this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths,
1)),
+            this._getFormatConfig(inst)));
        var prev = '<div class="ui-datepicker-prev">' +
(this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
            '<a onclick="jQuery.datepicker._adjustDate(\'#' + inst.id + '\', -' +
stepMonths + ', \'M\');"' +
            (showStatus ? this._addStatus(inst, this._get(inst, 'prevStatus') |
| '&#xa0;') : '') + '>' + prevText + '</a>' :
            (hideIfNoPrevNext ? '' : '<label>' + prevText + '</label>')) + '</div>';
        var nextText = this._get(inst, 'nextText');
-        nextText = (!navigationAsDateFormat ? nextText : this.formatDate(
-            nextText, new Date(drawYear, drawMonth + stepMonths, 1),
this._getFormatConfig(inst)));
+        nextText = (!navigationAsDateFormat ? nextText :
this.formatDate(nextText,
+            this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths,
1)),
+            this._getFormatConfig(inst)));
        var next = '<div class="ui-datepicker-next">' +
(this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
            '<a onclick="jQuery.datepicker._adjustDate(\'#' + inst.id + '\', +' +
stepMonths + ', \'M\');"' +
            (showStatus ? this._addStatus(inst, this._get(inst, 'nextStatus') |
| '&#xa0;') : '') + '>' + nextText + '</a>' :
@@ -1244,10 +1264,11 @@
        var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
        var status = (showStatus ? this._get(inst, 'dayStatus') |
| '&#xa0;' : '');
        var dateStatus = this._get(inst, 'statusForDate') || this.dateStatus;
-        var endDate = inst.endDay ? new Date(inst.endYear, inst.endMonth,
inst.endDay) : currentDate;
+        var endDate = inst.endDay ? this._daylightSavingAdjust(
+            new Date(inst.endYear, inst.endMonth, inst.endDay)) : currentDate;
        for (var row = 0; row < numMonths[0]; row++)
            for (var col = 0; col < numMonths[1]; col++) {
-                var selectedDate = new Date(drawYear, drawMonth, inst.selectedDay);
+                var selectedDate = this._daylightSavingAdjust(new Date(drawYear,
drawMonth, inst.selectedDay));
                html += '<div class="ui-datepicker-one-month' + (col == 0 ? '
ui-datepicker-new-row' : '') + '">' +
                    this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate,
maxDate,
                    selectedDate, row > 0 || col > 0, showStatus, monthNames) + // draw
month headers
@@ -1269,8 +1290,8 @@
                if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
                    inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
                var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) -
firstDay + 7) % 7;
-                var printDate = new Date(drawYear, drawMonth, 1 - leadDays);
                var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) /
7)); // calculate the number of rows to generate
+                var printDate = this._daylightSavingAdjust(new Date(drawYear,
drawMonth, 1 - leadDays));
                for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
                    html += '<tr class="ui-datepicker-days-row">' +
                        (showWeeks ? '<td class="ui-datepicker-week-col">' +
calculateWeek(printDate) + '</td>' : '');
@@ -1305,7 +1326,8 @@
                            inst.id + '\',' + drawMonth + ',' + drawYear + ', this);"') + '>' +
// actions
                            (otherMonth ? (showOtherMonths ? printDate.getDate() : '&#xa0;') :
// display for other months
                            (unselectable ? printDate.getDate() : '<a>' + printDate.getDate()
+ '</a>')) + '</td>'; // display for this month
-                        printDate.setUTCDate(printDate.getUTCDate() + 1);
+                        printDate.setDate(printDate.getDate() + 1);
+                        printDate = this._daylightSavingAdjust(printDate);
                    }
                    html += '</tr>';
                }
@@ -1397,7 +1419,7 @@
        var month = inst.drawMonth + (period == 'M' ? offset : 0);
        var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
            (period == 'D' ? offset : 0);
-        var date = new Date(year, month, day);
+        var date = this._daylightSavingAdjust(new Date(year, month, day));
        // ensure it is within the bounds set
        var minDate = this._getMinMaxDate(inst, 'min', true);
        var maxDate = this._getMinMaxDate(inst, 'max');
@@ -1427,12 +1449,6 @@
    /* Determine the current maximum date - ensure no time components are set
- may be overridden for a range. */
    _getMinMaxDate: function(inst, minMax, checkRange) {
        var date = this._determineDate(this._get(inst, minMax + 'Date'), null);
-        if (date) {
-            date.setHours(0);
-            date.setMinutes(0);
-            date.setSeconds(0);
-            date.setMilliseconds(0);
-        }
        return (!checkRange || !inst.rangeStart ? date :
            (!date || inst.rangeStart > date ? inst.rangeStart : date));
    },
@@ -1450,7 +1466,8 @@
    /* Determines if we should allow a "next/prev" month display change. */
    _canAdjustMonth: function(inst, offset, curYear, curMonth) {
        var numMonths = this._getNumberOfMonths(inst);
-        var date = new Date(curYear, curMonth + (offset < 0 ? offset :
numMonths[1]), 1);
+        var date = this._daylightSavingAdjust(new Date(
+            curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1));
        if (offset < 0)
            date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
        return this._isInRange(inst, date);
@@ -1459,8 +1476,8 @@
    /* Is the given date in the accepted range? */
    _isInRange: function(inst, date) {
        // during range selection, use minimum of selected date and range start
-        var newMinDate = (!inst.rangeStart ? null :
-            new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay));
+        var newMinDate = (!inst.rangeStart ? null : this._daylightSavingAdjust(
+            new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay)));
        newMinDate = (newMinDate && inst.rangeStart < newMinDate ?
inst.rangeStart : newMinDate);
        var minDate = newMinDate || this._getMinMaxDate(inst, 'min');
        var maxDate = this._getMinMaxDate(inst, 'max');
@@ -1484,8 +1501,9 @@
            inst.currentMonth = inst.selectedMonth;
            inst.currentYear = inst.selectedYear;
        }
-        var date = (day ? (typeof day == 'object' ? day : new Date(year, month,
day)) :
-            new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
+        var date = (day ? (typeof day == 'object' ? day :
+            this._daylightSavingAdjust(new Date(year, month, day))) :
+            this._daylightSavingAdjust(new Date(inst.currentYear,
inst.currentMonth, inst.currentDay)));
        return this.formatDate(this._get(inst, 'dateFormat'), date,
this._getFormatConfig(inst));
    }
});