diff --git a/bower.json b/bower.json
index 0c7027b2e..9965100aa 100644
--- a/bower.json
+++ b/bower.json
@@ -1,7 +1,7 @@
{
"name": "angular-strap",
"description": "AngularStrap - AngularJS directives for Bootstrap",
- "version": "2.0.4",
+ "version": "2.0.5",
"keywords": [
"angular",
"bootstrap"
diff --git a/dist/angular-strap.js b/dist/angular-strap.js
index ebc1eac2b..e77ca573e 100755
--- a/dist/angular-strap.js
+++ b/dist/angular-strap.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -573,6 +573,7 @@ angular.module('mgcrea.ngStrap.datepicker', [
startView: 0,
minView: 0,
startWeek: 0,
+ daysOfWeekDisabled: '',
iconLeft: 'glyphicon glyphicon-chevron-left',
iconRight: 'glyphicon glyphicon-chevron-right'
};
@@ -587,8 +588,8 @@ angular.module('mgcrea.ngStrap.datepicker', [
'$tooltip',
function ($window, $document, $rootScope, $sce, $locale, dateFilter, datepickerViews, $tooltip) {
var bodyEl = angular.element($window.document.body);
- var isTouch = 'createTouch' in $window.document;
var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
+ var isTouch = 'createTouch' in $window.document && isNative;
if (!defaults.lang)
defaults.lang = $locale.id;
function DatepickerFactory(element, controller, config) {
@@ -811,12 +812,14 @@ angular.module('mgcrea.ngStrap.datepicker', [
'dayFormat',
'strictFormat',
'startWeek',
+ 'startDate',
'useNative',
'lang',
'startView',
'minView',
'iconLeft',
- 'iconRight'
+ 'iconRight',
+ 'daysOfWeekDisabled'
], function (key) {
if (angular.isDefined(attr[key]))
options[key] = attr[key];
@@ -829,9 +832,10 @@ angular.module('mgcrea.ngStrap.datepicker', [
newValue = newValue.match(',?(datepicker),?');
newValue === true ? datepicker.show() : datepicker.hide();
});
- // Initialize datepicker
+ // Set expected iOS format
if (isNative && options.useNative)
options.dateFormat = 'yyyy-MM-dd';
+ // Initialize datepicker
var datepicker = $datepicker(element, controller, options);
options = datepicker.$options;
// Observe attributes for changes
@@ -850,6 +854,9 @@ angular.module('mgcrea.ngStrap.datepicker', [
datepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));
} else if (isNumeric(newValue)) {
datepicker.$options[key] = +new Date(parseInt(newValue, 10));
+ } else if (angular.isString(newValue) && 0 === newValue.length) {
+ // Reset date
+ datepicker.$options[key] = key === 'maxDate' ? +Infinity : -Infinity;
} else {
datepicker.$options[key] = +new Date(newValue);
}
@@ -943,9 +950,8 @@ angular.module('mgcrea.ngStrap.datepicker', [
};
// Garbage collection
scope.$on('$destroy', function () {
- if (datepicker) {
+ if (datepicker)
datepicker.destroy();
- }
options = null;
datepicker = null;
});
@@ -980,7 +986,7 @@ angular.module('mgcrea.ngStrap.datepicker', [
var weekDaysMin = $locale.DATETIME_FORMATS.SHORTDAY;
var weekDaysLabels = weekDaysMin.slice(options.startWeek).concat(weekDaysMin.slice(0, options.startWeek));
var weekDaysLabelsHtml = $sce.trustAsHtml('
' + weekDaysLabels.join(' ') + ' ');
- var startDate = picker.$date || new Date();
+ var startDate = picker.$date || (options.startDate ? new Date(options.startDate) : new Date());
var viewDate = {
year: startDate.getFullYear(),
month: startDate.getMonth(),
@@ -1037,6 +1043,9 @@ angular.module('mgcrea.ngStrap.datepicker', [
// Disabled because of min/max date.
if (time < options.minDate || time > options.maxDate)
return true;
+ // Disabled due to being a disabled day of the week
+ if (options.daysOfWeekDisabled.indexOf(date.getDay()) !== -1)
+ return true;
// Disabled because of disabled date range.
if (options.disabledDateRanges) {
for (var i = 0; i < options.disabledDateRanges.length; i++) {
@@ -1222,6 +1231,7 @@ angular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip']).provider('
var options = angular.extend({}, defaults, config);
var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new();
$dropdown = $tooltip(element, options);
+ var parentEl = element.parent();
// Protected methods
$dropdown.$onKeyDown = function (evt) {
if (!/(38|40)/.test(evt.keyCode))
@@ -1254,13 +1264,13 @@ angular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip']).provider('
options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);
bodyEl.on('click', onBodyClick);
});
- $dropdown.$element.parent().toggleClass('open');
+ parentEl.hasClass('dropdown') && parentEl.addClass('open');
};
var hide = $dropdown.hide;
$dropdown.hide = function () {
options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);
bodyEl.off('click', onBodyClick);
- $dropdown.$element.parent().toggleClass('open');
+ parentEl.hasClass('dropdown') && parentEl.removeClass('open');
hide();
};
// Private functions
@@ -1433,7 +1443,8 @@ angular.module('mgcrea.ngStrap.helpers.dateParser', []).provider('$dateParser',
}
// Sort result map
angular.forEach(map, function (v) {
- sortedMap.push(v);
+ if (v)
+ sortedMap.push(v);
});
return sortedMap;
}
@@ -2071,6 +2082,7 @@ angular.module('mgcrea.ngStrap.navbar', []).provider('$navbar', function () {
angular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip']).provider('$popover', function () {
var defaults = this.defaults = {
animation: 'am-fade',
+ customClass: '',
container: false,
target: false,
placement: 'right',
@@ -2122,7 +2134,8 @@ angular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip']).provider('$
'trigger',
'keyboard',
'html',
- 'animation'
+ 'animation',
+ 'customClass'
], function (key) {
if (angular.isDefined(attr[key]))
options[key] = attr[key];
@@ -2426,7 +2439,8 @@ angular.module('mgcrea.ngStrap.select', [
'$tooltip',
function ($window, $document, $rootScope, $tooltip) {
var bodyEl = angular.element($window.document.body);
- var isTouch = 'createTouch' in $window.document;
+ var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
+ var isTouch = 'createTouch' in $window.document && isNative;
function SelectFactory(element, controller, config) {
var $select = {};
// Common vars
@@ -2775,7 +2789,8 @@ angular.module('mgcrea.ngStrap.timepicker', [
hourStep: 1,
minuteStep: 5,
iconUp: 'glyphicon glyphicon-chevron-up',
- iconDown: 'glyphicon glyphicon-chevron-down'
+ iconDown: 'glyphicon glyphicon-chevron-down',
+ arrowBehavior: 'pager'
};
this.$get = [
'$window',
@@ -2787,8 +2802,8 @@ angular.module('mgcrea.ngStrap.timepicker', [
'$tooltip',
function ($window, $document, $rootScope, $sce, $locale, dateFilter, $tooltip) {
var bodyEl = angular.element($window.document.body);
- var isTouch = 'createTouch' in $window.document;
var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
+ var isTouch = 'createTouch' in $window.document && isNative;
if (!defaults.lang)
defaults.lang = $locale.id;
function timepickerFactory(element, controller, config) {
@@ -2913,6 +2928,25 @@ angular.module('mgcrea.ngStrap.timepicker', [
}
return selectedTime < options.minTime * 1 || selectedTime > options.maxTime * 1;
};
+ scope.$arrowAction = function (value, index) {
+ if (options.arrowBehavior === 'picker') {
+ $timepicker.$setTimeByStep(value, index);
+ } else {
+ $timepicker.$moveIndex(value, index);
+ }
+ };
+ $timepicker.$setTimeByStep = function (value, index) {
+ var newDate = new Date($timepicker.$date);
+ var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;
+ var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;
+ if (index === 0) {
+ newDate.setHours(hours - parseInt(options.hourStep, 10) * value);
+ } else {
+ newDate.setMinutes(minutes - parseInt(options.minuteStep, 10) * value);
+ }
+ $timepicker.select(newDate, index, true);
+ parentScope.$digest();
+ };
$timepicker.$moveIndex = function (value, index) {
var targetDate;
if (index === 0) {
@@ -3095,7 +3129,8 @@ angular.module('mgcrea.ngStrap.timepicker', [
'useNative',
'hourStep',
'minuteStep',
- 'length'
+ 'length',
+ 'arrowBehavior'
], function (key) {
if (angular.isDefined(attr[key]))
options[key] = attr[key];
@@ -3436,6 +3471,10 @@ angular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions']).
scope.$emit(options.prefixEvent + '.hide.before', $tooltip);
$animate.leave(tipElement, function () {
scope.$emit(options.prefixEvent + '.hide', $tooltip);
+ // Allow to blur the input when hidden, like when pressing enter key
+ if (blur && options.trigger === 'focus') {
+ return element[0].blur();
+ }
});
$tooltip.$isShown = scope.$isShown = false;
scope.$$phase || scope.$root && scope.$root.$$phase || scope.$digest();
@@ -3443,10 +3482,6 @@ angular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions']).
if (options.keyboard && tipElement !== null) {
tipElement.off('keyup', $tooltip.$onKeyUp);
}
- // Allow to blur the input when hidden, like when pressing enter key
- if (blur && options.trigger === 'focus') {
- return element[0].blur();
- }
};
$tooltip.toggle = function () {
$tooltip.$isShown ? $tooltip.leave() : $tooltip.enter();
@@ -3621,7 +3656,8 @@ angular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions']).
var tooltip = $tooltip(element, options);
// Garbage collection
scope.$on('$destroy', function () {
- tooltip.destroy();
+ if (tooltip)
+ tooltip.destroy();
options = null;
tooltip = null;
});
@@ -3729,9 +3765,9 @@ angular.module('mgcrea.ngStrap.typeahead', [
$typeahead.$onKeyDown = function (evt) {
if (!/(38|40|13)/.test(evt.keyCode))
return;
- evt.preventDefault();
// Let ngSubmit pass if the typeahead tip is hidden
if ($typeahead.$isVisible()) {
+ evt.preventDefault();
evt.stopPropagation();
}
// Select with enter
diff --git a/dist/angular-strap.min.js b/dist/angular-strap.min.js
index 660448404..1d83f2952 100755
--- a/dist/angular-strap.min.js
+++ b/dist/angular-strap.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-!function(e,t){"use strict";angular.module("mgcrea.ngStrap",["mgcrea.ngStrap.modal","mgcrea.ngStrap.aside","mgcrea.ngStrap.alert","mgcrea.ngStrap.button","mgcrea.ngStrap.select","mgcrea.ngStrap.datepicker","mgcrea.ngStrap.timepicker","mgcrea.ngStrap.navbar","mgcrea.ngStrap.tooltip","mgcrea.ngStrap.popover","mgcrea.ngStrap.dropdown","mgcrea.ngStrap.typeahead","mgcrea.ngStrap.scrollspy","mgcrea.ngStrap.affix","mgcrea.ngStrap.tab"]),angular.module("mgcrea.ngStrap.affix",["mgcrea.ngStrap.helpers.dimensions","mgcrea.ngStrap.helpers.debounce"]).provider("$affix",function(){var e=this.defaults={offsetTop:"auto"};this.$get=["$window","debounce","dimensions",function(t,n,a){function o(o,l){function s(e,t,n){var a=u(),o=c();return h>=a?"top":null!==e&&a+e<=t.top?"middle":null!==v&&t.top+n+g>=o-v?"bottom":"middle"}function u(){return p[0]===t?t.pageYOffset:p[0]===t}function c(){return p[0]===t?t.document.body.scrollHeight:p[0].scrollHeight}var d={},f=angular.extend({},e,l),p=f.target,m="affix affix-top affix-bottom",g=0,$=0,h=0,v=0,y=null,w=null,b=o.parent();if(f.offsetParent)if(f.offsetParent.match(/^\d+$/))for(var D=0;D<1*f.offsetParent-1;D++)b=b.parent();else b=angular.element(f.offsetParent);return d.init=function(){d.$parseOffsets(),$=a.offset(o[0]).top+g,p.on("scroll",d.checkPosition),p.on("click",d.checkPositionWithEventLoop),r.on("resize",d.$debouncedOnResize),d.checkPosition(),d.checkPositionWithEventLoop()},d.destroy=function(){p.off("scroll",d.checkPosition),p.off("click",d.checkPositionWithEventLoop),r.off("resize",d.$debouncedOnResize)},d.checkPositionWithEventLoop=function(){setTimeout(d.checkPosition,1)},d.checkPosition=function(){var e=u(),t=a.offset(o[0]),n=a.height(o[0]),r=s(w,t,n);y!==r&&(y=r,o.removeClass(m).addClass("affix"+("middle"!==r?"-"+r:"")),"top"===r?(w=null,o.css("position",f.offsetParent?"":"relative"),o.css("top","")):"bottom"===r?(w=f.offsetUnpin?-(1*f.offsetUnpin):t.top-e,o.css("position",f.offsetParent?"":"relative"),o.css("top",f.offsetParent?"":i[0].offsetHeight-v-n-$+"px")):(w=null,o.css("position","fixed"),o.css("top",g+"px")))},d.$onResize=function(){d.$parseOffsets(),d.checkPosition()},d.$debouncedOnResize=n(d.$onResize,50),d.$parseOffsets=function(){o.css("position",f.offsetParent?"":"relative"),f.offsetTop&&("auto"===f.offsetTop&&(f.offsetTop="+0"),f.offsetTop.match(/^[-+]\d+$/)?(g=1*-f.offsetTop,h=f.offsetParent?a.offset(b[0]).top+1*f.offsetTop:a.offset(o[0]).top-a.css(o[0],"marginTop",!0)+1*f.offsetTop):h=1*f.offsetTop),f.offsetBottom&&(v=f.offsetParent&&f.offsetBottom.match(/^[-+]\d+$/)?c()-(a.offset(b[0]).top+a.height(b[0]))+1*f.offsetBottom+1:1*f.offsetBottom)},d.init(),d}var i=angular.element(t.document.body),r=angular.element(t);return o}]}).directive("bsAffix",["$affix","$window",function(e,t){return{restrict:"EAC",require:"^?bsAffixTarget",link:function(n,a,o,i){var r={scope:n,offsetTop:"auto",target:i?i.$element:angular.element(t)};angular.forEach(["offsetTop","offsetBottom","offsetParent","offsetUnpin"],function(e){angular.isDefined(o[e])&&(r[e]=o[e])});var l=e(a,r);n.$on("$destroy",function(){r=null,l=null})}}}]).directive("bsAffixTarget",function(){return{controller:["$element",function(e){this.$element=e}]}}),angular.module("mgcrea.ngStrap.alert",["mgcrea.ngStrap.modal"]).provider("$alert",function(){var e=this.defaults={animation:"am-fade",prefixClass:"alert",placement:null,template:"alert/alert.tpl.html",container:!1,element:null,backdrop:!1,keyboard:!0,show:!0,duration:!1,type:!1,dismissable:!0};this.$get=["$modal","$timeout",function(t,n){function a(a){var o={},i=angular.extend({},e,a);o=t(i),o.$scope.dismissable=!!i.dismissable,i.type&&(o.$scope.type=i.type);var r=o.show;return i.duration&&(o.show=function(){r(),n(function(){o.hide()},1e3*i.duration)}),o}return a}]}).directive("bsAlert",["$window","$location","$sce","$alert",function(e,t,n,a){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,t,o){var i={scope:e,element:t,show:!1};angular.forEach(["template","placement","keyboard","html","container","animation","duration","dismissable"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content","type"],function(t){o[t]&&o.$observe(t,function(a){e[t]=n.trustAsHtml(a)})}),o.bsAlert&&e.$watch(o.bsAlert,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=a(i);t.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.aside",["mgcrea.ngStrap.modal"]).provider("$aside",function(){var e=this.defaults={animation:"am-fade-and-slide-right",prefixClass:"aside",placement:"right",template:"aside/aside.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$modal",function(t){function n(n){var a={},o=angular.extend({},e,n);return a=t(o)}return n}]}).directive("bsAside",["$window","$sce","$aside",function(e,t,n){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,a,o){var i={scope:e,element:a,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content"],function(n){o[n]&&o.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),o.bsAside&&e.$watch(o.bsAside,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=n(i);a.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.button",[]).provider("$button",function(){var e=this.defaults={activeClass:"active",toggleEvent:"click"};this.$get=function(){return{defaults:e}}}).directive("bsCheckboxGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var n=e[0].querySelectorAll('input[type="checkbox"]');angular.forEach(n,function(e){var n=angular.element(e);n.attr("bs-checkbox",""),n.attr("ng-model",t.ngModel+"."+n.attr("value"))})}}}).directive("bsCheckbox",["$button","$$rAF",function(e,t){var n=e.defaults,a=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,o,i,r){var l=n,s="INPUT"===o[0].nodeName,u=s?o.parent():o,c=angular.isDefined(i.trueValue)?i.trueValue:!0;a.test(i.trueValue)&&(c=e.$eval(i.trueValue));var d=angular.isDefined(i.falseValue)?i.falseValue:!1;a.test(i.falseValue)&&(d=e.$eval(i.falseValue));var f="boolean"!=typeof c||"boolean"!=typeof d;f&&(r.$parsers.push(function(e){return e?c:d}),e.$watch(i.ngModel,function(){r.$render()})),r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){s&&(o[0].checked=e),u.toggleClass(l.activeClass,e)})},o.bind(l.toggleEvent,function(){e.$apply(function(){s||r.$setViewValue(!u.hasClass("active")),f||r.$render()})})}}}]).directive("bsRadioGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var n=e[0].querySelectorAll('input[type="radio"]');angular.forEach(n,function(e){angular.element(e).attr("bs-radio",""),angular.element(e).attr("ng-model",t.ngModel)})}}}).directive("bsRadio",["$button","$$rAF",function(e,t){var n=e.defaults,a=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,o,i,r){var l=n,s="INPUT"===o[0].nodeName,u=s?o.parent():o,c=a.test(i.value)?e.$eval(i.value):i.value;r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){s&&(o[0].checked=e),u.toggleClass(l.activeClass,e)})},o.bind(l.toggleEvent,function(){e.$apply(function(){r.$setViewValue(c),r.$render()})})}}}]),angular.module("mgcrea.ngStrap.datepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$datepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"datepicker",placement:"bottom-left",template:"datepicker/datepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!1,dateType:"date",dateFormat:"shortDate",modelDateFormat:null,dayFormat:"dd",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0,iconLeft:"glyphicon glyphicon-chevron-left",iconRight:"glyphicon glyphicon-chevron-right"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip",function(t,n,a,o,i,r,l,s){function u(t,n,a){function o(e){e.selected=r.$isSelected(e.date)}function i(){t[0].focus()}var r=s(t,angular.extend({},e,a)),u=a.scope,f=r.$options,p=r.$scope;f.startView&&(f.startView-=f.minView);var m=l(r);r.$views=m.views;var g=m.viewDate;p.$mode=f.startView,p.$iconLeft=f.iconLeft,p.$iconRight=f.iconRight;var $=r.$views[p.$mode];p.$select=function(e){r.select(e)},p.$selectPane=function(e){r.$selectPane(e)},p.$toggleMode=function(){r.setMode((p.$mode+1)%r.$views.length)},r.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())&&(r.$date=e,$.update.call($,e)),r.$build(!0)},r.updateDisabledDates=function(e){f.disabledDateRanges=e;for(var t=0,n=p.rows.length;n>t;t++)angular.forEach(p.rows[t],r.$setDisabledEl)},r.select=function(e,t){angular.isDate(n.$dateValue)||(n.$dateValue=new Date(e)),!p.$mode||t?(n.$setViewValue(angular.copy(e)),n.$render(),f.autoclose&&!t&&r.hide(!0)):(angular.extend(g,{year:e.getFullYear(),month:e.getMonth(),date:e.getDate()}),r.setMode(p.$mode-1),r.$build())},r.setMode=function(e){p.$mode=e,$=r.$views[p.$mode],r.$build()},r.$build=function(e){e===!0&&$.built||(e!==!1||$.built)&&$.build.call($)},r.$updateSelected=function(){for(var e=0,t=p.rows.length;t>e;e++)angular.forEach(p.rows[e],o)},r.$isSelected=function(e){return $.isSelected(e)},r.$setDisabledEl=function(e){e.disabled=$.isDisabled(e.date)},r.$selectPane=function(e){var t=$.steps,n=new Date(Date.UTC(g.year+(t.year||0)*e,g.month+(t.month||0)*e,g.date+(t.day||0)*e));angular.extend(g,{year:n.getUTCFullYear(),month:n.getUTCMonth(),date:n.getUTCDate()}),r.$build()},r.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),c){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},r.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return p.$mode?p.$apply(function(){r.setMode(p.$mode-1)}):r.hide(!0);$.onKeyDown(e),u.$digest()}};var h=r.init;r.init=function(){return d&&f.useNative?(t.prop("type","date"),void t.css("-webkit-appearance","textfield")):(c&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",i)),void h())};var v=r.destroy;r.destroy=function(){d&&f.useNative&&t.off("click",i),v()};var y=r.show;r.show=function(){y(),setTimeout(function(){r.$element.on(c?"touchstart":"mousedown",r.$onMouseDown),f.keyboard&&t.on("keydown",r.$onKeyDown)})};var w=r.hide;return r.hide=function(e){r.$element.off(c?"touchstart":"mousedown",r.$onMouseDown),f.keyboard&&t.off("keydown",r.$onKeyDown),w(e)},r}var c=(angular.element(t.document.body),"createTouch"in t.document),d=/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent);return e.lang||(e.lang=i.id),u.defaults=e,u}]}).directive("bsDatepicker",["$window","$parse","$q","$locale","dateFilter","$datepicker","$dateParser","$timeout",function(e,t,n,a,o,i,r){var l=(i.defaults,/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent)),s=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};return{restrict:"EAC",require:"ngModel",link:function(e,t,n,a){function u(e){return e&&e.length?e:null}var c={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","modelDateFormat","dayFormat","strictFormat","startWeek","useNative","lang","startView","minView","iconLeft","iconRight"],function(e){angular.isDefined(n[e])&&(c[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){d&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(datepicker),?")),e===!0?d.show():d.hide())}),l&&c.useNative&&(c.dateFormat="yyyy-MM-dd");var d=i(t,a,c);c=d.$options,angular.forEach(["minDate","maxDate"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){if("today"===t){var n=new Date;d.$options[e]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()+("maxDate"===e?1:0),0,0,0,"minDate"===e?0:-1)}else d.$options[e]=angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):s(t)?+new Date(parseInt(t,10)):+new Date(t);!isNaN(d.$options[e])&&d.$build(!1)})}),e.$watch(n.ngModel,function(){d.update(a.$dateValue)},!0),angular.isDefined(n.disabledDates)&&e.$watch(n.disabledDates,function(e,t){e=u(e),t=u(t),e!==t&&d.updateDisabledDates(e)});var f=r({format:c.dateFormat,lang:c.lang,strict:c.strictFormat});a.$parsers.unshift(function(e){if(!e)return void a.$setValidity("date",!0);var t=f.parse(e,a.$dateValue);if(!t||isNaN(t.getTime()))return void a.$setValidity("date",!1);var n=isNaN(d.$options.minDate)||t.getTime()>=d.$options.minDate,i=isNaN(d.$options.maxDate)||t.getTime()<=d.$options.maxDate,r=n&&i;return a.$setValidity("date",r),a.$setValidity("min",n),a.$setValidity("max",i),r&&(a.$dateValue=t),"string"===c.dateType?o(t,c.modelDateFormat||c.dateFormat):"number"===c.dateType?a.$dateValue.getTime():"iso"===c.dateType?a.$dateValue.toISOString():new Date(a.$dateValue)}),a.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===c.dateType?f.parse(e,null,c.modelDateFormat):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":o(a.$dateValue,c.dateFormat))},e.$on("$destroy",function(){d&&d.destroy(),c=null,d=null})}}}]).provider("datepickerViews",function(){function e(e,t){for(var n=[];e.length>0;)n.push(e.splice(0,t));return n}function t(e,t){return(e%t+t)%t}this.defaults={dayFormat:"dd",daySplit:7};this.$get=["$locale","$sce","dateFilter",function(n,a,o){return function(i){var r=i.$scope,l=i.$options,s=n.DATETIME_FORMATS.SHORTDAY,u=s.slice(l.startWeek).concat(s.slice(0,l.startWeek)),c=a.trustAsHtml(''+u.join(' ')+" "),d=i.$date||new Date,f={year:d.getFullYear(),month:d.getMonth(),date:d.getDate()},p=(6e4*d.getTimezoneOffset(),[{format:l.dayFormat,split:7,steps:{month:1},update:function(e,t){!this.built||t||e.getFullYear()!==f.year||e.getMonth()!==f.month?(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getDate()!==f.date&&(f.date=i.$date.getDate(),i.$updateSelected())},build:function(){var n=new Date(f.year,f.month,1),a=n.getTimezoneOffset(),s=new Date(+n-864e5*t(n.getDay()-l.startWeek,7)),u=s.getTimezoneOffset();u!==a&&(s=new Date(+s+6e4*(u-a)));for(var d,p=[],m=0;42>m;m++)d=new Date(s.getFullYear(),s.getMonth(),s.getDate()+m),p.push({date:d,label:o(d,this.format),selected:i.$date&&this.isSelected(d),muted:d.getMonth()!==f.month,disabled:this.isDisabled(d)});r.title=o(n,"MMMM yyyy"),r.showLabels=!0,r.labels=c,r.rows=e(p,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()&&e.getDate()===i.$date.getDate()},isDisabled:function(e){var t=e.getTime();if(tl.maxDate)return!0;if(l.disabledDateRanges)for(var n=0;n=l.disabledDateRanges[n].start)return t<=l.disabledDateRanges[n].end?!0:!1;return!1},onKeyDown:function(e){var t,n=i.$date.getTime();37===e.keyCode?t=new Date(n-864e5):38===e.keyCode?t=new Date(n-6048e5):39===e.keyCode?t=new Date(n+864e5):40===e.keyCode&&(t=new Date(n+6048e5)),this.isDisabled(t)||i.select(t,!0)}},{name:"month",format:"MMM",split:4,steps:{year:1},update:function(e){this.built&&e.getFullYear()===f.year?e.getMonth()!==f.month&&(angular.extend(f,{month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected()):(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build())},build:function(){for(var t,n=(new Date(f.year,0,1),[]),a=0;12>a;a++)t=new Date(f.year,a,1),n.push({date:t,label:o(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=o(t,"yyyy"),r.showLabels=!1,r.rows=e(n,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()},isDisabled:function(e){var t=+new Date(e.getFullYear(),e.getMonth()+1,0);return tl.maxDate},onKeyDown:function(e){var t=i.$date.getMonth(),n=new Date(i.$date);37===e.keyCode?n.setMonth(t-1):38===e.keyCode?n.setMonth(t-4):39===e.keyCode?n.setMonth(t+1):40===e.keyCode&&n.setMonth(t+4),this.isDisabled(n)||i.select(n,!0)}},{name:"year",format:"yyyy",split:4,steps:{year:12},update:function(e,t){!this.built||t||parseInt(e.getFullYear()/20,10)!==parseInt(f.year/20,10)?(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getFullYear()!==f.year&&(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected())},build:function(){for(var t,n=f.year-f.year%(3*this.split),a=[],l=0;12>l;l++)t=new Date(n+l,0,1),a.push({date:t,label:o(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=a[0].label+"-"+a[a.length-1].label,r.showLabels=!1,r.rows=e(a,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()},isDisabled:function(e){var t=+new Date(e.getFullYear()+1,0,0);return tl.maxDate},onKeyDown:function(e){var t=i.$date.getFullYear(),n=new Date(i.$date);37===e.keyCode?n.setYear(t-1):38===e.keyCode?n.setYear(t-4):39===e.keyCode?n.setYear(t+1):40===e.keyCode&&n.setYear(t+4),this.isDisabled(n)||i.select(n,!0)}}]);return{views:l.minView?Array.prototype.slice.call(p,l.minView):p,viewDate:f}}}]}),angular.module("mgcrea.ngStrap.dropdown",["mgcrea.ngStrap.tooltip"]).provider("$dropdown",function(){var e=this.defaults={animation:"am-fade",prefixClass:"dropdown",placement:"bottom-left",template:"dropdown/dropdown.tpl.html",trigger:"click",container:!1,keyboard:!0,html:!1,delay:0};this.$get=["$window","$rootScope","$tooltip",function(t,n,a){function o(t,o){function l(e){return e.target!==t[0]?e.target!==t[0]&&s.hide():void 0}{var s={},u=angular.extend({},e,o);s.$scope=u.scope&&u.scope.$new()||n.$new()}s=a(t,u),s.$onKeyDown=function(e){if(/(38|40)/.test(e.keyCode)){e.preventDefault(),e.stopPropagation();var t=angular.element(s.$element[0].querySelectorAll("li:not(.divider) a"));if(t.length){var n;angular.forEach(t,function(e,t){r&&r.call(e,":focus")&&(n=t)}),38===e.keyCode&&n>0?n--:40===e.keyCode&&n1){var r=i.search(n[t]);e=e.split(n[t]).join(""),p[n[t]]&&(a[r]=p[n[t]])}return angular.forEach(a,function(e){o.push(e)}),o}function r(e){return e.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function l(e){var t,n=Object.keys(f),a=e;for(t=0;tu?a=setTimeout(s,t-u):(a=null,n||(l=e.apply(i,o)))},u=n&&!a;return a||(a=setTimeout(s,t)),u&&(l=e.apply(i,o)),l}}).constant("throttle",function(e,t,n){var a,o,i,r=null,l=0;n||(n={});var s=function(){l=n.leading===!1?0:new Date,r=null,i=e.apply(a,o)};return function(){var u=new Date;l||n.leading!==!1||(l=u);var c=t-(u-l);return a=this,o=arguments,0>=c?(clearTimeout(r),r=null,l=u,i=e.apply(a,o)):r||n.trailing===!1||(r=setTimeout(s,c)),i}}),angular.module("mgcrea.ngStrap.helpers.dimensions",[]).factory("dimensions",["$document","$window",function(){var t=(angular.element,{}),n=t.nodeName=function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()};t.css=function(t,n,a){var o;return o=t.currentStyle?t.currentStyle[n]:e.getComputedStyle?e.getComputedStyle(t)[n]:t.style[n],a===!0?parseFloat(o)||0:o},t.offset=function(t){var n=t.getBoundingClientRect(),a=t.ownerDocument;return{width:n.width||t.offsetWidth,height:n.height||t.offsetHeight,top:n.top+(e.pageYOffset||a.documentElement.scrollTop)-(a.documentElement.clientTop||0),left:n.left+(e.pageXOffset||a.documentElement.scrollLeft)-(a.documentElement.clientLeft||0)}},t.position=function(e){var o,i,r={top:0,left:0};return"fixed"===t.css(e,"position")?i=e.getBoundingClientRect():(o=a(e),i=t.offset(e),i=t.offset(e),n(o,"html")||(r=t.offset(o)),r.top+=t.css(o,"borderTopWidth",!0),r.left+=t.css(o,"borderLeftWidth",!0)),{width:e.offsetWidth,height:e.offsetHeight,top:i.top-r.top-t.css(e,"marginTop",!0),left:i.left-r.left-t.css(e,"marginLeft",!0)}};var a=function(e){var a=e.ownerDocument,o=e.offsetParent||a;if(n(o,"#document"))return a.documentElement;for(;o&&!n(o,"html")&&"static"===t.css(o,"position");)o=o.offsetParent;return o||a.documentElement};return t.height=function(e,n){var a=e.offsetHeight;return n?a+=t.css(e,"marginTop",!0)+t.css(e,"marginBottom",!0):a-=t.css(e,"paddingTop",!0)+t.css(e,"paddingBottom",!0)+t.css(e,"borderTopWidth",!0)+t.css(e,"borderBottomWidth",!0),a},t.width=function(e,n){var a=e.offsetWidth;return n?a+=t.css(e,"marginLeft",!0)+t.css(e,"marginRight",!0):a-=t.css(e,"paddingLeft",!0)+t.css(e,"paddingRight",!0)+t.css(e,"borderLeftWidth",!0)+t.css(e,"borderRightWidth",!0),a},t}]),angular.module("mgcrea.ngStrap.helpers.parseOptions",[]).provider("$parseOptions",function(){var e=this.defaults={regexp:/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/};this.$get=["$parse","$q",function(t,n){function a(a,o){function i(e,t){return e.map(function(e,n){var a,o,i={};return i[c]=e,a=u(t,i),o=p(t,i)||n,{label:a,value:o}})}var r={},l=angular.extend({},e,o);r.$values=[];var s,u,c,d,f,p,m;return r.init=function(){r.$match=s=a.match(l.regexp),u=t(s[2]||s[1]),c=s[4]||s[6],d=s[5],f=t(s[3]||""),p=t(s[2]?s[1]:c),m=t(s[7])},r.valuesFn=function(e,t){return n.when(m(e,t)).then(function(t){return r.$values=t?i(t,e):{},r.$values})},r.init(),r}return a}]}),angular.version.minor<3&&angular.version.dot<14&&angular.module("ng").factory("$$rAF",["$window","$timeout",function(e,t){var n=e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame,a=e.cancelAnimationFrame||e.webkitCancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelRequestAnimationFrame,o=!!n,i=o?function(e){var t=n(e);return function(){a(t)}}:function(e){var n=t(e,16.66,!1);return function(){t.cancel(n)}};return i.supported=o,i}]),angular.module("mgcrea.ngStrap.modal",["mgcrea.ngStrap.helpers.dimensions"]).provider("$modal",function(){var e=this.defaults={animation:"am-fade",backdropAnimation:"am-fade",prefixClass:"modal",prefixEvent:"modal",placement:"top",template:"modal/modal.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","$timeout","$sce","dimensions",function(n,a,o,i,r,l,s,u,c){function d(t){function n(e){e.target===e.currentTarget&&("static"===r.backdrop?i.focus():i.hide())}var i={},r=i.$options=angular.extend({},e,t);i.$promise=p(r.template);var l=i.$scope=r.scope&&r.scope.$new()||a.$new();r.element||r.container||(r.container="body"),m(["title","content"],function(e){r[e]&&(l[e]=c.trustAsHtml(r[e]))}),l.$hide=function(){l.$$postDigest(function(){i.hide()})},l.$show=function(){l.$$postDigest(function(){i.show()})},l.$toggle=function(){l.$$postDigest(function(){i.toggle()})},r.contentTemplate&&(i.$promise=i.$promise.then(function(e){var n=angular.element(e);return p(r.contentTemplate).then(function(e){var a=f('[ng-bind="content"]',n[0]).removeAttr("ng-bind").html(e);return t.template||a.next().remove(),n[0].outerHTML})}));var u,d,y=angular.element('
');return i.$promise.then(function(e){angular.isObject(e)&&(e=e.data),r.html&&(e=e.replace(v,'ng-bind-html="')),e=g.apply(e),u=o(e),i.init()}),i.init=function(){r.show&&l.$$postDigest(function(){i.show()})},i.destroy=function(){d&&(d.remove(),d=null),y&&(y.remove(),y=null),l.$destroy()},i.show=function(){l.$emit(r.prefixEvent+".show.before",i);var e;e=angular.isElement(r.container)?r.container:r.container?f(r.container):null;var t=r.container?null:r.element;d=i.$element=u(l,function(){}),d.css({display:"block"}).addClass(r.placement),r.animation&&(r.backdrop&&y.addClass(r.backdropAnimation),d.addClass(r.animation)),r.backdrop&&s.enter(y,h,null,function(){}),s.enter(d,e,t,function(){l.$emit(r.prefixEvent+".show",i)}),l.$isShown=!0,l.$$phase||l.$root&&l.$root.$$phase||l.$digest();var a=d[0];$(function(){a.focus()}),h.addClass(r.prefixClass+"-open"),r.animation&&h.addClass(r.prefixClass+"-with-"+r.animation),r.backdrop&&(d.on("click",n),y.on("click",n)),r.keyboard&&d.on("keyup",i.$onKeyUp)},i.hide=function(){l.$emit(r.prefixEvent+".hide.before",i),s.leave(d,function(){l.$emit(r.prefixEvent+".hide",i),h.removeClass(r.prefixClass+"-open"),r.animation&&h.removeClass(r.prefixClass+"-with-"+r.animation)}),r.backdrop&&s.leave(y,function(){}),l.$isShown=!1,l.$$phase||l.$root&&l.$root.$$phase||l.$digest(),r.backdrop&&(d.off("click",n),y.off("click",n)),r.keyboard&&d.off("keyup",i.$onKeyUp)},i.toggle=function(){l.$isShown?i.hide():i.show()},i.focus=function(){d[0].focus()},i.$onKeyUp=function(e){27===e.which&&i.hide()},i}function f(e,n){return angular.element((n||t).querySelectorAll(e))}function p(e){return i.when(r.get(e)||l.get(e)).then(function(t){return angular.isObject(t)?(r.put(e,t.data),t.data):t})}var m=angular.forEach,g=String.prototype.trim,$=n.requestAnimationFrame||n.setTimeout,h=angular.element(n.document.body),v=/ng-bind="/gi;return d}]}).directive("bsModal",["$window","$location","$sce","$modal",function(e,t,n,a){return{restrict:"EAC",scope:!0,link:function(e,t,o){var i={scope:e,element:t,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content"],function(t){o[t]&&o.$observe(t,function(a){e[t]=n.trustAsHtml(a)})}),o.bsModal&&e.$watch(o.bsModal,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=a(i);t.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.navbar",[]).provider("$navbar",function(){var e=this.defaults={activeClass:"active",routeAttr:"data-match-route",strict:!1};this.$get=function(){return{defaults:e}}}).directive("bsNavbar",["$window","$location","$navbar",function(e,t,n){var a=n.defaults;return{restrict:"A",link:function(e,n,o){var i=angular.copy(a);angular.forEach(Object.keys(a),function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),e.$watch(function(){return t.path()},function(e){var t=n[0].querySelectorAll("li["+i.routeAttr+"]");angular.forEach(t,function(t){var n=angular.element(t),a=n.attr(i.routeAttr).replace("/","\\/");i.strict&&(a="^"+a+"$");var o=new RegExp(a,["i"]);o.test(e)?n.addClass(i.activeClass):n.removeClass(i.activeClass)})})}}}]),angular.module("mgcrea.ngStrap.popover",["mgcrea.ngStrap.tooltip"]).provider("$popover",function(){var e=this.defaults={animation:"am-fade",container:!1,target:!1,placement:"right",template:"popover/popover.tpl.html",contentTemplate:!1,trigger:"click",keyboard:!0,html:!1,title:"",content:"",delay:0};this.$get=["$tooltip",function(t){function n(n,a){var o=angular.extend({},e,a),i=t(n,o);return o.content&&(i.$scope.content=o.content),i}return n}]}).directive("bsPopover",["$window","$location","$sce","$popover",function(e,t,n,a){var o=e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,t,i){var r={scope:e};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title","content"],function(t){i[t]&&i.$observe(t,function(a,i){e[t]=n.trustAsHtml(a),angular.isDefined(i)&&o(function(){l&&l.$applyPlacement()})})}),i.bsPopover&&e.$watch(i.bsPopover,function(t,n){angular.isObject(t)?angular.extend(e,t):e.content=t,angular.isDefined(n)&&o(function(){l&&l.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e){l&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(popover),?")),e===!0?l.show():l.hide())});var l=a(t,r);e.$on("$destroy",function(){l.destroy(),r=null,l=null})}}}]),angular.module("mgcrea.ngStrap.scrollspy",["mgcrea.ngStrap.helpers.debounce","mgcrea.ngStrap.helpers.dimensions"]).provider("$scrollspy",function(){var e=this.$$spies={},n=this.defaults={debounce:150,throttle:100,offset:100};
-this.$get=["$window","$document","$rootScope","dimensions","debounce","throttle",function(a,o,i,r,l,s){function u(e,t){return e[0].nodeName&&e[0].nodeName.toLowerCase()===t.toLowerCase()}function c(o){var c=angular.extend({},n,o);c.element||(c.element=p);var m=u(c.element,"body"),g=m?d:c.element,$=m?"window":c.id;if(e[$])return e[$].$$count++,e[$];var h,v,y,w,b,D,k,T,x={},S=x.$trackedElements=[],M=[];return x.init=function(){this.$$count=1,w=l(this.checkPosition,c.debounce),b=s(this.checkPosition,c.throttle),g.on("click",this.checkPositionWithEventLoop),d.on("resize",w),g.on("scroll",b),D=l(this.checkOffsets,c.debounce),h=i.$on("$viewContentLoaded",D),v=i.$on("$includeContentLoaded",D),D(),$&&(e[$]=x)},x.destroy=function(){this.$$count--,this.$$count>0||(g.off("click",this.checkPositionWithEventLoop),d.off("resize",w),g.off("scroll",w),h(),v(),$&&delete e[$])},x.checkPosition=function(){if(M.length){if(T=(m?a.pageYOffset:g.prop("scrollTop"))||0,k=Math.max(a.innerHeight,f.prop("clientHeight")),TM[e+1].offsetTop))return x.$activateElement(M[e])}},x.checkPositionWithEventLoop=function(){setTimeout(this.checkPosition,1)},x.$activateElement=function(e){if(y){var t=x.$getTrackedElement(y);t&&(t.source.removeClass("active"),u(t.source,"li")&&u(t.source.parent().parent(),"li")&&t.source.parent().parent().removeClass("active"))}y=e.target,e.source.addClass("active"),u(e.source,"li")&&u(e.source.parent().parent(),"li")&&e.source.parent().parent().addClass("active")},x.$getTrackedElement=function(e){return S.filter(function(t){return t.target===e})[0]},x.checkOffsets=function(){angular.forEach(S,function(e){var n=t.querySelector(e.target);e.offsetTop=n?r.offset(n).top:null,c.offset&&null!==e.offsetTop&&(e.offsetTop-=1*c.offset)}),M=S.filter(function(e){return null!==e.offsetTop}).sort(function(e,t){return e.offsetTop-t.offsetTop}),w()},x.trackElement=function(e,t){S.push({target:e,source:t})},x.untrackElement=function(e,t){for(var n,a=S.length;a--;)if(S[a].target===e&&S[a].source===t){n=a;break}S=S.splice(n,1)},x.activate=function(e){S[e].addClass("active")},x.init(),x}var d=angular.element(a),f=angular.element(o.prop("documentElement")),p=angular.element(a.document.body);return c}]}).directive("bsScrollspy",["$rootScope","debounce","dimensions","$scrollspy",function(e,t,n,a){return{restrict:"EAC",link:function(e,t,n){var o={scope:e};angular.forEach(["offset","target"],function(e){angular.isDefined(n[e])&&(o[e]=n[e])});var i=a(o);i.trackElement(o.target,t),e.$on("$destroy",function(){i.untrackElement(o.target,t),i.destroy(),o=null,i=null})}}}]).directive("bsScrollspyList",["$rootScope","debounce","dimensions","$scrollspy",function(){return{restrict:"A",compile:function(e){var t=e[0].querySelectorAll("li > a[href]");angular.forEach(t,function(e){var t=angular.element(e);t.parent().attr("bs-scrollspy","").attr("data-target",t.attr("href"))})}}}]),angular.module("mgcrea.ngStrap.select",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$select",function(){var e=this.defaults={animation:"am-fade",prefixClass:"select",prefixEvent:"$select",placement:"bottom-left",template:"select/select.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,allNoneButtons:!1,sort:!0,caretHtml:' ',placeholder:"Choose among the following...",maxLength:3,maxLengthHtml:"selected",iconCheckmark:"glyphicon glyphicon-ok"};this.$get=["$window","$document","$rootScope","$tooltip",function(t,n,a,o){function i(t,n,a){var i={},l=angular.extend({},e,a);i=o(t,l);var s=i.$scope;s.$matches=[],s.$activeIndex=0,s.$isMultiple=l.multiple,s.$showAllNoneButtons=l.allNoneButtons&&l.multiple,s.$iconCheckmark=l.iconCheckmark,s.$activate=function(e){s.$$postDigest(function(){i.activate(e)})},s.$select=function(e){s.$$postDigest(function(){i.select(e)})},s.$isVisible=function(){return i.$isVisible()},s.$isActive=function(e){return i.$isActive(e)},s.$selectAll=function(){for(var e=0;e=s.$matches.length&&(s.$activeIndex=l.multiple?[]:0)},i.$isVisible=function(){return l.minLength&&n?s.$matches.length&&n.$viewValue.length>=l.minLength:s.$matches.length},i.$isActive=function(e){return l.multiple?-1!==s.$activeIndex.indexOf(e):s.$activeIndex===e},i.$getIndex=function(e){var t=s.$matches.length,n=t;if(t){for(n=t;n--&&s.$matches[n].value!==e;);if(!(0>n))return n}},i.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),r){var t=angular.element(e.target);t.triggerHandler("click")}},i.$onKeyDown=function(e){if(/(9|13|38|40)/.test(e.keyCode)){if(e.preventDefault(),e.stopPropagation(),!l.multiple&&(13===e.keyCode||9===e.keyCode))return i.select(s.$activeIndex);38===e.keyCode&&s.$activeIndex>0?s.$activeIndex--:40===e.keyCode&&s.$activeIndex'),s.after(t)}var u=o(n.ngOptions),c=a(t,r,l),d=u.$match[7].replace(/\|.+/,"").trim();e.$watch(d,function(){u.valuesFn(e,r).then(function(e){c.update(e),r.$render()})},!0),e.$watch(n.ngModel,function(){c.$updateActiveIndex(),r.$render()},!0),r.$render=function(){var e,a;l.multiple&&angular.isArray(r.$modelValue)?(e=r.$modelValue.map(function(e){return a=c.$getIndex(e),angular.isDefined(a)?c.$scope.$matches[a].label:!1}).filter(angular.isDefined),e=e.length>(l.maxLength||i.maxLength)?e.length+" "+(l.maxLengthHtml||i.maxLengthHtml):e.join(", ")):(a=c.$getIndex(r.$modelValue),e=angular.isDefined(a)?c.$scope.$matches[a].label:!1),t.html((e?e:n.placeholder||i.placeholder)+i.caretHtml)},e.$on("$destroy",function(){c.destroy(),l=null,c=null})}}}]),angular.module("mgcrea.ngStrap.tab",[]).run(["$templateCache",function(e){e.put("$pane","{{pane.content}}")}]).provider("$tab",function(){var e=this.defaults={animation:"am-fade",template:"tab/tab.tpl.html"};this.$get=function(){return{defaults:e}}}).directive("bsTabs",["$window","$animate","$tab",function(e,t,n){var a=n.defaults;return{restrict:"EAC",scope:!0,require:"?ngModel",templateUrl:function(e,t){return t.template||a.template},link:function(e,t,n,o){var i=a;angular.forEach(["animation"],function(e){angular.isDefined(n[e])&&(i[e]=n[e])}),n.bsTabs&&e.$watch(n.bsTabs,function(t){e.panes=t},!0),t.addClass("tabs"),i.animation&&t.addClass(i.animation),e.active=e.activePane=0,e.setActive=function(t){e.active=t,o&&o.$setViewValue(t)},o&&(o.$render=function(){e.active=1*o.$modelValue})}}}]),angular.module("mgcrea.ngStrap.timepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$timepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"timepicker",placement:"bottom-left",template:"timepicker/timepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!0,timeType:"date",timeFormat:"shortTime",modelTimeFormat:null,autoclose:!1,minTime:-1/0,maxTime:+1/0,length:5,hourStep:1,minuteStep:5,iconUp:"glyphicon glyphicon-chevron-up",iconDown:"glyphicon glyphicon-chevron-down"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","$tooltip",function(t,n,a,o,i,r,l){function s(t,n,a){function o(e,n){if(t[0].createTextRange){var a=t[0].createTextRange();a.collapse(!0),a.moveStart("character",e),a.moveEnd("character",n),a.select()}else t[0].setSelectionRange?t[0].setSelectionRange(e,n):angular.isUndefined(t[0].selectionStart)&&(t[0].selectionStart=e,t[0].selectionEnd=n)}function s(){t[0].focus()}var d=l(t,angular.extend({},e,a)),f=a.scope,p=d.$options,m=d.$scope,g=0,$=n.$dateValue||new Date,h={hour:$.getHours(),meridian:$.getHours()<12,minute:$.getMinutes(),second:$.getSeconds(),millisecond:$.getMilliseconds()},v=i.DATETIME_FORMATS[p.timeFormat]||p.timeFormat,y=/(h+)([:\.])?(m+)[ ]?(a?)/i.exec(v).slice(1);m.$iconUp=p.iconUp,m.$iconDown=p.iconDown,m.$select=function(e,t){d.select(e,t)},m.$moveIndex=function(e,t){d.$moveIndex(e,t)},m.$switchMeridian=function(e){d.switchMeridian(e)},d.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())?(d.$date=e,angular.extend(h,{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}),d.$build()):d.$isBuilt||d.$build()},d.select=function(e,t,a){(!n.$dateValue||isNaN(n.$dateValue.getTime()))&&(n.$dateValue=new Date(1970,0,1)),angular.isDate(e)||(e=new Date(e)),0===t?n.$dateValue.setHours(e.getHours()):1===t&&n.$dateValue.setMinutes(e.getMinutes()),n.$setViewValue(n.$dateValue),n.$render(),p.autoclose&&!a&&d.hide(!0)},d.switchMeridian=function(e){var t=(e||n.$dateValue).getHours();n.$dateValue.setHours(12>t?t+12:t-12),n.$setViewValue(n.$dateValue),n.$render()},d.$build=function(){var e,t,n=m.midIndex=parseInt(p.length/2,10),a=[];for(e=0;e1*p.maxTime},d.$moveIndex=function(e,t){var n;0===t?(n=new Date(1970,0,1,h.hour+e*p.length,h.minute),angular.extend(h,{hour:n.getHours()})):1===t&&(n=new Date(1970,0,1,h.hour,h.minute+e*p.length*p.minuteStep),angular.extend(h,{minute:n.getMinutes()})),d.$build()},d.$onMouseDown=function(e){if("input"!==e.target.nodeName.toLowerCase()&&e.preventDefault(),e.stopPropagation(),u){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},d.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return d.hide(!0);var t=new Date(d.$date),n=t.getHours(),a=r(t,"h").length,i=t.getMinutes(),l=r(t,"mm").length,s=/(37|39)/.test(e.keyCode),u=2+1*!!y[3];s&&(37===e.keyCode?g=1>g?u-1:g-1:39===e.keyCode&&(g=u-1>g?g+1:0));var c=[0,a];0===g?(38===e.keyCode?t.setHours(n-parseInt(p.hourStep,10)):40===e.keyCode&&t.setHours(n+parseInt(p.hourStep,10)),c=[0,a]):1===g?(38===e.keyCode?t.setMinutes(i-parseInt(p.minuteStep,10)):40===e.keyCode&&t.setMinutes(i+parseInt(p.minuteStep,10)),c=[a+1,a+1+l]):2===g&&(s||d.switchMeridian(),c=[a+1+l+1,a+1+l+3]),d.select(t,g,!0),o(c[0],c[1]),f.$digest()}};var w=d.init;d.init=function(){return c&&p.useNative?(t.prop("type","time"),void t.css("-webkit-appearance","textfield")):(u&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",s)),void w())};var b=d.destroy;d.destroy=function(){c&&p.useNative&&t.off("click",s),b()};var D=d.show;d.show=function(){D(),setTimeout(function(){d.$element.on(u?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.on("keydown",d.$onKeyDown)})};var k=d.hide;return d.hide=function(e){d.$element.off(u?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.off("keydown",d.$onKeyDown),k(e)},d}var u=(angular.element(t.document.body),"createTouch"in t.document),c=/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent);return e.lang||(e.lang=i.id),s.defaults=e,s}]}).directive("bsTimepicker",["$window","$parse","$q","$locale","dateFilter","$timepicker","$dateParser","$timeout",function(e,t,n,a,o,i,r){{var l=i.defaults,s=/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent);e.requestAnimationFrame||e.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(e,t,n,a){var u={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","timeType","timeFormat","modelTimeFormat","useNative","hourStep","minuteStep","length"],function(e){angular.isDefined(n[e])&&(u[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){c&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(timepicker),?")),e===!0?c.show():c.hide())}),s&&(u.useNative||l.useNative)&&(u.timeFormat="HH:mm");var c=i(t,a,u);u=c.$options;var d=r({format:u.timeFormat,lang:u.lang});angular.forEach(["minTime","maxTime"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){c.$options[e]="now"===t?(new Date).setFullYear(1970,0,1):angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):d.parse(t,new Date(1970,0,1,0)),!isNaN(c.$options[e])&&c.$build()})}),e.$watch(n.ngModel,function(){c.update(a.$dateValue)},!0),a.$parsers.unshift(function(e){if(!e)return void a.$setValidity("date",!0);var t=d.parse(e,a.$dateValue);if(!t||isNaN(t.getTime()))a.$setValidity("date",!1);else{var n=t.getTime()>=u.minTime&&t.getTime()<=u.maxTime;a.$setValidity("date",n),n&&(a.$dateValue=t)}return"string"===u.timeType?o(t,u.modelTimeFormat||u.timeFormat):"number"===u.timeType?a.$dateValue.getTime():"iso"===u.timeType?a.$dateValue.toISOString():new Date(a.$dateValue)}),a.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===u.timeType?d.parse(e,null,u.modelTimeFormat):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":o(a.$dateValue,u.timeFormat))},e.$on("$destroy",function(){c.destroy(),u=null,c=null})}}}]),angular.module("mgcrea.ngStrap.tooltip",["mgcrea.ngStrap.helpers.dimensions"]).provider("$tooltip",function(){var e=this.defaults={animation:"am-fade",customClass:"",prefixClass:"tooltip",prefixEvent:"tooltip",container:!1,target:!1,placement:"top",template:"tooltip/tooltip.tpl.html",contentTemplate:!1,trigger:"hover focus",keyboard:!1,html:!1,show:!1,title:"",type:"",delay:0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","dimensions","$$rAF",function(n,a,o,i,r,l,s,u,c){function d(t,n){function i(){return"body"===h.container?u.offset(h.target[0]||t[0]):u.position(h.target[0]||t[0])}function r(e,t,n,a){var o,i=e.split("-");switch(i[0]){case"right":o={top:t.top+t.height/2-a/2,left:t.left+t.width};break;case"bottom":o={top:t.top+t.height,left:t.left+t.width/2-n/2};break;case"left":o={top:t.top+t.height/2-a/2,left:t.left-n};break;default:o={top:t.top-a,left:t.left+t.width/2-n/2}}if(!i[1])return o;if("top"===i[0]||"bottom"===i[0])switch(i[1]){case"left":o.left=t.left;break;case"right":o.left=t.left+t.width-n}else if("left"===i[0]||"right"===i[0])switch(i[1]){case"top":o.top=t.top-a;break;case"bottom":o.top=t.top+t.height}return o}var l={},d=t[0].nodeName.toLowerCase(),h=l.$options=angular.extend({},e,n);l.$promise=p(h.template);var v=l.$scope=h.scope&&h.scope.$new()||a.$new();h.delay&&angular.isString(h.delay)&&(h.delay=parseFloat(h.delay)),h.title&&(l.$scope.title=h.title),v.$hide=function(){v.$$postDigest(function(){l.hide()})},v.$show=function(){v.$$postDigest(function(){l.show()})},v.$toggle=function(){v.$$postDigest(function(){l.toggle()})},l.$isShown=v.$isShown=!1;var y,w;h.contentTemplate&&(l.$promise=l.$promise.then(function(e){var t=angular.element(e);return p(h.contentTemplate).then(function(e){var n=f('[ng-bind="content"]',t[0]);return n.length||(n=f('[ng-bind="title"]',t[0])),n.removeAttr("ng-bind").html(e),t[0].outerHTML})}));var b,D,k,T;return l.$promise.then(function(e){angular.isObject(e)&&(e=e.data),h.html&&(e=e.replace($,'ng-bind-html="')),e=m.apply(e),k=e,b=o(e),l.init()}),l.init=function(){h.delay&&angular.isNumber(h.delay)&&(h.delay={show:h.delay,hide:h.delay}),"self"===h.container?T=t:angular.isElement(h.container)?T=h.container:h.container&&(T=f(h.container));var e=h.trigger.split(" ");angular.forEach(e,function(e){"click"===e?t.on("click",l.toggle):"manual"!==e&&(t.on("hover"===e?"mouseenter":"focus",l.enter),t.on("hover"===e?"mouseleave":"blur",l.leave),"button"===d&&"hover"!==e&&t.on(g?"touchstart":"mousedown",l.$onFocusElementMouseDown))}),h.target&&(h.target=angular.isElement(h.target)?h.target:f(h.target)[0]),h.show&&v.$$postDigest(function(){"focus"===h.trigger?t[0].focus():l.show()})},l.destroy=function(){for(var e=h.trigger.split(" "),n=e.length;n--;){var a=e[n];"click"===a?t.off("click",l.toggle):"manual"!==a&&(t.off("hover"===a?"mouseenter":"focus",l.enter),t.off("hover"===a?"mouseleave":"blur",l.leave),"button"===d&&"hover"!==a&&t.off(g?"touchstart":"mousedown",l.$onFocusElementMouseDown))}D&&(D.remove(),D=null),clearTimeout(y),v.$destroy()},l.enter=function(){return clearTimeout(y),w="in",h.delay&&h.delay.show?void(y=setTimeout(function(){"in"===w&&l.show()},h.delay.show)):l.show()},l.show=function(){v.$emit(h.prefixEvent+".show.before",l);var e=h.container?T:null,n=h.container?null:t;D&&D.remove(),D=l.$element=b(v,function(){}),D.css({top:"-9999px",left:"-9999px",display:"block",visibility:"hidden"}).addClass(h.placement),h.animation&&D.addClass(h.animation),h.type&&D.addClass(h.prefixClass+"-"+h.type),h.customClass&&D.addClass(h.customClass),s.enter(D,e,n,function(){v.$emit(h.prefixEvent+".show",l)}),l.$isShown=v.$isShown=!0,v.$$phase||v.$root&&v.$root.$$phase||v.$digest(),c(function(){l.$applyPlacement(),D.css({visibility:"visible"})}),h.keyboard&&("focus"!==h.trigger?(l.focus(),D.on("keyup",l.$onKeyUp)):t.on("keyup",l.$onFocusKeyUp))},l.leave=function(){return clearTimeout(y),w="out",h.delay&&h.delay.hide?void(y=setTimeout(function(){"out"===w&&l.hide()},h.delay.hide)):l.hide()},l.hide=function(e){return l.$isShown?(v.$emit(h.prefixEvent+".hide.before",l),s.leave(D,function(){v.$emit(h.prefixEvent+".hide",l)}),l.$isShown=v.$isShown=!1,v.$$phase||v.$root&&v.$root.$$phase||v.$digest(),h.keyboard&&null!==D&&D.off("keyup",l.$onKeyUp),e&&"focus"===h.trigger?t[0].blur():void 0):void 0},l.toggle=function(){l.$isShown?l.leave():l.enter()},l.focus=function(){D[0].focus()},l.$applyPlacement=function(){if(D){var e=i(),t=D.prop("offsetWidth"),n=D.prop("offsetHeight"),a=r(h.placement,e,t,n);a.top+="px",a.left+="px",D.css(a)}},l.$onKeyUp=function(e){27===e.which&&l.hide()},l.$onFocusKeyUp=function(e){27===e.which&&t[0].blur()},l.$onFocusElementMouseDown=function(e){e.preventDefault(),e.stopPropagation(),l.$isShown?t[0].blur():t[0].focus()},l}function f(e,n){return angular.element((n||t).querySelectorAll(e))}function p(e){return i.when(r.get(e)||l.get(e)).then(function(t){return angular.isObject(t)?(r.put(e,t.data),t.data):t})}var m=String.prototype.trim,g="createTouch"in n.document,$=/ng-bind="/gi;return d}]}).directive("bsTooltip",["$window","$location","$sce","$tooltip","$$rAF",function(e,t,n,a,o){return{restrict:"EAC",scope:!0,link:function(e,t,i){var r={scope:e};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","type","customClass"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title"],function(t){i.$observe(t,function(a,i){e[t]=n.trustAsHtml(a),angular.isDefined(i)&&o(function(){l&&l.$applyPlacement()})})}),i.bsTooltip&&e.$watch(i.bsTooltip,function(t,n){angular.isObject(t)?angular.extend(e,t):e.title=t,angular.isDefined(n)&&o(function(){l&&l.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e){l&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(tooltip),?")),e===!0?l.show():l.hide())});var l=a(t,r);e.$on("$destroy",function(){l.destroy(),r=null,l=null})}}}]),angular.module("mgcrea.ngStrap.typeahead",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$typeahead",function(){var e=this.defaults={animation:"am-fade",prefixClass:"typeahead",prefixEvent:"$typeahead",placement:"bottom-left",template:"typeahead/typeahead.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,minLength:1,filter:"filter",limit:6};this.$get=["$window","$rootScope","$tooltip",function(t,n,a){function o(t,n,o){var i={},r=angular.extend({},e,o);i=a(t,r);var l=o.scope,s=i.$scope;s.$resetMatches=function(){s.$matches=[],s.$activeIndex=0},s.$resetMatches(),s.$activate=function(e){s.$$postDigest(function(){i.activate(e)})},s.$select=function(e){s.$$postDigest(function(){i.select(e)})},s.$isVisible=function(){return i.$isVisible()},i.update=function(e){s.$matches=e,s.$activeIndex>=e.length&&(s.$activeIndex=0)},i.activate=function(e){s.$activeIndex=e},i.select=function(e){var t=s.$matches[e].value;n.$setViewValue(t),n.$render(),s.$resetMatches(),l&&l.$digest(),s.$emit(r.prefixEvent+".select",t,e)},i.$isVisible=function(){return r.minLength&&n?s.$matches.length&&angular.isString(n.$viewValue)&&n.$viewValue.length>=r.minLength:!!s.$matches.length},i.$getIndex=function(e){var t=s.$matches.length,n=t;if(t){for(n=t;n--&&s.$matches[n].value!==e;);if(!(0>n))return n}},i.$onMouseDown=function(e){e.preventDefault(),e.stopPropagation()},i.$onKeyDown=function(e){/(38|40|13)/.test(e.keyCode)&&(e.preventDefault(),i.$isVisible()&&e.stopPropagation(),13===e.keyCode&&s.$matches.length?i.select(s.$activeIndex):38===e.keyCode&&s.$activeIndex>0?s.$activeIndex--:40===e.keyCode&&s.$activeIndex0)return void r.$setViewValue(r.$viewValue.substring(0,r.$viewValue.length-1));e.length>u&&(e=e.slice(0,u));var n=f.$isVisible();n&&f.update(e),(1!==e.length||e[0].value!==t)&&(!n&&f.update(e),r.$render())})}),r.$render=function(){if(r.$isEmpty(r.$viewValue))return t.val("");var e=f.$getIndex(r.$modelValue),n=angular.isDefined(e)?f.$scope.$matches[e].label:r.$viewValue;n=angular.isObject(n)?n.label:n,t.val(n.replace(/<(?:.|\n)*?>/gm,"").trim())},e.$on("$destroy",function(){f.destroy(),l=null,f=null})}}}])}(window,document);
\ No newline at end of file
+!function(e,t){"use strict";angular.module("mgcrea.ngStrap",["mgcrea.ngStrap.modal","mgcrea.ngStrap.aside","mgcrea.ngStrap.alert","mgcrea.ngStrap.button","mgcrea.ngStrap.select","mgcrea.ngStrap.datepicker","mgcrea.ngStrap.timepicker","mgcrea.ngStrap.navbar","mgcrea.ngStrap.tooltip","mgcrea.ngStrap.popover","mgcrea.ngStrap.dropdown","mgcrea.ngStrap.typeahead","mgcrea.ngStrap.scrollspy","mgcrea.ngStrap.affix","mgcrea.ngStrap.tab"]),angular.module("mgcrea.ngStrap.affix",["mgcrea.ngStrap.helpers.dimensions","mgcrea.ngStrap.helpers.debounce"]).provider("$affix",function(){var e=this.defaults={offsetTop:"auto"};this.$get=["$window","debounce","dimensions",function(t,n,a){function o(o,s){function l(e,t,n){var a=u(),o=c();return h>=a?"top":null!==e&&a+e<=t.top?"middle":null!==v&&t.top+n+g>=o-v?"bottom":"middle"}function u(){return p[0]===t?t.pageYOffset:p[0]===t}function c(){return p[0]===t?t.document.body.scrollHeight:p[0].scrollHeight}var d={},f=angular.extend({},e,s),p=f.target,m="affix affix-top affix-bottom",g=0,$=0,h=0,v=0,y=null,w=null,b=o.parent();if(f.offsetParent)if(f.offsetParent.match(/^\d+$/))for(var D=0;D<1*f.offsetParent-1;D++)b=b.parent();else b=angular.element(f.offsetParent);return d.init=function(){d.$parseOffsets(),$=a.offset(o[0]).top+g,p.on("scroll",d.checkPosition),p.on("click",d.checkPositionWithEventLoop),r.on("resize",d.$debouncedOnResize),d.checkPosition(),d.checkPositionWithEventLoop()},d.destroy=function(){p.off("scroll",d.checkPosition),p.off("click",d.checkPositionWithEventLoop),r.off("resize",d.$debouncedOnResize)},d.checkPositionWithEventLoop=function(){setTimeout(d.checkPosition,1)},d.checkPosition=function(){var e=u(),t=a.offset(o[0]),n=a.height(o[0]),r=l(w,t,n);y!==r&&(y=r,o.removeClass(m).addClass("affix"+("middle"!==r?"-"+r:"")),"top"===r?(w=null,o.css("position",f.offsetParent?"":"relative"),o.css("top","")):"bottom"===r?(w=f.offsetUnpin?-(1*f.offsetUnpin):t.top-e,o.css("position",f.offsetParent?"":"relative"),o.css("top",f.offsetParent?"":i[0].offsetHeight-v-n-$+"px")):(w=null,o.css("position","fixed"),o.css("top",g+"px")))},d.$onResize=function(){d.$parseOffsets(),d.checkPosition()},d.$debouncedOnResize=n(d.$onResize,50),d.$parseOffsets=function(){o.css("position",f.offsetParent?"":"relative"),f.offsetTop&&("auto"===f.offsetTop&&(f.offsetTop="+0"),f.offsetTop.match(/^[-+]\d+$/)?(g=1*-f.offsetTop,h=f.offsetParent?a.offset(b[0]).top+1*f.offsetTop:a.offset(o[0]).top-a.css(o[0],"marginTop",!0)+1*f.offsetTop):h=1*f.offsetTop),f.offsetBottom&&(v=f.offsetParent&&f.offsetBottom.match(/^[-+]\d+$/)?c()-(a.offset(b[0]).top+a.height(b[0]))+1*f.offsetBottom+1:1*f.offsetBottom)},d.init(),d}var i=angular.element(t.document.body),r=angular.element(t);return o}]}).directive("bsAffix",["$affix","$window",function(e,t){return{restrict:"EAC",require:"^?bsAffixTarget",link:function(n,a,o,i){var r={scope:n,offsetTop:"auto",target:i?i.$element:angular.element(t)};angular.forEach(["offsetTop","offsetBottom","offsetParent","offsetUnpin"],function(e){angular.isDefined(o[e])&&(r[e]=o[e])});var s=e(a,r);n.$on("$destroy",function(){r=null,s=null})}}}]).directive("bsAffixTarget",function(){return{controller:["$element",function(e){this.$element=e}]}}),angular.module("mgcrea.ngStrap.alert",["mgcrea.ngStrap.modal"]).provider("$alert",function(){var e=this.defaults={animation:"am-fade",prefixClass:"alert",placement:null,template:"alert/alert.tpl.html",container:!1,element:null,backdrop:!1,keyboard:!0,show:!0,duration:!1,type:!1,dismissable:!0};this.$get=["$modal","$timeout",function(t,n){function a(a){var o={},i=angular.extend({},e,a);o=t(i),o.$scope.dismissable=!!i.dismissable,i.type&&(o.$scope.type=i.type);var r=o.show;return i.duration&&(o.show=function(){r(),n(function(){o.hide()},1e3*i.duration)}),o}return a}]}).directive("bsAlert",["$window","$location","$sce","$alert",function(e,t,n,a){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,t,o){var i={scope:e,element:t,show:!1};angular.forEach(["template","placement","keyboard","html","container","animation","duration","dismissable"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content","type"],function(t){o[t]&&o.$observe(t,function(a){e[t]=n.trustAsHtml(a)})}),o.bsAlert&&e.$watch(o.bsAlert,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=a(i);t.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.aside",["mgcrea.ngStrap.modal"]).provider("$aside",function(){var e=this.defaults={animation:"am-fade-and-slide-right",prefixClass:"aside",placement:"right",template:"aside/aside.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$modal",function(t){function n(n){var a={},o=angular.extend({},e,n);return a=t(o)}return n}]}).directive("bsAside",["$window","$sce","$aside",function(e,t,n){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,a,o){var i={scope:e,element:a,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content"],function(n){o[n]&&o.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),o.bsAside&&e.$watch(o.bsAside,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=n(i);a.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.button",[]).provider("$button",function(){var e=this.defaults={activeClass:"active",toggleEvent:"click"};this.$get=function(){return{defaults:e}}}).directive("bsCheckboxGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var n=e[0].querySelectorAll('input[type="checkbox"]');angular.forEach(n,function(e){var n=angular.element(e);n.attr("bs-checkbox",""),n.attr("ng-model",t.ngModel+"."+n.attr("value"))})}}}).directive("bsCheckbox",["$button","$$rAF",function(e,t){var n=e.defaults,a=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,o,i,r){var s=n,l="INPUT"===o[0].nodeName,u=l?o.parent():o,c=angular.isDefined(i.trueValue)?i.trueValue:!0;a.test(i.trueValue)&&(c=e.$eval(i.trueValue));var d=angular.isDefined(i.falseValue)?i.falseValue:!1;a.test(i.falseValue)&&(d=e.$eval(i.falseValue));var f="boolean"!=typeof c||"boolean"!=typeof d;f&&(r.$parsers.push(function(e){return e?c:d}),e.$watch(i.ngModel,function(){r.$render()})),r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){l&&(o[0].checked=e),u.toggleClass(s.activeClass,e)})},o.bind(s.toggleEvent,function(){e.$apply(function(){l||r.$setViewValue(!u.hasClass("active")),f||r.$render()})})}}}]).directive("bsRadioGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var n=e[0].querySelectorAll('input[type="radio"]');angular.forEach(n,function(e){angular.element(e).attr("bs-radio",""),angular.element(e).attr("ng-model",t.ngModel)})}}}).directive("bsRadio",["$button","$$rAF",function(e,t){var n=e.defaults,a=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,o,i,r){var s=n,l="INPUT"===o[0].nodeName,u=l?o.parent():o,c=a.test(i.value)?e.$eval(i.value):i.value;r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){l&&(o[0].checked=e),u.toggleClass(s.activeClass,e)})},o.bind(s.toggleEvent,function(){e.$apply(function(){r.$setViewValue(c),r.$render()})})}}}]),angular.module("mgcrea.ngStrap.datepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$datepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"datepicker",placement:"bottom-left",template:"datepicker/datepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!1,dateType:"date",dateFormat:"shortDate",modelDateFormat:null,dayFormat:"dd",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0,daysOfWeekDisabled:"",iconLeft:"glyphicon glyphicon-chevron-left",iconRight:"glyphicon glyphicon-chevron-right"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip",function(t,n,a,o,i,r,s,l){function u(t,n,a){function o(e){e.selected=r.$isSelected(e.date)}function i(){t[0].focus()}var r=l(t,angular.extend({},e,a)),u=a.scope,f=r.$options,p=r.$scope;f.startView&&(f.startView-=f.minView);var m=s(r);r.$views=m.views;var g=m.viewDate;p.$mode=f.startView,p.$iconLeft=f.iconLeft,p.$iconRight=f.iconRight;var $=r.$views[p.$mode];p.$select=function(e){r.select(e)},p.$selectPane=function(e){r.$selectPane(e)},p.$toggleMode=function(){r.setMode((p.$mode+1)%r.$views.length)},r.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())&&(r.$date=e,$.update.call($,e)),r.$build(!0)},r.updateDisabledDates=function(e){f.disabledDateRanges=e;for(var t=0,n=p.rows.length;n>t;t++)angular.forEach(p.rows[t],r.$setDisabledEl)},r.select=function(e,t){angular.isDate(n.$dateValue)||(n.$dateValue=new Date(e)),!p.$mode||t?(n.$setViewValue(angular.copy(e)),n.$render(),f.autoclose&&!t&&r.hide(!0)):(angular.extend(g,{year:e.getFullYear(),month:e.getMonth(),date:e.getDate()}),r.setMode(p.$mode-1),r.$build())},r.setMode=function(e){p.$mode=e,$=r.$views[p.$mode],r.$build()},r.$build=function(e){e===!0&&$.built||(e!==!1||$.built)&&$.build.call($)},r.$updateSelected=function(){for(var e=0,t=p.rows.length;t>e;e++)angular.forEach(p.rows[e],o)},r.$isSelected=function(e){return $.isSelected(e)},r.$setDisabledEl=function(e){e.disabled=$.isDisabled(e.date)},r.$selectPane=function(e){var t=$.steps,n=new Date(Date.UTC(g.year+(t.year||0)*e,g.month+(t.month||0)*e,g.date+(t.day||0)*e));angular.extend(g,{year:n.getUTCFullYear(),month:n.getUTCMonth(),date:n.getUTCDate()}),r.$build()},r.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),d){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},r.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return p.$mode?p.$apply(function(){r.setMode(p.$mode-1)}):r.hide(!0);$.onKeyDown(e),u.$digest()}};var h=r.init;r.init=function(){return c&&f.useNative?(t.prop("type","date"),void t.css("-webkit-appearance","textfield")):(d&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",i)),void h())};var v=r.destroy;r.destroy=function(){c&&f.useNative&&t.off("click",i),v()};var y=r.show;r.show=function(){y(),setTimeout(function(){r.$element.on(d?"touchstart":"mousedown",r.$onMouseDown),f.keyboard&&t.on("keydown",r.$onKeyDown)})};var w=r.hide;return r.hide=function(e){r.$element.off(d?"touchstart":"mousedown",r.$onMouseDown),f.keyboard&&t.off("keydown",r.$onKeyDown),w(e)},r}var c=(angular.element(t.document.body),/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent)),d="createTouch"in t.document&&c;return e.lang||(e.lang=i.id),u.defaults=e,u}]}).directive("bsDatepicker",["$window","$parse","$q","$locale","dateFilter","$datepicker","$dateParser","$timeout",function(e,t,n,a,o,i,r){var s=(i.defaults,/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent)),l=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};return{restrict:"EAC",require:"ngModel",link:function(e,t,n,a){function u(e){return e&&e.length?e:null}var c={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","modelDateFormat","dayFormat","strictFormat","startWeek","startDate","useNative","lang","startView","minView","iconLeft","iconRight","daysOfWeekDisabled"],function(e){angular.isDefined(n[e])&&(c[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){d&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(datepicker),?")),e===!0?d.show():d.hide())}),s&&c.useNative&&(c.dateFormat="yyyy-MM-dd");var d=i(t,a,c);c=d.$options,angular.forEach(["minDate","maxDate"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){if("today"===t){var n=new Date;d.$options[e]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()+("maxDate"===e?1:0),0,0,0,"minDate"===e?0:-1)}else d.$options[e]=angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):l(t)?+new Date(parseInt(t,10)):angular.isString(t)&&0===t.length?"maxDate"===e?+1/0:-1/0:+new Date(t);!isNaN(d.$options[e])&&d.$build(!1)})}),e.$watch(n.ngModel,function(){d.update(a.$dateValue)},!0),angular.isDefined(n.disabledDates)&&e.$watch(n.disabledDates,function(e,t){e=u(e),t=u(t),e!==t&&d.updateDisabledDates(e)});var f=r({format:c.dateFormat,lang:c.lang,strict:c.strictFormat});a.$parsers.unshift(function(e){if(!e)return void a.$setValidity("date",!0);var t=f.parse(e,a.$dateValue);if(!t||isNaN(t.getTime()))return void a.$setValidity("date",!1);var n=isNaN(d.$options.minDate)||t.getTime()>=d.$options.minDate,i=isNaN(d.$options.maxDate)||t.getTime()<=d.$options.maxDate,r=n&&i;return a.$setValidity("date",r),a.$setValidity("min",n),a.$setValidity("max",i),r&&(a.$dateValue=t),"string"===c.dateType?o(t,c.modelDateFormat||c.dateFormat):"number"===c.dateType?a.$dateValue.getTime():"iso"===c.dateType?a.$dateValue.toISOString():new Date(a.$dateValue)}),a.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===c.dateType?f.parse(e,null,c.modelDateFormat):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":o(a.$dateValue,c.dateFormat))},e.$on("$destroy",function(){d&&d.destroy(),c=null,d=null})}}}]).provider("datepickerViews",function(){function e(e,t){for(var n=[];e.length>0;)n.push(e.splice(0,t));return n}function t(e,t){return(e%t+t)%t}this.defaults={dayFormat:"dd",daySplit:7};this.$get=["$locale","$sce","dateFilter",function(n,a,o){return function(i){var r=i.$scope,s=i.$options,l=n.DATETIME_FORMATS.SHORTDAY,u=l.slice(s.startWeek).concat(l.slice(0,s.startWeek)),c=a.trustAsHtml(''+u.join(' ')+" "),d=i.$date||(s.startDate?new Date(s.startDate):new Date),f={year:d.getFullYear(),month:d.getMonth(),date:d.getDate()},p=(6e4*d.getTimezoneOffset(),[{format:s.dayFormat,split:7,steps:{month:1},update:function(e,t){!this.built||t||e.getFullYear()!==f.year||e.getMonth()!==f.month?(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getDate()!==f.date&&(f.date=i.$date.getDate(),i.$updateSelected())},build:function(){var n=new Date(f.year,f.month,1),a=n.getTimezoneOffset(),l=new Date(+n-864e5*t(n.getDay()-s.startWeek,7)),u=l.getTimezoneOffset();u!==a&&(l=new Date(+l+6e4*(u-a)));for(var d,p=[],m=0;42>m;m++)d=new Date(l.getFullYear(),l.getMonth(),l.getDate()+m),p.push({date:d,label:o(d,this.format),selected:i.$date&&this.isSelected(d),muted:d.getMonth()!==f.month,disabled:this.isDisabled(d)});r.title=o(n,"MMMM yyyy"),r.showLabels=!0,r.labels=c,r.rows=e(p,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()&&e.getDate()===i.$date.getDate()},isDisabled:function(e){var t=e.getTime();if(ts.maxDate)return!0;if(-1!==s.daysOfWeekDisabled.indexOf(e.getDay()))return!0;if(s.disabledDateRanges)for(var n=0;n=s.disabledDateRanges[n].start)return t<=s.disabledDateRanges[n].end?!0:!1;return!1},onKeyDown:function(e){var t,n=i.$date.getTime();37===e.keyCode?t=new Date(n-864e5):38===e.keyCode?t=new Date(n-6048e5):39===e.keyCode?t=new Date(n+864e5):40===e.keyCode&&(t=new Date(n+6048e5)),this.isDisabled(t)||i.select(t,!0)}},{name:"month",format:"MMM",split:4,steps:{year:1},update:function(e){this.built&&e.getFullYear()===f.year?e.getMonth()!==f.month&&(angular.extend(f,{month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected()):(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build())},build:function(){for(var t,n=(new Date(f.year,0,1),[]),a=0;12>a;a++)t=new Date(f.year,a,1),n.push({date:t,label:o(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=o(t,"yyyy"),r.showLabels=!1,r.rows=e(n,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()},isDisabled:function(e){var t=+new Date(e.getFullYear(),e.getMonth()+1,0);return ts.maxDate},onKeyDown:function(e){var t=i.$date.getMonth(),n=new Date(i.$date);37===e.keyCode?n.setMonth(t-1):38===e.keyCode?n.setMonth(t-4):39===e.keyCode?n.setMonth(t+1):40===e.keyCode&&n.setMonth(t+4),this.isDisabled(n)||i.select(n,!0)}},{name:"year",format:"yyyy",split:4,steps:{year:12},update:function(e,t){!this.built||t||parseInt(e.getFullYear()/20,10)!==parseInt(f.year/20,10)?(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getFullYear()!==f.year&&(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected())},build:function(){for(var t,n=f.year-f.year%(3*this.split),a=[],s=0;12>s;s++)t=new Date(n+s,0,1),a.push({date:t,label:o(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=a[0].label+"-"+a[a.length-1].label,r.showLabels=!1,r.rows=e(a,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()},isDisabled:function(e){var t=+new Date(e.getFullYear()+1,0,0);return ts.maxDate},onKeyDown:function(e){var t=i.$date.getFullYear(),n=new Date(i.$date);37===e.keyCode?n.setYear(t-1):38===e.keyCode?n.setYear(t-4):39===e.keyCode?n.setYear(t+1):40===e.keyCode&&n.setYear(t+4),this.isDisabled(n)||i.select(n,!0)}}]);return{views:s.minView?Array.prototype.slice.call(p,s.minView):p,viewDate:f}}}]}),angular.module("mgcrea.ngStrap.dropdown",["mgcrea.ngStrap.tooltip"]).provider("$dropdown",function(){var e=this.defaults={animation:"am-fade",prefixClass:"dropdown",placement:"bottom-left",template:"dropdown/dropdown.tpl.html",trigger:"click",container:!1,keyboard:!0,html:!1,delay:0};this.$get=["$window","$rootScope","$tooltip",function(t,n,a){function o(t,o){function s(e){return e.target!==t[0]?e.target!==t[0]&&l.hide():void 0}{var l={},u=angular.extend({},e,o);l.$scope=u.scope&&u.scope.$new()||n.$new()}l=a(t,u);var c=t.parent();l.$onKeyDown=function(e){if(/(38|40)/.test(e.keyCode)){e.preventDefault(),e.stopPropagation();var t=angular.element(l.$element[0].querySelectorAll("li:not(.divider) a"));if(t.length){var n;angular.forEach(t,function(e,t){r&&r.call(e,":focus")&&(n=t)}),38===e.keyCode&&n>0?n--:40===e.keyCode&&n1){var r=i.search(n[t]);e=e.split(n[t]).join(""),p[n[t]]&&(a[r]=p[n[t]])}return angular.forEach(a,function(e){e&&o.push(e)}),o}function r(e){return e.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function s(e){var t,n=Object.keys(f),a=e;for(t=0;tu?a=setTimeout(l,t-u):(a=null,n||(s=e.apply(i,o)))},u=n&&!a;return a||(a=setTimeout(l,t)),u&&(s=e.apply(i,o)),s}}).constant("throttle",function(e,t,n){var a,o,i,r=null,s=0;n||(n={});var l=function(){s=n.leading===!1?0:new Date,r=null,i=e.apply(a,o)};return function(){var u=new Date;s||n.leading!==!1||(s=u);var c=t-(u-s);return a=this,o=arguments,0>=c?(clearTimeout(r),r=null,s=u,i=e.apply(a,o)):r||n.trailing===!1||(r=setTimeout(l,c)),i}}),angular.module("mgcrea.ngStrap.helpers.dimensions",[]).factory("dimensions",["$document","$window",function(){var t=(angular.element,{}),n=t.nodeName=function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()};t.css=function(t,n,a){var o;return o=t.currentStyle?t.currentStyle[n]:e.getComputedStyle?e.getComputedStyle(t)[n]:t.style[n],a===!0?parseFloat(o)||0:o},t.offset=function(t){var n=t.getBoundingClientRect(),a=t.ownerDocument;return{width:n.width||t.offsetWidth,height:n.height||t.offsetHeight,top:n.top+(e.pageYOffset||a.documentElement.scrollTop)-(a.documentElement.clientTop||0),left:n.left+(e.pageXOffset||a.documentElement.scrollLeft)-(a.documentElement.clientLeft||0)}},t.position=function(e){var o,i,r={top:0,left:0};return"fixed"===t.css(e,"position")?i=e.getBoundingClientRect():(o=a(e),i=t.offset(e),i=t.offset(e),n(o,"html")||(r=t.offset(o)),r.top+=t.css(o,"borderTopWidth",!0),r.left+=t.css(o,"borderLeftWidth",!0)),{width:e.offsetWidth,height:e.offsetHeight,top:i.top-r.top-t.css(e,"marginTop",!0),left:i.left-r.left-t.css(e,"marginLeft",!0)}};var a=function(e){var a=e.ownerDocument,o=e.offsetParent||a;if(n(o,"#document"))return a.documentElement;for(;o&&!n(o,"html")&&"static"===t.css(o,"position");)o=o.offsetParent;return o||a.documentElement};return t.height=function(e,n){var a=e.offsetHeight;return n?a+=t.css(e,"marginTop",!0)+t.css(e,"marginBottom",!0):a-=t.css(e,"paddingTop",!0)+t.css(e,"paddingBottom",!0)+t.css(e,"borderTopWidth",!0)+t.css(e,"borderBottomWidth",!0),a},t.width=function(e,n){var a=e.offsetWidth;return n?a+=t.css(e,"marginLeft",!0)+t.css(e,"marginRight",!0):a-=t.css(e,"paddingLeft",!0)+t.css(e,"paddingRight",!0)+t.css(e,"borderLeftWidth",!0)+t.css(e,"borderRightWidth",!0),a},t}]),angular.module("mgcrea.ngStrap.helpers.parseOptions",[]).provider("$parseOptions",function(){var e=this.defaults={regexp:/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/};this.$get=["$parse","$q",function(t,n){function a(a,o){function i(e,t){return e.map(function(e,n){var a,o,i={};return i[c]=e,a=u(t,i),o=p(t,i)||n,{label:a,value:o}})}var r={},s=angular.extend({},e,o);r.$values=[];var l,u,c,d,f,p,m;return r.init=function(){r.$match=l=a.match(s.regexp),u=t(l[2]||l[1]),c=l[4]||l[6],d=l[5],f=t(l[3]||""),p=t(l[2]?l[1]:c),m=t(l[7])},r.valuesFn=function(e,t){return n.when(m(e,t)).then(function(t){return r.$values=t?i(t,e):{},r.$values})},r.init(),r}return a}]}),angular.version.minor<3&&angular.version.dot<14&&angular.module("ng").factory("$$rAF",["$window","$timeout",function(e,t){var n=e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame,a=e.cancelAnimationFrame||e.webkitCancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelRequestAnimationFrame,o=!!n,i=o?function(e){var t=n(e);return function(){a(t)}}:function(e){var n=t(e,16.66,!1);return function(){t.cancel(n)}};return i.supported=o,i}]),angular.module("mgcrea.ngStrap.modal",["mgcrea.ngStrap.helpers.dimensions"]).provider("$modal",function(){var e=this.defaults={animation:"am-fade",backdropAnimation:"am-fade",prefixClass:"modal",prefixEvent:"modal",placement:"top",template:"modal/modal.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","$timeout","$sce","dimensions",function(n,a,o,i,r,s,l,u,c){function d(t){function n(e){e.target===e.currentTarget&&("static"===r.backdrop?i.focus():i.hide())}var i={},r=i.$options=angular.extend({},e,t);i.$promise=p(r.template);var s=i.$scope=r.scope&&r.scope.$new()||a.$new();r.element||r.container||(r.container="body"),m(["title","content"],function(e){r[e]&&(s[e]=c.trustAsHtml(r[e]))}),s.$hide=function(){s.$$postDigest(function(){i.hide()})},s.$show=function(){s.$$postDigest(function(){i.show()})},s.$toggle=function(){s.$$postDigest(function(){i.toggle()})},r.contentTemplate&&(i.$promise=i.$promise.then(function(e){var n=angular.element(e);return p(r.contentTemplate).then(function(e){var a=f('[ng-bind="content"]',n[0]).removeAttr("ng-bind").html(e);return t.template||a.next().remove(),n[0].outerHTML})}));var u,d,y=angular.element('
');return i.$promise.then(function(e){angular.isObject(e)&&(e=e.data),r.html&&(e=e.replace(v,'ng-bind-html="')),e=g.apply(e),u=o(e),i.init()}),i.init=function(){r.show&&s.$$postDigest(function(){i.show()})},i.destroy=function(){d&&(d.remove(),d=null),y&&(y.remove(),y=null),s.$destroy()},i.show=function(){s.$emit(r.prefixEvent+".show.before",i);var e;e=angular.isElement(r.container)?r.container:r.container?f(r.container):null;var t=r.container?null:r.element;d=i.$element=u(s,function(){}),d.css({display:"block"}).addClass(r.placement),r.animation&&(r.backdrop&&y.addClass(r.backdropAnimation),d.addClass(r.animation)),r.backdrop&&l.enter(y,h,null,function(){}),l.enter(d,e,t,function(){s.$emit(r.prefixEvent+".show",i)}),s.$isShown=!0,s.$$phase||s.$root&&s.$root.$$phase||s.$digest();var a=d[0];$(function(){a.focus()}),h.addClass(r.prefixClass+"-open"),r.animation&&h.addClass(r.prefixClass+"-with-"+r.animation),r.backdrop&&(d.on("click",n),y.on("click",n)),r.keyboard&&d.on("keyup",i.$onKeyUp)},i.hide=function(){s.$emit(r.prefixEvent+".hide.before",i),l.leave(d,function(){s.$emit(r.prefixEvent+".hide",i),h.removeClass(r.prefixClass+"-open"),r.animation&&h.removeClass(r.prefixClass+"-with-"+r.animation)}),r.backdrop&&l.leave(y,function(){}),s.$isShown=!1,s.$$phase||s.$root&&s.$root.$$phase||s.$digest(),r.backdrop&&(d.off("click",n),y.off("click",n)),r.keyboard&&d.off("keyup",i.$onKeyUp)},i.toggle=function(){s.$isShown?i.hide():i.show()},i.focus=function(){d[0].focus()},i.$onKeyUp=function(e){27===e.which&&i.hide()},i}function f(e,n){return angular.element((n||t).querySelectorAll(e))}function p(e){return i.when(r.get(e)||s.get(e)).then(function(t){return angular.isObject(t)?(r.put(e,t.data),t.data):t})}var m=angular.forEach,g=String.prototype.trim,$=n.requestAnimationFrame||n.setTimeout,h=angular.element(n.document.body),v=/ng-bind="/gi;return d}]}).directive("bsModal",["$window","$location","$sce","$modal",function(e,t,n,a){return{restrict:"EAC",scope:!0,link:function(e,t,o){var i={scope:e,element:t,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content"],function(t){o[t]&&o.$observe(t,function(a){e[t]=n.trustAsHtml(a)})}),o.bsModal&&e.$watch(o.bsModal,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=a(i);t.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.navbar",[]).provider("$navbar",function(){var e=this.defaults={activeClass:"active",routeAttr:"data-match-route",strict:!1};this.$get=function(){return{defaults:e}}}).directive("bsNavbar",["$window","$location","$navbar",function(e,t,n){var a=n.defaults;return{restrict:"A",link:function(e,n,o){var i=angular.copy(a);angular.forEach(Object.keys(a),function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),e.$watch(function(){return t.path()},function(e){var t=n[0].querySelectorAll("li["+i.routeAttr+"]");angular.forEach(t,function(t){var n=angular.element(t),a=n.attr(i.routeAttr).replace("/","\\/");i.strict&&(a="^"+a+"$");var o=new RegExp(a,["i"]);o.test(e)?n.addClass(i.activeClass):n.removeClass(i.activeClass)})})}}}]),angular.module("mgcrea.ngStrap.popover",["mgcrea.ngStrap.tooltip"]).provider("$popover",function(){var e=this.defaults={animation:"am-fade",customClass:"",container:!1,target:!1,placement:"right",template:"popover/popover.tpl.html",contentTemplate:!1,trigger:"click",keyboard:!0,html:!1,title:"",content:"",delay:0};this.$get=["$tooltip",function(t){function n(n,a){var o=angular.extend({},e,a),i=t(n,o);return o.content&&(i.$scope.content=o.content),i}return n}]}).directive("bsPopover",["$window","$location","$sce","$popover",function(e,t,n,a){var o=e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,t,i){var r={scope:e};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","customClass"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title","content"],function(t){i[t]&&i.$observe(t,function(a,i){e[t]=n.trustAsHtml(a),angular.isDefined(i)&&o(function(){s&&s.$applyPlacement()})})}),i.bsPopover&&e.$watch(i.bsPopover,function(t,n){angular.isObject(t)?angular.extend(e,t):e.content=t,angular.isDefined(n)&&o(function(){s&&s.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e){s&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(popover),?")),e===!0?s.show():s.hide())
+});var s=a(t,r);e.$on("$destroy",function(){s.destroy(),r=null,s=null})}}}]),angular.module("mgcrea.ngStrap.scrollspy",["mgcrea.ngStrap.helpers.debounce","mgcrea.ngStrap.helpers.dimensions"]).provider("$scrollspy",function(){var e=this.$$spies={},n=this.defaults={debounce:150,throttle:100,offset:100};this.$get=["$window","$document","$rootScope","dimensions","debounce","throttle",function(a,o,i,r,s,l){function u(e,t){return e[0].nodeName&&e[0].nodeName.toLowerCase()===t.toLowerCase()}function c(o){var c=angular.extend({},n,o);c.element||(c.element=p);var m=u(c.element,"body"),g=m?d:c.element,$=m?"window":c.id;if(e[$])return e[$].$$count++,e[$];var h,v,y,w,b,D,k,T,S={},x=S.$trackedElements=[],M=[];return S.init=function(){this.$$count=1,w=s(this.checkPosition,c.debounce),b=l(this.checkPosition,c.throttle),g.on("click",this.checkPositionWithEventLoop),d.on("resize",w),g.on("scroll",b),D=s(this.checkOffsets,c.debounce),h=i.$on("$viewContentLoaded",D),v=i.$on("$includeContentLoaded",D),D(),$&&(e[$]=S)},S.destroy=function(){this.$$count--,this.$$count>0||(g.off("click",this.checkPositionWithEventLoop),d.off("resize",w),g.off("scroll",w),h(),v(),$&&delete e[$])},S.checkPosition=function(){if(M.length){if(T=(m?a.pageYOffset:g.prop("scrollTop"))||0,k=Math.max(a.innerHeight,f.prop("clientHeight")),TM[e+1].offsetTop))return S.$activateElement(M[e])}},S.checkPositionWithEventLoop=function(){setTimeout(this.checkPosition,1)},S.$activateElement=function(e){if(y){var t=S.$getTrackedElement(y);t&&(t.source.removeClass("active"),u(t.source,"li")&&u(t.source.parent().parent(),"li")&&t.source.parent().parent().removeClass("active"))}y=e.target,e.source.addClass("active"),u(e.source,"li")&&u(e.source.parent().parent(),"li")&&e.source.parent().parent().addClass("active")},S.$getTrackedElement=function(e){return x.filter(function(t){return t.target===e})[0]},S.checkOffsets=function(){angular.forEach(x,function(e){var n=t.querySelector(e.target);e.offsetTop=n?r.offset(n).top:null,c.offset&&null!==e.offsetTop&&(e.offsetTop-=1*c.offset)}),M=x.filter(function(e){return null!==e.offsetTop}).sort(function(e,t){return e.offsetTop-t.offsetTop}),w()},S.trackElement=function(e,t){x.push({target:e,source:t})},S.untrackElement=function(e,t){for(var n,a=x.length;a--;)if(x[a].target===e&&x[a].source===t){n=a;break}x=x.splice(n,1)},S.activate=function(e){x[e].addClass("active")},S.init(),S}var d=angular.element(a),f=angular.element(o.prop("documentElement")),p=angular.element(a.document.body);return c}]}).directive("bsScrollspy",["$rootScope","debounce","dimensions","$scrollspy",function(e,t,n,a){return{restrict:"EAC",link:function(e,t,n){var o={scope:e};angular.forEach(["offset","target"],function(e){angular.isDefined(n[e])&&(o[e]=n[e])});var i=a(o);i.trackElement(o.target,t),e.$on("$destroy",function(){i.untrackElement(o.target,t),i.destroy(),o=null,i=null})}}}]).directive("bsScrollspyList",["$rootScope","debounce","dimensions","$scrollspy",function(){return{restrict:"A",compile:function(e){var t=e[0].querySelectorAll("li > a[href]");angular.forEach(t,function(e){var t=angular.element(e);t.parent().attr("bs-scrollspy","").attr("data-target",t.attr("href"))})}}}]),angular.module("mgcrea.ngStrap.select",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$select",function(){var e=this.defaults={animation:"am-fade",prefixClass:"select",prefixEvent:"$select",placement:"bottom-left",template:"select/select.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,allNoneButtons:!1,sort:!0,caretHtml:' ',placeholder:"Choose among the following...",maxLength:3,maxLengthHtml:"selected",iconCheckmark:"glyphicon glyphicon-ok"};this.$get=["$window","$document","$rootScope","$tooltip",function(t,n,a,o){function i(t,n,a){var i={},r=angular.extend({},e,a);i=o(t,r);var l=i.$scope;l.$matches=[],l.$activeIndex=0,l.$isMultiple=r.multiple,l.$showAllNoneButtons=r.allNoneButtons&&r.multiple,l.$iconCheckmark=r.iconCheckmark,l.$activate=function(e){l.$$postDigest(function(){i.activate(e)})},l.$select=function(e){l.$$postDigest(function(){i.select(e)})},l.$isVisible=function(){return i.$isVisible()},l.$isActive=function(e){return i.$isActive(e)},l.$selectAll=function(){for(var e=0;e=l.$matches.length&&(l.$activeIndex=r.multiple?[]:0)},i.$isVisible=function(){return r.minLength&&n?l.$matches.length&&n.$viewValue.length>=r.minLength:l.$matches.length},i.$isActive=function(e){return r.multiple?-1!==l.$activeIndex.indexOf(e):l.$activeIndex===e},i.$getIndex=function(e){var t=l.$matches.length,n=t;if(t){for(n=t;n--&&l.$matches[n].value!==e;);if(!(0>n))return n}},i.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),s){var t=angular.element(e.target);t.triggerHandler("click")}},i.$onKeyDown=function(e){if(/(9|13|38|40)/.test(e.keyCode)){if(e.preventDefault(),e.stopPropagation(),!r.multiple&&(13===e.keyCode||9===e.keyCode))return i.select(l.$activeIndex);38===e.keyCode&&l.$activeIndex>0?l.$activeIndex--:40===e.keyCode&&l.$activeIndex'),l.after(t)}var u=o(n.ngOptions),c=a(t,r,s),d=u.$match[7].replace(/\|.+/,"").trim();e.$watch(d,function(){u.valuesFn(e,r).then(function(e){c.update(e),r.$render()})},!0),e.$watch(n.ngModel,function(){c.$updateActiveIndex(),r.$render()},!0),r.$render=function(){var e,a;s.multiple&&angular.isArray(r.$modelValue)?(e=r.$modelValue.map(function(e){return a=c.$getIndex(e),angular.isDefined(a)?c.$scope.$matches[a].label:!1}).filter(angular.isDefined),e=e.length>(s.maxLength||i.maxLength)?e.length+" "+(s.maxLengthHtml||i.maxLengthHtml):e.join(", ")):(a=c.$getIndex(r.$modelValue),e=angular.isDefined(a)?c.$scope.$matches[a].label:!1),t.html((e?e:n.placeholder||i.placeholder)+i.caretHtml)},e.$on("$destroy",function(){c.destroy(),s=null,c=null})}}}]),angular.module("mgcrea.ngStrap.tab",[]).run(["$templateCache",function(e){e.put("$pane","{{pane.content}}")}]).provider("$tab",function(){var e=this.defaults={animation:"am-fade",template:"tab/tab.tpl.html"};this.$get=function(){return{defaults:e}}}).directive("bsTabs",["$window","$animate","$tab",function(e,t,n){var a=n.defaults;return{restrict:"EAC",scope:!0,require:"?ngModel",templateUrl:function(e,t){return t.template||a.template},link:function(e,t,n,o){var i=a;angular.forEach(["animation"],function(e){angular.isDefined(n[e])&&(i[e]=n[e])}),n.bsTabs&&e.$watch(n.bsTabs,function(t){e.panes=t},!0),t.addClass("tabs"),i.animation&&t.addClass(i.animation),e.active=e.activePane=0,e.setActive=function(t){e.active=t,o&&o.$setViewValue(t)},o&&(o.$render=function(){e.active=1*o.$modelValue})}}}]),angular.module("mgcrea.ngStrap.timepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$timepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"timepicker",placement:"bottom-left",template:"timepicker/timepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!0,timeType:"date",timeFormat:"shortTime",modelTimeFormat:null,autoclose:!1,minTime:-1/0,maxTime:+1/0,length:5,hourStep:1,minuteStep:5,iconUp:"glyphicon glyphicon-chevron-up",iconDown:"glyphicon glyphicon-chevron-down",arrowBehavior:"pager"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","$tooltip",function(t,n,a,o,i,r,s){function l(t,n,a){function o(e,n){if(t[0].createTextRange){var a=t[0].createTextRange();a.collapse(!0),a.moveStart("character",e),a.moveEnd("character",n),a.select()}else t[0].setSelectionRange?t[0].setSelectionRange(e,n):angular.isUndefined(t[0].selectionStart)&&(t[0].selectionStart=e,t[0].selectionEnd=n)}function l(){t[0].focus()}var d=s(t,angular.extend({},e,a)),f=a.scope,p=d.$options,m=d.$scope,g=0,$=n.$dateValue||new Date,h={hour:$.getHours(),meridian:$.getHours()<12,minute:$.getMinutes(),second:$.getSeconds(),millisecond:$.getMilliseconds()},v=i.DATETIME_FORMATS[p.timeFormat]||p.timeFormat,y=/(h+)([:\.])?(m+)[ ]?(a?)/i.exec(v).slice(1);m.$iconUp=p.iconUp,m.$iconDown=p.iconDown,m.$select=function(e,t){d.select(e,t)},m.$moveIndex=function(e,t){d.$moveIndex(e,t)},m.$switchMeridian=function(e){d.switchMeridian(e)},d.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())?(d.$date=e,angular.extend(h,{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}),d.$build()):d.$isBuilt||d.$build()},d.select=function(e,t,a){(!n.$dateValue||isNaN(n.$dateValue.getTime()))&&(n.$dateValue=new Date(1970,0,1)),angular.isDate(e)||(e=new Date(e)),0===t?n.$dateValue.setHours(e.getHours()):1===t&&n.$dateValue.setMinutes(e.getMinutes()),n.$setViewValue(n.$dateValue),n.$render(),p.autoclose&&!a&&d.hide(!0)},d.switchMeridian=function(e){var t=(e||n.$dateValue).getHours();n.$dateValue.setHours(12>t?t+12:t-12),n.$setViewValue(n.$dateValue),n.$render()},d.$build=function(){var e,t,n=m.midIndex=parseInt(p.length/2,10),a=[];for(e=0;e1*p.maxTime},m.$arrowAction=function(e,t){"picker"===p.arrowBehavior?d.$setTimeByStep(e,t):d.$moveIndex(e,t)},d.$setTimeByStep=function(e,t){{var n=new Date(d.$date),a=n.getHours(),o=(r(n,"h").length,n.getMinutes());r(n,"mm").length}0===t?n.setHours(a-parseInt(p.hourStep,10)*e):n.setMinutes(o-parseInt(p.minuteStep,10)*e),d.select(n,t,!0),f.$digest()},d.$moveIndex=function(e,t){var n;0===t?(n=new Date(1970,0,1,h.hour+e*p.length,h.minute),angular.extend(h,{hour:n.getHours()})):1===t&&(n=new Date(1970,0,1,h.hour,h.minute+e*p.length*p.minuteStep),angular.extend(h,{minute:n.getMinutes()})),d.$build()},d.$onMouseDown=function(e){if("input"!==e.target.nodeName.toLowerCase()&&e.preventDefault(),e.stopPropagation(),c){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},d.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return d.hide(!0);var t=new Date(d.$date),n=t.getHours(),a=r(t,"h").length,i=t.getMinutes(),s=r(t,"mm").length,l=/(37|39)/.test(e.keyCode),u=2+1*!!y[3];l&&(37===e.keyCode?g=1>g?u-1:g-1:39===e.keyCode&&(g=u-1>g?g+1:0));var c=[0,a];0===g?(38===e.keyCode?t.setHours(n-parseInt(p.hourStep,10)):40===e.keyCode&&t.setHours(n+parseInt(p.hourStep,10)),c=[0,a]):1===g?(38===e.keyCode?t.setMinutes(i-parseInt(p.minuteStep,10)):40===e.keyCode&&t.setMinutes(i+parseInt(p.minuteStep,10)),c=[a+1,a+1+s]):2===g&&(l||d.switchMeridian(),c=[a+1+s+1,a+1+s+3]),d.select(t,g,!0),o(c[0],c[1]),f.$digest()}};var w=d.init;d.init=function(){return u&&p.useNative?(t.prop("type","time"),void t.css("-webkit-appearance","textfield")):(c&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",l)),void w())};var b=d.destroy;d.destroy=function(){u&&p.useNative&&t.off("click",l),b()};var D=d.show;d.show=function(){D(),setTimeout(function(){d.$element.on(c?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.on("keydown",d.$onKeyDown)})};var k=d.hide;return d.hide=function(e){d.$element.off(c?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.off("keydown",d.$onKeyDown),k(e)},d}var u=(angular.element(t.document.body),/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent)),c="createTouch"in t.document&&u;return e.lang||(e.lang=i.id),l.defaults=e,l}]}).directive("bsTimepicker",["$window","$parse","$q","$locale","dateFilter","$timepicker","$dateParser","$timeout",function(e,t,n,a,o,i,r){{var s=i.defaults,l=/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent);e.requestAnimationFrame||e.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(e,t,n,a){var u={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","timeType","timeFormat","modelTimeFormat","useNative","hourStep","minuteStep","length","arrowBehavior"],function(e){angular.isDefined(n[e])&&(u[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){c&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(timepicker),?")),e===!0?c.show():c.hide())}),l&&(u.useNative||s.useNative)&&(u.timeFormat="HH:mm");var c=i(t,a,u);u=c.$options;var d=r({format:u.timeFormat,lang:u.lang});angular.forEach(["minTime","maxTime"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){c.$options[e]="now"===t?(new Date).setFullYear(1970,0,1):angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):d.parse(t,new Date(1970,0,1,0)),!isNaN(c.$options[e])&&c.$build()})}),e.$watch(n.ngModel,function(){c.update(a.$dateValue)},!0),a.$parsers.unshift(function(e){if(!e)return void a.$setValidity("date",!0);var t=d.parse(e,a.$dateValue);if(!t||isNaN(t.getTime()))a.$setValidity("date",!1);else{var n=t.getTime()>=u.minTime&&t.getTime()<=u.maxTime;a.$setValidity("date",n),n&&(a.$dateValue=t)}return"string"===u.timeType?o(t,u.modelTimeFormat||u.timeFormat):"number"===u.timeType?a.$dateValue.getTime():"iso"===u.timeType?a.$dateValue.toISOString():new Date(a.$dateValue)}),a.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===u.timeType?d.parse(e,null,u.modelTimeFormat):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":o(a.$dateValue,u.timeFormat))},e.$on("$destroy",function(){c.destroy(),u=null,c=null})}}}]),angular.module("mgcrea.ngStrap.tooltip",["mgcrea.ngStrap.helpers.dimensions"]).provider("$tooltip",function(){var e=this.defaults={animation:"am-fade",customClass:"",prefixClass:"tooltip",prefixEvent:"tooltip",container:!1,target:!1,placement:"top",template:"tooltip/tooltip.tpl.html",contentTemplate:!1,trigger:"hover focus",keyboard:!1,html:!1,show:!1,title:"",type:"",delay:0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","dimensions","$$rAF",function(n,a,o,i,r,s,l,u,c){function d(t,n){function i(){return"body"===h.container?u.offset(h.target[0]||t[0]):u.position(h.target[0]||t[0])}function r(e,t,n,a){var o,i=e.split("-");switch(i[0]){case"right":o={top:t.top+t.height/2-a/2,left:t.left+t.width};break;case"bottom":o={top:t.top+t.height,left:t.left+t.width/2-n/2};break;case"left":o={top:t.top+t.height/2-a/2,left:t.left-n};break;default:o={top:t.top-a,left:t.left+t.width/2-n/2}}if(!i[1])return o;if("top"===i[0]||"bottom"===i[0])switch(i[1]){case"left":o.left=t.left;break;case"right":o.left=t.left+t.width-n}else if("left"===i[0]||"right"===i[0])switch(i[1]){case"top":o.top=t.top-a;break;case"bottom":o.top=t.top+t.height}return o}var s={},d=t[0].nodeName.toLowerCase(),h=s.$options=angular.extend({},e,n);s.$promise=p(h.template);var v=s.$scope=h.scope&&h.scope.$new()||a.$new();h.delay&&angular.isString(h.delay)&&(h.delay=parseFloat(h.delay)),h.title&&(s.$scope.title=h.title),v.$hide=function(){v.$$postDigest(function(){s.hide()})},v.$show=function(){v.$$postDigest(function(){s.show()})},v.$toggle=function(){v.$$postDigest(function(){s.toggle()})},s.$isShown=v.$isShown=!1;var y,w;h.contentTemplate&&(s.$promise=s.$promise.then(function(e){var t=angular.element(e);return p(h.contentTemplate).then(function(e){var n=f('[ng-bind="content"]',t[0]);return n.length||(n=f('[ng-bind="title"]',t[0])),n.removeAttr("ng-bind").html(e),t[0].outerHTML})}));var b,D,k,T;return s.$promise.then(function(e){angular.isObject(e)&&(e=e.data),h.html&&(e=e.replace($,'ng-bind-html="')),e=m.apply(e),k=e,b=o(e),s.init()}),s.init=function(){h.delay&&angular.isNumber(h.delay)&&(h.delay={show:h.delay,hide:h.delay}),"self"===h.container?T=t:angular.isElement(h.container)?T=h.container:h.container&&(T=f(h.container));var e=h.trigger.split(" ");angular.forEach(e,function(e){"click"===e?t.on("click",s.toggle):"manual"!==e&&(t.on("hover"===e?"mouseenter":"focus",s.enter),t.on("hover"===e?"mouseleave":"blur",s.leave),"button"===d&&"hover"!==e&&t.on(g?"touchstart":"mousedown",s.$onFocusElementMouseDown))}),h.target&&(h.target=angular.isElement(h.target)?h.target:f(h.target)[0]),h.show&&v.$$postDigest(function(){"focus"===h.trigger?t[0].focus():s.show()})},s.destroy=function(){for(var e=h.trigger.split(" "),n=e.length;n--;){var a=e[n];"click"===a?t.off("click",s.toggle):"manual"!==a&&(t.off("hover"===a?"mouseenter":"focus",s.enter),t.off("hover"===a?"mouseleave":"blur",s.leave),"button"===d&&"hover"!==a&&t.off(g?"touchstart":"mousedown",s.$onFocusElementMouseDown))}D&&(D.remove(),D=null),clearTimeout(y),v.$destroy()},s.enter=function(){return clearTimeout(y),w="in",h.delay&&h.delay.show?void(y=setTimeout(function(){"in"===w&&s.show()},h.delay.show)):s.show()},s.show=function(){v.$emit(h.prefixEvent+".show.before",s);var e=h.container?T:null,n=h.container?null:t;D&&D.remove(),D=s.$element=b(v,function(){}),D.css({top:"-9999px",left:"-9999px",display:"block",visibility:"hidden"}).addClass(h.placement),h.animation&&D.addClass(h.animation),h.type&&D.addClass(h.prefixClass+"-"+h.type),h.customClass&&D.addClass(h.customClass),l.enter(D,e,n,function(){v.$emit(h.prefixEvent+".show",s)}),s.$isShown=v.$isShown=!0,v.$$phase||v.$root&&v.$root.$$phase||v.$digest(),c(function(){s.$applyPlacement(),D.css({visibility:"visible"})}),h.keyboard&&("focus"!==h.trigger?(s.focus(),D.on("keyup",s.$onKeyUp)):t.on("keyup",s.$onFocusKeyUp))},s.leave=function(){return clearTimeout(y),w="out",h.delay&&h.delay.hide?void(y=setTimeout(function(){"out"===w&&s.hide()},h.delay.hide)):s.hide()},s.hide=function(e){s.$isShown&&(v.$emit(h.prefixEvent+".hide.before",s),l.leave(D,function(){return v.$emit(h.prefixEvent+".hide",s),e&&"focus"===h.trigger?t[0].blur():void 0}),s.$isShown=v.$isShown=!1,v.$$phase||v.$root&&v.$root.$$phase||v.$digest(),h.keyboard&&null!==D&&D.off("keyup",s.$onKeyUp))},s.toggle=function(){s.$isShown?s.leave():s.enter()},s.focus=function(){D[0].focus()},s.$applyPlacement=function(){if(D){var e=i(),t=D.prop("offsetWidth"),n=D.prop("offsetHeight"),a=r(h.placement,e,t,n);a.top+="px",a.left+="px",D.css(a)}},s.$onKeyUp=function(e){27===e.which&&s.hide()},s.$onFocusKeyUp=function(e){27===e.which&&t[0].blur()},s.$onFocusElementMouseDown=function(e){e.preventDefault(),e.stopPropagation(),s.$isShown?t[0].blur():t[0].focus()},s}function f(e,n){return angular.element((n||t).querySelectorAll(e))}function p(e){return i.when(r.get(e)||s.get(e)).then(function(t){return angular.isObject(t)?(r.put(e,t.data),t.data):t})}var m=String.prototype.trim,g="createTouch"in n.document,$=/ng-bind="/gi;return d}]}).directive("bsTooltip",["$window","$location","$sce","$tooltip","$$rAF",function(e,t,n,a,o){return{restrict:"EAC",scope:!0,link:function(e,t,i){var r={scope:e};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","type","customClass"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title"],function(t){i.$observe(t,function(a,i){e[t]=n.trustAsHtml(a),angular.isDefined(i)&&o(function(){s&&s.$applyPlacement()})})}),i.bsTooltip&&e.$watch(i.bsTooltip,function(t,n){angular.isObject(t)?angular.extend(e,t):e.title=t,angular.isDefined(n)&&o(function(){s&&s.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e){s&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(tooltip),?")),e===!0?s.show():s.hide())});var s=a(t,r);e.$on("$destroy",function(){s&&s.destroy(),r=null,s=null})}}}]),angular.module("mgcrea.ngStrap.typeahead",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$typeahead",function(){var e=this.defaults={animation:"am-fade",prefixClass:"typeahead",prefixEvent:"$typeahead",placement:"bottom-left",template:"typeahead/typeahead.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,minLength:1,filter:"filter",limit:6};this.$get=["$window","$rootScope","$tooltip",function(t,n,a){function o(t,n,o){var i={},r=angular.extend({},e,o);i=a(t,r);var s=o.scope,l=i.$scope;l.$resetMatches=function(){l.$matches=[],l.$activeIndex=0},l.$resetMatches(),l.$activate=function(e){l.$$postDigest(function(){i.activate(e)})},l.$select=function(e){l.$$postDigest(function(){i.select(e)})},l.$isVisible=function(){return i.$isVisible()},i.update=function(e){l.$matches=e,l.$activeIndex>=e.length&&(l.$activeIndex=0)},i.activate=function(e){l.$activeIndex=e},i.select=function(e){var t=l.$matches[e].value;n.$setViewValue(t),n.$render(),l.$resetMatches(),s&&s.$digest(),l.$emit(r.prefixEvent+".select",t,e)},i.$isVisible=function(){return r.minLength&&n?l.$matches.length&&angular.isString(n.$viewValue)&&n.$viewValue.length>=r.minLength:!!l.$matches.length},i.$getIndex=function(e){var t=l.$matches.length,n=t;if(t){for(n=t;n--&&l.$matches[n].value!==e;);if(!(0>n))return n}},i.$onMouseDown=function(e){e.preventDefault(),e.stopPropagation()},i.$onKeyDown=function(e){/(38|40|13)/.test(e.keyCode)&&(i.$isVisible()&&(e.preventDefault(),e.stopPropagation()),13===e.keyCode&&l.$matches.length?i.select(l.$activeIndex):38===e.keyCode&&l.$activeIndex>0?l.$activeIndex--:40===e.keyCode&&l.$activeIndex0)return void r.$setViewValue(r.$viewValue.substring(0,r.$viewValue.length-1));e.length>u&&(e=e.slice(0,u));var n=f.$isVisible();n&&f.update(e),(1!==e.length||e[0].value!==t)&&(!n&&f.update(e),r.$render())})}),r.$render=function(){if(r.$isEmpty(r.$viewValue))return t.val("");var e=f.$getIndex(r.$modelValue),n=angular.isDefined(e)?f.$scope.$matches[e].label:r.$viewValue;n=angular.isObject(n)?n.label:n,t.val(n.replace(/<(?:.|\n)*?>/gm,"").trim())},e.$on("$destroy",function(){f.destroy(),s=null,f=null})}}}])}(window,document);
\ No newline at end of file
diff --git a/dist/angular-strap.tpl.js b/dist/angular-strap.tpl.js
index da8c6faad..65b131042 100755
--- a/dist/angular-strap.tpl.js
+++ b/dist/angular-strap.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -76,23 +76,23 @@ angular.module('mgcrea.ngStrap.tab').run([
angular.module('mgcrea.ngStrap.timepicker').run([
'$templateCache',
function ($templateCache) {
- $templateCache.put('timepicker/timepicker.tpl.html', '');
+ $templateCache.put('timepicker/timepicker.tpl.html', '');
}
]);
-// Source: tooltip.tpl.js
-angular.module('mgcrea.ngStrap.tooltip').run([
+// Source: typeahead.tpl.js
+angular.module('mgcrea.ngStrap.typeahead').run([
'$templateCache',
function ($templateCache) {
- $templateCache.put('tooltip/tooltip.tpl.html', '');
+ $templateCache.put('typeahead/typeahead.tpl.html', '');
}
]);
-// Source: typeahead.tpl.js
-angular.module('mgcrea.ngStrap.typeahead').run([
+// Source: tooltip.tpl.js
+angular.module('mgcrea.ngStrap.tooltip').run([
'$templateCache',
function ($templateCache) {
- $templateCache.put('typeahead/typeahead.tpl.html', '');
+ $templateCache.put('tooltip/tooltip.tpl.html', '');
}
]);
diff --git a/dist/angular-strap.tpl.min.js b/dist/angular-strap.tpl.min.js
index f8076f27b..867233adb 100755
--- a/dist/angular-strap.tpl.min.js
+++ b/dist/angular-strap.tpl.min.js
@@ -1,8 +1,8 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-!function(){"use strict";angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(t){t.put("alert/alert.tpl.html",'×
')}]),angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(t){t.put("aside/aside.tpl.html",'')}]),angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(t){t.put("datepicker/datepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.dropdown").run(["$templateCache",function(t){t.put("dropdown/dropdown.tpl.html",'')}]),angular.module("mgcrea.ngStrap.modal").run(["$templateCache",function(t){t.put("modal/modal.tpl.html",'')}]),angular.module("mgcrea.ngStrap.popover").run(["$templateCache",function(t){t.put("popover/popover.tpl.html",'')}]),angular.module("mgcrea.ngStrap.select").run(["$templateCache",function(t){t.put("select/select.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tab").run(["$templateCache",function(t){t.put("tab/tab.tpl.html",'')}]),angular.module("mgcrea.ngStrap.timepicker").run(["$templateCache",function(t){t.put("timepicker/timepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tooltip").run(["$templateCache",function(t){t.put("tooltip/tooltip.tpl.html",'')}]),angular.module("mgcrea.ngStrap.typeahead").run(["$templateCache",function(t){t.put("typeahead/typeahead.tpl.html",'')}])}(window,document);
\ No newline at end of file
+!function(){"use strict";angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(t){t.put("alert/alert.tpl.html",'×
')}]),angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(t){t.put("aside/aside.tpl.html",'')}]),angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(t){t.put("datepicker/datepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.dropdown").run(["$templateCache",function(t){t.put("dropdown/dropdown.tpl.html",'')}]),angular.module("mgcrea.ngStrap.modal").run(["$templateCache",function(t){t.put("modal/modal.tpl.html",'')}]),angular.module("mgcrea.ngStrap.popover").run(["$templateCache",function(t){t.put("popover/popover.tpl.html",'')}]),angular.module("mgcrea.ngStrap.select").run(["$templateCache",function(t){t.put("select/select.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tab").run(["$templateCache",function(t){t.put("tab/tab.tpl.html",'')}]),angular.module("mgcrea.ngStrap.timepicker").run(["$templateCache",function(t){t.put("timepicker/timepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.typeahead").run(["$templateCache",function(t){t.put("typeahead/typeahead.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tooltip").run(["$templateCache",function(t){t.put("tooltip/tooltip.tpl.html",'')}])}(window,document);
\ No newline at end of file
diff --git a/dist/modules/affix.js b/dist/modules/affix.js
index 9d77d34c3..c588ececa 100644
--- a/dist/modules/affix.js
+++ b/dist/modules/affix.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/affix.min.js b/dist/modules/affix.min.js
index 56b7ca777..04668c9e5 100644
--- a/dist/modules/affix.min.js
+++ b/dist/modules/affix.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/alert.js b/dist/modules/alert.js
index 0d39ae9ac..8ea6baf92 100644
--- a/dist/modules/alert.js
+++ b/dist/modules/alert.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/alert.min.js b/dist/modules/alert.min.js
index 91a46cf03..8840babc1 100644
--- a/dist/modules/alert.min.js
+++ b/dist/modules/alert.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/alert.tpl.js b/dist/modules/alert.tpl.js
index 0f448d9c3..53546ede8 100644
--- a/dist/modules/alert.tpl.js
+++ b/dist/modules/alert.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/alert.tpl.min.js b/dist/modules/alert.tpl.min.js
index 38c17d1b1..c815a3b94 100644
--- a/dist/modules/alert.tpl.min.js
+++ b/dist/modules/alert.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/aside.js b/dist/modules/aside.js
index 02ade65b3..333f30b05 100644
--- a/dist/modules/aside.js
+++ b/dist/modules/aside.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/aside.min.js b/dist/modules/aside.min.js
index a022f61f8..d3939d1c3 100644
--- a/dist/modules/aside.min.js
+++ b/dist/modules/aside.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/aside.tpl.js b/dist/modules/aside.tpl.js
index 35882f3a2..7a66ccb86 100644
--- a/dist/modules/aside.tpl.js
+++ b/dist/modules/aside.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/aside.tpl.min.js b/dist/modules/aside.tpl.min.js
index abac134fb..41d05d1d8 100644
--- a/dist/modules/aside.tpl.min.js
+++ b/dist/modules/aside.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/button.js b/dist/modules/button.js
index e5beb9bd4..89405a6b5 100644
--- a/dist/modules/button.js
+++ b/dist/modules/button.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/button.min.js b/dist/modules/button.min.js
index f372c1c0e..1d5d7586e 100644
--- a/dist/modules/button.min.js
+++ b/dist/modules/button.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/date-parser.js b/dist/modules/date-parser.js
index 21d731ad9..7d1e73295 100644
--- a/dist/modules/date-parser.js
+++ b/dist/modules/date-parser.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -122,7 +122,8 @@ angular.module('mgcrea.ngStrap.helpers.dateParser', []).provider('$dateParser',
}
// Sort result map
angular.forEach(map, function (v) {
- sortedMap.push(v);
+ if (v)
+ sortedMap.push(v);
});
return sortedMap;
}
diff --git a/dist/modules/date-parser.min.js b/dist/modules/date-parser.min.js
index f0e7bab2c..d1379aecc 100644
--- a/dist/modules/date-parser.min.js
+++ b/dist/modules/date-parser.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.helpers.dateParser",[]).provider("$dateParser",["$localeProvider",function(){var t=Date.prototype,e=this.defaults={format:"shortDate",strict:!1};this.$get=["$locale","dateFilter",function(r,s){var n=function(n){function i(t){var e,r=Object.keys(h),s=[],n=[],i=t;for(e=0;e1){var a=i.search(r[e]);t=t.split(r[e]).join(""),h[r[e]]&&(s[a]=h[r[e]])}return angular.forEach(s,function(t){n.push(t)}),n}function a(t){return t.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function o(t){var e,r=Object.keys(f),s=t;for(e=0;e1){var a=i.search(r[e]);t=t.split(r[e]).join(""),h[r[e]]&&(s[a]=h[r[e]])}return angular.forEach(s,function(t){t&&n.push(t)}),n}function a(t){return t.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function o(t){var e,r=Object.keys(f),s=t;for(e=0;e 1) {\n var index = clonedFormat.search(keys[i]);\n format = format.split(keys[i]).join('');\n if(setFnMap[keys[i]]) map[index] = setFnMap[keys[i]];\n }\n }\n // Sort result map\n angular.forEach(map, function(v) {\n sortedMap.push(v);\n });\n return sortedMap;\n }\n\n function escapeReservedSymbols(text) {\n return text.replace(/\\//g, '[\\\\/]').replace('/-/g', '[-]').replace(/\\./g, '[.]').replace(/\\\\s/g, '[\\\\s]');\n }\n\n function regExpForFormat(format) {\n var keys = Object.keys(regExpMap), i;\n\n var re = format;\n // Abstract replaces to avoid collisions\n for(i = 0; i < keys.length; i++) {\n re = re.split(keys[i]).join('${' + i + '}');\n }\n // Replace abstracted values\n for(i = 0; i < keys.length; i++) {\n re = re.split('${' + i + '}').join('(' + regExpMap[keys[i]] + ')');\n }\n format = escapeReservedSymbols(format);\n\n return new RegExp('^' + re + '$', ['i']);\n }\n\n $dateParser.init();\n return $dateParser;\n\n };\n\n return DateParserFactory;\n\n };\n\n});\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"file":"date-parser.min.js","sources":["helpers/date-parser.js"],"names":["angular","module","provider","proto","Date","prototype","defaults","this","format","strict","$get","$locale","dateFilter","DateParserFactory","config","setMapForFormat","i","keys","Object","setFnMap","map","sortedMap","clonedFormat","length","split","index","search","join","forEach","v","push","escapeReservedSymbols","text","replace","regExpForFormat","regExpMap","re","RegExp","regex","setMap","options","extend","$dateParser","sss","ss","s","mm","m","HH","H","hh","h","a","EEEE","DATETIME_FORMATS","DAY","EEE","SHORTDAY","dd","d","MMMM","MONTH","MMM","SHORTMONTH","MM","M","yyyy","yy","y","setMilliseconds","setSeconds","setMinutes","setHours","setDate","value","hours","getHours","match","setMonth","indexOf","setFullYear","init","$format","isValid","date","isDate","isNaN","getTime","test","parse","baseDate","formatRegex","formatSetMap","matches","exec","call"],"mappings":"AAOA,YACAA,SAAQC,OAAO,wCAAyCC,SAAS,eAC/D,kBACA,WACE,GAAIC,GAAQC,KAAKC,UAIbC,EAAWC,KAAKD,UAChBE,OAAQ,YACRC,QAAQ,EAEZF,MAAKG,MACH,UACA,aACA,SAAUC,EAASC,GACjB,GAAIC,GAAoB,SAAUC,GAsFhC,QAASC,GAAgBP,GACvB,GAAkCQ,GAA9BC,EAAOC,OAAOD,KAAKE,GACnBC,KAAUC,KAEVC,EAAed,CACnB,KAAKQ,EAAI,EAAGA,EAAIC,EAAKM,OAAQP,IAC3B,GAAIR,EAAOgB,MAAMP,EAAKD,IAAIO,OAAS,EAAG,CACpC,GAAIE,GAAQH,EAAaI,OAAOT,EAAKD,GACrCR,GAASA,EAAOgB,MAAMP,EAAKD,IAAIW,KAAK,IAChCR,EAASF,EAAKD,MAChBI,EAAIK,GAASN,EAASF,EAAKD,KAQjC,MAJAhB,SAAQ4B,QAAQR,EAAK,SAAUS,GACzBA,GACFR,EAAUS,KAAKD,KAEZR,EAET,QAASU,GAAsBC,GAC7B,MAAOA,GAAKC,QAAQ,MAAO,SAASA,QAAQ,OAAQ,OAAOA,QAAQ,MAAO,OAAOA,QAAQ,OAAQ,SAEnG,QAASC,GAAgB1B,GACvB,GAAmCQ,GAA/BC,EAAOC,OAAOD,KAAKkB,GACnBC,EAAK5B,CAET,KAAKQ,EAAI,EAAGA,EAAIC,EAAKM,OAAQP,IAC3BoB,EAAKA,EAAGZ,MAAMP,EAAKD,IAAIW,KAAK,KAAOX,EAAI,IAGzC,KAAKA,EAAI,EAAGA,EAAIC,EAAKM,OAAQP,IAC3BoB,EAAKA,EAAGZ,MAAM,KAAOR,EAAI,KAAKW,KAAK,IAAMQ,EAAUlB,EAAKD,IAAM,IAGhE,OADAR,GAASuB,EAAsBvB,GACxB,GAAI6B,QAAO,IAAMD,EAAK,KAAM,MAxHrC,GA2DIE,GAAOC,EA3DPC,EAAUxC,QAAQyC,UAAWnC,EAAUQ,GACvC4B,KACAP,GACAQ,IAAO,WACPC,GAAM,aACNC,EAAKL,EAAQ/B,OAAS,cAAgB,mBACtCqC,GAAM,aACNC,EAAKP,EAAQ/B,OAAS,cAAgB,mBACtCuC,GAAM,mBACNC,EAAKT,EAAQ/B,OAAS,iBAAmB,oBACzCyC,GAAM,oBACNC,EAAKX,EAAQ/B,OAAS,eAAiB,iBACvC2C,EAAK,QACLC,KAAQ1C,EAAQ2C,iBAAiBC,IAAI5B,KAAK,KAC1C6B,IAAO7C,EAAQ2C,iBAAiBG,SAAS9B,KAAK,KAC9C+B,GAAM,yBACNC,EAAKnB,EAAQ/B,OAAS,yBAA2B,2BACjDmD,KAAQjD,EAAQ2C,iBAAiBO,MAAMlC,KAAK,KAC5CmC,IAAOnD,EAAQ2C,iBAAiBS,WAAWpC,KAAK,KAChDqC,GAAM,gBACNC,EAAKzB,EAAQ/B,OAAS,eAAiB,iBACvCyD,KAAQ,gCACRC,GAAM,WACNC,EAAK5B,EAAQ/B,OAAS,wBAA0B,kBAEhDU,GACAwB,IAAOxC,EAAMkE,gBACbzB,GAAMzC,EAAMmE,WACZzB,EAAK1C,EAAMmE,WACXxB,GAAM3C,EAAMoE,WACZxB,EAAK5C,EAAMoE,WACXvB,GAAM7C,EAAMqE,SACZvB,EAAK9C,EAAMqE,SACXtB,GAAM/C,EAAMqE,SACZrB,EAAKhD,EAAMqE,SACXd,GAAMvD,EAAMsE,QACZd,EAAKxD,EAAMsE,QACXrB,EAAK,SAAUsB,GACb,GAAIC,GAAQpE,KAAKqE,UACjB,OAAOrE,MAAKiE,SAASE,EAAMG,MAAM,OAASF,EAAQ,GAAKA,IAEzDf,KAAQ,SAAUc,GAChB,MAAOnE,MAAKuE,SAASnE,EAAQ2C,iBAAiBO,MAAMkB,QAAQL,KAE9DZ,IAAO,SAAUY,GACf,MAAOnE,MAAKuE,SAASnE,EAAQ2C,iBAAiBS,WAAWgB,QAAQL,KAEnEV,GAAM,SAAUU,GACd,MAAOnE,MAAKuE,SAAS,EAAIJ,EAAQ,IAEnCT,EAAK,SAAUS,GACb,MAAOnE,MAAKuE,SAAS,EAAIJ,EAAQ,IAEnCR,KAAQ/D,EAAM6E,YACdb,GAAM,SAAUO,GACd,MAAOnE,MAAKyE,YAAY,IAAO,EAAIN,IAErCN,EAAKjE,EAAM6E,YAkEf,OA/DAtC,GAAYuC,KAAO,WACjBvC,EAAYwC,QAAUvE,EAAQ2C,iBAAiBd,EAAQhC,SAAWgC,EAAQhC,OAC1E8B,EAAQJ,EAAgBQ,EAAYwC,SACpC3C,EAASxB,EAAgB2B,EAAYwC,UAEvCxC,EAAYyC,QAAU,SAAUC,GAC9B,MAAIpF,SAAQqF,OAAOD,IACTE,MAAMF,EAAKG,WACdjD,EAAMkD,KAAKJ,IAEpB1C,EAAY+C,MAAQ,SAAUf,EAAOgB,EAAUlF,GACzCR,QAAQqF,OAAOX,KACjBA,EAAQ9D,EAAW8D,EAAOlE,GAAUkC,EAAYwC,SAClD,IAAIS,GAAcnF,EAAS0B,EAAgB1B,GAAU8B,EACjDsD,EAAepF,EAASO,EAAgBP,GAAU+B,EAClDsD,EAAUF,EAAYG,KAAKpB,EAC/B,KAAKmB,EACH,OAAO,CAET,KAAK,GADDT,GAAOM,GAAY,GAAItF,MAAK,EAAG,EAAG,GAC7BY,EAAI,EAAGA,EAAI6E,EAAQtE,OAAS,EAAGP,IACtC4E,EAAa5E,IAAM4E,EAAa5E,GAAG+E,KAAKX,EAAMS,EAAQ7E,EAAI,GAE5D,OAAOoE,IAwCT1C,EAAYuC,OACLvC,EAET,OAAO7B","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.dateParser', [])\n\n.provider('$dateParser', function($localeProvider) {\n\n var proto = Date.prototype;\n\n function isNumeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n var defaults = this.defaults = {\n format: 'shortDate',\n strict: false\n };\n\n this.$get = function($locale, dateFilter) {\n\n var DateParserFactory = function(config) {\n\n var options = angular.extend({}, defaults, config);\n\n var $dateParser = {};\n\n var regExpMap = {\n 'sss' : '[0-9]{3}',\n 'ss' : '[0-5][0-9]',\n 's' : options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]',\n 'mm' : '[0-5][0-9]',\n 'm' : options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]',\n 'HH' : '[01][0-9]|2[0-3]',\n 'H' : options.strict ? '1?[0-9]|2[0-3]' : '[01]?[0-9]|2[0-3]',\n 'hh' : '[0][1-9]|[1][012]',\n 'h' : options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]',\n 'a' : 'AM|PM',\n 'EEEE' : $locale.DATETIME_FORMATS.DAY.join('|'),\n 'EEE' : $locale.DATETIME_FORMATS.SHORTDAY.join('|'),\n 'dd' : '0[1-9]|[12][0-9]|3[01]',\n 'd' : options.strict ? '[1-9]|[1-2][0-9]|3[01]' : '0?[1-9]|[1-2][0-9]|3[01]',\n 'MMMM' : $locale.DATETIME_FORMATS.MONTH.join('|'),\n 'MMM' : $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),\n 'MM' : '0[1-9]|1[012]',\n 'M' : options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]',\n 'yyyy' : '[1]{1}[0-9]{3}|[2]{1}[0-9]{3}',\n 'yy' : '[0-9]{2}',\n 'y' : options.strict ? '-?(0|[1-9][0-9]{0,3})' : '-?0*[0-9]{1,4}',\n };\n\n var setFnMap = {\n 'sss' : proto.setMilliseconds,\n 'ss' : proto.setSeconds,\n 's' : proto.setSeconds,\n 'mm' : proto.setMinutes,\n 'm' : proto.setMinutes,\n 'HH' : proto.setHours,\n 'H' : proto.setHours,\n 'hh' : proto.setHours,\n 'h' : proto.setHours,\n 'dd' : proto.setDate,\n 'd' : proto.setDate,\n 'a' : function(value) { var hours = this.getHours(); return this.setHours(value.match(/pm/i) ? hours + 12 : hours); },\n 'MMMM' : function(value) { return this.setMonth($locale.DATETIME_FORMATS.MONTH.indexOf(value)); },\n 'MMM' : function(value) { return this.setMonth($locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value)); },\n 'MM' : function(value) { return this.setMonth(1 * value - 1); },\n 'M' : function(value) { return this.setMonth(1 * value - 1); },\n 'yyyy' : proto.setFullYear,\n 'yy' : function(value) { return this.setFullYear(2000 + 1 * value); },\n 'y' : proto.setFullYear\n };\n\n var regex, setMap;\n\n $dateParser.init = function() {\n $dateParser.$format = $locale.DATETIME_FORMATS[options.format] || options.format;\n regex = regExpForFormat($dateParser.$format);\n setMap = setMapForFormat($dateParser.$format);\n };\n\n $dateParser.isValid = function(date) {\n if(angular.isDate(date)) return !isNaN(date.getTime());\n return regex.test(date);\n };\n\n $dateParser.parse = function(value, baseDate, format) {\n if(angular.isDate(value)) value = dateFilter(value, format || $dateParser.$format);\n var formatRegex = format ? regExpForFormat(format) : regex;\n var formatSetMap = format ? setMapForFormat(format) : setMap;\n var matches = formatRegex.exec(value);\n if(!matches) return false;\n var date = baseDate || new Date(0, 0, 1);\n for(var i = 0; i < matches.length - 1; i++) {\n formatSetMap[i] && formatSetMap[i].call(date, matches[i+1]);\n }\n return date;\n };\n\n // Private functions\n\n function setMapForFormat(format) {\n var keys = Object.keys(setFnMap), i;\n var map = [], sortedMap = [];\n // Map to setFn\n var clonedFormat = format;\n for(i = 0; i < keys.length; i++) {\n if(format.split(keys[i]).length > 1) {\n var index = clonedFormat.search(keys[i]);\n format = format.split(keys[i]).join('');\n if(setFnMap[keys[i]]) map[index] = setFnMap[keys[i]];\n }\n }\n // Sort result map\n angular.forEach(map, function(v) {\n if(v) sortedMap.push(v);\n });\n return sortedMap;\n }\n\n function escapeReservedSymbols(text) {\n return text.replace(/\\//g, '[\\\\/]').replace('/-/g', '[-]').replace(/\\./g, '[.]').replace(/\\\\s/g, '[\\\\s]');\n }\n\n function regExpForFormat(format) {\n var keys = Object.keys(regExpMap), i;\n\n var re = format;\n // Abstract replaces to avoid collisions\n for(i = 0; i < keys.length; i++) {\n re = re.split(keys[i]).join('${' + i + '}');\n }\n // Replace abstracted values\n for(i = 0; i < keys.length; i++) {\n re = re.split('${' + i + '}').join('(' + regExpMap[keys[i]] + ')');\n }\n format = escapeReservedSymbols(format);\n\n return new RegExp('^' + re + '$', ['i']);\n }\n\n $dateParser.init();\n return $dateParser;\n\n };\n\n return DateParserFactory;\n\n };\n\n});\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/modules/datepicker.js b/dist/modules/datepicker.js
index 8db56802d..2a61574ae 100644
--- a/dist/modules/datepicker.js
+++ b/dist/modules/datepicker.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -32,6 +32,7 @@ angular.module('mgcrea.ngStrap.datepicker', [
startView: 0,
minView: 0,
startWeek: 0,
+ daysOfWeekDisabled: '',
iconLeft: 'glyphicon glyphicon-chevron-left',
iconRight: 'glyphicon glyphicon-chevron-right'
};
@@ -46,8 +47,8 @@ angular.module('mgcrea.ngStrap.datepicker', [
'$tooltip',
function ($window, $document, $rootScope, $sce, $locale, dateFilter, datepickerViews, $tooltip) {
var bodyEl = angular.element($window.document.body);
- var isTouch = 'createTouch' in $window.document;
var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
+ var isTouch = 'createTouch' in $window.document && isNative;
if (!defaults.lang)
defaults.lang = $locale.id;
function DatepickerFactory(element, controller, config) {
@@ -270,12 +271,14 @@ angular.module('mgcrea.ngStrap.datepicker', [
'dayFormat',
'strictFormat',
'startWeek',
+ 'startDate',
'useNative',
'lang',
'startView',
'minView',
'iconLeft',
- 'iconRight'
+ 'iconRight',
+ 'daysOfWeekDisabled'
], function (key) {
if (angular.isDefined(attr[key]))
options[key] = attr[key];
@@ -288,9 +291,10 @@ angular.module('mgcrea.ngStrap.datepicker', [
newValue = newValue.match(',?(datepicker),?');
newValue === true ? datepicker.show() : datepicker.hide();
});
- // Initialize datepicker
+ // Set expected iOS format
if (isNative && options.useNative)
options.dateFormat = 'yyyy-MM-dd';
+ // Initialize datepicker
var datepicker = $datepicker(element, controller, options);
options = datepicker.$options;
// Observe attributes for changes
@@ -309,6 +313,9 @@ angular.module('mgcrea.ngStrap.datepicker', [
datepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));
} else if (isNumeric(newValue)) {
datepicker.$options[key] = +new Date(parseInt(newValue, 10));
+ } else if (angular.isString(newValue) && 0 === newValue.length) {
+ // Reset date
+ datepicker.$options[key] = key === 'maxDate' ? +Infinity : -Infinity;
} else {
datepicker.$options[key] = +new Date(newValue);
}
@@ -402,9 +409,8 @@ angular.module('mgcrea.ngStrap.datepicker', [
};
// Garbage collection
scope.$on('$destroy', function () {
- if (datepicker) {
+ if (datepicker)
datepicker.destroy();
- }
options = null;
datepicker = null;
});
@@ -439,7 +445,7 @@ angular.module('mgcrea.ngStrap.datepicker', [
var weekDaysMin = $locale.DATETIME_FORMATS.SHORTDAY;
var weekDaysLabels = weekDaysMin.slice(options.startWeek).concat(weekDaysMin.slice(0, options.startWeek));
var weekDaysLabelsHtml = $sce.trustAsHtml('' + weekDaysLabels.join(' ') + ' ');
- var startDate = picker.$date || new Date();
+ var startDate = picker.$date || (options.startDate ? new Date(options.startDate) : new Date());
var viewDate = {
year: startDate.getFullYear(),
month: startDate.getMonth(),
@@ -496,6 +502,9 @@ angular.module('mgcrea.ngStrap.datepicker', [
// Disabled because of min/max date.
if (time < options.minDate || time > options.maxDate)
return true;
+ // Disabled due to being a disabled day of the week
+ if (options.daysOfWeekDisabled.indexOf(date.getDay()) !== -1)
+ return true;
// Disabled because of disabled date range.
if (options.disabledDateRanges) {
for (var i = 0; i < options.disabledDateRanges.length; i++) {
diff --git a/dist/modules/datepicker.min.js b/dist/modules/datepicker.min.js
index 4e6aa638a..37028988b 100644
--- a/dist/modules/datepicker.min.js
+++ b/dist/modules/datepicker.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.datepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$datepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"datepicker",placement:"bottom-left",template:"datepicker/datepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!1,dateType:"date",dateFormat:"shortDate",modelDateFormat:null,dayFormat:"dd",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0,iconLeft:"glyphicon glyphicon-chevron-left",iconRight:"glyphicon glyphicon-chevron-right"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip",function(t,a,n,i,o,r,d,l){function s(t,a,n){function i(e){e.selected=r.$isSelected(e.date)}function o(){t[0].focus()}var r=l(t,angular.extend({},e,n)),s=n.scope,g=r.$options,$=r.$scope;g.startView&&(g.startView-=g.minView);var h=d(r);r.$views=h.views;var m=h.viewDate;$.$mode=g.startView,$.$iconLeft=g.iconLeft,$.$iconRight=g.iconRight;var f=r.$views[$.$mode];$.$select=function(e){r.select(e)},$.$selectPane=function(e){r.$selectPane(e)},$.$toggleMode=function(){r.setMode(($.$mode+1)%r.$views.length)},r.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())&&(r.$date=e,f.update.call(f,e)),r.$build(!0)},r.updateDisabledDates=function(e){g.disabledDateRanges=e;for(var t=0,a=$.rows.length;a>t;t++)angular.forEach($.rows[t],r.$setDisabledEl)},r.select=function(e,t){angular.isDate(a.$dateValue)||(a.$dateValue=new Date(e)),!$.$mode||t?(a.$setViewValue(angular.copy(e)),a.$render(),g.autoclose&&!t&&r.hide(!0)):(angular.extend(m,{year:e.getFullYear(),month:e.getMonth(),date:e.getDate()}),r.setMode($.$mode-1),r.$build())},r.setMode=function(e){$.$mode=e,f=r.$views[$.$mode],r.$build()},r.$build=function(e){e===!0&&f.built||(e!==!1||f.built)&&f.build.call(f)},r.$updateSelected=function(){for(var e=0,t=$.rows.length;t>e;e++)angular.forEach($.rows[e],i)},r.$isSelected=function(e){return f.isSelected(e)},r.$setDisabledEl=function(e){e.disabled=f.isDisabled(e.date)},r.$selectPane=function(e){var t=f.steps,a=new Date(Date.UTC(m.year+(t.year||0)*e,m.month+(t.month||0)*e,m.date+(t.day||0)*e));angular.extend(m,{year:a.getUTCFullYear(),month:a.getUTCMonth(),date:a.getUTCDate()}),r.$build()},r.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),u){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},r.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return $.$mode?$.$apply(function(){r.setMode($.$mode-1)}):r.hide(!0);f.onKeyDown(e),s.$digest()}};var p=r.init;r.init=function(){return c&&g.useNative?(t.prop("type","date"),void t.css("-webkit-appearance","textfield")):(u&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",o)),void p())};var D=r.destroy;r.destroy=function(){c&&g.useNative&&t.off("click",o),D()};var y=r.show;r.show=function(){y(),setTimeout(function(){r.$element.on(u?"touchstart":"mousedown",r.$onMouseDown),g.keyboard&&t.on("keydown",r.$onKeyDown)})};var w=r.hide;return r.hide=function(e){r.$element.off(u?"touchstart":"mousedown",r.$onMouseDown),g.keyboard&&t.off("keydown",r.$onKeyDown),w(e)},r}var u=(angular.element(t.document.body),"createTouch"in t.document),c=/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent);return e.lang||(e.lang=o.id),s.defaults=e,s}]}).directive("bsDatepicker",["$window","$parse","$q","$locale","dateFilter","$datepicker","$dateParser","$timeout",function(e,t,a,n,i,o,r){var d=(o.defaults,/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent)),l=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};return{restrict:"EAC",require:"ngModel",link:function(e,t,a,n){function s(e){return e&&e.length?e:null}var u={scope:e,controller:n};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","modelDateFormat","dayFormat","strictFormat","startWeek","useNative","lang","startView","minView","iconLeft","iconRight"],function(e){angular.isDefined(a[e])&&(u[e]=a[e])}),a.bsShow&&e.$watch(a.bsShow,function(e){c&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(datepicker),?")),e===!0?c.show():c.hide())}),d&&u.useNative&&(u.dateFormat="yyyy-MM-dd");var c=o(t,n,u);u=c.$options,angular.forEach(["minDate","maxDate"],function(e){angular.isDefined(a[e])&&a.$observe(e,function(t){if("today"===t){var a=new Date;c.$options[e]=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+("maxDate"===e?1:0),0,0,0,"minDate"===e?0:-1)}else c.$options[e]=angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):l(t)?+new Date(parseInt(t,10)):+new Date(t);!isNaN(c.$options[e])&&c.$build(!1)})}),e.$watch(a.ngModel,function(){c.update(n.$dateValue)},!0),angular.isDefined(a.disabledDates)&&e.$watch(a.disabledDates,function(e,t){e=s(e),t=s(t),e!==t&&c.updateDisabledDates(e)});var g=r({format:u.dateFormat,lang:u.lang,strict:u.strictFormat});n.$parsers.unshift(function(e){if(!e)return void n.$setValidity("date",!0);var t=g.parse(e,n.$dateValue);if(!t||isNaN(t.getTime()))return void n.$setValidity("date",!1);var a=isNaN(c.$options.minDate)||t.getTime()>=c.$options.minDate,o=isNaN(c.$options.maxDate)||t.getTime()<=c.$options.maxDate,r=a&&o;return n.$setValidity("date",r),n.$setValidity("min",a),n.$setValidity("max",o),r&&(n.$dateValue=t),"string"===u.dateType?i(t,u.modelDateFormat||u.dateFormat):"number"===u.dateType?n.$dateValue.getTime():"iso"===u.dateType?n.$dateValue.toISOString():new Date(n.$dateValue)}),n.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===u.dateType?g.parse(e,null,u.modelDateFormat):new Date(e),n.$dateValue=t,n.$dateValue}),n.$render=function(){t.val(!n.$dateValue||isNaN(n.$dateValue.getTime())?"":i(n.$dateValue,u.dateFormat))},e.$on("$destroy",function(){c&&c.destroy(),u=null,c=null})}}}]).provider("datepickerViews",function(){function e(e,t){for(var a=[];e.length>0;)a.push(e.splice(0,t));return a}function t(e,t){return(e%t+t)%t}this.defaults={dayFormat:"dd",daySplit:7};this.$get=["$locale","$sce","dateFilter",function(a,n,i){return function(o){var r=o.$scope,d=o.$options,l=a.DATETIME_FORMATS.SHORTDAY,s=l.slice(d.startWeek).concat(l.slice(0,d.startWeek)),u=n.trustAsHtml(''+s.join(' ')+" "),c=o.$date||new Date,g={year:c.getFullYear(),month:c.getMonth(),date:c.getDate()},$=(6e4*c.getTimezoneOffset(),[{format:d.dayFormat,split:7,steps:{month:1},update:function(e,t){!this.built||t||e.getFullYear()!==g.year||e.getMonth()!==g.month?(angular.extend(g,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build()):e.getDate()!==g.date&&(g.date=o.$date.getDate(),o.$updateSelected())},build:function(){var a=new Date(g.year,g.month,1),n=a.getTimezoneOffset(),l=new Date(+a-864e5*t(a.getDay()-d.startWeek,7)),s=l.getTimezoneOffset();s!==n&&(l=new Date(+l+6e4*(s-n)));for(var c,$=[],h=0;42>h;h++)c=new Date(l.getFullYear(),l.getMonth(),l.getDate()+h),$.push({date:c,label:i(c,this.format),selected:o.$date&&this.isSelected(c),muted:c.getMonth()!==g.month,disabled:this.isDisabled(c)});r.title=i(a,"MMMM yyyy"),r.showLabels=!0,r.labels=u,r.rows=e($,this.split),this.built=!0},isSelected:function(e){return o.$date&&e.getFullYear()===o.$date.getFullYear()&&e.getMonth()===o.$date.getMonth()&&e.getDate()===o.$date.getDate()},isDisabled:function(e){var t=e.getTime();if(td.maxDate)return!0;if(d.disabledDateRanges)for(var a=0;a=d.disabledDateRanges[a].start)return t<=d.disabledDateRanges[a].end?!0:!1;return!1},onKeyDown:function(e){var t,a=o.$date.getTime();37===e.keyCode?t=new Date(a-864e5):38===e.keyCode?t=new Date(a-6048e5):39===e.keyCode?t=new Date(a+864e5):40===e.keyCode&&(t=new Date(a+6048e5)),this.isDisabled(t)||o.select(t,!0)}},{name:"month",format:"MMM",split:4,steps:{year:1},update:function(e){this.built&&e.getFullYear()===g.year?e.getMonth()!==g.month&&(angular.extend(g,{month:o.$date.getMonth(),date:o.$date.getDate()}),o.$updateSelected()):(angular.extend(g,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build())},build:function(){for(var t,a=(new Date(g.year,0,1),[]),n=0;12>n;n++)t=new Date(g.year,n,1),a.push({date:t,label:i(t,this.format),selected:o.$isSelected(t),disabled:this.isDisabled(t)});r.title=i(t,"yyyy"),r.showLabels=!1,r.rows=e(a,this.split),this.built=!0},isSelected:function(e){return o.$date&&e.getFullYear()===o.$date.getFullYear()&&e.getMonth()===o.$date.getMonth()},isDisabled:function(e){var t=+new Date(e.getFullYear(),e.getMonth()+1,0);return td.maxDate},onKeyDown:function(e){var t=o.$date.getMonth(),a=new Date(o.$date);37===e.keyCode?a.setMonth(t-1):38===e.keyCode?a.setMonth(t-4):39===e.keyCode?a.setMonth(t+1):40===e.keyCode&&a.setMonth(t+4),this.isDisabled(a)||o.select(a,!0)}},{name:"year",format:"yyyy",split:4,steps:{year:12},update:function(e,t){!this.built||t||parseInt(e.getFullYear()/20,10)!==parseInt(g.year/20,10)?(angular.extend(g,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build()):e.getFullYear()!==g.year&&(angular.extend(g,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$updateSelected())},build:function(){for(var t,a=g.year-g.year%(3*this.split),n=[],d=0;12>d;d++)t=new Date(a+d,0,1),n.push({date:t,label:i(t,this.format),selected:o.$isSelected(t),disabled:this.isDisabled(t)});r.title=n[0].label+"-"+n[n.length-1].label,r.showLabels=!1,r.rows=e(n,this.split),this.built=!0},isSelected:function(e){return o.$date&&e.getFullYear()===o.$date.getFullYear()},isDisabled:function(e){var t=+new Date(e.getFullYear()+1,0,0);return td.maxDate},onKeyDown:function(e){var t=o.$date.getFullYear(),a=new Date(o.$date);37===e.keyCode?a.setYear(t-1):38===e.keyCode?a.setYear(t-4):39===e.keyCode?a.setYear(t+1):40===e.keyCode&&a.setYear(t+4),this.isDisabled(a)||o.select(a,!0)}}]);return{views:d.minView?Array.prototype.slice.call($,d.minView):$,viewDate:g}}}]});
+"use strict";angular.module("mgcrea.ngStrap.datepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$datepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"datepicker",placement:"bottom-left",template:"datepicker/datepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!1,dateType:"date",dateFormat:"shortDate",modelDateFormat:null,dayFormat:"dd",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0,daysOfWeekDisabled:"",iconLeft:"glyphicon glyphicon-chevron-left",iconRight:"glyphicon glyphicon-chevron-right"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip",function(t,a,n,i,o,r,d,l){function s(t,a,n){function i(e){e.selected=r.$isSelected(e.date)}function o(){t[0].focus()}var r=l(t,angular.extend({},e,n)),s=n.scope,g=r.$options,$=r.$scope;g.startView&&(g.startView-=g.minView);var f=d(r);r.$views=f.views;var h=f.viewDate;$.$mode=g.startView,$.$iconLeft=g.iconLeft,$.$iconRight=g.iconRight;var m=r.$views[$.$mode];$.$select=function(e){r.select(e)},$.$selectPane=function(e){r.$selectPane(e)},$.$toggleMode=function(){r.setMode(($.$mode+1)%r.$views.length)},r.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())&&(r.$date=e,m.update.call(m,e)),r.$build(!0)},r.updateDisabledDates=function(e){g.disabledDateRanges=e;for(var t=0,a=$.rows.length;a>t;t++)angular.forEach($.rows[t],r.$setDisabledEl)},r.select=function(e,t){angular.isDate(a.$dateValue)||(a.$dateValue=new Date(e)),!$.$mode||t?(a.$setViewValue(angular.copy(e)),a.$render(),g.autoclose&&!t&&r.hide(!0)):(angular.extend(h,{year:e.getFullYear(),month:e.getMonth(),date:e.getDate()}),r.setMode($.$mode-1),r.$build())},r.setMode=function(e){$.$mode=e,m=r.$views[$.$mode],r.$build()},r.$build=function(e){e===!0&&m.built||(e!==!1||m.built)&&m.build.call(m)},r.$updateSelected=function(){for(var e=0,t=$.rows.length;t>e;e++)angular.forEach($.rows[e],i)},r.$isSelected=function(e){return m.isSelected(e)},r.$setDisabledEl=function(e){e.disabled=m.isDisabled(e.date)},r.$selectPane=function(e){var t=m.steps,a=new Date(Date.UTC(h.year+(t.year||0)*e,h.month+(t.month||0)*e,h.date+(t.day||0)*e));angular.extend(h,{year:a.getUTCFullYear(),month:a.getUTCMonth(),date:a.getUTCDate()}),r.$build()},r.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),c){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},r.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return $.$mode?$.$apply(function(){r.setMode($.$mode-1)}):r.hide(!0);m.onKeyDown(e),s.$digest()}};var D=r.init;r.init=function(){return u&&g.useNative?(t.prop("type","date"),void t.css("-webkit-appearance","textfield")):(c&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",o)),void D())};var p=r.destroy;r.destroy=function(){u&&g.useNative&&t.off("click",o),p()};var y=r.show;r.show=function(){y(),setTimeout(function(){r.$element.on(c?"touchstart":"mousedown",r.$onMouseDown),g.keyboard&&t.on("keydown",r.$onKeyDown)})};var w=r.hide;return r.hide=function(e){r.$element.off(c?"touchstart":"mousedown",r.$onMouseDown),g.keyboard&&t.off("keydown",r.$onKeyDown),w(e)},r}var u=(angular.element(t.document.body),/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent)),c="createTouch"in t.document&&u;return e.lang||(e.lang=o.id),s.defaults=e,s}]}).directive("bsDatepicker",["$window","$parse","$q","$locale","dateFilter","$datepicker","$dateParser","$timeout",function(e,t,a,n,i,o,r){var d=(o.defaults,/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent)),l=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};return{restrict:"EAC",require:"ngModel",link:function(e,t,a,n){function s(e){return e&&e.length?e:null}var u={scope:e,controller:n};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","modelDateFormat","dayFormat","strictFormat","startWeek","startDate","useNative","lang","startView","minView","iconLeft","iconRight","daysOfWeekDisabled"],function(e){angular.isDefined(a[e])&&(u[e]=a[e])}),a.bsShow&&e.$watch(a.bsShow,function(e){c&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(datepicker),?")),e===!0?c.show():c.hide())}),d&&u.useNative&&(u.dateFormat="yyyy-MM-dd");var c=o(t,n,u);u=c.$options,angular.forEach(["minDate","maxDate"],function(e){angular.isDefined(a[e])&&a.$observe(e,function(t){if("today"===t){var a=new Date;c.$options[e]=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+("maxDate"===e?1:0),0,0,0,"minDate"===e?0:-1)}else c.$options[e]=angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):l(t)?+new Date(parseInt(t,10)):angular.isString(t)&&0===t.length?"maxDate"===e?+1/0:-1/0:+new Date(t);!isNaN(c.$options[e])&&c.$build(!1)})}),e.$watch(a.ngModel,function(){c.update(n.$dateValue)},!0),angular.isDefined(a.disabledDates)&&e.$watch(a.disabledDates,function(e,t){e=s(e),t=s(t),e!==t&&c.updateDisabledDates(e)});var g=r({format:u.dateFormat,lang:u.lang,strict:u.strictFormat});n.$parsers.unshift(function(e){if(!e)return void n.$setValidity("date",!0);var t=g.parse(e,n.$dateValue);if(!t||isNaN(t.getTime()))return void n.$setValidity("date",!1);var a=isNaN(c.$options.minDate)||t.getTime()>=c.$options.minDate,o=isNaN(c.$options.maxDate)||t.getTime()<=c.$options.maxDate,r=a&&o;return n.$setValidity("date",r),n.$setValidity("min",a),n.$setValidity("max",o),r&&(n.$dateValue=t),"string"===u.dateType?i(t,u.modelDateFormat||u.dateFormat):"number"===u.dateType?n.$dateValue.getTime():"iso"===u.dateType?n.$dateValue.toISOString():new Date(n.$dateValue)}),n.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===u.dateType?g.parse(e,null,u.modelDateFormat):new Date(e),n.$dateValue=t,n.$dateValue}),n.$render=function(){t.val(!n.$dateValue||isNaN(n.$dateValue.getTime())?"":i(n.$dateValue,u.dateFormat))},e.$on("$destroy",function(){c&&c.destroy(),u=null,c=null})}}}]).provider("datepickerViews",function(){function e(e,t){for(var a=[];e.length>0;)a.push(e.splice(0,t));return a}function t(e,t){return(e%t+t)%t}this.defaults={dayFormat:"dd",daySplit:7};this.$get=["$locale","$sce","dateFilter",function(a,n,i){return function(o){var r=o.$scope,d=o.$options,l=a.DATETIME_FORMATS.SHORTDAY,s=l.slice(d.startWeek).concat(l.slice(0,d.startWeek)),u=n.trustAsHtml(''+s.join(' ')+" "),c=o.$date||(d.startDate?new Date(d.startDate):new Date),g={year:c.getFullYear(),month:c.getMonth(),date:c.getDate()},$=(6e4*c.getTimezoneOffset(),[{format:d.dayFormat,split:7,steps:{month:1},update:function(e,t){!this.built||t||e.getFullYear()!==g.year||e.getMonth()!==g.month?(angular.extend(g,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build()):e.getDate()!==g.date&&(g.date=o.$date.getDate(),o.$updateSelected())},build:function(){var a=new Date(g.year,g.month,1),n=a.getTimezoneOffset(),l=new Date(+a-864e5*t(a.getDay()-d.startWeek,7)),s=l.getTimezoneOffset();s!==n&&(l=new Date(+l+6e4*(s-n)));for(var c,$=[],f=0;42>f;f++)c=new Date(l.getFullYear(),l.getMonth(),l.getDate()+f),$.push({date:c,label:i(c,this.format),selected:o.$date&&this.isSelected(c),muted:c.getMonth()!==g.month,disabled:this.isDisabled(c)});r.title=i(a,"MMMM yyyy"),r.showLabels=!0,r.labels=u,r.rows=e($,this.split),this.built=!0},isSelected:function(e){return o.$date&&e.getFullYear()===o.$date.getFullYear()&&e.getMonth()===o.$date.getMonth()&&e.getDate()===o.$date.getDate()},isDisabled:function(e){var t=e.getTime();if(td.maxDate)return!0;if(-1!==d.daysOfWeekDisabled.indexOf(e.getDay()))return!0;if(d.disabledDateRanges)for(var a=0;a=d.disabledDateRanges[a].start)return t<=d.disabledDateRanges[a].end?!0:!1;return!1},onKeyDown:function(e){var t,a=o.$date.getTime();37===e.keyCode?t=new Date(a-864e5):38===e.keyCode?t=new Date(a-6048e5):39===e.keyCode?t=new Date(a+864e5):40===e.keyCode&&(t=new Date(a+6048e5)),this.isDisabled(t)||o.select(t,!0)}},{name:"month",format:"MMM",split:4,steps:{year:1},update:function(e){this.built&&e.getFullYear()===g.year?e.getMonth()!==g.month&&(angular.extend(g,{month:o.$date.getMonth(),date:o.$date.getDate()}),o.$updateSelected()):(angular.extend(g,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build())},build:function(){for(var t,a=(new Date(g.year,0,1),[]),n=0;12>n;n++)t=new Date(g.year,n,1),a.push({date:t,label:i(t,this.format),selected:o.$isSelected(t),disabled:this.isDisabled(t)});r.title=i(t,"yyyy"),r.showLabels=!1,r.rows=e(a,this.split),this.built=!0},isSelected:function(e){return o.$date&&e.getFullYear()===o.$date.getFullYear()&&e.getMonth()===o.$date.getMonth()},isDisabled:function(e){var t=+new Date(e.getFullYear(),e.getMonth()+1,0);return td.maxDate},onKeyDown:function(e){var t=o.$date.getMonth(),a=new Date(o.$date);37===e.keyCode?a.setMonth(t-1):38===e.keyCode?a.setMonth(t-4):39===e.keyCode?a.setMonth(t+1):40===e.keyCode&&a.setMonth(t+4),this.isDisabled(a)||o.select(a,!0)}},{name:"year",format:"yyyy",split:4,steps:{year:12},update:function(e,t){!this.built||t||parseInt(e.getFullYear()/20,10)!==parseInt(g.year/20,10)?(angular.extend(g,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build()):e.getFullYear()!==g.year&&(angular.extend(g,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$updateSelected())},build:function(){for(var t,a=g.year-g.year%(3*this.split),n=[],d=0;12>d;d++)t=new Date(a+d,0,1),n.push({date:t,label:i(t,this.format),selected:o.$isSelected(t),disabled:this.isDisabled(t)});r.title=n[0].label+"-"+n[n.length-1].label,r.showLabels=!1,r.rows=e(n,this.split),this.built=!0},isSelected:function(e){return o.$date&&e.getFullYear()===o.$date.getFullYear()},isDisabled:function(e){var t=+new Date(e.getFullYear()+1,0,0);return td.maxDate},onKeyDown:function(e){var t=o.$date.getFullYear(),a=new Date(o.$date);37===e.keyCode?a.setYear(t-1):38===e.keyCode?a.setYear(t-4):39===e.keyCode?a.setYear(t+1):40===e.keyCode&&a.setYear(t+4),this.isDisabled(a)||o.select(a,!0)}}]);return{views:d.minView?Array.prototype.slice.call($,d.minView):$,viewDate:g}}}]});
//# sourceMappingURL=datepicker.min.js.map
\ No newline at end of file
diff --git a/dist/modules/datepicker.min.js.map b/dist/modules/datepicker.min.js.map
index 5ae7cac95..cbb1a3f11 100755
--- a/dist/modules/datepicker.min.js.map
+++ b/dist/modules/datepicker.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"datepicker.min.js","sources":["datepicker/datepicker.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","trigger","container","keyboard","html","delay","useNative","dateType","dateFormat","modelDateFormat","dayFormat","strictFormat","autoclose","minDate","Infinity","maxDate","startView","minView","startWeek","iconLeft","iconRight","$get","$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip","DatepickerFactory","element","controller","config","updateSelected","el","selected","$datepicker","$isSelected","date","focusElement","focus","extend","parentScope","scope","options","$options","$scope","pickerViews","$views","views","viewDate","$mode","$iconLeft","$iconRight","$picker","$select","select","$selectPane","value","$toggleMode","setMode","length","update","isDate","isNaN","getTime","$date","call","$build","updateDisabledDates","dateRanges","disabledDateRanges","i","l","rows","forEach","$setDisabledEl","keep","$dateValue","Date","$setViewValue","copy","$render","hide","year","getFullYear","month","getMonth","getDate","mode","pristine","built","build","$updateSelected","isSelected","disabled","isDisabled","steps","targetDate","UTC","day","getUTCFullYear","getUTCMonth","getUTCDate","$onMouseDown","evt","preventDefault","stopPropagation","isTouch","targetEl","target","nodeName","toLowerCase","parent","triggerHandler","$onKeyDown","test","keyCode","shiftKey","altKey","$apply","onKeyDown","$digest","_init","init","isNative","prop","css","attr","on","_destroy","destroy","off","_show","show","setTimeout","$element","_hide","blur","document","body","navigator","userAgent","lang","id","directive","$parse","$q","$dateParser","isNumeric","n","parseFloat","isFinite","restrict","require","link","normalizeDateRanges","ranges","key","isDefined","bsShow","$watch","newValue","datepicker","isString","match","$observe","today","substr","parseInt","ngModel","disabledDates","disabledRanges","previousValue","dateParser","format","strict","$parsers","unshift","viewValue","$setValidity","parsedDate","parse","isMinValid","isMaxValid","isValid","toISOString","$formatters","push","modelValue","isUndefined","NaN","val","$on","split","arr","size","arrays","splice","mod","m","daySplit","picker","weekDaysMin","DATETIME_FORMATS","SHORTDAY","weekDaysLabels","slice","concat","weekDaysLabelsHtml","trustAsHtml","join","startDate","getTimezoneOffset","force","firstDayOfMonth","firstDayOfMonthOffset","firstDate","getDay","firstDateOffset","days","label","muted","title","showLabels","labels","time","start","end","newDate","actualTime","name","months","lastDate","actualMonth","setMonth","firstYear","years","actualYear","setYear","Array","prototype"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.datepicker', ['mgcrea.ngStrap.helpers.dateParser', 'mgcrea.ngStrap.tooltip'])\n\n .provider('$datepicker', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'datepicker',\n placement: 'bottom-left',\n template: 'datepicker/datepicker.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n // lang: $locale.id,\n useNative: false,\n dateType: 'date',\n dateFormat: 'shortDate',\n modelDateFormat: null,\n dayFormat: 'dd',\n strictFormat: false,\n autoclose: false,\n minDate: -Infinity,\n maxDate: +Infinity,\n startView: 0,\n minView: 0,\n startWeek: 0,\n iconLeft: 'glyphicon glyphicon-chevron-left',\n iconRight: 'glyphicon glyphicon-chevron-right'\n };\n\n this.$get = function($window, $document, $rootScope, $sce, $locale, dateFilter, datepickerViews, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n var isTouch = 'createTouch' in $window.document;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n if(!defaults.lang) defaults.lang = $locale.id;\n\n function DatepickerFactory(element, controller, config) {\n\n var $datepicker = $tooltip(element, angular.extend({}, defaults, config));\n var parentScope = config.scope;\n var options = $datepicker.$options;\n var scope = $datepicker.$scope;\n if(options.startView) options.startView -= options.minView;\n\n // View vars\n\n var pickerViews = datepickerViews($datepicker);\n $datepicker.$views = pickerViews.views;\n var viewDate = pickerViews.viewDate;\n scope.$mode = options.startView;\n scope.$iconLeft = options.iconLeft;\n scope.$iconRight = options.iconRight;\n var $picker = $datepicker.$views[scope.$mode];\n\n // Scope methods\n\n scope.$select = function(date) {\n $datepicker.select(date);\n };\n scope.$selectPane = function(value) {\n $datepicker.$selectPane(value);\n };\n scope.$toggleMode = function() {\n $datepicker.setMode((scope.$mode + 1) % $datepicker.$views.length);\n };\n\n // Public methods\n\n $datepicker.update = function(date) {\n // console.warn('$datepicker.update() newValue=%o', date);\n if(angular.isDate(date) && !isNaN(date.getTime())) {\n $datepicker.$date = date;\n $picker.update.call($picker, date);\n }\n // Build only if pristine\n $datepicker.$build(true);\n };\n\n $datepicker.updateDisabledDates = function(dateRanges) {\n options.disabledDateRanges = dateRanges;\n for(var i = 0, l = scope.rows.length; i < l; i++) {\n angular.forEach(scope.rows[i], $datepicker.$setDisabledEl);\n }\n };\n\n $datepicker.select = function(date, keep) {\n // console.warn('$datepicker.select', date, scope.$mode);\n if(!angular.isDate(controller.$dateValue)) controller.$dateValue = new Date(date);\n if(!scope.$mode || keep) {\n controller.$setViewValue(angular.copy(date));\n controller.$render();\n if(options.autoclose && !keep) {\n $datepicker.hide(true);\n }\n } else {\n angular.extend(viewDate, {year: date.getFullYear(), month: date.getMonth(), date: date.getDate()});\n $datepicker.setMode(scope.$mode - 1);\n $datepicker.$build();\n }\n };\n\n $datepicker.setMode = function(mode) {\n // console.warn('$datepicker.setMode', mode);\n scope.$mode = mode;\n $picker = $datepicker.$views[scope.$mode];\n $datepicker.$build();\n };\n\n // Protected methods\n\n $datepicker.$build = function(pristine) {\n // console.warn('$datepicker.$build() viewDate=%o', viewDate);\n if(pristine === true && $picker.built) return;\n if(pristine === false && !$picker.built) return;\n $picker.build.call($picker);\n };\n\n $datepicker.$updateSelected = function() {\n for(var i = 0, l = scope.rows.length; i < l; i++) {\n angular.forEach(scope.rows[i], updateSelected);\n }\n };\n\n $datepicker.$isSelected = function(date) {\n return $picker.isSelected(date);\n };\n\n $datepicker.$setDisabledEl = function(el) {\n el.disabled = $picker.isDisabled(el.date);\n };\n\n $datepicker.$selectPane = function(value) {\n var steps = $picker.steps;\n var targetDate = new Date(Date.UTC(viewDate.year + ((steps.year || 0) * value), viewDate.month + ((steps.month || 0) * value), viewDate.date + ((steps.day || 0) * value)));\n angular.extend(viewDate, {year: targetDate.getUTCFullYear(), month: targetDate.getUTCMonth(), date: targetDate.getUTCDate()});\n $datepicker.$build();\n };\n\n $datepicker.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n targetEl = targetEl.parent();\n }\n targetEl.triggerHandler('click');\n }\n };\n\n $datepicker.$onKeyDown = function(evt) {\n if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n if(evt.keyCode === 13) {\n if(!scope.$mode) {\n return $datepicker.hide(true);\n } else {\n return scope.$apply(function() { $datepicker.setMode(scope.$mode - 1); });\n }\n }\n\n // Navigate with keyboard\n $picker.onKeyDown(evt);\n parentScope.$digest();\n };\n\n // Private\n\n function updateSelected(el) {\n el.selected = $datepicker.$isSelected(el.date);\n }\n\n function focusElement() {\n element[0].focus();\n }\n\n // Overrides\n\n var _init = $datepicker.init;\n $datepicker.init = function() {\n if(isNative && options.useNative) {\n element.prop('type', 'date');\n element.css('-webkit-appearance', 'textfield');\n return;\n } else if(isTouch) {\n element.prop('type', 'text');\n element.attr('readonly', 'true');\n element.on('click', focusElement);\n }\n _init();\n };\n\n var _destroy = $datepicker.destroy;\n $datepicker.destroy = function() {\n if(isNative && options.useNative) {\n element.off('click', focusElement);\n }\n _destroy();\n };\n\n var _show = $datepicker.show;\n $datepicker.show = function() {\n _show();\n setTimeout(function() {\n $datepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $datepicker.$onKeyDown);\n }\n });\n };\n\n var _hide = $datepicker.hide;\n $datepicker.hide = function(blur) {\n $datepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $datepicker.$onKeyDown);\n }\n _hide(blur);\n };\n\n return $datepicker;\n\n }\n\n DatepickerFactory.defaults = defaults;\n return DatepickerFactory;\n\n };\n\n })\n\n .directive('bsDatepicker', function($window, $parse, $q, $locale, dateFilter, $datepicker, $dateParser, $timeout) {\n\n var defaults = $datepicker.defaults;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var isNumeric = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope, controller: controller};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'dateType', 'dateFormat', 'modelDateFormat', 'dayFormat', 'strictFormat', 'startWeek', 'useNative', 'lang', 'startView', 'minView', 'iconLeft', 'iconRight'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!datepicker || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = newValue.match(',?(datepicker),?');\n newValue === true ? datepicker.show() : datepicker.hide();\n });\n\n // Initialize datepicker\n if(isNative && options.useNative) options.dateFormat = 'yyyy-MM-dd';\n var datepicker = $datepicker(element, controller, options);\n options = datepicker.$options;\n\n // Observe attributes for changes\n angular.forEach(['minDate', 'maxDate'], function(key) {\n // console.warn('attr.$observe(%s)', key, attr[key]);\n angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n // console.warn('attr.$observe(%s)=%o', key, newValue);\n if(newValue === 'today') {\n var today = new Date();\n datepicker.$options[key] = +new Date(today.getFullYear(), today.getMonth(), today.getDate() + (key === 'maxDate' ? 1 : 0), 0, 0, 0, (key === 'minDate' ? 0 : -1));\n } else if(angular.isString(newValue) && newValue.match(/^\".+\"$/)) { // Support {{ dateObj }}\n datepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));\n } else if(isNumeric(newValue)) {\n datepicker.$options[key] = +new Date(parseInt(newValue, 10));\n } else {\n datepicker.$options[key] = +new Date(newValue);\n }\n // Build only if dirty\n !isNaN(datepicker.$options[key]) && datepicker.$build(false);\n });\n });\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n datepicker.update(controller.$dateValue);\n }, true);\n\n // Normalize undefined/null/empty array,\n // so that we don't treat changing from undefined->null as a change.\n function normalizeDateRanges(ranges) {\n if (!ranges || !ranges.length) return null;\n return ranges;\n }\n\n if (angular.isDefined(attr.disabledDates)) {\n scope.$watch(attr.disabledDates, function(disabledRanges, previousValue) {\n disabledRanges = normalizeDateRanges(disabledRanges);\n previousValue = normalizeDateRanges(previousValue);\n\n if (disabledRanges !== previousValue) {\n datepicker.updateDisabledDates(disabledRanges);\n }\n });\n }\n\n var dateParser = $dateParser({format: options.dateFormat, lang: options.lang, strict: options.strictFormat});\n\n // viewValue -> $parsers -> modelValue\n controller.$parsers.unshift(function(viewValue) {\n // console.warn('$parser(\"%s\"): viewValue=%o', element.attr('ng-model'), viewValue);\n // Null values should correctly reset the model value & validity\n if(!viewValue) {\n controller.$setValidity('date', true);\n return;\n }\n var parsedDate = dateParser.parse(viewValue, controller.$dateValue);\n if(!parsedDate || isNaN(parsedDate.getTime())) {\n controller.$setValidity('date', false);\n return;\n } else {\n var isMinValid = isNaN(datepicker.$options.minDate) || parsedDate.getTime() >= datepicker.$options.minDate;\n var isMaxValid = isNaN(datepicker.$options.maxDate) || parsedDate.getTime() <= datepicker.$options.maxDate;\n var isValid = isMinValid && isMaxValid;\n controller.$setValidity('date', isValid);\n controller.$setValidity('min', isMinValid);\n controller.$setValidity('max', isMaxValid);\n // Only update the model when we have a valid date\n if(isValid) controller.$dateValue = parsedDate;\n }\n if(options.dateType === 'string') {\n return dateFilter(parsedDate, options.modelDateFormat || options.dateFormat);\n } else if(options.dateType === 'number') {\n return controller.$dateValue.getTime();\n } else if(options.dateType === 'iso') {\n return controller.$dateValue.toISOString();\n } else {\n return new Date(controller.$dateValue);\n }\n });\n\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n var date;\n if(angular.isUndefined(modelValue) || modelValue === null) {\n date = NaN;\n } else if(angular.isDate(modelValue)) {\n date = modelValue;\n } else if(options.dateType === 'string') {\n date = dateParser.parse(modelValue, null, options.modelDateFormat);\n } else {\n date = new Date(modelValue);\n }\n // Setup default value?\n // if(isNaN(date.getTime())) {\n // var today = new Date();\n // date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0);\n // }\n controller.$dateValue = date;\n return controller.$dateValue;\n });\n\n // viewValue -> element\n controller.$render = function() {\n // console.warn('$render(\"%s\"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);\n element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.dateFormat));\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (datepicker) {\n datepicker.destroy();\n }\n options = null;\n datepicker = null;\n });\n\n }\n };\n\n })\n\n .provider('datepickerViews', function() {\n\n var defaults = this.defaults = {\n dayFormat: 'dd',\n daySplit: 7\n };\n\n // Split array into smaller arrays\n function split(arr, size) {\n var arrays = [];\n while(arr.length > 0) {\n arrays.push(arr.splice(0, size));\n }\n return arrays;\n }\n\n // Modulus operator\n function mod(n, m) {\n return ((n % m) + m) % m;\n }\n\n this.$get = function($locale, $sce, dateFilter) {\n\n return function(picker) {\n\n var scope = picker.$scope;\n var options = picker.$options;\n\n var weekDaysMin = $locale.DATETIME_FORMATS.SHORTDAY;\n var weekDaysLabels = weekDaysMin.slice(options.startWeek).concat(weekDaysMin.slice(0, options.startWeek));\n var weekDaysLabelsHtml = $sce.trustAsHtml('' + weekDaysLabels.join(' ') + ' ');\n\n var startDate = picker.$date || new Date();\n var viewDate = {year: startDate.getFullYear(), month: startDate.getMonth(), date: startDate.getDate()};\n var timezoneOffset = startDate.getTimezoneOffset() * 6e4;\n\n var views = [{\n format: options.dayFormat,\n split: 7,\n steps: { month: 1 },\n update: function(date, force) {\n if(!this.built || force || date.getFullYear() !== viewDate.year || date.getMonth() !== viewDate.month) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getDate() !== viewDate.date) {\n viewDate.date = picker.$date.getDate();\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1), firstDayOfMonthOffset = firstDayOfMonth.getTimezoneOffset();\n var firstDate = new Date(+firstDayOfMonth - mod(firstDayOfMonth.getDay() - options.startWeek, 7) * 864e5), firstDateOffset = firstDate.getTimezoneOffset();\n // Handle daylight time switch\n if(firstDateOffset !== firstDayOfMonthOffset) firstDate = new Date(+firstDate + (firstDateOffset - firstDayOfMonthOffset) * 60e3);\n var days = [], day;\n for(var i = 0; i < 42; i++) { // < 7 * 6\n day = new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + i);\n days.push({date: day, label: dateFilter(day, this.format), selected: picker.$date && this.isSelected(day), muted: day.getMonth() !== viewDate.month, disabled: this.isDisabled(day)});\n }\n scope.title = dateFilter(firstDayOfMonth, 'MMMM yyyy');\n scope.showLabels = true;\n scope.labels = weekDaysLabelsHtml;\n scope.rows = split(days, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth() && date.getDate() === picker.$date.getDate();\n },\n isDisabled: function(date) {\n var time = date.getTime();\n\n // Disabled because of min/max date.\n if (time < options.minDate || time > options.maxDate) return true;\n\n // Disabled because of disabled date range.\n if (options.disabledDateRanges) {\n for (var i = 0; i < options.disabledDateRanges.length; i++) {\n if (time >= options.disabledDateRanges[i].start) {\n if (time <= options.disabledDateRanges[i].end) return true;\n\n // The disabledDateRanges is expected to be sorted, so if time >= start,\n // we know it's not disabled.\n return false;\n }\n }\n }\n\n return false;\n },\n onKeyDown: function(evt) {\n var actualTime = picker.$date.getTime();\n var newDate;\n\n if(evt.keyCode === 37) newDate = new Date(actualTime - 1 * 864e5);\n else if(evt.keyCode === 38) newDate = new Date(actualTime - 7 * 864e5);\n else if(evt.keyCode === 39) newDate = new Date(actualTime + 1 * 864e5);\n else if(evt.keyCode === 40) newDate = new Date(actualTime + 7 * 864e5);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }, {\n name: 'month',\n format: 'MMM',\n split: 4,\n steps: { year: 1 },\n update: function(date, force) {\n if(!this.built || date.getFullYear() !== viewDate.year) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getMonth() !== viewDate.month) {\n angular.extend(viewDate, {month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstMonth = new Date(viewDate.year, 0, 1);\n var months = [], month;\n for (var i = 0; i < 12; i++) {\n month = new Date(viewDate.year, i, 1);\n months.push({date: month, label: dateFilter(month, this.format), selected: picker.$isSelected(month), disabled: this.isDisabled(month)});\n }\n scope.title = dateFilter(month, 'yyyy');\n scope.showLabels = false;\n scope.rows = split(months, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth();\n },\n isDisabled: function(date) {\n var lastDate = +new Date(date.getFullYear(), date.getMonth() + 1, 0);\n return lastDate < options.minDate || date.getTime() > options.maxDate;\n },\n onKeyDown: function(evt) {\n var actualMonth = picker.$date.getMonth();\n var newDate = new Date(picker.$date);\n\n if(evt.keyCode === 37) newDate.setMonth(actualMonth - 1);\n else if(evt.keyCode === 38) newDate.setMonth(actualMonth - 4);\n else if(evt.keyCode === 39) newDate.setMonth(actualMonth + 1);\n else if(evt.keyCode === 40) newDate.setMonth(actualMonth + 4);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }, {\n name: 'year',\n format: 'yyyy',\n split: 4,\n steps: { year: 12 },\n update: function(date, force) {\n if(!this.built || force || parseInt(date.getFullYear()/20, 10) !== parseInt(viewDate.year/20, 10)) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getFullYear() !== viewDate.year) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstYear = viewDate.year - viewDate.year % (this.split * 3);\n var years = [], year;\n for (var i = 0; i < 12; i++) {\n year = new Date(firstYear + i, 0, 1);\n years.push({date: year, label: dateFilter(year, this.format), selected: picker.$isSelected(year), disabled: this.isDisabled(year)});\n }\n scope.title = years[0].label + '-' + years[years.length - 1].label;\n scope.showLabels = false;\n scope.rows = split(years, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear();\n },\n isDisabled: function(date) {\n var lastDate = +new Date(date.getFullYear() + 1, 0, 0);\n return lastDate < options.minDate || date.getTime() > options.maxDate;\n },\n onKeyDown: function(evt) {\n var actualYear = picker.$date.getFullYear(),\n newDate = new Date(picker.$date);\n\n if(evt.keyCode === 37) newDate.setYear(actualYear - 1);\n else if(evt.keyCode === 38) newDate.setYear(actualYear - 4);\n else if(evt.keyCode === 39) newDate.setYear(actualYear + 1);\n else if(evt.keyCode === 40) newDate.setYear(actualYear + 4);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }];\n\n return {\n views: options.minView ? Array.prototype.slice.call(views, options.minView) : views,\n viewDate: viewDate\n };\n\n };\n\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"file":"datepicker.min.js","sources":["datepicker/datepicker.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","trigger","container","keyboard","html","delay","useNative","dateType","dateFormat","modelDateFormat","dayFormat","strictFormat","autoclose","minDate","Infinity","maxDate","startView","minView","startWeek","daysOfWeekDisabled","iconLeft","iconRight","$get","$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip","DatepickerFactory","element","controller","config","updateSelected","el","selected","$datepicker","$isSelected","date","focusElement","focus","extend","parentScope","scope","options","$options","$scope","pickerViews","$views","views","viewDate","$mode","$iconLeft","$iconRight","$picker","$select","select","$selectPane","value","$toggleMode","setMode","length","update","isDate","isNaN","getTime","$date","call","$build","updateDisabledDates","dateRanges","disabledDateRanges","i","l","rows","forEach","$setDisabledEl","keep","$dateValue","Date","$setViewValue","copy","$render","hide","year","getFullYear","month","getMonth","getDate","mode","pristine","built","build","$updateSelected","isSelected","disabled","isDisabled","steps","targetDate","UTC","day","getUTCFullYear","getUTCMonth","getUTCDate","$onMouseDown","evt","preventDefault","stopPropagation","isTouch","targetEl","target","nodeName","toLowerCase","parent","triggerHandler","$onKeyDown","test","keyCode","shiftKey","altKey","$apply","onKeyDown","$digest","_init","init","isNative","prop","css","attr","on","_destroy","destroy","off","_show","show","setTimeout","$element","_hide","blur","document","body","navigator","userAgent","lang","id","directive","$parse","$q","$dateParser","isNumeric","n","parseFloat","isFinite","restrict","require","link","normalizeDateRanges","ranges","key","isDefined","bsShow","$watch","newValue","datepicker","isString","match","$observe","today","substr","parseInt","ngModel","disabledDates","disabledRanges","previousValue","dateParser","format","strict","$parsers","unshift","viewValue","$setValidity","parsedDate","parse","isMinValid","isMaxValid","isValid","toISOString","$formatters","push","modelValue","isUndefined","NaN","val","$on","split","arr","size","arrays","splice","mod","m","daySplit","picker","weekDaysMin","DATETIME_FORMATS","SHORTDAY","weekDaysLabels","slice","concat","weekDaysLabelsHtml","trustAsHtml","join","startDate","getTimezoneOffset","force","firstDayOfMonth","firstDayOfMonthOffset","firstDate","getDay","firstDateOffset","days","label","muted","title","showLabels","labels","time","indexOf","start","end","newDate","actualTime","name","months","lastDate","actualMonth","setMonth","firstYear","years","actualYear","setYear","Array","prototype"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.datepicker', ['mgcrea.ngStrap.helpers.dateParser', 'mgcrea.ngStrap.tooltip'])\n\n .provider('$datepicker', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'datepicker',\n placement: 'bottom-left',\n template: 'datepicker/datepicker.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n // lang: $locale.id,\n useNative: false,\n dateType: 'date',\n dateFormat: 'shortDate',\n modelDateFormat: null,\n dayFormat: 'dd',\n strictFormat: false,\n autoclose: false,\n minDate: -Infinity,\n maxDate: +Infinity,\n startView: 0,\n minView: 0,\n startWeek: 0,\n daysOfWeekDisabled: '',\n iconLeft: 'glyphicon glyphicon-chevron-left',\n iconRight: 'glyphicon glyphicon-chevron-right'\n };\n\n this.$get = function($window, $document, $rootScope, $sce, $locale, dateFilter, datepickerViews, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var isTouch = ('createTouch' in $window.document) && isNative;\n if(!defaults.lang) defaults.lang = $locale.id;\n\n function DatepickerFactory(element, controller, config) {\n\n var $datepicker = $tooltip(element, angular.extend({}, defaults, config));\n var parentScope = config.scope;\n var options = $datepicker.$options;\n var scope = $datepicker.$scope;\n if(options.startView) options.startView -= options.minView;\n\n // View vars\n\n var pickerViews = datepickerViews($datepicker);\n $datepicker.$views = pickerViews.views;\n var viewDate = pickerViews.viewDate;\n scope.$mode = options.startView;\n scope.$iconLeft = options.iconLeft;\n scope.$iconRight = options.iconRight;\n var $picker = $datepicker.$views[scope.$mode];\n\n // Scope methods\n\n scope.$select = function(date) {\n $datepicker.select(date);\n };\n scope.$selectPane = function(value) {\n $datepicker.$selectPane(value);\n };\n scope.$toggleMode = function() {\n $datepicker.setMode((scope.$mode + 1) % $datepicker.$views.length);\n };\n\n // Public methods\n\n $datepicker.update = function(date) {\n // console.warn('$datepicker.update() newValue=%o', date);\n if(angular.isDate(date) && !isNaN(date.getTime())) {\n $datepicker.$date = date;\n $picker.update.call($picker, date);\n }\n // Build only if pristine\n $datepicker.$build(true);\n };\n\n $datepicker.updateDisabledDates = function(dateRanges) {\n options.disabledDateRanges = dateRanges;\n for(var i = 0, l = scope.rows.length; i < l; i++) {\n angular.forEach(scope.rows[i], $datepicker.$setDisabledEl);\n }\n };\n\n $datepicker.select = function(date, keep) {\n // console.warn('$datepicker.select', date, scope.$mode);\n if(!angular.isDate(controller.$dateValue)) controller.$dateValue = new Date(date);\n if(!scope.$mode || keep) {\n controller.$setViewValue(angular.copy(date));\n controller.$render();\n if(options.autoclose && !keep) {\n $datepicker.hide(true);\n }\n } else {\n angular.extend(viewDate, {year: date.getFullYear(), month: date.getMonth(), date: date.getDate()});\n $datepicker.setMode(scope.$mode - 1);\n $datepicker.$build();\n }\n };\n\n $datepicker.setMode = function(mode) {\n // console.warn('$datepicker.setMode', mode);\n scope.$mode = mode;\n $picker = $datepicker.$views[scope.$mode];\n $datepicker.$build();\n };\n\n // Protected methods\n\n $datepicker.$build = function(pristine) {\n // console.warn('$datepicker.$build() viewDate=%o', viewDate);\n if(pristine === true && $picker.built) return;\n if(pristine === false && !$picker.built) return;\n $picker.build.call($picker);\n };\n\n $datepicker.$updateSelected = function() {\n for(var i = 0, l = scope.rows.length; i < l; i++) {\n angular.forEach(scope.rows[i], updateSelected);\n }\n };\n\n $datepicker.$isSelected = function(date) {\n return $picker.isSelected(date);\n };\n\n $datepicker.$setDisabledEl = function(el) {\n el.disabled = $picker.isDisabled(el.date);\n };\n\n $datepicker.$selectPane = function(value) {\n var steps = $picker.steps;\n var targetDate = new Date(Date.UTC(viewDate.year + ((steps.year || 0) * value), viewDate.month + ((steps.month || 0) * value), viewDate.date + ((steps.day || 0) * value)));\n angular.extend(viewDate, {year: targetDate.getUTCFullYear(), month: targetDate.getUTCMonth(), date: targetDate.getUTCDate()});\n $datepicker.$build();\n };\n\n $datepicker.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n targetEl = targetEl.parent();\n }\n targetEl.triggerHandler('click');\n }\n };\n\n $datepicker.$onKeyDown = function(evt) {\n if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n if(evt.keyCode === 13) {\n if(!scope.$mode) {\n return $datepicker.hide(true);\n } else {\n return scope.$apply(function() { $datepicker.setMode(scope.$mode - 1); });\n }\n }\n\n // Navigate with keyboard\n $picker.onKeyDown(evt);\n parentScope.$digest();\n };\n\n // Private\n\n function updateSelected(el) {\n el.selected = $datepicker.$isSelected(el.date);\n }\n\n function focusElement() {\n element[0].focus();\n }\n\n // Overrides\n\n var _init = $datepicker.init;\n $datepicker.init = function() {\n if(isNative && options.useNative) {\n element.prop('type', 'date');\n element.css('-webkit-appearance', 'textfield');\n return;\n } else if(isTouch) {\n element.prop('type', 'text');\n element.attr('readonly', 'true');\n element.on('click', focusElement);\n }\n _init();\n };\n\n var _destroy = $datepicker.destroy;\n $datepicker.destroy = function() {\n if(isNative && options.useNative) {\n element.off('click', focusElement);\n }\n _destroy();\n };\n\n var _show = $datepicker.show;\n $datepicker.show = function() {\n _show();\n setTimeout(function() {\n $datepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $datepicker.$onKeyDown);\n }\n });\n };\n\n var _hide = $datepicker.hide;\n $datepicker.hide = function(blur) {\n $datepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $datepicker.$onKeyDown);\n }\n _hide(blur);\n };\n\n return $datepicker;\n\n }\n\n DatepickerFactory.defaults = defaults;\n return DatepickerFactory;\n\n };\n\n })\n\n .directive('bsDatepicker', function($window, $parse, $q, $locale, dateFilter, $datepicker, $dateParser, $timeout) {\n\n var defaults = $datepicker.defaults;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var isNumeric = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope, controller: controller};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'dateType', 'dateFormat', 'modelDateFormat', 'dayFormat', 'strictFormat', 'startWeek', 'startDate', 'useNative', 'lang', 'startView', 'minView', 'iconLeft', 'iconRight', 'daysOfWeekDisabled'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!datepicker || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = newValue.match(',?(datepicker),?');\n newValue === true ? datepicker.show() : datepicker.hide();\n });\n\n // Set expected iOS format\n if(isNative && options.useNative) options.dateFormat = 'yyyy-MM-dd';\n // Initialize datepicker\n var datepicker = $datepicker(element, controller, options);\n options = datepicker.$options;\n\n // Observe attributes for changes\n angular.forEach(['minDate', 'maxDate'], function(key) {\n // console.warn('attr.$observe(%s)', key, attr[key]);\n angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n // console.warn('attr.$observe(%s)=%o', key, newValue);\n if(newValue === 'today') {\n var today = new Date();\n datepicker.$options[key] = +new Date(today.getFullYear(), today.getMonth(), today.getDate() + (key === 'maxDate' ? 1 : 0), 0, 0, 0, (key === 'minDate' ? 0 : -1));\n } else if(angular.isString(newValue) && newValue.match(/^\".+\"$/)) { // Support {{ dateObj }}\n datepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));\n } else if(isNumeric(newValue)) {\n datepicker.$options[key] = +new Date(parseInt(newValue, 10));\n } else if (angular.isString(newValue) && 0 === newValue.length) { // Reset date\n datepicker.$options[key] = key === 'maxDate' ? +Infinity : -Infinity;\n } else {\n datepicker.$options[key] = +new Date(newValue);\n }\n // Build only if dirty\n !isNaN(datepicker.$options[key]) && datepicker.$build(false);\n });\n });\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n datepicker.update(controller.$dateValue);\n }, true);\n\n // Normalize undefined/null/empty array,\n // so that we don't treat changing from undefined->null as a change.\n function normalizeDateRanges(ranges) {\n if (!ranges || !ranges.length) return null;\n return ranges;\n }\n\n if (angular.isDefined(attr.disabledDates)) {\n scope.$watch(attr.disabledDates, function(disabledRanges, previousValue) {\n disabledRanges = normalizeDateRanges(disabledRanges);\n previousValue = normalizeDateRanges(previousValue);\n\n if (disabledRanges !== previousValue) {\n datepicker.updateDisabledDates(disabledRanges);\n }\n });\n }\n\n var dateParser = $dateParser({format: options.dateFormat, lang: options.lang, strict: options.strictFormat});\n\n // viewValue -> $parsers -> modelValue\n controller.$parsers.unshift(function(viewValue) {\n // console.warn('$parser(\"%s\"): viewValue=%o', element.attr('ng-model'), viewValue);\n // Null values should correctly reset the model value & validity\n if(!viewValue) {\n controller.$setValidity('date', true);\n return;\n }\n var parsedDate = dateParser.parse(viewValue, controller.$dateValue);\n if(!parsedDate || isNaN(parsedDate.getTime())) {\n controller.$setValidity('date', false);\n return;\n } else {\n var isMinValid = isNaN(datepicker.$options.minDate) || parsedDate.getTime() >= datepicker.$options.minDate;\n var isMaxValid = isNaN(datepicker.$options.maxDate) || parsedDate.getTime() <= datepicker.$options.maxDate;\n var isValid = isMinValid && isMaxValid;\n controller.$setValidity('date', isValid);\n controller.$setValidity('min', isMinValid);\n controller.$setValidity('max', isMaxValid);\n // Only update the model when we have a valid date\n if(isValid) controller.$dateValue = parsedDate;\n }\n if(options.dateType === 'string') {\n return dateFilter(parsedDate, options.modelDateFormat || options.dateFormat);\n } else if(options.dateType === 'number') {\n return controller.$dateValue.getTime();\n } else if(options.dateType === 'iso') {\n return controller.$dateValue.toISOString();\n } else {\n return new Date(controller.$dateValue);\n }\n });\n\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n var date;\n if(angular.isUndefined(modelValue) || modelValue === null) {\n date = NaN;\n } else if(angular.isDate(modelValue)) {\n date = modelValue;\n } else if(options.dateType === 'string') {\n date = dateParser.parse(modelValue, null, options.modelDateFormat);\n } else {\n date = new Date(modelValue);\n }\n // Setup default value?\n // if(isNaN(date.getTime())) {\n // var today = new Date();\n // date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0);\n // }\n controller.$dateValue = date;\n return controller.$dateValue;\n });\n\n // viewValue -> element\n controller.$render = function() {\n // console.warn('$render(\"%s\"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);\n element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.dateFormat));\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if(datepicker) datepicker.destroy();\n options = null;\n datepicker = null;\n });\n\n }\n };\n\n })\n\n .provider('datepickerViews', function() {\n\n var defaults = this.defaults = {\n dayFormat: 'dd',\n daySplit: 7\n };\n\n // Split array into smaller arrays\n function split(arr, size) {\n var arrays = [];\n while(arr.length > 0) {\n arrays.push(arr.splice(0, size));\n }\n return arrays;\n }\n\n // Modulus operator\n function mod(n, m) {\n return ((n % m) + m) % m;\n }\n\n this.$get = function($locale, $sce, dateFilter) {\n\n return function(picker) {\n\n var scope = picker.$scope;\n var options = picker.$options;\n\n var weekDaysMin = $locale.DATETIME_FORMATS.SHORTDAY;\n var weekDaysLabels = weekDaysMin.slice(options.startWeek).concat(weekDaysMin.slice(0, options.startWeek));\n var weekDaysLabelsHtml = $sce.trustAsHtml('' + weekDaysLabels.join(' ') + ' ');\n\n var startDate = picker.$date || (options.startDate ? new Date(options.startDate) : new Date());\n var viewDate = {year: startDate.getFullYear(), month: startDate.getMonth(), date: startDate.getDate()};\n var timezoneOffset = startDate.getTimezoneOffset() * 6e4;\n\n var views = [{\n format: options.dayFormat,\n split: 7,\n steps: { month: 1 },\n update: function(date, force) {\n if(!this.built || force || date.getFullYear() !== viewDate.year || date.getMonth() !== viewDate.month) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getDate() !== viewDate.date) {\n viewDate.date = picker.$date.getDate();\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1), firstDayOfMonthOffset = firstDayOfMonth.getTimezoneOffset();\n var firstDate = new Date(+firstDayOfMonth - mod(firstDayOfMonth.getDay() - options.startWeek, 7) * 864e5), firstDateOffset = firstDate.getTimezoneOffset();\n // Handle daylight time switch\n if(firstDateOffset !== firstDayOfMonthOffset) firstDate = new Date(+firstDate + (firstDateOffset - firstDayOfMonthOffset) * 60e3);\n var days = [], day;\n for(var i = 0; i < 42; i++) { // < 7 * 6\n day = new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + i);\n days.push({date: day, label: dateFilter(day, this.format), selected: picker.$date && this.isSelected(day), muted: day.getMonth() !== viewDate.month, disabled: this.isDisabled(day)});\n }\n scope.title = dateFilter(firstDayOfMonth, 'MMMM yyyy');\n scope.showLabels = true;\n scope.labels = weekDaysLabelsHtml;\n scope.rows = split(days, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth() && date.getDate() === picker.$date.getDate();\n },\n isDisabled: function(date) {\n var time = date.getTime();\n\n // Disabled because of min/max date.\n if (time < options.minDate || time > options.maxDate) return true;\n\n // Disabled due to being a disabled day of the week\n if (options.daysOfWeekDisabled.indexOf(date.getDay()) !== -1) return true;\n\n // Disabled because of disabled date range.\n if (options.disabledDateRanges) {\n for (var i = 0; i < options.disabledDateRanges.length; i++) {\n if (time >= options.disabledDateRanges[i].start) {\n if (time <= options.disabledDateRanges[i].end) return true;\n\n // The disabledDateRanges is expected to be sorted, so if time >= start,\n // we know it's not disabled.\n return false;\n }\n }\n }\n\n return false;\n },\n onKeyDown: function(evt) {\n var actualTime = picker.$date.getTime();\n var newDate;\n\n if(evt.keyCode === 37) newDate = new Date(actualTime - 1 * 864e5);\n else if(evt.keyCode === 38) newDate = new Date(actualTime - 7 * 864e5);\n else if(evt.keyCode === 39) newDate = new Date(actualTime + 1 * 864e5);\n else if(evt.keyCode === 40) newDate = new Date(actualTime + 7 * 864e5);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }, {\n name: 'month',\n format: 'MMM',\n split: 4,\n steps: { year: 1 },\n update: function(date, force) {\n if(!this.built || date.getFullYear() !== viewDate.year) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getMonth() !== viewDate.month) {\n angular.extend(viewDate, {month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstMonth = new Date(viewDate.year, 0, 1);\n var months = [], month;\n for (var i = 0; i < 12; i++) {\n month = new Date(viewDate.year, i, 1);\n months.push({date: month, label: dateFilter(month, this.format), selected: picker.$isSelected(month), disabled: this.isDisabled(month)});\n }\n scope.title = dateFilter(month, 'yyyy');\n scope.showLabels = false;\n scope.rows = split(months, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth();\n },\n isDisabled: function(date) {\n var lastDate = +new Date(date.getFullYear(), date.getMonth() + 1, 0);\n return lastDate < options.minDate || date.getTime() > options.maxDate;\n },\n onKeyDown: function(evt) {\n var actualMonth = picker.$date.getMonth();\n var newDate = new Date(picker.$date);\n\n if(evt.keyCode === 37) newDate.setMonth(actualMonth - 1);\n else if(evt.keyCode === 38) newDate.setMonth(actualMonth - 4);\n else if(evt.keyCode === 39) newDate.setMonth(actualMonth + 1);\n else if(evt.keyCode === 40) newDate.setMonth(actualMonth + 4);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }, {\n name: 'year',\n format: 'yyyy',\n split: 4,\n steps: { year: 12 },\n update: function(date, force) {\n if(!this.built || force || parseInt(date.getFullYear()/20, 10) !== parseInt(viewDate.year/20, 10)) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getFullYear() !== viewDate.year) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstYear = viewDate.year - viewDate.year % (this.split * 3);\n var years = [], year;\n for (var i = 0; i < 12; i++) {\n year = new Date(firstYear + i, 0, 1);\n years.push({date: year, label: dateFilter(year, this.format), selected: picker.$isSelected(year), disabled: this.isDisabled(year)});\n }\n scope.title = years[0].label + '-' + years[years.length - 1].label;\n scope.showLabels = false;\n scope.rows = split(years, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear();\n },\n isDisabled: function(date) {\n var lastDate = +new Date(date.getFullYear() + 1, 0, 0);\n return lastDate < options.minDate || date.getTime() > options.maxDate;\n },\n onKeyDown: function(evt) {\n var actualYear = picker.$date.getFullYear(),\n newDate = new Date(picker.$date);\n\n if(evt.keyCode === 37) newDate.setYear(actualYear - 1);\n else if(evt.keyCode === 38) newDate.setYear(actualYear - 4);\n else if(evt.keyCode === 39) newDate.setYear(actualYear + 1);\n else if(evt.keyCode === 40) newDate.setYear(actualYear + 4);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }];\n\n return {\n views: options.minView ? Array.prototype.slice.call(views, options.minView) : views,\n viewDate: viewDate\n };\n\n };\n\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/modules/datepicker.tpl.js b/dist/modules/datepicker.tpl.js
index 6f765c615..11156348e 100644
--- a/dist/modules/datepicker.tpl.js
+++ b/dist/modules/datepicker.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/datepicker.tpl.min.js b/dist/modules/datepicker.tpl.min.js
index 38a406910..006fdcfa9 100644
--- a/dist/modules/datepicker.tpl.min.js
+++ b/dist/modules/datepicker.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/debounce.js b/dist/modules/debounce.js
index ea215f380..9b6383637 100644
--- a/dist/modules/debounce.js
+++ b/dist/modules/debounce.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/debounce.min.js b/dist/modules/debounce.min.js
index 065a346e6..2037e646a 100644
--- a/dist/modules/debounce.min.js
+++ b/dist/modules/debounce.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/dimensions.js b/dist/modules/dimensions.js
index 58fd2cbce..0aa6506f5 100644
--- a/dist/modules/dimensions.js
+++ b/dist/modules/dimensions.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/dimensions.min.js b/dist/modules/dimensions.min.js
index f403eb0a4..37b71a528 100644
--- a/dist/modules/dimensions.min.js
+++ b/dist/modules/dimensions.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/dropdown.js b/dist/modules/dropdown.js
index a950be286..3943ded93 100644
--- a/dist/modules/dropdown.js
+++ b/dist/modules/dropdown.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -31,6 +31,7 @@ angular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip']).provider('
var options = angular.extend({}, defaults, config);
var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new();
$dropdown = $tooltip(element, options);
+ var parentEl = element.parent();
// Protected methods
$dropdown.$onKeyDown = function (evt) {
if (!/(38|40)/.test(evt.keyCode))
@@ -63,13 +64,13 @@ angular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip']).provider('
options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);
bodyEl.on('click', onBodyClick);
});
- $dropdown.$element.parent().toggleClass('open');
+ parentEl.hasClass('dropdown') && parentEl.addClass('open');
};
var hide = $dropdown.hide;
$dropdown.hide = function () {
options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);
bodyEl.off('click', onBodyClick);
- $dropdown.$element.parent().toggleClass('open');
+ parentEl.hasClass('dropdown') && parentEl.removeClass('open');
hide();
};
// Private functions
diff --git a/dist/modules/dropdown.min.js b/dist/modules/dropdown.min.js
index 695684ee2..7bf44b880 100644
--- a/dist/modules/dropdown.min.js
+++ b/dist/modules/dropdown.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.dropdown",["mgcrea.ngStrap.tooltip"]).provider("$dropdown",function(){var e=this.defaults={animation:"am-fade",prefixClass:"dropdown",placement:"bottom-left",template:"dropdown/dropdown.tpl.html",trigger:"click",container:!1,keyboard:!0,html:!1,delay:0};this.$get=["$window","$rootScope","$tooltip",function(o,t,n){function r(o,r){function c(e){return e.target!==o[0]?e.target!==o[0]&&i.hide():void 0}{var i={},d=angular.extend({},e,r);i.$scope=d.scope&&d.scope.$new()||t.$new()}i=n(o,d),i.$onKeyDown=function(e){if(/(38|40)/.test(e.keyCode)){e.preventDefault(),e.stopPropagation();var o=angular.element(i.$element[0].querySelectorAll("li:not(.divider) a"));if(o.length){var t;angular.forEach(o,function(e,o){l&&l.call(e,":focus")&&(t=o)}),38===e.keyCode&&t>0?t--:40===e.keyCode&&t0?t--:40===e.keyCode&&t 0) index--;\n else if(evt.keyCode === 40 && index < items.length - 1) index++;\n else if(angular.isUndefined(index)) index = 0;\n items.eq(index)[0].focus();\n\n };\n\n // Overrides\n\n var show = $dropdown.show;\n $dropdown.show = function() {\n show();\n setTimeout(function() {\n options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);\n bodyEl.on('click', onBodyClick);\n });\n $dropdown.$element.parent().toggleClass('open');\n };\n\n var hide = $dropdown.hide;\n $dropdown.hide = function() {\n options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);\n bodyEl.off('click', onBodyClick);\n $dropdown.$element.parent().toggleClass('open');\n hide();\n };\n\n // Private functions\n\n function onBodyClick(evt) {\n if(evt.target === element[0]) return;\n return evt.target !== element[0] && $dropdown.hide();\n }\n\n return $dropdown;\n\n }\n\n return DropdownFactory;\n\n };\n\n })\n\n .directive('bsDropdown', function($window, $location, $sce, $dropdown) {\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as an object\n attr.bsDropdown && scope.$watch(attr.bsDropdown, function(newValue, oldValue) {\n scope.content = newValue;\n }, true);\n\n // Initialize dropdown\n var dropdown = $dropdown(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n dropdown.destroy();\n options = null;\n dropdown = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"file":"dropdown.min.js","sources":["dropdown/dropdown.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","trigger","container","keyboard","html","delay","$get","$window","$rootScope","$tooltip","DropdownFactory","element","config","onBodyClick","evt","target","$dropdown","hide","options","extend","$scope","scope","$new","parentEl","parent","$onKeyDown","test","keyCode","preventDefault","stopPropagation","items","$element","querySelectorAll","length","index","forEach","el","i","matchesSelector","call","isUndefined","eq","focus","show","setTimeout","on","bodyEl","hasClass","addClass","off","removeClass","document","body","Element","prototype","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","directive","$location","$sce","restrict","link","attr","key","isDefined","bsDropdown","$watch","newValue","content","dropdown","$on","destroy"],"mappings":"AAOA,YACAA,SAAQC,OAAO,2BAA4B,2BAA2BC,SAAS,YAAa,WAC1F,GAAIC,GAAWC,KAAKD,UAChBE,UAAW,UACXC,YAAa,WACbC,UAAW,cACXC,SAAU,6BACVC,QAAS,QACTC,WAAW,EACXC,UAAU,EACVC,MAAM,EACNC,MAAO,EAEXT,MAAKU,MACH,UACA,aACA,WACA,SAAUC,EAASC,EAAYC,GAG7B,QAASC,GAAgBC,EAASC,GAiDhC,QAASC,GAAYC,GACnB,MAAIA,GAAIC,SAAWJ,EAAQ,GAEpBG,EAAIC,SAAWJ,EAAQ,IAAMK,EAAUC,OAF9C,OAjDF,CAAA,GAAID,MAEAE,EAAU1B,QAAQ2B,UAAWxB,EAAUiB,EAC/BI,GAAUI,OAASF,EAAQG,OAASH,EAAQG,MAAMC,QAAUd,EAAWc,OACnFN,EAAYP,EAASE,EAASO,EAC9B,IAAIK,GAAWZ,EAAQa,QAEvBR,GAAUS,WAAa,SAAUX,GAC/B,GAAK,UAAUY,KAAKZ,EAAIa,SAAxB,CAEAb,EAAIc,iBACJd,EAAIe,iBAEJ,IAAIC,GAAQtC,QAAQmB,QAAQK,EAAUe,SAAS,GAAGC,iBAAiB,sBACnE,IAAKF,EAAMG,OAAX,CAEA,GAAIC,EACJ1C,SAAQ2C,QAAQL,EAAO,SAAUM,EAAIC,GAC/BC,GAAmBA,EAAgBC,KAAKH,EAAI,YAC9CF,EAAQG,KAGQ,KAAhBvB,EAAIa,SAAkBO,EAAQ,EAChCA,IACuB,KAAhBpB,EAAIa,SAAkBO,EAAQJ,EAAMG,OAAS,EACpDC,IACO1C,QAAQgD,YAAYN,KAC3BA,EAAQ,GACVJ,EAAMW,GAAGP,GAAO,GAAGQ,UAGrB,IAAIC,GAAO3B,EAAU2B,IACrB3B,GAAU2B,KAAO,WACfA,IACAC,WAAW,WACT1B,EAAQf,UAAYa,EAAUe,SAASc,GAAG,UAAW7B,EAAUS,YAC/DqB,EAAOD,GAAG,QAAShC,KAErBU,EAASwB,SAAS,aAAexB,EAASyB,SAAS,QAErD,IAAI/B,GAAOD,EAAUC,IAarB,OAZAD,GAAUC,KAAO,WACfC,EAAQf,UAAYa,EAAUe,SAASkB,IAAI,UAAWjC,EAAUS,YAChEqB,EAAOG,IAAI,QAASpC,GACpBU,EAASwB,SAAS,aAAexB,EAAS2B,YAAY,QACtDjC,KAQKD,EAxDT,GAAI8B,GAAStD,QAAQmB,QAAQJ,EAAQ4C,SAASC,MAC1Cd,EAAkBe,QAAQC,UAAUhB,iBAAmBe,QAAQC,UAAUC,uBAAyBF,QAAQC,UAAUE,oBAAsBH,QAAQC,UAAUG,mBAAqBJ,QAAQC,UAAUI,gBAyDvM,OAAOhD,OAGViD,UAAU,cACX,UACA,YACA,OACA,YACA,SAAUpD,EAASqD,EAAWC,EAAM7C,GAClC,OACE8C,SAAU,MACVzC,OAAO,EACP0C,KAAM,SAAkB1C,EAAOV,EAASqD,GAEtC,GAAI9C,IAAYG,MAAOA,EACvB7B,SAAQ2C,SACN,YACA,YACA,QACA,UACA,WACA,OACA,YACA,YACC,SAAU8B,GACPzE,QAAQ0E,UAAUF,EAAKC,MACzB/C,EAAQ+C,GAAOD,EAAKC,MAGxBD,EAAKG,YAAc9C,EAAM+C,OAAOJ,EAAKG,WAAY,SAAUE,GACzDhD,EAAMiD,QAAUD,IACf,EAEH,IAAIE,GAAWvD,EAAUL,EAASO,EAElCG,GAAMmD,IAAI,WAAY,WACpBD,EAASE,UACTvD,EAAU,KACVqD,EAAW","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip'])\n\n .provider('$dropdown', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'dropdown',\n placement: 'bottom-left',\n template: 'dropdown/dropdown.tpl.html',\n trigger: 'click',\n container: false,\n keyboard: true,\n html: false,\n delay: 0\n };\n\n this.$get = function($window, $rootScope, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n var matchesSelector = Element.prototype.matchesSelector || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector;\n\n function DropdownFactory(element, config) {\n\n var $dropdown = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n\n $dropdown = $tooltip(element, options);\n var parentEl = element.parent();\n\n // Protected methods\n\n $dropdown.$onKeyDown = function(evt) {\n if (!/(38|40)/.test(evt.keyCode)) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n // Retrieve focused index\n var items = angular.element($dropdown.$element[0].querySelectorAll('li:not(.divider) a'));\n if(!items.length) return;\n var index;\n angular.forEach(items, function(el, i) {\n if(matchesSelector && matchesSelector.call(el, ':focus')) index = i;\n });\n\n // Navigate with keyboard\n if(evt.keyCode === 38 && index > 0) index--;\n else if(evt.keyCode === 40 && index < items.length - 1) index++;\n else if(angular.isUndefined(index)) index = 0;\n items.eq(index)[0].focus();\n\n };\n\n // Overrides\n\n var show = $dropdown.show;\n $dropdown.show = function() {\n show();\n setTimeout(function() {\n options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);\n bodyEl.on('click', onBodyClick);\n });\n parentEl.hasClass('dropdown') && parentEl.addClass('open');\n };\n\n var hide = $dropdown.hide;\n $dropdown.hide = function() {\n options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);\n bodyEl.off('click', onBodyClick);\n parentEl.hasClass('dropdown') && parentEl.removeClass('open');\n hide();\n };\n\n // Private functions\n\n function onBodyClick(evt) {\n if(evt.target === element[0]) return;\n return evt.target !== element[0] && $dropdown.hide();\n }\n\n return $dropdown;\n\n }\n\n return DropdownFactory;\n\n };\n\n })\n\n .directive('bsDropdown', function($window, $location, $sce, $dropdown) {\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as an object\n attr.bsDropdown && scope.$watch(attr.bsDropdown, function(newValue, oldValue) {\n scope.content = newValue;\n }, true);\n\n // Initialize dropdown\n var dropdown = $dropdown(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n dropdown.destroy();\n options = null;\n dropdown = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/modules/dropdown.tpl.js b/dist/modules/dropdown.tpl.js
index fc94ec7dd..51f51dcdc 100644
--- a/dist/modules/dropdown.tpl.js
+++ b/dist/modules/dropdown.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/dropdown.tpl.min.js b/dist/modules/dropdown.tpl.min.js
index 462539a61..48cecac21 100644
--- a/dist/modules/dropdown.tpl.min.js
+++ b/dist/modules/dropdown.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/modal.js b/dist/modules/modal.js
index 7b0e65b8d..d307e2747 100644
--- a/dist/modules/modal.js
+++ b/dist/modules/modal.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/modal.min.js b/dist/modules/modal.min.js
index fd64a18cc..ab3cb9ad3 100644
--- a/dist/modules/modal.min.js
+++ b/dist/modules/modal.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/modal.tpl.js b/dist/modules/modal.tpl.js
index 06792fda9..f797c3843 100644
--- a/dist/modules/modal.tpl.js
+++ b/dist/modules/modal.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/modal.tpl.min.js b/dist/modules/modal.tpl.min.js
index 927380eae..d1a6f0fb6 100644
--- a/dist/modules/modal.tpl.min.js
+++ b/dist/modules/modal.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/navbar.js b/dist/modules/navbar.js
index 7ed02c4cd..0df7c0eba 100644
--- a/dist/modules/navbar.js
+++ b/dist/modules/navbar.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/navbar.min.js b/dist/modules/navbar.min.js
index 8a03432c3..0c5940aa3 100644
--- a/dist/modules/navbar.min.js
+++ b/dist/modules/navbar.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/parse-options.js b/dist/modules/parse-options.js
index 08c57bc83..448816d66 100644
--- a/dist/modules/parse-options.js
+++ b/dist/modules/parse-options.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/parse-options.min.js b/dist/modules/parse-options.min.js
index b16a113b2..6fb4d2087 100644
--- a/dist/modules/parse-options.min.js
+++ b/dist/modules/parse-options.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/popover.js b/dist/modules/popover.js
index edaca655d..0f30ce827 100644
--- a/dist/modules/popover.js
+++ b/dist/modules/popover.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -9,6 +9,7 @@
angular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip']).provider('$popover', function () {
var defaults = this.defaults = {
animation: 'am-fade',
+ customClass: '',
container: false,
target: false,
placement: 'right',
@@ -60,7 +61,8 @@ angular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip']).provider('$
'trigger',
'keyboard',
'html',
- 'animation'
+ 'animation',
+ 'customClass'
], function (key) {
if (angular.isDefined(attr[key]))
options[key] = attr[key];
diff --git a/dist/modules/popover.min.js b/dist/modules/popover.min.js
index 7235ca4b0..d4adb500c 100644
--- a/dist/modules/popover.min.js
+++ b/dist/modules/popover.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.popover",["mgcrea.ngStrap.tooltip"]).provider("$popover",function(){var t=this.defaults={animation:"am-fade",container:!1,target:!1,placement:"right",template:"popover/popover.tpl.html",contentTemplate:!1,trigger:"click",keyboard:!0,html:!1,title:"",content:"",delay:0};this.$get=["$tooltip",function(e){function n(n,o){var a=angular.extend({},t,o),r=e(n,a);return a.content&&(r.$scope.content=a.content),r}return n}]}).directive("bsPopover",["$window","$location","$sce","$popover",function(t,e,n,o){var a=t.requestAnimationFrame||t.setTimeout;return{restrict:"EAC",scope:!0,link:function(t,e,r){var i={scope:t};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation"],function(t){angular.isDefined(r[t])&&(i[t]=r[t])}),angular.forEach(["title","content"],function(e){r[e]&&r.$observe(e,function(o,r){t[e]=n.trustAsHtml(o),angular.isDefined(r)&&a(function(){c&&c.$applyPlacement()})})}),r.bsPopover&&t.$watch(r.bsPopover,function(e,n){angular.isObject(e)?angular.extend(t,e):t.content=e,angular.isDefined(n)&&a(function(){c&&c.$applyPlacement()})},!0),r.bsShow&&t.$watch(r.bsShow,function(t){c&&angular.isDefined(t)&&(angular.isString(t)&&(t=t.match(",?(popover),?")),t===!0?c.show():c.hide())});var c=o(e,i);t.$on("$destroy",function(){c.destroy(),i=null,c=null})}}}]);
+"use strict";angular.module("mgcrea.ngStrap.popover",["mgcrea.ngStrap.tooltip"]).provider("$popover",function(){var t=this.defaults={animation:"am-fade",customClass:"",container:!1,target:!1,placement:"right",template:"popover/popover.tpl.html",contentTemplate:!1,trigger:"click",keyboard:!0,html:!1,title:"",content:"",delay:0};this.$get=["$tooltip",function(e){function n(n,o){var a=angular.extend({},t,o),r=e(n,a);return a.content&&(r.$scope.content=a.content),r}return n}]}).directive("bsPopover",["$window","$location","$sce","$popover",function(t,e,n,o){var a=t.requestAnimationFrame||t.setTimeout;return{restrict:"EAC",scope:!0,link:function(t,e,r){var i={scope:t};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","customClass"],function(t){angular.isDefined(r[t])&&(i[t]=r[t])}),angular.forEach(["title","content"],function(e){r[e]&&r.$observe(e,function(o,r){t[e]=n.trustAsHtml(o),angular.isDefined(r)&&a(function(){c&&c.$applyPlacement()})})}),r.bsPopover&&t.$watch(r.bsPopover,function(e,n){angular.isObject(e)?angular.extend(t,e):t.content=e,angular.isDefined(n)&&a(function(){c&&c.$applyPlacement()})},!0),r.bsShow&&t.$watch(r.bsShow,function(t){c&&angular.isDefined(t)&&(angular.isString(t)&&(t=t.match(",?(popover),?")),t===!0?c.show():c.hide())});var c=o(e,i);t.$on("$destroy",function(){c.destroy(),i=null,c=null})}}}]);
//# sourceMappingURL=popover.min.js.map
\ No newline at end of file
diff --git a/dist/modules/popover.min.js.map b/dist/modules/popover.min.js.map
index fea0e0a3d..0cfe72904 100755
--- a/dist/modules/popover.min.js.map
+++ b/dist/modules/popover.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"popover.min.js","sources":["popover/popover.js"],"names":["angular","module","provider","defaults","this","animation","container","target","placement","template","contentTemplate","trigger","keyboard","html","title","content","delay","$get","$tooltip","PopoverFactory","element","config","options","extend","$popover","$scope","directive","$window","$location","$sce","requestAnimationFrame","setTimeout","restrict","scope","link","attr","forEach","key","isDefined","$observe","newValue","oldValue","trustAsHtml","popover","$applyPlacement","bsPopover","$watch","isObject","bsShow","isString","match","show","hide","$on","destroy"],"mappings":"AAOA,YACAA,SAAQC,OAAO,0BAA2B,2BAA2BC,SAAS,WAAY,WACxF,GAAIC,GAAWC,KAAKD,UAChBE,UAAW,UACXC,WAAW,EACXC,QAAQ,EACRC,UAAW,QACXC,SAAU,2BACVC,iBAAiB,EACjBC,QAAS,QACTC,UAAU,EACVC,MAAM,EACNC,MAAO,GACPC,QAAS,GACTC,MAAO,EAEXZ,MAAKa,MACH,WACA,SAAUC,GACR,QAASC,GAAeC,EAASC,GAE/B,GAAIC,GAAUtB,QAAQuB,UAAWpB,EAAUkB,GACvCG,EAAWN,EAASE,EAASE,EAKjC,OAHIA,GAAQP,UACVS,EAASC,OAAOV,QAAUO,EAAQP,SAE7BS,EAET,MAAOL,OAGVO,UAAU,aACX,UACA,YACA,OACA,WACA,SAAUC,EAASC,EAAWC,EAAML,GAClC,GAAIM,GAAwBH,EAAQG,uBAAyBH,EAAQI,UACrE,QACEC,SAAU,MACVC,OAAO,EACPC,KAAM,SAAkBD,EAAOb,EAASe,GAEtC,GAAIb,IAAYW,MAAOA,EACvBjC,SAAQoC,SACN,WACA,kBACA,YACA,YACA,SACA,QACA,UACA,WACA,OACA,aACC,SAAUC,GACPrC,QAAQsC,UAAUH,EAAKE,MACzBf,EAAQe,GAAOF,EAAKE,MAGxBrC,QAAQoC,SACN,QACA,WACC,SAAUC,GACXF,EAAKE,IAAQF,EAAKI,SAASF,EAAK,SAAUG,EAAUC,GAClDR,EAAMI,GAAOR,EAAKa,YAAYF,GAC9BxC,QAAQsC,UAAUG,IAAaX,EAAsB,WACnDa,GAAWA,EAAQC,wBAKzBT,EAAKU,WAAaZ,EAAMa,OAAOX,EAAKU,UAAW,SAAUL,EAAUC,GAC7DzC,QAAQ+C,SAASP,GACnBxC,QAAQuB,OAAOU,EAAOO,GAEtBP,EAAMlB,QAAUyB,EAElBxC,QAAQsC,UAAUG,IAAaX,EAAsB,WACnDa,GAAWA,EAAQC,sBAEpB,GAEHT,EAAKa,QAAUf,EAAMa,OAAOX,EAAKa,OAAQ,SAAUR,GAC5CG,GAAY3C,QAAQsC,UAAUE,KAE/BxC,QAAQiD,SAAST,KACnBA,EAAWA,EAASU,MAAM,kBAC5BV,KAAa,EAAOG,EAAQQ,OAASR,EAAQS,SAG/C,IAAIT,GAAUnB,EAASJ,EAASE,EAEhCW,GAAMoB,IAAI,WAAY,WACpBV,EAAQW,UACRhC,EAAU,KACVqB,EAAU","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip'])\n\n .provider('$popover', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n container: false,\n target: false,\n placement: 'right',\n template: 'popover/popover.tpl.html',\n contentTemplate: false,\n trigger: 'click',\n keyboard: true,\n html: false,\n title: '',\n content: '',\n delay: 0\n };\n\n this.$get = function($tooltip) {\n\n function PopoverFactory(element, config) {\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n var $popover = $tooltip(element, options);\n\n // Support scope as string options [/*title, */content]\n if(options.content) {\n $popover.$scope.content = options.content;\n }\n\n return $popover;\n\n }\n\n return PopoverFactory;\n\n };\n\n })\n\n .directive('bsPopover', function($window, $location, $sce, $popover) {\n\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as data-attrs\n angular.forEach(['title', 'content'], function(key) {\n attr[key] && attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n angular.isDefined(oldValue) && requestAnimationFrame(function() {\n popover && popover.$applyPlacement();\n });\n });\n });\n\n // Support scope as an object\n attr.bsPopover && scope.$watch(attr.bsPopover, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.content = newValue;\n }\n angular.isDefined(oldValue) && requestAnimationFrame(function() {\n popover && popover.$applyPlacement();\n });\n }, true);\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!popover || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = newValue.match(',?(popover),?');\n newValue === true ? popover.show() : popover.hide();\n });\n\n // Initialize popover\n var popover = $popover(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n popover.destroy();\n options = null;\n popover = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"file":"popover.min.js","sources":["popover/popover.js"],"names":["angular","module","provider","defaults","this","animation","customClass","container","target","placement","template","contentTemplate","trigger","keyboard","html","title","content","delay","$get","$tooltip","PopoverFactory","element","config","options","extend","$popover","$scope","directive","$window","$location","$sce","requestAnimationFrame","setTimeout","restrict","scope","link","attr","forEach","key","isDefined","$observe","newValue","oldValue","trustAsHtml","popover","$applyPlacement","bsPopover","$watch","isObject","bsShow","isString","match","show","hide","$on","destroy"],"mappings":"AAOA,YACAA,SAAQC,OAAO,0BAA2B,2BAA2BC,SAAS,WAAY,WACxF,GAAIC,GAAWC,KAAKD,UAChBE,UAAW,UACXC,YAAa,GACbC,WAAW,EACXC,QAAQ,EACRC,UAAW,QACXC,SAAU,2BACVC,iBAAiB,EACjBC,QAAS,QACTC,UAAU,EACVC,MAAM,EACNC,MAAO,GACPC,QAAS,GACTC,MAAO,EAEXb,MAAKc,MACH,WACA,SAAUC,GACR,QAASC,GAAeC,EAASC,GAE/B,GAAIC,GAAUvB,QAAQwB,UAAWrB,EAAUmB,GACvCG,EAAWN,EAASE,EAASE,EAKjC,OAHIA,GAAQP,UACVS,EAASC,OAAOV,QAAUO,EAAQP,SAE7BS,EAET,MAAOL,OAGVO,UAAU,aACX,UACA,YACA,OACA,WACA,SAAUC,EAASC,EAAWC,EAAML,GAClC,GAAIM,GAAwBH,EAAQG,uBAAyBH,EAAQI,UACrE,QACEC,SAAU,MACVC,OAAO,EACPC,KAAM,SAAkBD,EAAOb,EAASe,GAEtC,GAAIb,IAAYW,MAAOA,EACvBlC,SAAQqC,SACN,WACA,kBACA,YACA,YACA,SACA,QACA,UACA,WACA,OACA,YACA,eACC,SAAUC,GACPtC,QAAQuC,UAAUH,EAAKE,MACzBf,EAAQe,GAAOF,EAAKE,MAGxBtC,QAAQqC,SACN,QACA,WACC,SAAUC,GACXF,EAAKE,IAAQF,EAAKI,SAASF,EAAK,SAAUG,EAAUC,GAClDR,EAAMI,GAAOR,EAAKa,YAAYF,GAC9BzC,QAAQuC,UAAUG,IAAaX,EAAsB,WACnDa,GAAWA,EAAQC,wBAKzBT,EAAKU,WAAaZ,EAAMa,OAAOX,EAAKU,UAAW,SAAUL,EAAUC,GAC7D1C,QAAQgD,SAASP,GACnBzC,QAAQwB,OAAOU,EAAOO,GAEtBP,EAAMlB,QAAUyB,EAElBzC,QAAQuC,UAAUG,IAAaX,EAAsB,WACnDa,GAAWA,EAAQC,sBAEpB,GAEHT,EAAKa,QAAUf,EAAMa,OAAOX,EAAKa,OAAQ,SAAUR,GAC5CG,GAAY5C,QAAQuC,UAAUE,KAE/BzC,QAAQkD,SAAST,KACnBA,EAAWA,EAASU,MAAM,kBAC5BV,KAAa,EAAOG,EAAQQ,OAASR,EAAQS,SAG/C,IAAIT,GAAUnB,EAASJ,EAASE,EAEhCW,GAAMoB,IAAI,WAAY,WACpBV,EAAQW,UACRhC,EAAU,KACVqB,EAAU","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip'])\n\n .provider('$popover', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n customClass: '',\n container: false,\n target: false,\n placement: 'right',\n template: 'popover/popover.tpl.html',\n contentTemplate: false,\n trigger: 'click',\n keyboard: true,\n html: false,\n title: '',\n content: '',\n delay: 0\n };\n\n this.$get = function($tooltip) {\n\n function PopoverFactory(element, config) {\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n var $popover = $tooltip(element, options);\n\n // Support scope as string options [/*title, */content]\n if(options.content) {\n $popover.$scope.content = options.content;\n }\n\n return $popover;\n\n }\n\n return PopoverFactory;\n\n };\n\n })\n\n .directive('bsPopover', function($window, $location, $sce, $popover) {\n\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'customClass'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as data-attrs\n angular.forEach(['title', 'content'], function(key) {\n attr[key] && attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n angular.isDefined(oldValue) && requestAnimationFrame(function() {\n popover && popover.$applyPlacement();\n });\n });\n });\n\n // Support scope as an object\n attr.bsPopover && scope.$watch(attr.bsPopover, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.content = newValue;\n }\n angular.isDefined(oldValue) && requestAnimationFrame(function() {\n popover && popover.$applyPlacement();\n });\n }, true);\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!popover || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = newValue.match(',?(popover),?');\n newValue === true ? popover.show() : popover.hide();\n });\n\n // Initialize popover\n var popover = $popover(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n popover.destroy();\n options = null;\n popover = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/modules/popover.tpl.js b/dist/modules/popover.tpl.js
index 0292650d5..85efb7b53 100644
--- a/dist/modules/popover.tpl.js
+++ b/dist/modules/popover.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/popover.tpl.min.js b/dist/modules/popover.tpl.min.js
index ae17ba96c..571ccbe52 100644
--- a/dist/modules/popover.tpl.min.js
+++ b/dist/modules/popover.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/raf.js b/dist/modules/raf.js
index 12ddcea7c..bc66016ed 100644
--- a/dist/modules/raf.js
+++ b/dist/modules/raf.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/raf.min.js b/dist/modules/raf.min.js
index aca9d4468..fc7018edd 100644
--- a/dist/modules/raf.min.js
+++ b/dist/modules/raf.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/scrollspy.js b/dist/modules/scrollspy.js
index ab6e84f44..2970c6bcb 100644
--- a/dist/modules/scrollspy.js
+++ b/dist/modules/scrollspy.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/scrollspy.min.js b/dist/modules/scrollspy.min.js
index dee3633cf..bde073688 100644
--- a/dist/modules/scrollspy.min.js
+++ b/dist/modules/scrollspy.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/select.js b/dist/modules/select.js
index d6335facc..dc6d8db24 100644
--- a/dist/modules/select.js
+++ b/dist/modules/select.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -37,7 +37,8 @@ angular.module('mgcrea.ngStrap.select', [
'$tooltip',
function ($window, $document, $rootScope, $tooltip) {
var bodyEl = angular.element($window.document.body);
- var isTouch = 'createTouch' in $window.document;
+ var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
+ var isTouch = 'createTouch' in $window.document && isNative;
function SelectFactory(element, controller, config) {
var $select = {};
// Common vars
diff --git a/dist/modules/select.min.js b/dist/modules/select.min.js
index b758c7f02..efabe92dd 100644
--- a/dist/modules/select.min.js
+++ b/dist/modules/select.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.select",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$select",function(){var e=this.defaults={animation:"am-fade",prefixClass:"select",prefixEvent:"$select",placement:"bottom-left",template:"select/select.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,allNoneButtons:!1,sort:!0,caretHtml:' ',placeholder:"Choose among the following...",maxLength:3,maxLengthHtml:"selected",iconCheckmark:"glyphicon glyphicon-ok"};this.$get=["$window","$document","$rootScope","$tooltip",function(t,n,a,i){function l(t,n,a){var l={},c=angular.extend({},e,a);l=i(t,c);var r=l.$scope;r.$matches=[],r.$activeIndex=0,r.$isMultiple=c.multiple,r.$showAllNoneButtons=c.allNoneButtons&&c.multiple,r.$iconCheckmark=c.iconCheckmark,r.$activate=function(e){r.$$postDigest(function(){l.activate(e)})},r.$select=function(e){r.$$postDigest(function(){l.select(e)})},r.$isVisible=function(){return l.$isVisible()},r.$isActive=function(e){return l.$isActive(e)},r.$selectAll=function(){for(var e=0;e=r.$matches.length&&(r.$activeIndex=c.multiple?[]:0)},l.$isVisible=function(){return c.minLength&&n?r.$matches.length&&n.$viewValue.length>=c.minLength:r.$matches.length},l.$isActive=function(e){return c.multiple?-1!==r.$activeIndex.indexOf(e):r.$activeIndex===e},l.$getIndex=function(e){var t=r.$matches.length,n=t;if(t){for(n=t;n--&&r.$matches[n].value!==e;);if(!(0>n))return n}},l.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),o){var t=angular.element(e.target);t.triggerHandler("click")}},l.$onKeyDown=function(e){if(/(9|13|38|40)/.test(e.keyCode)){if(e.preventDefault(),e.stopPropagation(),!c.multiple&&(13===e.keyCode||9===e.keyCode))return l.select(r.$activeIndex);38===e.keyCode&&r.$activeIndex>0?r.$activeIndex--:40===e.keyCode&&r.$activeIndex'),r.after(t)}var u=i(n.ngOptions),s=a(t,o,c),$=u.$match[7].replace(/\|.+/,"").trim();e.$watch($,function(){u.valuesFn(e,o).then(function(e){s.update(e),o.$render()})},!0),e.$watch(n.ngModel,function(){s.$updateActiveIndex(),o.$render()},!0),o.$render=function(){var e,a;c.multiple&&angular.isArray(o.$modelValue)?(e=o.$modelValue.map(function(e){return a=s.$getIndex(e),angular.isDefined(a)?s.$scope.$matches[a].label:!1}).filter(angular.isDefined),e=e.length>(c.maxLength||l.maxLength)?e.length+" "+(c.maxLengthHtml||l.maxLengthHtml):e.join(", ")):(a=s.$getIndex(o.$modelValue),e=angular.isDefined(a)?s.$scope.$matches[a].label:!1),t.html((e?e:n.placeholder||l.placeholder)+l.caretHtml)},e.$on("$destroy",function(){s.destroy(),c=null,s=null})}}}]);
+"use strict";angular.module("mgcrea.ngStrap.select",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$select",function(){var e=this.defaults={animation:"am-fade",prefixClass:"select",prefixEvent:"$select",placement:"bottom-left",template:"select/select.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,allNoneButtons:!1,sort:!0,caretHtml:' ',placeholder:"Choose among the following...",maxLength:3,maxLengthHtml:"selected",iconCheckmark:"glyphicon glyphicon-ok"};this.$get=["$window","$document","$rootScope","$tooltip",function(t,n,a,i){function l(t,n,a){var l={},o=angular.extend({},e,a);l=i(t,o);var r=l.$scope;r.$matches=[],r.$activeIndex=0,r.$isMultiple=o.multiple,r.$showAllNoneButtons=o.allNoneButtons&&o.multiple,r.$iconCheckmark=o.iconCheckmark,r.$activate=function(e){r.$$postDigest(function(){l.activate(e)})},r.$select=function(e){r.$$postDigest(function(){l.select(e)})},r.$isVisible=function(){return l.$isVisible()},r.$isActive=function(e){return l.$isActive(e)},r.$selectAll=function(){for(var e=0;e=r.$matches.length&&(r.$activeIndex=o.multiple?[]:0)},l.$isVisible=function(){return o.minLength&&n?r.$matches.length&&n.$viewValue.length>=o.minLength:r.$matches.length},l.$isActive=function(e){return o.multiple?-1!==r.$activeIndex.indexOf(e):r.$activeIndex===e},l.$getIndex=function(e){var t=r.$matches.length,n=t;if(t){for(n=t;n--&&r.$matches[n].value!==e;);if(!(0>n))return n}},l.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),c){var t=angular.element(e.target);t.triggerHandler("click")}},l.$onKeyDown=function(e){if(/(9|13|38|40)/.test(e.keyCode)){if(e.preventDefault(),e.stopPropagation(),!o.multiple&&(13===e.keyCode||9===e.keyCode))return l.select(r.$activeIndex);38===e.keyCode&&r.$activeIndex>0?r.$activeIndex--:40===e.keyCode&&r.$activeIndex'),r.after(t)}var s=i(n.ngOptions),u=a(t,o,c),$=s.$match[7].replace(/\|.+/,"").trim();e.$watch($,function(){s.valuesFn(e,o).then(function(e){u.update(e),o.$render()})},!0),e.$watch(n.ngModel,function(){u.$updateActiveIndex(),o.$render()},!0),o.$render=function(){var e,a;c.multiple&&angular.isArray(o.$modelValue)?(e=o.$modelValue.map(function(e){return a=u.$getIndex(e),angular.isDefined(a)?u.$scope.$matches[a].label:!1}).filter(angular.isDefined),e=e.length>(c.maxLength||l.maxLength)?e.length+" "+(c.maxLengthHtml||l.maxLengthHtml):e.join(", ")):(a=u.$getIndex(o.$modelValue),e=angular.isDefined(a)?u.$scope.$matches[a].label:!1),t.html((e?e:n.placeholder||l.placeholder)+l.caretHtml)},e.$on("$destroy",function(){u.destroy(),c=null,u=null})}}}]);
//# sourceMappingURL=select.min.js.map
\ No newline at end of file
diff --git a/dist/modules/select.min.js.map b/dist/modules/select.min.js.map
index 9d728904c..5571d5ef3 100755
--- a/dist/modules/select.min.js.map
+++ b/dist/modules/select.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"select.min.js","sources":["select/select.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","prefixEvent","placement","template","trigger","container","keyboard","html","delay","multiple","allNoneButtons","sort","caretHtml","placeholder","maxLength","maxLengthHtml","iconCheckmark","$get","$window","$document","$rootScope","$tooltip","SelectFactory","element","controller","config","$select","options","extend","scope","$scope","$matches","$activeIndex","$isMultiple","$showAllNoneButtons","$iconCheckmark","$activate","index","$$postDigest","activate","select","$isVisible","$isActive","$selectAll","i","length","$selectNone","update","matches","$updateActiveIndex","splice","indexOf","push","value","$apply","$setViewValue","map","hide","$emit","$modelValue","isArray","$getIndex","minLength","$viewValue","l","$onMouseDown","evt","preventDefault","stopPropagation","isTouch","targetEl","target","triggerHandler","$onKeyDown","test","keyCode","isUndefined","$digest","_show","show","$element","addClass","setTimeout","on","_hide","off","document","body","directive","$parse","$q","$parseOptions","restrict","require","link","attr","forEach","key","isDefined","nodeName","toLowerCase","inputEl","css","after","parsedOptions","ngOptions","watchedOptions","$match","replace","trim","$watch","valuesFn","then","values","$render","ngModel","selected","label","filter","join","$on","destroy"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.select', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions'])\n\n .provider('$select', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'select',\n prefixEvent: '$select',\n placement: 'bottom-left',\n template: 'select/select.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n multiple: false,\n allNoneButtons: false,\n sort: true,\n caretHtml: ' ',\n placeholder: 'Choose among the following...',\n maxLength: 3,\n maxLengthHtml: 'selected',\n iconCheckmark: 'glyphicon glyphicon-ok'\n };\n\n this.$get = function($window, $document, $rootScope, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n var isTouch = 'createTouch' in $window.document;\n\n function SelectFactory(element, controller, config) {\n\n var $select = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $select = $tooltip(element, options);\n var scope = $select.$scope;\n\n scope.$matches = [];\n scope.$activeIndex = 0;\n scope.$isMultiple = options.multiple;\n scope.$showAllNoneButtons = options.allNoneButtons && options.multiple;\n scope.$iconCheckmark = options.iconCheckmark;\n\n scope.$activate = function(index) {\n scope.$$postDigest(function() {\n $select.activate(index);\n });\n };\n\n scope.$select = function(index, evt) {\n scope.$$postDigest(function() {\n $select.select(index);\n });\n };\n\n scope.$isVisible = function() {\n return $select.$isVisible();\n };\n\n scope.$isActive = function(index) {\n return $select.$isActive(index);\n };\n \n scope.$selectAll = function () {\n for (var i = 0; i < scope.$matches.length; i++) {\n if (!scope.$isActive(i)) {\n scope.$select(i);\n }\n }\n };\n \n scope.$selectNone = function () {\n for (var i = 0; i < scope.$matches.length; i++) {\n if (scope.$isActive(i)) {\n scope.$select(i);\n }\n }\n };\n\n // Public methods\n\n $select.update = function(matches) {\n scope.$matches = matches;\n $select.$updateActiveIndex();\n };\n\n $select.activate = function(index) {\n if(options.multiple) {\n scope.$activeIndex.sort();\n $select.$isActive(index) ? scope.$activeIndex.splice(scope.$activeIndex.indexOf(index), 1) : scope.$activeIndex.push(index);\n if(options.sort) scope.$activeIndex.sort();\n } else {\n scope.$activeIndex = index;\n }\n return scope.$activeIndex;\n };\n\n $select.select = function(index) {\n var value = scope.$matches[index].value;\n scope.$apply(function() {\n $select.activate(index);\n if(options.multiple) {\n controller.$setViewValue(scope.$activeIndex.map(function(index) {\n return scope.$matches[index].value;\n }));\n } else {\n controller.$setViewValue(value);\n // Hide if single select\n $select.hide();\n }\n });\n // Emit event\n scope.$emit(options.prefixEvent + '.select', value, index);\n };\n\n // Protected methods\n\n $select.$updateActiveIndex = function() {\n if(controller.$modelValue && scope.$matches.length) {\n if(options.multiple && angular.isArray(controller.$modelValue)) {\n scope.$activeIndex = controller.$modelValue.map(function(value) {\n return $select.$getIndex(value);\n });\n } else {\n scope.$activeIndex = $select.$getIndex(controller.$modelValue);\n }\n } else if(scope.$activeIndex >= scope.$matches.length) {\n scope.$activeIndex = options.multiple ? [] : 0;\n }\n };\n\n $select.$isVisible = function() {\n if(!options.minLength || !controller) {\n return scope.$matches.length;\n }\n // minLength support\n return scope.$matches.length && controller.$viewValue.length >= options.minLength;\n };\n\n $select.$isActive = function(index) {\n if(options.multiple) {\n return scope.$activeIndex.indexOf(index) !== -1;\n } else {\n return scope.$activeIndex === index;\n }\n };\n\n $select.$getIndex = function(value) {\n var l = scope.$matches.length, i = l;\n if(!l) return;\n for(i = l; i--;) {\n if(scope.$matches[i].value === value) break;\n }\n if(i < 0) return;\n return i;\n };\n\n $select.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n targetEl.triggerHandler('click');\n }\n };\n\n $select.$onKeyDown = function(evt) {\n if (!/(9|13|38|40)/.test(evt.keyCode)) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n // Select with enter\n if(!options.multiple && (evt.keyCode === 13 || evt.keyCode === 9)) {\n return $select.select(scope.$activeIndex);\n }\n\n // Navigate with keyboard\n if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--;\n else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;\n else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;\n scope.$digest();\n };\n\n // Overrides\n\n var _show = $select.show;\n $select.show = function() {\n _show();\n if(options.multiple) {\n $select.$element.addClass('select-multiple');\n }\n setTimeout(function() {\n $select.$element.on(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $select.$onKeyDown);\n }\n });\n };\n\n var _hide = $select.hide;\n $select.hide = function() {\n $select.$element.off(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $select.$onKeyDown);\n }\n _hide(true);\n };\n\n return $select;\n\n }\n\n SelectFactory.defaults = defaults;\n return SelectFactory;\n\n };\n\n })\n\n .directive('bsSelect', function($window, $parse, $q, $select, $parseOptions) {\n\n var defaults = $select.defaults;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'placeholder', 'multiple', 'allNoneButtons', 'maxLength', 'maxLengthHtml'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Add support for select markup\n if(element[0].nodeName.toLowerCase() === 'select') {\n var inputEl = element;\n inputEl.css('display', 'none');\n element = angular.element(' ');\n inputEl.after(element);\n }\n\n // Build proper ngOptions\n var parsedOptions = $parseOptions(attr.ngOptions);\n\n // Initialize select\n var select = $select(element, controller, options);\n\n // Watch ngOptions values before filtering for changes\n var watchedOptions = parsedOptions.$match[7].replace(/\\|.+/, '').trim();\n scope.$watch(watchedOptions, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);\n parsedOptions.valuesFn(scope, controller)\n .then(function(values) {\n select.update(values);\n controller.$render();\n });\n }, true);\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue);\n select.$updateActiveIndex();\n controller.$render();\n }, true);\n\n // Model rendering in view\n controller.$render = function () {\n // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n var selected, index;\n if(options.multiple && angular.isArray(controller.$modelValue)) {\n selected = controller.$modelValue.map(function(value) {\n index = select.$getIndex(value);\n return angular.isDefined(index) ? select.$scope.$matches[index].label : false;\n }).filter(angular.isDefined);\n if(selected.length > (options.maxLength || defaults.maxLength)) {\n selected = selected.length + ' ' + (options.maxLengthHtml || defaults.maxLengthHtml);\n } else {\n selected = selected.join(', ');\n }\n } else {\n index = select.$getIndex(controller.$modelValue);\n selected = angular.isDefined(index) ? select.$scope.$matches[index].label : false;\n }\n element.html((selected ? selected : attr.placeholder || defaults.placeholder) + defaults.caretHtml);\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n select.destroy();\n options = null;\n select = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"file":"select.min.js","sources":["select/select.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","prefixEvent","placement","template","trigger","container","keyboard","html","delay","multiple","allNoneButtons","sort","caretHtml","placeholder","maxLength","maxLengthHtml","iconCheckmark","$get","$window","$document","$rootScope","$tooltip","SelectFactory","element","controller","config","$select","options","extend","scope","$scope","$matches","$activeIndex","$isMultiple","$showAllNoneButtons","$iconCheckmark","$activate","index","$$postDigest","activate","select","$isVisible","$isActive","$selectAll","i","length","$selectNone","update","matches","$updateActiveIndex","splice","indexOf","push","value","$apply","$setViewValue","map","hide","$emit","$modelValue","isArray","$getIndex","minLength","$viewValue","l","$onMouseDown","evt","preventDefault","stopPropagation","isTouch","targetEl","target","triggerHandler","$onKeyDown","test","keyCode","isUndefined","$digest","_show","show","$element","addClass","setTimeout","on","_hide","off","isNative","document","body","navigator","userAgent","directive","$parse","$q","$parseOptions","restrict","require","link","attr","forEach","key","isDefined","nodeName","toLowerCase","inputEl","css","after","parsedOptions","ngOptions","watchedOptions","$match","replace","trim","$watch","valuesFn","then","values","$render","ngModel","selected","label","filter","join","$on","destroy"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.select', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions'])\n\n .provider('$select', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'select',\n prefixEvent: '$select',\n placement: 'bottom-left',\n template: 'select/select.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n multiple: false,\n allNoneButtons: false,\n sort: true,\n caretHtml: ' ',\n placeholder: 'Choose among the following...',\n maxLength: 3,\n maxLengthHtml: 'selected',\n iconCheckmark: 'glyphicon glyphicon-ok'\n };\n\n this.$get = function($window, $document, $rootScope, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var isTouch = ('createTouch' in $window.document) && isNative;\n\n function SelectFactory(element, controller, config) {\n\n var $select = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $select = $tooltip(element, options);\n var scope = $select.$scope;\n\n scope.$matches = [];\n scope.$activeIndex = 0;\n scope.$isMultiple = options.multiple;\n scope.$showAllNoneButtons = options.allNoneButtons && options.multiple;\n scope.$iconCheckmark = options.iconCheckmark;\n\n scope.$activate = function(index) {\n scope.$$postDigest(function() {\n $select.activate(index);\n });\n };\n\n scope.$select = function(index, evt) {\n scope.$$postDigest(function() {\n $select.select(index);\n });\n };\n\n scope.$isVisible = function() {\n return $select.$isVisible();\n };\n\n scope.$isActive = function(index) {\n return $select.$isActive(index);\n };\n\n scope.$selectAll = function () {\n for (var i = 0; i < scope.$matches.length; i++) {\n if (!scope.$isActive(i)) {\n scope.$select(i);\n }\n }\n };\n\n scope.$selectNone = function () {\n for (var i = 0; i < scope.$matches.length; i++) {\n if (scope.$isActive(i)) {\n scope.$select(i);\n }\n }\n };\n\n // Public methods\n\n $select.update = function(matches) {\n scope.$matches = matches;\n $select.$updateActiveIndex();\n };\n\n $select.activate = function(index) {\n if(options.multiple) {\n scope.$activeIndex.sort();\n $select.$isActive(index) ? scope.$activeIndex.splice(scope.$activeIndex.indexOf(index), 1) : scope.$activeIndex.push(index);\n if(options.sort) scope.$activeIndex.sort();\n } else {\n scope.$activeIndex = index;\n }\n return scope.$activeIndex;\n };\n\n $select.select = function(index) {\n var value = scope.$matches[index].value;\n scope.$apply(function() {\n $select.activate(index);\n if(options.multiple) {\n controller.$setViewValue(scope.$activeIndex.map(function(index) {\n return scope.$matches[index].value;\n }));\n } else {\n controller.$setViewValue(value);\n // Hide if single select\n $select.hide();\n }\n });\n // Emit event\n scope.$emit(options.prefixEvent + '.select', value, index);\n };\n\n // Protected methods\n\n $select.$updateActiveIndex = function() {\n if(controller.$modelValue && scope.$matches.length) {\n if(options.multiple && angular.isArray(controller.$modelValue)) {\n scope.$activeIndex = controller.$modelValue.map(function(value) {\n return $select.$getIndex(value);\n });\n } else {\n scope.$activeIndex = $select.$getIndex(controller.$modelValue);\n }\n } else if(scope.$activeIndex >= scope.$matches.length) {\n scope.$activeIndex = options.multiple ? [] : 0;\n }\n };\n\n $select.$isVisible = function() {\n if(!options.minLength || !controller) {\n return scope.$matches.length;\n }\n // minLength support\n return scope.$matches.length && controller.$viewValue.length >= options.minLength;\n };\n\n $select.$isActive = function(index) {\n if(options.multiple) {\n return scope.$activeIndex.indexOf(index) !== -1;\n } else {\n return scope.$activeIndex === index;\n }\n };\n\n $select.$getIndex = function(value) {\n var l = scope.$matches.length, i = l;\n if(!l) return;\n for(i = l; i--;) {\n if(scope.$matches[i].value === value) break;\n }\n if(i < 0) return;\n return i;\n };\n\n $select.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n targetEl.triggerHandler('click');\n }\n };\n\n $select.$onKeyDown = function(evt) {\n if (!/(9|13|38|40)/.test(evt.keyCode)) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n // Select with enter\n if(!options.multiple && (evt.keyCode === 13 || evt.keyCode === 9)) {\n return $select.select(scope.$activeIndex);\n }\n\n // Navigate with keyboard\n if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--;\n else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;\n else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;\n scope.$digest();\n };\n\n // Overrides\n\n var _show = $select.show;\n $select.show = function() {\n _show();\n if(options.multiple) {\n $select.$element.addClass('select-multiple');\n }\n setTimeout(function() {\n $select.$element.on(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $select.$onKeyDown);\n }\n });\n };\n\n var _hide = $select.hide;\n $select.hide = function() {\n $select.$element.off(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $select.$onKeyDown);\n }\n _hide(true);\n };\n\n return $select;\n\n }\n\n SelectFactory.defaults = defaults;\n return SelectFactory;\n\n };\n\n })\n\n .directive('bsSelect', function($window, $parse, $q, $select, $parseOptions) {\n\n var defaults = $select.defaults;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'placeholder', 'multiple', 'allNoneButtons', 'maxLength', 'maxLengthHtml'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Add support for select markup\n if(element[0].nodeName.toLowerCase() === 'select') {\n var inputEl = element;\n inputEl.css('display', 'none');\n element = angular.element(' ');\n inputEl.after(element);\n }\n\n // Build proper ngOptions\n var parsedOptions = $parseOptions(attr.ngOptions);\n\n // Initialize select\n var select = $select(element, controller, options);\n\n // Watch ngOptions values before filtering for changes\n var watchedOptions = parsedOptions.$match[7].replace(/\\|.+/, '').trim();\n scope.$watch(watchedOptions, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);\n parsedOptions.valuesFn(scope, controller)\n .then(function(values) {\n select.update(values);\n controller.$render();\n });\n }, true);\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue);\n select.$updateActiveIndex();\n controller.$render();\n }, true);\n\n // Model rendering in view\n controller.$render = function () {\n // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n var selected, index;\n if(options.multiple && angular.isArray(controller.$modelValue)) {\n selected = controller.$modelValue.map(function(value) {\n index = select.$getIndex(value);\n return angular.isDefined(index) ? select.$scope.$matches[index].label : false;\n }).filter(angular.isDefined);\n if(selected.length > (options.maxLength || defaults.maxLength)) {\n selected = selected.length + ' ' + (options.maxLengthHtml || defaults.maxLengthHtml);\n } else {\n selected = selected.join(', ');\n }\n } else {\n index = select.$getIndex(controller.$modelValue);\n selected = angular.isDefined(index) ? select.$scope.$matches[index].label : false;\n }\n element.html((selected ? selected : attr.placeholder || defaults.placeholder) + defaults.caretHtml);\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n select.destroy();\n options = null;\n select = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/modules/select.tpl.js b/dist/modules/select.tpl.js
index ab93c17fa..774981b1a 100644
--- a/dist/modules/select.tpl.js
+++ b/dist/modules/select.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/select.tpl.min.js b/dist/modules/select.tpl.min.js
index 2cbe140e3..3b75f173a 100644
--- a/dist/modules/select.tpl.min.js
+++ b/dist/modules/select.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/tab.js b/dist/modules/tab.js
index 11daad838..9d03e6df4 100644
--- a/dist/modules/tab.js
+++ b/dist/modules/tab.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/tab.min.js b/dist/modules/tab.min.js
index 2d6fcbe9c..c4e569876 100644
--- a/dist/modules/tab.min.js
+++ b/dist/modules/tab.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/tab.tpl.js b/dist/modules/tab.tpl.js
index 368fcc58b..cbacfc691 100644
--- a/dist/modules/tab.tpl.js
+++ b/dist/modules/tab.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/tab.tpl.min.js b/dist/modules/tab.tpl.min.js
index d7c70d8cd..ea3df348f 100644
--- a/dist/modules/tab.tpl.min.js
+++ b/dist/modules/tab.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/timepicker.js b/dist/modules/timepicker.js
index 7b097da63..ddf00626b 100644
--- a/dist/modules/timepicker.js
+++ b/dist/modules/timepicker.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -31,7 +31,8 @@ angular.module('mgcrea.ngStrap.timepicker', [
hourStep: 1,
minuteStep: 5,
iconUp: 'glyphicon glyphicon-chevron-up',
- iconDown: 'glyphicon glyphicon-chevron-down'
+ iconDown: 'glyphicon glyphicon-chevron-down',
+ arrowBehavior: 'pager'
};
this.$get = [
'$window',
@@ -43,8 +44,8 @@ angular.module('mgcrea.ngStrap.timepicker', [
'$tooltip',
function ($window, $document, $rootScope, $sce, $locale, dateFilter, $tooltip) {
var bodyEl = angular.element($window.document.body);
- var isTouch = 'createTouch' in $window.document;
var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
+ var isTouch = 'createTouch' in $window.document && isNative;
if (!defaults.lang)
defaults.lang = $locale.id;
function timepickerFactory(element, controller, config) {
@@ -169,6 +170,25 @@ angular.module('mgcrea.ngStrap.timepicker', [
}
return selectedTime < options.minTime * 1 || selectedTime > options.maxTime * 1;
};
+ scope.$arrowAction = function (value, index) {
+ if (options.arrowBehavior === 'picker') {
+ $timepicker.$setTimeByStep(value, index);
+ } else {
+ $timepicker.$moveIndex(value, index);
+ }
+ };
+ $timepicker.$setTimeByStep = function (value, index) {
+ var newDate = new Date($timepicker.$date);
+ var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;
+ var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;
+ if (index === 0) {
+ newDate.setHours(hours - parseInt(options.hourStep, 10) * value);
+ } else {
+ newDate.setMinutes(minutes - parseInt(options.minuteStep, 10) * value);
+ }
+ $timepicker.select(newDate, index, true);
+ parentScope.$digest();
+ };
$timepicker.$moveIndex = function (value, index) {
var targetDate;
if (index === 0) {
@@ -351,7 +371,8 @@ angular.module('mgcrea.ngStrap.timepicker', [
'useNative',
'hourStep',
'minuteStep',
- 'length'
+ 'length',
+ 'arrowBehavior'
], function (key) {
if (angular.isDefined(attr[key]))
options[key] = attr[key];
diff --git a/dist/modules/timepicker.min.js b/dist/modules/timepicker.min.js
index c2c5296fa..d0684cb3a 100644
--- a/dist/modules/timepicker.min.js
+++ b/dist/modules/timepicker.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.timepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$timepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"timepicker",placement:"bottom-left",template:"timepicker/timepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!0,timeType:"date",timeFormat:"shortTime",modelTimeFormat:null,autoclose:!1,minTime:-1/0,maxTime:+1/0,length:5,hourStep:1,minuteStep:5,iconUp:"glyphicon glyphicon-chevron-up",iconDown:"glyphicon glyphicon-chevron-down"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","$tooltip",function(t,n,a,i,o,r,u){function s(t,n,a){function i(e,n){if(t[0].createTextRange){var a=t[0].createTextRange();a.collapse(!0),a.moveStart("character",e),a.moveEnd("character",n),a.select()}else t[0].setSelectionRange?t[0].setSelectionRange(e,n):angular.isUndefined(t[0].selectionStart)&&(t[0].selectionStart=e,t[0].selectionEnd=n)}function s(){t[0].focus()}var c=u(t,angular.extend({},e,a)),m=a.scope,g=c.$options,$=c.$scope,p=0,h=n.$dateValue||new Date,f={hour:h.getHours(),meridian:h.getHours()<12,minute:h.getMinutes(),second:h.getSeconds(),millisecond:h.getMilliseconds()},w=o.DATETIME_FORMATS[g.timeFormat]||g.timeFormat,v=/(h+)([:\.])?(m+)[ ]?(a?)/i.exec(w).slice(1);$.$iconUp=g.iconUp,$.$iconDown=g.iconDown,$.$select=function(e,t){c.select(e,t)},$.$moveIndex=function(e,t){c.$moveIndex(e,t)},$.$switchMeridian=function(e){c.switchMeridian(e)},c.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())?(c.$date=e,angular.extend(f,{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}),c.$build()):c.$isBuilt||c.$build()},c.select=function(e,t,a){(!n.$dateValue||isNaN(n.$dateValue.getTime()))&&(n.$dateValue=new Date(1970,0,1)),angular.isDate(e)||(e=new Date(e)),0===t?n.$dateValue.setHours(e.getHours()):1===t&&n.$dateValue.setMinutes(e.getMinutes()),n.$setViewValue(n.$dateValue),n.$render(),g.autoclose&&!a&&c.hide(!0)},c.switchMeridian=function(e){var t=(e||n.$dateValue).getHours();n.$dateValue.setHours(12>t?t+12:t-12),n.$setViewValue(n.$dateValue),n.$render()},c.$build=function(){var e,t,n=$.midIndex=parseInt(g.length/2,10),a=[];for(e=0;e1*g.maxTime},c.$moveIndex=function(e,t){var n;0===t?(n=new Date(1970,0,1,f.hour+e*g.length,f.minute),angular.extend(f,{hour:n.getHours()})):1===t&&(n=new Date(1970,0,1,f.hour,f.minute+e*g.length*g.minuteStep),angular.extend(f,{minute:n.getMinutes()})),c.$build()},c.$onMouseDown=function(e){if("input"!==e.target.nodeName.toLowerCase()&&e.preventDefault(),e.stopPropagation(),l){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},c.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return c.hide(!0);var t=new Date(c.$date),n=t.getHours(),a=r(t,"h").length,o=t.getMinutes(),u=r(t,"mm").length,s=/(37|39)/.test(e.keyCode),l=2+1*!!v[3];s&&(37===e.keyCode?p=1>p?l-1:p-1:39===e.keyCode&&(p=l-1>p?p+1:0));var d=[0,a];0===p?(38===e.keyCode?t.setHours(n-parseInt(g.hourStep,10)):40===e.keyCode&&t.setHours(n+parseInt(g.hourStep,10)),d=[0,a]):1===p?(38===e.keyCode?t.setMinutes(o-parseInt(g.minuteStep,10)):40===e.keyCode&&t.setMinutes(o+parseInt(g.minuteStep,10)),d=[a+1,a+1+u]):2===p&&(s||c.switchMeridian(),d=[a+1+u+1,a+1+u+3]),c.select(t,p,!0),i(d[0],d[1]),m.$digest()}};var y=c.init;c.init=function(){return d&&g.useNative?(t.prop("type","time"),void t.css("-webkit-appearance","textfield")):(l&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",s)),void y())};var T=c.destroy;c.destroy=function(){d&&g.useNative&&t.off("click",s),T()};var D=c.show;c.show=function(){D(),setTimeout(function(){c.$element.on(l?"touchstart":"mousedown",c.$onMouseDown),g.keyboard&&t.on("keydown",c.$onKeyDown)})};var S=c.hide;return c.hide=function(e){c.$element.off(l?"touchstart":"mousedown",c.$onMouseDown),g.keyboard&&t.off("keydown",c.$onKeyDown),S(e)},c}var l=(angular.element(t.document.body),"createTouch"in t.document),d=/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent);return e.lang||(e.lang=o.id),s.defaults=e,s}]}).directive("bsTimepicker",["$window","$parse","$q","$locale","dateFilter","$timepicker","$dateParser","$timeout",function(e,t,n,a,i,o,r){{var u=o.defaults,s=/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent);e.requestAnimationFrame||e.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(e,t,n,a){var l={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","timeType","timeFormat","modelTimeFormat","useNative","hourStep","minuteStep","length"],function(e){angular.isDefined(n[e])&&(l[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){d&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(timepicker),?")),e===!0?d.show():d.hide())}),s&&(l.useNative||u.useNative)&&(l.timeFormat="HH:mm");var d=o(t,a,l);l=d.$options;var c=r({format:l.timeFormat,lang:l.lang});angular.forEach(["minTime","maxTime"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){d.$options[e]="now"===t?(new Date).setFullYear(1970,0,1):angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):c.parse(t,new Date(1970,0,1,0)),!isNaN(d.$options[e])&&d.$build()})}),e.$watch(n.ngModel,function(){d.update(a.$dateValue)},!0),a.$parsers.unshift(function(e){if(!e)return void a.$setValidity("date",!0);var t=c.parse(e,a.$dateValue);if(!t||isNaN(t.getTime()))a.$setValidity("date",!1);else{var n=t.getTime()>=l.minTime&&t.getTime()<=l.maxTime;a.$setValidity("date",n),n&&(a.$dateValue=t)}return"string"===l.timeType?i(t,l.modelTimeFormat||l.timeFormat):"number"===l.timeType?a.$dateValue.getTime():"iso"===l.timeType?a.$dateValue.toISOString():new Date(a.$dateValue)}),a.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===l.timeType?c.parse(e,null,l.modelTimeFormat):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":i(a.$dateValue,l.timeFormat))},e.$on("$destroy",function(){d.destroy(),l=null,d=null})}}}]);
+"use strict";angular.module("mgcrea.ngStrap.timepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$timepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"timepicker",placement:"bottom-left",template:"timepicker/timepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!0,timeType:"date",timeFormat:"shortTime",modelTimeFormat:null,autoclose:!1,minTime:-1/0,maxTime:+1/0,length:5,hourStep:1,minuteStep:5,iconUp:"glyphicon glyphicon-chevron-up",iconDown:"glyphicon glyphicon-chevron-down",arrowBehavior:"pager"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","$tooltip",function(t,n,a,i,o,r,u){function s(t,n,a){function i(e,n){if(t[0].createTextRange){var a=t[0].createTextRange();a.collapse(!0),a.moveStart("character",e),a.moveEnd("character",n),a.select()}else t[0].setSelectionRange?t[0].setSelectionRange(e,n):angular.isUndefined(t[0].selectionStart)&&(t[0].selectionStart=e,t[0].selectionEnd=n)}function s(){t[0].focus()}var m=u(t,angular.extend({},e,a)),c=a.scope,g=m.$options,p=m.$scope,$=0,h=n.$dateValue||new Date,f={hour:h.getHours(),meridian:h.getHours()<12,minute:h.getMinutes(),second:h.getSeconds(),millisecond:h.getMilliseconds()},w=o.DATETIME_FORMATS[g.timeFormat]||g.timeFormat,v=/(h+)([:\.])?(m+)[ ]?(a?)/i.exec(w).slice(1);p.$iconUp=g.iconUp,p.$iconDown=g.iconDown,p.$select=function(e,t){m.select(e,t)},p.$moveIndex=function(e,t){m.$moveIndex(e,t)},p.$switchMeridian=function(e){m.switchMeridian(e)},m.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())?(m.$date=e,angular.extend(f,{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}),m.$build()):m.$isBuilt||m.$build()},m.select=function(e,t,a){(!n.$dateValue||isNaN(n.$dateValue.getTime()))&&(n.$dateValue=new Date(1970,0,1)),angular.isDate(e)||(e=new Date(e)),0===t?n.$dateValue.setHours(e.getHours()):1===t&&n.$dateValue.setMinutes(e.getMinutes()),n.$setViewValue(n.$dateValue),n.$render(),g.autoclose&&!a&&m.hide(!0)},m.switchMeridian=function(e){var t=(e||n.$dateValue).getHours();n.$dateValue.setHours(12>t?t+12:t-12),n.$setViewValue(n.$dateValue),n.$render()},m.$build=function(){var e,t,n=p.midIndex=parseInt(g.length/2,10),a=[];for(e=0;e1*g.maxTime},p.$arrowAction=function(e,t){"picker"===g.arrowBehavior?m.$setTimeByStep(e,t):m.$moveIndex(e,t)},m.$setTimeByStep=function(e,t){{var n=new Date(m.$date),a=n.getHours(),i=(r(n,"h").length,n.getMinutes());r(n,"mm").length}0===t?n.setHours(a-parseInt(g.hourStep,10)*e):n.setMinutes(i-parseInt(g.minuteStep,10)*e),m.select(n,t,!0),c.$digest()},m.$moveIndex=function(e,t){var n;0===t?(n=new Date(1970,0,1,f.hour+e*g.length,f.minute),angular.extend(f,{hour:n.getHours()})):1===t&&(n=new Date(1970,0,1,f.hour,f.minute+e*g.length*g.minuteStep),angular.extend(f,{minute:n.getMinutes()})),m.$build()},m.$onMouseDown=function(e){if("input"!==e.target.nodeName.toLowerCase()&&e.preventDefault(),e.stopPropagation(),d){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},m.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return m.hide(!0);var t=new Date(m.$date),n=t.getHours(),a=r(t,"h").length,o=t.getMinutes(),u=r(t,"mm").length,s=/(37|39)/.test(e.keyCode),l=2+1*!!v[3];s&&(37===e.keyCode?$=1>$?l-1:$-1:39===e.keyCode&&($=l-1>$?$+1:0));var d=[0,a];0===$?(38===e.keyCode?t.setHours(n-parseInt(g.hourStep,10)):40===e.keyCode&&t.setHours(n+parseInt(g.hourStep,10)),d=[0,a]):1===$?(38===e.keyCode?t.setMinutes(o-parseInt(g.minuteStep,10)):40===e.keyCode&&t.setMinutes(o+parseInt(g.minuteStep,10)),d=[a+1,a+1+u]):2===$&&(s||m.switchMeridian(),d=[a+1+u+1,a+1+u+3]),m.select(t,$,!0),i(d[0],d[1]),c.$digest()}};var y=m.init;m.init=function(){return l&&g.useNative?(t.prop("type","time"),void t.css("-webkit-appearance","textfield")):(d&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",s)),void y())};var T=m.destroy;m.destroy=function(){l&&g.useNative&&t.off("click",s),T()};var S=m.show;m.show=function(){S(),setTimeout(function(){m.$element.on(d?"touchstart":"mousedown",m.$onMouseDown),g.keyboard&&t.on("keydown",m.$onKeyDown)})};var D=m.hide;return m.hide=function(e){m.$element.off(d?"touchstart":"mousedown",m.$onMouseDown),g.keyboard&&t.off("keydown",m.$onKeyDown),D(e)},m}var l=(angular.element(t.document.body),/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent)),d="createTouch"in t.document&&l;return e.lang||(e.lang=o.id),s.defaults=e,s}]}).directive("bsTimepicker",["$window","$parse","$q","$locale","dateFilter","$timepicker","$dateParser","$timeout",function(e,t,n,a,i,o,r){{var u=o.defaults,s=/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent);e.requestAnimationFrame||e.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(e,t,n,a){var l={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","timeType","timeFormat","modelTimeFormat","useNative","hourStep","minuteStep","length","arrowBehavior"],function(e){angular.isDefined(n[e])&&(l[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){d&&angular.isDefined(e)&&(angular.isString(e)&&(e=e.match(",?(timepicker),?")),e===!0?d.show():d.hide())}),s&&(l.useNative||u.useNative)&&(l.timeFormat="HH:mm");var d=o(t,a,l);l=d.$options;var m=r({format:l.timeFormat,lang:l.lang});angular.forEach(["minTime","maxTime"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){d.$options[e]="now"===t?(new Date).setFullYear(1970,0,1):angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):m.parse(t,new Date(1970,0,1,0)),!isNaN(d.$options[e])&&d.$build()})}),e.$watch(n.ngModel,function(){d.update(a.$dateValue)},!0),a.$parsers.unshift(function(e){if(!e)return void a.$setValidity("date",!0);var t=m.parse(e,a.$dateValue);if(!t||isNaN(t.getTime()))a.$setValidity("date",!1);else{var n=t.getTime()>=l.minTime&&t.getTime()<=l.maxTime;a.$setValidity("date",n),n&&(a.$dateValue=t)}return"string"===l.timeType?i(t,l.modelTimeFormat||l.timeFormat):"number"===l.timeType?a.$dateValue.getTime():"iso"===l.timeType?a.$dateValue.toISOString():new Date(a.$dateValue)}),a.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===l.timeType?m.parse(e,null,l.modelTimeFormat):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":i(a.$dateValue,l.timeFormat))},e.$on("$destroy",function(){d.destroy(),l=null,d=null})}}}]);
//# sourceMappingURL=timepicker.min.js.map
\ No newline at end of file
diff --git a/dist/modules/timepicker.min.js.map b/dist/modules/timepicker.min.js.map
index 2958edac3..7d0f03bc1 100755
--- a/dist/modules/timepicker.min.js.map
+++ b/dist/modules/timepicker.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"timepicker.min.js","sources":["timepicker/timepicker.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","trigger","container","keyboard","html","delay","useNative","timeType","timeFormat","modelTimeFormat","autoclose","minTime","Infinity","maxTime","length","hourStep","minuteStep","iconUp","iconDown","$get","$window","$document","$rootScope","$sce","$locale","dateFilter","$tooltip","timepickerFactory","element","controller","config","createSelection","start","end","createTextRange","selRange","collapse","moveStart","moveEnd","select","setSelectionRange","isUndefined","selectionStart","selectionEnd","focusElement","focus","$timepicker","extend","parentScope","scope","options","$options","$scope","selectedIndex","startDate","$dateValue","Date","viewDate","hour","getHours","meridian","minute","getMinutes","second","getSeconds","millisecond","getMilliseconds","format","DATETIME_FORMATS","formats","exec","slice","$iconUp","$iconDown","$select","date","index","$moveIndex","value","$switchMeridian","switchMeridian","update","isDate","isNaN","getTime","$date","$build","$isBuilt","keep","setHours","setMinutes","$setViewValue","$render","hide","hours","i","midIndex","parseInt","push","label","selected","$isSelected","disabled","$isDisabled","minutes","rows","showAM","isAM","timeSeparator","selectedTime","targetDate","$onMouseDown","evt","target","nodeName","toLowerCase","preventDefault","stopPropagation","isTouch","targetEl","parent","triggerHandler","$onKeyDown","test","keyCode","shiftKey","altKey","newDate","hoursLength","minutesLength","lateralMove","count","selectRange","$digest","_init","init","isNative","prop","css","attr","on","_destroy","destroy","off","_show","show","setTimeout","$element","_hide","blur","document","body","navigator","userAgent","lang","id","directive","$parse","$q","$dateParser","requestAnimationFrame","restrict","require","link","forEach","key","isDefined","bsShow","$watch","newValue","timepicker","isString","match","dateParser","$observe","setFullYear","substr","parse","ngModel","$parsers","unshift","viewValue","$setValidity","parsedTime","isValid","toISOString","$formatters","modelValue","NaN","val","$on"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.timepicker', ['mgcrea.ngStrap.helpers.dateParser', 'mgcrea.ngStrap.tooltip'])\n\n .provider('$timepicker', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'timepicker',\n placement: 'bottom-left',\n template: 'timepicker/timepicker.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n // lang: $locale.id,\n useNative: true,\n timeType: 'date',\n timeFormat: 'shortTime',\n modelTimeFormat: null,\n autoclose: false,\n minTime: -Infinity,\n maxTime: +Infinity,\n length: 5,\n hourStep: 1,\n minuteStep: 5,\n iconUp: 'glyphicon glyphicon-chevron-up',\n iconDown: 'glyphicon glyphicon-chevron-down'\n };\n\n this.$get = function($window, $document, $rootScope, $sce, $locale, dateFilter, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n var isTouch = 'createTouch' in $window.document;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n if(!defaults.lang) defaults.lang = $locale.id;\n\n function timepickerFactory(element, controller, config) {\n\n var $timepicker = $tooltip(element, angular.extend({}, defaults, config));\n var parentScope = config.scope;\n var options = $timepicker.$options;\n var scope = $timepicker.$scope;\n\n // View vars\n\n var selectedIndex = 0;\n var startDate = controller.$dateValue || new Date();\n var viewDate = {hour: startDate.getHours(), meridian: startDate.getHours() < 12, minute: startDate.getMinutes(), second: startDate.getSeconds(), millisecond: startDate.getMilliseconds()};\n\n var format = $locale.DATETIME_FORMATS[options.timeFormat] || options.timeFormat;\n var formats = /(h+)([:\\.])?(m+)[ ]?(a?)/i.exec(format).slice(1);\n scope.$iconUp = options.iconUp;\n scope.$iconDown = options.iconDown;\n\n // Scope methods\n\n scope.$select = function(date, index) {\n $timepicker.select(date, index);\n };\n scope.$moveIndex = function(value, index) {\n $timepicker.$moveIndex(value, index);\n };\n scope.$switchMeridian = function(date) {\n $timepicker.switchMeridian(date);\n };\n\n // Public methods\n\n $timepicker.update = function(date) {\n // console.warn('$timepicker.update() newValue=%o', date);\n if(angular.isDate(date) && !isNaN(date.getTime())) {\n $timepicker.$date = date;\n angular.extend(viewDate, {hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds(), millisecond: date.getMilliseconds()});\n $timepicker.$build();\n } else if(!$timepicker.$isBuilt) {\n $timepicker.$build();\n }\n };\n\n $timepicker.select = function(date, index, keep) {\n // console.warn('$timepicker.select', date, scope.$mode);\n if(!controller.$dateValue || isNaN(controller.$dateValue.getTime())) controller.$dateValue = new Date(1970, 0, 1);\n if(!angular.isDate(date)) date = new Date(date);\n if(index === 0) controller.$dateValue.setHours(date.getHours());\n else if(index === 1) controller.$dateValue.setMinutes(date.getMinutes());\n controller.$setViewValue(controller.$dateValue);\n controller.$render();\n if(options.autoclose && !keep) {\n $timepicker.hide(true);\n }\n };\n\n $timepicker.switchMeridian = function(date) {\n var hours = (date || controller.$dateValue).getHours();\n controller.$dateValue.setHours(hours < 12 ? hours + 12 : hours - 12);\n controller.$setViewValue(controller.$dateValue);\n controller.$render();\n };\n\n // Protected methods\n\n $timepicker.$build = function() {\n // console.warn('$timepicker.$build() viewDate=%o', viewDate);\n var i, midIndex = scope.midIndex = parseInt(options.length / 2, 10);\n var hours = [], hour;\n for(i = 0; i < options.length; i++) {\n hour = new Date(1970, 0, 1, viewDate.hour - (midIndex - i) * options.hourStep);\n hours.push({date: hour, label: dateFilter(hour, formats[0]), selected: $timepicker.$date && $timepicker.$isSelected(hour, 0), disabled: $timepicker.$isDisabled(hour, 0)});\n }\n var minutes = [], minute;\n for(i = 0; i < options.length; i++) {\n minute = new Date(1970, 0, 1, 0, viewDate.minute - (midIndex - i) * options.minuteStep);\n minutes.push({date: minute, label: dateFilter(minute, formats[2]), selected: $timepicker.$date && $timepicker.$isSelected(minute, 1), disabled: $timepicker.$isDisabled(minute, 1)});\n }\n\n var rows = [];\n for(i = 0; i < options.length; i++) {\n rows.push([hours[i], minutes[i]]);\n }\n scope.rows = rows;\n scope.showAM = !!formats[3];\n scope.isAM = ($timepicker.$date || hours[midIndex].date).getHours() < 12;\n scope.timeSeparator = formats[1];\n $timepicker.$isBuilt = true;\n };\n\n $timepicker.$isSelected = function(date, index) {\n if(!$timepicker.$date) return false;\n else if(index === 0) {\n return date.getHours() === $timepicker.$date.getHours();\n } else if(index === 1) {\n return date.getMinutes() === $timepicker.$date.getMinutes();\n }\n };\n\n $timepicker.$isDisabled = function(date, index) {\n var selectedTime;\n if(index === 0) {\n selectedTime = date.getTime() + viewDate.minute * 6e4;\n } else if(index === 1) {\n selectedTime = date.getTime() + viewDate.hour * 36e5;\n }\n return selectedTime < options.minTime * 1 || selectedTime > options.maxTime * 1;\n };\n\n $timepicker.$moveIndex = function(value, index) {\n var targetDate;\n if(index === 0) {\n targetDate = new Date(1970, 0, 1, viewDate.hour + (value * options.length), viewDate.minute);\n angular.extend(viewDate, {hour: targetDate.getHours()});\n } else if(index === 1) {\n targetDate = new Date(1970, 0, 1, viewDate.hour, viewDate.minute + (value * options.length * options.minuteStep));\n angular.extend(viewDate, {minute: targetDate.getMinutes()});\n }\n $timepicker.$build();\n };\n\n $timepicker.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n if(evt.target.nodeName.toLowerCase() !== 'input') evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n targetEl = targetEl.parent();\n }\n targetEl.triggerHandler('click');\n }\n };\n\n $timepicker.$onKeyDown = function(evt) {\n if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n // Close on enter\n if(evt.keyCode === 13) return $timepicker.hide(true);\n\n // Navigate with keyboard\n var newDate = new Date($timepicker.$date);\n var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;\n var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;\n var lateralMove = /(37|39)/.test(evt.keyCode);\n var count = 2 + !!formats[3] * 1;\n\n // Navigate indexes (left, right)\n if (lateralMove) {\n if(evt.keyCode === 37) selectedIndex = selectedIndex < 1 ? count - 1 : selectedIndex - 1;\n else if(evt.keyCode === 39) selectedIndex = selectedIndex < count - 1 ? selectedIndex + 1 : 0;\n }\n\n // Update values (up, down)\n var selectRange = [0, hoursLength];\n if(selectedIndex === 0) {\n if(evt.keyCode === 38) newDate.setHours(hours - parseInt(options.hourStep, 10));\n else if(evt.keyCode === 40) newDate.setHours(hours + parseInt(options.hourStep, 10));\n selectRange = [0, hoursLength];\n } else if(selectedIndex === 1) {\n if(evt.keyCode === 38) newDate.setMinutes(minutes - parseInt(options.minuteStep, 10));\n else if(evt.keyCode === 40) newDate.setMinutes(minutes + parseInt(options.minuteStep, 10));\n selectRange = [hoursLength + 1, hoursLength + 1 + minutesLength];\n } else if(selectedIndex === 2) {\n if(!lateralMove) $timepicker.switchMeridian();\n selectRange = [hoursLength + 1 + minutesLength + 1, hoursLength + 1 + minutesLength + 3];\n }\n $timepicker.select(newDate, selectedIndex, true);\n createSelection(selectRange[0], selectRange[1]);\n parentScope.$digest();\n };\n\n // Private\n\n function createSelection(start, end) {\n if(element[0].createTextRange) {\n var selRange = element[0].createTextRange();\n selRange.collapse(true);\n selRange.moveStart('character', start);\n selRange.moveEnd('character', end);\n selRange.select();\n } else if(element[0].setSelectionRange) {\n element[0].setSelectionRange(start, end);\n } else if(angular.isUndefined(element[0].selectionStart)) {\n element[0].selectionStart = start;\n element[0].selectionEnd = end;\n }\n }\n\n function focusElement() {\n element[0].focus();\n }\n\n // Overrides\n\n var _init = $timepicker.init;\n $timepicker.init = function() {\n if(isNative && options.useNative) {\n element.prop('type', 'time');\n element.css('-webkit-appearance', 'textfield');\n return;\n } else if(isTouch) {\n element.prop('type', 'text');\n element.attr('readonly', 'true');\n element.on('click', focusElement);\n }\n _init();\n };\n\n var _destroy = $timepicker.destroy;\n $timepicker.destroy = function() {\n if(isNative && options.useNative) {\n element.off('click', focusElement);\n }\n _destroy();\n };\n\n var _show = $timepicker.show;\n $timepicker.show = function() {\n _show();\n setTimeout(function() {\n $timepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $timepicker.$onKeyDown);\n }\n });\n };\n\n var _hide = $timepicker.hide;\n $timepicker.hide = function(blur) {\n $timepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $timepicker.$onKeyDown);\n }\n _hide(blur);\n };\n\n return $timepicker;\n\n }\n\n timepickerFactory.defaults = defaults;\n return timepickerFactory;\n\n };\n\n })\n\n\n .directive('bsTimepicker', function($window, $parse, $q, $locale, dateFilter, $timepicker, $dateParser, $timeout) {\n\n var defaults = $timepicker.defaults;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope, controller: controller};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'timeType', 'timeFormat', 'modelTimeFormat', 'useNative', 'hourStep', 'minuteStep', 'length'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!timepicker || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = newValue.match(',?(timepicker),?');\n newValue === true ? timepicker.show() : timepicker.hide();\n });\n\n // Initialize timepicker\n if(isNative && (options.useNative || defaults.useNative)) options.timeFormat = 'HH:mm';\n var timepicker = $timepicker(element, controller, options);\n options = timepicker.$options;\n\n // Initialize parser\n var dateParser = $dateParser({format: options.timeFormat, lang: options.lang});\n\n // Observe attributes for changes\n angular.forEach(['minTime', 'maxTime'], function(key) {\n // console.warn('attr.$observe(%s)', key, attr[key]);\n angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n if(newValue === 'now') {\n timepicker.$options[key] = new Date().setFullYear(1970, 0, 1);\n } else if(angular.isString(newValue) && newValue.match(/^\".+\"$/)) {\n timepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));\n } else {\n timepicker.$options[key] = dateParser.parse(newValue, new Date(1970, 0, 1, 0));\n }\n !isNaN(timepicker.$options[key]) && timepicker.$build();\n });\n });\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue, controller.$dateValue);\n timepicker.update(controller.$dateValue);\n }, true);\n\n // viewValue -> $parsers -> modelValue\n controller.$parsers.unshift(function(viewValue) {\n // console.warn('$parser(\"%s\"): viewValue=%o', element.attr('ng-model'), viewValue);\n // Null values should correctly reset the model value & validity\n if(!viewValue) {\n controller.$setValidity('date', true);\n return;\n }\n var parsedTime = dateParser.parse(viewValue, controller.$dateValue);\n if(!parsedTime || isNaN(parsedTime.getTime())) {\n controller.$setValidity('date', false);\n } else {\n var isValid = parsedTime.getTime() >= options.minTime && parsedTime.getTime() <= options.maxTime;\n controller.$setValidity('date', isValid);\n // Only update the model when we have a valid date\n if(isValid) controller.$dateValue = parsedTime;\n }\n if(options.timeType === 'string') {\n return dateFilter(parsedTime, options.modelTimeFormat || options.timeFormat);\n } else if(options.timeType === 'number') {\n return controller.$dateValue.getTime();\n } else if(options.timeType === 'iso') {\n return controller.$dateValue.toISOString();\n } else {\n return new Date(controller.$dateValue);\n }\n });\n\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n var date;\n if(angular.isUndefined(modelValue) || modelValue === null) {\n date = NaN;\n } else if(angular.isDate(modelValue)) {\n date = modelValue;\n } else if(options.timeType === 'string') {\n date = dateParser.parse(modelValue, null, options.modelTimeFormat);\n } else {\n date = new Date(modelValue);\n }\n // Setup default value?\n // if(isNaN(date.getTime())) date = new Date(new Date().setMinutes(0) + 36e5);\n controller.$dateValue = date;\n return controller.$dateValue;\n });\n\n // viewValue -> element\n controller.$render = function() {\n // console.warn('$render(\"%s\"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);\n element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.timeFormat));\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n timepicker.destroy();\n options = null;\n timepicker = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"file":"timepicker.min.js","sources":["timepicker/timepicker.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","trigger","container","keyboard","html","delay","useNative","timeType","timeFormat","modelTimeFormat","autoclose","minTime","Infinity","maxTime","length","hourStep","minuteStep","iconUp","iconDown","arrowBehavior","$get","$window","$document","$rootScope","$sce","$locale","dateFilter","$tooltip","timepickerFactory","element","controller","config","createSelection","start","end","createTextRange","selRange","collapse","moveStart","moveEnd","select","setSelectionRange","isUndefined","selectionStart","selectionEnd","focusElement","focus","$timepicker","extend","parentScope","scope","options","$options","$scope","selectedIndex","startDate","$dateValue","Date","viewDate","hour","getHours","meridian","minute","getMinutes","second","getSeconds","millisecond","getMilliseconds","format","DATETIME_FORMATS","formats","exec","slice","$iconUp","$iconDown","$select","date","index","$moveIndex","value","$switchMeridian","switchMeridian","update","isDate","isNaN","getTime","$date","$build","$isBuilt","keep","setHours","setMinutes","$setViewValue","$render","hide","hours","i","midIndex","parseInt","push","label","selected","$isSelected","disabled","$isDisabled","minutes","rows","showAM","isAM","timeSeparator","selectedTime","$arrowAction","$setTimeByStep","newDate","$digest","targetDate","$onMouseDown","evt","target","nodeName","toLowerCase","preventDefault","stopPropagation","isTouch","targetEl","parent","triggerHandler","$onKeyDown","test","keyCode","shiftKey","altKey","hoursLength","minutesLength","lateralMove","count","selectRange","_init","init","isNative","prop","css","attr","on","_destroy","destroy","off","_show","show","setTimeout","$element","_hide","blur","document","body","navigator","userAgent","lang","id","directive","$parse","$q","$dateParser","requestAnimationFrame","restrict","require","link","forEach","key","isDefined","bsShow","$watch","newValue","timepicker","isString","match","dateParser","$observe","setFullYear","substr","parse","ngModel","$parsers","unshift","viewValue","$setValidity","parsedTime","isValid","toISOString","$formatters","modelValue","NaN","val","$on"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.timepicker', ['mgcrea.ngStrap.helpers.dateParser', 'mgcrea.ngStrap.tooltip'])\n\n .provider('$timepicker', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'timepicker',\n placement: 'bottom-left',\n template: 'timepicker/timepicker.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n // lang: $locale.id,\n useNative: true,\n timeType: 'date',\n timeFormat: 'shortTime',\n modelTimeFormat: null,\n autoclose: false,\n minTime: -Infinity,\n maxTime: +Infinity,\n length: 5,\n hourStep: 1,\n minuteStep: 5,\n iconUp: 'glyphicon glyphicon-chevron-up',\n iconDown: 'glyphicon glyphicon-chevron-down',\n arrowBehavior: 'pager'\n };\n\n this.$get = function($window, $document, $rootScope, $sce, $locale, dateFilter, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var isTouch = ('createTouch' in $window.document) && isNative;\n if(!defaults.lang) defaults.lang = $locale.id;\n\n function timepickerFactory(element, controller, config) {\n\n var $timepicker = $tooltip(element, angular.extend({}, defaults, config));\n var parentScope = config.scope;\n var options = $timepicker.$options;\n var scope = $timepicker.$scope;\n\n // View vars\n\n var selectedIndex = 0;\n var startDate = controller.$dateValue || new Date();\n var viewDate = {hour: startDate.getHours(), meridian: startDate.getHours() < 12, minute: startDate.getMinutes(), second: startDate.getSeconds(), millisecond: startDate.getMilliseconds()};\n\n var format = $locale.DATETIME_FORMATS[options.timeFormat] || options.timeFormat;\n var formats = /(h+)([:\\.])?(m+)[ ]?(a?)/i.exec(format).slice(1);\n scope.$iconUp = options.iconUp;\n scope.$iconDown = options.iconDown;\n\n // Scope methods\n\n scope.$select = function(date, index) {\n $timepicker.select(date, index);\n };\n scope.$moveIndex = function(value, index) {\n $timepicker.$moveIndex(value, index);\n };\n scope.$switchMeridian = function(date) {\n $timepicker.switchMeridian(date);\n };\n\n // Public methods\n\n $timepicker.update = function(date) {\n // console.warn('$timepicker.update() newValue=%o', date);\n if(angular.isDate(date) && !isNaN(date.getTime())) {\n $timepicker.$date = date;\n angular.extend(viewDate, {hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds(), millisecond: date.getMilliseconds()});\n $timepicker.$build();\n } else if(!$timepicker.$isBuilt) {\n $timepicker.$build();\n }\n };\n\n $timepicker.select = function(date, index, keep) {\n // console.warn('$timepicker.select', date, scope.$mode);\n if(!controller.$dateValue || isNaN(controller.$dateValue.getTime())) controller.$dateValue = new Date(1970, 0, 1);\n if(!angular.isDate(date)) date = new Date(date);\n if(index === 0) controller.$dateValue.setHours(date.getHours());\n else if(index === 1) controller.$dateValue.setMinutes(date.getMinutes());\n controller.$setViewValue(controller.$dateValue);\n controller.$render();\n if(options.autoclose && !keep) {\n $timepicker.hide(true);\n }\n };\n\n $timepicker.switchMeridian = function(date) {\n var hours = (date || controller.$dateValue).getHours();\n controller.$dateValue.setHours(hours < 12 ? hours + 12 : hours - 12);\n controller.$setViewValue(controller.$dateValue);\n controller.$render();\n };\n\n // Protected methods\n\n $timepicker.$build = function() {\n // console.warn('$timepicker.$build() viewDate=%o', viewDate);\n var i, midIndex = scope.midIndex = parseInt(options.length / 2, 10);\n var hours = [], hour;\n for(i = 0; i < options.length; i++) {\n hour = new Date(1970, 0, 1, viewDate.hour - (midIndex - i) * options.hourStep);\n hours.push({date: hour, label: dateFilter(hour, formats[0]), selected: $timepicker.$date && $timepicker.$isSelected(hour, 0), disabled: $timepicker.$isDisabled(hour, 0)});\n }\n var minutes = [], minute;\n for(i = 0; i < options.length; i++) {\n minute = new Date(1970, 0, 1, 0, viewDate.minute - (midIndex - i) * options.minuteStep);\n minutes.push({date: minute, label: dateFilter(minute, formats[2]), selected: $timepicker.$date && $timepicker.$isSelected(minute, 1), disabled: $timepicker.$isDisabled(minute, 1)});\n }\n\n var rows = [];\n for(i = 0; i < options.length; i++) {\n rows.push([hours[i], minutes[i]]);\n }\n scope.rows = rows;\n scope.showAM = !!formats[3];\n scope.isAM = ($timepicker.$date || hours[midIndex].date).getHours() < 12;\n scope.timeSeparator = formats[1];\n $timepicker.$isBuilt = true;\n };\n\n $timepicker.$isSelected = function(date, index) {\n if(!$timepicker.$date) return false;\n else if(index === 0) {\n return date.getHours() === $timepicker.$date.getHours();\n } else if(index === 1) {\n return date.getMinutes() === $timepicker.$date.getMinutes();\n }\n };\n\n $timepicker.$isDisabled = function(date, index) {\n var selectedTime;\n if(index === 0) {\n selectedTime = date.getTime() + viewDate.minute * 6e4;\n } else if(index === 1) {\n selectedTime = date.getTime() + viewDate.hour * 36e5;\n }\n return selectedTime < options.minTime * 1 || selectedTime > options.maxTime * 1;\n };\n\n scope.$arrowAction = function (value, index) {\n if (options.arrowBehavior === 'picker') {\n $timepicker.$setTimeByStep(value,index);\n } else {\n $timepicker.$moveIndex(value,index);\n }\n };\n\n $timepicker.$setTimeByStep = function(value, index) {\n var newDate = new Date($timepicker.$date);\n var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;\n var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;\n if (index === 0) {\n newDate.setHours(hours - (parseInt(options.hourStep, 10) * value));\n }\n else {\n newDate.setMinutes(minutes - (parseInt(options.minuteStep, 10) * value));\n }\n $timepicker.select(newDate, index, true);\n parentScope.$digest();\n };\n\n $timepicker.$moveIndex = function(value, index) {\n var targetDate;\n if(index === 0) {\n targetDate = new Date(1970, 0, 1, viewDate.hour + (value * options.length), viewDate.minute);\n angular.extend(viewDate, {hour: targetDate.getHours()});\n } else if(index === 1) {\n targetDate = new Date(1970, 0, 1, viewDate.hour, viewDate.minute + (value * options.length * options.minuteStep));\n angular.extend(viewDate, {minute: targetDate.getMinutes()});\n }\n $timepicker.$build();\n };\n\n $timepicker.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n if(evt.target.nodeName.toLowerCase() !== 'input') evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n targetEl = targetEl.parent();\n }\n targetEl.triggerHandler('click');\n }\n };\n\n $timepicker.$onKeyDown = function(evt) {\n if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n // Close on enter\n if(evt.keyCode === 13) return $timepicker.hide(true);\n\n // Navigate with keyboard\n var newDate = new Date($timepicker.$date);\n var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;\n var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;\n var lateralMove = /(37|39)/.test(evt.keyCode);\n var count = 2 + !!formats[3] * 1;\n\n // Navigate indexes (left, right)\n if (lateralMove) {\n if(evt.keyCode === 37) selectedIndex = selectedIndex < 1 ? count - 1 : selectedIndex - 1;\n else if(evt.keyCode === 39) selectedIndex = selectedIndex < count - 1 ? selectedIndex + 1 : 0;\n }\n\n // Update values (up, down)\n var selectRange = [0, hoursLength];\n if(selectedIndex === 0) {\n if(evt.keyCode === 38) newDate.setHours(hours - parseInt(options.hourStep, 10));\n else if(evt.keyCode === 40) newDate.setHours(hours + parseInt(options.hourStep, 10));\n selectRange = [0, hoursLength];\n } else if(selectedIndex === 1) {\n if(evt.keyCode === 38) newDate.setMinutes(minutes - parseInt(options.minuteStep, 10));\n else if(evt.keyCode === 40) newDate.setMinutes(minutes + parseInt(options.minuteStep, 10));\n selectRange = [hoursLength + 1, hoursLength + 1 + minutesLength];\n } else if(selectedIndex === 2) {\n if(!lateralMove) $timepicker.switchMeridian();\n selectRange = [hoursLength + 1 + minutesLength + 1, hoursLength + 1 + minutesLength + 3];\n }\n $timepicker.select(newDate, selectedIndex, true);\n createSelection(selectRange[0], selectRange[1]);\n parentScope.$digest();\n };\n\n // Private\n\n function createSelection(start, end) {\n if(element[0].createTextRange) {\n var selRange = element[0].createTextRange();\n selRange.collapse(true);\n selRange.moveStart('character', start);\n selRange.moveEnd('character', end);\n selRange.select();\n } else if(element[0].setSelectionRange) {\n element[0].setSelectionRange(start, end);\n } else if(angular.isUndefined(element[0].selectionStart)) {\n element[0].selectionStart = start;\n element[0].selectionEnd = end;\n }\n }\n\n function focusElement() {\n element[0].focus();\n }\n\n // Overrides\n\n var _init = $timepicker.init;\n $timepicker.init = function() {\n if(isNative && options.useNative) {\n element.prop('type', 'time');\n element.css('-webkit-appearance', 'textfield');\n return;\n } else if(isTouch) {\n element.prop('type', 'text');\n element.attr('readonly', 'true');\n element.on('click', focusElement);\n }\n _init();\n };\n\n var _destroy = $timepicker.destroy;\n $timepicker.destroy = function() {\n if(isNative && options.useNative) {\n element.off('click', focusElement);\n }\n _destroy();\n };\n\n var _show = $timepicker.show;\n $timepicker.show = function() {\n _show();\n setTimeout(function() {\n $timepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $timepicker.$onKeyDown);\n }\n });\n };\n\n var _hide = $timepicker.hide;\n $timepicker.hide = function(blur) {\n $timepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $timepicker.$onKeyDown);\n }\n _hide(blur);\n };\n\n return $timepicker;\n\n }\n\n timepickerFactory.defaults = defaults;\n return timepickerFactory;\n\n };\n\n })\n\n\n .directive('bsTimepicker', function($window, $parse, $q, $locale, dateFilter, $timepicker, $dateParser, $timeout) {\n\n var defaults = $timepicker.defaults;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope, controller: controller};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'timeType', 'timeFormat', 'modelTimeFormat', 'useNative', 'hourStep', 'minuteStep', 'length', 'arrowBehavior'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!timepicker || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = newValue.match(',?(timepicker),?');\n newValue === true ? timepicker.show() : timepicker.hide();\n });\n\n // Initialize timepicker\n if(isNative && (options.useNative || defaults.useNative)) options.timeFormat = 'HH:mm';\n var timepicker = $timepicker(element, controller, options);\n options = timepicker.$options;\n\n // Initialize parser\n var dateParser = $dateParser({format: options.timeFormat, lang: options.lang});\n\n // Observe attributes for changes\n angular.forEach(['minTime', 'maxTime'], function(key) {\n // console.warn('attr.$observe(%s)', key, attr[key]);\n angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n if(newValue === 'now') {\n timepicker.$options[key] = new Date().setFullYear(1970, 0, 1);\n } else if(angular.isString(newValue) && newValue.match(/^\".+\"$/)) {\n timepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));\n } else {\n timepicker.$options[key] = dateParser.parse(newValue, new Date(1970, 0, 1, 0));\n }\n !isNaN(timepicker.$options[key]) && timepicker.$build();\n });\n });\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue, controller.$dateValue);\n timepicker.update(controller.$dateValue);\n }, true);\n\n // viewValue -> $parsers -> modelValue\n controller.$parsers.unshift(function(viewValue) {\n // console.warn('$parser(\"%s\"): viewValue=%o', element.attr('ng-model'), viewValue);\n // Null values should correctly reset the model value & validity\n if(!viewValue) {\n controller.$setValidity('date', true);\n return;\n }\n var parsedTime = dateParser.parse(viewValue, controller.$dateValue);\n if(!parsedTime || isNaN(parsedTime.getTime())) {\n controller.$setValidity('date', false);\n } else {\n var isValid = parsedTime.getTime() >= options.minTime && parsedTime.getTime() <= options.maxTime;\n controller.$setValidity('date', isValid);\n // Only update the model when we have a valid date\n if(isValid) controller.$dateValue = parsedTime;\n }\n if(options.timeType === 'string') {\n return dateFilter(parsedTime, options.modelTimeFormat || options.timeFormat);\n } else if(options.timeType === 'number') {\n return controller.$dateValue.getTime();\n } else if(options.timeType === 'iso') {\n return controller.$dateValue.toISOString();\n } else {\n return new Date(controller.$dateValue);\n }\n });\n\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n var date;\n if(angular.isUndefined(modelValue) || modelValue === null) {\n date = NaN;\n } else if(angular.isDate(modelValue)) {\n date = modelValue;\n } else if(options.timeType === 'string') {\n date = dateParser.parse(modelValue, null, options.modelTimeFormat);\n } else {\n date = new Date(modelValue);\n }\n // Setup default value?\n // if(isNaN(date.getTime())) date = new Date(new Date().setMinutes(0) + 36e5);\n controller.$dateValue = date;\n return controller.$dateValue;\n });\n\n // viewValue -> element\n controller.$render = function() {\n // console.warn('$render(\"%s\"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);\n element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.timeFormat));\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n timepicker.destroy();\n options = null;\n timepicker = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/modules/timepicker.tpl.js b/dist/modules/timepicker.tpl.js
index bbd341e13..59716019b 100644
--- a/dist/modules/timepicker.tpl.js
+++ b/dist/modules/timepicker.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -9,6 +9,6 @@
angular.module('mgcrea.ngStrap.timepicker').run([
'$templateCache',
function ($templateCache) {
- $templateCache.put('timepicker/timepicker.tpl.html', '');
+ $templateCache.put('timepicker/timepicker.tpl.html', '');
}
]);
\ No newline at end of file
diff --git a/dist/modules/timepicker.tpl.min.js b/dist/modules/timepicker.tpl.min.js
index 63191182a..ca6370e4e 100644
--- a/dist/modules/timepicker.tpl.min.js
+++ b/dist/modules/timepicker.tpl.min.js
@@ -1,8 +1,8 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.timepicker").run(["$templateCache",function(t){t.put("timepicker/timepicker.tpl.html",'')}]);
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.timepicker").run(["$templateCache",function(t){t.put("timepicker/timepicker.tpl.html",'')}]);
\ No newline at end of file
diff --git a/dist/modules/tooltip.js b/dist/modules/tooltip.js
index f034f7536..05c47f3fe 100644
--- a/dist/modules/tooltip.js
+++ b/dist/modules/tooltip.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -239,6 +239,10 @@ angular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions']).
scope.$emit(options.prefixEvent + '.hide.before', $tooltip);
$animate.leave(tipElement, function () {
scope.$emit(options.prefixEvent + '.hide', $tooltip);
+ // Allow to blur the input when hidden, like when pressing enter key
+ if (blur && options.trigger === 'focus') {
+ return element[0].blur();
+ }
});
$tooltip.$isShown = scope.$isShown = false;
scope.$$phase || scope.$root && scope.$root.$$phase || scope.$digest();
@@ -246,10 +250,6 @@ angular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions']).
if (options.keyboard && tipElement !== null) {
tipElement.off('keyup', $tooltip.$onKeyUp);
}
- // Allow to blur the input when hidden, like when pressing enter key
- if (blur && options.trigger === 'focus') {
- return element[0].blur();
- }
};
$tooltip.toggle = function () {
$tooltip.$isShown ? $tooltip.leave() : $tooltip.enter();
@@ -424,7 +424,8 @@ angular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions']).
var tooltip = $tooltip(element, options);
// Garbage collection
scope.$on('$destroy', function () {
- tooltip.destroy();
+ if (tooltip)
+ tooltip.destroy();
options = null;
tooltip = null;
});
diff --git a/dist/modules/tooltip.min.js b/dist/modules/tooltip.min.js
index 987c02f6e..e9e70bc6a 100644
--- a/dist/modules/tooltip.min.js
+++ b/dist/modules/tooltip.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.tooltip",["mgcrea.ngStrap.helpers.dimensions"]).provider("$tooltip",function(){var t=this.defaults={animation:"am-fade",customClass:"",prefixClass:"tooltip",prefixEvent:"tooltip",container:!1,target:!1,placement:"top",template:"tooltip/tooltip.tpl.html",contentTemplate:!1,trigger:"hover focus",keyboard:!1,html:!1,show:!1,title:"",type:"",delay:0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","dimensions","$$rAF",function(e,o,n,i,a,r,l,s,c){function u(e,i){function a(){return"body"===m.container?s.offset(m.target[0]||e[0]):s.position(m.target[0]||e[0])}function r(t,e,o,n){var i,a=t.split("-");switch(a[0]){case"right":i={top:e.top+e.height/2-n/2,left:e.left+e.width};break;case"bottom":i={top:e.top+e.height,left:e.left+e.width/2-o/2};break;case"left":i={top:e.top+e.height/2-n/2,left:e.left-o};break;default:i={top:e.top-n,left:e.left+e.width/2-o/2}}if(!a[1])return i;if("top"===a[0]||"bottom"===a[0])switch(a[1]){case"left":i.left=e.left;break;case"right":i.left=e.left+e.width-o}else if("left"===a[0]||"right"===a[0])switch(a[1]){case"top":i.top=e.top-n;break;case"bottom":i.top=e.top+e.height}return i}var u={},$=e[0].nodeName.toLowerCase(),m=u.$options=angular.extend({},t,i);u.$promise=p(m.template);var v=u.$scope=m.scope&&m.scope.$new()||o.$new();m.delay&&angular.isString(m.delay)&&(m.delay=parseFloat(m.delay)),m.title&&(u.$scope.title=m.title),v.$hide=function(){v.$$postDigest(function(){u.hide()})},v.$show=function(){v.$$postDigest(function(){u.show()})},v.$toggle=function(){v.$$postDigest(function(){u.toggle()})},u.$isShown=v.$isShown=!1;var w,y;m.contentTemplate&&(u.$promise=u.$promise.then(function(t){var e=angular.element(t);return p(m.contentTemplate).then(function(t){var o=f('[ng-bind="content"]',e[0]);return o.length||(o=f('[ng-bind="title"]',e[0])),o.removeAttr("ng-bind").html(t),e[0].outerHTML})}));var b,k,S,E;return u.$promise.then(function(t){angular.isObject(t)&&(t=t.data),m.html&&(t=t.replace(g,'ng-bind-html="')),t=h.apply(t),S=t,b=n(t),u.init()}),u.init=function(){m.delay&&angular.isNumber(m.delay)&&(m.delay={show:m.delay,hide:m.delay}),"self"===m.container?E=e:angular.isElement(m.container)?E=m.container:m.container&&(E=f(m.container));var t=m.trigger.split(" ");angular.forEach(t,function(t){"click"===t?e.on("click",u.toggle):"manual"!==t&&(e.on("hover"===t?"mouseenter":"focus",u.enter),e.on("hover"===t?"mouseleave":"blur",u.leave),"button"===$&&"hover"!==t&&e.on(d?"touchstart":"mousedown",u.$onFocusElementMouseDown))}),m.target&&(m.target=angular.isElement(m.target)?m.target:f(m.target)[0]),m.show&&v.$$postDigest(function(){"focus"===m.trigger?e[0].focus():u.show()})},u.destroy=function(){for(var t=m.trigger.split(" "),o=t.length;o--;){var n=t[o];"click"===n?e.off("click",u.toggle):"manual"!==n&&(e.off("hover"===n?"mouseenter":"focus",u.enter),e.off("hover"===n?"mouseleave":"blur",u.leave),"button"===$&&"hover"!==n&&e.off(d?"touchstart":"mousedown",u.$onFocusElementMouseDown))}k&&(k.remove(),k=null),clearTimeout(w),v.$destroy()},u.enter=function(){return clearTimeout(w),y="in",m.delay&&m.delay.show?void(w=setTimeout(function(){"in"===y&&u.show()},m.delay.show)):u.show()},u.show=function(){v.$emit(m.prefixEvent+".show.before",u);var t=m.container?E:null,o=m.container?null:e;k&&k.remove(),k=u.$element=b(v,function(){}),k.css({top:"-9999px",left:"-9999px",display:"block",visibility:"hidden"}).addClass(m.placement),m.animation&&k.addClass(m.animation),m.type&&k.addClass(m.prefixClass+"-"+m.type),m.customClass&&k.addClass(m.customClass),l.enter(k,t,o,function(){v.$emit(m.prefixEvent+".show",u)}),u.$isShown=v.$isShown=!0,v.$$phase||v.$root&&v.$root.$$phase||v.$digest(),c(function(){u.$applyPlacement(),k.css({visibility:"visible"})}),m.keyboard&&("focus"!==m.trigger?(u.focus(),k.on("keyup",u.$onKeyUp)):e.on("keyup",u.$onFocusKeyUp))},u.leave=function(){return clearTimeout(w),y="out",m.delay&&m.delay.hide?void(w=setTimeout(function(){"out"===y&&u.hide()},m.delay.hide)):u.hide()},u.hide=function(t){return u.$isShown?(v.$emit(m.prefixEvent+".hide.before",u),l.leave(k,function(){v.$emit(m.prefixEvent+".hide",u)}),u.$isShown=v.$isShown=!1,v.$$phase||v.$root&&v.$root.$$phase||v.$digest(),m.keyboard&&null!==k&&k.off("keyup",u.$onKeyUp),t&&"focus"===m.trigger?e[0].blur():void 0):void 0},u.toggle=function(){u.$isShown?u.leave():u.enter()},u.focus=function(){k[0].focus()},u.$applyPlacement=function(){if(k){var t=a(),e=k.prop("offsetWidth"),o=k.prop("offsetHeight"),n=r(m.placement,t,e,o);n.top+="px",n.left+="px",k.css(n)}},u.$onKeyUp=function(t){27===t.which&&u.hide()},u.$onFocusKeyUp=function(t){27===t.which&&e[0].blur()},u.$onFocusElementMouseDown=function(t){t.preventDefault(),t.stopPropagation(),u.$isShown?e[0].blur():e[0].focus()},u}function f(t,e){return angular.element((e||document).querySelectorAll(t))}function p(t){return i.when(a.get(t)||r.get(t)).then(function(e){return angular.isObject(e)?(a.put(t,e.data),e.data):e})}var h=String.prototype.trim,d="createTouch"in e.document,g=/ng-bind="/gi;return u}]}).directive("bsTooltip",["$window","$location","$sce","$tooltip","$$rAF",function(t,e,o,n,i){return{restrict:"EAC",scope:!0,link:function(t,e,a){var r={scope:t};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","type","customClass"],function(t){angular.isDefined(a[t])&&(r[t]=a[t])}),angular.forEach(["title"],function(e){a.$observe(e,function(n,a){t[e]=o.trustAsHtml(n),angular.isDefined(a)&&i(function(){l&&l.$applyPlacement()})})}),a.bsTooltip&&t.$watch(a.bsTooltip,function(e,o){angular.isObject(e)?angular.extend(t,e):t.title=e,angular.isDefined(o)&&i(function(){l&&l.$applyPlacement()})},!0),a.bsShow&&t.$watch(a.bsShow,function(t){l&&angular.isDefined(t)&&(angular.isString(t)&&(t=t.match(",?(tooltip),?")),t===!0?l.show():l.hide())});var l=n(e,r);t.$on("$destroy",function(){l.destroy(),r=null,l=null})}}}]);
+"use strict";angular.module("mgcrea.ngStrap.tooltip",["mgcrea.ngStrap.helpers.dimensions"]).provider("$tooltip",function(){var t=this.defaults={animation:"am-fade",customClass:"",prefixClass:"tooltip",prefixEvent:"tooltip",container:!1,target:!1,placement:"top",template:"tooltip/tooltip.tpl.html",contentTemplate:!1,trigger:"hover focus",keyboard:!1,html:!1,show:!1,title:"",type:"",delay:0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","dimensions","$$rAF",function(e,o,n,i,a,r,l,s,c){function u(e,i){function a(){return"body"===m.container?s.offset(m.target[0]||e[0]):s.position(m.target[0]||e[0])}function r(t,e,o,n){var i,a=t.split("-");switch(a[0]){case"right":i={top:e.top+e.height/2-n/2,left:e.left+e.width};break;case"bottom":i={top:e.top+e.height,left:e.left+e.width/2-o/2};break;case"left":i={top:e.top+e.height/2-n/2,left:e.left-o};break;default:i={top:e.top-n,left:e.left+e.width/2-o/2}}if(!a[1])return i;if("top"===a[0]||"bottom"===a[0])switch(a[1]){case"left":i.left=e.left;break;case"right":i.left=e.left+e.width-o}else if("left"===a[0]||"right"===a[0])switch(a[1]){case"top":i.top=e.top-n;break;case"bottom":i.top=e.top+e.height}return i}var u={},$=e[0].nodeName.toLowerCase(),m=u.$options=angular.extend({},t,i);u.$promise=p(m.template);var w=u.$scope=m.scope&&m.scope.$new()||o.$new();m.delay&&angular.isString(m.delay)&&(m.delay=parseFloat(m.delay)),m.title&&(u.$scope.title=m.title),w.$hide=function(){w.$$postDigest(function(){u.hide()})},w.$show=function(){w.$$postDigest(function(){u.show()})},w.$toggle=function(){w.$$postDigest(function(){u.toggle()})},u.$isShown=w.$isShown=!1;var v,y;m.contentTemplate&&(u.$promise=u.$promise.then(function(t){var e=angular.element(t);return p(m.contentTemplate).then(function(t){var o=f('[ng-bind="content"]',e[0]);return o.length||(o=f('[ng-bind="title"]',e[0])),o.removeAttr("ng-bind").html(t),e[0].outerHTML})}));var b,k,S,E;return u.$promise.then(function(t){angular.isObject(t)&&(t=t.data),m.html&&(t=t.replace(g,'ng-bind-html="')),t=h.apply(t),S=t,b=n(t),u.init()}),u.init=function(){m.delay&&angular.isNumber(m.delay)&&(m.delay={show:m.delay,hide:m.delay}),"self"===m.container?E=e:angular.isElement(m.container)?E=m.container:m.container&&(E=f(m.container));var t=m.trigger.split(" ");angular.forEach(t,function(t){"click"===t?e.on("click",u.toggle):"manual"!==t&&(e.on("hover"===t?"mouseenter":"focus",u.enter),e.on("hover"===t?"mouseleave":"blur",u.leave),"button"===$&&"hover"!==t&&e.on(d?"touchstart":"mousedown",u.$onFocusElementMouseDown))}),m.target&&(m.target=angular.isElement(m.target)?m.target:f(m.target)[0]),m.show&&w.$$postDigest(function(){"focus"===m.trigger?e[0].focus():u.show()})},u.destroy=function(){for(var t=m.trigger.split(" "),o=t.length;o--;){var n=t[o];"click"===n?e.off("click",u.toggle):"manual"!==n&&(e.off("hover"===n?"mouseenter":"focus",u.enter),e.off("hover"===n?"mouseleave":"blur",u.leave),"button"===$&&"hover"!==n&&e.off(d?"touchstart":"mousedown",u.$onFocusElementMouseDown))}k&&(k.remove(),k=null),clearTimeout(v),w.$destroy()},u.enter=function(){return clearTimeout(v),y="in",m.delay&&m.delay.show?void(v=setTimeout(function(){"in"===y&&u.show()},m.delay.show)):u.show()},u.show=function(){w.$emit(m.prefixEvent+".show.before",u);var t=m.container?E:null,o=m.container?null:e;k&&k.remove(),k=u.$element=b(w,function(){}),k.css({top:"-9999px",left:"-9999px",display:"block",visibility:"hidden"}).addClass(m.placement),m.animation&&k.addClass(m.animation),m.type&&k.addClass(m.prefixClass+"-"+m.type),m.customClass&&k.addClass(m.customClass),l.enter(k,t,o,function(){w.$emit(m.prefixEvent+".show",u)}),u.$isShown=w.$isShown=!0,w.$$phase||w.$root&&w.$root.$$phase||w.$digest(),c(function(){u.$applyPlacement(),k.css({visibility:"visible"})}),m.keyboard&&("focus"!==m.trigger?(u.focus(),k.on("keyup",u.$onKeyUp)):e.on("keyup",u.$onFocusKeyUp))},u.leave=function(){return clearTimeout(v),y="out",m.delay&&m.delay.hide?void(v=setTimeout(function(){"out"===y&&u.hide()},m.delay.hide)):u.hide()},u.hide=function(t){u.$isShown&&(w.$emit(m.prefixEvent+".hide.before",u),l.leave(k,function(){return w.$emit(m.prefixEvent+".hide",u),t&&"focus"===m.trigger?e[0].blur():void 0}),u.$isShown=w.$isShown=!1,w.$$phase||w.$root&&w.$root.$$phase||w.$digest(),m.keyboard&&null!==k&&k.off("keyup",u.$onKeyUp))},u.toggle=function(){u.$isShown?u.leave():u.enter()},u.focus=function(){k[0].focus()},u.$applyPlacement=function(){if(k){var t=a(),e=k.prop("offsetWidth"),o=k.prop("offsetHeight"),n=r(m.placement,t,e,o);n.top+="px",n.left+="px",k.css(n)}},u.$onKeyUp=function(t){27===t.which&&u.hide()},u.$onFocusKeyUp=function(t){27===t.which&&e[0].blur()},u.$onFocusElementMouseDown=function(t){t.preventDefault(),t.stopPropagation(),u.$isShown?e[0].blur():e[0].focus()},u}function f(t,e){return angular.element((e||document).querySelectorAll(t))}function p(t){return i.when(a.get(t)||r.get(t)).then(function(e){return angular.isObject(e)?(a.put(t,e.data),e.data):e})}var h=String.prototype.trim,d="createTouch"in e.document,g=/ng-bind="/gi;return u}]}).directive("bsTooltip",["$window","$location","$sce","$tooltip","$$rAF",function(t,e,o,n,i){return{restrict:"EAC",scope:!0,link:function(t,e,a){var r={scope:t};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","type","customClass"],function(t){angular.isDefined(a[t])&&(r[t]=a[t])}),angular.forEach(["title"],function(e){a.$observe(e,function(n,a){t[e]=o.trustAsHtml(n),angular.isDefined(a)&&i(function(){l&&l.$applyPlacement()})})}),a.bsTooltip&&t.$watch(a.bsTooltip,function(e,o){angular.isObject(e)?angular.extend(t,e):t.title=e,angular.isDefined(o)&&i(function(){l&&l.$applyPlacement()})},!0),a.bsShow&&t.$watch(a.bsShow,function(t){l&&angular.isDefined(t)&&(angular.isString(t)&&(t=t.match(",?(tooltip),?")),t===!0?l.show():l.hide())});var l=n(e,r);t.$on("$destroy",function(){l&&l.destroy(),r=null,l=null})}}}]);
//# sourceMappingURL=tooltip.min.js.map
\ No newline at end of file
diff --git a/dist/modules/tooltip.min.js.map b/dist/modules/tooltip.min.js.map
index db4277550..ac0a52a13 100755
--- a/dist/modules/tooltip.min.js.map
+++ b/dist/modules/tooltip.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"tooltip.min.js","sources":["tooltip/tooltip.js"],"names":["angular","module","provider","defaults","this","animation","customClass","prefixClass","prefixEvent","container","target","placement","template","contentTemplate","trigger","keyboard","html","show","title","type","delay","$get","$window","$rootScope","$compile","$q","$templateCache","$http","$animate","dimensions","$$rAF","TooltipFactory","element","config","getPosition","options","offset","position","getCalculatedOffset","actualWidth","actualHeight","split","top","height","left","width","$tooltip","nodeName","toLowerCase","$options","extend","$promise","fetchTemplate","scope","$scope","$new","isString","parseFloat","$hide","$$postDigest","hide","$show","$toggle","toggle","$isShown","timeout","hoverState","then","templateEl","contentEl","findElement","length","removeAttr","outerHTML","tipLinker","tipElement","tipTemplate","tipContainer","isObject","data","replace","htmlReplaceRegExp","trim","apply","init","isNumber","isElement","triggers","forEach","on","enter","leave","isTouch","$onFocusElementMouseDown","focus","destroy","i","off","remove","clearTimeout","$destroy","setTimeout","$emit","parent","after","$element","css","display","visibility","addClass","$$phase","$root","$digest","$applyPlacement","$onKeyUp","$onFocusKeyUp","blur","elementPosition","tipWidth","prop","tipHeight","tipPosition","evt","which","preventDefault","stopPropagation","query","document","querySelectorAll","when","get","res","put","String","prototype","directive","$location","$sce","restrict","link","attr","key","isDefined","$observe","newValue","oldValue","trustAsHtml","tooltip","bsTooltip","$watch","bsShow","match","$on"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions'])\n\n .provider('$tooltip', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n customClass: '',\n prefixClass: 'tooltip',\n prefixEvent: 'tooltip',\n container: false,\n target: false,\n placement: 'top',\n template: 'tooltip/tooltip.tpl.html',\n contentTemplate: false,\n trigger: 'hover focus',\n keyboard: false,\n html: false,\n show: false,\n title: '',\n type: '',\n delay: 0\n };\n\n this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, dimensions, $$rAF) {\n\n var trim = String.prototype.trim;\n var isTouch = 'createTouch' in $window.document;\n var htmlReplaceRegExp = /ng-bind=\"/ig;\n\n function TooltipFactory(element, config) {\n\n var $tooltip = {};\n\n // Common vars\n var nodeName = element[0].nodeName.toLowerCase();\n var options = $tooltip.$options = angular.extend({}, defaults, config);\n $tooltip.$promise = fetchTemplate(options.template);\n var scope = $tooltip.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n if(options.delay && angular.isString(options.delay)) {\n options.delay = parseFloat(options.delay);\n }\n\n // Support scope as string options\n if(options.title) {\n $tooltip.$scope.title = options.title;\n }\n\n // Provide scope helpers\n scope.$hide = function() {\n scope.$$postDigest(function() {\n $tooltip.hide();\n });\n };\n scope.$show = function() {\n scope.$$postDigest(function() {\n $tooltip.show();\n });\n };\n scope.$toggle = function() {\n scope.$$postDigest(function() {\n $tooltip.toggle();\n });\n };\n $tooltip.$isShown = scope.$isShown = false;\n\n // Private vars\n var timeout, hoverState;\n\n // Support contentTemplate option\n if(options.contentTemplate) {\n $tooltip.$promise = $tooltip.$promise.then(function(template) {\n var templateEl = angular.element(template);\n return fetchTemplate(options.contentTemplate)\n .then(function(contentTemplate) {\n var contentEl = findElement('[ng-bind=\"content\"]', templateEl[0]);\n if(!contentEl.length) contentEl = findElement('[ng-bind=\"title\"]', templateEl[0]);\n contentEl.removeAttr('ng-bind').html(contentTemplate);\n return templateEl[0].outerHTML;\n });\n });\n }\n\n // Fetch, compile then initialize tooltip\n var tipLinker, tipElement, tipTemplate, tipContainer;\n $tooltip.$promise.then(function(template) {\n if(angular.isObject(template)) template = template.data;\n if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html=\"');\n template = trim.apply(template);\n tipTemplate = template;\n tipLinker = $compile(template);\n $tooltip.init();\n });\n\n $tooltip.init = function() {\n\n // Options: delay\n if (options.delay && angular.isNumber(options.delay)) {\n options.delay = {\n show: options.delay,\n hide: options.delay\n };\n }\n\n // Replace trigger on touch devices ?\n // if(isTouch && options.trigger === defaults.trigger) {\n // options.trigger.replace(/hover/g, 'click');\n // }\n\n // Options : container\n if(options.container === 'self') {\n tipContainer = element;\n } else if(angular.isElement(options.container)) {\n tipContainer = options.container;\n } else if(options.container) {\n tipContainer = findElement(options.container);\n }\n\n // Options: trigger\n var triggers = options.trigger.split(' ');\n angular.forEach(triggers, function(trigger) {\n if(trigger === 'click') {\n element.on('click', $tooltip.toggle);\n } else if(trigger !== 'manual') {\n element.on(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);\n element.on(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);\n nodeName === 'button' && trigger !== 'hover' && element.on(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);\n }\n });\n\n // Options: target\n if(options.target) {\n options.target = angular.isElement(options.target) ? options.target : findElement(options.target)[0];\n }\n\n // Options: show\n if(options.show) {\n scope.$$postDigest(function() {\n options.trigger === 'focus' ? element[0].focus() : $tooltip.show();\n });\n }\n\n };\n\n $tooltip.destroy = function() {\n\n // Unbind events\n var triggers = options.trigger.split(' ');\n for (var i = triggers.length; i--;) {\n var trigger = triggers[i];\n if(trigger === 'click') {\n element.off('click', $tooltip.toggle);\n } else if(trigger !== 'manual') {\n element.off(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);\n element.off(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);\n nodeName === 'button' && trigger !== 'hover' && element.off(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);\n }\n }\n\n // Remove element\n if(tipElement) {\n tipElement.remove();\n tipElement = null;\n }\n\n // Cancel pending callbacks\n clearTimeout(timeout);\n\n // Destroy scope\n scope.$destroy();\n\n };\n\n $tooltip.enter = function() {\n\n clearTimeout(timeout);\n hoverState = 'in';\n if (!options.delay || !options.delay.show) {\n return $tooltip.show();\n }\n\n timeout = setTimeout(function() {\n if (hoverState ==='in') $tooltip.show();\n }, options.delay.show);\n\n };\n\n $tooltip.show = function() {\n\n scope.$emit(options.prefixEvent + '.show.before', $tooltip);\n var parent = options.container ? tipContainer : null;\n var after = options.container ? null : element;\n\n // Hide any existing tipElement\n if(tipElement) tipElement.remove();\n // Fetch a cloned element linked from template\n tipElement = $tooltip.$element = tipLinker(scope, function(clonedElement, scope) {});\n\n // Set the initial positioning. Make the tooltip invisible\n // so IE doesn't try to focus on it off screen.\n tipElement.css({top: '-9999px', left: '-9999px', display: 'block', visibility: 'hidden'}).addClass(options.placement);\n\n // Options: animation\n if(options.animation) tipElement.addClass(options.animation);\n // Options: type\n if(options.type) tipElement.addClass(options.prefixClass + '-' + options.type);\n // Options: custom classes\n if(options.customClass) tipElement.addClass(options.customClass);\n\n $animate.enter(tipElement, parent, after, function() {\n scope.$emit(options.prefixEvent + '.show', $tooltip);\n });\n $tooltip.$isShown = scope.$isShown = true;\n scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n $$rAF(function () {\n $tooltip.$applyPlacement();\n\n // Once placed, make the tooltip visible\n tipElement.css({visibility: 'visible'});\n }); // var a = bodyEl.offsetWidth + 1; ?\n\n // Bind events\n if(options.keyboard) {\n if(options.trigger !== 'focus') {\n $tooltip.focus();\n tipElement.on('keyup', $tooltip.$onKeyUp);\n } else {\n element.on('keyup', $tooltip.$onFocusKeyUp);\n }\n }\n\n };\n\n $tooltip.leave = function() {\n\n clearTimeout(timeout);\n hoverState = 'out';\n if (!options.delay || !options.delay.hide) {\n return $tooltip.hide();\n }\n timeout = setTimeout(function () {\n if (hoverState === 'out') {\n $tooltip.hide();\n }\n }, options.delay.hide);\n\n };\n\n $tooltip.hide = function(blur) {\n\n if(!$tooltip.$isShown) return;\n scope.$emit(options.prefixEvent + '.hide.before', $tooltip);\n\n $animate.leave(tipElement, function() {\n scope.$emit(options.prefixEvent + '.hide', $tooltip);\n });\n\n $tooltip.$isShown = scope.$isShown = false;\n scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n\n // Unbind events\n if(options.keyboard && tipElement !== null) {\n tipElement.off('keyup', $tooltip.$onKeyUp);\n }\n\n // Allow to blur the input when hidden, like when pressing enter key\n if(blur && options.trigger === 'focus') {\n return element[0].blur();\n }\n\n };\n\n $tooltip.toggle = function() {\n $tooltip.$isShown ? $tooltip.leave() : $tooltip.enter();\n };\n\n $tooltip.focus = function() {\n tipElement[0].focus();\n };\n\n // Protected methods\n\n $tooltip.$applyPlacement = function() {\n if(!tipElement) return;\n\n // Get the position of the tooltip element.\n var elementPosition = getPosition();\n\n // Get the height and width of the tooltip so we can center it.\n var tipWidth = tipElement.prop('offsetWidth'),\n tipHeight = tipElement.prop('offsetHeight');\n\n // Get the tooltip's top and left coordinates to center it with this directive.\n var tipPosition = getCalculatedOffset(options.placement, elementPosition, tipWidth, tipHeight);\n\n // Now set the calculated positioning.\n tipPosition.top += 'px';\n tipPosition.left += 'px';\n tipElement.css(tipPosition);\n\n };\n\n $tooltip.$onKeyUp = function(evt) {\n evt.which === 27 && $tooltip.hide();\n };\n\n $tooltip.$onFocusKeyUp = function(evt) {\n evt.which === 27 && element[0].blur();\n };\n\n $tooltip.$onFocusElementMouseDown = function(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n // Some browsers do not auto-focus buttons (eg. Safari)\n $tooltip.$isShown ? element[0].blur() : element[0].focus();\n };\n\n // Private methods\n\n function getPosition() {\n if(options.container === 'body') {\n return dimensions.offset(options.target[0] || element[0]);\n } else {\n return dimensions.position(options.target[0] || element[0]);\n }\n }\n\n function getCalculatedOffset(placement, position, actualWidth, actualHeight) {\n var offset;\n var split = placement.split('-');\n\n switch (split[0]) {\n case 'right':\n offset = {\n top: position.top + position.height / 2 - actualHeight / 2,\n left: position.left + position.width\n };\n break;\n case 'bottom':\n offset = {\n top: position.top + position.height,\n left: position.left + position.width / 2 - actualWidth / 2\n };\n break;\n case 'left':\n offset = {\n top: position.top + position.height / 2 - actualHeight / 2,\n left: position.left - actualWidth\n };\n break;\n default:\n offset = {\n top: position.top - actualHeight,\n left: position.left + position.width / 2 - actualWidth / 2\n };\n break;\n }\n\n if(!split[1]) {\n return offset;\n }\n\n // Add support for corners @todo css\n if(split[0] === 'top' || split[0] === 'bottom') {\n switch (split[1]) {\n case 'left':\n offset.left = position.left;\n break;\n case 'right':\n offset.left = position.left + position.width - actualWidth;\n }\n } else if(split[0] === 'left' || split[0] === 'right') {\n switch (split[1]) {\n case 'top':\n offset.top = position.top - actualHeight;\n break;\n case 'bottom':\n offset.top = position.top + position.height;\n }\n }\n\n return offset;\n }\n\n return $tooltip;\n\n }\n\n // Helper functions\n\n function findElement(query, element) {\n return angular.element((element || document).querySelectorAll(query));\n }\n\n function fetchTemplate(template) {\n return $q.when($templateCache.get(template) || $http.get(template))\n .then(function(res) {\n if(angular.isObject(res)) {\n $templateCache.put(template, res.data);\n return res.data;\n }\n return res;\n });\n }\n\n return TooltipFactory;\n\n };\n\n })\n\n .directive('bsTooltip', function($window, $location, $sce, $tooltip, $$rAF) {\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'type', 'customClass'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Observe scope attributes for change\n angular.forEach(['title'], function(key) {\n attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n angular.isDefined(oldValue) && $$rAF(function() {\n tooltip && tooltip.$applyPlacement();\n });\n });\n });\n\n // Support scope as an object\n attr.bsTooltip && scope.$watch(attr.bsTooltip, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.title = newValue;\n }\n angular.isDefined(oldValue) && $$rAF(function() {\n tooltip && tooltip.$applyPlacement();\n });\n }, true);\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!tooltip || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = newValue.match(',?(tooltip),?');\n newValue === true ? tooltip.show() : tooltip.hide();\n });\n\n // Initialize popover\n var tooltip = $tooltip(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n tooltip.destroy();\n options = null;\n tooltip = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"file":"tooltip.min.js","sources":["tooltip/tooltip.js"],"names":["angular","module","provider","defaults","this","animation","customClass","prefixClass","prefixEvent","container","target","placement","template","contentTemplate","trigger","keyboard","html","show","title","type","delay","$get","$window","$rootScope","$compile","$q","$templateCache","$http","$animate","dimensions","$$rAF","TooltipFactory","element","config","getPosition","options","offset","position","getCalculatedOffset","actualWidth","actualHeight","split","top","height","left","width","$tooltip","nodeName","toLowerCase","$options","extend","$promise","fetchTemplate","scope","$scope","$new","isString","parseFloat","$hide","$$postDigest","hide","$show","$toggle","toggle","$isShown","timeout","hoverState","then","templateEl","contentEl","findElement","length","removeAttr","outerHTML","tipLinker","tipElement","tipTemplate","tipContainer","isObject","data","replace","htmlReplaceRegExp","trim","apply","init","isNumber","isElement","triggers","forEach","on","enter","leave","isTouch","$onFocusElementMouseDown","focus","destroy","i","off","remove","clearTimeout","$destroy","setTimeout","$emit","parent","after","$element","css","display","visibility","addClass","$$phase","$root","$digest","$applyPlacement","$onKeyUp","$onFocusKeyUp","blur","elementPosition","tipWidth","prop","tipHeight","tipPosition","evt","which","preventDefault","stopPropagation","query","document","querySelectorAll","when","get","res","put","String","prototype","directive","$location","$sce","restrict","link","attr","key","isDefined","$observe","newValue","oldValue","trustAsHtml","tooltip","bsTooltip","$watch","bsShow","match","$on"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions'])\n\n .provider('$tooltip', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n customClass: '',\n prefixClass: 'tooltip',\n prefixEvent: 'tooltip',\n container: false,\n target: false,\n placement: 'top',\n template: 'tooltip/tooltip.tpl.html',\n contentTemplate: false,\n trigger: 'hover focus',\n keyboard: false,\n html: false,\n show: false,\n title: '',\n type: '',\n delay: 0\n };\n\n this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, dimensions, $$rAF) {\n\n var trim = String.prototype.trim;\n var isTouch = 'createTouch' in $window.document;\n var htmlReplaceRegExp = /ng-bind=\"/ig;\n\n function TooltipFactory(element, config) {\n\n var $tooltip = {};\n\n // Common vars\n var nodeName = element[0].nodeName.toLowerCase();\n var options = $tooltip.$options = angular.extend({}, defaults, config);\n $tooltip.$promise = fetchTemplate(options.template);\n var scope = $tooltip.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n if(options.delay && angular.isString(options.delay)) {\n options.delay = parseFloat(options.delay);\n }\n\n // Support scope as string options\n if(options.title) {\n $tooltip.$scope.title = options.title;\n }\n\n // Provide scope helpers\n scope.$hide = function() {\n scope.$$postDigest(function() {\n $tooltip.hide();\n });\n };\n scope.$show = function() {\n scope.$$postDigest(function() {\n $tooltip.show();\n });\n };\n scope.$toggle = function() {\n scope.$$postDigest(function() {\n $tooltip.toggle();\n });\n };\n $tooltip.$isShown = scope.$isShown = false;\n\n // Private vars\n var timeout, hoverState;\n\n // Support contentTemplate option\n if(options.contentTemplate) {\n $tooltip.$promise = $tooltip.$promise.then(function(template) {\n var templateEl = angular.element(template);\n return fetchTemplate(options.contentTemplate)\n .then(function(contentTemplate) {\n var contentEl = findElement('[ng-bind=\"content\"]', templateEl[0]);\n if(!contentEl.length) contentEl = findElement('[ng-bind=\"title\"]', templateEl[0]);\n contentEl.removeAttr('ng-bind').html(contentTemplate);\n return templateEl[0].outerHTML;\n });\n });\n }\n\n // Fetch, compile then initialize tooltip\n var tipLinker, tipElement, tipTemplate, tipContainer;\n $tooltip.$promise.then(function(template) {\n if(angular.isObject(template)) template = template.data;\n if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html=\"');\n template = trim.apply(template);\n tipTemplate = template;\n tipLinker = $compile(template);\n $tooltip.init();\n });\n\n $tooltip.init = function() {\n\n // Options: delay\n if (options.delay && angular.isNumber(options.delay)) {\n options.delay = {\n show: options.delay,\n hide: options.delay\n };\n }\n\n // Replace trigger on touch devices ?\n // if(isTouch && options.trigger === defaults.trigger) {\n // options.trigger.replace(/hover/g, 'click');\n // }\n\n // Options : container\n if(options.container === 'self') {\n tipContainer = element;\n } else if(angular.isElement(options.container)) {\n tipContainer = options.container;\n } else if(options.container) {\n tipContainer = findElement(options.container);\n }\n\n // Options: trigger\n var triggers = options.trigger.split(' ');\n angular.forEach(triggers, function(trigger) {\n if(trigger === 'click') {\n element.on('click', $tooltip.toggle);\n } else if(trigger !== 'manual') {\n element.on(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);\n element.on(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);\n nodeName === 'button' && trigger !== 'hover' && element.on(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);\n }\n });\n\n // Options: target\n if(options.target) {\n options.target = angular.isElement(options.target) ? options.target : findElement(options.target)[0];\n }\n\n // Options: show\n if(options.show) {\n scope.$$postDigest(function() {\n options.trigger === 'focus' ? element[0].focus() : $tooltip.show();\n });\n }\n\n };\n\n $tooltip.destroy = function() {\n\n // Unbind events\n var triggers = options.trigger.split(' ');\n for (var i = triggers.length; i--;) {\n var trigger = triggers[i];\n if(trigger === 'click') {\n element.off('click', $tooltip.toggle);\n } else if(trigger !== 'manual') {\n element.off(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);\n element.off(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);\n nodeName === 'button' && trigger !== 'hover' && element.off(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);\n }\n }\n\n // Remove element\n if(tipElement) {\n tipElement.remove();\n tipElement = null;\n }\n\n // Cancel pending callbacks\n clearTimeout(timeout);\n\n // Destroy scope\n scope.$destroy();\n\n };\n\n $tooltip.enter = function() {\n\n clearTimeout(timeout);\n hoverState = 'in';\n if (!options.delay || !options.delay.show) {\n return $tooltip.show();\n }\n\n timeout = setTimeout(function() {\n if (hoverState ==='in') $tooltip.show();\n }, options.delay.show);\n\n };\n\n $tooltip.show = function() {\n\n scope.$emit(options.prefixEvent + '.show.before', $tooltip);\n var parent = options.container ? tipContainer : null;\n var after = options.container ? null : element;\n\n // Hide any existing tipElement\n if(tipElement) tipElement.remove();\n // Fetch a cloned element linked from template\n tipElement = $tooltip.$element = tipLinker(scope, function(clonedElement, scope) {});\n\n // Set the initial positioning. Make the tooltip invisible\n // so IE doesn't try to focus on it off screen.\n tipElement.css({top: '-9999px', left: '-9999px', display: 'block', visibility: 'hidden'}).addClass(options.placement);\n\n // Options: animation\n if(options.animation) tipElement.addClass(options.animation);\n // Options: type\n if(options.type) tipElement.addClass(options.prefixClass + '-' + options.type);\n // Options: custom classes\n if(options.customClass) tipElement.addClass(options.customClass);\n\n $animate.enter(tipElement, parent, after, function() {\n scope.$emit(options.prefixEvent + '.show', $tooltip);\n });\n $tooltip.$isShown = scope.$isShown = true;\n scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n $$rAF(function () {\n $tooltip.$applyPlacement();\n\n // Once placed, make the tooltip visible\n tipElement.css({visibility: 'visible'});\n }); // var a = bodyEl.offsetWidth + 1; ?\n\n // Bind events\n if(options.keyboard) {\n if(options.trigger !== 'focus') {\n $tooltip.focus();\n tipElement.on('keyup', $tooltip.$onKeyUp);\n } else {\n element.on('keyup', $tooltip.$onFocusKeyUp);\n }\n }\n\n };\n\n $tooltip.leave = function() {\n\n clearTimeout(timeout);\n hoverState = 'out';\n if (!options.delay || !options.delay.hide) {\n return $tooltip.hide();\n }\n timeout = setTimeout(function () {\n if (hoverState === 'out') {\n $tooltip.hide();\n }\n }, options.delay.hide);\n\n };\n\n $tooltip.hide = function(blur) {\n\n if(!$tooltip.$isShown) return;\n scope.$emit(options.prefixEvent + '.hide.before', $tooltip);\n\n $animate.leave(tipElement, function() {\n scope.$emit(options.prefixEvent + '.hide', $tooltip);\n\n // Allow to blur the input when hidden, like when pressing enter key\n if(blur && options.trigger === 'focus') {\n return element[0].blur();\n }\n });\n\n $tooltip.$isShown = scope.$isShown = false;\n scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n\n // Unbind events\n if(options.keyboard && tipElement !== null) {\n tipElement.off('keyup', $tooltip.$onKeyUp);\n }\n\n };\n\n $tooltip.toggle = function() {\n $tooltip.$isShown ? $tooltip.leave() : $tooltip.enter();\n };\n\n $tooltip.focus = function() {\n tipElement[0].focus();\n };\n\n // Protected methods\n\n $tooltip.$applyPlacement = function() {\n if(!tipElement) return;\n\n // Get the position of the tooltip element.\n var elementPosition = getPosition();\n\n // Get the height and width of the tooltip so we can center it.\n var tipWidth = tipElement.prop('offsetWidth'),\n tipHeight = tipElement.prop('offsetHeight');\n\n // Get the tooltip's top and left coordinates to center it with this directive.\n var tipPosition = getCalculatedOffset(options.placement, elementPosition, tipWidth, tipHeight);\n\n // Now set the calculated positioning.\n tipPosition.top += 'px';\n tipPosition.left += 'px';\n tipElement.css(tipPosition);\n\n };\n\n $tooltip.$onKeyUp = function(evt) {\n evt.which === 27 && $tooltip.hide();\n };\n\n $tooltip.$onFocusKeyUp = function(evt) {\n evt.which === 27 && element[0].blur();\n };\n\n $tooltip.$onFocusElementMouseDown = function(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n // Some browsers do not auto-focus buttons (eg. Safari)\n $tooltip.$isShown ? element[0].blur() : element[0].focus();\n };\n\n // Private methods\n\n function getPosition() {\n if(options.container === 'body') {\n return dimensions.offset(options.target[0] || element[0]);\n } else {\n return dimensions.position(options.target[0] || element[0]);\n }\n }\n\n function getCalculatedOffset(placement, position, actualWidth, actualHeight) {\n var offset;\n var split = placement.split('-');\n\n switch (split[0]) {\n case 'right':\n offset = {\n top: position.top + position.height / 2 - actualHeight / 2,\n left: position.left + position.width\n };\n break;\n case 'bottom':\n offset = {\n top: position.top + position.height,\n left: position.left + position.width / 2 - actualWidth / 2\n };\n break;\n case 'left':\n offset = {\n top: position.top + position.height / 2 - actualHeight / 2,\n left: position.left - actualWidth\n };\n break;\n default:\n offset = {\n top: position.top - actualHeight,\n left: position.left + position.width / 2 - actualWidth / 2\n };\n break;\n }\n\n if(!split[1]) {\n return offset;\n }\n\n // Add support for corners @todo css\n if(split[0] === 'top' || split[0] === 'bottom') {\n switch (split[1]) {\n case 'left':\n offset.left = position.left;\n break;\n case 'right':\n offset.left = position.left + position.width - actualWidth;\n }\n } else if(split[0] === 'left' || split[0] === 'right') {\n switch (split[1]) {\n case 'top':\n offset.top = position.top - actualHeight;\n break;\n case 'bottom':\n offset.top = position.top + position.height;\n }\n }\n\n return offset;\n }\n\n return $tooltip;\n\n }\n\n // Helper functions\n\n function findElement(query, element) {\n return angular.element((element || document).querySelectorAll(query));\n }\n\n function fetchTemplate(template) {\n return $q.when($templateCache.get(template) || $http.get(template))\n .then(function(res) {\n if(angular.isObject(res)) {\n $templateCache.put(template, res.data);\n return res.data;\n }\n return res;\n });\n }\n\n return TooltipFactory;\n\n };\n\n })\n\n .directive('bsTooltip', function($window, $location, $sce, $tooltip, $$rAF) {\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'type', 'customClass'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Observe scope attributes for change\n angular.forEach(['title'], function(key) {\n attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n angular.isDefined(oldValue) && $$rAF(function() {\n tooltip && tooltip.$applyPlacement();\n });\n });\n });\n\n // Support scope as an object\n attr.bsTooltip && scope.$watch(attr.bsTooltip, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.title = newValue;\n }\n angular.isDefined(oldValue) && $$rAF(function() {\n tooltip && tooltip.$applyPlacement();\n });\n }, true);\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!tooltip || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = newValue.match(',?(tooltip),?');\n newValue === true ? tooltip.show() : tooltip.hide();\n });\n\n // Initialize popover\n var tooltip = $tooltip(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if(tooltip) tooltip.destroy();\n options = null;\n tooltip = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/modules/tooltip.tpl.js b/dist/modules/tooltip.tpl.js
index a7ea3af29..ecf805ebc 100644
--- a/dist/modules/tooltip.tpl.js
+++ b/dist/modules/tooltip.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/tooltip.tpl.min.js b/dist/modules/tooltip.tpl.min.js
index cb92851f1..e57f0c4de 100644
--- a/dist/modules/tooltip.tpl.min.js
+++ b/dist/modules/tooltip.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/typeahead.js b/dist/modules/typeahead.js
index 10e5f621f..a53ae01c7 100644
--- a/dist/modules/typeahead.js
+++ b/dist/modules/typeahead.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -104,9 +104,9 @@ angular.module('mgcrea.ngStrap.typeahead', [
$typeahead.$onKeyDown = function (evt) {
if (!/(38|40|13)/.test(evt.keyCode))
return;
- evt.preventDefault();
// Let ngSubmit pass if the typeahead tip is hidden
if ($typeahead.$isVisible()) {
+ evt.preventDefault();
evt.stopPropagation();
}
// Select with enter
diff --git a/dist/modules/typeahead.min.js b/dist/modules/typeahead.min.js
index 5bd00ab3e..b9da46371 100644
--- a/dist/modules/typeahead.min.js
+++ b/dist/modules/typeahead.min.js
@@ -1,9 +1,9 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-"use strict";angular.module("mgcrea.ngStrap.typeahead",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$typeahead",function(){var e=this.defaults={animation:"am-fade",prefixClass:"typeahead",prefixEvent:"$typeahead",placement:"bottom-left",template:"typeahead/typeahead.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,minLength:1,filter:"filter",limit:6};this.$get=["$window","$rootScope","$tooltip",function(t,n,a){function i(t,n,i){var o={},l=angular.extend({},e,i);o=a(t,l);var r=i.scope,c=o.$scope;c.$resetMatches=function(){c.$matches=[],c.$activeIndex=0},c.$resetMatches(),c.$activate=function(e){c.$$postDigest(function(){o.activate(e)})},c.$select=function(e){c.$$postDigest(function(){o.select(e)})},c.$isVisible=function(){return o.$isVisible()},o.update=function(e){c.$matches=e,c.$activeIndex>=e.length&&(c.$activeIndex=0)},o.activate=function(e){c.$activeIndex=e},o.select=function(e){var t=c.$matches[e].value;n.$setViewValue(t),n.$render(),c.$resetMatches(),r&&r.$digest(),c.$emit(l.prefixEvent+".select",t,e)},o.$isVisible=function(){return l.minLength&&n?c.$matches.length&&angular.isString(n.$viewValue)&&n.$viewValue.length>=l.minLength:!!c.$matches.length},o.$getIndex=function(e){var t=c.$matches.length,n=t;if(t){for(n=t;n--&&c.$matches[n].value!==e;);if(!(0>n))return n}},o.$onMouseDown=function(e){e.preventDefault(),e.stopPropagation()},o.$onKeyDown=function(e){/(38|40|13)/.test(e.keyCode)&&(e.preventDefault(),o.$isVisible()&&e.stopPropagation(),13===e.keyCode&&c.$matches.length?o.select(c.$activeIndex):38===e.keyCode&&c.$activeIndex>0?c.$activeIndex--:40===e.keyCode&&c.$activeIndex0)return void l.$setViewValue(l.$viewValue.substring(0,l.$viewValue.length-1));e.length>s&&(e=e.slice(0,s));var n=d.$isVisible();n&&d.update(e),(1!==e.length||e[0].value!==t)&&(!n&&d.update(e),l.$render())})}),l.$render=function(){if(l.$isEmpty(l.$viewValue))return t.val("");var e=d.$getIndex(l.$modelValue),n=angular.isDefined(e)?d.$scope.$matches[e].label:l.$viewValue;n=angular.isObject(n)?n.label:n,t.val(n.replace(/<(?:.|\n)*?>/gm,"").trim())},e.$on("$destroy",function(){d.destroy(),r=null,d=null})}}}]);
+"use strict";angular.module("mgcrea.ngStrap.typeahead",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$typeahead",function(){var e=this.defaults={animation:"am-fade",prefixClass:"typeahead",prefixEvent:"$typeahead",placement:"bottom-left",template:"typeahead/typeahead.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,minLength:1,filter:"filter",limit:6};this.$get=["$window","$rootScope","$tooltip",function(t,n,a){function i(t,n,i){var o={},l=angular.extend({},e,i);o=a(t,l);var r=i.scope,c=o.$scope;c.$resetMatches=function(){c.$matches=[],c.$activeIndex=0},c.$resetMatches(),c.$activate=function(e){c.$$postDigest(function(){o.activate(e)})},c.$select=function(e){c.$$postDigest(function(){o.select(e)})},c.$isVisible=function(){return o.$isVisible()},o.update=function(e){c.$matches=e,c.$activeIndex>=e.length&&(c.$activeIndex=0)},o.activate=function(e){c.$activeIndex=e},o.select=function(e){var t=c.$matches[e].value;n.$setViewValue(t),n.$render(),c.$resetMatches(),r&&r.$digest(),c.$emit(l.prefixEvent+".select",t,e)},o.$isVisible=function(){return l.minLength&&n?c.$matches.length&&angular.isString(n.$viewValue)&&n.$viewValue.length>=l.minLength:!!c.$matches.length},o.$getIndex=function(e){var t=c.$matches.length,n=t;if(t){for(n=t;n--&&c.$matches[n].value!==e;);if(!(0>n))return n}},o.$onMouseDown=function(e){e.preventDefault(),e.stopPropagation()},o.$onKeyDown=function(e){/(38|40|13)/.test(e.keyCode)&&(o.$isVisible()&&(e.preventDefault(),e.stopPropagation()),13===e.keyCode&&c.$matches.length?o.select(c.$activeIndex):38===e.keyCode&&c.$activeIndex>0?c.$activeIndex--:40===e.keyCode&&c.$activeIndex0)return void l.$setViewValue(l.$viewValue.substring(0,l.$viewValue.length-1));e.length>s&&(e=e.slice(0,s));var n=d.$isVisible();n&&d.update(e),(1!==e.length||e[0].value!==t)&&(!n&&d.update(e),l.$render())})}),l.$render=function(){if(l.$isEmpty(l.$viewValue))return t.val("");var e=d.$getIndex(l.$modelValue),n=angular.isDefined(e)?d.$scope.$matches[e].label:l.$viewValue;n=angular.isObject(n)?n.label:n,t.val(n.replace(/<(?:.|\n)*?>/gm,"").trim())},e.$on("$destroy",function(){d.destroy(),r=null,d=null})}}}]);
//# sourceMappingURL=typeahead.min.js.map
\ No newline at end of file
diff --git a/dist/modules/typeahead.min.js.map b/dist/modules/typeahead.min.js.map
index 758288069..adf65879b 100755
--- a/dist/modules/typeahead.min.js.map
+++ b/dist/modules/typeahead.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"typeahead.min.js","sources":["typeahead/typeahead.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","prefixEvent","placement","template","trigger","container","keyboard","html","delay","minLength","filter","limit","$get","$window","$rootScope","$tooltip","TypeaheadFactory","element","controller","config","$typeahead","options","extend","parentScope","scope","$scope","$resetMatches","$matches","$activeIndex","$activate","index","$$postDigest","activate","$select","select","$isVisible","update","matches","length","value","$setViewValue","$render","$digest","$emit","isString","$viewValue","$getIndex","l","i","$onMouseDown","evt","preventDefault","stopPropagation","$onKeyDown","test","keyCode","isUndefined","show","setTimeout","$element","on","hide","off","document","body","directive","$parse","$q","$parseOptions","restrict","require","link","attr","forEach","key","isDefined","ngOptions","parsedOptions","typeahead","watchOptions","watchedOptions","$match","replace","trim","$watch","valuesFn","then","values","ngModel","newValue","$modelValue","selectMode","substring","slice","isVisible","$isEmpty","val","selected","label","isObject","$on","destroy"],"mappings":"AAOA,YACAA,SAAQC,OAAO,4BACb,yBACA,wCACCC,SAAS,aAAc,WACxB,GAAIC,GAAWC,KAAKD,UAChBE,UAAW,UACXC,YAAa,YACbC,YAAa,aACbC,UAAW,cACXC,SAAU,+BACVC,QAAS,QACTC,WAAW,EACXC,UAAU,EACVC,MAAM,EACNC,MAAO,EACPC,UAAW,EACXC,OAAQ,SACRC,MAAO,EAEXb,MAAKc,MACH,UACA,aACA,WACA,SAAUC,EAASC,EAAYC,GAE7B,QAASC,GAAiBC,EAASC,EAAYC,GAC7C,GAAIC,MAEAC,EAAU3B,QAAQ4B,UAAWzB,EAAUsB,EAC3CC,GAAaL,EAASE,EAASI,EAC/B,IAAIE,GAAcJ,EAAOK,MACrBA,EAAQJ,EAAWK,MACvBD,GAAME,cAAgB,WACpBF,EAAMG,YACNH,EAAMI,aAAe,GAEvBJ,EAAME,gBACNF,EAAMK,UAAY,SAAUC,GAC1BN,EAAMO,aAAa,WACjBX,EAAWY,SAASF,MAGxBN,EAAMS,QAAU,SAAUH,GACxBN,EAAMO,aAAa,WACjBX,EAAWc,OAAOJ,MAGtBN,EAAMW,WAAa,WACjB,MAAOf,GAAWe,cAGpBf,EAAWgB,OAAS,SAAUC,GAC5Bb,EAAMG,SAAWU,EACbb,EAAMI,cAAgBS,EAAQC,SAChCd,EAAMI,aAAe,IAGzBR,EAAWY,SAAW,SAAUF,GAC9BN,EAAMI,aAAeE,GAEvBV,EAAWc,OAAS,SAAUJ,GAC5B,GAAIS,GAAQf,EAAMG,SAASG,GAAOS,KAClCrB,GAAWsB,cAAcD,GACzBrB,EAAWuB,UACXjB,EAAME,gBACFH,GACFA,EAAYmB,UAEdlB,EAAMmB,MAAMtB,EAAQpB,YAAc,UAAWsC,EAAOT,IAGtDV,EAAWe,WAAa,WACtB,MAAKd,GAAQZ,WAAcS,EAIpBM,EAAMG,SAASW,QAAU5C,QAAQkD,SAAS1B,EAAW2B,aAAe3B,EAAW2B,WAAWP,QAAUjB,EAAQZ,YAHxGe,EAAMG,SAASW,QAK5BlB,EAAW0B,UAAY,SAAUP,GAC/B,GAAIQ,GAAIvB,EAAMG,SAASW,OAAQU,EAAID,CACnC,IAAKA,EAAL,CAEA,IAAKC,EAAID,EAAGC,KACNxB,EAAMG,SAASqB,GAAGT,QAAUA,IAGlC,KAAQ,EAAJS,GAEJ,MAAOA,KAET5B,EAAW6B,aAAe,SAAUC,GAElCA,EAAIC,iBACJD,EAAIE,mBAENhC,EAAWiC,WAAa,SAAUH,GAC3B,aAAaI,KAAKJ,EAAIK,WAE3BL,EAAIC,iBAEA/B,EAAWe,cACbe,EAAIE,kBAGc,KAAhBF,EAAIK,SAAkB/B,EAAMG,SAASW,OACvClB,EAAWc,OAAOV,EAAMI,cAED,KAAhBsB,EAAIK,SAAkB/B,EAAMI,aAAe,EAClDJ,EAAMI,eACiB,KAAhBsB,EAAIK,SAAkB/B,EAAMI,aAAeJ,EAAMG,SAASW,OAAS,EAC1Ed,EAAMI,eACClC,QAAQ8D,YAAYhC,EAAMI,gBACjCJ,EAAMI,aAAe,GACvBJ,EAAMkB,WAGR,IAAIe,GAAOrC,EAAWqC,IACtBrC,GAAWqC,KAAO,WAChBA,IACAC,WAAW,WACTtC,EAAWuC,SAASC,GAAG,YAAaxC,EAAW6B,cAC3C5B,EAAQf,UACVW,EAAQ2C,GAAG,UAAWxC,EAAWiC,cAIvC,IAAIQ,GAAOzC,EAAWyC,IAQtB,OAPAzC,GAAWyC,KAAO,WAChBzC,EAAWuC,SAASG,IAAI,YAAa1C,EAAW6B,cAC5C5B,EAAQf,UACVW,EAAQ6C,IAAI,UAAW1C,EAAWiC,YAEpCQ,KAEKzC,EA9GI1B,QAAQuB,QAAQJ,EAAQkD,SAASC,KAiH9C,OADAhD,GAAiBnB,SAAWA,EACrBmB,MAGViD,UAAU,eACX,UACA,SACA,KACA,aACA,gBACA,SAAUpD,EAASqD,EAAQC,EAAI/C,EAAYgD,GACzC,GAAIvE,GAAWuB,EAAWvB,QAC1B,QACEwE,SAAU,MACVC,QAAS,UACTC,KAAM,SAAkB/C,EAAOP,EAASuD,EAAMtD,GAE5C,GAAIG,IAAYG,MAAOA,EACvB9B,SAAQ+E,SACN,YACA,YACA,QACA,UACA,WACA,OACA,YACA,WACA,SACA,QACA,YACA,eACA,cACC,SAAUC,GACPhF,QAAQiF,UAAUH,EAAKE,MACzBrD,EAAQqD,GAAOF,EAAKE,KAGxB,IAAIhE,GAASW,EAAQX,QAAUb,EAASa,OACpCC,EAAQU,EAAQV,OAASd,EAASc,MAClCiE,EAAYJ,EAAKI,SACjBlE,KACFkE,GAAa,MAAQlE,EAAS,eAC5BC,IACFiE,GAAa,cAAgBjE,EAC/B,IAAIkE,GAAgBT,EAAcQ,GAE9BE,EAAY1D,EAAWH,EAASC,EAAYG,EAEhD,IAAIA,EAAQ0D,aAAc,CAExB,GAAIC,GAAiBH,EAAcI,OAAO,GAAGC,QAAQ,OAAQ,IAAIA,QAAQ,UAAW,IAAIC,MACxF3D,GAAM4D,OAAOJ,EAAgB,WAE3BH,EAAcQ,SAAS7D,EAAON,GAAYoE,KAAK,SAAUC,GACvDT,EAAU1C,OAAOmD,GACjBrE,EAAWuB,cAEZ,GAGLjB,EAAM4D,OAAOZ,EAAKgB,QAAS,SAAUC,GAEnCjE,EAAMkE,YAAcD,EAEpBZ,EAAcQ,SAAS7D,EAAON,GAAYoE,KAAK,SAAUC,GAGvD,GAAIlE,EAAQsE,aAAeJ,EAAOjD,QAAUmD,EAASnD,OAAS,EAE5D,WADApB,GAAWsB,cAActB,EAAW2B,WAAW+C,UAAU,EAAG1E,EAAW2B,WAAWP,OAAS,GAGzFiD,GAAOjD,OAAS3B,IAClB4E,EAASA,EAAOM,MAAM,EAAGlF,GAC3B,IAAImF,GAAYhB,EAAU3C,YAC1B2D,IAAahB,EAAU1C,OAAOmD,IAER,IAAlBA,EAAOjD,QAAgBiD,EAAO,GAAGhD,QAAUkD,MAE9CK,GAAahB,EAAU1C,OAAOmD,GAE/BrE,EAAWuB,eAIfvB,EAAWuB,QAAU,WAEnB,GAAIvB,EAAW6E,SAAS7E,EAAW2B,YACjC,MAAO5B,GAAQ+E,IAAI,GACrB,IAAIlE,GAAQgD,EAAUhC,UAAU5B,EAAWwE,aACvCO,EAAWvG,QAAQiF,UAAU7C,GAASgD,EAAUrD,OAAOE,SAASG,GAAOoE,MAAQhF,EAAW2B,UAC9FoD,GAAWvG,QAAQyG,SAASF,GAAYA,EAASC,MAAQD,EACzDhF,EAAQ+E,IAAIC,EAASf,QAAQ,iBAAkB,IAAIC,SAGrD3D,EAAM4E,IAAI,WAAY,WACpBtB,EAAUuB,UACVhF,EAAU,KACVyD,EAAY","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.typeahead', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions'])\n\n .provider('$typeahead', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'typeahead',\n prefixEvent: '$typeahead',\n placement: 'bottom-left',\n template: 'typeahead/typeahead.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n minLength: 1,\n filter: 'filter',\n limit: 6\n };\n\n this.$get = function($window, $rootScope, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n\n function TypeaheadFactory(element, controller, config) {\n\n var $typeahead = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $typeahead = $tooltip(element, options);\n var parentScope = config.scope;\n var scope = $typeahead.$scope;\n\n scope.$resetMatches = function(){\n scope.$matches = [];\n scope.$activeIndex = 0;\n };\n scope.$resetMatches();\n\n scope.$activate = function(index) {\n scope.$$postDigest(function() {\n $typeahead.activate(index);\n });\n };\n\n scope.$select = function(index, evt) {\n scope.$$postDigest(function() {\n $typeahead.select(index);\n });\n };\n\n scope.$isVisible = function() {\n return $typeahead.$isVisible();\n };\n\n // Public methods\n\n $typeahead.update = function(matches) {\n scope.$matches = matches;\n if(scope.$activeIndex >= matches.length) {\n scope.$activeIndex = 0;\n }\n };\n\n $typeahead.activate = function(index) {\n scope.$activeIndex = index;\n };\n\n $typeahead.select = function(index) {\n var value = scope.$matches[index].value;\n controller.$setViewValue(value);\n controller.$render();\n scope.$resetMatches();\n if(parentScope) parentScope.$digest();\n // Emit event\n scope.$emit(options.prefixEvent + '.select', value, index);\n };\n\n // Protected methods\n\n $typeahead.$isVisible = function() {\n if(!options.minLength || !controller) {\n return !!scope.$matches.length;\n }\n // minLength support\n return scope.$matches.length && angular.isString(controller.$viewValue) && controller.$viewValue.length >= options.minLength;\n };\n\n $typeahead.$getIndex = function(value) {\n var l = scope.$matches.length, i = l;\n if(!l) return;\n for(i = l; i--;) {\n if(scope.$matches[i].value === value) break;\n }\n if(i < 0) return;\n return i;\n };\n\n $typeahead.$onMouseDown = function(evt) {\n // Prevent blur on mousedown\n evt.preventDefault();\n evt.stopPropagation();\n };\n\n $typeahead.$onKeyDown = function(evt) {\n if(!/(38|40|13)/.test(evt.keyCode)) return;\n evt.preventDefault();\n\n // Let ngSubmit pass if the typeahead tip is hidden\n if($typeahead.$isVisible()) {\n evt.stopPropagation();\n }\n\n // Select with enter\n if(evt.keyCode === 13 && scope.$matches.length) {\n $typeahead.select(scope.$activeIndex);\n }\n\n // Navigate with keyboard\n else if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--;\n else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;\n else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;\n scope.$digest();\n };\n\n // Overrides\n\n var show = $typeahead.show;\n $typeahead.show = function() {\n show();\n setTimeout(function() {\n $typeahead.$element.on('mousedown', $typeahead.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $typeahead.$onKeyDown);\n }\n });\n };\n\n var hide = $typeahead.hide;\n $typeahead.hide = function() {\n $typeahead.$element.off('mousedown', $typeahead.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $typeahead.$onKeyDown);\n }\n hide();\n };\n\n return $typeahead;\n\n }\n\n TypeaheadFactory.defaults = defaults;\n return TypeaheadFactory;\n\n };\n\n })\n\n .directive('bsTypeahead', function($window, $parse, $q, $typeahead, $parseOptions) {\n\n var defaults = $typeahead.defaults;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'filter', 'limit', 'minLength', 'watchOptions', 'selectMode'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Build proper ngOptions\n var filter = options.filter || defaults.filter;\n var limit = options.limit || defaults.limit;\n var ngOptions = attr.ngOptions;\n if(filter) ngOptions += ' | ' + filter + ':$viewValue';\n if(limit) ngOptions += ' | limitTo:' + limit;\n var parsedOptions = $parseOptions(ngOptions);\n\n // Initialize typeahead\n var typeahead = $typeahead(element, controller, options);\n\n // Watch options on demand\n if(options.watchOptions) {\n // Watch ngOptions values before filtering for changes, drop function calls\n var watchedOptions = parsedOptions.$match[7].replace(/\\|.+/, '').replace(/\\(.*\\)/g, '').trim();\n scope.$watch(watchedOptions, function (newValue, oldValue) {\n // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);\n parsedOptions.valuesFn(scope, controller).then(function (values) {\n typeahead.update(values);\n controller.$render();\n });\n }, true);\n }\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('$watch', element.attr('ng-model'), newValue);\n scope.$modelValue = newValue; // Publish modelValue on scope for custom templates\n parsedOptions.valuesFn(scope, controller)\n .then(function(values) {\n // Prevent input with no future prospect if selectMode is truthy\n // @TODO test selectMode\n if(options.selectMode && !values.length && newValue.length > 0) {\n controller.$setViewValue(controller.$viewValue.substring(0, controller.$viewValue.length - 1));\n return;\n }\n if(values.length > limit) values = values.slice(0, limit);\n var isVisible = typeahead.$isVisible();\n isVisible && typeahead.update(values);\n // Do not re-queue an update if a correct value has been selected\n if(values.length === 1 && values[0].value === newValue) return;\n !isVisible && typeahead.update(values);\n // Queue a new rendering that will leverage collection loading\n controller.$render();\n });\n });\n\n // Model rendering in view\n controller.$render = function () {\n // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n if(controller.$isEmpty(controller.$viewValue)) return element.val('');\n var index = typeahead.$getIndex(controller.$modelValue);\n var selected = angular.isDefined(index) ? typeahead.$scope.$matches[index].label : controller.$viewValue;\n selected = angular.isObject(selected) ? selected.label : selected;\n element.val(selected.replace(/<(?:.|\\n)*?>/gm, '').trim());\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n typeahead.destroy();\n options = null;\n typeahead = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"file":"typeahead.min.js","sources":["typeahead/typeahead.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","prefixEvent","placement","template","trigger","container","keyboard","html","delay","minLength","filter","limit","$get","$window","$rootScope","$tooltip","TypeaheadFactory","element","controller","config","$typeahead","options","extend","parentScope","scope","$scope","$resetMatches","$matches","$activeIndex","$activate","index","$$postDigest","activate","$select","select","$isVisible","update","matches","length","value","$setViewValue","$render","$digest","$emit","isString","$viewValue","$getIndex","l","i","$onMouseDown","evt","preventDefault","stopPropagation","$onKeyDown","test","keyCode","isUndefined","show","setTimeout","$element","on","hide","off","document","body","directive","$parse","$q","$parseOptions","restrict","require","link","attr","forEach","key","isDefined","ngOptions","parsedOptions","typeahead","watchOptions","watchedOptions","$match","replace","trim","$watch","valuesFn","then","values","ngModel","newValue","$modelValue","selectMode","substring","slice","isVisible","$isEmpty","val","selected","label","isObject","$on","destroy"],"mappings":"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","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.typeahead', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions'])\n\n .provider('$typeahead', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'typeahead',\n prefixEvent: '$typeahead',\n placement: 'bottom-left',\n template: 'typeahead/typeahead.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n minLength: 1,\n filter: 'filter',\n limit: 6\n };\n\n this.$get = function($window, $rootScope, $tooltip) {\n\n var bodyEl = angular.element($window.document.body);\n\n function TypeaheadFactory(element, controller, config) {\n\n var $typeahead = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $typeahead = $tooltip(element, options);\n var parentScope = config.scope;\n var scope = $typeahead.$scope;\n\n scope.$resetMatches = function(){\n scope.$matches = [];\n scope.$activeIndex = 0;\n };\n scope.$resetMatches();\n\n scope.$activate = function(index) {\n scope.$$postDigest(function() {\n $typeahead.activate(index);\n });\n };\n\n scope.$select = function(index, evt) {\n scope.$$postDigest(function() {\n $typeahead.select(index);\n });\n };\n\n scope.$isVisible = function() {\n return $typeahead.$isVisible();\n };\n\n // Public methods\n\n $typeahead.update = function(matches) {\n scope.$matches = matches;\n if(scope.$activeIndex >= matches.length) {\n scope.$activeIndex = 0;\n }\n };\n\n $typeahead.activate = function(index) {\n scope.$activeIndex = index;\n };\n\n $typeahead.select = function(index) {\n var value = scope.$matches[index].value;\n controller.$setViewValue(value);\n controller.$render();\n scope.$resetMatches();\n if(parentScope) parentScope.$digest();\n // Emit event\n scope.$emit(options.prefixEvent + '.select', value, index);\n };\n\n // Protected methods\n\n $typeahead.$isVisible = function() {\n if(!options.minLength || !controller) {\n return !!scope.$matches.length;\n }\n // minLength support\n return scope.$matches.length && angular.isString(controller.$viewValue) && controller.$viewValue.length >= options.minLength;\n };\n\n $typeahead.$getIndex = function(value) {\n var l = scope.$matches.length, i = l;\n if(!l) return;\n for(i = l; i--;) {\n if(scope.$matches[i].value === value) break;\n }\n if(i < 0) return;\n return i;\n };\n\n $typeahead.$onMouseDown = function(evt) {\n // Prevent blur on mousedown\n evt.preventDefault();\n evt.stopPropagation();\n };\n\n $typeahead.$onKeyDown = function(evt) {\n if(!/(38|40|13)/.test(evt.keyCode)) return;\n\n // Let ngSubmit pass if the typeahead tip is hidden\n if($typeahead.$isVisible()) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n // Select with enter\n if(evt.keyCode === 13 && scope.$matches.length) {\n $typeahead.select(scope.$activeIndex);\n }\n\n // Navigate with keyboard\n else if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--;\n else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;\n else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;\n scope.$digest();\n };\n\n // Overrides\n\n var show = $typeahead.show;\n $typeahead.show = function() {\n show();\n setTimeout(function() {\n $typeahead.$element.on('mousedown', $typeahead.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $typeahead.$onKeyDown);\n }\n });\n };\n\n var hide = $typeahead.hide;\n $typeahead.hide = function() {\n $typeahead.$element.off('mousedown', $typeahead.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $typeahead.$onKeyDown);\n }\n hide();\n };\n\n return $typeahead;\n\n }\n\n TypeaheadFactory.defaults = defaults;\n return TypeaheadFactory;\n\n };\n\n })\n\n .directive('bsTypeahead', function($window, $parse, $q, $typeahead, $parseOptions) {\n\n var defaults = $typeahead.defaults;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'filter', 'limit', 'minLength', 'watchOptions', 'selectMode'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Build proper ngOptions\n var filter = options.filter || defaults.filter;\n var limit = options.limit || defaults.limit;\n var ngOptions = attr.ngOptions;\n if(filter) ngOptions += ' | ' + filter + ':$viewValue';\n if(limit) ngOptions += ' | limitTo:' + limit;\n var parsedOptions = $parseOptions(ngOptions);\n\n // Initialize typeahead\n var typeahead = $typeahead(element, controller, options);\n\n // Watch options on demand\n if(options.watchOptions) {\n // Watch ngOptions values before filtering for changes, drop function calls\n var watchedOptions = parsedOptions.$match[7].replace(/\\|.+/, '').replace(/\\(.*\\)/g, '').trim();\n scope.$watch(watchedOptions, function (newValue, oldValue) {\n // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);\n parsedOptions.valuesFn(scope, controller).then(function (values) {\n typeahead.update(values);\n controller.$render();\n });\n }, true);\n }\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('$watch', element.attr('ng-model'), newValue);\n scope.$modelValue = newValue; // Publish modelValue on scope for custom templates\n parsedOptions.valuesFn(scope, controller)\n .then(function(values) {\n // Prevent input with no future prospect if selectMode is truthy\n // @TODO test selectMode\n if(options.selectMode && !values.length && newValue.length > 0) {\n controller.$setViewValue(controller.$viewValue.substring(0, controller.$viewValue.length - 1));\n return;\n }\n if(values.length > limit) values = values.slice(0, limit);\n var isVisible = typeahead.$isVisible();\n isVisible && typeahead.update(values);\n // Do not re-queue an update if a correct value has been selected\n if(values.length === 1 && values[0].value === newValue) return;\n !isVisible && typeahead.update(values);\n // Queue a new rendering that will leverage collection loading\n controller.$render();\n });\n });\n\n // Model rendering in view\n controller.$render = function () {\n // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n if(controller.$isEmpty(controller.$viewValue)) return element.val('');\n var index = typeahead.$getIndex(controller.$modelValue);\n var selected = angular.isDefined(index) ? typeahead.$scope.$matches[index].label : controller.$viewValue;\n selected = angular.isObject(selected) ? selected.label : selected;\n element.val(selected.replace(/<(?:.|\\n)*?>/gm, '').trim());\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n typeahead.destroy();\n options = null;\n typeahead = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/modules/typeahead.tpl.js b/dist/modules/typeahead.tpl.js
index e2a262947..e12ad473c 100644
--- a/dist/modules/typeahead.tpl.js
+++ b/dist/modules/typeahead.tpl.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/dist/modules/typeahead.tpl.min.js b/dist/modules/typeahead.tpl.min.js
index c590a526a..7efafd499 100644
--- a/dist/modules/typeahead.tpl.min.js
+++ b/dist/modules/typeahead.tpl.min.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.4 - 2014-07-24
+ * @version v2.0.5 - 2014-08-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
diff --git a/package.json b/package.json
index d75701ec6..6e0a60eab 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "angular-strap",
"description": "AngularStrap - AngularJS directives for Bootstrap",
- "version": "2.0.4",
+ "version": "2.0.5",
"keywords": [
"angular",
"bootstrap"