From e9a875929603eb381f1349468248599311a5b143 Mon Sep 17 00:00:00 2001 From: mak-pun Date: Fri, 10 Feb 2017 15:17:25 +0700 Subject: [PATCH 1/2] Add id attribute to date picker and time picker --- dist/angular-material-datetimepicker.min.js | 2 +- dist/angular-material-datetimepicker.min.js.map | 2 +- dist/material-datetimepicker.min.css | 2 +- js/angular-material-datetimepicker.js | 9 +++++---- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/dist/angular-material-datetimepicker.min.js b/dist/angular-material-datetimepicker.min.js index 821f72a..891a04d 100644 --- a/dist/angular-material-datetimepicker.min.js +++ b/dist/angular-material-datetimepicker.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";var t="ngMaterialDatePicker",e={DATE:0,HOUR:1,MINUTE:2},a=function(t,e){return t=angular.element(t),"getComputedStyle"in window?window.getComputedStyle(t[0])[e]:t.css(e)},i='
{{picker.currentDate.format("dddd")}}
{{picker.params.shortTime ? picker.currentDate.format("A") : " "}}
×
{{picker.currentDate.format("MMM") | uppercase}}
{{picker.currentDate.format("DD")}}
{{picker.currentDate.format("YYYY")}}
{{picker.currentNearest5Minute().format(picker.params.shortTime ? "hh:mm" : "HH:mm")}}
{{picker.currentNearest5Minute().format(picker.params.shortTime ? "hh:mm" : "HH:mm")}}
{{picker.params.todayText}} {{picker.params.cancelText}} {{picker.params.okText}}
';angular.module(t,["ngMaterial"]).provider("mdcDatetimePickerDefaultLocale",function(){this.locale=window.navigator.userLanguage||window.navigator.language||"en",this.$get=function(){return this},this.setDefaultLocale=function(t){this.locale=t}}).factory("mdcDefaultParams",["mdcDatetimePickerDefaultLocale",function(t){var e={date:!0,time:!0,format:"YYYY-MM-DD",minDate:null,maxDate:null,currentDate:null,lang:t.locale,weekStart:0,shortTime:!1,cancelText:"Cancel",okText:"OK",amText:"AM",pmText:"PM",todayText:"Today",disableDates:[]};return e}]).directive("mdcDatetimePicker",["$mdDialog","$timeout",function(t,e){return{restrict:"A",require:"ngModel",scope:{currentDate:"=ngModel",ngChange:"&",time:"=",date:"=",minDate:"=",maxDate:"=",disableDates:"=",shortTime:"=",weekStart:"=",format:"@",cancelText:"@",okText:"@",lang:"@",amText:"@",pmText:"@",showTodaysDate:"@",todayText:"@"},link:function(a,n,s,c){var o=!1;a.format||(a.date&&a.time?a.format="YYYY-MM-DD HH:mm":a.date?a.format="YYYY-MM-DD":a.format="HH:mm");var l=null;void 0!==a.showTodaysDate&&"false"!==a.showTodaysDate&&(l=moment()),angular.isString(a.currentDate)&&""!==a.currentDate&&(a.currentDate=moment(a.currentDate,a.format)),c&&c.$formatters.push(function(t){if("undefined"!=typeof t){var e=moment(t);return e.isValid()?e.format(a.format):""}}),n.attr("readonly",""),n.on("focus",function(c){if(c.preventDefault(),n.blur(),!o){o=!0;var d={};for(var u in s)a.hasOwnProperty(u)&&!angular.isUndefined(a[u])&&(d[u]=a[u]);d.currentDate=a.currentDate,d.showTodaysDate=l;var m={options:d};t.show({template:i,controller:r,controllerAs:"picker",locals:m,openFrom:n,parent:angular.element(document.body),bindToController:!0,disableParentScroll:!1,hasBackDrop:!1,skipHide:!0}).then(function(t){a.currentDate=t?t._d:t,o=!1,moment(a.currentDate).isSame(d.currentDate)||e(a.ngChange,0),n.blur()},function(){o=!1,n.blur()})}})}}}]).factory("mdcDateTimeDialog",["$mdDialog","$q","mdcDefaultParams",function(t,e,a){var n=Object.keys(a);console.log(n);var s={show:function(s){var c=e.defer(),o=angular.copy(a);for(var l in s)n.indexOf[l]!=-1&&s.hasOwnProperty(l)&&(o=s[l]);var d={options:s};return t.show({template:i,controller:r,controllerAs:"picker",locals:d,parent:angular.element(document.body),bindToController:!0,clickOutsideToClose:!0,disableParentScroll:!1,skipHide:!0}).then(function(t){t?t._d:t;c.resolve(t?t._d:t)},function(){c.reject()}),c.promise}};return s}]);var r=function(t,a,i){this.currentView=e.DATE,this._dialog=a,this._attachedEvents=[],this.VIEWS=e,this.params=i,this.meridien="AM",this.params=angular.extend(this.params,this.options),this.init()};r.$inject=["$scope","$mdDialog","mdcDefaultParams"],r.prototype={init:function(){this.timeMode=this.params.time&&!this.params.date,this.dateMode=this.params.date,this.initDates(),this.start()},currentNearest5Minute:function(){var t=this.currentDate||moment(),e=5*Math.round(t.minute()/5);return e>=60&&(e=55),moment(t).minutes(e)},initDates:function(){var t=this,e=function(e,a){var i=null;if(angular.isDefined(e)&&null!==e&&""!==e)if(angular.isString(e))i="undefined"!=typeof t.params.format&&null!==t.params.format?moment(e,t.params.format).locale(t.params.lang):moment(e).locale(t.params.lang);else if("number"==typeof e)i=moment(e).locale(t.params.lang);else if(angular.isDate(e)){var r=e.getTime();i=moment(r,"x").locale(t.params.lang)}else e._isAMomentObject&&(i=e);else i=a;return i};this.currentDate=e(this.params.currentDate,moment()),this.minDate=e(this.params.minDate),this.maxDate=e(this.params.maxDate),this.disableDates=this.params.disableDates.map(function(t){return moment(t).format("MMMM Do YYYY")}),this.selectDate(this.currentDate)},initDate:function(){this.currentView=e.DATE},initHours:function(){this.currentView=e.HOUR},initMinutes:function(){this.currentView=e.MINUTE},isAfterMinDate:function(t,e,a){var i=!0;if("undefined"!=typeof this.minDate&&null!==this.minDate){var r=moment(this.minDate),n=moment(t);e||a||(r.hour(0),r.minute(0),n.hour(0),n.minute(0)),r.second(0),n.second(0),r.millisecond(0),n.millisecond(0),a?i=parseInt(n.format("X"))>=parseInt(r.format("X")):(n.minute(0),r.minute(0),i=parseInt(n.format("X"))>=parseInt(r.format("X")))}return i},isBeforeMaxDate:function(t,e,a){var i=!0;if("undefined"!=typeof this.maxDate&&null!==this.maxDate){var r=moment(this.maxDate),n=moment(t);e||a||(r.hour(0),r.minute(0),n.hour(0),n.minute(0)),r.second(0),n.second(0),r.millisecond(0),n.millisecond(0),a?i=parseInt(n.format("X"))<=parseInt(r.format("X")):(n.minute(0),r.minute(0),i=parseInt(n.format("X"))<=parseInt(r.format("X")))}return i},isInDisableDates:function(t){var e=t.format("MMMM Do YYYY");return!(this.disableDates.indexOf(e)>-1)},selectDate:function(t){t&&(this.currentDate=moment(t),this.isAfterMinDate(this.currentDate)||(this.currentDate=moment(this.minDate)),this.isBeforeMaxDate(this.currentDate)||(this.currentDate=moment(this.maxDate)),this.currentDate.locale(this.params.lang),this.calendarStart=moment(this.currentDate),this.meridien=this.currentDate.hour()>=12?"PM":"AM")},setName:function(){for(var t="",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",a=0;a<5;a++)t+=e.charAt(Math.floor(Math.random()*e.length));return t},isPM:function(){return"PM"===this.meridien},incrementYear:function(t){1===t&&this.isNextYearVisible()&&this.selectDate(this.currentDate.add(t,"year")),t===-1&&this.isPreviousYearVisible()&&this.selectDate(this.currentDate.add(t,"year"))},isPreviousMonthVisible:function(){return this.calendarStart&&this.isAfterMinDate(moment(this.calendarStart).startOf("month"),!1,!1)},isNextMonthVisible:function(){return this.calendarStart&&this.isBeforeMaxDate(moment(this.calendarStart).endOf("month"),!1,!1)},isPreviousYearVisible:function(){return this.calendarStart&&this.isAfterMinDate(moment(this.calendarStart).startOf("year"),!1,!1)},isNextYearVisible:function(){return this.calendarStart&&this.isBeforeMaxDate(moment(this.calendarStart).endOf("year"),!1,!1)},isHourAvailable:function(t){var e=moment(this.currentDate);return e.hour(this.convertHours(t)).minute(0).second(0),this.isAfterMinDate(e,!0,!1)&&this.isBeforeMaxDate(e,!0,!1)},isMinuteAvailable:function(t){var e=moment(this.currentDate);return e.minute(t).second(0),this.isAfterMinDate(e,!0,!0)&&this.isBeforeMaxDate(e,!0,!0)},start:function(){this.currentView=e.DATE,this.params.date?this.initDate():this.params.time&&this.initHours()},today:function(){this.selectDate(Date.now())},ok:function(){switch(this.currentView){case e.DATE:this.params.time===!0?this.initHours():this.hide(!0);break;case e.HOUR:this.initMinutes();break;case e.MINUTE:this.hide(!0)}},cancel:function(){if(this.params.time)switch(this.currentView){case e.DATE:this.hide();break;case e.HOUR:this.params.date?this.initDate():this.hide();break;case e.MINUTE:this.initHours()}else this.hide()},selectMonthBefore:function(){this.calendarStart.subtract(1,"months")},selectMonthAfter:function(){this.calendarStart.add(1,"months")},selectYearBefore:function(){this.calendarStart.subtract(1,"years")},selectYearAfter:function(){this.calendarStart.add(1,"years")},selectAM:function(){(this.isHourAvailable(0)||this.isHourAvailable(12))&&(this.currentDate.hour()>=12&&this.selectDate(this.currentDate.subtract(12,"hours")),this.isHourAvailable(this.currentDate.hour())||this.selectDate(this.currentDate.hour(this.minDate.hour())),this.isMinuteAvailable(this.currentDate.minute())||this.selectDate(this.currentDate.minute(this.minDate.minute())))},selectPM:function(){(this.isHourAvailable(13)||this.isHourAvailable(24))&&(this.currentDate.hour()<12&&this.selectDate(this.currentDate.add(12,"hours")),this.isHourAvailable(this.currentDate.hour())||this.selectDate(this.currentDate.hour(this.maxDate.hour())),this.isMinuteAvailable(this.currentDate.minute())||this.selectDate(this.currentDate.minute(this.maxDate.minute())))},convertHours:function(t){var e=t;return t<12&&this.isPM()&&(e+=12),e},hide:function(t){t?this._dialog.hide(this.currentDate):this._dialog.cancel()}},angular.module(t).directive("mdcDatetimePickerCalendar",[function(){for(var t=1920,e=(new Date).getFullYear()+30,a=12*(e-t+1),i=240,r=[],n=0;n6&&(o=0),c.push(o.toString());if(i.week=c,n.maxDate||n.minDate){var l=n.minDate?s(n.minDate):0,d=n.maxDate?s(n.maxDate)+1:a;i.months=r.slice(l,d)}else i.months=r;i.getItemAtIndex=function(e){var a=(e+1)%12||12,i=t+Math.floor(e/12),r=moment(n.currentDate).year(i).month(a);return u(r)},i.topIndex=s(n.currentDate)-i.months[0],e.$watch(function(){return n.currentDate?n.currentDate.format("YYYY-MM"):""},function(t,e){if(t!=e){var a=moment(t,"YYYY-MM"),r=n.minDate?s(n.minDate):0,c=s(a,r);i.topIndex!=c&&(i.topIndex=c)}});var u=function(t){var e={};if(null!==t){e.name=t.format("MMMM YYYY");var a=moment(t).locale(n.params.lang).startOf("month").hour(t.hour()).minute(t.minute()),r=a.format("d");e.days=[];for(var s=a.date();s<=a.daysInMonth();s++){if(s===a.date()){var c=i.week.indexOf(r.toString());if(c>0)for(var o=0;o
'}}]).directive("mdcDatetimePickerCalendarMonth",["$compile",function(t){var e=function(e,a){var i=angular.element(e[0].querySelector("tbody")),r=a.cal,n=a.month,s=[];n.days.forEach(function(t,e){s.push(""),t.forEach(function(t,a){if(s.push(""),t)if(r.isInRange(t)){var i="month['days']["+e+"]["+a+"]";s.push(''),s.push(t.format("D")),s.push("")}else s.push(''),s.push(t.format("D")),s.push("");s.push("")}),s.push("")}),i.html(s.join("")),t(i)(a)};return{scope:{idx:"="},require:"^mdcDatetimePickerCalendar",restrict:"AE",template:'
{{month.name}}
{{cal.toDay(day)}}
',link:function(t,a,i,r){t.cal=r,t.month=r.getItemAtIndex(parseInt(t.idx)),e(a,t),t.$watch(function(){return t.idx},function(i,n){i!=n&&(t.month=r.getItemAtIndex(parseInt(t.idx)),e(a,t))})}}}]),angular.module(t).directive("mdcDtpNoclick",function(){return{link:function(t,e){e.on("click",function(t){t.preventDefault()})}}}),angular.module(t).directive("mdcDatetimePickerClock",[function(){var t='';return{restrict:"E",template:t,link:function(t,e,i){var r="minutes"===i.mode,n=t.picker,s=document.querySelector("md-dialog.dtp"),c=function(){var i=angular.element(e[0].querySelector(".dtp-picker-clock")),c=angular.element(s.querySelector(".dtp-picker")),l=s.querySelector(".dtp-content").offsetWidth,u=parseInt(a(c,"paddingLeft").replace("px",""))||0,m=parseInt(a(c,"paddingRight").replace("px",""))||0,p=parseInt(a(i,"marginLeft").replace("px",""))||0,h=parseInt(a(i,"marginRight").replace("px",""))||0,f=l-(p+h+u+m);i.css("width",f+"px");for(var D=parseInt(a(c,"paddingLeft").replace("px",""))||0,v=parseInt(a(c,"paddingTop").replace("px",""))||0,g=parseInt(a(i,"marginLeft").replace("px",""))||0,k=parseInt(a(i,"marginTop").replace("px",""))||0,M=f/2,y=M/1.2,x=[],b=0;b<12;++b){var T=y*Math.sin(2*Math.PI*(b/12)),w=y*Math.cos(2*Math.PI*(b/12)),A=M+T+D/2-(D+g),Y=M-w-k/2-(v+k),I={left:A,top:Y,value:r?5*b:b,style:{"margin-left":A+"px","margin-top":Y+"px"}};r?I.display=I.value<10?"0"+I.value:I.value:n.params.shortTime?I.display=0===b?12:b:I.display=n.isPM()?b+12:b,x.push(I)}t.points=x,d(),i.css("height",f+"px");var S=e[0].querySelector(".dtp-clock-center"),H=S.offsetWidth/2||7.5,P=S.offsetHeight/2||7.5,V=M/1.8,E=M/1.5;angular.element(e[0].querySelector(".dtp-hour-hand")).css({left:M+1.5*g+"px",height:V+"px",marginTop:M-V-D+"px"}).addClass(r?"":"on"),angular.element(e[0].querySelector(".dtp-minute-hand")).css({left:M+1.5*g+"px",height:E+"px",marginTop:M-E-D+"px"}).addClass(r?"on":""),angular.element(S).css({left:M+D+g-H+"px",marginTop:M-g/2-P+"px"}),o()},o=function(){var t=n.currentNearest5Minute(),a=t.hour(),i=t.minute();l(angular.element(e[0].querySelector(".dtp-hour-hand")),30*a);var r=6*(5*Math.round(i/5));l(angular.element(e[0].querySelector(".dtp-minute-hand")),r)},l=function(t,e){angular.element(t).css({WebkitTransform:"rotate("+e+"deg)","-moz-transform":"rotate("+e+"deg)","-ms-transform":"rotate("+e+"deg)",transform:"rotate("+e+"deg)"})},d=function(){var e=n.currentNearest5Minute();t.currentValue=r?e.minute():e.hour()%12};t.$watch(function(){var t=n.currentNearest5Minute();return t?t.format("HH:mm"):""},function(){d(),o()});var u=function(t,e){for(var a=0;a{{picker.params.amText}}
{{picker.currentNearest5Minute().format(picker.params.shortTime ? "hh:mm" : "HH:mm")}}
{{picker.params.todayText}} {{picker.params.cancelText}} {{picker.params.okText}} ';angular.module(t,["ngMaterial"]).provider("mdcDatetimePickerDefaultLocale",function(){this.locale=window.navigator.userLanguage||window.navigator.language||"en",this.$get=function(){return this},this.setDefaultLocale=function(t){this.locale=t}}).factory("mdcDefaultParams",["mdcDatetimePickerDefaultLocale",function(t){var e={date:!0,time:!0,format:"YYYY-MM-DD",minDate:null,maxDate:null,currentDate:null,lang:t.locale,weekStart:0,shortTime:!1,cancelText:"Cancel",okText:"OK",amText:"AM",pmText:"PM",todayText:"Today",disableDates:[]};return e}]).directive("mdcDatetimePicker",["$mdDialog","$timeout",function(t,e){return{restrict:"A",require:"ngModel",scope:{currentDate:"=ngModel",ngChange:"&",time:"=",date:"=",minDate:"=",maxDate:"=",disableDates:"=",shortTime:"=",weekStart:"=",format:"@",cancelText:"@",okText:"@",lang:"@",amText:"@",pmText:"@",showTodaysDate:"@",todayText:"@"},link:function(a,n,s,c){var o=!1;a.format||(a.date&&a.time?a.format="YYYY-MM-DD HH:mm":a.date?a.format="YYYY-MM-DD":a.format="HH:mm");var l=null;void 0!==a.showTodaysDate&&"false"!==a.showTodaysDate&&(l=moment()),angular.isString(a.currentDate)&&""!==a.currentDate&&(a.currentDate=moment(a.currentDate,a.format)),c&&c.$formatters.push(function(t){if("undefined"!=typeof t){var e=moment(t);return e.isValid()?e.format(a.format):""}}),n.attr("readonly",""),n.on("focus",function(c){if(c.preventDefault(),n.blur(),!o){o=!0;var d={};for(var m in s)a.hasOwnProperty(m)&&!angular.isUndefined(a[m])&&(d[m]=a[m]);d.currentDate=a.currentDate,d.showTodaysDate=l;var u={options:d};t.show({template:i,controller:r,controllerAs:"picker",locals:u,openFrom:n,parent:angular.element(document.body),bindToController:!0,disableParentScroll:!1,hasBackDrop:!1,skipHide:!0}).then(function(t){a.currentDate=t?t._d:t,o=!1,moment(a.currentDate).isSame(d.currentDate)||e(a.ngChange,0),n.blur()},function(){o=!1,n.blur()})}})}}}]).factory("mdcDateTimeDialog",["$mdDialog","$q","mdcDefaultParams",function(t,e,a){var n=Object.keys(a);console.log(n);var s={show:function(s){var c=e.defer(),o=angular.copy(a);for(var l in s)n.indexOf[l]!=-1&&s.hasOwnProperty(l)&&(o=s[l]);var d={options:s};return t.show({template:i,controller:r,controllerAs:"picker",locals:d,parent:angular.element(document.body),bindToController:!0,clickOutsideToClose:!0,disableParentScroll:!1,skipHide:!0}).then(function(t){t?t._d:t;c.resolve(t?t._d:t)},function(){c.reject()}),c.promise}};return s}]);var r=function(t,a,i){this.currentView=e.DATE,this._dialog=a,this._attachedEvents=[],this.VIEWS=e,this.params=i,this.meridien="AM",this.params=angular.extend(this.params,this.options),this.init()};r.$inject=["$scope","$mdDialog","mdcDefaultParams"],r.prototype={init:function(){this.timeMode=this.params.time&&!this.params.date,this.dateMode=this.params.date,this.initDates(),this.start()},currentNearest5Minute:function(){var t=this.currentDate||moment(),e=5*Math.round(t.minute()/5);return e>=60&&(e=55),moment(t).minutes(e)},initDates:function(){var t=this,e=function(e,a){var i=null;if(angular.isDefined(e)&&null!==e&&""!==e)if(angular.isString(e))i="undefined"!=typeof t.params.format&&null!==t.params.format?moment(e,t.params.format).locale(t.params.lang):moment(e).locale(t.params.lang);else if("number"==typeof e)i=moment(e).locale(t.params.lang);else if(angular.isDate(e)){var r=e.getTime();i=moment(r,"x").locale(t.params.lang)}else e._isAMomentObject&&(i=e);else i=a;return i};this.currentDate=e(this.params.currentDate,moment()),this.minDate=e(this.params.minDate),this.maxDate=e(this.params.maxDate),this.disableDates=this.params.disableDates.map(function(t){return moment(t).format("MMMM Do YYYY")}),this.selectDate(this.currentDate)},initDate:function(){this.currentView=e.DATE},initHours:function(){this.currentView=e.HOUR},initMinutes:function(){this.currentView=e.MINUTE},isAfterMinDate:function(t,e,a){var i=!0;if("undefined"!=typeof this.minDate&&null!==this.minDate){var r=moment(this.minDate),n=moment(t);e||a||(r.hour(0),r.minute(0),n.hour(0),n.minute(0)),r.second(0),n.second(0),r.millisecond(0),n.millisecond(0),a?i=parseInt(n.format("X"))>=parseInt(r.format("X")):(n.minute(0),r.minute(0),i=parseInt(n.format("X"))>=parseInt(r.format("X")))}return i},isBeforeMaxDate:function(t,e,a){var i=!0;if("undefined"!=typeof this.maxDate&&null!==this.maxDate){var r=moment(this.maxDate),n=moment(t);e||a||(r.hour(0),r.minute(0),n.hour(0),n.minute(0)),r.second(0),n.second(0),r.millisecond(0),n.millisecond(0),a?i=parseInt(n.format("X"))<=parseInt(r.format("X")):(n.minute(0),r.minute(0),i=parseInt(n.format("X"))<=parseInt(r.format("X")))}return i},isInDisableDates:function(t){var e=t.format("MMMM Do YYYY");return!(this.disableDates.indexOf(e)>-1)},selectDate:function(t){t&&(this.currentDate=moment(t),this.isAfterMinDate(this.currentDate)||(this.currentDate=moment(this.minDate)),this.isBeforeMaxDate(this.currentDate)||(this.currentDate=moment(this.maxDate)),this.currentDate.locale(this.params.lang),this.calendarStart=moment(this.currentDate),this.meridien=this.currentDate.hour()>=12?"PM":"AM")},setName:function(){for(var t="",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",a=0;a<5;a++)t+=e.charAt(Math.floor(Math.random()*e.length));return t},isPM:function(){return"PM"===this.meridien},incrementYear:function(t){1===t&&this.isNextYearVisible()&&this.selectDate(this.currentDate.add(t,"year")),t===-1&&this.isPreviousYearVisible()&&this.selectDate(this.currentDate.add(t,"year"))},isPreviousMonthVisible:function(){return this.calendarStart&&this.isAfterMinDate(moment(this.calendarStart).startOf("month"),!1,!1)},isNextMonthVisible:function(){return this.calendarStart&&this.isBeforeMaxDate(moment(this.calendarStart).endOf("month"),!1,!1)},isPreviousYearVisible:function(){return this.calendarStart&&this.isAfterMinDate(moment(this.calendarStart).startOf("year"),!1,!1)},isNextYearVisible:function(){return this.calendarStart&&this.isBeforeMaxDate(moment(this.calendarStart).endOf("year"),!1,!1)},isHourAvailable:function(t){var e=moment(this.currentDate);return e.hour(this.convertHours(t)).minute(0).second(0),this.isAfterMinDate(e,!0,!1)&&this.isBeforeMaxDate(e,!0,!1)},isMinuteAvailable:function(t){var e=moment(this.currentDate);return e.minute(t).second(0),this.isAfterMinDate(e,!0,!0)&&this.isBeforeMaxDate(e,!0,!0)},start:function(){this.currentView=e.DATE,this.params.date?this.initDate():this.params.time&&this.initHours()},today:function(){this.selectDate(Date.now())},ok:function(){switch(this.currentView){case e.DATE:this.params.time===!0?this.initHours():this.hide(!0);break;case e.HOUR:this.initMinutes();break;case e.MINUTE:this.hide(!0)}},cancel:function(){if(this.params.time)switch(this.currentView){case e.DATE:this.hide();break;case e.HOUR:this.params.date?this.initDate():this.hide();break;case e.MINUTE:this.initHours()}else this.hide()},selectMonthBefore:function(){this.calendarStart.subtract(1,"months")},selectMonthAfter:function(){this.calendarStart.add(1,"months")},selectYearBefore:function(){this.calendarStart.subtract(1,"years")},selectYearAfter:function(){this.calendarStart.add(1,"years")},selectAM:function(){(this.isHourAvailable(0)||this.isHourAvailable(12))&&(this.currentDate.hour()>=12&&this.selectDate(this.currentDate.subtract(12,"hours")),this.isHourAvailable(this.currentDate.hour())||this.selectDate(this.currentDate.hour(this.minDate.hour())),this.isMinuteAvailable(this.currentDate.minute())||this.selectDate(this.currentDate.minute(this.minDate.minute())))},selectPM:function(){(this.isHourAvailable(13)||this.isHourAvailable(24))&&(this.currentDate.hour()<12&&this.selectDate(this.currentDate.add(12,"hours")),this.isHourAvailable(this.currentDate.hour())||this.selectDate(this.currentDate.hour(this.maxDate.hour())),this.isMinuteAvailable(this.currentDate.minute())||this.selectDate(this.currentDate.minute(this.maxDate.minute())))},convertHours:function(t){var e=t;return t<12&&this.isPM()&&(e+=12),e},hide:function(t){t?this._dialog.hide(this.currentDate):this._dialog.cancel()}},angular.module(t).directive("mdcDatetimePickerCalendar",[function(){for(var t=1920,e=(new Date).getFullYear()+30,a=12*(e-t+1),i=240,r=[],n=0;n6&&(o=0),c.push(o.toString());if(i.week=c,n.maxDate||n.minDate){var l=n.minDate?s(n.minDate):0,d=n.maxDate?s(n.maxDate)+1:a;i.months=r.slice(l,d)}else i.months=r;i.getItemAtIndex=function(e){var a=(e+1)%12||12,i=t+Math.floor(e/12),r=moment(n.currentDate).year(i).month(a);return m(r)},i.topIndex=s(n.currentDate)-i.months[0],e.$watch(function(){return n.currentDate?n.currentDate.format("YYYY-MM"):""},function(t,e){if(t!=e){var a=moment(t,"YYYY-MM"),r=n.minDate?s(n.minDate):0,c=s(a,r);i.topIndex!=c&&(i.topIndex=c)}});var m=function(t){var e={};if(null!==t){e.name=t.format("MMMM YYYY");var a=moment(t).locale(n.params.lang).startOf("month").hour(t.hour()).minute(t.minute()),r=a.format("d");e.days=[];for(var s=a.date();s<=a.daysInMonth();s++){if(s===a.date()){var c=i.week.indexOf(r.toString());if(c>0)for(var o=0;o
'}}]).directive("mdcDatetimePickerCalendarMonth",["$compile",function(t){var e=function(e,a){var i=angular.element(e[0].querySelector("tbody")),r=a.cal,n=a.month,s=[];n.days.forEach(function(t,e){s.push(""),t.forEach(function(t,a){if(s.push(""),t)if(r.isInRange(t)){var i="month['days']["+e+"]["+a+"]";s.push(''),s.push(t.format("D")),s.push("")}else s.push(''),s.push(t.format("D")),s.push("");s.push("")}),s.push("")}),i.html(s.join("")),t(i)(a)};return{scope:{idx:"="},require:"^mdcDatetimePickerCalendar",restrict:"AE",template:'
{{month.name}}
{{cal.toDay(day)}}
',link:function(t,a,i,r){t.cal=r,t.month=r.getItemAtIndex(parseInt(t.idx)),e(a,t),t.$watch(function(){return t.idx},function(i,n){i!=n&&(t.month=r.getItemAtIndex(parseInt(t.idx)),e(a,t))})}}}]),angular.module(t).directive("mdcDtpNoclick",function(){return{link:function(t,e){e.on("click",function(t){t.preventDefault()})}}}),angular.module(t).directive("mdcDatetimePickerClock",[function(){var t='';return{restrict:"E",template:t,link:function(t,e,i){var r="minutes"===i.mode,n=t.picker,s=document.querySelector("md-dialog.dtp"),c=function(){var c=angular.element(e[0].querySelector(".dtp-picker-clock")),l=angular.element(s.querySelector(".dtp-picker")),m=s.querySelector(".dtp-content").offsetWidth,u=parseInt(a(l,"paddingLeft").replace("px",""))||0,p=parseInt(a(l,"paddingRight").replace("px",""))||0,h=parseInt(a(c,"marginLeft").replace("px",""))||0,f=parseInt(a(c,"marginRight").replace("px",""))||0,D=m-(h+f+u+p);c.css("width",D+"px");for(var v=parseInt(a(l,"paddingLeft").replace("px",""))||0,g=parseInt(a(l,"paddingTop").replace("px",""))||0,k=parseInt(a(c,"marginLeft").replace("px",""))||0,M=parseInt(a(c,"marginTop").replace("px",""))||0,y=D/2,x=y/1.2,b=[],T=0;T<12;++T){var w=x*Math.sin(2*Math.PI*(T/12)),Y=x*Math.cos(2*Math.PI*(T/12)),A=y+w+v/2-(v+k),I=y-Y-M/2-(g+M),S={left:A,top:I,value:r?5*T:T,style:{"margin-left":A+"px","margin-top":I+"px"}};r?S.display=S.value<10?"0"+S.value:S.value:n.params.shortTime?S.display=0===T?12:T:S.display=n.isPM()?T+12:T,b.push(S)}t.points=b,t.mode=i.mode,d(),c.css("height",D+"px");var H=e[0].querySelector(".dtp-clock-center"),P=H.offsetWidth/2||7.5,V=H.offsetHeight/2||7.5,E=y/1.8,O=y/1.5;angular.element(e[0].querySelector(".dtp-hour-hand")).css({left:y+1.5*k+"px",height:E+"px",marginTop:y-E-v+"px"}).addClass(r?"":"on"),angular.element(e[0].querySelector(".dtp-minute-hand")).css({left:y+1.5*k+"px",height:O+"px",marginTop:y-O-v+"px"}).addClass(r?"on":""),angular.element(H).css({left:y+v+k-P+"px",marginTop:y-k/2-V+"px"}),o()},o=function(){var t=n.currentNearest5Minute(),a=t.hour(),i=t.minute();l(angular.element(e[0].querySelector(".dtp-hour-hand")),30*a);var r=6*(5*Math.round(i/5));l(angular.element(e[0].querySelector(".dtp-minute-hand")),r)},l=function(t,e){angular.element(t).css({WebkitTransform:"rotate("+e+"deg)","-moz-transform":"rotate("+e+"deg)","-ms-transform":"rotate("+e+"deg)",transform:"rotate("+e+"deg)"})},d=function(){var e=n.currentNearest5Minute();t.currentValue=r?e.minute():e.hour()%12};t.$watch(function(){var t=n.currentNearest5Minute();return t?t.format("HH:mm"):""},function(){d(),o()});var m=function(t,e){for(var a=0;a'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"dddd\")}}
'\n + '
{{picker.params.shortTime ? picker.currentDate.format(\"A\") : \" \"}}
'\n + '
'\n + ' ×'\n + '
'\n + '
'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"MMM\") | uppercase}}
'\n + '
'\n + '
{{picker.currentDate.format(\"DD\")}}
'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"YYYY\")}}
'\n + '
'\n + '
'\n + '
'//start time\n + '
'\n + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? \"hh:mm\" : \"HH:mm\")}}
'\n + '
'\n + '
'\n + ' '\n + '
'\n + '
'\n + '
'\n + ' {{picker.params.amText}}'\n + '
'\n + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? \"hh:mm\" : \"HH:mm\")}}
'\n + '
'\n + ' {{picker.params.pmText}}'\n + '
'\n + '
'\n + '
'\n + ' '\n + ' '\n + '
'\n + '
'\n + '
'\n + ' '\n + ' '\n + ' {{picker.params.todayText}}'\n + ' {{picker.params.cancelText}}'\n + ' {{picker.params.okText}}'\n + ' '\n + '';\n\n\n angular.module(moduleName, ['ngMaterial'])\n .provider('mdcDatetimePickerDefaultLocale', function () {\n this.locale = window.navigator.userLanguage || window.navigator.language || 'en';\n\n this.$get = function () {\n return this;\n };\n\n this.setDefaultLocale = function (localeString) {\n this.locale = localeString;\n };\n })\n .factory('mdcDefaultParams', ['mdcDatetimePickerDefaultLocale', function (mdcDatetimePickerDefaultLocale) {\n var default_params = {\n date: true,\n time: true,\n format: 'YYYY-MM-DD',\n minDate: null,\n maxDate: null,\n currentDate: null,\n lang: mdcDatetimePickerDefaultLocale.locale,\n weekStart: 0,\n shortTime: false,\n cancelText: 'Cancel',\n okText: 'OK',\n amText: 'AM',\n pmText: 'PM',\n todayText: 'Today',\n disableDates: []\n };\n return default_params;\n }])\n .directive('mdcDatetimePicker', ['$mdDialog', '$timeout',\n function ($mdDialog, $timeout) {\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n currentDate: '=ngModel',\n ngChange: '&',\n time: '=',\n date: '=',\n minDate: '=',\n maxDate: '=',\n disableDates: '=',\n shortTime: '=',\n weekStart: '=',\n format: '@',\n cancelText: '@',\n okText: '@',\n lang: '@',\n amText: '@',\n pmText: '@',\n showTodaysDate: '@',\n todayText: '@'\n },\n link: function (scope, element, attrs, ngModel) {\n var isOn = false;\n if (!scope.format) {\n if (scope.date && scope.time) {\n scope.format = 'YYYY-MM-DD HH:mm';\n } else if (scope.date) {\n scope.format = 'YYYY-MM-DD';\n } else {\n scope.format = 'HH:mm';\n }\n }\n\n var dateOfTheDay = null;\n if (scope.showTodaysDate !== undefined && scope.showTodaysDate !== \"false\") {\n dateOfTheDay = moment();\n }\n\n if (angular.isString(scope.currentDate) && scope.currentDate !== '') {\n scope.currentDate = moment(scope.currentDate, scope.format);\n }\n\n if (ngModel) {\n ngModel.$formatters.push(function (value) {\n if (typeof value === 'undefined') {\n return;\n }\n var m = moment(value);\n return m.isValid() ? m.format(scope.format) : '';\n });\n }\n\n element.attr('readonly', '');\n //@TODO custom event to trigger input\n element.on('focus', function (e) {\n e.preventDefault();\n element.blur();\n if (isOn) {\n return;\n }\n isOn = true;\n var options = {};\n for (var i in attrs) {\n if (scope.hasOwnProperty(i) && !angular.isUndefined(scope[i])) {\n options[i] = scope[i];\n }\n }\n options.currentDate = scope.currentDate;\n options.showTodaysDate = dateOfTheDay;\n\n var locals = {options: options};\n $mdDialog.show({\n template: template,\n controller: PluginController,\n controllerAs: 'picker',\n locals: locals,\n openFrom: element,\n parent: angular.element(document.body),\n bindToController: true,\n disableParentScroll: false,\n hasBackDrop: false,\n skipHide: true\n })\n .then(function (v) {\n scope.currentDate = v ? v._d : v;\n isOn = false;\n\n if (!moment(scope.currentDate).isSame(options.currentDate)) {\n $timeout(scope.ngChange, 0);\n }\n\n element.blur()\n\n }, function () {\n isOn = false;\n element.blur()\n })\n ;\n });\n }\n };\n }])\n /** Returns a service that opens a dialog when the attribute shown is called\n The dialog serves to select a date/time/etc. depending on the options given to the function show\n\n @param options extends mdcDefaultParams\n {\n date: {boolean} =true,\n time: {boolean] =true,\n format: {string} ='YYYY-MM-DD',\n minDate: {strign} =null,\n maxDate: {string} =null,\n currentDate: {string} =null,\n lang: {string} =mdcDatetimePickerDefaultLocale,\n weekStart: {int} =0,\n shortTime: {boolean} =false,\n cancelText: {string} ='Cancel',\n todayText: {string} ='Today',\n okText: {string} ='OK',\n amText: {string} ='AM',\n pmText: {string} ='PM'\n }\n @return promise\n */\n .factory('mdcDateTimeDialog', [\"$mdDialog\", \"$q\", \"mdcDefaultParams\", function ($mdDialog, $q, mdcDefaultParams) {\n var accepted_options = Object.keys(mdcDefaultParams);\n console.log(accepted_options);\n var service = {\n show: function (options) {\n var deferred = $q.defer();\n var params = angular.copy(mdcDefaultParams);\n for (var i in options) {\n if (accepted_options.indexOf[i] != -1 && options.hasOwnProperty(i)) {\n params = options[i];\n }\n }\n var locals = {options: options};\n $mdDialog.show({\n template: template,\n controller: PluginController,\n controllerAs: 'picker',\n locals: locals,\n parent: angular.element(document.body),\n bindToController: true,\n clickOutsideToClose: true,\n disableParentScroll: false,\n skipHide: true\n })\n .then(function (v) {\n var currentDate = v ? v._d : v;\n deferred.resolve(v ? v._d : v);\n }, function () {\n deferred.reject();\n });\n return deferred.promise;\n }\n };\n\n return service;\n }])\n ;\n\n var PluginController = function ($scope, $mdDialog, mdcDefaultParams) {\n this.currentView = VIEW_STATES.DATE;\n this._dialog = $mdDialog;\n\n this._attachedEvents = [];\n this.VIEWS = VIEW_STATES;\n this.params = mdcDefaultParams;\n this.meridien = 'AM';\n this.params = angular.extend(this.params, this.options);\n\n this.init();\n };\n\n PluginController.$inject = ['$scope', '$mdDialog', 'mdcDefaultParams'];\n PluginController.prototype = {\n init: function () {\n this.timeMode = this.params.time && !this.params.date;\n this.dateMode = this.params.date;\n this.initDates();\n this.start();\n },\n currentNearest5Minute: function () {\n var date = this.currentDate || moment();\n var minutes = (5 * Math.round(date.minute() / 5));\n if (minutes >= 60) {\n minutes = 55; //always push down\n }\n return moment(date).minutes(minutes);\n },\n initDates: function () {\n var that = this;\n var _dateParam = function (input, fallback) {\n var ret = null;\n if (angular.isDefined(input) && input !== null && input !== '') {\n if (angular.isString(input)) {\n if (typeof(that.params.format) !== 'undefined' && that.params.format !== null) {\n ret = moment(input, that.params.format).locale(that.params.lang);\n }\n else {\n ret = moment(input).locale(that.params.lang);\n }\n } else if (typeof input === 'number') {\n ret = moment(input).locale(that.params.lang);\n } else {\n if (angular.isDate(input)) {\n var x = input.getTime();\n ret = moment(x, \"x\").locale(that.params.lang);\n } else if (input._isAMomentObject) {\n ret = input;\n }\n }\n }\n else {\n ret = fallback;\n }\n return ret;\n };\n\n this.currentDate = _dateParam(this.params.currentDate, moment());\n this.minDate = _dateParam(this.params.minDate);\n this.maxDate = _dateParam(this.params.maxDate);\n this.disableDates = this.params.disableDates.map(function (x) {\n return moment(x).format('MMMM Do YYYY')\n });\n this.selectDate(this.currentDate);\n },\n initDate: function () {\n this.currentView = VIEW_STATES.DATE;\n },\n initHours: function () {\n this.currentView = VIEW_STATES.HOUR;\n },\n initMinutes: function () {\n this.currentView = VIEW_STATES.MINUTE;\n },\n isAfterMinDate: function (date, checkHour, checkMinute) {\n var _return = true;\n\n if (typeof(this.minDate) !== 'undefined' && this.minDate !== null) {\n var _minDate = moment(this.minDate);\n var _date = moment(date);\n\n if (!checkHour && !checkMinute) {\n _minDate.hour(0);\n _minDate.minute(0);\n\n _date.hour(0);\n _date.minute(0);\n }\n\n _minDate.second(0);\n _date.second(0);\n _minDate.millisecond(0);\n _date.millisecond(0);\n\n if (!checkMinute) {\n _date.minute(0);\n _minDate.minute(0);\n\n _return = (parseInt(_date.format(\"X\")) >= parseInt(_minDate.format(\"X\")));\n }\n else {\n _return = (parseInt(_date.format(\"X\")) >= parseInt(_minDate.format(\"X\")));\n }\n }\n\n return _return;\n },\n isBeforeMaxDate: function (date, checkTime, checkMinute) {\n var _return = true;\n\n if (typeof(this.maxDate) !== 'undefined' && this.maxDate !== null) {\n var _maxDate = moment(this.maxDate);\n var _date = moment(date);\n\n if (!checkTime && !checkMinute) {\n _maxDate.hour(0);\n _maxDate.minute(0);\n\n _date.hour(0);\n _date.minute(0);\n }\n\n _maxDate.second(0);\n _date.second(0);\n _maxDate.millisecond(0);\n _date.millisecond(0);\n\n if (!checkMinute) {\n _date.minute(0);\n _maxDate.minute(0);\n\n _return = (parseInt(_date.format(\"X\")) <= parseInt(_maxDate.format(\"X\")));\n }\n else {\n _return = (parseInt(_date.format(\"X\")) <= parseInt(_maxDate.format(\"X\")));\n }\n }\n\n return _return;\n },\n isInDisableDates: function (date) {\n var dut = date.format('MMMM Do YYYY')\n if (this.disableDates.indexOf(dut) > -1) {\n return false;\n }\n return true;\n },\n selectDate: function (date) {\n if (date) {\n this.currentDate = moment(date);\n if (!this.isAfterMinDate(this.currentDate)) {\n this.currentDate = moment(this.minDate);\n }\n\n if (!this.isBeforeMaxDate(this.currentDate)) {\n this.currentDate = moment(this.maxDate);\n }\n this.currentDate.locale(this.params.lang);\n this.calendarStart = moment(this.currentDate);\n this.meridien = this.currentDate.hour() >= 12 ? 'PM' : 'AM';\n }\n },\n setName: function () {\n var text = \"\";\n var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n for (var i = 0; i < 5; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n },\n isPM: function () {\n return this.meridien === 'PM';\n },\n incrementYear: function (amount) {\n if (amount === 1 && this.isNextYearVisible()) {\n this.selectDate(this.currentDate.add(amount, 'year'));\n }\n\n if (amount === -1 && this.isPreviousYearVisible()) {\n this.selectDate(this.currentDate.add(amount, 'year'));\n }\n },\n isPreviousMonthVisible: function () {\n return this.calendarStart && this.isAfterMinDate(moment(this.calendarStart).startOf('month'), false, false);\n },\n isNextMonthVisible: function () {\n return this.calendarStart && this.isBeforeMaxDate(moment(this.calendarStart).endOf('month'), false, false);\n },\n isPreviousYearVisible: function () {\n return this.calendarStart && this.isAfterMinDate(moment(this.calendarStart).startOf('year'), false, false);\n },\n isNextYearVisible: function () {\n return this.calendarStart && this.isBeforeMaxDate(moment(this.calendarStart).endOf('year'), false, false);\n },\n isHourAvailable: function (hour) {\n var _date = moment(this.currentDate);\n _date.hour(this.convertHours(hour)).minute(0).second(0);\n return this.isAfterMinDate(_date, true, false) && this.isBeforeMaxDate(_date, true, false);\n },\n isMinuteAvailable: function (minute) {\n var _date = moment(this.currentDate);\n _date.minute(minute).second(0);\n return this.isAfterMinDate(_date, true, true) && this.isBeforeMaxDate(_date, true, true);\n },\n start: function () {\n this.currentView = VIEW_STATES.DATE;\n //this.initDates();\n if (this.params.date) {\n this.initDate();\n } else {\n if (this.params.time) {\n this.initHours();\n }\n }\n },\n today: function () {\n this.selectDate(Date.now());\n },\n ok: function () {\n switch (this.currentView) {\n case VIEW_STATES.DATE:\n if (this.params.time === true) {\n this.initHours();\n }\n else {\n this.hide(true);\n }\n break;\n case VIEW_STATES.HOUR:\n this.initMinutes();\n break;\n case VIEW_STATES.MINUTE:\n this.hide(true);\n break;\n }\n },\n cancel: function () {\n if (this.params.time) {\n switch (this.currentView) {\n case VIEW_STATES.DATE:\n this.hide();\n break;\n case VIEW_STATES.HOUR:\n if (this.params.date) {\n this.initDate();\n }\n else {\n this.hide();\n }\n break;\n case VIEW_STATES.MINUTE:\n this.initHours();\n break;\n }\n }\n else {\n this.hide();\n }\n },\n selectMonthBefore: function () {\n this.calendarStart.subtract(1, 'months');\n },\n selectMonthAfter: function () {\n this.calendarStart.add(1, 'months');\n },\n selectYearBefore: function () {\n this.calendarStart.subtract(1, 'years');\n },\n selectYearAfter: function () {\n this.calendarStart.add(1, 'years');\n },\n selectAM: function () {\n if (this.isHourAvailable(0) || this.isHourAvailable(12)) {\n if (this.currentDate.hour() >= 12) {\n this.selectDate(this.currentDate.subtract(12, 'hours'));\n }\n if (!this.isHourAvailable(this.currentDate.hour())) {\n this.selectDate(this.currentDate.hour(this.minDate.hour()));\n }\n if (!this.isMinuteAvailable(this.currentDate.minute())) {\n this.selectDate(this.currentDate.minute(this.minDate.minute()));\n }\n }\n },\n selectPM: function () {\n if (this.isHourAvailable(13) || this.isHourAvailable(24)) {\n if (this.currentDate.hour() < 12) {\n this.selectDate(this.currentDate.add(12, 'hours'));\n }\n if (!this.isHourAvailable(this.currentDate.hour())) {\n this.selectDate(this.currentDate.hour(this.maxDate.hour()));\n }\n if (!this.isMinuteAvailable(this.currentDate.minute())) {\n this.selectDate(this.currentDate.minute(this.maxDate.minute()));\n }\n }\n },\n convertHours: function (h) {\n var _return = h;\n if ((h < 12) && this.isPM())\n _return += 12;\n\n return _return;\n },\n hide: function (okBtn) {\n if (okBtn) {\n this._dialog.hide(this.currentDate);\n } else {\n this._dialog.cancel();\n }\n }\n };\n\n\n angular.module(moduleName)\n .directive('mdcDatetimePickerCalendar', [\n function () {\n\n var YEAR_MIN = 1920,\n YEAR_MAX = new Date().getFullYear() + 30,\n MONTHS_IN_ALL = (YEAR_MAX - YEAR_MIN + 1) * 12,\n ITEM_HEIGHT = 240,\n MONTHS = [];\n for (var i = 0; i < MONTHS_IN_ALL; i++) {\n MONTHS.push(i);\n }\n\n var currentMonthIndex = function (date, low) {\n low = low ? low : 0;\n var year = date.year();\n var month = date.month();\n return (((year - YEAR_MIN) * 12) + month - 1 ) - low;\n };\n\n return {\n restrict: 'E',\n scope: {\n picker: '=',\n date: '='\n },\n bindToController: true,\n controllerAs: 'cal',\n controller: ['$scope', function ($scope) {\n this.$onInit = function () {\n var calendar = this,\n picker = this.picker,\n days = [];\n\n for (var i = picker.params.weekStart; days.length < 7; i++) {\n if (i > 6) {\n i = 0;\n }\n days.push(i.toString());\n }\n\n calendar.week = days;\n if (!picker.maxDate && !picker.minDate) {\n calendar.months = MONTHS;\n } else {\n var low = picker.minDate ? currentMonthIndex(picker.minDate) : 0;\n var high = picker.maxDate ? (currentMonthIndex(picker.maxDate) + 1) : MONTHS_IN_ALL;\n calendar.months = MONTHS.slice(low, high);\n }\n\n\n calendar.getItemAtIndex = function (index) {\n var month = ((index + 1) % 12) || 12;\n var year = YEAR_MIN + Math.floor(index / 12);\n var monthObj = moment(picker.currentDate)\n .year(year)\n .month(month);\n return generateMonthCalendar(monthObj);\n };\n\n calendar.topIndex = currentMonthIndex(picker.currentDate) - calendar.months[0];\n\n $scope.$watch(function () {\n return picker.currentDate ? picker.currentDate.format('YYYY-MM') : '';\n }, function (val2, val1) {\n if (val2 != val1) {\n var nDate = moment(val2, 'YYYY-MM');\n var low = picker.minDate ? currentMonthIndex(picker.minDate) : 0;\n var index = currentMonthIndex(nDate, low);\n if (calendar.topIndex != index) {\n calendar.topIndex = index;\n }\n }\n });\n\n var generateMonthCalendar = function (date) {\n var month = {};\n if (date !== null) {\n month.name = date.format('MMMM YYYY');\n var startOfMonth = moment(date).locale(picker.params.lang).startOf('month')\n .hour(date.hour())\n .minute(date.minute())\n ;\n var iNumDay = startOfMonth.format('d');\n month.days = [];\n for (var i = startOfMonth.date(); i <= startOfMonth.daysInMonth(); i++) {\n if (i === startOfMonth.date()) {\n var iWeek = calendar.week.indexOf(iNumDay.toString());\n if (iWeek > 0) {\n for (var x = 0; x < iWeek; x++) {\n month.days.push(0);\n }\n }\n }\n month.days.push(moment(startOfMonth).locale(picker.params.lang).date(i));\n }\n\n var daysInAWeek = 7, daysTmp = [], slices = Math.ceil(month.days.length / daysInAWeek);\n for (var j = 0; j < slices; j++) {\n daysTmp.push(month.days.slice(j * daysInAWeek, (j + 1) * daysInAWeek));\n }\n month.days = daysTmp;\n return month;\n }\n\n };\n\n calendar.toDay = function (i) {\n return moment(parseInt(i), \"d\")\n .locale(picker.params.lang)\n .format(\"dd\")\n .substring(0, 1);\n };\n\n calendar.isInRange = function (date) {\n return picker.isAfterMinDate(moment(date), false, false)\n && picker.isBeforeMaxDate(moment(date), false, false)\n && picker.isInDisableDates(moment(date));\n };\n\n calendar.selectDate = function (date) {\n if (date) {\n if (calendar.isSelectedDay(date)) {\n return picker.ok();\n }\n picker.selectDate(moment(date).hour(calendar.date.hour()).minute(calendar.date.minute()));\n }\n };\n\n calendar.isSelectedDay = function (m) {\n return m && calendar.date.date() === m.date() && calendar.date.month() === m.month() && calendar.date.year() === m.year();\n };\n\n calendar.isDateOfTheDay = function (m) {\n var today = calendar.picker.options.showTodaysDate;\n if (!today) {\n return false;\n }\n\n return m && today.date() === m.date() && today.month() === m.month() && today.year() === m.year();\n }\n }\n }],\n template: '' +\n '
' +\n '
' +\n '
' +\n '
'\n };\n }])\n .directive('mdcDatetimePickerCalendarMonth', ['$compile',\n function ($compile) {\n var buildCalendarContent = function (element, scope) {\n var tbody = angular.element(element[0].querySelector('tbody'));\n var calendar = scope.cal, month = scope.month;\n\n var tbodyHtml = [];\n\n month.days.forEach(function (weekDays, i) {\n tbodyHtml.push('');\n weekDays.forEach(function (weekDay, j) {\n tbodyHtml.push('');\n if (weekDay) {\n if (calendar.isInRange(weekDay)) {\n //build a\n var scopeRef = 'month[\\'days\\'][' + i + '][' + j + ']';\n\n tbodyHtml.push('');\n tbodyHtml.push(weekDay.format('D'));\n tbodyHtml.push('');\n } else {\n tbodyHtml.push('');\n tbodyHtml.push(weekDay.format('D'));\n tbodyHtml.push('');\n }\n }\n tbodyHtml.push('');\n });\n tbodyHtml.push('');\n });\n\n tbody.html(tbodyHtml.join(''));\n $compile(tbody)(scope);\n };\n\n return {\n scope: {\n idx: '='\n },\n require: '^mdcDatetimePickerCalendar',\n restrict: 'AE',\n template: '
{{month.name}}
'\n + ''\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + '
{{cal.toDay(day)}}
',\n link: function (scope, element, attrs, calendar) {\n scope.cal = calendar;\n scope.month = calendar.getItemAtIndex(parseInt(scope.idx));\n buildCalendarContent(element, scope);\n scope.$watch(function () {\n return scope.idx;\n }, function (idx, oldIdx) {\n if (idx != oldIdx) {\n scope.month = calendar.getItemAtIndex(parseInt(scope.idx));\n buildCalendarContent(element, scope);\n }\n });\n }\n };\n }\n ])\n ;\n\n angular.module(moduleName)\n .directive('mdcDtpNoclick', function () {\n return {\n link: function (scope, el) {\n el.on('click', function (e) {\n e.preventDefault();\n });\n }\n };\n });\n angular.module(moduleName)\n .directive('mdcDatetimePickerClock', [\n function () {\n\n var template = '
 '\n + '
'\n + ' {{point.display}}'\n + ' {{point.display}}'\n + '
'\n + '
'\n + '
'\n + '
'\n + '
';\n\n return {\n restrict: 'E',\n template: template,\n link: function (scope, element, attrs) {\n var minuteMode = attrs.mode === 'minutes';\n var picker = scope.picker;\n //banking on the fact that there will only be one at a time\n var componentRoot = document.querySelector('md-dialog.dtp');\n var exec = function () {\n var clock = angular.element(element[0].querySelector('.dtp-picker-clock')),\n pickerEl = angular.element(componentRoot.querySelector('.dtp-picker'));\n\n var w = componentRoot.querySelector('.dtp-content').offsetWidth;\n var pl = parseInt(css(pickerEl, 'paddingLeft').replace('px', '')) || 0;\n var pr = parseInt(css(pickerEl, 'paddingRight').replace('px', '')) || 0;\n var ml = parseInt(css(clock, 'marginLeft').replace('px', '')) || 0;\n var mr = parseInt(css(clock, 'marginRight').replace('px', '')) || 0;\n //set width\n var clockWidth = (w - (ml + mr + pl + pr));\n clock.css('width', (clockWidth) + 'px');\n\n var pL = parseInt(css(pickerEl, 'paddingLeft').replace('px', '')) || 0;\n var pT = parseInt(css(pickerEl, 'paddingTop').replace('px', '')) || 0;\n var mL = parseInt(css(clock, 'marginLeft').replace('px', '')) || 0;\n var mT = parseInt(css(clock, 'marginTop').replace('px', '')) || 0;\n\n var r = (clockWidth / 2);\n var j = r / 1.2; //???\n\n var points = [];\n\n for (var h = 0; h < 12; ++h) {\n var x = j * Math.sin(Math.PI * 2 * (h / 12));\n var y = j * Math.cos(Math.PI * 2 * (h / 12));\n var left = (r + x + pL / 2) - (pL + mL);\n var top = (r - y - mT / 2) - (pT + mT);\n\n var hour = {\n left: left,\n top: top,\n value: (minuteMode ? (h * 5) : h), //5 for minute 60/12\n style: {'margin-left': left + 'px', 'margin-top': top + 'px'}\n };\n\n if (minuteMode) {\n hour.display = hour.value < 10 ? ('0' + hour.value) : hour.value;\n } else {\n\n if (picker.params.shortTime) {\n hour.display = (h === 0) ? 12 : h;\n } else {\n hour.display = picker.isPM() ? h + 12 : h;\n }\n }\n\n\n points.push(hour);\n }\n\n scope.points = points;\n setCurrentValue();\n clock.css('height', clockWidth + 'px');\n //picker.initHands(true);\n\n var clockCenter = element[0].querySelector('.dtp-clock-center');\n var centerWidth = (clockCenter.offsetWidth / 2) || 7.5,\n centerHeight = (clockCenter.offsetHeight / 2) || 7.5;\n var _hL = r / 1.8;\n var _mL = r / 1.5;\n\n angular.element(element[0].querySelector('.dtp-hour-hand')).css({\n left: r + (mL * 1.5) + 'px',\n height: _hL + 'px',\n marginTop: (r - _hL - pL) + 'px'\n }).addClass(!minuteMode ? 'on' : '');\n\n angular.element(element[0].querySelector('.dtp-minute-hand')).css\n ({\n left: r + (mL * 1.5) + 'px',\n height: _mL + 'px',\n marginTop: (r - _mL - pL) + 'px'\n }).addClass(minuteMode ? 'on' : '');\n\n angular.element(clockCenter).css({\n left: (r + pL + mL - centerWidth) + 'px',\n marginTop: (r - (mL / 2)) - centerHeight + 'px'\n });\n animateHands();\n };\n\n var animateHands = function () {\n var _date = picker.currentNearest5Minute();\n var h = _date.hour();\n var m = _date.minute();\n\n rotateElement(angular.element(element[0].querySelector('.dtp-hour-hand')), (360 / 12) * h);\n var mdg = ((360 / 60) * (5 * Math.round(m / 5)));\n rotateElement(angular.element(element[0].querySelector('.dtp-minute-hand')), mdg);\n };\n\n var rotateElement = function (el, deg) {\n angular.element(el).css({\n WebkitTransform: 'rotate(' + deg + 'deg)',\n '-moz-transform': 'rotate(' + deg + 'deg)',\n '-ms-transform': 'rotate(' + deg + 'deg)',\n 'transform': 'rotate(' + deg + 'deg)'\n });\n };\n\n\n var setCurrentValue = function () {\n var date = picker.currentNearest5Minute();\n scope.currentValue = minuteMode ? date.minute() : (date.hour() % 12);\n };\n\n scope.$watch(function () {\n var tmp = picker.currentNearest5Minute();\n return tmp ? tmp.format('HH:mm') : '';\n }, function () {\n setCurrentValue();\n animateHands();\n });\n\n\n var setDisplayPoints = function (isPM, points) {\n for (var i = 0; i < points.length; i++) {\n points[i].display = i;\n if (isPM) {\n points[i].display += 12;\n }\n }\n return points;\n };\n\n if (!picker.params.shortTime) {\n scope.$watch('picker.meridien', function () {\n if (!minuteMode) {\n if (scope.points) {\n var points = setDisplayPoints(picker.isPM(), angular.copy(scope.points));\n scope.points = points;\n }\n }\n });\n }\n\n\n scope.setTime = function (val) {\n if (val === scope.currentValue) {\n picker.ok();\n }\n\n if (!minuteMode) {\n picker.currentDate.hour(picker.isPM() ? (val + 12) : val);\n } else {\n picker.currentDate.minute(val);\n }\n picker.currentDate.second(0)\n };\n\n scope.pointAvailable = function (point) {\n return minuteMode ? picker.isMinuteAvailable(point.value) : picker.isHourAvailable(point.value);\n };\n\n var unWatcher = scope.$watch(function () {\n return element[0].querySelectorAll('div').length;\n }, function () {\n exec();\n unWatcher();\n });\n }\n }\n }]);\n\n})();\n"]} \ No newline at end of file +{"version":3,"sources":["angular-material-datetimepicker.js"],"names":["moduleName","VIEW_STATES","DATE","HOUR","MINUTE","css","el","name","angular","element","window","getComputedStyle","template","module","provider","this","locale","navigator","userLanguage","language","$get","setDefaultLocale","localeString","factory","mdcDatetimePickerDefaultLocale","default_params","date","time","format","minDate","maxDate","currentDate","lang","weekStart","shortTime","cancelText","okText","amText","pmText","todayText","disableDates","directive","$mdDialog","$timeout","restrict","require","scope","ngChange","showTodaysDate","link","attrs","ngModel","isOn","dateOfTheDay","undefined","moment","isString","$formatters","push","value","m","isValid","attr","on","e","preventDefault","blur","options","i","hasOwnProperty","isUndefined","locals","show","controller","PluginController","controllerAs","openFrom","parent","document","body","bindToController","disableParentScroll","hasBackDrop","skipHide","then","v","_d","isSame","$q","mdcDefaultParams","accepted_options","Object","keys","console","log","service","deferred","defer","params","copy","indexOf","clickOutsideToClose","resolve","reject","promise","$scope","currentView","_dialog","_attachedEvents","VIEWS","meridien","extend","init","$inject","prototype","timeMode","dateMode","initDates","start","currentNearest5Minute","minutes","Math","round","minute","that","_dateParam","input","fallback","ret","isDefined","isDate","x","getTime","_isAMomentObject","map","selectDate","initDate","initHours","initMinutes","isAfterMinDate","checkHour","checkMinute","_return","_minDate","_date","hour","second","millisecond","parseInt","isBeforeMaxDate","checkTime","_maxDate","isInDisableDates","dut","calendarStart","setName","text","possible","charAt","floor","random","length","isPM","incrementYear","amount","isNextYearVisible","add","isPreviousYearVisible","isPreviousMonthVisible","startOf","isNextMonthVisible","endOf","isHourAvailable","convertHours","isMinuteAvailable","today","Date","now","ok","hide","cancel","selectMonthBefore","subtract","selectMonthAfter","selectYearBefore","selectYearAfter","selectAM","selectPM","h","okBtn","YEAR_MIN","YEAR_MAX","getFullYear","MONTHS_IN_ALL","ITEM_HEIGHT","MONTHS","currentMonthIndex","low","year","month","picker","$onInit","calendar","days","toString","week","high","months","slice","getItemAtIndex","index","monthObj","generateMonthCalendar","topIndex","$watch","val2","val1","nDate","startOfMonth","iNumDay","daysInMonth","iWeek","daysInAWeek","daysTmp","slices","ceil","j","toDay","substring","isInRange","isSelectedDay","isDateOfTheDay","$compile","buildCalendarContent","tbody","querySelector","cal","tbodyHtml","forEach","weekDays","weekDay","scopeRef","html","join","idx","oldIdx","minuteMode","mode","componentRoot","exec","clock","pickerEl","w","offsetWidth","pl","replace","pr","ml","mr","clockWidth","pL","pT","mL","mT","r","points","sin","PI","y","cos","left","top","style","margin-left","margin-top","display","setCurrentValue","clockCenter","centerWidth","centerHeight","offsetHeight","_hL","_mL","height","marginTop","addClass","animateHands","rotateElement","mdg","deg","WebkitTransform","-moz-transform","-ms-transform","transform","currentValue","tmp","setDisplayPoints","setTime","val","pointAvailable","point","unWatcher","querySelectorAll"],"mappings":"CAAA,WACE,YACA,IAAIA,GAAa,uBAEbC,GACFC,KAAM,EACNC,KAAM,EACNC,OAAQ,GAGNC,EAAM,SAAUC,EAAIC,GAEtB,MADAD,GAAKE,QAAQC,QAAQH,GACb,oBAAsBI,QAAUA,OAAOC,iBAAiBL,EAAG,IAAIC,GAAQD,EAAGD,IAAIE,IAGpFK,EAAW,ukHAmDfJ,SAAQK,OAAOb,GAAa,eACzBc,SAAS,iCAAkC,WAC1CC,KAAKC,OAASN,OAAOO,UAAUC,cAAgBR,OAAOO,UAAUE,UAAY,KAE5EJ,KAAKK,KAAO,WACV,MAAOL,OAGTA,KAAKM,iBAAmB,SAAUC,GAChCP,KAAKC,OAASM,KAGjBC,QAAQ,oBAAqB,iCAAkC,SAAUC,GACxE,GAAIC,IACFC,MAAM,EACNC,MAAM,EACNC,OAAQ,aACRC,QAAS,KACTC,QAAS,KACTC,YAAa,KACbC,KAAMR,EAA+BR,OACrCiB,UAAW,EACXC,WAAW,EACXC,WAAY,SACZC,OAAQ,KACRC,OAAQ,KACRC,OAAQ,KACRC,UAAW,QACXC,gBAEF,OAAOf,MAERgB,UAAU,qBAAsB,YAAa,WAC5C,SAAUC,EAAWC,GAEnB,OACEC,SAAU,IACVC,QAAS,UACTC,OACEf,YAAa,WACbgB,SAAU,IACVpB,KAAM,IACND,KAAM,IACNG,QAAS,IACTC,QAAS,IACTU,aAAc,IACdN,UAAW,IACXD,UAAW,IACXL,OAAQ,IACRO,WAAY,IACZC,OAAQ,IACRJ,KAAM,IACNK,OAAQ,IACRC,OAAQ,IACRU,eAAgB,IAChBT,UAAW,KAEbU,KAAM,SAAUH,EAAOrC,EAASyC,EAAOC,GACrC,GAAIC,IAAO,CACNN,GAAMlB,SACLkB,EAAMpB,MAAQoB,EAAMnB,KACtBmB,EAAMlB,OAAS,mBACNkB,EAAMpB,KACfoB,EAAMlB,OAAS,aAEfkB,EAAMlB,OAAS,QAInB,IAAIyB,GAAe,IACUC,UAAzBR,EAAME,gBAAyD,UAAzBF,EAAME,iBAC9CK,EAAeE,UAGb/C,QAAQgD,SAASV,EAAMf,cAAsC,KAAtBe,EAAMf,cAC/Ce,EAAMf,YAAcwB,OAAOT,EAAMf,YAAae,EAAMlB,SAGlDuB,GACFA,EAAQM,YAAYC,KAAK,SAAUC,GACjC,GAAqB,mBAAVA,GAAX,CAGA,GAAIC,GAAIL,OAAOI,EACf,OAAOC,GAAEC,UAAYD,EAAEhC,OAAOkB,EAAMlB,QAAU,MAIlDnB,EAAQqD,KAAK,WAAY,IAEzBrD,EAAQsD,GAAG,QAAS,SAAUC,GAG5B,GAFAA,EAAEC,iBACFxD,EAAQyD,QACJd,EAAJ,CAGAA,GAAO,CACP,IAAIe,KACJ,KAAK,GAAIC,KAAKlB,GACRJ,EAAMuB,eAAeD,KAAO5D,QAAQ8D,YAAYxB,EAAMsB,MACxDD,EAAQC,GAAKtB,EAAMsB,GAGvBD,GAAQpC,YAAce,EAAMf,YAC5BoC,EAAQnB,eAAiBK,CAEzB,IAAIkB,IAAUJ,QAASA,EACvBzB,GAAU8B,MACR5D,SAAUA,EACV6D,WAAYC,EACZC,aAAc,SACdJ,OAAQA,EACRK,SAAUnE,EACVoE,OAAQrE,QAAQC,QAAQqE,SAASC,MACjCC,kBAAkB,EAClBC,qBAAqB,EACrBC,aAAa,EACbC,UAAU,IAETC,KAAK,SAAUC,GACdvC,EAAMf,YAAcsD,EAAIA,EAAEC,GAAKD,EAC/BjC,GAAO,EAEFG,OAAOT,EAAMf,aAAawD,OAAOpB,EAAQpC,cAC5CY,EAASG,EAAMC,SAAU,GAG3BtC,EAAQyD,QAEP,WACDd,GAAO,EACP3C,EAAQyD,iBA6BrB3C,QAAQ,qBAAsB,YAAa,KAAM,mBAAoB,SAAUmB,EAAW8C,EAAIC,GAC7F,GAAIC,GAAmBC,OAAOC,KAAKH,EACnCI,SAAQC,IAAIJ,EACZ,IAAIK,IACFvB,KAAM,SAAUL,GACd,GAAI6B,GAAWR,EAAGS,QACdC,EAAS1F,QAAQ2F,KAAKV,EAC1B,KAAK,GAAIrB,KAAKD,GACRuB,EAAiBU,QAAQhC,KAAM,GAAMD,EAAQE,eAAeD,KAC9D8B,EAAS/B,EAAQC,GAGrB,IAAIG,IAAUJ,QAASA,EAkBvB,OAjBAzB,GAAU8B,MACR5D,SAAUA,EACV6D,WAAYC,EACZC,aAAc,SACdJ,OAAQA,EACRM,OAAQrE,QAAQC,QAAQqE,SAASC,MACjCC,kBAAkB,EAClBqB,qBAAqB,EACrBpB,qBAAqB,EACrBE,UAAU,IAETC,KAAK,SAAUC,GACIA,EAAIA,EAAEC,GAAKD,CAC7BW,GAASM,QAAQjB,EAAIA,EAAEC,GAAKD,IAC3B,WACDW,EAASO,WAENP,EAASQ,SAIpB,OAAOT,KAIX,IAAIrB,GAAmB,SAAU+B,EAAQ/D,EAAW+C,GAClD1E,KAAK2F,YAAczG,EAAYC,KAC/Ba,KAAK4F,QAAUjE,EAEf3B,KAAK6F,mBACL7F,KAAK8F,MAAQ5G,EACbc,KAAKmF,OAAST,EACd1E,KAAK+F,SAAW,KAChB/F,KAAKmF,OAAS1F,QAAQuG,OAAOhG,KAAKmF,OAAQnF,KAAKoD,SAE/CpD,KAAKiG,OAGPtC,GAAiBuC,SAAW,SAAU,YAAa,oBACnDvC,EAAiBwC,WACfF,KAAM,WACJjG,KAAKoG,SAAWpG,KAAKmF,OAAOvE,OAASZ,KAAKmF,OAAOxE,KACjDX,KAAKqG,SAAWrG,KAAKmF,OAAOxE,KAC5BX,KAAKsG,YACLtG,KAAKuG,SAEPC,sBAAuB,WACrB,GAAI7F,GAAOX,KAAKgB,aAAewB,SAC3BiE,EAAW,EAAIC,KAAKC,MAAMhG,EAAKiG,SAAW,EAI9C,OAHIH,IAAW,KACbA,EAAU,IAELjE,OAAO7B,GAAM8F,QAAQA,IAE9BH,UAAW,WACT,GAAIO,GAAO7G,KACP8G,EAAa,SAAUC,EAAOC,GAChC,GAAIC,GAAM,IACV,IAAIxH,QAAQyH,UAAUH,IAAoB,OAAVA,GAA4B,KAAVA,EAChD,GAAItH,QAAQgD,SAASsE,GAEjBE,EADiC,mBAAxBJ,GAAK1B,OAAa,QAA4C,OAAvB0B,EAAK1B,OAAOtE,OACtD2B,OAAOuE,EAAOF,EAAK1B,OAAOtE,QAAQZ,OAAO4G,EAAK1B,OAAOlE,MAGrDuB,OAAOuE,GAAO9G,OAAO4G,EAAK1B,OAAOlE,UAEpC,IAAqB,gBAAV8F,GAChBE,EAAMzE,OAAOuE,GAAO9G,OAAO4G,EAAK1B,OAAOlE,UAEvC,IAAIxB,QAAQ0H,OAAOJ,GAAQ,CACzB,GAAIK,GAAIL,EAAMM,SACdJ,GAAMzE,OAAO4E,EAAG,KAAKnH,OAAO4G,EAAK1B,OAAOlE,UAC/B8F,GAAMO,mBACfL,EAAMF,OAKVE,GAAMD,CAER,OAAOC,GAGTjH,MAAKgB,YAAc8F,EAAW9G,KAAKmF,OAAOnE,YAAawB,UACvDxC,KAAKc,QAAUgG,EAAW9G,KAAKmF,OAAOrE,SACtCd,KAAKe,QAAU+F,EAAW9G,KAAKmF,OAAOpE,SACtCf,KAAKyB,aAAezB,KAAKmF,OAAO1D,aAAa8F,IAAI,SAAUH,GACzD,MAAO5E,QAAO4E,GAAGvG,OAAO,kBAE1Bb,KAAKwH,WAAWxH,KAAKgB,cAEvByG,SAAU,WACRzH,KAAK2F,YAAczG,EAAYC,MAEjCuI,UAAW,WACT1H,KAAK2F,YAAczG,EAAYE,MAEjCuI,YAAa,WACX3H,KAAK2F,YAAczG,EAAYG,QAEjCuI,eAAgB,SAAUjH,EAAMkH,EAAWC,GACzC,GAAIC,IAAU,CAEd,IAA6B,mBAAlB/H,MAAY,SAAsC,OAAjBA,KAAKc,QAAkB,CACjE,GAAIkH,GAAWxF,OAAOxC,KAAKc,SACvBmH,EAAQzF,OAAO7B,EAEdkH,IAAcC,IACjBE,EAASE,KAAK,GACdF,EAASpB,OAAO,GAEhBqB,EAAMC,KAAK,GACXD,EAAMrB,OAAO,IAGfoB,EAASG,OAAO,GAChBF,EAAME,OAAO,GACbH,EAASI,YAAY,GACrBH,EAAMG,YAAY,GAEbN,EAOHC,EAAWM,SAASJ,EAAMpH,OAAO,OAASwH,SAASL,EAASnH,OAAO,OANnEoH,EAAMrB,OAAO,GACboB,EAASpB,OAAO,GAEhBmB,EAAWM,SAASJ,EAAMpH,OAAO,OAASwH,SAASL,EAASnH,OAAO,OAOvE,MAAOkH,IAETO,gBAAiB,SAAU3H,EAAM4H,EAAWT,GAC1C,GAAIC,IAAU,CAEd,IAA6B,mBAAlB/H,MAAY,SAAsC,OAAjBA,KAAKe,QAAkB,CACjE,GAAIyH,GAAWhG,OAAOxC,KAAKe,SACvBkH,EAAQzF,OAAO7B,EAEd4H,IAAcT,IACjBU,EAASN,KAAK,GACdM,EAAS5B,OAAO,GAEhBqB,EAAMC,KAAK,GACXD,EAAMrB,OAAO,IAGf4B,EAASL,OAAO,GAChBF,EAAME,OAAO,GACbK,EAASJ,YAAY,GACrBH,EAAMG,YAAY,GAEbN,EAOHC,EAAWM,SAASJ,EAAMpH,OAAO,OAASwH,SAASG,EAAS3H,OAAO,OANnEoH,EAAMrB,OAAO,GACb4B,EAAS5B,OAAO,GAEhBmB,EAAWM,SAASJ,EAAMpH,OAAO,OAASwH,SAASG,EAAS3H,OAAO,OAOvE,MAAOkH,IAETU,iBAAkB,SAAU9H,GAC1B,GAAI+H,GAAM/H,EAAKE,OAAO,eACtB,SAAIb,KAAKyB,aAAa4D,QAAQqD,IAAO,IAKvClB,WAAY,SAAU7G,GAChBA,IACFX,KAAKgB,YAAcwB,OAAO7B,GACrBX,KAAK4H,eAAe5H,KAAKgB,eAC5BhB,KAAKgB,YAAcwB,OAAOxC,KAAKc,UAG5Bd,KAAKsI,gBAAgBtI,KAAKgB,eAC7BhB,KAAKgB,YAAcwB,OAAOxC,KAAKe,UAEjCf,KAAKgB,YAAYf,OAAOD,KAAKmF,OAAOlE,MACpCjB,KAAK2I,cAAgBnG,OAAOxC,KAAKgB,aACjChB,KAAK+F,SAAW/F,KAAKgB,YAAYkH,QAAU,GAAK,KAAO,OAG3DU,QAAS,WAIP,IAAK,GAHDC,GAAO,GACPC,EAAW,iEAENzF,EAAI,EAAGA,EAAI,EAAGA,IACrBwF,GAAQC,EAASC,OAAOrC,KAAKsC,MAAMtC,KAAKuC,SAAWH,EAASI,QAG9D,OAAOL,IAETM,KAAM,WACJ,MAAyB,OAAlBnJ,KAAK+F,UAEdqD,cAAe,SAAUC,GACR,IAAXA,GAAgBrJ,KAAKsJ,qBACvBtJ,KAAKwH,WAAWxH,KAAKgB,YAAYuI,IAAIF,EAAQ,SAG3CA,KAAW,GAAMrJ,KAAKwJ,yBACxBxJ,KAAKwH,WAAWxH,KAAKgB,YAAYuI,IAAIF,EAAQ,UAGjDI,uBAAwB,WACtB,MAAOzJ,MAAK2I,eAAiB3I,KAAK4H,eAAepF,OAAOxC,KAAK2I,eAAee,QAAQ,UAAU,GAAO,IAEvGC,mBAAoB,WAClB,MAAO3J,MAAK2I,eAAiB3I,KAAKsI,gBAAgB9F,OAAOxC,KAAK2I,eAAeiB,MAAM,UAAU,GAAO,IAEtGJ,sBAAuB,WACrB,MAAOxJ,MAAK2I,eAAiB3I,KAAK4H,eAAepF,OAAOxC,KAAK2I,eAAee,QAAQ,SAAS,GAAO,IAEtGJ,kBAAmB,WACjB,MAAOtJ,MAAK2I,eAAiB3I,KAAKsI,gBAAgB9F,OAAOxC,KAAK2I,eAAeiB,MAAM,SAAS,GAAO,IAErGC,gBAAiB,SAAU3B,GACzB,GAAID,GAAQzF,OAAOxC,KAAKgB,YAExB,OADAiH,GAAMC,KAAKlI,KAAK8J,aAAa5B,IAAOtB,OAAO,GAAGuB,OAAO,GAC9CnI,KAAK4H,eAAeK,GAAO,GAAM,IAAUjI,KAAKsI,gBAAgBL,GAAO,GAAM,IAEtF8B,kBAAmB,SAAUnD,GAC3B,GAAIqB,GAAQzF,OAAOxC,KAAKgB,YAExB,OADAiH,GAAMrB,OAAOA,GAAQuB,OAAO,GACrBnI,KAAK4H,eAAeK,GAAO,GAAM,IAASjI,KAAKsI,gBAAgBL,GAAO,GAAM,IAErF1B,MAAO,WACLvG,KAAK2F,YAAczG,EAAYC,KAE3Ba,KAAKmF,OAAOxE,KACdX,KAAKyH,WAEDzH,KAAKmF,OAAOvE,MACdZ,KAAK0H,aAIXsC,MAAO,WACLhK,KAAKwH,WAAWyC,KAAKC,QAEvBC,GAAI,WACF,OAAQnK,KAAK2F,aACX,IAAKzG,GAAYC,KACXa,KAAKmF,OAAOvE,QAAS,EACvBZ,KAAK0H,YAGL1H,KAAKoK,MAAK,EAEZ,MACF,KAAKlL,GAAYE,KACfY,KAAK2H,aACL,MACF,KAAKzI,GAAYG,OACfW,KAAKoK,MAAK,KAIhBC,OAAQ,WACN,GAAIrK,KAAKmF,OAAOvE,KACd,OAAQZ,KAAK2F,aACX,IAAKzG,GAAYC,KACfa,KAAKoK,MACL,MACF,KAAKlL,GAAYE,KACXY,KAAKmF,OAAOxE,KACdX,KAAKyH,WAGLzH,KAAKoK,MAEP,MACF,KAAKlL,GAAYG,OACfW,KAAK0H,gBAKT1H,MAAKoK,QAGTE,kBAAmB,WACjBtK,KAAK2I,cAAc4B,SAAS,EAAG,WAEjCC,iBAAkB,WAChBxK,KAAK2I,cAAcY,IAAI,EAAG,WAE5BkB,iBAAkB,WAChBzK,KAAK2I,cAAc4B,SAAS,EAAG,UAEjCG,gBAAiB,WACf1K,KAAK2I,cAAcY,IAAI,EAAG,UAE5BoB,SAAU,YACJ3K,KAAK6J,gBAAgB,IAAM7J,KAAK6J,gBAAgB,OAC9C7J,KAAKgB,YAAYkH,QAAU,IAC7BlI,KAAKwH,WAAWxH,KAAKgB,YAAYuJ,SAAS,GAAI,UAE3CvK,KAAK6J,gBAAgB7J,KAAKgB,YAAYkH,SACzClI,KAAKwH,WAAWxH,KAAKgB,YAAYkH,KAAKlI,KAAKc,QAAQoH,SAEhDlI,KAAK+J,kBAAkB/J,KAAKgB,YAAY4F,WAC3C5G,KAAKwH,WAAWxH,KAAKgB,YAAY4F,OAAO5G,KAAKc,QAAQ8F,aAI3DgE,SAAU,YACJ5K,KAAK6J,gBAAgB,KAAO7J,KAAK6J,gBAAgB,OAC/C7J,KAAKgB,YAAYkH,OAAS,IAC5BlI,KAAKwH,WAAWxH,KAAKgB,YAAYuI,IAAI,GAAI,UAEtCvJ,KAAK6J,gBAAgB7J,KAAKgB,YAAYkH,SACzClI,KAAKwH,WAAWxH,KAAKgB,YAAYkH,KAAKlI,KAAKe,QAAQmH,SAEhDlI,KAAK+J,kBAAkB/J,KAAKgB,YAAY4F,WAC3C5G,KAAKwH,WAAWxH,KAAKgB,YAAY4F,OAAO5G,KAAKe,QAAQ6F,aAI3DkD,aAAc,SAAUe,GACtB,GAAI9C,GAAU8C,CAId,OAHKA,GAAI,IAAO7K,KAAKmJ,SACnBpB,GAAW,IAENA,GAETqC,KAAM,SAAUU,GACVA,EACF9K,KAAK4F,QAAQwE,KAAKpK,KAAKgB,aAEvBhB,KAAK4F,QAAQyE,WAMnB5K,QAAQK,OAAOb,GACZyC,UAAU,6BACT,WAOE,IAAK,GALDqJ,GAAW,KACbC,GAAW,GAAIf,OAAOgB,cAAgB,GACtCC,EAA4C,IAA3BF,EAAWD,EAAW,GACvCI,EAAc,IACdC,KACO/H,EAAI,EAAGA,EAAI6H,EAAe7H,IACjC+H,EAAOzI,KAAKU,EAGd,IAAIgI,GAAoB,SAAU1K,EAAM2K,GACtCA,EAAMA,EAAMA,EAAM,CAClB,IAAIC,GAAO5K,EAAK4K,OACZC,EAAQ7K,EAAK6K,OACjB,OAA6B,KAAnBD,EAAOR,GAAkBS,EAAQ,EAAMF,EAGnD,QACEzJ,SAAU,IACVE,OACE0J,OAAQ,IACR9K,KAAM,KAERsD,kBAAkB,EAClBL,aAAc,MACdF,YAAa,SAAU,SAAUgC,GAC/B1F,KAAK0L,QAAU,WAKb,IAAK,GAJDC,GAAW3L,KACbyL,EAASzL,KAAKyL,OACdG,KAEOvI,EAAIoI,EAAOtG,OAAOjE,UAAW0K,EAAK1C,OAAS,EAAG7F,IACjDA,EAAI,IACNA,EAAI,GAENuI,EAAKjJ,KAAKU,EAAEwI,WAId,IADAF,EAASG,KAAOF,EACXH,EAAO1K,SAAY0K,EAAO3K,QAExB,CACL,GAAIwK,GAAMG,EAAO3K,QAAUuK,EAAkBI,EAAO3K,SAAW,EAC3DiL,EAAON,EAAO1K,QAAWsK,EAAkBI,EAAO1K,SAAW,EAAKmK,CACtES,GAASK,OAASZ,EAAOa,MAAMX,EAAKS,OAJpCJ,GAASK,OAASZ,CAQpBO,GAASO,eAAiB,SAAUC,GAClC,GAAIX,IAAUW,EAAQ,GAAK,IAAO,GAC9BZ,EAAOR,EAAWrE,KAAKsC,MAAMmD,EAAQ,IACrCC,EAAW5J,OAAOiJ,EAAOzK,aAC1BuK,KAAKA,GACLC,MAAMA,EACT,OAAOa,GAAsBD,IAG/BT,EAASW,SAAWjB,EAAkBI,EAAOzK,aAAe2K,EAASK,OAAO,GAE5EtG,EAAO6G,OAAO,WACZ,MAAOd,GAAOzK,YAAcyK,EAAOzK,YAAYH,OAAO,WAAa,IAClE,SAAU2L,EAAMC,GACjB,GAAID,GAAQC,EAAM,CAChB,GAAIC,GAAQlK,OAAOgK,EAAM,WACrBlB,EAAMG,EAAO3K,QAAUuK,EAAkBI,EAAO3K,SAAW,EAC3DqL,EAAQd,EAAkBqB,EAAOpB,EACjCK,GAASW,UAAYH,IACvBR,EAASW,SAAWH,KAK1B,IAAIE,GAAwB,SAAU1L,GACpC,GAAI6K,KACJ,IAAa,OAAT7K,EAAe,CACjB6K,EAAMhM,KAAOmB,EAAKE,OAAO,YACzB,IAAI8L,GAAenK,OAAO7B,GAAMV,OAAOwL,EAAOtG,OAAOlE,MAAMyI,QAAQ,SAC9DxB,KAAKvH,EAAKuH,QACVtB,OAAOjG,EAAKiG,UAEbgG,EAAUD,EAAa9L,OAAO,IAClC2K,GAAMI,OACN,KAAK,GAAIvI,GAAIsJ,EAAahM,OAAQ0C,GAAKsJ,EAAaE,cAAexJ,IAAK,CACtE,GAAIA,IAAMsJ,EAAahM,OAAQ,CAC7B,GAAImM,GAAQnB,EAASG,KAAKzG,QAAQuH,EAAQf,WAC1C,IAAIiB,EAAQ,EACV,IAAK,GAAI1F,GAAI,EAAGA,EAAI0F,EAAO1F,IACzBoE,EAAMI,KAAKjJ,KAAK,GAItB6I,EAAMI,KAAKjJ,KAAKH,OAAOmK,GAAc1M,OAAOwL,EAAOtG,OAAOlE,MAAMN,KAAK0C,IAIvE,IAAK,GADD0J,GAAc,EAAGC,KAAcC,EAASvG,KAAKwG,KAAK1B,EAAMI,KAAK1C,OAAS6D,GACjEI,EAAI,EAAGA,EAAIF,EAAQE,IAC1BH,EAAQrK,KAAK6I,EAAMI,KAAKK,MAAMkB,EAAIJ,GAAcI,EAAI,GAAKJ,GAG3D,OADAvB,GAAMI,KAAOoB,EACNxB,GAKXG,GAASyB,MAAQ,SAAU/J,GACzB,MAAOb,QAAO6F,SAAShF,GAAI,KACxBpD,OAAOwL,EAAOtG,OAAOlE,MACrBJ,OAAO,MACPwM,UAAU,EAAG,IAGlB1B,EAAS2B,UAAY,SAAU3M,GAC7B,MAAO8K,GAAO7D,eAAepF,OAAO7B,IAAO,GAAO,IAC7C8K,EAAOnD,gBAAgB9F,OAAO7B,IAAO,GAAO,IAC5C8K,EAAOhD,iBAAiBjG,OAAO7B,KAGtCgL,EAASnE,WAAa,SAAU7G,GAC9B,GAAIA,EAAM,CACR,GAAIgL,EAAS4B,cAAc5M,GACzB,MAAO8K,GAAOtB,IAEhBsB,GAAOjE,WAAWhF,OAAO7B,GAAMuH,KAAKyD,EAAShL,KAAKuH,QAAQtB,OAAO+E,EAAShL,KAAKiG,aAInF+E,EAAS4B,cAAgB,SAAU1K,GACjC,MAAOA,IAAK8I,EAAShL,KAAKA,SAAWkC,EAAElC,QAAUgL,EAAShL,KAAK6K,UAAY3I,EAAE2I,SAAWG,EAAShL,KAAK4K,SAAW1I,EAAE0I,QAGrHI,EAAS6B,eAAiB,SAAU3K,GAClC,GAAImH,GAAQ2B,EAASF,OAAOrI,QAAQnB,cACpC,SAAK+H,IAIEnH,GAAKmH,EAAMrJ,SAAWkC,EAAElC,QAAUqJ,EAAMwB,UAAY3I,EAAE2I,SAAWxB,EAAMuB,SAAW1I,EAAE0I,YAIjG1L,SAAU,qJACqEsL,EAAc,0GAMlGzJ,UAAU,kCAAmC,WAC5C,SAAU+L,GACR,GAAIC,GAAuB,SAAUhO,EAASqC,GAC5C,GAAI4L,GAAQlO,QAAQC,QAAQA,EAAQ,GAAGkO,cAAc,UACjDjC,EAAW5J,EAAM8L,IAAKrC,EAAQzJ,EAAMyJ,MAEpCsC,IAEJtC,GAAMI,KAAKmC,QAAQ,SAAUC,EAAU3K,GACrCyK,EAAUnL,KAAK,QACfqL,EAASD,QAAQ,SAAUE,EAASd,GAElC,GADAW,EAAUnL,KAAK,QACXsL,EACF,GAAItC,EAAS2B,UAAUW,GAAU,CAE/B,GAAIC,GAAW,iBAAqB7K,EAAI,KAAO8J,EAAI,GAEnDW,GAAUnL,KAAK,eAAiBsL,EAAQpN,OAAO,cAAgB,4FAA8FqN,EAAW,iCAAmCA,EAAW,gCAAkCA,EAAW,OACnQJ,EAAUnL,KAAKsL,EAAQpN,OAAO,MAC9BiN,EAAUnL,KAAK,YAEfmL,GAAUnL,KAAK,iCACfmL,EAAUnL,KAAKsL,EAAQpN,OAAO,MAC9BiN,EAAUnL,KAAK,UAGnBmL,GAAUnL,KAAK,WAEjBmL,EAAUnL,KAAK,WAGjBgL,EAAMQ,KAAKL,EAAUM,KAAK,KAC1BX,EAASE,GAAO5L,GAGlB,QACEA,OACEsM,IAAK,KAEPvM,QAAS,6BACTD,SAAU,KACVhC,SAAU,gPAUVqC,KAAM,SAAUH,EAAOrC,EAASyC,EAAOwJ,GACrC5J,EAAM8L,IAAMlC,EACZ5J,EAAMyJ,MAAQG,EAASO,eAAe7D,SAAStG,EAAMsM,MACrDX,EAAqBhO,EAASqC,GAC9BA,EAAMwK,OAAO,WACX,MAAOxK,GAAMsM,KACZ,SAAUA,EAAKC,GACZD,GAAOC,IACTvM,EAAMyJ,MAAQG,EAASO,eAAe7D,SAAStG,EAAMsM,MACrDX,EAAqBhO,EAASqC,WAS5CtC,QAAQK,OAAOb,GACZyC,UAAU,gBAAiB,WAC1B,OACEQ,KAAM,SAAUH,EAAOxC,GACrBA,EAAGyD,GAAG,QAAS,SAAUC,GACvBA,EAAEC,uBAKZzD,QAAQK,OAAOb,GACZyC,UAAU,0BACT,WAEE,GAAI7B,GAAW,moBAUf,QACEgC,SAAU,IACVhC,SAAUA,EACVqC,KAAM,SAAUH,EAAOrC,EAASyC,GAC9B,GAAIoM,GAA4B,YAAfpM,EAAMqM,KACnB/C,EAAS1J,EAAM0J,OAEfgD,EAAgB1K,SAAS6J,cAAc,iBACvCc,EAAO,WACT,GAAIC,GAAQlP,QAAQC,QAAQA,EAAQ,GAAGkO,cAAc,sBACnDgB,EAAWnP,QAAQC,QAAQ+O,EAAcb,cAAc,gBAErDiB,EAAIJ,EAAcb,cAAc,gBAAgBkB,YAChDC,EAAK1G,SAAS/I,EAAIsP,EAAU,eAAeI,QAAQ,KAAM,MAAQ,EACjEC,EAAK5G,SAAS/I,EAAIsP,EAAU,gBAAgBI,QAAQ,KAAM,MAAQ,EAClEE,EAAK7G,SAAS/I,EAAIqP,EAAO,cAAcK,QAAQ,KAAM,MAAQ,EAC7DG,EAAK9G,SAAS/I,EAAIqP,EAAO,eAAeK,QAAQ,KAAM,MAAQ,EAE9DI,EAAcP,GAAKK,EAAKC,EAAKJ,EAAKE,EACtCN,GAAMrP,IAAI,QAAS,EAAe,KAYlC,KAAK,GAVD+P,GAAKhH,SAAS/I,EAAIsP,EAAU,eAAeI,QAAQ,KAAM,MAAQ,EACjEM,EAAKjH,SAAS/I,EAAIsP,EAAU,cAAcI,QAAQ,KAAM,MAAQ,EAChEO,EAAKlH,SAAS/I,EAAIqP,EAAO,cAAcK,QAAQ,KAAM,MAAQ,EAC7DQ,EAAKnH,SAAS/I,EAAIqP,EAAO,aAAaK,QAAQ,KAAM,MAAQ,EAE5DS,EAAKL,EAAa,EAClBjC,EAAIsC,EAAI,IAERC,KAEK7E,EAAI,EAAGA,EAAI,KAAMA,EAAG,CAC3B,GAAIzD,GAAI+F,EAAIzG,KAAKiJ,IAAc,EAAVjJ,KAAKkJ,IAAU/E,EAAI,KACpCgF,EAAI1C,EAAIzG,KAAKoJ,IAAc,EAAVpJ,KAAKkJ,IAAU/E,EAAI,KACpCkF,EAAQN,EAAIrI,EAAIiI,EAAK,GAAMA,EAAKE,GAChCS,EAAOP,EAAII,EAAIL,EAAK,GAAMF,EAAKE,GAE/BtH,GACF6H,KAAMA,EACNC,IAAKA,EACLpN,MAAQ2L,EAAkB,EAAJ1D,EAASA,EAC/BoF,OAAQC,cAAeH,EAAO,KAAMI,aAAcH,EAAM,MAGtDzB,GACFrG,EAAKkI,QAAUlI,EAAKtF,MAAQ,GAAM,IAAMsF,EAAKtF,MAASsF,EAAKtF,MAGvD6I,EAAOtG,OAAOhE,UAChB+G,EAAKkI,QAAiB,IAANvF,EAAW,GAAKA,EAEhC3C,EAAKkI,QAAU3E,EAAOtC,OAAS0B,EAAI,GAAKA,EAK5C6E,EAAO/M,KAAKuF,GAGdnG,EAAM2N,OAASA,EACf3N,EAAMyM,KAAOrM,EAAMqM,KACnB6B,IACA1B,EAAMrP,IAAI,SAAU8P,EAAa,KAGjC,IAAIkB,GAAc5Q,EAAQ,GAAGkO,cAAc,qBACvC2C,EAAeD,EAAYxB,YAAc,GAAM,IACjD0B,EAAgBF,EAAYG,aAAe,GAAM,IAC/CC,EAAMjB,EAAI,IACVkB,EAAMlB,EAAI,GAEdhQ,SAAQC,QAAQA,EAAQ,GAAGkO,cAAc,mBAAmBtO,KAC1DyQ,KAAMN,EAAU,IAALF,EAAY,KACvBqB,OAAQF,EAAM,KACdG,UAAYpB,EAAIiB,EAAMrB,EAAM,OAC3ByB,SAAUvC,EAAoB,GAAP,MAE1B9O,QAAQC,QAAQA,EAAQ,GAAGkO,cAAc,qBAAqBtO,KAE5DyQ,KAAMN,EAAU,IAALF,EAAY,KACvBqB,OAAQD,EAAM,KACdE,UAAYpB,EAAIkB,EAAMtB,EAAM,OAC3ByB,SAASvC,EAAa,KAAO,IAEhC9O,QAAQC,QAAQ4Q,GAAahR,KAC3ByQ,KAAON,EAAIJ,EAAKE,EAAKgB,EAAe,KACpCM,UAAYpB,EAAKF,EAAK,EAAMiB,EAAe,OAE7CO,KAGEA,EAAe,WACjB,GAAI9I,GAAQwD,EAAOjF,wBACfqE,EAAI5C,EAAMC,OACVrF,EAAIoF,EAAMrB,QAEdoK,GAAcvR,QAAQC,QAAQA,EAAQ,GAAGkO,cAAc,mBAAoB,GAAa/C,EACxF,IAAIoG,GAAO,GAAc,EAAIvK,KAAKC,MAAM9D,EAAI,GAC5CmO,GAAcvR,QAAQC,QAAQA,EAAQ,GAAGkO,cAAc,qBAAsBqD,IAG3ED,EAAgB,SAAUzR,EAAI2R,GAChCzR,QAAQC,QAAQH,GAAID,KAClB6R,gBAAiB,UAAYD,EAAM,OACnCE,iBAAkB,UAAYF,EAAM,OACpCG,gBAAiB,UAAYH,EAAM,OACnCI,UAAa,UAAYJ,EAAM,UAK/Bb,EAAkB,WACpB,GAAI1P,GAAO8K,EAAOjF,uBAClBzE,GAAMwP,aAAehD,EAAa5N,EAAKiG,SAAYjG,EAAKuH,OAAS,GAGnEnG,GAAMwK,OAAO,WACX,GAAIiF,GAAM/F,EAAOjF,uBACjB,OAAOgL,GAAMA,EAAI3Q,OAAO,SAAW,IAClC,WACDwP,IACAU,KAIF,IAAIU,GAAmB,SAAUtI,EAAMuG,GACrC,IAAK,GAAIrM,GAAI,EAAGA,EAAIqM,EAAOxG,OAAQ7F,IACjCqM,EAAOrM,GAAG+M,QAAU/M,EAChB8F,IACFuG,EAAOrM,GAAG+M,SAAW,GAGzB,OAAOV,GAGJjE,GAAOtG,OAAOhE,WACjBY,EAAMwK,OAAO,kBAAmB,WAC9B,IAAKgC,GACCxM,EAAM2N,OAAQ,CAChB,GAAIA,GAAS+B,EAAiBhG,EAAOtC,OAAQ1J,QAAQ2F,KAAKrD,EAAM2N,QAChE3N,GAAM2N,OAASA,KAOvB3N,EAAM2P,QAAU,SAAUC,GACpBA,IAAQ5P,EAAMwP,cAChB9F,EAAOtB,KAGJoE,EAGH9C,EAAOzK,YAAY4F,OAAO+K,GAF1BlG,EAAOzK,YAAYkH,KAAKuD,EAAOtC,OAAUwI,EAAM,GAAMA,GAIvDlG,EAAOzK,YAAYmH,OAAO,IAG5BpG,EAAM6P,eAAiB,SAAUC,GAC/B,MAAOtD,GAAa9C,EAAO1B,kBAAkB8H,EAAMjP,OAAS6I,EAAO5B,gBAAgBgI,EAAMjP,OAG3F,IAAIkP,GAAY/P,EAAMwK,OAAO,WAC3B,MAAO7M,GAAQ,GAAGqS,iBAAiB,OAAO7I,QACzC,WACDwF,IACAoD","file":"angular-material-datetimepicker.min.js","sourcesContent":["(function () {\n 'use strict';\n var moduleName = \"ngMaterialDatePicker\";\n\n var VIEW_STATES = {\n DATE: 0,\n HOUR: 1,\n MINUTE: 2\n };\n\n var css = function (el, name) {\n el = angular.element(el);\n return ('getComputedStyle' in window) ? window.getComputedStyle(el[0])[name] : el.css(name);\n };\n\n var template = ''\n + ' '\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"dddd\")}}
'\n + '
{{picker.params.shortTime ? picker.currentDate.format(\"A\") : \" \"}}
'\n + '
'\n + ' ×'\n + '
'\n + '
'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"MMM\") | uppercase}}
'\n + '
'\n + '
{{picker.currentDate.format(\"DD\")}}
'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"YYYY\")}}
'\n + '
'\n + '
'\n + '
'//start time\n + '
'\n + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? \"hh:mm\" : \"HH:mm\")}}
'\n + '
'\n + '
'\n + ' '\n + '
'\n + '
'\n + '
'\n + ' {{picker.params.amText}}'\n + '
'\n + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? \"hh:mm\" : \"HH:mm\")}}
'\n + '
'\n + ' {{picker.params.pmText}}'\n + '
'\n + '
'\n + '
'\n + ' '\n + ' '\n + '
'\n + '
'\n + '
'\n + '
'\n + ' '\n + ' {{picker.params.todayText}}'\n + ' {{picker.params.cancelText}}'\n + ' {{picker.params.okText}}'\n + ' '\n + '
';\n\n\n angular.module(moduleName, ['ngMaterial'])\n .provider('mdcDatetimePickerDefaultLocale', function () {\n this.locale = window.navigator.userLanguage || window.navigator.language || 'en';\n\n this.$get = function () {\n return this;\n };\n\n this.setDefaultLocale = function (localeString) {\n this.locale = localeString;\n };\n })\n .factory('mdcDefaultParams', ['mdcDatetimePickerDefaultLocale', function (mdcDatetimePickerDefaultLocale) {\n var default_params = {\n date: true,\n time: true,\n format: 'YYYY-MM-DD',\n minDate: null,\n maxDate: null,\n currentDate: null,\n lang: mdcDatetimePickerDefaultLocale.locale,\n weekStart: 0,\n shortTime: false,\n cancelText: 'Cancel',\n okText: 'OK',\n amText: 'AM',\n pmText: 'PM',\n todayText: 'Today',\n disableDates: []\n };\n return default_params;\n }])\n .directive('mdcDatetimePicker', ['$mdDialog', '$timeout',\n function ($mdDialog, $timeout) {\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n currentDate: '=ngModel',\n ngChange: '&',\n time: '=',\n date: '=',\n minDate: '=',\n maxDate: '=',\n disableDates: '=',\n shortTime: '=',\n weekStart: '=',\n format: '@',\n cancelText: '@',\n okText: '@',\n lang: '@',\n amText: '@',\n pmText: '@',\n showTodaysDate: '@',\n todayText: '@'\n },\n link: function (scope, element, attrs, ngModel) {\n var isOn = false;\n if (!scope.format) {\n if (scope.date && scope.time) {\n scope.format = 'YYYY-MM-DD HH:mm';\n } else if (scope.date) {\n scope.format = 'YYYY-MM-DD';\n } else {\n scope.format = 'HH:mm';\n }\n }\n\n var dateOfTheDay = null;\n if (scope.showTodaysDate !== undefined && scope.showTodaysDate !== \"false\") {\n dateOfTheDay = moment();\n }\n\n if (angular.isString(scope.currentDate) && scope.currentDate !== '') {\n scope.currentDate = moment(scope.currentDate, scope.format);\n }\n\n if (ngModel) {\n ngModel.$formatters.push(function (value) {\n if (typeof value === 'undefined') {\n return;\n }\n var m = moment(value);\n return m.isValid() ? m.format(scope.format) : '';\n });\n }\n\n element.attr('readonly', '');\n //@TODO custom event to trigger input\n element.on('focus', function (e) {\n e.preventDefault();\n element.blur();\n if (isOn) {\n return;\n }\n isOn = true;\n var options = {};\n for (var i in attrs) {\n if (scope.hasOwnProperty(i) && !angular.isUndefined(scope[i])) {\n options[i] = scope[i];\n }\n }\n options.currentDate = scope.currentDate;\n options.showTodaysDate = dateOfTheDay;\n\n var locals = {options: options};\n $mdDialog.show({\n template: template,\n controller: PluginController,\n controllerAs: 'picker',\n locals: locals,\n openFrom: element,\n parent: angular.element(document.body),\n bindToController: true,\n disableParentScroll: false,\n hasBackDrop: false,\n skipHide: true\n })\n .then(function (v) {\n scope.currentDate = v ? v._d : v;\n isOn = false;\n\n if (!moment(scope.currentDate).isSame(options.currentDate)) {\n $timeout(scope.ngChange, 0);\n }\n\n element.blur()\n\n }, function () {\n isOn = false;\n element.blur()\n })\n ;\n });\n }\n };\n }])\n /** Returns a service that opens a dialog when the attribute shown is called\n The dialog serves to select a date/time/etc. depending on the options given to the function show\n\n @param options extends mdcDefaultParams\n {\n date: {boolean} =true,\n time: {boolean] =true,\n format: {string} ='YYYY-MM-DD',\n minDate: {strign} =null,\n maxDate: {string} =null,\n currentDate: {string} =null,\n lang: {string} =mdcDatetimePickerDefaultLocale,\n weekStart: {int} =0,\n shortTime: {boolean} =false,\n cancelText: {string} ='Cancel',\n todayText: {string} ='Today',\n okText: {string} ='OK',\n amText: {string} ='AM',\n pmText: {string} ='PM'\n }\n @return promise\n */\n .factory('mdcDateTimeDialog', [\"$mdDialog\", \"$q\", \"mdcDefaultParams\", function ($mdDialog, $q, mdcDefaultParams) {\n var accepted_options = Object.keys(mdcDefaultParams);\n console.log(accepted_options);\n var service = {\n show: function (options) {\n var deferred = $q.defer();\n var params = angular.copy(mdcDefaultParams);\n for (var i in options) {\n if (accepted_options.indexOf[i] != -1 && options.hasOwnProperty(i)) {\n params = options[i];\n }\n }\n var locals = {options: options};\n $mdDialog.show({\n template: template,\n controller: PluginController,\n controllerAs: 'picker',\n locals: locals,\n parent: angular.element(document.body),\n bindToController: true,\n clickOutsideToClose: true,\n disableParentScroll: false,\n skipHide: true\n })\n .then(function (v) {\n var currentDate = v ? v._d : v;\n deferred.resolve(v ? v._d : v);\n }, function () {\n deferred.reject();\n });\n return deferred.promise;\n }\n };\n\n return service;\n }])\n ;\n\n var PluginController = function ($scope, $mdDialog, mdcDefaultParams) {\n this.currentView = VIEW_STATES.DATE;\n this._dialog = $mdDialog;\n\n this._attachedEvents = [];\n this.VIEWS = VIEW_STATES;\n this.params = mdcDefaultParams;\n this.meridien = 'AM';\n this.params = angular.extend(this.params, this.options);\n\n this.init();\n };\n\n PluginController.$inject = ['$scope', '$mdDialog', 'mdcDefaultParams'];\n PluginController.prototype = {\n init: function () {\n this.timeMode = this.params.time && !this.params.date;\n this.dateMode = this.params.date;\n this.initDates();\n this.start();\n },\n currentNearest5Minute: function () {\n var date = this.currentDate || moment();\n var minutes = (5 * Math.round(date.minute() / 5));\n if (minutes >= 60) {\n minutes = 55; //always push down\n }\n return moment(date).minutes(minutes);\n },\n initDates: function () {\n var that = this;\n var _dateParam = function (input, fallback) {\n var ret = null;\n if (angular.isDefined(input) && input !== null && input !== '') {\n if (angular.isString(input)) {\n if (typeof(that.params.format) !== 'undefined' && that.params.format !== null) {\n ret = moment(input, that.params.format).locale(that.params.lang);\n }\n else {\n ret = moment(input).locale(that.params.lang);\n }\n } else if (typeof input === 'number') {\n ret = moment(input).locale(that.params.lang);\n } else {\n if (angular.isDate(input)) {\n var x = input.getTime();\n ret = moment(x, \"x\").locale(that.params.lang);\n } else if (input._isAMomentObject) {\n ret = input;\n }\n }\n }\n else {\n ret = fallback;\n }\n return ret;\n };\n\n this.currentDate = _dateParam(this.params.currentDate, moment());\n this.minDate = _dateParam(this.params.minDate);\n this.maxDate = _dateParam(this.params.maxDate);\n this.disableDates = this.params.disableDates.map(function (x) {\n return moment(x).format('MMMM Do YYYY')\n });\n this.selectDate(this.currentDate);\n },\n initDate: function () {\n this.currentView = VIEW_STATES.DATE;\n },\n initHours: function () {\n this.currentView = VIEW_STATES.HOUR;\n },\n initMinutes: function () {\n this.currentView = VIEW_STATES.MINUTE;\n },\n isAfterMinDate: function (date, checkHour, checkMinute) {\n var _return = true;\n\n if (typeof(this.minDate) !== 'undefined' && this.minDate !== null) {\n var _minDate = moment(this.minDate);\n var _date = moment(date);\n\n if (!checkHour && !checkMinute) {\n _minDate.hour(0);\n _minDate.minute(0);\n\n _date.hour(0);\n _date.minute(0);\n }\n\n _minDate.second(0);\n _date.second(0);\n _minDate.millisecond(0);\n _date.millisecond(0);\n\n if (!checkMinute) {\n _date.minute(0);\n _minDate.minute(0);\n\n _return = (parseInt(_date.format(\"X\")) >= parseInt(_minDate.format(\"X\")));\n }\n else {\n _return = (parseInt(_date.format(\"X\")) >= parseInt(_minDate.format(\"X\")));\n }\n }\n\n return _return;\n },\n isBeforeMaxDate: function (date, checkTime, checkMinute) {\n var _return = true;\n\n if (typeof(this.maxDate) !== 'undefined' && this.maxDate !== null) {\n var _maxDate = moment(this.maxDate);\n var _date = moment(date);\n\n if (!checkTime && !checkMinute) {\n _maxDate.hour(0);\n _maxDate.minute(0);\n\n _date.hour(0);\n _date.minute(0);\n }\n\n _maxDate.second(0);\n _date.second(0);\n _maxDate.millisecond(0);\n _date.millisecond(0);\n\n if (!checkMinute) {\n _date.minute(0);\n _maxDate.minute(0);\n\n _return = (parseInt(_date.format(\"X\")) <= parseInt(_maxDate.format(\"X\")));\n }\n else {\n _return = (parseInt(_date.format(\"X\")) <= parseInt(_maxDate.format(\"X\")));\n }\n }\n\n return _return;\n },\n isInDisableDates: function (date) {\n var dut = date.format('MMMM Do YYYY')\n if (this.disableDates.indexOf(dut) > -1) {\n return false;\n }\n return true;\n },\n selectDate: function (date) {\n if (date) {\n this.currentDate = moment(date);\n if (!this.isAfterMinDate(this.currentDate)) {\n this.currentDate = moment(this.minDate);\n }\n\n if (!this.isBeforeMaxDate(this.currentDate)) {\n this.currentDate = moment(this.maxDate);\n }\n this.currentDate.locale(this.params.lang);\n this.calendarStart = moment(this.currentDate);\n this.meridien = this.currentDate.hour() >= 12 ? 'PM' : 'AM';\n }\n },\n setName: function () {\n var text = \"\";\n var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n for (var i = 0; i < 5; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n },\n isPM: function () {\n return this.meridien === 'PM';\n },\n incrementYear: function (amount) {\n if (amount === 1 && this.isNextYearVisible()) {\n this.selectDate(this.currentDate.add(amount, 'year'));\n }\n\n if (amount === -1 && this.isPreviousYearVisible()) {\n this.selectDate(this.currentDate.add(amount, 'year'));\n }\n },\n isPreviousMonthVisible: function () {\n return this.calendarStart && this.isAfterMinDate(moment(this.calendarStart).startOf('month'), false, false);\n },\n isNextMonthVisible: function () {\n return this.calendarStart && this.isBeforeMaxDate(moment(this.calendarStart).endOf('month'), false, false);\n },\n isPreviousYearVisible: function () {\n return this.calendarStart && this.isAfterMinDate(moment(this.calendarStart).startOf('year'), false, false);\n },\n isNextYearVisible: function () {\n return this.calendarStart && this.isBeforeMaxDate(moment(this.calendarStart).endOf('year'), false, false);\n },\n isHourAvailable: function (hour) {\n var _date = moment(this.currentDate);\n _date.hour(this.convertHours(hour)).minute(0).second(0);\n return this.isAfterMinDate(_date, true, false) && this.isBeforeMaxDate(_date, true, false);\n },\n isMinuteAvailable: function (minute) {\n var _date = moment(this.currentDate);\n _date.minute(minute).second(0);\n return this.isAfterMinDate(_date, true, true) && this.isBeforeMaxDate(_date, true, true);\n },\n start: function () {\n this.currentView = VIEW_STATES.DATE;\n //this.initDates();\n if (this.params.date) {\n this.initDate();\n } else {\n if (this.params.time) {\n this.initHours();\n }\n }\n },\n today: function () {\n this.selectDate(Date.now());\n },\n ok: function () {\n switch (this.currentView) {\n case VIEW_STATES.DATE:\n if (this.params.time === true) {\n this.initHours();\n }\n else {\n this.hide(true);\n }\n break;\n case VIEW_STATES.HOUR:\n this.initMinutes();\n break;\n case VIEW_STATES.MINUTE:\n this.hide(true);\n break;\n }\n },\n cancel: function () {\n if (this.params.time) {\n switch (this.currentView) {\n case VIEW_STATES.DATE:\n this.hide();\n break;\n case VIEW_STATES.HOUR:\n if (this.params.date) {\n this.initDate();\n }\n else {\n this.hide();\n }\n break;\n case VIEW_STATES.MINUTE:\n this.initHours();\n break;\n }\n }\n else {\n this.hide();\n }\n },\n selectMonthBefore: function () {\n this.calendarStart.subtract(1, 'months');\n },\n selectMonthAfter: function () {\n this.calendarStart.add(1, 'months');\n },\n selectYearBefore: function () {\n this.calendarStart.subtract(1, 'years');\n },\n selectYearAfter: function () {\n this.calendarStart.add(1, 'years');\n },\n selectAM: function () {\n if (this.isHourAvailable(0) || this.isHourAvailable(12)) {\n if (this.currentDate.hour() >= 12) {\n this.selectDate(this.currentDate.subtract(12, 'hours'));\n }\n if (!this.isHourAvailable(this.currentDate.hour())) {\n this.selectDate(this.currentDate.hour(this.minDate.hour()));\n }\n if (!this.isMinuteAvailable(this.currentDate.minute())) {\n this.selectDate(this.currentDate.minute(this.minDate.minute()));\n }\n }\n },\n selectPM: function () {\n if (this.isHourAvailable(13) || this.isHourAvailable(24)) {\n if (this.currentDate.hour() < 12) {\n this.selectDate(this.currentDate.add(12, 'hours'));\n }\n if (!this.isHourAvailable(this.currentDate.hour())) {\n this.selectDate(this.currentDate.hour(this.maxDate.hour()));\n }\n if (!this.isMinuteAvailable(this.currentDate.minute())) {\n this.selectDate(this.currentDate.minute(this.maxDate.minute()));\n }\n }\n },\n convertHours: function (h) {\n var _return = h;\n if ((h < 12) && this.isPM())\n _return += 12;\n\n return _return;\n },\n hide: function (okBtn) {\n if (okBtn) {\n this._dialog.hide(this.currentDate);\n } else {\n this._dialog.cancel();\n }\n }\n };\n\n\n angular.module(moduleName)\n .directive('mdcDatetimePickerCalendar', [\n function () {\n\n var YEAR_MIN = 1920,\n YEAR_MAX = new Date().getFullYear() + 30,\n MONTHS_IN_ALL = (YEAR_MAX - YEAR_MIN + 1) * 12,\n ITEM_HEIGHT = 240,\n MONTHS = [];\n for (var i = 0; i < MONTHS_IN_ALL; i++) {\n MONTHS.push(i);\n }\n\n var currentMonthIndex = function (date, low) {\n low = low ? low : 0;\n var year = date.year();\n var month = date.month();\n return (((year - YEAR_MIN) * 12) + month - 1 ) - low;\n };\n\n return {\n restrict: 'E',\n scope: {\n picker: '=',\n date: '='\n },\n bindToController: true,\n controllerAs: 'cal',\n controller: ['$scope', function ($scope) {\n this.$onInit = function () {\n var calendar = this,\n picker = this.picker,\n days = [];\n\n for (var i = picker.params.weekStart; days.length < 7; i++) {\n if (i > 6) {\n i = 0;\n }\n days.push(i.toString());\n }\n\n calendar.week = days;\n if (!picker.maxDate && !picker.minDate) {\n calendar.months = MONTHS;\n } else {\n var low = picker.minDate ? currentMonthIndex(picker.minDate) : 0;\n var high = picker.maxDate ? (currentMonthIndex(picker.maxDate) + 1) : MONTHS_IN_ALL;\n calendar.months = MONTHS.slice(low, high);\n }\n\n\n calendar.getItemAtIndex = function (index) {\n var month = ((index + 1) % 12) || 12;\n var year = YEAR_MIN + Math.floor(index / 12);\n var monthObj = moment(picker.currentDate)\n .year(year)\n .month(month);\n return generateMonthCalendar(monthObj);\n };\n\n calendar.topIndex = currentMonthIndex(picker.currentDate) - calendar.months[0];\n\n $scope.$watch(function () {\n return picker.currentDate ? picker.currentDate.format('YYYY-MM') : '';\n }, function (val2, val1) {\n if (val2 != val1) {\n var nDate = moment(val2, 'YYYY-MM');\n var low = picker.minDate ? currentMonthIndex(picker.minDate) : 0;\n var index = currentMonthIndex(nDate, low);\n if (calendar.topIndex != index) {\n calendar.topIndex = index;\n }\n }\n });\n\n var generateMonthCalendar = function (date) {\n var month = {};\n if (date !== null) {\n month.name = date.format('MMMM YYYY');\n var startOfMonth = moment(date).locale(picker.params.lang).startOf('month')\n .hour(date.hour())\n .minute(date.minute())\n ;\n var iNumDay = startOfMonth.format('d');\n month.days = [];\n for (var i = startOfMonth.date(); i <= startOfMonth.daysInMonth(); i++) {\n if (i === startOfMonth.date()) {\n var iWeek = calendar.week.indexOf(iNumDay.toString());\n if (iWeek > 0) {\n for (var x = 0; x < iWeek; x++) {\n month.days.push(0);\n }\n }\n }\n month.days.push(moment(startOfMonth).locale(picker.params.lang).date(i));\n }\n\n var daysInAWeek = 7, daysTmp = [], slices = Math.ceil(month.days.length / daysInAWeek);\n for (var j = 0; j < slices; j++) {\n daysTmp.push(month.days.slice(j * daysInAWeek, (j + 1) * daysInAWeek));\n }\n month.days = daysTmp;\n return month;\n }\n\n };\n\n calendar.toDay = function (i) {\n return moment(parseInt(i), \"d\")\n .locale(picker.params.lang)\n .format(\"dd\")\n .substring(0, 1);\n };\n\n calendar.isInRange = function (date) {\n return picker.isAfterMinDate(moment(date), false, false)\n && picker.isBeforeMaxDate(moment(date), false, false)\n && picker.isInDisableDates(moment(date));\n };\n\n calendar.selectDate = function (date) {\n if (date) {\n if (calendar.isSelectedDay(date)) {\n return picker.ok();\n }\n picker.selectDate(moment(date).hour(calendar.date.hour()).minute(calendar.date.minute()));\n }\n };\n\n calendar.isSelectedDay = function (m) {\n return m && calendar.date.date() === m.date() && calendar.date.month() === m.month() && calendar.date.year() === m.year();\n };\n\n calendar.isDateOfTheDay = function (m) {\n var today = calendar.picker.options.showTodaysDate;\n if (!today) {\n return false;\n }\n\n return m && today.date() === m.date() && today.month() === m.month() && today.year() === m.year();\n }\n }\n }],\n template: '' +\n '
' +\n '
' +\n '
' +\n '
'\n };\n }])\n .directive('mdcDatetimePickerCalendarMonth', ['$compile',\n function ($compile) {\n var buildCalendarContent = function (element, scope) {\n var tbody = angular.element(element[0].querySelector('tbody'));\n var calendar = scope.cal, month = scope.month;\n\n var tbodyHtml = [];\n\n month.days.forEach(function (weekDays, i) {\n tbodyHtml.push('');\n weekDays.forEach(function (weekDay, j) {\n tbodyHtml.push('');\n if (weekDay) {\n if (calendar.isInRange(weekDay)) {\n //build a\n var scopeRef = 'month[\\'days\\'][' + i + '][' + j + ']';\n\n tbodyHtml.push('');\n tbodyHtml.push(weekDay.format('D'));\n tbodyHtml.push('');\n } else {\n tbodyHtml.push('');\n tbodyHtml.push(weekDay.format('D'));\n tbodyHtml.push('');\n }\n }\n tbodyHtml.push('');\n });\n tbodyHtml.push('');\n });\n\n tbody.html(tbodyHtml.join(''));\n $compile(tbody)(scope);\n };\n\n return {\n scope: {\n idx: '='\n },\n require: '^mdcDatetimePickerCalendar',\n restrict: 'AE',\n template: '
{{month.name}}
'\n + ''\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + '
{{cal.toDay(day)}}
',\n link: function (scope, element, attrs, calendar) {\n scope.cal = calendar;\n scope.month = calendar.getItemAtIndex(parseInt(scope.idx));\n buildCalendarContent(element, scope);\n scope.$watch(function () {\n return scope.idx;\n }, function (idx, oldIdx) {\n if (idx != oldIdx) {\n scope.month = calendar.getItemAtIndex(parseInt(scope.idx));\n buildCalendarContent(element, scope);\n }\n });\n }\n };\n }\n ])\n ;\n\n angular.module(moduleName)\n .directive('mdcDtpNoclick', function () {\n return {\n link: function (scope, el) {\n el.on('click', function (e) {\n e.preventDefault();\n });\n }\n };\n });\n angular.module(moduleName)\n .directive('mdcDatetimePickerClock', [\n function () {\n\n var template = '
 '\n + '
'\n + ' {{point.display}}'\n + ' {{point.display}}'\n + '
'\n + '
'\n + '
'\n + '
'\n + '
';\n\n return {\n restrict: 'E',\n template: template,\n link: function (scope, element, attrs) {\n var minuteMode = attrs.mode === 'minutes';\n var picker = scope.picker;\n //banking on the fact that there will only be one at a time\n var componentRoot = document.querySelector('md-dialog.dtp');\n var exec = function () {\n var clock = angular.element(element[0].querySelector('.dtp-picker-clock')),\n pickerEl = angular.element(componentRoot.querySelector('.dtp-picker'));\n\n var w = componentRoot.querySelector('.dtp-content').offsetWidth;\n var pl = parseInt(css(pickerEl, 'paddingLeft').replace('px', '')) || 0;\n var pr = parseInt(css(pickerEl, 'paddingRight').replace('px', '')) || 0;\n var ml = parseInt(css(clock, 'marginLeft').replace('px', '')) || 0;\n var mr = parseInt(css(clock, 'marginRight').replace('px', '')) || 0;\n //set width\n var clockWidth = (w - (ml + mr + pl + pr));\n clock.css('width', (clockWidth) + 'px');\n\n var pL = parseInt(css(pickerEl, 'paddingLeft').replace('px', '')) || 0;\n var pT = parseInt(css(pickerEl, 'paddingTop').replace('px', '')) || 0;\n var mL = parseInt(css(clock, 'marginLeft').replace('px', '')) || 0;\n var mT = parseInt(css(clock, 'marginTop').replace('px', '')) || 0;\n\n var r = (clockWidth / 2);\n var j = r / 1.2; //???\n\n var points = [];\n\n for (var h = 0; h < 12; ++h) {\n var x = j * Math.sin(Math.PI * 2 * (h / 12));\n var y = j * Math.cos(Math.PI * 2 * (h / 12));\n var left = (r + x + pL / 2) - (pL + mL);\n var top = (r - y - mT / 2) - (pT + mT);\n\n var hour = {\n left: left,\n top: top,\n value: (minuteMode ? (h * 5) : h), //5 for minute 60/12\n style: {'margin-left': left + 'px', 'margin-top': top + 'px'}\n };\n\n if (minuteMode) {\n hour.display = hour.value < 10 ? ('0' + hour.value) : hour.value;\n } else {\n\n if (picker.params.shortTime) {\n hour.display = (h === 0) ? 12 : h;\n } else {\n hour.display = picker.isPM() ? h + 12 : h;\n }\n }\n\n\n points.push(hour);\n }\n\n scope.points = points;\n scope.mode = attrs.mode;\n setCurrentValue();\n clock.css('height', clockWidth + 'px');\n //picker.initHands(true);\n\n var clockCenter = element[0].querySelector('.dtp-clock-center');\n var centerWidth = (clockCenter.offsetWidth / 2) || 7.5,\n centerHeight = (clockCenter.offsetHeight / 2) || 7.5;\n var _hL = r / 1.8;\n var _mL = r / 1.5;\n\n angular.element(element[0].querySelector('.dtp-hour-hand')).css({\n left: r + (mL * 1.5) + 'px',\n height: _hL + 'px',\n marginTop: (r - _hL - pL) + 'px'\n }).addClass(!minuteMode ? 'on' : '');\n\n angular.element(element[0].querySelector('.dtp-minute-hand')).css\n ({\n left: r + (mL * 1.5) + 'px',\n height: _mL + 'px',\n marginTop: (r - _mL - pL) + 'px'\n }).addClass(minuteMode ? 'on' : '');\n\n angular.element(clockCenter).css({\n left: (r + pL + mL - centerWidth) + 'px',\n marginTop: (r - (mL / 2)) - centerHeight + 'px'\n });\n animateHands();\n };\n\n var animateHands = function () {\n var _date = picker.currentNearest5Minute();\n var h = _date.hour();\n var m = _date.minute();\n\n rotateElement(angular.element(element[0].querySelector('.dtp-hour-hand')), (360 / 12) * h);\n var mdg = ((360 / 60) * (5 * Math.round(m / 5)));\n rotateElement(angular.element(element[0].querySelector('.dtp-minute-hand')), mdg);\n };\n\n var rotateElement = function (el, deg) {\n angular.element(el).css({\n WebkitTransform: 'rotate(' + deg + 'deg)',\n '-moz-transform': 'rotate(' + deg + 'deg)',\n '-ms-transform': 'rotate(' + deg + 'deg)',\n 'transform': 'rotate(' + deg + 'deg)'\n });\n };\n\n\n var setCurrentValue = function () {\n var date = picker.currentNearest5Minute();\n scope.currentValue = minuteMode ? date.minute() : (date.hour() % 12);\n };\n\n scope.$watch(function () {\n var tmp = picker.currentNearest5Minute();\n return tmp ? tmp.format('HH:mm') : '';\n }, function () {\n setCurrentValue();\n animateHands();\n });\n\n\n var setDisplayPoints = function (isPM, points) {\n for (var i = 0; i < points.length; i++) {\n points[i].display = i;\n if (isPM) {\n points[i].display += 12;\n }\n }\n return points;\n };\n\n if (!picker.params.shortTime) {\n scope.$watch('picker.meridien', function () {\n if (!minuteMode) {\n if (scope.points) {\n var points = setDisplayPoints(picker.isPM(), angular.copy(scope.points));\n scope.points = points;\n }\n }\n });\n }\n\n\n scope.setTime = function (val) {\n if (val === scope.currentValue) {\n picker.ok();\n }\n\n if (!minuteMode) {\n picker.currentDate.hour(picker.isPM() ? (val + 12) : val);\n } else {\n picker.currentDate.minute(val);\n }\n picker.currentDate.second(0)\n };\n\n scope.pointAvailable = function (point) {\n return minuteMode ? picker.isMinuteAvailable(point.value) : picker.isHourAvailable(point.value);\n };\n\n var unWatcher = scope.$watch(function () {\n return element[0].querySelectorAll('div').length;\n }, function () {\n exec();\n unWatcher();\n });\n }\n }\n }]);\n\n})();\n"]} \ No newline at end of file diff --git a/dist/material-datetimepicker.min.css b/dist/material-datetimepicker.min.css index d4891c4..ed35997 100644 --- a/dist/material-datetimepicker.min.css +++ b/dist/material-datetimepicker.min.css @@ -1 +1 @@ -.dtp .p10,.dtp .p20,.dtp .p60,.dtp .p80,.dtp table.dtp-picker-days tr>td>.dtp-select-day{display:inline-block}md-dialog.dtp{font-size:14px;line-height:1.42857143;color:#333;background-color:#fff;max-height:none;min-width:300px}.dtp :focus{outline:0!important}.dtp table{border-spacing:0;border-collapse:collapse;width:100%}.dtp .table>tbody>tr>td,.dtp .table>tbody>tr>th,.dtp .table>tfoot>tr>td,.dtp .table>tfoot>tr>th,.dtp .table>thead>tr>td,.dtp .table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.dtp,.dtp *{box-sizing:border-box!important}.dtp>.dtp-content{max-width:300px;max-height:500px}.dtp>.dtp-content>.dtp-date-view>header.dtp-header{background:#689F38;color:#fff;text-align:center;padding:3px}.dtp div.dtp-date,.dtp div.dtp-time{background:#8BC34A;text-align:center;color:#fff;padding:10px}.dtp div.dtp-date>div{padding:0;margin:0}.dtp div.dtp-actual-month{font-size:1.5em}.dtp div.dtp-actual-maxtime,.dtp div.dtp-actual-num{font-size:3em;line-height:.9}.dtp div.dtp-actual-year{font-size:1.6em;color:#DCEDC8}.dtp div.dtp-year-btn{font-size:1.4em;line-height:30px;cursor:pointer;color:#DCEDC8}.dtp div.dtp-year-btn-prev{text-align:right}.dtp div.dtp-year-btn-next{text-align:left}.dtp div.dtp-picker{padding:10px;text-align:center;overflow:hidden}.dtp div.dtp-actual-time,.dtp div.dtp-picker-month{font-weight:500;text-align:center}.dtp .dtp-close{position:absolute;top:.25em;right:5px;font-size:16px}.dtp .dtp-close>a{color:#fff;text-decoration:none}.dtp .dtp-close>a>i{font-size:1em}.dtp table.dtp-picker-days{margin:0;min-height:220px}.dtp md-virtual-repeat-container.months{height:260px}.dtp table.dtp-picker-days,.dtp table.dtp-picker-days tr,.dtp table.dtp-picker-days tr>td{border:none}.dtp table.dtp-picker-days tr>td{font-size:11px;text-align:center;padding:0}.dtp table.dtp-picker-days tr>td>span.dtp-select-day{color:#BDBDBD!important}.dtp table.dtp-picker-days tr>td,.dtp table.dtp-picker-days tr>td>.dtp-select-day{width:36px;height:36px}.dtp .dtp-picker-time>a,.dtp table.dtp-picker-days tr>td>.dtp-select-day{color:#212121;text-decoration:none;padding:10px;border-radius:50%!important}.dtp table.dtp-picker-days tr>td>a.selected{background:#8BC34A;color:#fff}.dtp table.dtp-picker-days tr>td>a.selected.hilite{padding:6px;font-size:16px;font-weight:500;background:#8BC34A;color:#fff}.dtp table.dtp-picker-days tr>td>a.hilite:not(.selected){padding:6px;font-size:16px;font-weight:500;color:#8BC34A}.dtp table.dtp-picker-days tr>td>a:hover:not(.selected){background:#ddd}.dtp table.dtp-picker-days tr>th{color:#757575;text-align:center;font-weight:700;padding:4px 3px;width:38px;height:28px}.dtp .p10>a{color:#689F38;text-decoration:none}.dtp .p10{width:10%}.dtp .p20{width:20%}.dtp .p60{width:60%}.dtp .p80{width:80%}.dtp a.dtp-meridien-am,.dtp a.dtp-meridien-pm{position:relative;top:10px;color:#212121;font-weight:500;padding:7px 5px;border-radius:50%!important;text-decoration:none;background:#eee;font-size:10px}.dtp .dtp-actual-meridien a.selected,.dtp .dtp-picker-time>a.dtp-select-hour.selected{background:#689F38;color:#fff}.dtp .dtp-picker-time>a{display:block;line-height:23px;padding:3px}.dtp .dtp-picker-time{position:absolute;width:30px;height:30px;font-size:1.1em;border-radius:50%;cursor:pointer;text-align:center!important}.dtp .dtp-picker-time>a.dtp-select-hour.disabled,.dtp .dtp-picker-time>a.dtp-select-minute.disabled{color:#757575}.dtp .dtp-picker-time>a.dtp-select-minute.selected{background:#8BC34A;color:#fff}.dtp div.dtp-picker-clock{margin:10px 20px 0;padding:10px;border-radius:50%!important;background:#eee}.dtp-clock-center{width:15px;height:15px;background:#757575;border-radius:50%;position:absolute;z-index:50}.dtp .dtp-hand,.dtp .dtp-hour-hand{position:absolute;width:4px;margin-left:-2px;background:#BDBDBD;-moz-transform:rotate(0);-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);-moz-transform-origin:bottom;-ms-transform-origin:bottom;-webkit-transform-origin:bottom;transform-origin:bottom;z-index:1}.dtp .dtp-minute-hand{width:2px;margin-left:-1px}.dtp .dtp-hand.on{background:#8BC34A}.dtp .dtp-buttons{padding-bottom:10px;text-align:right}.dtp .hidden,.dtp.hidden{display:none}.dtp .invisible{visibility:hidden}.dtp .left{float:left}.dtp .right{float:right}.dtp .clearfix{clear:both}.dtp .center{text-align:center} \ No newline at end of file +md-dialog.dtp{font-size:14px;line-height:1.42857143;color:#333;background-color:#fff;max-height:none;min-width:300px}.dtp :focus{outline:0!important}.dtp table{border-spacing:0;border-collapse:collapse;width:100%}.dtp .table>tbody>tr>td,.dtp .table>tbody>tr>th,.dtp .table>tfoot>tr>td,.dtp .table>tfoot>tr>th,.dtp .table>thead>tr>td,.dtp .table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.dtp,.dtp *{box-sizing:border-box!important}.dtp>.dtp-content{max-width:300px;max-height:500px}.dtp>.dtp-content>.dtp-date-view>header.dtp-header{background:#689f38;color:#fff;text-align:center;padding:3px}.dtp div.dtp-date,.dtp div.dtp-time{background:#8bc34a;text-align:center;color:#fff;padding:10px}.dtp div.dtp-date>div{padding:0;margin:0}.dtp div.dtp-actual-month{font-size:1.5em}.dtp div.dtp-actual-num{font-size:3em;line-height:.9}.dtp div.dtp-actual-maxtime{font-size:3em;line-height:.9}.dtp div.dtp-actual-year{font-size:1.6em;color:#dcedc8}.dtp div.dtp-year-btn{font-size:1.4em;line-height:30px;cursor:pointer;color:#dcedc8}.dtp div.dtp-year-btn-prev{text-align:right}.dtp div.dtp-year-btn-next{text-align:left}.dtp div.dtp-picker{padding:10px;text-align:center;overflow:hidden}.dtp div.dtp-actual-time,.dtp div.dtp-picker-month{font-weight:500;text-align:center}.dtp .dtp-close{position:absolute;top:.25em;right:5px;font-size:16px}.dtp .dtp-close>a{color:#fff;text-decoration:none}.dtp .dtp-close>a>i{font-size:1em}.dtp table.dtp-picker-days{margin:0;min-height:220px}.dtp md-virtual-repeat-container.months{height:260px}.dtp table.dtp-picker-days,.dtp table.dtp-picker-days tr,.dtp table.dtp-picker-days tr>td{border:none}.dtp table.dtp-picker-days tr>td{font-size:11px;text-align:center;padding:0}.dtp table.dtp-picker-days tr>td>span.dtp-select-day{color:#bdbdbd!important}.dtp table.dtp-picker-days tr>td,.dtp table.dtp-picker-days tr>td>.dtp-select-day{width:36px;height:36px}.dtp table.dtp-picker-days tr>td>.dtp-select-day{display:inline-block}.dtp .dtp-picker-time>a,.dtp table.dtp-picker-days tr>td>.dtp-select-day{color:#212121;text-decoration:none;padding:10px;border-radius:50%!important}.dtp table.dtp-picker-days tr>td>a.selected{background:#8bc34a;color:#fff}.dtp table.dtp-picker-days tr>td>a.selected.hilite{padding:6px;font-size:16px;font-weight:500;background:#8bc34a;color:#fff}.dtp table.dtp-picker-days tr>td>a.hilite:not(.selected){padding:6px;font-size:16px;font-weight:500;color:#8bc34a}.dtp table.dtp-picker-days tr>td>a:hover:not(.selected){background:#ddd}.dtp table.dtp-picker-days tr>th{color:#757575;text-align:center;font-weight:700;padding:4px 3px;width:38px;height:28px}.dtp .p10>a{color:#689f38;text-decoration:none}.dtp .p10{width:10%;display:inline-block}.dtp .p20{width:20%;display:inline-block}.dtp .p60{width:60%;display:inline-block}.dtp .p80{width:80%;display:inline-block}.dtp a.dtp-meridien-am,.dtp a.dtp-meridien-pm{position:relative;top:10px;color:#212121;font-weight:500;padding:7px 5px;border-radius:50%!important;text-decoration:none;background:#eee;font-size:10px}.dtp .dtp-actual-meridien a.selected{background:#689f38;color:#fff}.dtp .dtp-picker-time>a{display:block;line-height:23px;padding:3px 3px 3px 3px}.dtp .dtp-picker-time{position:absolute;width:30px;height:30px;font-size:1.1em;border-radius:50%;cursor:pointer;text-align:center!important}.dtp .dtp-picker-time>a.dtp-select-hour.selected{background:#689f38;color:#fff}.dtp .dtp-picker-time>a.dtp-select-hour.disabled,.dtp .dtp-picker-time>a.dtp-select-minute.disabled{color:#757575}.dtp .dtp-picker-time>a.dtp-select-minute.selected{background:#8bc34a;color:#fff}.dtp div.dtp-picker-clock{margin:10px 20px 0 20px;padding:10px;border-radius:50%!important;background:#eee}.dtp-clock-center{width:15px;height:15px;background:#757575;border-radius:50%;position:absolute;z-index:50}.dtp .dtp-hand,.dtp .dtp-hour-hand{position:absolute;width:4px;margin-left:-2px;background:#bdbdbd;-moz-transform:rotate(0);-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);-moz-transform-origin:bottom;-ms-transform-origin:bottom;-webkit-transform-origin:bottom;transform-origin:bottom;z-index:1}.dtp .dtp-minute-hand{width:2px;margin-left:-1px}.dtp .dtp-hand.on{background:#8bc34a}.dtp .dtp-buttons{padding-bottom:10px;text-align:right}.dtp .hidden,.dtp.hidden{display:none}.dtp .invisible{visibility:hidden}.dtp .left{float:left}.dtp .right{float:right}.dtp .clearfix{clear:both}.dtp .center{text-align:center} \ No newline at end of file diff --git a/js/angular-material-datetimepicker.js b/js/angular-material-datetimepicker.js index dfcbd4e..c74c87c 100644 --- a/js/angular-material-datetimepicker.js +++ b/js/angular-material-datetimepicker.js @@ -42,11 +42,11 @@ + '
' + '
' + ' ' + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? "hh:mm" : "HH:mm")}}
' + ' ' + '
' + '
' @@ -746,7 +746,7 @@ //build a var scopeRef = 'month[\'days\'][' + i + '][' + j + ']'; - tbodyHtml.push(''); + tbodyHtml.push(''); tbodyHtml.push(weekDay.format('D')); tbodyHtml.push(''); } else { @@ -814,7 +814,7 @@ var template = '
 ' + '' + '
' @@ -882,6 +882,7 @@ } scope.points = points; + scope.mode = attrs.mode; setCurrentValue(); clock.css('height', clockWidth + 'px'); //picker.initHands(true); From 22c0f82d38af6deff9c72008873f53ef6d03f5f4 Mon Sep 17 00:00:00 2001 From: mak-pun Date: Tue, 14 Feb 2017 16:34:32 +0700 Subject: [PATCH 2/2] change class name dtp-btn-ok to dtp-btn-today --- dist/angular-material-datetimepicker.min.js | 2 +- dist/angular-material-datetimepicker.min.js.map | 2 +- js/angular-material-datetimepicker.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/angular-material-datetimepicker.min.js b/dist/angular-material-datetimepicker.min.js index 891a04d..c902fcc 100644 --- a/dist/angular-material-datetimepicker.min.js +++ b/dist/angular-material-datetimepicker.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";var t="ngMaterialDatePicker",e={DATE:0,HOUR:1,MINUTE:2},a=function(t,e){return t=angular.element(t),"getComputedStyle"in window?window.getComputedStyle(t[0])[e]:t.css(e)},i='
{{picker.currentDate.format("dddd")}}
{{picker.params.shortTime ? picker.currentDate.format("A") : " "}}
×
{{picker.currentDate.format("MMM") | uppercase}}
{{picker.currentDate.format("DD")}}
{{picker.currentDate.format("YYYY")}}
{{picker.currentNearest5Minute().format(picker.params.shortTime ? "hh:mm" : "HH:mm")}}
{{picker.currentNearest5Minute().format(picker.params.shortTime ? "hh:mm" : "HH:mm")}}
{{picker.params.todayText}} {{picker.params.cancelText}} {{picker.params.okText}}
';angular.module(t,["ngMaterial"]).provider("mdcDatetimePickerDefaultLocale",function(){this.locale=window.navigator.userLanguage||window.navigator.language||"en",this.$get=function(){return this},this.setDefaultLocale=function(t){this.locale=t}}).factory("mdcDefaultParams",["mdcDatetimePickerDefaultLocale",function(t){var e={date:!0,time:!0,format:"YYYY-MM-DD",minDate:null,maxDate:null,currentDate:null,lang:t.locale,weekStart:0,shortTime:!1,cancelText:"Cancel",okText:"OK",amText:"AM",pmText:"PM",todayText:"Today",disableDates:[]};return e}]).directive("mdcDatetimePicker",["$mdDialog","$timeout",function(t,e){return{restrict:"A",require:"ngModel",scope:{currentDate:"=ngModel",ngChange:"&",time:"=",date:"=",minDate:"=",maxDate:"=",disableDates:"=",shortTime:"=",weekStart:"=",format:"@",cancelText:"@",okText:"@",lang:"@",amText:"@",pmText:"@",showTodaysDate:"@",todayText:"@"},link:function(a,n,s,c){var o=!1;a.format||(a.date&&a.time?a.format="YYYY-MM-DD HH:mm":a.date?a.format="YYYY-MM-DD":a.format="HH:mm");var l=null;void 0!==a.showTodaysDate&&"false"!==a.showTodaysDate&&(l=moment()),angular.isString(a.currentDate)&&""!==a.currentDate&&(a.currentDate=moment(a.currentDate,a.format)),c&&c.$formatters.push(function(t){if("undefined"!=typeof t){var e=moment(t);return e.isValid()?e.format(a.format):""}}),n.attr("readonly",""),n.on("focus",function(c){if(c.preventDefault(),n.blur(),!o){o=!0;var d={};for(var m in s)a.hasOwnProperty(m)&&!angular.isUndefined(a[m])&&(d[m]=a[m]);d.currentDate=a.currentDate,d.showTodaysDate=l;var u={options:d};t.show({template:i,controller:r,controllerAs:"picker",locals:u,openFrom:n,parent:angular.element(document.body),bindToController:!0,disableParentScroll:!1,hasBackDrop:!1,skipHide:!0}).then(function(t){a.currentDate=t?t._d:t,o=!1,moment(a.currentDate).isSame(d.currentDate)||e(a.ngChange,0),n.blur()},function(){o=!1,n.blur()})}})}}}]).factory("mdcDateTimeDialog",["$mdDialog","$q","mdcDefaultParams",function(t,e,a){var n=Object.keys(a);console.log(n);var s={show:function(s){var c=e.defer(),o=angular.copy(a);for(var l in s)n.indexOf[l]!=-1&&s.hasOwnProperty(l)&&(o=s[l]);var d={options:s};return t.show({template:i,controller:r,controllerAs:"picker",locals:d,parent:angular.element(document.body),bindToController:!0,clickOutsideToClose:!0,disableParentScroll:!1,skipHide:!0}).then(function(t){t?t._d:t;c.resolve(t?t._d:t)},function(){c.reject()}),c.promise}};return s}]);var r=function(t,a,i){this.currentView=e.DATE,this._dialog=a,this._attachedEvents=[],this.VIEWS=e,this.params=i,this.meridien="AM",this.params=angular.extend(this.params,this.options),this.init()};r.$inject=["$scope","$mdDialog","mdcDefaultParams"],r.prototype={init:function(){this.timeMode=this.params.time&&!this.params.date,this.dateMode=this.params.date,this.initDates(),this.start()},currentNearest5Minute:function(){var t=this.currentDate||moment(),e=5*Math.round(t.minute()/5);return e>=60&&(e=55),moment(t).minutes(e)},initDates:function(){var t=this,e=function(e,a){var i=null;if(angular.isDefined(e)&&null!==e&&""!==e)if(angular.isString(e))i="undefined"!=typeof t.params.format&&null!==t.params.format?moment(e,t.params.format).locale(t.params.lang):moment(e).locale(t.params.lang);else if("number"==typeof e)i=moment(e).locale(t.params.lang);else if(angular.isDate(e)){var r=e.getTime();i=moment(r,"x").locale(t.params.lang)}else e._isAMomentObject&&(i=e);else i=a;return i};this.currentDate=e(this.params.currentDate,moment()),this.minDate=e(this.params.minDate),this.maxDate=e(this.params.maxDate),this.disableDates=this.params.disableDates.map(function(t){return moment(t).format("MMMM Do YYYY")}),this.selectDate(this.currentDate)},initDate:function(){this.currentView=e.DATE},initHours:function(){this.currentView=e.HOUR},initMinutes:function(){this.currentView=e.MINUTE},isAfterMinDate:function(t,e,a){var i=!0;if("undefined"!=typeof this.minDate&&null!==this.minDate){var r=moment(this.minDate),n=moment(t);e||a||(r.hour(0),r.minute(0),n.hour(0),n.minute(0)),r.second(0),n.second(0),r.millisecond(0),n.millisecond(0),a?i=parseInt(n.format("X"))>=parseInt(r.format("X")):(n.minute(0),r.minute(0),i=parseInt(n.format("X"))>=parseInt(r.format("X")))}return i},isBeforeMaxDate:function(t,e,a){var i=!0;if("undefined"!=typeof this.maxDate&&null!==this.maxDate){var r=moment(this.maxDate),n=moment(t);e||a||(r.hour(0),r.minute(0),n.hour(0),n.minute(0)),r.second(0),n.second(0),r.millisecond(0),n.millisecond(0),a?i=parseInt(n.format("X"))<=parseInt(r.format("X")):(n.minute(0),r.minute(0),i=parseInt(n.format("X"))<=parseInt(r.format("X")))}return i},isInDisableDates:function(t){var e=t.format("MMMM Do YYYY");return!(this.disableDates.indexOf(e)>-1)},selectDate:function(t){t&&(this.currentDate=moment(t),this.isAfterMinDate(this.currentDate)||(this.currentDate=moment(this.minDate)),this.isBeforeMaxDate(this.currentDate)||(this.currentDate=moment(this.maxDate)),this.currentDate.locale(this.params.lang),this.calendarStart=moment(this.currentDate),this.meridien=this.currentDate.hour()>=12?"PM":"AM")},setName:function(){for(var t="",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",a=0;a<5;a++)t+=e.charAt(Math.floor(Math.random()*e.length));return t},isPM:function(){return"PM"===this.meridien},incrementYear:function(t){1===t&&this.isNextYearVisible()&&this.selectDate(this.currentDate.add(t,"year")),t===-1&&this.isPreviousYearVisible()&&this.selectDate(this.currentDate.add(t,"year"))},isPreviousMonthVisible:function(){return this.calendarStart&&this.isAfterMinDate(moment(this.calendarStart).startOf("month"),!1,!1)},isNextMonthVisible:function(){return this.calendarStart&&this.isBeforeMaxDate(moment(this.calendarStart).endOf("month"),!1,!1)},isPreviousYearVisible:function(){return this.calendarStart&&this.isAfterMinDate(moment(this.calendarStart).startOf("year"),!1,!1)},isNextYearVisible:function(){return this.calendarStart&&this.isBeforeMaxDate(moment(this.calendarStart).endOf("year"),!1,!1)},isHourAvailable:function(t){var e=moment(this.currentDate);return e.hour(this.convertHours(t)).minute(0).second(0),this.isAfterMinDate(e,!0,!1)&&this.isBeforeMaxDate(e,!0,!1)},isMinuteAvailable:function(t){var e=moment(this.currentDate);return e.minute(t).second(0),this.isAfterMinDate(e,!0,!0)&&this.isBeforeMaxDate(e,!0,!0)},start:function(){this.currentView=e.DATE,this.params.date?this.initDate():this.params.time&&this.initHours()},today:function(){this.selectDate(Date.now())},ok:function(){switch(this.currentView){case e.DATE:this.params.time===!0?this.initHours():this.hide(!0);break;case e.HOUR:this.initMinutes();break;case e.MINUTE:this.hide(!0)}},cancel:function(){if(this.params.time)switch(this.currentView){case e.DATE:this.hide();break;case e.HOUR:this.params.date?this.initDate():this.hide();break;case e.MINUTE:this.initHours()}else this.hide()},selectMonthBefore:function(){this.calendarStart.subtract(1,"months")},selectMonthAfter:function(){this.calendarStart.add(1,"months")},selectYearBefore:function(){this.calendarStart.subtract(1,"years")},selectYearAfter:function(){this.calendarStart.add(1,"years")},selectAM:function(){(this.isHourAvailable(0)||this.isHourAvailable(12))&&(this.currentDate.hour()>=12&&this.selectDate(this.currentDate.subtract(12,"hours")),this.isHourAvailable(this.currentDate.hour())||this.selectDate(this.currentDate.hour(this.minDate.hour())),this.isMinuteAvailable(this.currentDate.minute())||this.selectDate(this.currentDate.minute(this.minDate.minute())))},selectPM:function(){(this.isHourAvailable(13)||this.isHourAvailable(24))&&(this.currentDate.hour()<12&&this.selectDate(this.currentDate.add(12,"hours")),this.isHourAvailable(this.currentDate.hour())||this.selectDate(this.currentDate.hour(this.maxDate.hour())),this.isMinuteAvailable(this.currentDate.minute())||this.selectDate(this.currentDate.minute(this.maxDate.minute())))},convertHours:function(t){var e=t;return t<12&&this.isPM()&&(e+=12),e},hide:function(t){t?this._dialog.hide(this.currentDate):this._dialog.cancel()}},angular.module(t).directive("mdcDatetimePickerCalendar",[function(){for(var t=1920,e=(new Date).getFullYear()+30,a=12*(e-t+1),i=240,r=[],n=0;n6&&(o=0),c.push(o.toString());if(i.week=c,n.maxDate||n.minDate){var l=n.minDate?s(n.minDate):0,d=n.maxDate?s(n.maxDate)+1:a;i.months=r.slice(l,d)}else i.months=r;i.getItemAtIndex=function(e){var a=(e+1)%12||12,i=t+Math.floor(e/12),r=moment(n.currentDate).year(i).month(a);return m(r)},i.topIndex=s(n.currentDate)-i.months[0],e.$watch(function(){return n.currentDate?n.currentDate.format("YYYY-MM"):""},function(t,e){if(t!=e){var a=moment(t,"YYYY-MM"),r=n.minDate?s(n.minDate):0,c=s(a,r);i.topIndex!=c&&(i.topIndex=c)}});var m=function(t){var e={};if(null!==t){e.name=t.format("MMMM YYYY");var a=moment(t).locale(n.params.lang).startOf("month").hour(t.hour()).minute(t.minute()),r=a.format("d");e.days=[];for(var s=a.date();s<=a.daysInMonth();s++){if(s===a.date()){var c=i.week.indexOf(r.toString());if(c>0)for(var o=0;o
'}}]).directive("mdcDatetimePickerCalendarMonth",["$compile",function(t){var e=function(e,a){var i=angular.element(e[0].querySelector("tbody")),r=a.cal,n=a.month,s=[];n.days.forEach(function(t,e){s.push(""),t.forEach(function(t,a){if(s.push(""),t)if(r.isInRange(t)){var i="month['days']["+e+"]["+a+"]";s.push(''),s.push(t.format("D")),s.push("")}else s.push(''),s.push(t.format("D")),s.push("");s.push("")}),s.push("")}),i.html(s.join("")),t(i)(a)};return{scope:{idx:"="},require:"^mdcDatetimePickerCalendar",restrict:"AE",template:'
{{month.name}}
{{cal.toDay(day)}}
',link:function(t,a,i,r){t.cal=r,t.month=r.getItemAtIndex(parseInt(t.idx)),e(a,t),t.$watch(function(){return t.idx},function(i,n){i!=n&&(t.month=r.getItemAtIndex(parseInt(t.idx)),e(a,t))})}}}]),angular.module(t).directive("mdcDtpNoclick",function(){return{link:function(t,e){e.on("click",function(t){t.preventDefault()})}}}),angular.module(t).directive("mdcDatetimePickerClock",[function(){var t='';return{restrict:"E",template:t,link:function(t,e,i){var r="minutes"===i.mode,n=t.picker,s=document.querySelector("md-dialog.dtp"),c=function(){var c=angular.element(e[0].querySelector(".dtp-picker-clock")),l=angular.element(s.querySelector(".dtp-picker")),m=s.querySelector(".dtp-content").offsetWidth,u=parseInt(a(l,"paddingLeft").replace("px",""))||0,p=parseInt(a(l,"paddingRight").replace("px",""))||0,h=parseInt(a(c,"marginLeft").replace("px",""))||0,f=parseInt(a(c,"marginRight").replace("px",""))||0,D=m-(h+f+u+p);c.css("width",D+"px");for(var v=parseInt(a(l,"paddingLeft").replace("px",""))||0,g=parseInt(a(l,"paddingTop").replace("px",""))||0,k=parseInt(a(c,"marginLeft").replace("px",""))||0,M=parseInt(a(c,"marginTop").replace("px",""))||0,y=D/2,x=y/1.2,b=[],T=0;T<12;++T){var w=x*Math.sin(2*Math.PI*(T/12)),Y=x*Math.cos(2*Math.PI*(T/12)),A=y+w+v/2-(v+k),I=y-Y-M/2-(g+M),S={left:A,top:I,value:r?5*T:T,style:{"margin-left":A+"px","margin-top":I+"px"}};r?S.display=S.value<10?"0"+S.value:S.value:n.params.shortTime?S.display=0===T?12:T:S.display=n.isPM()?T+12:T,b.push(S)}t.points=b,t.mode=i.mode,d(),c.css("height",D+"px");var H=e[0].querySelector(".dtp-clock-center"),P=H.offsetWidth/2||7.5,V=H.offsetHeight/2||7.5,E=y/1.8,O=y/1.5;angular.element(e[0].querySelector(".dtp-hour-hand")).css({left:y+1.5*k+"px",height:E+"px",marginTop:y-E-v+"px"}).addClass(r?"":"on"),angular.element(e[0].querySelector(".dtp-minute-hand")).css({left:y+1.5*k+"px",height:O+"px",marginTop:y-O-v+"px"}).addClass(r?"on":""),angular.element(H).css({left:y+v+k-P+"px",marginTop:y-k/2-V+"px"}),o()},o=function(){var t=n.currentNearest5Minute(),a=t.hour(),i=t.minute();l(angular.element(e[0].querySelector(".dtp-hour-hand")),30*a);var r=6*(5*Math.round(i/5));l(angular.element(e[0].querySelector(".dtp-minute-hand")),r)},l=function(t,e){angular.element(t).css({WebkitTransform:"rotate("+e+"deg)","-moz-transform":"rotate("+e+"deg)","-ms-transform":"rotate("+e+"deg)",transform:"rotate("+e+"deg)"})},d=function(){var e=n.currentNearest5Minute();t.currentValue=r?e.minute():e.hour()%12};t.$watch(function(){var t=n.currentNearest5Minute();return t?t.format("HH:mm"):""},function(){d(),o()});var m=function(t,e){for(var a=0;a{{picker.params.amText}}
{{picker.currentNearest5Minute().format(picker.params.shortTime ? "hh:mm" : "HH:mm")}}
{{picker.params.todayText}} {{picker.params.cancelText}} {{picker.params.okText}} ';angular.module(t,["ngMaterial"]).provider("mdcDatetimePickerDefaultLocale",function(){this.locale=window.navigator.userLanguage||window.navigator.language||"en",this.$get=function(){return this},this.setDefaultLocale=function(t){this.locale=t}}).factory("mdcDefaultParams",["mdcDatetimePickerDefaultLocale",function(t){var e={date:!0,time:!0,format:"YYYY-MM-DD",minDate:null,maxDate:null,currentDate:null,lang:t.locale,weekStart:0,shortTime:!1,cancelText:"Cancel",okText:"OK",amText:"AM",pmText:"PM",todayText:"Today",disableDates:[]};return e}]).directive("mdcDatetimePicker",["$mdDialog","$timeout",function(t,e){return{restrict:"A",require:"ngModel",scope:{currentDate:"=ngModel",ngChange:"&",time:"=",date:"=",minDate:"=",maxDate:"=",disableDates:"=",shortTime:"=",weekStart:"=",format:"@",cancelText:"@",okText:"@",lang:"@",amText:"@",pmText:"@",showTodaysDate:"@",todayText:"@"},link:function(a,n,s,c){var o=!1;a.format||(a.date&&a.time?a.format="YYYY-MM-DD HH:mm":a.date?a.format="YYYY-MM-DD":a.format="HH:mm");var l=null;void 0!==a.showTodaysDate&&"false"!==a.showTodaysDate&&(l=moment()),angular.isString(a.currentDate)&&""!==a.currentDate&&(a.currentDate=moment(a.currentDate,a.format)),c&&c.$formatters.push(function(t){if("undefined"!=typeof t){var e=moment(t);return e.isValid()?e.format(a.format):""}}),n.attr("readonly",""),n.on("focus",function(c){if(c.preventDefault(),n.blur(),!o){o=!0;var d={};for(var m in s)a.hasOwnProperty(m)&&!angular.isUndefined(a[m])&&(d[m]=a[m]);d.currentDate=a.currentDate,d.showTodaysDate=l;var u={options:d};t.show({template:i,controller:r,controllerAs:"picker",locals:u,openFrom:n,parent:angular.element(document.body),bindToController:!0,disableParentScroll:!1,hasBackDrop:!1,skipHide:!0}).then(function(t){a.currentDate=t?t._d:t,o=!1,moment(a.currentDate).isSame(d.currentDate)||e(a.ngChange,0),n.blur()},function(){o=!1,n.blur()})}})}}}]).factory("mdcDateTimeDialog",["$mdDialog","$q","mdcDefaultParams",function(t,e,a){var n=Object.keys(a);console.log(n);var s={show:function(s){var c=e.defer(),o=angular.copy(a);for(var l in s)n.indexOf[l]!=-1&&s.hasOwnProperty(l)&&(o=s[l]);var d={options:s};return t.show({template:i,controller:r,controllerAs:"picker",locals:d,parent:angular.element(document.body),bindToController:!0,clickOutsideToClose:!0,disableParentScroll:!1,skipHide:!0}).then(function(t){t?t._d:t;c.resolve(t?t._d:t)},function(){c.reject()}),c.promise}};return s}]);var r=function(t,a,i){this.currentView=e.DATE,this._dialog=a,this._attachedEvents=[],this.VIEWS=e,this.params=i,this.meridien="AM",this.params=angular.extend(this.params,this.options),this.init()};r.$inject=["$scope","$mdDialog","mdcDefaultParams"],r.prototype={init:function(){this.timeMode=this.params.time&&!this.params.date,this.dateMode=this.params.date,this.initDates(),this.start()},currentNearest5Minute:function(){var t=this.currentDate||moment(),e=5*Math.round(t.minute()/5);return e>=60&&(e=55),moment(t).minutes(e)},initDates:function(){var t=this,e=function(e,a){var i=null;if(angular.isDefined(e)&&null!==e&&""!==e)if(angular.isString(e))i="undefined"!=typeof t.params.format&&null!==t.params.format?moment(e,t.params.format).locale(t.params.lang):moment(e).locale(t.params.lang);else if("number"==typeof e)i=moment(e).locale(t.params.lang);else if(angular.isDate(e)){var r=e.getTime();i=moment(r,"x").locale(t.params.lang)}else e._isAMomentObject&&(i=e);else i=a;return i};this.currentDate=e(this.params.currentDate,moment()),this.minDate=e(this.params.minDate),this.maxDate=e(this.params.maxDate),this.disableDates=this.params.disableDates.map(function(t){return moment(t).format("MMMM Do YYYY")}),this.selectDate(this.currentDate)},initDate:function(){this.currentView=e.DATE},initHours:function(){this.currentView=e.HOUR},initMinutes:function(){this.currentView=e.MINUTE},isAfterMinDate:function(t,e,a){var i=!0;if("undefined"!=typeof this.minDate&&null!==this.minDate){var r=moment(this.minDate),n=moment(t);e||a||(r.hour(0),r.minute(0),n.hour(0),n.minute(0)),r.second(0),n.second(0),r.millisecond(0),n.millisecond(0),a?i=parseInt(n.format("X"))>=parseInt(r.format("X")):(n.minute(0),r.minute(0),i=parseInt(n.format("X"))>=parseInt(r.format("X")))}return i},isBeforeMaxDate:function(t,e,a){var i=!0;if("undefined"!=typeof this.maxDate&&null!==this.maxDate){var r=moment(this.maxDate),n=moment(t);e||a||(r.hour(0),r.minute(0),n.hour(0),n.minute(0)),r.second(0),n.second(0),r.millisecond(0),n.millisecond(0),a?i=parseInt(n.format("X"))<=parseInt(r.format("X")):(n.minute(0),r.minute(0),i=parseInt(n.format("X"))<=parseInt(r.format("X")))}return i},isInDisableDates:function(t){var e=t.format("MMMM Do YYYY");return!(this.disableDates.indexOf(e)>-1)},selectDate:function(t){t&&(this.currentDate=moment(t),this.isAfterMinDate(this.currentDate)||(this.currentDate=moment(this.minDate)),this.isBeforeMaxDate(this.currentDate)||(this.currentDate=moment(this.maxDate)),this.currentDate.locale(this.params.lang),this.calendarStart=moment(this.currentDate),this.meridien=this.currentDate.hour()>=12?"PM":"AM")},setName:function(){for(var t="",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",a=0;a<5;a++)t+=e.charAt(Math.floor(Math.random()*e.length));return t},isPM:function(){return"PM"===this.meridien},incrementYear:function(t){1===t&&this.isNextYearVisible()&&this.selectDate(this.currentDate.add(t,"year")),t===-1&&this.isPreviousYearVisible()&&this.selectDate(this.currentDate.add(t,"year"))},isPreviousMonthVisible:function(){return this.calendarStart&&this.isAfterMinDate(moment(this.calendarStart).startOf("month"),!1,!1)},isNextMonthVisible:function(){return this.calendarStart&&this.isBeforeMaxDate(moment(this.calendarStart).endOf("month"),!1,!1)},isPreviousYearVisible:function(){return this.calendarStart&&this.isAfterMinDate(moment(this.calendarStart).startOf("year"),!1,!1)},isNextYearVisible:function(){return this.calendarStart&&this.isBeforeMaxDate(moment(this.calendarStart).endOf("year"),!1,!1)},isHourAvailable:function(t){var e=moment(this.currentDate);return e.hour(this.convertHours(t)).minute(0).second(0),this.isAfterMinDate(e,!0,!1)&&this.isBeforeMaxDate(e,!0,!1)},isMinuteAvailable:function(t){var e=moment(this.currentDate);return e.minute(t).second(0),this.isAfterMinDate(e,!0,!0)&&this.isBeforeMaxDate(e,!0,!0)},start:function(){this.currentView=e.DATE,this.params.date?this.initDate():this.params.time&&this.initHours()},today:function(){this.selectDate(Date.now())},ok:function(){switch(this.currentView){case e.DATE:this.params.time===!0?this.initHours():this.hide(!0);break;case e.HOUR:this.initMinutes();break;case e.MINUTE:this.hide(!0)}},cancel:function(){if(this.params.time)switch(this.currentView){case e.DATE:this.hide();break;case e.HOUR:this.params.date?this.initDate():this.hide();break;case e.MINUTE:this.initHours()}else this.hide()},selectMonthBefore:function(){this.calendarStart.subtract(1,"months")},selectMonthAfter:function(){this.calendarStart.add(1,"months")},selectYearBefore:function(){this.calendarStart.subtract(1,"years")},selectYearAfter:function(){this.calendarStart.add(1,"years")},selectAM:function(){(this.isHourAvailable(0)||this.isHourAvailable(12))&&(this.currentDate.hour()>=12&&this.selectDate(this.currentDate.subtract(12,"hours")),this.isHourAvailable(this.currentDate.hour())||this.selectDate(this.currentDate.hour(this.minDate.hour())),this.isMinuteAvailable(this.currentDate.minute())||this.selectDate(this.currentDate.minute(this.minDate.minute())))},selectPM:function(){(this.isHourAvailable(13)||this.isHourAvailable(24))&&(this.currentDate.hour()<12&&this.selectDate(this.currentDate.add(12,"hours")),this.isHourAvailable(this.currentDate.hour())||this.selectDate(this.currentDate.hour(this.maxDate.hour())),this.isMinuteAvailable(this.currentDate.minute())||this.selectDate(this.currentDate.minute(this.maxDate.minute())))},convertHours:function(t){var e=t;return t<12&&this.isPM()&&(e+=12),e},hide:function(t){t?this._dialog.hide(this.currentDate):this._dialog.cancel()}},angular.module(t).directive("mdcDatetimePickerCalendar",[function(){for(var t=1920,e=(new Date).getFullYear()+30,a=12*(e-t+1),i=240,r=[],n=0;n6&&(o=0),c.push(o.toString());if(i.week=c,n.maxDate||n.minDate){var l=n.minDate?s(n.minDate):0,d=n.maxDate?s(n.maxDate)+1:a;i.months=r.slice(l,d)}else i.months=r;i.getItemAtIndex=function(e){var a=(e+1)%12||12,i=t+Math.floor(e/12),r=moment(n.currentDate).year(i).month(a);return m(r)},i.topIndex=s(n.currentDate)-i.months[0],e.$watch(function(){return n.currentDate?n.currentDate.format("YYYY-MM"):""},function(t,e){if(t!=e){var a=moment(t,"YYYY-MM"),r=n.minDate?s(n.minDate):0,c=s(a,r);i.topIndex!=c&&(i.topIndex=c)}});var m=function(t){var e={};if(null!==t){e.name=t.format("MMMM YYYY");var a=moment(t).locale(n.params.lang).startOf("month").hour(t.hour()).minute(t.minute()),r=a.format("d");e.days=[];for(var s=a.date();s<=a.daysInMonth();s++){if(s===a.date()){var c=i.week.indexOf(r.toString());if(c>0)for(var o=0;o
'}}]).directive("mdcDatetimePickerCalendarMonth",["$compile",function(t){var e=function(e,a){var i=angular.element(e[0].querySelector("tbody")),r=a.cal,n=a.month,s=[];n.days.forEach(function(t,e){s.push(""),t.forEach(function(t,a){if(s.push(""),t)if(r.isInRange(t)){var i="month['days']["+e+"]["+a+"]";s.push(''),s.push(t.format("D")),s.push("")}else s.push(''),s.push(t.format("D")),s.push("");s.push("")}),s.push("")}),i.html(s.join("")),t(i)(a)};return{scope:{idx:"="},require:"^mdcDatetimePickerCalendar",restrict:"AE",template:'
{{month.name}}
{{cal.toDay(day)}}
',link:function(t,a,i,r){t.cal=r,t.month=r.getItemAtIndex(parseInt(t.idx)),e(a,t),t.$watch(function(){return t.idx},function(i,n){i!=n&&(t.month=r.getItemAtIndex(parseInt(t.idx)),e(a,t))})}}}]),angular.module(t).directive("mdcDtpNoclick",function(){return{link:function(t,e){e.on("click",function(t){t.preventDefault()})}}}),angular.module(t).directive("mdcDatetimePickerClock",[function(){var t='';return{restrict:"E",template:t,link:function(t,e,i){var r="minutes"===i.mode,n=t.picker,s=document.querySelector("md-dialog.dtp"),c=function(){var c=angular.element(e[0].querySelector(".dtp-picker-clock")),l=angular.element(s.querySelector(".dtp-picker")),m=s.querySelector(".dtp-content").offsetWidth,u=parseInt(a(l,"paddingLeft").replace("px",""))||0,p=parseInt(a(l,"paddingRight").replace("px",""))||0,h=parseInt(a(c,"marginLeft").replace("px",""))||0,f=parseInt(a(c,"marginRight").replace("px",""))||0,D=m-(h+f+u+p);c.css("width",D+"px");for(var v=parseInt(a(l,"paddingLeft").replace("px",""))||0,g=parseInt(a(l,"paddingTop").replace("px",""))||0,k=parseInt(a(c,"marginLeft").replace("px",""))||0,M=parseInt(a(c,"marginTop").replace("px",""))||0,y=D/2,x=y/1.2,b=[],T=0;T<12;++T){var w=x*Math.sin(2*Math.PI*(T/12)),Y=x*Math.cos(2*Math.PI*(T/12)),A=y+w+v/2-(v+k),I=y-Y-M/2-(g+M),S={left:A,top:I,value:r?5*T:T,style:{"margin-left":A+"px","margin-top":I+"px"}};r?S.display=S.value<10?"0"+S.value:S.value:n.params.shortTime?S.display=0===T?12:T:S.display=n.isPM()?T+12:T,b.push(S)}t.points=b,t.mode=i.mode,d(),c.css("height",D+"px");var H=e[0].querySelector(".dtp-clock-center"),P=H.offsetWidth/2||7.5,V=H.offsetHeight/2||7.5,E=y/1.8,O=y/1.5;angular.element(e[0].querySelector(".dtp-hour-hand")).css({left:y+1.5*k+"px",height:E+"px",marginTop:y-E-v+"px"}).addClass(r?"":"on"),angular.element(e[0].querySelector(".dtp-minute-hand")).css({left:y+1.5*k+"px",height:O+"px",marginTop:y-O-v+"px"}).addClass(r?"on":""),angular.element(H).css({left:y+v+k-P+"px",marginTop:y-k/2-V+"px"}),o()},o=function(){var t=n.currentNearest5Minute(),a=t.hour(),i=t.minute();l(angular.element(e[0].querySelector(".dtp-hour-hand")),30*a);var r=6*(5*Math.round(i/5));l(angular.element(e[0].querySelector(".dtp-minute-hand")),r)},l=function(t,e){angular.element(t).css({WebkitTransform:"rotate("+e+"deg)","-moz-transform":"rotate("+e+"deg)","-ms-transform":"rotate("+e+"deg)",transform:"rotate("+e+"deg)"})},d=function(){var e=n.currentNearest5Minute();t.currentValue=r?e.minute():e.hour()%12};t.$watch(function(){var t=n.currentNearest5Minute();return t?t.format("HH:mm"):""},function(){d(),o()});var m=function(t,e){for(var a=0;a'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"dddd\")}}
'\n + '
{{picker.params.shortTime ? picker.currentDate.format(\"A\") : \" \"}}
'\n + '
'\n + ' ×'\n + '
'\n + '
'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"MMM\") | uppercase}}
'\n + '
'\n + '
{{picker.currentDate.format(\"DD\")}}
'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"YYYY\")}}
'\n + '
'\n + '
'\n + '
'//start time\n + '
'\n + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? \"hh:mm\" : \"HH:mm\")}}
'\n + '
'\n + '
'\n + ' '\n + '
'\n + '
'\n + '
'\n + ' {{picker.params.amText}}'\n + '
'\n + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? \"hh:mm\" : \"HH:mm\")}}
'\n + '
'\n + ' {{picker.params.pmText}}'\n + '
'\n + '
'\n + '
'\n + ' '\n + ' '\n + '
'\n + '
'\n + '
'\n + ' '\n + ' '\n + ' {{picker.params.todayText}}'\n + ' {{picker.params.cancelText}}'\n + ' {{picker.params.okText}}'\n + ' '\n + '';\n\n\n angular.module(moduleName, ['ngMaterial'])\n .provider('mdcDatetimePickerDefaultLocale', function () {\n this.locale = window.navigator.userLanguage || window.navigator.language || 'en';\n\n this.$get = function () {\n return this;\n };\n\n this.setDefaultLocale = function (localeString) {\n this.locale = localeString;\n };\n })\n .factory('mdcDefaultParams', ['mdcDatetimePickerDefaultLocale', function (mdcDatetimePickerDefaultLocale) {\n var default_params = {\n date: true,\n time: true,\n format: 'YYYY-MM-DD',\n minDate: null,\n maxDate: null,\n currentDate: null,\n lang: mdcDatetimePickerDefaultLocale.locale,\n weekStart: 0,\n shortTime: false,\n cancelText: 'Cancel',\n okText: 'OK',\n amText: 'AM',\n pmText: 'PM',\n todayText: 'Today',\n disableDates: []\n };\n return default_params;\n }])\n .directive('mdcDatetimePicker', ['$mdDialog', '$timeout',\n function ($mdDialog, $timeout) {\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n currentDate: '=ngModel',\n ngChange: '&',\n time: '=',\n date: '=',\n minDate: '=',\n maxDate: '=',\n disableDates: '=',\n shortTime: '=',\n weekStart: '=',\n format: '@',\n cancelText: '@',\n okText: '@',\n lang: '@',\n amText: '@',\n pmText: '@',\n showTodaysDate: '@',\n todayText: '@'\n },\n link: function (scope, element, attrs, ngModel) {\n var isOn = false;\n if (!scope.format) {\n if (scope.date && scope.time) {\n scope.format = 'YYYY-MM-DD HH:mm';\n } else if (scope.date) {\n scope.format = 'YYYY-MM-DD';\n } else {\n scope.format = 'HH:mm';\n }\n }\n\n var dateOfTheDay = null;\n if (scope.showTodaysDate !== undefined && scope.showTodaysDate !== \"false\") {\n dateOfTheDay = moment();\n }\n\n if (angular.isString(scope.currentDate) && scope.currentDate !== '') {\n scope.currentDate = moment(scope.currentDate, scope.format);\n }\n\n if (ngModel) {\n ngModel.$formatters.push(function (value) {\n if (typeof value === 'undefined') {\n return;\n }\n var m = moment(value);\n return m.isValid() ? m.format(scope.format) : '';\n });\n }\n\n element.attr('readonly', '');\n //@TODO custom event to trigger input\n element.on('focus', function (e) {\n e.preventDefault();\n element.blur();\n if (isOn) {\n return;\n }\n isOn = true;\n var options = {};\n for (var i in attrs) {\n if (scope.hasOwnProperty(i) && !angular.isUndefined(scope[i])) {\n options[i] = scope[i];\n }\n }\n options.currentDate = scope.currentDate;\n options.showTodaysDate = dateOfTheDay;\n\n var locals = {options: options};\n $mdDialog.show({\n template: template,\n controller: PluginController,\n controllerAs: 'picker',\n locals: locals,\n openFrom: element,\n parent: angular.element(document.body),\n bindToController: true,\n disableParentScroll: false,\n hasBackDrop: false,\n skipHide: true\n })\n .then(function (v) {\n scope.currentDate = v ? v._d : v;\n isOn = false;\n\n if (!moment(scope.currentDate).isSame(options.currentDate)) {\n $timeout(scope.ngChange, 0);\n }\n\n element.blur()\n\n }, function () {\n isOn = false;\n element.blur()\n })\n ;\n });\n }\n };\n }])\n /** Returns a service that opens a dialog when the attribute shown is called\n The dialog serves to select a date/time/etc. depending on the options given to the function show\n\n @param options extends mdcDefaultParams\n {\n date: {boolean} =true,\n time: {boolean] =true,\n format: {string} ='YYYY-MM-DD',\n minDate: {strign} =null,\n maxDate: {string} =null,\n currentDate: {string} =null,\n lang: {string} =mdcDatetimePickerDefaultLocale,\n weekStart: {int} =0,\n shortTime: {boolean} =false,\n cancelText: {string} ='Cancel',\n todayText: {string} ='Today',\n okText: {string} ='OK',\n amText: {string} ='AM',\n pmText: {string} ='PM'\n }\n @return promise\n */\n .factory('mdcDateTimeDialog', [\"$mdDialog\", \"$q\", \"mdcDefaultParams\", function ($mdDialog, $q, mdcDefaultParams) {\n var accepted_options = Object.keys(mdcDefaultParams);\n console.log(accepted_options);\n var service = {\n show: function (options) {\n var deferred = $q.defer();\n var params = angular.copy(mdcDefaultParams);\n for (var i in options) {\n if (accepted_options.indexOf[i] != -1 && options.hasOwnProperty(i)) {\n params = options[i];\n }\n }\n var locals = {options: options};\n $mdDialog.show({\n template: template,\n controller: PluginController,\n controllerAs: 'picker',\n locals: locals,\n parent: angular.element(document.body),\n bindToController: true,\n clickOutsideToClose: true,\n disableParentScroll: false,\n skipHide: true\n })\n .then(function (v) {\n var currentDate = v ? v._d : v;\n deferred.resolve(v ? v._d : v);\n }, function () {\n deferred.reject();\n });\n return deferred.promise;\n }\n };\n\n return service;\n }])\n ;\n\n var PluginController = function ($scope, $mdDialog, mdcDefaultParams) {\n this.currentView = VIEW_STATES.DATE;\n this._dialog = $mdDialog;\n\n this._attachedEvents = [];\n this.VIEWS = VIEW_STATES;\n this.params = mdcDefaultParams;\n this.meridien = 'AM';\n this.params = angular.extend(this.params, this.options);\n\n this.init();\n };\n\n PluginController.$inject = ['$scope', '$mdDialog', 'mdcDefaultParams'];\n PluginController.prototype = {\n init: function () {\n this.timeMode = this.params.time && !this.params.date;\n this.dateMode = this.params.date;\n this.initDates();\n this.start();\n },\n currentNearest5Minute: function () {\n var date = this.currentDate || moment();\n var minutes = (5 * Math.round(date.minute() / 5));\n if (minutes >= 60) {\n minutes = 55; //always push down\n }\n return moment(date).minutes(minutes);\n },\n initDates: function () {\n var that = this;\n var _dateParam = function (input, fallback) {\n var ret = null;\n if (angular.isDefined(input) && input !== null && input !== '') {\n if (angular.isString(input)) {\n if (typeof(that.params.format) !== 'undefined' && that.params.format !== null) {\n ret = moment(input, that.params.format).locale(that.params.lang);\n }\n else {\n ret = moment(input).locale(that.params.lang);\n }\n } else if (typeof input === 'number') {\n ret = moment(input).locale(that.params.lang);\n } else {\n if (angular.isDate(input)) {\n var x = input.getTime();\n ret = moment(x, \"x\").locale(that.params.lang);\n } else if (input._isAMomentObject) {\n ret = input;\n }\n }\n }\n else {\n ret = fallback;\n }\n return ret;\n };\n\n this.currentDate = _dateParam(this.params.currentDate, moment());\n this.minDate = _dateParam(this.params.minDate);\n this.maxDate = _dateParam(this.params.maxDate);\n this.disableDates = this.params.disableDates.map(function (x) {\n return moment(x).format('MMMM Do YYYY')\n });\n this.selectDate(this.currentDate);\n },\n initDate: function () {\n this.currentView = VIEW_STATES.DATE;\n },\n initHours: function () {\n this.currentView = VIEW_STATES.HOUR;\n },\n initMinutes: function () {\n this.currentView = VIEW_STATES.MINUTE;\n },\n isAfterMinDate: function (date, checkHour, checkMinute) {\n var _return = true;\n\n if (typeof(this.minDate) !== 'undefined' && this.minDate !== null) {\n var _minDate = moment(this.minDate);\n var _date = moment(date);\n\n if (!checkHour && !checkMinute) {\n _minDate.hour(0);\n _minDate.minute(0);\n\n _date.hour(0);\n _date.minute(0);\n }\n\n _minDate.second(0);\n _date.second(0);\n _minDate.millisecond(0);\n _date.millisecond(0);\n\n if (!checkMinute) {\n _date.minute(0);\n _minDate.minute(0);\n\n _return = (parseInt(_date.format(\"X\")) >= parseInt(_minDate.format(\"X\")));\n }\n else {\n _return = (parseInt(_date.format(\"X\")) >= parseInt(_minDate.format(\"X\")));\n }\n }\n\n return _return;\n },\n isBeforeMaxDate: function (date, checkTime, checkMinute) {\n var _return = true;\n\n if (typeof(this.maxDate) !== 'undefined' && this.maxDate !== null) {\n var _maxDate = moment(this.maxDate);\n var _date = moment(date);\n\n if (!checkTime && !checkMinute) {\n _maxDate.hour(0);\n _maxDate.minute(0);\n\n _date.hour(0);\n _date.minute(0);\n }\n\n _maxDate.second(0);\n _date.second(0);\n _maxDate.millisecond(0);\n _date.millisecond(0);\n\n if (!checkMinute) {\n _date.minute(0);\n _maxDate.minute(0);\n\n _return = (parseInt(_date.format(\"X\")) <= parseInt(_maxDate.format(\"X\")));\n }\n else {\n _return = (parseInt(_date.format(\"X\")) <= parseInt(_maxDate.format(\"X\")));\n }\n }\n\n return _return;\n },\n isInDisableDates: function (date) {\n var dut = date.format('MMMM Do YYYY')\n if (this.disableDates.indexOf(dut) > -1) {\n return false;\n }\n return true;\n },\n selectDate: function (date) {\n if (date) {\n this.currentDate = moment(date);\n if (!this.isAfterMinDate(this.currentDate)) {\n this.currentDate = moment(this.minDate);\n }\n\n if (!this.isBeforeMaxDate(this.currentDate)) {\n this.currentDate = moment(this.maxDate);\n }\n this.currentDate.locale(this.params.lang);\n this.calendarStart = moment(this.currentDate);\n this.meridien = this.currentDate.hour() >= 12 ? 'PM' : 'AM';\n }\n },\n setName: function () {\n var text = \"\";\n var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n for (var i = 0; i < 5; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n },\n isPM: function () {\n return this.meridien === 'PM';\n },\n incrementYear: function (amount) {\n if (amount === 1 && this.isNextYearVisible()) {\n this.selectDate(this.currentDate.add(amount, 'year'));\n }\n\n if (amount === -1 && this.isPreviousYearVisible()) {\n this.selectDate(this.currentDate.add(amount, 'year'));\n }\n },\n isPreviousMonthVisible: function () {\n return this.calendarStart && this.isAfterMinDate(moment(this.calendarStart).startOf('month'), false, false);\n },\n isNextMonthVisible: function () {\n return this.calendarStart && this.isBeforeMaxDate(moment(this.calendarStart).endOf('month'), false, false);\n },\n isPreviousYearVisible: function () {\n return this.calendarStart && this.isAfterMinDate(moment(this.calendarStart).startOf('year'), false, false);\n },\n isNextYearVisible: function () {\n return this.calendarStart && this.isBeforeMaxDate(moment(this.calendarStart).endOf('year'), false, false);\n },\n isHourAvailable: function (hour) {\n var _date = moment(this.currentDate);\n _date.hour(this.convertHours(hour)).minute(0).second(0);\n return this.isAfterMinDate(_date, true, false) && this.isBeforeMaxDate(_date, true, false);\n },\n isMinuteAvailable: function (minute) {\n var _date = moment(this.currentDate);\n _date.minute(minute).second(0);\n return this.isAfterMinDate(_date, true, true) && this.isBeforeMaxDate(_date, true, true);\n },\n start: function () {\n this.currentView = VIEW_STATES.DATE;\n //this.initDates();\n if (this.params.date) {\n this.initDate();\n } else {\n if (this.params.time) {\n this.initHours();\n }\n }\n },\n today: function () {\n this.selectDate(Date.now());\n },\n ok: function () {\n switch (this.currentView) {\n case VIEW_STATES.DATE:\n if (this.params.time === true) {\n this.initHours();\n }\n else {\n this.hide(true);\n }\n break;\n case VIEW_STATES.HOUR:\n this.initMinutes();\n break;\n case VIEW_STATES.MINUTE:\n this.hide(true);\n break;\n }\n },\n cancel: function () {\n if (this.params.time) {\n switch (this.currentView) {\n case VIEW_STATES.DATE:\n this.hide();\n break;\n case VIEW_STATES.HOUR:\n if (this.params.date) {\n this.initDate();\n }\n else {\n this.hide();\n }\n break;\n case VIEW_STATES.MINUTE:\n this.initHours();\n break;\n }\n }\n else {\n this.hide();\n }\n },\n selectMonthBefore: function () {\n this.calendarStart.subtract(1, 'months');\n },\n selectMonthAfter: function () {\n this.calendarStart.add(1, 'months');\n },\n selectYearBefore: function () {\n this.calendarStart.subtract(1, 'years');\n },\n selectYearAfter: function () {\n this.calendarStart.add(1, 'years');\n },\n selectAM: function () {\n if (this.isHourAvailable(0) || this.isHourAvailable(12)) {\n if (this.currentDate.hour() >= 12) {\n this.selectDate(this.currentDate.subtract(12, 'hours'));\n }\n if (!this.isHourAvailable(this.currentDate.hour())) {\n this.selectDate(this.currentDate.hour(this.minDate.hour()));\n }\n if (!this.isMinuteAvailable(this.currentDate.minute())) {\n this.selectDate(this.currentDate.minute(this.minDate.minute()));\n }\n }\n },\n selectPM: function () {\n if (this.isHourAvailable(13) || this.isHourAvailable(24)) {\n if (this.currentDate.hour() < 12) {\n this.selectDate(this.currentDate.add(12, 'hours'));\n }\n if (!this.isHourAvailable(this.currentDate.hour())) {\n this.selectDate(this.currentDate.hour(this.maxDate.hour()));\n }\n if (!this.isMinuteAvailable(this.currentDate.minute())) {\n this.selectDate(this.currentDate.minute(this.maxDate.minute()));\n }\n }\n },\n convertHours: function (h) {\n var _return = h;\n if ((h < 12) && this.isPM())\n _return += 12;\n\n return _return;\n },\n hide: function (okBtn) {\n if (okBtn) {\n this._dialog.hide(this.currentDate);\n } else {\n this._dialog.cancel();\n }\n }\n };\n\n\n angular.module(moduleName)\n .directive('mdcDatetimePickerCalendar', [\n function () {\n\n var YEAR_MIN = 1920,\n YEAR_MAX = new Date().getFullYear() + 30,\n MONTHS_IN_ALL = (YEAR_MAX - YEAR_MIN + 1) * 12,\n ITEM_HEIGHT = 240,\n MONTHS = [];\n for (var i = 0; i < MONTHS_IN_ALL; i++) {\n MONTHS.push(i);\n }\n\n var currentMonthIndex = function (date, low) {\n low = low ? low : 0;\n var year = date.year();\n var month = date.month();\n return (((year - YEAR_MIN) * 12) + month - 1 ) - low;\n };\n\n return {\n restrict: 'E',\n scope: {\n picker: '=',\n date: '='\n },\n bindToController: true,\n controllerAs: 'cal',\n controller: ['$scope', function ($scope) {\n this.$onInit = function () {\n var calendar = this,\n picker = this.picker,\n days = [];\n\n for (var i = picker.params.weekStart; days.length < 7; i++) {\n if (i > 6) {\n i = 0;\n }\n days.push(i.toString());\n }\n\n calendar.week = days;\n if (!picker.maxDate && !picker.minDate) {\n calendar.months = MONTHS;\n } else {\n var low = picker.minDate ? currentMonthIndex(picker.minDate) : 0;\n var high = picker.maxDate ? (currentMonthIndex(picker.maxDate) + 1) : MONTHS_IN_ALL;\n calendar.months = MONTHS.slice(low, high);\n }\n\n\n calendar.getItemAtIndex = function (index) {\n var month = ((index + 1) % 12) || 12;\n var year = YEAR_MIN + Math.floor(index / 12);\n var monthObj = moment(picker.currentDate)\n .year(year)\n .month(month);\n return generateMonthCalendar(monthObj);\n };\n\n calendar.topIndex = currentMonthIndex(picker.currentDate) - calendar.months[0];\n\n $scope.$watch(function () {\n return picker.currentDate ? picker.currentDate.format('YYYY-MM') : '';\n }, function (val2, val1) {\n if (val2 != val1) {\n var nDate = moment(val2, 'YYYY-MM');\n var low = picker.minDate ? currentMonthIndex(picker.minDate) : 0;\n var index = currentMonthIndex(nDate, low);\n if (calendar.topIndex != index) {\n calendar.topIndex = index;\n }\n }\n });\n\n var generateMonthCalendar = function (date) {\n var month = {};\n if (date !== null) {\n month.name = date.format('MMMM YYYY');\n var startOfMonth = moment(date).locale(picker.params.lang).startOf('month')\n .hour(date.hour())\n .minute(date.minute())\n ;\n var iNumDay = startOfMonth.format('d');\n month.days = [];\n for (var i = startOfMonth.date(); i <= startOfMonth.daysInMonth(); i++) {\n if (i === startOfMonth.date()) {\n var iWeek = calendar.week.indexOf(iNumDay.toString());\n if (iWeek > 0) {\n for (var x = 0; x < iWeek; x++) {\n month.days.push(0);\n }\n }\n }\n month.days.push(moment(startOfMonth).locale(picker.params.lang).date(i));\n }\n\n var daysInAWeek = 7, daysTmp = [], slices = Math.ceil(month.days.length / daysInAWeek);\n for (var j = 0; j < slices; j++) {\n daysTmp.push(month.days.slice(j * daysInAWeek, (j + 1) * daysInAWeek));\n }\n month.days = daysTmp;\n return month;\n }\n\n };\n\n calendar.toDay = function (i) {\n return moment(parseInt(i), \"d\")\n .locale(picker.params.lang)\n .format(\"dd\")\n .substring(0, 1);\n };\n\n calendar.isInRange = function (date) {\n return picker.isAfterMinDate(moment(date), false, false)\n && picker.isBeforeMaxDate(moment(date), false, false)\n && picker.isInDisableDates(moment(date));\n };\n\n calendar.selectDate = function (date) {\n if (date) {\n if (calendar.isSelectedDay(date)) {\n return picker.ok();\n }\n picker.selectDate(moment(date).hour(calendar.date.hour()).minute(calendar.date.minute()));\n }\n };\n\n calendar.isSelectedDay = function (m) {\n return m && calendar.date.date() === m.date() && calendar.date.month() === m.month() && calendar.date.year() === m.year();\n };\n\n calendar.isDateOfTheDay = function (m) {\n var today = calendar.picker.options.showTodaysDate;\n if (!today) {\n return false;\n }\n\n return m && today.date() === m.date() && today.month() === m.month() && today.year() === m.year();\n }\n }\n }],\n template: '' +\n '
' +\n '
' +\n '
' +\n '
'\n };\n }])\n .directive('mdcDatetimePickerCalendarMonth', ['$compile',\n function ($compile) {\n var buildCalendarContent = function (element, scope) {\n var tbody = angular.element(element[0].querySelector('tbody'));\n var calendar = scope.cal, month = scope.month;\n\n var tbodyHtml = [];\n\n month.days.forEach(function (weekDays, i) {\n tbodyHtml.push('');\n weekDays.forEach(function (weekDay, j) {\n tbodyHtml.push('');\n if (weekDay) {\n if (calendar.isInRange(weekDay)) {\n //build a\n var scopeRef = 'month[\\'days\\'][' + i + '][' + j + ']';\n\n tbodyHtml.push('');\n tbodyHtml.push(weekDay.format('D'));\n tbodyHtml.push('');\n } else {\n tbodyHtml.push('');\n tbodyHtml.push(weekDay.format('D'));\n tbodyHtml.push('');\n }\n }\n tbodyHtml.push('');\n });\n tbodyHtml.push('');\n });\n\n tbody.html(tbodyHtml.join(''));\n $compile(tbody)(scope);\n };\n\n return {\n scope: {\n idx: '='\n },\n require: '^mdcDatetimePickerCalendar',\n restrict: 'AE',\n template: '
{{month.name}}
'\n + ''\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + '
{{cal.toDay(day)}}
',\n link: function (scope, element, attrs, calendar) {\n scope.cal = calendar;\n scope.month = calendar.getItemAtIndex(parseInt(scope.idx));\n buildCalendarContent(element, scope);\n scope.$watch(function () {\n return scope.idx;\n }, function (idx, oldIdx) {\n if (idx != oldIdx) {\n scope.month = calendar.getItemAtIndex(parseInt(scope.idx));\n buildCalendarContent(element, scope);\n }\n });\n }\n };\n }\n ])\n ;\n\n angular.module(moduleName)\n .directive('mdcDtpNoclick', function () {\n return {\n link: function (scope, el) {\n el.on('click', function (e) {\n e.preventDefault();\n });\n }\n };\n });\n angular.module(moduleName)\n .directive('mdcDatetimePickerClock', [\n function () {\n\n var template = '
 '\n + '
'\n + ' {{point.display}}'\n + ' {{point.display}}'\n + '
'\n + '
'\n + '
'\n + '
'\n + '
';\n\n return {\n restrict: 'E',\n template: template,\n link: function (scope, element, attrs) {\n var minuteMode = attrs.mode === 'minutes';\n var picker = scope.picker;\n //banking on the fact that there will only be one at a time\n var componentRoot = document.querySelector('md-dialog.dtp');\n var exec = function () {\n var clock = angular.element(element[0].querySelector('.dtp-picker-clock')),\n pickerEl = angular.element(componentRoot.querySelector('.dtp-picker'));\n\n var w = componentRoot.querySelector('.dtp-content').offsetWidth;\n var pl = parseInt(css(pickerEl, 'paddingLeft').replace('px', '')) || 0;\n var pr = parseInt(css(pickerEl, 'paddingRight').replace('px', '')) || 0;\n var ml = parseInt(css(clock, 'marginLeft').replace('px', '')) || 0;\n var mr = parseInt(css(clock, 'marginRight').replace('px', '')) || 0;\n //set width\n var clockWidth = (w - (ml + mr + pl + pr));\n clock.css('width', (clockWidth) + 'px');\n\n var pL = parseInt(css(pickerEl, 'paddingLeft').replace('px', '')) || 0;\n var pT = parseInt(css(pickerEl, 'paddingTop').replace('px', '')) || 0;\n var mL = parseInt(css(clock, 'marginLeft').replace('px', '')) || 0;\n var mT = parseInt(css(clock, 'marginTop').replace('px', '')) || 0;\n\n var r = (clockWidth / 2);\n var j = r / 1.2; //???\n\n var points = [];\n\n for (var h = 0; h < 12; ++h) {\n var x = j * Math.sin(Math.PI * 2 * (h / 12));\n var y = j * Math.cos(Math.PI * 2 * (h / 12));\n var left = (r + x + pL / 2) - (pL + mL);\n var top = (r - y - mT / 2) - (pT + mT);\n\n var hour = {\n left: left,\n top: top,\n value: (minuteMode ? (h * 5) : h), //5 for minute 60/12\n style: {'margin-left': left + 'px', 'margin-top': top + 'px'}\n };\n\n if (minuteMode) {\n hour.display = hour.value < 10 ? ('0' + hour.value) : hour.value;\n } else {\n\n if (picker.params.shortTime) {\n hour.display = (h === 0) ? 12 : h;\n } else {\n hour.display = picker.isPM() ? h + 12 : h;\n }\n }\n\n\n points.push(hour);\n }\n\n scope.points = points;\n scope.mode = attrs.mode;\n setCurrentValue();\n clock.css('height', clockWidth + 'px');\n //picker.initHands(true);\n\n var clockCenter = element[0].querySelector('.dtp-clock-center');\n var centerWidth = (clockCenter.offsetWidth / 2) || 7.5,\n centerHeight = (clockCenter.offsetHeight / 2) || 7.5;\n var _hL = r / 1.8;\n var _mL = r / 1.5;\n\n angular.element(element[0].querySelector('.dtp-hour-hand')).css({\n left: r + (mL * 1.5) + 'px',\n height: _hL + 'px',\n marginTop: (r - _hL - pL) + 'px'\n }).addClass(!minuteMode ? 'on' : '');\n\n angular.element(element[0].querySelector('.dtp-minute-hand')).css\n ({\n left: r + (mL * 1.5) + 'px',\n height: _mL + 'px',\n marginTop: (r - _mL - pL) + 'px'\n }).addClass(minuteMode ? 'on' : '');\n\n angular.element(clockCenter).css({\n left: (r + pL + mL - centerWidth) + 'px',\n marginTop: (r - (mL / 2)) - centerHeight + 'px'\n });\n animateHands();\n };\n\n var animateHands = function () {\n var _date = picker.currentNearest5Minute();\n var h = _date.hour();\n var m = _date.minute();\n\n rotateElement(angular.element(element[0].querySelector('.dtp-hour-hand')), (360 / 12) * h);\n var mdg = ((360 / 60) * (5 * Math.round(m / 5)));\n rotateElement(angular.element(element[0].querySelector('.dtp-minute-hand')), mdg);\n };\n\n var rotateElement = function (el, deg) {\n angular.element(el).css({\n WebkitTransform: 'rotate(' + deg + 'deg)',\n '-moz-transform': 'rotate(' + deg + 'deg)',\n '-ms-transform': 'rotate(' + deg + 'deg)',\n 'transform': 'rotate(' + deg + 'deg)'\n });\n };\n\n\n var setCurrentValue = function () {\n var date = picker.currentNearest5Minute();\n scope.currentValue = minuteMode ? date.minute() : (date.hour() % 12);\n };\n\n scope.$watch(function () {\n var tmp = picker.currentNearest5Minute();\n return tmp ? tmp.format('HH:mm') : '';\n }, function () {\n setCurrentValue();\n animateHands();\n });\n\n\n var setDisplayPoints = function (isPM, points) {\n for (var i = 0; i < points.length; i++) {\n points[i].display = i;\n if (isPM) {\n points[i].display += 12;\n }\n }\n return points;\n };\n\n if (!picker.params.shortTime) {\n scope.$watch('picker.meridien', function () {\n if (!minuteMode) {\n if (scope.points) {\n var points = setDisplayPoints(picker.isPM(), angular.copy(scope.points));\n scope.points = points;\n }\n }\n });\n }\n\n\n scope.setTime = function (val) {\n if (val === scope.currentValue) {\n picker.ok();\n }\n\n if (!minuteMode) {\n picker.currentDate.hour(picker.isPM() ? (val + 12) : val);\n } else {\n picker.currentDate.minute(val);\n }\n picker.currentDate.second(0)\n };\n\n scope.pointAvailable = function (point) {\n return minuteMode ? picker.isMinuteAvailable(point.value) : picker.isHourAvailable(point.value);\n };\n\n var unWatcher = scope.$watch(function () {\n return element[0].querySelectorAll('div').length;\n }, function () {\n exec();\n unWatcher();\n });\n }\n }\n }]);\n\n})();\n"]} \ No newline at end of file +{"version":3,"sources":["angular-material-datetimepicker.js"],"names":["moduleName","VIEW_STATES","DATE","HOUR","MINUTE","css","el","name","angular","element","window","getComputedStyle","template","module","provider","this","locale","navigator","userLanguage","language","$get","setDefaultLocale","localeString","factory","mdcDatetimePickerDefaultLocale","default_params","date","time","format","minDate","maxDate","currentDate","lang","weekStart","shortTime","cancelText","okText","amText","pmText","todayText","disableDates","directive","$mdDialog","$timeout","restrict","require","scope","ngChange","showTodaysDate","link","attrs","ngModel","isOn","dateOfTheDay","undefined","moment","isString","$formatters","push","value","m","isValid","attr","on","e","preventDefault","blur","options","i","hasOwnProperty","isUndefined","locals","show","controller","PluginController","controllerAs","openFrom","parent","document","body","bindToController","disableParentScroll","hasBackDrop","skipHide","then","v","_d","isSame","$q","mdcDefaultParams","accepted_options","Object","keys","console","log","service","deferred","defer","params","copy","indexOf","clickOutsideToClose","resolve","reject","promise","$scope","currentView","_dialog","_attachedEvents","VIEWS","meridien","extend","init","$inject","prototype","timeMode","dateMode","initDates","start","currentNearest5Minute","minutes","Math","round","minute","that","_dateParam","input","fallback","ret","isDefined","isDate","x","getTime","_isAMomentObject","map","selectDate","initDate","initHours","initMinutes","isAfterMinDate","checkHour","checkMinute","_return","_minDate","_date","hour","second","millisecond","parseInt","isBeforeMaxDate","checkTime","_maxDate","isInDisableDates","dut","calendarStart","setName","text","possible","charAt","floor","random","length","isPM","incrementYear","amount","isNextYearVisible","add","isPreviousYearVisible","isPreviousMonthVisible","startOf","isNextMonthVisible","endOf","isHourAvailable","convertHours","isMinuteAvailable","today","Date","now","ok","hide","cancel","selectMonthBefore","subtract","selectMonthAfter","selectYearBefore","selectYearAfter","selectAM","selectPM","h","okBtn","YEAR_MIN","YEAR_MAX","getFullYear","MONTHS_IN_ALL","ITEM_HEIGHT","MONTHS","currentMonthIndex","low","year","month","picker","$onInit","calendar","days","toString","week","high","months","slice","getItemAtIndex","index","monthObj","generateMonthCalendar","topIndex","$watch","val2","val1","nDate","startOfMonth","iNumDay","daysInMonth","iWeek","daysInAWeek","daysTmp","slices","ceil","j","toDay","substring","isInRange","isSelectedDay","isDateOfTheDay","$compile","buildCalendarContent","tbody","querySelector","cal","tbodyHtml","forEach","weekDays","weekDay","scopeRef","html","join","idx","oldIdx","minuteMode","mode","componentRoot","exec","clock","pickerEl","w","offsetWidth","pl","replace","pr","ml","mr","clockWidth","pL","pT","mL","mT","r","points","sin","PI","y","cos","left","top","style","margin-left","margin-top","display","setCurrentValue","clockCenter","centerWidth","centerHeight","offsetHeight","_hL","_mL","height","marginTop","addClass","animateHands","rotateElement","mdg","deg","WebkitTransform","-moz-transform","-ms-transform","transform","currentValue","tmp","setDisplayPoints","setTime","val","pointAvailable","point","unWatcher","querySelectorAll"],"mappings":"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","file":"angular-material-datetimepicker.min.js","sourcesContent":["(function () {\n 'use strict';\n var moduleName = \"ngMaterialDatePicker\";\n\n var VIEW_STATES = {\n DATE: 0,\n HOUR: 1,\n MINUTE: 2\n };\n\n var css = function (el, name) {\n el = angular.element(el);\n return ('getComputedStyle' in window) ? window.getComputedStyle(el[0])[name] : el.css(name);\n };\n\n var template = ''\n + ' '\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"dddd\")}}
'\n + '
{{picker.params.shortTime ? picker.currentDate.format(\"A\") : \" \"}}
'\n + '
'\n + ' ×'\n + '
'\n + '
'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"MMM\") | uppercase}}
'\n + '
'\n + '
{{picker.currentDate.format(\"DD\")}}
'\n + '
'\n + '
'\n + '
{{picker.currentDate.format(\"YYYY\")}}
'\n + '
'\n + '
'\n + '
'//start time\n + '
'\n + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? \"hh:mm\" : \"HH:mm\")}}
'\n + '
'\n + '
'\n + ' '\n + '
'\n + '
'\n + '
'\n + ' {{picker.params.amText}}'\n + '
'\n + '
{{picker.currentNearest5Minute().format(picker.params.shortTime ? \"hh:mm\" : \"HH:mm\")}}
'\n + '
'\n + ' {{picker.params.pmText}}'\n + '
'\n + '
'\n + '
'\n + ' '\n + ' '\n + '
'\n + '
'\n + '
'\n + '
'\n + ' '\n + ' {{picker.params.todayText}}'\n + ' {{picker.params.cancelText}}'\n + ' {{picker.params.okText}}'\n + ' '\n + '
';\n\n\n angular.module(moduleName, ['ngMaterial'])\n .provider('mdcDatetimePickerDefaultLocale', function () {\n this.locale = window.navigator.userLanguage || window.navigator.language || 'en';\n\n this.$get = function () {\n return this;\n };\n\n this.setDefaultLocale = function (localeString) {\n this.locale = localeString;\n };\n })\n .factory('mdcDefaultParams', ['mdcDatetimePickerDefaultLocale', function (mdcDatetimePickerDefaultLocale) {\n var default_params = {\n date: true,\n time: true,\n format: 'YYYY-MM-DD',\n minDate: null,\n maxDate: null,\n currentDate: null,\n lang: mdcDatetimePickerDefaultLocale.locale,\n weekStart: 0,\n shortTime: false,\n cancelText: 'Cancel',\n okText: 'OK',\n amText: 'AM',\n pmText: 'PM',\n todayText: 'Today',\n disableDates: []\n };\n return default_params;\n }])\n .directive('mdcDatetimePicker', ['$mdDialog', '$timeout',\n function ($mdDialog, $timeout) {\n\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n currentDate: '=ngModel',\n ngChange: '&',\n time: '=',\n date: '=',\n minDate: '=',\n maxDate: '=',\n disableDates: '=',\n shortTime: '=',\n weekStart: '=',\n format: '@',\n cancelText: '@',\n okText: '@',\n lang: '@',\n amText: '@',\n pmText: '@',\n showTodaysDate: '@',\n todayText: '@'\n },\n link: function (scope, element, attrs, ngModel) {\n var isOn = false;\n if (!scope.format) {\n if (scope.date && scope.time) {\n scope.format = 'YYYY-MM-DD HH:mm';\n } else if (scope.date) {\n scope.format = 'YYYY-MM-DD';\n } else {\n scope.format = 'HH:mm';\n }\n }\n\n var dateOfTheDay = null;\n if (scope.showTodaysDate !== undefined && scope.showTodaysDate !== \"false\") {\n dateOfTheDay = moment();\n }\n\n if (angular.isString(scope.currentDate) && scope.currentDate !== '') {\n scope.currentDate = moment(scope.currentDate, scope.format);\n }\n\n if (ngModel) {\n ngModel.$formatters.push(function (value) {\n if (typeof value === 'undefined') {\n return;\n }\n var m = moment(value);\n return m.isValid() ? m.format(scope.format) : '';\n });\n }\n\n element.attr('readonly', '');\n //@TODO custom event to trigger input\n element.on('focus', function (e) {\n e.preventDefault();\n element.blur();\n if (isOn) {\n return;\n }\n isOn = true;\n var options = {};\n for (var i in attrs) {\n if (scope.hasOwnProperty(i) && !angular.isUndefined(scope[i])) {\n options[i] = scope[i];\n }\n }\n options.currentDate = scope.currentDate;\n options.showTodaysDate = dateOfTheDay;\n\n var locals = {options: options};\n $mdDialog.show({\n template: template,\n controller: PluginController,\n controllerAs: 'picker',\n locals: locals,\n openFrom: element,\n parent: angular.element(document.body),\n bindToController: true,\n disableParentScroll: false,\n hasBackDrop: false,\n skipHide: true\n })\n .then(function (v) {\n scope.currentDate = v ? v._d : v;\n isOn = false;\n\n if (!moment(scope.currentDate).isSame(options.currentDate)) {\n $timeout(scope.ngChange, 0);\n }\n\n element.blur()\n\n }, function () {\n isOn = false;\n element.blur()\n })\n ;\n });\n }\n };\n }])\n /** Returns a service that opens a dialog when the attribute shown is called\n The dialog serves to select a date/time/etc. depending on the options given to the function show\n\n @param options extends mdcDefaultParams\n {\n date: {boolean} =true,\n time: {boolean] =true,\n format: {string} ='YYYY-MM-DD',\n minDate: {strign} =null,\n maxDate: {string} =null,\n currentDate: {string} =null,\n lang: {string} =mdcDatetimePickerDefaultLocale,\n weekStart: {int} =0,\n shortTime: {boolean} =false,\n cancelText: {string} ='Cancel',\n todayText: {string} ='Today',\n okText: {string} ='OK',\n amText: {string} ='AM',\n pmText: {string} ='PM'\n }\n @return promise\n */\n .factory('mdcDateTimeDialog', [\"$mdDialog\", \"$q\", \"mdcDefaultParams\", function ($mdDialog, $q, mdcDefaultParams) {\n var accepted_options = Object.keys(mdcDefaultParams);\n console.log(accepted_options);\n var service = {\n show: function (options) {\n var deferred = $q.defer();\n var params = angular.copy(mdcDefaultParams);\n for (var i in options) {\n if (accepted_options.indexOf[i] != -1 && options.hasOwnProperty(i)) {\n params = options[i];\n }\n }\n var locals = {options: options};\n $mdDialog.show({\n template: template,\n controller: PluginController,\n controllerAs: 'picker',\n locals: locals,\n parent: angular.element(document.body),\n bindToController: true,\n clickOutsideToClose: true,\n disableParentScroll: false,\n skipHide: true\n })\n .then(function (v) {\n var currentDate = v ? v._d : v;\n deferred.resolve(v ? v._d : v);\n }, function () {\n deferred.reject();\n });\n return deferred.promise;\n }\n };\n\n return service;\n }])\n ;\n\n var PluginController = function ($scope, $mdDialog, mdcDefaultParams) {\n this.currentView = VIEW_STATES.DATE;\n this._dialog = $mdDialog;\n\n this._attachedEvents = [];\n this.VIEWS = VIEW_STATES;\n this.params = mdcDefaultParams;\n this.meridien = 'AM';\n this.params = angular.extend(this.params, this.options);\n\n this.init();\n };\n\n PluginController.$inject = ['$scope', '$mdDialog', 'mdcDefaultParams'];\n PluginController.prototype = {\n init: function () {\n this.timeMode = this.params.time && !this.params.date;\n this.dateMode = this.params.date;\n this.initDates();\n this.start();\n },\n currentNearest5Minute: function () {\n var date = this.currentDate || moment();\n var minutes = (5 * Math.round(date.minute() / 5));\n if (minutes >= 60) {\n minutes = 55; //always push down\n }\n return moment(date).minutes(minutes);\n },\n initDates: function () {\n var that = this;\n var _dateParam = function (input, fallback) {\n var ret = null;\n if (angular.isDefined(input) && input !== null && input !== '') {\n if (angular.isString(input)) {\n if (typeof(that.params.format) !== 'undefined' && that.params.format !== null) {\n ret = moment(input, that.params.format).locale(that.params.lang);\n }\n else {\n ret = moment(input).locale(that.params.lang);\n }\n } else if (typeof input === 'number') {\n ret = moment(input).locale(that.params.lang);\n } else {\n if (angular.isDate(input)) {\n var x = input.getTime();\n ret = moment(x, \"x\").locale(that.params.lang);\n } else if (input._isAMomentObject) {\n ret = input;\n }\n }\n }\n else {\n ret = fallback;\n }\n return ret;\n };\n\n this.currentDate = _dateParam(this.params.currentDate, moment());\n this.minDate = _dateParam(this.params.minDate);\n this.maxDate = _dateParam(this.params.maxDate);\n this.disableDates = this.params.disableDates.map(function (x) {\n return moment(x).format('MMMM Do YYYY')\n });\n this.selectDate(this.currentDate);\n },\n initDate: function () {\n this.currentView = VIEW_STATES.DATE;\n },\n initHours: function () {\n this.currentView = VIEW_STATES.HOUR;\n },\n initMinutes: function () {\n this.currentView = VIEW_STATES.MINUTE;\n },\n isAfterMinDate: function (date, checkHour, checkMinute) {\n var _return = true;\n\n if (typeof(this.minDate) !== 'undefined' && this.minDate !== null) {\n var _minDate = moment(this.minDate);\n var _date = moment(date);\n\n if (!checkHour && !checkMinute) {\n _minDate.hour(0);\n _minDate.minute(0);\n\n _date.hour(0);\n _date.minute(0);\n }\n\n _minDate.second(0);\n _date.second(0);\n _minDate.millisecond(0);\n _date.millisecond(0);\n\n if (!checkMinute) {\n _date.minute(0);\n _minDate.minute(0);\n\n _return = (parseInt(_date.format(\"X\")) >= parseInt(_minDate.format(\"X\")));\n }\n else {\n _return = (parseInt(_date.format(\"X\")) >= parseInt(_minDate.format(\"X\")));\n }\n }\n\n return _return;\n },\n isBeforeMaxDate: function (date, checkTime, checkMinute) {\n var _return = true;\n\n if (typeof(this.maxDate) !== 'undefined' && this.maxDate !== null) {\n var _maxDate = moment(this.maxDate);\n var _date = moment(date);\n\n if (!checkTime && !checkMinute) {\n _maxDate.hour(0);\n _maxDate.minute(0);\n\n _date.hour(0);\n _date.minute(0);\n }\n\n _maxDate.second(0);\n _date.second(0);\n _maxDate.millisecond(0);\n _date.millisecond(0);\n\n if (!checkMinute) {\n _date.minute(0);\n _maxDate.minute(0);\n\n _return = (parseInt(_date.format(\"X\")) <= parseInt(_maxDate.format(\"X\")));\n }\n else {\n _return = (parseInt(_date.format(\"X\")) <= parseInt(_maxDate.format(\"X\")));\n }\n }\n\n return _return;\n },\n isInDisableDates: function (date) {\n var dut = date.format('MMMM Do YYYY')\n if (this.disableDates.indexOf(dut) > -1) {\n return false;\n }\n return true;\n },\n selectDate: function (date) {\n if (date) {\n this.currentDate = moment(date);\n if (!this.isAfterMinDate(this.currentDate)) {\n this.currentDate = moment(this.minDate);\n }\n\n if (!this.isBeforeMaxDate(this.currentDate)) {\n this.currentDate = moment(this.maxDate);\n }\n this.currentDate.locale(this.params.lang);\n this.calendarStart = moment(this.currentDate);\n this.meridien = this.currentDate.hour() >= 12 ? 'PM' : 'AM';\n }\n },\n setName: function () {\n var text = \"\";\n var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n for (var i = 0; i < 5; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n },\n isPM: function () {\n return this.meridien === 'PM';\n },\n incrementYear: function (amount) {\n if (amount === 1 && this.isNextYearVisible()) {\n this.selectDate(this.currentDate.add(amount, 'year'));\n }\n\n if (amount === -1 && this.isPreviousYearVisible()) {\n this.selectDate(this.currentDate.add(amount, 'year'));\n }\n },\n isPreviousMonthVisible: function () {\n return this.calendarStart && this.isAfterMinDate(moment(this.calendarStart).startOf('month'), false, false);\n },\n isNextMonthVisible: function () {\n return this.calendarStart && this.isBeforeMaxDate(moment(this.calendarStart).endOf('month'), false, false);\n },\n isPreviousYearVisible: function () {\n return this.calendarStart && this.isAfterMinDate(moment(this.calendarStart).startOf('year'), false, false);\n },\n isNextYearVisible: function () {\n return this.calendarStart && this.isBeforeMaxDate(moment(this.calendarStart).endOf('year'), false, false);\n },\n isHourAvailable: function (hour) {\n var _date = moment(this.currentDate);\n _date.hour(this.convertHours(hour)).minute(0).second(0);\n return this.isAfterMinDate(_date, true, false) && this.isBeforeMaxDate(_date, true, false);\n },\n isMinuteAvailable: function (minute) {\n var _date = moment(this.currentDate);\n _date.minute(minute).second(0);\n return this.isAfterMinDate(_date, true, true) && this.isBeforeMaxDate(_date, true, true);\n },\n start: function () {\n this.currentView = VIEW_STATES.DATE;\n //this.initDates();\n if (this.params.date) {\n this.initDate();\n } else {\n if (this.params.time) {\n this.initHours();\n }\n }\n },\n today: function () {\n this.selectDate(Date.now());\n },\n ok: function () {\n switch (this.currentView) {\n case VIEW_STATES.DATE:\n if (this.params.time === true) {\n this.initHours();\n }\n else {\n this.hide(true);\n }\n break;\n case VIEW_STATES.HOUR:\n this.initMinutes();\n break;\n case VIEW_STATES.MINUTE:\n this.hide(true);\n break;\n }\n },\n cancel: function () {\n if (this.params.time) {\n switch (this.currentView) {\n case VIEW_STATES.DATE:\n this.hide();\n break;\n case VIEW_STATES.HOUR:\n if (this.params.date) {\n this.initDate();\n }\n else {\n this.hide();\n }\n break;\n case VIEW_STATES.MINUTE:\n this.initHours();\n break;\n }\n }\n else {\n this.hide();\n }\n },\n selectMonthBefore: function () {\n this.calendarStart.subtract(1, 'months');\n },\n selectMonthAfter: function () {\n this.calendarStart.add(1, 'months');\n },\n selectYearBefore: function () {\n this.calendarStart.subtract(1, 'years');\n },\n selectYearAfter: function () {\n this.calendarStart.add(1, 'years');\n },\n selectAM: function () {\n if (this.isHourAvailable(0) || this.isHourAvailable(12)) {\n if (this.currentDate.hour() >= 12) {\n this.selectDate(this.currentDate.subtract(12, 'hours'));\n }\n if (!this.isHourAvailable(this.currentDate.hour())) {\n this.selectDate(this.currentDate.hour(this.minDate.hour()));\n }\n if (!this.isMinuteAvailable(this.currentDate.minute())) {\n this.selectDate(this.currentDate.minute(this.minDate.minute()));\n }\n }\n },\n selectPM: function () {\n if (this.isHourAvailable(13) || this.isHourAvailable(24)) {\n if (this.currentDate.hour() < 12) {\n this.selectDate(this.currentDate.add(12, 'hours'));\n }\n if (!this.isHourAvailable(this.currentDate.hour())) {\n this.selectDate(this.currentDate.hour(this.maxDate.hour()));\n }\n if (!this.isMinuteAvailable(this.currentDate.minute())) {\n this.selectDate(this.currentDate.minute(this.maxDate.minute()));\n }\n }\n },\n convertHours: function (h) {\n var _return = h;\n if ((h < 12) && this.isPM())\n _return += 12;\n\n return _return;\n },\n hide: function (okBtn) {\n if (okBtn) {\n this._dialog.hide(this.currentDate);\n } else {\n this._dialog.cancel();\n }\n }\n };\n\n\n angular.module(moduleName)\n .directive('mdcDatetimePickerCalendar', [\n function () {\n\n var YEAR_MIN = 1920,\n YEAR_MAX = new Date().getFullYear() + 30,\n MONTHS_IN_ALL = (YEAR_MAX - YEAR_MIN + 1) * 12,\n ITEM_HEIGHT = 240,\n MONTHS = [];\n for (var i = 0; i < MONTHS_IN_ALL; i++) {\n MONTHS.push(i);\n }\n\n var currentMonthIndex = function (date, low) {\n low = low ? low : 0;\n var year = date.year();\n var month = date.month();\n return (((year - YEAR_MIN) * 12) + month - 1 ) - low;\n };\n\n return {\n restrict: 'E',\n scope: {\n picker: '=',\n date: '='\n },\n bindToController: true,\n controllerAs: 'cal',\n controller: ['$scope', function ($scope) {\n this.$onInit = function () {\n var calendar = this,\n picker = this.picker,\n days = [];\n\n for (var i = picker.params.weekStart; days.length < 7; i++) {\n if (i > 6) {\n i = 0;\n }\n days.push(i.toString());\n }\n\n calendar.week = days;\n if (!picker.maxDate && !picker.minDate) {\n calendar.months = MONTHS;\n } else {\n var low = picker.minDate ? currentMonthIndex(picker.minDate) : 0;\n var high = picker.maxDate ? (currentMonthIndex(picker.maxDate) + 1) : MONTHS_IN_ALL;\n calendar.months = MONTHS.slice(low, high);\n }\n\n\n calendar.getItemAtIndex = function (index) {\n var month = ((index + 1) % 12) || 12;\n var year = YEAR_MIN + Math.floor(index / 12);\n var monthObj = moment(picker.currentDate)\n .year(year)\n .month(month);\n return generateMonthCalendar(monthObj);\n };\n\n calendar.topIndex = currentMonthIndex(picker.currentDate) - calendar.months[0];\n\n $scope.$watch(function () {\n return picker.currentDate ? picker.currentDate.format('YYYY-MM') : '';\n }, function (val2, val1) {\n if (val2 != val1) {\n var nDate = moment(val2, 'YYYY-MM');\n var low = picker.minDate ? currentMonthIndex(picker.minDate) : 0;\n var index = currentMonthIndex(nDate, low);\n if (calendar.topIndex != index) {\n calendar.topIndex = index;\n }\n }\n });\n\n var generateMonthCalendar = function (date) {\n var month = {};\n if (date !== null) {\n month.name = date.format('MMMM YYYY');\n var startOfMonth = moment(date).locale(picker.params.lang).startOf('month')\n .hour(date.hour())\n .minute(date.minute())\n ;\n var iNumDay = startOfMonth.format('d');\n month.days = [];\n for (var i = startOfMonth.date(); i <= startOfMonth.daysInMonth(); i++) {\n if (i === startOfMonth.date()) {\n var iWeek = calendar.week.indexOf(iNumDay.toString());\n if (iWeek > 0) {\n for (var x = 0; x < iWeek; x++) {\n month.days.push(0);\n }\n }\n }\n month.days.push(moment(startOfMonth).locale(picker.params.lang).date(i));\n }\n\n var daysInAWeek = 7, daysTmp = [], slices = Math.ceil(month.days.length / daysInAWeek);\n for (var j = 0; j < slices; j++) {\n daysTmp.push(month.days.slice(j * daysInAWeek, (j + 1) * daysInAWeek));\n }\n month.days = daysTmp;\n return month;\n }\n\n };\n\n calendar.toDay = function (i) {\n return moment(parseInt(i), \"d\")\n .locale(picker.params.lang)\n .format(\"dd\")\n .substring(0, 1);\n };\n\n calendar.isInRange = function (date) {\n return picker.isAfterMinDate(moment(date), false, false)\n && picker.isBeforeMaxDate(moment(date), false, false)\n && picker.isInDisableDates(moment(date));\n };\n\n calendar.selectDate = function (date) {\n if (date) {\n if (calendar.isSelectedDay(date)) {\n return picker.ok();\n }\n picker.selectDate(moment(date).hour(calendar.date.hour()).minute(calendar.date.minute()));\n }\n };\n\n calendar.isSelectedDay = function (m) {\n return m && calendar.date.date() === m.date() && calendar.date.month() === m.month() && calendar.date.year() === m.year();\n };\n\n calendar.isDateOfTheDay = function (m) {\n var today = calendar.picker.options.showTodaysDate;\n if (!today) {\n return false;\n }\n\n return m && today.date() === m.date() && today.month() === m.month() && today.year() === m.year();\n }\n }\n }],\n template: '' +\n '
' +\n '
' +\n '
' +\n '
'\n };\n }])\n .directive('mdcDatetimePickerCalendarMonth', ['$compile',\n function ($compile) {\n var buildCalendarContent = function (element, scope) {\n var tbody = angular.element(element[0].querySelector('tbody'));\n var calendar = scope.cal, month = scope.month;\n\n var tbodyHtml = [];\n\n month.days.forEach(function (weekDays, i) {\n tbodyHtml.push('');\n weekDays.forEach(function (weekDay, j) {\n tbodyHtml.push('');\n if (weekDay) {\n if (calendar.isInRange(weekDay)) {\n //build a\n var scopeRef = 'month[\\'days\\'][' + i + '][' + j + ']';\n\n tbodyHtml.push('');\n tbodyHtml.push(weekDay.format('D'));\n tbodyHtml.push('');\n } else {\n tbodyHtml.push('');\n tbodyHtml.push(weekDay.format('D'));\n tbodyHtml.push('');\n }\n }\n tbodyHtml.push('');\n });\n tbodyHtml.push('');\n });\n\n tbody.html(tbodyHtml.join(''));\n $compile(tbody)(scope);\n };\n\n return {\n scope: {\n idx: '='\n },\n require: '^mdcDatetimePickerCalendar',\n restrict: 'AE',\n template: '
{{month.name}}
'\n + ''\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + ' '\n + '
{{cal.toDay(day)}}
',\n link: function (scope, element, attrs, calendar) {\n scope.cal = calendar;\n scope.month = calendar.getItemAtIndex(parseInt(scope.idx));\n buildCalendarContent(element, scope);\n scope.$watch(function () {\n return scope.idx;\n }, function (idx, oldIdx) {\n if (idx != oldIdx) {\n scope.month = calendar.getItemAtIndex(parseInt(scope.idx));\n buildCalendarContent(element, scope);\n }\n });\n }\n };\n }\n ])\n ;\n\n angular.module(moduleName)\n .directive('mdcDtpNoclick', function () {\n return {\n link: function (scope, el) {\n el.on('click', function (e) {\n e.preventDefault();\n });\n }\n };\n });\n angular.module(moduleName)\n .directive('mdcDatetimePickerClock', [\n function () {\n\n var template = '
 '\n + '
'\n + ' {{point.display}}'\n + ' {{point.display}}'\n + '
'\n + '
'\n + '
'\n + '
'\n + '
';\n\n return {\n restrict: 'E',\n template: template,\n link: function (scope, element, attrs) {\n var minuteMode = attrs.mode === 'minutes';\n var picker = scope.picker;\n //banking on the fact that there will only be one at a time\n var componentRoot = document.querySelector('md-dialog.dtp');\n var exec = function () {\n var clock = angular.element(element[0].querySelector('.dtp-picker-clock')),\n pickerEl = angular.element(componentRoot.querySelector('.dtp-picker'));\n\n var w = componentRoot.querySelector('.dtp-content').offsetWidth;\n var pl = parseInt(css(pickerEl, 'paddingLeft').replace('px', '')) || 0;\n var pr = parseInt(css(pickerEl, 'paddingRight').replace('px', '')) || 0;\n var ml = parseInt(css(clock, 'marginLeft').replace('px', '')) || 0;\n var mr = parseInt(css(clock, 'marginRight').replace('px', '')) || 0;\n //set width\n var clockWidth = (w - (ml + mr + pl + pr));\n clock.css('width', (clockWidth) + 'px');\n\n var pL = parseInt(css(pickerEl, 'paddingLeft').replace('px', '')) || 0;\n var pT = parseInt(css(pickerEl, 'paddingTop').replace('px', '')) || 0;\n var mL = parseInt(css(clock, 'marginLeft').replace('px', '')) || 0;\n var mT = parseInt(css(clock, 'marginTop').replace('px', '')) || 0;\n\n var r = (clockWidth / 2);\n var j = r / 1.2; //???\n\n var points = [];\n\n for (var h = 0; h < 12; ++h) {\n var x = j * Math.sin(Math.PI * 2 * (h / 12));\n var y = j * Math.cos(Math.PI * 2 * (h / 12));\n var left = (r + x + pL / 2) - (pL + mL);\n var top = (r - y - mT / 2) - (pT + mT);\n\n var hour = {\n left: left,\n top: top,\n value: (minuteMode ? (h * 5) : h), //5 for minute 60/12\n style: {'margin-left': left + 'px', 'margin-top': top + 'px'}\n };\n\n if (minuteMode) {\n hour.display = hour.value < 10 ? ('0' + hour.value) : hour.value;\n } else {\n\n if (picker.params.shortTime) {\n hour.display = (h === 0) ? 12 : h;\n } else {\n hour.display = picker.isPM() ? h + 12 : h;\n }\n }\n\n\n points.push(hour);\n }\n\n scope.points = points;\n scope.mode = attrs.mode;\n setCurrentValue();\n clock.css('height', clockWidth + 'px');\n //picker.initHands(true);\n\n var clockCenter = element[0].querySelector('.dtp-clock-center');\n var centerWidth = (clockCenter.offsetWidth / 2) || 7.5,\n centerHeight = (clockCenter.offsetHeight / 2) || 7.5;\n var _hL = r / 1.8;\n var _mL = r / 1.5;\n\n angular.element(element[0].querySelector('.dtp-hour-hand')).css({\n left: r + (mL * 1.5) + 'px',\n height: _hL + 'px',\n marginTop: (r - _hL - pL) + 'px'\n }).addClass(!minuteMode ? 'on' : '');\n\n angular.element(element[0].querySelector('.dtp-minute-hand')).css\n ({\n left: r + (mL * 1.5) + 'px',\n height: _mL + 'px',\n marginTop: (r - _mL - pL) + 'px'\n }).addClass(minuteMode ? 'on' : '');\n\n angular.element(clockCenter).css({\n left: (r + pL + mL - centerWidth) + 'px',\n marginTop: (r - (mL / 2)) - centerHeight + 'px'\n });\n animateHands();\n };\n\n var animateHands = function () {\n var _date = picker.currentNearest5Minute();\n var h = _date.hour();\n var m = _date.minute();\n\n rotateElement(angular.element(element[0].querySelector('.dtp-hour-hand')), (360 / 12) * h);\n var mdg = ((360 / 60) * (5 * Math.round(m / 5)));\n rotateElement(angular.element(element[0].querySelector('.dtp-minute-hand')), mdg);\n };\n\n var rotateElement = function (el, deg) {\n angular.element(el).css({\n WebkitTransform: 'rotate(' + deg + 'deg)',\n '-moz-transform': 'rotate(' + deg + 'deg)',\n '-ms-transform': 'rotate(' + deg + 'deg)',\n 'transform': 'rotate(' + deg + 'deg)'\n });\n };\n\n\n var setCurrentValue = function () {\n var date = picker.currentNearest5Minute();\n scope.currentValue = minuteMode ? date.minute() : (date.hour() % 12);\n };\n\n scope.$watch(function () {\n var tmp = picker.currentNearest5Minute();\n return tmp ? tmp.format('HH:mm') : '';\n }, function () {\n setCurrentValue();\n animateHands();\n });\n\n\n var setDisplayPoints = function (isPM, points) {\n for (var i = 0; i < points.length; i++) {\n points[i].display = i;\n if (isPM) {\n points[i].display += 12;\n }\n }\n return points;\n };\n\n if (!picker.params.shortTime) {\n scope.$watch('picker.meridien', function () {\n if (!minuteMode) {\n if (scope.points) {\n var points = setDisplayPoints(picker.isPM(), angular.copy(scope.points));\n scope.points = points;\n }\n }\n });\n }\n\n\n scope.setTime = function (val) {\n if (val === scope.currentValue) {\n picker.ok();\n }\n\n if (!minuteMode) {\n picker.currentDate.hour(picker.isPM() ? (val + 12) : val);\n } else {\n picker.currentDate.minute(val);\n }\n picker.currentDate.second(0)\n };\n\n scope.pointAvailable = function (point) {\n return minuteMode ? picker.isMinuteAvailable(point.value) : picker.isHourAvailable(point.value);\n };\n\n var unWatcher = scope.$watch(function () {\n return element[0].querySelectorAll('div').length;\n }, function () {\n exec();\n unWatcher();\n });\n }\n }\n }]);\n\n})();\n"]} \ No newline at end of file diff --git a/js/angular-material-datetimepicker.js b/js/angular-material-datetimepicker.js index c74c87c..65404c4 100644 --- a/js/angular-material-datetimepicker.js +++ b/js/angular-material-datetimepicker.js @@ -57,7 +57,7 @@ + ' ' + ' ' + ' ' - + ' {{picker.params.todayText}}' + + ' {{picker.params.todayText}}' + ' {{picker.params.cancelText}}' + ' {{picker.params.okText}}' + ' '