{"version":3,"sources":["ui-bootstrap-custom-tpls-0.13.3.js"],"names":["angular","module","value","constant","formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","datepickerMode","minMode","maxMode","showWeeks","startingDay","yearRange","minDate","maxDate","shortcutPropagation","controller","$scope","$attrs","$parse","$interpolate","$log","dateFilter","datepickerConfig","$datepickerSuppressError","self","this","ngModelCtrl","$setViewValue","noop","modes","forEach","key","index","isDefined","$parent","$eval","$watch","Date","refreshView","indexOf","uniqueId","$id","Math","floor","random","initDate","activeDate","$isEmpty","$modelValue","$invalid","isActive","dateObject","compare","date","activeDateId","uid","init","ngModelCtrl_","$render","render","$viewValue","isValid","isNaN","error","element","_refreshView","$setValidity","isDisabled","createDateObject","format","model","label","selected","disabled","current","customClass","dateDisabled","mode","split","arr","size","arrays","length","push","splice","fixTimeZone","hours","getHours","setHours","select","dt","setFullYear","getFullYear","getMonth","getDate","move","direction","year","step","years","month","months","toggleMode","keys","13","32","33","34","35","36","37","38","39","40","focusElement","focus","$on","keydown","evt","which","shiftKey","altKey","preventDefault","stopPropagation","ctrlKey","handleKeyDown","directive","restrict","replace","templateUrl","attrs","scope","require","controllerAs","link","ctrls","datepickerCtrl","ctrl","getDaysInMonth","DAYS_IN_MONTH","getDates","startDate","n","dates","Array","i","setDate","getISO8601WeekNumber","checkDate","getDay","time","getTime","setMonth","round","firstDayOfMonth","difference","numDisplayedFromPreviousMonth","firstDate","days","extend","secondary","labels","j","abbr","full","title","rows","weekNumbers","thursdayIndex","numWeeks","curWeek","date1","date2","min","getStartingYear","parseInt","range","start","join","datepickerPopup","datepickerPopupTemplateUrl","datepickerTemplateUrl","html5Types","datetime-local","currentText","clearText","closeText","closeOnDateSelection","appendToBody","showButtonBar","onOpenFocus","$compile","$document","$rootScope","$position","dateParser","datepickerPopupConfig","$timeout","$locale","isOpen","ngModel","cameltoDash","string","$1","toLowerCase","parseDate","viewValue","isNumber","isDate","isString","parse","dateFormat","validator","modelValue","ngRequired","DATETIME_FORMATS","shortDate","justClosed","attr","on","$root","$$phase","$apply","datepickerAppendToBody","getText","isHtml5DateInput","type","$observe","oldValue","newDateFormat","Error","popupEl","ng-model","ng-change","template-url","datepickerEl","children","datepickerOptions","options","option","watchData","getAttribute","setAttribute","assign","oldvalue","isFunction","$formatters","$$parserName","$validators","$parsers","unshift","dateSelection","val","$viewChangeListeners","documentClickBind","event","contains","target","inputKeydownBind","bind","position","offset","top","prop","$broadcast","unbind","today","close","$popup","remove","find","append","after","transclude","service","orderByFilter","createParser","map","regex","formatCodeToRegex","data","code","apply","RegExp","SPECIAL_CHARACTERS_REGEXP","parsers","yyyy","yy","y","MMMM","MONTH","MMM","SHORTMONTH","MM","M","dd","d","EEEE","DAY","EEE","SHORTDAY","HH","hh","H","mm","minutes","m","sss","milliseconds","ss","seconds","s","a","AMPMS","input","baseDate","parser","results","match","fields","getMinutes","getSeconds","getMilliseconds","warn","mapper","call","factory","$window","getStyle","el","cssprop","currentStyle","getComputedStyle","style","isStaticPositioned","parentOffsetEl","docDomEl","offsetParent","elBCR","offsetParentBCR","left","offsetParentEl","clientTop","scrollTop","clientLeft","scrollLeft","boundingClientRect","getBoundingClientRect","width","height","pageYOffset","documentElement","pageXOffset","positionElements","hostEl","targetEl","positionStr","hostElPos","targetElWidth","targetElHeight","targetElPos","positionStrParts","pos0","pos1","shiftWidth","center","right","shiftHeight","bottom","hourStep","minuteStep","showMeridian","meridians","readonlyInput","mousewheel","arrowkeys","showSpinners","timepickerConfig","getHoursFromTemplate","valid","meridian","getMinutesFromTemplate","undefined","pad","toString","refresh","keyboardChange","makeValid","updateTemplate","invalidHours","invalidMinutes","addMinutes","newDate","addMinutesToSelected","inputs","hoursInputEl","eq","minutesInputEl","setupMousewheelEvents","setupArrowkeyEvents","setupInputEvents","max","noIncrementHours","incrementedSelected","noDecrementHours","decrementedSelected","noIncrementMinutes","noDecrementMinutes","noToggleMeridian","isScrollingUp","e","originalEvent","delta","wheelDelta","deltaY","detail","incrementHours","decrementHours","incrementMinutes","decrementMinutes","updateHours","updateMinutes","invalidate","setMinutes","setSeconds","setMilliseconds","toggleMeridian","timepickerCtrl","run","$templateCache","put"],"mappings":"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","file":"ui-bootstrap-custom-tpls-0.13.3.min.js","sourcesContent":["/*\r\n * angular-ui-bootstrap\r\n * http://angular-ui.github.io/bootstrap/\r\n\r\n * Version: 0.13.3 - 2015-10-17\r\n * License: MIT\r\n */\r\nangular.module(\"ui.bootstrap\", [\"ui.bootstrap.tpls\",\"ui.bootstrap.datepicker\",\"ui.bootstrap.dateparser\",\"ui.bootstrap.position\",\"ui.bootstrap.timepicker\"]);\r\nangular.module(\"ui.bootstrap.tpls\", [\"template/datepicker/datepicker.html\",\"template/datepicker/day.html\",\"template/datepicker/month.html\",\"template/datepicker/popup.html\",\"template/datepicker/year.html\",\"template/timepicker/timepicker.html\"]);\r\nangular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.position'])\r\n\r\n.value('$datepickerSuppressError', false)\r\n\r\n.constant('datepickerConfig', {\r\n formatDay: 'dd',\r\n formatMonth: 'MMMM',\r\n formatYear: 'yyyy',\r\n formatDayHeader: 'EEE',\r\n formatDayTitle: 'MMMM yyyy',\r\n formatMonthTitle: 'yyyy',\r\n datepickerMode: 'day',\r\n minMode: 'day',\r\n maxMode: 'year',\r\n showWeeks: true,\r\n startingDay: 0,\r\n yearRange: 20,\r\n minDate: null,\r\n maxDate: null,\r\n shortcutPropagation: false\r\n})\r\n\r\n.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$log', 'dateFilter', 'datepickerConfig', '$datepickerSuppressError', function($scope, $attrs, $parse, $interpolate, $log, dateFilter, datepickerConfig, $datepickerSuppressError) {\r\n var self = this,\r\n ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl;\r\n\r\n // Modes chain\r\n this.modes = ['day', 'month', 'year'];\r\n\r\n // Configuration attributes\r\n angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle',\r\n 'showWeeks', 'startingDay', 'yearRange', 'shortcutPropagation'], function( key, index ) {\r\n self[key] = angular.isDefined($attrs[key]) ? (index < 6 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key];\r\n });\r\n\r\n // Watchable date attributes\r\n angular.forEach(['minDate', 'maxDate'], function( key ) {\r\n if ( $attrs[key] ) {\r\n $scope.$parent.$watch($parse($attrs[key]), function(value) {\r\n self[key] = value ? new Date(value) : null;\r\n self.refreshView();\r\n });\r\n } else {\r\n self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null;\r\n }\r\n });\r\n\r\n angular.forEach(['minMode', 'maxMode'], function( key ) {\r\n if ( $attrs[key] ) {\r\n $scope.$parent.$watch($parse($attrs[key]), function(value) {\r\n self[key] = angular.isDefined(value) ? value : $attrs[key];\r\n $scope[key] = self[key];\r\n if ((key == 'minMode' && self.modes.indexOf( $scope.datepickerMode ) < self.modes.indexOf( self[key] )) || (key == 'maxMode' && self.modes.indexOf( $scope.datepickerMode ) > self.modes.indexOf( self[key] ))) {\r\n $scope.datepickerMode = self[key];\r\n }\r\n });\r\n } else {\r\n self[key] = datepickerConfig[key] || null;\r\n $scope[key] = self[key];\r\n }\r\n });\r\n\r\n $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode;\r\n $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);\r\n\r\n if(angular.isDefined($attrs.initDate)) {\r\n this.activeDate = $scope.$parent.$eval($attrs.initDate) || new Date();\r\n $scope.$parent.$watch($attrs.initDate, function(initDate){\r\n if(initDate && (ngModelCtrl.$isEmpty(ngModelCtrl.$modelValue) || ngModelCtrl.$invalid)){\r\n self.activeDate = initDate;\r\n self.refreshView();\r\n }\r\n });\r\n } else {\r\n this.activeDate = new Date();\r\n }\r\n\r\n $scope.isActive = function(dateObject) {\r\n if (self.compare(dateObject.date, self.activeDate) === 0) {\r\n $scope.activeDateId = dateObject.uid;\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n this.init = function( ngModelCtrl_ ) {\r\n ngModelCtrl = ngModelCtrl_;\r\n\r\n ngModelCtrl.$render = function() {\r\n self.render();\r\n };\r\n };\r\n\r\n this.render = function() {\r\n if ( ngModelCtrl.$viewValue ) {\r\n var date = new Date( ngModelCtrl.$viewValue ),\r\n isValid = !isNaN(date);\r\n\r\n if ( isValid ) {\r\n this.activeDate = date;\r\n } else if ( !$datepickerSuppressError ) {\r\n $log.error('Datepicker directive: \"ng-model\" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');\r\n }\r\n }\r\n this.refreshView();\r\n };\r\n\r\n this.refreshView = function() {\r\n if ( this.element ) {\r\n this._refreshView();\r\n\r\n var date = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null;\r\n ngModelCtrl.$setValidity('dateDisabled', !date || (this.element && !this.isDisabled(date)));\r\n }\r\n };\r\n\r\n this.createDateObject = function(date, format) {\r\n var model = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null;\r\n return {\r\n date: date,\r\n label: dateFilter(date, format),\r\n selected: model && this.compare(date, model) === 0,\r\n disabled: this.isDisabled(date),\r\n current: this.compare(date, new Date()) === 0,\r\n customClass: this.customClass(date)\r\n };\r\n };\r\n\r\n this.isDisabled = function( date ) {\r\n return ((this.minDate && this.compare(date, this.minDate) < 0) || (this.maxDate && this.compare(date, this.maxDate) > 0) || ($attrs.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode})));\r\n };\r\n\r\n this.customClass = function( date ) {\r\n return $scope.customClass({date: date, mode: $scope.datepickerMode});\r\n };\r\n\r\n // Split array into smaller arrays\r\n this.split = function(arr, size) {\r\n var arrays = [];\r\n while (arr.length > 0) {\r\n arrays.push(arr.splice(0, size));\r\n }\r\n return arrays;\r\n };\r\n\r\n // Fix a hard-reprodusible bug with timezones\r\n // The bug depends on OS, browser, current timezone and current date\r\n // i.e.\r\n // var date = new Date(2014, 0, 1);\r\n // console.log(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours());\r\n // can result in \"2013 11 31 23\" because of the bug.\r\n this.fixTimeZone = function(date) {\r\n var hours = date.getHours();\r\n date.setHours(hours === 23 ? hours + 2 : 0);\r\n };\r\n\r\n $scope.select = function( date ) {\r\n if ( $scope.datepickerMode === self.minMode ) {\r\n var dt = ngModelCtrl.$viewValue ? new Date( ngModelCtrl.$viewValue ) : new Date(0, 0, 0, 0, 0, 0, 0);\r\n dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() );\r\n ngModelCtrl.$setViewValue( dt );\r\n ngModelCtrl.$render();\r\n } else {\r\n self.activeDate = date;\r\n $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) - 1 ];\r\n }\r\n };\r\n\r\n $scope.move = function( direction ) {\r\n var year = self.activeDate.getFullYear() + direction * (self.step.years || 0),\r\n month = self.activeDate.getMonth() + direction * (self.step.months || 0);\r\n self.activeDate.setFullYear(year, month, 1);\r\n self.refreshView();\r\n };\r\n\r\n $scope.toggleMode = function( direction ) {\r\n direction = direction || 1;\r\n\r\n if (($scope.datepickerMode === self.maxMode && direction === 1) || ($scope.datepickerMode === self.minMode && direction === -1)) {\r\n return;\r\n }\r\n\r\n $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) + direction ];\r\n };\r\n\r\n // Key event mapper\r\n $scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' };\r\n\r\n var focusElement = function() {\r\n self.element[0].focus();\r\n };\r\n\r\n // Listen for focus requests from popup directive\r\n $scope.$on('datepicker.focus', focusElement);\r\n\r\n $scope.keydown = function( evt ) {\r\n var key = $scope.keys[evt.which];\r\n\r\n if ( !key || evt.shiftKey || evt.altKey ) {\r\n return;\r\n }\r\n\r\n evt.preventDefault();\r\n if(!self.shortcutPropagation){\r\n evt.stopPropagation();\r\n }\r\n\r\n if (key === 'enter' || key === 'space') {\r\n if ( self.isDisabled(self.activeDate)) {\r\n return; // do nothing\r\n }\r\n $scope.select(self.activeDate);\r\n focusElement();\r\n } else if (evt.ctrlKey && (key === 'up' || key === 'down')) {\r\n $scope.toggleMode(key === 'up' ? 1 : -1);\r\n focusElement();\r\n } else {\r\n self.handleKeyDown(key, evt);\r\n self.refreshView();\r\n }\r\n };\r\n}])\r\n\r\n.directive( 'datepicker', function () {\r\n return {\r\n restrict: 'EA',\r\n replace: true,\r\n templateUrl: function(element, attrs) {\r\n return attrs.templateUrl || 'template/datepicker/datepicker.html';\r\n },\r\n scope: {\r\n datepickerMode: '=?',\r\n dateDisabled: '&',\r\n customClass: '&',\r\n shortcutPropagation: '&?'\r\n },\r\n require: ['datepicker', '^ngModel'],\r\n controller: 'DatepickerController',\r\n controllerAs: 'datepicker',\r\n link: function(scope, element, attrs, ctrls) {\r\n var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\r\n\r\n datepickerCtrl.init(ngModelCtrl);\r\n }\r\n };\r\n})\r\n\r\n.directive('daypicker', ['dateFilter', function (dateFilter) {\r\n return {\r\n restrict: 'EA',\r\n replace: true,\r\n templateUrl: 'template/datepicker/day.html',\r\n require: '^datepicker',\r\n link: function(scope, element, attrs, ctrl) {\r\n scope.showWeeks = ctrl.showWeeks;\r\n\r\n ctrl.step = { months: 1 };\r\n ctrl.element = element;\r\n\r\n var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n function getDaysInMonth( year, month ) {\r\n return ((month === 1) && (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month];\r\n }\r\n\r\n function getDates(startDate, n) {\r\n var dates = new Array(n), current = new Date(startDate), i = 0, date;\r\n while ( i < n ) {\r\n date = new Date(current);\r\n ctrl.fixTimeZone(date);\r\n dates[i++] = date;\r\n current.setDate( current.getDate() + 1 );\r\n }\r\n return dates;\r\n }\r\n\r\n ctrl._refreshView = function() {\r\n var year = ctrl.activeDate.getFullYear(),\r\n month = ctrl.activeDate.getMonth(),\r\n firstDayOfMonth = new Date(year, month, 1),\r\n difference = ctrl.startingDay - firstDayOfMonth.getDay(),\r\n numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference,\r\n firstDate = new Date(firstDayOfMonth);\r\n\r\n if ( numDisplayedFromPreviousMonth > 0 ) {\r\n firstDate.setDate( - numDisplayedFromPreviousMonth + 1 );\r\n }\r\n\r\n // 42 is the number of days on a six-month calendar\r\n var days = getDates(firstDate, 42);\r\n for (var i = 0; i < 42; i ++) {\r\n days[i] = angular.extend(ctrl.createDateObject(days[i], ctrl.formatDay), {\r\n secondary: days[i].getMonth() !== month,\r\n uid: scope.uniqueId + '-' + i\r\n });\r\n }\r\n\r\n scope.labels = new Array(7);\r\n for (var j = 0; j < 7; j++) {\r\n scope.labels[j] = {\r\n abbr: dateFilter(days[j].date, ctrl.formatDayHeader),\r\n full: dateFilter(days[j].date, 'EEEE')\r\n };\r\n }\r\n\r\n scope.title = dateFilter(ctrl.activeDate, ctrl.formatDayTitle);\r\n scope.rows = ctrl.split(days, 7);\r\n\r\n if ( scope.showWeeks ) {\r\n scope.weekNumbers = [];\r\n var thursdayIndex = (4 + 7 - ctrl.startingDay) % 7,\r\n numWeeks = scope.rows.length;\r\n for (var curWeek = 0; curWeek < numWeeks; curWeek++) {\r\n scope.weekNumbers.push(\r\n getISO8601WeekNumber( scope.rows[curWeek][thursdayIndex].date ));\r\n }\r\n }\r\n };\r\n\r\n ctrl.compare = function(date1, date2) {\r\n return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) );\r\n };\r\n\r\n function getISO8601WeekNumber(date) {\r\n var checkDate = new Date(date);\r\n checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday\r\n var time = checkDate.getTime();\r\n checkDate.setMonth(0); // Compare with Jan 1\r\n checkDate.setDate(1);\r\n return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\r\n }\r\n\r\n ctrl.handleKeyDown = function( key, evt ) {\r\n var date = ctrl.activeDate.getDate();\r\n\r\n if (key === 'left') {\r\n date = date - 1; // up\r\n } else if (key === 'up') {\r\n date = date - 7; // down\r\n } else if (key === 'right') {\r\n date = date + 1; // down\r\n } else if (key === 'down') {\r\n date = date + 7;\r\n } else if (key === 'pageup' || key === 'pagedown') {\r\n var month = ctrl.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1);\r\n ctrl.activeDate.setMonth(month, 1);\r\n date = Math.min(getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()), date);\r\n } else if (key === 'home') {\r\n date = 1;\r\n } else if (key === 'end') {\r\n date = getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth());\r\n }\r\n ctrl.activeDate.setDate(date);\r\n };\r\n\r\n ctrl.refreshView();\r\n }\r\n };\r\n}])\r\n\r\n.directive('monthpicker', ['dateFilter', function (dateFilter) {\r\n return {\r\n restrict: 'EA',\r\n replace: true,\r\n templateUrl: 'template/datepicker/month.html',\r\n require: '^datepicker',\r\n link: function(scope, element, attrs, ctrl) {\r\n ctrl.step = { years: 1 };\r\n ctrl.element = element;\r\n\r\n ctrl._refreshView = function() {\r\n var months = new Array(12),\r\n year = ctrl.activeDate.getFullYear(),\r\n date;\r\n\r\n for ( var i = 0; i < 12; i++ ) {\r\n date = new Date(year, i, 1);\r\n ctrl.fixTimeZone(date);\r\n months[i] = angular.extend(ctrl.createDateObject(date, ctrl.formatMonth), {\r\n uid: scope.uniqueId + '-' + i\r\n });\r\n }\r\n\r\n scope.title = dateFilter(ctrl.activeDate, ctrl.formatMonthTitle);\r\n scope.rows = ctrl.split(months, 3);\r\n };\r\n\r\n ctrl.compare = function(date1, date2) {\r\n return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() );\r\n };\r\n\r\n ctrl.handleKeyDown = function( key, evt ) {\r\n var date = ctrl.activeDate.getMonth();\r\n\r\n if (key === 'left') {\r\n date = date - 1; // up\r\n } else if (key === 'up') {\r\n date = date - 3; // down\r\n } else if (key === 'right') {\r\n date = date + 1; // down\r\n } else if (key === 'down') {\r\n date = date + 3;\r\n } else if (key === 'pageup' || key === 'pagedown') {\r\n var year = ctrl.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1);\r\n ctrl.activeDate.setFullYear(year);\r\n } else if (key === 'home') {\r\n date = 0;\r\n } else if (key === 'end') {\r\n date = 11;\r\n }\r\n ctrl.activeDate.setMonth(date);\r\n };\r\n\r\n ctrl.refreshView();\r\n }\r\n };\r\n}])\r\n\r\n.directive('yearpicker', ['dateFilter', function (dateFilter) {\r\n return {\r\n restrict: 'EA',\r\n replace: true,\r\n templateUrl: 'template/datepicker/year.html',\r\n require: '^datepicker',\r\n link: function(scope, element, attrs, ctrl) {\r\n var range = ctrl.yearRange;\r\n\r\n ctrl.step = { years: range };\r\n ctrl.element = element;\r\n\r\n function getStartingYear( year ) {\r\n return parseInt((year - 1) / range, 10) * range + 1;\r\n }\r\n\r\n ctrl._refreshView = function() {\r\n var years = new Array(range), date;\r\n\r\n for ( var i = 0, start = getStartingYear(ctrl.activeDate.getFullYear()); i < range; i++ ) {\r\n date = new Date(start + i, 0, 1);\r\n ctrl.fixTimeZone(date);\r\n years[i] = angular.extend(ctrl.createDateObject(date, ctrl.formatYear), {\r\n uid: scope.uniqueId + '-' + i\r\n });\r\n }\r\n\r\n scope.title = [years[0].label, years[range - 1].label].join(' - ');\r\n scope.rows = ctrl.split(years, 5);\r\n };\r\n\r\n ctrl.compare = function(date1, date2) {\r\n return date1.getFullYear() - date2.getFullYear();\r\n };\r\n\r\n ctrl.handleKeyDown = function( key, evt ) {\r\n var date = ctrl.activeDate.getFullYear();\r\n\r\n if (key === 'left') {\r\n date = date - 1; // up\r\n } else if (key === 'up') {\r\n date = date - 5; // down\r\n } else if (key === 'right') {\r\n date = date + 1; // down\r\n } else if (key === 'down') {\r\n date = date + 5;\r\n } else if (key === 'pageup' || key === 'pagedown') {\r\n date += (key === 'pageup' ? - 1 : 1) * ctrl.step.years;\r\n } else if (key === 'home') {\r\n date = getStartingYear( ctrl.activeDate.getFullYear() );\r\n } else if (key === 'end') {\r\n date = getStartingYear( ctrl.activeDate.getFullYear() ) + range - 1;\r\n }\r\n ctrl.activeDate.setFullYear(date);\r\n };\r\n\r\n ctrl.refreshView();\r\n }\r\n };\r\n}])\r\n\r\n.constant('datepickerPopupConfig', {\r\n datepickerPopup: 'yyyy-MM-dd',\r\n datepickerPopupTemplateUrl: 'template/datepicker/popup.html',\r\n datepickerTemplateUrl: 'template/datepicker/datepicker.html',\r\n html5Types: {\r\n date: 'yyyy-MM-dd',\r\n 'datetime-local': 'yyyy-MM-ddTHH:mm:ss.sss',\r\n 'month': 'yyyy-MM'\r\n },\r\n currentText: 'Hoy',\r\n clearText: 'Limpiar',\r\n closeText: 'Cerrar',\r\n closeOnDateSelection: true,\r\n appendToBody: false,\r\n showButtonBar: true,\r\n onOpenFocus: false\r\n})\r\n\r\n.directive('datepickerPopup', ['$compile', '$parse', '$document', '$rootScope', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig', '$timeout', '$locale',\r\nfunction ($compile, $parse, $document, $rootScope, $position, dateFilter, dateParser, datepickerPopupConfig, $timeout, $locale) {\r\n return {\r\n restrict: 'EA',\r\n require: 'ngModel',\r\n scope: {\r\n isOpen: '=?',\r\n currentText: '@',\r\n clearText: '@',\r\n closeText: '@',\r\n dateDisabled: '&',\r\n customClass: '&'\r\n },\r\n link: function(scope, element, attrs, ngModel) {\r\n datepickerPopupConfig.datepickerPopup = $locale.DATETIME_FORMATS.shortDate;\r\n //CUSTOMIZE: permitimos que se abra automáticamente al coger el foco\r\n var justClosed = false;\r\n if (attrs['datePickerAutoOpen'] != null) {\r\n element.attr('autocomplete','off');\r\n element.on(\"focus\", function () {\r\n if (!scope.isOpen && !justClosed) {\r\n scope.isOpen = true;\r\n if (!scope.$root.$$phase) {\r\n scope.$apply();\r\n }\r\n }\r\n justClosed = false;\r\n });\r\n element.on(\"mousedown\", function () {\r\n justClosed = scope.isOpen;\r\n scope.isOpen = !scope.isOpen;\r\n if (!scope.$root.$$phase) {\r\n scope.$apply();\r\n }\r\n });\r\n }\r\n //ENDCUSTOMIZE: permitimos que se abra automáticamente al coger el foco\r\n var dateFormat,\r\n closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? scope.$parent.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection,\r\n appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody,\r\n onOpenFocus = angular.isDefined(attrs.onOpenFocus) ? scope.$parent.$eval(attrs.onOpenFocus) : datepickerPopupConfig.onOpenFocus,\r\n datepickerPopupTemplateUrl = angular.isDefined(attrs.datepickerPopupTemplateUrl) ? attrs.datepickerPopupTemplateUrl : datepickerPopupConfig.datepickerPopupTemplateUrl,\r\n datepickerTemplateUrl = angular.isDefined(attrs.datepickerTemplateUrl) ? attrs.datepickerTemplateUrl : datepickerPopupConfig.datepickerTemplateUrl;\r\n\r\n scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar;\r\n\r\n scope.getText = function( key ) {\r\n return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text'];\r\n };\r\n\r\n var isHtml5DateInput = false;\r\n if (datepickerPopupConfig.html5Types[attrs.type]) {\r\n dateFormat = datepickerPopupConfig.html5Types[attrs.type];\r\n isHtml5DateInput = true;\r\n } else {\r\n dateFormat = attrs.datepickerPopup || datepickerPopupConfig.datepickerPopup;\r\n attrs.$observe('datepickerPopup', function(value, oldValue) {\r\n var newDateFormat = value || datepickerPopupConfig.datepickerPopup;\r\n // Invalidate the $modelValue to ensure that formatters re-run\r\n // FIXME: Refactor when PR is merged: https://github.com/angular/angular.js/pull/10764\r\n if (newDateFormat !== dateFormat) {\r\n dateFormat = newDateFormat;\r\n ngModel.$modelValue = null;\r\n\r\n if (!dateFormat) {\r\n throw new Error('datepickerPopup must have a date format specified.');\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (!dateFormat) {\r\n throw new Error('datepickerPopup must have a date format specified.');\r\n }\r\n\r\n if (isHtml5DateInput && attrs.datepickerPopup) {\r\n throw new Error('HTML5 date input types do not support custom formats.');\r\n }\r\n\r\n // popup element used to display calendar\r\n var popupEl = angular.element('
');\r\n popupEl.attr({\r\n 'ng-model': 'date',\r\n 'ng-change': 'dateSelection(date)',\r\n 'template-url': datepickerPopupTemplateUrl\r\n });\r\n\r\n function cameltoDash( string ){\r\n return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); });\r\n }\r\n\r\n // datepicker element\r\n var datepickerEl = angular.element(popupEl.children()[0]);\r\n datepickerEl.attr('template-url', datepickerTemplateUrl);\r\n\r\n if (isHtml5DateInput) {\r\n if (attrs.type == 'month') {\r\n datepickerEl.attr('datepicker-mode', '\"month\"');\r\n datepickerEl.attr('min-mode', 'month');\r\n }\r\n }\r\n\r\n if ( attrs.datepickerOptions ) {\r\n var options = scope.$parent.$eval(attrs.datepickerOptions);\r\n if(options && options.initDate) {\r\n scope.initDate = options.initDate;\r\n datepickerEl.attr( 'init-date', 'initDate' );\r\n delete options.initDate;\r\n }\r\n angular.forEach(options, function( value, option ) {\r\n datepickerEl.attr( cameltoDash(option), value );\r\n });\r\n }\r\n\r\n scope.watchData = {};\r\n angular.forEach(['minMode', 'maxMode', 'minDate', 'maxDate', 'datepickerMode', 'initDate', 'shortcutPropagation'], function( key ) {\r\n if ( attrs[key] ) {\r\n var getAttribute = $parse(attrs[key]);\r\n scope.$parent.$watch(getAttribute, function(value){\r\n scope.watchData[key] = value;\r\n });\r\n datepickerEl.attr(cameltoDash(key), 'watchData.' + key);\r\n\r\n // Propagate changes from datepicker to outside\r\n if ( key === 'datepickerMode' ) {\r\n var setAttribute = getAttribute.assign;\r\n scope.$watch('watchData.' + key, function(value, oldvalue) {\r\n if ( angular.isFunction(setAttribute) && value !== oldvalue ) {\r\n setAttribute(scope.$parent, value);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n if (attrs.dateDisabled) {\r\n datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })');\r\n }\r\n\r\n if (attrs.showWeeks) {\r\n datepickerEl.attr('show-weeks', attrs.showWeeks);\r\n }\r\n\r\n if (attrs.customClass){\r\n datepickerEl.attr('custom-class', 'customClass({ date: date, mode: mode })');\r\n }\r\n\r\n function parseDate(viewValue) {\r\n if (angular.isNumber(viewValue)) {\r\n // presumably timestamp to date object\r\n viewValue = new Date(viewValue);\r\n }\r\n\r\n if (!viewValue) {\r\n return null;\r\n } else if (angular.isDate(viewValue) && !isNaN(viewValue)) {\r\n return viewValue;\r\n } else if (angular.isString(viewValue)) {\r\n var date = dateParser.parse(viewValue, dateFormat, scope.date);\r\n if (isNaN(date)) {\r\n return undefined;\r\n } else {\r\n return date;\r\n }\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n function validator(modelValue, viewValue) {\r\n var value = modelValue || viewValue;\r\n\r\n if (!attrs.ngRequired && !value) {\r\n return true;\r\n }\r\n\r\n if (angular.isNumber(value)) {\r\n value = new Date(value);\r\n }\r\n if (!value) {\r\n return true;\r\n } else if (angular.isDate(value) && !isNaN(value)) {\r\n return true;\r\n } else if (angular.isString(value)) {\r\n var date = dateParser.parse(value, dateFormat);\r\n return !isNaN(date);\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n if (!isHtml5DateInput) {\r\n // Internal API to maintain the correct ng-invalid-[key] class\r\n ngModel.$$parserName = 'date';\r\n ngModel.$validators.date = validator;\r\n ngModel.$parsers.unshift(parseDate);\r\n ngModel.$formatters.push(function (value) {\r\n scope.date = value;\r\n return ngModel.$isEmpty(value) ? value : dateFilter(value, dateFormat);\r\n });\r\n }\r\n else {\r\n ngModel.$formatters.push(function (value) {\r\n scope.date = value;\r\n return value;\r\n });\r\n }\r\n\r\n // Inner change\r\n scope.dateSelection = function(dt) {\r\n if (angular.isDefined(dt)) {\r\n scope.date = dt;\r\n }\r\n var date = scope.date ? dateFilter(scope.date, dateFormat) : null; // Setting to NULL is necessary for form validators to function\r\n element.val(date);\r\n ngModel.$setViewValue(date);\r\n\r\n if ( closeOnDateSelection ) {\r\n scope.isOpen = false;\r\n justClosed = true;\r\n element[0].focus();\r\n }\r\n };\r\n\r\n // Detect changes in the view from the text box\r\n ngModel.$viewChangeListeners.push(function () {\r\n scope.date = dateParser.parse(ngModel.$viewValue, dateFormat, scope.date);\r\n });\r\n\r\n var documentClickBind = function(event) {\r\n if (scope.isOpen && !element[0].contains(event.target)) {\r\n scope.$apply(function() {\r\n scope.isOpen = false;\r\n });\r\n }\r\n };\r\n\r\n var inputKeydownBind = function(evt) {\r\n if (evt.which === 27 && scope.isOpen) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n scope.$apply(function() {\r\n scope.isOpen = false;\r\n });\r\n element[0].focus();\r\n } else if (evt.which === 40 && !scope.isOpen) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n scope.$apply(function() {\r\n scope.isOpen = true;\r\n });\r\n }\r\n };\r\n element.bind('keydown', inputKeydownBind);\r\n\r\n scope.keydown = function(evt) {\r\n if (evt.which === 27) {\r\n scope.isOpen = false;\r\n element[0].focus();\r\n }\r\n };\r\n\r\n scope.$watch('isOpen', function(value) {\r\n if (value) {\r\n scope.position = appendToBody ? $position.offset(element) : $position.position(element);\r\n scope.position.top = scope.position.top + element.prop('offsetHeight');\r\n\r\n $timeout(function() {\r\n if (onOpenFocus) {\r\n scope.$broadcast('datepicker.focus');\r\n }\r\n $document.bind('click', documentClickBind);\r\n }, 0, false);\r\n } else {\r\n $document.unbind('click', documentClickBind);\r\n }\r\n });\r\n\r\n scope.select = function( date ) {\r\n if (date === 'today') {\r\n var today = new Date();\r\n if (angular.isDate(scope.date)) {\r\n date = new Date(scope.date);\r\n date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate());\r\n } else {\r\n date = new Date(today.setHours(0, 0, 0, 0));\r\n }\r\n }\r\n scope.dateSelection( date );\r\n };\r\n\r\n scope.close = function() {\r\n scope.isOpen = false;\r\n element[0].focus();\r\n };\r\n\r\n var $popup = $compile(popupEl)(scope);\r\n // Prevent jQuery cache memory leak (template is now redundant after linking)\r\n popupEl.remove();\r\n\r\n if ( appendToBody ) {\r\n $document.find('body').append($popup);\r\n } else {\r\n element.after($popup);\r\n }\r\n\r\n scope.$on('$destroy', function() {\r\n if (scope.isOpen === true) {\r\n if (!$rootScope.$$phase) {\r\n scope.$apply(function() {\r\n scope.isOpen = false;\r\n });\r\n }\r\n }\r\n\r\n $popup.remove();\r\n element.unbind('keydown', inputKeydownBind);\r\n $document.unbind('click', documentClickBind);\r\n });\r\n }\r\n };\r\n}])\r\n\r\n.directive('datepickerPopupWrap', function() {\r\n return {\r\n restrict:'EA',\r\n replace: true,\r\n transclude: true,\r\n templateUrl: function(element, attrs) {\r\n return attrs.templateUrl || 'template/datepicker/popup.html';\r\n }\r\n };\r\n});\r\n\r\nangular.module('ui.bootstrap.dateparser', [])\r\n\r\n.service('dateParser', ['$log', '$locale', 'orderByFilter', function($log, $locale, orderByFilter) {\r\n // Pulled from https://github.com/mbostock/d3/blob/master/src/format/requote.js\r\n var SPECIAL_CHARACTERS_REGEXP = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\r\n\r\n this.parsers = {};\r\n\r\n var formatCodeToRegex = {\r\n 'yyyy': {\r\n regex: '\\\\d{4}',\r\n apply: function(value) { this.year = +value; }\r\n },\r\n 'yy': {\r\n regex: '\\\\d{2}',\r\n apply: function(value) { this.year = +value + 2000; }\r\n },\r\n 'y': {\r\n regex: '\\\\d{1,4}',\r\n apply: function(value) { this.year = +value; }\r\n },\r\n 'MMMM': {\r\n regex: $locale.DATETIME_FORMATS.MONTH.join('|'),\r\n apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); }\r\n },\r\n 'MMM': {\r\n regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),\r\n apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); }\r\n },\r\n 'MM': {\r\n regex: '0[1-9]|1[0-2]',\r\n apply: function(value) { this.month = value - 1; }\r\n },\r\n 'M': {\r\n regex: '[1-9]|1[0-2]',\r\n apply: function(value) { this.month = value - 1; }\r\n },\r\n 'dd': {\r\n regex: '[0-2][0-9]{1}|3[0-1]{1}',\r\n apply: function(value) { this.date = +value; }\r\n },\r\n 'd': {\r\n regex: '[1-2]?[0-9]{1}|3[0-1]{1}',\r\n apply: function(value) { this.date = +value; }\r\n },\r\n 'EEEE': {\r\n regex: $locale.DATETIME_FORMATS.DAY.join('|')\r\n },\r\n 'EEE': {\r\n regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|')\r\n },\r\n 'HH': {\r\n regex: '(?:0|1)[0-9]|2[0-3]',\r\n apply: function(value) { this.hours = +value; }\r\n },\r\n 'hh': {\r\n regex: '0[0-9]|1[0-2]',\r\n apply: function(value) { this.hours = +value; }\r\n },\r\n 'H': {\r\n regex: '1?[0-9]|2[0-3]',\r\n apply: function(value) { this.hours = +value; }\r\n },\r\n 'mm': {\r\n regex: '[0-5][0-9]',\r\n apply: function(value) { this.minutes = +value; }\r\n },\r\n 'm': {\r\n regex: '[0-9]|[1-5][0-9]',\r\n apply: function(value) { this.minutes = +value; }\r\n },\r\n 'sss': {\r\n regex: '[0-9][0-9][0-9]',\r\n apply: function(value) { this.milliseconds = +value; }\r\n },\r\n 'ss': {\r\n regex: '[0-5][0-9]',\r\n apply: function(value) { this.seconds = +value; }\r\n },\r\n 's': {\r\n regex: '[0-9]|[1-5][0-9]',\r\n apply: function(value) { this.seconds = +value; }\r\n },\r\n 'a': {\r\n regex: $locale.DATETIME_FORMATS.AMPMS.join('|'),\r\n apply: function(value) {\r\n if (this.hours === 12) {\r\n this.hours = 0;\r\n }\r\n\r\n if (value === 'PM') {\r\n this.hours += 12;\r\n }\r\n }\r\n }\r\n };\r\n\r\n function createParser(format) {\r\n var map = [], regex = format.split('');\r\n\r\n angular.forEach(formatCodeToRegex, function(data, code) {\r\n var index = format.indexOf(code);\r\n\r\n if (index > -1) {\r\n format = format.split('');\r\n\r\n regex[index] = '(' + data.regex + ')';\r\n format[index] = '$'; // Custom symbol to define consumed part of format\r\n for (var i = index + 1, n = index + code.length; i < n; i++) {\r\n regex[i] = '';\r\n format[i] = '$';\r\n }\r\n format = format.join('');\r\n\r\n map.push({ index: index, apply: data.apply });\r\n }\r\n });\r\n\r\n return {\r\n regex: new RegExp('^' + regex.join('') + '$'),\r\n map: orderByFilter(map, 'index')\r\n };\r\n }\r\n\r\n this.parse = function(input, format, baseDate) {\r\n if ( !angular.isString(input) || !format ) {\r\n return input;\r\n }\r\n\r\n format = $locale.DATETIME_FORMATS[format] || format;\r\n format = format.replace(SPECIAL_CHARACTERS_REGEXP, '\\\\$&');\r\n\r\n if ( !this.parsers[format] ) {\r\n this.parsers[format] = createParser(format);\r\n }\r\n\r\n var parser = this.parsers[format],\r\n regex = parser.regex,\r\n map = parser.map,\r\n results = input.match(regex);\r\n\r\n if ( results && results.length ) {\r\n var fields, dt;\r\n if (angular.isDate(baseDate) && !isNaN(baseDate.getTime())) {\r\n fields = {\r\n year: baseDate.getFullYear(),\r\n month: baseDate.getMonth(),\r\n date: baseDate.getDate(),\r\n hours: baseDate.getHours(),\r\n minutes: baseDate.getMinutes(),\r\n seconds: baseDate.getSeconds(),\r\n milliseconds: baseDate.getMilliseconds()\r\n };\r\n } else {\r\n if (baseDate) {\r\n $log.warn('dateparser:', 'baseDate is not a valid date');\r\n }\r\n fields = { year: 1900, month: 0, date: 1, hours: 0, minutes: 0, seconds: 0, milliseconds: 0 };\r\n }\r\n\r\n for( var i = 1, n = results.length; i < n; i++ ) {\r\n var mapper = map[i-1];\r\n if ( mapper.apply ) {\r\n mapper.apply.call(fields, results[i]);\r\n }\r\n }\r\n\r\n if ( isValid(fields.year, fields.month, fields.date) ) {\r\n dt = new Date(fields.year, fields.month, fields.date, fields.hours, fields.minutes, fields.seconds,\r\n fields.milliseconds || 0);\r\n }\r\n\r\n return dt;\r\n }\r\n };\r\n\r\n // Check if date is valid for specific month (and year for February).\r\n // Month: 0 = Jan, 1 = Feb, etc\r\n function isValid(year, month, date) {\r\n if (date < 1) {\r\n return false;\r\n }\r\n\r\n if ( month === 1 && date > 28) {\r\n return date === 29 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);\r\n }\r\n\r\n if ( month === 3 || month === 5 || month === 8 || month === 10) {\r\n return date < 31;\r\n }\r\n\r\n return true;\r\n }\r\n}]);\r\n\r\nangular.module('ui.bootstrap.position', [])\r\n\r\n/**\r\n * A set of utility methods that can be use to retrieve position of DOM elements.\r\n * It is meant to be used where we need to absolute-position DOM elements in\r\n * relation to other, existing elements (this is the case for tooltips, popovers,\r\n * typeahead suggestions etc.).\r\n */\r\n .factory('$position', ['$document', '$window', function ($document, $window) {\r\n\r\n function getStyle(el, cssprop) {\r\n if (el.currentStyle) { //IE\r\n return el.currentStyle[cssprop];\r\n } else if ($window.getComputedStyle) {\r\n return $window.getComputedStyle(el)[cssprop];\r\n }\r\n // finally try and get inline style\r\n return el.style[cssprop];\r\n }\r\n\r\n /**\r\n * Checks if a given element is statically positioned\r\n * @param element - raw DOM element\r\n */\r\n function isStaticPositioned(element) {\r\n return (getStyle(element, 'position') || 'static' ) === 'static';\r\n }\r\n\r\n /**\r\n * returns the closest, non-statically positioned parentOffset of a given element\r\n * @param element\r\n */\r\n var parentOffsetEl = function (element) {\r\n var docDomEl = $document[0];\r\n var offsetParent = element.offsetParent || docDomEl;\r\n while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) {\r\n offsetParent = offsetParent.offsetParent;\r\n }\r\n return offsetParent || docDomEl;\r\n };\r\n\r\n return {\r\n /**\r\n * Provides read-only equivalent of jQuery's position function:\r\n * http://api.jquery.com/position/\r\n */\r\n position: function (element) {\r\n var elBCR = this.offset(element);\r\n var offsetParentBCR = { top: 0, left: 0 };\r\n var offsetParentEl = parentOffsetEl(element[0]);\r\n if (offsetParentEl != $document[0]) {\r\n offsetParentBCR = this.offset(angular.element(offsetParentEl));\r\n offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop;\r\n offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft;\r\n }\r\n\r\n var boundingClientRect = element[0].getBoundingClientRect();\r\n return {\r\n width: boundingClientRect.width || element.prop('offsetWidth'),\r\n height: boundingClientRect.height || element.prop('offsetHeight'),\r\n top: elBCR.top - offsetParentBCR.top,\r\n left: elBCR.left - offsetParentBCR.left\r\n };\r\n },\r\n\r\n /**\r\n * Provides read-only equivalent of jQuery's offset function:\r\n * http://api.jquery.com/offset/\r\n */\r\n offset: function (element) {\r\n var boundingClientRect = element[0].getBoundingClientRect();\r\n return {\r\n width: boundingClientRect.width || element.prop('offsetWidth'),\r\n height: boundingClientRect.height || element.prop('offsetHeight'),\r\n top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop),\r\n left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft)\r\n };\r\n },\r\n\r\n /**\r\n * Provides coordinates for the targetEl in relation to hostEl\r\n */\r\n positionElements: function (hostEl, targetEl, positionStr, appendToBody) {\r\n\r\n var positionStrParts = positionStr.split('-');\r\n var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center';\r\n\r\n var hostElPos,\r\n targetElWidth,\r\n targetElHeight,\r\n targetElPos;\r\n\r\n hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl);\r\n\r\n targetElWidth = targetEl.prop('offsetWidth');\r\n targetElHeight = targetEl.prop('offsetHeight');\r\n\r\n var shiftWidth = {\r\n center: function () {\r\n return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2;\r\n },\r\n left: function () {\r\n return hostElPos.left;\r\n },\r\n right: function () {\r\n return hostElPos.left + hostElPos.width;\r\n }\r\n };\r\n\r\n var shiftHeight = {\r\n center: function () {\r\n return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2;\r\n },\r\n top: function () {\r\n return hostElPos.top;\r\n },\r\n bottom: function () {\r\n return hostElPos.top + hostElPos.height;\r\n }\r\n };\r\n\r\n switch (pos0) {\r\n case 'right':\r\n targetElPos = {\r\n top: shiftHeight[pos1](),\r\n left: shiftWidth[pos0]()\r\n };\r\n break;\r\n case 'left':\r\n targetElPos = {\r\n top: shiftHeight[pos1](),\r\n left: hostElPos.left - targetElWidth\r\n };\r\n break;\r\n case 'bottom':\r\n targetElPos = {\r\n top: shiftHeight[pos0](),\r\n left: shiftWidth[pos1]()\r\n };\r\n break;\r\n default:\r\n targetElPos = {\r\n top: hostElPos.top - targetElHeight,\r\n left: shiftWidth[pos1]()\r\n };\r\n break;\r\n }\r\n\r\n return targetElPos;\r\n }\r\n };\r\n }]);\r\n\r\nangular.module('ui.bootstrap.timepicker', [])\r\n\r\n.constant('timepickerConfig', {\r\n hourStep: 1,\r\n minuteStep: 1,\r\n showMeridian: true,\r\n meridians: null,\r\n readonlyInput: false,\r\n mousewheel: true,\r\n arrowkeys: true,\r\n showSpinners: true\r\n})\r\n\r\n.controller('TimepickerController', ['$scope', '$attrs', '$parse', '$log', '$locale', 'timepickerConfig', function($scope, $attrs, $parse, $log, $locale, timepickerConfig) {\r\n var selected = new Date(),\r\n ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl\r\n meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS;\r\n\r\n this.init = function( ngModelCtrl_, inputs ) {\r\n ngModelCtrl = ngModelCtrl_;\r\n ngModelCtrl.$render = this.render;\r\n\r\n ngModelCtrl.$formatters.unshift(function (modelValue) {\r\n return modelValue ? new Date( modelValue ) : null;\r\n });\r\n\r\n var hoursInputEl = inputs.eq(0),\r\n minutesInputEl = inputs.eq(1);\r\n\r\n var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel;\r\n if ( mousewheel ) {\r\n this.setupMousewheelEvents( hoursInputEl, minutesInputEl );\r\n }\r\n\r\n var arrowkeys = angular.isDefined($attrs.arrowkeys) ? $scope.$parent.$eval($attrs.arrowkeys) : timepickerConfig.arrowkeys;\r\n if (arrowkeys) {\r\n this.setupArrowkeyEvents( hoursInputEl, minutesInputEl );\r\n }\r\n\r\n $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput;\r\n this.setupInputEvents( hoursInputEl, minutesInputEl );\r\n };\r\n\r\n var hourStep = timepickerConfig.hourStep;\r\n if ($attrs.hourStep) {\r\n $scope.$parent.$watch($parse($attrs.hourStep), function(value) {\r\n hourStep = parseInt(value, 10);\r\n });\r\n }\r\n\r\n var minuteStep = timepickerConfig.minuteStep;\r\n if ($attrs.minuteStep) {\r\n $scope.$parent.$watch($parse($attrs.minuteStep), function(value) {\r\n minuteStep = parseInt(value, 10);\r\n });\r\n }\r\n\r\n var min;\r\n $scope.$parent.$watch($parse($attrs.min), function(value) {\r\n var dt = new Date(value);\r\n min = isNaN(dt) ? undefined : dt;\r\n });\r\n\r\n var max;\r\n $scope.$parent.$watch($parse($attrs.max), function(value) {\r\n var dt = new Date(value);\r\n max = isNaN(dt) ? undefined : dt;\r\n });\r\n\r\n $scope.noIncrementHours = function() {\r\n var incrementedSelected = addMinutes(selected, hourStep * 60);\r\n return incrementedSelected > max ||\r\n (incrementedSelected < selected && incrementedSelected < min);\r\n };\r\n\r\n $scope.noDecrementHours = function() {\r\n var decrementedSelected = addMinutes(selected, - hourStep * 60);\r\n return decrementedSelected < min ||\r\n (decrementedSelected > selected && decrementedSelected > max);\r\n };\r\n\r\n $scope.noIncrementMinutes = function() {\r\n var incrementedSelected = addMinutes(selected, minuteStep);\r\n return incrementedSelected > max ||\r\n (incrementedSelected < selected && incrementedSelected < min);\r\n };\r\n\r\n $scope.noDecrementMinutes = function() {\r\n var decrementedSelected = addMinutes(selected, - minuteStep);\r\n return decrementedSelected < min ||\r\n (decrementedSelected > selected && decrementedSelected > max);\r\n };\r\n\r\n $scope.noToggleMeridian = function() {\r\n if (selected.getHours() < 13) {\r\n return addMinutes(selected, 12 * 60) > max;\r\n } else {\r\n return addMinutes(selected, - 12 * 60) < min;\r\n }\r\n };\r\n\r\n // 12H / 24H mode\r\n $scope.showMeridian = timepickerConfig.showMeridian;\r\n if ($attrs.showMeridian) {\r\n $scope.$parent.$watch($parse($attrs.showMeridian), function(value) {\r\n $scope.showMeridian = !!value;\r\n\r\n //CUSTOMIZE: Evitamos que renderize el valor si no tiene correcto las horas y los minutos (aceptamos null como valido)\r\n //if ( ngModelCtrl.$error.time ) {\r\n if ($scope.invalidHours || $scope.invalidMinutes) {\r\n //FIN CUSTOMIZE\r\n\r\n // Evaluate from template\r\n var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate();\r\n if (angular.isDefined( hours ) && angular.isDefined( minutes )) {\r\n selected.setHours( hours );\r\n refresh();\r\n }\r\n } else {\r\n updateTemplate();\r\n }\r\n });\r\n }\r\n\r\n // Get $scope.hours in 24H mode if valid\r\n function getHoursFromTemplate ( ) {\r\n var hours = parseInt( $scope.hours, 10 );\r\n var valid = ( $scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24);\r\n if ( !valid ) {\r\n return undefined;\r\n }\r\n\r\n if ( $scope.showMeridian ) {\r\n if ( hours === 12 ) {\r\n hours = 0;\r\n }\r\n if ( $scope.meridian === meridians[1] ) {\r\n hours = hours + 12;\r\n }\r\n }\r\n return hours;\r\n }\r\n\r\n function getMinutesFromTemplate() {\r\n var minutes = parseInt($scope.minutes, 10);\r\n return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined;\r\n }\r\n\r\n function pad( value ) {\r\n return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value.toString();\r\n }\r\n\r\n // Respond on mousewheel spin\r\n this.setupMousewheelEvents = function( hoursInputEl, minutesInputEl ) {\r\n var isScrollingUp = function(e) {\r\n if (e.originalEvent) {\r\n e = e.originalEvent;\r\n }\r\n //pick correct delta variable depending on event\r\n var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY;\r\n return (e.detail || delta > 0);\r\n };\r\n\r\n hoursInputEl.bind('mousewheel wheel', function(e) {\r\n $scope.$apply( (isScrollingUp(e)) ? $scope.incrementHours() : $scope.decrementHours() );\r\n e.preventDefault();\r\n });\r\n\r\n minutesInputEl.bind('mousewheel wheel', function(e) {\r\n $scope.$apply( (isScrollingUp(e)) ? $scope.incrementMinutes() : $scope.decrementMinutes() );\r\n e.preventDefault();\r\n });\r\n\r\n };\r\n\r\n // Respond on up/down arrowkeys\r\n this.setupArrowkeyEvents = function( hoursInputEl, minutesInputEl ) {\r\n hoursInputEl.bind('keydown', function(e) {\r\n if ( e.which === 38 ) { // up\r\n e.preventDefault();\r\n $scope.incrementHours();\r\n $scope.$apply();\r\n }\r\n else if ( e.which === 40 ) { // down\r\n e.preventDefault();\r\n $scope.decrementHours();\r\n $scope.$apply();\r\n }\r\n });\r\n\r\n minutesInputEl.bind('keydown', function(e) {\r\n if ( e.which === 38 ) { // up\r\n e.preventDefault();\r\n $scope.incrementMinutes();\r\n $scope.$apply();\r\n }\r\n else if ( e.which === 40 ) { // down\r\n e.preventDefault();\r\n $scope.decrementMinutes();\r\n $scope.$apply();\r\n }\r\n });\r\n };\r\n\r\n this.setupInputEvents = function( hoursInputEl, minutesInputEl ) {\r\n if ( $scope.readonlyInput ) {\r\n $scope.updateHours = angular.noop;\r\n $scope.updateMinutes = angular.noop;\r\n return;\r\n }\r\n\r\n var invalidate = function(invalidHours, invalidMinutes) {\r\n ngModelCtrl.$setViewValue( null );\r\n if (angular.isDefined(invalidHours)) {\r\n $scope.invalidHours = invalidHours;\r\n }\r\n if (angular.isDefined(invalidMinutes)) {\r\n $scope.invalidMinutes = invalidMinutes;\r\n }\r\n };\r\n\r\n $scope.updateHours = function() {\r\n var hours = getHoursFromTemplate();\r\n\r\n //CUSTOMIZE: Si no hay nada metido en los minutos pon�a los minutos actuales en vez de 0\r\n var minutes = getMinutesFromTemplate();\r\n if (minutes == null) {\r\n selected.setMinutes(0);\r\n }\r\n selected.setSeconds(0);\r\n //FIN CUSTOMIZE\r\n\r\n\r\n if ( angular.isDefined(hours) ) {\r\n selected.setHours( hours );\r\n if (selected < min || selected > max) {\r\n invalidate(true);\r\n ngModelCtrl.$setValidity('time', false);\r\n } else {\r\n refresh( 'h' );\r\n }\r\n } else {\r\n invalidate(true);\r\n }\r\n };\r\n\r\n hoursInputEl.bind('blur', function(e) {\r\n if ( !$scope.invalidHours && $scope.hours < 10) {\r\n $scope.$apply( function() {\r\n $scope.hours = pad( $scope.hours );\r\n });\r\n }\r\n });\r\n\r\n $scope.updateMinutes = function() {\r\n var minutes = getMinutesFromTemplate();\r\n\r\n //CUSTOMIZE: Si no hay nada metido en las horas pon�a las hora actual en vez de 0\r\n var hours = getHoursFromTemplate();\r\n if (hours == null) {\r\n selected.setHours(0);\r\n }\r\n //FIN CUSTOMIZE\r\n\r\n if ( angular.isDefined(minutes) ) {\r\n selected.setMinutes( minutes );\r\n if (selected < min || selected > max) {\r\n invalidate(undefined, true);\r\n ngModelCtrl.$setValidity('time', false);\r\n } else {\r\n refresh( 'm' );\r\n }\r\n } else {\r\n invalidate(undefined, true);\r\n }\r\n };\r\n\r\n minutesInputEl.bind('blur', function(e) {\r\n if ( !$scope.invalidMinutes && $scope.minutes < 10 ) {\r\n $scope.$apply( function() {\r\n $scope.minutes = pad( $scope.minutes );\r\n });\r\n }\r\n });\r\n\r\n };\r\n\r\n this.render = function() {\r\n var date = ngModelCtrl.$viewValue;\r\n\r\n if (isNaN(date)) {\r\n ngModelCtrl.$setValidity('time', false);\r\n $log.error('Timepicker directive: \"ng-model\" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');\r\n //CUSTOMIZE: aceptamos como v�lidas las fecha null\r\n } else if (date == null) {\r\n ngModelCtrl.$setValidity('time', true);\r\n $scope.invalidHours = true;\r\n $scope.invalidMinutes = true;\r\n $scope.hours = null;\r\n $scope.minutes = null;\r\n }\r\n //FIN CUSTOMIZE\r\n else {\r\n if ( date ) {\r\n date.setSeconds(0);\r\n date.setMilliseconds(0);\r\n selected = date;\r\n }\r\n\r\n if (selected < min || selected > max) {\r\n ngModelCtrl.$setValidity('time', false);\r\n $scope.invalidHours = true;\r\n $scope.invalidMinutes = true;\r\n } else {\r\n makeValid();\r\n }\r\n updateTemplate();\r\n }\r\n };\r\n\r\n // Call internally when we know that model is valid.\r\n function refresh( keyboardChange ) {\r\n makeValid();\r\n ngModelCtrl.$setViewValue( new Date(selected) );\r\n updateTemplate( keyboardChange );\r\n }\r\n\r\n function makeValid() {\r\n ngModelCtrl.$setValidity('time', true);\r\n $scope.invalidHours = false;\r\n $scope.invalidMinutes = false;\r\n }\r\n\r\n function updateTemplate( keyboardChange ) {\r\n var hours = selected.getHours(), minutes = selected.getMinutes();\r\n\r\n if ( $scope.showMeridian ) {\r\n hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system\r\n }\r\n\r\n $scope.hours = keyboardChange === 'h' ? hours : pad(hours);\r\n if (keyboardChange !== 'm') {\r\n $scope.minutes = pad(minutes);\r\n }\r\n $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\r\n }\r\n\r\n function addMinutes(date, minutes) {\r\n var dt = new Date(date.getTime() + minutes * 60000);\r\n var newDate = new Date(date);\r\n newDate.setHours(dt.getHours(), dt.getMinutes());\r\n return newDate;\r\n }\r\n\r\n function addMinutesToSelected( minutes ) {\r\n selected = addMinutes( selected, minutes );\r\n refresh();\r\n }\r\n \r\n $scope.showSpinners = angular.isDefined($attrs.showSpinners) ?\r\n $scope.$parent.$eval($attrs.showSpinners) : timepickerConfig.showSpinners;\r\n \r\n $scope.incrementHours = function() {\r\n if (!$scope.noIncrementHours()) {\r\n addMinutesToSelected(hourStep * 60);\r\n }\r\n };\r\n $scope.decrementHours = function() {\r\n if (!$scope.noDecrementHours()) {\r\n addMinutesToSelected(-hourStep * 60);\r\n }\r\n };\r\n $scope.incrementMinutes = function() {\r\n if (!$scope.noIncrementMinutes()) {\r\n addMinutesToSelected(minuteStep);\r\n }\r\n };\r\n $scope.decrementMinutes = function() {\r\n if (!$scope.noDecrementMinutes()) {\r\n addMinutesToSelected(-minuteStep);\r\n }\r\n };\r\n $scope.toggleMeridian = function() {\r\n if (!$scope.noToggleMeridian()) {\r\n addMinutesToSelected(12 * 60 * (selected.getHours() < 12 ? 1 : -1));\r\n }\r\n };\r\n}])\r\n\r\n.directive('timepicker', function () {\r\n return {\r\n restrict: 'EA',\r\n require: ['timepicker', '?^ngModel'],\r\n controller:'TimepickerController',\r\n replace: true,\r\n scope: {},\r\n templateUrl: 'template/timepicker/timepicker.html',\r\n link: function(scope, element, attrs, ctrls) {\r\n var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\r\n\r\n if ( ngModelCtrl ) {\r\n timepickerCtrl.init( ngModelCtrl, element.find('input') );\r\n }\r\n }\r\n };\r\n});\r\n\r\nangular.module(\"template/datepicker/datepicker.html\", []).run([\"$templateCache\", function($templateCache) {\r\n $templateCache.put(\"template/datepicker/datepicker.html\",\r\n \"
\\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \"
\");\r\n}]);\r\n\r\nangular.module(\"template/datepicker/day.html\", []).run([\"$templateCache\", function($templateCache) {\r\n $templateCache.put(\"template/datepicker/day.html\",\r\n \"\\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \"
{{::label.abbr}}
{{ weekNumbers[$index] }}\\n\" +\r\n \" \\n\" +\r\n \"
\\n\" +\r\n \"\");\r\n}]);\r\n\r\nangular.module(\"template/datepicker/month.html\", []).run([\"$templateCache\", function($templateCache) {\r\n $templateCache.put(\"template/datepicker/month.html\",\r\n \"\\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \"
\\n\" +\r\n \" \\n\" +\r\n \"
\\n\" +\r\n \"\");\r\n}]);\r\n\r\nangular.module(\"template/datepicker/popup.html\", []).run([\"$templateCache\", function($templateCache) {\r\n $templateCache.put(\"template/datepicker/popup.html\",\r\n \"\\n\" +\r\n \"\");\r\n}]);\r\n\r\nangular.module(\"template/datepicker/year.html\", []).run([\"$templateCache\", function($templateCache) {\r\n $templateCache.put(\"template/datepicker/year.html\",\r\n \"\\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \"
\\n\" +\r\n \" \\n\" +\r\n \"
\\n\" +\r\n \"\");\r\n}]);\r\n\r\nangular.module(\"template/timepicker/timepicker.html\", []).run([\"$templateCache\", function($templateCache) {\r\n $templateCache.put(\"template/timepicker/timepicker.html\",\r\n \"\\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \" \\n\" +\r\n \"
 
\\n\" +\r\n \" \\n\" +\r\n \" :\\n\" +\r\n \" \\n\" +\r\n \"
 
\\n\" +\r\n \"\");\r\n}]);\r\n"]}