|
|
|
@@ -35,9 +35,10 @@
|
|
|
|
|
|
|
|
|
|
this.element = $(element);
|
|
|
|
|
this.language = options.language||this.element.data('date-language')||"en";
|
|
|
|
|
this.language = this.language in dates ? this.language : this.language.split('-')[0]; //Check if "de-DE" style date is available, if not language should fallback to 2 letter code eg "de"
|
|
|
|
|
this.language = this.language in dates ? this.language : "en";
|
|
|
|
|
this.isRTL = dates[this.language].rtl||false;
|
|
|
|
|
this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy');
|
|
|
|
|
this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||dates[this.language].format||'mm/dd/yyyy');
|
|
|
|
|
this.isInline = false;
|
|
|
|
|
this.isInput = this.element.is('input');
|
|
|
|
|
this.component = this.element.is('.date') ? this.element.find('.add-on') : false;
|
|
|
|
@@ -53,7 +54,7 @@
|
|
|
|
|
} else if ('dateForceParse' in this.element.data()) {
|
|
|
|
|
this.forceParse = this.element.data('date-force-parse');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.picker = $(DPGlobal.template)
|
|
|
|
|
.appendTo(this.isInline ? this.element : 'body')
|
|
|
|
@@ -74,7 +75,7 @@
|
|
|
|
|
}
|
|
|
|
|
$(document).on('mousedown', function (e) {
|
|
|
|
|
// Clicked outside the datepicker, hide it
|
|
|
|
|
if ($(e.target).closest('.datepicker').length === 0) {
|
|
|
|
|
if ($(e.target).closest('.datepicker.datepicker-inline, .datepicker.datepicker-dropdown').length === 0) {
|
|
|
|
|
that.hide();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
@@ -105,9 +106,38 @@
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.minViewMode = options.minViewMode||this.element.data('date-min-view-mode')||0;
|
|
|
|
|
if (typeof this.minViewMode === 'string') {
|
|
|
|
|
switch (this.minViewMode) {
|
|
|
|
|
case 'months':
|
|
|
|
|
this.minViewMode = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 'years':
|
|
|
|
|
this.minViewMode = 2;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
this.minViewMode = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.viewMode = this.startViewMode = Math.max(this.startViewMode, this.minViewMode);
|
|
|
|
|
|
|
|
|
|
this.todayBtn = (options.todayBtn||this.element.data('date-today-btn')||false);
|
|
|
|
|
this.todayHighlight = (options.todayHighlight||this.element.data('date-today-highlight')||false);
|
|
|
|
|
|
|
|
|
|
this.calendarWeeks = false;
|
|
|
|
|
if ('calendarWeeks' in options) {
|
|
|
|
|
this.calendarWeeks = options.calendarWeeks;
|
|
|
|
|
} else if ('dateCalendarWeeks' in this.element.data()) {
|
|
|
|
|
this.calendarWeeks = this.element.data('date-calendar-weeks');
|
|
|
|
|
}
|
|
|
|
|
if (this.calendarWeeks)
|
|
|
|
|
this.picker.find('tfoot th.today')
|
|
|
|
|
.attr('colspan', function(i, val){
|
|
|
|
|
return parseInt(val) + 1;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.weekStart = ((options.weekStart||this.element.data('date-weekstart')||dates[this.language].weekStart||0) % 7);
|
|
|
|
|
this.weekEnd = ((this.weekStart + 6) % 7);
|
|
|
|
|
this.startDate = -Infinity;
|
|
|
|
@@ -197,6 +227,7 @@
|
|
|
|
|
|
|
|
|
|
hide: function(e){
|
|
|
|
|
if(this.isInline) return;
|
|
|
|
|
if (!this.picker.is(':visible')) return;
|
|
|
|
|
this.picker.hide();
|
|
|
|
|
$(window).off('resize', this.place);
|
|
|
|
|
this.viewMode = this.startViewMode;
|
|
|
|
@@ -318,7 +349,6 @@
|
|
|
|
|
|
|
|
|
|
if(fromArgs) this.setValue();
|
|
|
|
|
|
|
|
|
|
var oldViewDate = this.viewDate;
|
|
|
|
|
if (this.date < this.startDate) {
|
|
|
|
|
this.viewDate = new Date(this.startDate);
|
|
|
|
|
} else if (this.date > this.endDate) {
|
|
|
|
@@ -326,19 +356,17 @@
|
|
|
|
|
} else {
|
|
|
|
|
this.viewDate = new Date(this.date);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (oldViewDate && oldViewDate.getTime() != this.viewDate.getTime()){
|
|
|
|
|
this.element.trigger({
|
|
|
|
|
type: 'changeDate',
|
|
|
|
|
date: this.viewDate
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
this.fill();
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
fillDow: function(){
|
|
|
|
|
var dowCnt = this.weekStart,
|
|
|
|
|
html = '<tr>';
|
|
|
|
|
if(this.calendarWeeks){
|
|
|
|
|
var cell = '<th class="cw"> </th>';
|
|
|
|
|
html += cell;
|
|
|
|
|
this.picker.find('.datepicker-days thead tr:first-child').prepend(cell);
|
|
|
|
|
}
|
|
|
|
|
while (dowCnt < this.weekStart + 7) {
|
|
|
|
|
html += '<th class="dow">'+dates[this.language].daysMin[(dowCnt++)%7]+'</th>';
|
|
|
|
|
}
|
|
|
|
@@ -365,7 +393,7 @@
|
|
|
|
|
endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity,
|
|
|
|
|
currentDate = this.date && this.date.valueOf(),
|
|
|
|
|
today = new Date();
|
|
|
|
|
this.picker.find('.datepicker-days thead th:eq(1)')
|
|
|
|
|
this.picker.find('.datepicker-days thead th.switch')
|
|
|
|
|
.text(dates[this.language].months[month]+' '+year);
|
|
|
|
|
this.picker.find('tfoot th.today')
|
|
|
|
|
.text(dates[this.language].today)
|
|
|
|
@@ -384,6 +412,21 @@
|
|
|
|
|
while(prevMonth.valueOf() < nextMonth) {
|
|
|
|
|
if (prevMonth.getUTCDay() == this.weekStart) {
|
|
|
|
|
html.push('<tr>');
|
|
|
|
|
if(this.calendarWeeks){
|
|
|
|
|
// ISO 8601: First week contains first thursday.
|
|
|
|
|
// ISO also states week starts on Monday, but we can be more abstract here.
|
|
|
|
|
var
|
|
|
|
|
// Start of current week: based on weekstart/current date
|
|
|
|
|
ws = new Date(+prevMonth + (this.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),
|
|
|
|
|
// Thursday of this week
|
|
|
|
|
th = new Date(+ws + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
|
|
|
|
|
// First Thursday of year, year from thursday
|
|
|
|
|
yth = new Date(+(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),
|
|
|
|
|
// Calendar week: ms between thursdays, div ms per day, div 7 days
|
|
|
|
|
calWeek = (th - yth) / 864e5 / 7 + 1;
|
|
|
|
|
html.push('<td class="cw">'+ calWeek +'</td>');
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
clsName = '';
|
|
|
|
|
if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) {
|
|
|
|
@@ -519,19 +562,29 @@
|
|
|
|
|
if (!target.is('.disabled')) {
|
|
|
|
|
this.viewDate.setUTCDate(1);
|
|
|
|
|
if (target.is('.month')) {
|
|
|
|
|
var day = 1;
|
|
|
|
|
var month = target.parent().find('span').index(target);
|
|
|
|
|
var year = this.viewDate.getUTCFullYear();
|
|
|
|
|
this.viewDate.setUTCMonth(month);
|
|
|
|
|
this.element.trigger({
|
|
|
|
|
type: 'changeMonth',
|
|
|
|
|
date: this.viewDate
|
|
|
|
|
});
|
|
|
|
|
if ( this.minViewMode == 1 ) {
|
|
|
|
|
this._setDate(UTCDate(year, month, day,0,0,0,0));
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
var year = parseInt(target.text(), 10)||0;
|
|
|
|
|
var day = 1;
|
|
|
|
|
var month = 0;
|
|
|
|
|
this.viewDate.setUTCFullYear(year);
|
|
|
|
|
this.element.trigger({
|
|
|
|
|
type: 'changeYear',
|
|
|
|
|
date: this.viewDate
|
|
|
|
|
});
|
|
|
|
|
if ( this.minViewMode == 2 ) {
|
|
|
|
|
this._setDate(UTCDate(year, month, day,0,0,0,0));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.showMode(-1);
|
|
|
|
|
this.fill();
|
|
|
|
@@ -728,7 +781,7 @@
|
|
|
|
|
|
|
|
|
|
showMode: function(dir) {
|
|
|
|
|
if (dir) {
|
|
|
|
|
this.viewMode = Math.max(0, Math.min(2, this.viewMode + dir));
|
|
|
|
|
this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
vitalets: fixing bug of very special conditions:
|
|
|
|
|