(function(factory){
'use strict';
if(typeof window.define==='function'&&window.define.amd){
window.define([ 'jquery' ], factory);
}else{
factory(window.jQuery);
}}(function($){
'use strict';
var datepicker_instActive;
$.ui.tm_datepicker=$.ui.tm_datepicker||{};
if($.ui.tm_datepicker.version){
return;
}
$.extend($.ui, { tm_datepicker: { version: '1.11.4' }});
function datepicker_getZindex(elem){
var position, value;
while(elem.length&&elem[ 0 ]!==document){
position=elem.css('position');
if(position==='absolute'||position==='relative'||position==='fixed'){
value=parseInt(elem.css('zIndex'), 10);
if(! isNaN(value)&&value!==0){
return value;
}}
elem=elem.parent();
}
return 0;
}
function datepicker_handleMouseover(that){
if(! $.tm_datepicker._isDisabledDatepicker(datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ]:datepicker_instActive.input[ 0 ])){
$(that).parents('.ui-tm-datepicker-calendar').find('a').removeClass('ui-state-hover');
$(that).addClass('ui-state-hover');
if(that.className.indexOf('ui-tm-datepicker-prev')!==-1){
$(that).addClass('ui-tm-datepicker-prev-hover');
}
if(that.className.indexOf('ui-tm-datepicker-next')!==-1){
$(that).addClass('ui-tm-datepicker-next-hover');
}}
}
function datepicker_bindHover(dpDiv){
var selector='button, .ui-tm-datepicker-prev, .ui-tm-datepicker-next, .ui-tm-datepicker-calendar td a';
return dpDiv
.on('mouseout', selector, function(){
$(this).removeClass('ui-state-hover');
if(this.className.indexOf('ui-tm-datepicker-prev')!==-1){
$(this).removeClass('ui-tm-datepicker-prev-hover');
}
if(this.className.indexOf('ui-tm-datepicker-next')!==-1){
$(this).removeClass('ui-tm-datepicker-next-hover');
}})
.on('mouseover', selector, function(){
datepicker_handleMouseover(this);
});
}
function datepicker_extendRemove(target, props){
var name;
$.extend(target, props);
for(name in props){
if(props[ name ]===null){
target[ name ]=props[ name ];
}}
return target;
}
function Datepicker(){
this._curInst=null;
this._keyEvent=false;
this._disabledInputs=[];
this._datepickerShowing=false;
this._inDialog=false;
this._mainDivId='ui-tm-datepicker-div';
this._inlineClass='ui-tm-datepicker-inline';
this._appendClass='ui-tm-datepicker-append';
this._triggerClass='ui-tm-datepicker-trigger';
this._dialogClass='ui-tm-datepicker-dialog';
this._disableClass='ui-tm-datepicker-disabled';
this._unselectableClass='ui-tm-datepicker-unselectable';
this._currentClass='ui-tm-datepicker-current-day';
this._dayOverClass='ui-tm-datepicker-days-cell-over';
this.regional=[];
this.regional[ '' ]={
closeText: 'Done',
prevText: 'Prev',
nextText: 'Next',
currentText: 'Today',
monthNames: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ],
monthNamesShort: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ],
dayNames: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],
dayNamesShort: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],
dayNamesMin: [ 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa' ],
weekHeader: 'Wk',
dateFormat: 'mm/dd/yy',
firstDay: 0,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''
};
this._defaults={
showOn: 'focus', // "focus" for popup on focus,
showAnim: 'fadeIn',
showOptions: {},
defaultDate: null,
appendText: '',
buttonText: '...',
buttonImage: '',
buttonImageOnly: false,
hideIfNoPrevNext: false,
navigationAsDateFormat: false,
gotoCurrent: false,
changeMonth: false,
changeYear: false,
yearRange: 'c-10:c+10',
showOtherMonths: false,
selectOtherMonths: false,
showWeek: false,
calculateWeek: this.iso8601Week,
shortYearCutoff: '+10',
minDate: null,
maxDate: null,
duration: 'fast',
beforeShowDay: null,
beforeShow: null,
onSelect: null,
onChangeMonthYear: null,
onClose: null,
numberOfMonths: 1,
showCurrentAtPos: 0,
stepMonths: 1,
stepBigMonths: 12,
altField: '',
altFormat: '',
constrainInput: true,
showButtonPanel: false,
autoSize: false,
disabled: false
};
$.extend(this._defaults, this.regional[ '' ]);
this.regional.en=$.extend(true, {}, this.regional[ '' ]);
this.regional[ 'en-US' ]=$.extend(true, {}, this.regional.en);
this.dpDiv=datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-tm-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
}
$.extend(Datepicker.prototype, {
markerClassName: 'hasDatepicker',
maxRows: 4,
_widgetDatepicker: function(){
return this.dpDiv;
},
setDefaults: function(settings){
datepicker_extendRemove(this._defaults, settings||{});
return this;
},
_attachDatepicker: function(target, settings){
var nodeName, inline, inst;
nodeName=target.nodeName.toLowerCase();
inline=nodeName==='div'||nodeName==='span';
if(! target.id){
this.uuid +=1;
target.id='dp' + this.uuid;
}
inst=this._newInst($(target), inline);
inst.settings=$.extend({}, settings||{});
if(nodeName==='input'){
this._connectDatepicker(target, inst);
}else if(inline){
this._inlineDatepicker(target, inst);
}},
_newInst: function(target, inline){
var id=target[ 0 ].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1');
return {
id: id,
input: target,
selectedDay: 0,
selectedMonth: 0,
selectedYear: 0,
drawMonth: 0,
drawYear: 0,
inline: inline,
dpDiv: ! inline ? this.dpDiv:datepicker_bindHover($("<div class='" + this._inlineClass + " ui-tm-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))
};},
_connectDatepicker: function(target, inst){
var input=$(target);
inst.append=$([]);
inst.trigger=$([]);
if(input.hasClass(this.markerClassName)){
return;
}
this._attachments(input, inst);
input.addClass(this.markerClassName).on('keydown', this._doKeyDown).on('keypress', this._doKeyPress).on('keyup', this._doKeyUp);
this._autoSize(inst);
$.data(target, 'datepicker', inst);
if(inst.settings.disabled){
this._disableDatepicker(target);
}},
_attachments: function(input, inst){
var showOn,
buttonText,
buttonImage,
appendText=this._get(inst, 'appendText'),
isRTL=this._get(inst, 'isRTL');
if(inst.append){
inst.append.remove();
}
if(appendText){
inst.append=$("<span class='" + this._appendClass + "'>" + appendText + '</span>');
input[ isRTL ? 'before':'after' ](inst.append);
}
input.off('focus', this._showDatepicker);
if(inst.trigger){
inst.trigger.remove();
}
showOn=this._get(inst, 'showOn');
if(showOn==='focus'||showOn==='both'){
input.on('focus', this._showDatepicker);
}
if(showOn==='button'||showOn==='both'){
buttonText=this._get(inst, 'buttonText');
buttonImage=this._get(inst, 'buttonImage');
inst.trigger=$(
this._get(inst, 'buttonImageOnly')
? $('<img/>').addClass(this._triggerClass).attr({ src: buttonImage, alt: buttonText, title: buttonText })
: $("<button type='button'></button>")
.addClass(this._triggerClass)
.html(! buttonImage ? buttonText:$('<img/>').attr({ src: buttonImage, alt: buttonText, title: buttonText }))
);
input[ isRTL ? 'before':'after' ](inst.trigger);
inst.trigger.on('click', function(){
if($.tm_datepicker._datepickerShowing&&$.tm_datepicker._lastInput===input[ 0 ]){
$.tm_datepicker._hideDatepicker();
}else if($.tm_datepicker._datepickerShowing&&$.tm_datepicker._lastInput!==input[ 0 ]){
$.tm_datepicker._hideDatepicker();
$.tm_datepicker._showDatepicker(input[ 0 ]);
}else{
$.tm_datepicker._showDatepicker(input[ 0 ]);
}
return false;
});
}},
_autoSize: function(inst){
var findMax;
var max;
var maxI;
var i;
var date;
var dateFormat=this._get(inst, 'dateFormat');
if(this._get(inst, 'autoSize')&&! inst.inline){
date=new Date(2009, 12 - 1, 20);
dateFormat=this._get(inst, 'dateFormat');
if(dateFormat.match(/[DM]/)){
findMax=function(names){
max=0;
maxI=0;
for(i=0; i < names.length; i +=1){
if(names[ i ].length > max){
max=names[ i ].length;
maxI=i;
}}
return maxI;
};
date.setMonth(findMax(this._get(inst, dateFormat.match(/MM/) ? 'monthNames':'monthNamesShort')));
date.setDate(findMax(this._get(inst, dateFormat.match(/DD/) ? 'dayNames':'dayNamesShort')) + 20 - date.getDay());
}
inst.input.attr('size', this._formatDate(inst, date).length);
}},
_inlineDatepicker: function(target, inst){
var divSpan=$(target);
if(divSpan.hasClass(this.markerClassName)){
return;
}
divSpan.addClass(this.markerClassName).append(inst.dpDiv);
$.data(target, 'datepicker', inst);
this._setDate(inst, this._getDefaultDate(inst), true);
this._updateDatepicker(inst);
this._updateAlternate(inst);
if(inst.settings.disabled){
this._disableDatepicker(target);
}
inst.dpDiv.css('display', 'block');
},
_dialogDatepicker: function(input, date, onSelect, settings, pos){
var id,
browserWidth,
browserHeight,
scrollX,
scrollY,
inst=this._dialogInst;
if(! inst){
this.uuid +=1;
id='dp' + this.uuid;
this._dialogInput=$("<input type='text' id='" + id + "'>");
this._dialogInput.on('keydown', this._doKeyDown);
$('body').append(this._dialogInput);
inst=this._newInst(this._dialogInput, false);
this._dialogInst=inst;
inst.settings={};
$.data(this._dialogInput[ 0 ], 'datepicker', inst);
}
datepicker_extendRemove(inst.settings, settings||{});
date=date&&date.constructor===Date ? this._formatDate(inst, date):date;
this._dialogInput.val(date);
this._pos=pos ?(pos.length ? pos:[ pos.pageX, pos.pageY ]):null;
if(! this._pos){
browserWidth=document.documentElement.clientWidth;
browserHeight=document.documentElement.clientHeight;
scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;
scrollY=document.documentElement.scrollTop||document.body.scrollTop;
this._pos =
[(browserWidth / 2) - 100 + scrollX,(browserHeight / 2) - 150 + scrollY ];
}
this._dialogInput.css('left', this._pos[ 0 ] + 20 + 'px').css('top', this._pos[ 1 ] + 'px');
inst.settings.onSelect=onSelect;
this._inDialog=true;
this.dpDiv.addClass(this._dialogClass);
this._showDatepicker(this._dialogInput[ 0 ]);
if($.blockUI){
$.blockUI(this.dpDiv);
}
$.data(this._dialogInput[ 0 ], 'datepicker', inst);
return this;
},
_destroyDatepicker: function(target){
var nodeName,
$target=$(target),
inst=$.data(target, 'datepicker');
if(! $target.hasClass(this.markerClassName)){
return;
}
nodeName=target.nodeName.toLowerCase();
$.removeData(target, 'datepicker');
if(nodeName==='input'){
inst.append.remove();
inst.trigger.remove();
$target.removeClass(this.markerClassName).off('focus', this._showDatepicker).off('keydown', this._doKeyDown).off('keypress', this._doKeyPress).off('keyup', this._doKeyUp);
}else if(nodeName==='div'||nodeName==='span'){
$target.removeClass(this.markerClassName).empty();
}
if(datepicker_instActive===inst){
datepicker_instActive=null;
}},
_enableDatepicker: function(target){
var nodeName,
inline,
$target=$(target),
inst=$.data(target, 'datepicker');
if(! $target.hasClass(this.markerClassName)){
return;
}
nodeName=target.nodeName.toLowerCase();
if(nodeName==='input'){
target.disabled=false;
inst.trigger
.filter('button')
.each(function(){
this.disabled=false;
})
.end()
.filter('img')
.css({ opacity: '1.0', cursor: '' });
}else if(nodeName==='div'||nodeName==='span'){
inline=$target.children('.' + this._inlineClass);
inline.children().removeClass('ui-state-disabled');
inline.find('select.ui-tm-datepicker-month, select.ui-tm-datepicker-year').prop('disabled', false);
}
this._disabledInputs=$.map(this._disabledInputs, function(value){
return value===target ? null:value;
});
},
_disableDatepicker: function(target){
var nodeName,
inline,
$target=$(target),
inst=$.data(target, 'datepicker');
if(! $target.hasClass(this.markerClassName)){
return;
}
nodeName=target.nodeName.toLowerCase();
if(nodeName==='input'){
target.disabled=true;
inst.trigger
.filter('button')
.each(function(){
this.disabled=true;
})
.end()
.filter('img')
.css({ opacity: '0.5', cursor: 'default' });
}else if(nodeName==='div'||nodeName==='span'){
inline=$target.children('.' + this._inlineClass);
inline.children().addClass('ui-state-disabled');
inline.find('select.ui-tm-datepicker-month, select.ui-tm-datepicker-year').prop('disabled', true);
}
this._disabledInputs=$.map(this._disabledInputs, function(value){
return value===target ? null:value;
});
this._disabledInputs[ this._disabledInputs.length ]=target;
},
_isDisabledDatepicker: function(target){
var i;
if(! target){
return false;
}
for(i=0; i < this._disabledInputs.length; i +=1){
if(this._disabledInputs[ i ]===target){
return true;
}}
return false;
},
_getInst: function(target){
try {
return $.data(target, 'datepicker');
} catch(err){
throw 'Missing instance data for this datepicker';
}},
_optionDatepicker: function(target, name, value){
var settings,
date,
minDate,
maxDate,
inst=this._getInst(target);
if(arguments.length===2&&typeof name==='string'){
return name==='defaults' ? $.extend({}, $.tm_datepicker._defaults):inst ?(name==='all' ? $.extend({}, inst.settings):this._get(inst, name)):null;
}
settings=name||{};
if(typeof name==='string'){
settings={};
settings[ name ]=value;
}
if(inst){
if(this._curInst===inst){
this._hideDatepicker();
}
date=this._getDateDatepicker(target, true);
minDate=this._getMinMaxDate(inst, 'min');
maxDate=this._getMinMaxDate(inst, 'max');
datepicker_extendRemove(inst.settings, settings);
if(minDate!==null&&settings.dateFormat!==undefined&&settings.minDate===undefined){
inst.settings.minDate=this._formatDate(inst, minDate);
}
if(maxDate!==null&&settings.dateFormat!==undefined&&settings.maxDate===undefined){
inst.settings.maxDate=this._formatDate(inst, maxDate);
}
if('disabled' in settings){
if(settings.disabled){
this._disableDatepicker(target);
}else{
this._enableDatepicker(target);
}}
this._attachments($(target), inst);
this._autoSize(inst);
this._setDate(inst, date);
this._updateAlternate(inst);
this._updateDatepicker(inst);
}},
_changeDatepicker: function(target, name, value){
this._optionDatepicker(target, name, value);
},
_refreshDatepicker: function(target){
var inst=this._getInst(target);
if(inst){
this._updateDatepicker(inst);
}},
_setDateDatepicker: function(target, date){
var inst=this._getInst(target);
if(inst){
this._setDate(inst, date);
this._updateDatepicker(inst);
this._updateAlternate(inst);
}},
_getDateDatepicker: function(target, noDefault){
var inst=this._getInst(target);
if(inst&&! inst.inline){
this._setDateFromField(inst, noDefault);
}
return inst ? this._getDate(inst):null;
},
_doKeyDown: function(event){
var onSelect,
dateStr,
sel,
inst=$.tm_datepicker._getInst(event.target),
handled=true,
isRTL=inst.dpDiv.is('.ui-tm-datepicker-rtl');
inst._keyEvent=true;
if($.tm_datepicker._datepickerShowing){
switch(event.keyCode){
case 9:
$.tm_datepicker._hideDatepicker();
handled=false;
break;
case 13:
sel=$('td.' + $.tm_datepicker._dayOverClass + ':not(.' + $.tm_datepicker._currentClass + ')', inst.dpDiv);
if(sel[ 0 ]){
$.tm_datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ]);
}
onSelect=$.tm_datepicker._get(inst, 'onSelect');
if(onSelect){
dateStr=$.tm_datepicker._formatDate(inst);
onSelect.apply(inst.input ? inst.input[ 0 ]:null, [ dateStr, inst ]);
}else{
$.tm_datepicker._hideDatepicker();
}
return false;
case 27:
$.tm_datepicker._hideDatepicker();
break;
case 33:
$.tm_datepicker._adjustDate(event.target, event.ctrlKey ? -$.tm_datepicker._get(inst, 'stepBigMonths'):-$.tm_datepicker._get(inst, 'stepMonths'), 'M');
break;
case 34:
$.tm_datepicker._adjustDate(event.target, event.ctrlKey ? +$.tm_datepicker._get(inst, 'stepBigMonths'):+$.tm_datepicker._get(inst, 'stepMonths'), 'M');
break;
case 35:
if(event.ctrlKey||event.metaKey){
$.tm_datepicker._clearDate(event.target);
}
handled=event.ctrlKey||event.metaKey;
break;
case 36:
if(event.ctrlKey||event.metaKey){
$.tm_datepicker._gotoToday(event.target);
}
handled=event.ctrlKey||event.metaKey;
break;
case 37:
if(event.ctrlKey||event.metaKey){
$.tm_datepicker._adjustDate(event.target, isRTL ? +1:-1, 'D');
}
handled=event.ctrlKey||event.metaKey;
if(event.originalEvent.altKey){
$.tm_datepicker._adjustDate(event.target, event.ctrlKey ? -$.tm_datepicker._get(inst, 'stepBigMonths'):-$.tm_datepicker._get(inst, 'stepMonths'), 'M');
}
break;
case 38:
if(event.ctrlKey||event.metaKey){
$.tm_datepicker._adjustDate(event.target, -7, 'D');
}
handled=event.ctrlKey||event.metaKey;
break;
case 39:
if(event.ctrlKey||event.metaKey){
$.tm_datepicker._adjustDate(event.target, isRTL ? -1:+1, 'D');
}
handled=event.ctrlKey||event.metaKey;
if(event.originalEvent.altKey){
$.tm_datepicker._adjustDate(event.target, event.ctrlKey ? +$.tm_datepicker._get(inst, 'stepBigMonths'):+$.tm_datepicker._get(inst, 'stepMonths'), 'M');
}
break;
case 40:
if(event.ctrlKey||event.metaKey){
$.tm_datepicker._adjustDate(event.target, +7, 'D');
}
handled=event.ctrlKey||event.metaKey;
break;
default:
handled=false;
}}else if(event.keyCode===36&&event.ctrlKey){
$.tm_datepicker._showDatepicker(this);
}else{
handled=false;
}
if(handled){
event.preventDefault();
event.stopPropagation();
}},
_doKeyPress: function(event){
var chars,
chr,
inst=$.tm_datepicker._getInst(event.target);
if($.tm_datepicker._get(inst, 'constrainInput')){
chars=$.tm_datepicker._possibleChars($.tm_datepicker._get(inst, 'dateFormat'));
chr=String.fromCharCode(event.charCode===null ? event.keyCode:event.charCode);
return event.ctrlKey||event.metaKey||chr < ' '||! chars||chars.indexOf(chr) > -1;
}},
_doKeyUp: function(event){
var date,
inst=$.tm_datepicker._getInst(event.target);
if(inst.input.val()!==inst.lastVal){
try {
date=$.tm_datepicker.parseDate($.tm_datepicker._get(inst, 'dateFormat'), inst.input ? inst.input.val():null, $.tm_datepicker._getFormatConfig(inst));
if(date){
$.tm_datepicker._setDateFromField(inst);
$.tm_datepicker._updateAlternate(inst);
$.tm_datepicker._updateDatepicker(inst);
}} catch(err){
return false;
}}
return true;
},
_showDatepicker: function(input){
var inst;
var beforeShow;
var beforeShowSettings;
var isFixed;
var offset;
var showAnim;
var duration;
input=input.target||input;
if(input.nodeName.toLowerCase()!=='input'){
input=$('input', input.parentNode)[ 0 ];
}
if($.tm_datepicker._isDisabledDatepicker(input)||$.tm_datepicker._lastInput===input){
return;
}
inst=$.tm_datepicker._getInst(input);
if($.tm_datepicker._curInst&&$.tm_datepicker._curInst!==inst){
$.tm_datepicker._curInst.dpDiv.stop(true, true);
if(inst&&$.tm_datepicker._datepickerShowing){
$.tm_datepicker._hideDatepicker($.tm_datepicker._curInst.input[ 0 ]);
}}
beforeShow=$.tm_datepicker._get(inst, 'beforeShow');
beforeShowSettings=beforeShow ? beforeShow.apply(input, [ input, inst ]):{};
if(beforeShowSettings===false){
return;
}
datepicker_extendRemove(inst.settings, beforeShowSettings);
inst.lastVal=null;
$.tm_datepicker._lastInput=input;
$.tm_datepicker._setDateFromField(inst);
if($.tm_datepicker._inDialog){
input.value='';
}
if(! $.tm_datepicker._pos){
$.tm_datepicker._pos=$.tm_datepicker._findPos(input);
$.tm_datepicker._pos[ 1 ] +=input.offsetHeight;
}
isFixed=false;
$(input)
.parents()
.each(function(){
isFixed=isFixed||$(this).css('position')==='fixed';
return ! isFixed;
});
offset={ left: $.tm_datepicker._pos[ 0 ], top: $.tm_datepicker._pos[ 1 ] };
$.tm_datepicker._pos=null;
inst.dpDiv.empty();
inst.dpDiv.css({ position: 'absolute', display: 'block', top: '-1000px' });
$.tm_datepicker._updateDatepicker(inst);
offset=$.tm_datepicker._checkOffset(inst, offset, isFixed);
inst.dpDiv.css({
position: $.tm_datepicker._inDialog&&$.blockUI ? 'static':isFixed ? 'fixed':'absolute',
display: 'none',
left: offset.left + 'px',
top: offset.top + 'px'
});
if(! inst.inline){
showAnim=$.tm_datepicker._get(inst, 'showAnim');
duration=$.tm_datepicker._get(inst, 'duration');
inst.dpDiv.css('z-index', datepicker_getZindex($(input)) + 1);
$.tm_datepicker._datepickerShowing=true;
if($.effects&&$.effects.effect[ showAnim ]){
inst.dpDiv.show(showAnim, $.tm_datepicker._get(inst, 'showOptions'), duration);
}else{
inst.dpDiv[ showAnim||'show' ](showAnim ? duration:null);
}
if($.tm_datepicker._shouldFocusInput(inst)){
inst.input.trigger('focus');
}
$.tm_datepicker._curInst=inst;
}},
_updateDatepicker: function(inst){
var origyearshtml;
var numMonths;
var cols;
var width=17;
var activeCell;
this.maxRows=4;
datepicker_instActive=inst;
inst.dpDiv.empty().append(this._generateHTML(inst));
this._attachHandlers(inst);
numMonths=this._getNumberOfMonths(inst);
cols=numMonths[ 1 ];
activeCell=inst.dpDiv.find('.' + this._dayOverClass + ' a');
if(activeCell.length > 0){
datepicker_handleMouseover.apply(activeCell.get(0), [ activeCell.get(0) ]);
}
inst.dpDiv.removeClass('ui-tm-datepicker-multi-2 ui-tm-datepicker-multi-3 ui-tm-datepicker-multi-4').width('');
if(cols > 1){
inst.dpDiv.addClass('ui-tm-datepicker-multi-' + cols).css('width',(width * cols) + 'em');
}
inst.dpDiv[(numMonths[ 0 ]!==1||numMonths[ 1 ]!==1 ? 'add':'remove') + 'Class' ]('ui-tm-datepicker-multi');
inst.dpDiv[(this._get(inst, 'isRTL') ? 'add':'remove') + 'Class' ]('ui-tm-datepicker-rtl');
if(inst===$.tm_datepicker._curInst&&$.tm_datepicker._datepickerShowing&&$.tm_datepicker._shouldFocusInput(inst)){
inst.input.trigger('focus');
}
if(inst.yearshtml){
origyearshtml=inst.yearshtml;
setTimeout(function(){
if(origyearshtml===inst.yearshtml&&inst.yearshtml){
inst.dpDiv.find('select.ui-tm-datepicker-year:first').replaceWith(inst.yearshtml);
}
origyearshtml=null;
inst.yearshtml=null;
}, 0);
}},
_shouldFocusInput: function(inst){
return inst.input&&inst.input.is(':visible')&&! inst.input.is(':disabled')&&! inst.input.is(':focus');
},
_checkOffset: function(inst, offset, isFixed){
var dpWidth=inst.dpDiv.outerWidth(),
dpHeight=inst.dpDiv.outerHeight(),
inputWidth=inst.input ? inst.input.outerWidth():0,
inputHeight=inst.input ? inst.input.outerHeight():0,
viewWidth=document.documentElement.clientWidth +(isFixed ? 0:$(document).scrollLeft()),
viewHeight=document.documentElement.clientHeight +(isFixed ? 0:$(document).scrollTop());
offset.left -=this._get(inst, 'isRTL') ? dpWidth - inputWidth:0;
offset.left -=isFixed&&offset.left===inst.input.offset().left ? $(document).scrollLeft():0;
offset.top -=isFixed&&offset.top===inst.input.offset().top + inputHeight ? $(document).scrollTop():0;
offset.left -=Math.min(offset.left, offset.left + dpWidth > viewWidth&&viewWidth > dpWidth ? Math.abs(offset.left + dpWidth - viewWidth):0);
offset.top -=Math.min(offset.top, offset.top + dpHeight > viewHeight&&viewHeight > dpHeight ? Math.abs(dpHeight + inputHeight):0);
return offset;
},
_findPos: function(obj){
var position,
inst=this._getInst(obj),
isRTL=this._get(inst, 'isRTL');
while(obj&&(obj.type==='hidden'||obj.nodeType!==1||$.expr.filters.hidden(obj))){
obj=obj[ isRTL ? 'previousSibling':'nextSibling' ];
}
position=$(obj).offset();
return [ position.left, position.top ];
},
_hideDatepicker: function(input){
var showAnim,
duration,
postProcess,
onClose,
inst=this._curInst;
if(! inst||(input&&inst!==$.data(input, 'datepicker'))){
return;
}
if(this._datepickerShowing){
showAnim=this._get(inst, 'showAnim');
duration=this._get(inst, 'duration');
postProcess=function(){
$.tm_datepicker._tidyDialog(inst);
};
if($.effects&&($.effects.effect[ showAnim ]||$.effects[ showAnim ])){
inst.dpDiv.hide(showAnim, $.tm_datepicker._get(inst, 'showOptions'), duration, postProcess);
}else{
inst.dpDiv[ showAnim==='slideDown' ? 'slideUp':showAnim==='fadeIn' ? 'fadeOut':'hide' ](showAnim ? duration:null, postProcess);
}
if(! showAnim){
postProcess();
}
this._datepickerShowing=false;
onClose=this._get(inst, 'onClose');
if(onClose){
onClose.apply(inst.input ? inst.input[ 0 ]:null, [ inst.input ? inst.input.val():'', inst ]);
}
this._lastInput=null;
if(this._inDialog){
this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
if($.blockUI){
$.unblockUI();
$('body').append(this.dpDiv);
}}
this._inDialog=false;
}},
_tidyDialog: function(inst){
inst.dpDiv.removeClass(this._dialogClass).off('.ui-tm-datepicker-calendar');
},
_checkExternalClick: function(event){
var $target;
var inst;
if(! $.tm_datepicker._curInst){
return;
}
$target=$(event.target);
inst=$.tm_datepicker._getInst($target[ 0 ]);
if(( $target[ 0 ].id!==$.tm_datepicker._mainDivId&&$target.parents('#' + $.tm_datepicker._mainDivId).length===0&&! $target.hasClass($.tm_datepicker.markerClassName)&&! $target.closest('.' + $.tm_datepicker._triggerClass).length&&$.tm_datepicker._datepickerShowing&&!($.tm_datepicker._inDialog&&$.blockUI))||($target.hasClass($.tm_datepicker.markerClassName)&&$.tm_datepicker._curInst!==inst)){
$.tm_datepicker._hideDatepicker();
}},
_adjustDate: function(id, offset, period){
var target=$(id),
inst=this._getInst(target[ 0 ]);
if(this._isDisabledDatepicker(target[ 0 ])){
return;
}
this._adjustInstDate(inst,
offset +(period==='M' ? this._get(inst, 'showCurrentAtPos'):0),
period
);
this._updateDatepicker(inst);
},
_gotoToday: function(id){
var date,
target=$(id),
inst=this._getInst(target[ 0 ]);
if(this._get(inst, 'gotoCurrent')&&inst.currentDay){
inst.selectedDay=inst.currentDay;
inst.drawMonth=inst.currentMonth;
inst.selectedMonth=inst.currentMonth;
inst.drawYear=inst.currentYear;
inst.selectedYear=inst.currentYear;
}else{
date=new Date();
inst.selectedDay=date.getDate();
inst.drawMonth=date.getMonth();
inst.selectedMonth=inst.drawMonth;
inst.drawYear=date.getFullYear();
inst.selectedYear=inst.drawYear;
}
this._notifyChange(inst);
this._adjustDate(target);
},
_selectMonthYear: function(id, select, period){
var target=$(id),
inst=this._getInst(target[ 0 ]);
inst[ 'selected' +(period==='M' ? 'Month':'Year') ]=parseInt(select.options[ select.selectedIndex ].value, 10);
inst[ 'draw' +(period==='M' ? 'Month':'Year') ]=parseInt(select.options[ select.selectedIndex ].value, 10);
this._notifyChange(inst);
this._adjustDate(target);
},
_selectDay: function(id, month, year, td){
var inst,
target=$(id);
if($(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[ 0 ])){
return;
}
inst=this._getInst(target[ 0 ]);
inst.selectedDay=$('a', td).html();
inst.currentDay=inst.selectedDay;
inst.selectedMonth=month;
inst.currentMonth=month;
inst.selectedYear=year;
inst.currentYear=year;
this._selectDate(id, this._formatDate(inst, inst.currentDay, inst.currentMonth, inst.currentYear));
},
_clearDate: function(id){
var target=$(id);
this._selectDate(target, '');
},
_selectDate: function(id, dateStr){
var onSelect,
target=$(id),
inst=this._getInst(target[ 0 ]);
dateStr=dateStr!==null ? dateStr:this._formatDate(inst);
if(inst.input){
inst.input.val(dateStr);
}
this._updateAlternate(inst);
onSelect=this._get(inst, 'onSelect');
if(onSelect){
onSelect.apply(inst.input ? inst.input[ 0 ]:null, [ dateStr, inst ]);
}else if(inst.input){
inst.input.trigger('change');
}
if(inst.inline){
this._updateDatepicker(inst);
}else{
this._hideDatepicker();
this._lastInput=inst.input[ 0 ];
if(typeof inst.input[ 0 ]!=='object'){
inst.input.trigger('focus');
}
this._lastInput=null;
}},
_updateAlternate: function(inst){
var altFormat,
date,
dateStr,
altField=this._get(inst, 'altField');
if(altField){
altFormat=this._get(inst, 'altFormat')||this._get(inst, 'dateFormat');
date=this._getDate(inst);
dateStr=this.formatDate(altFormat, date, this._getFormatConfig(inst));
$(altField).val(dateStr);
}},
noWeekends: function(date){
var day=date.getDay();
return [ day > 0&&day < 6, '' ];
},
iso8601Week: function(date){
var time,
checkDate=new Date(date.getTime());
checkDate.setDate(checkDate.getDate() + 4 -(checkDate.getDay()||7));
time=checkDate.getTime();
checkDate.setMonth(0);
checkDate.setDate(1);
return Math.floor(Math.round(( time - checkDate) / 86400000) / 7) + 1;
},
parseDate: function(format, value, settings){
var iFormat;
var dim;
var extra;
var iValue=0;
var shortYearCutoffTemp;
var shortYearCutoff;
var dayNamesShort;
var dayNames;
var monthNamesShort;
var monthNames;
var year=-1;
var month=-1;
var day=-1;
var doy=-1;
var literal=false;
var date;
var lookAhead;
var getNumber;
var getName;
var checkLiteral;
var condition;
if(format===null||value===null){
throw 'Invalid arguments';
}
value=typeof value==='object' ? value.toString():value + '';
if(value===''){
return null;
}
shortYearCutoffTemp=(settings ? settings.shortYearCutoff:null)||this._defaults.shortYearCutoff;
shortYearCutoff=typeof shortYearCutoffTemp!=='string' ? shortYearCutoffTemp:(new Date().getFullYear() % 100) + parseInt(shortYearCutoffTemp, 10);
dayNamesShort=(settings ? settings.dayNamesShort:null)||this._defaults.dayNamesShort;
dayNames=(settings ? settings.dayNames:null)||this._defaults.dayNames;
monthNamesShort=(settings ? settings.monthNamesShort:null)||this._defaults.monthNamesShort;
monthNames=(settings ? settings.monthNames:null)||this._defaults.monthNames;
lookAhead=function(match){
var matches=iFormat + 1 < format.length&&format.charAt(iFormat + 1)===match;
if(matches){
iFormat=iFormat + 1;
}
return matches;
};
getNumber=function(match){
var isDoubled=lookAhead(match),
size=match==='@' ? 14:match==='!' ? 20:match==='y'&&isDoubled ? 4:match==='o' ? 3:2,
minSize=match==='y' ? size:1,
digits=new RegExp('^\\d{' + minSize + ',' + size + '}'),
num=value.substring(iValue).match(digits);
if(! num){
throw 'Missing number at position ' + iValue;
}
iValue +=num[ 0 ].length;
return parseInt(num[ 0 ], 10);
};
getName=function(match, shortNames, longNames){
var index=-1,
names=$.map(lookAhead(match) ? longNames:shortNames, function(v, k){
return [ [ k, v ] ];
}).sort(function(a, b){
return -(a[ 1 ].length - b[ 1 ].length);
});
$.each(names, function(i, pair){
var name=pair[ 1 ];
if(value.substring(iValue, parseInt(iValue, 10) + name.length).toLowerCase()===name.toLowerCase()){
index=pair[ 0 ];
iValue +=name.length;
return false;
}});
if(index!==-1){
return index + 1;
}
throw 'Unknown name at position ' + iValue;
};
checkLiteral=function(){
if(value.charAt(iValue)!==format.charAt(iFormat)){
throw 'Unexpected literal at position ' + iValue;
}
iValue=iValue + 1;
};
for(iFormat=0; iFormat < format.length; iFormat +=1){
if(literal){
if(format.charAt(iFormat)==="'"&&! lookAhead("'")){
literal=false;
}else{
checkLiteral();
}}else{
switch(format.charAt(iFormat)){
case 'd':
day=getNumber('d');
break;
case 'D':
getName('D', dayNamesShort, dayNames);
break;
case 'o':
doy=getNumber('o');
break;
case 'm':
month=getNumber('m');
break;
case 'M':
month=getName('M', monthNamesShort, monthNames);
break;
case 'y':
year=getNumber('y');
break;
case '@':
date=new Date(getNumber('@'));
year=date.getFullYear();
month=date.getMonth() + 1;
day=date.getDate();
break;
case '!':
date=new Date(( getNumber('!') - this._ticksTo1970) / 10000);
year=date.getFullYear();
month=date.getMonth() + 1;
day=date.getDate();
break;
case "'":
if(lookAhead("'")){
checkLiteral();
}else{
literal=true;
}
break;
default:
checkLiteral();
}}
}
if(iValue < value.length){
extra=value.substring(iValue);
if(! /^\s+/.test(extra)){
throw 'Extra/unparsed characters found in date: ' + extra;
}}
if(year===-1){
year=new Date().getFullYear();
}else if(year < 100){
year +=new Date().getFullYear() -(new Date().getFullYear() % 100) +(year <=shortYearCutoff ? 0:-100);
}
if(doy > -1){
month=1;
day=doy;
condition=true;
do {
dim=this._getDaysInMonth(year, month - 1);
if(day <=dim){
condition=false;
}else{
month=month + 1;
day -=dim;
}} while(condition);
}
date=this._daylightSavingAdjust(new Date(year, month - 1, day));
if(date.getFullYear()!==year||date.getMonth() + 1!==month||date.getDate()!==day){
throw 'Invalid date';
}
return date;
},
ATOM: 'yy-mm-dd',
COOKIE: 'D, dd M yy',
ISO_8601: 'yy-mm-dd',
RFC_822: 'D, d M y',
RFC_850: 'DD, dd-M-y',
RFC_1036: 'D, d M y',
RFC_1123: 'D, d M yy',
RFC_2822: 'D, d M yy',
RSS: 'D, d M y',
TICKS: '!',
TIMESTAMP: '@',
W3C: 'yy-mm-dd',
_ticksTo1970:(((1970 - 1) * 365) + Math.floor(1970 / 4) - Math.floor(1970 / 100) + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000,
formatDate: function(format, date, settings){
var iFormat,
dayNamesShort=(settings ? settings.dayNamesShort:null)||this._defaults.dayNamesShort,
dayNames=(settings ? settings.dayNames:null)||this._defaults.dayNames,
monthNamesShort=(settings ? settings.monthNamesShort:null)||this._defaults.monthNamesShort,
monthNames=(settings ? settings.monthNames:null)||this._defaults.monthNames,
lookAhead=function(match){
var matches=iFormat + 1 < format.length&&format.charAt(iFormat + 1)===match;
if(matches){
iFormat=iFormat + 1;
}
return matches;
},
formatNumber=function(match, value, len){
var num='' + value;
if(lookAhead(match)){
while(num.length < len){
num='0' + num;
}}
return num;
},
formatName=function(match, value, shortNames, longNames){
return lookAhead(match) ? longNames[ value ]:shortNames[ value ];
},
output='',
literal=false;
if(! date){
return '';
}
if(date){
for(iFormat=0; iFormat < format.length; iFormat +=1){
if(literal){
if(format.charAt(iFormat)==="'"&&! lookAhead("'")){
literal=false;
}else{
output +=format.charAt(iFormat);
}}else{
switch(format.charAt(iFormat)){
case 'd':
output +=formatNumber('d', date.getDate(), 2);
break;
case 'D':
output +=formatName('D', date.getDay(), dayNamesShort, dayNames);
break;
case 'o':
output +=formatNumber('o', Math.round(( new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
break;
case 'm':
output +=formatNumber('m', date.getMonth() + 1, 2);
break;
case 'M':
output +=formatName('M', date.getMonth(), monthNamesShort, monthNames);
break;
case 'y':
output +=lookAhead('y') ? date.getFullYear():(date.getFullYear() % 100 < 10 ? '0':'') +(date.getFullYear() % 100);
break;
case '@':
output +=date.getTime();
break;
case '!':
output +=(date.getTime() * 10000) + this._ticksTo1970;
break;
case "'":
if(lookAhead("'")){
output +="'";
}else{
literal=true;
}
break;
default:
output +=format.charAt(iFormat);
}}
}}
return output;
},
_possibleChars: function(format){
var iFormat,
chars='',
literal=false,
lookAhead=function(match){
var matches=iFormat + 1 < format.length&&format.charAt(iFormat + 1)===match;
if(matches){
iFormat=iFormat + 1;
}
return matches;
};
for(iFormat=0; iFormat < format.length; iFormat +=1){
if(literal){
if(format.charAt(iFormat)==="'"&&! lookAhead("'")){
literal=false;
}else{
chars +=format.charAt(iFormat);
}}else{
switch(format.charAt(iFormat)){
case 'd':
case 'm':
case 'y':
case '@':
chars +='0123456789';
break;
case 'D':
case 'M':
return null;
case "'":
if(lookAhead("'")){
chars +="'";
}else{
literal=true;
}
break;
default:
chars +=format.charAt(iFormat);
}}
}
return chars;
},
_get: function(inst, name){
return inst.settings[ name ]!==undefined ? inst.settings[ name ]:this._defaults[ name ];
},
_setDateFromField: function(inst, noDefault){
var dateFormat;
var dates;
var defaultDate;
var date;
var settings;
if(inst.input.val()===inst.lastVal){
return;
}
dateFormat=this._get(inst, 'dateFormat');
dates=inst.input ? inst.input.val():null;
defaultDate=this._getDefaultDate(inst);
date=defaultDate;
settings=this._getFormatConfig(inst);
inst.lastVal=dates;
try {
date=this.parseDate(dateFormat, dates, settings)||defaultDate;
} catch(event){
dates=noDefault ? '':dates;
}
inst.selectedDay=date.getDate();
inst.selectedMonth=date.getMonth();
inst.drawMonth=inst.selectedMonth;
inst.selectedYear=date.getFullYear();
inst.drawYear=inst.selectedYear;
inst.currentDay=dates ? date.getDate():0;
inst.currentMonth=dates ? date.getMonth():0;
inst.currentYear=dates ? date.getFullYear():0;
this._adjustInstDate(inst);
},
_getDefaultDate: function(inst){
return this._restrictMinMax(inst, this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
},
_determineDate: function(inst, date, defaultDate){
var offsetNumeric=function(offset){
var sdate=new Date();
sdate.setDate(sdate.getDate() + offset);
return sdate;
},
offsetString=function(offset){
var sdate;
var year;
var month;
var day;
var pattern;
var matches;
try {
return $.tm_datepicker.parseDate($.tm_datepicker._get(inst, 'dateFormat'), offset, $.tm_datepicker._getFormatConfig(inst));
} catch(e){
}
sdate=(offset.toLowerCase().match(/^c/) ? $.tm_datepicker._getDate(inst):null)||new Date();
year=sdate.getFullYear();
month=sdate.getMonth();
day=sdate.getDate();
pattern=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
matches=pattern.exec(offset);
while(matches){
switch(matches[ 2 ]||'d'){
case 'd':
case 'D':
day +=parseInt(matches[ 1 ], 10);
break;
case 'w':
case 'W':
day +=parseInt(matches[ 1 ], 10) * 7;
break;
case 'm':
case 'M':
month +=parseInt(matches[ 1 ], 10);
day=Math.min(day, $.tm_datepicker._getDaysInMonth(year, month));
break;
case 'y':
case 'Y':
year +=parseInt(matches[ 1 ], 10);
day=Math.min(day, $.tm_datepicker._getDaysInMonth(year, month));
break;
}
matches=pattern.exec(offset);
}
return new Date(year, month, day);
},
newDate=date===null||date==='' ? defaultDate:typeof date==='string' ? offsetString(date):typeof date==='number' ?(! Number.isFinite(date) ? defaultDate:offsetNumeric(date)):new Date(date.getTime());
newDate=newDate&&newDate.toString()==='Invalid Date' ? defaultDate:newDate;
if(newDate){
newDate.setHours(0);
newDate.setMinutes(0);
newDate.setSeconds(0);
newDate.setMilliseconds(0);
}
return this._daylightSavingAdjust(newDate);
},
_daylightSavingAdjust: function(date){
if(! date){
return null;
}
date.setHours(date.getHours() > 12 ? date.getHours() + 2:0);
return date;
},
_setDate: function(inst, date, noChange){
var clear = ! date,
origMonth=inst.selectedMonth,
origYear=inst.selectedYear,
newDate=this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
inst.currentDay=newDate.getDate();
inst.selectedDay=inst.currentDay;
inst.currentMonth=newDate.getMonth();
inst.drawMonth=inst.currentMonth;
inst.selectedMonth=inst.currentMonth;
inst.currentYear=newDate.getFullYear();
inst.drawYear=inst.currentYear;
inst.selectedYear=inst.currentYear;
if(( origMonth!==inst.selectedMonth||origYear!==inst.selectedYear)&&! noChange){
this._notifyChange(inst);
}
this._adjustInstDate(inst);
if(inst.input){
inst.input.val(clear ? '':this._formatDate(inst));
}},
_getDate: function(inst){
var startDate = ! inst.currentYear||(inst.input&&inst.input.val()==='') ? null:this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
return startDate;
},
_attachHandlers: function(inst){
var stepMonths=this._get(inst, 'stepMonths'),
id='#' + inst.id.replace(/\\\\/g, '\\');
inst.dpDiv.find('[data-handler]').map(function(){
var handler={
prevM: function(){
$.tm_datepicker._adjustDate(id, -1, 'M');
},
nextM: function(){
$.tm_datepicker._adjustDate(id, +1, 'M');
},
prevY: function(){
$.tm_datepicker._adjustDate(id, -1, 'Y');
},
nextY: function(){
$.tm_datepicker._adjustDate(id, +1, 'Y');
},
prev: function(){
$.tm_datepicker._adjustDate(id, -stepMonths, 'M');
},
next: function(){
$.tm_datepicker._adjustDate(id, +stepMonths, 'M');
},
hide: function(){
$.tm_datepicker._hideDatepicker();
},
today: function(){
},
selectDay: function(){
$.tm_datepicker._selectDay(id, +this.getAttribute('data-month'), +this.getAttribute('data-year'), this);
return false;
},
selectMonth: function(){
$.tm_datepicker._selectMonthYear(id, this, 'M');
return false;
},
selectYear: function(){
$.tm_datepicker._selectMonthYear(id, this, 'Y');
return false;
}};
$(this).on(this.getAttribute('data-event'), handler[ this.getAttribute('data-handler') ]);
return null;
});
},
_tm_canAdjustMonth: function(inst, offset, curYear, curMonth){
var date=this._daylightSavingAdjust(new Date(curYear, curMonth + offset, 1));
if(offset < 0){
date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
}
return this._isInRange(inst, date);
},
_generateHTML: function(inst){
var maxDraw,
prevText,
prev,
nextText,
next,
currentText,
gotoDate,
firstDay,
showWeek,
dayNames,
dayNamesMin,
monthNames,
beforeShowDay,
showOtherMonths,
selectOtherMonths,
defaultDate,
html,
dow,
row,
group,
col,
selectedDate,
cornerClass,
calender,
thead,
day,
daysInMonth,
leadDays,
curRows,
numRows,
printDate,
dRow,
tbody,
daySettings,
otherMonth,
unselectable,
tempDate=new Date(),
today=this._daylightSavingAdjust(new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())),
isRTL=this._get(inst, 'isRTL'),
showButtonPanel=this._get(inst, 'showButtonPanel'),
hideIfNoPrevNext=this._get(inst, 'hideIfNoPrevNext'),
navigationAsDateFormat=this._get(inst, 'navigationAsDateFormat'),
numMonths=this._getNumberOfMonths(inst),
showCurrentAtPos=this._get(inst, 'showCurrentAtPos'),
stepMonths=this._get(inst, 'stepMonths'),
isMultiMonth=numMonths[ 0 ]!==1||numMonths[ 1 ]!==1,
currentDate=this._daylightSavingAdjust(! inst.currentDay ? new Date(9999, 9, 9):new Date(inst.currentYear, inst.currentMonth, inst.currentDay)),
minDate=this._getMinMaxDate(inst, 'min'),
maxDate=this._getMinMaxDate(inst, 'max'),
drawMonth=inst.drawMonth - showCurrentAtPos,
drawYear=inst.drawYear,
tm_month,
tm_year,
tm_prev_arrow_m,
tm_next_arrow_m,
tm_prev_arrow_y,
tm_next_arrow_y,
tm_controls,
tm_buttonPanel;
var can_adjust_1;
var can_adjust_2;
var can_adjust_3;
var can_adjust_4;
if(drawMonth < 0){
drawMonth +=12;
drawYear -=1;
}
if(maxDate){
maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(), maxDate.getMonth() -(numMonths[ 0 ] * numMonths[ 1 ]) + 1, maxDate.getDate()));
maxDraw=minDate&&maxDraw < minDate ? minDate:maxDraw;
while(this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw){
drawMonth -=1;
if(drawMonth < 0){
drawMonth=11;
drawYear -=1;
}}
}
inst.drawMonth=drawMonth;
inst.drawYear=drawYear;
prevText=this._get(inst, 'prevText');
prevText = ! navigationAsDateFormat ? prevText:this.formatDate(prevText, this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), this._getFormatConfig(inst));
prev=this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? "<a class='ui-tm-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" + " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" +(isRTL ? 'e':'w') + "'>" + prevText + '</span></a>':hideIfNoPrevNext ? '':"<a class='ui-tm-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" +(isRTL ? 'e':'w') + "'>" + prevText + '</span></a>';
nextText=this._get(inst, 'nextText');
nextText = ! navigationAsDateFormat ? nextText:this.formatDate(nextText, this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), this._getFormatConfig(inst));
next=this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? "<a class='ui-tm-datepicker-next ui-corner-all' data-handler='next' data-event='click'" + " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" +(isRTL ? 'w':'e') + "'>" + nextText + '</span></a>':hideIfNoPrevNext ? '':"<a class='ui-tm-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" +(isRTL ? 'w':'e') + "'>" + nextText + '</span></a>';
currentText=this._get(inst, 'currentText');
gotoDate=this._get(inst, 'gotoCurrent')&&inst.currentDay ? currentDate:today;
currentText = ! navigationAsDateFormat ? currentText:this.formatDate(currentText, gotoDate, this._getFormatConfig(inst));
tm_controls = ! inst.inline ? "<div class='tm-ui-dp-btn-wrap tm-ui-dp-close'><div role='button' class='tm-ui-dp-btn ui-tm-datepicker-close' data-handler='hide' data-event='click'>" + this._get(inst, 'closeText') + '</div></div>':'';
tm_buttonPanel=showButtonPanel ? "<div class='tm-ui-dp-buttonpane'>" +(isRTL ? tm_controls:'') +(this._isInRange(inst, gotoDate) ? "<div class='tm-ui-dp-btn-wrap tm-ui-dp-current'><div role='button' class='tm-ui-dp-btn ui-tm-datepicker-current' data-handler='today' data-event='click'" + '>' + currentText + '</div></div>':'') +(isRTL ? '':tm_controls) + '</div>':'';
firstDay=parseInt(this._get(inst, 'firstDay'), 10);
firstDay=isNaN(firstDay) ? 0:firstDay;
showWeek=this._get(inst, 'showWeek');
dayNames=this._get(inst, 'dayNames');
dayNamesMin=this._get(inst, 'dayNamesMin');
monthNames=this._get(inst, 'monthNames');
beforeShowDay=this._get(inst, 'beforeShowDay');
showOtherMonths=this._get(inst, 'showOtherMonths');
selectOtherMonths=this._get(inst, 'selectOtherMonths');
defaultDate=this._getDefaultDate(inst);
html='';
can_adjust_1=this._tm_canAdjustMonth(inst, -1, drawYear, drawMonth);
can_adjust_2=this._tm_canAdjustMonth(inst, +1, drawYear, drawMonth);
can_adjust_3=this._tm_canAdjustMonth(inst, -12, drawYear, drawMonth);
can_adjust_4=this._tm_canAdjustMonth(inst, +12, drawYear, drawMonth);
tm_prev_arrow_m='<div class="tm-ui-dp-button-prev tm-ui-dp-button">' + '<div ' +(can_adjust_1 ? 'data-handler="prevM" data-event="click" ':'') + 'aria-label="' + prevText + '" class="' +(can_adjust_1 ? '':'tm-ui-dp-button-disabled ') + 'tm-ui-dp-button-arrow tcfa tcfa-angle-left" tabindex="0" role="button"></div>' + '</div>';
tm_next_arrow_m='<div class="tm-ui-dp-button-next tm-ui-dp-button">' + '<div ' +(can_adjust_2 ? 'data-handler="nextM" data-event="click" ':'') + 'aria-label="' + nextText + '" class="' +(can_adjust_2 ? '':'tm-ui-dp-button-disabled ') + 'tm-ui-dp-button-arrow tcfa tcfa-angle-right" tabindex="0" role="button"></div>' + '</div>';
tm_prev_arrow_y='<div class="tm-ui-dp-button-prev tm-ui-dp-button">' + '<div ' +(can_adjust_3 ? 'data-handler="prevY" data-event="click" ':'') + 'aria-label="' + prevText + '" class="' +(can_adjust_3 ? '':'tm-ui-dp-button-disabled ') + 'tm-ui-dp-button-arrow tcfa tcfa-angle-left" tabindex="0" role="button"></div>' + '</div>';
tm_next_arrow_y='<div class="tm-ui-dp-button-next tm-ui-dp-button">' + '<div ' +(can_adjust_4 ? 'data-handler="nextY" data-event="click" ':'') + 'aria-label="' + nextText + '" class="' +(can_adjust_4 ? '':'tm-ui-dp-button-disabled ') + 'tm-ui-dp-button-arrow tcfa tcfa-angle-right" tabindex="0" role="button"></div>' + '</div>';
tm_month=hideIfNoPrevNext ? '':'<div class="tm-ui-dp-title-button">' +(isRTL ? tm_next_arrow_m:tm_prev_arrow_m) + '<span aria-label="' + monthNames[ drawMonth ] + '" role="button" class="tm-ui-dp-month">' + monthNames[ drawMonth ] + '</span>' +(isRTL ? tm_prev_arrow_m:tm_next_arrow_m) + '</div>';
tm_year=hideIfNoPrevNext ? '':'<div class="tm-ui-dp-title-button">' +(isRTL ? tm_next_arrow_y:tm_prev_arrow_y) + '<span class="tm-ui-dp-year" role="button" aria-label="' + drawYear + '">' + drawYear + '</span>' +(isRTL ? tm_prev_arrow_y:tm_next_arrow_y) + '</div>';
html +="<div class='tm-ui-dp-wrap'>" + "<div class='tm-ui-dp-overlay'></div>" + "<div class='tm-ui-dp'>" + "<div class='tm-ui-dp-container'>" + "<div class='tm-ui-dp-inner-container'>" + "<div class='tm-ui-dp-ui'>" + "<div class='tm-ui-dp-ui-inner'>" + "<div class='tm-ui-dp-main-wrap'>" + "<div class='tm-ui-dp-main'>";
for(row=0; row < numMonths[ 0 ]; row +=1){
group='';
this.maxRows=4;
for(col=0; col < numMonths[ 1 ]; col +=1){
selectedDate=this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
cornerClass=' ui-corner-all';
calender='';
if(isMultiMonth){
calender +="<div class='ui-tm-datepicker-group";
if(numMonths[ 1 ] > 1){
switch(col){
case 0:
calender +=' ui-tm-datepicker-group-first';
cornerClass=' ui-corner-' +(isRTL ? 'right':'left');
break;
case numMonths[ 1 ] - 1:
calender +=' ui-tm-datepicker-group-last';
cornerClass=' ui-corner-' +(isRTL ? 'left':'right');
break;
default:
calender +=' ui-tm-datepicker-group-middle';
cornerClass='';
break;
}}
calender +="'>";
}
calender +=
"<div class='tm-ui-dp-header ui-tm-datepicker-header ui-widget-header ui-helper-clearfix" +
cornerClass +
"'>" +
(/all|left/.test(cornerClass)&&row===0 ?(isRTL ? next:prev):'') +
(/all|right/.test(cornerClass)&&row===0 ?(isRTL ? prev:next):'') +
'<div class="ui-tm-datepicker-title tm-ui-dp-title">' +
(/all|left/.test(cornerClass)&&row===0 ?(isRTL ? tm_year + tm_month:tm_month + tm_year):'') +
'</div>' +
'</div>';
calender +="<div class='tm-ui-dp-main-content'>";
calender +="<div class='tm-ui-dp-main-header-wrap'><div class='tm-ui-dp-main-header'>";
calender +="<table class='ui-tm-datepicker-calendar'><tbody>" + '<tr>';
thead=showWeek ? "<th class='ui-tm-datepicker-week-col'>" + this._get(inst, 'weekHeader') + '</th>':'';
for(dow=0; dow < 7; dow +=1){
day=(dow + firstDay) % 7;
thead +="<th scope='col'" +(( dow + firstDay + 6) % 7 >=5 ? " class='ui-tm-datepicker-week-end'":'') + '>' + "<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + '</span></th>';
}
calender +=thead + '</tr></tbody></table>';
calender +='</div></div>';
calender +="<div class='tm-ui-dp-main-table'>";
daysInMonth=this._getDaysInMonth(drawYear, drawMonth);
if(drawYear===inst.selectedYear&&drawMonth===inst.selectedMonth){
inst.selectedDay=Math.min(inst.selectedDay, daysInMonth);
}
leadDays=(this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
curRows=6;
numRows=isMultiMonth ?(this.maxRows > curRows ? this.maxRows:curRows):curRows;
this.maxRows=numRows;
printDate=this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
for(dRow=0; dRow < numRows; dRow +=1){
calender +="<div class='tm-ui-dp-main-row'>";
tbody = ! showWeek ? '':"<div class='ui-tm-datepicker-week-col'>" + this._get(inst, 'calculateWeek')(printDate) + '</div>';
for(dow=0; dow < 7; dow +=1){
daySettings=beforeShowDay ? beforeShowDay.apply(inst.input ? inst.input[ 0 ]:null, [ printDate ]):[ true, '' ];
otherMonth=printDate.getMonth()!==drawMonth;
unselectable=(otherMonth&&! selectOtherMonths)||! daySettings[ 0 ]||(minDate&&printDate < minDate)||(maxDate&&printDate > maxDate);
tbody +=
"<div class='tm-ui-dp-main-cell " +
(( dow + firstDay + 6) % 7 >=5 ? ' ui-tm-datepicker-week-end':'') +
(otherMonth ? ' ui-tm-datepicker-other-month':'') +
(( printDate.getTime()===selectedDate.getTime()&&drawMonth===inst.selectedMonth&&inst._keyEvent)||(defaultDate.getTime()===printDate.getTime()&&defaultDate.getTime()===selectedDate.getTime()) ? ' ' + this._dayOverClass:'') +
(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled':'') +
(otherMonth&&! showOtherMonths ? '':' ' + daySettings[ 1 ] +(printDate.getTime()===currentDate.getTime() ? ' ' + this._currentClass:'') +(printDate.getTime()===today.getTime() ? ' ui-tm-datepicker-today':'')) +
"'" +
(( ! otherMonth||showOtherMonths)&&daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace(/'/g, '&#39;') + "'":'') +
(unselectable ? '':" data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") +
'>' +
"<div class='tm-ui-dp-main-cell-inner'>" +
"<div class='tm-ui-dp-main-cell-content'>" +
(otherMonth&&! showOtherMonths ? '&#xa0;':unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + '</span>':"<a class='ui-state-default" +(printDate.getTime()===today.getTime() ? ' ui-state-highlight':'') +(printDate.getTime()===currentDate.getTime() ? ' ui-state-active':'') +(otherMonth ? ' ui-priority-secondary':'') + "' href='#'>" + printDate.getDate() + '</a>') +
'</div></div>' +
'</div>';
printDate.setDate(printDate.getDate() + 1);
printDate=this._daylightSavingAdjust(printDate);
}
calender +=tbody + '</div>';
}
drawMonth +=1;
if(drawMonth > 11){
drawMonth=0;
drawYear +=1;
}
calender +='</div>';
calender +='</div>' +(isMultiMonth ? '</div>' +(numMonths[ 0 ] > 0&&col===numMonths[ 1 ] - 1 ? "<div class='ui-tm-datepicker-row-break'></div>":''):'');
group +=calender;
}
html +=group;
}
html +='</div></div></div></div></div>';
html +=tm_buttonPanel;
html +='</div></div></div>';
inst._keyEvent=false;
return html;
},
_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, secondary, monthNames, monthNamesShort){
var inMinYear,
inMaxYear,
month,
years,
thisYear,
determineYear,
year,
endYear,
changeMonth=this._get(inst, 'changeMonth'),
changeYear=this._get(inst, 'changeYear'),
showMonthAfterYear=this._get(inst, 'showMonthAfterYear'),
html="<div class='ui-tm-datepicker-title'>",
monthHtml='';
if(secondary||! changeMonth){
monthHtml +="<span class='ui-tm-datepicker-month'>" + monthNames[ drawMonth ] + '</span>';
}else{
inMinYear=minDate&&minDate.getFullYear()===drawYear;
inMaxYear=maxDate&&maxDate.getFullYear()===drawYear;
monthHtml +="<select class='ui-tm-datepicker-month' data-handler='selectMonth' data-event='change'>";
for(month=0; month < 12; month +=1){
if(( ! inMinYear||month >=minDate.getMonth())&&(! inMaxYear||month <=maxDate.getMonth())){
monthHtml +="<option value='" + month + "'" +(month===drawMonth ? " selected='selected'":'') + '>' + monthNamesShort[ month ] + '</option>';
}}
monthHtml +='</select>';
}
if(! showMonthAfterYear){
html +=monthHtml +(secondary||!(changeMonth&&changeYear) ? '&#xa0;':'');
}
if(! inst.yearshtml){
inst.yearshtml='';
if(secondary||! changeYear){
html +="<span class='ui-tm-datepicker-year'>" + drawYear + '</span>';
}else{
years=this._get(inst, 'yearRange').split(':');
thisYear=new Date().getFullYear();
determineYear=function(value){
var syear=value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10):value.match(/[+-].*/) ? thisYear + parseInt(value, 10):parseInt(value, 10);
return isNaN(syear) ? thisYear:syear;
};
year=determineYear(years[ 0 ]);
endYear=Math.max(year, determineYear(years[ 1 ]||''));
year=minDate ? Math.max(year, minDate.getFullYear()):year;
endYear=maxDate ? Math.min(endYear, maxDate.getFullYear()):endYear;
inst.yearshtml +="<select class='ui-tm-datepicker-year' data-handler='selectYear' data-event='change'>";
for(; year <=endYear; year +=1){
inst.yearshtml +="<option value='" + year + "'" +(year===drawYear ? " selected='selected'":'') + '>' + year + '</option>';
}
inst.yearshtml +='</select>';
html +=inst.yearshtml;
inst.yearshtml=null;
}}
html +=this._get(inst, 'yearSuffix');
if(showMonthAfterYear){
html +=(secondary||!(changeMonth&&changeYear) ? '&#xa0;':'') + monthHtml;
}
html +='</div>';
return html;
},
_adjustInstDate: function(inst, offset, period){
var year=inst.selectedYear +(period==='Y' ? offset:0),
month=inst.selectedMonth +(period==='M' ? offset:0),
day=Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +(period==='D' ? offset:0),
date=this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
inst.selectedDay=date.getDate();
inst.selectedMonth=date.getMonth();
inst.drawMonth=inst.selectedMonth;
inst.selectedYear=date.getFullYear();
inst.drawYear=inst.selectedYear;
if(period==='M'||period==='Y'){
this._notifyChange(inst);
}},
_restrictMinMax: function(inst, date){
var minDate=this._getMinMaxDate(inst, 'min'),
maxDate=this._getMinMaxDate(inst, 'max'),
newDate=minDate&&date < minDate ? minDate:date;
return maxDate&&newDate > maxDate ? maxDate:newDate;
},
_notifyChange: function(inst){
var onChange=this._get(inst, 'onChangeMonthYear');
if(onChange){
onChange.apply(inst.input ? inst.input[ 0 ]:null, [ inst.selectedYear, inst.selectedMonth + 1, inst ]);
}},
_getNumberOfMonths: function(inst){
var numMonths=this._get(inst, 'numberOfMonths');
return numMonths===null ? [ 1, 1 ]:typeof numMonths==='number' ? [ 1, numMonths ]:numMonths;
},
_getMinMaxDate: function(inst, minMax){
return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
},
_getDaysInMonth: function(year, month){
return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
},
_getFirstDayOfMonth: function(year, month){
return new Date(year, month, 1).getDay();
},
_canAdjustMonth: function(inst, offset, curYear, curMonth){
var numMonths=this._getNumberOfMonths(inst),
date=this._daylightSavingAdjust(new Date(curYear, curMonth +(offset < 0 ? offset:numMonths[ 0 ] * numMonths[ 1 ]), 1));
if(offset < 0){
date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
}
return this._isInRange(inst, date);
},
_isInRange: function(inst, date){
var yearSplit,
currentYear,
minDate=this._getMinMaxDate(inst, 'min'),
maxDate=this._getMinMaxDate(inst, 'max'),
minYear=null,
maxYear=null,
years=this._get(inst, 'yearRange');
if(years){
yearSplit=years.split(':');
currentYear=new Date().getFullYear();
minYear=parseInt(yearSplit[ 0 ], 10);
maxYear=parseInt(yearSplit[ 1 ], 10);
if(yearSplit[ 0 ].match(/[+-].*/)){
minYear +=currentYear;
}
if(yearSplit[ 1 ].match(/[+-].*/)){
maxYear +=currentYear;
}}
return(! minDate||date.getTime() >=minDate.getTime())&&(! maxDate||date.getTime() <=maxDate.getTime())&&(! minYear||date.getFullYear() >=minYear)&&(! maxYear||date.getFullYear() <=maxYear);
},
_getFormatConfig: function(inst){
var shortYearCutoff=this._get(inst, 'shortYearCutoff');
shortYearCutoff=typeof shortYearCutoff!=='string' ? shortYearCutoff:(new Date().getFullYear() % 100) + parseInt(shortYearCutoff, 10);
return {
shortYearCutoff: shortYearCutoff,
dayNamesShort: this._get(inst, 'dayNamesShort'),
dayNames: this._get(inst, 'dayNames'),
monthNamesShort: this._get(inst, 'monthNamesShort'),
monthNames: this._get(inst, 'monthNames')
};},
_formatDate: function(inst, day, month, year){
var date;
if(! day){
inst.currentDay=inst.selectedDay;
inst.currentMonth=inst.selectedMonth;
inst.currentYear=inst.selectedYear;
}
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));
}});
$.fn.tm_datepicker=function(options){
var otherArgs;
if(! this.length){
return this;
}
if(! $.tm_datepicker.initialized){
$(document).on('mousedown', $.tm_datepicker._checkExternalClick);
$.tm_datepicker.initialized=true;
}
if($('#' + $.tm_datepicker._mainDivId).length===0){
$('body').append($.tm_datepicker.dpDiv);
}
otherArgs=Array.prototype.slice.call(arguments, 1);
if(typeof options==='string'&&(options==='isDisabled'||options==='getDate'||options==='widget')){
return $.tm_datepicker[ '_' + options + 'Datepicker' ].apply($.tm_datepicker, [ this[ 0 ] ].concat(otherArgs));
}
if(options==='option'&&arguments.length===2&&typeof arguments[ 1 ]==='string'){
return $.tm_datepicker[ '_' + options + 'Datepicker' ].apply($.tm_datepicker, [ this[ 0 ] ].concat(otherArgs));
}
return this.each(function(){
if(typeof options==='string'){
$.tm_datepicker[ '_' + options + 'Datepicker' ].apply($.tm_datepicker, [ this ].concat(otherArgs));
}else{
$.tm_datepicker._attachDatepicker(this, options);
}});
};
$.tm_datepicker=new Datepicker();
$.tm_datepicker.initialized=false;
$.tm_datepicker.uuid=new Date().getTime();
$.tm_datepicker.version='1.11.4';
}));