{ "version": 3, "sources": ["../ui/web_modules/angular-ui-bootstrap.js"], "sourcesContent": ["/*\n * angular-ui-bootstrap\n * http://angular-ui.github.io/bootstrap/\n\n * Version: 1.2.0 - 2016-02-26\n * License: MIT\n */angular.module(\"ui.bootstrap\", [\"ui.bootstrap.tpls\", \"ui.bootstrap.collapse\",\"ui.bootstrap.accordion\",\"ui.bootstrap.alert\",\"ui.bootstrap.buttons\",\"ui.bootstrap.carousel\",\"ui.bootstrap.dateparser\",\"ui.bootstrap.isClass\",\"ui.bootstrap.position\",\"ui.bootstrap.datepicker\",\"ui.bootstrap.debounce\",\"ui.bootstrap.dropdown\",\"ui.bootstrap.stackedMap\",\"ui.bootstrap.modal\",\"ui.bootstrap.paging\",\"ui.bootstrap.pager\",\"ui.bootstrap.pagination\",\"ui.bootstrap.tooltip\",\"ui.bootstrap.popover\",\"ui.bootstrap.progressbar\",\"ui.bootstrap.rating\",\"ui.bootstrap.tabs\",\"ui.bootstrap.timepicker\",\"ui.bootstrap.typeahead\"]);\nangular.module(\"ui.bootstrap.tpls\", [\"uib/template/accordion/accordion-group.html\",\"uib/template/accordion/accordion.html\",\"uib/template/alert/alert.html\",\"uib/template/carousel/carousel.html\",\"uib/template/carousel/slide.html\",\"uib/template/datepicker/datepicker.html\",\"uib/template/datepicker/day.html\",\"uib/template/datepicker/month.html\",\"uib/template/datepicker/popup.html\",\"uib/template/datepicker/year.html\",\"uib/template/modal/backdrop.html\",\"uib/template/modal/window.html\",\"uib/template/pager/pager.html\",\"uib/template/pagination/pagination.html\",\"uib/template/tooltip/tooltip-html-popup.html\",\"uib/template/tooltip/tooltip-popup.html\",\"uib/template/tooltip/tooltip-template-popup.html\",\"uib/template/popover/popover-html.html\",\"uib/template/popover/popover-template.html\",\"uib/template/popover/popover.html\",\"uib/template/progressbar/bar.html\",\"uib/template/progressbar/progress.html\",\"uib/template/progressbar/progressbar.html\",\"uib/template/rating/rating.html\",\"uib/template/tabs/tab.html\",\"uib/template/tabs/tabset.html\",\"uib/template/timepicker/timepicker.html\",\"uib/template/typeahead/typeahead-match.html\",\"uib/template/typeahead/typeahead-popup.html\"]);\nangular.module('ui.bootstrap.collapse', [])\n\n .directive('uibCollapse', ['$animate', '$q', '$parse', '$injector', function($animate, $q, $parse, $injector) {\n var $animateCss = $injector.has('$animateCss') ? $injector.get('$animateCss') : null;\n return {\n link: function(scope, element, attrs) {\n var expandingExpr = $parse(attrs.expanding),\n expandedExpr = $parse(attrs.expanded),\n collapsingExpr = $parse(attrs.collapsing),\n collapsedExpr = $parse(attrs.collapsed);\n\n if (!scope.$eval(attrs.uibCollapse)) {\n element.addClass('in')\n .addClass('collapse')\n .attr('aria-expanded', true)\n .attr('aria-hidden', false)\n .css({height: 'auto'});\n }\n\n function expand() {\n if (element.hasClass('collapse') && element.hasClass('in')) {\n return;\n }\n\n $q.resolve(expandingExpr(scope))\n .then(function() {\n element.removeClass('collapse')\n .addClass('collapsing')\n .attr('aria-expanded', true)\n .attr('aria-hidden', false);\n\n if ($animateCss) {\n $animateCss(element, {\n addClass: 'in',\n easing: 'ease',\n to: { height: element[0].scrollHeight + 'px' }\n }).start()['finally'](expandDone);\n } else {\n $animate.addClass(element, 'in', {\n to: { height: element[0].scrollHeight + 'px' }\n }).then(expandDone);\n }\n });\n }\n\n function expandDone() {\n element.removeClass('collapsing')\n .addClass('collapse')\n .css({height: 'auto'});\n expandedExpr(scope);\n }\n\n function collapse() {\n if (!element.hasClass('collapse') && !element.hasClass('in')) {\n return collapseDone();\n }\n\n $q.resolve(collapsingExpr(scope))\n .then(function() {\n element\n // IMPORTANT: The height must be set before adding \"collapsing\" class.\n // Otherwise, the browser attempts to animate from height 0 (in\n // collapsing class) to the given height here.\n .css({height: element[0].scrollHeight + 'px'})\n // initially all panel collapse have the collapse class, this removal\n // prevents the animation from jumping to collapsed state\n .removeClass('collapse')\n .addClass('collapsing')\n .attr('aria-expanded', false)\n .attr('aria-hidden', true);\n\n if ($animateCss) {\n $animateCss(element, {\n removeClass: 'in',\n to: {height: '0'}\n }).start()['finally'](collapseDone);\n } else {\n $animate.removeClass(element, 'in', {\n to: {height: '0'}\n }).then(collapseDone);\n }\n });\n }\n\n function collapseDone() {\n element.css({height: '0'}); // Required so that collapse works when animation is disabled\n element.removeClass('collapsing')\n .addClass('collapse');\n collapsedExpr(scope);\n }\n\n scope.$watch(attrs.uibCollapse, function(shouldCollapse) {\n if (shouldCollapse) {\n collapse();\n } else {\n expand();\n }\n });\n }\n };\n }]);\n\nangular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse'])\n\n.constant('uibAccordionConfig', {\n closeOthers: true\n})\n\n.controller('UibAccordionController', ['$scope', '$attrs', 'uibAccordionConfig', function($scope, $attrs, accordionConfig) {\n // This array keeps track of the accordion groups\n this.groups = [];\n\n // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to\n this.closeOthers = function(openGroup) {\n var closeOthers = angular.isDefined($attrs.closeOthers) ?\n $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers;\n if (closeOthers) {\n angular.forEach(this.groups, function(group) {\n if (group !== openGroup) {\n group.isOpen = false;\n }\n });\n }\n };\n\n // This is called from the accordion-group directive to add itself to the accordion\n this.addGroup = function(groupScope) {\n var that = this;\n this.groups.push(groupScope);\n\n groupScope.$on('$destroy', function(event) {\n that.removeGroup(groupScope);\n });\n };\n\n // This is called from the accordion-group directive when to remove itself\n this.removeGroup = function(group) {\n var index = this.groups.indexOf(group);\n if (index !== -1) {\n this.groups.splice(index, 1);\n }\n };\n}])\n\n// The accordion directive simply sets up the directive controller\n// and adds an accordion CSS class to itself element.\n.directive('uibAccordion', function() {\n return {\n controller: 'UibAccordionController',\n controllerAs: 'accordion',\n transclude: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/accordion/accordion.html';\n }\n };\n})\n\n// The accordion-group directive indicates a block of html that will expand and collapse in an accordion\n.directive('uibAccordionGroup', function() {\n return {\n require: '^uibAccordion', // We need this directive to be inside an accordion\n transclude: true, // It transcludes the contents of the directive into the template\n replace: true, // The element containing the directive will be replaced with the template\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/accordion/accordion-group.html';\n },\n scope: {\n heading: '@', // Interpolate the heading attribute onto this scope\n isOpen: '=?',\n isDisabled: '=?'\n },\n controller: function() {\n this.setHeading = function(element) {\n this.heading = element;\n };\n },\n link: function(scope, element, attrs, accordionCtrl) {\n accordionCtrl.addGroup(scope);\n\n scope.openClass = attrs.openClass || 'panel-open';\n scope.panelClass = attrs.panelClass || 'panel-default';\n scope.$watch('isOpen', function(value) {\n element.toggleClass(scope.openClass, !!value);\n if (value) {\n accordionCtrl.closeOthers(scope);\n }\n });\n\n scope.toggleOpen = function($event) {\n if (!scope.isDisabled) {\n if (!$event || $event.which === 32) {\n scope.isOpen = !scope.isOpen;\n }\n }\n };\n\n var id = 'accordiongroup-' + scope.$id + '-' + Math.floor(Math.random() * 10000);\n scope.headingId = id + '-tab';\n scope.panelId = id + '-panel';\n }\n };\n})\n\n// Use accordion-heading below an accordion-group to provide a heading containing HTML\n.directive('uibAccordionHeading', function() {\n return {\n transclude: true, // Grab the contents to be used as the heading\n template: '', // In effect remove this element!\n replace: true,\n require: '^uibAccordionGroup',\n link: function(scope, element, attrs, accordionGroupCtrl, transclude) {\n // Pass the heading to the accordion-group controller\n // so that it can be transcluded into the right place in the template\n // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat]\n accordionGroupCtrl.setHeading(transclude(scope, angular.noop));\n }\n };\n})\n\n// Use in the accordion-group template to indicate where you want the heading to be transcluded\n// You must provide the property on the accordion-group controller that will hold the transcluded element\n.directive('uibAccordionTransclude', function() {\n return {\n require: '^uibAccordionGroup',\n link: function(scope, element, attrs, controller) {\n scope.$watch(function() { return controller[attrs.uibAccordionTransclude]; }, function(heading) {\n if (heading) {\n var elem = angular.element(element[0].querySelector('[uib-accordion-header]'));\n elem.html('');\n elem.append(heading);\n }\n });\n }\n };\n});\n\nangular.module('ui.bootstrap.alert', [])\n\n.controller('UibAlertController', ['$scope', '$attrs', '$interpolate', '$timeout', function($scope, $attrs, $interpolate, $timeout) {\n $scope.closeable = !!$attrs.close;\n\n var dismissOnTimeout = angular.isDefined($attrs.dismissOnTimeout) ?\n $interpolate($attrs.dismissOnTimeout)($scope.$parent) : null;\n\n if (dismissOnTimeout) {\n $timeout(function() {\n $scope.close();\n }, parseInt(dismissOnTimeout, 10));\n }\n}])\n\n.directive('uibAlert', function() {\n return {\n controller: 'UibAlertController',\n controllerAs: 'alert',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/alert/alert.html';\n },\n transclude: true,\n replace: true,\n scope: {\n type: '@',\n close: '&'\n }\n };\n});\n\nangular.module('ui.bootstrap.buttons', [])\n\n.constant('uibButtonConfig', {\n activeClass: 'active',\n toggleEvent: 'click'\n})\n\n.controller('UibButtonsController', ['uibButtonConfig', function(buttonConfig) {\n this.activeClass = buttonConfig.activeClass || 'active';\n this.toggleEvent = buttonConfig.toggleEvent || 'click';\n}])\n\n.directive('uibBtnRadio', ['$parse', function($parse) {\n return {\n require: ['uibBtnRadio', 'ngModel'],\n controller: 'UibButtonsController',\n controllerAs: 'buttons',\n link: function(scope, element, attrs, ctrls) {\n var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n var uncheckableExpr = $parse(attrs.uibUncheckable);\n\n element.find('input').css({display: 'none'});\n\n //model -> UI\n ngModelCtrl.$render = function() {\n element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.uibBtnRadio)));\n };\n\n //ui->model\n element.on(buttonsCtrl.toggleEvent, function() {\n if (attrs.disabled) {\n return;\n }\n\n var isActive = element.hasClass(buttonsCtrl.activeClass);\n\n if (!isActive || angular.isDefined(attrs.uncheckable)) {\n scope.$apply(function() {\n ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.uibBtnRadio));\n ngModelCtrl.$render();\n });\n }\n });\n\n if (attrs.uibUncheckable) {\n scope.$watch(uncheckableExpr, function(uncheckable) {\n attrs.$set('uncheckable', uncheckable ? '' : undefined);\n });\n }\n }\n };\n}])\n\n.directive('uibBtnCheckbox', function() {\n return {\n require: ['uibBtnCheckbox', 'ngModel'],\n controller: 'UibButtonsController',\n controllerAs: 'button',\n link: function(scope, element, attrs, ctrls) {\n var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n element.find('input').css({display: 'none'});\n\n function getTrueValue() {\n return getCheckboxValue(attrs.btnCheckboxTrue, true);\n }\n\n function getFalseValue() {\n return getCheckboxValue(attrs.btnCheckboxFalse, false);\n }\n\n function getCheckboxValue(attribute, defaultValue) {\n return angular.isDefined(attribute) ? scope.$eval(attribute) : defaultValue;\n }\n\n //model -> UI\n ngModelCtrl.$render = function() {\n element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue()));\n };\n\n //ui->model\n element.on(buttonsCtrl.toggleEvent, function() {\n if (attrs.disabled) {\n return;\n }\n\n scope.$apply(function() {\n ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());\n ngModelCtrl.$render();\n });\n });\n }\n };\n});\n\nangular.module('ui.bootstrap.carousel', [])\n\n.controller('UibCarouselController', ['$scope', '$element', '$interval', '$timeout', '$animate', function($scope, $element, $interval, $timeout, $animate) {\n var self = this,\n slides = self.slides = $scope.slides = [],\n SLIDE_DIRECTION = 'uib-slideDirection',\n currentIndex = $scope.active,\n currentInterval, isPlaying, bufferedTransitions = [];\n\n var destroyed = false;\n\n self.addSlide = function(slide, element) {\n slides.push({\n slide: slide,\n element: element\n });\n slides.sort(function(a, b) {\n return +a.slide.index > +b.slide.index;\n });\n //if this is the first slide or the slide is set to active, select it\n if (slide.index === $scope.active || slides.length === 1 && !angular.isNumber($scope.active)) {\n if ($scope.$currentTransition) {\n $scope.$currentTransition = null;\n }\n\n currentIndex = slide.index;\n $scope.active = slide.index;\n setActive(currentIndex);\n self.select(slides[findSlideIndex(slide)]);\n if (slides.length === 1) {\n $scope.play();\n }\n }\n };\n\n self.getCurrentIndex = function() {\n for (var i = 0; i < slides.length; i++) {\n if (slides[i].slide.index === currentIndex) {\n return i;\n }\n }\n };\n\n self.next = $scope.next = function() {\n var newIndex = (self.getCurrentIndex() + 1) % slides.length;\n\n if (newIndex === 0 && $scope.noWrap()) {\n $scope.pause();\n return;\n }\n\n return self.select(slides[newIndex], 'next');\n };\n\n self.prev = $scope.prev = function() {\n var newIndex = self.getCurrentIndex() - 1 < 0 ? slides.length - 1 : self.getCurrentIndex() - 1;\n\n if ($scope.noWrap() && newIndex === slides.length - 1) {\n $scope.pause();\n return;\n }\n\n return self.select(slides[newIndex], 'prev');\n };\n\n self.removeSlide = function(slide) {\n var index = findSlideIndex(slide);\n\n var bufferedIndex = bufferedTransitions.indexOf(slides[index]);\n if (bufferedIndex !== -1) {\n bufferedTransitions.splice(bufferedIndex, 1);\n }\n\n //get the index of the slide inside the carousel\n slides.splice(index, 1);\n if (slides.length > 0 && currentIndex === index) {\n if (index >= slides.length) {\n currentIndex = slides.length - 1;\n $scope.active = currentIndex;\n setActive(currentIndex);\n self.select(slides[slides.length - 1]);\n } else {\n currentIndex = index;\n $scope.active = currentIndex;\n setActive(currentIndex);\n self.select(slides[index]);\n }\n } else if (currentIndex > index) {\n currentIndex--;\n $scope.active = currentIndex;\n }\n\n //clean the active value when no more slide\n if (slides.length === 0) {\n currentIndex = null;\n $scope.active = null;\n clearBufferedTransitions();\n }\n };\n\n /* direction: \"prev\" or \"next\" */\n self.select = $scope.select = function(nextSlide, direction) {\n var nextIndex = findSlideIndex(nextSlide.slide);\n //Decide direction if it's not given\n if (direction === undefined) {\n direction = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\n }\n //Prevent this user-triggered transition from occurring if there is already one in progress\n if (nextSlide.slide.index !== currentIndex &&\n !$scope.$currentTransition) {\n goNext(nextSlide.slide, nextIndex, direction);\n } else if (nextSlide && nextSlide.slide.index !== currentIndex && $scope.$currentTransition) {\n bufferedTransitions.push(slides[nextIndex]);\n }\n };\n\n /* Allow outside people to call indexOf on slides array */\n $scope.indexOfSlide = function(slide) {\n return +slide.slide.index;\n };\n\n $scope.isActive = function(slide) {\n return $scope.active === slide.slide.index;\n };\n\n $scope.pause = function() {\n if (!$scope.noPause) {\n isPlaying = false;\n resetTimer();\n }\n };\n\n $scope.play = function() {\n if (!isPlaying) {\n isPlaying = true;\n restartTimer();\n }\n };\n\n $scope.$on('$destroy', function() {\n destroyed = true;\n resetTimer();\n });\n\n $scope.$watch('noTransition', function(noTransition) {\n $animate.enabled($element, !noTransition);\n });\n\n $scope.$watch('interval', restartTimer);\n\n $scope.$watchCollection('slides', resetTransition);\n\n $scope.$watch('active', function(index) {\n if (angular.isNumber(index) && currentIndex !== index) {\n for (var i = 0; i < slides.length; i++) {\n if (slides[i].slide.index === index) {\n index = i;\n break;\n }\n }\n\n var slide = slides[index];\n if (slide) {\n currentIndex = index;\n setActive(index);\n self.select(slides[index]);\n }\n }\n });\n\n function clearBufferedTransitions() {\n while (bufferedTransitions.length) {\n bufferedTransitions.shift();\n }\n }\n\n function setActive(index) {\n for (var i = 0; i < slides.length; i++) {\n slides[i].slide.active = i === index;\n }\n }\n\n function goNext(slide, index, direction) {\n if (destroyed) {\n return;\n }\n\n angular.extend(slide, {direction: direction});\n angular.extend(slides[currentIndex].slide || {}, {direction: direction});\n if ($animate.enabled($element) && !$scope.$currentTransition &&\n slides[index].element && self.slides.length > 1) {\n slides[index].element.data(SLIDE_DIRECTION, slide.direction);\n var currentIdx = self.getCurrentIndex();\n\n if (angular.isNumber(currentIdx) && slides[currentIdx].element) {\n slides[currentIdx].element.data(SLIDE_DIRECTION, slide.direction);\n }\n\n $scope.$currentTransition = true;\n $animate.on('addClass', slides[index].element, function(element, phase) {\n if (phase === 'close') {\n $scope.$currentTransition = null;\n $animate.off('addClass', element);\n if (bufferedTransitions.length) {\n var nextSlide = bufferedTransitions.pop().slide;\n var nextIndex = nextSlide.index;\n var nextDirection = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\n clearBufferedTransitions();\n\n goNext(nextSlide, nextIndex, nextDirection);\n }\n }\n });\n }\n\n $scope.active = slide.index;\n currentIndex = slide.index;\n setActive(index);\n\n //every time you change slides, reset the timer\n restartTimer();\n }\n\n function findSlideIndex(slide) {\n for (var i = 0; i < slides.length; i++) {\n if (slides[i].slide === slide) {\n return i;\n }\n }\n }\n\n function resetTimer() {\n if (currentInterval) {\n $interval.cancel(currentInterval);\n currentInterval = null;\n }\n }\n\n function resetTransition(slides) {\n if (!slides.length) {\n $scope.$currentTransition = null;\n clearBufferedTransitions();\n }\n }\n\n function restartTimer() {\n resetTimer();\n var interval = +$scope.interval;\n if (!isNaN(interval) && interval > 0) {\n currentInterval = $interval(timerFn, interval);\n }\n }\n\n function timerFn() {\n var interval = +$scope.interval;\n if (isPlaying && !isNaN(interval) && interval > 0 && slides.length) {\n $scope.next();\n } else {\n $scope.pause();\n }\n }\n}])\n\n.directive('uibCarousel', function() {\n return {\n transclude: true,\n replace: true,\n controller: 'UibCarouselController',\n controllerAs: 'carousel',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/carousel/carousel.html';\n },\n scope: {\n active: '=',\n interval: '=',\n noTransition: '=',\n noPause: '=',\n noWrap: '&'\n }\n };\n})\n\n.directive('uibSlide', function() {\n return {\n require: '^uibCarousel',\n transclude: true,\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/carousel/slide.html';\n },\n scope: {\n actual: '=?',\n index: '=?'\n },\n link: function (scope, element, attrs, carouselCtrl) {\n carouselCtrl.addSlide(scope, element);\n //when the scope is destroyed then remove the slide from the current slides array\n scope.$on('$destroy', function() {\n carouselCtrl.removeSlide(scope);\n });\n }\n };\n})\n\n.animation('.item', ['$animateCss',\nfunction($animateCss) {\n var SLIDE_DIRECTION = 'uib-slideDirection';\n\n function removeClass(element, className, callback) {\n element.removeClass(className);\n if (callback) {\n callback();\n }\n }\n\n return {\n beforeAddClass: function(element, className, done) {\n if (className === 'active') {\n var direction = element.data(SLIDE_DIRECTION);\n var directionClass = direction === 'next' ? 'left' : 'right';\n var removeClassFn = removeClass.bind(this, element,\n directionClass + ' ' + direction, done);\n element.addClass(direction);\n\n $animateCss(element, {addClass: directionClass})\n .start()\n .done(removeClassFn);\n\n return function() {\n };\n }\n done();\n },\n beforeRemoveClass: function (element, className, done) {\n if (className === 'active') {\n var direction = element.data(SLIDE_DIRECTION);\n var directionClass = direction === 'next' ? 'left' : 'right';\n var removeClassFn = removeClass.bind(this, element, directionClass, done);\n\n $animateCss(element, {addClass: directionClass})\n .start()\n .done(removeClassFn);\n\n return function() {\n };\n }\n done();\n }\n };\n}]);\n\nangular.module('ui.bootstrap.dateparser', [])\n\n.service('uibDateParser', ['$log', '$locale', 'dateFilter', 'orderByFilter', function($log, $locale, dateFilter, orderByFilter) {\n // Pulled from https://github.com/mbostock/d3/blob/master/src/format/requote.js\n var SPECIAL_CHARACTERS_REGEXP = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n\n var localeId;\n var formatCodeToRegex;\n\n this.init = function() {\n localeId = $locale.id;\n\n this.parsers = {};\n this.formatters = {};\n\n formatCodeToRegex = [\n {\n key: 'yyyy',\n regex: '\\\\d{4}',\n apply: function(value) { this.year = +value; },\n formatter: function(date) {\n var _date = new Date();\n _date.setFullYear(Math.abs(date.getFullYear()));\n return dateFilter(_date, 'yyyy');\n }\n },\n {\n key: 'yy',\n regex: '\\\\d{2}',\n apply: function(value) { this.year = +value + 2000; },\n formatter: function(date) {\n var _date = new Date();\n _date.setFullYear(Math.abs(date.getFullYear()));\n return dateFilter(_date, 'yy');\n }\n },\n {\n key: 'y',\n regex: '\\\\d{1,4}',\n apply: function(value) { this.year = +value; },\n formatter: function(date) {\n var _date = new Date();\n _date.setFullYear(Math.abs(date.getFullYear()));\n return dateFilter(_date, 'y');\n }\n },\n {\n key: 'M!',\n regex: '0?[1-9]|1[0-2]',\n apply: function(value) { this.month = value - 1; },\n formatter: function(date) {\n var value = date.getMonth();\n if (/^[0-9]$/.test(value)) {\n return dateFilter(date, 'MM');\n }\n\n return dateFilter(date, 'M');\n }\n },\n {\n key: 'MMMM',\n regex: $locale.DATETIME_FORMATS.MONTH.join('|'),\n apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); },\n formatter: function(date) { return dateFilter(date, 'MMMM'); }\n },\n {\n key: 'MMM',\n regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),\n apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); },\n formatter: function(date) { return dateFilter(date, 'MMM'); }\n },\n {\n key: 'MM',\n regex: '0[1-9]|1[0-2]',\n apply: function(value) { this.month = value - 1; },\n formatter: function(date) { return dateFilter(date, 'MM'); }\n },\n {\n key: 'M',\n regex: '[1-9]|1[0-2]',\n apply: function(value) { this.month = value - 1; },\n formatter: function(date) { return dateFilter(date, 'M'); }\n },\n {\n key: 'd!',\n regex: '[0-2]?[0-9]{1}|3[0-1]{1}',\n apply: function(value) { this.date = +value; },\n formatter: function(date) {\n var value = date.getDate();\n if (/^[1-9]$/.test(value)) {\n return dateFilter(date, 'dd');\n }\n\n return dateFilter(date, 'd');\n }\n },\n {\n key: 'dd',\n regex: '[0-2][0-9]{1}|3[0-1]{1}',\n apply: function(value) { this.date = +value; },\n formatter: function(date) { return dateFilter(date, 'dd'); }\n },\n {\n key: 'd',\n regex: '[1-2]?[0-9]{1}|3[0-1]{1}',\n apply: function(value) { this.date = +value; },\n formatter: function(date) { return dateFilter(date, 'd'); }\n },\n {\n key: 'EEEE',\n regex: $locale.DATETIME_FORMATS.DAY.join('|'),\n formatter: function(date) { return dateFilter(date, 'EEEE'); }\n },\n {\n key: 'EEE',\n regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|'),\n formatter: function(date) { return dateFilter(date, 'EEE'); }\n },\n {\n key: 'HH',\n regex: '(?:0|1)[0-9]|2[0-3]',\n apply: function(value) { this.hours = +value; },\n formatter: function(date) { return dateFilter(date, 'HH'); }\n },\n {\n key: 'hh',\n regex: '0[0-9]|1[0-2]',\n apply: function(value) { this.hours = +value; },\n formatter: function(date) { return dateFilter(date, 'hh'); }\n },\n {\n key: 'H',\n regex: '1?[0-9]|2[0-3]',\n apply: function(value) { this.hours = +value; },\n formatter: function(date) { return dateFilter(date, 'H'); }\n },\n {\n key: 'h',\n regex: '[0-9]|1[0-2]',\n apply: function(value) { this.hours = +value; },\n formatter: function(date) { return dateFilter(date, 'h'); }\n },\n {\n key: 'mm',\n regex: '[0-5][0-9]',\n apply: function(value) { this.minutes = +value; },\n formatter: function(date) { return dateFilter(date, 'mm'); }\n },\n {\n key: 'm',\n regex: '[0-9]|[1-5][0-9]',\n apply: function(value) { this.minutes = +value; },\n formatter: function(date) { return dateFilter(date, 'm'); }\n },\n {\n key: 'sss',\n regex: '[0-9][0-9][0-9]',\n apply: function(value) { this.milliseconds = +value; },\n formatter: function(date) { return dateFilter(date, 'sss'); }\n },\n {\n key: 'ss',\n regex: '[0-5][0-9]',\n apply: function(value) { this.seconds = +value; },\n formatter: function(date) { return dateFilter(date, 'ss'); }\n },\n {\n key: 's',\n regex: '[0-9]|[1-5][0-9]',\n apply: function(value) { this.seconds = +value; },\n formatter: function(date) { return dateFilter(date, 's'); }\n },\n {\n key: 'a',\n regex: $locale.DATETIME_FORMATS.AMPMS.join('|'),\n apply: function(value) {\n if (this.hours === 12) {\n this.hours = 0;\n }\n\n if (value === 'PM') {\n this.hours += 12;\n }\n },\n formatter: function(date) { return dateFilter(date, 'a'); }\n },\n {\n key: 'Z',\n regex: '[+-]\\\\d{4}',\n apply: function(value) {\n var matches = value.match(/([+-])(\\d{2})(\\d{2})/),\n sign = matches[1],\n hours = matches[2],\n minutes = matches[3];\n this.hours += toInt(sign + hours);\n this.minutes += toInt(sign + minutes);\n },\n formatter: function(date) {\n return dateFilter(date, 'Z');\n }\n },\n {\n key: 'ww',\n regex: '[0-4][0-9]|5[0-3]',\n formatter: function(date) { return dateFilter(date, 'ww'); }\n },\n {\n key: 'w',\n regex: '[0-9]|[1-4][0-9]|5[0-3]',\n formatter: function(date) { return dateFilter(date, 'w'); }\n },\n {\n key: 'GGGG',\n regex: $locale.DATETIME_FORMATS.ERANAMES.join('|').replace(/\\s/g, '\\\\s'),\n formatter: function(date) { return dateFilter(date, 'GGGG'); }\n },\n {\n key: 'GGG',\n regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n formatter: function(date) { return dateFilter(date, 'GGG'); }\n },\n {\n key: 'GG',\n regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n formatter: function(date) { return dateFilter(date, 'GG'); }\n },\n {\n key: 'G',\n regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n formatter: function(date) { return dateFilter(date, 'G'); }\n }\n ];\n };\n\n this.init();\n\n function createParser(format, func) {\n var map = [], regex = format.split('');\n\n // check for literal values\n var quoteIndex = format.indexOf('\\'');\n if (quoteIndex > -1) {\n var inLiteral = false;\n format = format.split('');\n for (var i = quoteIndex; i < format.length; i++) {\n if (inLiteral) {\n if (format[i] === '\\'') {\n if (i + 1 < format.length && format[i+1] === '\\'') { // escaped single quote\n format[i+1] = '$';\n regex[i+1] = '';\n } else { // end of literal\n regex[i] = '';\n inLiteral = false;\n }\n }\n format[i] = '$';\n } else {\n if (format[i] === '\\'') { // start of literal\n format[i] = '$';\n regex[i] = '';\n inLiteral = true;\n }\n }\n }\n\n format = format.join('');\n }\n\n angular.forEach(formatCodeToRegex, function(data) {\n var index = format.indexOf(data.key);\n\n if (index > -1) {\n format = format.split('');\n\n regex[index] = '(' + data.regex + ')';\n format[index] = '$'; // Custom symbol to define consumed part of format\n for (var i = index + 1, n = index + data.key.length; i < n; i++) {\n regex[i] = '';\n format[i] = '$';\n }\n format = format.join('');\n\n map.push({\n index: index,\n key: data.key,\n apply: data[func],\n matcher: data.regex\n });\n }\n });\n\n return {\n regex: new RegExp('^' + regex.join('') + '$'),\n map: orderByFilter(map, 'index')\n };\n }\n\n this.filter = function(date, format) {\n if (!angular.isDate(date) || isNaN(date) || !format) {\n return '';\n }\n\n format = $locale.DATETIME_FORMATS[format] || format;\n\n if ($locale.id !== localeId) {\n this.init();\n }\n\n if (!this.formatters[format]) {\n this.formatters[format] = createParser(format, 'formatter');\n }\n\n var parser = this.formatters[format],\n map = parser.map;\n\n var _format = format;\n\n return map.reduce(function(str, mapper, i) {\n var match = _format.match(new RegExp('(.*)' + mapper.key));\n if (match && angular.isString(match[1])) {\n str += match[1];\n _format = _format.replace(match[1] + mapper.key, '');\n }\n\n var endStr = i === map.length - 1 ? _format : '';\n\n if (mapper.apply) {\n return str + mapper.apply.call(null, date) + endStr;\n }\n\n return str + endStr;\n }, '');\n };\n\n this.parse = function(input, format, baseDate) {\n if (!angular.isString(input) || !format) {\n return input;\n }\n\n format = $locale.DATETIME_FORMATS[format] || format;\n format = format.replace(SPECIAL_CHARACTERS_REGEXP, '\\\\$&');\n\n if ($locale.id !== localeId) {\n this.init();\n }\n\n if (!this.parsers[format]) {\n this.parsers[format] = createParser(format, 'apply');\n }\n\n var parser = this.parsers[format],\n regex = parser.regex,\n map = parser.map,\n results = input.match(regex),\n tzOffset = false;\n if (results && results.length) {\n var fields, dt;\n if (angular.isDate(baseDate) && !isNaN(baseDate.getTime())) {\n fields = {\n year: baseDate.getFullYear(),\n month: baseDate.getMonth(),\n date: baseDate.getDate(),\n hours: baseDate.getHours(),\n minutes: baseDate.getMinutes(),\n seconds: baseDate.getSeconds(),\n milliseconds: baseDate.getMilliseconds()\n };\n } else {\n if (baseDate) {\n $log.warn('dateparser:', 'baseDate is not a valid date');\n }\n fields = { year: 1900, month: 0, date: 1, hours: 0, minutes: 0, seconds: 0, milliseconds: 0 };\n }\n\n for (var i = 1, n = results.length; i < n; i++) {\n var mapper = map[i - 1];\n if (mapper.matcher === 'Z') {\n tzOffset = true;\n }\n\n if (mapper.apply) {\n mapper.apply.call(fields, results[i]);\n }\n }\n\n var datesetter = tzOffset ? Date.prototype.setUTCFullYear :\n Date.prototype.setFullYear;\n var timesetter = tzOffset ? Date.prototype.setUTCHours :\n Date.prototype.setHours;\n\n if (isValid(fields.year, fields.month, fields.date)) {\n if (angular.isDate(baseDate) && !isNaN(baseDate.getTime()) && !tzOffset) {\n dt = new Date(baseDate);\n datesetter.call(dt, fields.year, fields.month, fields.date);\n timesetter.call(dt, fields.hours, fields.minutes,\n fields.seconds, fields.milliseconds);\n } else {\n dt = new Date(0);\n datesetter.call(dt, fields.year, fields.month, fields.date);\n timesetter.call(dt, fields.hours || 0, fields.minutes || 0,\n fields.seconds || 0, fields.milliseconds || 0);\n }\n }\n\n return dt;\n }\n };\n\n // Check if date is valid for specific month (and year for February).\n // Month: 0 = Jan, 1 = Feb, etc\n function isValid(year, month, date) {\n if (date < 1) {\n return false;\n }\n\n if (month === 1 && date > 28) {\n return date === 29 && (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0);\n }\n\n if (month === 3 || month === 5 || month === 8 || month === 10) {\n return date < 31;\n }\n\n return true;\n }\n\n function toInt(str) {\n return parseInt(str, 10);\n }\n\n this.toTimezone = toTimezone;\n this.fromTimezone = fromTimezone;\n this.timezoneToOffset = timezoneToOffset;\n this.addDateMinutes = addDateMinutes;\n this.convertTimezoneToLocal = convertTimezoneToLocal;\n\n function toTimezone(date, timezone) {\n return date && timezone ? convertTimezoneToLocal(date, timezone) : date;\n }\n\n function fromTimezone(date, timezone) {\n return date && timezone ? convertTimezoneToLocal(date, timezone, true) : date;\n }\n\n //https://github.com/angular/angular.js/blob/4daafd3dbe6a80d578f5a31df1bb99c77559543e/src/Angular.js#L1207\n function timezoneToOffset(timezone, fallback) {\n var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;\n return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;\n }\n\n function addDateMinutes(date, minutes) {\n date = new Date(date.getTime());\n date.setMinutes(date.getMinutes() + minutes);\n return date;\n }\n\n function convertTimezoneToLocal(date, timezone, reverse) {\n reverse = reverse ? -1 : 1;\n var timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset());\n return addDateMinutes(date, reverse * (timezoneOffset - date.getTimezoneOffset()));\n }\n}]);\n\n// Avoiding use of ng-class as it creates a lot of watchers when a class is to be applied to\n// at most one element.\nangular.module('ui.bootstrap.isClass', [])\n.directive('uibIsClass', [\n '$animate',\nfunction ($animate) {\n // 11111111 22222222\n var ON_REGEXP = /^\\s*([\\s\\S]+?)\\s+on\\s+([\\s\\S]+?)\\s*$/;\n // 11111111 22222222\n var IS_REGEXP = /^\\s*([\\s\\S]+?)\\s+for\\s+([\\s\\S]+?)\\s*$/;\n\n return {\n restrict: 'A',\n compile: function (tElement, tAttrs) {\n var linkedScopes = [];\n var instances = [];\n var expToData = {};\n var onExpMatches = tAttrs.uibIsClass.match(ON_REGEXP);\n var onExp = onExpMatches[2];\n var expsStr = onExpMatches[1];\n var exps = expsStr.split(',');\n\n return linkFn;\n\n function linkFn(scope, element, attrs) {\n linkedScopes.push(scope);\n instances.push({\n scope: scope,\n element: element\n });\n\n exps.forEach(function (exp, k) {\n addForExp(exp, scope);\n });\n\n scope.$on('$destroy', removeScope);\n }\n\n function addForExp(exp, scope) {\n var matches = exp.match(IS_REGEXP);\n var clazz = scope.$eval(matches[1]);\n var compareWithExp = matches[2];\n var data = expToData[exp];\n if (!data) {\n var watchFn = function (compareWithVal) {\n var newActivated = null;\n instances.some(function (instance) {\n var thisVal = instance.scope.$eval(onExp);\n if (thisVal === compareWithVal) {\n newActivated = instance;\n return true;\n }\n });\n if (data.lastActivated !== newActivated) {\n if (data.lastActivated) {\n $animate.removeClass(data.lastActivated.element, clazz);\n }\n if (newActivated) {\n $animate.addClass(newActivated.element, clazz);\n }\n data.lastActivated = newActivated;\n }\n };\n expToData[exp] = data = {\n lastActivated: null,\n scope: scope,\n watchFn: watchFn,\n compareWithExp: compareWithExp,\n watcher: scope.$watch(compareWithExp, watchFn)\n };\n }\n data.watchFn(scope.$eval(compareWithExp));\n }\n\n function removeScope(e) {\n var removedScope = e.targetScope;\n var index = linkedScopes.indexOf(removedScope);\n linkedScopes.splice(index, 1);\n instances.splice(index, 1);\n if (linkedScopes.length) {\n var newWatchScope = linkedScopes[0];\n angular.forEach(expToData, function (data) {\n if (data.scope === removedScope) {\n data.watcher = newWatchScope.$watch(data.compareWithExp, data.watchFn);\n data.scope = newWatchScope;\n }\n });\n }\n else {\n expToData = {};\n }\n }\n }\n };\n}]);\nangular.module('ui.bootstrap.position', [])\n\n/**\n * A set of utility methods for working with the DOM.\n * It is meant to be used where we need to absolute-position elements in\n * relation to another element (this is the case for tooltips, popovers,\n * typeahead suggestions etc.).\n */\n .factory('$uibPosition', ['$document', '$window', function($document, $window) {\n /**\n * Used by scrollbarWidth() function to cache scrollbar's width.\n * Do not access this variable directly, use scrollbarWidth() instead.\n */\n var SCROLLBAR_WIDTH;\n var OVERFLOW_REGEX = {\n normal: /(auto|scroll)/,\n hidden: /(auto|scroll|hidden)/\n };\n var PLACEMENT_REGEX = {\n auto: /\\s?auto?\\s?/i,\n primary: /^(top|bottom|left|right)$/,\n secondary: /^(top|bottom|left|right|center)$/,\n vertical: /^(top|bottom)$/\n };\n\n return {\n\n /**\n * Provides a raw DOM element from a jQuery/jQLite element.\n *\n * @param {element} elem - The element to convert.\n *\n * @returns {element} A HTML element.\n */\n getRawNode: function(elem) {\n return elem.nodeName ? elem : elem[0] || elem;\n },\n\n /**\n * Provides a parsed number for a style property. Strips\n * units and casts invalid numbers to 0.\n *\n * @param {string} value - The style value to parse.\n *\n * @returns {number} A valid number.\n */\n parseStyle: function(value) {\n value = parseFloat(value);\n return isFinite(value) ? value : 0;\n },\n\n /**\n * Provides the closest positioned ancestor.\n *\n * @param {element} element - The element to get the offest parent for.\n *\n * @returns {element} The closest positioned ancestor.\n */\n offsetParent: function(elem) {\n elem = this.getRawNode(elem);\n\n var offsetParent = elem.offsetParent || $document[0].documentElement;\n\n function isStaticPositioned(el) {\n return ($window.getComputedStyle(el).position || 'static') === 'static';\n }\n\n while (offsetParent && offsetParent !== $document[0].documentElement && isStaticPositioned(offsetParent)) {\n offsetParent = offsetParent.offsetParent;\n }\n\n return offsetParent || $document[0].documentElement;\n },\n\n /**\n * Provides the scrollbar width, concept from TWBS measureScrollbar()\n * function in https://github.com/twbs/bootstrap/blob/master/js/modal.js\n *\n * @returns {number} The width of the browser scollbar.\n */\n scrollbarWidth: function() {\n if (angular.isUndefined(SCROLLBAR_WIDTH)) {\n var scrollElem = angular.element('
');\n $document.find('body').append(scrollElem);\n SCROLLBAR_WIDTH = scrollElem[0].offsetWidth - scrollElem[0].clientWidth;\n SCROLLBAR_WIDTH = isFinite(SCROLLBAR_WIDTH) ? SCROLLBAR_WIDTH : 0;\n scrollElem.remove();\n }\n\n return SCROLLBAR_WIDTH;\n },\n\n /**\n * Checks to see if the element is scrollable.\n *\n * @param {element} elem - The element to check.\n * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\n * default is false.\n *\n * @returns {boolean} Whether the element is scrollable.\n */\n isScrollable: function(elem, includeHidden) {\n elem = this.getRawNode(elem);\n\n var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\n var elemStyle = $window.getComputedStyle(elem);\n return overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX);\n },\n\n /**\n * Provides the closest scrollable ancestor.\n * A port of the jQuery UI scrollParent method:\n * https://github.com/jquery/jquery-ui/blob/master/ui/scroll-parent.js\n *\n * @param {element} elem - The element to find the scroll parent of.\n * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\n * default is false.\n *\n * @returns {element} A HTML element.\n */\n scrollParent: function(elem, includeHidden) {\n elem = this.getRawNode(elem);\n\n var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\n var documentEl = $document[0].documentElement;\n var elemStyle = $window.getComputedStyle(elem);\n var excludeStatic = elemStyle.position === 'absolute';\n var scrollParent = elem.parentElement || documentEl;\n\n if (scrollParent === documentEl || elemStyle.position === 'fixed') {\n return documentEl;\n }\n\n while (scrollParent.parentElement && scrollParent !== documentEl) {\n var spStyle = $window.getComputedStyle(scrollParent);\n if (excludeStatic && spStyle.position !== 'static') {\n excludeStatic = false;\n }\n\n if (!excludeStatic && overflowRegex.test(spStyle.overflow + spStyle.overflowY + spStyle.overflowX)) {\n break;\n }\n scrollParent = scrollParent.parentElement;\n }\n\n return scrollParent;\n },\n\n /**\n * Provides read-only equivalent of jQuery's position function:\n * http://api.jquery.com/position/ - distance to closest positioned\n * ancestor. Does not account for margins by default like jQuery position.\n *\n * @param {element} elem - The element to caclulate the position on.\n * @param {boolean=} [includeMargins=false] - Should margins be accounted\n * for, default is false.\n *\n * @returns {object} An object with the following properties:\n * \n */\n position: function(elem, includeMagins) {\n elem = this.getRawNode(elem);\n\n var elemOffset = this.offset(elem);\n if (includeMagins) {\n var elemStyle = $window.getComputedStyle(elem);\n elemOffset.top -= this.parseStyle(elemStyle.marginTop);\n elemOffset.left -= this.parseStyle(elemStyle.marginLeft);\n }\n var parent = this.offsetParent(elem);\n var parentOffset = {top: 0, left: 0};\n\n if (parent !== $document[0].documentElement) {\n parentOffset = this.offset(parent);\n parentOffset.top += parent.clientTop - parent.scrollTop;\n parentOffset.left += parent.clientLeft - parent.scrollLeft;\n }\n\n return {\n width: Math.round(angular.isNumber(elemOffset.width) ? elemOffset.width : elem.offsetWidth),\n height: Math.round(angular.isNumber(elemOffset.height) ? elemOffset.height : elem.offsetHeight),\n top: Math.round(elemOffset.top - parentOffset.top),\n left: Math.round(elemOffset.left - parentOffset.left)\n };\n },\n\n /**\n * Provides read-only equivalent of jQuery's offset function:\n * http://api.jquery.com/offset/ - distance to viewport. Does\n * not account for borders, margins, or padding on the body\n * element.\n *\n * @param {element} elem - The element to calculate the offset on.\n *\n * @returns {object} An object with the following properties:\n * \n */\n offset: function(elem) {\n elem = this.getRawNode(elem);\n\n var elemBCR = elem.getBoundingClientRect();\n return {\n width: Math.round(angular.isNumber(elemBCR.width) ? elemBCR.width : elem.offsetWidth),\n height: Math.round(angular.isNumber(elemBCR.height) ? elemBCR.height : elem.offsetHeight),\n top: Math.round(elemBCR.top + ($window.pageYOffset || $document[0].documentElement.scrollTop)),\n left: Math.round(elemBCR.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft))\n };\n },\n\n /**\n * Provides offset distance to the closest scrollable ancestor\n * or viewport. Accounts for border and scrollbar width.\n *\n * Right and bottom dimensions represent the distance to the\n * respective edge of the viewport element. If the element\n * edge extends beyond the viewport, a negative value will be\n * reported.\n *\n * @param {element} elem - The element to get the viewport offset for.\n * @param {boolean=} [useDocument=false] - Should the viewport be the document element instead\n * of the first scrollable element, default is false.\n * @param {boolean=} [includePadding=true] - Should the padding on the offset parent element\n * be accounted for, default is true.\n *\n * @returns {object} An object with the following properties:\n * \n */\n viewportOffset: function(elem, useDocument, includePadding) {\n elem = this.getRawNode(elem);\n includePadding = includePadding !== false ? true : false;\n\n var elemBCR = elem.getBoundingClientRect();\n var offsetBCR = {top: 0, left: 0, bottom: 0, right: 0};\n\n var offsetParent = useDocument ? $document[0].documentElement : this.scrollParent(elem);\n var offsetParentBCR = offsetParent.getBoundingClientRect();\n\n offsetBCR.top = offsetParentBCR.top + offsetParent.clientTop;\n offsetBCR.left = offsetParentBCR.left + offsetParent.clientLeft;\n if (offsetParent === $document[0].documentElement) {\n offsetBCR.top += $window.pageYOffset;\n offsetBCR.left += $window.pageXOffset;\n }\n offsetBCR.bottom = offsetBCR.top + offsetParent.clientHeight;\n offsetBCR.right = offsetBCR.left + offsetParent.clientWidth;\n\n if (includePadding) {\n var offsetParentStyle = $window.getComputedStyle(offsetParent);\n offsetBCR.top += this.parseStyle(offsetParentStyle.paddingTop);\n offsetBCR.bottom -= this.parseStyle(offsetParentStyle.paddingBottom);\n offsetBCR.left += this.parseStyle(offsetParentStyle.paddingLeft);\n offsetBCR.right -= this.parseStyle(offsetParentStyle.paddingRight);\n }\n\n return {\n top: Math.round(elemBCR.top - offsetBCR.top),\n bottom: Math.round(offsetBCR.bottom - elemBCR.bottom),\n left: Math.round(elemBCR.left - offsetBCR.left),\n right: Math.round(offsetBCR.right - elemBCR.right)\n };\n },\n\n /**\n * Provides an array of placement values parsed from a placement string.\n * Along with the 'auto' indicator, supported placement strings are:\n * \n * A placement string with an 'auto' indicator is expected to be\n * space separated from the placement, i.e: 'auto bottom-left' If\n * the primary and secondary placement values do not match 'top,\n * bottom, left, right' then 'top' will be the primary placement and\n * 'center' will be the secondary placement. If 'auto' is passed, true\n * will be returned as the 3rd value of the array.\n *\n * @param {string} placement - The placement string to parse.\n *\n * @returns {array} An array with the following values\n * \n */\n parsePlacement: function(placement) {\n var autoPlace = PLACEMENT_REGEX.auto.test(placement);\n if (autoPlace) {\n placement = placement.replace(PLACEMENT_REGEX.auto, '');\n }\n\n placement = placement.split('-');\n\n placement[0] = placement[0] || 'top';\n if (!PLACEMENT_REGEX.primary.test(placement[0])) {\n placement[0] = 'top';\n }\n\n placement[1] = placement[1] || 'center';\n if (!PLACEMENT_REGEX.secondary.test(placement[1])) {\n placement[1] = 'center';\n }\n\n if (autoPlace) {\n placement[2] = true;\n } else {\n placement[2] = false;\n }\n\n return placement;\n },\n\n /**\n * Provides coordinates for an element to be positioned relative to\n * another element. Passing 'auto' as part of the placement parameter\n * will enable smart placement - where the element fits. i.e:\n * 'auto left-top' will check to see if there is enough space to the left\n * of the hostElem to fit the targetElem, if not place right (same for secondary\n * top placement). Available space is calculated using the viewportOffset\n * function.\n *\n * @param {element} hostElem - The element to position against.\n * @param {element} targetElem - The element to position.\n * @param {string=} [placement=top] - The placement for the targetElem,\n * default is 'top'. 'center' is assumed as secondary placement for\n * 'top', 'left', 'right', and 'bottom' placements. Available placements are:\n * \n * @param {boolean=} [appendToBody=false] - Should the top and left values returned\n * be calculated from the body element, default is false.\n *\n * @returns {object} An object with the following properties:\n * \n */\n positionElements: function(hostElem, targetElem, placement, appendToBody) {\n hostElem = this.getRawNode(hostElem);\n targetElem = this.getRawNode(targetElem);\n\n // need to read from prop to support tests.\n var targetWidth = angular.isDefined(targetElem.offsetWidth) ? targetElem.offsetWidth : targetElem.prop('offsetWidth');\n var targetHeight = angular.isDefined(targetElem.offsetHeight) ? targetElem.offsetHeight : targetElem.prop('offsetHeight');\n\n placement = this.parsePlacement(placement);\n\n var hostElemPos = appendToBody ? this.offset(hostElem) : this.position(hostElem);\n var targetElemPos = {top: 0, left: 0, placement: ''};\n\n if (placement[2]) {\n var viewportOffset = this.viewportOffset(hostElem);\n\n var targetElemStyle = $window.getComputedStyle(targetElem);\n var adjustedSize = {\n width: targetWidth + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginLeft) + this.parseStyle(targetElemStyle.marginRight))),\n height: targetHeight + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginTop) + this.parseStyle(targetElemStyle.marginBottom)))\n };\n\n placement[0] = placement[0] === 'top' && adjustedSize.height > viewportOffset.top && adjustedSize.height <= viewportOffset.bottom ? 'bottom' :\n placement[0] === 'bottom' && adjustedSize.height > viewportOffset.bottom && adjustedSize.height <= viewportOffset.top ? 'top' :\n placement[0] === 'left' && adjustedSize.width > viewportOffset.left && adjustedSize.width <= viewportOffset.right ? 'right' :\n placement[0] === 'right' && adjustedSize.width > viewportOffset.right && adjustedSize.width <= viewportOffset.left ? 'left' :\n placement[0];\n\n placement[1] = placement[1] === 'top' && adjustedSize.height - hostElemPos.height > viewportOffset.bottom && adjustedSize.height - hostElemPos.height <= viewportOffset.top ? 'bottom' :\n placement[1] === 'bottom' && adjustedSize.height - hostElemPos.height > viewportOffset.top && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom ? 'top' :\n placement[1] === 'left' && adjustedSize.width - hostElemPos.width > viewportOffset.right && adjustedSize.width - hostElemPos.width <= viewportOffset.left ? 'right' :\n placement[1] === 'right' && adjustedSize.width - hostElemPos.width > viewportOffset.left && adjustedSize.width - hostElemPos.width <= viewportOffset.right ? 'left' :\n placement[1];\n\n if (placement[1] === 'center') {\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n var xOverflow = hostElemPos.width / 2 - targetWidth / 2;\n if (viewportOffset.left + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.right) {\n placement[1] = 'left';\n } else if (viewportOffset.right + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.left) {\n placement[1] = 'right';\n }\n } else {\n var yOverflow = hostElemPos.height / 2 - adjustedSize.height / 2;\n if (viewportOffset.top + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom) {\n placement[1] = 'top';\n } else if (viewportOffset.bottom + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.top) {\n placement[1] = 'bottom';\n }\n }\n }\n }\n\n switch (placement[0]) {\n case 'top':\n targetElemPos.top = hostElemPos.top - targetHeight;\n break;\n case 'bottom':\n targetElemPos.top = hostElemPos.top + hostElemPos.height;\n break;\n case 'left':\n targetElemPos.left = hostElemPos.left - targetWidth;\n break;\n case 'right':\n targetElemPos.left = hostElemPos.left + hostElemPos.width;\n break;\n }\n\n switch (placement[1]) {\n case 'top':\n targetElemPos.top = hostElemPos.top;\n break;\n case 'bottom':\n targetElemPos.top = hostElemPos.top + hostElemPos.height - targetHeight;\n break;\n case 'left':\n targetElemPos.left = hostElemPos.left;\n break;\n case 'right':\n targetElemPos.left = hostElemPos.left + hostElemPos.width - targetWidth;\n break;\n case 'center':\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n targetElemPos.left = hostElemPos.left + hostElemPos.width / 2 - targetWidth / 2;\n } else {\n targetElemPos.top = hostElemPos.top + hostElemPos.height / 2 - targetHeight / 2;\n }\n break;\n }\n\n targetElemPos.top = Math.round(targetElemPos.top);\n targetElemPos.left = Math.round(targetElemPos.left);\n targetElemPos.placement = placement[1] === 'center' ? placement[0] : placement[0] + '-' + placement[1];\n\n return targetElemPos;\n },\n\n /**\n * Provides a way for positioning tooltip & dropdown\n * arrows when using placement options beyond the standard\n * left, right, top, or bottom.\n *\n * @param {element} elem - The tooltip/dropdown element.\n * @param {string} placement - The placement for the elem.\n */\n positionArrow: function(elem, placement) {\n elem = this.getRawNode(elem);\n\n var innerElem = elem.querySelector('.tooltip-inner, .popover-inner');\n if (!innerElem) {\n return;\n }\n\n var isTooltip = angular.element(innerElem).hasClass('tooltip-inner');\n\n var arrowElem = isTooltip ? elem.querySelector('.tooltip-arrow') : elem.querySelector('.arrow');\n if (!arrowElem) {\n return;\n }\n\n var arrowCss = {\n top: '',\n bottom: '',\n left: '',\n right: ''\n };\n\n placement = this.parsePlacement(placement);\n if (placement[1] === 'center') {\n // no adjustment necessary - just reset styles\n angular.element(arrowElem).css(arrowCss);\n return;\n }\n\n var borderProp = 'border-' + placement[0] + '-width';\n var borderWidth = $window.getComputedStyle(arrowElem)[borderProp];\n\n var borderRadiusProp = 'border-';\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n borderRadiusProp += placement[0] + '-' + placement[1];\n } else {\n borderRadiusProp += placement[1] + '-' + placement[0];\n }\n borderRadiusProp += '-radius';\n var borderRadius = $window.getComputedStyle(isTooltip ? innerElem : elem)[borderRadiusProp];\n\n switch (placement[0]) {\n case 'top':\n arrowCss.bottom = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'bottom':\n arrowCss.top = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'left':\n arrowCss.right = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'right':\n arrowCss.left = isTooltip ? '0' : '-' + borderWidth;\n break;\n }\n\n arrowCss[placement[1]] = borderRadius;\n\n angular.element(arrowElem).css(arrowCss);\n }\n };\n }]);\n\nangular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.isClass', 'ui.bootstrap.position'])\n\n.value('$datepickerSuppressError', false)\n.value('uibDatepickerAttributeWarning', true)\n\n.constant('uibDatepickerConfig', {\n datepickerMode: 'day',\n formatDay: 'dd',\n formatMonth: 'MMMM',\n formatYear: 'yyyy',\n formatDayHeader: 'EEE',\n formatDayTitle: 'MMMM yyyy',\n formatMonthTitle: 'yyyy',\n maxDate: null,\n maxMode: 'year',\n minDate: null,\n minMode: 'day',\n ngModelOptions: {},\n shortcutPropagation: false,\n showWeeks: true,\n yearColumns: 5,\n yearRows: 4\n})\n\n.controller('UibDatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$locale', '$log', 'dateFilter', 'uibDatepickerConfig', '$datepickerSuppressError', 'uibDatepickerAttributeWarning', 'uibDateParser',\n function($scope, $attrs, $parse, $interpolate, $locale, $log, dateFilter, datepickerConfig, $datepickerSuppressError, datepickerAttributeWarning, dateParser) {\n var self = this,\n ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl;\n ngModelOptions = {},\n watchListeners = [],\n optionsUsed = !!$attrs.datepickerOptions;\n\n // Modes chain\n this.modes = ['day', 'month', 'year'];\n\n if (optionsUsed) {\n [\n 'customClass',\n 'dateDisabled',\n 'datepickerMode',\n 'formatDay',\n 'formatDayHeader',\n 'formatDayTitle',\n 'formatMonth',\n 'formatMonthTitle',\n 'formatYear',\n 'initDate',\n 'maxDate',\n 'maxMode',\n 'minDate',\n 'minMode',\n 'showWeeks',\n 'shortcutPropagation',\n 'startingDay',\n 'yearColumns',\n 'yearRows'\n ].forEach(function(key) {\n switch (key) {\n case 'customClass':\n case 'dateDisabled':\n $scope[key] = $scope.datepickerOptions[key] || angular.noop;\n break;\n case 'datepickerMode':\n $scope.datepickerMode = angular.isDefined($scope.datepickerOptions.datepickerMode) ?\n $scope.datepickerOptions.datepickerMode : datepickerConfig.datepickerMode;\n break;\n case 'formatDay':\n case 'formatDayHeader':\n case 'formatDayTitle':\n case 'formatMonth':\n case 'formatMonthTitle':\n case 'formatYear':\n self[key] = angular.isDefined($scope.datepickerOptions[key]) ?\n $interpolate($scope.datepickerOptions[key])($scope.$parent) :\n datepickerConfig[key];\n break;\n case 'showWeeks':\n case 'shortcutPropagation':\n case 'yearColumns':\n case 'yearRows':\n self[key] = angular.isDefined($scope.datepickerOptions[key]) ?\n $scope.datepickerOptions[key] : datepickerConfig[key];\n break;\n case 'startingDay':\n if (angular.isDefined($scope.datepickerOptions.startingDay)) {\n self.startingDay = $scope.datepickerOptions.startingDay;\n } else if (angular.isNumber(datepickerConfig.startingDay)) {\n self.startingDay = datepickerConfig.startingDay;\n } else {\n self.startingDay = ($locale.DATETIME_FORMATS.FIRSTDAYOFWEEK + 8) % 7;\n }\n\n break;\n case 'maxDate':\n case 'minDate':\n if ($scope.datepickerOptions[key]) {\n $scope.$watch(function() { return $scope.datepickerOptions[key]; }, function(value) {\n if (value) {\n if (angular.isDate(value)) {\n self[key] = dateParser.fromTimezone(new Date(value), ngModelOptions.timezone);\n } else {\n self[key] = new Date(dateFilter(value, 'medium'));\n }\n } else {\n self[key] = null;\n }\n\n self.refreshView();\n });\n } else {\n self[key] = datepickerConfig[key] ? dateParser.fromTimezone(new Date(datepickerConfig[key]), ngModelOptions.timezone) : null;\n }\n\n break;\n case 'maxMode':\n case 'minMode':\n if ($scope.datepickerOptions[key]) {\n $scope.$watch(function() { return $scope.datepickerOptions[key]; }, function(value) {\n self[key] = $scope[key] = angular.isDefined(value) ? value : datepickerOptions[key];\n if (key === 'minMode' && self.modes.indexOf($scope.datepickerOptions.datepickerMode) < self.modes.indexOf(self[key]) ||\n key === 'maxMode' && self.modes.indexOf($scope.datepickerOptions.datepickerMode) > self.modes.indexOf(self[key])) {\n $scope.datepickerMode = self[key];\n $scope.datepickerOptions.datepickerMode = self[key];\n }\n });\n } else {\n self[key] = $scope[key] = datepickerConfig[key] || null;\n }\n\n break;\n case 'initDate':\n if ($scope.datepickerOptions.initDate) {\n self.activeDate = dateParser.fromTimezone($scope.datepickerOptions.initDate, ngModelOptions.timezone) || new Date();\n $scope.$watch(function() { return $scope.datepickerOptions.initDate; }, function(initDate) {\n if (initDate && (ngModelCtrl.$isEmpty(ngModelCtrl.$modelValue) || ngModelCtrl.$invalid)) {\n self.activeDate = dateParser.fromTimezone(initDate, ngModelOptions.timezone);\n self.refreshView();\n }\n });\n } else {\n self.activeDate = new Date();\n }\n }\n });\n } else {\n // Interpolated configuration attributes\n angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle'], function(key) {\n self[key] = angular.isDefined($attrs[key]) ? $interpolate($attrs[key])($scope.$parent) : datepickerConfig[key];\n\n if (angular.isDefined($attrs[key]) && datepickerAttributeWarning) {\n $log.warn('uib-datepicker ' + key + ' attribute usage is deprecated, use datepicker-options attribute instead');\n }\n });\n\n // Evaled configuration attributes\n angular.forEach(['showWeeks', 'yearRows', 'yearColumns', 'shortcutPropagation'], function(key) {\n self[key] = angular.isDefined($attrs[key]) ?\n $scope.$parent.$eval($attrs[key]) : datepickerConfig[key];\n\n if (angular.isDefined($attrs[key]) && datepickerAttributeWarning) {\n $log.warn('uib-datepicker ' + key + ' attribute usage is deprecated, use datepicker-options attribute instead');\n }\n });\n\n angular.forEach(['dateDisabled', 'customClass'], function(key) {\n if (angular.isDefined($attrs[key]) && datepickerAttributeWarning) {\n $log.warn('uib-datepicker ' + key + ' attribute usage is deprecated, use datepicker-options attribute instead');\n }\n });\n\n if (angular.isDefined($attrs.startingDay)) {\n if (datepickerAttributeWarning) {\n $log.warn('uib-datepicker startingDay attribute usage is deprecated, use datepicker-options attribute instead');\n }\n\n self.startingDay = $scope.$parent.$eval($attrs.startingDay);\n } else if (angular.isNumber(datepickerConfig.startingDay)) {\n self.startingDay = datepickerConfig.startingDay;\n } else {\n self.startingDay = ($locale.DATETIME_FORMATS.FIRSTDAYOFWEEK + 8) % 7;\n }\n\n // Watchable date attributes\n angular.forEach(['minDate', 'maxDate'], function(key) {\n if ($attrs[key]) {\n if (datepickerAttributeWarning) {\n $log.warn('uib-datepicker ' + key + ' attribute usage is deprecated, use datepicker-options attribute instead');\n }\n\n watchListeners.push($scope.$parent.$watch($attrs[key], function(value) {\n if (value) {\n if (angular.isDate(value)) {\n self[key] = dateParser.fromTimezone(new Date(value), ngModelOptions.timezone);\n } else {\n self[key] = new Date(dateFilter(value, 'medium'));\n }\n } else {\n self[key] = null;\n }\n\n self.refreshView();\n }));\n } else {\n self[key] = datepickerConfig[key] ? dateParser.fromTimezone(new Date(datepickerConfig[key]), ngModelOptions.timezone) : null;\n }\n });\n\n angular.forEach(['minMode', 'maxMode'], function(key) {\n if ($attrs[key]) {\n if (datepickerAttributeWarning) {\n $log.warn('uib-datepicker ' + key + ' attribute usage is deprecated, use datepicker-options attribute instead');\n }\n\n watchListeners.push($scope.$parent.$watch($attrs[key], function(value) {\n self[key] = $scope[key] = angular.isDefined(value) ? value : $attrs[key];\n if (key === 'minMode' && self.modes.indexOf($scope.datepickerMode) < self.modes.indexOf(self[key]) ||\n key === 'maxMode' && self.modes.indexOf($scope.datepickerMode) > self.modes.indexOf(self[key])) {\n $scope.datepickerMode = self[key];\n }\n }));\n } else {\n self[key] = $scope[key] = datepickerConfig[key] || null;\n }\n });\n\n if (angular.isDefined($attrs.initDate)) {\n if (datepickerAttributeWarning) {\n $log.warn('uib-datepicker initDate attribute usage is deprecated, use datepicker-options attribute instead');\n }\n\n var initDate = dateParser.fromTimezone($scope.$parent.$eval($attrs.initDate), ngModelOptions.timezone);\n this.activeDate = !isNaN(initDate) ? initDate : new Date();\n watchListeners.push($scope.$parent.$watch($attrs.initDate, function(initDate) {\n if (initDate && (ngModelCtrl.$isEmpty(ngModelCtrl.$modelValue) || ngModelCtrl.$invalid)) {\n initDate = dateParser.fromTimezone(initDate, ngModelOptions.timezone);\n self.activeDate = !isNaN(initDate) ? initDate : new Date();\n self.refreshView();\n }\n }));\n } else {\n this.activeDate = new Date();\n }\n\n if ($attrs.datepickerMode && datepickerAttributeWarning) {\n $log.warn('uib-datepicker datepickerMode attribute usage is deprecated, use datepicker-options attribute instead');\n }\n\n $scope.datepickerMode = $scope.datepickerMode ||\n datepickerConfig.datepickerMode;\n }\n\n $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);\n\n $scope.disabled = angular.isDefined($attrs.disabled) || false;\n if (angular.isDefined($attrs.ngDisabled)) {\n watchListeners.push($scope.$parent.$watch($attrs.ngDisabled, function(disabled) {\n $scope.disabled = disabled;\n self.refreshView();\n }));\n }\n\n $scope.isActive = function(dateObject) {\n if (self.compare(dateObject.date, self.activeDate) === 0) {\n $scope.activeDateId = dateObject.uid;\n return true;\n }\n return false;\n };\n\n this.init = function(ngModelCtrl_) {\n ngModelCtrl = ngModelCtrl_;\n ngModelOptions = ngModelCtrl_.$options || datepickerConfig.ngModelOptions;\n\n this.activeDate = ngModelCtrl.$modelValue || new Date();\n\n ngModelCtrl.$render = function() {\n self.render();\n };\n };\n\n this.render = function() {\n if (ngModelCtrl.$viewValue) {\n var date = new Date(ngModelCtrl.$viewValue),\n isValid = !isNaN(date);\n\n if (isValid) {\n this.activeDate = dateParser.fromTimezone(date, ngModelOptions.timezone);\n } else if (!$datepickerSuppressError) {\n $log.error('Datepicker directive: \"ng-model\" value must be a Date object');\n }\n }\n this.refreshView();\n };\n\n this.refreshView = function() {\n if (this.element) {\n $scope.selectedDt = null;\n this._refreshView();\n if ($scope.activeDt) {\n $scope.activeDateId = $scope.activeDt.uid;\n }\n\n var date = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null;\n date = dateParser.fromTimezone(date, ngModelOptions.timezone);\n ngModelCtrl.$setValidity('dateDisabled', !date ||\n this.element && !this.isDisabled(date));\n }\n };\n\n this.createDateObject = function(date, format) {\n var model = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null;\n model = dateParser.fromTimezone(model, ngModelOptions.timezone);\n var dt = {\n date: date,\n label: dateParser.filter(date, format),\n selected: model && this.compare(date, model) === 0,\n disabled: this.isDisabled(date),\n current: this.compare(date, new Date()) === 0,\n customClass: this.customClass(date) || null\n };\n\n if (model && this.compare(date, model) === 0) {\n $scope.selectedDt = dt;\n }\n\n if (self.activeDate && this.compare(dt.date, self.activeDate) === 0) {\n $scope.activeDt = dt;\n }\n\n return dt;\n };\n\n this.isDisabled = function(date) {\n return $scope.disabled ||\n this.minDate && this.compare(date, this.minDate) < 0 ||\n this.maxDate && this.compare(date, this.maxDate) > 0 ||\n $scope.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode});\n };\n\n this.customClass = function(date) {\n return $scope.customClass({date: date, mode: $scope.datepickerMode});\n };\n\n // Split array into smaller arrays\n this.split = function(arr, size) {\n var arrays = [];\n while (arr.length > 0) {\n arrays.push(arr.splice(0, size));\n }\n return arrays;\n };\n\n $scope.select = function(date) {\n if ($scope.datepickerMode === self.minMode) {\n var dt = ngModelCtrl.$viewValue ? dateParser.fromTimezone(new Date(ngModelCtrl.$viewValue), ngModelOptions.timezone) : new Date(0, 0, 0, 0, 0, 0, 0);\n dt.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n dt = dateParser.toTimezone(dt, ngModelOptions.timezone);\n ngModelCtrl.$setViewValue(dt);\n ngModelCtrl.$render();\n } else {\n self.activeDate = date;\n setMode(self.modes[self.modes.indexOf($scope.datepickerMode) - 1]);\n\n $scope.$emit('uib:datepicker.mode');\n }\n };\n\n $scope.move = function(direction) {\n var year = self.activeDate.getFullYear() + direction * (self.step.years || 0),\n month = self.activeDate.getMonth() + direction * (self.step.months || 0);\n self.activeDate.setFullYear(year, month, 1);\n self.refreshView();\n };\n\n $scope.toggleMode = function(direction) {\n direction = direction || 1;\n\n if ($scope.datepickerMode === self.maxMode && direction === 1 ||\n $scope.datepickerMode === self.minMode && direction === -1) {\n return;\n }\n\n setMode(self.modes[self.modes.indexOf($scope.datepickerMode) + direction]);\n\n $scope.$emit('uib:datepicker.mode');\n };\n\n // Key event mapper\n $scope.keys = { 13: 'enter', 32: 'space', 33: 'pageup', 34: 'pagedown', 35: 'end', 36: 'home', 37: 'left', 38: 'up', 39: 'right', 40: 'down' };\n\n var focusElement = function() {\n self.element[0].focus();\n };\n\n // Listen for focus requests from popup directive\n $scope.$on('uib:datepicker.focus', focusElement);\n\n $scope.keydown = function(evt) {\n var key = $scope.keys[evt.which];\n\n if (!key || evt.shiftKey || evt.altKey || $scope.disabled) {\n return;\n }\n\n evt.preventDefault();\n if (!self.shortcutPropagation) {\n evt.stopPropagation();\n }\n\n if (key === 'enter' || key === 'space') {\n if (self.isDisabled(self.activeDate)) {\n return; // do nothing\n }\n $scope.select(self.activeDate);\n } else if (evt.ctrlKey && (key === 'up' || key === 'down')) {\n $scope.toggleMode(key === 'up' ? 1 : -1);\n } else {\n self.handleKeyDown(key, evt);\n self.refreshView();\n }\n };\n\n $scope.$on(\"$destroy\", function() {\n //Clear all watch listeners on destroy\n while (watchListeners.length) {\n watchListeners.shift()();\n }\n });\n\n function setMode(mode) {\n $scope.datepickerMode = mode;\n if (optionsUsed) {\n $scope.datepickerOptions.datepickerMode = mode;\n }\n }\n}])\n\n.controller('UibDaypickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n this.step = { months: 1 };\n this.element = $element;\n function getDaysInMonth(year, month) {\n return month === 1 && year % 4 === 0 &&\n (year % 100 !== 0 || year % 400 === 0) ? 29 : DAYS_IN_MONTH[month];\n }\n\n this.init = function(ctrl) {\n angular.extend(ctrl, this);\n scope.showWeeks = ctrl.showWeeks;\n ctrl.refreshView();\n };\n\n this.getDates = function(startDate, n) {\n var dates = new Array(n), current = new Date(startDate), i = 0, date;\n while (i < n) {\n date = new Date(current);\n dates[i++] = date;\n current.setDate(current.getDate() + 1);\n }\n return dates;\n };\n\n this._refreshView = function() {\n var year = this.activeDate.getFullYear(),\n month = this.activeDate.getMonth(),\n firstDayOfMonth = new Date(this.activeDate);\n\n firstDayOfMonth.setFullYear(year, month, 1);\n\n var difference = this.startingDay - firstDayOfMonth.getDay(),\n numDisplayedFromPreviousMonth = difference > 0 ?\n 7 - difference : - difference,\n firstDate = new Date(firstDayOfMonth);\n\n if (numDisplayedFromPreviousMonth > 0) {\n firstDate.setDate(-numDisplayedFromPreviousMonth + 1);\n }\n\n // 42 is the number of days on a six-week calendar\n var days = this.getDates(firstDate, 42);\n for (var i = 0; i < 42; i ++) {\n days[i] = angular.extend(this.createDateObject(days[i], this.formatDay), {\n secondary: days[i].getMonth() !== month,\n uid: scope.uniqueId + '-' + i\n });\n }\n\n scope.labels = new Array(7);\n for (var j = 0; j < 7; j++) {\n scope.labels[j] = {\n abbr: dateFilter(days[j].date, this.formatDayHeader),\n full: dateFilter(days[j].date, 'EEEE')\n };\n }\n\n scope.title = dateFilter(this.activeDate, this.formatDayTitle);\n scope.rows = this.split(days, 7);\n\n if (scope.showWeeks) {\n scope.weekNumbers = [];\n var thursdayIndex = (4 + 7 - this.startingDay) % 7,\n numWeeks = scope.rows.length;\n for (var curWeek = 0; curWeek < numWeeks; curWeek++) {\n scope.weekNumbers.push(\n getISO8601WeekNumber(scope.rows[curWeek][thursdayIndex].date));\n }\n }\n };\n\n this.compare = function(date1, date2) {\n var _date1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate());\n var _date2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());\n _date1.setFullYear(date1.getFullYear());\n _date2.setFullYear(date2.getFullYear());\n return _date1 - _date2;\n };\n\n function getISO8601WeekNumber(date) {\n var checkDate = new Date(date);\n checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday\n var time = checkDate.getTime();\n checkDate.setMonth(0); // Compare with Jan 1\n checkDate.setDate(1);\n return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\n }\n\n this.handleKeyDown = function(key, evt) {\n var date = this.activeDate.getDate();\n\n if (key === 'left') {\n date = date - 1;\n } else if (key === 'up') {\n date = date - 7;\n } else if (key === 'right') {\n date = date + 1;\n } else if (key === 'down') {\n date = date + 7;\n } else if (key === 'pageup' || key === 'pagedown') {\n var month = this.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1);\n this.activeDate.setMonth(month, 1);\n date = Math.min(getDaysInMonth(this.activeDate.getFullYear(), this.activeDate.getMonth()), date);\n } else if (key === 'home') {\n date = 1;\n } else if (key === 'end') {\n date = getDaysInMonth(this.activeDate.getFullYear(), this.activeDate.getMonth());\n }\n this.activeDate.setDate(date);\n };\n}])\n\n.controller('UibMonthpickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n this.step = { years: 1 };\n this.element = $element;\n\n this.init = function(ctrl) {\n angular.extend(ctrl, this);\n ctrl.refreshView();\n };\n\n this._refreshView = function() {\n var months = new Array(12),\n year = this.activeDate.getFullYear(),\n date;\n\n for (var i = 0; i < 12; i++) {\n date = new Date(this.activeDate);\n date.setFullYear(year, i, 1);\n months[i] = angular.extend(this.createDateObject(date, this.formatMonth), {\n uid: scope.uniqueId + '-' + i\n });\n }\n\n scope.title = dateFilter(this.activeDate, this.formatMonthTitle);\n scope.rows = this.split(months, 3);\n };\n\n this.compare = function(date1, date2) {\n var _date1 = new Date(date1.getFullYear(), date1.getMonth());\n var _date2 = new Date(date2.getFullYear(), date2.getMonth());\n _date1.setFullYear(date1.getFullYear());\n _date2.setFullYear(date2.getFullYear());\n return _date1 - _date2;\n };\n\n this.handleKeyDown = function(key, evt) {\n var date = this.activeDate.getMonth();\n\n if (key === 'left') {\n date = date - 1;\n } else if (key === 'up') {\n date = date - 3;\n } else if (key === 'right') {\n date = date + 1;\n } else if (key === 'down') {\n date = date + 3;\n } else if (key === 'pageup' || key === 'pagedown') {\n var year = this.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1);\n this.activeDate.setFullYear(year);\n } else if (key === 'home') {\n date = 0;\n } else if (key === 'end') {\n date = 11;\n }\n this.activeDate.setMonth(date);\n };\n}])\n\n.controller('UibYearpickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n var columns, range;\n this.element = $element;\n\n function getStartingYear(year) {\n return parseInt((year - 1) / range, 10) * range + 1;\n }\n\n this.yearpickerInit = function() {\n columns = this.yearColumns;\n range = this.yearRows * columns;\n this.step = { years: range };\n };\n\n this._refreshView = function() {\n var years = new Array(range), date;\n\n for (var i = 0, start = getStartingYear(this.activeDate.getFullYear()); i < range; i++) {\n date = new Date(this.activeDate);\n date.setFullYear(start + i, 0, 1);\n years[i] = angular.extend(this.createDateObject(date, this.formatYear), {\n uid: scope.uniqueId + '-' + i\n });\n }\n\n scope.title = [years[0].label, years[range - 1].label].join(' - ');\n scope.rows = this.split(years, columns);\n scope.columns = columns;\n };\n\n this.compare = function(date1, date2) {\n return date1.getFullYear() - date2.getFullYear();\n };\n\n this.handleKeyDown = function(key, evt) {\n var date = this.activeDate.getFullYear();\n\n if (key === 'left') {\n date = date - 1;\n } else if (key === 'up') {\n date = date - columns;\n } else if (key === 'right') {\n date = date + 1;\n } else if (key === 'down') {\n date = date + columns;\n } else if (key === 'pageup' || key === 'pagedown') {\n date += (key === 'pageup' ? - 1 : 1) * range;\n } else if (key === 'home') {\n date = getStartingYear(this.activeDate.getFullYear());\n } else if (key === 'end') {\n date = getStartingYear(this.activeDate.getFullYear()) + range - 1;\n }\n this.activeDate.setFullYear(date);\n };\n}])\n\n.directive('uibDatepicker', function() {\n return {\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/datepicker.html';\n },\n scope: {\n datepickerMode: '=?',\n datepickerOptions: '=?',\n dateDisabled: '&',\n customClass: '&',\n shortcutPropagation: '&?'\n },\n require: ['uibDatepicker', '^ngModel'],\n controller: 'UibDatepickerController',\n controllerAs: 'datepicker',\n link: function(scope, element, attrs, ctrls) {\n var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n datepickerCtrl.init(ngModelCtrl);\n }\n };\n})\n\n.directive('uibDaypicker', function() {\n return {\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/day.html';\n },\n require: ['^uibDatepicker', 'uibDaypicker'],\n controller: 'UibDaypickerController',\n link: function(scope, element, attrs, ctrls) {\n var datepickerCtrl = ctrls[0],\n daypickerCtrl = ctrls[1];\n\n daypickerCtrl.init(datepickerCtrl);\n }\n };\n})\n\n.directive('uibMonthpicker', function() {\n return {\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/month.html';\n },\n require: ['^uibDatepicker', 'uibMonthpicker'],\n controller: 'UibMonthpickerController',\n link: function(scope, element, attrs, ctrls) {\n var datepickerCtrl = ctrls[0],\n monthpickerCtrl = ctrls[1];\n\n monthpickerCtrl.init(datepickerCtrl);\n }\n };\n})\n\n.directive('uibYearpicker', function() {\n return {\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/year.html';\n },\n require: ['^uibDatepicker', 'uibYearpicker'],\n controller: 'UibYearpickerController',\n link: function(scope, element, attrs, ctrls) {\n var ctrl = ctrls[0];\n angular.extend(ctrl, ctrls[1]);\n ctrl.yearpickerInit();\n\n ctrl.refreshView();\n }\n };\n})\n\n.value('uibDatepickerPopupAttributeWarning', true)\n\n.constant('uibDatepickerPopupConfig', {\n altInputFormats: [],\n appendToBody: false,\n clearText: 'Clear',\n closeOnDateSelection: true,\n closeText: 'Done',\n currentText: 'Today',\n datepickerPopup: 'yyyy-MM-dd',\n datepickerPopupTemplateUrl: 'uib/template/datepicker/popup.html',\n datepickerTemplateUrl: 'uib/template/datepicker/datepicker.html',\n html5Types: {\n date: 'yyyy-MM-dd',\n 'datetime-local': 'yyyy-MM-ddTHH:mm:ss.sss',\n 'month': 'yyyy-MM'\n },\n onOpenFocus: true,\n showButtonBar: true,\n placement: 'auto bottom-left'\n})\n\n.controller('UibDatepickerPopupController', ['$scope', '$element', '$attrs', '$compile', '$log', '$parse', '$window', '$document', '$rootScope', '$uibPosition', 'dateFilter', 'uibDateParser', 'uibDatepickerPopupConfig', '$timeout', 'uibDatepickerConfig', 'uibDatepickerPopupAttributeWarning',\nfunction($scope, $element, $attrs, $compile, $log, $parse, $window, $document, $rootScope, $position, dateFilter, dateParser, datepickerPopupConfig, $timeout, datepickerConfig, datepickerPopupAttributeWarning) {\n var cache = {},\n isHtml5DateInput = false;\n var dateFormat, closeOnDateSelection, appendToBody, onOpenFocus,\n datepickerPopupTemplateUrl, datepickerTemplateUrl, popupEl, datepickerEl, scrollParentEl,\n ngModel, ngModelOptions, $popup, altInputFormats, watchListeners = [];\n\n $scope.watchData = {};\n\n this.init = function(_ngModel_) {\n ngModel = _ngModel_;\n ngModelOptions = _ngModel_.$options || datepickerConfig.ngModelOptions;\n closeOnDateSelection = angular.isDefined($attrs.closeOnDateSelection) ?\n $scope.$parent.$eval($attrs.closeOnDateSelection) :\n datepickerPopupConfig.closeOnDateSelection;\n appendToBody = angular.isDefined($attrs.datepickerAppendToBody) ?\n $scope.$parent.$eval($attrs.datepickerAppendToBody) :\n datepickerPopupConfig.appendToBody;\n onOpenFocus = angular.isDefined($attrs.onOpenFocus) ?\n $scope.$parent.$eval($attrs.onOpenFocus) : datepickerPopupConfig.onOpenFocus;\n datepickerPopupTemplateUrl = angular.isDefined($attrs.datepickerPopupTemplateUrl) ?\n $attrs.datepickerPopupTemplateUrl :\n datepickerPopupConfig.datepickerPopupTemplateUrl;\n datepickerTemplateUrl = angular.isDefined($attrs.datepickerTemplateUrl) ?\n $attrs.datepickerTemplateUrl : datepickerPopupConfig.datepickerTemplateUrl;\n altInputFormats = angular.isDefined($attrs.altInputFormats) ?\n $scope.$parent.$eval($attrs.altInputFormats) :\n datepickerPopupConfig.altInputFormats;\n\n $scope.showButtonBar = angular.isDefined($attrs.showButtonBar) ?\n $scope.$parent.$eval($attrs.showButtonBar) :\n datepickerPopupConfig.showButtonBar;\n\n if (datepickerPopupConfig.html5Types[$attrs.type]) {\n dateFormat = datepickerPopupConfig.html5Types[$attrs.type];\n isHtml5DateInput = true;\n } else {\n dateFormat = $attrs.uibDatepickerPopup || datepickerPopupConfig.datepickerPopup;\n $attrs.$observe('uibDatepickerPopup', function(value, oldValue) {\n var newDateFormat = value || datepickerPopupConfig.datepickerPopup;\n // Invalidate the $modelValue to ensure that formatters re-run\n // FIXME: Refactor when PR is merged: https://github.com/angular/angular.js/pull/10764\n if (newDateFormat !== dateFormat) {\n dateFormat = newDateFormat;\n ngModel.$modelValue = null;\n\n if (!dateFormat) {\n throw new Error('uibDatepickerPopup must have a date format specified.');\n }\n }\n });\n }\n\n if (!dateFormat) {\n throw new Error('uibDatepickerPopup must have a date format specified.');\n }\n\n if (isHtml5DateInput && $attrs.uibDatepickerPopup) {\n throw new Error('HTML5 date input types do not support custom formats.');\n }\n\n // popup element used to display calendar\n popupEl = angular.element('
');\n $scope.ngModelOptions = angular.copy(ngModelOptions);\n $scope.ngModelOptions.timezone = null;\n if ($scope.ngModelOptions.updateOnDefault === true) {\n $scope.ngModelOptions.updateOn = $scope.ngModelOptions.updateOn ?\n $scope.ngModelOptions.updateOn + ' default' : 'default';\n }\n\n popupEl.attr({\n 'ng-model': 'date',\n 'ng-model-options': 'ngModelOptions',\n 'ng-change': 'dateSelection(date)',\n 'template-url': datepickerPopupTemplateUrl\n });\n\n // datepicker element\n datepickerEl = angular.element(popupEl.children()[0]);\n datepickerEl.attr('template-url', datepickerTemplateUrl);\n\n if (isHtml5DateInput) {\n if ($attrs.type === 'month') {\n datepickerEl.attr('datepicker-mode', '\"month\"');\n datepickerEl.attr('min-mode', 'month');\n }\n }\n\n if ($scope.datepickerOptions) {\n datepickerEl.attr('datepicker-options', 'datepickerOptions');\n }\n\n angular.forEach(['minMode', 'maxMode', 'datepickerMode', 'shortcutPropagation'], function(key) {\n if ($attrs[key]) {\n if (datepickerPopupAttributeWarning) {\n $log.warn('uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead');\n }\n\n var getAttribute = $parse($attrs[key]);\n var propConfig = {\n get: function() {\n return getAttribute($scope.$parent);\n }\n };\n\n datepickerEl.attr(cameltoDash(key), 'watchData.' + key);\n\n // Propagate changes from datepicker to outside\n if (key === 'datepickerMode') {\n var setAttribute = getAttribute.assign;\n propConfig.set = function(v) {\n setAttribute($scope.$parent, v);\n };\n }\n\n Object.defineProperty($scope.watchData, key, propConfig);\n }\n });\n\n angular.forEach(['minDate', 'maxDate', 'initDate'], function(key) {\n if ($attrs[key]) {\n if (datepickerPopupAttributeWarning) {\n $log.warn('uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead');\n }\n\n var getAttribute = $parse($attrs[key]);\n\n watchListeners.push($scope.$parent.$watch(getAttribute, function(value) {\n if (key === 'minDate' || key === 'maxDate') {\n if (value === null) {\n cache[key] = null;\n } else if (angular.isDate(value)) {\n cache[key] = dateParser.fromTimezone(new Date(value), ngModelOptions.timezone);\n } else {\n cache[key] = new Date(dateFilter(value, 'medium'));\n }\n\n $scope.watchData[key] = value === null ? null : cache[key];\n } else {\n var date = value ? new Date(value) : new Date();\n $scope.watchData[key] = dateParser.fromTimezone(date, ngModelOptions.timezone);\n }\n }));\n\n datepickerEl.attr(cameltoDash(key), 'watchData.' + key);\n }\n });\n\n if ($attrs.dateDisabled) {\n if (datepickerPopupAttributeWarning) {\n $log.warn('uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead');\n }\n\n datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })');\n }\n\n angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle', 'showWeeks', 'startingDay', 'yearRows', 'yearColumns'], function(key) {\n if (angular.isDefined($attrs[key])) {\n if (datepickerPopupAttributeWarning) {\n $log.warn('uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead');\n }\n\n datepickerEl.attr(cameltoDash(key), $attrs[key]);\n }\n });\n\n if ($attrs.customClass) {\n if (datepickerPopupAttributeWarning) {\n $log.warn('uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead');\n }\n\n datepickerEl.attr('custom-class', 'customClass({ date: date, mode: mode })');\n }\n\n if (!isHtml5DateInput) {\n // Internal API to maintain the correct ng-invalid-[key] class\n ngModel.$$parserName = 'date';\n ngModel.$validators.date = validator;\n ngModel.$parsers.unshift(parseDate);\n ngModel.$formatters.push(function(value) {\n if (ngModel.$isEmpty(value)) {\n $scope.date = value;\n return value;\n }\n\n $scope.date = dateParser.fromTimezone(value, ngModelOptions.timezone);\n\n if (angular.isNumber($scope.date)) {\n $scope.date = new Date($scope.date);\n }\n\n return dateParser.filter($scope.date, dateFormat);\n });\n } else {\n ngModel.$formatters.push(function(value) {\n $scope.date = dateParser.fromTimezone(value, ngModelOptions.timezone);\n return value;\n });\n }\n\n // Detect changes in the view from the text box\n ngModel.$viewChangeListeners.push(function() {\n $scope.date = parseDateString(ngModel.$viewValue);\n });\n\n $element.on('keydown', inputKeydownBind);\n\n $popup = $compile(popupEl)($scope);\n // Prevent jQuery cache memory leak (template is now redundant after linking)\n popupEl.remove();\n\n if (appendToBody) {\n $document.find('body').append($popup);\n } else {\n $element.after($popup);\n }\n\n $scope.$on('$destroy', function() {\n if ($scope.isOpen === true) {\n if (!$rootScope.$$phase) {\n $scope.$apply(function() {\n $scope.isOpen = false;\n });\n }\n }\n\n $popup.remove();\n $element.off('keydown', inputKeydownBind);\n $document.off('click', documentClickBind);\n if (scrollParentEl) {\n scrollParentEl.off('scroll', positionPopup);\n }\n angular.element($window).off('resize', positionPopup);\n\n //Clear all watch listeners on destroy\n while (watchListeners.length) {\n watchListeners.shift()();\n }\n });\n };\n\n $scope.getText = function(key) {\n return $scope[key + 'Text'] || datepickerPopupConfig[key + 'Text'];\n };\n\n $scope.isDisabled = function(date) {\n if (date === 'today') {\n date = new Date();\n }\n\n return $scope.watchData.minDate && $scope.compare(date, cache.minDate) < 0 ||\n $scope.watchData.maxDate && $scope.compare(date, cache.maxDate) > 0;\n };\n\n $scope.compare = function(date1, date2) {\n return new Date(date1.getFullYear(), date1.getMonth(), date1.getDate()) - new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());\n };\n\n // Inner change\n $scope.dateSelection = function(dt) {\n if (angular.isDefined(dt)) {\n $scope.date = dt;\n }\n var date = $scope.date ? dateParser.filter($scope.date, dateFormat) : null; // Setting to NULL is necessary for form validators to function\n $element.val(date);\n ngModel.$setViewValue(date);\n\n if (closeOnDateSelection) {\n $scope.isOpen = false;\n $element[0].focus();\n }\n };\n\n $scope.keydown = function(evt) {\n if (evt.which === 27) {\n evt.stopPropagation();\n $scope.isOpen = false;\n $element[0].focus();\n }\n };\n\n $scope.select = function(date, evt) {\n evt.stopPropagation();\n\n if (date === 'today') {\n var today = new Date();\n if (angular.isDate($scope.date)) {\n date = new Date($scope.date);\n date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate());\n } else {\n date = new Date(today.setHours(0, 0, 0, 0));\n }\n }\n $scope.dateSelection(date);\n };\n\n $scope.close = function(evt) {\n evt.stopPropagation();\n\n $scope.isOpen = false;\n $element[0].focus();\n };\n\n $scope.disabled = angular.isDefined($attrs.disabled) || false;\n if ($attrs.ngDisabled) {\n watchListeners.push($scope.$parent.$watch($parse($attrs.ngDisabled), function(disabled) {\n $scope.disabled = disabled;\n }));\n }\n\n $scope.$watch('isOpen', function(value) {\n if (value) {\n if (!$scope.disabled) {\n $timeout(function() {\n positionPopup();\n\n if (onOpenFocus) {\n $scope.$broadcast('uib:datepicker.focus');\n }\n $document.on('click', documentClickBind);\n\n var placement = $attrs.popupPlacement ? $attrs.popupPlacement : datepickerPopupConfig.placement;\n if (appendToBody || $position.parsePlacement(placement)[2]) {\n scrollParentEl = scrollParentEl || angular.element($position.scrollParent($element));\n if (scrollParentEl) {\n scrollParentEl.on('scroll', positionPopup);\n }\n } else {\n scrollParentEl = null;\n }\n\n angular.element($window).on('resize', positionPopup);\n }, 0, false);\n } else {\n $scope.isOpen = false;\n }\n } else {\n $document.off('click', documentClickBind);\n if (scrollParentEl) {\n scrollParentEl.off('scroll', positionPopup);\n }\n angular.element($window).off('resize', positionPopup);\n }\n });\n\n function cameltoDash(string) {\n return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); });\n }\n\n function parseDateString(viewValue) {\n var date = dateParser.parse(viewValue, dateFormat, $scope.date);\n if (isNaN(date)) {\n for (var i = 0; i < altInputFormats.length; i++) {\n date = dateParser.parse(viewValue, altInputFormats[i], $scope.date);\n if (!isNaN(date)) {\n return date;\n }\n }\n }\n return date;\n }\n\n function parseDate(viewValue) {\n if (angular.isNumber(viewValue)) {\n // presumably timestamp to date object\n viewValue = new Date(viewValue);\n }\n\n if (!viewValue) {\n return null;\n }\n\n if (angular.isDate(viewValue) && !isNaN(viewValue)) {\n return viewValue;\n }\n\n if (angular.isString(viewValue)) {\n var date = parseDateString(viewValue);\n if (!isNaN(date)) {\n return dateParser.toTimezone(date, ngModelOptions.timezone);\n }\n }\n\n return ngModel.$options && ngModel.$options.allowInvalid ? viewValue : undefined;\n }\n\n function validator(modelValue, viewValue) {\n var value = modelValue || viewValue;\n\n if (!$attrs.ngRequired && !value) {\n return true;\n }\n\n if (angular.isNumber(value)) {\n value = new Date(value);\n }\n\n if (!value) {\n return true;\n }\n\n if (angular.isDate(value) && !isNaN(value)) {\n return true;\n }\n\n if (angular.isString(value)) {\n return !isNaN(parseDateString(viewValue));\n }\n\n return false;\n }\n\n function documentClickBind(event) {\n if (!$scope.isOpen && $scope.disabled) {\n return;\n }\n\n var popup = $popup[0];\n var dpContainsTarget = $element[0].contains(event.target);\n // The popup node may not be an element node\n // In some browsers (IE) only element nodes have the 'contains' function\n var popupContainsTarget = popup.contains !== undefined && popup.contains(event.target);\n if ($scope.isOpen && !(dpContainsTarget || popupContainsTarget)) {\n $scope.$apply(function() {\n $scope.isOpen = false;\n });\n }\n }\n\n function inputKeydownBind(evt) {\n if (evt.which === 27 && $scope.isOpen) {\n evt.preventDefault();\n evt.stopPropagation();\n $scope.$apply(function() {\n $scope.isOpen = false;\n });\n $element[0].focus();\n } else if (evt.which === 40 && !$scope.isOpen) {\n evt.preventDefault();\n evt.stopPropagation();\n $scope.$apply(function() {\n $scope.isOpen = true;\n });\n }\n }\n\n function positionPopup() {\n if ($scope.isOpen) {\n var dpElement = angular.element($popup[0].querySelector('.uib-datepicker-popup'));\n var placement = $attrs.popupPlacement ? $attrs.popupPlacement : datepickerPopupConfig.placement;\n var position = $position.positionElements($element, dpElement, placement, appendToBody);\n dpElement.css({top: position.top + 'px', left: position.left + 'px'});\n if (dpElement.hasClass('uib-position-measure')) {\n dpElement.removeClass('uib-position-measure');\n }\n }\n }\n\n $scope.$on('uib:datepicker.mode', function() {\n $timeout(positionPopup, 0, false);\n });\n}])\n\n.directive('uibDatepickerPopup', function() {\n return {\n require: ['ngModel', 'uibDatepickerPopup'],\n controller: 'UibDatepickerPopupController',\n scope: {\n datepickerOptions: '=?',\n isOpen: '=?',\n currentText: '@',\n clearText: '@',\n closeText: '@',\n dateDisabled: '&',\n customClass: '&'\n },\n link: function(scope, element, attrs, ctrls) {\n var ngModel = ctrls[0],\n ctrl = ctrls[1];\n\n ctrl.init(ngModel);\n }\n };\n})\n\n.directive('uibDatepickerPopupWrap', function() {\n return {\n replace: true,\n transclude: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/popup.html';\n }\n };\n});\n\nangular.module('ui.bootstrap.debounce', [])\n/**\n * A helper, internal service that debounces a function\n */\n .factory('$$debounce', ['$timeout', function($timeout) {\n return function(callback, debounceTime) {\n var timeoutPromise;\n\n return function() {\n var self = this;\n var args = Array.prototype.slice.call(arguments);\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n\n timeoutPromise = $timeout(function() {\n callback.apply(self, args);\n }, debounceTime);\n };\n };\n }]);\n\nangular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])\n\n.constant('uibDropdownConfig', {\n appendToOpenClass: 'uib-dropdown-open',\n openClass: 'open'\n})\n\n.service('uibDropdownService', ['$document', '$rootScope', function($document, $rootScope) {\n var openScope = null;\n\n this.open = function(dropdownScope) {\n if (!openScope) {\n $document.on('click', closeDropdown);\n $document.on('keydown', keybindFilter);\n }\n\n if (openScope && openScope !== dropdownScope) {\n openScope.isOpen = false;\n }\n\n openScope = dropdownScope;\n };\n\n this.close = function(dropdownScope) {\n if (openScope === dropdownScope) {\n openScope = null;\n $document.off('click', closeDropdown);\n $document.off('keydown', keybindFilter);\n }\n };\n\n var closeDropdown = function(evt) {\n // This method may still be called during the same mouse event that\n // unbound this event handler. So check openScope before proceeding.\n if (!openScope) { return; }\n\n if (evt && openScope.getAutoClose() === 'disabled') { return; }\n\n if (evt && evt.which === 3) { return; }\n\n var toggleElement = openScope.getToggleElement();\n if (evt && toggleElement && toggleElement[0].contains(evt.target)) {\n return;\n }\n\n var dropdownElement = openScope.getDropdownElement();\n if (evt && openScope.getAutoClose() === 'outsideClick' &&\n dropdownElement && dropdownElement[0].contains(evt.target)) {\n return;\n }\n\n openScope.isOpen = false;\n\n if (!$rootScope.$$phase) {\n openScope.$apply();\n }\n };\n\n var keybindFilter = function(evt) {\n if (evt.which === 27) {\n openScope.focusToggleElement();\n closeDropdown();\n } else if (openScope.isKeynavEnabled() && [38, 40].indexOf(evt.which) !== -1 && openScope.isOpen) {\n evt.preventDefault();\n evt.stopPropagation();\n openScope.focusDropdownEntry(evt.which);\n }\n };\n}])\n\n.controller('UibDropdownController', ['$scope', '$element', '$attrs', '$parse', 'uibDropdownConfig', 'uibDropdownService', '$animate', '$uibPosition', '$document', '$compile', '$templateRequest', function($scope, $element, $attrs, $parse, dropdownConfig, uibDropdownService, $animate, $position, $document, $compile, $templateRequest) {\n var self = this,\n scope = $scope.$new(), // create a child scope so we are not polluting original one\n templateScope,\n appendToOpenClass = dropdownConfig.appendToOpenClass,\n openClass = dropdownConfig.openClass,\n getIsOpen,\n setIsOpen = angular.noop,\n toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop,\n appendToBody = false,\n appendTo = null,\n keynavEnabled = false,\n body = $document.find('body');\n\n $element.addClass('dropdown');\n\n this.init = function() {\n if ($attrs.isOpen) {\n getIsOpen = $parse($attrs.isOpen);\n setIsOpen = getIsOpen.assign;\n\n $scope.$watch(getIsOpen, function(value) {\n scope.isOpen = !!value;\n });\n }\n\n if (angular.isDefined($attrs.dropdownAppendTo)) {\n var appendToEl = $parse($attrs.dropdownAppendTo)(scope);\n if (appendToEl) {\n appendTo = angular.element(appendToEl);\n }\n }\n\n appendToBody = angular.isDefined($attrs.dropdownAppendToBody);\n keynavEnabled = angular.isDefined($attrs.keyboardNav);\n\n if (appendToBody && !appendTo) {\n appendTo = body;\n }\n\n if (appendTo && self.dropdownMenu) {\n appendTo.append(self.dropdownMenu);\n $element.on('$destroy', function handleDestroyEvent() {\n self.dropdownMenu.remove();\n });\n }\n };\n\n this.toggle = function(open) {\n return scope.isOpen = arguments.length ? !!open : !scope.isOpen;\n };\n\n // Allow other directives to watch status\n this.isOpen = function() {\n return scope.isOpen;\n };\n\n scope.getToggleElement = function() {\n return self.toggleElement;\n };\n\n scope.getAutoClose = function() {\n return $attrs.autoClose || 'always'; //or 'outsideClick' or 'disabled'\n };\n\n scope.getElement = function() {\n return $element;\n };\n\n scope.isKeynavEnabled = function() {\n return keynavEnabled;\n };\n\n scope.focusDropdownEntry = function(keyCode) {\n var elems = self.dropdownMenu ? //If append to body is used.\n angular.element(self.dropdownMenu).find('a') :\n $element.find('ul').eq(0).find('a');\n\n switch (keyCode) {\n case 40: {\n if (!angular.isNumber(self.selectedOption)) {\n self.selectedOption = 0;\n } else {\n self.selectedOption = self.selectedOption === elems.length - 1 ?\n self.selectedOption :\n self.selectedOption + 1;\n }\n break;\n }\n case 38: {\n if (!angular.isNumber(self.selectedOption)) {\n self.selectedOption = elems.length - 1;\n } else {\n self.selectedOption = self.selectedOption === 0 ?\n 0 : self.selectedOption - 1;\n }\n break;\n }\n }\n elems[self.selectedOption].focus();\n };\n\n scope.getDropdownElement = function() {\n return self.dropdownMenu;\n };\n\n scope.focusToggleElement = function() {\n if (self.toggleElement) {\n self.toggleElement[0].focus();\n }\n };\n\n scope.$watch('isOpen', function(isOpen, wasOpen) {\n if (appendTo && self.dropdownMenu) {\n var pos = $position.positionElements($element, self.dropdownMenu, 'bottom-left', true),\n css,\n rightalign;\n\n css = {\n top: pos.top + 'px',\n display: isOpen ? 'block' : 'none'\n };\n\n rightalign = self.dropdownMenu.hasClass('dropdown-menu-right');\n if (!rightalign) {\n css.left = pos.left + 'px';\n css.right = 'auto';\n } else {\n css.left = 'auto';\n css.right = window.innerWidth -\n (pos.left + $element.prop('offsetWidth')) + 'px';\n }\n\n // Need to adjust our positioning to be relative to the appendTo container\n // if it's not the body element\n if (!appendToBody) {\n var appendOffset = $position.offset(appendTo);\n\n css.top = pos.top - appendOffset.top + 'px';\n\n if (!rightalign) {\n css.left = pos.left - appendOffset.left + 'px';\n } else {\n css.right = window.innerWidth -\n (pos.left - appendOffset.left + $element.prop('offsetWidth')) + 'px';\n }\n }\n\n self.dropdownMenu.css(css);\n }\n\n var openContainer = appendTo ? appendTo : $element;\n var hasOpenClass = openContainer.hasClass(appendTo ? appendToOpenClass : openClass);\n\n if (hasOpenClass === !isOpen) {\n $animate[isOpen ? 'addClass' : 'removeClass'](openContainer, appendTo ? appendToOpenClass : openClass).then(function() {\n if (angular.isDefined(isOpen) && isOpen !== wasOpen) {\n toggleInvoker($scope, { open: !!isOpen });\n }\n });\n }\n\n if (isOpen) {\n if (self.dropdownMenuTemplateUrl) {\n $templateRequest(self.dropdownMenuTemplateUrl).then(function(tplContent) {\n templateScope = scope.$new();\n $compile(tplContent.trim())(templateScope, function(dropdownElement) {\n var newEl = dropdownElement;\n self.dropdownMenu.replaceWith(newEl);\n self.dropdownMenu = newEl;\n });\n });\n }\n\n scope.focusToggleElement();\n uibDropdownService.open(scope);\n } else {\n if (self.dropdownMenuTemplateUrl) {\n if (templateScope) {\n templateScope.$destroy();\n }\n var newEl = angular.element('');\n self.dropdownMenu.replaceWith(newEl);\n self.dropdownMenu = newEl;\n }\n\n uibDropdownService.close(scope);\n self.selectedOption = null;\n }\n\n if (angular.isFunction(setIsOpen)) {\n setIsOpen($scope, isOpen);\n }\n });\n\n $scope.$on('$locationChangeSuccess', function() {\n if (scope.getAutoClose() !== 'disabled') {\n scope.isOpen = false;\n }\n });\n}])\n\n.directive('uibDropdown', function() {\n return {\n controller: 'UibDropdownController',\n link: function(scope, element, attrs, dropdownCtrl) {\n dropdownCtrl.init();\n }\n };\n})\n\n.directive('uibDropdownMenu', function() {\n return {\n restrict: 'A',\n require: '?^uibDropdown',\n link: function(scope, element, attrs, dropdownCtrl) {\n if (!dropdownCtrl || angular.isDefined(attrs.dropdownNested)) {\n return;\n }\n\n element.addClass('dropdown-menu');\n\n var tplUrl = attrs.templateUrl;\n if (tplUrl) {\n dropdownCtrl.dropdownMenuTemplateUrl = tplUrl;\n }\n\n if (!dropdownCtrl.dropdownMenu) {\n dropdownCtrl.dropdownMenu = element;\n }\n }\n };\n})\n\n.directive('uibDropdownToggle', function() {\n return {\n require: '?^uibDropdown',\n link: function(scope, element, attrs, dropdownCtrl) {\n if (!dropdownCtrl) {\n return;\n }\n\n element.addClass('dropdown-toggle');\n\n dropdownCtrl.toggleElement = element;\n\n var toggleDropdown = function(event) {\n event.preventDefault();\n\n if (!element.hasClass('disabled') && !attrs.disabled) {\n scope.$apply(function() {\n dropdownCtrl.toggle();\n });\n }\n };\n\n element.bind('click', toggleDropdown);\n\n // WAI-ARIA\n element.attr({ 'aria-haspopup': true, 'aria-expanded': false });\n scope.$watch(dropdownCtrl.isOpen, function(isOpen) {\n element.attr('aria-expanded', !!isOpen);\n });\n\n scope.$on('$destroy', function() {\n element.unbind('click', toggleDropdown);\n });\n }\n };\n});\n\nangular.module('ui.bootstrap.stackedMap', [])\n/**\n * A helper, internal data structure that acts as a map but also allows getting / removing\n * elements in the LIFO order\n */\n .factory('$$stackedMap', function() {\n return {\n createNew: function() {\n var stack = [];\n\n return {\n add: function(key, value) {\n stack.push({\n key: key,\n value: value\n });\n },\n get: function(key) {\n for (var i = 0; i < stack.length; i++) {\n if (key === stack[i].key) {\n return stack[i];\n }\n }\n },\n keys: function() {\n var keys = [];\n for (var i = 0; i < stack.length; i++) {\n keys.push(stack[i].key);\n }\n return keys;\n },\n top: function() {\n return stack[stack.length - 1];\n },\n remove: function(key) {\n var idx = -1;\n for (var i = 0; i < stack.length; i++) {\n if (key === stack[i].key) {\n idx = i;\n break;\n }\n }\n return stack.splice(idx, 1)[0];\n },\n removeTop: function() {\n return stack.splice(stack.length - 1, 1)[0];\n },\n length: function() {\n return stack.length;\n }\n };\n }\n };\n });\nangular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap'])\n/**\n * A helper, internal data structure that stores all references attached to key\n */\n .factory('$$multiMap', function() {\n return {\n createNew: function() {\n var map = {};\n\n return {\n entries: function() {\n return Object.keys(map).map(function(key) {\n return {\n key: key,\n value: map[key]\n };\n });\n },\n get: function(key) {\n return map[key];\n },\n hasKey: function(key) {\n return !!map[key];\n },\n keys: function() {\n return Object.keys(map);\n },\n put: function(key, value) {\n if (!map[key]) {\n map[key] = [];\n }\n\n map[key].push(value);\n },\n remove: function(key, value) {\n var values = map[key];\n\n if (!values) {\n return;\n }\n\n var idx = values.indexOf(value);\n\n if (idx !== -1) {\n values.splice(idx, 1);\n }\n\n if (!values.length) {\n delete map[key];\n }\n }\n };\n }\n };\n })\n\n/**\n * Pluggable resolve mechanism for the modal resolve resolution\n * Supports UI Router's $resolve service\n */\n .provider('$uibResolve', function() {\n var resolve = this;\n this.resolver = null;\n\n this.setResolver = function(resolver) {\n this.resolver = resolver;\n };\n\n this.$get = ['$injector', '$q', function($injector, $q) {\n var resolver = resolve.resolver ? $injector.get(resolve.resolver) : null;\n return {\n resolve: function(invocables, locals, parent, self) {\n if (resolver) {\n return resolver.resolve(invocables, locals, parent, self);\n }\n\n var promises = [];\n\n angular.forEach(invocables, function(value) {\n if (angular.isFunction(value) || angular.isArray(value)) {\n promises.push($q.resolve($injector.invoke(value)));\n } else if (angular.isString(value)) {\n promises.push($q.resolve($injector.get(value)));\n } else {\n promises.push($q.resolve(value));\n }\n });\n\n return $q.all(promises).then(function(resolves) {\n var resolveObj = {};\n var resolveIter = 0;\n angular.forEach(invocables, function(value, key) {\n resolveObj[key] = resolves[resolveIter++];\n });\n\n return resolveObj;\n });\n }\n };\n }];\n })\n\n/**\n * A helper directive for the $modal service. It creates a backdrop element.\n */\n .directive('uibModalBackdrop', ['$animateCss', '$injector', '$uibModalStack',\n function($animateCss, $injector, $modalStack) {\n return {\n replace: true,\n templateUrl: 'uib/template/modal/backdrop.html',\n compile: function(tElement, tAttrs) {\n tElement.addClass(tAttrs.backdropClass);\n return linkFn;\n }\n };\n\n function linkFn(scope, element, attrs) {\n if (attrs.modalInClass) {\n $animateCss(element, {\n addClass: attrs.modalInClass\n }).start();\n\n scope.$on($modalStack.NOW_CLOSING_EVENT, function(e, setIsAsync) {\n var done = setIsAsync();\n if (scope.modalOptions.animation) {\n $animateCss(element, {\n removeClass: attrs.modalInClass\n }).start().then(done);\n } else {\n done();\n }\n });\n }\n }\n }])\n\n .directive('uibModalWindow', ['$uibModalStack', '$q', '$animate', '$animateCss', '$document',\n function($modalStack, $q, $animate, $animateCss, $document) {\n return {\n scope: {\n index: '@'\n },\n replace: true,\n transclude: true,\n templateUrl: function(tElement, tAttrs) {\n return tAttrs.templateUrl || 'uib/template/modal/window.html';\n },\n link: function(scope, element, attrs) {\n element.addClass(attrs.windowClass || '');\n element.addClass(attrs.windowTopClass || '');\n scope.size = attrs.size;\n\n scope.close = function(evt) {\n var modal = $modalStack.getTop();\n if (modal && modal.value.backdrop &&\n modal.value.backdrop !== 'static' &&\n evt.target === evt.currentTarget) {\n evt.preventDefault();\n evt.stopPropagation();\n $modalStack.dismiss(modal.key, 'backdrop click');\n }\n };\n\n // moved from template to fix issue #2280\n element.on('click', scope.close);\n\n // This property is only added to the scope for the purpose of detecting when this directive is rendered.\n // We can detect that by using this property in the template associated with this directive and then use\n // {@link Attribute#$observe} on it. For more details please see {@link TableColumnResize}.\n scope.$isRendered = true;\n\n // Deferred object that will be resolved when this modal is render.\n var modalRenderDeferObj = $q.defer();\n // Observe function will be called on next digest cycle after compilation, ensuring that the DOM is ready.\n // In order to use this way of finding whether DOM is ready, we need to observe a scope property used in modal's template.\n attrs.$observe('modalRender', function(value) {\n if (value === 'true') {\n modalRenderDeferObj.resolve();\n }\n });\n\n modalRenderDeferObj.promise.then(function() {\n var animationPromise = null;\n\n if (attrs.modalInClass) {\n animationPromise = $animateCss(element, {\n addClass: attrs.modalInClass\n }).start();\n\n scope.$on($modalStack.NOW_CLOSING_EVENT, function(e, setIsAsync) {\n var done = setIsAsync();\n if ($animateCss) {\n $animateCss(element, {\n removeClass: attrs.modalInClass\n }).start().then(done);\n } else {\n $animate.removeClass(element, attrs.modalInClass).then(done);\n }\n });\n }\n\n\n $q.when(animationPromise).then(function() {\n // Notify {@link $modalStack} that modal is rendered.\n var modal = $modalStack.getTop();\n if (modal) {\n $modalStack.modalRendered(modal.key);\n }\n\n /**\n * If something within the freshly-opened modal already has focus (perhaps via a\n * directive that causes focus). then no need to try and focus anything.\n */\n if (!($document[0].activeElement && element[0].contains($document[0].activeElement))) {\n var inputWithAutofocus = element[0].querySelector('[autofocus]');\n /**\n * Auto-focusing of a freshly-opened modal element causes any child elements\n * with the autofocus attribute to lose focus. This is an issue on touch\n * based devices which will show and then hide the onscreen keyboard.\n * Attempts to refocus the autofocus element via JavaScript will not reopen\n * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus\n * the modal element if the modal does not contain an autofocus element.\n */\n if (inputWithAutofocus) {\n inputWithAutofocus.focus();\n } else {\n element[0].focus();\n }\n }\n });\n });\n }\n };\n }])\n\n .directive('uibModalAnimationClass', function() {\n return {\n compile: function(tElement, tAttrs) {\n if (tAttrs.modalAnimation) {\n tElement.addClass(tAttrs.uibModalAnimationClass);\n }\n }\n };\n })\n\n .directive('uibModalTransclude', function() {\n return {\n link: function(scope, element, attrs, controller, transclude) {\n transclude(scope.$parent, function(clone) {\n element.empty();\n element.append(clone);\n });\n }\n };\n })\n\n .factory('$uibModalStack', ['$animate', '$animateCss', '$document',\n '$compile', '$rootScope', '$q', '$$multiMap', '$$stackedMap',\n function($animate, $animateCss, $document, $compile, $rootScope, $q, $$multiMap, $$stackedMap) {\n var OPENED_MODAL_CLASS = 'modal-open';\n\n var backdropDomEl, backdropScope;\n var openedWindows = $$stackedMap.createNew();\n var openedClasses = $$multiMap.createNew();\n var $modalStack = {\n NOW_CLOSING_EVENT: 'modal.stack.now-closing'\n };\n\n //Modal focus behavior\n var focusableElementList;\n var tababbleSelector = 'a[href], area[href], input:not([disabled]), ' +\n 'button:not([disabled]),select:not([disabled]), textarea:not([disabled]), ' +\n 'iframe, object, embed, *[tabindex], *[contenteditable=true]';\n\n function backdropIndex() {\n var topBackdropIndex = -1;\n var opened = openedWindows.keys();\n for (var i = 0; i < opened.length; i++) {\n if (openedWindows.get(opened[i]).value.backdrop) {\n topBackdropIndex = i;\n }\n }\n return topBackdropIndex;\n }\n\n $rootScope.$watch(backdropIndex, function(newBackdropIndex) {\n if (backdropScope) {\n backdropScope.index = newBackdropIndex;\n }\n });\n\n function removeModalWindow(modalInstance, elementToReceiveFocus) {\n var modalWindow = openedWindows.get(modalInstance).value;\n var appendToElement = modalWindow.appendTo;\n\n //clean up the stack\n openedWindows.remove(modalInstance);\n\n removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, function() {\n var modalBodyClass = modalWindow.openedClass || OPENED_MODAL_CLASS;\n openedClasses.remove(modalBodyClass, modalInstance);\n appendToElement.toggleClass(modalBodyClass, openedClasses.hasKey(modalBodyClass));\n toggleTopWindowClass(true);\n }, modalWindow.closedDeferred);\n checkRemoveBackdrop();\n\n //move focus to specified element if available, or else to body\n if (elementToReceiveFocus && elementToReceiveFocus.focus) {\n elementToReceiveFocus.focus();\n } else if (appendToElement.focus) {\n appendToElement.focus();\n }\n }\n\n // Add or remove \"windowTopClass\" from the top window in the stack\n function toggleTopWindowClass(toggleSwitch) {\n var modalWindow;\n\n if (openedWindows.length() > 0) {\n modalWindow = openedWindows.top().value;\n modalWindow.modalDomEl.toggleClass(modalWindow.windowTopClass || '', toggleSwitch);\n }\n }\n\n function checkRemoveBackdrop() {\n //remove backdrop if no longer needed\n if (backdropDomEl && backdropIndex() === -1) {\n removeAfterAnimate(backdropDomEl, backdropScope, function() {\n });\n backdropDomEl = undefined;\n backdropScope = undefined;\n }\n }\n\n function removeAfterAnimate(domEl, scope, done, closedDeferred) {\n var asyncDeferred;\n var asyncPromise = null;\n var setIsAsync = function() {\n if (!asyncDeferred) {\n asyncDeferred = $q.defer();\n asyncPromise = asyncDeferred.promise;\n }\n\n return function asyncDone() {\n asyncDeferred.resolve();\n };\n };\n scope.$broadcast($modalStack.NOW_CLOSING_EVENT, setIsAsync);\n\n // Note that it's intentional that asyncPromise might be null.\n // That's when setIsAsync has not been called during the\n // NOW_CLOSING_EVENT broadcast.\n return $q.when(asyncPromise).then(afterAnimating);\n\n function afterAnimating() {\n if (afterAnimating.done) {\n return;\n }\n afterAnimating.done = true;\n\n $animateCss(domEl, {\n event: 'leave'\n }).start().then(function() {\n domEl.remove();\n if (closedDeferred) {\n closedDeferred.resolve();\n }\n });\n\n scope.$destroy();\n if (done) {\n done();\n }\n }\n }\n\n $document.on('keydown', keydownListener);\n\n $rootScope.$on('$destroy', function() {\n $document.off('keydown', keydownListener);\n });\n\n function keydownListener(evt) {\n if (evt.isDefaultPrevented()) {\n return evt;\n }\n\n var modal = openedWindows.top();\n if (modal) {\n switch (evt.which) {\n case 27: {\n if (modal.value.keyboard) {\n evt.preventDefault();\n $rootScope.$apply(function() {\n $modalStack.dismiss(modal.key, 'escape key press');\n });\n }\n break;\n }\n case 9: {\n $modalStack.loadFocusElementList(modal);\n var focusChanged = false;\n if (evt.shiftKey) {\n if ($modalStack.isFocusInFirstItem(evt) || $modalStack.isModalFocused(evt, modal)) {\n focusChanged = $modalStack.focusLastFocusableElement();\n }\n } else {\n if ($modalStack.isFocusInLastItem(evt)) {\n focusChanged = $modalStack.focusFirstFocusableElement();\n }\n }\n\n if (focusChanged) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n break;\n }\n }\n }\n }\n\n $modalStack.open = function(modalInstance, modal) {\n var modalOpener = $document[0].activeElement,\n modalBodyClass = modal.openedClass || OPENED_MODAL_CLASS;\n\n toggleTopWindowClass(false);\n\n openedWindows.add(modalInstance, {\n deferred: modal.deferred,\n renderDeferred: modal.renderDeferred,\n closedDeferred: modal.closedDeferred,\n modalScope: modal.scope,\n backdrop: modal.backdrop,\n keyboard: modal.keyboard,\n openedClass: modal.openedClass,\n windowTopClass: modal.windowTopClass,\n animation: modal.animation,\n appendTo: modal.appendTo\n });\n\n openedClasses.put(modalBodyClass, modalInstance);\n\n var appendToElement = modal.appendTo,\n currBackdropIndex = backdropIndex();\n\n if (!appendToElement.length) {\n throw new Error('appendTo element not found. Make sure that the element passed is in DOM.');\n }\n\n if (currBackdropIndex >= 0 && !backdropDomEl) {\n backdropScope = $rootScope.$new(true);\n backdropScope.modalOptions = modal;\n backdropScope.index = currBackdropIndex;\n backdropDomEl = angular.element('
');\n backdropDomEl.attr('backdrop-class', modal.backdropClass);\n if (modal.animation) {\n backdropDomEl.attr('modal-animation', 'true');\n }\n $compile(backdropDomEl)(backdropScope);\n $animate.enter(backdropDomEl, appendToElement);\n }\n\n var angularDomEl = angular.element('
');\n angularDomEl.attr({\n 'template-url': modal.windowTemplateUrl,\n 'window-class': modal.windowClass,\n 'window-top-class': modal.windowTopClass,\n 'size': modal.size,\n 'index': openedWindows.length() - 1,\n 'animate': 'animate'\n }).html(modal.content);\n if (modal.animation) {\n angularDomEl.attr('modal-animation', 'true');\n }\n\n $animate.enter($compile(angularDomEl)(modal.scope), appendToElement)\n .then(function() {\n if (!modal.scope.$$uibDestructionScheduled) {\n $animate.addClass(appendToElement, modalBodyClass);\n }\n });\n\n openedWindows.top().value.modalDomEl = angularDomEl;\n openedWindows.top().value.modalOpener = modalOpener;\n\n $modalStack.clearFocusListCache();\n };\n\n function broadcastClosing(modalWindow, resultOrReason, closing) {\n return !modalWindow.value.modalScope.$broadcast('modal.closing', resultOrReason, closing).defaultPrevented;\n }\n\n $modalStack.close = function(modalInstance, result) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow && broadcastClosing(modalWindow, result, true)) {\n modalWindow.value.modalScope.$$uibDestructionScheduled = true;\n modalWindow.value.deferred.resolve(result);\n removeModalWindow(modalInstance, modalWindow.value.modalOpener);\n return true;\n }\n return !modalWindow;\n };\n\n $modalStack.dismiss = function(modalInstance, reason) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow && broadcastClosing(modalWindow, reason, false)) {\n modalWindow.value.modalScope.$$uibDestructionScheduled = true;\n modalWindow.value.deferred.reject(reason);\n removeModalWindow(modalInstance, modalWindow.value.modalOpener);\n return true;\n }\n return !modalWindow;\n };\n\n $modalStack.dismissAll = function(reason) {\n var topModal = this.getTop();\n while (topModal && this.dismiss(topModal.key, reason)) {\n topModal = this.getTop();\n }\n };\n\n $modalStack.getTop = function() {\n return openedWindows.top();\n };\n\n $modalStack.modalRendered = function(modalInstance) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow) {\n modalWindow.value.renderDeferred.resolve();\n }\n };\n\n $modalStack.focusFirstFocusableElement = function() {\n if (focusableElementList.length > 0) {\n focusableElementList[0].focus();\n return true;\n }\n return false;\n };\n $modalStack.focusLastFocusableElement = function() {\n if (focusableElementList.length > 0) {\n focusableElementList[focusableElementList.length - 1].focus();\n return true;\n }\n return false;\n };\n\n $modalStack.isModalFocused = function(evt, modalWindow) {\n if (evt && modalWindow) {\n var modalDomEl = modalWindow.value.modalDomEl;\n if (modalDomEl && modalDomEl.length) {\n return (evt.target || evt.srcElement) === modalDomEl[0];\n }\n }\n return false;\n };\n\n $modalStack.isFocusInFirstItem = function(evt) {\n if (focusableElementList.length > 0) {\n return (evt.target || evt.srcElement) === focusableElementList[0];\n }\n return false;\n };\n\n $modalStack.isFocusInLastItem = function(evt) {\n if (focusableElementList.length > 0) {\n return (evt.target || evt.srcElement) === focusableElementList[focusableElementList.length - 1];\n }\n return false;\n };\n\n $modalStack.clearFocusListCache = function() {\n focusableElementList = [];\n };\n\n $modalStack.loadFocusElementList = function(modalWindow) {\n if (focusableElementList === undefined || !focusableElementList.length) {\n if (modalWindow) {\n var modalDomE1 = modalWindow.value.modalDomEl;\n if (modalDomE1 && modalDomE1.length) {\n focusableElementList = modalDomE1[0].querySelectorAll(tababbleSelector);\n }\n }\n }\n };\n\n return $modalStack;\n }])\n\n .provider('$uibModal', function() {\n var $modalProvider = {\n options: {\n animation: true,\n backdrop: true, //can also be false or 'static'\n keyboard: true\n },\n $get: ['$rootScope', '$q', '$document', '$templateRequest', '$controller', '$uibResolve', '$uibModalStack',\n function ($rootScope, $q, $document, $templateRequest, $controller, $uibResolve, $modalStack) {\n var $modal = {};\n\n function getTemplatePromise(options) {\n return options.template ? $q.when(options.template) :\n $templateRequest(angular.isFunction(options.templateUrl) ?\n options.templateUrl() : options.templateUrl);\n }\n\n var promiseChain = null;\n $modal.getPromiseChain = function() {\n return promiseChain;\n };\n\n $modal.open = function(modalOptions) {\n var modalResultDeferred = $q.defer();\n var modalOpenedDeferred = $q.defer();\n var modalClosedDeferred = $q.defer();\n var modalRenderDeferred = $q.defer();\n\n //prepare an instance of a modal to be injected into controllers and returned to a caller\n var modalInstance = {\n result: modalResultDeferred.promise,\n opened: modalOpenedDeferred.promise,\n closed: modalClosedDeferred.promise,\n rendered: modalRenderDeferred.promise,\n close: function (result) {\n return $modalStack.close(modalInstance, result);\n },\n dismiss: function (reason) {\n return $modalStack.dismiss(modalInstance, reason);\n }\n };\n\n //merge and clean up options\n modalOptions = angular.extend({}, $modalProvider.options, modalOptions);\n modalOptions.resolve = modalOptions.resolve || {};\n modalOptions.appendTo = modalOptions.appendTo || $document.find('body').eq(0);\n\n //verify options\n if (!modalOptions.template && !modalOptions.templateUrl) {\n throw new Error('One of template or templateUrl options is required.');\n }\n\n var templateAndResolvePromise =\n $q.all([getTemplatePromise(modalOptions), $uibResolve.resolve(modalOptions.resolve, {}, null, null)]);\n\n function resolveWithTemplate() {\n return templateAndResolvePromise;\n }\n\n // Wait for the resolution of the existing promise chain.\n // Then switch to our own combined promise dependency (regardless of how the previous modal fared).\n // Then add to $modalStack and resolve opened.\n // Finally clean up the chain variable if no subsequent modal has overwritten it.\n var samePromise;\n samePromise = promiseChain = $q.all([promiseChain])\n .then(resolveWithTemplate, resolveWithTemplate)\n .then(function resolveSuccess(tplAndVars) {\n var providedScope = modalOptions.scope || $rootScope;\n\n var modalScope = providedScope.$new();\n modalScope.$close = modalInstance.close;\n modalScope.$dismiss = modalInstance.dismiss;\n\n modalScope.$on('$destroy', function() {\n if (!modalScope.$$uibDestructionScheduled) {\n modalScope.$dismiss('$uibUnscheduledDestruction');\n }\n });\n\n var ctrlInstance, ctrlLocals = {};\n\n //controllers\n if (modalOptions.controller) {\n ctrlLocals.$scope = modalScope;\n ctrlLocals.$uibModalInstance = modalInstance;\n angular.forEach(tplAndVars[1], function(value, key) {\n ctrlLocals[key] = value;\n });\n\n ctrlInstance = $controller(modalOptions.controller, ctrlLocals);\n if (modalOptions.controllerAs) {\n if (modalOptions.bindToController) {\n ctrlInstance.$close = modalScope.$close;\n ctrlInstance.$dismiss = modalScope.$dismiss;\n angular.extend(ctrlInstance, providedScope);\n if (angular.isFunction(ctrlInstance.$onInit)) {\n ctrlInstance.$onInit();\n }\n }\n\n modalScope[modalOptions.controllerAs] = ctrlInstance;\n }\n }\n\n $modalStack.open(modalInstance, {\n scope: modalScope,\n deferred: modalResultDeferred,\n renderDeferred: modalRenderDeferred,\n closedDeferred: modalClosedDeferred,\n content: tplAndVars[0],\n animation: modalOptions.animation,\n backdrop: modalOptions.backdrop,\n keyboard: modalOptions.keyboard,\n backdropClass: modalOptions.backdropClass,\n windowTopClass: modalOptions.windowTopClass,\n windowClass: modalOptions.windowClass,\n windowTemplateUrl: modalOptions.windowTemplateUrl,\n size: modalOptions.size,\n openedClass: modalOptions.openedClass,\n appendTo: modalOptions.appendTo\n });\n modalOpenedDeferred.resolve(true);\n\n }, function resolveError(reason) {\n modalOpenedDeferred.reject(reason);\n modalResultDeferred.reject(reason);\n })['finally'](function() {\n if (promiseChain === samePromise) {\n promiseChain = null;\n }\n });\n\n return modalInstance;\n };\n\n return $modal;\n }\n ]\n };\n\n return $modalProvider;\n });\n\nangular.module('ui.bootstrap.paging', [])\n/**\n * Helper internal service for generating common controller code between the\n * pager and pagination components\n */\n.factory('uibPaging', ['$parse', function($parse) {\n return {\n create: function(ctrl, $scope, $attrs) {\n ctrl.setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop;\n ctrl.ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl\n ctrl._watchers = [];\n\n ctrl.init = function(ngModelCtrl, config) {\n ctrl.ngModelCtrl = ngModelCtrl;\n ctrl.config = config;\n\n ngModelCtrl.$render = function() {\n ctrl.render();\n };\n\n if ($attrs.itemsPerPage) {\n ctrl._watchers.push($scope.$parent.$watch($attrs.itemsPerPage, function(value) {\n ctrl.itemsPerPage = parseInt(value, 10);\n $scope.totalPages = ctrl.calculateTotalPages();\n ctrl.updatePage();\n }));\n } else {\n ctrl.itemsPerPage = config.itemsPerPage;\n }\n\n $scope.$watch('totalItems', function(newTotal, oldTotal) {\n if (angular.isDefined(newTotal) || newTotal !== oldTotal) {\n $scope.totalPages = ctrl.calculateTotalPages();\n ctrl.updatePage();\n }\n });\n };\n\n ctrl.calculateTotalPages = function() {\n var totalPages = ctrl.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / ctrl.itemsPerPage);\n return Math.max(totalPages || 0, 1);\n };\n\n ctrl.render = function() {\n $scope.page = parseInt(ctrl.ngModelCtrl.$viewValue, 10) || 1;\n };\n\n $scope.selectPage = function(page, evt) {\n if (evt) {\n evt.preventDefault();\n }\n\n var clickAllowed = !$scope.ngDisabled || !evt;\n if (clickAllowed && $scope.page !== page && page > 0 && page <= $scope.totalPages) {\n if (evt && evt.target) {\n evt.target.blur();\n }\n ctrl.ngModelCtrl.$setViewValue(page);\n ctrl.ngModelCtrl.$render();\n }\n };\n\n $scope.getText = function(key) {\n return $scope[key + 'Text'] || ctrl.config[key + 'Text'];\n };\n\n $scope.noPrevious = function() {\n return $scope.page === 1;\n };\n\n $scope.noNext = function() {\n return $scope.page === $scope.totalPages;\n };\n\n ctrl.updatePage = function() {\n ctrl.setNumPages($scope.$parent, $scope.totalPages); // Readonly variable\n\n if ($scope.page > $scope.totalPages) {\n $scope.selectPage($scope.totalPages);\n } else {\n ctrl.ngModelCtrl.$render();\n }\n };\n\n $scope.$on('$destroy', function() {\n while (ctrl._watchers.length) {\n ctrl._watchers.shift()();\n }\n });\n }\n };\n}]);\n\nangular.module('ui.bootstrap.pager', ['ui.bootstrap.paging'])\n\n.controller('UibPagerController', ['$scope', '$attrs', 'uibPaging', 'uibPagerConfig', function($scope, $attrs, uibPaging, uibPagerConfig) {\n $scope.align = angular.isDefined($attrs.align) ? $scope.$parent.$eval($attrs.align) : uibPagerConfig.align;\n\n uibPaging.create(this, $scope, $attrs);\n}])\n\n.constant('uibPagerConfig', {\n itemsPerPage: 10,\n previousText: '\u00AB Previous',\n nextText: 'Next \u00BB',\n align: true\n})\n\n.directive('uibPager', ['uibPagerConfig', function(uibPagerConfig) {\n return {\n scope: {\n totalItems: '=',\n previousText: '@',\n nextText: '@',\n ngDisabled: '='\n },\n require: ['uibPager', '?ngModel'],\n controller: 'UibPagerController',\n controllerAs: 'pager',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/pager/pager.html';\n },\n replace: true,\n link: function(scope, element, attrs, ctrls) {\n var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n if (!ngModelCtrl) {\n return; // do nothing if no ng-model\n }\n\n paginationCtrl.init(ngModelCtrl, uibPagerConfig);\n }\n };\n}]);\n\nangular.module('ui.bootstrap.pagination', ['ui.bootstrap.paging'])\n.controller('UibPaginationController', ['$scope', '$attrs', '$parse', 'uibPaging', 'uibPaginationConfig', function($scope, $attrs, $parse, uibPaging, uibPaginationConfig) {\n var ctrl = this;\n // Setup configuration parameters\n var maxSize = angular.isDefined($attrs.maxSize) ? $scope.$parent.$eval($attrs.maxSize) : uibPaginationConfig.maxSize,\n rotate = angular.isDefined($attrs.rotate) ? $scope.$parent.$eval($attrs.rotate) : uibPaginationConfig.rotate,\n forceEllipses = angular.isDefined($attrs.forceEllipses) ? $scope.$parent.$eval($attrs.forceEllipses) : uibPaginationConfig.forceEllipses,\n boundaryLinkNumbers = angular.isDefined($attrs.boundaryLinkNumbers) ? $scope.$parent.$eval($attrs.boundaryLinkNumbers) : uibPaginationConfig.boundaryLinkNumbers,\n pageLabel = angular.isDefined($attrs.pageLabel) ? function(idx) { return $scope.$parent.$eval($attrs.pageLabel, {$page: idx}); } : angular.identity;\n $scope.boundaryLinks = angular.isDefined($attrs.boundaryLinks) ? $scope.$parent.$eval($attrs.boundaryLinks) : uibPaginationConfig.boundaryLinks;\n $scope.directionLinks = angular.isDefined($attrs.directionLinks) ? $scope.$parent.$eval($attrs.directionLinks) : uibPaginationConfig.directionLinks;\n\n uibPaging.create(this, $scope, $attrs);\n\n if ($attrs.maxSize) {\n ctrl._watchers.push($scope.$parent.$watch($parse($attrs.maxSize), function(value) {\n maxSize = parseInt(value, 10);\n ctrl.render();\n }));\n }\n\n // Create page object used in template\n function makePage(number, text, isActive) {\n return {\n number: number,\n text: text,\n active: isActive\n };\n }\n\n function getPages(currentPage, totalPages) {\n var pages = [];\n\n // Default page limits\n var startPage = 1, endPage = totalPages;\n var isMaxSized = angular.isDefined(maxSize) && maxSize < totalPages;\n\n // recompute if maxSize\n if (isMaxSized) {\n if (rotate) {\n // Current page is displayed in the middle of the visible ones\n startPage = Math.max(currentPage - Math.floor(maxSize / 2), 1);\n endPage = startPage + maxSize - 1;\n\n // Adjust if limit is exceeded\n if (endPage > totalPages) {\n endPage = totalPages;\n startPage = endPage - maxSize + 1;\n }\n } else {\n // Visible pages are paginated with maxSize\n startPage = (Math.ceil(currentPage / maxSize) - 1) * maxSize + 1;\n\n // Adjust last page if limit is exceeded\n endPage = Math.min(startPage + maxSize - 1, totalPages);\n }\n }\n\n // Add page number links\n for (var number = startPage; number <= endPage; number++) {\n var page = makePage(number, pageLabel(number), number === currentPage);\n pages.push(page);\n }\n\n // Add links to move between page sets\n if (isMaxSized && maxSize > 0 && (!rotate || forceEllipses || boundaryLinkNumbers)) {\n if (startPage > 1) {\n if (!boundaryLinkNumbers || startPage > 3) { //need ellipsis for all options unless range is too close to beginning\n var previousPageSet = makePage(startPage - 1, '...', false);\n pages.unshift(previousPageSet);\n }\n if (boundaryLinkNumbers) {\n if (startPage === 3) { //need to replace ellipsis when the buttons would be sequential\n var secondPageLink = makePage(2, '2', false);\n pages.unshift(secondPageLink);\n }\n //add the first page\n var firstPageLink = makePage(1, '1', false);\n pages.unshift(firstPageLink);\n }\n }\n\n if (endPage < totalPages) {\n if (!boundaryLinkNumbers || endPage < totalPages - 2) { //need ellipsis for all options unless range is too close to end\n var nextPageSet = makePage(endPage + 1, '...', false);\n pages.push(nextPageSet);\n }\n if (boundaryLinkNumbers) {\n if (endPage === totalPages - 2) { //need to replace ellipsis when the buttons would be sequential\n var secondToLastPageLink = makePage(totalPages - 1, totalPages - 1, false);\n pages.push(secondToLastPageLink);\n }\n //add the last page\n var lastPageLink = makePage(totalPages, totalPages, false);\n pages.push(lastPageLink);\n }\n }\n }\n return pages;\n }\n\n var originalRender = this.render;\n this.render = function() {\n originalRender();\n if ($scope.page > 0 && $scope.page <= $scope.totalPages) {\n $scope.pages = getPages($scope.page, $scope.totalPages);\n }\n };\n}])\n\n.constant('uibPaginationConfig', {\n itemsPerPage: 10,\n boundaryLinks: false,\n boundaryLinkNumbers: false,\n directionLinks: true,\n firstText: 'First',\n previousText: 'Previous',\n nextText: 'Next',\n lastText: 'Last',\n rotate: true,\n forceEllipses: false\n})\n\n.directive('uibPagination', ['$parse', 'uibPaginationConfig', function($parse, uibPaginationConfig) {\n return {\n scope: {\n totalItems: '=',\n firstText: '@',\n previousText: '@',\n nextText: '@',\n lastText: '@',\n ngDisabled:'='\n },\n require: ['uibPagination', '?ngModel'],\n controller: 'UibPaginationController',\n controllerAs: 'pagination',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/pagination/pagination.html';\n },\n replace: true,\n link: function(scope, element, attrs, ctrls) {\n var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n if (!ngModelCtrl) {\n return; // do nothing if no ng-model\n }\n\n paginationCtrl.init(ngModelCtrl, uibPaginationConfig);\n }\n };\n}]);\n\n/**\n * The following features are still outstanding: animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, html tooltips, and selector delegation.\n */\nangular.module('ui.bootstrap.tooltip', ['ui.bootstrap.position', 'ui.bootstrap.stackedMap'])\n\n/**\n * The $tooltip service creates tooltip- and popover-like directives as well as\n * houses global options for them.\n */\n.provider('$uibTooltip', function() {\n // The default options tooltip and popover.\n var defaultOptions = {\n placement: 'top',\n placementClassPrefix: '',\n animation: true,\n popupDelay: 0,\n popupCloseDelay: 0,\n useContentExp: false\n };\n\n // Default hide triggers for each show trigger\n var triggerMap = {\n 'mouseenter': 'mouseleave',\n 'click': 'click',\n 'outsideClick': 'outsideClick',\n 'focus': 'blur',\n 'none': ''\n };\n\n // The options specified to the provider globally.\n var globalOptions = {};\n\n /**\n * `options({})` allows global configuration of all tooltips in the\n * application.\n *\n * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) {\n * // place tooltips left instead of top by default\n * $tooltipProvider.options( { placement: 'left' } );\n * });\n */\n\tthis.options = function(value) {\n\t\tangular.extend(globalOptions, value);\n\t};\n\n /**\n * This allows you to extend the set of trigger mappings available. E.g.:\n *\n * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' );\n */\n this.setTriggers = function setTriggers(triggers) {\n angular.extend(triggerMap, triggers);\n };\n\n /**\n * This is a helper function for translating camel-case to snake_case.\n */\n function snake_case(name) {\n var regexp = /[A-Z]/g;\n var separator = '-';\n return name.replace(regexp, function(letter, pos) {\n return (pos ? separator : '') + letter.toLowerCase();\n });\n }\n\n /**\n * Returns the actual instance of the $tooltip service.\n * TODO support multiple triggers\n */\n this.$get = ['$window', '$compile', '$timeout', '$document', '$uibPosition', '$interpolate', '$rootScope', '$parse', '$$stackedMap', function($window, $compile, $timeout, $document, $position, $interpolate, $rootScope, $parse, $$stackedMap) {\n var openedTooltips = $$stackedMap.createNew();\n $document.on('keypress', keypressListener);\n\n $rootScope.$on('$destroy', function() {\n $document.off('keypress', keypressListener);\n });\n\n function keypressListener(e) {\n if (e.which === 27) {\n var last = openedTooltips.top();\n if (last) {\n last.value.close();\n openedTooltips.removeTop();\n last = null;\n }\n }\n }\n\n return function $tooltip(ttType, prefix, defaultTriggerShow, options) {\n options = angular.extend({}, defaultOptions, globalOptions, options);\n\n /**\n * Returns an object of show and hide triggers.\n *\n * If a trigger is supplied,\n * it is used to show the tooltip; otherwise, it will use the `trigger`\n * option passed to the `$tooltipProvider.options` method; else it will\n * default to the trigger supplied to this directive factory.\n *\n * The hide trigger is based on the show trigger. If the `trigger` option\n * was passed to the `$tooltipProvider.options` method, it will use the\n * mapped trigger from `triggerMap` or the passed trigger if the map is\n * undefined; otherwise, it uses the `triggerMap` value of the show\n * trigger; else it will just use the show trigger.\n */\n function getTriggers(trigger) {\n var show = (trigger || options.trigger || defaultTriggerShow).split(' ');\n var hide = show.map(function(trigger) {\n return triggerMap[trigger] || trigger;\n });\n return {\n show: show,\n hide: hide\n };\n }\n\n var directiveName = snake_case(ttType);\n\n var startSym = $interpolate.startSymbol();\n var endSym = $interpolate.endSymbol();\n var template =\n '
' +\n '
';\n\n return {\n compile: function(tElem, tAttrs) {\n var tooltipLinker = $compile(template);\n\n return function link(scope, element, attrs, tooltipCtrl) {\n var tooltip;\n var tooltipLinkedScope;\n var transitionTimeout;\n var showTimeout;\n var hideTimeout;\n var positionTimeout;\n var appendToBody = angular.isDefined(options.appendToBody) ? options.appendToBody : false;\n var triggers = getTriggers(undefined);\n var hasEnableExp = angular.isDefined(attrs[prefix + 'Enable']);\n var ttScope = scope.$new(true);\n var repositionScheduled = false;\n var isOpenParse = angular.isDefined(attrs[prefix + 'IsOpen']) ? $parse(attrs[prefix + 'IsOpen']) : false;\n var contentParse = options.useContentExp ? $parse(attrs[ttType]) : false;\n var observers = [];\n var lastPlacement;\n\n var positionTooltip = function() {\n // check if tooltip exists and is not empty\n if (!tooltip || !tooltip.html()) { return; }\n\n if (!positionTimeout) {\n positionTimeout = $timeout(function() {\n var ttPosition = $position.positionElements(element, tooltip, ttScope.placement, appendToBody);\n tooltip.css({ top: ttPosition.top + 'px', left: ttPosition.left + 'px' });\n\n if (!tooltip.hasClass(ttPosition.placement.split('-')[0])) {\n tooltip.removeClass(lastPlacement.split('-')[0]);\n tooltip.addClass(ttPosition.placement.split('-')[0]);\n }\n\n if (!tooltip.hasClass(options.placementClassPrefix + ttPosition.placement)) {\n tooltip.removeClass(options.placementClassPrefix + lastPlacement);\n tooltip.addClass(options.placementClassPrefix + ttPosition.placement);\n }\n\n // first time through tt element will have the\n // uib-position-measure class or if the placement\n // has changed we need to position the arrow.\n if (tooltip.hasClass('uib-position-measure')) {\n $position.positionArrow(tooltip, ttPosition.placement);\n tooltip.removeClass('uib-position-measure');\n } else if (lastPlacement !== ttPosition.placement) {\n $position.positionArrow(tooltip, ttPosition.placement);\n }\n lastPlacement = ttPosition.placement;\n\n positionTimeout = null;\n }, 0, false);\n }\n };\n\n // Set up the correct scope to allow transclusion later\n ttScope.origScope = scope;\n\n // By default, the tooltip is not open.\n // TODO add ability to start tooltip opened\n ttScope.isOpen = false;\n openedTooltips.add(ttScope, {\n close: hide\n });\n\n function toggleTooltipBind() {\n if (!ttScope.isOpen) {\n showTooltipBind();\n } else {\n hideTooltipBind();\n }\n }\n\n // Show the tooltip with delay if specified, otherwise show it immediately\n function showTooltipBind() {\n if (hasEnableExp && !scope.$eval(attrs[prefix + 'Enable'])) {\n return;\n }\n\n cancelHide();\n prepareTooltip();\n\n if (ttScope.popupDelay) {\n // Do nothing if the tooltip was already scheduled to pop-up.\n // This happens if show is triggered multiple times before any hide is triggered.\n if (!showTimeout) {\n showTimeout = $timeout(show, ttScope.popupDelay, false);\n }\n } else {\n show();\n }\n }\n\n function hideTooltipBind() {\n cancelShow();\n\n if (ttScope.popupCloseDelay) {\n if (!hideTimeout) {\n hideTimeout = $timeout(hide, ttScope.popupCloseDelay, false);\n }\n } else {\n hide();\n }\n }\n\n // Show the tooltip popup element.\n function show() {\n cancelShow();\n cancelHide();\n\n // Don't show empty tooltips.\n if (!ttScope.content) {\n return angular.noop;\n }\n\n createTooltip();\n\n // And show the tooltip.\n ttScope.$evalAsync(function() {\n ttScope.isOpen = true;\n assignIsOpen(true);\n positionTooltip();\n });\n }\n\n function cancelShow() {\n if (showTimeout) {\n $timeout.cancel(showTimeout);\n showTimeout = null;\n }\n\n if (positionTimeout) {\n $timeout.cancel(positionTimeout);\n positionTimeout = null;\n }\n }\n\n // Hide the tooltip popup element.\n function hide() {\n if (!ttScope) {\n return;\n }\n\n // First things first: we don't show it anymore.\n ttScope.$evalAsync(function() {\n if (ttScope) {\n ttScope.isOpen = false;\n assignIsOpen(false);\n // And now we remove it from the DOM. However, if we have animation, we\n // need to wait for it to expire beforehand.\n // FIXME: this is a placeholder for a port of the transitions library.\n // The fade transition in TWBS is 150ms.\n if (ttScope.animation) {\n if (!transitionTimeout) {\n transitionTimeout = $timeout(removeTooltip, 150, false);\n }\n } else {\n removeTooltip();\n }\n }\n });\n }\n\n function cancelHide() {\n if (hideTimeout) {\n $timeout.cancel(hideTimeout);\n hideTimeout = null;\n }\n\n if (transitionTimeout) {\n $timeout.cancel(transitionTimeout);\n transitionTimeout = null;\n }\n }\n\n function createTooltip() {\n // There can only be one tooltip element per directive shown at once.\n if (tooltip) {\n return;\n }\n\n tooltipLinkedScope = ttScope.$new();\n tooltip = tooltipLinker(tooltipLinkedScope, function(tooltip) {\n if (appendToBody) {\n $document.find('body').append(tooltip);\n } else {\n element.after(tooltip);\n }\n });\n\n prepObservers();\n }\n\n function removeTooltip() {\n cancelShow();\n cancelHide();\n unregisterObservers();\n\n if (tooltip) {\n tooltip.remove();\n tooltip = null;\n }\n if (tooltipLinkedScope) {\n tooltipLinkedScope.$destroy();\n tooltipLinkedScope = null;\n }\n }\n\n /**\n * Set the initial scope values. Once\n * the tooltip is created, the observers\n * will be added to keep things in sync.\n */\n function prepareTooltip() {\n ttScope.title = attrs[prefix + 'Title'];\n if (contentParse) {\n ttScope.content = contentParse(scope);\n } else {\n ttScope.content = attrs[ttType];\n }\n\n ttScope.popupClass = attrs[prefix + 'Class'];\n ttScope.placement = angular.isDefined(attrs[prefix + 'Placement']) ? attrs[prefix + 'Placement'] : options.placement;\n var placement = $position.parsePlacement(ttScope.placement);\n lastPlacement = placement[1] ? placement[0] + '-' + placement[1] : placement[0];\n\n var delay = parseInt(attrs[prefix + 'PopupDelay'], 10);\n var closeDelay = parseInt(attrs[prefix + 'PopupCloseDelay'], 10);\n ttScope.popupDelay = !isNaN(delay) ? delay : options.popupDelay;\n ttScope.popupCloseDelay = !isNaN(closeDelay) ? closeDelay : options.popupCloseDelay;\n }\n\n function assignIsOpen(isOpen) {\n if (isOpenParse && angular.isFunction(isOpenParse.assign)) {\n isOpenParse.assign(scope, isOpen);\n }\n }\n\n ttScope.contentExp = function() {\n return ttScope.content;\n };\n\n /**\n * Observe the relevant attributes.\n */\n attrs.$observe('disabled', function(val) {\n if (val) {\n cancelShow();\n }\n\n if (val && ttScope.isOpen) {\n hide();\n }\n });\n\n if (isOpenParse) {\n scope.$watch(isOpenParse, function(val) {\n if (ttScope && !val === ttScope.isOpen) {\n toggleTooltipBind();\n }\n });\n }\n\n function prepObservers() {\n observers.length = 0;\n\n if (contentParse) {\n observers.push(\n scope.$watch(contentParse, function(val) {\n ttScope.content = val;\n if (!val && ttScope.isOpen) {\n hide();\n }\n })\n );\n\n observers.push(\n tooltipLinkedScope.$watch(function() {\n if (!repositionScheduled) {\n repositionScheduled = true;\n tooltipLinkedScope.$$postDigest(function() {\n repositionScheduled = false;\n if (ttScope && ttScope.isOpen) {\n positionTooltip();\n }\n });\n }\n })\n );\n } else {\n observers.push(\n attrs.$observe(ttType, function(val) {\n ttScope.content = val;\n if (!val && ttScope.isOpen) {\n hide();\n } else {\n positionTooltip();\n }\n })\n );\n }\n\n observers.push(\n attrs.$observe(prefix + 'Title', function(val) {\n ttScope.title = val;\n if (ttScope.isOpen) {\n positionTooltip();\n }\n })\n );\n\n observers.push(\n attrs.$observe(prefix + 'Placement', function(val) {\n ttScope.placement = val ? val : options.placement;\n var placement = $position.parsePlacement(ttScope.placement);\n lastPlacement = placement[1] ? placement[0] + '-' + placement[1] : placement[0];\n if (ttScope.isOpen) {\n positionTooltip();\n }\n })\n );\n }\n\n function unregisterObservers() {\n if (observers.length) {\n angular.forEach(observers, function(observer) {\n observer();\n });\n observers.length = 0;\n }\n }\n\n // hide tooltips/popovers for outsideClick trigger\n function bodyHideTooltipBind(e) {\n if (!ttScope || !ttScope.isOpen || !tooltip) {\n return;\n }\n // make sure the tooltip/popover link or tool tooltip/popover itself were not clicked\n if (!element[0].contains(e.target) && !tooltip[0].contains(e.target)) {\n hideTooltipBind();\n }\n }\n\n var unregisterTriggers = function() {\n triggers.show.forEach(function(trigger) {\n if (trigger === 'outsideClick') {\n element.off('click', toggleTooltipBind);\n } else {\n element.off(trigger, showTooltipBind);\n element.off(trigger, toggleTooltipBind);\n }\n });\n triggers.hide.forEach(function(trigger) {\n if (trigger === 'outsideClick') {\n $document.off('click', bodyHideTooltipBind);\n } else {\n element.off(trigger, hideTooltipBind);\n }\n });\n };\n\n function prepTriggers() {\n var val = attrs[prefix + 'Trigger'];\n unregisterTriggers();\n\n triggers = getTriggers(val);\n\n if (triggers.show !== 'none') {\n triggers.show.forEach(function(trigger, idx) {\n if (trigger === 'outsideClick') {\n element.on('click', toggleTooltipBind);\n $document.on('click', bodyHideTooltipBind);\n } else if (trigger === triggers.hide[idx]) {\n element.on(trigger, toggleTooltipBind);\n } else if (trigger) {\n element.on(trigger, showTooltipBind);\n element.on(triggers.hide[idx], hideTooltipBind);\n }\n\n element.on('keypress', function(e) {\n if (e.which === 27) {\n hideTooltipBind();\n }\n });\n });\n }\n }\n\n prepTriggers();\n\n var animation = scope.$eval(attrs[prefix + 'Animation']);\n ttScope.animation = angular.isDefined(animation) ? !!animation : options.animation;\n\n var appendToBodyVal;\n var appendKey = prefix + 'AppendToBody';\n if (appendKey in attrs && attrs[appendKey] === undefined) {\n appendToBodyVal = true;\n } else {\n appendToBodyVal = scope.$eval(attrs[appendKey]);\n }\n\n appendToBody = angular.isDefined(appendToBodyVal) ? appendToBodyVal : appendToBody;\n\n // Make sure tooltip is destroyed and removed.\n scope.$on('$destroy', function onDestroyTooltip() {\n unregisterTriggers();\n removeTooltip();\n openedTooltips.remove(ttScope);\n ttScope = null;\n });\n };\n }\n };\n };\n }];\n})\n\n// This is mostly ngInclude code but with a custom scope\n.directive('uibTooltipTemplateTransclude', [\n '$animate', '$sce', '$compile', '$templateRequest',\nfunction ($animate, $sce, $compile, $templateRequest) {\n return {\n link: function(scope, elem, attrs) {\n var origScope = scope.$eval(attrs.tooltipTemplateTranscludeScope);\n\n var changeCounter = 0,\n currentScope,\n previousElement,\n currentElement;\n\n var cleanupLastIncludeContent = function() {\n if (previousElement) {\n previousElement.remove();\n previousElement = null;\n }\n\n if (currentScope) {\n currentScope.$destroy();\n currentScope = null;\n }\n\n if (currentElement) {\n $animate.leave(currentElement).then(function() {\n previousElement = null;\n });\n previousElement = currentElement;\n currentElement = null;\n }\n };\n\n scope.$watch($sce.parseAsResourceUrl(attrs.uibTooltipTemplateTransclude), function(src) {\n var thisChangeId = ++changeCounter;\n\n if (src) {\n //set the 2nd param to true to ignore the template request error so that the inner\n //contents and scope can be cleaned up.\n $templateRequest(src, true).then(function(response) {\n if (thisChangeId !== changeCounter) { return; }\n var newScope = origScope.$new();\n var template = response;\n\n var clone = $compile(template)(newScope, function(clone) {\n cleanupLastIncludeContent();\n $animate.enter(clone, elem);\n });\n\n currentScope = newScope;\n currentElement = clone;\n\n currentScope.$emit('$includeContentLoaded', src);\n }, function() {\n if (thisChangeId === changeCounter) {\n cleanupLastIncludeContent();\n scope.$emit('$includeContentError', src);\n }\n });\n scope.$emit('$includeContentRequested', src);\n } else {\n cleanupLastIncludeContent();\n }\n });\n\n scope.$on('$destroy', cleanupLastIncludeContent);\n }\n };\n}])\n\n/**\n * Note that it's intentional that these classes are *not* applied through $animate.\n * They must not be animated as they're expected to be present on the tooltip on\n * initialization.\n */\n.directive('uibTooltipClasses', ['$uibPosition', function($uibPosition) {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n // need to set the primary position so the\n // arrow has space during position measure.\n // tooltip.positionTooltip()\n if (scope.placement) {\n // // There are no top-left etc... classes\n // // in TWBS, so we need the primary position.\n var position = $uibPosition.parsePlacement(scope.placement);\n element.addClass(position[0]);\n }\n\n if (scope.popupClass) {\n element.addClass(scope.popupClass);\n }\n\n if (scope.animation()) {\n element.addClass(attrs.tooltipAnimationClass);\n }\n }\n };\n}])\n\n.directive('uibTooltipPopup', function() {\n return {\n replace: true,\n scope: { content: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' },\n templateUrl: 'uib/template/tooltip/tooltip-popup.html'\n };\n})\n\n.directive('uibTooltip', [ '$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibTooltip', 'tooltip', 'mouseenter');\n}])\n\n.directive('uibTooltipTemplatePopup', function() {\n return {\n replace: true,\n scope: { contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&',\n originScope: '&' },\n templateUrl: 'uib/template/tooltip/tooltip-template-popup.html'\n };\n})\n\n.directive('uibTooltipTemplate', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibTooltipTemplate', 'tooltip', 'mouseenter', {\n useContentExp: true\n });\n}])\n\n.directive('uibTooltipHtmlPopup', function() {\n return {\n replace: true,\n scope: { contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&' },\n templateUrl: 'uib/template/tooltip/tooltip-html-popup.html'\n };\n})\n\n.directive('uibTooltipHtml', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibTooltipHtml', 'tooltip', 'mouseenter', {\n useContentExp: true\n });\n}]);\n\n/**\n * The following features are still outstanding: popup delay, animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, and selector delegatation.\n */\nangular.module('ui.bootstrap.popover', ['ui.bootstrap.tooltip'])\n\n.directive('uibPopoverTemplatePopup', function() {\n return {\n replace: true,\n scope: { title: '@', contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&',\n originScope: '&' },\n templateUrl: 'uib/template/popover/popover-template.html'\n };\n})\n\n.directive('uibPopoverTemplate', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibPopoverTemplate', 'popover', 'click', {\n useContentExp: true\n });\n}])\n\n.directive('uibPopoverHtmlPopup', function() {\n return {\n replace: true,\n scope: { contentExp: '&', title: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' },\n templateUrl: 'uib/template/popover/popover-html.html'\n };\n})\n\n.directive('uibPopoverHtml', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibPopoverHtml', 'popover', 'click', {\n useContentExp: true\n });\n}])\n\n.directive('uibPopoverPopup', function() {\n return {\n replace: true,\n scope: { title: '@', content: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' },\n templateUrl: 'uib/template/popover/popover.html'\n };\n})\n\n.directive('uibPopover', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibPopover', 'popover', 'click');\n}]);\n\nangular.module('ui.bootstrap.progressbar', [])\n\n.constant('uibProgressConfig', {\n animate: true,\n max: 100\n})\n\n.controller('UibProgressController', ['$scope', '$attrs', 'uibProgressConfig', function($scope, $attrs, progressConfig) {\n var self = this,\n animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;\n\n this.bars = [];\n $scope.max = getMaxOrDefault();\n\n this.addBar = function(bar, element, attrs) {\n if (!animate) {\n element.css({'transition': 'none'});\n }\n\n this.bars.push(bar);\n\n bar.max = getMaxOrDefault();\n bar.title = attrs && angular.isDefined(attrs.title) ? attrs.title : 'progressbar';\n\n bar.$watch('value', function(value) {\n bar.recalculatePercentage();\n });\n\n bar.recalculatePercentage = function() {\n var totalPercentage = self.bars.reduce(function(total, bar) {\n bar.percent = +(100 * bar.value / bar.max).toFixed(2);\n return total + bar.percent;\n }, 0);\n\n if (totalPercentage > 100) {\n bar.percent -= totalPercentage - 100;\n }\n };\n\n bar.$on('$destroy', function() {\n element = null;\n self.removeBar(bar);\n });\n };\n\n this.removeBar = function(bar) {\n this.bars.splice(this.bars.indexOf(bar), 1);\n this.bars.forEach(function (bar) {\n bar.recalculatePercentage();\n });\n };\n\n //$attrs.$observe('maxParam', function(maxParam) {\n $scope.$watch('maxParam', function(maxParam) {\n self.bars.forEach(function(bar) {\n bar.max = getMaxOrDefault();\n bar.recalculatePercentage();\n });\n });\n\n function getMaxOrDefault () {\n return angular.isDefined($scope.maxParam) ? $scope.maxParam : progressConfig.max;\n }\n}])\n\n.directive('uibProgress', function() {\n return {\n replace: true,\n transclude: true,\n controller: 'UibProgressController',\n require: 'uibProgress',\n scope: {\n maxParam: '=?max'\n },\n templateUrl: 'uib/template/progressbar/progress.html'\n };\n})\n\n.directive('uibBar', function() {\n return {\n replace: true,\n transclude: true,\n require: '^uibProgress',\n scope: {\n value: '=',\n type: '@'\n },\n templateUrl: 'uib/template/progressbar/bar.html',\n link: function(scope, element, attrs, progressCtrl) {\n progressCtrl.addBar(scope, element, attrs);\n }\n };\n})\n\n.directive('uibProgressbar', function() {\n return {\n replace: true,\n transclude: true,\n controller: 'UibProgressController',\n scope: {\n value: '=',\n maxParam: '=?max',\n type: '@'\n },\n templateUrl: 'uib/template/progressbar/progressbar.html',\n link: function(scope, element, attrs, progressCtrl) {\n progressCtrl.addBar(scope, angular.element(element.children()[0]), {title: attrs.title});\n }\n };\n});\n\nangular.module('ui.bootstrap.rating', [])\n\n.constant('uibRatingConfig', {\n max: 5,\n stateOn: null,\n stateOff: null,\n titles : ['one', 'two', 'three', 'four', 'five']\n})\n\n.controller('UibRatingController', ['$scope', '$attrs', 'uibRatingConfig', function($scope, $attrs, ratingConfig) {\n var ngModelCtrl = { $setViewValue: angular.noop };\n\n this.init = function(ngModelCtrl_) {\n ngModelCtrl = ngModelCtrl_;\n ngModelCtrl.$render = this.render;\n\n ngModelCtrl.$formatters.push(function(value) {\n if (angular.isNumber(value) && value << 0 !== value) {\n value = Math.round(value);\n }\n\n return value;\n });\n\n this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn;\n this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff;\n var tmpTitles = angular.isDefined($attrs.titles) ? $scope.$parent.$eval($attrs.titles) : ratingConfig.titles ;\n this.titles = angular.isArray(tmpTitles) && tmpTitles.length > 0 ?\n tmpTitles : ratingConfig.titles;\n\n var ratingStates = angular.isDefined($attrs.ratingStates) ?\n $scope.$parent.$eval($attrs.ratingStates) :\n new Array(angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max);\n $scope.range = this.buildTemplateObjects(ratingStates);\n };\n\n this.buildTemplateObjects = function(states) {\n for (var i = 0, n = states.length; i < n; i++) {\n states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff, title: this.getTitle(i) }, states[i]);\n }\n return states;\n };\n\n this.getTitle = function(index) {\n if (index >= this.titles.length) {\n return index + 1;\n }\n\n return this.titles[index];\n };\n\n $scope.rate = function(value) {\n if (!$scope.readonly && value >= 0 && value <= $scope.range.length) {\n ngModelCtrl.$setViewValue(ngModelCtrl.$viewValue === value ? 0 : value);\n ngModelCtrl.$render();\n }\n };\n\n $scope.enter = function(value) {\n if (!$scope.readonly) {\n $scope.value = value;\n }\n $scope.onHover({value: value});\n };\n\n $scope.reset = function() {\n $scope.value = ngModelCtrl.$viewValue;\n $scope.onLeave();\n };\n\n $scope.onKeydown = function(evt) {\n if (/(37|38|39|40)/.test(evt.which)) {\n evt.preventDefault();\n evt.stopPropagation();\n $scope.rate($scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1));\n }\n };\n\n this.render = function() {\n $scope.value = ngModelCtrl.$viewValue;\n };\n}])\n\n.directive('uibRating', function() {\n return {\n require: ['uibRating', 'ngModel'],\n scope: {\n readonly: '=?readOnly',\n onHover: '&',\n onLeave: '&'\n },\n controller: 'UibRatingController',\n templateUrl: 'uib/template/rating/rating.html',\n replace: true,\n link: function(scope, element, attrs, ctrls) {\n var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n ratingCtrl.init(ngModelCtrl);\n }\n };\n});\n\nangular.module('ui.bootstrap.tabs', [])\n\n.controller('UibTabsetController', ['$scope', function ($scope) {\n var ctrl = this,\n oldIndex;\n ctrl.tabs = [];\n\n ctrl.select = function(index) {\n if (!destroyed) {\n var previousIndex = findTabIndex(oldIndex);\n var previousSelected = ctrl.tabs[previousIndex];\n if (previousSelected) {\n previousSelected.tab.onDeselect();\n previousSelected.tab.active = false;\n }\n\n var selected = ctrl.tabs[index];\n if (selected) {\n selected.tab.onSelect();\n selected.tab.active = true;\n ctrl.active = selected.index;\n oldIndex = selected.index;\n } else if (!selected && angular.isNumber(oldIndex)) {\n ctrl.active = null;\n oldIndex = null;\n }\n }\n };\n\n ctrl.addTab = function addTab(tab) {\n ctrl.tabs.push({\n tab: tab,\n index: tab.index\n });\n ctrl.tabs.sort(function(t1, t2) {\n if (t1.index > t2.index) {\n return 1;\n }\n\n if (t1.index < t2.index) {\n return -1;\n }\n\n return 0;\n });\n\n if (tab.index === ctrl.active || !angular.isNumber(ctrl.active) && ctrl.tabs.length === 1) {\n var newActiveIndex = findTabIndex(tab.index);\n ctrl.select(newActiveIndex);\n }\n };\n\n ctrl.removeTab = function removeTab(tab) {\n var index = findTabIndex(tab.index);\n\n if (tab.index === ctrl.active) {\n var newActiveTabIndex = index === ctrl.tabs.length - 1 ?\n index - 1 : index + 1 % ctrl.tabs.length;\n ctrl.select(newActiveTabIndex);\n }\n\n ctrl.tabs.splice(index, 1);\n };\n\n $scope.$watch('tabset.active', function(val) {\n if (angular.isNumber(val) && val !== oldIndex) {\n ctrl.select(findTabIndex(val));\n }\n });\n\n var destroyed;\n $scope.$on('$destroy', function() {\n destroyed = true;\n });\n\n function findTabIndex(index) {\n for (var i = 0; i < ctrl.tabs.length; i++) {\n if (ctrl.tabs[i].index === index) {\n return i;\n }\n }\n }\n}])\n\n.directive('uibTabset', function() {\n return {\n transclude: true,\n replace: true,\n scope: {},\n bindToController: {\n active: '=?',\n type: '@'\n },\n controller: 'UibTabsetController',\n controllerAs: 'tabset',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/tabs/tabset.html';\n },\n link: function(scope, element, attrs) {\n scope.vertical = angular.isDefined(attrs.vertical) ?\n scope.$parent.$eval(attrs.vertical) : false;\n scope.justified = angular.isDefined(attrs.justified) ?\n scope.$parent.$eval(attrs.justified) : false;\n if (angular.isUndefined(attrs.active)) {\n scope.active = 0;\n }\n }\n };\n})\n\n.directive('uibTab', ['$parse', function($parse) {\n return {\n require: '^uibTabset',\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/tabs/tab.html';\n },\n transclude: true,\n scope: {\n heading: '@',\n index: '=?',\n classes: '@?',\n onSelect: '&select', //This callback is called in contentHeadingTransclude\n //once it inserts the tab's content into the dom\n onDeselect: '&deselect'\n },\n controller: function() {\n //Empty controller so other directives can require being 'under' a tab\n },\n controllerAs: 'tab',\n link: function(scope, elm, attrs, tabsetCtrl, transclude) {\n scope.disabled = false;\n if (attrs.disable) {\n scope.$parent.$watch($parse(attrs.disable), function(value) {\n scope.disabled = !! value;\n });\n }\n\n if (angular.isUndefined(attrs.index)) {\n if (tabsetCtrl.tabs && tabsetCtrl.tabs.length) {\n scope.index = Math.max.apply(null, tabsetCtrl.tabs.map(function(t) { return t.index; })) + 1;\n } else {\n scope.index = 0;\n }\n }\n\n if (angular.isUndefined(attrs.classes)) {\n scope.classes = '';\n }\n\n scope.select = function() {\n if (!scope.disabled) {\n var index;\n for (var i = 0; i < tabsetCtrl.tabs.length; i++) {\n if (tabsetCtrl.tabs[i].tab === scope) {\n index = i;\n break;\n }\n }\n\n tabsetCtrl.select(index);\n }\n };\n\n tabsetCtrl.addTab(scope);\n scope.$on('$destroy', function() {\n tabsetCtrl.removeTab(scope);\n });\n\n //We need to transclude later, once the content container is ready.\n //when this link happens, we're inside a tab heading.\n scope.$transcludeFn = transclude;\n }\n };\n}])\n\n.directive('uibTabHeadingTransclude', function() {\n return {\n restrict: 'A',\n require: '^uibTab',\n link: function(scope, elm) {\n scope.$watch('headingElement', function updateHeadingElement(heading) {\n if (heading) {\n elm.html('');\n elm.append(heading);\n }\n });\n }\n };\n})\n\n.directive('uibTabContentTransclude', function() {\n return {\n restrict: 'A',\n require: '^uibTabset',\n link: function(scope, elm, attrs) {\n var tab = scope.$eval(attrs.uibTabContentTransclude).tab;\n\n //Now our tab is ready to be transcluded: both the tab heading area\n //and the tab content area are loaded. Transclude 'em both.\n tab.$transcludeFn(tab.$parent, function(contents) {\n angular.forEach(contents, function(node) {\n if (isTabHeading(node)) {\n //Let tabHeadingTransclude know.\n tab.headingElement = node;\n } else {\n elm.append(node);\n }\n });\n });\n }\n };\n\n function isTabHeading(node) {\n return node.tagName && (\n node.hasAttribute('uib-tab-heading') ||\n node.hasAttribute('data-uib-tab-heading') ||\n node.hasAttribute('x-uib-tab-heading') ||\n node.tagName.toLowerCase() === 'uib-tab-heading' ||\n node.tagName.toLowerCase() === 'data-uib-tab-heading' ||\n node.tagName.toLowerCase() === 'x-uib-tab-heading'\n );\n }\n});\n\nangular.module('ui.bootstrap.timepicker', [])\n\n.constant('uibTimepickerConfig', {\n hourStep: 1,\n minuteStep: 1,\n secondStep: 1,\n showMeridian: true,\n showSeconds: false,\n meridians: null,\n readonlyInput: false,\n mousewheel: true,\n arrowkeys: true,\n showSpinners: true,\n templateUrl: 'uib/template/timepicker/timepicker.html'\n})\n\n.controller('UibTimepickerController', ['$scope', '$element', '$attrs', '$parse', '$log', '$locale', 'uibTimepickerConfig', function($scope, $element, $attrs, $parse, $log, $locale, timepickerConfig) {\n var selected = new Date(),\n watchers = [],\n ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl\n meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS;\n\n $scope.tabindex = angular.isDefined($attrs.tabindex) ? $attrs.tabindex : 0;\n $element.removeAttr('tabindex');\n\n this.init = function(ngModelCtrl_, inputs) {\n ngModelCtrl = ngModelCtrl_;\n ngModelCtrl.$render = this.render;\n\n ngModelCtrl.$formatters.unshift(function(modelValue) {\n return modelValue ? new Date(modelValue) : null;\n });\n\n var hoursInputEl = inputs.eq(0),\n minutesInputEl = inputs.eq(1),\n secondsInputEl = inputs.eq(2);\n\n var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel;\n\n if (mousewheel) {\n this.setupMousewheelEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n }\n\n var arrowkeys = angular.isDefined($attrs.arrowkeys) ? $scope.$parent.$eval($attrs.arrowkeys) : timepickerConfig.arrowkeys;\n if (arrowkeys) {\n this.setupArrowkeyEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n }\n\n $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput;\n this.setupInputEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n };\n\n var hourStep = timepickerConfig.hourStep;\n if ($attrs.hourStep) {\n watchers.push($scope.$parent.$watch($parse($attrs.hourStep), function(value) {\n hourStep = +value;\n }));\n }\n\n var minuteStep = timepickerConfig.minuteStep;\n if ($attrs.minuteStep) {\n watchers.push($scope.$parent.$watch($parse($attrs.minuteStep), function(value) {\n minuteStep = +value;\n }));\n }\n\n var min;\n watchers.push($scope.$parent.$watch($parse($attrs.min), function(value) {\n var dt = new Date(value);\n min = isNaN(dt) ? undefined : dt;\n }));\n\n var max;\n watchers.push($scope.$parent.$watch($parse($attrs.max), function(value) {\n var dt = new Date(value);\n max = isNaN(dt) ? undefined : dt;\n }));\n\n var disabled = false;\n if ($attrs.ngDisabled) {\n watchers.push($scope.$parent.$watch($parse($attrs.ngDisabled), function(value) {\n disabled = value;\n }));\n }\n\n $scope.noIncrementHours = function() {\n var incrementedSelected = addMinutes(selected, hourStep * 60);\n return disabled || incrementedSelected > max ||\n incrementedSelected < selected && incrementedSelected < min;\n };\n\n $scope.noDecrementHours = function() {\n var decrementedSelected = addMinutes(selected, -hourStep * 60);\n return disabled || decrementedSelected < min ||\n decrementedSelected > selected && decrementedSelected > max;\n };\n\n $scope.noIncrementMinutes = function() {\n var incrementedSelected = addMinutes(selected, minuteStep);\n return disabled || incrementedSelected > max ||\n incrementedSelected < selected && incrementedSelected < min;\n };\n\n $scope.noDecrementMinutes = function() {\n var decrementedSelected = addMinutes(selected, -minuteStep);\n return disabled || decrementedSelected < min ||\n decrementedSelected > selected && decrementedSelected > max;\n };\n\n $scope.noIncrementSeconds = function() {\n var incrementedSelected = addSeconds(selected, secondStep);\n return disabled || incrementedSelected > max ||\n incrementedSelected < selected && incrementedSelected < min;\n };\n\n $scope.noDecrementSeconds = function() {\n var decrementedSelected = addSeconds(selected, -secondStep);\n return disabled || decrementedSelected < min ||\n decrementedSelected > selected && decrementedSelected > max;\n };\n\n $scope.noToggleMeridian = function() {\n if (selected.getHours() < 12) {\n return disabled || addMinutes(selected, 12 * 60) > max;\n }\n\n return disabled || addMinutes(selected, -12 * 60) < min;\n };\n\n var secondStep = timepickerConfig.secondStep;\n if ($attrs.secondStep) {\n watchers.push($scope.$parent.$watch($parse($attrs.secondStep), function(value) {\n secondStep = +value;\n }));\n }\n\n $scope.showSeconds = timepickerConfig.showSeconds;\n if ($attrs.showSeconds) {\n watchers.push($scope.$parent.$watch($parse($attrs.showSeconds), function(value) {\n $scope.showSeconds = !!value;\n }));\n }\n\n // 12H / 24H mode\n $scope.showMeridian = timepickerConfig.showMeridian;\n if ($attrs.showMeridian) {\n watchers.push($scope.$parent.$watch($parse($attrs.showMeridian), function(value) {\n $scope.showMeridian = !!value;\n\n if (ngModelCtrl.$error.time) {\n // Evaluate from template\n var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate();\n if (angular.isDefined(hours) && angular.isDefined(minutes)) {\n selected.setHours(hours);\n refresh();\n }\n } else {\n updateTemplate();\n }\n }));\n }\n\n // Get $scope.hours in 24H mode if valid\n function getHoursFromTemplate() {\n var hours = +$scope.hours;\n var valid = $scope.showMeridian ? hours > 0 && hours < 13 :\n hours >= 0 && hours < 24;\n if (!valid) {\n return undefined;\n }\n\n if ($scope.showMeridian) {\n if (hours === 12) {\n hours = 0;\n }\n if ($scope.meridian === meridians[1]) {\n hours = hours + 12;\n }\n }\n return hours;\n }\n\n function getMinutesFromTemplate() {\n var minutes = +$scope.minutes;\n return minutes >= 0 && minutes < 60 ? minutes : undefined;\n }\n\n function getSecondsFromTemplate() {\n var seconds = +$scope.seconds;\n return seconds >= 0 && seconds < 60 ? seconds : undefined;\n }\n\n function pad(value) {\n if (value === null) {\n return '';\n }\n\n return angular.isDefined(value) && value.toString().length < 2 ?\n '0' + value : value.toString();\n }\n\n // Respond on mousewheel spin\n this.setupMousewheelEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n var isScrollingUp = function(e) {\n if (e.originalEvent) {\n e = e.originalEvent;\n }\n //pick correct delta variable depending on event\n var delta = e.wheelDelta ? e.wheelDelta : -e.deltaY;\n return e.detail || delta > 0;\n };\n\n hoursInputEl.bind('mousewheel wheel', function(e) {\n if (!disabled) {\n $scope.$apply(isScrollingUp(e) ? $scope.incrementHours() : $scope.decrementHours());\n }\n e.preventDefault();\n });\n\n minutesInputEl.bind('mousewheel wheel', function(e) {\n if (!disabled) {\n $scope.$apply(isScrollingUp(e) ? $scope.incrementMinutes() : $scope.decrementMinutes());\n }\n e.preventDefault();\n });\n\n secondsInputEl.bind('mousewheel wheel', function(e) {\n if (!disabled) {\n $scope.$apply(isScrollingUp(e) ? $scope.incrementSeconds() : $scope.decrementSeconds());\n }\n e.preventDefault();\n });\n };\n\n // Respond on up/down arrowkeys\n this.setupArrowkeyEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n hoursInputEl.bind('keydown', function(e) {\n if (!disabled) {\n if (e.which === 38) { // up\n e.preventDefault();\n $scope.incrementHours();\n $scope.$apply();\n } else if (e.which === 40) { // down\n e.preventDefault();\n $scope.decrementHours();\n $scope.$apply();\n }\n }\n });\n\n minutesInputEl.bind('keydown', function(e) {\n if (!disabled) {\n if (e.which === 38) { // up\n e.preventDefault();\n $scope.incrementMinutes();\n $scope.$apply();\n } else if (e.which === 40) { // down\n e.preventDefault();\n $scope.decrementMinutes();\n $scope.$apply();\n }\n }\n });\n\n secondsInputEl.bind('keydown', function(e) {\n if (!disabled) {\n if (e.which === 38) { // up\n e.preventDefault();\n $scope.incrementSeconds();\n $scope.$apply();\n } else if (e.which === 40) { // down\n e.preventDefault();\n $scope.decrementSeconds();\n $scope.$apply();\n }\n }\n });\n };\n\n this.setupInputEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n if ($scope.readonlyInput) {\n $scope.updateHours = angular.noop;\n $scope.updateMinutes = angular.noop;\n $scope.updateSeconds = angular.noop;\n return;\n }\n\n var invalidate = function(invalidHours, invalidMinutes, invalidSeconds) {\n ngModelCtrl.$setViewValue(null);\n ngModelCtrl.$setValidity('time', false);\n if (angular.isDefined(invalidHours)) {\n $scope.invalidHours = invalidHours;\n }\n\n if (angular.isDefined(invalidMinutes)) {\n $scope.invalidMinutes = invalidMinutes;\n }\n\n if (angular.isDefined(invalidSeconds)) {\n $scope.invalidSeconds = invalidSeconds;\n }\n };\n\n $scope.updateHours = function() {\n var hours = getHoursFromTemplate(),\n minutes = getMinutesFromTemplate();\n\n ngModelCtrl.$setDirty();\n\n if (angular.isDefined(hours) && angular.isDefined(minutes)) {\n selected.setHours(hours);\n selected.setMinutes(minutes);\n if (selected < min || selected > max) {\n invalidate(true);\n } else {\n refresh('h');\n }\n } else {\n invalidate(true);\n }\n };\n\n hoursInputEl.bind('blur', function(e) {\n ngModelCtrl.$setTouched();\n if ($scope.hours === null || $scope.hours === '') {\n invalidate(true);\n } else if (!$scope.invalidHours && $scope.hours < 10) {\n $scope.$apply(function() {\n $scope.hours = pad($scope.hours);\n });\n }\n });\n\n $scope.updateMinutes = function() {\n var minutes = getMinutesFromTemplate(),\n hours = getHoursFromTemplate();\n\n ngModelCtrl.$setDirty();\n\n if (angular.isDefined(minutes) && angular.isDefined(hours)) {\n selected.setHours(hours);\n selected.setMinutes(minutes);\n if (selected < min || selected > max) {\n invalidate(undefined, true);\n } else {\n refresh('m');\n }\n } else {\n invalidate(undefined, true);\n }\n };\n\n minutesInputEl.bind('blur', function(e) {\n ngModelCtrl.$setTouched();\n if ($scope.minutes === null) {\n invalidate(undefined, true);\n } else if (!$scope.invalidMinutes && $scope.minutes < 10) {\n $scope.$apply(function() {\n $scope.minutes = pad($scope.minutes);\n });\n }\n });\n\n $scope.updateSeconds = function() {\n var seconds = getSecondsFromTemplate();\n\n ngModelCtrl.$setDirty();\n\n if (angular.isDefined(seconds)) {\n selected.setSeconds(seconds);\n refresh('s');\n } else {\n invalidate(undefined, undefined, true);\n }\n };\n\n secondsInputEl.bind('blur', function(e) {\n if (!$scope.invalidSeconds && $scope.seconds < 10) {\n $scope.$apply( function() {\n $scope.seconds = pad($scope.seconds);\n });\n }\n });\n\n };\n\n this.render = function() {\n var date = ngModelCtrl.$viewValue;\n\n if (isNaN(date)) {\n ngModelCtrl.$setValidity('time', false);\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.');\n } else {\n if (date) {\n selected = date;\n }\n\n if (selected < min || selected > max) {\n ngModelCtrl.$setValidity('time', false);\n $scope.invalidHours = true;\n $scope.invalidMinutes = true;\n } else {\n makeValid();\n }\n updateTemplate();\n }\n };\n\n // Call internally when we know that model is valid.\n function refresh(keyboardChange) {\n makeValid();\n ngModelCtrl.$setViewValue(new Date(selected));\n updateTemplate(keyboardChange);\n }\n\n function makeValid() {\n ngModelCtrl.$setValidity('time', true);\n $scope.invalidHours = false;\n $scope.invalidMinutes = false;\n $scope.invalidSeconds = false;\n }\n\n function updateTemplate(keyboardChange) {\n if (!ngModelCtrl.$modelValue) {\n $scope.hours = null;\n $scope.minutes = null;\n $scope.seconds = null;\n $scope.meridian = meridians[0];\n } else {\n var hours = selected.getHours(),\n minutes = selected.getMinutes(),\n seconds = selected.getSeconds();\n\n if ($scope.showMeridian) {\n hours = hours === 0 || hours === 12 ? 12 : hours % 12; // Convert 24 to 12 hour system\n }\n\n $scope.hours = keyboardChange === 'h' ? hours : pad(hours);\n if (keyboardChange !== 'm') {\n $scope.minutes = pad(minutes);\n }\n $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\n\n if (keyboardChange !== 's') {\n $scope.seconds = pad(seconds);\n }\n $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\n }\n }\n\n function addSecondsToSelected(seconds) {\n selected = addSeconds(selected, seconds);\n refresh();\n }\n\n function addMinutes(selected, minutes) {\n return addSeconds(selected, minutes*60);\n }\n\n function addSeconds(date, seconds) {\n var dt = new Date(date.getTime() + seconds * 1000);\n var newDate = new Date(date);\n newDate.setHours(dt.getHours(), dt.getMinutes(), dt.getSeconds());\n return newDate;\n }\n\n $scope.showSpinners = angular.isDefined($attrs.showSpinners) ?\n $scope.$parent.$eval($attrs.showSpinners) : timepickerConfig.showSpinners;\n\n $scope.incrementHours = function() {\n if (!$scope.noIncrementHours()) {\n addSecondsToSelected(hourStep * 60 * 60);\n }\n };\n\n $scope.decrementHours = function() {\n if (!$scope.noDecrementHours()) {\n addSecondsToSelected(-hourStep * 60 * 60);\n }\n };\n\n $scope.incrementMinutes = function() {\n if (!$scope.noIncrementMinutes()) {\n addSecondsToSelected(minuteStep * 60);\n }\n };\n\n $scope.decrementMinutes = function() {\n if (!$scope.noDecrementMinutes()) {\n addSecondsToSelected(-minuteStep * 60);\n }\n };\n\n $scope.incrementSeconds = function() {\n if (!$scope.noIncrementSeconds()) {\n addSecondsToSelected(secondStep);\n }\n };\n\n $scope.decrementSeconds = function() {\n if (!$scope.noDecrementSeconds()) {\n addSecondsToSelected(-secondStep);\n }\n };\n\n $scope.toggleMeridian = function() {\n var minutes = getMinutesFromTemplate(),\n hours = getHoursFromTemplate();\n\n if (!$scope.noToggleMeridian()) {\n if (angular.isDefined(minutes) && angular.isDefined(hours)) {\n addSecondsToSelected(12 * 60 * (selected.getHours() < 12 ? 60 : -60));\n } else {\n $scope.meridian = $scope.meridian === meridians[0] ? meridians[1] : meridians[0];\n }\n }\n };\n\n $scope.blur = function() {\n ngModelCtrl.$setTouched();\n };\n\n $scope.$on('$destroy', function() {\n while (watchers.length) {\n watchers.shift()();\n }\n });\n}])\n\n.directive('uibTimepicker', ['uibTimepickerConfig', function(uibTimepickerConfig) {\n return {\n require: ['uibTimepicker', '?^ngModel'],\n controller: 'UibTimepickerController',\n controllerAs: 'timepicker',\n replace: true,\n scope: {},\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || uibTimepickerConfig.templateUrl;\n },\n link: function(scope, element, attrs, ctrls) {\n var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n if (ngModelCtrl) {\n timepickerCtrl.init(ngModelCtrl, element.find('input'));\n }\n }\n };\n}]);\n\nangular.module('ui.bootstrap.typeahead', ['ui.bootstrap.debounce', 'ui.bootstrap.position'])\n\n/**\n * A helper service that can parse typeahead's syntax (string provided by users)\n * Extracted to a separate service for ease of unit testing\n */\n .factory('uibTypeaheadParser', ['$parse', function($parse) {\n // 00000111000000000000022200000000000000003333333333333330000000000044000\n var TYPEAHEAD_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*))\\s+in\\s+([\\s\\S]+?)$/;\n return {\n parse: function(input) {\n var match = input.match(TYPEAHEAD_REGEXP);\n if (!match) {\n throw new Error(\n 'Expected typeahead specification in form of \"_modelValue_ (as _label_)? for _item_ in _collection_\"' +\n ' but got \"' + input + '\".');\n }\n\n return {\n itemName: match[3],\n source: $parse(match[4]),\n viewMapper: $parse(match[2] || match[1]),\n modelMapper: $parse(match[1])\n };\n }\n };\n }])\n\n .controller('UibTypeaheadController', ['$scope', '$element', '$attrs', '$compile', '$parse', '$q', '$timeout', '$document', '$window', '$rootScope', '$$debounce', '$uibPosition', 'uibTypeaheadParser',\n function(originalScope, element, attrs, $compile, $parse, $q, $timeout, $document, $window, $rootScope, $$debounce, $position, typeaheadParser) {\n var HOT_KEYS = [9, 13, 27, 38, 40];\n var eventDebounceTime = 200;\n var modelCtrl, ngModelOptions;\n //SUPPORTED ATTRIBUTES (OPTIONS)\n\n //minimal no of characters that needs to be entered before typeahead kicks-in\n var minLength = originalScope.$eval(attrs.typeaheadMinLength);\n if (!minLength && minLength !== 0) {\n minLength = 1;\n }\n\n originalScope.$watch(attrs.typeaheadMinLength, function (newVal) {\n minLength = !newVal && newVal !== 0 ? 1 : newVal;\n });\n \n //minimal wait time after last character typed before typeahead kicks-in\n var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0;\n\n //should it restrict model values to the ones selected from the popup only?\n var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false;\n originalScope.$watch(attrs.typeaheadEditable, function (newVal) {\n isEditable = newVal !== false;\n });\n\n //binding to a variable that indicates if matches are being retrieved asynchronously\n var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop;\n\n //a callback executed when a match is selected\n var onSelectCallback = $parse(attrs.typeaheadOnSelect);\n\n //should it select highlighted popup value when losing focus?\n var isSelectOnBlur = angular.isDefined(attrs.typeaheadSelectOnBlur) ? originalScope.$eval(attrs.typeaheadSelectOnBlur) : false;\n\n //binding to a variable that indicates if there were no results after the query is completed\n var isNoResultsSetter = $parse(attrs.typeaheadNoResults).assign || angular.noop;\n\n var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined;\n\n var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false;\n\n var appendTo = attrs.typeaheadAppendTo ?\n originalScope.$eval(attrs.typeaheadAppendTo) : null;\n\n var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false;\n\n //If input matches an item of the list exactly, select it automatically\n var selectOnExact = attrs.typeaheadSelectOnExact ? originalScope.$eval(attrs.typeaheadSelectOnExact) : false;\n\n //binding to a variable that indicates if dropdown is open\n var isOpenSetter = $parse(attrs.typeaheadIsOpen).assign || angular.noop;\n\n var showHint = originalScope.$eval(attrs.typeaheadShowHint) || false;\n\n //INTERNAL VARIABLES\n\n //model setter executed upon match selection\n var parsedModel = $parse(attrs.ngModel);\n var invokeModelSetter = $parse(attrs.ngModel + '($$$p)');\n var $setModelValue = function(scope, newValue) {\n if (angular.isFunction(parsedModel(originalScope)) &&\n ngModelOptions && ngModelOptions.$options && ngModelOptions.$options.getterSetter) {\n return invokeModelSetter(scope, {$$$p: newValue});\n }\n\n return parsedModel.assign(scope, newValue);\n };\n\n //expressions used by typeahead\n var parserResult = typeaheadParser.parse(attrs.uibTypeahead);\n\n var hasFocus;\n\n //Used to avoid bug in iOS webview where iOS keyboard does not fire\n //mousedown & mouseup events\n //Issue #3699\n var selected;\n\n //create a child scope for the typeahead directive so we are not polluting original scope\n //with typeahead-specific data (matches, query etc.)\n var scope = originalScope.$new();\n var offDestroy = originalScope.$on('$destroy', function() {\n scope.$destroy();\n });\n scope.$on('$destroy', offDestroy);\n\n // WAI-ARIA\n var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000);\n element.attr({\n 'aria-autocomplete': 'list',\n 'aria-expanded': false,\n 'aria-owns': popupId\n });\n\n var inputsContainer, hintInputElem;\n //add read-only input to show hint\n if (showHint) {\n inputsContainer = angular.element('
');\n inputsContainer.css('position', 'relative');\n element.after(inputsContainer);\n hintInputElem = element.clone();\n hintInputElem.attr('placeholder', '');\n hintInputElem.attr('tabindex', '-1');\n hintInputElem.val('');\n hintInputElem.css({\n 'position': 'absolute',\n 'top': '0px',\n 'left': '0px',\n 'border-color': 'transparent',\n 'box-shadow': 'none',\n 'opacity': 1,\n 'background': 'none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255)',\n 'color': '#999'\n });\n element.css({\n 'position': 'relative',\n 'vertical-align': 'top',\n 'background-color': 'transparent'\n });\n inputsContainer.append(hintInputElem);\n hintInputElem.after(element);\n }\n\n //pop-up element used to display matches\n var popUpEl = angular.element('
');\n popUpEl.attr({\n id: popupId,\n matches: 'matches',\n active: 'activeIdx',\n select: 'select(activeIdx, evt)',\n 'move-in-progress': 'moveInProgress',\n query: 'query',\n position: 'position',\n 'assign-is-open': 'assignIsOpen(isOpen)',\n debounce: 'debounceUpdate'\n });\n //custom item template\n if (angular.isDefined(attrs.typeaheadTemplateUrl)) {\n popUpEl.attr('template-url', attrs.typeaheadTemplateUrl);\n }\n\n if (angular.isDefined(attrs.typeaheadPopupTemplateUrl)) {\n popUpEl.attr('popup-template-url', attrs.typeaheadPopupTemplateUrl);\n }\n\n var resetHint = function() {\n if (showHint) {\n hintInputElem.val('');\n }\n };\n\n var resetMatches = function() {\n scope.matches = [];\n scope.activeIdx = -1;\n element.attr('aria-expanded', false);\n resetHint();\n };\n\n var getMatchId = function(index) {\n return popupId + '-option-' + index;\n };\n\n // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead.\n // This attribute is added or removed automatically when the `activeIdx` changes.\n scope.$watch('activeIdx', function(index) {\n if (index < 0) {\n element.removeAttr('aria-activedescendant');\n } else {\n element.attr('aria-activedescendant', getMatchId(index));\n }\n });\n\n var inputIsExactMatch = function(inputValue, index) {\n if (scope.matches.length > index && inputValue) {\n return inputValue.toUpperCase() === scope.matches[index].label.toUpperCase();\n }\n\n return false;\n };\n\n var getMatchesAsync = function(inputValue, evt) {\n var locals = {$viewValue: inputValue};\n isLoadingSetter(originalScope, true);\n isNoResultsSetter(originalScope, false);\n $q.when(parserResult.source(originalScope, locals)).then(function(matches) {\n //it might happen that several async queries were in progress if a user were typing fast\n //but we are interested only in responses that correspond to the current view value\n var onCurrentRequest = inputValue === modelCtrl.$viewValue;\n if (onCurrentRequest && hasFocus) {\n if (matches && matches.length > 0) {\n scope.activeIdx = focusFirst ? 0 : -1;\n isNoResultsSetter(originalScope, false);\n scope.matches.length = 0;\n\n //transform labels\n for (var i = 0; i < matches.length; i++) {\n locals[parserResult.itemName] = matches[i];\n scope.matches.push({\n id: getMatchId(i),\n label: parserResult.viewMapper(scope, locals),\n model: matches[i]\n });\n }\n\n scope.query = inputValue;\n //position pop-up with matches - we need to re-calculate its position each time we are opening a window\n //with matches as a pop-up might be absolute-positioned and position of an input might have changed on a page\n //due to other elements being rendered\n recalculatePosition();\n\n element.attr('aria-expanded', true);\n\n //Select the single remaining option if user input matches\n if (selectOnExact && scope.matches.length === 1 && inputIsExactMatch(inputValue, 0)) {\n if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\n $$debounce(function() {\n scope.select(0, evt);\n }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\n } else {\n scope.select(0, evt);\n }\n }\n\n if (showHint) {\n var firstLabel = scope.matches[0].label;\n if (angular.isString(inputValue) &&\n inputValue.length > 0 &&\n firstLabel.slice(0, inputValue.length).toUpperCase() === inputValue.toUpperCase()) {\n hintInputElem.val(inputValue + firstLabel.slice(inputValue.length));\n } else {\n hintInputElem.val('');\n }\n }\n } else {\n resetMatches();\n isNoResultsSetter(originalScope, true);\n }\n }\n if (onCurrentRequest) {\n isLoadingSetter(originalScope, false);\n }\n }, function() {\n resetMatches();\n isLoadingSetter(originalScope, false);\n isNoResultsSetter(originalScope, true);\n });\n };\n\n // bind events only if appendToBody params exist - performance feature\n if (appendToBody) {\n angular.element($window).on('resize', fireRecalculating);\n $document.find('body').on('scroll', fireRecalculating);\n }\n\n // Declare the debounced function outside recalculating for\n // proper debouncing\n var debouncedRecalculate = $$debounce(function() {\n // if popup is visible\n if (scope.matches.length) {\n recalculatePosition();\n }\n\n scope.moveInProgress = false;\n }, eventDebounceTime);\n\n // Default progress type\n scope.moveInProgress = false;\n\n function fireRecalculating() {\n if (!scope.moveInProgress) {\n scope.moveInProgress = true;\n scope.$digest();\n }\n\n debouncedRecalculate();\n }\n\n // recalculate actual position and set new values to scope\n // after digest loop is popup in right position\n function recalculatePosition() {\n scope.position = appendToBody ? $position.offset(element) : $position.position(element);\n scope.position.top += element.prop('offsetHeight');\n }\n\n //we need to propagate user's query so we can higlight matches\n scope.query = undefined;\n\n //Declare the timeout promise var outside the function scope so that stacked calls can be cancelled later\n var timeoutPromise;\n\n var scheduleSearchWithTimeout = function(inputValue) {\n timeoutPromise = $timeout(function() {\n getMatchesAsync(inputValue);\n }, waitTime);\n };\n\n var cancelPreviousTimeout = function() {\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n };\n\n resetMatches();\n\n scope.assignIsOpen = function (isOpen) {\n isOpenSetter(originalScope, isOpen);\n };\n\n scope.select = function(activeIdx, evt) {\n //called from within the $digest() cycle\n var locals = {};\n var model, item;\n\n selected = true;\n locals[parserResult.itemName] = item = scope.matches[activeIdx].model;\n model = parserResult.modelMapper(originalScope, locals);\n $setModelValue(originalScope, model);\n modelCtrl.$setValidity('editable', true);\n modelCtrl.$setValidity('parse', true);\n\n onSelectCallback(originalScope, {\n $item: item,\n $model: model,\n $label: parserResult.viewMapper(originalScope, locals),\n $event: evt\n });\n\n resetMatches();\n\n //return focus to the input element if a match was selected via a mouse click event\n // use timeout to avoid $rootScope:inprog error\n if (scope.$eval(attrs.typeaheadFocusOnSelect) !== false) {\n $timeout(function() { element[0].focus(); }, 0, false);\n }\n };\n\n //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)\n element.on('keydown', function(evt) {\n //typeahead is open and an \"interesting\" key was pressed\n if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {\n return;\n }\n\n /**\n * if there's nothing selected (i.e. focusFirst) and enter or tab is hit\n * or\n * shift + tab is pressed to bring focus to the previous element\n * then clear the results\n */\n if (scope.activeIdx === -1 && (evt.which === 9 || evt.which === 13) || evt.which === 9 && !!evt.shiftKey) {\n resetMatches();\n scope.$digest();\n return;\n }\n\n evt.preventDefault();\n var target;\n switch (evt.which) {\n case 9:\n case 13:\n scope.$apply(function () {\n if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\n $$debounce(function() {\n scope.select(scope.activeIdx, evt);\n }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\n } else {\n scope.select(scope.activeIdx, evt);\n }\n });\n break;\n case 27:\n evt.stopPropagation();\n\n resetMatches();\n scope.$digest();\n break;\n case 38:\n scope.activeIdx = (scope.activeIdx > 0 ? scope.activeIdx : scope.matches.length) - 1;\n scope.$digest();\n target = popUpEl.find('li')[scope.activeIdx];\n target.parentNode.scrollTop = target.offsetTop;\n break;\n case 40:\n scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;\n scope.$digest();\n target = popUpEl.find('li')[scope.activeIdx];\n target.parentNode.scrollTop = target.offsetTop;\n break;\n }\n });\n\n element.bind('focus', function (evt) {\n hasFocus = true;\n if (minLength === 0 && !modelCtrl.$viewValue) {\n $timeout(function() {\n getMatchesAsync(modelCtrl.$viewValue, evt);\n }, 0);\n }\n });\n\n element.bind('blur', function(evt) {\n if (isSelectOnBlur && scope.matches.length && scope.activeIdx !== -1 && !selected) {\n selected = true;\n scope.$apply(function() {\n if (angular.isObject(scope.debounceUpdate) && angular.isNumber(scope.debounceUpdate.blur)) {\n $$debounce(function() {\n scope.select(scope.activeIdx, evt);\n }, scope.debounceUpdate.blur);\n } else {\n scope.select(scope.activeIdx, evt);\n }\n });\n }\n if (!isEditable && modelCtrl.$error.editable) {\n modelCtrl.$viewValue = '';\n element.val('');\n }\n hasFocus = false;\n selected = false;\n });\n\n // Keep reference to click handler to unbind it.\n var dismissClickHandler = function(evt) {\n // Issue #3973\n // Firefox treats right click as a click on document\n if (element[0] !== evt.target && evt.which !== 3 && scope.matches.length !== 0) {\n resetMatches();\n if (!$rootScope.$$phase) {\n scope.$digest();\n }\n }\n };\n\n $document.on('click', dismissClickHandler);\n\n originalScope.$on('$destroy', function() {\n $document.off('click', dismissClickHandler);\n if (appendToBody || appendTo) {\n $popup.remove();\n }\n\n if (appendToBody) {\n angular.element($window).off('resize', fireRecalculating);\n $document.find('body').off('scroll', fireRecalculating);\n }\n // Prevent jQuery cache memory leak\n popUpEl.remove();\n\n if (showHint) {\n inputsContainer.remove();\n }\n });\n\n var $popup = $compile(popUpEl)(scope);\n\n if (appendToBody) {\n $document.find('body').append($popup);\n } else if (appendTo) {\n angular.element(appendTo).eq(0).append($popup);\n } else {\n element.after($popup);\n }\n\n this.init = function(_modelCtrl, _ngModelOptions) {\n modelCtrl = _modelCtrl;\n ngModelOptions = _ngModelOptions;\n\n scope.debounceUpdate = modelCtrl.$options && $parse(modelCtrl.$options.debounce)(originalScope);\n\n //plug into $parsers pipeline to open a typeahead on view changes initiated from DOM\n //$parsers kick-in on all the changes coming from the view as well as manually triggered by $setViewValue\n modelCtrl.$parsers.unshift(function(inputValue) {\n hasFocus = true;\n\n if (minLength === 0 || inputValue && inputValue.length >= minLength) {\n if (waitTime > 0) {\n cancelPreviousTimeout();\n scheduleSearchWithTimeout(inputValue);\n } else {\n getMatchesAsync(inputValue);\n }\n } else {\n isLoadingSetter(originalScope, false);\n cancelPreviousTimeout();\n resetMatches();\n }\n\n if (isEditable) {\n return inputValue;\n }\n\n if (!inputValue) {\n // Reset in case user had typed something previously.\n modelCtrl.$setValidity('editable', true);\n return null;\n }\n\n modelCtrl.$setValidity('editable', false);\n return undefined;\n });\n\n modelCtrl.$formatters.push(function(modelValue) {\n var candidateViewValue, emptyViewValue;\n var locals = {};\n\n // The validity may be set to false via $parsers (see above) if\n // the model is restricted to selected values. If the model\n // is set manually it is considered to be valid.\n if (!isEditable) {\n modelCtrl.$setValidity('editable', true);\n }\n\n if (inputFormatter) {\n locals.$model = modelValue;\n return inputFormatter(originalScope, locals);\n }\n\n //it might happen that we don't have enough info to properly render input value\n //we need to check for this situation and simply return model value if we can't apply custom formatting\n locals[parserResult.itemName] = modelValue;\n candidateViewValue = parserResult.viewMapper(originalScope, locals);\n locals[parserResult.itemName] = undefined;\n emptyViewValue = parserResult.viewMapper(originalScope, locals);\n\n return candidateViewValue !== emptyViewValue ? candidateViewValue : modelValue;\n });\n };\n }])\n\n .directive('uibTypeahead', function() {\n return {\n controller: 'UibTypeaheadController',\n require: ['ngModel', '^?ngModelOptions', 'uibTypeahead'],\n link: function(originalScope, element, attrs, ctrls) {\n ctrls[2].init(ctrls[0], ctrls[1]);\n }\n };\n })\n\n .directive('uibTypeaheadPopup', ['$$debounce', function($$debounce) {\n return {\n scope: {\n matches: '=',\n query: '=',\n active: '=',\n position: '&',\n moveInProgress: '=',\n select: '&',\n assignIsOpen: '&',\n debounce: '&'\n },\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.popupTemplateUrl || 'uib/template/typeahead/typeahead-popup.html';\n },\n link: function(scope, element, attrs) {\n scope.templateUrl = attrs.templateUrl;\n\n scope.isOpen = function() {\n var isDropdownOpen = scope.matches.length > 0;\n scope.assignIsOpen({ isOpen: isDropdownOpen });\n return isDropdownOpen;\n };\n\n scope.isActive = function(matchIdx) {\n return scope.active === matchIdx;\n };\n\n scope.selectActive = function(matchIdx) {\n scope.active = matchIdx;\n };\n\n scope.selectMatch = function(activeIdx, evt) {\n var debounce = scope.debounce();\n if (angular.isNumber(debounce) || angular.isObject(debounce)) {\n $$debounce(function() {\n scope.select({activeIdx: activeIdx, evt: evt});\n }, angular.isNumber(debounce) ? debounce : debounce['default']);\n } else {\n scope.select({activeIdx: activeIdx, evt: evt});\n }\n };\n }\n };\n }])\n\n .directive('uibTypeaheadMatch', ['$templateRequest', '$compile', '$parse', function($templateRequest, $compile, $parse) {\n return {\n scope: {\n index: '=',\n match: '=',\n query: '='\n },\n link: function(scope, element, attrs) {\n var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'uib/template/typeahead/typeahead-match.html';\n $templateRequest(tplUrl).then(function(tplContent) {\n var tplEl = angular.element(tplContent.trim());\n element.replaceWith(tplEl);\n $compile(tplEl)(scope);\n });\n }\n };\n }])\n\n .filter('uibTypeaheadHighlight', ['$sce', '$injector', '$log', function($sce, $injector, $log) {\n var isSanitizePresent;\n isSanitizePresent = $injector.has('$sanitize');\n\n function escapeRegexp(queryToEscape) {\n // Regex: capture the whole query string and replace it with the string that will be used to match\n // the results, for example if the capture is \"a\" the result will be \\a\n return queryToEscape.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n }\n\n function containsHtml(matchItem) {\n return /<.*>/g.test(matchItem);\n }\n\n return function(matchItem, query) {\n if (!isSanitizePresent && containsHtml(matchItem)) {\n $log.warn('Unsafe use of typeahead please use ngSanitize'); // Warn the user about the danger\n }\n matchItem = query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; // Replaces the capture string with a the same string inside of a \"strong\" tag\n if (!isSanitizePresent) {\n matchItem = $sce.trustAsHtml(matchItem); // If $sanitize is not present we pack the string in a $sce object for the ng-bind-html directive\n }\n return matchItem;\n };\n }]);\n\nangular.module(\"uib/template/accordion/accordion-group.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/accordion/accordion-group.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \" {{heading}}\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/accordion/accordion.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/accordion/accordion.html\",\n \"
\");\n}]);\n\nangular.module(\"uib/template/alert/alert.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/alert/alert.html\",\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/carousel/carousel.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/carousel/carousel.html\",\n \"
\\n\" +\n \"
\\n\" +\n \" 1\\\">\\n\" +\n \" \\n\" +\n \" previous\\n\" +\n \" \\n\" +\n \" 1\\\">\\n\" +\n \" \\n\" +\n \" next\\n\" +\n \" \\n\" +\n \"
    1\\\">\\n\" +\n \"
  1. \\n\" +\n \" slide {{ $index + 1 }} of {{ slides.length }}, currently active\\n\" +\n \"
  2. \\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/carousel/slide.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/carousel/slide.html\",\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/datepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/datepicker.html\",\n \"
\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/day.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/day.html\",\n \"\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
{{::label.abbr}}
{{ weekNumbers[$index] }}\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/month.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/month.html\",\n \"\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/popup.html\",\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/year.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/year.html\",\n \"\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/modal/backdrop.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/modal/backdrop.html\",\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/modal/window.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/modal/window.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/pager/pager.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/pager/pager.html\",\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/pagination/pagination.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/pagination/pagination.html\",\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-html-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tooltip/tooltip-html-popup.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tooltip/tooltip-popup.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-template-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tooltip/tooltip-template-popup.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover-html.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/popover/popover-html.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover-template.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/popover/popover-template.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/popover/popover.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/progressbar/bar.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/progressbar/bar.html\",\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/progressbar/progress.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/progressbar/progress.html\",\n \"
\");\n}]);\n\nangular.module(\"uib/template/progressbar/progressbar.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/progressbar/progressbar.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/rating/rating.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/rating/rating.html\",\n \"\\n\" +\n \" ({{ $index < value ? '*' : ' ' }})\\n\" +\n \" \\n\" +\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tabs/tab.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tabs/tab.html\",\n \"
  • \\n\" +\n \" {{heading}}\\n\" +\n \"
  • \\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tabs/tabset.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tabs/tabset.html\",\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/timepicker/timepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/timepicker/timepicker.html\",\n \"\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
      
    \\n\" +\n \" \\n\" +\n \" :\\n\" +\n \" \\n\" +\n \" :\\n\" +\n \" \\n\" +\n \"
      
    \\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/typeahead/typeahead-match.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/typeahead/typeahead-match.html\",\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/typeahead/typeahead-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/typeahead/typeahead-popup.html\",\n \"\\n\" +\n \"\");\n}]);\nangular.module('ui.bootstrap.carousel').run(function() {!angular.$$csp().noInlineStyle && angular.element(document).find('head').prepend(''); });\nangular.module('ui.bootstrap.position').run(function() {!angular.$$csp().noInlineStyle && angular.element(document).find('head').prepend(''); });\nangular.module('ui.bootstrap.datepicker').run(function() {!angular.$$csp().noInlineStyle && angular.element(document).find('head').prepend(''); });\nangular.module('ui.bootstrap.tooltip').run(function() {!angular.$$csp().noInlineStyle && angular.element(document).find('head').prepend(''); });\nangular.module('ui.bootstrap.timepicker').run(function() {!angular.$$csp().noInlineStyle && angular.element(document).find('head').prepend(''); });\nangular.module('ui.bootstrap.typeahead').run(function() {!angular.$$csp().noInlineStyle && angular.element(document).find('head').prepend(''); });\n\nvar angularUiBootstrap = 'ui.bootstrap';\n\nexport default angularUiBootstrap;\n"], "mappings": "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", "names": [] }