diff --git a/ui/ui.datepicker.js b/ui/ui.datepicker.js
index 26d04bec9..dc54dd94d 100644
--- a/ui/ui.datepicker.js
+++ b/ui/ui.datepicker.js
@@ -251,12 +251,6 @@ $.extend(Datepicker.prototype, {
this._updateAlternate(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)
@@ -815,7 +809,8 @@ $.extend(Datepicker.prototype, {
this._selectDate(id, this._formatDate(inst,
inst.currentDay, inst.currentMonth, inst.currentYear));
if (inst.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) {
@@ -893,8 +888,7 @@ $.extend(Datepicker.prototype, {
@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
@@ -1051,7 +1045,7 @@ $.extend(Datepicker.prototype, {
day -= dim;
} while (true);
}
- 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;
@@ -1250,7 +1244,7 @@ $.extend(Datepicker.prototype, {
_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) {
@@ -1289,9 +1283,21 @@ $.extend(Datepicker.prototype, {
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. */
_setDate: function(inst, date, endDate) {
var clear = !(date);
@@ -1325,11 +1331,12 @@ $.extend(Datepicker.prototype, {
/* 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 ? inst.rangeStart || startDate :
- new Date(inst.endYear, inst.endMonth, inst.endDay))];
+ this._daylightSavingAdjust(new Date(inst.endYear, inst.endMonth, inst.endDay)))];
} else
return startDate;
},
@@ -1337,7 +1344,8 @@ $.extend(Datepicker.prototype, {
/* Generate the HTML for the current state of the date picker. */
_generateHTML: 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 initStatus = this._get(inst, 'initStatus') || ' ';
var isRTL = this._get(inst, 'isRTL');
@@ -1360,8 +1368,8 @@ $.extend(Datepicker.prototype, {
var stepMonths = this._get(inst, 'stepMonths');
var stepBigMonths = this._get(inst, 'stepBigMonths');
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 - showCurrentAtPos;
@@ -1371,10 +1379,10 @@ $.extend(Datepicker.prototype, {
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;
@@ -1384,11 +1392,13 @@ $.extend(Datepicker.prototype, {
}
// 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 prevBigText = (showBigPrevNext ? this._get(inst, 'prevBigText') : '');
- prevBigText = (!navigationAsDateFormat ? prevBigText : this.formatDate(
- prevBigText, new Date(drawYear, drawMonth - stepBigMonths, 1), this._getFormatConfig(inst)));
+ prevBigText = (!navigationAsDateFormat ? prevBigText : this.formatDate(prevBigText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepBigMonths, 1)),
+ this._getFormatConfig(inst)));
var prev = '
' + (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
(showBigPrevNext ? '
' + prevBigText + ' ' : '') +
@@ -1397,11 +1407,13 @@ $.extend(Datepicker.prototype, {
(hideIfNoPrevNext ? '' : (showBigPrevNext ? '
' + prevBigText + ' ' : '') +
'
' + prevText + ' ')) + '
';
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 nextBigText = (showBigPrevNext ? this._get(inst, 'nextBigText') : '');
- nextBigText = (!navigationAsDateFormat ? nextBigText : this.formatDate(
- nextBigText, new Date(drawYear, drawMonth + stepBigMonths, 1), this._getFormatConfig(inst)));
+ nextBigText = (!navigationAsDateFormat ? nextBigText : this.formatDate(nextBigText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepBigMonths, 1)),
+ this._getFormatConfig(inst)));
var next = '' + (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
'
' + nextText + ' ' +
@@ -1413,13 +1425,13 @@ $.extend(Datepicker.prototype, {
var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
currentText = (!navigationAsDateFormat ? currentText :
this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
- var html = (prompt ? '
' + prompt + '
' : '') +
- (closeAtTop && !inst.inline ? controls : '') +
+ var html = (closeAtTop && !inst.inline ? controls : '') +
'
' + (isRTL ? next : prev) +
(this._isInRange(inst, gotoDate) ? '
' : '') + (isRTL ? prev : next) + '
';
+ currentText + '
' : '') + (isRTL ? prev : next) + '' +
+ (prompt ? '' + prompt + '
' : '');
var firstDay = this._get(inst, 'firstDay');
var changeFirstDay = this._get(inst, 'changeFirstDay');
var dayNames = this._get(inst, 'dayNames');
@@ -1434,11 +1446,12 @@ $.extend(Datepicker.prototype, {
var weekStatus = this._get(inst, 'weekStatus');
var status = (showStatus ? this._get(inst, 'dayStatus') || initStatus : '');
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;
var defaultDate = this._getDefaultDate(inst);
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 += '' +
this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
selectedDate, row > 0 || col > 0, showStatus, initStatus, monthNames) + // draw month headers
@@ -1461,10 +1474,8 @@ $.extend(Datepicker.prototype, {
if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
- var tzDate = new Date(drawYear, drawMonth, 1 - leadDays);
- var utcDate = new Date(drawYear, drawMonth, 1 - leadDays);
- var printDate = utcDate;
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 += '
' +
(showWeeks ? '' + // actions
(otherMonth ? (showOtherMonths ? printDate.getDate() : ' ') : // display for other months
(unselectable ? printDate.getDate() : '' + printDate.getDate() + ' ')) + ' '; // display for this month
- tzDate.setDate(tzDate.getDate() + 1);
- utcDate.setUTCDate(utcDate.getUTCDate() + 1);
- printDate = (tzDate > utcDate ? tzDate : utcDate);
+ printDate.setDate(printDate.getDate() + 1);
+ printDate = this._daylightSavingAdjust(printDate);
}
html += ' ';
}
@@ -1555,7 +1565,7 @@ $.extend(Datepicker.prototype, {
monthHtml += '';
}
if (!showMonthAfterYear)
- html += monthHtml + (changeMonth && changeYear ? '' : ' ');
+ html += monthHtml + (secondary || changeMonth || changeYear ? ' ' : '');
// year selection
if (secondary || !changeYear)
html += drawYear;
@@ -1589,7 +1599,7 @@ $.extend(Datepicker.prototype, {
html += '';
}
if (showMonthAfterYear)
- html += (changeMonth && changeYear ? '' : ' ') + monthHtml;
+ html += (secondary || changeMonth || changeYear ? ' ' : '') + monthHtml;
html += '
'; // Close datepicker_header
return html;
},
@@ -1608,7 +1618,7 @@ $.extend(Datepicker.prototype, {
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');
@@ -1638,12 +1648,6 @@ $.extend(Datepicker.prototype, {
/* 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));
},
@@ -1661,7 +1665,8 @@ $.extend(Datepicker.prototype, {
/* 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);
@@ -1670,8 +1675,8 @@ $.extend(Datepicker.prototype, {
/* 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');
@@ -1695,8 +1700,9 @@ $.extend(Datepicker.prototype, {
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));
}
});