UNPKG

@paralogic/air-datepicker

Version:

Lightweight customizable cross-browser jQuery datepicker, built with es5 and css-flexbox. Works in all modern desktop and mobile browsers (tested no Android 4.4+ and iOS8+) ![air datepicker image](https://github.com/t1m0n/air-datepicker/raw/master/docs/i

1 lines 36.6 kB
!function(e,n,a){function s(e,t){this.el=e,this.$el=n(e),this.opts=n.extend(!0,{},r,t,this.$el.data()),i==a&&(i=n("body")),this.opts.startDate||(this.opts.startDate=new Date),"INPUT"==this.el.nodeName&&(this.elIsInput=!0),this.opts.altField&&(this.$altField="string"==typeof this.opts.altField?n(this.opts.altField):this.opts.altField),this.inited=!1,this.visible=!1,this.silent=!1,this.currentDate=this.opts.startDate,this.currentView=this.opts.view,this._createShortCuts(),this.selectedDates=[],this.views={},this.keys=[],this.minRange="",this.maxRange="",this._prevOnSelectValue="",this.init()}var i,t,h,o,r,d,u,c,m,l,p,g;r={classes:"",inline:o=!(h="datepicker"),language:"ru",startDate:new Date,firstDay:"",weekends:[6,0],dateFormat:"",altField:"",altFieldDateFormat:"@",toggleSelected:!0,keyboardNav:!0,position:"bottom left",offset:12,view:"days",minView:"days",showOtherMonths:!0,selectOtherMonths:!0,moveToOtherMonthsOnSelect:!0,showOtherYears:!0,selectOtherYears:!0,moveToOtherYearsOnSelect:!0,minDate:"",maxDate:"",disableNavWhenOutOfRange:!0,multipleDates:!1,multipleDatesSeparator:",",range:!1,todayButton:!1,clearButton:!1,showEvent:"focus",autoClose:!1,monthsField:"monthsShort",prevHtml:'<svg><path d="M 17,12 l -5,5 l 5,5"></path></svg>',nextHtml:'<svg><path d="M 14,12 l 5,5 l -5,5"></path></svg>',navTitles:{days:"MM, <i>yyyy</i>",months:"yyyy",years:"yyyy1 - yyyy2"},timepicker:!1,onlyTimepicker:!1,dateTimeSeparator:" ",timeFormat:"",minHours:0,maxHours:24,minMinutes:0,maxMinutes:59,minSeconds:0,maxSeconds:59,hoursStep:1,minutesStep:1,secondsStep:1,onSelect:"",onShow:"",onHide:"",onChangeMonth:"",onChangeYear:"",onChangeDecade:"",onChangeView:"",onRenderCell:""},d={ctrlRight:[17,39],ctrlUp:[17,38],ctrlLeft:[17,37],ctrlDown:[17,40],shiftRight:[16,39],shiftUp:[16,38],shiftLeft:[16,37],shiftDown:[16,40],altUp:[18,38],altRight:[18,39],altLeft:[18,37],altDown:[18,40],ctrlShiftUp:[16,17,38]},(u=s).prototype={VERSION:"2.2.3",viewIndexes:["days","months","years"],init:function(){o||this.opts.inline||!this.elIsInput||this._buildDatepickersContainer(),this._buildBaseHtml(),this._defineLocale(this.opts.language),this._syncWithMinMaxDates(),this.elIsInput&&(this.opts.inline||(this._setPositionClasses(this.opts.position),this._bindEvents()),this.opts.keyboardNav&&!this.opts.onlyTimepicker&&this._bindKeyboardEvents(),this.$datepicker.on("mousedown",this._onMouseDownDatepicker.bind(this)),this.$datepicker.on("mouseup",this._onMouseUpDatepicker.bind(this))),this.opts.classes&&this.$datepicker.addClass(this.opts.classes),this.opts.timepicker&&(this.timepicker=new n.fn.datepicker.Timepicker(this,this.opts),this._bindTimepickerEvents()),this.opts.onlyTimepicker&&this.$datepicker.addClass("-only-timepicker-"),this.views[this.currentView]=new n.fn.datepicker.Body(this,this.currentView,this.opts),this.views[this.currentView].show(),this.nav=new n.fn.datepicker.Navigation(this,this.opts),this.view=this.currentView,this.$el.on("clickCell.adp",this._onClickCell.bind(this)),this.$datepicker.on("mouseenter",".datepicker--cell",this._onMouseEnterCell.bind(this)),this.$datepicker.on("mouseleave",".datepicker--cell",this._onMouseLeaveCell.bind(this)),this.inited=!0},_createShortCuts:function(){this.minDate=this.opts.minDate||new Date(-86399999136e5),this.maxDate=this.opts.maxDate||new Date(86399999136e5)},_bindEvents:function(){this.$el.on(this.opts.showEvent+".adp",this._onShowEvent.bind(this)),this.$el.on("mouseup.adp",this._onMouseUpEl.bind(this)),this.$el.on("blur.adp",this._onBlur.bind(this)),this.$el.on("keyup.adp",this._onKeyUpGeneral.bind(this)),n(e).on("resize.adp",this._onResize.bind(this)),n("body").on("mouseup.adp",this._onMouseUpBody.bind(this))},_bindKeyboardEvents:function(){this.$el.on("keydown.adp",this._onKeyDown.bind(this)),this.$el.on("keyup.adp",this._onKeyUp.bind(this)),this.$el.on("hotKey.adp",this._onHotKey.bind(this))},_bindTimepickerEvents:function(){this.$el.on("timeChange.adp",this._onTimeChange.bind(this))},isWeekend:function(e){return-1!==this.opts.weekends.indexOf(e)},_defineLocale:function(e){"string"==typeof e?(this.loc=n.fn.datepicker.language[e],this.loc||(console.warn("Can't find language \""+e+'" in Datepicker.language, will use "ru" instead'),this.loc=n.extend(!0,{},n.fn.datepicker.language.ru)),this.loc=n.extend(!0,{},n.fn.datepicker.language.ru,n.fn.datepicker.language[e])):this.loc=n.extend(!0,{},n.fn.datepicker.language.ru,e),this.opts.dateFormat&&(this.loc.dateFormat=this.opts.dateFormat),this.opts.timeFormat&&(this.loc.timeFormat=this.opts.timeFormat),""!==this.opts.firstDay&&(this.loc.firstDay=this.opts.firstDay),this.opts.timepicker&&(this.loc.dateFormat=[this.loc.dateFormat,this.loc.timeFormat].join(this.opts.dateTimeSeparator)),this.opts.onlyTimepicker&&(this.loc.dateFormat=this.loc.timeFormat);e=this._getWordBoundaryRegExp;(this.loc.timeFormat.match(e("aa"))||this.loc.timeFormat.match(e("AA")))&&(this.ampm=!0)},_buildDatepickersContainer:function(){o=!0,i.append('<div class="datepickers-container" id="datepickers-container"></div>'),t=n("#datepickers-container")},_buildBaseHtml:function(){var e=n('<div class="datepicker-inline">'),e="INPUT"==this.el.nodeName?this.opts.inline?e.insertAfter(this.$el):t:e.appendTo(this.$el);this.$datepicker=n('<div class="datepicker"><i class="datepicker--pointer"></i><nav class="datepicker--nav"></nav><div class="datepicker--content"></div></div>').appendTo(e),this.$content=n(".datepicker--content",this.$datepicker),this.$nav=n(".datepicker--nav",this.$datepicker)},_triggerOnChange:function(){if(!this.selectedDates.length)return""===this._prevOnSelectValue?void 0:(this._prevOnSelectValue="",this.opts.onSelect("","",this));var e=this.selectedDates,t=u.getParsedDate(e[0]),s=this,t=new Date(t.year,t.month,t.date,t.hours,t.minutes,t.seconds),i=e.map(function(e){return s.formatDate(s.loc.dateFormat,e)}).join(this.opts.multipleDatesSeparator);(this.opts.multipleDates||this.opts.range)&&(t=e.map(function(e){e=u.getParsedDate(e);return new Date(e.year,e.month,e.date,e.hours,e.minutes,e.seconds)})),this._prevOnSelectValue=i,this.opts.onSelect(i,t,this)},next:function(){var e=this.parsedDate,t=this.opts;switch(this.view){case"days":this.date=new Date(e.year,e.month+1,1),t.onChangeMonth&&t.onChangeMonth(this.parsedDate.month,this.parsedDate.year);break;case"months":this.date=new Date(e.year+1,e.month,1),t.onChangeYear&&t.onChangeYear(this.parsedDate.year);break;case"years":this.date=new Date(e.year+10,0,1),t.onChangeDecade&&t.onChangeDecade(this.curDecade)}},prev:function(){var e=this.parsedDate,t=this.opts;switch(this.view){case"days":this.date=new Date(e.year,e.month-1,1),t.onChangeMonth&&t.onChangeMonth(this.parsedDate.month,this.parsedDate.year);break;case"months":this.date=new Date(e.year-1,e.month,1),t.onChangeYear&&t.onChangeYear(this.parsedDate.year);break;case"years":this.date=new Date(e.year-10,0,1),t.onChangeDecade&&t.onChangeDecade(this.curDecade)}},formatDate:function(e,t){t=t||this.date;var s=e,i=this._getWordBoundaryRegExp,a=this.loc,n=u.getLeadingZeroNum,h=u.getDecade(t),o=u.getParsedDate(t),r=o.fullHours,d=o.hours,e=e.match(i("aa"))||e.match(i("AA")),c="am",l=this._replacer;switch(this.opts.timepicker&&this.timepicker&&e&&(r=n((n=this.timepicker._getValidHoursFromDate(t,e)).hours),d=n.hours,c=n.dayPeriod),!0){case/@/.test(s):s=s.replace(/@/,t.getTime());case/aa/.test(s):s=l(s,i("aa"),c);case/AA/.test(s):s=l(s,i("AA"),c.toUpperCase());case/dd/.test(s):s=l(s,i("dd"),o.fullDate);case/d/.test(s):s=l(s,i("d"),o.date);case/DD/.test(s):s=l(s,i("DD"),a.days[o.day]);case/D/.test(s):s=l(s,i("D"),a.daysShort[o.day]);case/mm/.test(s):s=l(s,i("mm"),o.fullMonth);case/m/.test(s):s=l(s,i("m"),o.month+1);case/MM/.test(s):s=l(s,i("MM"),this.loc.months[o.month]);case/M/.test(s):s=l(s,i("M"),a.monthsShort[o.month]);case/ss/.test(s):s=l(s,i("ss"),o.fullSeconds);case/s/.test(s):s=l(s,i("s"),o.seconds);case/ii/.test(s):s=l(s,i("ii"),o.fullMinutes);case/i/.test(s):s=l(s,i("i"),o.minutes);case/hh/.test(s):s=l(s,i("hh"),r);case/h/.test(s):s=l(s,i("h"),d);case/yyyy/.test(s):s=l(s,i("yyyy"),o.year);case/yyyy1/.test(s):s=l(s,i("yyyy1"),h[0]);case/yyyy2/.test(s):s=l(s,i("yyyy2"),h[1]);case/yy/.test(s):s=l(s,i("yy"),o.year.toString().slice(-2))}return s},_replacer:function(e,t,a){return e.replace(t,function(e,t,s,i){return t+a+i})},_getWordBoundaryRegExp:function(e){var t="\\s|\\.|-|/|\\\\|,|\\$|\\!|\\?|:|;";return new RegExp("(^|>|"+t+")("+e+")($|<|"+t+")","g")},selectDate:function(e){var t=this,s=t.opts,i=t.parsedDate,a=t.selectedDates.length,n="";if(Array.isArray(e))e.forEach(function(e){t.selectDate(e)});else if(e instanceof Date){if(this.lastSelectedDate=e,this.timepicker&&this.timepicker._setTime(e),t._trigger("selectDate",e),this.timepicker&&(e.setHours(this.timepicker.hours),e.setMinutes(this.timepicker.minutes),e.setSeconds(this.timepicker.seconds)),"days"==t.view&&e.getMonth()!=i.month&&s.moveToOtherMonthsOnSelect&&(n=new Date(e.getFullYear(),e.getMonth(),1)),(n="years"==t.view&&e.getFullYear()!=i.year&&s.moveToOtherYearsOnSelect?new Date(e.getFullYear(),0,1):n)&&(t.silent=!0,t.date=n,t.silent=!1,t.nav._render()),s.multipleDates&&!s.range){if(a===s.multipleDates)return;t._isSelected(e)||t.selectedDates.push(e)}else s.range?2==a?(t.selectedDates=[e],t.minRange=e,t.maxRange=""):1==a?(t.selectedDates.push(e),t.maxRange?t.minRange=e:t.maxRange=e,u.bigger(t.maxRange,t.minRange)&&(t.maxRange=t.minRange,t.minRange=e),t.selectedDates=[t.minRange,t.maxRange]):(t.selectedDates=[e],t.minRange=e):t.selectedDates=[e];t._setInputValue(),s.onSelect&&t._triggerOnChange(),s.autoClose&&!this.timepickerIsActive&&(!s.multipleDates&&!s.range||s.range&&2==t.selectedDates.length)&&t.hide(),t.views[this.currentView]._render()}},removeDate:function(s){var i=this.selectedDates,a=this;if(s instanceof Date)return i.some(function(e,t){if(u.isSame(e,s))return i.splice(t,1),a.selectedDates.length?a.lastSelectedDate=a.selectedDates[a.selectedDates.length-1]:(a.minRange="",a.maxRange="",a.lastSelectedDate=""),a.views[a.currentView]._render(),a._setInputValue(),a.opts.onSelect&&a._triggerOnChange(),!0})},today:function(){this.silent=!0,this.view=this.opts.minView,this.silent=!1,this.date=new Date,this.opts.todayButton instanceof Date&&this.selectDate(this.opts.todayButton)},clear:function(){this.selectedDates=[],this.minRange="",this.maxRange="",this.views[this.currentView]._render(),this._setInputValue(),this.opts.onSelect&&this._triggerOnChange()},update:function(e,t,s){var i=arguments.length,a=this.lastSelectedDate;return 2<=i?this.opts[e]=t:1==i&&"object"==typeof e&&(this.opts=n.extend(!0,this.opts,e)),this._createShortCuts(),this._syncWithMinMaxDates(),this._defineLocale(this.opts.language),this.nav._addButtonsIfNeed(),this.opts.onlyTimepicker||this.nav._render(),this.views[this.currentView]._render(),this.elIsInput&&!this.opts.inline&&(this._setPositionClasses(this.opts.position),this.visible)&&this.setPosition(this.opts.position),this.opts.classes&&this.$datepicker.addClass(this.opts.classes),this.opts.onlyTimepicker&&this.$datepicker.addClass("-only-timepicker-"),this.opts.timepicker&&(a&&this.timepicker._handleDate(a),this.timepicker._updateRanges(),this.timepicker._updateCurrentTime(),a)&&(a.setHours(this.timepicker.hours),a.setMinutes(this.timepicker.minutes),a.setSeconds(this.timepicker.seconds)),s||this._setInputValue(),this},_syncWithMinMaxDates:function(){var e=this.date.getTime();this.silent=!0,this.minTime>e&&(this.date=this.minDate),this.maxTime<e&&(this.date=this.maxDate),this.silent=!1},_isSelected:function(t,s){var i=!1;return this.selectedDates.some(function(e){if(u.isSame(e,t,s))return i=e,!0}),i},_setInputValue:function(){var t=this,e=t.opts,s=t.loc.dateFormat,i=e.altFieldDateFormat,a=t.selectedDates.map(function(e){return t.formatDate(s,e)});e.altField&&t.$altField.length&&(e=(e=this.selectedDates.map(function(e){return t.formatDate(i,e)})).join(this.opts.multipleDatesSeparator),this.$altField.val(e)),a=a.join(this.opts.multipleDatesSeparator),this.$el.val(a)},_isInRange:function(e,t){var s=e.getTime(),e=u.getParsedDate(e),i=u.getParsedDate(this.minDate),a=u.getParsedDate(this.maxDate),n=new Date(e.year,e.month,i.date).getTime(),h=new Date(e.year,e.month,a.date).getTime(),s={day:s>=this.minTime&&s<=this.maxTime,month:n>=this.minTime&&h<=this.maxTime,year:e.year>=i.year&&e.year<=a.year};return t?s[t]:s.day},_getDimensions:function(e){var t=e.offset();return{width:e.outerWidth(),height:e.outerHeight(),left:t.left,top:t.top}},_getDateFromCell:function(e){var t=this.parsedDate,s=e.data("year")||t.year,t=e.data("month")==a?t.month:e.data("month"),e=e.data("date")||1;return new Date(s,t,e)},_setPositionClasses:function(e){var t=(e=e.split(" "))[0],e="datepicker -"+t+"-"+e[1]+"- -from-"+t+"-";this.visible&&(e+=" active"),this.$datepicker.removeAttr("class").addClass(e)},setPosition:function(e){e=e||this.opts.position;var t,s,i=this._getDimensions(this.$el),a=this._getDimensions(this.$datepicker),e=e.split(" "),n=this.opts.offset,h=e[0],e=e[1];switch(h){case"top":t=i.top-a.height-n;break;case"right":s=i.left+i.width+n;break;case"bottom":t=i.top+i.height+n;break;case"left":s=i.left-a.width-n}switch(e){case"top":t=i.top;break;case"right":s=i.left+i.width-a.width;break;case"bottom":t=i.top+i.height-a.height;break;case"left":s=i.left;break;case"center":/left|right/.test(h)?t=i.top+i.height/2-a.height/2:s=i.left+i.width/2-a.width/2}this.$datepicker.css({left:s,top:t})},show:function(){var e=this.opts.onShow;this.setPosition(this.opts.position),this.$datepicker.addClass("active"),this.visible=!0,e&&this._bindVisionEvents(e)},hide:function(){var e=this.opts.onHide;this.$datepicker.removeClass("active").css({left:"-100000px"}),this.focused="",this.keys=[],this.inFocus=!1,this.visible=!1,this.$el.blur(),e&&this._bindVisionEvents(e)},down:function(e){this._changeView(e,"down")},up:function(e){this._changeView(e,"up")},_bindVisionEvents:function(e){this.$datepicker.off("transitionend.dp"),e(this,!1),this.$datepicker.one("transitionend.dp",e.bind(this,this,!0))},_changeView:function(e,t){e=e||this.focused||this.date;t="up"==t?this.viewIndex+1:this.viewIndex-1;(t=2<t?2:t)<0&&(t=0),this.silent=!0,this.date=new Date(e.getFullYear(),e.getMonth(),1),this.silent=!1,this.view=this.viewIndexes[t]},_handleHotKey:function(e){var t,s=u.getParsedDate(this._getFocusedDate()),i=this.opts,a=!1,n=!1,h=!1,o=s.year,r=s.month,s=s.date;switch(e){case"ctrlRight":case"ctrlUp":r+=1,a=!0;break;case"ctrlLeft":case"ctrlDown":--r,a=!0;break;case"shiftRight":case"shiftUp":n=!0,o+=1;break;case"shiftLeft":case"shiftDown":n=!0,--o;break;case"altRight":case"altUp":h=!0,o+=10;break;case"altLeft":case"altDown":h=!0,o-=10;break;case"ctrlShiftUp":this.up()}e=u.getDaysCount(new Date(o,r)),t=new Date(o,r,s),t.getTime()<this.minTime?t=this.minDate:t.getTime()>this.maxTime&&(t=this.maxDate),this.focused=t,e=u.getParsedDate(t),a&&i.onChangeMonth&&i.onChangeMonth(e.month,e.year),n&&i.onChangeYear&&i.onChangeYear(e.year),h&&i.onChangeDecade&&i.onChangeDecade(this.curDecade)},_registerKey:function(t){this.keys.some(function(e){return e==t})||this.keys.push(t)},_unRegisterKey:function(e){e=this.keys.indexOf(e);this.keys.splice(e,1)},_isHotKeyPressed:function(){var e,t,s=!1,i=this.keys.sort();for(t in d)i.length==(e=d[t]).length&&e.every(function(e,t){return e==i[t]})&&(this._trigger("hotKey",t),s=!0);return s},_trigger:function(e,t){this.$el.trigger(e,t)},_focusNextCell:function(e,t){t=t||this.cellType;var s=u.getParsedDate(this._getFocusedDate()),i=s.year,a=s.month,n=s.date;if(!this._isHotKeyPressed()){switch(e){case 37:"day"==t&&--n,"month"==t&&--a,"year"==t&&--i;break;case 38:"day"==t&&(n-=7),"month"==t&&(a-=3),"year"==t&&(i-=4);break;case 39:"day"==t&&(n+=1),"month"==t&&(a+=1),"year"==t&&(i+=1);break;case 40:"day"==t&&(n+=7),"month"==t&&(a+=3),"year"==t&&(i+=4)}s=new Date(i,a,n);s.getTime()<this.minTime?s=this.minDate:s.getTime()>this.maxTime&&(s=this.maxDate),this.focused=s}},_getFocusedDate:function(){var e=this.focused||this.selectedDates[this.selectedDates.length-1],t=this.parsedDate;if(!e)switch(this.view){case"days":e=new Date(t.year,t.month,(new Date).getDate());break;case"months":e=new Date(t.year,t.month,1);break;case"years":e=new Date(t.year,0,1)}return e},_getCell:function(e,t){t=t||this.cellType;var s=u.getParsedDate(e),i='.datepicker--cell[data-year="'+s.year+'"]';switch(t){case"month":i='[data-month="'+s.month+'"]';break;case"day":i+='[data-month="'+s.month+'"][data-date="'+s.date+'"]'}return(e=this.views[this.currentView].$el.find(i)).length?e:n("")},destroy:function(){var e=this;e.$el.off(".adp").data("datepicker",""),e.selectedDates=[],e.focused="",e.views={},e.keys=[],e.minRange="",e.maxRange="",(e.opts.inline||!e.elIsInput?e.$datepicker.closest(".datepicker-inline"):e.$datepicker).remove()},_handleAlreadySelectedDates:function(e,t){this.opts.range?this.opts.toggleSelected?this.removeDate(t):2!=this.selectedDates.length&&this._trigger("clickCell",t):this.opts.toggleSelected&&this.removeDate(t),this.opts.toggleSelected||(this.lastSelectedDate=e,this.opts.timepicker&&(this.timepicker._setTime(e),this.timepicker.update()))},_onShowEvent:function(e){this.visible||this.show()},_onBlur:function(){!this.inFocus&&this.visible&&this.hide()},_onMouseDownDatepicker:function(e){this.inFocus=!0},_onMouseUpDatepicker:function(e){this.inFocus=!1,e.originalEvent.inFocus=!0,e.originalEvent.timepickerFocus||this.$el.focus()},_onKeyUpGeneral:function(e){this.$el.val()||this.clear()},_onResize:function(){this.visible&&this.setPosition()},_onMouseUpBody:function(e){e.originalEvent.inFocus||this.visible&&!this.inFocus&&this.hide()},_onMouseUpEl:function(e){e.originalEvent.inFocus=!0,setTimeout(this._onKeyUpGeneral.bind(this),4)},_onKeyDown:function(e){var t=e.which;if(this._registerKey(t),37<=t&&t<=40&&(e.preventDefault(),this._focusNextCell(t)),13==t&&this.focused){if(this._getCell(this.focused).hasClass("-disabled-"))return;if(this.view!=this.opts.minView)this.down();else{e=this._isSelected(this.focused,this.cellType);if(!e)return this.timepicker&&(this.focused.setHours(this.timepicker.hours),this.focused.setMinutes(this.timepicker.minutes),this.focused.setSeconds(this.timepicker.seconds)),void this.selectDate(this.focused);this._handleAlreadySelectedDates(e,this.focused)}}27==t&&this.hide()},_onKeyUp:function(e){e=e.which;this._unRegisterKey(e)},_onHotKey:function(e,t){this._handleHotKey(t)},_onMouseEnterCell:function(e){var e=n(e.target).closest(".datepicker--cell"),t=this._getDateFromCell(e);this.silent=!0,this.focused&&(this.focused=""),e.addClass("-focus-"),this.focused=t,this.silent=!1,this.opts.range&&1==this.selectedDates.length&&(this.minRange=this.selectedDates[0],this.maxRange="",u.less(this.minRange,this.focused)&&(this.maxRange=this.minRange,this.minRange=""),this.views[this.currentView]._update())},_onMouseLeaveCell:function(e){n(e.target).closest(".datepicker--cell").removeClass("-focus-"),this.silent=!0,this.focused="",this.silent=!1},_onTimeChange:function(e,t,s,i){var a=new Date,n=!1;this.selectedDates.length&&(n=!0,a=this.lastSelectedDate),a.setHours(t),a.setMinutes(s),a.setSeconds(i),n||this._getCell(a).hasClass("-disabled-")?(this._setInputValue(),this.opts.onSelect&&this._triggerOnChange()):this.selectDate(a)},_onClickCell:function(e,t){this.timepicker&&(t.setHours(this.timepicker.hours),t.setMinutes(this.timepicker.minutes),t.setSeconds(this.timepicker.seconds)),this.selectDate(t)},set focused(e){var t;!e&&this.focused&&(t=this._getCell(this.focused)).length&&t.removeClass("-focus-"),this._focused=e,this.opts.range&&1==this.selectedDates.length&&(this.minRange=this.selectedDates[0],this.maxRange="",u.less(this.minRange,this._focused))&&(this.maxRange=this.minRange,this.minRange=""),this.silent||(this.date=e)},get focused(){return this._focused},get parsedDate(){return u.getParsedDate(this.date)},set date(e){if(e instanceof Date)return this.currentDate=e,this.inited&&!this.silent&&(this.views[this.view]._render(),this.nav._render(),this.visible)&&this.elIsInput&&this.setPosition(),e},get date(){return this.currentDate},set view(e){if(this.viewIndex=this.viewIndexes.indexOf(e),!(this.viewIndex<0))return this.prevView=this.currentView,this.currentView=e,this.inited&&(this.views[e]?this.views[e]._render():this.views[e]=new n.fn.datepicker.Body(this,e,this.opts),this.views[this.prevView].hide(),this.views[e].show(),this.nav._render(),this.opts.onChangeView&&this.opts.onChangeView(e),this.elIsInput)&&this.visible&&this.setPosition(),e},get view(){return this.currentView},get cellType(){return this.view.substring(0,this.view.length-1)},get minTime(){var e=u.getParsedDate(this.minDate);return new Date(e.year,e.month,e.date).getTime()},get maxTime(){var e=u.getParsedDate(this.maxDate);return new Date(e.year,e.month,e.date).getTime()},get curDecade(){return u.getDecade(this.date)}},u.getDaysCount=function(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()},u.getParsedDate=function(e){return{year:e.getFullYear(),month:e.getMonth(),fullMonth:e.getMonth()+1<10?"0"+(e.getMonth()+1):e.getMonth()+1,date:e.getDate(),fullDate:e.getDate()<10?"0"+e.getDate():e.getDate(),day:e.getDay(),hours:e.getHours(),fullHours:e.getHours()<10?"0"+e.getHours():e.getHours(),minutes:e.getMinutes(),fullMinutes:e.getMinutes()<10?"0"+e.getMinutes():e.getMinutes(),seconds:e.getSeconds(),fullSeconds:e.getSeconds()<10?"0"+e.getSeconds():e.getSeconds()}},u.getDecade=function(e){e=10*Math.floor(e.getFullYear()/10);return[e,9+e]},u.template=function(e,s){return e.replace(/#\{([\w]+)\}/g,function(e,t){if(s[t]||0===s[t])return s[t]})},u.isSame=function(e,t,s){return!(!e||!t)&&(e=u.getParsedDate(e),t=u.getParsedDate(t),{day:e.date==t.date&&e.month==t.month&&e.year==t.year,month:e.month==t.month&&e.year==t.year,year:e.year==t.year}[s||"day"])},u.less=function(e,t,s){return!(!e||!t)&&t.getTime()<e.getTime()},u.bigger=function(e,t,s){return!(!e||!t)&&t.getTime()>e.getTime()},u.getLeadingZeroNum=function(e){return parseInt(e)<10?"0"+e:e},u.resetTime=function(e){if("object"==typeof e)return e=u.getParsedDate(e),new Date(e.year,e.month,e.date)},n.fn.datepicker=function(t){return this.each(function(){var e;n.data(this,h)?((e=n.data(this,h)).opts=n.extend(!0,e.opts,t),e.update()):n.data(this,h,new s(this,t))})},n.fn.datepicker.Constructor=s,n.fn.datepicker.language={ru:{days:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],daysShort:["Вос","Пон","Вто","Сре","Чет","Пят","Суб"],daysMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Сегодня",clear:"Очистить",dateFormat:"dd.mm.yyyy",timeFormat:"hh:ii",firstDay:1}},n(function(){n(".datepicker-here").datepicker()}),c={days:'<div class="datepicker--days datepicker--body"><div class="datepicker--days-names"></div><div class="datepicker--cells datepicker--cells-days"></div></div>',months:'<div class="datepicker--months datepicker--body"><div class="datepicker--cells datepicker--cells-months"></div></div>',years:'<div class="datepicker--years datepicker--body"><div class="datepicker--cells datepicker--cells-years"></div></div>'},p=n.fn.datepicker,m=p.Constructor,p.Body=function(e,t,s){this.d=e,this.type=t,this.opts=s,this.$el=n(""),this.opts.onlyTimepicker||this.init()},p.Body.prototype={init:function(){this._buildBaseHtml(),this._render(),this._bindEvents()},_bindEvents:function(){this.$el.on("click",".datepicker--cell",n.proxy(this._onClickCell,this))},_buildBaseHtml:function(){this.$el=n(c[this.type]).appendTo(this.d.$content),this.$names=n(".datepicker--days-names",this.$el),this.$cells=n(".datepicker--cells",this.$el)},_getDayNamesHtml:function(e,t,s,i){return s=s||"",7<(i=i!=a?i:0)?s:7==(t=t!=a?t:e)?this._getDayNamesHtml(e,0,s,++i):(s+='<div class="datepicker--day-name'+(this.d.isWeekend(t)?" -weekend-":"")+'">'+this.d.loc.daysMin[t]+"</div>",this._getDayNamesHtml(e,++t,s,++i))},_getCellContents:function(e,t){var s="datepicker--cell datepicker--cell-"+t,i=new Date,a=this.d,n=m.resetTime(a.minRange),h=m.resetTime(a.maxRange),o=a.opts,r=m.getParsedDate(e),d={},c=r.date;switch(t){case"day":a.isWeekend(r.day)&&(s+=" -weekend-"),r.month!=this.d.parsedDate.month&&(s+=" -other-month-",o.selectOtherMonths||(s+=" -disabled-"),o.showOtherMonths||(c=""));break;case"month":c=a.loc[a.opts.monthsField][r.month];break;case"year":var l=a.curDecade,c=r.year;(r.year<l[0]||r.year>l[1])&&(s+=" -other-decade-",o.selectOtherYears||(s+=" -disabled-"),o.showOtherYears||(c=""))}return o.onRenderCell&&(c=(d=o.onRenderCell(e,t)||{}).html||c,s+=d.classes?" "+d.classes:""),o.range&&(m.isSame(n,e,t)&&(s+=" -range-from-"),m.isSame(h,e,t)&&(s+=" -range-to-"),1==a.selectedDates.length&&a.focused?((m.bigger(n,e)&&m.less(a.focused,e)||m.less(h,e)&&m.bigger(a.focused,e))&&(s+=" -in-range-"),m.less(h,e)&&m.isSame(a.focused,e)&&(s+=" -range-from-"),m.bigger(n,e)&&m.isSame(a.focused,e)&&(s+=" -range-to-")):2==a.selectedDates.length&&m.bigger(n,e)&&m.less(h,e)&&(s+=" -in-range-")),m.isSame(i,e,t)&&(s+=" -current-"),a.focused&&m.isSame(e,a.focused,t)&&(s+=" -focus-"),a._isSelected(e,t)&&(s+=" -selected-"),a._isInRange(e,t)&&!d.disabled||(s+=" -disabled-"),{html:c,classes:s}},_getDaysHtml:function(e){for(var t,s,i=m.getDaysCount(e),a=new Date(e.getFullYear(),e.getMonth(),1).getDay(),n=new Date(e.getFullYear(),e.getMonth(),i).getDay(),a=a-this.d.loc.firstDay,n=6-n+this.d.loc.firstDay,h="",o=1-(a<0?7+a:a),r=i+(6<n?n-7:n);o<=r;o++)s=e.getFullYear(),t=e.getMonth(),h+=this._getDayHtml(new Date(s,t,o));return h},_getDayHtml:function(e){var t=this._getCellContents(e,"day");return'<div class="'+t.classes+'" data-date="'+e.getDate()+'" data-month="'+e.getMonth()+'" data-year="'+e.getFullYear()+'">'+t.html+"</div>"},_getMonthsHtml:function(e){for(var t="",s=m.getParsedDate(e),i=0;i<12;)t+=this._getMonthHtml(new Date(s.year,i)),i++;return t},_getMonthHtml:function(e){var t=this._getCellContents(e,"month");return'<div class="'+t.classes+'" data-month="'+e.getMonth()+'">'+t.html+"</div>"},_getYearsHtml:function(e){m.getParsedDate(e);for(var t=m.getDecade(e),s="",i=t[0]-1;i<=t[1]+1;i++)s+=this._getYearHtml(new Date(i,0));return s},_getYearHtml:function(e){var t=this._getCellContents(e,"year");return'<div class="'+t.classes+'" data-year="'+e.getFullYear()+'">'+t.html+"</div>"},_renderTypes:{days:function(){var e=this._getDayNamesHtml(this.d.loc.firstDay),t=this._getDaysHtml(this.d.currentDate);this.$cells.html(t),this.$names.html(e)},months:function(){var e=this._getMonthsHtml(this.d.currentDate);this.$cells.html(e)},years:function(){var e=this._getYearsHtml(this.d.currentDate);this.$cells.html(e)}},_render:function(){this.opts.onlyTimepicker||this._renderTypes[this.type].bind(this)()},_update:function(){var s,i,e=n(".datepicker--cell",this.$cells),a=this;e.each(function(e,t){s=n(this),i=a.d._getDateFromCell(n(this)),i=a._getCellContents(i,a.d.cellType),s.attr("class",i.classes)})},show:function(){this.opts.onlyTimepicker||(this.$el.addClass("active"),this.acitve=!0)},hide:function(){this.$el.removeClass("active"),this.active=!1},_handleClick:function(e){var t=e.data("date")||1,s=e.data("month")||0,e=e.data("year")||this.d.parsedDate.year,i=this.d;i.view!=this.opts.minView?i.down(new Date(e,s,t)):(e=new Date(e,s,t),(s=this.d._isSelected(e,this.d.cellType))?i._handleAlreadySelectedDates.bind(i,s,e)():i._trigger("clickCell",e))},_onClickCell:function(e){e=n(e.target).closest(".datepicker--cell");e.hasClass("-disabled-")||this._handleClick.bind(this)(e)}},p=n.fn.datepicker,l=p.Constructor,p.Navigation=function(e,t){this.d=e,this.opts=t,this.$buttonsContainer="",this.init()},p.Navigation.prototype={init:function(){this._buildBaseHtml(),this._bindEvents()},_bindEvents:function(){this.d.$nav.on("click",".datepicker--nav-action",n.proxy(this._onClickNavButton,this)),this.d.$nav.on("click",".datepicker--nav-title",n.proxy(this._onClickNavTitle,this)),this.d.$datepicker.on("click",".datepicker--button",n.proxy(this._onClickNavButton,this))},_buildBaseHtml:function(){this.opts.onlyTimepicker||this._render(),this._addButtonsIfNeed()},_addButtonsIfNeed:function(){this.opts.todayButton&&this._addButton("today"),this.opts.clearButton&&this._addButton("clear")},_render:function(){var e=this._getTitle(this.d.currentDate),e=l.template('<div class="datepicker--nav-action" data-action="prev">#{prevHtml}</div><div class="datepicker--nav-title">#{title}</div><div class="datepicker--nav-action" data-action="next">#{nextHtml}</div>',n.extend({title:e},this.opts));this.d.$nav.html(e),"years"==this.d.view&&n(".datepicker--nav-title",this.d.$nav).addClass("-disabled-"),this.setNavStatus()},_getTitle:function(e){return this.d.formatDate(this.opts.navTitles[this.d.view],e)},_addButton:function(e){this.$buttonsContainer.length||this._addButtonsContainer();var t={action:e,label:this.d.loc[e]},t=l.template('<span class="datepicker--button" data-action="#{action}">#{label}</span>',t);n("[data-action="+e+"]",this.$buttonsContainer).length||this.$buttonsContainer.append(t)},_addButtonsContainer:function(){this.d.$datepicker.append('<div class="datepicker--buttons"></div>'),this.$buttonsContainer=n(".datepicker--buttons",this.d.$datepicker)},setNavStatus:function(){if((this.opts.minDate||this.opts.maxDate)&&this.opts.disableNavWhenOutOfRange){var e=this.d.parsedDate,t=e.month,s=e.year,i=e.date;switch(this.d.view){case"days":this.d._isInRange(new Date(s,t-1,1),"month")||this._disableNav("prev"),this.d._isInRange(new Date(s,t+1,1),"month")||this._disableNav("next");break;case"months":this.d._isInRange(new Date(s-1,t,i),"year")||this._disableNav("prev"),this.d._isInRange(new Date(s+1,t,i),"year")||this._disableNav("next");break;case"years":var a=l.getDecade(this.d.date);this.d._isInRange(new Date(a[0]-1,0,1),"year")||this._disableNav("prev"),this.d._isInRange(new Date(a[1]+1,0,1),"year")||this._disableNav("next")}}},_disableNav:function(e){n('[data-action="'+e+'"]',this.d.$nav).addClass("-disabled-")},_activateNav:function(e){n('[data-action="'+e+'"]',this.d.$nav).removeClass("-disabled-")},_onClickNavButton:function(e){e=n(e.target).closest("[data-action]").data("action");this.d[e]()},_onClickNavTitle:function(e){if(!n(e.target).hasClass("-disabled-"))return"days"==this.d.view?this.d.view="months":void(this.d.view="years")}},p=n.fn.datepicker,g=p.Constructor,p.Timepicker=function(e,t){this.d=e,this.opts=t,this.init()},p.Timepicker.prototype={init:function(){var e="input";this._setTime(this.d.date),this._buildHTML(),navigator.userAgent.match(/trident/gi)&&(e="change"),this.d.$el.on("selectDate",this._onSelectDate.bind(this)),this.$ranges.on(e,this._onChangeRange.bind(this)),this.$ranges.on("mouseup",this._onMouseUpRange.bind(this)),this.$ranges.on("mousemove focus ",this._onMouseEnterRange.bind(this)),this.$ranges.on("mouseout blur",this._onMouseOutRange.bind(this))},_setTime:function(e){var t=g.getParsedDate(e);this._handleDate(e),this.hours=t.hours<this.minHours?this.minHours:t.hours,this.minutes=t.minutes<this.minMinutes?this.minMinutes:t.minutes,this.seconds=t.seconds<this.minSeconds?this.minSeconds:t.seconds},_setMinTimeFromDate:function(e){this.minHours=e.getHours(),this.minMinutes=e.getMinutes(),this.minSeconds=e.getSeconds(),this.d.lastSelectedDate&&this.d.lastSelectedDate.getHours()>e.getHours()&&(this.minMinutes=this.opts.minMinutes)},_setMaxTimeFromDate:function(e){this.maxHours=e.getHours(),this.maxMinutes=e.getMinutes(),this.maxSeconds=e.getSeconds(),this.d.lastSelectedDate&&this.d.lastSelectedDate.getHours()<e.getHours()&&(this.maxMinutes=this.opts.maxMinutes)},_setDefaultMinMaxTime:function(){var e=this.opts;this.minHours=e.minHours<0||23<e.minHours?0:e.minHours,this.minMinutes=e.minMinutes<0||59<e.minMinutes?0:e.minMinutes,this.maxHours=e.maxHours<0||23<e.maxHours?23:e.maxHours,this.maxMinutes=e.maxMinutes<0||59<e.maxMinutes?59:e.maxMinutes,this.minSeconds=e.minSeconds<0||59<e.minSeconds?0:e.minSeconds,this.maxSeconds=e.maxSeconds<0||59<e.maxSeconds?59:e.maxSeconds},_validateHoursMinutes:function(e){this.hours<this.minHours?this.hours=this.minHours:this.hours>this.maxHours&&(this.hours=this.maxHours),this.minutes<this.minMinutes?this.minutes=this.minMinutes:this.minutes>this.maxMinutes&&(this.minutes=this.maxMinutes),this.seconds<this.minSeconds?this.seconds=this.minSeconds:this.seconds>this.maxSeconds&&(this.seconds=this.maxSeconds)},_buildHTML:function(){var e=g.getLeadingZeroNum,e={hourMin:this.minHours,hourMax:e(this.maxHours),hourStep:this.opts.hoursStep,hourValue:this.hours,hourVisible:e(this.displayHours),minMin:this.minMinutes,minMax:e(this.maxMinutes),minStep:this.opts.minutesStep,minValue:e(this.minutes),secMin:this.minSeconds,secMax:e(this.maxSeconds),secStep:this.opts.secondsStep,secValue:e(this.seconds)},e=g.template('<div class="datepicker--time"><div class="datepicker--time-current"> <span class="datepicker--time-current-hours">#{hourVisible}</span> <span class="datepicker--time-current-colon">:</span> <span class="datepicker--time-current-minutes">#{minValue}</span> <span class="datepicker--time-current-colon">:</span> <span class="datepicker--time-current-seconds">#{secValue}</span></div><div class="datepicker--time-sliders"> <div class="datepicker--time-row"> <input type="range" name="hours" value="#{hourValue}" min="#{hourMin}" max="#{hourMax}" step="#{hourStep}"/> </div> <div class="datepicker--time-row"> <input type="range" name="minutes" value="#{minValue}" min="#{minMin}" max="#{minMax}" step="#{minStep}"/> </div> <div class="datepicker--time-row"> <input type="range" name="seconds" value="#{secValue}" min="#{secMin}" max="#{secMax}" step="#{secStep}"/> </div></div></div>',e);this.$timepicker=n(e).appendTo(this.d.$datepicker),this.$ranges=n('[type="range"]',this.$timepicker),this.$hours=n('[name="hours"]',this.$timepicker),this.$minutes=n('[name="minutes"]',this.$timepicker),this.$seconds=n('[name="seconds"]',this.$timepicker),this.$hoursText=n(".datepicker--time-current-hours",this.$timepicker),this.$minutesText=n(".datepicker--time-current-minutes",this.$timepicker),this.$secondsText=n(".datepicker--time-current-seconds",this.$timepicker),this.d.ampm&&(this.$ampm=n('<span class="datepicker--time-current-ampm">').appendTo(n(".datepicker--time-current",this.$timepicker)).html(this.dayPeriod),this.$timepicker.addClass("-am-pm-"))},_updateCurrentTime:function(){var e=g.getLeadingZeroNum(this.displayHours),t=g.getLeadingZeroNum(this.minutes),s=g.getLeadingZeroNum(this.seconds);this.$hoursText.html(e),this.$minutesText.html(t),this.$secondsText.html(s),this.d.ampm&&this.$ampm.html(this.dayPeriod)},_updateRanges:function(){this.$hours.attr({min:this.minHours,max:this.maxHours}).val(this.hours),this.$minutes.attr({min:this.minMinutes,max:this.maxMinutes}).val(this.minutes),this.$seconds.attr({min:this.minSeconds,max:this.maxSeconds}).val(this.seconds)},_handleDate:function(e){this._setDefaultMinMaxTime(),e&&(g.isSame(e,this.d.opts.minDate)?this._setMinTimeFromDate(this.d.opts.minDate):g.isSame(e,this.d.opts.maxDate)&&this._setMaxTimeFromDate(this.d.opts.maxDate)),this._validateHoursMinutes(e)},update:function(){this._updateRanges(),this._updateCurrentTime()},_getValidHoursFromDate:function(e,t){var s=e;e instanceof Date&&(s=g.getParsedDate(e).hours);var i="am";if(t||this.d.ampm)switch(!0){case 0==s:s=12;break;case 12==s:i="pm";break;case 11<s:s-=12,i="pm"}return{hours:s,dayPeriod:i}},set hours(e){this._hours=e;e=this._getValidHoursFromDate(e);this.displayHours=e.hours,this.dayPeriod=e.dayPeriod},get hours(){return this._hours},_onChangeRange:function(e){var e=n(e.target),t=e.attr("name");this.d.timepickerIsActive=!0,this[t]=e.val(),this._updateCurrentTime(),this.d._trigger("timeChange",[this.hours,this.minutes,this.seconds]),this._handleDate(this.d.lastSelectedDate),this.update()},_onSelectDate:function(e,t){this._handleDate(t),this.update()},_onMouseEnterRange:function(e){e=n(e.target).attr("name");n(".datepicker--time-current-"+e,this.$timepicker).addClass("-focus-")},_onMouseOutRange:function(e){e=n(e.target).attr("name");this.d.inFocus||n(".datepicker--time-current-"+e,this.$timepicker).removeClass("-focus-")},_onMouseUpRange:function(e){this.d.timepickerIsActive=!1}}}(window,jQuery);