📄 ui.calendar.js
字号:
/* Parse existing date and initialise calendar. */
_setDateFromField: function(input) {
this._input = $(input);
var dateFormat = this._get('dateFormat');
var currentDate = this._input.val().split(dateFormat.charAt(3));
if (currentDate.length == 3) {
this._currentDay = parseInt(currentDate[dateFormat.indexOf('D')], 10);
this._currentMonth = parseInt(currentDate[dateFormat.indexOf('M')], 10) - 1;
this._currentYear = parseInt(currentDate[dateFormat.indexOf('Y')], 10);
}
else {
var date = this._getDefaultDate();
this._currentDay = date.getDate();
this._currentMonth = date.getMonth();
this._currentYear = date.getFullYear();
}
this._selectedDay = this._currentDay;
this._selectedMonth = this._currentMonth;
this._selectedYear = this._currentYear;
this._adjustDate();
},
/* Retrieve the default date shown on opening. */
_getDefaultDate: function() {
var offsetDate = function(offset) {
var date = new Date();
date.setDate(date.getDate() + offset);
return date;
};
var defaultDate = this._get('defaultDate');
return (defaultDate == null ? new Date() :
(typeof defaultDate == 'number' ? offsetDate(defaultDate) : defaultDate));
},
/* Set the date directly. */
_setDate: function(date) {
this._selectedDay = this._currentDay = date.getDate();
this._selectedMonth = this._currentMonth = date.getMonth();
this._selectedYear = this._currentYear = date.getFullYear();
this._adjustDate();
},
/* Retrieve the date directly. */
_getDate: function() {
return new Date(this._currentYear, this._currentMonth, this._currentDay);
},
/* Generate the HTML for the current state of the calendar. */
_generateCalendar: function() {
var today = new Date();
today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); // clear time
// build the calendar HTML
var controls = '<div class="calendar_control">' +
'<a class="calendar_clear" onclick="popUpCal._clearDate(' + this._id + ');">' +
this._get('clearText') + '</a>' +
'<a class="calendar_close" onclick="popUpCal.hideCalendar(' + this._id + ');">' +
this._get('closeText') + '</a></div>';
var prompt = this._get('prompt');
var closeAtTop = this._get('closeAtTop');
var hideIfNoPrevNext = this._get('hideIfNoPrevNext');
// controls and links
var html = (prompt ? '<div class="calendar_prompt">' + prompt + '</div>' : '') +
(closeAtTop && !this._inline ? controls : '') + '<div class="calendar_links">' +
(this._canAdjustMonth(-1) ? '<a class="calendar_prev" ' +
'onclick="popUpCal._adjustDate(' + this._id + ', -1, \'M\');">' + this._get('prevText') + '</a>' :
(hideIfNoPrevNext ? '' : '<label class="calendar_prev">' + this._get('prevText') + '</label>')) +
(this._isInRange(today) ? '<a class="calendar_current" ' +
'onclick="popUpCal._gotoToday(' + this._id + ');">' + this._get('currentText') + '</a>' : '') +
(this._canAdjustMonth(+1) ? '<a class="calendar_next" ' +
'onclick="popUpCal._adjustDate(' + this._id + ', +1, \'M\');">' + this._get('nextText') + '</a>' :
(hideIfNoPrevNext ? '' : '<label class="calendar_next">' + this._get('nextText') + '</label>')) +
'</div><div class="calendar_header">';
var minDate = this._get('minDate');
var maxDate = this._get('maxDate');
// month selection
var monthNames = this._get('monthNames');
if (!this._get('changeMonth')) {
html += monthNames[this._selectedMonth] + ' ';
}
else {
var inMinYear = (minDate && minDate.getFullYear() == this._selectedYear);
var inMaxYear = (maxDate && maxDate.getFullYear() == this._selectedYear);
html += '<select class="calendar_newMonth" ' +
'onchange="popUpCal._selectMonthYear(' + this._id + ', this, \'M\');" ' +
'onclick="popUpCal._clickMonthYear(' + this._id + ');">';
for (var month = 0; month < 12; month++) {
if ((!inMinYear || month >= minDate.getMonth()) &&
(!inMaxYear || month <= maxDate.getMonth())) {
html += '<option value="' + month + '"' +
(month == this._selectedMonth ? ' selected="selected"' : '') +
'>' + monthNames[month] + '</option>';
}
}
html += '</select>';
}
// year selection
if (!this._get('changeYear')) {
html += this._selectedYear;
}
else {
// determine range of years to display
var years = this._get('yearRange').split(':');
var year = 0;
var endYear = 0;
if (years.length != 2) {
year = this._selectedYear - 10;
endYear = this._selectedYear + 10;
}
else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') {
year = this._selectedYear + parseInt(years[0], 10);
endYear = this._selectedYear + parseInt(years[1], 10);
}
else {
year = parseInt(years[0], 10);
endYear = parseInt(years[1], 10);
}
year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
html += '<select class="calendar_newYear" onchange="popUpCal._selectMonthYear(' +
this._id + ', this, \'Y\');" ' + 'onclick="popUpCal._clickMonthYear(' +
this._id + ');">';
for (; year <= endYear; year++) {
html += '<option value="' + year + '"' +
(year == this._selectedYear ? ' selected="selected"' : '') +
'>' + year + '</option>';
}
html += '</select>';
}
html += '</div><table class="calendar" cellpadding="0" cellspacing="0"><thead>' +
'<tr class="calendar_titleRow">';
var firstDay = this._get('firstDay');
var changeFirstDay = this._get('changeFirstDay');
var dayNames = this._get('dayNames');
for (var dow = 0; dow < 7; dow++) { // days of the week
html += '<td>' + (!changeFirstDay ? '' : '<a onclick="popUpCal._changeFirstDay(' +
this._id + ', this);">') + dayNames[(dow + firstDay) % 7] +
(changeFirstDay ? '</a>' : '') + '</td>';
}
html += '</tr></thead><tbody>';
var daysInMonth = this._getDaysInMonth(this._selectedYear, this._selectedMonth);
this._selectedDay = Math.min(this._selectedDay, daysInMonth);
var leadDays = (this._getFirstDayOfMonth(this._selectedYear, this._selectedMonth) - firstDay + 7) % 7;
var currentDate = new Date(this._currentYear, this._currentMonth, this._currentDay);
var selectedDate = new Date(this._selectedYear, this._selectedMonth, this._selectedDay);
var printDate = new Date(this._selectedYear, this._selectedMonth, 1 - leadDays);
var numRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
var customDate = this._get('customDate');
var showOtherMonths = this._get('showOtherMonths');
for (var row = 0; row < numRows; row++) { // create calendar rows
html += '<tr class="calendar_daysRow">';
for (var dow = 0; dow < 7; dow++) { // create calendar days
var customSettings = (customDate ? customDate(printDate) : [true, '']);
var otherMonth = (printDate.getMonth() != this._selectedMonth);
var unselectable = otherMonth || !customSettings[0] ||
(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
html += '<td class="calendar_daysCell' +
((dow + firstDay + 6) % 7 >= 5 ? ' calendar_weekEndCell' : '') + // highlight weekends
(otherMonth ? ' calendar_otherMonth' : '') + // highlight days from other months
(printDate.getTime() == selectedDate.getTime() ? ' calendar_daysCellOver' : '') + // highlight selected day
(unselectable ? ' calendar_unselectable' : '') + // highlight unselectable days
(otherMonth && !showOtherMonths ? '' : ' ' + customSettings[1] + // highlight custom dates
(printDate.getTime() == currentDate.getTime() ? ' calendar_currentDay' : // highlight current day
(printDate.getTime() == today.getTime() ? ' calendar_today' : ''))) + '"' + // highlight today (if different)
(unselectable ? '' : ' onmouseover="$(this).addClass(\'calendar_daysCellOver\');"' +
' onmouseout="$(this).removeClass(\'calendar_daysCellOver\');"' +
' onclick="popUpCal._selectDay(' + this._id + ', this);"') + '>' + // actions
(otherMonth ? (showOtherMonths ? printDate.getDate() : ' ') : // display for other months
(unselectable ? printDate.getDate() : '<a>' + printDate.getDate() + '</a>')) + '</td>'; // display for this month
printDate.setDate(printDate.getDate() + 1);
}
html += '</tr>';
}
html += '</tbody></table>' + (!closeAtTop && !this._inline ? controls : '') +
'<div style="clear: both;"></div>' + (!$.browser.msie ? '' :
'<!--[if lte IE 6.5]><iframe src="javascript:false;" class="calendar_cover"></iframe><![endif]-->');
return html;
},
/* Adjust one of the date sub-fields. */
_adjustDate: function(offset, period) {
var date = new Date(this._selectedYear + (period == 'Y' ? offset : 0),
this._selectedMonth + (period == 'M' ? offset : 0),
this._selectedDay + (period == 'D' ? offset : 0));
// ensure it is within the bounds set
var minDate = this._get('minDate');
var maxDate = this._get('maxDate');
date = (minDate && date < minDate ? minDate : date);
date = (maxDate && date > maxDate ? maxDate : date);
this._selectedDay = date.getDate();
this._selectedMonth = date.getMonth();
this._selectedYear = date.getFullYear();
},
/* Find the number of days in a given month. */
_getDaysInMonth: function(year, month) {
return 32 - new Date(year, month, 32).getDate();
},
/* Find the day of the week of the first of a month. */
_getFirstDayOfMonth: function(year, month) {
return new Date(year, month, 1).getDay();
},
/* Determines if we should allow a "next/prev" month display change. */
_canAdjustMonth: function(offset) {
var date = new Date(this._selectedYear, this._selectedMonth + offset, 1);
if (offset < 0) {
date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
}
return this._isInRange(date);
},
/* Is the given date in the accepted range? */
_isInRange: function(date) {
var minDate = this._get('minDate');
var maxDate = this._get('maxDate');
return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate));
},
/* Format the given date for display. */
_formatDate: function() {
var day = this._currentDay = this._selectedDay;
var month = this._currentMonth = this._selectedMonth;
var year = this._currentYear = this._selectedYear;
month++; // adjust javascript month
var dateFormat = this._get('dateFormat');
var dateString = '';
for (var i = 0; i < 3; i++) {
dateString += dateFormat.charAt(3) +
(dateFormat.charAt(i) == 'D' ? (day < 10 ? '0' : '') + day :
(dateFormat.charAt(i) == 'M' ? (month < 10 ? '0' : '') + month :
(dateFormat.charAt(i) == 'Y' ? year : '?')));
}
return dateString.substring(dateFormat.charAt(3) ? 1 : 0);
}
});
/* jQuery extend now ignores nulls! */
function extendRemove(target, props) {
$.extend(target, props);
for (var name in props) {
if (props[name] == null) {
target[name] = null;
}
}
return target;
}
/* Attach the calendar to a jQuery selection.
@param settings object - the new settings to use for this calendar instance (anonymous)
@return jQuery object - for chaining further calls */
$.fn.calendar = function(settings) {
return this.each(function() {
// check for settings on the control itself - in namespace 'cal:'
var inlineSettings = null;
for (attrName in popUpCal._defaults) {
var attrValue = this.getAttribute('cal:' + attrName);
if (attrValue) {
inlineSettings = inlineSettings || {};
try {
inlineSettings[attrName] = eval(attrValue);
}
catch (err) {
inlineSettings[attrName] = attrValue;
}
}
}
var nodeName = this.nodeName.toLowerCase();
if (nodeName == 'input') {
var instSettings = (inlineSettings ? $.extend($.extend({}, settings || {}),
inlineSettings || {}) : settings); // clone and customise
var inst = (inst && !inlineSettings ? inst :
new PopUpCalInstance(instSettings, false));
popUpCal._connectCalendar(this, inst);
}
else if (nodeName == 'div' || nodeName == 'span') {
var instSettings = $.extend($.extend({}, settings || {}),
inlineSettings || {}); // clone and customise
var inst = new PopUpCalInstance(instSettings, true);
popUpCal._inlineCalendar(this, inst);
}
});
};
/* Initialise the calendar. */
$(document).ready(function() {
popUpCal = new PopUpCal(); // singleton instance
});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -