diff --git a/bower.json b/bower.json
index a504e9d18..2e38b2479 100644
--- a/bower.json
+++ b/bower.json
@@ -1,7 +1,7 @@
{
"name": "angular-strap",
"description": "AngularStrap - AngularJS directives for Twitter Bootstrap",
- "version": "2.0.0-rc.4",
+ "version": "2.0.0",
"keywords": [
"angular",
"bootstrap"
@@ -19,7 +19,8 @@
},
"licenses": [
{
- "type": "MIT"
+ "type": "MIT",
+ "url": "https://github.com/mgcrea/angular-strap/blob/master/LICENSE.md"
}
],
"main": [
diff --git a/dist/angular-strap.js b/dist/angular-strap.js
index 44d86bac9..24503a9b1 100644
--- a/dist/angular-strap.js
+++ b/dist/angular-strap.js
@@ -1,64 +1,131 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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 (window, document, undefined) {
- 'use strict';
- // Source: src/module.js
- 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'
- ]);
- // Source: src/affix/affix.js
- angular.module('mgcrea.ngStrap.affix', ['mgcrea.ngStrap.helpers.dimensions']).provider('$affix', function () {
- var defaults = this.defaults = { offsetTop: 'auto' };
- this.$get = [
- '$window',
- 'dimensions',
- function ($window, dimensions) {
- var bodyEl = angular.element($window.document.body);
- function AffixFactory(element, config) {
- var $affix = {};
- // Common vars
- var options = angular.extend({}, defaults, config);
- var targetEl = options.target;
- // Initial private vars
- var reset = 'affix affix-top affix-bottom', initialAffixTop = 0, initialOffsetTop = 0, affixed = null, unpin = null;
- var parent = element.parent();
- // Options: custom parent
- if (options.offsetParent) {
- if (options.offsetParent.match(/^\d+$/)) {
- for (var i = 0; i < options.offsetParent * 1 - 1; i++) {
- parent = parent.parent();
- }
+(function(window, document, undefined) {
+'use strict';
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/module.js
+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'
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/affix/affix.js
+angular.module('mgcrea.ngStrap.affix', [
+ 'mgcrea.ngStrap.helpers.dimensions',
+ 'mgcrea.ngStrap.helpers.debounce'
+]).provider('$affix', function () {
+ var defaults = this.defaults = { offsetTop: 'auto' };
+ this.$get = [
+ '$window',
+ 'debounce',
+ 'dimensions',
+ function ($window, debounce, dimensions) {
+ var bodyEl = angular.element($window.document.body);
+ var windowEl = angular.element($window);
+ function AffixFactory(element, config) {
+ var $affix = {};
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ var targetEl = options.target;
+ // Initial private vars
+ var reset = 'affix affix-top affix-bottom', initialAffixTop = 0, initialOffsetTop = 0, offsetTop = 0, offsetBottom = 0, affixed = null, unpin = null;
+ var parent = element.parent();
+ // Options: custom parent
+ if (options.offsetParent) {
+ if (options.offsetParent.match(/^\d+$/)) {
+ for (var i = 0; i < options.offsetParent * 1 - 1; i++) {
+ parent = parent.parent();
+ }
+ } else {
+ parent = angular.element(options.offsetParent);
+ }
+ }
+ $affix.init = function () {
+ $affix.$parseOffsets();
+ initialOffsetTop = dimensions.offset(element[0]).top + initialAffixTop;
+ // Bind events
+ targetEl.on('scroll', $affix.checkPosition);
+ targetEl.on('click', $affix.checkPositionWithEventLoop);
+ windowEl.on('resize', $affix.$debouncedOnResize);
+ // Both of these checkPosition() calls are necessary for the case where
+ // the user hits refresh after scrolling to the bottom of the page.
+ $affix.checkPosition();
+ $affix.checkPositionWithEventLoop();
+ };
+ $affix.destroy = function () {
+ // Unbind events
+ targetEl.off('scroll', $affix.checkPosition);
+ targetEl.off('click', $affix.checkPositionWithEventLoop);
+ windowEl.off('resize', $affix.$debouncedOnResize);
+ };
+ $affix.checkPositionWithEventLoop = function () {
+ setTimeout($affix.checkPosition, 1);
+ };
+ $affix.checkPosition = function () {
+ // if (!this.$element.is(':visible')) return
+ var scrollTop = getScrollTop();
+ var position = dimensions.offset(element[0]);
+ var elementHeight = dimensions.height(element[0]);
+ // Get required affix class according to position
+ var affix = getRequiredAffixClass(unpin, position, elementHeight);
+ // Did affix status changed this last check?
+ if (affixed === affix)
+ return;
+ affixed = affix;
+ // Add proper affix class
+ element.removeClass(reset).addClass('affix' + (affix !== 'middle' ? '-' + affix : ''));
+ if (affix === 'top') {
+ unpin = null;
+ element.css('position', options.offsetParent ? '' : 'relative');
+ element.css('top', '');
+ } else if (affix === 'bottom') {
+ if (options.offsetUnpin) {
+ unpin = -(options.offsetUnpin * 1);
} else {
- parent = angular.element(options.offsetParent);
- }
+ // Calculate unpin threshold when affixed to bottom.
+ // Hopefully the browser scrolls pixel by pixel.
+ unpin = position.top - scrollTop;
+ }
+ element.css('position', options.offsetParent ? '' : 'relative');
+ element.css('top', options.offsetParent ? '' : bodyEl[0].offsetHeight - offsetBottom - elementHeight - initialOffsetTop + 'px');
+ } else {
+ // affix === 'middle'
+ unpin = null;
+ element.css('position', 'fixed');
+ element.css('top', initialAffixTop + 'px');
}
- // Options: offsets
- var offsetTop = 0;
+ };
+ $affix.$onResize = function () {
+ $affix.$parseOffsets();
+ $affix.checkPosition();
+ };
+ $affix.$debouncedOnResize = debounce($affix.$onResize, 50);
+ $affix.$parseOffsets = function () {
+ // Reset position to calculate correct offsetTop
+ element.css('position', options.offsetParent ? '' : 'relative');
if (options.offsetTop) {
if (options.offsetTop === 'auto') {
options.offsetTop = '+0';
}
if (options.offsetTop.match(/^[-+]\d+$/)) {
- initialAffixTop -= options.offsetTop * 1;
+ initialAffixTop = -options.offsetTop * 1;
if (options.offsetParent) {
offsetTop = dimensions.offset(parent[0]).top + options.offsetTop * 1;
} else {
@@ -68,7 +135,6 @@
offsetTop = options.offsetTop * 1;
}
}
- var offsetBottom = 0;
if (options.offsetBottom) {
if (options.offsetParent && options.offsetBottom.match(/^[-+]\d+$/)) {
// add 1 pixel due to rounding problems...
@@ -77,3467 +143,3544 @@
offsetBottom = options.offsetBottom * 1;
}
}
- $affix.init = function () {
- initialOffsetTop = dimensions.offset(element[0]).top + initialAffixTop;
- // Bind events
- targetEl.on('scroll', this.checkPosition);
- targetEl.on('click', this.checkPositionWithEventLoop);
- // Both of these checkPosition() calls are necessary for the case where
- // the user hits refresh after scrolling to the bottom of the page.
- this.checkPosition();
- this.checkPositionWithEventLoop();
- };
- $affix.destroy = function () {
- // Unbind events
- targetEl.off('scroll', this.checkPosition);
- targetEl.off('click', this.checkPositionWithEventLoop);
- };
- $affix.checkPositionWithEventLoop = function () {
- setTimeout(this.checkPosition, 1);
- };
- $affix.checkPosition = function () {
- // if (!this.$element.is(':visible')) return
- var scrollTop = getScrollTop();
- var position = dimensions.offset(element[0]);
- var elementHeight = dimensions.height(element[0]);
- // Get required affix class according to position
- var affix = getRequiredAffixClass(unpin, position, elementHeight);
- // Did affix status changed this last check?
- if (affixed === affix)
- return;
- affixed = affix;
- // Add proper affix class
- element.removeClass(reset).addClass('affix' + (affix !== 'middle' ? '-' + affix : ''));
- if (affix === 'top') {
- unpin = null;
- element.css('position', options.offsetParent ? '' : 'relative');
- element.css('top', '');
- } else if (affix === 'bottom') {
- if (options.offsetUnpin) {
- unpin = -(options.offsetUnpin * 1);
- } else {
- // Calculate unpin threshold when affixed to bottom.
- // Hopefully the browser scrolls pixel by pixel.
- unpin = position.top - scrollTop;
- }
- element.css('position', options.offsetParent ? '' : 'relative');
- element.css('top', options.offsetParent ? '' : bodyEl[0].offsetHeight - offsetBottom - elementHeight - initialOffsetTop + 'px');
- } else {
- // affix === 'middle'
- unpin = null;
- element.css('position', 'fixed');
- element.css('top', initialAffixTop + 'px');
- }
- };
- // Private methods
- function getRequiredAffixClass(unpin, position, elementHeight) {
- var scrollTop = getScrollTop();
- var scrollHeight = getScrollHeight();
- if (scrollTop <= offsetTop) {
- return 'top';
- } else if (unpin !== null && scrollTop + unpin <= position.top) {
- return 'middle';
- } else if (offsetBottom !== null && position.top + elementHeight + initialAffixTop >= scrollHeight - offsetBottom) {
- return 'bottom';
- } else {
- return 'middle';
- }
- }
- function getScrollTop() {
- return targetEl[0] === $window ? $window.pageYOffset : targetEl[0] === $window;
- }
- function getScrollHeight() {
- return targetEl[0] === $window ? $window.document.body.scrollHeight : targetEl[0].scrollHeight;
+ };
+ // Private methods
+ function getRequiredAffixClass(unpin, position, elementHeight) {
+ var scrollTop = getScrollTop();
+ var scrollHeight = getScrollHeight();
+ if (scrollTop <= offsetTop) {
+ return 'top';
+ } else if (unpin !== null && scrollTop + unpin <= position.top) {
+ return 'middle';
+ } else if (offsetBottom !== null && position.top + elementHeight + initialAffixTop >= scrollHeight - offsetBottom) {
+ return 'bottom';
+ } else {
+ return 'middle';
}
- $affix.init();
- return $affix;
}
- return AffixFactory;
- }
- ];
- }).directive('bsAffix', [
- '$affix',
- '$window',
- function ($affix, $window) {
- return {
- restrict: 'EAC',
- require: '^?bsAffixTarget',
- link: function postLink(scope, element, attr, affixTarget) {
- var options = {
- scope: scope,
- offsetTop: 'auto',
- target: affixTarget ? affixTarget.$element : angular.element($window)
- };
- angular.forEach([
- 'offsetTop',
- 'offsetBottom',
- 'offsetParent',
- 'offsetUnpin'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- var affix = $affix(element, options);
- scope.$on('$destroy', function () {
- options = null;
- affix = null;
- });
+ function getScrollTop() {
+ return targetEl[0] === $window ? $window.pageYOffset : targetEl[0] === $window;
}
- };
+ function getScrollHeight() {
+ return targetEl[0] === $window ? $window.document.body.scrollHeight : targetEl[0].scrollHeight;
+ }
+ $affix.init();
+ return $affix;
+ }
+ return AffixFactory;
}
- ]).directive('bsAffixTarget', function () {
+ ];
+}).directive('bsAffix', [
+ '$affix',
+ '$window',
+ function ($affix, $window) {
return {
- controller: [
- '$element',
- function ($element) {
- this.$element = $element;
+ restrict: 'EAC',
+ require: '^?bsAffixTarget',
+ link: function postLink(scope, element, attr, affixTarget) {
+ var options = {
+ scope: scope,
+ offsetTop: 'auto',
+ target: affixTarget ? affixTarget.$element : angular.element($window)
+ };
+ angular.forEach([
+ 'offsetTop',
+ 'offsetBottom',
+ 'offsetParent',
+ 'offsetUnpin'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ var affix = $affix(element, options);
+ scope.$on('$destroy', function () {
+ options = null;
+ affix = null;
+ });
+ }
+ };
+ }
+]).directive('bsAffixTarget', function () {
+ return {
+ controller: [
+ '$element',
+ function ($element) {
+ this.$element = $element;
+ }
+ ]
+ };
+});
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/alert/alert.js
+// @BUG: following snippet won't compile correctly
+// @TODO: submit issue to core
+// ' ' +
+angular.module('mgcrea.ngStrap.alert', ['mgcrea.ngStrap.modal']).provider('$alert', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ prefixClass: 'alert',
+ placement: null,
+ template: 'alert/alert.tpl.html',
+ container: false,
+ element: null,
+ backdrop: false,
+ keyboard: true,
+ show: true,
+ duration: false,
+ type: false
+ };
+ this.$get = [
+ '$modal',
+ '$timeout',
+ function ($modal, $timeout) {
+ function AlertFactory(config) {
+ var $alert = {};
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ $alert = $modal(options);
+ // Support scope as string options [/*title, content, */type]
+ if (options.type) {
+ $alert.$scope.type = options.type;
+ }
+ // Support auto-close duration
+ var show = $alert.show;
+ if (options.duration) {
+ $alert.show = function () {
+ show();
+ $timeout(function () {
+ $alert.hide();
+ }, options.duration * 1000);
+ };
}
- ]
+ return $alert;
+ }
+ return AlertFactory;
+ }
+ ];
+}).directive('bsAlert', [
+ '$window',
+ '$location',
+ '$sce',
+ '$alert',
+ function ($window, $location, $sce, $alert) {
+ var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
+ return {
+ restrict: 'EAC',
+ scope: true,
+ link: function postLink(scope, element, attr, transclusion) {
+ // Directive options
+ var options = {
+ scope: scope,
+ element: element,
+ show: false
+ };
+ angular.forEach([
+ 'template',
+ 'placement',
+ 'keyboard',
+ 'html',
+ 'container',
+ 'animation',
+ 'duration'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Support scope as data-attrs
+ angular.forEach([
+ 'title',
+ 'content',
+ 'type'
+ ], function (key) {
+ attr[key] && attr.$observe(key, function (newValue, oldValue) {
+ scope[key] = $sce.trustAsHtml(newValue);
+ });
+ });
+ // Support scope as an object
+ attr.bsAlert && scope.$watch(attr.bsAlert, function (newValue, oldValue) {
+ if (angular.isObject(newValue)) {
+ angular.extend(scope, newValue);
+ } else {
+ scope.content = newValue;
+ }
+ }, true);
+ // Initialize alert
+ var alert = $alert(options);
+ // Trigger
+ element.on(attr.trigger || 'click', alert.toggle);
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ alert.destroy();
+ options = null;
+ alert = null;
+ });
+ }
};
- });
- // Source: src/alert/alert.js
- // @BUG: following snippet won't compile correctly
- // @TODO: submit issue to core
- // ' ' +
- angular.module('mgcrea.ngStrap.alert', []).provider('$alert', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- prefixClass: 'alert',
- placement: null,
- template: 'alert/alert.tpl.html',
- container: false,
- element: null,
- backdrop: false,
- keyboard: true,
- show: true,
- duration: false,
- type: false
- };
- this.$get = [
- '$modal',
- '$timeout',
- function ($modal, $timeout) {
- function AlertFactory(config) {
- var $alert = {};
- // Common vars
- var options = angular.extend({}, defaults, config);
- $alert = $modal(options);
- // Support scope as string options [/*title, content, */type]
- if (options.type) {
- $alert.$scope.type = options.type;
- }
- // Support auto-close duration
- var show = $alert.show;
- if (options.duration) {
- $alert.show = function () {
- show();
- $timeout(function () {
- $alert.hide();
- }, options.duration * 1000);
- };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/aside/aside.js
+angular.module('mgcrea.ngStrap.aside', ['mgcrea.ngStrap.modal']).provider('$aside', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade-and-slide-right',
+ prefixClass: 'aside',
+ placement: 'right',
+ template: 'aside/aside.tpl.html',
+ contentTemplate: false,
+ container: false,
+ element: null,
+ backdrop: true,
+ keyboard: true,
+ html: false,
+ show: true
+ };
+ this.$get = [
+ '$modal',
+ function ($modal) {
+ function AsideFactory(config) {
+ var $aside = {};
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ $aside = $modal(options);
+ return $aside;
+ }
+ return AsideFactory;
+ }
+ ];
+}).directive('bsAside', [
+ '$window',
+ '$location',
+ '$sce',
+ '$aside',
+ function ($window, $location, $sce, $aside) {
+ var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
+ return {
+ restrict: 'EAC',
+ scope: true,
+ link: function postLink(scope, element, attr, transclusion) {
+ // Directive options
+ var options = {
+ scope: scope,
+ element: element,
+ show: false
+ };
+ angular.forEach([
+ 'template',
+ 'contentTemplate',
+ 'placement',
+ 'backdrop',
+ 'keyboard',
+ 'html',
+ 'container',
+ 'animation'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Support scope as data-attrs
+ angular.forEach([
+ 'title',
+ 'content'
+ ], function (key) {
+ attr[key] && attr.$observe(key, function (newValue, oldValue) {
+ scope[key] = $sce.trustAsHtml(newValue);
+ });
+ });
+ // Support scope as an object
+ attr.bsAside && scope.$watch(attr.bsAside, function (newValue, oldValue) {
+ if (angular.isObject(newValue)) {
+ angular.extend(scope, newValue);
+ } else {
+ scope.content = newValue;
}
- return $alert;
- }
- return AlertFactory;
+ }, true);
+ // Initialize aside
+ var aside = $aside(options);
+ // Trigger
+ element.on(attr.trigger || 'click', aside.toggle);
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ aside.destroy();
+ options = null;
+ aside = null;
+ });
}
- ];
- }).directive('bsAlert', [
- '$window',
- '$location',
- '$sce',
- '$alert',
- function ($window, $location, $sce, $alert) {
- var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
- return {
- restrict: 'EAC',
- scope: true,
- link: function postLink(scope, element, attr, transclusion) {
- // Directive options
- var options = {
- scope: scope,
- element: element,
- show: false
- };
- angular.forEach([
- 'template',
- 'placement',
- 'keyboard',
- 'html',
- 'container',
- 'animation',
- 'duration'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/button/button.js
+angular.module('mgcrea.ngStrap.button', ['ngAnimate']).provider('$button', function () {
+ var defaults = this.defaults = {
+ activeClass: 'active',
+ toggleEvent: 'click'
+ };
+ this.$get = function () {
+ return { defaults: defaults };
+ };
+}).directive('bsCheckboxGroup', function () {
+ return {
+ restrict: 'A',
+ require: 'ngModel',
+ compile: function postLink(element, attr) {
+ element.attr('data-toggle', 'buttons');
+ element.removeAttr('ng-model');
+ var children = element[0].querySelectorAll('input[type="checkbox"]');
+ angular.forEach(children, function (child) {
+ var childEl = angular.element(child);
+ childEl.attr('bs-checkbox', '');
+ childEl.attr('ng-model', attr.ngModel + '.' + childEl.attr('value'));
+ });
+ }
+ };
+}).directive('bsCheckbox', [
+ '$button',
+ '$$rAF',
+ function ($button, $$rAF) {
+ var defaults = $button.defaults;
+ var constantValueRegExp = /^(true|false|\d+)$/;
+ return {
+ restrict: 'A',
+ require: 'ngModel',
+ link: function postLink(scope, element, attr, controller) {
+ var options = defaults;
+ // Support label > input[type="checkbox"]
+ var isInput = element[0].nodeName === 'INPUT';
+ var activeElement = isInput ? element.parent() : element;
+ var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true;
+ if (constantValueRegExp.test(attr.trueValue)) {
+ trueValue = scope.$eval(attr.trueValue);
+ }
+ var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false;
+ if (constantValueRegExp.test(attr.falseValue)) {
+ falseValue = scope.$eval(attr.falseValue);
+ }
+ // Parse exotic values
+ var hasExoticValues = typeof trueValue !== 'boolean' || typeof falseValue !== 'boolean';
+ if (hasExoticValues) {
+ controller.$parsers.push(function (viewValue) {
+ // console.warn('$parser', element.attr('ng-model'), 'viewValue', viewValue);
+ return viewValue ? trueValue : falseValue;
});
- // Support scope as data-attrs
- angular.forEach([
- 'title',
- 'content',
- 'type'
- ], function (key) {
- attr[key] && attr.$observe(key, function (newValue, oldValue) {
- scope[key] = $sce.trustAsHtml(newValue);
- });
+ // Fix rendering for exotic values
+ scope.$watch(attr.ngModel, function (newValue, oldValue) {
+ controller.$render();
});
- // Support scope as an object
- attr.bsAlert && scope.$watch(attr.bsAlert, function (newValue, oldValue) {
- if (angular.isObject(newValue)) {
- angular.extend(scope, newValue);
- } else {
- scope.content = newValue;
+ }
+ // model -> view
+ controller.$render = function () {
+ // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
+ var isActive = angular.equals(controller.$modelValue, trueValue);
+ $$rAF(function () {
+ if (isInput)
+ element[0].checked = isActive;
+ activeElement.toggleClass(options.activeClass, isActive);
+ });
+ };
+ // view -> model
+ element.bind(options.toggleEvent, function () {
+ scope.$apply(function () {
+ // console.warn('!click', element.attr('ng-model'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);
+ if (!isInput) {
+ controller.$setViewValue(!activeElement.hasClass('active'));
+ }
+ if (!hasExoticValues) {
+ controller.$render();
}
- }, true);
- // Initialize alert
- var alert = $alert(options);
- // Trigger
- element.on(attr.trigger || 'click', alert.toggle);
- // Garbage collection
- scope.$on('$destroy', function () {
- alert.destroy();
- options = null;
- alert = null;
});
- }
- };
+ });
+ }
+ };
+ }
+]).directive('bsRadioGroup', function () {
+ return {
+ restrict: 'A',
+ require: 'ngModel',
+ compile: function postLink(element, attr) {
+ element.attr('data-toggle', 'buttons');
+ element.removeAttr('ng-model');
+ var children = element[0].querySelectorAll('input[type="radio"]');
+ angular.forEach(children, function (child) {
+ angular.element(child).attr('bs-radio', '');
+ angular.element(child).attr('ng-model', attr.ngModel);
+ });
}
- ]);
- // Source: src/aside/aside.js
- angular.module('mgcrea.ngStrap.aside', ['mgcrea.ngStrap.modal']).provider('$aside', function () {
- var defaults = this.defaults = {
- animation: 'am-fade-and-slide-right',
- prefixClass: 'aside',
- placement: 'right',
- template: 'aside/aside.tpl.html',
- contentTemplate: false,
- container: false,
- element: null,
- backdrop: true,
- keyboard: true,
- html: false,
- show: true
- };
- this.$get = [
- '$modal',
- function ($modal) {
- function AsideFactory(config) {
- var $aside = {};
- // Common vars
- var options = angular.extend({}, defaults, config);
- $aside = $modal(options);
- return $aside;
- }
- return AsideFactory;
+ };
+}).directive('bsRadio', [
+ '$button',
+ '$$rAF',
+ function ($button, $$rAF) {
+ var defaults = $button.defaults;
+ var constantValueRegExp = /^(true|false|\d+)$/;
+ return {
+ restrict: 'A',
+ require: 'ngModel',
+ link: function postLink(scope, element, attr, controller) {
+ var options = defaults;
+ // Support `label > input[type="radio"]` markup
+ var isInput = element[0].nodeName === 'INPUT';
+ var activeElement = isInput ? element.parent() : element;
+ var value = constantValueRegExp.test(attr.value) ? scope.$eval(attr.value) : attr.value;
+ // model -> view
+ controller.$render = function () {
+ // console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
+ var isActive = angular.equals(controller.$modelValue, value);
+ $$rAF(function () {
+ if (isInput)
+ element[0].checked = isActive;
+ activeElement.toggleClass(options.activeClass, isActive);
+ });
+ };
+ // view -> model
+ element.bind(options.toggleEvent, function () {
+ scope.$apply(function () {
+ // console.warn('!click', element.attr('value'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);
+ controller.$setViewValue(value);
+ controller.$render();
+ });
+ });
}
- ];
- }).directive('bsAside', [
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/datepicker/datepicker.js
+angular.module('mgcrea.ngStrap.datepicker', [
+ 'mgcrea.ngStrap.helpers.dateParser',
+ 'mgcrea.ngStrap.tooltip'
+]).provider('$datepicker', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ prefixClass: 'datepicker',
+ placement: 'bottom-left',
+ template: 'datepicker/datepicker.tpl.html',
+ trigger: 'focus',
+ container: false,
+ keyboard: true,
+ html: false,
+ delay: 0,
+ useNative: false,
+ dateType: 'date',
+ dateFormat: 'shortDate',
+ strictFormat: false,
+ autoclose: false,
+ minDate: -Infinity,
+ maxDate: +Infinity,
+ startView: 0,
+ minView: 0,
+ startWeek: 0
+ };
+ this.$get = [
'$window',
- '$location',
+ '$document',
+ '$rootScope',
'$sce',
- '$aside',
- function ($window, $location, $sce, $aside) {
- var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
- return {
- restrict: 'EAC',
- scope: true,
- link: function postLink(scope, element, attr, transclusion) {
- // Directive options
- var options = {
- scope: scope,
- element: element,
- show: false
- };
- angular.forEach([
- 'template',
- 'contentTemplate',
- 'placement',
- 'backdrop',
- 'keyboard',
- 'html',
- 'container',
- 'animation'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- // Support scope as data-attrs
- angular.forEach([
- 'title',
- 'content'
- ], function (key) {
- attr[key] && attr.$observe(key, function (newValue, oldValue) {
- scope[key] = $sce.trustAsHtml(newValue);
+ '$locale',
+ 'dateFilter',
+ 'datepickerViews',
+ '$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);
+ if (!defaults.lang)
+ defaults.lang = $locale.id;
+ function DatepickerFactory(element, controller, config) {
+ var $datepicker = $tooltip(element, angular.extend({}, defaults, config));
+ var parentScope = config.scope;
+ var options = $datepicker.$options;
+ var scope = $datepicker.$scope;
+ if (options.startView)
+ options.startView -= options.minView;
+ // View vars
+ var pickerViews = datepickerViews($datepicker);
+ $datepicker.$views = pickerViews.views;
+ var viewDate = pickerViews.viewDate;
+ scope.$mode = options.startView;
+ var $picker = $datepicker.$views[scope.$mode];
+ // Scope methods
+ scope.$select = function (date) {
+ $datepicker.select(date);
+ };
+ scope.$selectPane = function (value) {
+ $datepicker.$selectPane(value);
+ };
+ scope.$toggleMode = function () {
+ $datepicker.setMode((scope.$mode + 1) % $datepicker.$views.length);
+ };
+ // Public methods
+ $datepicker.update = function (date) {
+ // console.warn('$datepicker.update() newValue=%o', date);
+ if (angular.isDate(date) && !isNaN(date.getTime())) {
+ $datepicker.$date = date;
+ $picker.update.call($picker, date);
+ }
+ // Build only if pristine
+ $datepicker.$build(true);
+ };
+ $datepicker.select = function (date, keep) {
+ // console.warn('$datepicker.select', date, scope.$mode);
+ if (!angular.isDate(controller.$dateValue))
+ controller.$dateValue = new Date(date);
+ controller.$dateValue.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
+ if (!scope.$mode || keep) {
+ controller.$setViewValue(controller.$dateValue);
+ controller.$render();
+ if (options.autoclose && !keep) {
+ $datepicker.hide(true);
+ }
+ } else {
+ angular.extend(viewDate, {
+ year: date.getFullYear(),
+ month: date.getMonth(),
+ date: date.getDate()
});
+ $datepicker.setMode(scope.$mode - 1);
+ $datepicker.$build();
+ }
+ };
+ $datepicker.setMode = function (mode) {
+ // console.warn('$datepicker.setMode', mode);
+ scope.$mode = mode;
+ $picker = $datepicker.$views[scope.$mode];
+ $datepicker.$build();
+ };
+ // Protected methods
+ $datepicker.$build = function (pristine) {
+ // console.warn('$datepicker.$build() viewDate=%o', viewDate);
+ if (pristine === true && $picker.built)
+ return;
+ if (pristine === false && !$picker.built)
+ return;
+ $picker.build.call($picker);
+ };
+ $datepicker.$updateSelected = function () {
+ for (var i = 0, l = scope.rows.length; i < l; i++) {
+ angular.forEach(scope.rows[i], updateSelected);
+ }
+ };
+ $datepicker.$isSelected = function (date) {
+ return $picker.isSelected(date);
+ };
+ $datepicker.$selectPane = function (value) {
+ var steps = $picker.steps;
+ var targetDate = new Date(Date.UTC(viewDate.year + (steps.year || 0) * value, viewDate.month + (steps.month || 0) * value, viewDate.date + (steps.day || 0) * value));
+ angular.extend(viewDate, {
+ year: targetDate.getUTCFullYear(),
+ month: targetDate.getUTCMonth(),
+ date: targetDate.getUTCDate()
});
- // Support scope as an object
- attr.bsAside && scope.$watch(attr.bsAside, function (newValue, oldValue) {
- if (angular.isObject(newValue)) {
- angular.extend(scope, newValue);
+ $datepicker.$build();
+ };
+ $datepicker.$onMouseDown = function (evt) {
+ // Prevent blur on mousedown on .dropdown-menu
+ evt.preventDefault();
+ evt.stopPropagation();
+ // Emulate click for mobile devices
+ if (isTouch) {
+ var targetEl = angular.element(evt.target);
+ if (targetEl[0].nodeName.toLowerCase() !== 'button') {
+ targetEl = targetEl.parent();
+ }
+ targetEl.triggerHandler('click');
+ }
+ };
+ $datepicker.$onKeyDown = function (evt) {
+ if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey)
+ return;
+ evt.preventDefault();
+ evt.stopPropagation();
+ if (evt.keyCode === 13) {
+ if (!scope.$mode) {
+ return $datepicker.hide(true);
} else {
- scope.content = newValue;
+ return scope.$apply(function () {
+ $datepicker.setMode(scope.$mode - 1);
+ });
}
- }, true);
- // Initialize aside
- var aside = $aside(options);
- // Trigger
- element.on(attr.trigger || 'click', aside.toggle);
- // Garbage collection
- scope.$on('$destroy', function () {
- aside.destroy();
- options = null;
- aside = null;
- });
+ }
+ // Navigate with keyboard
+ $picker.onKeyDown(evt);
+ parentScope.$digest();
+ };
+ // Private
+ function updateSelected(el) {
+ el.selected = $datepicker.$isSelected(el.date);
}
- };
+ function focusElement() {
+ element[0].focus();
+ }
+ // Overrides
+ var _init = $datepicker.init;
+ $datepicker.init = function () {
+ if (isNative && options.useNative) {
+ element.prop('type', 'date');
+ element.css('-webkit-appearance', 'textfield');
+ return;
+ } else if (isTouch) {
+ element.prop('type', 'text');
+ element.attr('readonly', 'true');
+ element.on('click', focusElement);
+ }
+ _init();
+ };
+ var _destroy = $datepicker.destroy;
+ $datepicker.destroy = function () {
+ if (isNative && options.useNative) {
+ element.off('click', focusElement);
+ }
+ _destroy();
+ };
+ var _show = $datepicker.show;
+ $datepicker.show = function () {
+ _show();
+ setTimeout(function () {
+ $datepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);
+ if (options.keyboard) {
+ element.on('keydown', $datepicker.$onKeyDown);
+ }
+ });
+ };
+ var _hide = $datepicker.hide;
+ $datepicker.hide = function (blur) {
+ $datepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);
+ if (options.keyboard) {
+ element.off('keydown', $datepicker.$onKeyDown);
+ }
+ _hide(blur);
+ };
+ return $datepicker;
+ }
+ DatepickerFactory.defaults = defaults;
+ return DatepickerFactory;
}
- ]);
- // Source: src/button/button.js
- angular.module('mgcrea.ngStrap.button', ['ngAnimate']).provider('$button', function () {
- var defaults = this.defaults = {
- activeClass: 'active',
- toggleEvent: 'click'
- };
- this.$get = function () {
- return { defaults: defaults };
+ ];
+}).directive('bsDatepicker', [
+ '$window',
+ '$parse',
+ '$q',
+ '$locale',
+ 'dateFilter',
+ '$datepicker',
+ '$dateParser',
+ '$timeout',
+ function ($window, $parse, $q, $locale, dateFilter, $datepicker, $dateParser, $timeout) {
+ var defaults = $datepicker.defaults;
+ var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
+ var isNumeric = function (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n);
};
- }).directive('bsCheckboxGroup', function () {
return {
- restrict: 'A',
+ restrict: 'EAC',
require: 'ngModel',
- compile: function postLink(element, attr) {
- element.attr('data-toggle', 'buttons');
- element.removeAttr('ng-model');
- var children = element[0].querySelectorAll('input[type="checkbox"]');
- angular.forEach(children, function (child) {
- var childEl = angular.element(child);
- childEl.attr('bs-checkbox', '');
- childEl.attr('ng-model', attr.ngModel + '.' + childEl.attr('value'));
+ link: function postLink(scope, element, attr, controller) {
+ // Directive options
+ var options = {
+ scope: scope,
+ controller: controller
+ };
+ angular.forEach([
+ 'placement',
+ 'container',
+ 'delay',
+ 'trigger',
+ 'keyboard',
+ 'html',
+ 'animation',
+ 'template',
+ 'autoclose',
+ 'dateType',
+ 'dateFormat',
+ 'strictFormat',
+ 'startWeek',
+ 'useNative',
+ 'lang',
+ 'startView',
+ 'minView'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Initialize datepicker
+ if (isNative && options.useNative)
+ options.dateFormat = 'yyyy-MM-dd';
+ var datepicker = $datepicker(element, controller, options);
+ options = datepicker.$options;
+ // Observe attributes for changes
+ angular.forEach([
+ 'minDate',
+ 'maxDate'
+ ], function (key) {
+ // console.warn('attr.$observe(%s)', key, attr[key]);
+ angular.isDefined(attr[key]) && attr.$observe(key, function (newValue) {
+ // console.warn('attr.$observe(%s)=%o', key, newValue);
+ if (newValue === 'today') {
+ var today = new Date();
+ datepicker.$options[key] = +new Date(today.getFullYear(), today.getMonth(), today.getDate() + (key === 'maxDate' ? 1 : 0), 0, 0, 0, key === 'minDate' ? 0 : -1);
+ } else if (angular.isString(newValue) && newValue.match(/^".+"$/)) {
+ // Support {{ dateObj }}
+ datepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));
+ } else if (isNumeric(newValue)) {
+ datepicker.$options[key] = +new Date(parseInt(newValue, 10));
+ } else {
+ datepicker.$options[key] = +new Date(newValue);
+ }
+ // Build only if dirty
+ !isNaN(datepicker.$options[key]) && datepicker.$build(false);
+ });
+ });
+ // Watch model for changes
+ scope.$watch(attr.ngModel, function (newValue, oldValue) {
+ datepicker.update(controller.$dateValue);
+ }, true);
+ var dateParser = $dateParser({
+ format: options.dateFormat,
+ lang: options.lang,
+ strict: options.strictFormat
+ });
+ // viewValue -> $parsers -> modelValue
+ controller.$parsers.unshift(function (viewValue) {
+ // console.warn('$parser("%s"): viewValue=%o', element.attr('ng-model'), viewValue);
+ // Null values should correctly reset the model value & validity
+ if (!viewValue) {
+ controller.$setValidity('date', true);
+ return;
+ }
+ var parsedDate = dateParser.parse(viewValue, controller.$dateValue);
+ if (!parsedDate || isNaN(parsedDate.getTime())) {
+ controller.$setValidity('date', false);
+ return;
+ } else {
+ var isValid = (isNaN(datepicker.$options.minDate) || parsedDate.getTime() >= datepicker.$options.minDate) && (isNaN(datepicker.$options.maxDate) || parsedDate.getTime() <= datepicker.$options.maxDate);
+ controller.$setValidity('date', isValid);
+ // Only update the model when we have a valid date
+ if (isValid)
+ controller.$dateValue = parsedDate;
+ }
+ if (options.dateType === 'string') {
+ return dateFilter(viewValue, options.dateFormat);
+ } else if (options.dateType === 'number') {
+ return controller.$dateValue.getTime();
+ } else if (options.dateType === 'iso') {
+ return controller.$dateValue.toISOString();
+ } else {
+ return new Date(controller.$dateValue);
+ }
+ });
+ // modelValue -> $formatters -> viewValue
+ controller.$formatters.push(function (modelValue) {
+ // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
+ var date;
+ if (angular.isUndefined(modelValue) || modelValue === null) {
+ date = NaN;
+ } else if (angular.isDate(modelValue)) {
+ date = modelValue;
+ } else if (options.dateType === 'string') {
+ date = dateParser.parse(modelValue);
+ } else {
+ date = new Date(modelValue);
+ }
+ // Setup default value?
+ // if(isNaN(date.getTime())) {
+ // var today = new Date();
+ // date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0);
+ // }
+ controller.$dateValue = date;
+ return controller.$dateValue;
+ });
+ // viewValue -> element
+ controller.$render = function () {
+ // console.warn('$render("%s"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);
+ element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.dateFormat));
+ };
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ datepicker.destroy();
+ options = null;
+ datepicker = null;
});
}
};
- }).directive('bsCheckbox', [
- '$button',
- '$$animateReflow',
- function ($button, $$animateReflow) {
- var defaults = $button.defaults;
- var constantValueRegExp = /^(true|false|\d+)$/;
- return {
- restrict: 'A',
- require: 'ngModel',
- link: function postLink(scope, element, attr, controller) {
- var options = defaults;
- // Support label > input[type="checkbox"]
- var isInput = element[0].nodeName === 'INPUT';
- var activeElement = isInput ? element.parent() : element;
- var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true;
- if (constantValueRegExp.test(attr.trueValue)) {
- trueValue = scope.$eval(attr.trueValue);
- }
- var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false;
- if (constantValueRegExp.test(attr.falseValue)) {
- falseValue = scope.$eval(attr.falseValue);
- }
- // Parse exotic values
- var hasExoticValues = typeof trueValue !== 'boolean' || typeof falseValue !== 'boolean';
- if (hasExoticValues) {
- controller.$parsers.push(function (viewValue) {
- // console.warn('$parser', element.attr('ng-model'), 'viewValue', viewValue);
- return viewValue ? trueValue : falseValue;
- });
- // Fix rendering for exotic values
- scope.$watch(attr.ngModel, function (newValue, oldValue) {
- controller.$render();
- });
- }
- // model -> view
- controller.$render = function () {
- // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
- var isActive = angular.equals(controller.$modelValue, trueValue);
- $$animateReflow(function () {
- if (isInput)
- element[0].checked = isActive;
- activeElement.toggleClass(options.activeClass, isActive);
- });
- };
- // view -> model
- element.bind(options.toggleEvent, function () {
- scope.$apply(function () {
- // console.warn('!click', element.attr('ng-model'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);
- if (!isInput) {
- controller.$setViewValue(!activeElement.hasClass('active'));
+ }
+]).provider('datepickerViews', function () {
+ var defaults = this.defaults = {
+ dayFormat: 'dd',
+ daySplit: 7
+ };
+ // Split array into smaller arrays
+ function split(arr, size) {
+ var arrays = [];
+ while (arr.length > 0) {
+ arrays.push(arr.splice(0, size));
+ }
+ return arrays;
+ }
+ // Modulus operator
+ function mod(n, m) {
+ return (n % m + m) % m;
+ }
+ this.$get = [
+ '$locale',
+ '$sce',
+ 'dateFilter',
+ function ($locale, $sce, dateFilter) {
+ return function (picker) {
+ var scope = picker.$scope;
+ var options = picker.$options;
+ 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 viewDate = {
+ year: startDate.getFullYear(),
+ month: startDate.getMonth(),
+ date: startDate.getDate()
+ };
+ var timezoneOffset = startDate.getTimezoneOffset() * 60000;
+ var views = [
+ {
+ format: 'dd',
+ split: 7,
+ steps: { month: 1 },
+ update: function (date, force) {
+ if (!this.built || force || date.getFullYear() !== viewDate.year || date.getMonth() !== viewDate.month) {
+ angular.extend(viewDate, {
+ year: picker.$date.getFullYear(),
+ month: picker.$date.getMonth(),
+ date: picker.$date.getDate()
+ });
+ picker.$build();
+ } else if (date.getDate() !== viewDate.date) {
+ viewDate.date = picker.$date.getDate();
+ picker.$updateSelected();
+ }
+ },
+ build: function () {
+ var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1), firstDayOfMonthOffset = firstDayOfMonth.getTimezoneOffset();
+ var firstDate = new Date(+firstDayOfMonth - mod(firstDayOfMonth.getDay() - options.startWeek, 6) * 86400000), firstDateOffset = firstDate.getTimezoneOffset();
+ // Handle daylight time switch
+ if (firstDateOffset !== firstDayOfMonthOffset)
+ firstDate = new Date(+firstDate + (firstDateOffset - firstDayOfMonthOffset) * 60000);
+ var days = [], day;
+ for (var i = 0; i < 42; i++) {
+ // < 7 * 6
+ day = new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + i);
+ days.push({
+ date: day,
+ label: dateFilter(day, this.format),
+ selected: picker.$date && this.isSelected(day),
+ muted: day.getMonth() !== viewDate.month,
+ disabled: this.isDisabled(day)
+ });
+ }
+ scope.title = dateFilter(firstDayOfMonth, 'MMMM yyyy');
+ scope.labels = weekDaysLabelsHtml;
+ scope.rows = split(days, this.split);
+ this.built = true;
+ },
+ isSelected: function (date) {
+ return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth() && date.getDate() === picker.$date.getDate();
+ },
+ isDisabled: function (date) {
+ return date.getTime() < options.minDate || date.getTime() > options.maxDate;
+ },
+ onKeyDown: function (evt) {
+ var actualTime = picker.$date.getTime();
+ if (evt.keyCode === 37)
+ picker.select(new Date(actualTime - 1 * 86400000), true);
+ else if (evt.keyCode === 38)
+ picker.select(new Date(actualTime - 7 * 86400000), true);
+ else if (evt.keyCode === 39)
+ picker.select(new Date(actualTime + 1 * 86400000), true);
+ else if (evt.keyCode === 40)
+ picker.select(new Date(actualTime + 7 * 86400000), true);
+ }
+ },
+ {
+ name: 'month',
+ format: 'MMM',
+ split: 4,
+ steps: { year: 1 },
+ update: function (date, force) {
+ if (!this.built || date.getFullYear() !== viewDate.year) {
+ angular.extend(viewDate, {
+ year: picker.$date.getFullYear(),
+ month: picker.$date.getMonth(),
+ date: picker.$date.getDate()
+ });
+ picker.$build();
+ } else if (date.getMonth() !== viewDate.month) {
+ angular.extend(viewDate, {
+ month: picker.$date.getMonth(),
+ date: picker.$date.getDate()
+ });
+ picker.$updateSelected();
+ }
+ },
+ build: function () {
+ var firstMonth = new Date(viewDate.year, 0, 1);
+ var months = [], month;
+ for (var i = 0; i < 12; i++) {
+ month = new Date(viewDate.year, i, 1);
+ months.push({
+ date: month,
+ label: dateFilter(month, this.format),
+ selected: picker.$isSelected(month),
+ disabled: this.isDisabled(month)
+ });
+ }
+ scope.title = dateFilter(month, 'yyyy');
+ scope.labels = false;
+ scope.rows = split(months, this.split);
+ this.built = true;
+ },
+ isSelected: function (date) {
+ return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth();
+ },
+ isDisabled: function (date) {
+ var lastDate = +new Date(date.getFullYear(), date.getMonth() + 1, 0);
+ return lastDate < options.minDate || date.getTime() > options.maxDate;
+ },
+ onKeyDown: function (evt) {
+ var actualMonth = picker.$date.getMonth();
+ if (evt.keyCode === 37)
+ picker.select(picker.$date.setMonth(actualMonth - 1), true);
+ else if (evt.keyCode === 38)
+ picker.select(picker.$date.setMonth(actualMonth - 4), true);
+ else if (evt.keyCode === 39)
+ picker.select(picker.$date.setMonth(actualMonth + 1), true);
+ else if (evt.keyCode === 40)
+ picker.select(picker.$date.setMonth(actualMonth + 4), true);
}
- if (!hasExoticValues) {
- controller.$render();
+ },
+ {
+ name: 'year',
+ format: 'yyyy',
+ split: 4,
+ steps: { year: 12 },
+ update: function (date, force) {
+ if (!this.built || force || parseInt(date.getFullYear() / 20, 10) !== parseInt(viewDate.year / 20, 10)) {
+ angular.extend(viewDate, {
+ year: picker.$date.getFullYear(),
+ month: picker.$date.getMonth(),
+ date: picker.$date.getDate()
+ });
+ picker.$build();
+ } else if (date.getFullYear() !== viewDate.year) {
+ angular.extend(viewDate, {
+ year: picker.$date.getFullYear(),
+ month: picker.$date.getMonth(),
+ date: picker.$date.getDate()
+ });
+ picker.$updateSelected();
+ }
+ },
+ build: function () {
+ var firstYear = viewDate.year - viewDate.year % (this.split * 3);
+ var years = [], year;
+ for (var i = 0; i < 12; i++) {
+ year = new Date(firstYear + i, 0, 1);
+ years.push({
+ date: year,
+ label: dateFilter(year, this.format),
+ selected: picker.$isSelected(year),
+ disabled: this.isDisabled(year)
+ });
+ }
+ scope.title = years[0].label + '-' + years[years.length - 1].label;
+ scope.labels = false;
+ scope.rows = split(years, this.split);
+ this.built = true;
+ },
+ isSelected: function (date) {
+ return picker.$date && date.getFullYear() === picker.$date.getFullYear();
+ },
+ isDisabled: function (date) {
+ var lastDate = +new Date(date.getFullYear() + 1, 0, 0);
+ return lastDate < options.minDate || date.getTime() > options.maxDate;
+ },
+ onKeyDown: function (evt) {
+ var actualYear = picker.$date.getFullYear();
+ if (evt.keyCode === 37)
+ picker.select(picker.$date.setYear(actualYear - 1), true);
+ else if (evt.keyCode === 38)
+ picker.select(picker.$date.setYear(actualYear - 4), true);
+ else if (evt.keyCode === 39)
+ picker.select(picker.$date.setYear(actualYear + 1), true);
+ else if (evt.keyCode === 40)
+ picker.select(picker.$date.setYear(actualYear + 4), true);
}
- });
+ }
+ ];
+ return {
+ views: options.minView ? Array.prototype.slice.call(views, options.minView) : views,
+ viewDate: viewDate
+ };
+ };
+ }
+ ];
+});
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/dropdown/dropdown.js
+angular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip']).provider('$dropdown', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ prefixClass: 'dropdown',
+ placement: 'bottom-left',
+ template: 'dropdown/dropdown.tpl.html',
+ trigger: 'click',
+ container: false,
+ keyboard: true,
+ html: false,
+ delay: 0
+ };
+ this.$get = [
+ '$window',
+ '$rootScope',
+ '$tooltip',
+ function ($window, $rootScope, $tooltip) {
+ var bodyEl = angular.element($window.document.body);
+ var matchesSelector = Element.prototype.matchesSelector || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector;
+ function DropdownFactory(element, config) {
+ var $dropdown = {};
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new();
+ $dropdown = $tooltip(element, options);
+ // Protected methods
+ $dropdown.$onKeyDown = function (evt) {
+ if (!/(38|40)/.test(evt.keyCode))
+ return;
+ evt.preventDefault();
+ evt.stopPropagation();
+ // Retrieve focused index
+ var items = angular.element($dropdown.$element[0].querySelectorAll('li:not(.divider) a'));
+ if (!items.length)
+ return;
+ var index;
+ angular.forEach(items, function (el, i) {
+ if (matchesSelector && matchesSelector.call(el, ':focus'))
+ index = i;
+ });
+ // Navigate with keyboard
+ if (evt.keyCode === 38 && index > 0)
+ index--;
+ else if (evt.keyCode === 40 && index < items.length - 1)
+ index++;
+ else if (angular.isUndefined(index))
+ index = 0;
+ items.eq(index)[0].focus();
+ };
+ // Overrides
+ var show = $dropdown.show;
+ $dropdown.show = function () {
+ show();
+ setTimeout(function () {
+ options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);
+ bodyEl.on('click', onBodyClick);
});
+ };
+ var hide = $dropdown.hide;
+ $dropdown.hide = function () {
+ options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);
+ bodyEl.off('click', onBodyClick);
+ hide();
+ };
+ // Private functions
+ function onBodyClick(evt) {
+ if (evt.target === element[0])
+ return;
+ return evt.target !== element[0] && $dropdown.hide();
}
- };
+ return $dropdown;
+ }
+ return DropdownFactory;
}
- ]).directive('bsRadioGroup', function () {
+ ];
+}).directive('bsDropdown', [
+ '$window',
+ '$location',
+ '$sce',
+ '$dropdown',
+ function ($window, $location, $sce, $dropdown) {
return {
- restrict: 'A',
- require: 'ngModel',
- compile: function postLink(element, attr) {
- element.attr('data-toggle', 'buttons');
- element.removeAttr('ng-model');
- var children = element[0].querySelectorAll('input[type="radio"]');
- angular.forEach(children, function (child) {
- angular.element(child).attr('bs-radio', '');
- angular.element(child).attr('ng-model', attr.ngModel);
+ restrict: 'EAC',
+ scope: true,
+ link: function postLink(scope, element, attr, transclusion) {
+ // Directive options
+ var options = { scope: scope };
+ angular.forEach([
+ 'placement',
+ 'container',
+ 'delay',
+ 'trigger',
+ 'keyboard',
+ 'html',
+ 'animation',
+ 'template'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Support scope as an object
+ attr.bsDropdown && scope.$watch(attr.bsDropdown, function (newValue, oldValue) {
+ scope.content = newValue;
+ }, true);
+ // Initialize dropdown
+ var dropdown = $dropdown(element, options);
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ dropdown.destroy();
+ options = null;
+ dropdown = null;
});
}
};
- }).directive('bsRadio', [
- '$button',
- '$$animateReflow',
- function ($button, $$animateReflow) {
- var defaults = $button.defaults;
- var constantValueRegExp = /^(true|false|\d+)$/;
- return {
- restrict: 'A',
- require: 'ngModel',
- link: function postLink(scope, element, attr, controller) {
- var options = defaults;
- // Support `label > input[type="radio"]` markup
- var isInput = element[0].nodeName === 'INPUT';
- var activeElement = isInput ? element.parent() : element;
- var value = constantValueRegExp.test(attr.value) ? scope.$eval(attr.value) : attr.value;
- // model -> view
- controller.$render = function () {
- // console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
- var isActive = angular.equals(controller.$modelValue, value);
- $$animateReflow(function () {
- if (isInput)
- element[0].checked = isActive;
- activeElement.toggleClass(options.activeClass, isActive);
- });
- };
- // view -> model
- element.bind(options.toggleEvent, function () {
- scope.$apply(function () {
- // console.warn('!click', element.attr('value'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);
- controller.$setViewValue(value);
- controller.$render();
- });
- });
- }
- };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/helpers/date-parser.js
+angular.module('mgcrea.ngStrap.helpers.dateParser', []).provider('$dateParser', [
+ '$localeProvider',
+ function ($localeProvider) {
+ var proto = Date.prototype;
+ function isNumeric(n) {
+ return !isNaN(parseFloat(n)) && isFinite(n);
}
- ]);
- // Source: src/datepicker/datepicker.js
- angular.module('mgcrea.ngStrap.datepicker', [
- 'mgcrea.ngStrap.helpers.dateParser',
- 'mgcrea.ngStrap.tooltip'
- ]).provider('$datepicker', function () {
var defaults = this.defaults = {
- animation: 'am-fade',
- prefixClass: 'datepicker',
- placement: 'bottom-left',
- template: 'datepicker/datepicker.tpl.html',
- trigger: 'focus',
- container: false,
- keyboard: true,
- html: false,
- delay: 0,
- useNative: false,
- dateType: 'date',
- dateFormat: 'shortDate',
- strictFormat: false,
- autoclose: false,
- minDate: -Infinity,
- maxDate: +Infinity,
- startView: 0,
- minView: 0,
- startWeek: 0
+ format: 'shortDate',
+ strict: false
};
this.$get = [
- '$window',
- '$document',
- '$rootScope',
- '$sce',
'$locale',
- 'dateFilter',
- 'datepickerViews',
- '$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);
- if (!defaults.lang)
- defaults.lang = $locale.id;
- function DatepickerFactory(element, controller, config) {
- var $datepicker = $tooltip(element, angular.extend({}, defaults, config));
- var parentScope = config.scope;
- var options = $datepicker.$options;
- var scope = $datepicker.$scope;
- if (options.startView)
- options.startView -= options.minView;
- // View vars
- var pickerViews = datepickerViews($datepicker);
- $datepicker.$views = pickerViews.views;
- var viewDate = pickerViews.viewDate;
- scope.$mode = options.startView;
- var $picker = $datepicker.$views[scope.$mode];
- // Scope methods
- scope.$select = function (date) {
- $datepicker.select(date);
- };
- scope.$selectPane = function (value) {
- $datepicker.$selectPane(value);
- };
- scope.$toggleMode = function () {
- $datepicker.setMode((scope.$mode + 1) % $datepicker.$views.length);
- };
- // Public methods
- $datepicker.update = function (date) {
- // console.warn('$datepicker.update() newValue=%o', date);
- if (angular.isDate(date) && !isNaN(date.getTime())) {
- $datepicker.$date = date;
- $picker.update.call($picker, date);
- }
- // Build only if pristine
- $datepicker.$build(true);
- };
- $datepicker.select = function (date, keep) {
- // console.warn('$datepicker.select', date, scope.$mode);
- if (!angular.isDate(controller.$dateValue))
- controller.$dateValue = new Date(date);
- controller.$dateValue.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
- if (!scope.$mode || keep) {
- controller.$setViewValue(controller.$dateValue);
- controller.$render();
- if (options.autoclose && !keep) {
- $datepicker.hide(true);
- }
- } else {
- angular.extend(viewDate, {
- year: date.getFullYear(),
- month: date.getMonth(),
- date: date.getDate()
- });
- $datepicker.setMode(scope.$mode - 1);
- $datepicker.$build();
- }
- };
- $datepicker.setMode = function (mode) {
- // console.warn('$datepicker.setMode', mode);
- scope.$mode = mode;
- $picker = $datepicker.$views[scope.$mode];
- $datepicker.$build();
- };
- // Protected methods
- $datepicker.$build = function (pristine) {
- // console.warn('$datepicker.$build() viewDate=%o', viewDate);
- if (pristine === true && $picker.built)
- return;
- if (pristine === false && !$picker.built)
- return;
- $picker.build.call($picker);
- };
- $datepicker.$updateSelected = function () {
- for (var i = 0, l = scope.rows.length; i < l; i++) {
- angular.forEach(scope.rows[i], updateSelected);
- }
- };
- $datepicker.$isSelected = function (date) {
- return $picker.isSelected(date);
- };
- $datepicker.$selectPane = function (value) {
- var steps = $picker.steps;
- var targetDate = new Date(Date.UTC(viewDate.year + (steps.year || 0) * value, viewDate.month + (steps.month || 0) * value, viewDate.date + (steps.day || 0) * value));
- angular.extend(viewDate, {
- year: targetDate.getUTCFullYear(),
- month: targetDate.getUTCMonth(),
- date: targetDate.getUTCDate()
- });
- $datepicker.$build();
- };
- $datepicker.$onMouseDown = function (evt) {
- // Prevent blur on mousedown on .dropdown-menu
- evt.preventDefault();
- evt.stopPropagation();
- // Emulate click for mobile devices
- if (isTouch) {
- var targetEl = angular.element(evt.target);
- if (targetEl[0].nodeName.toLowerCase() !== 'button') {
- targetEl = targetEl.parent();
- }
- targetEl.triggerHandler('click');
- }
- };
- $datepicker.$onKeyDown = function (evt) {
- if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey)
- return;
- evt.preventDefault();
- evt.stopPropagation();
- if (evt.keyCode === 13) {
- if (!scope.$mode) {
- return $datepicker.hide(true);
- } else {
- return scope.$apply(function () {
- $datepicker.setMode(scope.$mode - 1);
- });
- }
- }
- // Navigate with keyboard
- $picker.onKeyDown(evt);
- parentScope.$digest();
- };
- // Private
- function updateSelected(el) {
- el.selected = $datepicker.$isSelected(el.date);
- }
- function focusElement() {
- element[0].focus();
- }
- // Overrides
- var _init = $datepicker.init;
- $datepicker.init = function () {
- if (isNative && options.useNative) {
- element.prop('type', 'date');
- element.css('-webkit-appearance', 'textfield');
- return;
- } else if (isTouch) {
- element.prop('type', 'text');
- element.attr('readonly', 'true');
- element.on('click', focusElement);
- }
- _init();
- };
- var _destroy = $datepicker.destroy;
- $datepicker.destroy = function () {
- if (isNative && options.useNative) {
- element.off('click', focusElement);
- }
- _destroy();
- };
- var _show = $datepicker.show;
- $datepicker.show = function () {
- _show();
- setTimeout(function () {
- $datepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);
- if (options.keyboard) {
- element.on('keydown', $datepicker.$onKeyDown);
- }
- });
- };
- var _hide = $datepicker.hide;
- $datepicker.hide = function (blur) {
- $datepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);
- if (options.keyboard) {
- element.off('keydown', $datepicker.$onKeyDown);
- }
- _hide(blur);
- };
- return $datepicker;
- }
- DatepickerFactory.defaults = defaults;
- return DatepickerFactory;
- }
- ];
- }).directive('bsDatepicker', [
- '$window',
- '$parse',
- '$q',
- '$locale',
- 'dateFilter',
- '$datepicker',
- '$dateParser',
- '$timeout',
- function ($window, $parse, $q, $locale, dateFilter, $datepicker, $dateParser, $timeout) {
- var defaults = $datepicker.defaults;
- var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
- var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
- return {
- restrict: 'EAC',
- require: 'ngModel',
- link: function postLink(scope, element, attr, controller) {
- // Directive options
- var options = {
- scope: scope,
- controller: controller
- };
- angular.forEach([
- 'placement',
- 'container',
- 'delay',
- 'trigger',
- 'keyboard',
- 'html',
- 'animation',
- 'template',
- 'autoclose',
- 'dateType',
- 'dateFormat',
- 'strictFormat',
- 'startWeek',
- 'useNative',
- 'lang',
- 'startView',
- 'minView'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- // Initialize datepicker
- if (isNative && options.useNative)
- options.dateFormat = 'yyyy-MM-dd';
- var datepicker = $datepicker(element, controller, options);
- options = datepicker.$options;
- // Observe attributes for changes
- angular.forEach([
- 'minDate',
- 'maxDate'
- ], function (key) {
- // console.warn('attr.$observe(%s)', key, attr[key]);
- angular.isDefined(attr[key]) && attr.$observe(key, function (newValue) {
- // console.warn('attr.$observe(%s)=%o', key, newValue);
- if (newValue === 'today') {
- var today = new Date();
- datepicker.$options[key] = +new Date(today.getFullYear(), today.getMonth(), today.getDate() + (key === 'maxDate' ? 1 : 0), 0, 0, 0, key === 'minDate' ? 0 : -1);
- } else if (angular.isString(newValue) && newValue.match(/^".+"$/)) {
- datepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));
- } else {
- datepicker.$options[key] = +new Date(newValue);
- }
- // console.warn(angular.isDate(newValue), newValue);
- // Build only if dirty
- !isNaN(datepicker.$options[key]) && datepicker.$build(false);
- });
- });
- // Watch model for changes
- scope.$watch(attr.ngModel, function (newValue, oldValue) {
- datepicker.update(controller.$dateValue);
- }, true);
- var dateParser = $dateParser({
- format: options.dateFormat,
- lang: options.lang,
- strict: options.strictFormat
- });
- // viewValue -> $parsers -> modelValue
- controller.$parsers.unshift(function (viewValue) {
- // console.warn('$parser("%s"): viewValue=%o', element.attr('ng-model'), viewValue);
- // Null values should correctly reset the model value & validity
- if (!viewValue) {
- controller.$setValidity('date', true);
- return;
- }
- var parsedDate = dateParser.parse(viewValue, controller.$dateValue);
- if (!parsedDate || isNaN(parsedDate.getTime())) {
- controller.$setValidity('date', false);
- } else {
- var isValid = parsedDate.getTime() >= options.minDate && parsedDate.getTime() <= options.maxDate;
- controller.$setValidity('date', isValid);
- // Only update the model when we have a valid date
- if (isValid)
- controller.$dateValue = parsedDate;
- }
- if (options.dateType === 'string') {
- return dateFilter(viewValue, options.dateFormat);
- } else if (options.dateType === 'number') {
- return controller.$dateValue.getTime();
- } else if (options.dateType === 'iso') {
- return controller.$dateValue.toISOString();
- } else {
- return new Date(controller.$dateValue);
- }
- });
- // modelValue -> $formatters -> viewValue
- controller.$formatters.push(function (modelValue) {
- // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
- if (angular.isUndefined(modelValue) || modelValue === null)
- return;
- var date = angular.isDate(modelValue) ? modelValue : new Date(modelValue);
- // Setup default value?
- // if(isNaN(date.getTime())) {
- // var today = new Date();
- // date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0);
- // }
- controller.$dateValue = date;
- return controller.$dateValue;
- });
- // viewValue -> element
- controller.$render = function () {
- // console.warn('$render("%s"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);
- element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.dateFormat));
- };
- // Garbage collection
- scope.$on('$destroy', function () {
- datepicker.destroy();
- options = null;
- datepicker = null;
- });
- }
- };
- }
- ]).provider('datepickerViews', function () {
- var defaults = this.defaults = {
- dayFormat: 'dd',
- daySplit: 7
- };
- // Split array into smaller arrays
- function split(arr, size) {
- var arrays = [];
- while (arr.length > 0) {
- arrays.push(arr.splice(0, size));
- }
- return arrays;
- }
- this.$get = [
- '$locale',
- '$sce',
- 'dateFilter',
- function ($locale, $sce, dateFilter) {
- return function (picker) {
- var scope = picker.$scope;
- var options = picker.$options;
- 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 viewDate = {
- year: startDate.getFullYear(),
- month: startDate.getMonth(),
- date: startDate.getDate()
+ function ($locale) {
+ var DateParserFactory = function (config) {
+ var options = angular.extend({}, defaults, config);
+ var $dateParser = {};
+ var regExpMap = {
+ 'sss': '[0-9]{3}',
+ 'ss': '[0-5][0-9]',
+ 's': options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]',
+ 'mm': '[0-5][0-9]',
+ 'm': options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]',
+ 'HH': '[01][0-9]|2[0-3]',
+ 'H': options.strict ? '1?[0-9]|2[0-3]' : '[01]?[0-9]|2[0-3]',
+ 'hh': '[0][1-9]|[1][012]',
+ 'h': options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]',
+ 'a': 'AM|PM',
+ 'EEEE': $locale.DATETIME_FORMATS.DAY.join('|'),
+ 'EEE': $locale.DATETIME_FORMATS.SHORTDAY.join('|'),
+ 'dd': '0[1-9]|[12][0-9]|3[01]',
+ 'd': options.strict ? '[1-9]|[1-2][0-9]|3[01]' : '0?[1-9]|[1-2][0-9]|3[01]',
+ 'MMMM': $locale.DATETIME_FORMATS.MONTH.join('|'),
+ 'MMM': $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),
+ 'MM': '0[1-9]|1[012]',
+ 'M': options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]',
+ 'yyyy': '[1]{1}[0-9]{3}|[2]{1}[0-9]{3}',
+ 'yy': '[0-9]{2}',
+ 'y': options.strict ? '-?(0|[1-9][0-9]{0,3})' : '-?0*[0-9]{1,4}'
};
- var timezoneOffset = startDate.getTimezoneOffset() * 60000;
- var views = [
- {
- format: 'dd',
- split: 7,
- steps: { month: 1 },
- update: function (date, force) {
- if (!this.built || force || date.getFullYear() !== viewDate.year || date.getMonth() !== viewDate.month) {
- angular.extend(viewDate, {
- year: picker.$date.getFullYear(),
- month: picker.$date.getMonth(),
- date: picker.$date.getDate()
- });
- picker.$build();
- } else if (date.getDate() !== viewDate.date) {
- viewDate.date = picker.$date.getDate();
- picker.$updateSelected();
- }
- },
- build: function () {
- var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1);
- var firstDate = new Date(+firstDayOfMonth - (firstDayOfMonth.getDay() - options.startWeek) * 86400000);
- var days = [], day;
- for (var i = 0; i < 42; i++) {
- // < 7 * 6
- day = new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + i);
- days.push({
- date: day,
- label: dateFilter(day, this.format),
- selected: picker.$date && this.isSelected(day),
- muted: day.getMonth() !== viewDate.month,
- disabled: this.isDisabled(day)
- });
- }
- scope.title = dateFilter(firstDayOfMonth, 'MMMM yyyy');
- scope.labels = weekDaysLabelsHtml;
- scope.rows = split(days, this.split);
- this.built = true;
- },
- isSelected: function (date) {
- return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth() && date.getDate() === picker.$date.getDate();
- },
- isDisabled: function (date) {
- return date.getTime() < options.minDate || date.getTime() > options.maxDate;
- },
- onKeyDown: function (evt) {
- var actualTime = picker.$date.getTime();
- if (evt.keyCode === 37)
- picker.select(new Date(actualTime - 1 * 86400000), true);
- else if (evt.keyCode === 38)
- picker.select(new Date(actualTime - 7 * 86400000), true);
- else if (evt.keyCode === 39)
- picker.select(new Date(actualTime + 1 * 86400000), true);
- else if (evt.keyCode === 40)
- picker.select(new Date(actualTime + 7 * 86400000), true);
- }
+ var setFnMap = {
+ 'sss': proto.setMilliseconds,
+ 'ss': proto.setSeconds,
+ 's': proto.setSeconds,
+ 'mm': proto.setMinutes,
+ 'm': proto.setMinutes,
+ 'HH': proto.setHours,
+ 'H': proto.setHours,
+ 'hh': proto.setHours,
+ 'h': proto.setHours,
+ 'dd': proto.setDate,
+ 'd': proto.setDate,
+ 'a': function (value) {
+ var hours = this.getHours();
+ return this.setHours(value.match(/pm/i) ? hours + 12 : hours);
},
- {
- name: 'month',
- format: 'MMM',
- split: 4,
- steps: { year: 1 },
- update: function (date, force) {
- if (!this.built || date.getFullYear() !== viewDate.year) {
- angular.extend(viewDate, {
- year: picker.$date.getFullYear(),
- month: picker.$date.getMonth(),
- date: picker.$date.getDate()
- });
- picker.$build();
- } else if (date.getMonth() !== viewDate.month) {
- angular.extend(viewDate, {
- month: picker.$date.getMonth(),
- date: picker.$date.getDate()
- });
- picker.$updateSelected();
- }
- },
- build: function () {
- var firstMonth = new Date(viewDate.year, 0, 1);
- var months = [], month;
- for (var i = 0; i < 12; i++) {
- month = new Date(viewDate.year, i, 1);
- months.push({
- date: month,
- label: dateFilter(month, this.format),
- selected: picker.$isSelected(month),
- disabled: this.isDisabled(month)
- });
- }
- scope.title = dateFilter(month, 'yyyy');
- scope.labels = false;
- scope.rows = split(months, this.split);
- this.built = true;
- },
- isSelected: function (date) {
- return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth();
- },
- isDisabled: function (date) {
- var lastDate = +new Date(date.getFullYear(), date.getMonth() + 1, 0);
- return lastDate < options.minDate || date.getTime() > options.maxDate;
- },
- onKeyDown: function (evt) {
- var actualMonth = picker.$date.getMonth();
- if (evt.keyCode === 37)
- picker.select(picker.$date.setMonth(actualMonth - 1), true);
- else if (evt.keyCode === 38)
- picker.select(picker.$date.setMonth(actualMonth - 4), true);
- else if (evt.keyCode === 39)
- picker.select(picker.$date.setMonth(actualMonth + 1), true);
- else if (evt.keyCode === 40)
- picker.select(picker.$date.setMonth(actualMonth + 4), true);
- }
+ 'MMMM': function (value) {
+ return this.setMonth($locale.DATETIME_FORMATS.MONTH.indexOf(value));
},
- {
- name: 'year',
- format: 'yyyy',
- split: 4,
- steps: { year: 12 },
- update: function (date, force) {
- if (!this.built || force || parseInt(date.getFullYear() / 20, 10) !== parseInt(viewDate.year / 20, 10)) {
- angular.extend(viewDate, {
- year: picker.$date.getFullYear(),
- month: picker.$date.getMonth(),
- date: picker.$date.getDate()
- });
- picker.$build();
- } else if (date.getFullYear() !== viewDate.year) {
- angular.extend(viewDate, {
- year: picker.$date.getFullYear(),
- month: picker.$date.getMonth(),
- date: picker.$date.getDate()
- });
- picker.$updateSelected();
- }
- },
- build: function () {
- var firstYear = viewDate.year - viewDate.year % (this.split * 3);
- var years = [], year;
- for (var i = 0; i < 12; i++) {
- year = new Date(firstYear + i, 0, 1);
- years.push({
- date: year,
- label: dateFilter(year, this.format),
- selected: picker.$isSelected(year),
- disabled: this.isDisabled(year)
- });
- }
- scope.title = years[0].label + '-' + years[years.length - 1].label;
- scope.labels = false;
- scope.rows = split(years, this.split);
- this.built = true;
- },
- isSelected: function (date) {
- return picker.$date && date.getFullYear() === picker.$date.getFullYear();
- },
- isDisabled: function (date) {
- var lastDate = +new Date(date.getFullYear() + 1, 0, 0);
- return lastDate < options.minDate || date.getTime() > options.maxDate;
- },
- onKeyDown: function (evt) {
- var actualYear = picker.$date.getFullYear();
- if (evt.keyCode === 37)
- picker.select(picker.$date.setYear(actualYear - 1), true);
- else if (evt.keyCode === 38)
- picker.select(picker.$date.setYear(actualYear - 4), true);
- else if (evt.keyCode === 39)
- picker.select(picker.$date.setYear(actualYear + 1), true);
- else if (evt.keyCode === 40)
- picker.select(picker.$date.setYear(actualYear + 4), true);
- }
- }
- ];
- return {
- views: options.minView ? Array.prototype.slice.call(views, options.minView) : views,
- viewDate: viewDate
- };
- };
- }
- ];
- });
- // Source: src/dropdown/dropdown.js
- angular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip']).provider('$dropdown', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- prefixClass: 'dropdown',
- placement: 'bottom-left',
- template: 'dropdown/dropdown.tpl.html',
- trigger: 'click',
- container: false,
- keyboard: true,
- html: false,
- delay: 0
- };
- this.$get = [
- '$window',
- '$rootScope',
- '$tooltip',
- function ($window, $rootScope, $tooltip) {
- var bodyEl = angular.element($window.document.body);
- var matchesSelector = Element.prototype.matchesSelector || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector;
- function DropdownFactory(element, config) {
- var $dropdown = {};
- // Common vars
- var options = angular.extend({}, defaults, config);
- var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new();
- $dropdown = $tooltip(element, options);
- // Protected methods
- $dropdown.$onKeyDown = function (evt) {
- if (!/(38|40)/.test(evt.keyCode))
- return;
- evt.preventDefault();
- evt.stopPropagation();
- // Retrieve focused index
- var items = angular.element($dropdown.$element[0].querySelectorAll('li:not(.divider) a'));
- if (!items.length)
- return;
- var index;
- angular.forEach(items, function (el, i) {
- if (matchesSelector && matchesSelector.call(el, ':focus'))
- index = i;
- });
- // Navigate with keyboard
- if (evt.keyCode === 38 && index > 0)
- index--;
- else if (evt.keyCode === 40 && index < items.length - 1)
- index++;
- else if (angular.isUndefined(index))
- index = 0;
- items.eq(index)[0].focus();
- };
- // Overrides
- var show = $dropdown.show;
- $dropdown.show = function () {
- show();
- setTimeout(function () {
- options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);
- bodyEl.on('click', onBodyClick);
- });
- };
- var hide = $dropdown.hide;
- $dropdown.hide = function () {
- options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);
- bodyEl.off('click', onBodyClick);
- hide();
- };
- // Private functions
- function onBodyClick(evt) {
- if (evt.target === element[0])
- return;
- return evt.target !== element[0] && $dropdown.hide();
- }
- return $dropdown;
- }
- return DropdownFactory;
- }
- ];
- }).directive('bsDropdown', [
- '$window',
- '$location',
- '$sce',
- '$dropdown',
- function ($window, $location, $sce, $dropdown) {
- return {
- restrict: 'EAC',
- scope: true,
- link: function postLink(scope, element, attr, transclusion) {
- // Directive options
- var options = { scope: scope };
- angular.forEach([
- 'placement',
- 'container',
- 'delay',
- 'trigger',
- 'keyboard',
- 'html',
- 'animation',
- 'template'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- // Support scope as an object
- attr.bsDropdown && scope.$watch(attr.bsDropdown, function (newValue, oldValue) {
- scope.content = newValue;
- }, true);
- // Initialize dropdown
- var dropdown = $dropdown(element, options);
- // Garbage collection
- scope.$on('$destroy', function () {
- dropdown.destroy();
- options = null;
- dropdown = null;
- });
- }
- };
- }
- ]);
- // Source: src/helpers/date-parser.js
- angular.module('mgcrea.ngStrap.helpers.dateParser', []).provider('$dateParser', [
- '$localeProvider',
- function ($localeProvider) {
- var proto = Date.prototype;
- function isNumeric(n) {
- return !isNaN(parseFloat(n)) && isFinite(n);
- }
- var defaults = this.defaults = {
- format: 'shortDate',
- strict: false
- };
- this.$get = [
- '$locale',
- function ($locale) {
- var DateParserFactory = function (config) {
- var options = angular.extend({}, defaults, config);
- var $dateParser = {};
- var regExpMap = {
- 'sss': '[0-9]{3}',
- 'ss': '[0-5][0-9]',
- 's': options.strict ? '[1-5]?[0-9]' : '[0-5][0-9]',
- 'mm': '[0-5][0-9]',
- 'm': options.strict ? '[1-5]?[0-9]' : '[0-5][0-9]',
- 'HH': '[01][0-9]|2[0-3]',
- 'H': options.strict ? '[0][1-9]|[1][012]' : '[01][0-9]|2[0-3]',
- 'hh': '[0][1-9]|[1][012]',
- 'h': options.strict ? '[1-9]|[1][012]' : '[0]?[1-9]|[1][012]',
- 'a': 'AM|PM',
- 'EEEE': $locale.DATETIME_FORMATS.DAY.join('|'),
- 'EEE': $locale.DATETIME_FORMATS.SHORTDAY.join('|'),
- 'dd': '[0-2][0-9]{1}|[3][01]{1}',
- 'd': options.strict ? '[1-2]?[0-9]{1}|[3][01]{1}' : '[0-2][0-9]{1}|[3][01]{1}',
- 'MMMM': $locale.DATETIME_FORMATS.MONTH.join('|'),
- 'MMM': $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),
- 'MM': '[0][1-9]|[1][012]',
- 'M': options.strict ? '[1-9]|[1][012]' : '[0][1-9]|[1][012]',
- 'yyyy': '(?:(?:[1]{1}[0-9]{1}[0-9]{1}[0-9]{1})|(?:[2]{1}[0-9]{3}))(?![[0-9]])',
- 'yy': '(?:(?:[0-9]{1}[0-9]{1}))(?![[0-9]])'
- };
- var setFnMap = {
- 'sss': proto.setMilliseconds,
- 'ss': proto.setSeconds,
- 's': proto.setSeconds,
- 'mm': proto.setMinutes,
- 'm': proto.setMinutes,
- 'HH': proto.setHours,
- 'H': proto.setHours,
- 'hh': proto.setHours,
- 'h': proto.setHours,
- 'dd': proto.setDate,
- 'd': proto.setDate,
- 'a': function (value) {
- var hours = this.getHours();
- return this.setHours(value.match(/pm/i) ? hours + 12 : hours);
- },
- 'MMMM': function (value) {
- return this.setMonth($locale.DATETIME_FORMATS.MONTH.indexOf(value));
- },
- 'MMM': function (value) {
- return this.setMonth($locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value));
- },
- 'MM': function (value) {
- return this.setMonth(1 * value - 1);
- },
- 'M': function (value) {
- return this.setMonth(1 * value - 1);
- },
- 'yyyy': proto.setFullYear,
- 'yy': function (value) {
- return this.setFullYear(2000 + 1 * value);
- },
- 'y': proto.setFullYear
- };
- var regex, setMap;
- $dateParser.init = function () {
- $dateParser.$format = $locale.DATETIME_FORMATS[options.format] || options.format;
- regex = regExpForFormat($dateParser.$format);
- setMap = setMapForFormat($dateParser.$format);
- };
- $dateParser.isValid = function (date) {
- if (angular.isDate(date))
- return !isNaN(date.getTime());
- return regex.test(date);
- };
- $dateParser.parse = function (value, baseDate) {
- if (angular.isDate(value))
- return value;
- var matches = regex.exec(value);
- if (!matches)
- return false;
- var date = baseDate || new Date(0);
- for (var i = 0; i < matches.length - 1; i++) {
- setMap[i] && setMap[i].call(date, matches[i + 1]);
- }
- return date;
+ 'MMM': function (value) {
+ return this.setMonth($locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value));
+ },
+ 'MM': function (value) {
+ return this.setMonth(1 * value - 1);
+ },
+ 'M': function (value) {
+ return this.setMonth(1 * value - 1);
+ },
+ 'yyyy': proto.setFullYear,
+ 'yy': function (value) {
+ return this.setFullYear(2000 + 1 * value);
+ },
+ 'y': proto.setFullYear
};
- // Private functions
- function setMapForFormat(format) {
- var keys = Object.keys(setFnMap), i;
- var map = [], sortedMap = [];
- // Map to setFn
- var clonedFormat = format;
- for (i = 0; i < keys.length; i++) {
- if (format.split(keys[i]).length > 1) {
- var index = clonedFormat.search(keys[i]);
- format = format.split(keys[i]).join('');
- if (setFnMap[keys[i]])
- map[index] = setFnMap[keys[i]];
- }
- }
- // Sort result map
- angular.forEach(map, function (v) {
- sortedMap.push(v);
- });
- return sortedMap;
- }
- function escapeReservedSymbols(text) {
- return text.replace(/\//g, '[\\/]').replace('/-/g', '[-]').replace(/\./g, '[.]').replace(/\\s/g, '[\\s]');
+ var regex, setMap;
+ $dateParser.init = function () {
+ $dateParser.$format = $locale.DATETIME_FORMATS[options.format] || options.format;
+ regex = regExpForFormat($dateParser.$format);
+ setMap = setMapForFormat($dateParser.$format);
+ };
+ $dateParser.isValid = function (date) {
+ if (angular.isDate(date))
+ return !isNaN(date.getTime());
+ return regex.test(date);
+ };
+ $dateParser.parse = function (value, baseDate) {
+ if (angular.isDate(value))
+ return value;
+ var matches = regex.exec(value);
+ if (!matches)
+ return false;
+ var date = baseDate || new Date(0);
+ for (var i = 0; i < matches.length - 1; i++) {
+ setMap[i] && setMap[i].call(date, matches[i + 1]);
}
- function regExpForFormat(format) {
- var keys = Object.keys(regExpMap), i;
- var re = format;
- // Abstract replaces to avoid collisions
- for (i = 0; i < keys.length; i++) {
- re = re.split(keys[i]).join('${' + i + '}');
- }
- // Replace abstracted values
- for (i = 0; i < keys.length; i++) {
- re = re.split('${' + i + '}').join('(' + regExpMap[keys[i]] + ')');
+ return date;
+ };
+ // Private functions
+ function setMapForFormat(format) {
+ var keys = Object.keys(setFnMap), i;
+ var map = [], sortedMap = [];
+ // Map to setFn
+ var clonedFormat = format;
+ for (i = 0; i < keys.length; i++) {
+ if (format.split(keys[i]).length > 1) {
+ var index = clonedFormat.search(keys[i]);
+ format = format.split(keys[i]).join('');
+ if (setFnMap[keys[i]])
+ map[index] = setFnMap[keys[i]];
}
- format = escapeReservedSymbols(format);
- return new RegExp('^' + re + '$', ['i']);
}
- $dateParser.init();
- return $dateParser;
- };
- return DateParserFactory;
- }
- ];
- }
- ]);
- // Source: src/helpers/debounce.js
- angular.module('mgcrea.ngStrap.helpers.debounce', []).constant('debounce', function (func, wait, immediate) {
- var timeout, args, context, timestamp, result;
- return function () {
- context = this;
- args = arguments;
- timestamp = new Date();
- var later = function () {
- var last = new Date() - timestamp;
- if (last < wait) {
- timeout = setTimeout(later, wait - last);
- } else {
- timeout = null;
- if (!immediate)
- result = func.apply(context, args);
- }
- };
- var callNow = immediate && !timeout;
- if (!timeout) {
- timeout = setTimeout(later, wait);
+ // Sort result map
+ angular.forEach(map, function (v) {
+ sortedMap.push(v);
+ });
+ return sortedMap;
+ }
+ function escapeReservedSymbols(text) {
+ return text.replace(/\//g, '[\\/]').replace('/-/g', '[-]').replace(/\./g, '[.]').replace(/\\s/g, '[\\s]');
+ }
+ function regExpForFormat(format) {
+ var keys = Object.keys(regExpMap), i;
+ var re = format;
+ // Abstract replaces to avoid collisions
+ for (i = 0; i < keys.length; i++) {
+ re = re.split(keys[i]).join('${' + i + '}');
+ }
+ // Replace abstracted values
+ for (i = 0; i < keys.length; i++) {
+ re = re.split('${' + i + '}').join('(' + regExpMap[keys[i]] + ')');
+ }
+ format = escapeReservedSymbols(format);
+ return new RegExp('^' + re + '$', ['i']);
+ }
+ $dateParser.init();
+ return $dateParser;
+ };
+ return DateParserFactory;
}
- if (callNow)
- result = func.apply(context, args);
- return result;
- };
- }).constant('throttle', function (func, wait, options) {
- var context, args, result;
- var timeout = null;
- var previous = 0;
- options || (options = {});
+ ];
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/helpers/debounce.js
+angular.module('mgcrea.ngStrap.helpers.debounce', []).constant('debounce', function (func, wait, immediate) {
+ var timeout, args, context, timestamp, result;
+ return function () {
+ context = this;
+ args = arguments;
+ timestamp = new Date();
var later = function () {
- previous = options.leading === false ? 0 : new Date();
- timeout = null;
- result = func.apply(context, args);
- };
- return function () {
- var now = new Date();
- if (!previous && options.leading === false)
- previous = now;
- var remaining = wait - (now - previous);
- context = this;
- args = arguments;
- if (remaining <= 0) {
- clearTimeout(timeout);
+ var last = new Date() - timestamp;
+ if (last < wait) {
+ timeout = setTimeout(later, wait - last);
+ } else {
timeout = null;
- previous = now;
- result = func.apply(context, args);
- } else if (!timeout && options.trailing !== false) {
- timeout = setTimeout(later, remaining);
+ if (!immediate)
+ result = func.apply(context, args);
}
- return result;
};
- });
- // Source: src/helpers/dimensions.js
- angular.module('mgcrea.ngStrap.helpers.dimensions', []).factory('dimensions', [
- '$document',
- '$window',
- function ($document, $window) {
- var jqLite = angular.element;
- var fn = {};
- /**
+ var callNow = immediate && !timeout;
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ }
+ if (callNow)
+ result = func.apply(context, args);
+ return result;
+ };
+}).constant('throttle', function (func, wait, options) {
+ var context, args, result;
+ var timeout = null;
+ var previous = 0;
+ options || (options = {});
+ var later = function () {
+ previous = options.leading === false ? 0 : new Date();
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function () {
+ var now = new Date();
+ if (!previous && options.leading === false)
+ previous = now;
+ var remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+});
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/helpers/dimensions.js
+angular.module('mgcrea.ngStrap.helpers.dimensions', []).factory('dimensions', [
+ '$document',
+ '$window',
+ function ($document, $window) {
+ var jqLite = angular.element;
+ var fn = {};
+ /**
* Test the element nodeName
* @param element
* @param name
*/
- var nodeName = fn.nodeName = function (element, name) {
- return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase();
- };
- /**
+ var nodeName = fn.nodeName = function (element, name) {
+ return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase();
+ };
+ /**
* Returns the element computed style
* @param element
* @param prop
* @param extra
*/
- fn.css = function (element, prop, extra) {
- var value;
- if (element.currentStyle) {
- //IE
- value = element.currentStyle[prop];
- } else if (window.getComputedStyle) {
- value = window.getComputedStyle(element)[prop];
- } else {
- value = element.style[prop];
- }
- return extra === true ? parseFloat(value) || 0 : value;
- };
- /**
+ fn.css = function (element, prop, extra) {
+ var value;
+ if (element.currentStyle) {
+ //IE
+ value = element.currentStyle[prop];
+ } else if (window.getComputedStyle) {
+ value = window.getComputedStyle(element)[prop];
+ } else {
+ value = element.style[prop];
+ }
+ return extra === true ? parseFloat(value) || 0 : value;
+ };
+ /**
* Provides read-only equivalent of jQuery's offset function:
* @required-by bootstrap-tooltip, bootstrap-affix
* @url http://api.jquery.com/offset/
* @param element
*/
- fn.offset = function (element) {
- var boxRect = element.getBoundingClientRect();
- var docElement = element.ownerDocument;
- return {
- width: element.offsetWidth,
- height: element.offsetHeight,
- top: boxRect.top + (window.pageYOffset || docElement.documentElement.scrollTop) - (docElement.documentElement.clientTop || 0),
- left: boxRect.left + (window.pageXOffset || docElement.documentElement.scrollLeft) - (docElement.documentElement.clientLeft || 0)
- };
+ fn.offset = function (element) {
+ var boxRect = element.getBoundingClientRect();
+ var docElement = element.ownerDocument;
+ return {
+ width: element.offsetWidth,
+ height: element.offsetHeight,
+ top: boxRect.top + (window.pageYOffset || docElement.documentElement.scrollTop) - (docElement.documentElement.clientTop || 0),
+ left: boxRect.left + (window.pageXOffset || docElement.documentElement.scrollLeft) - (docElement.documentElement.clientLeft || 0)
};
- /**
+ };
+ /**
* Provides read-only equivalent of jQuery's position function
* @required-by bootstrap-tooltip, bootstrap-affix
* @url http://api.jquery.com/offset/
* @param element
*/
- fn.position = function (element) {
- var offsetParentRect = {
- top: 0,
- left: 0
- }, offsetParentElement, offset;
- // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
- if (fn.css(element, 'position') === 'fixed') {
- // We assume that getBoundingClientRect is available when computed position is fixed
- offset = element.getBoundingClientRect();
- } else {
- // Get *real* offsetParentElement
- offsetParentElement = offsetParent(element);
- offset = fn.offset(element);
- // Get correct offsets
- offset = fn.offset(element);
- if (!nodeName(offsetParentElement, 'html')) {
- offsetParentRect = fn.offset(offsetParentElement);
- }
- // Add offsetParent borders
- offsetParentRect.top += fn.css(offsetParentElement, 'borderTopWidth', true);
- offsetParentRect.left += fn.css(offsetParentElement, 'borderLeftWidth', true);
+ fn.position = function (element) {
+ var offsetParentRect = {
+ top: 0,
+ left: 0
+ }, offsetParentElement, offset;
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+ if (fn.css(element, 'position') === 'fixed') {
+ // We assume that getBoundingClientRect is available when computed position is fixed
+ offset = element.getBoundingClientRect();
+ } else {
+ // Get *real* offsetParentElement
+ offsetParentElement = offsetParent(element);
+ offset = fn.offset(element);
+ // Get correct offsets
+ offset = fn.offset(element);
+ if (!nodeName(offsetParentElement, 'html')) {
+ offsetParentRect = fn.offset(offsetParentElement);
}
- // Subtract parent offsets and element margins
- return {
- width: element.offsetWidth,
- height: element.offsetHeight,
- top: offset.top - offsetParentRect.top - fn.css(element, 'marginTop', true),
- left: offset.left - offsetParentRect.left - fn.css(element, 'marginLeft', true)
- };
+ // Add offsetParent borders
+ offsetParentRect.top += fn.css(offsetParentElement, 'borderTopWidth', true);
+ offsetParentRect.left += fn.css(offsetParentElement, 'borderLeftWidth', true);
+ }
+ // Subtract parent offsets and element margins
+ return {
+ width: element.offsetWidth,
+ height: element.offsetHeight,
+ top: offset.top - offsetParentRect.top - fn.css(element, 'marginTop', true),
+ left: offset.left - offsetParentRect.left - fn.css(element, 'marginLeft', true)
};
- /**
+ };
+ /**
* Returns the closest, non-statically positioned offsetParent of a given element
* @required-by fn.position
* @param element
*/
- var offsetParent = function offsetParentElement(element) {
- var docElement = element.ownerDocument;
- var offsetParent = element.offsetParent || docElement;
- if (nodeName(offsetParent, '#document'))
- return docElement.documentElement;
- while (offsetParent && !nodeName(offsetParent, 'html') && fn.css(offsetParent, 'position') === 'static') {
- offsetParent = offsetParent.offsetParent;
- }
- return offsetParent || docElement.documentElement;
- };
- /**
+ var offsetParent = function offsetParentElement(element) {
+ var docElement = element.ownerDocument;
+ var offsetParent = element.offsetParent || docElement;
+ if (nodeName(offsetParent, '#document'))
+ return docElement.documentElement;
+ while (offsetParent && !nodeName(offsetParent, 'html') && fn.css(offsetParent, 'position') === 'static') {
+ offsetParent = offsetParent.offsetParent;
+ }
+ return offsetParent || docElement.documentElement;
+ };
+ /**
* Provides equivalent of jQuery's height function
* @required-by bootstrap-affix
* @url http://api.jquery.com/height/
* @param element
* @param outer
*/
- fn.height = function (element, outer) {
- var value = element.offsetHeight;
- if (outer) {
- value += fn.css(element, 'marginTop', true) + fn.css(element, 'marginBottom', true);
- } else {
- value -= fn.css(element, 'paddingTop', true) + fn.css(element, 'paddingBottom', true) + fn.css(element, 'borderTopWidth', true) + fn.css(element, 'borderBottomWidth', true);
- }
- return value;
- };
- /**
+ fn.height = function (element, outer) {
+ var value = element.offsetHeight;
+ if (outer) {
+ value += fn.css(element, 'marginTop', true) + fn.css(element, 'marginBottom', true);
+ } else {
+ value -= fn.css(element, 'paddingTop', true) + fn.css(element, 'paddingBottom', true) + fn.css(element, 'borderTopWidth', true) + fn.css(element, 'borderBottomWidth', true);
+ }
+ return value;
+ };
+ /**
* Provides equivalent of jQuery's height function
* @required-by bootstrap-affix
* @url http://api.jquery.com/width/
* @param element
* @param outer
*/
- fn.width = function (element, outer) {
- var value = element.offsetWidth;
- if (outer) {
- value += fn.css(element, 'marginLeft', true) + fn.css(element, 'marginRight', true);
- } else {
- value -= fn.css(element, 'paddingLeft', true) + fn.css(element, 'paddingRight', true) + fn.css(element, 'borderLeftWidth', true) + fn.css(element, 'borderRightWidth', true);
- }
- return value;
- };
- return fn;
- }
- ]);
- // Source: src/helpers/parse-options.js
- angular.module('mgcrea.ngStrap.helpers.parseOptions', []).provider('$parseOptions', function () {
- var defaults = 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 ($parse, $q) {
- function ParseOptionsFactory(attr, config) {
- var $parseOptions = {};
- // Common vars
- var options = angular.extend({}, defaults, config);
- $parseOptions.$values = [];
- // Private vars
- var match, displayFn, valueName, keyName, groupByFn, valueFn, valuesFn;
- $parseOptions.init = function () {
- $parseOptions.$match = match = attr.match(options.regexp);
- displayFn = $parse(match[2] || match[1]), valueName = match[4] || match[6], keyName = match[5], groupByFn = $parse(match[3] || ''), valueFn = $parse(match[2] ? match[1] : valueName), valuesFn = $parse(match[7]);
- };
- $parseOptions.valuesFn = function (scope, controller) {
- return $q.when(valuesFn(scope, controller)).then(function (values) {
- $parseOptions.$values = values ? parseValues(values) : {};
- return $parseOptions.$values;
- });
- };
- // Private functions
- function parseValues(values) {
- return values.map(function (match, index) {
- var locals = {}, label, value;
- locals[valueName] = match;
- label = displayFn(locals);
- value = valueFn(locals) || index;
- return {
- label: label,
- value: value
- };
- });
- }
- $parseOptions.init();
- return $parseOptions;
+ fn.width = function (element, outer) {
+ var value = element.offsetWidth;
+ if (outer) {
+ value += fn.css(element, 'marginLeft', true) + fn.css(element, 'marginRight', true);
+ } else {
+ value -= fn.css(element, 'paddingLeft', true) + fn.css(element, 'paddingRight', true) + fn.css(element, 'borderLeftWidth', true) + fn.css(element, 'borderRightWidth', true);
+ }
+ return value;
+ };
+ return fn;
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/helpers/parse-options.js
+angular.module('mgcrea.ngStrap.helpers.parseOptions', []).provider('$parseOptions', function () {
+ var defaults = 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 ($parse, $q) {
+ function ParseOptionsFactory(attr, config) {
+ var $parseOptions = {};
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ $parseOptions.$values = [];
+ // Private vars
+ var match, displayFn, valueName, keyName, groupByFn, valueFn, valuesFn;
+ $parseOptions.init = function () {
+ $parseOptions.$match = match = attr.match(options.regexp);
+ displayFn = $parse(match[2] || match[1]), valueName = match[4] || match[6], keyName = match[5], groupByFn = $parse(match[3] || ''), valueFn = $parse(match[2] ? match[1] : valueName), valuesFn = $parse(match[7]);
+ };
+ $parseOptions.valuesFn = function (scope, controller) {
+ return $q.when(valuesFn(scope, controller)).then(function (values) {
+ $parseOptions.$values = values ? parseValues(values) : {};
+ return $parseOptions.$values;
+ });
+ };
+ // Private functions
+ function parseValues(values) {
+ return values.map(function (match, index) {
+ var locals = {}, label, value;
+ locals[valueName] = match;
+ label = displayFn(locals);
+ value = valueFn(locals) || index;
+ return {
+ label: label,
+ value: value
+ };
+ });
}
- return ParseOptionsFactory;
+ $parseOptions.init();
+ return $parseOptions;
}
- ];
- });
- // Source: src/modal/modal.js
- angular.module('mgcrea.ngStrap.modal', ['mgcrea.ngStrap.helpers.dimensions']).provider('$modal', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- backdropAnimation: 'am-fade',
- prefixClass: 'modal',
- placement: 'top',
- template: 'modal/modal.tpl.html',
- contentTemplate: false,
- container: false,
- element: null,
- backdrop: true,
- keyboard: true,
- html: false,
- show: true
+ return ParseOptionsFactory;
+ }
+ ];
+});
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/helpers/raf.js
+angular.version.minor < 3 && angular.version.dot < 14 && angular.module('ng').factory('$$rAF', [
+ '$window',
+ '$timeout',
+ function ($window, $timeout) {
+ var requestAnimationFrame = $window.requestAnimationFrame || $window.webkitRequestAnimationFrame || $window.mozRequestAnimationFrame;
+ var cancelAnimationFrame = $window.cancelAnimationFrame || $window.webkitCancelAnimationFrame || $window.mozCancelAnimationFrame || $window.webkitCancelRequestAnimationFrame;
+ var rafSupported = !!requestAnimationFrame;
+ var raf = rafSupported ? function (fn) {
+ var id = requestAnimationFrame(fn);
+ return function () {
+ cancelAnimationFrame(id);
+ };
+ } : function (fn) {
+ var timer = $timeout(fn, 16.66, false);
+ // 1000 / 60 = 16.666
+ return function () {
+ $timeout.cancel(timer);
+ };
};
- this.$get = [
- '$window',
- '$rootScope',
- '$compile',
- '$q',
- '$templateCache',
- '$http',
- '$animate',
- '$timeout',
- 'dimensions',
- function ($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, dimensions) {
- var forEach = angular.forEach;
- var trim = String.prototype.trim;
- var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
- var bodyElement = angular.element($window.document.body);
- var htmlReplaceRegExp = /ng-bind="/gi;
- function ModalFactory(config) {
- var $modal = {};
- // Common vars
- var options = angular.extend({}, defaults, config);
- $modal.$promise = fetchTemplate(options.template);
- var scope = $modal.$scope = options.scope && options.scope.$new() || $rootScope.$new();
- if (!options.element && !options.container) {
- options.container = 'body';
- }
- // Support scope as string options
- forEach([
- 'title',
- 'content'
- ], function (key) {
- if (options[key])
- scope[key] = options[key];
+ raf.supported = rafSupported;
+ return raf;
+ }
+]); // .factory('$$animateReflow', function($$rAF, $document) {
+ // var bodyEl = $document[0].body;
+ // return function(fn) {
+ // //the returned function acts as the cancellation function
+ // return $$rAF(function() {
+ // //the line below will force the browser to perform a repaint
+ // //so that all the animated elements within the animation frame
+ // //will be properly updated and drawn on screen. This is
+ // //required to perform multi-class CSS based animations with
+ // //Firefox. DO NOT REMOVE THIS LINE.
+ // var a = bodyEl.offsetWidth + 1;
+ // fn();
+ // });
+ // };
+ // });
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/modal/modal.js
+angular.module('mgcrea.ngStrap.modal', ['mgcrea.ngStrap.helpers.dimensions']).provider('$modal', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ backdropAnimation: 'am-fade',
+ prefixClass: 'modal',
+ prefixEvent: 'modal',
+ placement: 'top',
+ template: 'modal/modal.tpl.html',
+ contentTemplate: false,
+ container: false,
+ element: null,
+ backdrop: true,
+ keyboard: true,
+ html: false,
+ show: true
+ };
+ this.$get = [
+ '$window',
+ '$rootScope',
+ '$compile',
+ '$q',
+ '$templateCache',
+ '$http',
+ '$animate',
+ '$timeout',
+ '$sce',
+ 'dimensions',
+ function ($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, $sce, dimensions) {
+ var forEach = angular.forEach;
+ var trim = String.prototype.trim;
+ var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
+ var bodyElement = angular.element($window.document.body);
+ var htmlReplaceRegExp = /ng-bind="/gi;
+ function ModalFactory(config) {
+ var $modal = {};
+ // Common vars
+ var options = $modal.$options = angular.extend({}, defaults, config);
+ $modal.$promise = fetchTemplate(options.template);
+ var scope = $modal.$scope = options.scope && options.scope.$new() || $rootScope.$new();
+ if (!options.element && !options.container) {
+ options.container = 'body';
+ }
+ // Support scope as string options
+ forEach([
+ 'title',
+ 'content'
+ ], function (key) {
+ if (options[key])
+ scope[key] = $sce.trustAsHtml(options[key]);
+ });
+ // Provide scope helpers
+ scope.$hide = function () {
+ scope.$$postDigest(function () {
+ $modal.hide();
});
- // Provide scope helpers
- scope.$hide = function () {
- scope.$$postDigest(function () {
- $modal.hide();
+ };
+ scope.$show = function () {
+ scope.$$postDigest(function () {
+ $modal.show();
+ });
+ };
+ scope.$toggle = function () {
+ scope.$$postDigest(function () {
+ $modal.toggle();
+ });
+ };
+ // Support contentTemplate option
+ if (options.contentTemplate) {
+ $modal.$promise = $modal.$promise.then(function (template) {
+ var templateEl = angular.element(template);
+ return fetchTemplate(options.contentTemplate).then(function (contentTemplate) {
+ var contentEl = findElement('[ng-bind="content"]', templateEl[0]).removeAttr('ng-bind').html(contentTemplate);
+ // Drop the default footer as you probably don't want it if you use a custom contentTemplate
+ if (!config.template)
+ contentEl.next().remove();
+ return templateEl[0].outerHTML;
});
- };
- scope.$show = function () {
+ });
+ }
+ // Fetch, compile then initialize modal
+ var modalLinker, modalElement;
+ var backdropElement = angular.element('
');
+ $modal.$promise.then(function (template) {
+ if (angular.isObject(template))
+ template = template.data;
+ if (options.html)
+ template = template.replace(htmlReplaceRegExp, 'ng-bind-html="');
+ template = trim.apply(template);
+ modalLinker = $compile(template);
+ $modal.init();
+ });
+ $modal.init = function () {
+ // Options: show
+ if (options.show) {
scope.$$postDigest(function () {
$modal.show();
});
- };
- scope.$toggle = function () {
- scope.$$postDigest(function () {
- $modal.toggle();
- });
- };
- // Support contentTemplate option
- if (options.contentTemplate) {
- $modal.$promise = $modal.$promise.then(function (template) {
- var templateEl = angular.element(template);
- return fetchTemplate(options.contentTemplate).then(function (contentTemplate) {
- var contentEl = findElement('[ng-bind="content"]', templateEl[0]).removeAttr('ng-bind').html(contentTemplate);
- // Drop the default footer as you probably don't want it if you use a custom contentTemplate
- if (!config.template)
- contentEl.next().remove();
- return templateEl[0].outerHTML;
- });
- });
}
- // Fetch, compile then initialize modal
- var modalLinker, modalElement;
- var backdropElement = angular.element('
');
- $modal.$promise.then(function (template) {
- if (angular.isObject(template))
- template = template.data;
- if (options.html)
- template = template.replace(htmlReplaceRegExp, 'ng-bind-html="');
- template = trim.apply(template);
- modalLinker = $compile(template);
- $modal.init();
+ };
+ $modal.destroy = function () {
+ // Remove element
+ if (modalElement) {
+ modalElement.remove();
+ modalElement = null;
+ }
+ if (backdropElement) {
+ backdropElement.remove();
+ backdropElement = null;
+ }
+ // Destroy scope
+ scope.$destroy();
+ };
+ $modal.show = function () {
+ scope.$emit(options.prefixEvent + '.show.before', $modal);
+ var parent = options.container ? findElement(options.container) : null;
+ var after = options.container ? null : options.element;
+ // Fetch a cloned element linked from template
+ modalElement = $modal.$element = modalLinker(scope, function (clonedElement, scope) {
});
- $modal.init = function () {
- // Options: show
- if (options.show) {
- scope.$$postDigest(function () {
- $modal.show();
- });
- }
- };
- $modal.destroy = function () {
- // Remove element
- if (modalElement) {
- modalElement.remove();
- modalElement = null;
- }
- if (backdropElement) {
- backdropElement.remove();
- backdropElement = null;
- }
- // Destroy scope
- scope.$destroy();
- };
- $modal.show = function () {
- var parent = options.container ? findElement(options.container) : null;
- var after = options.container ? null : options.element;
- // Fetch a cloned element linked from template
- modalElement = $modal.$element = modalLinker(scope, function (clonedElement, scope) {
- });
- // Set the initial positioning.
- modalElement.css({ display: 'block' }).addClass(options.placement);
- // Options: animation
- if (options.animation) {
- if (options.backdrop) {
- backdropElement.addClass(options.backdropAnimation);
- }
- modalElement.addClass(options.animation);
- }
+ // Set the initial positioning.
+ modalElement.css({ display: 'block' }).addClass(options.placement);
+ // Options: animation
+ if (options.animation) {
if (options.backdrop) {
- $animate.enter(backdropElement, bodyElement, null, function () {
- });
+ backdropElement.addClass(options.backdropAnimation);
}
- $animate.enter(modalElement, parent, after, function () {
- });
- scope.$isShown = true;
- scope.$$phase || scope.$digest();
- // Focus once the enter-animation has started
- // Weird PhantomJS bug hack
- var el = modalElement[0];
- requestAnimationFrame(function () {
- el.focus();
+ modalElement.addClass(options.animation);
+ }
+ if (options.backdrop) {
+ $animate.enter(backdropElement, bodyElement, null, function () {
});
- bodyElement.addClass(options.prefixClass + '-open');
+ }
+ $animate.enter(modalElement, parent, after, function () {
+ scope.$emit(options.prefixEvent + '.show', $modal);
+ });
+ scope.$isShown = true;
+ scope.$$phase || scope.$root.$$phase || scope.$digest();
+ // Focus once the enter-animation has started
+ // Weird PhantomJS bug hack
+ var el = modalElement[0];
+ requestAnimationFrame(function () {
+ el.focus();
+ });
+ bodyElement.addClass(options.prefixClass + '-open');
+ if (options.animation) {
+ bodyElement.addClass(options.prefixClass + '-with-' + options.animation);
+ }
+ // Bind events
+ if (options.backdrop) {
+ modalElement.on('click', hideOnBackdropClick);
+ backdropElement.on('click', hideOnBackdropClick);
+ }
+ if (options.keyboard) {
+ modalElement.on('keyup', $modal.$onKeyUp);
+ }
+ };
+ $modal.hide = function () {
+ scope.$emit(options.prefixEvent + '.hide.before', $modal);
+ $animate.leave(modalElement, function () {
+ scope.$emit(options.prefixEvent + '.hide', $modal);
+ bodyElement.removeClass(options.prefixClass + '-open');
if (options.animation) {
bodyElement.addClass(options.prefixClass + '-with-' + options.animation);
}
- // Bind events
- if (options.backdrop) {
- modalElement.on('click', hideOnBackdropClick);
- backdropElement.on('click', hideOnBackdropClick);
- }
- if (options.keyboard) {
- modalElement.on('keyup', $modal.$onKeyUp);
- }
- };
- $modal.hide = function () {
- $animate.leave(modalElement, function () {
- bodyElement.removeClass(options.prefixClass + '-open');
- if (options.animation) {
- bodyElement.addClass(options.prefixClass + '-with-' + options.animation);
- }
+ });
+ if (options.backdrop) {
+ $animate.leave(backdropElement, function () {
});
- if (options.backdrop) {
- $animate.leave(backdropElement, function () {
- });
- }
- scope.$isShown = false;
- scope.$$phase || scope.$digest();
- // Unbind events
- if (options.backdrop) {
- modalElement.off('click', hideOnBackdropClick);
- backdropElement.off('click', hideOnBackdropClick);
- }
- if (options.keyboard) {
- modalElement.off('keyup', $modal.$onKeyUp);
- }
- };
- $modal.toggle = function () {
- scope.$isShown ? $modal.hide() : $modal.show();
- };
- $modal.focus = function () {
- modalElement[0].focus();
- };
- // Protected methods
- $modal.$onKeyUp = function (evt) {
- evt.which === 27 && $modal.hide();
- };
- // Private methods
- function hideOnBackdropClick(evt) {
- if (evt.target !== evt.currentTarget)
- return;
- options.backdrop === 'static' ? $modal.focus() : $modal.hide();
}
- return $modal;
- }
- // Helper functions
- function findElement(query, element) {
- return angular.element((element || document).querySelectorAll(query));
- }
- function fetchTemplate(template) {
- return $q.when($templateCache.get(template) || $http.get(template)).then(function (res) {
- if (angular.isObject(res)) {
- $templateCache.put(template, res.data);
- return res.data;
- }
- return res;
- });
+ scope.$isShown = false;
+ scope.$$phase || scope.$root.$$phase || scope.$digest();
+ // Unbind events
+ if (options.backdrop) {
+ modalElement.off('click', hideOnBackdropClick);
+ backdropElement.off('click', hideOnBackdropClick);
+ }
+ if (options.keyboard) {
+ modalElement.off('keyup', $modal.$onKeyUp);
+ }
+ };
+ $modal.toggle = function () {
+ scope.$isShown ? $modal.hide() : $modal.show();
+ };
+ $modal.focus = function () {
+ modalElement[0].focus();
+ };
+ // Protected methods
+ $modal.$onKeyUp = function (evt) {
+ evt.which === 27 && $modal.hide();
+ };
+ // Private methods
+ function hideOnBackdropClick(evt) {
+ if (evt.target !== evt.currentTarget)
+ return;
+ options.backdrop === 'static' ? $modal.focus() : $modal.hide();
}
- return ModalFactory;
+ return $modal;
}
- ];
- }).directive('bsModal', [
- '$window',
- '$location',
- '$sce',
- '$modal',
- function ($window, $location, $sce, $modal) {
- return {
- restrict: 'EAC',
- scope: true,
- link: function postLink(scope, element, attr, transclusion) {
- // Directive options
- var options = {
- scope: scope,
- element: element,
- show: false
- };
- angular.forEach([
- 'template',
- 'contentTemplate',
- 'placement',
- 'backdrop',
- 'keyboard',
- 'html',
- 'container',
- 'animation'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- // Support scope as data-attrs
- angular.forEach([
- 'title',
- 'content'
- ], function (key) {
- attr[key] && attr.$observe(key, function (newValue, oldValue) {
- scope[key] = $sce.trustAsHtml(newValue);
- });
+ // Helper functions
+ function findElement(query, element) {
+ return angular.element((element || document).querySelectorAll(query));
+ }
+ function fetchTemplate(template) {
+ return $q.when($templateCache.get(template) || $http.get(template)).then(function (res) {
+ if (angular.isObject(res)) {
+ $templateCache.put(template, res.data);
+ return res.data;
+ }
+ return res;
+ });
+ }
+ return ModalFactory;
+ }
+ ];
+}).directive('bsModal', [
+ '$window',
+ '$location',
+ '$sce',
+ '$modal',
+ function ($window, $location, $sce, $modal) {
+ return {
+ restrict: 'EAC',
+ scope: true,
+ link: function postLink(scope, element, attr, transclusion) {
+ // Directive options
+ var options = {
+ scope: scope,
+ element: element,
+ show: false
+ };
+ angular.forEach([
+ 'template',
+ 'contentTemplate',
+ 'placement',
+ 'backdrop',
+ 'keyboard',
+ 'html',
+ 'container',
+ 'animation'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Support scope as data-attrs
+ angular.forEach([
+ 'title',
+ 'content'
+ ], function (key) {
+ attr[key] && attr.$observe(key, function (newValue, oldValue) {
+ scope[key] = $sce.trustAsHtml(newValue);
});
- // Support scope as an object
- attr.bsModal && scope.$watch(attr.bsModal, function (newValue, oldValue) {
- if (angular.isObject(newValue)) {
- angular.extend(scope, newValue);
+ });
+ // Support scope as an object
+ attr.bsModal && scope.$watch(attr.bsModal, function (newValue, oldValue) {
+ if (angular.isObject(newValue)) {
+ angular.extend(scope, newValue);
+ } else {
+ scope.content = newValue;
+ }
+ }, true);
+ // Initialize modal
+ var modal = $modal(options);
+ // Trigger
+ element.on(attr.trigger || 'click', modal.toggle);
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ modal.destroy();
+ options = null;
+ modal = null;
+ });
+ }
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/navbar/navbar.js
+angular.module('mgcrea.ngStrap.navbar', []).provider('$navbar', function () {
+ var defaults = this.defaults = {
+ activeClass: 'active',
+ routeAttr: 'data-match-route',
+ strict: false
+ };
+ this.$get = function () {
+ return { defaults: defaults };
+ };
+}).directive('bsNavbar', [
+ '$window',
+ '$location',
+ '$navbar',
+ function ($window, $location, $navbar) {
+ var defaults = $navbar.defaults;
+ return {
+ restrict: 'A',
+ link: function postLink(scope, element, attr, controller) {
+ // Directive options
+ var options = angular.copy(defaults);
+ angular.forEach(Object.keys(defaults), function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Watch for the $location
+ scope.$watch(function () {
+ return $location.path();
+ }, function (newValue, oldValue) {
+ var liElements = element[0].querySelectorAll('li[' + options.routeAttr + ']');
+ angular.forEach(liElements, function (li) {
+ var liElement = angular.element(li);
+ var pattern = liElement.attr(options.routeAttr).replace('/', '\\/');
+ if (options.strict) {
+ pattern = '^' + pattern + '$';
+ }
+ var regexp = new RegExp(pattern, ['i']);
+ if (regexp.test(newValue)) {
+ liElement.addClass(options.activeClass);
} else {
- scope.content = newValue;
+ liElement.removeClass(options.activeClass);
}
- }, true);
- // Initialize modal
- var modal = $modal(options);
- // Trigger
- element.on(attr.trigger || 'click', modal.toggle);
- // Garbage collection
- scope.$on('$destroy', function () {
- modal.destroy();
- options = null;
- modal = null;
});
+ });
+ }
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/popover/popover.js
+angular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip']).provider('$popover', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ placement: 'right',
+ template: 'popover/popover.tpl.html',
+ contentTemplate: false,
+ trigger: 'click',
+ keyboard: true,
+ html: false,
+ title: '',
+ content: '',
+ delay: 0,
+ container: false
+ };
+ this.$get = [
+ '$tooltip',
+ function ($tooltip) {
+ function PopoverFactory(element, config) {
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ var $popover = $tooltip(element, options);
+ // Support scope as string options [/*title, */content]
+ if (options.content) {
+ $popover.$scope.content = options.content;
}
- };
+ return $popover;
+ }
+ return PopoverFactory;
}
- ]);
- // Source: src/navbar/navbar.js
- angular.module('mgcrea.ngStrap.navbar', []).provider('$navbar', function () {
- var defaults = this.defaults = {
- activeClass: 'active',
- routeAttr: 'data-match-route',
- strict: false
- };
- this.$get = function () {
- return { defaults: defaults };
- };
- }).directive('bsNavbar', [
- '$window',
- '$location',
- '$navbar',
- function ($window, $location, $navbar) {
- var defaults = $navbar.defaults;
- return {
- restrict: 'A',
- link: function postLink(scope, element, attr, controller) {
- // Directive options
- var options = angular.copy(defaults);
- angular.forEach(Object.keys(defaults), function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- // Watch for the $location
- scope.$watch(function () {
- return $location.path();
- }, function (newValue, oldValue) {
- var liElements = element[0].querySelectorAll('li[' + options.routeAttr + ']');
- angular.forEach(liElements, function (li) {
- var liElement = angular.element(li);
- var pattern = liElement.attr(options.routeAttr).replace('/', '\\/');
- if (options.strict) {
- pattern = '^' + pattern + '$';
- }
- var regexp = new RegExp(pattern, ['i']);
- if (regexp.test(newValue)) {
- liElement.addClass(options.activeClass);
- } else {
- liElement.removeClass(options.activeClass);
- }
+ ];
+}).directive('bsPopover', [
+ '$window',
+ '$location',
+ '$sce',
+ '$popover',
+ function ($window, $location, $sce, $popover) {
+ var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
+ return {
+ restrict: 'EAC',
+ scope: true,
+ link: function postLink(scope, element, attr) {
+ // Directive options
+ var options = { scope: scope };
+ angular.forEach([
+ 'template',
+ 'contentTemplate',
+ 'placement',
+ 'container',
+ 'delay',
+ 'trigger',
+ 'keyboard',
+ 'html',
+ 'animation'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Support scope as data-attrs
+ angular.forEach([
+ 'title',
+ 'content'
+ ], function (key) {
+ attr[key] && attr.$observe(key, function (newValue, oldValue) {
+ scope[key] = $sce.trustAsHtml(newValue);
+ angular.isDefined(oldValue) && requestAnimationFrame(function () {
+ popover && popover.$applyPlacement();
});
});
- }
- };
- }
- ]);
- // Source: src/popover/popover.js
- angular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip']).provider('$popover', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- placement: 'right',
- template: 'popover/popover.tpl.html',
- contentTemplate: false,
- trigger: 'click',
- keyboard: true,
- html: false,
- title: '',
- content: '',
- delay: 0,
- container: false
- };
- this.$get = [
- '$tooltip',
- function ($tooltip) {
- function PopoverFactory(element, config) {
- // Common vars
- var options = angular.extend({}, defaults, config);
- var $popover = $tooltip(element, options);
- // Support scope as string options [/*title, */content]
- if (options.content) {
- $popover.$scope.content = options.content;
+ });
+ // Support scope as an object
+ attr.bsPopover && scope.$watch(attr.bsPopover, function (newValue, oldValue) {
+ if (angular.isObject(newValue)) {
+ angular.extend(scope, newValue);
+ } else {
+ scope.content = newValue;
}
- return $popover;
- }
- return PopoverFactory;
+ angular.isDefined(oldValue) && requestAnimationFrame(function () {
+ popover && popover.$applyPlacement();
+ });
+ }, true);
+ // Initialize popover
+ var popover = $popover(element, options);
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ popover.destroy();
+ options = null;
+ popover = null;
+ });
}
- ];
- }).directive('bsPopover', [
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/select/select.js
+angular.module('mgcrea.ngStrap.select', [
+ 'mgcrea.ngStrap.tooltip',
+ 'mgcrea.ngStrap.helpers.parseOptions'
+]).provider('$select', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ prefixClass: 'select',
+ placement: 'bottom-left',
+ template: 'select/select.tpl.html',
+ trigger: 'focus',
+ container: false,
+ keyboard: true,
+ html: false,
+ delay: 0,
+ multiple: false,
+ sort: true,
+ caretHtml: ' ',
+ placeholder: 'Choose among the following...',
+ maxLength: 3,
+ maxLengthHtml: 'selected'
+ };
+ this.$get = [
'$window',
- '$location',
- '$sce',
- '$popover',
- function ($window, $location, $sce, $popover) {
- var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
- return {
- restrict: 'EAC',
- scope: true,
- link: function postLink(scope, element, attr) {
- // Directive options
- var options = { scope: scope };
- angular.forEach([
- 'template',
- 'contentTemplate',
- 'placement',
- 'container',
- 'delay',
- 'trigger',
- 'keyboard',
- 'html',
- 'animation'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
+ '$document',
+ '$rootScope',
+ '$tooltip',
+ function ($window, $document, $rootScope, $tooltip) {
+ var bodyEl = angular.element($window.document.body);
+ var isTouch = 'createTouch' in $window.document;
+ function SelectFactory(element, controller, config) {
+ var $select = {};
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ $select = $tooltip(element, options);
+ var parentScope = config.scope;
+ var scope = $select.$scope;
+ scope.$matches = [];
+ scope.$activeIndex = 0;
+ scope.$isMultiple = options.multiple;
+ scope.$activate = function (index) {
+ scope.$$postDigest(function () {
+ $select.activate(index);
});
- // Support scope as data-attrs
- angular.forEach([
- 'title',
- 'content'
- ], function (key) {
- attr[key] && attr.$observe(key, function (newValue, oldValue) {
- scope[key] = $sce.trustAsHtml(newValue);
- angular.isDefined(oldValue) && requestAnimationFrame(function () {
- popover && popover.$applyPlacement();
- });
- });
+ };
+ scope.$select = function (index, evt) {
+ scope.$$postDigest(function () {
+ $select.select(index);
});
- // Support scope as an object
- attr.bsPopover && scope.$watch(attr.bsPopover, function (newValue, oldValue) {
- if (angular.isObject(newValue)) {
- angular.extend(scope, newValue);
+ };
+ scope.$isVisible = function () {
+ return $select.$isVisible();
+ };
+ scope.$isActive = function (index) {
+ return $select.$isActive(index);
+ };
+ // Public methods
+ $select.update = function (matches) {
+ scope.$matches = matches;
+ $select.$updateActiveIndex();
+ };
+ $select.activate = function (index) {
+ if (options.multiple) {
+ scope.$activeIndex.sort();
+ $select.$isActive(index) ? scope.$activeIndex.splice(scope.$activeIndex.indexOf(index), 1) : scope.$activeIndex.push(index);
+ if (options.sort)
+ scope.$activeIndex.sort();
+ } else {
+ scope.$activeIndex = index;
+ }
+ return scope.$activeIndex;
+ };
+ $select.select = function (index) {
+ var value = scope.$matches[index].value;
+ $select.activate(index);
+ if (options.multiple) {
+ controller.$setViewValue(scope.$activeIndex.map(function (index) {
+ return scope.$matches[index].value;
+ }));
+ } else {
+ controller.$setViewValue(value);
+ }
+ controller.$render();
+ if (parentScope)
+ parentScope.$digest();
+ // Hide if single select
+ if (!options.multiple) {
+ $select.hide();
+ }
+ // Emit event
+ scope.$emit('$select.select', value, index);
+ };
+ // Protected methods
+ $select.$updateActiveIndex = function () {
+ if (controller.$modelValue && scope.$matches.length) {
+ if (options.multiple && angular.isArray(controller.$modelValue)) {
+ scope.$activeIndex = controller.$modelValue.map(function (value) {
+ return $select.$getIndex(value);
+ });
} else {
- scope.content = newValue;
+ scope.$activeIndex = $select.$getIndex(controller.$modelValue);
+ }
+ } else if (scope.$activeIndex >= scope.$matches.length) {
+ scope.$activeIndex = options.multiple ? [] : 0;
+ }
+ };
+ $select.$isVisible = function () {
+ if (!options.minLength || !controller) {
+ return scope.$matches.length;
+ }
+ // minLength support
+ return scope.$matches.length && controller.$viewValue.length >= options.minLength;
+ };
+ $select.$isActive = function (index) {
+ if (options.multiple) {
+ return scope.$activeIndex.indexOf(index) !== -1;
+ } else {
+ return scope.$activeIndex === index;
+ }
+ };
+ $select.$getIndex = function (value) {
+ var l = scope.$matches.length, i = l;
+ if (!l)
+ return;
+ for (i = l; i--;) {
+ if (scope.$matches[i].value === value)
+ break;
+ }
+ if (i < 0)
+ return;
+ return i;
+ };
+ $select.$onMouseDown = function (evt) {
+ // Prevent blur on mousedown on .dropdown-menu
+ evt.preventDefault();
+ evt.stopPropagation();
+ // Emulate click for mobile devices
+ if (isTouch) {
+ var targetEl = angular.element(evt.target);
+ targetEl.triggerHandler('click');
+ }
+ };
+ $select.$onKeyDown = function (evt) {
+ if (!/(9|13|38|40)/.test(evt.keyCode))
+ return;
+ evt.preventDefault();
+ evt.stopPropagation();
+ // Select with enter
+ if (evt.keyCode === 13 || evt.keyCode === 9) {
+ return $select.select(scope.$activeIndex);
+ }
+ // Navigate with keyboard
+ if (evt.keyCode === 38 && scope.$activeIndex > 0)
+ scope.$activeIndex--;
+ else if (evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1)
+ scope.$activeIndex++;
+ else if (angular.isUndefined(scope.$activeIndex))
+ scope.$activeIndex = 0;
+ scope.$digest();
+ };
+ // Overrides
+ var _show = $select.show;
+ $select.show = function () {
+ _show();
+ if (options.multiple) {
+ $select.$element.addClass('select-multiple');
+ }
+ setTimeout(function () {
+ $select.$element.on(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);
+ if (options.keyboard) {
+ element.on('keydown', $select.$onKeyDown);
}
- angular.isDefined(oldValue) && requestAnimationFrame(function () {
- popover && popover.$applyPlacement();
- });
- }, true);
- // Initialize popover
- var popover = $popover(element, options);
- // Garbage collection
- scope.$on('$destroy', function () {
- popover.destroy();
- options = null;
- popover = null;
});
- }
- };
+ };
+ var _hide = $select.hide;
+ $select.hide = function () {
+ $select.$element.off(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);
+ if (options.keyboard) {
+ element.off('keydown', $select.$onKeyDown);
+ }
+ _hide();
+ };
+ return $select;
+ }
+ SelectFactory.defaults = defaults;
+ return SelectFactory;
}
- ]);
- // Source: src/scrollspy/scrollspy.js
- angular.module('mgcrea.ngStrap.scrollspy', [
- 'mgcrea.ngStrap.helpers.debounce',
- 'mgcrea.ngStrap.helpers.dimensions'
- ]).provider('$scrollspy', function () {
- // Pool of registered spies
- var spies = this.$$spies = {};
- var defaults = this.defaults = {
- debounce: 150,
- throttle: 100,
- offset: 100
- };
- this.$get = [
- '$window',
- '$document',
- '$rootScope',
- 'dimensions',
- 'debounce',
- 'throttle',
- function ($window, $document, $rootScope, dimensions, debounce, throttle) {
- var windowEl = angular.element($window);
- var docEl = angular.element($document.prop('documentElement'));
- var bodyEl = angular.element($window.document.body);
- // Helper functions
- function nodeName(element, name) {
- return element[0].nodeName && element[0].nodeName.toLowerCase() === name.toLowerCase();
+ ];
+}).directive('bsSelect', [
+ '$window',
+ '$parse',
+ '$q',
+ '$select',
+ '$parseOptions',
+ function ($window, $parse, $q, $select, $parseOptions) {
+ var defaults = $select.defaults;
+ return {
+ restrict: 'EAC',
+ require: 'ngModel',
+ link: function postLink(scope, element, attr, controller) {
+ // Directive options
+ var options = { scope: scope };
+ angular.forEach([
+ 'placement',
+ 'container',
+ 'delay',
+ 'trigger',
+ 'keyboard',
+ 'html',
+ 'animation',
+ 'template',
+ 'placeholder',
+ 'multiple',
+ 'maxLength',
+ 'maxLengthHtml'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Add support for select markup
+ if (element[0].nodeName.toLowerCase() === 'select') {
+ var inputEl = element;
+ inputEl.css('display', 'none');
+ element = angular.element(' ');
+ inputEl.after(element);
}
- function ScrollSpyFactory(config) {
- // Common vars
- var options = angular.extend({}, defaults, config);
- if (!options.element)
- options.element = bodyEl;
- var isWindowSpy = nodeName(options.element, 'body');
- var scrollEl = isWindowSpy ? windowEl : options.element;
- var scrollId = isWindowSpy ? 'window' : options.id;
- // Use existing spy
- if (spies[scrollId]) {
- spies[scrollId].$$count++;
- return spies[scrollId];
- }
- var $scrollspy = {};
- // Private vars
- var unbindViewContentLoaded, unbindIncludeContentLoaded;
- var trackedElements = $scrollspy.$trackedElements = [];
- var sortedElements = [];
- var activeTarget;
- var debouncedCheckPosition;
- var throttledCheckPosition;
- var debouncedCheckOffsets;
- var viewportHeight;
- var scrollTop;
- $scrollspy.init = function () {
- // Setup internal ref counter
- this.$$count = 1;
- // Bind events
- debouncedCheckPosition = debounce(this.checkPosition, options.debounce);
- throttledCheckPosition = throttle(this.checkPosition, options.throttle);
- scrollEl.on('click', this.checkPositionWithEventLoop);
- windowEl.on('resize', debouncedCheckPosition);
- scrollEl.on('scroll', throttledCheckPosition);
- debouncedCheckOffsets = debounce(this.checkOffsets, options.debounce);
- unbindViewContentLoaded = $rootScope.$on('$viewContentLoaded', debouncedCheckOffsets);
- unbindIncludeContentLoaded = $rootScope.$on('$includeContentLoaded', debouncedCheckOffsets);
- debouncedCheckOffsets();
- // Register spy for reuse
- if (scrollId) {
- spies[scrollId] = $scrollspy;
- }
- };
- $scrollspy.destroy = function () {
- // Check internal ref counter
- this.$$count--;
- if (this.$$count > 0) {
- return;
- }
- // Unbind events
- scrollEl.off('click', this.checkPositionWithEventLoop);
- windowEl.off('resize', debouncedCheckPosition);
- scrollEl.off('scroll', debouncedCheckPosition);
- unbindViewContentLoaded();
- unbindIncludeContentLoaded();
- };
- $scrollspy.checkPosition = function () {
- // Not ready yet
- if (!sortedElements.length)
- return;
- // Calculate the scroll position
- scrollTop = (isWindowSpy ? $window.pageYOffset : scrollEl.prop('scrollTop')) || 0;
- // Calculate the viewport height for use by the components
- viewportHeight = Math.max($window.innerHeight, docEl.prop('clientHeight'));
- // Activate first element if scroll is smaller
- if (scrollTop < sortedElements[0].offsetTop && activeTarget !== sortedElements[0].target) {
- return $scrollspy.$activateElement(sortedElements[0]);
- }
- // Activate proper element
- for (var i = sortedElements.length; i--;) {
- if (angular.isUndefined(sortedElements[i].offsetTop) || sortedElements[i].offsetTop === null)
- continue;
- if (activeTarget === sortedElements[i].target)
- continue;
- if (scrollTop < sortedElements[i].offsetTop)
- continue;
- if (sortedElements[i + 1] && scrollTop > sortedElements[i + 1].offsetTop)
- continue;
- return $scrollspy.$activateElement(sortedElements[i]);
- }
- };
- $scrollspy.checkPositionWithEventLoop = function () {
- setTimeout(this.checkPosition, 1);
- };
- // Protected methods
- $scrollspy.$activateElement = function (element) {
- if (activeTarget) {
- var activeElement = $scrollspy.$getTrackedElement(activeTarget);
- if (activeElement) {
- activeElement.source.removeClass('active');
- if (nodeName(activeElement.source, 'li') && nodeName(activeElement.source.parent().parent(), 'li')) {
- activeElement.source.parent().parent().removeClass('active');
- }
- }
- }
- activeTarget = element.target;
- element.source.addClass('active');
- if (nodeName(element.source, 'li') && nodeName(element.source.parent().parent(), 'li')) {
- element.source.parent().parent().addClass('active');
- }
- };
- $scrollspy.$getTrackedElement = function (target) {
- return trackedElements.filter(function (obj) {
- return obj.target === target;
- })[0];
- };
- // Track offsets behavior
- $scrollspy.checkOffsets = function () {
- angular.forEach(trackedElements, function (trackedElement) {
- var targetElement = document.querySelector(trackedElement.target);
- trackedElement.offsetTop = targetElement ? dimensions.offset(targetElement).top : null;
- if (options.offset && trackedElement.offsetTop !== null)
- trackedElement.offsetTop -= options.offset * 1;
- });
- sortedElements = trackedElements.filter(function (el) {
- return el.offsetTop !== null;
- }).sort(function (a, b) {
- return a.offsetTop - b.offsetTop;
- });
- debouncedCheckPosition();
- };
- $scrollspy.trackElement = function (target, source) {
- trackedElements.push({
- target: target,
- source: source
- });
- };
- $scrollspy.untrackElement = function (target, source) {
- var toDelete;
- for (var i = trackedElements.length; i--;) {
- if (trackedElements[i].target === target && trackedElements[i].source === source) {
- toDelete = i;
- break;
- }
+ // Build proper ngOptions
+ var parsedOptions = $parseOptions(attr.ngOptions);
+ // Initialize select
+ var select = $select(element, controller, options);
+ // Watch ngOptions values before filtering for changes
+ var watchedOptions = parsedOptions.$match[7].replace(/\|.+/, '').trim();
+ scope.$watch(watchedOptions, function (newValue, oldValue) {
+ // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);
+ parsedOptions.valuesFn(scope, controller).then(function (values) {
+ select.update(values);
+ controller.$render();
+ });
+ }, true);
+ // Watch model for changes
+ scope.$watch(attr.ngModel, function (newValue, oldValue) {
+ // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue);
+ select.$updateActiveIndex();
+ }, true);
+ // Model rendering in view
+ controller.$render = function () {
+ // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
+ var selected, index;
+ if (options.multiple && angular.isArray(controller.$modelValue)) {
+ selected = controller.$modelValue.map(function (value) {
+ index = select.$getIndex(value);
+ return angular.isDefined(index) ? select.$scope.$matches[index].label : false;
+ }).filter(angular.isDefined);
+ if (selected.length > (options.maxLength || defaults.maxLength)) {
+ selected = selected.length + ' ' + (options.maxLengthHtml || defaults.maxLengthHtml);
+ } else {
+ selected = selected.join(', ');
}
- trackedElements = trackedElements.splice(toDelete, 1);
- };
- $scrollspy.activate = function (i) {
- trackedElements[i].addClass('active');
- };
- // Initialize plugin
- $scrollspy.init();
- return $scrollspy;
- }
- return ScrollSpyFactory;
+ } else {
+ index = select.$getIndex(controller.$modelValue);
+ selected = angular.isDefined(index) ? select.$scope.$matches[index].label : false;
+ }
+ element.html((selected ? selected : attr.placeholder || defaults.placeholder) + defaults.caretHtml);
+ };
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ select.destroy();
+ options = null;
+ select = null;
+ });
}
- ];
- }).directive('bsScrollspy', [
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/scrollspy/scrollspy.js
+angular.module('mgcrea.ngStrap.scrollspy', [
+ 'mgcrea.ngStrap.helpers.debounce',
+ 'mgcrea.ngStrap.helpers.dimensions'
+]).provider('$scrollspy', function () {
+ // Pool of registered spies
+ var spies = this.$$spies = {};
+ var defaults = this.defaults = {
+ debounce: 150,
+ throttle: 100,
+ offset: 100
+ };
+ this.$get = [
+ '$window',
+ '$document',
'$rootScope',
- 'debounce',
'dimensions',
- '$scrollspy',
- function ($rootScope, debounce, dimensions, $scrollspy) {
- return {
- restrict: 'EAC',
- link: function postLink(scope, element, attr) {
- var options = { scope: scope };
- angular.forEach([
- 'offset',
- 'target'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- var scrollspy = $scrollspy(options);
- scrollspy.trackElement(options.target, element);
- scope.$on('$destroy', function () {
- scrollspy.untrackElement(options.target, element);
- scrollspy.destroy();
- options = null;
- scrollspy = null;
- });
- }
- };
- }
- ]).directive('bsScrollspyList', [
- '$rootScope',
'debounce',
- 'dimensions',
- '$scrollspy',
- function ($rootScope, debounce, dimensions, $scrollspy) {
- return {
- restrict: 'A',
- compile: function postLink(element, attr) {
- var children = element[0].querySelectorAll('li > a[href]');
- angular.forEach(children, function (child) {
- var childEl = angular.element(child);
- childEl.parent().attr('bs-scrollspy', '').attr('data-target', childEl.attr('href'));
- });
+ 'throttle',
+ function ($window, $document, $rootScope, dimensions, debounce, throttle) {
+ var windowEl = angular.element($window);
+ var docEl = angular.element($document.prop('documentElement'));
+ var bodyEl = angular.element($window.document.body);
+ // Helper functions
+ function nodeName(element, name) {
+ return element[0].nodeName && element[0].nodeName.toLowerCase() === name.toLowerCase();
+ }
+ function ScrollSpyFactory(config) {
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ if (!options.element)
+ options.element = bodyEl;
+ var isWindowSpy = nodeName(options.element, 'body');
+ var scrollEl = isWindowSpy ? windowEl : options.element;
+ var scrollId = isWindowSpy ? 'window' : options.id;
+ // Use existing spy
+ if (spies[scrollId]) {
+ spies[scrollId].$$count++;
+ return spies[scrollId];
}
- };
- }
- ]);
- // Source: src/select/select.js
- angular.module('mgcrea.ngStrap.select', [
- 'mgcrea.ngStrap.tooltip',
- 'mgcrea.ngStrap.helpers.parseOptions'
- ]).provider('$select', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- prefixClass: 'select',
- placement: 'bottom-left',
- template: 'select/select.tpl.html',
- trigger: 'focus',
- container: false,
- keyboard: true,
- html: false,
- delay: 0,
- multiple: false,
- sort: true,
- caretHtml: ' ',
- placeholder: 'Choose among the following...',
- maxLength: 3,
- maxLengthHtml: 'selected'
- };
- this.$get = [
- '$window',
- '$document',
- '$rootScope',
- '$tooltip',
- function ($window, $document, $rootScope, $tooltip) {
- var bodyEl = angular.element($window.document.body);
- var isTouch = 'createTouch' in $window.document;
- function SelectFactory(element, controller, config) {
- var $select = {};
- // Common vars
- var options = angular.extend({}, defaults, config);
- $select = $tooltip(element, options);
- var parentScope = config.scope;
- var scope = $select.$scope;
- scope.$matches = [];
- scope.$activeIndex = 0;
- scope.$isMultiple = options.multiple;
- scope.$activate = function (index) {
- scope.$$postDigest(function () {
- $select.activate(index);
- });
- };
- scope.$select = function (index, evt) {
- scope.$$postDigest(function () {
- $select.select(index);
- });
- };
- scope.$isVisible = function () {
- return $select.$isVisible();
- };
- scope.$isActive = function (index) {
- return $select.$isActive(index);
- };
- // Public methods
- $select.update = function (matches) {
- scope.$matches = matches;
- $select.$updateActiveIndex();
- };
- $select.activate = function (index) {
- if (options.multiple) {
- scope.$activeIndex.sort();
- $select.$isActive(index) ? scope.$activeIndex.splice(scope.$activeIndex.indexOf(index), 1) : scope.$activeIndex.push(index);
- if (options.sort)
- scope.$activeIndex.sort();
- } else {
- scope.$activeIndex = index;
- }
- return scope.$activeIndex;
- };
- $select.select = function (index) {
- var value = scope.$matches[index].value;
- $select.activate(index);
- if (options.multiple) {
- controller.$setViewValue(scope.$activeIndex.map(function (index) {
- return scope.$matches[index].value;
- }));
- } else {
- controller.$setViewValue(value);
- }
- controller.$render();
- if (parentScope)
- parentScope.$digest();
- // Hide if single select
- if (!options.multiple) {
- if (options.trigger === 'focus')
- element[0].blur();
- else if ($select.$isShown)
- $select.hide();
- }
- // Emit event
- scope.$emit('$select.select', value, index);
- };
- // Protected methods
- $select.$updateActiveIndex = function () {
- if (controller.$modelValue && scope.$matches.length) {
- if (options.multiple && angular.isArray(controller.$modelValue)) {
- scope.$activeIndex = controller.$modelValue.map(function (value) {
- return $select.$getIndex(value);
- });
- } else {
- scope.$activeIndex = $select.$getIndex(controller.$modelValue);
- }
- } else if (scope.$activeIndex >= scope.$matches.length) {
- scope.$activeIndex = options.multiple ? [] : 0;
- }
- };
- $select.$isVisible = function () {
- if (!options.minLength || !controller) {
- return scope.$matches.length;
- }
- // minLength support
- return scope.$matches.length && controller.$viewValue.length >= options.minLength;
- };
- $select.$isActive = function (index) {
- if (options.multiple) {
- return scope.$activeIndex.indexOf(index) !== -1;
- } else {
- return scope.$activeIndex === index;
- }
- };
- $select.$getIndex = function (value) {
- var l = scope.$matches.length, i = l;
- if (!l)
- return;
- for (i = l; i--;) {
- if (scope.$matches[i].value === value)
- break;
- }
- if (i < 0)
- return;
- return i;
- };
- $select.$onMouseDown = function (evt) {
- // Prevent blur on mousedown on .dropdown-menu
- evt.preventDefault();
- evt.stopPropagation();
- // Emulate click for mobile devices
- if (isTouch) {
- var targetEl = angular.element(evt.target);
- targetEl.triggerHandler('click');
- }
- };
- $select.$onKeyDown = function (evt) {
- if (!/(38|40|13)/.test(evt.keyCode))
- return;
- evt.preventDefault();
- evt.stopPropagation();
- // Select with enter
- if (evt.keyCode === 13) {
- return $select.select(scope.$activeIndex);
- }
- // Navigate with keyboard
- if (evt.keyCode === 38 && scope.$activeIndex > 0)
- scope.$activeIndex--;
- else if (evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1)
- scope.$activeIndex++;
- else if (angular.isUndefined(scope.$activeIndex))
- scope.$activeIndex = 0;
- scope.$digest();
- };
- // Overrides
- var _show = $select.show;
- $select.show = function () {
- _show();
- if (options.multiple) {
- $select.$element.addClass('select-multiple');
- }
- setTimeout(function () {
- $select.$element.on(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);
- if (options.keyboard) {
- element.on('keydown', $select.$onKeyDown);
+ var $scrollspy = {};
+ // Private vars
+ var unbindViewContentLoaded, unbindIncludeContentLoaded;
+ var trackedElements = $scrollspy.$trackedElements = [];
+ var sortedElements = [];
+ var activeTarget;
+ var debouncedCheckPosition;
+ var throttledCheckPosition;
+ var debouncedCheckOffsets;
+ var viewportHeight;
+ var scrollTop;
+ $scrollspy.init = function () {
+ // Setup internal ref counter
+ this.$$count = 1;
+ // Bind events
+ debouncedCheckPosition = debounce(this.checkPosition, options.debounce);
+ throttledCheckPosition = throttle(this.checkPosition, options.throttle);
+ scrollEl.on('click', this.checkPositionWithEventLoop);
+ windowEl.on('resize', debouncedCheckPosition);
+ scrollEl.on('scroll', throttledCheckPosition);
+ debouncedCheckOffsets = debounce(this.checkOffsets, options.debounce);
+ unbindViewContentLoaded = $rootScope.$on('$viewContentLoaded', debouncedCheckOffsets);
+ unbindIncludeContentLoaded = $rootScope.$on('$includeContentLoaded', debouncedCheckOffsets);
+ debouncedCheckOffsets();
+ // Register spy for reuse
+ if (scrollId) {
+ spies[scrollId] = $scrollspy;
+ }
+ };
+ $scrollspy.destroy = function () {
+ // Check internal ref counter
+ this.$$count--;
+ if (this.$$count > 0) {
+ return;
+ }
+ // Unbind events
+ scrollEl.off('click', this.checkPositionWithEventLoop);
+ windowEl.off('resize', debouncedCheckPosition);
+ scrollEl.off('scroll', debouncedCheckPosition);
+ unbindViewContentLoaded();
+ unbindIncludeContentLoaded();
+ if (scrollId) {
+ delete spies[scrollId];
+ }
+ };
+ $scrollspy.checkPosition = function () {
+ // Not ready yet
+ if (!sortedElements.length)
+ return;
+ // Calculate the scroll position
+ scrollTop = (isWindowSpy ? $window.pageYOffset : scrollEl.prop('scrollTop')) || 0;
+ // Calculate the viewport height for use by the components
+ viewportHeight = Math.max($window.innerHeight, docEl.prop('clientHeight'));
+ // Activate first element if scroll is smaller
+ if (scrollTop < sortedElements[0].offsetTop && activeTarget !== sortedElements[0].target) {
+ return $scrollspy.$activateElement(sortedElements[0]);
+ }
+ // Activate proper element
+ for (var i = sortedElements.length; i--;) {
+ if (angular.isUndefined(sortedElements[i].offsetTop) || sortedElements[i].offsetTop === null)
+ continue;
+ if (activeTarget === sortedElements[i].target)
+ continue;
+ if (scrollTop < sortedElements[i].offsetTop)
+ continue;
+ if (sortedElements[i + 1] && scrollTop > sortedElements[i + 1].offsetTop)
+ continue;
+ return $scrollspy.$activateElement(sortedElements[i]);
+ }
+ };
+ $scrollspy.checkPositionWithEventLoop = function () {
+ setTimeout(this.checkPosition, 1);
+ };
+ // Protected methods
+ $scrollspy.$activateElement = function (element) {
+ if (activeTarget) {
+ var activeElement = $scrollspy.$getTrackedElement(activeTarget);
+ if (activeElement) {
+ activeElement.source.removeClass('active');
+ if (nodeName(activeElement.source, 'li') && nodeName(activeElement.source.parent().parent(), 'li')) {
+ activeElement.source.parent().parent().removeClass('active');
}
- });
- };
- var _hide = $select.hide;
- $select.hide = function () {
- $select.$element.off(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);
- if (options.keyboard) {
- element.off('keydown', $select.$onKeyDown);
}
- _hide();
- };
- return $select;
- }
- SelectFactory.defaults = defaults;
- return SelectFactory;
- }
- ];
- }).directive('bsSelect', [
- '$window',
- '$parse',
- '$q',
- '$select',
- '$parseOptions',
- function ($window, $parse, $q, $select, $parseOptions) {
- var defaults = $select.defaults;
- return {
- restrict: 'EAC',
- require: 'ngModel',
- link: function postLink(scope, element, attr, controller) {
- // Directive options
- var options = { scope: scope };
- angular.forEach([
- 'placement',
- 'container',
- 'delay',
- 'trigger',
- 'keyboard',
- 'html',
- 'animation',
- 'template',
- 'placeholder',
- 'multiple',
- 'maxLength',
- 'maxLengthHtml'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
+ }
+ activeTarget = element.target;
+ element.source.addClass('active');
+ if (nodeName(element.source, 'li') && nodeName(element.source.parent().parent(), 'li')) {
+ element.source.parent().parent().addClass('active');
+ }
+ };
+ $scrollspy.$getTrackedElement = function (target) {
+ return trackedElements.filter(function (obj) {
+ return obj.target === target;
+ })[0];
+ };
+ // Track offsets behavior
+ $scrollspy.checkOffsets = function () {
+ angular.forEach(trackedElements, function (trackedElement) {
+ var targetElement = document.querySelector(trackedElement.target);
+ trackedElement.offsetTop = targetElement ? dimensions.offset(targetElement).top : null;
+ if (options.offset && trackedElement.offsetTop !== null)
+ trackedElement.offsetTop -= options.offset * 1;
});
- // Add support for select markup
- if (element[0].nodeName.toLowerCase() === 'select') {
- var inputEl = element;
- inputEl.css('display', 'none');
- element = angular.element(' ');
- inputEl.after(element);
- }
- // Build proper ngOptions
- var parsedOptions = $parseOptions(attr.ngOptions);
- // Initialize select
- var select = $select(element, controller, options);
- // Watch ngOptions values before filtering for changes
- var watchedOptions = parsedOptions.$match[7].replace(/\|.+/, '').trim();
- scope.$watch(watchedOptions, function (newValue, oldValue) {
- // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);
- parsedOptions.valuesFn(scope, controller).then(function (values) {
- select.update(values);
- controller.$render();
- });
- }, true);
- // Watch model for changes
- scope.$watch(attr.ngModel, function (newValue, oldValue) {
- // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue);
- select.$updateActiveIndex();
- }, true);
- // Model rendering in view
- controller.$render = function () {
- // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
- var selected, index;
- if (options.multiple && angular.isArray(controller.$modelValue)) {
- selected = controller.$modelValue.map(function (value) {
- index = select.$getIndex(value);
- return angular.isDefined(index) ? select.$scope.$matches[index].label : false;
- }).filter(angular.isDefined);
- if (selected.length > (options.maxLength || defaults.maxLength)) {
- selected = selected.length + ' ' + (options.maxLengthHtml || defaults.maxLengthHtml);
- } else {
- selected = selected.join(', ');
- }
- } else {
- index = select.$getIndex(controller.$modelValue);
- selected = angular.isDefined(index) ? select.$scope.$matches[index].label : false;
- }
- element.html((selected ? selected : attr.placeholder || defaults.placeholder) + defaults.caretHtml);
- };
- // Garbage collection
- scope.$on('$destroy', function () {
- select.destroy();
- options = null;
- select = null;
+ sortedElements = trackedElements.filter(function (el) {
+ return el.offsetTop !== null;
+ }).sort(function (a, b) {
+ return a.offsetTop - b.offsetTop;
});
- }
- };
- }
- ]);
- // Source: src/tab/tab.js
- angular.module('mgcrea.ngStrap.tab', []).run([
- '$templateCache',
- function ($templateCache) {
- $templateCache.put('$pane', '{{pane.content}}');
- }
- ]).provider('$tab', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- template: 'tab/tab.tpl.html'
- };
- this.$get = function () {
- return { defaults: defaults };
- };
- }).directive('bsTabs', [
- '$window',
- '$animate',
- '$tab',
- function ($window, $animate, $tab) {
- var defaults = $tab.defaults;
- return {
- restrict: 'EAC',
- scope: true,
- require: '?ngModel',
- templateUrl: function (element, attr) {
- return attr.template || defaults.template;
- },
- link: function postLink(scope, element, attr, controller) {
- // Directive options
- var options = defaults;
- angular.forEach(['animation'], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
+ debouncedCheckPosition();
+ };
+ $scrollspy.trackElement = function (target, source) {
+ trackedElements.push({
+ target: target,
+ source: source
});
- // Require scope as an object
- attr.bsTabs && scope.$watch(attr.bsTabs, function (newValue, oldValue) {
- scope.panes = newValue;
- }, true);
- // Add base class
- element.addClass('tabs');
- // Support animations
- if (options.animation) {
- element.addClass(options.animation);
- }
- scope.active = scope.activePane = 0;
- // view -> model
- scope.setActive = function (index, ev) {
- scope.active = index;
- if (controller) {
- controller.$setViewValue(index);
+ };
+ $scrollspy.untrackElement = function (target, source) {
+ var toDelete;
+ for (var i = trackedElements.length; i--;) {
+ if (trackedElements[i].target === target && trackedElements[i].source === source) {
+ toDelete = i;
+ break;
}
- };
- // model -> view
- if (controller) {
- controller.$render = function () {
- scope.active = controller.$modelValue * 1;
- };
}
- }
- };
+ trackedElements = trackedElements.splice(toDelete, 1);
+ };
+ $scrollspy.activate = function (i) {
+ trackedElements[i].addClass('active');
+ };
+ // Initialize plugin
+ $scrollspy.init();
+ return $scrollspy;
+ }
+ return ScrollSpyFactory;
}
- ]);
- // Source: src/timepicker/timepicker.js
- angular.module('mgcrea.ngStrap.timepicker', [
- 'mgcrea.ngStrap.helpers.dateParser',
- 'mgcrea.ngStrap.tooltip'
- ]).provider('$timepicker', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- prefixClass: 'timepicker',
- placement: 'bottom-left',
- template: 'timepicker/timepicker.tpl.html',
- trigger: 'focus',
- container: false,
- keyboard: true,
- html: false,
- delay: 0,
- useNative: true,
- timeType: 'date',
- timeFormat: 'shortTime',
- autoclose: false,
- minTime: -Infinity,
- maxTime: +Infinity,
- length: 5,
- hourStep: 1,
- minuteStep: 5
- };
- this.$get = [
- '$window',
- '$document',
- '$rootScope',
- '$sce',
- '$locale',
- 'dateFilter',
- '$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);
- if (!defaults.lang)
- defaults.lang = $locale.id;
- function timepickerFactory(element, controller, config) {
- var $timepicker = $tooltip(element, angular.extend({}, defaults, config));
- var parentScope = config.scope;
- var options = $timepicker.$options;
- var scope = $timepicker.$scope;
- // View vars
- var selectedIndex = 0;
- var startDate = controller.$dateValue || new Date();
- var viewDate = {
- hour: startDate.getHours(),
- meridian: startDate.getHours() < 12,
- minute: startDate.getMinutes(),
- second: startDate.getSeconds(),
- millisecond: startDate.getMilliseconds()
- };
- var format = $locale.DATETIME_FORMATS[options.timeFormat] || options.timeFormat;
- var formats = /(h+)[:]?(m+)[ ]?(a?)/i.exec(format).slice(1);
- // Scope methods
- scope.$select = function (date, index) {
- $timepicker.select(date, index);
- };
- scope.$moveIndex = function (value, index) {
- $timepicker.$moveIndex(value, index);
- };
- scope.$switchMeridian = function (date) {
- $timepicker.switchMeridian(date);
- };
- // Public methods
- $timepicker.update = function (date) {
- // console.warn('$timepicker.update() newValue=%o', date);
- if (angular.isDate(date) && !isNaN(date.getTime())) {
- $timepicker.$date = date;
- angular.extend(viewDate, {
- hour: date.getHours(),
- minute: date.getMinutes(),
- second: date.getSeconds(),
- millisecond: date.getMilliseconds()
- });
- $timepicker.$build();
- } else if (!$timepicker.$isBuilt) {
- $timepicker.$build();
- }
- };
- $timepicker.select = function (date, index, keep) {
- // console.warn('$timepicker.select', date, scope.$mode);
- if (isNaN(controller.$dateValue.getTime()))
- controller.$dateValue = new Date(1970, 0, 1);
- if (!angular.isDate(date))
- date = new Date(date);
- if (index === 0)
- controller.$dateValue.setHours(date.getHours());
- else if (index === 1)
- controller.$dateValue.setMinutes(date.getMinutes());
- controller.$setViewValue(controller.$dateValue);
- controller.$render();
- if (options.autoclose && !keep) {
- $timepicker.hide(true);
- }
- };
- $timepicker.switchMeridian = function (date) {
- var hours = (date || controller.$dateValue).getHours();
- controller.$dateValue.setHours(hours < 12 ? hours + 12 : hours - 12);
- controller.$render();
- };
- // Protected methods
- $timepicker.$build = function () {
- // console.warn('$timepicker.$build() viewDate=%o', viewDate);
- var i, midIndex = scope.midIndex = parseInt(options.length / 2, 10);
- var hours = [], hour;
- for (i = 0; i < options.length; i++) {
- hour = new Date(1970, 0, 1, viewDate.hour - (midIndex - i) * options.hourStep);
- hours.push({
- date: hour,
- label: dateFilter(hour, formats[0]),
- selected: $timepicker.$date && $timepicker.$isSelected(hour, 0),
- disabled: $timepicker.$isDisabled(hour, 0)
- });
- }
- var minutes = [], minute;
- for (i = 0; i < options.length; i++) {
- minute = new Date(1970, 0, 1, 0, viewDate.minute - (midIndex - i) * options.minuteStep);
- minutes.push({
- date: minute,
- label: dateFilter(minute, formats[1]),
- selected: $timepicker.$date && $timepicker.$isSelected(minute, 1),
- disabled: $timepicker.$isDisabled(minute, 1)
- });
- }
- var rows = [];
- for (i = 0; i < options.length; i++) {
- rows.push([
- hours[i],
- minutes[i]
- ]);
- }
- scope.rows = rows;
- scope.showAM = !!formats[2];
- scope.isAM = ($timepicker.$date || hours[midIndex].date).getHours() < 12;
- $timepicker.$isBuilt = true;
- };
- $timepicker.$isSelected = function (date, index) {
- if (!$timepicker.$date)
- return false;
- else if (index === 0) {
- return date.getHours() === $timepicker.$date.getHours();
- } else if (index === 1) {
- return date.getMinutes() === $timepicker.$date.getMinutes();
- }
- };
- $timepicker.$isDisabled = function (date, index) {
- var selectedTime;
- if (index === 0) {
- selectedTime = date.getTime() + viewDate.minute * 60000;
- } else if (index === 1) {
- selectedTime = date.getTime() + viewDate.hour * 3600000;
- }
- return selectedTime < options.minTime || selectedTime > options.maxTime;
+ ];
+}).directive('bsScrollspy', [
+ '$rootScope',
+ 'debounce',
+ 'dimensions',
+ '$scrollspy',
+ function ($rootScope, debounce, dimensions, $scrollspy) {
+ return {
+ restrict: 'EAC',
+ link: function postLink(scope, element, attr) {
+ var options = { scope: scope };
+ angular.forEach([
+ 'offset',
+ 'target'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ var scrollspy = $scrollspy(options);
+ scrollspy.trackElement(options.target, element);
+ scope.$on('$destroy', function () {
+ scrollspy.untrackElement(options.target, element);
+ scrollspy.destroy();
+ options = null;
+ scrollspy = null;
+ });
+ }
+ };
+ }
+]).directive('bsScrollspyList', [
+ '$rootScope',
+ 'debounce',
+ 'dimensions',
+ '$scrollspy',
+ function ($rootScope, debounce, dimensions, $scrollspy) {
+ return {
+ restrict: 'A',
+ compile: function postLink(element, attr) {
+ var children = element[0].querySelectorAll('li > a[href]');
+ angular.forEach(children, function (child) {
+ var childEl = angular.element(child);
+ childEl.parent().attr('bs-scrollspy', '').attr('data-target', childEl.attr('href'));
+ });
+ }
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/tab/tab.js
+angular.module('mgcrea.ngStrap.tab', []).run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('$pane', '{{pane.content}}');
+ }
+]).provider('$tab', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ template: 'tab/tab.tpl.html'
+ };
+ this.$get = function () {
+ return { defaults: defaults };
+ };
+}).directive('bsTabs', [
+ '$window',
+ '$animate',
+ '$tab',
+ function ($window, $animate, $tab) {
+ var defaults = $tab.defaults;
+ return {
+ restrict: 'EAC',
+ scope: true,
+ require: '?ngModel',
+ templateUrl: function (element, attr) {
+ return attr.template || defaults.template;
+ },
+ link: function postLink(scope, element, attr, controller) {
+ // Directive options
+ var options = defaults;
+ angular.forEach(['animation'], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Require scope as an object
+ attr.bsTabs && scope.$watch(attr.bsTabs, function (newValue, oldValue) {
+ scope.panes = newValue;
+ }, true);
+ // Add base class
+ element.addClass('tabs');
+ // Support animations
+ if (options.animation) {
+ element.addClass(options.animation);
+ }
+ scope.active = scope.activePane = 0;
+ // view -> model
+ scope.setActive = function (index, ev) {
+ scope.active = index;
+ if (controller) {
+ controller.$setViewValue(index);
+ }
+ };
+ // model -> view
+ if (controller) {
+ controller.$render = function () {
+ scope.active = controller.$modelValue * 1;
};
- $timepicker.$moveIndex = function (value, index) {
- var targetDate;
- if (index === 0) {
- targetDate = new Date(1970, 0, 1, viewDate.hour + value * options.length, viewDate.minute);
- angular.extend(viewDate, { hour: targetDate.getHours() });
- } else if (index === 1) {
- targetDate = new Date(1970, 0, 1, viewDate.hour, viewDate.minute + value * options.length * 5);
- angular.extend(viewDate, { minute: targetDate.getMinutes() });
- }
+ }
+ }
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/timepicker/timepicker.js
+angular.module('mgcrea.ngStrap.timepicker', [
+ 'mgcrea.ngStrap.helpers.dateParser',
+ 'mgcrea.ngStrap.tooltip'
+]).provider('$timepicker', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ prefixClass: 'timepicker',
+ placement: 'bottom-left',
+ template: 'timepicker/timepicker.tpl.html',
+ trigger: 'focus',
+ container: false,
+ keyboard: true,
+ html: false,
+ delay: 0,
+ useNative: true,
+ timeType: 'date',
+ timeFormat: 'shortTime',
+ autoclose: false,
+ minTime: -Infinity,
+ maxTime: +Infinity,
+ length: 5,
+ hourStep: 1,
+ minuteStep: 5
+ };
+ this.$get = [
+ '$window',
+ '$document',
+ '$rootScope',
+ '$sce',
+ '$locale',
+ 'dateFilter',
+ '$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);
+ if (!defaults.lang)
+ defaults.lang = $locale.id;
+ function timepickerFactory(element, controller, config) {
+ var $timepicker = $tooltip(element, angular.extend({}, defaults, config));
+ var parentScope = config.scope;
+ var options = $timepicker.$options;
+ var scope = $timepicker.$scope;
+ // View vars
+ var selectedIndex = 0;
+ var startDate = controller.$dateValue || new Date();
+ var viewDate = {
+ hour: startDate.getHours(),
+ meridian: startDate.getHours() < 12,
+ minute: startDate.getMinutes(),
+ second: startDate.getSeconds(),
+ millisecond: startDate.getMilliseconds()
+ };
+ var format = $locale.DATETIME_FORMATS[options.timeFormat] || options.timeFormat;
+ var formats = /(h+)[:]?(m+)[ ]?(a?)/i.exec(format).slice(1);
+ // Scope methods
+ scope.$select = function (date, index) {
+ $timepicker.select(date, index);
+ };
+ scope.$moveIndex = function (value, index) {
+ $timepicker.$moveIndex(value, index);
+ };
+ scope.$switchMeridian = function (date) {
+ $timepicker.switchMeridian(date);
+ };
+ // Public methods
+ $timepicker.update = function (date) {
+ // console.warn('$timepicker.update() newValue=%o', date);
+ if (angular.isDate(date) && !isNaN(date.getTime())) {
+ $timepicker.$date = date;
+ angular.extend(viewDate, {
+ hour: date.getHours(),
+ minute: date.getMinutes(),
+ second: date.getSeconds(),
+ millisecond: date.getMilliseconds()
+ });
+ $timepicker.$build();
+ } else if (!$timepicker.$isBuilt) {
$timepicker.$build();
- };
- $timepicker.$onMouseDown = function (evt) {
- // Prevent blur on mousedown on .dropdown-menu
- if (evt.target.nodeName.toLowerCase() !== 'input')
- evt.preventDefault();
- evt.stopPropagation();
- // Emulate click for mobile devices
- if (isTouch) {
- var targetEl = angular.element(evt.target);
- if (targetEl[0].nodeName.toLowerCase() !== 'button') {
- targetEl = targetEl.parent();
- }
- targetEl.triggerHandler('click');
- }
- };
- $timepicker.$onKeyDown = function (evt) {
- if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey)
- return;
- evt.preventDefault();
- evt.stopPropagation();
- // Close on enter
- if (evt.keyCode === 13)
- return $timepicker.hide(true);
- // Navigate with keyboard
- var newDate = new Date($timepicker.$date);
- var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;
- var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;
- var lateralMove = /(37|39)/.test(evt.keyCode);
- var count = 2 + !!formats[2] * 1;
- // Navigate indexes (left, right)
- if (lateralMove) {
- if (evt.keyCode === 37)
- selectedIndex = selectedIndex < 1 ? count - 1 : selectedIndex - 1;
- else if (evt.keyCode === 39)
- selectedIndex = selectedIndex < count - 1 ? selectedIndex + 1 : 0;
- }
- // Update values (up, down)
- if (selectedIndex === 0) {
- if (lateralMove)
- return createSelection(0, hoursLength);
- if (evt.keyCode === 38)
- newDate.setHours(hours - options.hourStep);
- else if (evt.keyCode === 40)
- newDate.setHours(hours + options.hourStep);
- } else if (selectedIndex === 1) {
- if (lateralMove)
- return createSelection(hoursLength + 1, hoursLength + 1 + minutesLength);
- if (evt.keyCode === 38)
- newDate.setMinutes(minutes - options.minuteStep);
- else if (evt.keyCode === 40)
- newDate.setMinutes(minutes + options.minuteStep);
- } else if (selectedIndex === 2) {
- if (lateralMove)
- return createSelection(hoursLength + 1 + minutesLength + 1, hoursLength + 1 + minutesLength + 3);
- $timepicker.switchMeridian();
- }
- $timepicker.select(newDate, selectedIndex, true);
- parentScope.$digest();
- };
- // Private
- function createSelection(start, end) {
- if (element[0].createTextRange) {
- var selRange = element[0].createTextRange();
- selRange.collapse(true);
- selRange.moveStart('character', start);
- selRange.moveEnd('character', end);
- selRange.select();
- } else if (element[0].setSelectionRange) {
- element[0].setSelectionRange(start, end);
- } else if (angular.isUndefined(element[0].selectionStart)) {
- element[0].selectionStart = start;
- element[0].selectionEnd = end;
- }
}
- function focusElement() {
- element[0].focus();
- }
- // Overrides
- var _init = $timepicker.init;
- $timepicker.init = function () {
- if (isNative && options.useNative) {
- element.prop('type', 'time');
- element.css('-webkit-appearance', 'textfield');
- return;
- } else if (isTouch) {
- element.prop('type', 'text');
- element.attr('readonly', 'true');
- element.on('click', focusElement);
- }
- _init();
- };
- var _destroy = $timepicker.destroy;
- $timepicker.destroy = function () {
- if (isNative && options.useNative) {
- element.off('click', focusElement);
- }
- _destroy();
- };
- var _show = $timepicker.show;
- $timepicker.show = function () {
- _show();
- setTimeout(function () {
- $timepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);
- if (options.keyboard) {
- element.on('keydown', $timepicker.$onKeyDown);
- }
+ };
+ $timepicker.select = function (date, index, keep) {
+ // console.warn('$timepicker.select', date, scope.$mode);
+ if (!controller.$dateValue || isNaN(controller.$dateValue.getTime()))
+ controller.$dateValue = new Date(1970, 0, 1);
+ if (!angular.isDate(date))
+ date = new Date(date);
+ if (index === 0)
+ controller.$dateValue.setHours(date.getHours());
+ else if (index === 1)
+ controller.$dateValue.setMinutes(date.getMinutes());
+ controller.$setViewValue(controller.$dateValue);
+ controller.$render();
+ if (options.autoclose && !keep) {
+ $timepicker.hide(true);
+ }
+ };
+ $timepicker.switchMeridian = function (date) {
+ var hours = (date || controller.$dateValue).getHours();
+ controller.$dateValue.setHours(hours < 12 ? hours + 12 : hours - 12);
+ controller.$render();
+ };
+ // Protected methods
+ $timepicker.$build = function () {
+ // console.warn('$timepicker.$build() viewDate=%o', viewDate);
+ var i, midIndex = scope.midIndex = parseInt(options.length / 2, 10);
+ var hours = [], hour;
+ for (i = 0; i < options.length; i++) {
+ hour = new Date(1970, 0, 1, viewDate.hour - (midIndex - i) * options.hourStep);
+ hours.push({
+ date: hour,
+ label: dateFilter(hour, formats[0]),
+ selected: $timepicker.$date && $timepicker.$isSelected(hour, 0),
+ disabled: $timepicker.$isDisabled(hour, 0)
});
- };
- var _hide = $timepicker.hide;
- $timepicker.hide = function (blur) {
- $timepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);
+ }
+ var minutes = [], minute;
+ for (i = 0; i < options.length; i++) {
+ minute = new Date(1970, 0, 1, 0, viewDate.minute - (midIndex - i) * options.minuteStep);
+ minutes.push({
+ date: minute,
+ label: dateFilter(minute, formats[1]),
+ selected: $timepicker.$date && $timepicker.$isSelected(minute, 1),
+ disabled: $timepicker.$isDisabled(minute, 1)
+ });
+ }
+ var rows = [];
+ for (i = 0; i < options.length; i++) {
+ rows.push([
+ hours[i],
+ minutes[i]
+ ]);
+ }
+ scope.rows = rows;
+ scope.showAM = !!formats[2];
+ scope.isAM = ($timepicker.$date || hours[midIndex].date).getHours() < 12;
+ $timepicker.$isBuilt = true;
+ };
+ $timepicker.$isSelected = function (date, index) {
+ if (!$timepicker.$date)
+ return false;
+ else if (index === 0) {
+ return date.getHours() === $timepicker.$date.getHours();
+ } else if (index === 1) {
+ return date.getMinutes() === $timepicker.$date.getMinutes();
+ }
+ };
+ $timepicker.$isDisabled = function (date, index) {
+ var selectedTime;
+ if (index === 0) {
+ selectedTime = date.getTime() + viewDate.minute * 60000;
+ } else if (index === 1) {
+ selectedTime = date.getTime() + viewDate.hour * 3600000;
+ }
+ return selectedTime < options.minTime || selectedTime > options.maxTime;
+ };
+ $timepicker.$moveIndex = function (value, index) {
+ var targetDate;
+ if (index === 0) {
+ targetDate = new Date(1970, 0, 1, viewDate.hour + value * options.length, viewDate.minute);
+ angular.extend(viewDate, { hour: targetDate.getHours() });
+ } else if (index === 1) {
+ targetDate = new Date(1970, 0, 1, viewDate.hour, viewDate.minute + value * options.length * options.minuteStep);
+ angular.extend(viewDate, { minute: targetDate.getMinutes() });
+ }
+ $timepicker.$build();
+ };
+ $timepicker.$onMouseDown = function (evt) {
+ // Prevent blur on mousedown on .dropdown-menu
+ if (evt.target.nodeName.toLowerCase() !== 'input')
+ evt.preventDefault();
+ evt.stopPropagation();
+ // Emulate click for mobile devices
+ if (isTouch) {
+ var targetEl = angular.element(evt.target);
+ if (targetEl[0].nodeName.toLowerCase() !== 'button') {
+ targetEl = targetEl.parent();
+ }
+ targetEl.triggerHandler('click');
+ }
+ };
+ $timepicker.$onKeyDown = function (evt) {
+ if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey)
+ return;
+ evt.preventDefault();
+ evt.stopPropagation();
+ // Close on enter
+ if (evt.keyCode === 13)
+ return $timepicker.hide(true);
+ // Navigate with keyboard
+ var newDate = new Date($timepicker.$date);
+ var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;
+ var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;
+ var lateralMove = /(37|39)/.test(evt.keyCode);
+ var count = 2 + !!formats[2] * 1;
+ // Navigate indexes (left, right)
+ if (lateralMove) {
+ if (evt.keyCode === 37)
+ selectedIndex = selectedIndex < 1 ? count - 1 : selectedIndex - 1;
+ else if (evt.keyCode === 39)
+ selectedIndex = selectedIndex < count - 1 ? selectedIndex + 1 : 0;
+ }
+ // Update values (up, down)
+ if (selectedIndex === 0) {
+ if (lateralMove)
+ return createSelection(0, hoursLength);
+ if (evt.keyCode === 38)
+ newDate.setHours(hours - options.hourStep);
+ else if (evt.keyCode === 40)
+ newDate.setHours(hours + options.hourStep);
+ } else if (selectedIndex === 1) {
+ if (lateralMove)
+ return createSelection(hoursLength + 1, hoursLength + 1 + minutesLength);
+ if (evt.keyCode === 38)
+ newDate.setMinutes(minutes - options.minuteStep);
+ else if (evt.keyCode === 40)
+ newDate.setMinutes(minutes + options.minuteStep);
+ } else if (selectedIndex === 2) {
+ if (lateralMove)
+ return createSelection(hoursLength + 1 + minutesLength + 1, hoursLength + 1 + minutesLength + 3);
+ $timepicker.switchMeridian();
+ }
+ $timepicker.select(newDate, selectedIndex, true);
+ parentScope.$digest();
+ };
+ // Private
+ function createSelection(start, end) {
+ if (element[0].createTextRange) {
+ var selRange = element[0].createTextRange();
+ selRange.collapse(true);
+ selRange.moveStart('character', start);
+ selRange.moveEnd('character', end);
+ selRange.select();
+ } else if (element[0].setSelectionRange) {
+ element[0].setSelectionRange(start, end);
+ } else if (angular.isUndefined(element[0].selectionStart)) {
+ element[0].selectionStart = start;
+ element[0].selectionEnd = end;
+ }
+ }
+ function focusElement() {
+ element[0].focus();
+ }
+ // Overrides
+ var _init = $timepicker.init;
+ $timepicker.init = function () {
+ if (isNative && options.useNative) {
+ element.prop('type', 'time');
+ element.css('-webkit-appearance', 'textfield');
+ return;
+ } else if (isTouch) {
+ element.prop('type', 'text');
+ element.attr('readonly', 'true');
+ element.on('click', focusElement);
+ }
+ _init();
+ };
+ var _destroy = $timepicker.destroy;
+ $timepicker.destroy = function () {
+ if (isNative && options.useNative) {
+ element.off('click', focusElement);
+ }
+ _destroy();
+ };
+ var _show = $timepicker.show;
+ $timepicker.show = function () {
+ _show();
+ setTimeout(function () {
+ $timepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);
if (options.keyboard) {
- element.off('keydown', $timepicker.$onKeyDown);
+ element.on('keydown', $timepicker.$onKeyDown);
}
- _hide(blur);
- };
- return $timepicker;
- }
- timepickerFactory.defaults = defaults;
- return timepickerFactory;
+ });
+ };
+ var _hide = $timepicker.hide;
+ $timepicker.hide = function (blur) {
+ $timepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);
+ if (options.keyboard) {
+ element.off('keydown', $timepicker.$onKeyDown);
+ }
+ _hide(blur);
+ };
+ return $timepicker;
+ }
+ timepickerFactory.defaults = defaults;
+ return timepickerFactory;
+ }
+ ];
+}).directive('bsTimepicker', [
+ '$window',
+ '$parse',
+ '$q',
+ '$locale',
+ 'dateFilter',
+ '$timepicker',
+ '$dateParser',
+ '$timeout',
+ function ($window, $parse, $q, $locale, dateFilter, $timepicker, $dateParser, $timeout) {
+ var defaults = $timepicker.defaults;
+ var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
+ var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
+ return {
+ restrict: 'EAC',
+ require: 'ngModel',
+ link: function postLink(scope, element, attr, controller) {
+ // Directive options
+ var options = {
+ scope: scope,
+ controller: controller
+ };
+ angular.forEach([
+ 'placement',
+ 'container',
+ 'delay',
+ 'trigger',
+ 'keyboard',
+ 'html',
+ 'animation',
+ 'template',
+ 'autoclose',
+ 'timeType',
+ 'timeFormat',
+ 'useNative',
+ 'hourStep',
+ 'minuteStep'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Initialize timepicker
+ if (isNative && (options.useNative || defaults.useNative))
+ options.timeFormat = 'HH:mm';
+ var timepicker = $timepicker(element, controller, options);
+ options = timepicker.$options;
+ // Initialize parser
+ var dateParser = $dateParser({
+ format: options.timeFormat,
+ lang: options.lang
+ });
+ // Observe attributes for changes
+ angular.forEach([
+ 'minTime',
+ 'maxTime'
+ ], function (key) {
+ // console.warn('attr.$observe(%s)', key, attr[key]);
+ angular.isDefined(attr[key]) && attr.$observe(key, function (newValue) {
+ if (newValue === 'now') {
+ timepicker.$options[key] = new Date().setFullYear(1970, 0, 1);
+ } else if (angular.isString(newValue) && newValue.match(/^".+"$/)) {
+ timepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));
+ } else {
+ timepicker.$options[key] = dateParser.parse(newValue);
+ }
+ !isNaN(timepicker.$options[key]) && timepicker.$build();
+ });
+ });
+ // Watch model for changes
+ scope.$watch(attr.ngModel, function (newValue, oldValue) {
+ // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue, controller.$dateValue);
+ timepicker.update(controller.$dateValue);
+ }, true);
+ // viewValue -> $parsers -> modelValue
+ controller.$parsers.unshift(function (viewValue) {
+ // console.warn('$parser("%s"): viewValue=%o', element.attr('ng-model'), viewValue);
+ // Null values should correctly reset the model value & validity
+ if (!viewValue) {
+ controller.$setValidity('date', true);
+ return;
+ }
+ var parsedTime = dateParser.parse(viewValue, controller.$dateValue);
+ if (!parsedTime || isNaN(parsedTime.getTime())) {
+ controller.$setValidity('date', false);
+ } else {
+ var isValid = parsedTime.getTime() >= options.minTime && parsedTime.getTime() <= options.maxTime;
+ controller.$setValidity('date', isValid);
+ // Only update the model when we have a valid date
+ if (isValid)
+ controller.$dateValue = parsedTime;
+ }
+ if (options.timeType === 'string') {
+ return dateFilter(viewValue, options.timeFormat);
+ } else if (options.timeType === 'number') {
+ return controller.$dateValue.getTime();
+ } else if (options.timeType === 'iso') {
+ return controller.$dateValue.toISOString();
+ } else {
+ return new Date(controller.$dateValue);
+ }
+ });
+ // modelValue -> $formatters -> viewValue
+ controller.$formatters.push(function (modelValue) {
+ // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
+ var date;
+ if (angular.isUndefined(modelValue) || modelValue === null) {
+ date = NaN;
+ } else if (angular.isDate(modelValue)) {
+ date = modelValue;
+ } else if (options.timeType === 'string') {
+ date = dateParser.parse(modelValue);
+ } else {
+ date = new Date(modelValue);
+ }
+ // Setup default value?
+ // if(isNaN(date.getTime())) date = new Date(new Date().setMinutes(0) + 36e5);
+ controller.$dateValue = date;
+ return controller.$dateValue;
+ });
+ // viewValue -> element
+ controller.$render = function () {
+ // console.warn('$render("%s"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);
+ element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.timeFormat));
+ };
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ timepicker.destroy();
+ options = null;
+ timepicker = null;
+ });
}
- ];
- }).directive('bsTimepicker', [
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/tooltip/tooltip.js
+angular.module('mgcrea.ngStrap.tooltip', [
+ 'ngAnimate',
+ 'mgcrea.ngStrap.helpers.dimensions'
+]).provider('$tooltip', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ prefixClass: 'tooltip',
+ prefixEvent: 'tooltip',
+ container: false,
+ placement: 'top',
+ template: 'tooltip/tooltip.tpl.html',
+ contentTemplate: false,
+ trigger: 'hover focus',
+ keyboard: false,
+ html: false,
+ show: false,
+ title: '',
+ type: '',
+ delay: 0
+ };
+ this.$get = [
'$window',
- '$parse',
+ '$rootScope',
+ '$compile',
'$q',
- '$locale',
- 'dateFilter',
- '$timepicker',
- '$dateParser',
+ '$templateCache',
+ '$http',
+ '$animate',
'$timeout',
- function ($window, $parse, $q, $locale, dateFilter, $timepicker, $dateParser, $timeout) {
- var defaults = $timepicker.defaults;
- var isNative = /(ip(a|o)d|iphone|android)/gi.test($window.navigator.userAgent);
- var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
- return {
- restrict: 'EAC',
- require: 'ngModel',
- link: function postLink(scope, element, attr, controller) {
- // Directive options
- var options = {
- scope: scope,
- controller: controller
- };
- angular.forEach([
- 'placement',
- 'container',
- 'delay',
- 'trigger',
- 'keyboard',
- 'html',
- 'animation',
- 'template',
- 'autoclose',
- 'timeType',
- 'timeFormat',
- 'useNative',
- 'lang'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- // Initialize timepicker
- if (isNative && (options.useNative || defaults.useNative))
- options.timeFormat = 'HH:mm';
- var timepicker = $timepicker(element, controller, options);
- options = timepicker.$options;
- // Initialize parser
- var dateParser = $dateParser({
- format: options.timeFormat,
- lang: options.lang
- });
- // Observe attributes for changes
- angular.forEach([
- 'minTime',
- 'maxTime'
- ], function (key) {
- // console.warn('attr.$observe(%s)', key, attr[key]);
- angular.isDefined(attr[key]) && attr.$observe(key, function (newValue) {
- if (newValue === 'now') {
- timepicker.$options[key] = new Date().setFullYear(1970, 0, 1);
- } else if (angular.isString(newValue) && newValue.match(/^".+"$/)) {
- timepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));
- } else {
- timepicker.$options[key] = dateParser.parse(newValue);
- }
- !isNaN(timepicker.$options[key]) && timepicker.$build();
- });
+ 'dimensions',
+ '$$rAF',
+ function ($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, dimensions, $$rAF) {
+ var trim = String.prototype.trim;
+ var isTouch = 'createTouch' in $window.document;
+ var htmlReplaceRegExp = /ng-bind="/gi;
+ function TooltipFactory(element, config) {
+ var $tooltip = {};
+ // Common vars
+ var options = $tooltip.$options = angular.extend({}, defaults, config);
+ $tooltip.$promise = fetchTemplate(options.template);
+ var scope = $tooltip.$scope = options.scope && options.scope.$new() || $rootScope.$new();
+ if (options.delay && angular.isString(options.delay)) {
+ options.delay = parseFloat(options.delay);
+ }
+ // Support scope as string options
+ if (options.title) {
+ $tooltip.$scope.title = options.title;
+ }
+ // Provide scope helpers
+ scope.$hide = function () {
+ scope.$$postDigest(function () {
+ $tooltip.hide();
});
- // Watch model for changes
- scope.$watch(attr.ngModel, function (newValue, oldValue) {
- // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue, controller.$dateValue);
- timepicker.update(controller.$dateValue);
- }, true);
- // viewValue -> $parsers -> modelValue
- controller.$parsers.unshift(function (viewValue) {
- // console.warn('$parser("%s"): viewValue=%o', element.attr('ng-model'), viewValue);
- // Null values should correctly reset the model value & validity
- if (!viewValue) {
- controller.$setValidity('date', true);
- return;
- }
- var parsedTime = dateParser.parse(viewValue, controller.$dateValue);
- if (!parsedTime || isNaN(parsedTime.getTime())) {
- controller.$setValidity('date', false);
- } else {
- var isValid = parsedTime.getTime() >= options.minTime && parsedTime.getTime() <= options.maxTime;
- controller.$setValidity('date', isValid);
- // Only update the model when we have a valid date
- if (isValid)
- controller.$dateValue = parsedTime;
- }
- if (options.timeType === 'string') {
- return dateFilter(viewValue, options.timeFormat);
- } else if (options.timeType === 'number') {
- return controller.$dateValue.getTime();
- } else if (options.timeType === 'iso') {
- return controller.$dateValue.toISOString();
- } else {
- return controller.$dateValue;
- }
+ };
+ scope.$show = function () {
+ scope.$$postDigest(function () {
+ $tooltip.show();
});
- // modelValue -> $formatters -> viewValue
- controller.$formatters.push(function (modelValue) {
- // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
- var date = options.timeType === 'string' ? dateParser.parse(modelValue, controller.$dateValue) : new Date(modelValue);
- // Setup default value: next hour?
- // if(isNaN(date.getTime())) date = new Date(new Date().setMinutes(0) + 36e5);
- controller.$dateValue = date;
- return controller.$dateValue;
+ };
+ scope.$toggle = function () {
+ scope.$$postDigest(function () {
+ $tooltip.toggle();
});
- // viewValue -> element
- controller.$render = function () {
- // console.warn('$render("%s"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);
- element.val(isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.timeFormat));
- };
- // Garbage collection
- scope.$on('$destroy', function () {
- timepicker.destroy();
- options = null;
- timepicker = null;
+ };
+ $tooltip.$isShown = scope.$isShown = false;
+ // Private vars
+ var timeout, hoverState;
+ // Support contentTemplate option
+ if (options.contentTemplate) {
+ $tooltip.$promise = $tooltip.$promise.then(function (template) {
+ var templateEl = angular.element(template);
+ return fetchTemplate(options.contentTemplate).then(function (contentTemplate) {
+ var contentEl = findElement('[ng-bind="content"]', templateEl[0]);
+ if (!contentEl.length)
+ contentEl = findElement('[ng-bind="title"]', templateEl[0]);
+ contentEl.removeAttr('ng-bind').html(contentTemplate);
+ return templateEl[0].outerHTML;
+ });
});
}
- };
- }
- ]);
- // Source: src/tooltip/tooltip.js
- angular.module('mgcrea.ngStrap.tooltip', [
- 'ngAnimate',
- 'mgcrea.ngStrap.helpers.dimensions'
- ]).provider('$tooltip', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- prefixClass: 'tooltip',
- container: false,
- placement: 'top',
- template: 'tooltip/tooltip.tpl.html',
- contentTemplate: false,
- trigger: 'hover focus',
- keyboard: false,
- html: false,
- show: false,
- title: '',
- type: '',
- delay: 0
- };
- this.$get = [
- '$window',
- '$rootScope',
- '$compile',
- '$q',
- '$templateCache',
- '$http',
- '$animate',
- '$timeout',
- 'dimensions',
- '$$animateReflow',
- function ($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, dimensions, $$animateReflow) {
- var trim = String.prototype.trim;
- var isTouch = 'createTouch' in $window.document;
- var htmlReplaceRegExp = /ng-bind="/gi;
- function TooltipFactory(element, config) {
- var $tooltip = {};
- // Common vars
- var options = $tooltip.$options = angular.extend({}, defaults, config);
- $tooltip.$promise = fetchTemplate(options.template);
- var scope = $tooltip.$scope = options.scope && options.scope.$new() || $rootScope.$new();
- if (options.delay && angular.isString(options.delay)) {
- options.delay = parseFloat(options.delay);
- }
- // Support scope as string options
- if (options.title) {
- $tooltip.$scope.title = options.title;
- }
- // Provide scope helpers
- scope.$hide = function () {
- scope.$$postDigest(function () {
- $tooltip.hide();
- });
- };
- scope.$show = function () {
- scope.$$postDigest(function () {
- $tooltip.show();
- });
- };
- scope.$toggle = function () {
- scope.$$postDigest(function () {
- $tooltip.toggle();
- });
- };
- $tooltip.$isShown = scope.$isShown = false;
- // Private vars
- var timeout, hoverState;
- // Support contentTemplate option
- if (options.contentTemplate) {
- $tooltip.$promise = $tooltip.$promise.then(function (template) {
- var templateEl = angular.element(template);
- return fetchTemplate(options.contentTemplate).then(function (contentTemplate) {
- findElement('[ng-bind="content"]', templateEl[0]).removeAttr('ng-bind').html(contentTemplate);
- return templateEl[0].outerHTML;
- });
- });
+ // Fetch, compile then initialize tooltip
+ var tipLinker, tipElement, tipTemplate, tipContainer;
+ $tooltip.$promise.then(function (template) {
+ if (angular.isObject(template))
+ template = template.data;
+ if (options.html)
+ template = template.replace(htmlReplaceRegExp, 'ng-bind-html="');
+ template = trim.apply(template);
+ tipTemplate = template;
+ tipLinker = $compile(template);
+ $tooltip.init();
+ });
+ $tooltip.init = function () {
+ // Options: delay
+ if (options.delay && angular.isNumber(options.delay)) {
+ options.delay = {
+ show: options.delay,
+ hide: options.delay
+ };
}
- // Fetch, compile then initialize tooltip
- var tipLinker, tipElement, tipTemplate, tipContainer;
- $tooltip.$promise.then(function (template) {
- if (angular.isObject(template))
- template = template.data;
- if (options.html)
- template = template.replace(htmlReplaceRegExp, 'ng-bind-html="');
- template = trim.apply(template);
- tipTemplate = template;
- tipLinker = $compile(template);
- $tooltip.init();
- });
- $tooltip.init = function () {
- // Options: delay
- if (options.delay && angular.isNumber(options.delay)) {
- options.delay = {
- show: options.delay,
- hide: options.delay
- };
- }
- // Replace trigger on touch devices ?
- // if(isTouch && options.trigger === defaults.trigger) {
- // options.trigger.replace(/hover/g, 'click');
- // }
- // Options : container
- if (options.container === 'self') {
- tipContainer = element;
- } else if (options.container) {
- tipContainer = findElement(options.container);
- }
- // Options: trigger
- var triggers = options.trigger.split(' ');
- angular.forEach(triggers, function (trigger) {
- if (trigger === 'click') {
- element.on('click', $tooltip.toggle);
- } else if (trigger !== 'manual') {
- element.on(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);
- element.on(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);
- trigger !== 'hover' && element.on(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);
- }
- });
- // Options: show
- if (options.show) {
- scope.$$postDigest(function () {
- options.trigger === 'focus' ? element[0].focus() : $tooltip.show();
- });
- }
- };
- $tooltip.destroy = function () {
- // Unbind events
- var triggers = options.trigger.split(' ');
- for (var i = triggers.length; i--;) {
- var trigger = triggers[i];
- if (trigger === 'click') {
- element.off('click', $tooltip.toggle);
- } else if (trigger !== 'manual') {
- element.off(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);
- element.off(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);
- trigger !== 'hover' && element.off(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);
- }
- }
- // Remove element
- if (tipElement) {
- tipElement.remove();
- tipElement = null;
- }
- // Destroy scope
- scope.$destroy();
- };
- $tooltip.enter = function () {
- clearTimeout(timeout);
- hoverState = 'in';
- if (!options.delay || !options.delay.show) {
- return $tooltip.show();
- }
- timeout = setTimeout(function () {
- if (hoverState === 'in')
- $tooltip.show();
- }, options.delay.show);
- };
- $tooltip.show = function () {
- var parent = options.container ? tipContainer : null;
- var after = options.container ? null : element;
- // Remove any existing tipElement
- if (tipElement)
- tipElement.remove();
- // Fetch a cloned element linked from template
- tipElement = $tooltip.$element = tipLinker(scope, function (clonedElement, scope) {
- });
- // Set the initial positioning.
- tipElement.css({
- top: '0px',
- left: '0px',
- display: 'block'
- }).addClass(options.placement);
- // Options: animation
- if (options.animation)
- tipElement.addClass(options.animation);
- // Options: type
- if (options.type)
- tipElement.addClass(options.prefixClass + '-' + options.type);
- $animate.enter(tipElement, parent, after, function () {
- });
- $tooltip.$isShown = scope.$isShown = true;
- scope.$$phase || scope.$digest();
- $$animateReflow($tooltip.$applyPlacement);
- // Bind events
- if (options.keyboard) {
- if (options.trigger !== 'focus') {
- $tooltip.focus();
- tipElement.on('keyup', $tooltip.$onKeyUp);
- } else {
- element.on('keyup', $tooltip.$onFocusKeyUp);
- }
- }
- };
- $tooltip.leave = function () {
- clearTimeout(timeout);
- hoverState = 'out';
- if (!options.delay || !options.delay.hide) {
- return $tooltip.hide();
+ // Replace trigger on touch devices ?
+ // if(isTouch && options.trigger === defaults.trigger) {
+ // options.trigger.replace(/hover/g, 'click');
+ // }
+ // Options : container
+ if (options.container === 'self') {
+ tipContainer = element;
+ } else if (options.container) {
+ tipContainer = findElement(options.container);
+ }
+ // Options: trigger
+ var triggers = options.trigger.split(' ');
+ angular.forEach(triggers, function (trigger) {
+ if (trigger === 'click') {
+ element.on('click', $tooltip.toggle);
+ } else if (trigger !== 'manual') {
+ element.on(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);
+ element.on(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);
+ trigger !== 'hover' && element.on(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);
}
- timeout = setTimeout(function () {
- if (hoverState === 'out') {
- $tooltip.hide();
- }
- }, options.delay.hide);
- };
- $tooltip.hide = function (blur) {
- if (!$tooltip.$isShown)
- return;
- $animate.leave(tipElement, function () {
- tipElement = null;
+ });
+ // Options: show
+ if (options.show) {
+ scope.$$postDigest(function () {
+ options.trigger === 'focus' ? element[0].focus() : $tooltip.show();
});
- $tooltip.$isShown = scope.$isShown = false;
- scope.$$phase || scope.$digest();
- // Unbind events
- if (options.keyboard) {
- 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.destroy = function () {
+ // Unbind events
+ var triggers = options.trigger.split(' ');
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i];
+ if (trigger === 'click') {
+ element.off('click', $tooltip.toggle);
+ } else if (trigger !== 'manual') {
+ element.off(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);
+ element.off(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);
+ trigger !== 'hover' && element.off(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);
}
- };
- $tooltip.toggle = function () {
- $tooltip.$isShown ? $tooltip.leave() : $tooltip.enter();
- };
- $tooltip.focus = function () {
- tipElement[0].focus();
- };
- // Protected methods
- $tooltip.$applyPlacement = function () {
- if (!tipElement)
- return;
- // Get the position of the tooltip element.
- var elementPosition = getPosition();
- // Get the height and width of the tooltip so we can center it.
- var tipWidth = tipElement.prop('offsetWidth'), tipHeight = tipElement.prop('offsetHeight');
- // Get the tooltip's top and left coordinates to center it with this directive.
- var tipPosition = getCalculatedOffset(options.placement, elementPosition, tipWidth, tipHeight);
- // Now set the calculated positioning.
- tipPosition.top += 'px';
- tipPosition.left += 'px';
- tipElement.css(tipPosition);
- };
- $tooltip.$onKeyUp = function (evt) {
- evt.which === 27 && $tooltip.hide();
- };
- $tooltip.$onFocusKeyUp = function (evt) {
- evt.which === 27 && element[0].blur();
- };
- $tooltip.$onFocusElementMouseDown = function (evt) {
- evt.preventDefault();
- evt.stopPropagation();
- // Some browsers do not auto-focus buttons (eg. Safari)
- $tooltip.$isShown ? element[0].blur() : element[0].focus();
- };
- // Private methods
- function getPosition() {
- if (options.container === 'body') {
- return dimensions.offset(element[0]);
+ }
+ // Remove element
+ if (tipElement) {
+ tipElement.remove();
+ tipElement = null;
+ }
+ // Destroy scope
+ scope.$destroy();
+ };
+ $tooltip.enter = function () {
+ clearTimeout(timeout);
+ hoverState = 'in';
+ if (!options.delay || !options.delay.show) {
+ return $tooltip.show();
+ }
+ timeout = setTimeout(function () {
+ if (hoverState === 'in')
+ $tooltip.show();
+ }, options.delay.show);
+ };
+ $tooltip.show = function () {
+ scope.$emit(options.prefixEvent + '.show.before', $tooltip);
+ var parent = options.container ? tipContainer : null;
+ var after = options.container ? null : element;
+ // Hide any existing tipElement
+ if (tipElement)
+ tipElement.remove();
+ // Fetch a cloned element linked from template
+ tipElement = $tooltip.$element = tipLinker(scope, function (clonedElement, scope) {
+ });
+ // Set the initial positioning.
+ tipElement.css({
+ top: '0px',
+ left: '0px',
+ display: 'block'
+ }).addClass(options.placement);
+ // Options: animation
+ if (options.animation)
+ tipElement.addClass(options.animation);
+ // Options: type
+ if (options.type)
+ tipElement.addClass(options.prefixClass + '-' + options.type);
+ $animate.enter(tipElement, parent, after, function () {
+ scope.$emit(options.prefixEvent + '.show', $tooltip);
+ });
+ $tooltip.$isShown = scope.$isShown = true;
+ scope.$$phase || scope.$root.$$phase || scope.$digest();
+ $$rAF($tooltip.$applyPlacement);
+ // var a = bodyEl.offsetWidth + 1; ?
+ // Bind events
+ if (options.keyboard) {
+ if (options.trigger !== 'focus') {
+ $tooltip.focus();
+ tipElement.on('keyup', $tooltip.$onKeyUp);
} else {
- return dimensions.position(element[0]);
+ element.on('keyup', $tooltip.$onFocusKeyUp);
}
}
- function getCalculatedOffset(placement, position, actualWidth, actualHeight) {
- var offset;
- var split = placement.split('-');
- switch (split[0]) {
- case 'right':
- offset = {
- top: position.top + position.height / 2 - actualHeight / 2,
- left: position.left + position.width
- };
- break;
- case 'bottom':
- offset = {
- top: position.top + position.height,
- left: position.left + position.width / 2 - actualWidth / 2
- };
- break;
+ };
+ $tooltip.leave = function () {
+ clearTimeout(timeout);
+ hoverState = 'out';
+ if (!options.delay || !options.delay.hide) {
+ return $tooltip.hide();
+ }
+ timeout = setTimeout(function () {
+ if (hoverState === 'out') {
+ $tooltip.hide();
+ }
+ }, options.delay.hide);
+ };
+ $tooltip.hide = function (blur) {
+ if (!$tooltip.$isShown)
+ return;
+ scope.$emit(options.prefixEvent + '.hide.before', $tooltip);
+ $animate.leave(tipElement, function () {
+ scope.$emit(options.prefixEvent + '.hide', $tooltip);
+ });
+ $tooltip.$isShown = scope.$isShown = false;
+ scope.$$phase || scope.$root.$$phase || scope.$digest();
+ // Unbind events
+ 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();
+ };
+ $tooltip.focus = function () {
+ tipElement[0].focus();
+ };
+ // Protected methods
+ $tooltip.$applyPlacement = function () {
+ if (!tipElement)
+ return;
+ // Get the position of the tooltip element.
+ var elementPosition = getPosition();
+ // Get the height and width of the tooltip so we can center it.
+ var tipWidth = tipElement.prop('offsetWidth'), tipHeight = tipElement.prop('offsetHeight');
+ // Get the tooltip's top and left coordinates to center it with this directive.
+ var tipPosition = getCalculatedOffset(options.placement, elementPosition, tipWidth, tipHeight);
+ // Now set the calculated positioning.
+ tipPosition.top += 'px';
+ tipPosition.left += 'px';
+ tipElement.css(tipPosition);
+ };
+ $tooltip.$onKeyUp = function (evt) {
+ evt.which === 27 && $tooltip.hide();
+ };
+ $tooltip.$onFocusKeyUp = function (evt) {
+ evt.which === 27 && element[0].blur();
+ };
+ $tooltip.$onFocusElementMouseDown = function (evt) {
+ evt.preventDefault();
+ evt.stopPropagation();
+ // Some browsers do not auto-focus buttons (eg. Safari)
+ $tooltip.$isShown ? element[0].blur() : element[0].focus();
+ };
+ // Private methods
+ function getPosition() {
+ if (options.container === 'body') {
+ return dimensions.offset(element[0]);
+ } else {
+ return dimensions.position(element[0]);
+ }
+ }
+ function getCalculatedOffset(placement, position, actualWidth, actualHeight) {
+ var offset;
+ var split = placement.split('-');
+ switch (split[0]) {
+ case 'right':
+ offset = {
+ top: position.top + position.height / 2 - actualHeight / 2,
+ left: position.left + position.width
+ };
+ break;
+ case 'bottom':
+ offset = {
+ top: position.top + position.height,
+ left: position.left + position.width / 2 - actualWidth / 2
+ };
+ break;
+ case 'left':
+ offset = {
+ top: position.top + position.height / 2 - actualHeight / 2,
+ left: position.left - actualWidth
+ };
+ break;
+ default:
+ offset = {
+ top: position.top - actualHeight,
+ left: position.left + position.width / 2 - actualWidth / 2
+ };
+ break;
+ }
+ if (!split[1]) {
+ return offset;
+ }
+ // Add support for corners @todo css
+ if (split[0] === 'top' || split[0] === 'bottom') {
+ switch (split[1]) {
case 'left':
- offset = {
- top: position.top + position.height / 2 - actualHeight / 2,
- left: position.left - actualWidth
- };
+ offset.left = position.left;
break;
- default:
- offset = {
- top: position.top - actualHeight,
- left: position.left + position.width / 2 - actualWidth / 2
- };
- break;
- }
- if (!split[1]) {
- return offset;
+ case 'right':
+ offset.left = position.left + position.width - actualWidth;
}
- // Add support for corners @todo css
- if (split[0] === 'top' || split[0] === 'bottom') {
- switch (split[1]) {
- case 'left':
- offset.left = position.left;
- break;
- case 'right':
- offset.left = position.left + position.width - actualWidth;
- }
- } else if (split[0] === 'left' || split[0] === 'right') {
- switch (split[1]) {
- case 'top':
- offset.top = position.top - actualHeight;
- break;
- case 'bottom':
- offset.top = position.top + position.height;
- }
+ } else if (split[0] === 'left' || split[0] === 'right') {
+ switch (split[1]) {
+ case 'top':
+ offset.top = position.top - actualHeight;
+ break;
+ case 'bottom':
+ offset.top = position.top + position.height;
}
- return offset;
}
- return $tooltip;
+ return offset;
}
- // Helper functions
- function findElement(query, element) {
- return angular.element((element || document).querySelectorAll(query));
- }
- function fetchTemplate(template) {
- return $q.when($templateCache.get(template) || $http.get(template)).then(function (res) {
- if (angular.isObject(res)) {
- $templateCache.put(template, res.data);
- return res.data;
- }
- return res;
+ return $tooltip;
+ }
+ // Helper functions
+ function findElement(query, element) {
+ return angular.element((element || document).querySelectorAll(query));
+ }
+ function fetchTemplate(template) {
+ return $q.when($templateCache.get(template) || $http.get(template)).then(function (res) {
+ if (angular.isObject(res)) {
+ $templateCache.put(template, res.data);
+ return res.data;
+ }
+ return res;
+ });
+ }
+ return TooltipFactory;
+ }
+ ];
+}).directive('bsTooltip', [
+ '$window',
+ '$location',
+ '$sce',
+ '$tooltip',
+ '$$rAF',
+ function ($window, $location, $sce, $tooltip, $$rAF) {
+ return {
+ restrict: 'EAC',
+ scope: true,
+ link: function postLink(scope, element, attr, transclusion) {
+ // Directive options
+ var options = { scope: scope };
+ angular.forEach([
+ 'template',
+ 'contentTemplate',
+ 'placement',
+ 'container',
+ 'delay',
+ 'trigger',
+ 'keyboard',
+ 'html',
+ 'animation',
+ 'type'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Observe scope attributes for change
+ angular.forEach(['title'], function (key) {
+ attr[key] && attr.$observe(key, function (newValue, oldValue) {
+ scope[key] = $sce.trustAsHtml(newValue);
+ angular.isDefined(oldValue) && $$rAF(function () {
+ tooltip && tooltip.$applyPlacement();
+ });
});
- }
- return TooltipFactory;
+ });
+ // Support scope as an object
+ attr.bsTooltip && scope.$watch(attr.bsTooltip, function (newValue, oldValue) {
+ if (angular.isObject(newValue)) {
+ angular.extend(scope, newValue);
+ } else {
+ scope.title = newValue;
+ }
+ angular.isDefined(oldValue) && $$rAF(function () {
+ tooltip && tooltip.$applyPlacement();
+ });
+ }, true);
+ // Initialize popover
+ var tooltip = $tooltip(element, options);
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ tooltip.destroy();
+ options = null;
+ tooltip = null;
+ });
}
- ];
- }).directive('bsTooltip', [
+ };
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/typeahead/typeahead.js
+angular.module('mgcrea.ngStrap.typeahead', [
+ 'mgcrea.ngStrap.tooltip',
+ 'mgcrea.ngStrap.helpers.parseOptions'
+]).provider('$typeahead', function () {
+ var defaults = this.defaults = {
+ animation: 'am-fade',
+ prefixClass: 'typeahead',
+ placement: 'bottom-left',
+ template: 'typeahead/typeahead.tpl.html',
+ trigger: 'focus',
+ container: false,
+ keyboard: true,
+ html: false,
+ delay: 0,
+ minLength: 1,
+ filter: 'filter',
+ limit: 6
+ };
+ this.$get = [
'$window',
- '$location',
- '$sce',
+ '$rootScope',
'$tooltip',
- '$$animateReflow',
- function ($window, $location, $sce, $tooltip, $$animateReflow) {
- return {
- restrict: 'EAC',
- scope: true,
- link: function postLink(scope, element, attr, transclusion) {
- // Directive options
- var options = { scope: scope };
- angular.forEach([
- 'template',
- 'contentTemplate',
- 'placement',
- 'container',
- 'delay',
- 'trigger',
- 'keyboard',
- 'html',
- 'animation',
- 'type'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- // Observe scope attributes for change
- angular.forEach(['title'], function (key) {
- attr[key] && attr.$observe(key, function (newValue, oldValue) {
- scope[key] = $sce.trustAsHtml(newValue);
- angular.isDefined(oldValue) && $$animateReflow(function () {
- tooltip && tooltip.$applyPlacement();
- });
- });
+ function ($window, $rootScope, $tooltip) {
+ var bodyEl = angular.element($window.document.body);
+ function TypeaheadFactory(element, config) {
+ var $typeahead = {};
+ // Common vars
+ var options = angular.extend({}, defaults, config);
+ var controller = options.controller;
+ $typeahead = $tooltip(element, options);
+ var parentScope = config.scope;
+ var scope = $typeahead.$scope;
+ scope.$matches = [];
+ scope.$activeIndex = 0;
+ scope.$activate = function (index) {
+ scope.$$postDigest(function () {
+ $typeahead.activate(index);
});
- // Support scope as an object
- attr.bsTooltip && scope.$watch(attr.bsTooltip, function (newValue, oldValue) {
- if (angular.isObject(newValue)) {
- angular.extend(scope, newValue);
- } else {
- scope.content = newValue;
- }
- angular.isDefined(oldValue) && $$animateReflow(function () {
- tooltip && tooltip.$applyPlacement();
- });
- }, true);
- // Initialize popover
- var tooltip = $tooltip(element, options);
- // Garbage collection
- scope.$on('$destroy', function () {
- tooltip.destroy();
- options = null;
- tooltip = null;
+ };
+ scope.$select = function (index, evt) {
+ scope.$$postDigest(function () {
+ $typeahead.select(index);
});
- }
- };
- }
- ]);
- // Source: src/typeahead/typeahead.js
- angular.module('mgcrea.ngStrap.typeahead', [
- 'mgcrea.ngStrap.tooltip',
- 'mgcrea.ngStrap.helpers.parseOptions'
- ]).provider('$typeahead', function () {
- var defaults = this.defaults = {
- animation: 'am-fade',
- prefixClass: 'typeahead',
- placement: 'bottom-left',
- template: 'typeahead/typeahead.tpl.html',
- trigger: 'focus',
- container: false,
- keyboard: true,
- html: false,
- delay: 0,
- minLength: 1,
- filter: 'filter',
- limit: 6
- };
- this.$get = [
- '$window',
- '$rootScope',
- '$tooltip',
- function ($window, $rootScope, $tooltip) {
- var bodyEl = angular.element($window.document.body);
- function TypeaheadFactory(element, config) {
- var $typeahead = {};
- // Common vars
- var options = angular.extend({}, defaults, config);
- var controller = options.controller;
- $typeahead = $tooltip(element, options);
- var parentScope = config.scope;
- var scope = $typeahead.$scope;
- scope.$matches = [];
+ };
+ scope.$isVisible = function () {
+ return $typeahead.$isVisible();
+ };
+ // Public methods
+ $typeahead.update = function (matches) {
+ scope.$matches = matches;
+ if (scope.$activeIndex >= matches.length) {
+ scope.$activeIndex = 0;
+ }
+ };
+ $typeahead.activate = function (index) {
+ scope.$activeIndex = index;
+ };
+ $typeahead.select = function (index) {
+ var value = scope.$matches[index].value;
+ if (controller) {
+ controller.$setViewValue(value);
+ controller.$render();
+ if (parentScope)
+ parentScope.$digest();
+ }
+ if (options.trigger === 'focus')
+ element[0].blur();
+ else if ($typeahead.$isShown)
+ $typeahead.hide();
scope.$activeIndex = 0;
- scope.$activate = function (index) {
- scope.$$postDigest(function () {
- $typeahead.activate(index);
- });
- };
- scope.$select = function (index, evt) {
- scope.$$postDigest(function () {
- $typeahead.select(index);
- });
- };
- scope.$isVisible = function () {
- return $typeahead.$isVisible();
- };
- // Public methods
- $typeahead.update = function (matches) {
- scope.$matches = matches;
- if (scope.$activeIndex >= matches.length) {
- scope.$activeIndex = 0;
- }
- };
- $typeahead.activate = function (index) {
- scope.$activeIndex = index;
- };
- $typeahead.select = function (index) {
- var value = scope.$matches[index].value;
- if (controller) {
- controller.$setViewValue(value);
- controller.$render();
- if (parentScope)
- parentScope.$digest();
- }
- if (options.trigger === 'focus')
- element[0].blur();
- else if ($typeahead.$isShown)
- $typeahead.hide();
+ // Emit event
+ scope.$emit('$typeahead.select', value, index);
+ };
+ // Protected methods
+ $typeahead.$isVisible = function () {
+ if (!options.minLength || !controller) {
+ return !!scope.$matches.length;
+ }
+ // minLength support
+ return scope.$matches.length && angular.isString(controller.$viewValue) && controller.$viewValue.length >= options.minLength;
+ };
+ $typeahead.$getIndex = function (value) {
+ var l = scope.$matches.length, i = l;
+ if (!l)
+ return;
+ for (i = l; i--;) {
+ if (scope.$matches[i].value === value)
+ break;
+ }
+ if (i < 0)
+ return;
+ return i;
+ };
+ $typeahead.$onMouseDown = function (evt) {
+ // Prevent blur on mousedown
+ evt.preventDefault();
+ evt.stopPropagation();
+ };
+ $typeahead.$onKeyDown = function (evt) {
+ if (!/(38|40|13)/.test(evt.keyCode))
+ return;
+ evt.preventDefault();
+ evt.stopPropagation();
+ // Select with enter
+ if (evt.keyCode === 13 && scope.$matches.length) {
+ return $typeahead.select(scope.$activeIndex);
+ }
+ // Navigate with keyboard
+ if (evt.keyCode === 38 && scope.$activeIndex > 0)
+ scope.$activeIndex--;
+ else if (evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1)
+ scope.$activeIndex++;
+ else if (angular.isUndefined(scope.$activeIndex))
scope.$activeIndex = 0;
- // Emit event
- scope.$emit('$typeahead.select', value, index);
- };
- // Protected methods
- $typeahead.$isVisible = function () {
- if (!options.minLength || !controller) {
- return !!scope.$matches.length;
- }
- // minLength support
- return scope.$matches.length && angular.isString(controller.$viewValue) && controller.$viewValue.length >= options.minLength;
- };
- $typeahead.$onMouseDown = function (evt) {
- // Prevent blur on mousedown
- evt.preventDefault();
- evt.stopPropagation();
- };
- $typeahead.$onKeyDown = function (evt) {
- if (!/(38|40|13)/.test(evt.keyCode))
- return;
- evt.preventDefault();
- evt.stopPropagation();
- // Select with enter
- if (evt.keyCode === 13) {
- return $typeahead.select(scope.$activeIndex);
- }
- // Navigate with keyboard
- if (evt.keyCode === 38 && scope.$activeIndex > 0)
- scope.$activeIndex--;
- else if (evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1)
- scope.$activeIndex++;
- else if (angular.isUndefined(scope.$activeIndex))
- scope.$activeIndex = 0;
- scope.$digest();
- };
- // Overrides
- var show = $typeahead.show;
- $typeahead.show = function () {
- show();
- setTimeout(function () {
- $typeahead.$element.on('mousedown', $typeahead.$onMouseDown);
- if (options.keyboard) {
- element.on('keydown', $typeahead.$onKeyDown);
- }
- });
- };
- var hide = $typeahead.hide;
- $typeahead.hide = function () {
- $typeahead.$element.off('mousedown', $typeahead.$onMouseDown);
+ scope.$digest();
+ };
+ // Overrides
+ var show = $typeahead.show;
+ $typeahead.show = function () {
+ show();
+ setTimeout(function () {
+ $typeahead.$element.on('mousedown', $typeahead.$onMouseDown);
if (options.keyboard) {
- element.off('keydown', $typeahead.$onKeyDown);
+ element.on('keydown', $typeahead.$onKeyDown);
}
- hide();
- };
- return $typeahead;
- }
- TypeaheadFactory.defaults = defaults;
- return TypeaheadFactory;
- }
- ];
- }).directive('bsTypeahead', [
- '$window',
- '$parse',
- '$q',
- '$typeahead',
- '$parseOptions',
- function ($window, $parse, $q, $typeahead, $parseOptions) {
- var defaults = $typeahead.defaults;
- return {
- restrict: 'EAC',
- require: 'ngModel',
- link: function postLink(scope, element, attr, controller) {
- // Directive options
- var options = {
- scope: scope,
- controller: controller
- };
- angular.forEach([
- 'placement',
- 'container',
- 'delay',
- 'trigger',
- 'keyboard',
- 'html',
- 'animation',
- 'template',
- 'filter',
- 'limit',
- 'minLength'
- ], function (key) {
- if (angular.isDefined(attr[key]))
- options[key] = attr[key];
- });
- // Build proper ngOptions
- var filter = options.filter || defaults.filter;
- var limit = options.limit || defaults.limit;
- var ngOptions = attr.ngOptions;
- if (filter)
- ngOptions += ' | ' + filter + ':$viewValue';
- if (limit)
- ngOptions += ' | limitTo:' + limit;
- var parsedOptions = $parseOptions(ngOptions);
- // Initialize typeahead
- var typeahead = $typeahead(element, options);
- // Watch model for changes
- scope.$watch(attr.ngModel, function (newValue, oldValue) {
- parsedOptions.valuesFn(scope, controller).then(function (values) {
- if (values.length > limit)
- values = values.slice(0, limit);
- // if(matches.length === 1 && matches[0].value === newValue) return;
- typeahead.update(values);
- });
- });
- // Garbage collection
- scope.$on('$destroy', function () {
- typeahead.destroy();
- options = null;
- typeahead = null;
});
- }
- };
+ };
+ var hide = $typeahead.hide;
+ $typeahead.hide = function () {
+ $typeahead.$element.off('mousedown', $typeahead.$onMouseDown);
+ if (options.keyboard) {
+ element.off('keydown', $typeahead.$onKeyDown);
+ }
+ hide();
+ };
+ return $typeahead;
+ }
+ TypeaheadFactory.defaults = defaults;
+ return TypeaheadFactory;
}
- ]);
-}(window, document));
\ No newline at end of file
+ ];
+}).directive('bsTypeahead', [
+ '$window',
+ '$parse',
+ '$q',
+ '$typeahead',
+ '$parseOptions',
+ function ($window, $parse, $q, $typeahead, $parseOptions) {
+ var defaults = $typeahead.defaults;
+ return {
+ restrict: 'EAC',
+ require: 'ngModel',
+ link: function postLink(scope, element, attr, controller) {
+ // Directive options
+ var options = {
+ scope: scope,
+ controller: controller
+ };
+ angular.forEach([
+ 'placement',
+ 'container',
+ 'delay',
+ 'trigger',
+ 'keyboard',
+ 'html',
+ 'animation',
+ 'template',
+ 'filter',
+ 'limit',
+ 'minLength'
+ ], function (key) {
+ if (angular.isDefined(attr[key]))
+ options[key] = attr[key];
+ });
+ // Build proper ngOptions
+ var filter = options.filter || defaults.filter;
+ var limit = options.limit || defaults.limit;
+ var ngOptions = attr.ngOptions;
+ if (filter)
+ ngOptions += ' | ' + filter + ':$viewValue';
+ if (limit)
+ ngOptions += ' | limitTo:' + limit;
+ var parsedOptions = $parseOptions(ngOptions);
+ // Initialize typeahead
+ var typeahead = $typeahead(element, options);
+ // if(!dump) var dump = console.error.bind(console);
+ // Watch model for changes
+ scope.$watch(attr.ngModel, function (newValue, oldValue) {
+ scope.$modelValue = newValue;
+ //Set model value on the scope to custom templates can use it.
+ parsedOptions.valuesFn(scope, controller).then(function (values) {
+ if (values.length > limit)
+ values = values.slice(0, limit);
+ // if(matches.length === 1 && matches[0].value === newValue) return;
+ typeahead.update(values);
+ // Queue a new rendering that will leverage collection loading
+ controller.$render();
+ });
+ });
+ // Model rendering in view
+ controller.$render = function () {
+ // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
+ if (controller.$isEmpty(controller.$viewValue))
+ return element.val('');
+ var index = typeahead.$getIndex(controller.$modelValue);
+ var selected = angular.isDefined(index) ? typeahead.$scope.$matches[index].label : controller.$viewValue;
+ element.val(selected.replace(/<(?:.|\n)*?>/gm, '').trim());
+ };
+ // Garbage collection
+ scope.$on('$destroy', function () {
+ typeahead.destroy();
+ options = null;
+ typeahead = null;
+ });
+ }
+ };
+ }
+]);
+
+})(window, document);
diff --git a/dist/angular-strap.min.js b/dist/angular-strap.min.js
index c358b9e1c..6428d3bdc 100644
--- a/dist/angular-strap.min.js
+++ b/dist/angular-strap.min.js
@@ -1,10 +1,9 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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(a,b){"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"]).provider("$affix",function(){var a=this.defaults={offsetTop:"auto"};this.$get=["$window","dimensions",function(b,c){function d(d,f){function g(a,b,c){var d=h(),e=i();return t>=d?"top":null!==a&&d+a<=b.top?"middle":null!==u&&b.top+c+n>=e-u?"bottom":"middle"}function h(){return l[0]===b?b.pageYOffset:l[0]===b}function i(){return l[0]===b?b.document.body.scrollHeight:l[0].scrollHeight}var j={},k=angular.extend({},a,f),l=k.target,m="affix affix-top affix-bottom",n=0,o=0,p=null,q=null,r=d.parent();if(k.offsetParent)if(k.offsetParent.match(/^\d+$/))for(var s=0;s<1*k.offsetParent-1;s++)r=r.parent();else r=angular.element(k.offsetParent);var t=0;k.offsetTop&&("auto"===k.offsetTop&&(k.offsetTop="+0"),k.offsetTop.match(/^[-+]\d+$/)?(n-=1*k.offsetTop,t=k.offsetParent?c.offset(r[0]).top+1*k.offsetTop:c.offset(d[0]).top-c.css(d[0],"marginTop",!0)+1*k.offsetTop):t=1*k.offsetTop);var u=0;return k.offsetBottom&&(u=k.offsetParent&&k.offsetBottom.match(/^[-+]\d+$/)?i()-(c.offset(r[0]).top+c.height(r[0]))+1*k.offsetBottom+1:1*k.offsetBottom),j.init=function(){o=c.offset(d[0]).top+n,l.on("scroll",this.checkPosition),l.on("click",this.checkPositionWithEventLoop),this.checkPosition(),this.checkPositionWithEventLoop()},j.destroy=function(){l.off("scroll",this.checkPosition),l.off("click",this.checkPositionWithEventLoop)},j.checkPositionWithEventLoop=function(){setTimeout(this.checkPosition,1)},j.checkPosition=function(){var a=h(),b=c.offset(d[0]),f=c.height(d[0]),i=g(q,b,f);p!==i&&(p=i,d.removeClass(m).addClass("affix"+("middle"!==i?"-"+i:"")),"top"===i?(q=null,d.css("position",k.offsetParent?"":"relative"),d.css("top","")):"bottom"===i?(q=k.offsetUnpin?-(1*k.offsetUnpin):b.top-a,d.css("position",k.offsetParent?"":"relative"),d.css("top",k.offsetParent?"":e[0].offsetHeight-u-f-o+"px")):(q=null,d.css("position","fixed"),d.css("top",n+"px")))},j.init(),j}var e=angular.element(b.document.body);return d}]}).directive("bsAffix",["$affix","$window",function(a,b){return{restrict:"EAC",require:"^?bsAffixTarget",link:function(c,d,e,f){var g={scope:c,offsetTop:"auto",target:f?f.$element:angular.element(b)};angular.forEach(["offsetTop","offsetBottom","offsetParent","offsetUnpin"],function(a){angular.isDefined(e[a])&&(g[a]=e[a])});var h=a(d,g);c.$on("$destroy",function(){g=null,h=null})}}}]).directive("bsAffixTarget",function(){return{controller:["$element",function(a){this.$element=a}]}}),angular.module("mgcrea.ngStrap.alert",[]).provider("$alert",function(){var a=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};this.$get=["$modal","$timeout",function(b,c){function d(d){var e={},f=angular.extend({},a,d);e=b(f),f.type&&(e.$scope.type=f.type);var g=e.show;return f.duration&&(e.show=function(){g(),c(function(){e.hide()},1e3*f.duration)}),e}return d}]}).directive("bsAlert",["$window","$location","$sce","$alert",function(a,b,c,d){a.requestAnimationFrame||a.setTimeout;return{restrict:"EAC",scope:!0,link:function(a,b,e){var f={scope:a,element:b,show:!1};angular.forEach(["template","placement","keyboard","html","container","animation","duration"],function(a){angular.isDefined(e[a])&&(f[a]=e[a])}),angular.forEach(["title","content","type"],function(b){e[b]&&e.$observe(b,function(d){a[b]=c.trustAsHtml(d)})}),e.bsAlert&&a.$watch(e.bsAlert,function(b){angular.isObject(b)?angular.extend(a,b):a.content=b},!0);var g=d(f);b.on(e.trigger||"click",g.toggle),a.$on("$destroy",function(){g.destroy(),f=null,g=null})}}}]),angular.module("mgcrea.ngStrap.aside",["mgcrea.ngStrap.modal"]).provider("$aside",function(){var a=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(b){function c(c){var d={},e=angular.extend({},a,c);return d=b(e)}return c}]}).directive("bsAside",["$window","$location","$sce","$aside",function(a,b,c,d){a.requestAnimationFrame||a.setTimeout;return{restrict:"EAC",scope:!0,link:function(a,b,e){var f={scope:a,element:b,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(a){angular.isDefined(e[a])&&(f[a]=e[a])}),angular.forEach(["title","content"],function(b){e[b]&&e.$observe(b,function(d){a[b]=c.trustAsHtml(d)})}),e.bsAside&&a.$watch(e.bsAside,function(b){angular.isObject(b)?angular.extend(a,b):a.content=b},!0);var g=d(f);b.on(e.trigger||"click",g.toggle),a.$on("$destroy",function(){g.destroy(),f=null,g=null})}}}]),angular.module("mgcrea.ngStrap.button",["ngAnimate"]).provider("$button",function(){var a=this.defaults={activeClass:"active",toggleEvent:"click"};this.$get=function(){return{defaults:a}}}).directive("bsCheckboxGroup",function(){return{restrict:"A",require:"ngModel",compile:function(a,b){a.attr("data-toggle","buttons"),a.removeAttr("ng-model");var c=a[0].querySelectorAll('input[type="checkbox"]');angular.forEach(c,function(a){var c=angular.element(a);c.attr("bs-checkbox",""),c.attr("ng-model",b.ngModel+"."+c.attr("value"))})}}}).directive("bsCheckbox",["$button","$$animateReflow",function(a,b){var c=a.defaults,d=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(a,e,f,g){var h=c,i="INPUT"===e[0].nodeName,j=i?e.parent():e,k=angular.isDefined(f.trueValue)?f.trueValue:!0;d.test(f.trueValue)&&(k=a.$eval(f.trueValue));var l=angular.isDefined(f.falseValue)?f.falseValue:!1;d.test(f.falseValue)&&(l=a.$eval(f.falseValue));var m="boolean"!=typeof k||"boolean"!=typeof l;m&&(g.$parsers.push(function(a){return a?k:l}),a.$watch(f.ngModel,function(){g.$render()})),g.$render=function(){var a=angular.equals(g.$modelValue,k);b(function(){i&&(e[0].checked=a),j.toggleClass(h.activeClass,a)})},e.bind(h.toggleEvent,function(){a.$apply(function(){i||g.$setViewValue(!j.hasClass("active")),m||g.$render()})})}}}]).directive("bsRadioGroup",function(){return{restrict:"A",require:"ngModel",compile:function(a,b){a.attr("data-toggle","buttons"),a.removeAttr("ng-model");var c=a[0].querySelectorAll('input[type="radio"]');angular.forEach(c,function(a){angular.element(a).attr("bs-radio",""),angular.element(a).attr("ng-model",b.ngModel)})}}}).directive("bsRadio",["$button","$$animateReflow",function(a,b){var c=a.defaults,d=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(a,e,f,g){var h=c,i="INPUT"===e[0].nodeName,j=i?e.parent():e,k=d.test(f.value)?a.$eval(f.value):f.value;g.$render=function(){var a=angular.equals(g.$modelValue,k);b(function(){i&&(e[0].checked=a),j.toggleClass(h.activeClass,a)})},e.bind(h.toggleEvent,function(){a.$apply(function(){g.$setViewValue(k),g.$render()})})}}}]),angular.module("mgcrea.ngStrap.datepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$datepicker",function(){var a=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",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip",function(b,c,d,e,f,g,h,i){function j(b,c,d){function e(a){a.selected=g.$isSelected(a.date)}function f(){b[0].focus()}var g=i(b,angular.extend({},a,d)),j=d.scope,m=g.$options,n=g.$scope;m.startView&&(m.startView-=m.minView);var o=h(g);g.$views=o.views;var p=o.viewDate;n.$mode=m.startView;var q=g.$views[n.$mode];n.$select=function(a){g.select(a)},n.$selectPane=function(a){g.$selectPane(a)},n.$toggleMode=function(){g.setMode((n.$mode+1)%g.$views.length)},g.update=function(a){angular.isDate(a)&&!isNaN(a.getTime())&&(g.$date=a,q.update.call(q,a)),g.$build(!0)},g.select=function(a,b){angular.isDate(c.$dateValue)||(c.$dateValue=new Date(a)),c.$dateValue.setFullYear(a.getFullYear(),a.getMonth(),a.getDate()),!n.$mode||b?(c.$setViewValue(c.$dateValue),c.$render(),m.autoclose&&!b&&g.hide(!0)):(angular.extend(p,{year:a.getFullYear(),month:a.getMonth(),date:a.getDate()}),g.setMode(n.$mode-1),g.$build())},g.setMode=function(a){n.$mode=a,q=g.$views[n.$mode],g.$build()},g.$build=function(a){a===!0&&q.built||(a!==!1||q.built)&&q.build.call(q)},g.$updateSelected=function(){for(var a=0,b=n.rows.length;b>a;a++)angular.forEach(n.rows[a],e)},g.$isSelected=function(a){return q.isSelected(a)},g.$selectPane=function(a){var b=q.steps,c=new Date(Date.UTC(p.year+(b.year||0)*a,p.month+(b.month||0)*a,p.date+(b.day||0)*a));angular.extend(p,{year:c.getUTCFullYear(),month:c.getUTCMonth(),date:c.getUTCDate()}),g.$build()},g.$onMouseDown=function(a){if(a.preventDefault(),a.stopPropagation(),k){var b=angular.element(a.target);"button"!==b[0].nodeName.toLowerCase()&&(b=b.parent()),b.triggerHandler("click")}},g.$onKeyDown=function(a){if(/(38|37|39|40|13)/.test(a.keyCode)&&!a.shiftKey&&!a.altKey){if(a.preventDefault(),a.stopPropagation(),13===a.keyCode)return n.$mode?n.$apply(function(){g.setMode(n.$mode-1)}):g.hide(!0);q.onKeyDown(a),j.$digest()}};var r=g.init;g.init=function(){return l&&m.useNative?(b.prop("type","date"),void b.css("-webkit-appearance","textfield")):(k&&(b.prop("type","text"),b.attr("readonly","true"),b.on("click",f)),void r())};var s=g.destroy;g.destroy=function(){l&&m.useNative&&b.off("click",f),s()};var t=g.show;g.show=function(){t(),setTimeout(function(){g.$element.on(k?"touchstart":"mousedown",g.$onMouseDown),m.keyboard&&b.on("keydown",g.$onKeyDown)})};var u=g.hide;return g.hide=function(a){g.$element.off(k?"touchstart":"mousedown",g.$onMouseDown),m.keyboard&&b.off("keydown",g.$onKeyDown),u(a)},g}var k=(angular.element(b.document.body),"createTouch"in b.document),l=/(ip(a|o)d|iphone|android)/gi.test(b.navigator.userAgent);return a.lang||(a.lang=f.id),j.defaults=a,j}]}).directive("bsDatepicker",["$window","$parse","$q","$locale","dateFilter","$datepicker","$dateParser","$timeout",function(a,b,c,d,e,f,g){{var h=(f.defaults,/(ip(a|o)d|iphone|android)/gi.test(a.navigator.userAgent));a.requestAnimationFrame||a.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(a,b,c,d){var i={scope:a,controller:d};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","strictFormat","startWeek","useNative","lang","startView","minView"],function(a){angular.isDefined(c[a])&&(i[a]=c[a])}),h&&i.useNative&&(i.dateFormat="yyyy-MM-dd");var j=f(b,d,i);i=j.$options,angular.forEach(["minDate","maxDate"],function(a){angular.isDefined(c[a])&&c.$observe(a,function(b){if("today"===b){var c=new Date;j.$options[a]=+new Date(c.getFullYear(),c.getMonth(),c.getDate()+("maxDate"===a?1:0),0,0,0,"minDate"===a?0:-1)}else j.$options[a]=angular.isString(b)&&b.match(/^".+"$/)?+new Date(b.substr(1,b.length-2)):+new Date(b);!isNaN(j.$options[a])&&j.$build(!1)})}),a.$watch(c.ngModel,function(){j.update(d.$dateValue)},!0);var k=g({format:i.dateFormat,lang:i.lang,strict:i.strictFormat});d.$parsers.unshift(function(a){if(!a)return void d.$setValidity("date",!0);var b=k.parse(a,d.$dateValue);if(!b||isNaN(b.getTime()))d.$setValidity("date",!1);else{var c=b.getTime()>=i.minDate&&b.getTime()<=i.maxDate;d.$setValidity("date",c),c&&(d.$dateValue=b)}return"string"===i.dateType?e(a,i.dateFormat):"number"===i.dateType?d.$dateValue.getTime():"iso"===i.dateType?d.$dateValue.toISOString():new Date(d.$dateValue)}),d.$formatters.push(function(a){if(!angular.isUndefined(a)&&null!==a){var b=angular.isDate(a)?a:new Date(a);return d.$dateValue=b,d.$dateValue}}),d.$render=function(){b.val(!d.$dateValue||isNaN(d.$dateValue.getTime())?"":e(d.$dateValue,i.dateFormat))},a.$on("$destroy",function(){j.destroy(),i=null,j=null})}}}]).provider("datepickerViews",function(){function a(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c}this.defaults={dayFormat:"dd",daySplit:7};this.$get=["$locale","$sce","dateFilter",function(b,c,d){return function(e){var f=e.$scope,g=e.$options,h=b.DATETIME_FORMATS.SHORTDAY,i=h.slice(g.startWeek).concat(h.slice(0,g.startWeek)),j=c.trustAsHtml(''+i.join(' ')+" "),k=e.$date||new Date,l={year:k.getFullYear(),month:k.getMonth(),date:k.getDate()},m=(6e4*k.getTimezoneOffset(),[{format:"dd",split:7,steps:{month:1},update:function(a,b){!this.built||b||a.getFullYear()!==l.year||a.getMonth()!==l.month?(angular.extend(l,{year:e.$date.getFullYear(),month:e.$date.getMonth(),date:e.$date.getDate()}),e.$build()):a.getDate()!==l.date&&(l.date=e.$date.getDate(),e.$updateSelected())},build:function(){for(var b,c=new Date(l.year,l.month,1),h=new Date(+c-864e5*(c.getDay()-g.startWeek)),i=[],k=0;42>k;k++)b=new Date(h.getFullYear(),h.getMonth(),h.getDate()+k),i.push({date:b,label:d(b,this.format),selected:e.$date&&this.isSelected(b),muted:b.getMonth()!==l.month,disabled:this.isDisabled(b)});f.title=d(c,"MMMM yyyy"),f.labels=j,f.rows=a(i,this.split),this.built=!0},isSelected:function(a){return e.$date&&a.getFullYear()===e.$date.getFullYear()&&a.getMonth()===e.$date.getMonth()&&a.getDate()===e.$date.getDate()},isDisabled:function(a){return a.getTime()g.maxDate},onKeyDown:function(a){var b=e.$date.getTime();37===a.keyCode?e.select(new Date(b-864e5),!0):38===a.keyCode?e.select(new Date(b-6048e5),!0):39===a.keyCode?e.select(new Date(b+864e5),!0):40===a.keyCode&&e.select(new Date(b+6048e5),!0)}},{name:"month",format:"MMM",split:4,steps:{year:1},update:function(a){this.built&&a.getFullYear()===l.year?a.getMonth()!==l.month&&(angular.extend(l,{month:e.$date.getMonth(),date:e.$date.getDate()}),e.$updateSelected()):(angular.extend(l,{year:e.$date.getFullYear(),month:e.$date.getMonth(),date:e.$date.getDate()}),e.$build())},build:function(){for(var b,c=(new Date(l.year,0,1),[]),g=0;12>g;g++)b=new Date(l.year,g,1),c.push({date:b,label:d(b,this.format),selected:e.$isSelected(b),disabled:this.isDisabled(b)});f.title=d(b,"yyyy"),f.labels=!1,f.rows=a(c,this.split),this.built=!0},isSelected:function(a){return e.$date&&a.getFullYear()===e.$date.getFullYear()&&a.getMonth()===e.$date.getMonth()},isDisabled:function(a){var b=+new Date(a.getFullYear(),a.getMonth()+1,0);return bg.maxDate},onKeyDown:function(a){var b=e.$date.getMonth();37===a.keyCode?e.select(e.$date.setMonth(b-1),!0):38===a.keyCode?e.select(e.$date.setMonth(b-4),!0):39===a.keyCode?e.select(e.$date.setMonth(b+1),!0):40===a.keyCode&&e.select(e.$date.setMonth(b+4),!0)}},{name:"year",format:"yyyy",split:4,steps:{year:12},update:function(a,b){!this.built||b||parseInt(a.getFullYear()/20,10)!==parseInt(l.year/20,10)?(angular.extend(l,{year:e.$date.getFullYear(),month:e.$date.getMonth(),date:e.$date.getDate()}),e.$build()):a.getFullYear()!==l.year&&(angular.extend(l,{year:e.$date.getFullYear(),month:e.$date.getMonth(),date:e.$date.getDate()}),e.$updateSelected())},build:function(){for(var b,c=l.year-l.year%(3*this.split),g=[],h=0;12>h;h++)b=new Date(c+h,0,1),g.push({date:b,label:d(b,this.format),selected:e.$isSelected(b),disabled:this.isDisabled(b)});f.title=g[0].label+"-"+g[g.length-1].label,f.labels=!1,f.rows=a(g,this.split),this.built=!0},isSelected:function(a){return e.$date&&a.getFullYear()===e.$date.getFullYear()},isDisabled:function(a){var b=+new Date(a.getFullYear()+1,0,0);return bg.maxDate},onKeyDown:function(a){var b=e.$date.getFullYear();37===a.keyCode?e.select(e.$date.setYear(b-1),!0):38===a.keyCode?e.select(e.$date.setYear(b-4),!0):39===a.keyCode?e.select(e.$date.setYear(b+1),!0):40===a.keyCode&&e.select(e.$date.setYear(b+4),!0)}}]);return{views:g.minView?Array.prototype.slice.call(m,g.minView):m,viewDate:l}}}]}),angular.module("mgcrea.ngStrap.dropdown",["mgcrea.ngStrap.tooltip"]).provider("$dropdown",function(){var a=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(b,c,d){function e(b,e){function h(a){return a.target!==b[0]?a.target!==b[0]&&i.hide():void 0}{var i={},j=angular.extend({},a,e);i.$scope=j.scope&&j.scope.$new()||c.$new()}i=d(b,j),i.$onKeyDown=function(a){if(/(38|40)/.test(a.keyCode)){a.preventDefault(),a.stopPropagation();var b=angular.element(i.$element[0].querySelectorAll("li:not(.divider) a"));if(b.length){var c;angular.forEach(b,function(a,b){g&&g.call(a,":focus")&&(c=b)}),38===a.keyCode&&c>0?c--:40===a.keyCode&&c1){var g=f.search(c[b]);a=a.split(c[b]).join(""),m[c[b]]&&(d[g]=m[c[b]])}return angular.forEach(d,function(a){e.push(a)}),e}function f(a){return a.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function g(a){var b,c=Object.keys(l),d=a;for(b=0;bj?d=setTimeout(i,b-j):(d=null,c||(h=a.apply(f,e)))},j=c&&!d;return d||(d=setTimeout(i,b)),j&&(h=a.apply(f,e)),h}}).constant("throttle",function(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:new Date,g=null,f=a.apply(d,e)};return function(){var j=new Date;h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e)):g||c.trailing===!1||(g=setTimeout(i,k)),f}}),angular.module("mgcrea.ngStrap.helpers.dimensions",[]).factory("dimensions",["$document","$window",function(){var b=(angular.element,{}),c=b.nodeName=function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()};b.css=function(b,c,d){var e;return e=b.currentStyle?b.currentStyle[c]:a.getComputedStyle?a.getComputedStyle(b)[c]:b.style[c],d===!0?parseFloat(e)||0:e},b.offset=function(b){var c=b.getBoundingClientRect(),d=b.ownerDocument;return{width:b.offsetWidth,height:b.offsetHeight,top:c.top+(a.pageYOffset||d.documentElement.scrollTop)-(d.documentElement.clientTop||0),left:c.left+(a.pageXOffset||d.documentElement.scrollLeft)-(d.documentElement.clientLeft||0)}},b.position=function(a){var e,f,g={top:0,left:0};return"fixed"===b.css(a,"position")?f=a.getBoundingClientRect():(e=d(a),f=b.offset(a),f=b.offset(a),c(e,"html")||(g=b.offset(e)),g.top+=b.css(e,"borderTopWidth",!0),g.left+=b.css(e,"borderLeftWidth",!0)),{width:a.offsetWidth,height:a.offsetHeight,top:f.top-g.top-b.css(a,"marginTop",!0),left:f.left-g.left-b.css(a,"marginLeft",!0)}};var d=function(a){var d=a.ownerDocument,e=a.offsetParent||d;if(c(e,"#document"))return d.documentElement;for(;e&&!c(e,"html")&&"static"===b.css(e,"position");)e=e.offsetParent;return e||d.documentElement};return b.height=function(a,c){var d=a.offsetHeight;return c?d+=b.css(a,"marginTop",!0)+b.css(a,"marginBottom",!0):d-=b.css(a,"paddingTop",!0)+b.css(a,"paddingBottom",!0)+b.css(a,"borderTopWidth",!0)+b.css(a,"borderBottomWidth",!0),d},b.width=function(a,c){var d=a.offsetWidth;return c?d+=b.css(a,"marginLeft",!0)+b.css(a,"marginRight",!0):d-=b.css(a,"paddingLeft",!0)+b.css(a,"paddingRight",!0)+b.css(a,"borderLeftWidth",!0)+b.css(a,"borderRightWidth",!0),d},b}]),angular.module("mgcrea.ngStrap.helpers.parseOptions",[]).provider("$parseOptions",function(){var a=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(b,c){function d(d,e){function f(a){return a.map(function(a,b){var c,d,e={};return e[k]=a,c=j(e),d=n(e)||b,{label:c,value:d}})}var g={},h=angular.extend({},a,e);g.$values=[];var i,j,k,l,m,n,o;return g.init=function(){g.$match=i=d.match(h.regexp),j=b(i[2]||i[1]),k=i[4]||i[6],l=i[5],m=b(i[3]||""),n=b(i[2]?i[1]:k),o=b(i[7])},g.valuesFn=function(a,b){return c.when(o(a,b)).then(function(a){return g.$values=a?f(a):{},g.$values})},g.init(),g}return d}]}),angular.module("mgcrea.ngStrap.modal",["mgcrea.ngStrap.helpers.dimensions"]).provider("$modal",function(){var a=this.defaults={animation:"am-fade",backdropAnimation:"am-fade",prefixClass:"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","dimensions",function(c,d,e,f,g,h,i){function j(b){function c(a){a.target===a.currentTarget&&("static"===g.backdrop?f.focus():f.hide())}var f={},g=angular.extend({},a,b);f.$promise=l(g.template);var h=f.$scope=g.scope&&g.scope.$new()||d.$new();g.element||g.container||(g.container="body"),m(["title","content"],function(a){g[a]&&(h[a]=g[a])}),h.$hide=function(){h.$$postDigest(function(){f.hide()})},h.$show=function(){h.$$postDigest(function(){f.show()})},h.$toggle=function(){h.$$postDigest(function(){f.toggle()})},g.contentTemplate&&(f.$promise=f.$promise.then(function(a){var c=angular.element(a);return l(g.contentTemplate).then(function(a){var d=k('[ng-bind="content"]',c[0]).removeAttr("ng-bind").html(a);return b.template||d.next().remove(),c[0].outerHTML})}));var j,r,s=angular.element('
');return f.$promise.then(function(a){angular.isObject(a)&&(a=a.data),g.html&&(a=a.replace(q,'ng-bind-html="')),a=n.apply(a),j=e(a),f.init()}),f.init=function(){g.show&&h.$$postDigest(function(){f.show()})},f.destroy=function(){r&&(r.remove(),r=null),s&&(s.remove(),s=null),h.$destroy()},f.show=function(){var a=g.container?k(g.container):null,b=g.container?null:g.element;r=f.$element=j(h,function(){}),r.css({display:"block"}).addClass(g.placement),g.animation&&(g.backdrop&&s.addClass(g.backdropAnimation),r.addClass(g.animation)),g.backdrop&&i.enter(s,p,null,function(){}),i.enter(r,a,b,function(){}),h.$isShown=!0,h.$$phase||h.$digest();var d=r[0];o(function(){d.focus()}),p.addClass(g.prefixClass+"-open"),g.animation&&p.addClass(g.prefixClass+"-with-"+g.animation),g.backdrop&&(r.on("click",c),s.on("click",c)),g.keyboard&&r.on("keyup",f.$onKeyUp)},f.hide=function(){i.leave(r,function(){p.removeClass(g.prefixClass+"-open"),g.animation&&p.addClass(g.prefixClass+"-with-"+g.animation)}),g.backdrop&&i.leave(s,function(){}),h.$isShown=!1,h.$$phase||h.$digest(),g.backdrop&&(r.off("click",c),s.off("click",c)),g.keyboard&&r.off("keyup",f.$onKeyUp)},f.toggle=function(){h.$isShown?f.hide():f.show()},f.focus=function(){r[0].focus()},f.$onKeyUp=function(a){27===a.which&&f.hide()},f}function k(a,c){return angular.element((c||b).querySelectorAll(a))}function l(a){return f.when(g.get(a)||h.get(a)).then(function(b){return angular.isObject(b)?(g.put(a,b.data),b.data):b})}var m=angular.forEach,n=String.prototype.trim,o=c.requestAnimationFrame||c.setTimeout,p=angular.element(c.document.body),q=/ng-bind="/gi;return j}]}).directive("bsModal",["$window","$location","$sce","$modal",function(a,b,c,d){return{restrict:"EAC",scope:!0,link:function(a,b,e){var f={scope:a,element:b,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(a){angular.isDefined(e[a])&&(f[a]=e[a])}),angular.forEach(["title","content"],function(b){e[b]&&e.$observe(b,function(d){a[b]=c.trustAsHtml(d)})}),e.bsModal&&a.$watch(e.bsModal,function(b){angular.isObject(b)?angular.extend(a,b):a.content=b},!0);var g=d(f);b.on(e.trigger||"click",g.toggle),a.$on("$destroy",function(){g.destroy(),f=null,g=null})}}}]),angular.module("mgcrea.ngStrap.navbar",[]).provider("$navbar",function(){var a=this.defaults={activeClass:"active",routeAttr:"data-match-route",strict:!1};this.$get=function(){return{defaults:a}}}).directive("bsNavbar",["$window","$location","$navbar",function(a,b,c){var d=c.defaults;return{restrict:"A",link:function(a,c,e){var f=angular.copy(d);angular.forEach(Object.keys(d),function(a){angular.isDefined(e[a])&&(f[a]=e[a])}),a.$watch(function(){return b.path()},function(a){var b=c[0].querySelectorAll("li["+f.routeAttr+"]");angular.forEach(b,function(b){var c=angular.element(b),d=c.attr(f.routeAttr).replace("/","\\/");f.strict&&(d="^"+d+"$");var e=new RegExp(d,["i"]);e.test(a)?c.addClass(f.activeClass):c.removeClass(f.activeClass)})})}}}]),angular.module("mgcrea.ngStrap.popover",["mgcrea.ngStrap.tooltip"]).provider("$popover",function(){var a=this.defaults={animation:"am-fade",placement:"right",template:"popover/popover.tpl.html",contentTemplate:!1,trigger:"click",keyboard:!0,html:!1,title:"",content:"",delay:0,container:!1};this.$get=["$tooltip",function(b){function c(c,d){var e=angular.extend({},a,d),f=b(c,e);return e.content&&(f.$scope.content=e.content),f}return c}]}).directive("bsPopover",["$window","$location","$sce","$popover",function(a,b,c,d){var e=a.requestAnimationFrame||a.setTimeout;return{restrict:"EAC",scope:!0,link:function(a,b,f){var g={scope:a};angular.forEach(["template","contentTemplate","placement","container","delay","trigger","keyboard","html","animation"],function(a){angular.isDefined(f[a])&&(g[a]=f[a])}),angular.forEach(["title","content"],function(b){f[b]&&f.$observe(b,function(d,f){a[b]=c.trustAsHtml(d),angular.isDefined(f)&&e(function(){h&&h.$applyPlacement()})})}),f.bsPopover&&a.$watch(f.bsPopover,function(b,c){angular.isObject(b)?angular.extend(a,b):a.content=b,angular.isDefined(c)&&e(function(){h&&h.$applyPlacement()})},!0);var h=d(b,g);a.$on("$destroy",function(){h.destroy(),g=null,h=null})}}}]),angular.module("mgcrea.ngStrap.scrollspy",["mgcrea.ngStrap.helpers.debounce","mgcrea.ngStrap.helpers.dimensions"]).provider("$scrollspy",function(){var a=this.$$spies={},c=this.defaults={debounce:150,throttle:100,offset:100};this.$get=["$window","$document","$rootScope","dimensions","debounce","throttle",function(d,e,f,g,h,i){function j(a,b){return a[0].nodeName&&a[0].nodeName.toLowerCase()===b.toLowerCase()}function k(e){var k=angular.extend({},c,e);k.element||(k.element=n);var o=j(k.element,"body"),p=o?l:k.element,q=o?"window":k.id;if(a[q])return a[q].$$count++,a[q];var r,s,t,u,v,w,x,y,z={},A=z.$trackedElements=[],B=[];return z.init=function(){this.$$count=1,u=h(this.checkPosition,k.debounce),v=i(this.checkPosition,k.throttle),p.on("click",this.checkPositionWithEventLoop),l.on("resize",u),p.on("scroll",v),w=h(this.checkOffsets,k.debounce),r=f.$on("$viewContentLoaded",w),s=f.$on("$includeContentLoaded",w),w(),q&&(a[q]=z)},z.destroy=function(){this.$$count--,this.$$count>0||(p.off("click",this.checkPositionWithEventLoop),l.off("resize",u),p.off("scroll",u),r(),s())},z.checkPosition=function(){if(B.length){if(y=(o?d.pageYOffset:p.prop("scrollTop"))||0,x=Math.max(d.innerHeight,m.prop("clientHeight")),yB[a+1].offsetTop))return z.$activateElement(B[a])}},z.checkPositionWithEventLoop=function(){setTimeout(this.checkPosition,1)},z.$activateElement=function(a){if(t){var b=z.$getTrackedElement(t);b&&(b.source.removeClass("active"),j(b.source,"li")&&j(b.source.parent().parent(),"li")&&b.source.parent().parent().removeClass("active"))}t=a.target,a.source.addClass("active"),j(a.source,"li")&&j(a.source.parent().parent(),"li")&&a.source.parent().parent().addClass("active")},z.$getTrackedElement=function(a){return A.filter(function(b){return b.target===a})[0]},z.checkOffsets=function(){angular.forEach(A,function(a){var c=b.querySelector(a.target);a.offsetTop=c?g.offset(c).top:null,k.offset&&null!==a.offsetTop&&(a.offsetTop-=1*k.offset)}),B=A.filter(function(a){return null!==a.offsetTop}).sort(function(a,b){return a.offsetTop-b.offsetTop}),u()},z.trackElement=function(a,b){A.push({target:a,source:b})},z.untrackElement=function(a,b){for(var c,d=A.length;d--;)if(A[d].target===a&&A[d].source===b){c=d;break}A=A.splice(c,1)},z.activate=function(a){A[a].addClass("active")},z.init(),z}var l=angular.element(d),m=angular.element(e.prop("documentElement")),n=angular.element(d.document.body);return k}]}).directive("bsScrollspy",["$rootScope","debounce","dimensions","$scrollspy",function(a,b,c,d){return{restrict:"EAC",link:function(a,b,c){var e={scope:a};
-angular.forEach(["offset","target"],function(a){angular.isDefined(c[a])&&(e[a]=c[a])});var f=d(e);f.trackElement(e.target,b),a.$on("$destroy",function(){f.untrackElement(e.target,b),f.destroy(),e=null,f=null})}}}]).directive("bsScrollspyList",["$rootScope","debounce","dimensions","$scrollspy",function(){return{restrict:"A",compile:function(a){var b=a[0].querySelectorAll("li > a[href]");angular.forEach(b,function(a){var b=angular.element(a);b.parent().attr("bs-scrollspy","").attr("data-target",b.attr("href"))})}}}]),angular.module("mgcrea.ngStrap.select",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$select",function(){var a=this.defaults={animation:"am-fade",prefixClass:"select",placement:"bottom-left",template:"select/select.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,sort:!0,caretHtml:' ',placeholder:"Choose among the following...",maxLength:3,maxLengthHtml:"selected"};this.$get=["$window","$document","$rootScope","$tooltip",function(b,c,d,e){function f(b,c,d){var f={},h=angular.extend({},a,d);f=e(b,h);var i=d.scope,j=f.$scope;j.$matches=[],j.$activeIndex=0,j.$isMultiple=h.multiple,j.$activate=function(a){j.$$postDigest(function(){f.activate(a)})},j.$select=function(a){j.$$postDigest(function(){f.select(a)})},j.$isVisible=function(){return f.$isVisible()},j.$isActive=function(a){return f.$isActive(a)},f.update=function(a){j.$matches=a,f.$updateActiveIndex()},f.activate=function(a){return h.multiple?(j.$activeIndex.sort(),f.$isActive(a)?j.$activeIndex.splice(j.$activeIndex.indexOf(a),1):j.$activeIndex.push(a),h.sort&&j.$activeIndex.sort()):j.$activeIndex=a,j.$activeIndex},f.select=function(a){var d=j.$matches[a].value;f.activate(a),c.$setViewValue(h.multiple?j.$activeIndex.map(function(a){return j.$matches[a].value}):d),c.$render(),i&&i.$digest(),h.multiple||("focus"===h.trigger?b[0].blur():f.$isShown&&f.hide()),j.$emit("$select.select",d,a)},f.$updateActiveIndex=function(){c.$modelValue&&j.$matches.length?j.$activeIndex=h.multiple&&angular.isArray(c.$modelValue)?c.$modelValue.map(function(a){return f.$getIndex(a)}):f.$getIndex(c.$modelValue):j.$activeIndex>=j.$matches.length&&(j.$activeIndex=h.multiple?[]:0)},f.$isVisible=function(){return h.minLength&&c?j.$matches.length&&c.$viewValue.length>=h.minLength:j.$matches.length},f.$isActive=function(a){return h.multiple?-1!==j.$activeIndex.indexOf(a):j.$activeIndex===a},f.$getIndex=function(a){var b=j.$matches.length,c=b;if(b){for(c=b;c--&&j.$matches[c].value!==a;);if(!(0>c))return c}},f.$onMouseDown=function(a){if(a.preventDefault(),a.stopPropagation(),g){var b=angular.element(a.target);b.triggerHandler("click")}},f.$onKeyDown=function(a){if(/(38|40|13)/.test(a.keyCode)){if(a.preventDefault(),a.stopPropagation(),13===a.keyCode)return f.select(j.$activeIndex);38===a.keyCode&&j.$activeIndex>0?j.$activeIndex--:40===a.keyCode&&j.$activeIndex'),i.after(b)}var j=e(c.ngOptions),k=d(b,g,h),l=j.$match[7].replace(/\|.+/,"").trim();a.$watch(l,function(){j.valuesFn(a,g).then(function(a){k.update(a),g.$render()})},!0),a.$watch(c.ngModel,function(){k.$updateActiveIndex()},!0),g.$render=function(){var a,d;h.multiple&&angular.isArray(g.$modelValue)?(a=g.$modelValue.map(function(a){return d=k.$getIndex(a),angular.isDefined(d)?k.$scope.$matches[d].label:!1}).filter(angular.isDefined),a=a.length>(h.maxLength||f.maxLength)?a.length+" "+(h.maxLengthHtml||f.maxLengthHtml):a.join(", ")):(d=k.$getIndex(g.$modelValue),a=angular.isDefined(d)?k.$scope.$matches[d].label:!1),b.html((a?a:c.placeholder||f.placeholder)+f.caretHtml)},a.$on("$destroy",function(){k.destroy(),h=null,k=null})}}}]),angular.module("mgcrea.ngStrap.tab",[]).run(["$templateCache",function(a){a.put("$pane","{{pane.content}}")}]).provider("$tab",function(){var a=this.defaults={animation:"am-fade",template:"tab/tab.tpl.html"};this.$get=function(){return{defaults:a}}}).directive("bsTabs",["$window","$animate","$tab",function(a,b,c){var d=c.defaults;return{restrict:"EAC",scope:!0,require:"?ngModel",templateUrl:function(a,b){return b.template||d.template},link:function(a,b,c,e){var f=d;angular.forEach(["animation"],function(a){angular.isDefined(c[a])&&(f[a]=c[a])}),c.bsTabs&&a.$watch(c.bsTabs,function(b){a.panes=b},!0),b.addClass("tabs"),f.animation&&b.addClass(f.animation),a.active=a.activePane=0,a.setActive=function(b){a.active=b,e&&e.$setViewValue(b)},e&&(e.$render=function(){a.active=1*e.$modelValue})}}}]),angular.module("mgcrea.ngStrap.timepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$timepicker",function(){var a=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",autoclose:!1,minTime:-1/0,maxTime:+1/0,length:5,hourStep:1,minuteStep:5};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","$tooltip",function(b,c,d,e,f,g,h){function i(b,c,d){function e(a,c){if(b[0].createTextRange){var d=b[0].createTextRange();d.collapse(!0),d.moveStart("character",a),d.moveEnd("character",c),d.select()}else b[0].setSelectionRange?b[0].setSelectionRange(a,c):angular.isUndefined(b[0].selectionStart)&&(b[0].selectionStart=a,b[0].selectionEnd=c)}function i(){b[0].focus()}var l=h(b,angular.extend({},a,d)),m=d.scope,n=l.$options,o=l.$scope,p=0,q=c.$dateValue||new Date,r={hour:q.getHours(),meridian:q.getHours()<12,minute:q.getMinutes(),second:q.getSeconds(),millisecond:q.getMilliseconds()},s=f.DATETIME_FORMATS[n.timeFormat]||n.timeFormat,t=/(h+)[:]?(m+)[ ]?(a?)/i.exec(s).slice(1);o.$select=function(a,b){l.select(a,b)},o.$moveIndex=function(a,b){l.$moveIndex(a,b)},o.$switchMeridian=function(a){l.switchMeridian(a)},l.update=function(a){angular.isDate(a)&&!isNaN(a.getTime())?(l.$date=a,angular.extend(r,{hour:a.getHours(),minute:a.getMinutes(),second:a.getSeconds(),millisecond:a.getMilliseconds()}),l.$build()):l.$isBuilt||l.$build()},l.select=function(a,b,d){isNaN(c.$dateValue.getTime())&&(c.$dateValue=new Date(1970,0,1)),angular.isDate(a)||(a=new Date(a)),0===b?c.$dateValue.setHours(a.getHours()):1===b&&c.$dateValue.setMinutes(a.getMinutes()),c.$setViewValue(c.$dateValue),c.$render(),n.autoclose&&!d&&l.hide(!0)},l.switchMeridian=function(a){var b=(a||c.$dateValue).getHours();c.$dateValue.setHours(12>b?b+12:b-12),c.$render()},l.$build=function(){var a,b,c=o.midIndex=parseInt(n.length/2,10),d=[];for(a=0;an.maxTime},l.$moveIndex=function(a,b){var c;0===b?(c=new Date(1970,0,1,r.hour+a*n.length,r.minute),angular.extend(r,{hour:c.getHours()})):1===b&&(c=new Date(1970,0,1,r.hour,r.minute+a*n.length*5),angular.extend(r,{minute:c.getMinutes()})),l.$build()},l.$onMouseDown=function(a){if("input"!==a.target.nodeName.toLowerCase()&&a.preventDefault(),a.stopPropagation(),j){var b=angular.element(a.target);"button"!==b[0].nodeName.toLowerCase()&&(b=b.parent()),b.triggerHandler("click")}},l.$onKeyDown=function(a){if(/(38|37|39|40|13)/.test(a.keyCode)&&!a.shiftKey&&!a.altKey){if(a.preventDefault(),a.stopPropagation(),13===a.keyCode)return l.hide(!0);var b=new Date(l.$date),c=b.getHours(),d=g(b,"h").length,f=b.getMinutes(),h=g(b,"mm").length,i=/(37|39)/.test(a.keyCode),j=2+1*!!t[2];if(i&&(37===a.keyCode?p=1>p?j-1:p-1:39===a.keyCode&&(p=j-1>p?p+1:0)),0===p){if(i)return e(0,d);38===a.keyCode?b.setHours(c-n.hourStep):40===a.keyCode&&b.setHours(c+n.hourStep)}else if(1===p){if(i)return e(d+1,d+1+h);38===a.keyCode?b.setMinutes(f-n.minuteStep):40===a.keyCode&&b.setMinutes(f+n.minuteStep)}else if(2===p){if(i)return e(d+1+h+1,d+1+h+3);l.switchMeridian()}l.select(b,p,!0),m.$digest()}};var u=l.init;l.init=function(){return k&&n.useNative?(b.prop("type","time"),void b.css("-webkit-appearance","textfield")):(j&&(b.prop("type","text"),b.attr("readonly","true"),b.on("click",i)),void u())};var v=l.destroy;l.destroy=function(){k&&n.useNative&&b.off("click",i),v()};var w=l.show;l.show=function(){w(),setTimeout(function(){l.$element.on(j?"touchstart":"mousedown",l.$onMouseDown),n.keyboard&&b.on("keydown",l.$onKeyDown)})};var x=l.hide;return l.hide=function(a){l.$element.off(j?"touchstart":"mousedown",l.$onMouseDown),n.keyboard&&b.off("keydown",l.$onKeyDown),x(a)},l}var j=(angular.element(b.document.body),"createTouch"in b.document),k=/(ip(a|o)d|iphone|android)/gi.test(b.navigator.userAgent);return a.lang||(a.lang=f.id),i.defaults=a,i}]}).directive("bsTimepicker",["$window","$parse","$q","$locale","dateFilter","$timepicker","$dateParser","$timeout",function(a,b,c,d,e,f,g){{var h=f.defaults,i=/(ip(a|o)d|iphone|android)/gi.test(a.navigator.userAgent);a.requestAnimationFrame||a.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(a,b,c,d){var j={scope:a,controller:d};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","timeType","timeFormat","useNative","lang"],function(a){angular.isDefined(c[a])&&(j[a]=c[a])}),i&&(j.useNative||h.useNative)&&(j.timeFormat="HH:mm");var k=f(b,d,j);j=k.$options;var l=g({format:j.timeFormat,lang:j.lang});angular.forEach(["minTime","maxTime"],function(a){angular.isDefined(c[a])&&c.$observe(a,function(b){k.$options[a]="now"===b?(new Date).setFullYear(1970,0,1):angular.isString(b)&&b.match(/^".+"$/)?+new Date(b.substr(1,b.length-2)):l.parse(b),!isNaN(k.$options[a])&&k.$build()})}),a.$watch(c.ngModel,function(){k.update(d.$dateValue)},!0),d.$parsers.unshift(function(a){if(!a)return void d.$setValidity("date",!0);var b=l.parse(a,d.$dateValue);if(!b||isNaN(b.getTime()))d.$setValidity("date",!1);else{var c=b.getTime()>=j.minTime&&b.getTime()<=j.maxTime;d.$setValidity("date",c),c&&(d.$dateValue=b)}return"string"===j.timeType?e(a,j.timeFormat):"number"===j.timeType?d.$dateValue.getTime():"iso"===j.timeType?d.$dateValue.toISOString():d.$dateValue}),d.$formatters.push(function(a){var b="string"===j.timeType?l.parse(a,d.$dateValue):new Date(a);return d.$dateValue=b,d.$dateValue}),d.$render=function(){b.val(isNaN(d.$dateValue.getTime())?"":e(d.$dateValue,j.timeFormat))},a.$on("$destroy",function(){k.destroy(),j=null,k=null})}}}]),angular.module("mgcrea.ngStrap.tooltip",["ngAnimate","mgcrea.ngStrap.helpers.dimensions"]).provider("$tooltip",function(){var a=this.defaults={animation:"am-fade",prefixClass:"tooltip",container:!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","$timeout","dimensions","$$animateReflow",function(c,d,e,f,g,h,i,j,k,l){function m(b,c){function f(){return"body"===j.container?k.offset(b[0]):k.position(b[0])}function g(a,b,c,d){var e,f=a.split("-");switch(f[0]){case"right":e={top:b.top+b.height/2-d/2,left:b.left+b.width};break;case"bottom":e={top:b.top+b.height,left:b.left+b.width/2-c/2};break;case"left":e={top:b.top+b.height/2-d/2,left:b.left-c};break;default:e={top:b.top-d,left:b.left+b.width/2-c/2}}if(!f[1])return e;if("top"===f[0]||"bottom"===f[0])switch(f[1]){case"left":e.left=b.left;break;case"right":e.left=b.left+b.width-c}else if("left"===f[0]||"right"===f[0])switch(f[1]){case"top":e.top=b.top-d;break;case"bottom":e.top=b.top+b.height}return e}var h={},j=h.$options=angular.extend({},a,c);h.$promise=o(j.template);var m=h.$scope=j.scope&&j.scope.$new()||d.$new();j.delay&&angular.isString(j.delay)&&(j.delay=parseFloat(j.delay)),j.title&&(h.$scope.title=j.title),m.$hide=function(){m.$$postDigest(function(){h.hide()})},m.$show=function(){m.$$postDigest(function(){h.show()})},m.$toggle=function(){m.$$postDigest(function(){h.toggle()})},h.$isShown=m.$isShown=!1;var s,t;j.contentTemplate&&(h.$promise=h.$promise.then(function(a){var b=angular.element(a);return o(j.contentTemplate).then(function(a){return n('[ng-bind="content"]',b[0]).removeAttr("ng-bind").html(a),b[0].outerHTML})}));var u,v,w,x;return h.$promise.then(function(a){angular.isObject(a)&&(a=a.data),j.html&&(a=a.replace(r,'ng-bind-html="')),a=p.apply(a),w=a,u=e(a),h.init()}),h.init=function(){j.delay&&angular.isNumber(j.delay)&&(j.delay={show:j.delay,hide:j.delay}),"self"===j.container?x=b:j.container&&(x=n(j.container));var a=j.trigger.split(" ");angular.forEach(a,function(a){"click"===a?b.on("click",h.toggle):"manual"!==a&&(b.on("hover"===a?"mouseenter":"focus",h.enter),b.on("hover"===a?"mouseleave":"blur",h.leave),"hover"!==a&&b.on(q?"touchstart":"mousedown",h.$onFocusElementMouseDown))}),j.show&&m.$$postDigest(function(){"focus"===j.trigger?b[0].focus():h.show()})},h.destroy=function(){for(var a=j.trigger.split(" "),c=a.length;c--;){var d=a[c];"click"===d?b.off("click",h.toggle):"manual"!==d&&(b.off("hover"===d?"mouseenter":"focus",h.enter),b.off("hover"===d?"mouseleave":"blur",h.leave),"hover"!==d&&b.off(q?"touchstart":"mousedown",h.$onFocusElementMouseDown))}v&&(v.remove(),v=null),m.$destroy()},h.enter=function(){return clearTimeout(s),t="in",j.delay&&j.delay.show?void(s=setTimeout(function(){"in"===t&&h.show()},j.delay.show)):h.show()},h.show=function(){var a=j.container?x:null,c=j.container?null:b;v&&v.remove(),v=h.$element=u(m,function(){}),v.css({top:"0px",left:"0px",display:"block"}).addClass(j.placement),j.animation&&v.addClass(j.animation),j.type&&v.addClass(j.prefixClass+"-"+j.type),i.enter(v,a,c,function(){}),h.$isShown=m.$isShown=!0,m.$$phase||m.$digest(),l(h.$applyPlacement),j.keyboard&&("focus"!==j.trigger?(h.focus(),v.on("keyup",h.$onKeyUp)):b.on("keyup",h.$onFocusKeyUp))},h.leave=function(){return clearTimeout(s),t="out",j.delay&&j.delay.hide?void(s=setTimeout(function(){"out"===t&&h.hide()},j.delay.hide)):h.hide()},h.hide=function(a){return h.$isShown?(i.leave(v,function(){v=null}),h.$isShown=m.$isShown=!1,m.$$phase||m.$digest(),j.keyboard&&v.off("keyup",h.$onKeyUp),a&&"focus"===j.trigger?b[0].blur():void 0):void 0},h.toggle=function(){h.$isShown?h.leave():h.enter()},h.focus=function(){v[0].focus()},h.$applyPlacement=function(){if(v){var a=f(),b=v.prop("offsetWidth"),c=v.prop("offsetHeight"),d=g(j.placement,a,b,c);d.top+="px",d.left+="px",v.css(d)}},h.$onKeyUp=function(a){27===a.which&&h.hide()},h.$onFocusKeyUp=function(a){27===a.which&&b[0].blur()},h.$onFocusElementMouseDown=function(a){a.preventDefault(),a.stopPropagation(),h.$isShown?b[0].blur():b[0].focus()},h}function n(a,c){return angular.element((c||b).querySelectorAll(a))}function o(a){return f.when(g.get(a)||h.get(a)).then(function(b){return angular.isObject(b)?(g.put(a,b.data),b.data):b})}var p=String.prototype.trim,q="createTouch"in c.document,r=/ng-bind="/gi;return m}]}).directive("bsTooltip",["$window","$location","$sce","$tooltip","$$animateReflow",function(a,b,c,d,e){return{restrict:"EAC",scope:!0,link:function(a,b,f){var g={scope:a};angular.forEach(["template","contentTemplate","placement","container","delay","trigger","keyboard","html","animation","type"],function(a){angular.isDefined(f[a])&&(g[a]=f[a])}),angular.forEach(["title"],function(b){f[b]&&f.$observe(b,function(d,f){a[b]=c.trustAsHtml(d),angular.isDefined(f)&&e(function(){h&&h.$applyPlacement()})})}),f.bsTooltip&&a.$watch(f.bsTooltip,function(b,c){angular.isObject(b)?angular.extend(a,b):a.content=b,angular.isDefined(c)&&e(function(){h&&h.$applyPlacement()})},!0);var h=d(b,g);a.$on("$destroy",function(){h.destroy(),g=null,h=null})}}}]),angular.module("mgcrea.ngStrap.typeahead",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$typeahead",function(){var a=this.defaults={animation:"am-fade",prefixClass:"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(b,c,d){function e(b,c){var e={},f=angular.extend({},a,c),g=f.controller;e=d(b,f);var h=c.scope,i=e.$scope;i.$matches=[],i.$activeIndex=0,i.$activate=function(a){i.$$postDigest(function(){e.activate(a)})},i.$select=function(a){i.$$postDigest(function(){e.select(a)})},i.$isVisible=function(){return e.$isVisible()},e.update=function(a){i.$matches=a,i.$activeIndex>=a.length&&(i.$activeIndex=0)},e.activate=function(a){i.$activeIndex=a},e.select=function(a){var c=i.$matches[a].value;g&&(g.$setViewValue(c),g.$render(),h&&h.$digest()),"focus"===f.trigger?b[0].blur():e.$isShown&&e.hide(),i.$activeIndex=0,i.$emit("$typeahead.select",c,a)},e.$isVisible=function(){return f.minLength&&g?i.$matches.length&&angular.isString(g.$viewValue)&&g.$viewValue.length>=f.minLength:!!i.$matches.length},e.$onMouseDown=function(a){a.preventDefault(),a.stopPropagation()},e.$onKeyDown=function(a){if(/(38|40|13)/.test(a.keyCode)){if(a.preventDefault(),a.stopPropagation(),13===a.keyCode)return e.select(i.$activeIndex);38===a.keyCode&&i.$activeIndex>0?i.$activeIndex--:40===a.keyCode&&i.$activeIndexj&&(a=a.slice(0,j)),m.update(a)})}),a.$on("$destroy",function(){m.destroy(),h=null,m=null})}}}])}(window,document),function(){"use strict";angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(a){a.put("alert/alert.tpl.html",'×
')}]),angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(a){a.put("aside/aside.tpl.html",'')}]),angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(a){a.put("datepicker/datepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.dropdown").run(["$templateCache",function(a){a.put("dropdown/dropdown.tpl.html",'')}]),angular.module("mgcrea.ngStrap.modal").run(["$templateCache",function(a){a.put("modal/modal.tpl.html",'')}]),angular.module("mgcrea.ngStrap.popover").run(["$templateCache",function(a){a.put("popover/popover.tpl.html",'')}]),angular.module("mgcrea.ngStrap.select").run(["$templateCache",function(a){a.put("select/select.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tab").run(["$templateCache",function(a){a.put("tab/tab.tpl.html",'')}]),angular.module("mgcrea.ngStrap.timepicker").run(["$templateCache",function(a){a.put("timepicker/timepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tooltip").run(["$templateCache",function(a){a.put("tooltip/tooltip.tpl.html",'')}]),angular.module("mgcrea.ngStrap.typeahead").run(["$templateCache",function(a){a.put("typeahead/typeahead.tpl.html",'')}])}(window,document);
-//# sourceMappingURL=angular-strap.min.map
\ 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,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 k=0;k<1*f.offsetParent-1;k++)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};this.$get=["$modal","$timeout",function(t,n){function a(a){var o={},i=angular.extend({},e,a);o=t(i),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"],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","$location","$sce","$aside",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","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.bsAside&&e.$watch(o.bsAside,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.button",["ngAnimate"]).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",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0};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;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.select=function(e,t){angular.isDate(n.$dateValue)||(n.$dateValue=new Date(e)),n.$dateValue.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),!p.$mode||t?(n.$setViewValue(n.$dateValue),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.$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){var u={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","strictFormat","startWeek","useNative","lang","startView","minView"],function(e){angular.isDefined(n[e])&&(u[e]=n[e])}),l&&u.useNative&&(u.dateFormat="yyyy-MM-dd");var c=i(t,a,u);u=c.$options,angular.forEach(["minDate","maxDate"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){if("today"===t){var n=new Date;c.$options[e]=+new Date(n.getFullYear(),n.getMonth(),n.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)):s(t)?+new Date(parseInt(t,10)):+new Date(t);!isNaN(c.$options[e])&&c.$build(!1)})}),e.$watch(n.ngModel,function(){c.update(a.$dateValue)},!0);var d=r({format:u.dateFormat,lang:u.lang,strict:u.strictFormat});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()))return void a.$setValidity("date",!1);var n=(isNaN(c.$options.minDate)||t.getTime()>=c.$options.minDate)&&(isNaN(c.$options.maxDate)||t.getTime()<=c.$options.maxDate);return a.$setValidity("date",n),n&&(a.$dateValue=t),"string"===u.dateType?o(e,u.dateFormat):"number"===u.dateType?a.$dateValue.getTime():"iso"===u.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"===u.dateType?d.parse(e):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":o(a.$dateValue,u.dateFormat))},e.$on("$destroy",function(){c.destroy(),u=null,c=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:"dd",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,6)),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.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){return e.getTime()l.maxDate},onKeyDown:function(e){var t=i.$date.getTime();37===e.keyCode?i.select(new Date(t-864e5),!0):38===e.keyCode?i.select(new Date(t-6048e5),!0):39===e.keyCode?i.select(new Date(t+864e5),!0):40===e.keyCode&&i.select(new Date(t+6048e5),!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.labels=!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();37===e.keyCode?i.select(i.$date.setMonth(t-1),!0):38===e.keyCode?i.select(i.$date.setMonth(t-4),!0):39===e.keyCode?i.select(i.$date.setMonth(t+1),!0):40===e.keyCode&&i.select(i.$date.setMonth(t+4),!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.labels=!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();37===e.keyCode?i.select(i.$date.setYear(t-1),!0):38===e.keyCode?i.select(i.$date.setYear(t-4),!0):39===e.keyCode?i.select(i.$date.setYear(t+1),!0):40===e.keyCode&&i.select(i.$date.setYear(t+4),!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(""),f[n[t]]&&(a[r]=f[n[t]])}return angular.forEach(a,function(e){o.push(e)}),o}function i(e){return e.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function r(e){var t,n=Object.keys(d),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:t.offsetWidth,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){return e.map(function(e,t){var n,a,o={};return o[c]=e,n=u(o),a=p(o)||t,{label:n,value:a}})}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(e){return r.$values=e?i(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=r.container?f(r.container):null,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.$$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.addClass(r.prefixClass+"-with-"+r.animation)}),r.backdrop&&s.leave(y,function(){}),l.$isShown=!1,l.$$phase||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",placement:"right",template:"popover/popover.tpl.html",contentTemplate:!1,trigger:"click",keyboard:!0,html:!1,title:"",content:"",delay:0,container:!1};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","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);var l=a(t,r);e.$on("$destroy",function(){l.destroy(),r=null,l=null})}}}]),angular.module("mgcrea.ngStrap.select",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$select",function(){var e=this.defaults={animation:"am-fade",prefixClass:"select",placement:"bottom-left",template:"select/select.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,sort:!0,caretHtml:' ',placeholder:"Choose among the following...",maxLength:3,maxLengthHtml:"selected"};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=a.scope,u=i.$scope;u.$matches=[],u.$activeIndex=0,u.$isMultiple=l.multiple,u.$activate=function(e){u.$$postDigest(function(){i.activate(e)})},u.$select=function(e){u.$$postDigest(function(){i.select(e)})},u.$isVisible=function(){return i.$isVisible()},u.$isActive=function(e){return i.$isActive(e)},i.update=function(e){u.$matches=e,i.$updateActiveIndex()},i.activate=function(e){return l.multiple?(u.$activeIndex.sort(),i.$isActive(e)?u.$activeIndex.splice(u.$activeIndex.indexOf(e),1):u.$activeIndex.push(e),l.sort&&u.$activeIndex.sort()):u.$activeIndex=e,u.$activeIndex},i.select=function(e){var t=u.$matches[e].value;i.activate(e),n.$setViewValue(l.multiple?u.$activeIndex.map(function(e){return u.$matches[e].value}):t),n.$render(),s&&s.$digest(),l.multiple||i.hide(),u.$emit("$select.select",t,e)},i.$updateActiveIndex=function(){n.$modelValue&&u.$matches.length?u.$activeIndex=l.multiple&&angular.isArray(n.$modelValue)?n.$modelValue.map(function(e){return i.$getIndex(e)
+}):i.$getIndex(n.$modelValue):u.$activeIndex>=u.$matches.length&&(u.$activeIndex=l.multiple?[]:0)},i.$isVisible=function(){return l.minLength&&n?u.$matches.length&&n.$viewValue.length>=l.minLength:u.$matches.length},i.$isActive=function(e){return l.multiple?-1!==u.$activeIndex.indexOf(e):u.$activeIndex===e},i.$getIndex=function(e){var t=u.$matches.length,n=t;if(t){for(n=t;n--&&u.$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(),13===e.keyCode||9===e.keyCode)return i.select(u.$activeIndex);38===e.keyCode&&u.$activeIndex>0?u.$activeIndex--:40===e.keyCode&&u.$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()},!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.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,k,D,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),k=l(this.checkOffsets,c.debounce),h=i.$on("$viewContentLoaded",k),v=i.$on("$includeContentLoaded",k),k(),$&&(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,D=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.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",autoclose:!1,minTime:-1/0,maxTime:+1/0,length:5,hourStep:1,minuteStep:5};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.$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.$render()},d.$build=function(){var e,t,n=m.midIndex=parseInt(p.length/2,10),a=[];for(e=0;ep.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[2];if(s&&(37===e.keyCode?g=1>g?u-1:g-1:39===e.keyCode&&(g=u-1>g?g+1:0)),0===g){if(s)return o(0,a);38===e.keyCode?t.setHours(n-p.hourStep):40===e.keyCode&&t.setHours(n+p.hourStep)}else if(1===g){if(s)return o(a+1,a+1+l);38===e.keyCode?t.setMinutes(i-p.minuteStep):40===e.keyCode&&t.setMinutes(i+p.minuteStep)}else if(2===g){if(s)return o(a+1+l+1,a+1+l+3);d.switchMeridian()}d.select(t,g,!0),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 k=d.show;d.show=function(){k(),setTimeout(function(){d.$element.on(u?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.on("keydown",d.$onKeyDown)})};var D=d.hide;return d.hide=function(e){d.$element.off(u?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.off("keydown",d.$onKeyDown),D(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","useNative","hourStep","minuteStep"],function(e){angular.isDefined(n[e])&&(u[e]=n[e])}),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),!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(e,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):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",["ngAnimate","mgcrea.ngStrap.helpers.dimensions"]).provider("$tooltip",function(){var e=this.defaults={animation:"am-fade",prefixClass:"tooltip",prefixEvent:"tooltip",container:!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","$timeout","dimensions","$$rAF",function(n,a,o,i,r,l,s,u,c,d){function f(t,n){function i(){return"body"===u.container?c.offset(t[0]):c.position(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={},u=l.$options=angular.extend({},e,n);l.$promise=m(u.template);var f=l.$scope=u.scope&&u.scope.$new()||a.$new();u.delay&&angular.isString(u.delay)&&(u.delay=parseFloat(u.delay)),u.title&&(l.$scope.title=u.title),f.$hide=function(){f.$$postDigest(function(){l.hide()})},f.$show=function(){f.$$postDigest(function(){l.show()})},f.$toggle=function(){f.$$postDigest(function(){l.toggle()})},l.$isShown=f.$isShown=!1;var v,y;u.contentTemplate&&(l.$promise=l.$promise.then(function(e){var t=angular.element(e);return m(u.contentTemplate).then(function(e){var n=p('[ng-bind="content"]',t[0]);return n.length||(n=p('[ng-bind="title"]',t[0])),n.removeAttr("ng-bind").html(e),t[0].outerHTML})}));var w,b,k,D;return l.$promise.then(function(e){angular.isObject(e)&&(e=e.data),u.html&&(e=e.replace(h,'ng-bind-html="')),e=g.apply(e),k=e,w=o(e),l.init()}),l.init=function(){u.delay&&angular.isNumber(u.delay)&&(u.delay={show:u.delay,hide:u.delay}),"self"===u.container?D=t:u.container&&(D=p(u.container));var e=u.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),"hover"!==e&&t.on($?"touchstart":"mousedown",l.$onFocusElementMouseDown))}),u.show&&f.$$postDigest(function(){"focus"===u.trigger?t[0].focus():l.show()})},l.destroy=function(){for(var e=u.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),"hover"!==a&&t.off($?"touchstart":"mousedown",l.$onFocusElementMouseDown))}b&&(b.remove(),b=null),f.$destroy()},l.enter=function(){return clearTimeout(v),y="in",u.delay&&u.delay.show?void(v=setTimeout(function(){"in"===y&&l.show()},u.delay.show)):l.show()},l.show=function(){f.$emit(u.prefixEvent+".show.before",l);var e=u.container?D:null,n=u.container?null:t;b&&b.remove(),b=l.$element=w(f,function(){}),b.css({top:"0px",left:"0px",display:"block"}).addClass(u.placement),u.animation&&b.addClass(u.animation),u.type&&b.addClass(u.prefixClass+"-"+u.type),s.enter(b,e,n,function(){f.$emit(u.prefixEvent+".show",l)}),l.$isShown=f.$isShown=!0,f.$$phase||f.$root.$$phase||f.$digest(),d(l.$applyPlacement),u.keyboard&&("focus"!==u.trigger?(l.focus(),b.on("keyup",l.$onKeyUp)):t.on("keyup",l.$onFocusKeyUp))},l.leave=function(){return clearTimeout(v),y="out",u.delay&&u.delay.hide?void(v=setTimeout(function(){"out"===y&&l.hide()},u.delay.hide)):l.hide()},l.hide=function(e){return l.$isShown?(f.$emit(u.prefixEvent+".hide.before",l),s.leave(b,function(){f.$emit(u.prefixEvent+".hide",l)}),l.$isShown=f.$isShown=!1,f.$$phase||f.$root.$$phase||f.$digest(),u.keyboard&&null!==b&&b.off("keyup",l.$onKeyUp),e&&"focus"===u.trigger?t[0].blur():void 0):void 0},l.toggle=function(){l.$isShown?l.leave():l.enter()},l.focus=function(){b[0].focus()},l.$applyPlacement=function(){if(b){var e=i(),t=b.prop("offsetWidth"),n=b.prop("offsetHeight"),a=r(u.placement,e,t,n);a.top+="px",a.left+="px",b.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 p(e,n){return angular.element((n||t).querySelectorAll(e))}function m(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 g=String.prototype.trim,$="createTouch"in n.document,h=/ng-bind="/gi;return f}]}).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","delay","trigger","keyboard","html","animation","type"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title"],function(t){i[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);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",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){var o={},i=angular.extend({},e,n),r=i.controller;o=a(t,i);var l=n.scope,s=o.$scope;s.$matches=[],s.$activeIndex=0,s.$activate=function(e){s.$$postDigest(function(){o.activate(e)})},s.$select=function(e){s.$$postDigest(function(){o.select(e)})},s.$isVisible=function(){return o.$isVisible()},o.update=function(e){s.$matches=e,s.$activeIndex>=e.length&&(s.$activeIndex=0)},o.activate=function(e){s.$activeIndex=e},o.select=function(e){var n=s.$matches[e].value;r&&(r.$setViewValue(n),r.$render(),l&&l.$digest()),"focus"===i.trigger?t[0].blur():o.$isShown&&o.hide(),s.$activeIndex=0,s.$emit("$typeahead.select",n,e)},o.$isVisible=function(){return i.minLength&&r?s.$matches.length&&angular.isString(r.$viewValue)&&r.$viewValue.length>=i.minLength:!!s.$matches.length},o.$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}},o.$onMouseDown=function(e){e.preventDefault(),e.stopPropagation()},o.$onKeyDown=function(e){if(/(38|40|13)/.test(e.keyCode)){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode&&s.$matches.length)return o.select(s.$activeIndex);38===e.keyCode&&s.$activeIndex>0?s.$activeIndex--:40===e.keyCode&&s.$activeIndexu&&(e=e.slice(0,u)),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;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
diff --git a/dist/angular-strap.min.js.map b/dist/angular-strap.min.js.map
new file mode 100644
index 000000000..6af662904
--- /dev/null
+++ b/dist/angular-strap.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"angular-strap.min.js.map","sources":["angular-strap.min.js"],"names":["window","document","angular","module","provider","defaults","this","offsetTop","$get","$window","debounce","dimensions","AffixFactory","element","config","getRequiredAffixClass","unpin","position","elementHeight","scrollTop","getScrollTop","scrollHeight","getScrollHeight","top","offsetBottom","initialAffixTop","targetEl","pageYOffset","body","$affix","options","extend","target","reset","initialOffsetTop","affixed","parent","offsetParent","match","i","init","$parseOffsets","offset","on","checkPosition","checkPositionWithEventLoop","windowEl","$debouncedOnResize","destroy","off","setTimeout","height","affix","removeClass","addClass","css","offsetUnpin","bodyEl","offsetHeight","$onResize","directive","restrict","require","link","scope","attr","affixTarget","$element","forEach","key","isDefined","$on","controller","animation","prefixClass","placement","template","container","backdrop","keyboard","show","duration","type","$modal","$timeout","AlertFactory","$alert","$scope","hide","$location","$sce","requestAnimationFrame","$observe","newValue","trustAsHtml","bsAlert","$watch","isObject","content","alert","trigger","toggle","contentTemplate","html","AsideFactory","$aside","bsAside","aside","activeClass","toggleEvent","compile","removeAttr","children","querySelectorAll","child","childEl","ngModel","$button","$$rAF","constantValueRegExp","isInput","nodeName","activeElement","trueValue","test","$eval","falseValue","hasExoticValues","$parsers","push","viewValue","$render","isActive","equals","$modelValue","checked","toggleClass","bind","$apply","$setViewValue","hasClass","value","delay","useNative","dateType","dateFormat","strictFormat","autoclose","minDate","Infinity","maxDate","startView","minView","startWeek","$document","$rootScope","$locale","dateFilter","datepickerViews","$tooltip","DatepickerFactory","updateSelected","el","selected","$datepicker","$isSelected","date","focusElement","focus","parentScope","$options","pickerViews","$views","views","viewDate","$mode","$picker","$select","select","$selectPane","$toggleMode","setMode","length","update","isDate","isNaN","getTime","$date","call","$build","keep","$dateValue","Date","setFullYear","getFullYear","getMonth","getDate","year","month","mode","pristine","built","build","$updateSelected","l","rows","isSelected","steps","targetDate","UTC","day","getUTCFullYear","getUTCMonth","getUTCDate","$onMouseDown","evt","preventDefault","stopPropagation","isTouch","toLowerCase","triggerHandler","$onKeyDown","keyCode","shiftKey","altKey","onKeyDown","$digest","_init","isNative","prop","_destroy","_show","_hide","blur","navigator","userAgent","lang","id","$parse","$q","$dateParser","isNumeric","n","parseFloat","isFinite","datepicker","today","isString","substr","parseInt","dateParser","format","strict","unshift","$setValidity","parsedDate","parse","isValid","toISOString","$formatters","modelValue","isUndefined","NaN","val","split","arr","size","arrays","splice","mod","m","dayFormat","daySplit","picker","weekDaysMin","DATETIME_FORMATS","SHORTDAY","weekDaysLabels","slice","concat","weekDaysLabelsHtml","join","startDate","getTimezoneOffset","force","firstDayOfMonth","firstDayOfMonthOffset","firstDate","getDay","firstDateOffset","days","label","muted","disabled","isDisabled","title","labels","actualTime","name","months","lastDate","actualMonth","setMonth","firstYear","years","actualYear","setYear","Array","prototype","DropdownFactory","onBodyClick","$dropdown","$new","items","index","matchesSelector","eq","Element","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","bsDropdown","dropdown","proto","DateParserFactory","setMapForFormat","keys","Object","setFnMap","map","sortedMap","clonedFormat","search","v","escapeReservedSymbols","text","replace","regExpForFormat","regExpMap","re","RegExp","regex","setMap","sss","ss","s","mm","HH","H","hh","h","a","EEEE","DAY","EEE","dd","d","MMMM","MONTH","MMM","SHORTMONTH","MM","M","yyyy","yy","y","setMilliseconds","setSeconds","setMinutes","setHours","setDate","hours","getHours","indexOf","$format","baseDate","matches","exec","constant","func","wait","immediate","timeout","args","context","timestamp","result","arguments","later","last","apply","callNow","previous","leading","now","remaining","clearTimeout","trailing","factory","fn","extra","currentStyle","getComputedStyle","style","boxRect","getBoundingClientRect","docElement","ownerDocument","width","offsetWidth","documentElement","clientTop","left","pageXOffset","scrollLeft","clientLeft","offsetParentElement","offsetParentRect","outer","regexp","ParseOptionsFactory","parseValues","values","locals","valueName","displayFn","valueFn","$parseOptions","$values","keyName","groupByFn","valuesFn","$match","when","then","version","minor","dot","webkitRequestAnimationFrame","mozRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","cancel","supported","backdropAnimation","prefixEvent","$compile","$templateCache","$http","$animate","ModalFactory","hideOnBackdropClick","currentTarget","$promise","fetchTemplate","$hide","$$postDigest","$show","$toggle","templateEl","contentEl","findElement","next","remove","outerHTML","modalLinker","modalElement","backdropElement","data","htmlReplaceRegExp","trim","$destroy","$emit","after","display","enter","bodyElement","$isShown","$$phase","$root","$onKeyUp","leave","which","query","get","res","put","String","bsModal","modal","routeAttr","$navbar","copy","path","liElements","li","liElement","pattern","PopoverFactory","$popover","oldValue","popover","$applyPlacement","bsPopover","multiple","sort","caretHtml","placeholder","maxLength","maxLengthHtml","SelectFactory","$matches","$activeIndex","$isMultiple","$activate","activate","$isVisible","$isActive","$updateActiveIndex","isArray","$getIndex","minLength","$viewValue","inputEl","parsedOptions","ngOptions","watchedOptions","filter","spies","$$spies","throttle","ScrollSpyFactory","isWindowSpy","scrollEl","scrollId","$$count","unbindViewContentLoaded","unbindIncludeContentLoaded","activeTarget","debouncedCheckPosition","throttledCheckPosition","debouncedCheckOffsets","viewportHeight","$scrollspy","trackedElements","$trackedElements","sortedElements","checkOffsets","Math","max","innerHeight","docEl","$activateElement","$getTrackedElement","source","obj","trackedElement","targetElement","querySelector","b","trackElement","untrackElement","toDelete","scrollspy","run","$tab","templateUrl","bsTabs","panes","active","activePane","setActive","timeType","timeFormat","minTime","maxTime","hourStep","minuteStep","timepickerFactory","createSelection","start","end","createTextRange","selRange","collapse","moveStart","moveEnd","setSelectionRange","selectionStart","selectionEnd","$timepicker","selectedIndex","hour","meridian","minute","getMinutes","second","getSeconds","millisecond","getMilliseconds","formats","$moveIndex","$switchMeridian","switchMeridian","$isBuilt","midIndex","$isDisabled","minutes","showAM","isAM","selectedTime","newDate","hoursLength","minutesLength","lateralMove","count","timepicker","parsedTime","TooltipFactory","getPosition","getCalculatedOffset","actualWidth","actualHeight","hoverState","tipLinker","tipElement","tipTemplate","tipContainer","isNumber","triggers","$onFocusElementMouseDown","$onFocusKeyUp","elementPosition","tipWidth","tipHeight","tipPosition","tooltip","bsTooltip","limit","TypeaheadFactory","$typeahead","typeahead","$isEmpty"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/angular-strap.min.map b/dist/angular-strap.min.map
deleted file mode 100644
index 361d6e3eb..000000000
--- a/dist/angular-strap.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"angular-strap.min.js","sources":["angular-strap.js","angular-strap.tpl.js"],"names":["window","document","angular","module","provider","defaults","this","offsetTop","$get","$window","dimensions","AffixFactory","element","config","getRequiredAffixClass","unpin","position","elementHeight","scrollTop","getScrollTop","scrollHeight","getScrollHeight","top","offsetBottom","initialAffixTop","targetEl","pageYOffset","body","$affix","options","extend","target","reset","initialOffsetTop","affixed","parent","offsetParent","match","i","offset","css","height","init","on","checkPosition","checkPositionWithEventLoop","destroy","off","setTimeout","affix","removeClass","addClass","offsetUnpin","bodyEl","offsetHeight","directive","restrict","require","link","scope","attr","affixTarget","$element","forEach","key","isDefined","$on","controller","animation","prefixClass","placement","template","container","backdrop","keyboard","show","duration","type","$modal","$timeout","AlertFactory","$alert","$scope","hide","$location","$sce","requestAnimationFrame","$observe","newValue","trustAsHtml","bsAlert","$watch","isObject","content","alert","trigger","toggle","contentTemplate","html","AsideFactory","$aside","bsAside","aside","activeClass","toggleEvent","compile","removeAttr","children","querySelectorAll","child","childEl","ngModel","$button","$$animateReflow","constantValueRegExp","isInput","nodeName","activeElement","trueValue","test","$eval","falseValue","hasExoticValues","$parsers","push","viewValue","$render","isActive","equals","$modelValue","checked","toggleClass","bind","$apply","$setViewValue","hasClass","value","delay","useNative","dateType","dateFormat","strictFormat","autoclose","minDate","Infinity","maxDate","startView","minView","startWeek","$document","$rootScope","$locale","dateFilter","datepickerViews","$tooltip","DatepickerFactory","updateSelected","el","selected","$datepicker","$isSelected","date","focusElement","focus","parentScope","$options","pickerViews","$views","views","viewDate","$mode","$picker","$select","select","$selectPane","$toggleMode","setMode","length","update","isDate","isNaN","getTime","$date","call","$build","keep","$dateValue","Date","setFullYear","getFullYear","getMonth","getDate","year","month","mode","pristine","built","build","$updateSelected","l","rows","isSelected","steps","targetDate","UTC","day","getUTCFullYear","getUTCMonth","getUTCDate","$onMouseDown","evt","preventDefault","stopPropagation","isTouch","toLowerCase","triggerHandler","$onKeyDown","keyCode","shiftKey","altKey","onKeyDown","$digest","_init","isNative","prop","_destroy","_show","_hide","blur","navigator","userAgent","lang","id","$parse","$q","$dateParser","datepicker","today","isString","substr","dateParser","format","strict","unshift","$setValidity","parsedDate","parse","isValid","toISOString","$formatters","modelValue","isUndefined","val","split","arr","size","arrays","splice","dayFormat","daySplit","picker","weekDaysMin","DATETIME_FORMATS","SHORTDAY","weekDaysLabels","slice","concat","weekDaysLabelsHtml","join","startDate","getTimezoneOffset","force","firstDayOfMonth","firstDate","getDay","days","label","muted","disabled","isDisabled","title","labels","actualTime","name","months","lastDate","actualMonth","setMonth","parseInt","firstYear","years","actualYear","setYear","Array","prototype","DropdownFactory","onBodyClick","$dropdown","$new","items","index","matchesSelector","eq","Element","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","bsDropdown","dropdown","proto","DateParserFactory","setMapForFormat","keys","Object","setFnMap","map","sortedMap","clonedFormat","search","v","escapeReservedSymbols","text","replace","regExpForFormat","regExpMap","re","RegExp","regex","setMap","sss","ss","s","mm","m","HH","H","hh","h","a","EEEE","DAY","EEE","dd","d","MMMM","MONTH","MMM","SHORTMONTH","MM","M","yyyy","yy","setMilliseconds","setSeconds","setMinutes","setHours","setDate","hours","getHours","indexOf","y","$format","baseDate","matches","exec","constant","func","wait","immediate","timeout","args","context","timestamp","result","arguments","later","last","apply","callNow","previous","leading","now","remaining","clearTimeout","trailing","factory","fn","extra","currentStyle","getComputedStyle","style","parseFloat","boxRect","getBoundingClientRect","docElement","ownerDocument","width","offsetWidth","documentElement","clientTop","left","pageXOffset","scrollLeft","clientLeft","offsetParentElement","offsetParentRect","outer","regexp","ParseOptionsFactory","parseValues","values","locals","valueName","displayFn","valueFn","$parseOptions","$values","keyName","groupByFn","valuesFn","$match","when","then","backdropAnimation","$compile","$templateCache","$http","$animate","ModalFactory","hideOnBackdropClick","currentTarget","$promise","fetchTemplate","$hide","$$postDigest","$show","$toggle","templateEl","contentEl","findElement","next","remove","outerHTML","modalLinker","modalElement","backdropElement","data","htmlReplaceRegExp","trim","$destroy","after","display","enter","bodyElement","$isShown","$$phase","$onKeyUp","leave","which","query","get","res","put","String","bsModal","modal","routeAttr","$navbar","copy","path","liElements","li","liElement","pattern","PopoverFactory","$popover","oldValue","popover","$applyPlacement","bsPopover","spies","$$spies","debounce","throttle","ScrollSpyFactory","isWindowSpy","scrollEl","windowEl","scrollId","$$count","unbindViewContentLoaded","unbindIncludeContentLoaded","activeTarget","debouncedCheckPosition","throttledCheckPosition","debouncedCheckOffsets","viewportHeight","$scrollspy","trackedElements","$trackedElements","sortedElements","checkOffsets","Math","max","innerHeight","docEl","$activateElement","$getTrackedElement","source","filter","obj","trackedElement","targetElement","querySelector","sort","b","trackElement","untrackElement","toDelete","activate","scrollspy","multiple","caretHtml","placeholder","maxLength","maxLengthHtml","SelectFactory","$matches","$activeIndex","$isMultiple","$activate","$isVisible","$isActive","$updateActiveIndex","$emit","isArray","$getIndex","minLength","$viewValue","inputEl","parsedOptions","ngOptions","watchedOptions","run","$tab","templateUrl","bsTabs","panes","active","activePane","setActive","timeType","timeFormat","minTime","maxTime","hourStep","minuteStep","timepickerFactory","createSelection","start","end","createTextRange","selRange","collapse","moveStart","moveEnd","setSelectionRange","selectionStart","selectionEnd","$timepicker","selectedIndex","hour","meridian","minute","getMinutes","second","getSeconds","millisecond","getMilliseconds","formats","$moveIndex","$switchMeridian","switchMeridian","$isBuilt","midIndex","$isDisabled","minutes","showAM","isAM","selectedTime","newDate","hoursLength","minutesLength","lateralMove","count","timepicker","parsedTime","TooltipFactory","getPosition","getCalculatedOffset","actualWidth","actualHeight","hoverState","tipLinker","tipElement","tipTemplate","tipContainer","isNumber","triggers","$onFocusElementMouseDown","$onFocusKeyUp","elementPosition","tipWidth","tipHeight","tipPosition","tooltip","bsTooltip","limit","TypeaheadFactory","$typeahead","typeahead"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/angular-strap.tpl.js b/dist/angular-strap.tpl.js
index dc066ac7e..004b55432 100644
--- a/dist/angular-strap.tpl.js
+++ b/dist/angular-strap.tpl.js
@@ -1,98 +1,100 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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(window, document, undefined) {
'use strict';
-// Source: dist/modules/alert.tpl.js
-angular.module('mgcrea.ngStrap.alert').run(['$templateCache', function($templateCache) {
-$templateCache.put('alert/alert.tpl.html',
- "×
"
- );
-}]);
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/alert/alert.tpl.js
+angular.module('mgcrea.ngStrap.alert').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('alert/alert.tpl.html', '×
');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/aside/aside.tpl.js
+angular.module('mgcrea.ngStrap.aside').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('aside/aside.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/datepicker/datepicker.tpl.js
+angular.module('mgcrea.ngStrap.datepicker').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('datepicker/datepicker.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/dropdown/dropdown.tpl.js
+angular.module('mgcrea.ngStrap.dropdown').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('dropdown/dropdown.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/modal/modal.tpl.js
+angular.module('mgcrea.ngStrap.modal').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('modal/modal.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/popover/popover.tpl.js
+angular.module('mgcrea.ngStrap.popover').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('popover/popover.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/select/select.tpl.js
+angular.module('mgcrea.ngStrap.select').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('select/select.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/tab/tab.tpl.js
+angular.module('mgcrea.ngStrap.tab').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('tab/tab.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/timepicker/timepicker.tpl.js
+angular.module('mgcrea.ngStrap.timepicker').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('timepicker/timepicker.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/tooltip/tooltip.tpl.js
+angular.module('mgcrea.ngStrap.tooltip').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('tooltip/tooltip.tpl.html', '');
+ }
+]);
+
+// Source: /Users/olivier/Dropbox/Projects/angular-strap/src/typeahead/typeahead.tpl.js
+angular.module('mgcrea.ngStrap.typeahead').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('typeahead/typeahead.tpl.html', '');
+ }
+]);
-// Source: dist/modules/aside.tpl.js
-angular.module('mgcrea.ngStrap.aside').run(['$templateCache', function($templateCache) {
-$templateCache.put('aside/aside.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/datepicker.tpl.js
-angular.module('mgcrea.ngStrap.datepicker').run(['$templateCache', function($templateCache) {
-$templateCache.put('datepicker/datepicker.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/dropdown.tpl.js
-angular.module('mgcrea.ngStrap.dropdown').run(['$templateCache', function($templateCache) {
-$templateCache.put('dropdown/dropdown.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/modal.tpl.js
-angular.module('mgcrea.ngStrap.modal').run(['$templateCache', function($templateCache) {
-$templateCache.put('modal/modal.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/popover.tpl.js
-angular.module('mgcrea.ngStrap.popover').run(['$templateCache', function($templateCache) {
-$templateCache.put('popover/popover.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/select.tpl.js
-angular.module('mgcrea.ngStrap.select').run(['$templateCache', function($templateCache) {
-$templateCache.put('select/select.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/tab.tpl.js
-angular.module('mgcrea.ngStrap.tab').run(['$templateCache', function($templateCache) {
-$templateCache.put('tab/tab.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/timepicker.tpl.js
-angular.module('mgcrea.ngStrap.timepicker').run(['$templateCache', function($templateCache) {
-$templateCache.put('timepicker/timepicker.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/tooltip.tpl.js
-angular.module('mgcrea.ngStrap.tooltip').run(['$templateCache', function($templateCache) {
-$templateCache.put('tooltip/tooltip.tpl.html',
- ""
- );
-
-}]);
-
-// Source: dist/modules/typeahead.tpl.js
-angular.module('mgcrea.ngStrap.typeahead').run(['$templateCache', function($templateCache) {
-$templateCache.put('typeahead/typeahead.tpl.html',
- ""
- );
-
-}]);
})(window, document);
diff --git a/dist/angular-strap.tpl.min.js b/dist/angular-strap.tpl.min.js
index 42fcc29ea..4a04c779d 100644
--- a/dist/angular-strap.tpl.min.js
+++ b/dist/angular-strap.tpl.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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(a){a.put("alert/alert.tpl.html",'×
')}]),angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(a){a.put("aside/aside.tpl.html",'')}]),angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(a){a.put("datepicker/datepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.dropdown").run(["$templateCache",function(a){a.put("dropdown/dropdown.tpl.html",'')}]),angular.module("mgcrea.ngStrap.modal").run(["$templateCache",function(a){a.put("modal/modal.tpl.html",'')}]),angular.module("mgcrea.ngStrap.popover").run(["$templateCache",function(a){a.put("popover/popover.tpl.html",'')}]),angular.module("mgcrea.ngStrap.select").run(["$templateCache",function(a){a.put("select/select.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tab").run(["$templateCache",function(a){a.put("tab/tab.tpl.html",'')}]),angular.module("mgcrea.ngStrap.timepicker").run(["$templateCache",function(a){a.put("timepicker/timepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tooltip").run(["$templateCache",function(a){a.put("tooltip/tooltip.tpl.html",'')}]),angular.module("mgcrea.ngStrap.typeahead").run(["$templateCache",function(a){a.put("typeahead/typeahead.tpl.html",'')}])}(window,document);
-//# sourceMappingURL=angular-strap.tpl.min.map
\ 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.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
diff --git a/dist/angular-strap.tpl.min.js.map b/dist/angular-strap.tpl.min.js.map
new file mode 100644
index 000000000..fd30df8b3
--- /dev/null
+++ b/dist/angular-strap.tpl.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"angular-strap.tpl.min.js.map","sources":["angular-strap.tpl.min.js"],"names":["angular","module","run","$templateCache","put","window","document"],"mappings":"CAOA,WACA,YAGAA,SAAQC,OAAO,wBAAwBC,KACrC,iBACA,SAAUC,GACRA,EAAeC,IAAI,uBAAwB,gQAK/CJ,QAAQC,OAAO,wBAAwBC,KACrC,iBACA,SAAUC,GACRA,EAAeC,IAAI,uBAAwB,gcAK/CJ,QAAQC,OAAO,6BAA6BC,KAC1C,iBACA,SAAUC,GACRA,EAAeC,IAAI,iCAAkC,gtCAKzDJ,QAAQC,OAAO,2BAA2BC,KACxC,iBACA,SAAUC,GACRA,EAAeC,IAAI,6BAA8B,6aAKrDJ,QAAQC,OAAO,wBAAwBC,KACrC,iBACA,SAAUC,GACRA,EAAeC,IAAI,uBAAwB,gcAK/CJ,QAAQC,OAAO,0BAA0BC,KACvC,iBACA,SAAUC,GACRA,EAAeC,IAAI,2BAA4B,+KAKnDJ,QAAQC,OAAO,yBAAyBC,KACtC,iBACA,SAAUC,GACRA,EAAeC,IAAI,yBAA0B,gaAKjDJ,QAAQC,OAAO,sBAAsBC,KACnC,iBACA,SAAUC,GACRA,EAAeC,IAAI,mBAAoB,iYAK3CJ,QAAQC,OAAO,6BAA6BC,KAC1C,iBACA,SAAUC,GACRA,EAAeC,IAAI,iCAAkC,olEAKzDJ,QAAQC,OAAO,0BAA0BC,KACvC,iBACA,SAAUC,GACRA,EAAeC,IAAI,2BAA4B,uIAKnDJ,QAAQC,OAAO,4BAA4BC,KACzC,iBACA,SAAUC,GACRA,EAAeC,IAAI,+BAAgC,ySAKpDC,OAAQC"}
\ No newline at end of file
diff --git a/dist/angular-strap.tpl.min.map b/dist/angular-strap.tpl.min.map
deleted file mode 100644
index 280392631..000000000
--- a/dist/angular-strap.tpl.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"angular-strap.tpl.min.js","sources":["angular-strap.tpl.js"],"names":["angular","module","run","$templateCache","put","window","document"],"mappings":"CAAA,WACA,YAEAA,SAAQC,OAAO,wBAAwBC,KAAK,iBAAkB,SAASC,GACvEA,EAAeC,IAAI,uBACf,gQAMJJ,QAAQC,OAAO,wBAAwBC,KAAK,iBAAkB,SAASC,GACvEA,EAAeC,IAAI,uBACf,gcAMJJ,QAAQC,OAAO,6BAA6BC,KAAK,iBAAkB,SAASC,GAC5EA,EAAeC,IAAI,iCACf,gtCAMJJ,QAAQC,OAAO,2BAA2BC,KAAK,iBAAkB,SAASC,GAC1EA,EAAeC,IAAI,6BACf,6aAMJJ,QAAQC,OAAO,wBAAwBC,KAAK,iBAAkB,SAASC,GACvEA,EAAeC,IAAI,uBACf,gcAMJJ,QAAQC,OAAO,0BAA0BC,KAAK,iBAAkB,SAASC,GACzEA,EAAeC,IAAI,2BACf,+KAMJJ,QAAQC,OAAO,yBAAyBC,KAAK,iBAAkB,SAASC,GACxEA,EAAeC,IAAI,yBACf,gaAMJJ,QAAQC,OAAO,sBAAsBC,KAAK,iBAAkB,SAASC,GACrEA,EAAeC,IAAI,mBACf,iYAMJJ,QAAQC,OAAO,6BAA6BC,KAAK,iBAAkB,SAASC,GAC5EA,EAAeC,IAAI,iCACf,olEAMJJ,QAAQC,OAAO,0BAA0BC,KAAK,iBAAkB,SAASC,GACzEA,EAAeC,IAAI,2BACf,uIAMJJ,QAAQC,OAAO,4BAA4BC,KAAK,iBAAkB,SAASC,GAC3EA,EAAeC,IAAI,+BACf,ySAKDC,OAAQC"}
\ No newline at end of file
diff --git a/dist/modules/affix.js b/dist/modules/affix.js
index 61f5267bb..20eff6d3f 100644
--- a/dist/modules/affix.js
+++ b/dist/modules/affix.js
@@ -1,25 +1,30 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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.affix', ['mgcrea.ngStrap.helpers.dimensions']).provider('$affix', function () {
+angular.module('mgcrea.ngStrap.affix', [
+ 'mgcrea.ngStrap.helpers.dimensions',
+ 'mgcrea.ngStrap.helpers.debounce'
+]).provider('$affix', function () {
var defaults = this.defaults = { offsetTop: 'auto' };
this.$get = [
'$window',
+ 'debounce',
'dimensions',
- function ($window, dimensions) {
+ function ($window, debounce, dimensions) {
var bodyEl = angular.element($window.document.body);
+ var windowEl = angular.element($window);
function AffixFactory(element, config) {
var $affix = {};
// Common vars
var options = angular.extend({}, defaults, config);
var targetEl = options.target;
// Initial private vars
- var reset = 'affix affix-top affix-bottom', initialAffixTop = 0, initialOffsetTop = 0, affixed = null, unpin = null;
+ var reset = 'affix affix-top affix-bottom', initialAffixTop = 0, initialOffsetTop = 0, offsetTop = 0, offsetBottom = 0, affixed = null, unpin = null;
var parent = element.parent();
// Options: custom parent
if (options.offsetParent) {
@@ -31,49 +36,26 @@ angular.module('mgcrea.ngStrap.affix', ['mgcrea.ngStrap.helpers.dimensions']).pr
parent = angular.element(options.offsetParent);
}
}
- // Options: offsets
- var offsetTop = 0;
- if (options.offsetTop) {
- if (options.offsetTop === 'auto') {
- options.offsetTop = '+0';
- }
- if (options.offsetTop.match(/^[-+]\d+$/)) {
- initialAffixTop -= options.offsetTop * 1;
- if (options.offsetParent) {
- offsetTop = dimensions.offset(parent[0]).top + options.offsetTop * 1;
- } else {
- offsetTop = dimensions.offset(element[0]).top - dimensions.css(element[0], 'marginTop', true) + options.offsetTop * 1;
- }
- } else {
- offsetTop = options.offsetTop * 1;
- }
- }
- var offsetBottom = 0;
- if (options.offsetBottom) {
- if (options.offsetParent && options.offsetBottom.match(/^[-+]\d+$/)) {
- // add 1 pixel due to rounding problems...
- offsetBottom = getScrollHeight() - (dimensions.offset(parent[0]).top + dimensions.height(parent[0])) + options.offsetBottom * 1 + 1;
- } else {
- offsetBottom = options.offsetBottom * 1;
- }
- }
$affix.init = function () {
+ $affix.$parseOffsets();
initialOffsetTop = dimensions.offset(element[0]).top + initialAffixTop;
// Bind events
- targetEl.on('scroll', this.checkPosition);
- targetEl.on('click', this.checkPositionWithEventLoop);
+ targetEl.on('scroll', $affix.checkPosition);
+ targetEl.on('click', $affix.checkPositionWithEventLoop);
+ windowEl.on('resize', $affix.$debouncedOnResize);
// Both of these checkPosition() calls are necessary for the case where
// the user hits refresh after scrolling to the bottom of the page.
- this.checkPosition();
- this.checkPositionWithEventLoop();
+ $affix.checkPosition();
+ $affix.checkPositionWithEventLoop();
};
$affix.destroy = function () {
// Unbind events
- targetEl.off('scroll', this.checkPosition);
- targetEl.off('click', this.checkPositionWithEventLoop);
+ targetEl.off('scroll', $affix.checkPosition);
+ targetEl.off('click', $affix.checkPositionWithEventLoop);
+ windowEl.off('resize', $affix.$debouncedOnResize);
};
$affix.checkPositionWithEventLoop = function () {
- setTimeout(this.checkPosition, 1);
+ setTimeout($affix.checkPosition, 1);
};
$affix.checkPosition = function () {
// if (!this.$element.is(':visible')) return
@@ -109,6 +91,38 @@ angular.module('mgcrea.ngStrap.affix', ['mgcrea.ngStrap.helpers.dimensions']).pr
element.css('top', initialAffixTop + 'px');
}
};
+ $affix.$onResize = function () {
+ $affix.$parseOffsets();
+ $affix.checkPosition();
+ };
+ $affix.$debouncedOnResize = debounce($affix.$onResize, 50);
+ $affix.$parseOffsets = function () {
+ // Reset position to calculate correct offsetTop
+ element.css('position', options.offsetParent ? '' : 'relative');
+ if (options.offsetTop) {
+ if (options.offsetTop === 'auto') {
+ options.offsetTop = '+0';
+ }
+ if (options.offsetTop.match(/^[-+]\d+$/)) {
+ initialAffixTop = -options.offsetTop * 1;
+ if (options.offsetParent) {
+ offsetTop = dimensions.offset(parent[0]).top + options.offsetTop * 1;
+ } else {
+ offsetTop = dimensions.offset(element[0]).top - dimensions.css(element[0], 'marginTop', true) + options.offsetTop * 1;
+ }
+ } else {
+ offsetTop = options.offsetTop * 1;
+ }
+ }
+ if (options.offsetBottom) {
+ if (options.offsetParent && options.offsetBottom.match(/^[-+]\d+$/)) {
+ // add 1 pixel due to rounding problems...
+ offsetBottom = getScrollHeight() - (dimensions.offset(parent[0]).top + dimensions.height(parent[0])) + options.offsetBottom * 1 + 1;
+ } else {
+ offsetBottom = options.offsetBottom * 1;
+ }
+ }
+ };
// Private methods
function getRequiredAffixClass(unpin, position, elementHeight) {
var scrollTop = getScrollTop();
diff --git a/dist/modules/affix.min.js b/dist/modules/affix.min.js
index eb7f5dfd1..2f80c3ffe 100644
--- a/dist/modules/affix.min.js
+++ b/dist/modules/affix.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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.affix",["mgcrea.ngStrap.helpers.dimensions"]).provider("$affix",function(){var a=this.defaults={offsetTop:"auto"};this.$get=["$window","dimensions",function(b,c){function d(d,f){function g(a,b,c){var d=h(),e=i();return t>=d?"top":null!==a&&d+a<=b.top?"middle":null!==u&&b.top+c+n>=e-u?"bottom":"middle"}function h(){return l[0]===b?b.pageYOffset:l[0]===b}function i(){return l[0]===b?b.document.body.scrollHeight:l[0].scrollHeight}var j={},k=angular.extend({},a,f),l=k.target,m="affix affix-top affix-bottom",n=0,o=0,p=null,q=null,r=d.parent();if(k.offsetParent)if(k.offsetParent.match(/^\d+$/))for(var s=0;s<1*k.offsetParent-1;s++)r=r.parent();else r=angular.element(k.offsetParent);var t=0;k.offsetTop&&("auto"===k.offsetTop&&(k.offsetTop="+0"),k.offsetTop.match(/^[-+]\d+$/)?(n-=1*k.offsetTop,t=k.offsetParent?c.offset(r[0]).top+1*k.offsetTop:c.offset(d[0]).top-c.css(d[0],"marginTop",!0)+1*k.offsetTop):t=1*k.offsetTop);var u=0;return k.offsetBottom&&(u=k.offsetParent&&k.offsetBottom.match(/^[-+]\d+$/)?i()-(c.offset(r[0]).top+c.height(r[0]))+1*k.offsetBottom+1:1*k.offsetBottom),j.init=function(){o=c.offset(d[0]).top+n,l.on("scroll",this.checkPosition),l.on("click",this.checkPositionWithEventLoop),this.checkPosition(),this.checkPositionWithEventLoop()},j.destroy=function(){l.off("scroll",this.checkPosition),l.off("click",this.checkPositionWithEventLoop)},j.checkPositionWithEventLoop=function(){setTimeout(this.checkPosition,1)},j.checkPosition=function(){var a=h(),b=c.offset(d[0]),f=c.height(d[0]),i=g(q,b,f);p!==i&&(p=i,d.removeClass(m).addClass("affix"+("middle"!==i?"-"+i:"")),"top"===i?(q=null,d.css("position",k.offsetParent?"":"relative"),d.css("top","")):"bottom"===i?(q=k.offsetUnpin?-(1*k.offsetUnpin):b.top-a,d.css("position",k.offsetParent?"":"relative"),d.css("top",k.offsetParent?"":e[0].offsetHeight-u-f-o+"px")):(q=null,d.css("position","fixed"),d.css("top",n+"px")))},j.init(),j}var e=angular.element(b.document.body);return d}]}).directive("bsAffix",["$affix","$window",function(a,b){return{restrict:"EAC",require:"^?bsAffixTarget",link:function(c,d,e,f){var g={scope:c,offsetTop:"auto",target:f?f.$element:angular.element(b)};angular.forEach(["offsetTop","offsetBottom","offsetParent","offsetUnpin"],function(a){angular.isDefined(e[a])&&(g[a]=e[a])});var h=a(d,g);c.$on("$destroy",function(){g=null,h=null})}}}]).directive("bsAffixTarget",function(){return{controller:["$element",function(a){this.$element=a}]}});
-//# sourceMappingURL=affix.min.map
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.affix",["mgcrea.ngStrap.helpers.dimensions","mgcrea.ngStrap.helpers.debounce"]).provider("$affix",function(){var t=this.defaults={offsetTop:"auto"};this.$get=["$window","debounce","dimensions",function(e,o,n){function f(f,r){function c(t,e,o){var n=a(),f=l();return P>=n?"top":null!==t&&n+t<=e.top?"middle":null!==$&&e.top+o+h>=f-$?"bottom":"middle"}function a(){return d[0]===e?e.pageYOffset:d[0]===e}function l(){return d[0]===e?e.document.body.scrollHeight:d[0].scrollHeight}var u={},p=angular.extend({},t,r),d=p.target,m="affix affix-top affix-bottom",h=0,g=0,P=0,$=0,v=null,T=null,x=f.parent();if(p.offsetParent)if(p.offsetParent.match(/^\d+$/))for(var b=0;b<1*p.offsetParent-1;b++)x=x.parent();else x=angular.element(p.offsetParent);return u.init=function(){u.$parseOffsets(),g=n.offset(f[0]).top+h,d.on("scroll",u.checkPosition),d.on("click",u.checkPositionWithEventLoop),i.on("resize",u.$debouncedOnResize),u.checkPosition(),u.checkPositionWithEventLoop()},u.destroy=function(){d.off("scroll",u.checkPosition),d.off("click",u.checkPositionWithEventLoop),i.off("resize",u.$debouncedOnResize)},u.checkPositionWithEventLoop=function(){setTimeout(u.checkPosition,1)},u.checkPosition=function(){var t=a(),e=n.offset(f[0]),o=n.height(f[0]),i=c(T,e,o);v!==i&&(v=i,f.removeClass(m).addClass("affix"+("middle"!==i?"-"+i:"")),"top"===i?(T=null,f.css("position",p.offsetParent?"":"relative"),f.css("top","")):"bottom"===i?(T=p.offsetUnpin?-(1*p.offsetUnpin):e.top-t,f.css("position",p.offsetParent?"":"relative"),f.css("top",p.offsetParent?"":s[0].offsetHeight-$-o-g+"px")):(T=null,f.css("position","fixed"),f.css("top",h+"px")))},u.$onResize=function(){u.$parseOffsets(),u.checkPosition()},u.$debouncedOnResize=o(u.$onResize,50),u.$parseOffsets=function(){f.css("position",p.offsetParent?"":"relative"),p.offsetTop&&("auto"===p.offsetTop&&(p.offsetTop="+0"),p.offsetTop.match(/^[-+]\d+$/)?(h=1*-p.offsetTop,P=p.offsetParent?n.offset(x[0]).top+1*p.offsetTop:n.offset(f[0]).top-n.css(f[0],"marginTop",!0)+1*p.offsetTop):P=1*p.offsetTop),p.offsetBottom&&($=p.offsetParent&&p.offsetBottom.match(/^[-+]\d+$/)?l()-(n.offset(x[0]).top+n.height(x[0]))+1*p.offsetBottom+1:1*p.offsetBottom)},u.init(),u}var s=angular.element(e.document.body),i=angular.element(e);return f}]}).directive("bsAffix",["$affix","$window",function(t,e){return{restrict:"EAC",require:"^?bsAffixTarget",link:function(o,n,f,s){var i={scope:o,offsetTop:"auto",target:s?s.$element:angular.element(e)};angular.forEach(["offsetTop","offsetBottom","offsetParent","offsetUnpin"],function(t){angular.isDefined(f[t])&&(i[t]=f[t])});var r=t(n,i);o.$on("$destroy",function(){i=null,r=null})}}}]).directive("bsAffixTarget",function(){return{controller:["$element",function(t){this.$element=t}]}});
\ No newline at end of file
diff --git a/dist/modules/affix.min.js.map b/dist/modules/affix.min.js.map
new file mode 100644
index 000000000..5ede65e93
--- /dev/null
+++ b/dist/modules/affix.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"affix.min.js.map","sources":["affix.min.js"],"names":["angular","module","provider","defaults","this","offsetTop","$get","$window","debounce","dimensions","AffixFactory","element","config","getRequiredAffixClass","unpin","position","elementHeight","scrollTop","getScrollTop","scrollHeight","getScrollHeight","top","offsetBottom","initialAffixTop","targetEl","pageYOffset","document","body","$affix","options","extend","target","reset","initialOffsetTop","affixed","parent","offsetParent","match","i","init","$parseOffsets","offset","on","checkPosition","checkPositionWithEventLoop","windowEl","$debouncedOnResize","destroy","off","setTimeout","height","affix","removeClass","addClass","css","offsetUnpin","bodyEl","offsetHeight","$onResize","directive","restrict","require","link","scope","attr","affixTarget","$element","forEach","key","isDefined","$on","controller"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/modules/affix.min.map b/dist/modules/affix.min.map
deleted file mode 100644
index e45689b16..000000000
--- a/dist/modules/affix.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"affix.min.js","sources":["affix.js"],"names":["angular","module","provider","defaults","this","offsetTop","$get","$window","dimensions","AffixFactory","element","config","getRequiredAffixClass","unpin","position","elementHeight","scrollTop","getScrollTop","scrollHeight","getScrollHeight","top","offsetBottom","initialAffixTop","targetEl","pageYOffset","document","body","$affix","options","extend","target","reset","initialOffsetTop","affixed","parent","offsetParent","match","i","offset","css","height","init","on","checkPosition","checkPositionWithEventLoop","destroy","off","setTimeout","affix","removeClass","addClass","offsetUnpin","bodyEl","offsetHeight","directive","restrict","require","link","scope","attr","affixTarget","$element","forEach","key","isDefined","$on","controller"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/modules/alert.js b/dist/modules/alert.js
index b576fcb0e..0cd495c53 100644
--- a/dist/modules/alert.js
+++ b/dist/modules/alert.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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,7 +9,7 @@
// @BUG: following snippet won't compile correctly
// @TODO: submit issue to core
// ' ' +
-angular.module('mgcrea.ngStrap.alert', []).provider('$alert', function () {
+angular.module('mgcrea.ngStrap.alert', ['mgcrea.ngStrap.modal']).provider('$alert', function () {
var defaults = this.defaults = {
animation: 'am-fade',
prefixClass: 'alert',
diff --git a/dist/modules/alert.min.js b/dist/modules/alert.min.js
index 87d9c5c88..ed9f635ba 100644
--- a/dist/modules/alert.min.js
+++ b/dist/modules/alert.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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.alert",[]).provider("$alert",function(){var a=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};this.$get=["$modal","$timeout",function(b,c){function d(d){var e={},f=angular.extend({},a,d);e=b(f),f.type&&(e.$scope.type=f.type);var g=e.show;return f.duration&&(e.show=function(){g(),c(function(){e.hide()},1e3*f.duration)}),e}return d}]}).directive("bsAlert",["$window","$location","$sce","$alert",function(a,b,c,d){a.requestAnimationFrame||a.setTimeout;return{restrict:"EAC",scope:!0,link:function(a,b,e){var f={scope:a,element:b,show:!1};angular.forEach(["template","placement","keyboard","html","container","animation","duration"],function(a){angular.isDefined(e[a])&&(f[a]=e[a])}),angular.forEach(["title","content","type"],function(b){e[b]&&e.$observe(b,function(d){a[b]=c.trustAsHtml(d)})}),e.bsAlert&&a.$watch(e.bsAlert,function(b){angular.isObject(b)?angular.extend(a,b):a.content=b},!0);var g=d(f);b.on(e.trigger||"click",g.toggle),a.$on("$destroy",function(){g.destroy(),f=null,g=null})}}}]),angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(a){a.put("alert/alert.tpl.html",'×
')}]);
-//# sourceMappingURL=alert.min.map
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.alert",["mgcrea.ngStrap.modal"]).provider("$alert",function(){var t=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};this.$get=["$modal","$timeout",function(e,n){function a(a){var r={},o=angular.extend({},t,a);r=e(o),o.type&&(r.$scope.type=o.type);var i=r.show;return o.duration&&(r.show=function(){i(),n(function(){r.hide()},1e3*o.duration)}),r}return a}]}).directive("bsAlert",["$window","$location","$sce","$alert",function(t,e,n,a){t.requestAnimationFrame||t.setTimeout;return{restrict:"EAC",scope:!0,link:function(t,e,r){var o={scope:t,element:e,show:!1};angular.forEach(["template","placement","keyboard","html","container","animation","duration"],function(t){angular.isDefined(r[t])&&(o[t]=r[t])}),angular.forEach(["title","content","type"],function(e){r[e]&&r.$observe(e,function(a){t[e]=n.trustAsHtml(a)})}),r.bsAlert&&t.$watch(r.bsAlert,function(e){angular.isObject(e)?angular.extend(t,e):t.content=e},!0);var i=a(o);e.on(r.trigger||"click",i.toggle),t.$on("$destroy",function(){i.destroy(),o=null,i=null})}}}]);
\ No newline at end of file
diff --git a/dist/modules/alert.min.js.map b/dist/modules/alert.min.js.map
new file mode 100644
index 000000000..a0f1438f8
--- /dev/null
+++ b/dist/modules/alert.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"alert.min.js.map","sources":["alert.min.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","container","element","backdrop","keyboard","show","duration","type","$get","$modal","$timeout","AlertFactory","config","$alert","options","extend","$scope","hide","directive","$window","$location","$sce","requestAnimationFrame","setTimeout","restrict","scope","link","attr","forEach","key","isDefined","$observe","newValue","trustAsHtml","bsAlert","$watch","isObject","content","alert","on","trigger","toggle","$on","destroy"],"mappings":"AAOA,YAIAA,SAAQC,OAAO,wBAAyB,yBAAyBC,SAAS,SAAU,WAClF,GAAIC,GAAWC,KAAKD,UAChBE,UAAW,UACXC,YAAa,QACbC,UAAW,KACXC,SAAU,uBACVC,WAAW,EACXC,QAAS,KACTC,UAAU,EACVC,UAAU,EACVC,MAAM,EACNC,UAAU,EACVC,MAAM,EAEVX,MAAKY,MACH,SACA,WACA,SAAUC,EAAQC,GAChB,QAASC,GAAaC,GACpB,GAAIC,MAEAC,EAAUtB,QAAQuB,UAAWpB,EAAUiB,EAC3CC,GAASJ,EAAOK,GAEZA,EAAQP,OACVM,EAAOG,OAAOT,KAAOO,EAAQP,KAG/B,IAAIF,GAAOQ,EAAOR,IASlB,OARIS,GAAQR,WACVO,EAAOR,KAAO,WACZA,IACAK,EAAS,WACPG,EAAOI,QACa,IAAnBH,EAAQR,YAGRO,EAET,MAAOF,OAGVO,UAAU,WACX,UACA,YACA,OACA,SACA,SAAUC,EAASC,EAAWC,EAAMR,GACNM,EAAQG,uBAAyBH,EAAQI,UACrE,QACEC,SAAU,MACVC,OAAO,EACPC,KAAM,SAAkBD,EAAOvB,EAASyB,GAEtC,GAAIb,IACAW,MAAOA,EACPvB,QAASA,EACTG,MAAM,EAEVb,SAAQoC,SACN,WACA,YACA,WACA,OACA,YACA,YACA,YACC,SAAUC,GACPrC,QAAQsC,UAAUH,EAAKE,MACzBf,EAAQe,GAAOF,EAAKE,MAGxBrC,QAAQoC,SACN,QACA,UACA,QACC,SAAUC,GACXF,EAAKE,IAAQF,EAAKI,SAASF,EAAK,SAAUG,GACxCP,EAAMI,GAAOR,EAAKY,YAAYD,OAIlCL,EAAKO,SAAWT,EAAMU,OAAOR,EAAKO,QAAS,SAAUF,GAC/CxC,QAAQ4C,SAASJ,GACnBxC,QAAQuB,OAAOU,EAAOO,GAEtBP,EAAMY,QAAUL,IAEjB,EAEH,IAAIM,GAAQzB,EAAOC,EAEnBZ,GAAQqC,GAAGZ,EAAKa,SAAW,QAASF,EAAMG,QAE1ChB,EAAMiB,IAAI,WAAY,WACpBJ,EAAMK,UACN7B,EAAU,KACVwB,EAAQ"}
\ No newline at end of file
diff --git a/dist/modules/alert.min.map b/dist/modules/alert.min.map
deleted file mode 100644
index 3689df200..000000000
--- a/dist/modules/alert.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"alert.min.js","sources":["alert.js","alert.tpl.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","container","element","backdrop","keyboard","show","duration","type","$get","$modal","$timeout","AlertFactory","config","$alert","options","extend","$scope","hide","directive","$window","$location","$sce","requestAnimationFrame","setTimeout","restrict","scope","link","attr","forEach","key","isDefined","$observe","newValue","trustAsHtml","bsAlert","$watch","isObject","content","alert","on","trigger","toggle","$on","destroy","run","$templateCache","put"],"mappings":"AAAA,YAIAA,SAAQC,OAAO,2BAA4BC,SAAS,SAAU,WAC5D,GAAIC,GAAWC,KAAKD,UAChBE,UAAW,UACXC,YAAa,QACbC,UAAW,KACXC,SAAU,uBACVC,WAAW,EACXC,QAAS,KACTC,UAAU,EACVC,UAAU,EACVC,MAAM,EACNC,UAAU,EACVC,MAAM,EAEVX,MAAKY,MACH,SACA,WACA,SAAUC,EAAQC,GAChB,QAASC,GAAaC,GACpB,GAAIC,MAEAC,EAAUtB,QAAQuB,UAAWpB,EAAUiB,EAC3CC,GAASJ,EAAOK,GAEZA,EAAQP,OACVM,EAAOG,OAAOT,KAAOO,EAAQP,KAG/B,IAAIF,GAAOQ,EAAOR,IASlB,OARIS,GAAQR,WACVO,EAAOR,KAAO,WACZA,IACAK,EAAS,WACPG,EAAOI,QACa,IAAnBH,EAAQR,YAGRO,EAET,MAAOF,OAGVO,UAAU,WACX,UACA,YACA,OACA,SACA,SAAUC,EAASC,EAAWC,EAAMR,GACNM,EAAQG,uBAAyBH,EAAQI,UACrE,QACEC,SAAU,MACVC,OAAO,EACPC,KAAM,SAAkBD,EAAOvB,EAASyB,GAEtC,GAAIb,IACAW,MAAOA,EACPvB,QAASA,EACTG,MAAM,EAEVb,SAAQoC,SACN,WACA,YACA,WACA,OACA,YACA,YACA,YACC,SAAUC,GACPrC,QAAQsC,UAAUH,EAAKE,MACzBf,EAAQe,GAAOF,EAAKE,MAGxBrC,QAAQoC,SACN,QACA,UACA,QACC,SAAUC,GACXF,EAAKE,IAAQF,EAAKI,SAASF,EAAK,SAAUG,GACxCP,EAAMI,GAAOR,EAAKY,YAAYD,OAIlCL,EAAKO,SAAWT,EAAMU,OAAOR,EAAKO,QAAS,SAAUF,GAC/CxC,QAAQ4C,SAASJ,GACnBxC,QAAQuB,OAAOU,EAAOO,GAEtBP,EAAMY,QAAUL,IAEjB,EAEH,IAAIM,GAAQzB,EAAOC,EAEnBZ,GAAQqC,GAAGZ,EAAKa,SAAW,QAASF,EAAMG,QAE1ChB,EAAMiB,IAAI,WAAY,WACpBJ,EAAMK,UACN7B,EAAU,KACVwB,EAAQ,YCrGlB9C,QAAQC,OAAO,wBAAwBmD,KAAK,iBAAkB,SAASC,GAGrEA,EAAeC,IAAI,uBACjB"}
\ No newline at end of file
diff --git a/dist/modules/alert.tpl.js b/dist/modules/alert.tpl.js
index 5b9224516..51d6d19ce 100644
--- a/dist/modules/alert.tpl.js
+++ b/dist/modules/alert.tpl.js
@@ -1,15 +1,14 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-angular.module('mgcrea.ngStrap.alert').run(['$templateCache', function($templateCache) {
- 'use strict';
-
- $templateCache.put('alert/alert.tpl.html',
- "×
"
- );
-
-}]);
+'use strict';
+angular.module('mgcrea.ngStrap.alert').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('alert/alert.tpl.html', '×
');
+ }
+]);
\ No newline at end of file
diff --git a/dist/modules/alert.tpl.min.js b/dist/modules/alert.tpl.min.js
index 056bcf6e8..f075979f8 100644
--- a/dist/modules/alert.tpl.min.js
+++ b/dist/modules/alert.tpl.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(a){"use strict";a.put("alert/alert.tpl.html",'×
')}]);
-//# sourceMappingURL=alert.tpl.min.map
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(t){t.put("alert/alert.tpl.html",'×
')}]);
\ No newline at end of file
diff --git a/dist/modules/alert.tpl.min.map b/dist/modules/alert.tpl.min.map
deleted file mode 100644
index 5068b29a3..000000000
--- a/dist/modules/alert.tpl.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"alert.tpl.min.js","sources":["alert.tpl.js"],"names":["angular","module","run","$templateCache","put"],"mappings":"AAAAA,QAAQC,OAAO,wBAAwBC,KAAK,iBAAkB,SAASC,GACrE,YAEAA,GAAeC,IAAI,uBACjB"}
\ No newline at end of file
diff --git a/dist/modules/aside.js b/dist/modules/aside.js
index a80e08bd3..0406517b2 100644
--- a/dist/modules/aside.js
+++ b/dist/modules/aside.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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 13bee9ee3..83ec5f800 100644
--- a/dist/modules/aside.min.js
+++ b/dist/modules/aside.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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.aside",["mgcrea.ngStrap.modal"]).provider("$aside",function(){var a=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(b){function c(c){var d={},e=angular.extend({},a,c);return d=b(e)}return c}]}).directive("bsAside",["$window","$location","$sce","$aside",function(a,b,c,d){a.requestAnimationFrame||a.setTimeout;return{restrict:"EAC",scope:!0,link:function(a,b,e){var f={scope:a,element:b,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(a){angular.isDefined(e[a])&&(f[a]=e[a])}),angular.forEach(["title","content"],function(b){e[b]&&e.$observe(b,function(d){a[b]=c.trustAsHtml(d)})}),e.bsAside&&a.$watch(e.bsAside,function(b){angular.isObject(b)?angular.extend(a,b):a.content=b},!0);var g=d(f);b.on(e.trigger||"click",g.toggle),a.$on("$destroy",function(){g.destroy(),f=null,g=null})}}}]),angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(a){a.put("aside/aside.tpl.html",'')}]);
-//# sourceMappingURL=aside.min.map
\ No newline at end of file
+"use strict";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={},i=angular.extend({},e,n);return a=t(i)}return n}]}).directive("bsAside",["$window","$location","$sce","$aside",function(e,t,n,a){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,t,i){var r={scope:e,element:t,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title","content"],function(t){i[t]&&i.$observe(t,function(a){e[t]=n.trustAsHtml(a)})}),i.bsAside&&e.$watch(i.bsAside,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var o=a(r);t.on(i.trigger||"click",o.toggle),e.$on("$destroy",function(){o.destroy(),r=null,o=null})}}}]);
\ No newline at end of file
diff --git a/dist/modules/aside.min.js.map b/dist/modules/aside.min.js.map
new file mode 100644
index 000000000..1a41cad52
--- /dev/null
+++ b/dist/modules/aside.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"aside.min.js.map","sources":["aside.min.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","contentTemplate","container","element","backdrop","keyboard","html","show","$get","$modal","AsideFactory","config","$aside","options","extend","directive","$window","$location","$sce","requestAnimationFrame","setTimeout","restrict","scope","link","attr","forEach","key","isDefined","$observe","newValue","trustAsHtml","bsAside","$watch","isObject","content","aside","on","trigger","toggle","$on","destroy"],"mappings":"AAOA,YACAA,SAAQC,OAAO,wBAAyB,yBAAyBC,SAAS,SAAU,WAClF,GAAIC,GAAWC,KAAKD,UAChBE,UAAW,0BACXC,YAAa,QACbC,UAAW,QACXC,SAAU,uBACVC,iBAAiB,EACjBC,WAAW,EACXC,QAAS,KACTC,UAAU,EACVC,UAAU,EACVC,MAAM,EACNC,MAAM,EAEVX,MAAKY,MACH,SACA,SAAUC,GACR,QAASC,GAAaC,GACpB,GAAIC,MAEAC,EAAUrB,QAAQsB,UAAWnB,EAAUgB,EAE3C,OADAC,GAASH,EAAOI,GAGlB,MAAOH,OAGVK,UAAU,WACX,UACA,YACA,OACA,SACA,SAAUC,EAASC,EAAWC,EAAMN,GACNI,EAAQG,uBAAyBH,EAAQI,UACrE,QACEC,SAAU,MACVC,OAAO,EACPC,KAAM,SAAkBD,EAAOnB,EAASqB,GAEtC,GAAIX,IACAS,MAAOA,EACPnB,QAASA,EACTI,MAAM,EAEVf,SAAQiC,SACN,WACA,kBACA,YACA,WACA,WACA,OACA,YACA,aACC,SAAUC,GACPlC,QAAQmC,UAAUH,EAAKE,MACzBb,EAAQa,GAAOF,EAAKE,MAGxBlC,QAAQiC,SACN,QACA,WACC,SAAUC,GACXF,EAAKE,IAAQF,EAAKI,SAASF,EAAK,SAAUG,GACxCP,EAAMI,GAAOR,EAAKY,YAAYD,OAIlCL,EAAKO,SAAWT,EAAMU,OAAOR,EAAKO,QAAS,SAAUF,GAC/CrC,QAAQyC,SAASJ,GACnBrC,QAAQsB,OAAOQ,EAAOO,GAEtBP,EAAMY,QAAUL,IAEjB,EAEH,IAAIM,GAAQvB,EAAOC,EAEnBV,GAAQiC,GAAGZ,EAAKa,SAAW,QAASF,EAAMG,QAE1ChB,EAAMiB,IAAI,WAAY,WACpBJ,EAAMK,UACN3B,EAAU,KACVsB,EAAQ"}
\ No newline at end of file
diff --git a/dist/modules/aside.min.map b/dist/modules/aside.min.map
deleted file mode 100644
index 368a94efd..000000000
--- a/dist/modules/aside.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"aside.min.js","sources":["aside.js","aside.tpl.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","contentTemplate","container","element","backdrop","keyboard","html","show","$get","$modal","AsideFactory","config","$aside","options","extend","directive","$window","$location","$sce","requestAnimationFrame","setTimeout","restrict","scope","link","attr","forEach","key","isDefined","$observe","newValue","trustAsHtml","bsAside","$watch","isObject","content","aside","on","trigger","toggle","$on","destroy","run","$templateCache","put"],"mappings":"AAAA,YACAA,SAAQC,OAAO,wBAAyB,yBAAyBC,SAAS,SAAU,WAClF,GAAIC,GAAWC,KAAKD,UAChBE,UAAW,0BACXC,YAAa,QACbC,UAAW,QACXC,SAAU,uBACVC,iBAAiB,EACjBC,WAAW,EACXC,QAAS,KACTC,UAAU,EACVC,UAAU,EACVC,MAAM,EACNC,MAAM,EAEVX,MAAKY,MACH,SACA,SAAUC,GACR,QAASC,GAAaC,GACpB,GAAIC,MAEAC,EAAUrB,QAAQsB,UAAWnB,EAAUgB,EAE3C,OADAC,GAASH,EAAOI,GAGlB,MAAOH,OAGVK,UAAU,WACX,UACA,YACA,OACA,SACA,SAAUC,EAASC,EAAWC,EAAMN,GACNI,EAAQG,uBAAyBH,EAAQI,UACrE,QACEC,SAAU,MACVC,OAAO,EACPC,KAAM,SAAkBD,EAAOnB,EAASqB,GAEtC,GAAIX,IACAS,MAAOA,EACPnB,QAASA,EACTI,MAAM,EAEVf,SAAQiC,SACN,WACA,kBACA,YACA,WACA,WACA,OACA,YACA,aACC,SAAUC,GACPlC,QAAQmC,UAAUH,EAAKE,MACzBb,EAAQa,GAAOF,EAAKE,MAGxBlC,QAAQiC,SACN,QACA,WACC,SAAUC,GACXF,EAAKE,IAAQF,EAAKI,SAASF,EAAK,SAAUG,GACxCP,EAAMI,GAAOR,EAAKY,YAAYD,OAIlCL,EAAKO,SAAWT,EAAMU,OAAOR,EAAKO,QAAS,SAAUF,GAC/CrC,QAAQyC,SAASJ,GACnBrC,QAAQsB,OAAOQ,EAAOO,GAEtBP,EAAMY,QAAUL,IAEjB,EAEH,IAAIM,GAAQvB,EAAOC,EAEnBV,GAAQiC,GAAGZ,EAAKa,SAAW,QAASF,EAAMG,QAE1ChB,EAAMiB,IAAI,WAAY,WACpBJ,EAAMK,UACN3B,EAAU,KACVsB,EAAQ,YCnFlB3C,QAAQC,OAAO,wBAAwBgD,KAAK,iBAAkB,SAASC,GAGrEA,EAAeC,IAAI,uBACjB"}
\ No newline at end of file
diff --git a/dist/modules/aside.tpl.js b/dist/modules/aside.tpl.js
index a1f957270..17a2388fe 100644
--- a/dist/modules/aside.tpl.js
+++ b/dist/modules/aside.tpl.js
@@ -1,15 +1,14 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-angular.module('mgcrea.ngStrap.aside').run(['$templateCache', function($templateCache) {
- 'use strict';
-
- $templateCache.put('aside/aside.tpl.html',
- ""
- );
-
-}]);
+'use strict';
+angular.module('mgcrea.ngStrap.aside').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('aside/aside.tpl.html', '');
+ }
+]);
\ No newline at end of file
diff --git a/dist/modules/aside.tpl.min.js b/dist/modules/aside.tpl.min.js
index c27e28587..3ea4fb7d5 100644
--- a/dist/modules/aside.tpl.min.js
+++ b/dist/modules/aside.tpl.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(a){"use strict";a.put("aside/aside.tpl.html",'')}]);
-//# sourceMappingURL=aside.tpl.min.map
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(t){t.put("aside/aside.tpl.html",'')}]);
\ No newline at end of file
diff --git a/dist/modules/aside.tpl.min.map b/dist/modules/aside.tpl.min.map
deleted file mode 100644
index 93cce30ba..000000000
--- a/dist/modules/aside.tpl.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"aside.tpl.min.js","sources":["aside.tpl.js"],"names":["angular","module","run","$templateCache","put"],"mappings":"AAAAA,QAAQC,OAAO,wBAAwBC,KAAK,iBAAkB,SAASC,GACrE,YAEAA,GAAeC,IAAI,uBACjB"}
\ No newline at end of file
diff --git a/dist/modules/button.js b/dist/modules/button.js
index 6a51f668a..98589efae 100644
--- a/dist/modules/button.js
+++ b/dist/modules/button.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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,8 +31,8 @@ angular.module('mgcrea.ngStrap.button', ['ngAnimate']).provider('$button', funct
};
}).directive('bsCheckbox', [
'$button',
- '$$animateReflow',
- function ($button, $$animateReflow) {
+ '$$rAF',
+ function ($button, $$rAF) {
var defaults = $button.defaults;
var constantValueRegExp = /^(true|false|\d+)$/;
return {
@@ -67,7 +67,7 @@ angular.module('mgcrea.ngStrap.button', ['ngAnimate']).provider('$button', funct
controller.$render = function () {
// console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
var isActive = angular.equals(controller.$modelValue, trueValue);
- $$animateReflow(function () {
+ $$rAF(function () {
if (isInput)
element[0].checked = isActive;
activeElement.toggleClass(options.activeClass, isActive);
@@ -104,8 +104,8 @@ angular.module('mgcrea.ngStrap.button', ['ngAnimate']).provider('$button', funct
};
}).directive('bsRadio', [
'$button',
- '$$animateReflow',
- function ($button, $$animateReflow) {
+ '$$rAF',
+ function ($button, $$rAF) {
var defaults = $button.defaults;
var constantValueRegExp = /^(true|false|\d+)$/;
return {
@@ -121,7 +121,7 @@ angular.module('mgcrea.ngStrap.button', ['ngAnimate']).provider('$button', funct
controller.$render = function () {
// console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
var isActive = angular.equals(controller.$modelValue, value);
- $$animateReflow(function () {
+ $$rAF(function () {
if (isInput)
element[0].checked = isActive;
activeElement.toggleClass(options.activeClass, isActive);
diff --git a/dist/modules/button.min.js b/dist/modules/button.min.js
index fad301669..883cd09c9 100644
--- a/dist/modules/button.min.js
+++ b/dist/modules/button.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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.button",["ngAnimate"]).provider("$button",function(){var a=this.defaults={activeClass:"active",toggleEvent:"click"};this.$get=function(){return{defaults:a}}}).directive("bsCheckboxGroup",function(){return{restrict:"A",require:"ngModel",compile:function(a,b){a.attr("data-toggle","buttons"),a.removeAttr("ng-model");var c=a[0].querySelectorAll('input[type="checkbox"]');angular.forEach(c,function(a){var c=angular.element(a);c.attr("bs-checkbox",""),c.attr("ng-model",b.ngModel+"."+c.attr("value"))})}}}).directive("bsCheckbox",["$button","$$animateReflow",function(a,b){var c=a.defaults,d=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(a,e,f,g){var h=c,i="INPUT"===e[0].nodeName,j=i?e.parent():e,k=angular.isDefined(f.trueValue)?f.trueValue:!0;d.test(f.trueValue)&&(k=a.$eval(f.trueValue));var l=angular.isDefined(f.falseValue)?f.falseValue:!1;d.test(f.falseValue)&&(l=a.$eval(f.falseValue));var m="boolean"!=typeof k||"boolean"!=typeof l;m&&(g.$parsers.push(function(a){return a?k:l}),a.$watch(f.ngModel,function(){g.$render()})),g.$render=function(){var a=angular.equals(g.$modelValue,k);b(function(){i&&(e[0].checked=a),j.toggleClass(h.activeClass,a)})},e.bind(h.toggleEvent,function(){a.$apply(function(){i||g.$setViewValue(!j.hasClass("active")),m||g.$render()})})}}}]).directive("bsRadioGroup",function(){return{restrict:"A",require:"ngModel",compile:function(a,b){a.attr("data-toggle","buttons"),a.removeAttr("ng-model");var c=a[0].querySelectorAll('input[type="radio"]');angular.forEach(c,function(a){angular.element(a).attr("bs-radio",""),angular.element(a).attr("ng-model",b.ngModel)})}}}).directive("bsRadio",["$button","$$animateReflow",function(a,b){var c=a.defaults,d=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(a,e,f,g){var h=c,i="INPUT"===e[0].nodeName,j=i?e.parent():e,k=d.test(f.value)?a.$eval(f.value):f.value;g.$render=function(){var a=angular.equals(g.$modelValue,k);b(function(){i&&(e[0].checked=a),j.toggleClass(h.activeClass,a)})},e.bind(h.toggleEvent,function(){a.$apply(function(){g.$setViewValue(k),g.$render()})})}}}]);
-//# sourceMappingURL=button.min.map
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.button",["ngAnimate"]).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 a=e[0].querySelectorAll('input[type="checkbox"]');angular.forEach(a,function(e){var a=angular.element(e);a.attr("bs-checkbox",""),a.attr("ng-model",t.ngModel+"."+a.attr("value"))})}}}).directive("bsCheckbox",["$button","$$rAF",function(e,t){var a=e.defaults,n=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,r,l,u){var o=a,i="INPUT"===r[0].nodeName,c=i?r.parent():r,s=angular.isDefined(l.trueValue)?l.trueValue:!0;n.test(l.trueValue)&&(s=e.$eval(l.trueValue));var d=angular.isDefined(l.falseValue)?l.falseValue:!1;n.test(l.falseValue)&&(d=e.$eval(l.falseValue));var g="boolean"!=typeof s||"boolean"!=typeof d;g&&(u.$parsers.push(function(e){return e?s:d}),e.$watch(l.ngModel,function(){u.$render()})),u.$render=function(){var e=angular.equals(u.$modelValue,s);t(function(){i&&(r[0].checked=e),c.toggleClass(o.activeClass,e)})},r.bind(o.toggleEvent,function(){e.$apply(function(){i||u.$setViewValue(!c.hasClass("active")),g||u.$render()})})}}}]).directive("bsRadioGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var a=e[0].querySelectorAll('input[type="radio"]');angular.forEach(a,function(e){angular.element(e).attr("bs-radio",""),angular.element(e).attr("ng-model",t.ngModel)})}}}).directive("bsRadio",["$button","$$rAF",function(e,t){var a=e.defaults,n=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,r,l,u){var o=a,i="INPUT"===r[0].nodeName,c=i?r.parent():r,s=n.test(l.value)?e.$eval(l.value):l.value;u.$render=function(){var e=angular.equals(u.$modelValue,s);t(function(){i&&(r[0].checked=e),c.toggleClass(o.activeClass,e)})},r.bind(o.toggleEvent,function(){e.$apply(function(){u.$setViewValue(s),u.$render()})})}}}]);
\ No newline at end of file
diff --git a/dist/modules/button.min.js.map b/dist/modules/button.min.js.map
new file mode 100644
index 000000000..26c75710e
--- /dev/null
+++ b/dist/modules/button.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"button.min.js.map","sources":["button.min.js"],"names":["angular","module","provider","defaults","this","activeClass","toggleEvent","$get","directive","restrict","require","compile","element","attr","removeAttr","children","querySelectorAll","forEach","child","childEl","ngModel","$button","$$rAF","constantValueRegExp","link","scope","controller","options","isInput","nodeName","activeElement","parent","trueValue","isDefined","test","$eval","falseValue","hasExoticValues","$parsers","push","viewValue","$watch","$render","isActive","equals","$modelValue","checked","toggleClass","bind","$apply","$setViewValue","hasClass","value"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/modules/button.min.map b/dist/modules/button.min.map
deleted file mode 100644
index 3bce51c17..000000000
--- a/dist/modules/button.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"button.min.js","sources":["button.js"],"names":["angular","module","provider","defaults","this","activeClass","toggleEvent","$get","directive","restrict","require","compile","element","attr","removeAttr","children","querySelectorAll","forEach","child","childEl","ngModel","$button","$$animateReflow","constantValueRegExp","link","scope","controller","options","isInput","nodeName","activeElement","parent","trueValue","isDefined","test","$eval","falseValue","hasExoticValues","$parsers","push","viewValue","$watch","$render","isActive","equals","$modelValue","checked","toggleClass","bind","$apply","$setViewValue","hasClass","value"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/modules/date-parser.js b/dist/modules/date-parser.js
index b07fefb38..a620f6ecb 100644
--- a/dist/modules/date-parser.js
+++ b/dist/modules/date-parser.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -26,24 +26,25 @@ angular.module('mgcrea.ngStrap.helpers.dateParser', []).provider('$dateParser',
var regExpMap = {
'sss': '[0-9]{3}',
'ss': '[0-5][0-9]',
- 's': options.strict ? '[1-5]?[0-9]' : '[0-5][0-9]',
+ 's': options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]',
'mm': '[0-5][0-9]',
- 'm': options.strict ? '[1-5]?[0-9]' : '[0-5][0-9]',
+ 'm': options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]',
'HH': '[01][0-9]|2[0-3]',
- 'H': options.strict ? '[0][1-9]|[1][012]' : '[01][0-9]|2[0-3]',
+ 'H': options.strict ? '1?[0-9]|2[0-3]' : '[01]?[0-9]|2[0-3]',
'hh': '[0][1-9]|[1][012]',
- 'h': options.strict ? '[1-9]|[1][012]' : '[0]?[1-9]|[1][012]',
+ 'h': options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]',
'a': 'AM|PM',
'EEEE': $locale.DATETIME_FORMATS.DAY.join('|'),
'EEE': $locale.DATETIME_FORMATS.SHORTDAY.join('|'),
- 'dd': '[0-2][0-9]{1}|[3][01]{1}',
- 'd': options.strict ? '[1-2]?[0-9]{1}|[3][01]{1}' : '[0-2][0-9]{1}|[3][01]{1}',
+ 'dd': '0[1-9]|[12][0-9]|3[01]',
+ 'd': options.strict ? '[1-9]|[1-2][0-9]|3[01]' : '0?[1-9]|[1-2][0-9]|3[01]',
'MMMM': $locale.DATETIME_FORMATS.MONTH.join('|'),
'MMM': $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),
- 'MM': '[0][1-9]|[1][012]',
- 'M': options.strict ? '[1-9]|[1][012]' : '[0][1-9]|[1][012]',
- 'yyyy': '(?:(?:[1]{1}[0-9]{1}[0-9]{1}[0-9]{1})|(?:[2]{1}[0-9]{3}))(?![[0-9]])',
- 'yy': '(?:(?:[0-9]{1}[0-9]{1}))(?![[0-9]])'
+ 'MM': '0[1-9]|1[012]',
+ 'M': options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]',
+ 'yyyy': '[1]{1}[0-9]{3}|[2]{1}[0-9]{3}',
+ 'yy': '[0-9]{2}',
+ 'y': options.strict ? '-?(0|[1-9][0-9]{0,3})' : '-?0*[0-9]{1,4}'
};
var setFnMap = {
'sss': proto.setMilliseconds,
diff --git a/dist/modules/date-parser.min.js b/dist/modules/date-parser.min.js
index 2529d6d3e..551d05acc 100644
--- a/dist/modules/date-parser.min.js
+++ b/dist/modules/date-parser.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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 a=Date.prototype,b=this.defaults={format:"shortDate",strict:!1};this.$get=["$locale",function(c){var d=function(d){function e(a){var b,c=Object.keys(m),d=[],e=[],f=a;for(b=0;b1){var g=f.search(c[b]);a=a.split(c[b]).join(""),m[c[b]]&&(d[g]=m[c[b]])}return angular.forEach(d,function(a){e.push(a)}),e}function f(a){return a.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function g(a){var b,c=Object.keys(l),d=a;for(b=0;b1){var a=i.search(r[e]);t=t.split(r[e]).join(""),f[r[e]]&&(s[a]=f[r[e]])}return angular.forEach(s,function(t){n.push(t)}),n}function i(t){return t.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function a(t){var e,r=Object.keys(l),s=t;for(e=0;e= options.minDate && parsedDate.getTime() <= options.maxDate;
+ var isValid = (isNaN(datepicker.$options.minDate) || parsedDate.getTime() >= datepicker.$options.minDate) && (isNaN(datepicker.$options.maxDate) || parsedDate.getTime() <= datepicker.$options.maxDate);
controller.$setValidity('date', isValid);
// Only update the model when we have a valid date
if (isValid)
@@ -326,9 +331,16 @@ angular.module('mgcrea.ngStrap.datepicker', [
// modelValue -> $formatters -> viewValue
controller.$formatters.push(function (modelValue) {
// console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
- if (angular.isUndefined(modelValue) || modelValue === null)
- return;
- var date = angular.isDate(modelValue) ? modelValue : new Date(modelValue);
+ var date;
+ if (angular.isUndefined(modelValue) || modelValue === null) {
+ date = NaN;
+ } else if (angular.isDate(modelValue)) {
+ date = modelValue;
+ } else if (options.dateType === 'string') {
+ date = dateParser.parse(modelValue);
+ } else {
+ date = new Date(modelValue);
+ }
// Setup default value?
// if(isNaN(date.getTime())) {
// var today = new Date();
@@ -364,6 +376,10 @@ angular.module('mgcrea.ngStrap.datepicker', [
}
return arrays;
}
+ // Modulus operator
+ function mod(n, m) {
+ return (n % m + m) % m;
+ }
this.$get = [
'$locale',
'$sce',
@@ -401,8 +417,11 @@ angular.module('mgcrea.ngStrap.datepicker', [
}
},
build: function () {
- var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1);
- var firstDate = new Date(+firstDayOfMonth - (firstDayOfMonth.getDay() - options.startWeek) * 86400000);
+ var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1), firstDayOfMonthOffset = firstDayOfMonth.getTimezoneOffset();
+ var firstDate = new Date(+firstDayOfMonth - mod(firstDayOfMonth.getDay() - options.startWeek, 6) * 86400000), firstDateOffset = firstDate.getTimezoneOffset();
+ // Handle daylight time switch
+ if (firstDateOffset !== firstDayOfMonthOffset)
+ firstDate = new Date(+firstDate + (firstDateOffset - firstDayOfMonthOffset) * 60000);
var days = [], day;
for (var i = 0; i < 42; i++) {
// < 7 * 6
diff --git a/dist/modules/datepicker.min.js b/dist/modules/datepicker.min.js
index 38c48fc20..dd6369967 100644
--- a/dist/modules/datepicker.min.js
+++ b/dist/modules/datepicker.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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 a=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",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip",function(b,c,d,e,f,g,h,i){function j(b,c,d){function e(a){a.selected=g.$isSelected(a.date)}function f(){b[0].focus()}var g=i(b,angular.extend({},a,d)),j=d.scope,m=g.$options,n=g.$scope;m.startView&&(m.startView-=m.minView);var o=h(g);g.$views=o.views;var p=o.viewDate;n.$mode=m.startView;var q=g.$views[n.$mode];n.$select=function(a){g.select(a)},n.$selectPane=function(a){g.$selectPane(a)},n.$toggleMode=function(){g.setMode((n.$mode+1)%g.$views.length)},g.update=function(a){angular.isDate(a)&&!isNaN(a.getTime())&&(g.$date=a,q.update.call(q,a)),g.$build(!0)},g.select=function(a,b){angular.isDate(c.$dateValue)||(c.$dateValue=new Date(a)),c.$dateValue.setFullYear(a.getFullYear(),a.getMonth(),a.getDate()),!n.$mode||b?(c.$setViewValue(c.$dateValue),c.$render(),m.autoclose&&!b&&g.hide(!0)):(angular.extend(p,{year:a.getFullYear(),month:a.getMonth(),date:a.getDate()}),g.setMode(n.$mode-1),g.$build())},g.setMode=function(a){n.$mode=a,q=g.$views[n.$mode],g.$build()},g.$build=function(a){a===!0&&q.built||(a!==!1||q.built)&&q.build.call(q)},g.$updateSelected=function(){for(var a=0,b=n.rows.length;b>a;a++)angular.forEach(n.rows[a],e)},g.$isSelected=function(a){return q.isSelected(a)},g.$selectPane=function(a){var b=q.steps,c=new Date(Date.UTC(p.year+(b.year||0)*a,p.month+(b.month||0)*a,p.date+(b.day||0)*a));angular.extend(p,{year:c.getUTCFullYear(),month:c.getUTCMonth(),date:c.getUTCDate()}),g.$build()},g.$onMouseDown=function(a){if(a.preventDefault(),a.stopPropagation(),k){var b=angular.element(a.target);"button"!==b[0].nodeName.toLowerCase()&&(b=b.parent()),b.triggerHandler("click")}},g.$onKeyDown=function(a){if(/(38|37|39|40|13)/.test(a.keyCode)&&!a.shiftKey&&!a.altKey){if(a.preventDefault(),a.stopPropagation(),13===a.keyCode)return n.$mode?n.$apply(function(){g.setMode(n.$mode-1)}):g.hide(!0);q.onKeyDown(a),j.$digest()}};var r=g.init;g.init=function(){return l&&m.useNative?(b.prop("type","date"),void b.css("-webkit-appearance","textfield")):(k&&(b.prop("type","text"),b.attr("readonly","true"),b.on("click",f)),void r())};var s=g.destroy;g.destroy=function(){l&&m.useNative&&b.off("click",f),s()};var t=g.show;g.show=function(){t(),setTimeout(function(){g.$element.on(k?"touchstart":"mousedown",g.$onMouseDown),m.keyboard&&b.on("keydown",g.$onKeyDown)})};var u=g.hide;return g.hide=function(a){g.$element.off(k?"touchstart":"mousedown",g.$onMouseDown),m.keyboard&&b.off("keydown",g.$onKeyDown),u(a)},g}var k=(angular.element(b.document.body),"createTouch"in b.document),l=/(ip(a|o)d|iphone|android)/gi.test(b.navigator.userAgent);return a.lang||(a.lang=f.id),j.defaults=a,j}]}).directive("bsDatepicker",["$window","$parse","$q","$locale","dateFilter","$datepicker","$dateParser","$timeout",function(a,b,c,d,e,f,g){{var h=(f.defaults,/(ip(a|o)d|iphone|android)/gi.test(a.navigator.userAgent));a.requestAnimationFrame||a.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(a,b,c,d){var i={scope:a,controller:d};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","strictFormat","startWeek","useNative","lang","startView","minView"],function(a){angular.isDefined(c[a])&&(i[a]=c[a])}),h&&i.useNative&&(i.dateFormat="yyyy-MM-dd");var j=f(b,d,i);i=j.$options,angular.forEach(["minDate","maxDate"],function(a){angular.isDefined(c[a])&&c.$observe(a,function(b){if("today"===b){var c=new Date;j.$options[a]=+new Date(c.getFullYear(),c.getMonth(),c.getDate()+("maxDate"===a?1:0),0,0,0,"minDate"===a?0:-1)}else j.$options[a]=angular.isString(b)&&b.match(/^".+"$/)?+new Date(b.substr(1,b.length-2)):+new Date(b);!isNaN(j.$options[a])&&j.$build(!1)})}),a.$watch(c.ngModel,function(){j.update(d.$dateValue)},!0);var k=g({format:i.dateFormat,lang:i.lang,strict:i.strictFormat});d.$parsers.unshift(function(a){if(!a)return void d.$setValidity("date",!0);var b=k.parse(a,d.$dateValue);if(!b||isNaN(b.getTime()))d.$setValidity("date",!1);else{var c=b.getTime()>=i.minDate&&b.getTime()<=i.maxDate;d.$setValidity("date",c),c&&(d.$dateValue=b)}return"string"===i.dateType?e(a,i.dateFormat):"number"===i.dateType?d.$dateValue.getTime():"iso"===i.dateType?d.$dateValue.toISOString():new Date(d.$dateValue)}),d.$formatters.push(function(a){if(!angular.isUndefined(a)&&null!==a){var b=angular.isDate(a)?a:new Date(a);return d.$dateValue=b,d.$dateValue}}),d.$render=function(){b.val(!d.$dateValue||isNaN(d.$dateValue.getTime())?"":e(d.$dateValue,i.dateFormat))},a.$on("$destroy",function(){j.destroy(),i=null,j=null})}}}]).provider("datepickerViews",function(){function a(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c}this.defaults={dayFormat:"dd",daySplit:7};this.$get=["$locale","$sce","dateFilter",function(b,c,d){return function(e){var f=e.$scope,g=e.$options,h=b.DATETIME_FORMATS.SHORTDAY,i=h.slice(g.startWeek).concat(h.slice(0,g.startWeek)),j=c.trustAsHtml(''+i.join(' ')+" "),k=e.$date||new Date,l={year:k.getFullYear(),month:k.getMonth(),date:k.getDate()},m=(6e4*k.getTimezoneOffset(),[{format:"dd",split:7,steps:{month:1},update:function(a,b){!this.built||b||a.getFullYear()!==l.year||a.getMonth()!==l.month?(angular.extend(l,{year:e.$date.getFullYear(),month:e.$date.getMonth(),date:e.$date.getDate()}),e.$build()):a.getDate()!==l.date&&(l.date=e.$date.getDate(),e.$updateSelected())},build:function(){for(var b,c=new Date(l.year,l.month,1),h=new Date(+c-864e5*(c.getDay()-g.startWeek)),i=[],k=0;42>k;k++)b=new Date(h.getFullYear(),h.getMonth(),h.getDate()+k),i.push({date:b,label:d(b,this.format),selected:e.$date&&this.isSelected(b),muted:b.getMonth()!==l.month,disabled:this.isDisabled(b)});f.title=d(c,"MMMM yyyy"),f.labels=j,f.rows=a(i,this.split),this.built=!0},isSelected:function(a){return e.$date&&a.getFullYear()===e.$date.getFullYear()&&a.getMonth()===e.$date.getMonth()&&a.getDate()===e.$date.getDate()},isDisabled:function(a){return a.getTime()g.maxDate},onKeyDown:function(a){var b=e.$date.getTime();37===a.keyCode?e.select(new Date(b-864e5),!0):38===a.keyCode?e.select(new Date(b-6048e5),!0):39===a.keyCode?e.select(new Date(b+864e5),!0):40===a.keyCode&&e.select(new Date(b+6048e5),!0)}},{name:"month",format:"MMM",split:4,steps:{year:1},update:function(a){this.built&&a.getFullYear()===l.year?a.getMonth()!==l.month&&(angular.extend(l,{month:e.$date.getMonth(),date:e.$date.getDate()}),e.$updateSelected()):(angular.extend(l,{year:e.$date.getFullYear(),month:e.$date.getMonth(),date:e.$date.getDate()}),e.$build())},build:function(){for(var b,c=(new Date(l.year,0,1),[]),g=0;12>g;g++)b=new Date(l.year,g,1),c.push({date:b,label:d(b,this.format),selected:e.$isSelected(b),disabled:this.isDisabled(b)});f.title=d(b,"yyyy"),f.labels=!1,f.rows=a(c,this.split),this.built=!0},isSelected:function(a){return e.$date&&a.getFullYear()===e.$date.getFullYear()&&a.getMonth()===e.$date.getMonth()},isDisabled:function(a){var b=+new Date(a.getFullYear(),a.getMonth()+1,0);return bg.maxDate},onKeyDown:function(a){var b=e.$date.getMonth();37===a.keyCode?e.select(e.$date.setMonth(b-1),!0):38===a.keyCode?e.select(e.$date.setMonth(b-4),!0):39===a.keyCode?e.select(e.$date.setMonth(b+1),!0):40===a.keyCode&&e.select(e.$date.setMonth(b+4),!0)}},{name:"year",format:"yyyy",split:4,steps:{year:12},update:function(a,b){!this.built||b||parseInt(a.getFullYear()/20,10)!==parseInt(l.year/20,10)?(angular.extend(l,{year:e.$date.getFullYear(),month:e.$date.getMonth(),date:e.$date.getDate()}),e.$build()):a.getFullYear()!==l.year&&(angular.extend(l,{year:e.$date.getFullYear(),month:e.$date.getMonth(),date:e.$date.getDate()}),e.$updateSelected())},build:function(){for(var b,c=l.year-l.year%(3*this.split),g=[],h=0;12>h;h++)b=new Date(c+h,0,1),g.push({date:b,label:d(b,this.format),selected:e.$isSelected(b),disabled:this.isDisabled(b)});f.title=g[0].label+"-"+g[g.length-1].label,f.labels=!1,f.rows=a(g,this.split),this.built=!0},isSelected:function(a){return e.$date&&a.getFullYear()===e.$date.getFullYear()},isDisabled:function(a){var b=+new Date(a.getFullYear()+1,0,0);return bg.maxDate},onKeyDown:function(a){var b=e.$date.getFullYear();37===a.keyCode?e.select(e.$date.setYear(b-1),!0):38===a.keyCode?e.select(e.$date.setYear(b-4),!0):39===a.keyCode?e.select(e.$date.setYear(b+1),!0):40===a.keyCode&&e.select(e.$date.setYear(b+4),!0)}}]);return{views:g.minView?Array.prototype.slice.call(m,g.minView):m,viewDate:l}}}]}),angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(a){a.put("datepicker/datepicker.tpl.html",'')}]);
-//# sourceMappingURL=datepicker.min.map
\ No newline at end of file
+"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",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip",function(t,a,n,i,o,r,l,d){function s(t,a,n){function i(e){e.selected=r.$isSelected(e.date)}function o(){t[0].focus()}var r=d(t,angular.extend({},e,n)),s=n.scope,$=r.$options,g=r.$scope;$.startView&&($.startView-=$.minView);var m=l(r);r.$views=m.views;var f=m.viewDate;g.$mode=$.startView;var p=r.$views[g.$mode];g.$select=function(e){r.select(e)},g.$selectPane=function(e){r.$selectPane(e)},g.$toggleMode=function(){r.setMode((g.$mode+1)%r.$views.length)},r.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())&&(r.$date=e,p.update.call(p,e)),r.$build(!0)},r.select=function(e,t){angular.isDate(a.$dateValue)||(a.$dateValue=new Date(e)),a.$dateValue.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),!g.$mode||t?(a.$setViewValue(a.$dateValue),a.$render(),$.autoclose&&!t&&r.hide(!0)):(angular.extend(f,{year:e.getFullYear(),month:e.getMonth(),date:e.getDate()}),r.setMode(g.$mode-1),r.$build())},r.setMode=function(e){g.$mode=e,p=r.$views[g.$mode],r.$build()},r.$build=function(e){e===!0&&p.built||(e!==!1||p.built)&&p.build.call(p)},r.$updateSelected=function(){for(var e=0,t=g.rows.length;t>e;e++)angular.forEach(g.rows[e],i)},r.$isSelected=function(e){return p.isSelected(e)},r.$selectPane=function(e){var t=p.steps,a=new Date(Date.UTC(f.year+(t.year||0)*e,f.month+(t.month||0)*e,f.date+(t.day||0)*e));angular.extend(f,{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 g.$mode?g.$apply(function(){r.setMode(g.$mode-1)}):r.hide(!0);p.onKeyDown(e),s.$digest()}};var h=r.init;r.init=function(){return c&&$.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 h())};var y=r.destroy;r.destroy=function(){c&&$.useNative&&t.off("click",o),y()};var D=r.show;r.show=function(){D(),setTimeout(function(){r.$element.on(u?"touchstart":"mousedown",r.$onMouseDown),$.keyboard&&t.on("keydown",r.$onKeyDown)})};var w=r.hide;return r.hide=function(e){r.$element.off(u?"touchstart":"mousedown",r.$onMouseDown),$.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 l=(o.defaults,/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent)),d=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};return{restrict:"EAC",require:"ngModel",link:function(e,t,a,n){var s={scope:e,controller:n};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","strictFormat","startWeek","useNative","lang","startView","minView"],function(e){angular.isDefined(a[e])&&(s[e]=a[e])}),l&&s.useNative&&(s.dateFormat="yyyy-MM-dd");var u=o(t,n,s);s=u.$options,angular.forEach(["minDate","maxDate"],function(e){angular.isDefined(a[e])&&a.$observe(e,function(t){if("today"===t){var a=new Date;u.$options[e]=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+("maxDate"===e?1:0),0,0,0,"minDate"===e?0:-1)}else u.$options[e]=angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):d(t)?+new Date(parseInt(t,10)):+new Date(t);!isNaN(u.$options[e])&&u.$build(!1)})}),e.$watch(a.ngModel,function(){u.update(n.$dateValue)},!0);var c=r({format:s.dateFormat,lang:s.lang,strict:s.strictFormat});n.$parsers.unshift(function(e){if(!e)return void n.$setValidity("date",!0);var t=c.parse(e,n.$dateValue);if(!t||isNaN(t.getTime()))return void n.$setValidity("date",!1);var a=(isNaN(u.$options.minDate)||t.getTime()>=u.$options.minDate)&&(isNaN(u.$options.maxDate)||t.getTime()<=u.$options.maxDate);return n.$setValidity("date",a),a&&(n.$dateValue=t),"string"===s.dateType?i(e,s.dateFormat):"number"===s.dateType?n.$dateValue.getTime():"iso"===s.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"===s.dateType?c.parse(e):new Date(e),n.$dateValue=t,n.$dateValue}),n.$render=function(){t.val(!n.$dateValue||isNaN(n.$dateValue.getTime())?"":i(n.$dateValue,s.dateFormat))},e.$on("$destroy",function(){u.destroy(),s=null,u=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,l=o.$options,d=a.DATETIME_FORMATS.SHORTDAY,s=d.slice(l.startWeek).concat(d.slice(0,l.startWeek)),u=n.trustAsHtml(''+s.join(' ')+" "),c=o.$date||new Date,$={year:c.getFullYear(),month:c.getMonth(),date:c.getDate()},g=(6e4*c.getTimezoneOffset(),[{format:"dd",split:7,steps:{month:1},update:function(e,t){!this.built||t||e.getFullYear()!==$.year||e.getMonth()!==$.month?(angular.extend($,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build()):e.getDate()!==$.date&&($.date=o.$date.getDate(),o.$updateSelected())},build:function(){var a=new Date($.year,$.month,1),n=a.getTimezoneOffset(),d=new Date(+a-864e5*t(a.getDay()-l.startWeek,6)),s=d.getTimezoneOffset();s!==n&&(d=new Date(+d+6e4*(s-n)));for(var c,g=[],m=0;42>m;m++)c=new Date(d.getFullYear(),d.getMonth(),d.getDate()+m),g.push({date:c,label:i(c,this.format),selected:o.$date&&this.isSelected(c),muted:c.getMonth()!==$.month,disabled:this.isDisabled(c)});r.title=i(a,"MMMM yyyy"),r.labels=u,r.rows=e(g,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){return e.getTime()l.maxDate},onKeyDown:function(e){var t=o.$date.getTime();37===e.keyCode?o.select(new Date(t-864e5),!0):38===e.keyCode?o.select(new Date(t-6048e5),!0):39===e.keyCode?o.select(new Date(t+864e5),!0):40===e.keyCode&&o.select(new Date(t+6048e5),!0)}},{name:"month",format:"MMM",split:4,steps:{year:1},update:function(e){this.built&&e.getFullYear()===$.year?e.getMonth()!==$.month&&(angular.extend($,{month:o.$date.getMonth(),date:o.$date.getDate()}),o.$updateSelected()):(angular.extend($,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build())},build:function(){for(var t,a=(new Date($.year,0,1),[]),n=0;12>n;n++)t=new Date($.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.labels=!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 tl.maxDate},onKeyDown:function(e){var t=o.$date.getMonth();37===e.keyCode?o.select(o.$date.setMonth(t-1),!0):38===e.keyCode?o.select(o.$date.setMonth(t-4),!0):39===e.keyCode?o.select(o.$date.setMonth(t+1),!0):40===e.keyCode&&o.select(o.$date.setMonth(t+4),!0)}},{name:"year",format:"yyyy",split:4,steps:{year:12},update:function(e,t){!this.built||t||parseInt(e.getFullYear()/20,10)!==parseInt($.year/20,10)?(angular.extend($,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$build()):e.getFullYear()!==$.year&&(angular.extend($,{year:o.$date.getFullYear(),month:o.$date.getMonth(),date:o.$date.getDate()}),o.$updateSelected())},build:function(){for(var t,a=$.year-$.year%(3*this.split),n=[],l=0;12>l;l++)t=new Date(a+l,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.labels=!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 tl.maxDate},onKeyDown:function(e){var t=o.$date.getFullYear();37===e.keyCode?o.select(o.$date.setYear(t-1),!0):38===e.keyCode?o.select(o.$date.setYear(t-4),!0):39===e.keyCode?o.select(o.$date.setYear(t+1),!0):40===e.keyCode&&o.select(o.$date.setYear(t+4),!0)}}]);return{views:l.minView?Array.prototype.slice.call(g,l.minView):g,viewDate:$}}}]});
\ No newline at end of file
diff --git a/dist/modules/datepicker.min.js.map b/dist/modules/datepicker.min.js.map
new file mode 100644
index 000000000..8f35a66ed
--- /dev/null
+++ b/dist/modules/datepicker.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"datepicker.min.js.map","sources":["datepicker.min.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","trigger","container","keyboard","html","delay","useNative","dateType","dateFormat","strictFormat","autoclose","minDate","Infinity","maxDate","startView","minView","startWeek","$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","$picker","$select","select","$selectPane","value","$toggleMode","setMode","length","update","isDate","isNaN","getTime","$date","call","$build","keep","$dateValue","Date","setFullYear","getFullYear","getMonth","getDate","$setViewValue","$render","hide","year","month","mode","pristine","built","build","$updateSelected","i","l","rows","forEach","isSelected","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","key","isDefined","datepicker","$observe","newValue","today","isString","match","substr","parseInt","$watch","ngModel","dateParser","format","strict","$parsers","unshift","viewValue","$setValidity","parsedDate","parse","isValid","toISOString","$formatters","push","modelValue","isUndefined","NaN","val","$on","split","arr","size","arrays","splice","mod","m","dayFormat","daySplit","picker","weekDaysMin","DATETIME_FORMATS","SHORTDAY","weekDaysLabels","slice","concat","weekDaysLabelsHtml","trustAsHtml","join","startDate","getTimezoneOffset","force","firstDayOfMonth","firstDayOfMonthOffset","firstDate","getDay","firstDateOffset","days","label","muted","disabled","isDisabled","title","labels","actualTime","name","months","lastDate","actualMonth","setMonth","firstYear","years","actualYear","setYear","Array","prototype"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/modules/datepicker.min.map b/dist/modules/datepicker.min.map
deleted file mode 100644
index b3784a5fc..000000000
--- a/dist/modules/datepicker.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"datepicker.min.js","sources":["datepicker.js","datepicker.tpl.js"],"names":["angular","module","provider","defaults","this","animation","prefixClass","placement","template","trigger","container","keyboard","html","delay","useNative","dateType","dateFormat","strictFormat","autoclose","minDate","Infinity","maxDate","startView","minView","startWeek","$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","$picker","$select","select","$selectPane","value","$toggleMode","setMode","length","update","isDate","isNaN","getTime","$date","call","$build","keep","$dateValue","Date","setFullYear","getFullYear","getMonth","getDate","$setViewValue","$render","hide","year","month","mode","pristine","built","build","$updateSelected","i","l","rows","forEach","isSelected","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","requestAnimationFrame","restrict","require","link","key","isDefined","datepicker","$observe","newValue","today","isString","match","substr","$watch","ngModel","dateParser","format","strict","$parsers","unshift","viewValue","$setValidity","parsedDate","parse","isValid","toISOString","$formatters","push","modelValue","isUndefined","val","$on","split","arr","size","arrays","splice","dayFormat","daySplit","picker","weekDaysMin","DATETIME_FORMATS","SHORTDAY","weekDaysLabels","slice","concat","weekDaysLabelsHtml","trustAsHtml","join","startDate","getTimezoneOffset","force","firstDayOfMonth","firstDate","getDay","days","label","muted","disabled","isDisabled","title","labels","actualTime","name","months","lastDate","actualMonth","setMonth","parseInt","firstYear","years","actualYear","setYear","Array","prototype","run","$templateCache","put"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/modules/datepicker.tpl.js b/dist/modules/datepicker.tpl.js
index fab3c8e3c..5fba8bd0b 100644
--- a/dist/modules/datepicker.tpl.js
+++ b/dist/modules/datepicker.tpl.js
@@ -1,15 +1,14 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-angular.module('mgcrea.ngStrap.datepicker').run(['$templateCache', function($templateCache) {
- 'use strict';
-
- $templateCache.put('datepicker/datepicker.tpl.html',
- ""
- );
-
-}]);
+'use strict';
+angular.module('mgcrea.ngStrap.datepicker').run([
+ '$templateCache',
+ function ($templateCache) {
+ $templateCache.put('datepicker/datepicker.tpl.html', '');
+ }
+]);
\ No newline at end of file
diff --git a/dist/modules/datepicker.tpl.min.js b/dist/modules/datepicker.tpl.min.js
index 176b878c1..5af46bcc6 100644
--- a/dist/modules/datepicker.tpl.min.js
+++ b/dist/modules/datepicker.tpl.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-07
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes (olivier@mg-crea.com)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
-angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(a){"use strict";a.put("datepicker/datepicker.tpl.html",'')}]);
-//# sourceMappingURL=datepicker.tpl.min.map
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(t){t.put("datepicker/datepicker.tpl.html",'')}]);
\ No newline at end of file
diff --git a/dist/modules/datepicker.tpl.min.map b/dist/modules/datepicker.tpl.min.map
deleted file mode 100644
index b4210d0a5..000000000
--- a/dist/modules/datepicker.tpl.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"datepicker.tpl.min.js","sources":["datepicker.tpl.js"],"names":["angular","module","run","$templateCache","put"],"mappings":"AAAAA,QAAQC,OAAO,6BAA6BC,KAAK,iBAAkB,SAASC,GAC1E,YAEAA,GAAeC,IAAI,iCACjB"}
\ No newline at end of file
diff --git a/dist/modules/debounce.js b/dist/modules/debounce.js
index efb9db6b0..b3f657901 100644
--- a/dist/modules/debounce.js
+++ b/dist/modules/debounce.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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 8f30c048a..8bf5df2a7 100644
--- a/dist/modules/debounce.min.js
+++ b/dist/modules/debounce.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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.debounce",[]).constant("debounce",function(a,b,c){var d,e,f,g,h;return function(){f=this,e=arguments,g=new Date;var i=function(){var j=new Date-g;b>j?d=setTimeout(i,b-j):(d=null,c||(h=a.apply(f,e)))},j=c&&!d;return d||(d=setTimeout(i,b)),j&&(h=a.apply(f,e)),h}}).constant("throttle",function(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:new Date,g=null,f=a.apply(d,e)};return function(){var j=new Date;h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e)):g||c.trailing===!1||(g=setTimeout(i,k)),f}});
-//# sourceMappingURL=debounce.min.map
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.helpers.debounce",[]).constant("debounce",function(n,t,e){var a,r,u,l,i;return function(){u=this,r=arguments,l=new Date;var o=function(){var c=new Date-l;t>c?a=setTimeout(o,t-c):(a=null,e||(i=n.apply(u,r)))},c=e&&!a;return a||(a=setTimeout(o,t)),c&&(i=n.apply(u,r)),i}}).constant("throttle",function(n,t,e){var a,r,u,l=null,i=0;e||(e={});var o=function(){i=e.leading===!1?0:new Date,l=null,u=n.apply(a,r)};return function(){var c=new Date;i||e.leading!==!1||(i=c);var s=t-(c-i);return a=this,r=arguments,0>=s?(clearTimeout(l),l=null,i=c,u=n.apply(a,r)):l||e.trailing===!1||(l=setTimeout(o,s)),u}});
\ No newline at end of file
diff --git a/dist/modules/debounce.min.js.map b/dist/modules/debounce.min.js.map
new file mode 100644
index 000000000..3fcd11191
--- /dev/null
+++ b/dist/modules/debounce.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"debounce.min.js.map","sources":["debounce.min.js"],"names":["angular","module","constant","func","wait","immediate","timeout","args","context","timestamp","result","this","arguments","Date","later","last","setTimeout","apply","callNow","options","previous","leading","now","remaining","clearTimeout","trailing"],"mappings":"AAOA,YACAA,SAAQC,OAAO,sCAAuCC,SAAS,WAAY,SAAUC,EAAMC,EAAMC,GAC/F,GAAIC,GAASC,EAAMC,EAASC,EAAWC,CACvC,OAAO,YACLF,EAAUG,KACVJ,EAAOK,UACPH,EAAY,GAAII,KAChB,IAAIC,GAAQ,WACV,GAAIC,GAAO,GAAIF,MAASJ,CACbL,GAAPW,EACFT,EAAUU,WAAWF,EAAOV,EAAOW,IAEnCT,EAAU,KACLD,IACHK,EAASP,EAAKc,MAAMT,EAASD,MAG/BW,EAAUb,IAAcC,CAM5B,OALKA,KACHA,EAAUU,WAAWF,EAAOV,IAE1Bc,IACFR,EAASP,EAAKc,MAAMT,EAASD,IACxBG,KAERR,SAAS,WAAY,SAAUC,EAAMC,EAAMe,GAC5C,GAAIX,GAASD,EAAMG,EACfJ,EAAU,KACVc,EAAW,CACfD,KAAYA,KACZ,IAAIL,GAAQ,WACVM,EAAWD,EAAQE,WAAY,EAAQ,EAAI,GAAIR,MAC/CP,EAAU,KACVI,EAASP,EAAKc,MAAMT,EAASD,GAE/B,OAAO,YACL,GAAIe,GAAM,GAAIT,KACTO,IAAYD,EAAQE,WAAY,IACnCD,EAAWE,EACb,IAAIC,GAAYnB,GAAQkB,EAAMF,EAW9B,OAVAZ,GAAUG,KACVJ,EAAOK,UACU,GAAbW,GACFC,aAAalB,GACbA,EAAU,KACVc,EAAWE,EACXZ,EAASP,EAAKc,MAAMT,EAASD,IACnBD,GAAWa,EAAQM,YAAa,IAC1CnB,EAAUU,WAAWF,EAAOS,IAEvBb"}
\ No newline at end of file
diff --git a/dist/modules/debounce.min.map b/dist/modules/debounce.min.map
deleted file mode 100644
index 4a6d1afb5..000000000
--- a/dist/modules/debounce.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounce.min.js","sources":["debounce.js"],"names":["angular","module","constant","func","wait","immediate","timeout","args","context","timestamp","result","this","arguments","Date","later","last","setTimeout","apply","callNow","options","previous","leading","now","remaining","clearTimeout","trailing"],"mappings":"AAAA,YACAA,SAAQC,OAAO,sCAAuCC,SAAS,WAAY,SAAUC,EAAMC,EAAMC,GAC/F,GAAIC,GAASC,EAAMC,EAASC,EAAWC,CACvC,OAAO,YACLF,EAAUG,KACVJ,EAAOK,UACPH,EAAY,GAAII,KAChB,IAAIC,GAAQ,WACV,GAAIC,GAAO,GAAIF,MAASJ,CACbL,GAAPW,EACFT,EAAUU,WAAWF,EAAOV,EAAOW,IAEnCT,EAAU,KACLD,IACHK,EAASP,EAAKc,MAAMT,EAASD,MAG/BW,EAAUb,IAAcC,CAM5B,OALKA,KACHA,EAAUU,WAAWF,EAAOV,IAE1Bc,IACFR,EAASP,EAAKc,MAAMT,EAASD,IACxBG,KAERR,SAAS,WAAY,SAAUC,EAAMC,EAAMe,GAC5C,GAAIX,GAASD,EAAMG,EACfJ,EAAU,KACVc,EAAW,CACfD,KAAYA,KACZ,IAAIL,GAAQ,WACVM,EAAWD,EAAQE,WAAY,EAAQ,EAAI,GAAIR,MAC/CP,EAAU,KACVI,EAASP,EAAKc,MAAMT,EAASD,GAE/B,OAAO,YACL,GAAIe,GAAM,GAAIT,KACTO,IAAYD,EAAQE,WAAY,IACnCD,EAAWE,EACb,IAAIC,GAAYnB,GAAQkB,EAAMF,EAW9B,OAVAZ,GAAUG,KACVJ,EAAOK,UACU,GAAbW,GACFC,aAAalB,GACbA,EAAU,KACVc,EAAWE,EACXZ,EAASP,EAAKc,MAAMT,EAASD,IACnBD,GAAWa,EAAQM,YAAa,IAC1CnB,EAAUU,WAAWF,EAAOS,IAEvBb"}
\ No newline at end of file
diff --git a/dist/modules/dimensions.js b/dist/modules/dimensions.js
index 4acceab65..4981b16be 100644
--- a/dist/modules/dimensions.js
+++ b/dist/modules/dimensions.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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 14b8e83d9..23bd6d977 100644
--- a/dist/modules/dimensions.min.js
+++ b/dist/modules/dimensions.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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.dimensions",[]).factory("dimensions",["$document","$window",function(){var a=(angular.element,{}),b=a.nodeName=function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()};a.css=function(a,b,c){var d;return d=a.currentStyle?a.currentStyle[b]:window.getComputedStyle?window.getComputedStyle(a)[b]:a.style[b],c===!0?parseFloat(d)||0:d},a.offset=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument;return{width:a.offsetWidth,height:a.offsetHeight,top:b.top+(window.pageYOffset||c.documentElement.scrollTop)-(c.documentElement.clientTop||0),left:b.left+(window.pageXOffset||c.documentElement.scrollLeft)-(c.documentElement.clientLeft||0)}},a.position=function(d){var e,f,g={top:0,left:0};return"fixed"===a.css(d,"position")?f=d.getBoundingClientRect():(e=c(d),f=a.offset(d),f=a.offset(d),b(e,"html")||(g=a.offset(e)),g.top+=a.css(e,"borderTopWidth",!0),g.left+=a.css(e,"borderLeftWidth",!0)),{width:d.offsetWidth,height:d.offsetHeight,top:f.top-g.top-a.css(d,"marginTop",!0),left:f.left-g.left-a.css(d,"marginLeft",!0)}};var c=function(c){var d=c.ownerDocument,e=c.offsetParent||d;if(b(e,"#document"))return d.documentElement;for(;e&&!b(e,"html")&&"static"===a.css(e,"position");)e=e.offsetParent;return e||d.documentElement};return a.height=function(b,c){var d=b.offsetHeight;return c?d+=a.css(b,"marginTop",!0)+a.css(b,"marginBottom",!0):d-=a.css(b,"paddingTop",!0)+a.css(b,"paddingBottom",!0)+a.css(b,"borderTopWidth",!0)+a.css(b,"borderBottomWidth",!0),d},a.width=function(b,c){var d=b.offsetWidth;return c?d+=a.css(b,"marginLeft",!0)+a.css(b,"marginRight",!0):d-=a.css(b,"paddingLeft",!0)+a.css(b,"paddingRight",!0)+a.css(b,"borderLeftWidth",!0)+a.css(b,"borderRightWidth",!0),d},a}]);
-//# sourceMappingURL=dimensions.min.map
\ No newline at end of file
+"use strict";angular.module("mgcrea.ngStrap.helpers.dimensions",[]).factory("dimensions",["$document","$window",function(){var t=(angular.element,{}),e=t.nodeName=function(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()};t.css=function(t,e,o){var n;return n=t.currentStyle?t.currentStyle[e]:window.getComputedStyle?window.getComputedStyle(t)[e]:t.style[e],o===!0?parseFloat(n)||0:n},t.offset=function(t){var e=t.getBoundingClientRect(),o=t.ownerDocument;return{width:t.offsetWidth,height:t.offsetHeight,top:e.top+(window.pageYOffset||o.documentElement.scrollTop)-(o.documentElement.clientTop||0),left:e.left+(window.pageXOffset||o.documentElement.scrollLeft)-(o.documentElement.clientLeft||0)}},t.position=function(n){var s,r,i={top:0,left:0};return"fixed"===t.css(n,"position")?r=n.getBoundingClientRect():(s=o(n),r=t.offset(n),r=t.offset(n),e(s,"html")||(i=t.offset(s)),i.top+=t.css(s,"borderTopWidth",!0),i.left+=t.css(s,"borderLeftWidth",!0)),{width:n.offsetWidth,height:n.offsetHeight,top:r.top-i.top-t.css(n,"marginTop",!0),left:r.left-i.left-t.css(n,"marginLeft",!0)}};var o=function(o){var n=o.ownerDocument,s=o.offsetParent||n;if(e(s,"#document"))return n.documentElement;for(;s&&!e(s,"html")&&"static"===t.css(s,"position");)s=s.offsetParent;return s||n.documentElement};return t.height=function(e,o){var n=e.offsetHeight;return o?n+=t.css(e,"marginTop",!0)+t.css(e,"marginBottom",!0):n-=t.css(e,"paddingTop",!0)+t.css(e,"paddingBottom",!0)+t.css(e,"borderTopWidth",!0)+t.css(e,"borderBottomWidth",!0),n},t.width=function(e,o){var n=e.offsetWidth;return o?n+=t.css(e,"marginLeft",!0)+t.css(e,"marginRight",!0):n-=t.css(e,"paddingLeft",!0)+t.css(e,"paddingRight",!0)+t.css(e,"borderLeftWidth",!0)+t.css(e,"borderRightWidth",!0),n},t}]);
\ No newline at end of file
diff --git a/dist/modules/dimensions.min.js.map b/dist/modules/dimensions.min.js.map
new file mode 100644
index 000000000..03f008d9c
--- /dev/null
+++ b/dist/modules/dimensions.min.js.map
@@ -0,0 +1,8 @@
+/**
+ * angular-strap
+ * @version v2.0.0 - 2014-04-07
+ * @link http://mgcrea.github.io/angular-strap
+ * @author Olivier Louvignes (olivier@mg-crea.com)
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+{"version":3,"file":"dimensions.min.js.map","sources":["dimensions.min.js"],"names":["angular","module","factory","fn","element","nodeName","name","toLowerCase","css","prop","extra","value","currentStyle","window","getComputedStyle","style","parseFloat","offset","boxRect","getBoundingClientRect","docElement","ownerDocument","width","offsetWidth","height","offsetHeight","top","pageYOffset","documentElement","scrollTop","clientTop","left","pageXOffset","scrollLeft","clientLeft","position","offsetParentElement","offsetParentRect","offsetParent","outer"],"mappings":"AAOA,YACAA,SAAQC,OAAO,wCAAyCC,QAAQ,cAC9D,YACA,UACA,WACE,GACIC,IADSH,QAAQI,YAOjBC,EAAWF,EAAGE,SAAW,SAAUD,EAASE,GAC5C,MAAOF,GAAQC,UAAYD,EAAQC,SAASE,gBAAkBD,EAAKC,cAQvEJ,GAAGK,IAAM,SAAUJ,EAASK,EAAMC,GAChC,GAAIC,EASJ,OANEA,GAFEP,EAAQQ,aAEFR,EAAQQ,aAAaH,GACpBI,OAAOC,iBACRD,OAAOC,iBAAiBV,GAASK,GAEjCL,EAAQW,MAAMN,GAEjBC,KAAU,EAAOM,WAAWL,IAAU,EAAIA,GAQnDR,EAAGc,OAAS,SAAUb,GACpB,GAAIc,GAAUd,EAAQe,wBAClBC,EAAahB,EAAQiB,aACzB,QACEC,MAAOlB,EAAQmB,YACfC,OAAQpB,EAAQqB,aAChBC,IAAKR,EAAQQ,KAAOb,OAAOc,aAAeP,EAAWQ,gBAAgBC,YAAcT,EAAWQ,gBAAgBE,WAAa,GAC3HC,KAAMb,EAAQa,MAAQlB,OAAOmB,aAAeZ,EAAWQ,gBAAgBK,aAAeb,EAAWQ,gBAAgBM,YAAc,KASnI/B,EAAGgC,SAAW,SAAU/B,GACtB,GAGKgC,GAAqBnB,EAHtBoB,GACAX,IAAK,EACLK,KAAM,EAoBV,OAjBoC,UAAhC5B,EAAGK,IAAIJ,EAAS,YAElBa,EAASb,EAAQe,yBAGjBiB,EAAsBE,EAAalC,GACnCa,EAASd,EAAGc,OAAOb,GAEnBa,EAASd,EAAGc,OAAOb,GACdC,EAAS+B,EAAqB,UACjCC,EAAmBlC,EAAGc,OAAOmB,IAG/BC,EAAiBX,KAAOvB,EAAGK,IAAI4B,EAAqB,kBAAkB,GACtEC,EAAiBN,MAAQ5B,EAAGK,IAAI4B,EAAqB,mBAAmB,KAIxEd,MAAOlB,EAAQmB,YACfC,OAAQpB,EAAQqB,aAChBC,IAAKT,EAAOS,IAAMW,EAAiBX,IAAMvB,EAAGK,IAAIJ,EAAS,aAAa,GACtE2B,KAAMd,EAAOc,KAAOM,EAAiBN,KAAO5B,EAAGK,IAAIJ,EAAS,cAAc,IAQ9E,IAAIkC,GAAe,SAA6BlC,GAC9C,GAAIgB,GAAahB,EAAQiB,cACrBiB,EAAelC,EAAQkC,cAAgBlB,CAC3C,IAAIf,EAASiC,EAAc,aACzB,MAAOlB,GAAWQ,eACpB,MAAOU,IAAiBjC,EAASiC,EAAc,SAAgD,WAArCnC,EAAGK,IAAI8B,EAAc,aAC7EA,EAAeA,EAAaA,YAE9B,OAAOA,IAAgBlB,EAAWQ,gBAkCpC,OAzBAzB,GAAGqB,OAAS,SAAUpB,EAASmC,GAC7B,GAAI5B,GAAQP,EAAQqB,YAMpB,OALIc,GACF5B,GAASR,EAAGK,IAAIJ,EAAS,aAAa,GAAQD,EAAGK,IAAIJ,EAAS,gBAAgB,GAE9EO,GAASR,EAAGK,IAAIJ,EAAS,cAAc,GAAQD,EAAGK,IAAIJ,EAAS,iBAAiB,GAAQD,EAAGK,IAAIJ,EAAS,kBAAkB,GAAQD,EAAGK,IAAIJ,EAAS,qBAAqB,GAElKO,GASTR,EAAGmB,MAAQ,SAAUlB,EAASmC,GAC5B,GAAI5B,GAAQP,EAAQmB,WAMpB,OALIgB,GACF5B,GAASR,EAAGK,IAAIJ,EAAS,cAAc,GAAQD,EAAGK,IAAIJ,EAAS,eAAe,GAE9EO,GAASR,EAAGK,IAAIJ,EAAS,eAAe,GAAQD,EAAGK,IAAIJ,EAAS,gBAAgB,GAAQD,EAAGK,IAAIJ,EAAS,mBAAmB,GAAQD,EAAGK,IAAIJ,EAAS,oBAAoB,GAElKO,GAEFR"}
\ No newline at end of file
diff --git a/dist/modules/dimensions.min.map b/dist/modules/dimensions.min.map
deleted file mode 100644
index 77a55d926..000000000
--- a/dist/modules/dimensions.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"dimensions.min.js","sources":["dimensions.js"],"names":["angular","module","factory","fn","element","nodeName","name","toLowerCase","css","prop","extra","value","currentStyle","window","getComputedStyle","style","parseFloat","offset","boxRect","getBoundingClientRect","docElement","ownerDocument","width","offsetWidth","height","offsetHeight","top","pageYOffset","documentElement","scrollTop","clientTop","left","pageXOffset","scrollLeft","clientLeft","position","offsetParentElement","offsetParentRect","offsetParent","outer"],"mappings":"AAAA,YACAA,SAAQC,OAAO,wCAAyCC,QAAQ,cAC9D,YACA,UACA,WACE,GACIC,IADSH,QAAQI,YAOjBC,EAAWF,EAAGE,SAAW,SAAUD,EAASE,GAC5C,MAAOF,GAAQC,UAAYD,EAAQC,SAASE,gBAAkBD,EAAKC,cAQvEJ,GAAGK,IAAM,SAAUJ,EAASK,EAAMC,GAChC,GAAIC,EASJ,OANEA,GAFEP,EAAQQ,aAEFR,EAAQQ,aAAaH,GACpBI,OAAOC,iBACRD,OAAOC,iBAAiBV,GAASK,GAEjCL,EAAQW,MAAMN,GAEjBC,KAAU,EAAOM,WAAWL,IAAU,EAAIA,GAQnDR,EAAGc,OAAS,SAAUb,GACpB,GAAIc,GAAUd,EAAQe,wBAClBC,EAAahB,EAAQiB,aACzB,QACEC,MAAOlB,EAAQmB,YACfC,OAAQpB,EAAQqB,aAChBC,IAAKR,EAAQQ,KAAOb,OAAOc,aAAeP,EAAWQ,gBAAgBC,YAAcT,EAAWQ,gBAAgBE,WAAa,GAC3HC,KAAMb,EAAQa,MAAQlB,OAAOmB,aAAeZ,EAAWQ,gBAAgBK,aAAeb,EAAWQ,gBAAgBM,YAAc,KASnI/B,EAAGgC,SAAW,SAAU/B,GACtB,GAGKgC,GAAqBnB,EAHtBoB,GACAX,IAAK,EACLK,KAAM,EAoBV,OAjBoC,UAAhC5B,EAAGK,IAAIJ,EAAS,YAElBa,EAASb,EAAQe,yBAGjBiB,EAAsBE,EAAalC,GACnCa,EAASd,EAAGc,OAAOb,GAEnBa,EAASd,EAAGc,OAAOb,GACdC,EAAS+B,EAAqB,UACjCC,EAAmBlC,EAAGc,OAAOmB,IAG/BC,EAAiBX,KAAOvB,EAAGK,IAAI4B,EAAqB,kBAAkB,GACtEC,EAAiBN,MAAQ5B,EAAGK,IAAI4B,EAAqB,mBAAmB,KAIxEd,MAAOlB,EAAQmB,YACfC,OAAQpB,EAAQqB,aAChBC,IAAKT,EAAOS,IAAMW,EAAiBX,IAAMvB,EAAGK,IAAIJ,EAAS,aAAa,GACtE2B,KAAMd,EAAOc,KAAOM,EAAiBN,KAAO5B,EAAGK,IAAIJ,EAAS,cAAc,IAQ9E,IAAIkC,GAAe,SAA6BlC,GAC9C,GAAIgB,GAAahB,EAAQiB,cACrBiB,EAAelC,EAAQkC,cAAgBlB,CAC3C,IAAIf,EAASiC,EAAc,aACzB,MAAOlB,GAAWQ,eACpB,MAAOU,IAAiBjC,EAASiC,EAAc,SAAgD,WAArCnC,EAAGK,IAAI8B,EAAc,aAC7EA,EAAeA,EAAaA,YAE9B,OAAOA,IAAgBlB,EAAWQ,gBAkCpC,OAzBAzB,GAAGqB,OAAS,SAAUpB,EAASmC,GAC7B,GAAI5B,GAAQP,EAAQqB,YAMpB,OALIc,GACF5B,GAASR,EAAGK,IAAIJ,EAAS,aAAa,GAAQD,EAAGK,IAAIJ,EAAS,gBAAgB,GAE9EO,GAASR,EAAGK,IAAIJ,EAAS,cAAc,GAAQD,EAAGK,IAAIJ,EAAS,iBAAiB,GAAQD,EAAGK,IAAIJ,EAAS,kBAAkB,GAAQD,EAAGK,IAAIJ,EAAS,qBAAqB,GAElKO,GASTR,EAAGmB,MAAQ,SAAUlB,EAASmC,GAC5B,GAAI5B,GAAQP,EAAQmB,WAMpB,OALIgB,GACF5B,GAASR,EAAGK,IAAIJ,EAAS,cAAc,GAAQD,EAAGK,IAAIJ,EAAS,eAAe,GAE9EO,GAASR,EAAGK,IAAIJ,EAAS,eAAe,GAAQD,EAAGK,IAAIJ,EAAS,gBAAgB,GAAQD,EAAGK,IAAIJ,EAAS,mBAAmB,GAAQD,EAAGK,IAAIJ,EAAS,oBAAoB,GAElKO,GAEFR"}
\ No newline at end of file
diff --git a/dist/modules/dropdown.js b/dist/modules/dropdown.js
index 7c136fbe3..043f38be9 100644
--- a/dist/modules/dropdown.js
+++ b/dist/modules/dropdown.js
@@ -1,6 +1,6 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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.min.js b/dist/modules/dropdown.min.js
index 5bba50ee0..437fb627d 100644
--- a/dist/modules/dropdown.min.js
+++ b/dist/modules/dropdown.min.js
@@ -1,9 +1,8 @@
/**
* angular-strap
- * @version v2.0.0-rc.4 - 2014-03-07
+ * @version v2.0.0 - 2014-04-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 a=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(b,c,d){function e(b,e){function h(a){return a.target!==b[0]?a.target!==b[0]&&i.hide():void 0}{var i={},j=angular.extend({},a,e);i.$scope=j.scope&&j.scope.$new()||c.$new()}i=d(b,j),i.$onKeyDown=function(a){if(/(38|40)/.test(a.keyCode)){a.preventDefault(),a.stopPropagation();var b=angular.element(i.$element[0].querySelectorAll("li:not(.divider) a"));if(b.length){var c;angular.forEach(b,function(a,b){g&&g.call(a,":focus")&&(c=b)}),38===a.keyCode&&c>0?c--:40===a.keyCode&&c