').appendTo($tfoot);
//tbody - 确定与取消
_createCell($row, I18N["OK"], 4, NAV['mok'], 'ok');
return $table;
},
/**
* Create a table containing the buttons.
* @return {jQuery}
* @private
*/
_createButtonPane = function () {
var $buttonpane = $('
');
var $row = $('
');
// clear button
_createCell($row, I18N["CLEAR"], null, NAV['clear'], 'clear');
// today button
_createCell($row, I18N["TODAY"], null, NAV['today'], 'today');
// ok button
_createCell($row, I18N["OK"], null, NAV['dok'], 'ok');
$row.appendTo($buttonpane);
return $buttonpane;
},
/**
* go to prev month
* @private
*/
_toPrevMonth = function () {
var sd = options.startDate, date = options.date;
var month = cache.showMonth,
year = cache.showYear;
if (!sd) {
if (month > 0) {
_setMonth(month - 1);
} else {
date.setFullYear(year - 1);
_setMonth(11);
}
return;
}
if (year > sd.getFullYear()) {
if (month > 0) {
_setMonth(month - 1);
} else {
date.setFullYear(year - 1);
_setMonth(11);
}
} else if (year == sd.getFullYear()) {
if (month > sd.getMonth() && month > 0) {
_setMonth(month - 1);
if (date < sd) {
options.date = new Date(sd);
}
}
}
},
/**
* go to next month
* @private
*/
_toNextMonth = function () {
var edd = options.endDate, date = options.date;
var month = cache.showMonth,
year = cache.showYear;
if (!edd) {
if (month < 11) {
_setMonth(month + 1);
} else {
date.setFullYear(year + 1);
_setMonth(0);
}
return;
}
if (year < edd.getFullYear()) {
if (month < 11) {
_setMonth(month + 1);
} else {
date.setFullYear(year + 1);
_setMonth(0);
}
} else if (year == edd.getFullYear()) {
if (month < edd.getMonth()) {
_setMonth(month + 1);
if (date > edd) {
options.date = new Date(edd);
}
}
}
},
/**
* go to prev 10 years
* @private
*/
_toPrevDecade = function () {
var sd = options.startDate, date = options.date;
var year = date.getFullYear() - 10, month = date.getMonth();
var minMonth, minYear;
if (sd && year == (minYear = sd.getFullYear())) {
minMonth = sd.getMonth();
}
if (!minYear || minYear < CONSTS.MINYEAR) {
minYear = CONSTS.MINYEAR;
}
if (year < minYear) {
date.setFullYear(minYear);
if (month < minMonth) {
date.setMonth(minMonth);
}
} else {
date.setFullYear(year);
}
},
/**
* go to next 10 years
* @private
*/
_toNextDecade = function () {
var edd = options.endDate, date = options.date;
var year = date.getFullYear() + 10, month = date.getMonth();
var maxMonth, maxYear;
if (edd && year == (maxYear = edd.getFullYear())) {
maxMonth = edd.getMonth();
}
if (!maxYear || maxYear > CONSTS.MAXYEAR) {
maxYear = CONSTS.MAXYEAR;
}
if (year > maxYear) {
date.setFullYear(maxYear);
if (month < maxMonth) {
date.setMonth(maxMonth);
}
} else {
date.setFullYear(year);
}
},
_setMonth = function (m) {
var date = options.date;
var day = date.getDate(),
edd = options.endDate,
std = options.startDate;
var max = utilsGetMonthDays(date, m);
if (day > max) {
date.setDate(max);
}
date.setMonth(m);
if (edd && date > edd) {
date.setDate(edd.getDate());
}
if (std && date < std) {
date.setDate(std.getDate());
}
},
/**
* load data on D panel
* @param table {$} DOM
* @param date {Date} current date
* @private
*/
_loadDateData = function (table, date) {
if (!date) {
return;
}
var year = date.getFullYear(),
month = date.getMonth(),
day = date.getDate();
var today = new Date(),
TY = today.getFullYear(),
TM = today.getMonth(),
TD = today.getDate();
cache.showYear = year;
cache.showMonth = month;
var std = options.startDate,
edd = options.endDate;
//set title
table.$title.text(I18N.MN[month] + ", " + year);
//set button
var nextDay = new Date(date);
nextDay.setDate(utilsGetMonthDays(nextDay, null) + 1);
if ((edd && nextDay > edd) || nextDay.getFullYear() > CONSTS.MAXYEAR) {
table.$nextm.addClass('disabled').removeClass('hover').data('disabled', true);
} else {
table.$nextm.removeClass('disabled').data('disabled', false);
}
var prevDay = new Date(date);
prevDay.setDate(0);
if ((std && prevDay < std) || prevDay.getFullYear() < CONSTS.MINYEAR) {
table.$prevm.addClass('disabled').removeClass('hover').data('disabled', true);
} else {
table.$prevm.removeClass('disabled').data('disabled', false);
}
//set date
date.setDate(1);
var day1 = (date.getDay() - firstDayOfWeek) % 7;
date.setDate(0 - day1);
date.setDate(date.getDate() + 1);
var $frow = table.find('tbody').children().eq(0);
//set td date
for (var i = 0; i < 6; i++) {
if (!$frow.length) {
break;
}
var $cells = $frow.children();
var iday;
for (var j = 0; j < 7; ++j, date.setDate(iday + 1)) {
var $cell = $cells.eq(j);
$cell.removeClass().data('nav', NAV['day']);
if (!$cell.length) {
break;
}
iday = date.getDate();
$cell.text(iday);
var current_month = (date.getMonth() == month);
if (!current_month) {
$cell.addClass('oday').data('disabled',true);
continue;
}
var disabled = false;
if ((std != null && std > date) || (edd != null && edd < date)) {
//out of date range
$cell.addClass('day disabled');
disabled = true;
} else {
//in date range
$cell.addClass('day');
}
$cell.data('disabled', disabled);
if (!disabled) {
if (current_month && iday == day) {
cache.selectedDate && cache.selectedDate.removeClass('selected');
$cell.addClass('selected');
cache.selectedDate = $cell;
cache.showDay = iday;
}
if (date.getFullYear() == TY &&
date.getMonth() == TM &&
iday == TD) {
$cell.addClass('today');
}
var wday = date.getDay();
if (wday === 0 || wday ===6) {
$cell.addClass("weekend");
}
}
}
$frow = $frow.next();
}
},
/**
* load data on YM panel
* @param table {$} DOM
* @param date {Date} current date
* @private
*/
_loadMonthData = function (table, date) {
if (!date) {
return;
}
var year = date.getFullYear(), month = date.getMonth();
var midyear = $(table).data('midYear');
if (!midyear) {
midyear = year;
} else {
if (year > midyear + 5) {
midyear += 10;
} else if (year < midyear - 4) {
midyear -= 10;
}
}
$(table).data('midYear', midyear);
var years = [midyear - 4, midyear - 3, midyear - 2, midyear - 1, midyear,
midyear + 1, midyear + 2, midyear + 3, midyear + 4, midyear + 5];
var ycells = $("td.year", table);
var mcells = $("td.month", table);
var ed = options.endDate;
var sd = options.startDate;
var maxYear, maxMonth, minYear, minMonth;
//end date
if (ed) {
if (ed && year == (maxYear = ed.getFullYear())) {
maxMonth = ed.getMonth();
}
}
if (!maxYear || maxYear > CONSTS.MAXYEAR) {
maxYear = CONSTS.MAXYEAR;
}
//start date
if (sd) {
if (sd && year == (minYear = sd.getFullYear())) {
minMonth = sd.getMonth();
}
}
if (!minYear || minYear < CONSTS.MINYEAR) {
minYear = CONSTS.MINYEAR;
}
//load 12 months
for (var i = 0; i < 12; i++) {
var $mcell = mcells.eq(i).text(I18N.MN[i])
.data('nav', NAV['month']).data('month', i);
if (i == month) {
cache.selectedMonth && cache.selectedMonth.removeClass('selected');
$mcell.addClass("selected");
cache.selectedMonth = $mcell;
}
if ((!utilsIsEmpty(minMonth) && i < minMonth) || (!utilsIsEmpty(maxMonth) && i > maxMonth)) {
$mcell.addClass("disabled").data('disabled', true);
} else {
$mcell.removeClass("disabled").data('disabled', false);
}
//一页可显示的10年数据加载
if (i < 10) {
var $ycell = ycells.eq(i).text(years[i]).data('nav', NAV['year']);
if (years[i] == year) {
cache.selectedYear && cache.selectedYear.removeClass('selected');
$ycell.addClass("selected");
cache.selectedYear = $ycell;
}
if ((!utilsIsEmpty(minYear) && years[i] < minYear) || (!utilsIsEmpty(maxYear) && years[i] > maxYear)) {
$ycell.addClass("disabled").data('disabled', true);
} else {
$ycell.removeClass("disabled").data('disabled', false);
}
}
}
//do page up
var $prev = $("td.prevy", table).removeClass('disabled').data('disabled', false);
if (years[0] <= minYear) {
$prev.addClass("disabled").data('disabled', true).removeClass('hover');
}
//do page down
var $next = $("td.nexty", table).removeClass('disabled').data('disabled', false);
if (years[9] >= maxYear) {
$next.addClass("disabled").data('disabled', true).removeClass('hover');
}
},
/**
* Transfer date values into UI inputs.
* @param {Object} table The time table object.
* @param {Date} date The date
* @param {String} viewmode The datetimepicker's view mode.
*/
_loadTimeData = function (table, date, viewmode) {
if (!date) {
return;
}
// Reset seconds if they are not relevant.
if (viewmode == CONSTS.VIEWMODE.HM || viewmode == CONSTS.VIEWMODE.YMDHM) {
date.setSeconds(0);
}
var hour = date.getHours()+'',
minute = date.getMinutes()+'',
second = date.getSeconds()+'';
table.$h.val(utilsLeftPad(hour, 2, '0'));
table.$m.val(utilsLeftPad(minute, 2, '0'));
table.$s.val(utilsLeftPad(second, 2, '0'));
},
/**
* do time increase
* @param {Object} timetable T panel DOM
* @param {Object} input time input
* @private
*/
_doTimeInc = function(timetable, input){
var inputType = input.data('time');
if (inputType === 'h') {
var hours = (options.date.getHours() + 1) % 24;
options.date.setHours(hours);
timetable.$h.val(utilsLeftPad(hours, 2, '0'));
} else if (inputType === 'm') {
var minutes = (options.date.getMinutes() + 5) % 60;
options.date.setMinutes(minutes);
timetable.$m.val(utilsLeftPad(minutes, 2, '0'));
} else {
var seconds = (options.date.getSeconds() + 5) % 60;
options.date.setSeconds(seconds);
timetable.$s.val(utilsLeftPad(seconds, 2, '0'));
}
input.select();
utilsApplyFunc(picker, options.onDateUpdate, arguments, false);
},
/**
* do time decrease
* @param {Object} timetable T panel DOM
* @param {Object} input time input
* @private
*/
_doTimeDec = function(timetable, input){
var inputType = input.data('time');
if (inputType === 'h') {
var hours = (options.date.getHours() + 23) % 24;
options.date.setHours(hours);
timetable.$h.val(utilsLeftPad(hours, 2, '0'));
} else if (inputType === 'm') {
var minutes = (options.date.getMinutes() + 55) % 60;
options.date.setMinutes(minutes);
timetable.$m.val(utilsLeftPad(minutes, 2, '0'));
} else {
var seconds = (options.date.getSeconds() + 55) % 60;
options.date.setSeconds(seconds);
timetable.$s.val(utilsLeftPad(seconds, 2, '0'));
}
input.select();
utilsApplyFunc(picker, options.onDateUpdate, arguments, false);
},
/**
* Make sure a number is between a minimum and a maximum
*/
clampNumber = function(value, min, max) {
return isNaN(value) ? min : Math.min(max, Math.max(min, value));
},
/**
* create the time picker row containing the individual time input fields
* @param {String} viewmode One of the constants VIEWMODE.XXX
*/
_createTimePicker = function (viewmode) {
var $table = $('
');
var $tbody = $('').appendTo($table);
$table.$h = $('').data('time', 'h').change(function () {
var value = parseInt(this.value, 10);
var hours = clampNumber(value, 0, 23);
// Replace the value if it has not been not a valid number
if (value != hours) {
this.value = hours;
}
options.date.setHours(hours);
utilsApplyFunc(picker, options.onDateUpdate, arguments);
}).focus(function () {
$table.focus = $(this);
});
$table.$m = $('').data('time', 'm').change(function () {
var value = parseInt(this.value, 10);
var minutes = clampNumber(value, 0, 59);
// Replace the value if it has not been not a valid number
if (value != minutes) {
this.value = minutes;
}
options.date.setMinutes(minutes);
utilsApplyFunc(picker, options.onDateUpdate, arguments);
}).focus(function () {
$table.focus = $(this);
});
$table.$s = $('').data('time', 's').change(function () {
var value = parseInt(this.value, 10);
var seconds = clampNumber(value, 0, 59);
// Replace the value if it has not been not a valid number
if (value != seconds) {
this.value = seconds;
}
options.date.setSeconds(seconds);
utilsApplyFunc(picker, options.onDateUpdate, arguments);
}).focus(function () {
$table.focus = $(this);
});
$table.focus = $table.$m;
var $add = $('
').append($('')).data('nav', NAV['plus']);
var $min = $('
').append($('')).data('nav', NAV['minus']);
var $row = $('
').append($('
').text(I18N.TIME))
.append($('
').append($table.$h))
.append($('
').text(':'))
.append($('
').append($table.$m));
// Only add the seconds input if it's requested
if (viewmode != CONSTS.VIEWMODE.YMDHM && viewmode != CONSTS.VIEWMODE.HM) {
$row.append($('