interval-braining-ui-asset-pack 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asset_pack/engine.rb +5 -2
  3. data/lib/asset_pack/version.rb +1 -1
  4. data/vendor/assets/bower_components/angular/angular.js +23377 -0
  5. data/vendor/assets/bower_components/angular-animate/angular-animate.js +1729 -0
  6. data/vendor/assets/bower_components/angular-growl-notifications/dist/growl-notifications.js +241 -0
  7. data/vendor/assets/bower_components/angular-input-match/dist/angular-input-match.js +39 -0
  8. data/vendor/assets/bower_components/angular-messages/angular-messages.js +400 -0
  9. data/vendor/assets/bower_components/angular-mocks/angular-mocks.js +2228 -0
  10. data/vendor/assets/bower_components/angular-resource/angular-resource.js +660 -0
  11. data/vendor/assets/bower_components/angular-sanitize/angular-sanitize.js +640 -0
  12. data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.js +3223 -0
  13. data/vendor/assets/bower_components/angular-ui-router-breadcrumbs/dist/angular-ui-router-breadcrumbs.js +82 -0
  14. data/vendor/assets/bower_components/angular-ui-router-helpers/dist/angular-ui-router-helpers.js +52 -0
  15. data/vendor/assets/bower_components/angular-ui-router-hooks-before-state/dist/angular-ui-router-hooks-before-state.js +56 -0
  16. data/vendor/assets/bower_components/angular-validate-in-set/dist/angular-validate-in-set.js +77 -0
  17. data/vendor/assets/bower_components/animate.css/animate.css +3125 -0
  18. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css +5785 -0
  19. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  20. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +229 -0
  21. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  22. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  23. data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.js +1951 -0
  24. data/vendor/assets/bower_components/cardigan/dist/cardigan.css +37 -0
  25. data/vendor/assets/bower_components/cardigan/dist/cardigan.js +239 -0
  26. data/vendor/assets/bower_components/font-awesome-bower/css/font-awesome.css +1338 -0
  27. data/vendor/assets/bower_components/font-awesome-bower/fonts/FontAwesome.otf +0 -0
  28. data/vendor/assets/bower_components/font-awesome-bower/fonts/fontawesome-webfont.eot +0 -0
  29. data/vendor/assets/bower_components/font-awesome-bower/fonts/fontawesome-webfont.svg +414 -0
  30. data/vendor/assets/bower_components/font-awesome-bower/fonts/fontawesome-webfont.ttf +0 -0
  31. data/vendor/assets/bower_components/font-awesome-bower/fonts/fontawesome-webfont.woff +0 -0
  32. data/vendor/assets/bower_components/jquery/dist/jquery.js +9190 -0
  33. data/vendor/assets/bower_components/webfont-OpenSans-Light/dist/OpenSans-Light.css +10 -0
  34. data/vendor/assets/bower_components/webfont-OpenSans-Light/dist/OpenSans-Light.eot +0 -0
  35. data/vendor/assets/bower_components/webfont-OpenSans-Light/dist/OpenSans-Light.svg +1831 -0
  36. data/vendor/assets/bower_components/webfont-OpenSans-Light/dist/OpenSans-Light.ttf +0 -0
  37. data/vendor/assets/bower_components/webfont-OpenSans-Light/dist/OpenSans-Light.woff +0 -0
  38. metadata +36 -2
@@ -0,0 +1,241 @@
1
+ (function(window, document) {
2
+
3
+ // Create all modules and define dependencies to make sure they exist
4
+ // and are loaded in the correct order to satisfy dependency injection
5
+ // before all nested files are concatenated by Grunt
6
+
7
+ // Config
8
+ angular.module('growlNotifications.config', [])
9
+ .value('growlNotifications.config', {
10
+ debug: true
11
+ });
12
+
13
+ // Modules
14
+ angular.module('growlNotifications.directives', []);
15
+ angular.module('growlNotifications.filters', []);
16
+ angular.module('growlNotifications.services', []);
17
+ angular.module('growlNotifications',
18
+ [
19
+ 'growlNotifications.config',
20
+ 'growlNotifications.directives',
21
+ 'growlNotifications.filters',
22
+ 'growlNotifications.services'
23
+ ]);
24
+ angular.module('growlNotifications.directives')
25
+ .directive('growlNotification', ['growlNotifications', '$sce', '$interpolate', function(growlNotifications, $sce, $interpolate){
26
+
27
+ var defaults = {
28
+ message: '',
29
+ type: 'info',
30
+ ttl: 5000
31
+ };
32
+
33
+ return {
34
+ restrict: 'AE',
35
+ replace: true,
36
+ template: '',
37
+ transclude: true,
38
+ link: function(scope, iElem, iAttrs, ctrls, transcludeFn){
39
+
40
+ var options = angular.extend({}, defaults, scope.$eval(iAttrs.growlNotification));
41
+
42
+ transcludeFn(function(elem, scope){
43
+
44
+ var e,
45
+ html,
46
+ interpolateFn,
47
+ safeHtml;
48
+
49
+ // Create temporary wrapper element so we can grab the inner html
50
+ e = angular.element(document.createElement('div'));
51
+ e.append(elem);
52
+ html = e.html();
53
+
54
+ // Interpolate expressions in current scope
55
+ interpolateFn = $interpolate(html);
56
+ html = interpolateFn(scope);
57
+
58
+ // Tell Angular the HTML can be trusted so it can be used in ng-bind-html
59
+ safeHtml = $sce.trustAsHtml(html);
60
+
61
+ // Add notification
62
+ growlNotifications.add(safeHtml, options.type, options.ttl);
63
+ });
64
+ }
65
+
66
+ };
67
+
68
+ }]);angular.module('growlNotifications.directives')
69
+ .directive('growlNotifications', ['growlNotifications', function(growlNotifications){
70
+
71
+ return {
72
+ restrict: 'AE',
73
+ replace: false,
74
+ scope: {},
75
+ template: [
76
+ '<ul class="list-unstyled">',
77
+ ' <li ng-repeat="(id, notification) in notifications">',
78
+ ' <div class="{{cssPrefix}} {{cssPrefix}}-{{notification.type}}">',
79
+ ' <div ng-bind-html="notification.message">',
80
+ ' </div>',
81
+ ' </div>',
82
+ ' </li>',
83
+ '</ul>'
84
+ ].join('\n'),
85
+ link: function(scope){
86
+ scope.cssPrefix = growlNotifications.options.cssPrefix;
87
+ scope.notifications = growlNotifications.notifications;
88
+ }
89
+ };
90
+
91
+ }]);angular.module('growlNotifications.services')
92
+ .provider('growlNotifications', [function () {
93
+
94
+ // Default options
95
+ var options = {
96
+ ttl: 5000,
97
+ type: 'info',
98
+
99
+ // Default css prefix that is used to construct growl css classes
100
+ // 2 classes will be added: cssPrefix and cssPrefix-type to support
101
+ // Bootstrap alerts out of the box
102
+ cssPrefix: 'alert'
103
+ };
104
+
105
+ /**
106
+ * Provider method to change default options
107
+ *
108
+ * @param newOptions
109
+ */
110
+ this.setOptions = function (newOptions) {
111
+ angular.extend(options, newOptions);
112
+ return this;
113
+ };
114
+
115
+ /**
116
+ * Provider convenience method to get or set default ttl
117
+ *
118
+ * @param ttl
119
+ * @returns {*}
120
+ */
121
+ this.ttl = function(ttl){
122
+ if(angular.isDefined(ttl)){
123
+ options.ttl = ttl;
124
+ return this;
125
+ }
126
+ return options.ttl;
127
+ };
128
+
129
+ /**
130
+ * Provider convenience method to get or set default type
131
+ *
132
+ * @param type
133
+ * @returns {*}
134
+ */
135
+ this.type = function(type){
136
+ if(angular.isDefined(type)){
137
+ options.type = type;
138
+ return this;
139
+ }
140
+ return options.type;
141
+ };
142
+
143
+ /**
144
+ * Provider convenience method to get or set default type
145
+ *
146
+ * @param type
147
+ * @returns {*}
148
+ */
149
+ this.cssPrefix = function(cssPrefix){
150
+ if(angular.isDefined(cssPrefix)){
151
+ options.cssPrefix = cssPrefix;
152
+ return this;
153
+ }
154
+ return options.cssPrefix;
155
+ };
156
+
157
+ /**
158
+ * Factory method
159
+ *
160
+ * @param $timeout
161
+ * @param $rootScope
162
+ * @returns {GrowlNotifications}
163
+ */
164
+ this.$get = function ($timeout, $rootScope) {
165
+
166
+ function GrowlNotifications() {
167
+
168
+ this._notifications = {};
169
+ this._index = 0;
170
+
171
+ this.options = options;
172
+
173
+ Object.defineProperty(this, 'notifications', {
174
+ get: function(){
175
+ return this._notifications;
176
+ }
177
+ });
178
+
179
+ }
180
+
181
+ GrowlNotifications.prototype._broadcastUpdate = function () {
182
+ $rootScope.$broadcast('growlNotifications::update', this.notifications);
183
+ };
184
+
185
+ /**
186
+ * Add a notification
187
+ *
188
+ * @param type
189
+ * @param message
190
+ * @param ttl
191
+ * @returns {number} notification id that can be used to remove the notification
192
+ */
193
+ GrowlNotifications.prototype.add = function (message, type, ttl) {
194
+
195
+ var notification,
196
+ index = this._index++,
197
+ self = this;
198
+
199
+ notification = {
200
+ message: (message ? message.toString() : ''),
201
+ type : (type ? type.toString() : options.type),
202
+ ttl : (ttl ? parseInt(ttl, 10) : options.ttl)
203
+ };
204
+
205
+ this._notifications[index] = notification;
206
+
207
+ $timeout(function () {
208
+ self.remove(index);
209
+ }, notification.ttl);
210
+
211
+ // Broadcast change
212
+ this._broadcastUpdate();
213
+
214
+ return index;
215
+
216
+ };
217
+
218
+ /**
219
+ * Remove a notification by index
220
+ * @param index
221
+ * @returns {GrowlNotifications}
222
+ */
223
+ GrowlNotifications.prototype.remove = function (index) {
224
+ if (this._notifications.hasOwnProperty(index)) {
225
+ delete this._notifications[index];
226
+
227
+ // Broadcast change
228
+ this._broadcastUpdate();
229
+ }
230
+
231
+ return this;
232
+ };
233
+
234
+ return new GrowlNotifications();
235
+
236
+ };
237
+
238
+ this.$get.$inject = ['$timeout', '$rootScope'];
239
+
240
+
241
+ }]);})(window, document);
@@ -0,0 +1,39 @@
1
+ /**
2
+ * angular-input-match
3
+ * ngModel validation for matching model attributes
4
+ * @version v0.0.1-dev-2014-04-19
5
+ * @link https://github.com/interval-braining/angular-input-match
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+
9
+ if (typeof module !== "undefined" && typeof exports !== "undefined" && module.exports === exports){
10
+ module.exports = 'directives.inputMatch';
11
+ }
12
+
13
+ (function (window, angular, undefined) {
14
+ "use strict";
15
+ // Source: src/angular_input_match.js
16
+ var inputMatch = angular.module('directives.inputMatch', []);
17
+ inputMatch.directive('match', function () {
18
+
19
+ function link(scope, elem, attrs, ctrl) {
20
+ if(!ctrl) { return; }
21
+
22
+ scope.$watch(
23
+ function() {
24
+ return (ctrl.$pristine && angular.isUndefined(ctrl.$modelValue)) || scope.match === ctrl.$modelValue;
25
+ },
26
+ function(currentValue) {
27
+ ctrl.$setValidity('match', currentValue);
28
+ }
29
+ );
30
+ }
31
+
32
+ return {
33
+ link: link,
34
+ require: '?ngModel',
35
+ restrict: 'A',
36
+ scope: { match: '=' }
37
+ };
38
+ });
39
+ })(window, window.angular);
@@ -0,0 +1,400 @@
1
+ /**
2
+ * @license AngularJS v1.3.0-build.2991+sha.9025113
3
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
4
+ * License: MIT
5
+ */
6
+ (function(window, angular, undefined) {'use strict';
7
+
8
+ /**
9
+ * @ngdoc module
10
+ * @name ngMessages
11
+ * @description
12
+ *
13
+ * The `ngMessages` module provides enhanced support for displaying messages within templates
14
+ * (typically within forms or when rendering message objects that return key/value data).
15
+ * Instead of relying on JavaScript code and/or complex ng-if statements within your form template to
16
+ * show and hide error messages specific to the state of an input field, the `ngMessages` and
17
+ * `ngMessage` directives are designed to handle the complexity, inheritance and priority
18
+ * sequencing based on the order of how the messages are defined in the template.
19
+ *
20
+ * Currently, the ngMessages module only contains the code for the `ngMessages`
21
+ * and `ngMessage` directives.
22
+ *
23
+ * # Usage
24
+ * The `ngMessages` directive listens on a key/value collection which is set on the ngMessages attribute.
25
+ * Since the {@link ngModel ngModel} directive exposes an `$error` object, this error object can be
26
+ * used with `ngMessages` to display control error messages in an easier way than with just regular angular
27
+ * template directives.
28
+ *
29
+ * ```html
30
+ * <form name="myForm">
31
+ * <input type="text" ng-model="field" name="myField" required minlength="5" />
32
+ * <div ng-messages="myForm.myField.$error">
33
+ * <div ng-message="required">You did not enter a field</div>
34
+ * <div ng-message="minlength">The value entered is too short</div>
35
+ * </div>
36
+ * </form>
37
+ * ```
38
+ *
39
+ * Now whatever key/value entries are present within the provided object (in this case `$error`) then
40
+ * the ngMessages directive will render the inner first ngMessage directive (depending if the key values
41
+ * match the attribute value present on each ngMessage directive). In other words, if your errors
42
+ * object contains the following data:
43
+ *
44
+ * ```javascript
45
+ * <!-- keep in mind that ngModel automatically sets these error flags -->
46
+ * myField.$error = { minlength : true, required : false };
47
+ * ```
48
+ *
49
+ * Then the `required` message will be displayed first. When required is false then the `minlength` message
50
+ * will be displayed right after (since these messages are ordered this way in the template HTML code).
51
+ * The prioritization of each message is determined by what order they're present in the DOM.
52
+ * Therefore, instead of having custom JavaScript code determine the priority of what errors are
53
+ * present before others, the presentation of the errors are handled within the template.
54
+ *
55
+ * By default, ngMessages will only display one error at a time. However, if you wish to display all
56
+ * messages then the `ng-messages-multiple` attribute flag can be used on the element containing the
57
+ * ngMessages directive to make this happen.
58
+ *
59
+ * ```html
60
+ * <div ng-messages="myForm.myField.$error" ng-messages-multiple>...</div>
61
+ * ```
62
+ *
63
+ * ## Reusing and Overriding Messages
64
+ * In addition to prioritization, ngMessages also allows for including messages from a remote or an inline
65
+ * template. This allows for generic collection of messages to be reused across multiple parts of an
66
+ * application.
67
+ *
68
+ * ```html
69
+ * <script type="text/ng-template" id="error-messages">
70
+ * <div ng-message="required">This field is required</div>
71
+ * <div ng-message="minlength">This field is too short</div>
72
+ * </script>
73
+ * <div ng-messages="myForm.myField.$error" ng-messages-include="error-messages"></div>
74
+ * ```
75
+ *
76
+ * However, including generic messages may not be useful enough to match all input fields, therefore,
77
+ * `ngMessages` provides the ability to override messages defined in the remote template by redefining
78
+ * then within the directive container.
79
+ *
80
+ * ```html
81
+ * <!-- a generic template of error messages known as "my-custom-messages" -->
82
+ * <script type="text/ng-template" id="my-custom-messages">
83
+ * <div ng-message="required">This field is required</div>
84
+ * <div ng-message="minlength">This field is too short</div>
85
+ * </script>
86
+ *
87
+ * <form name="myForm">
88
+ * <input type="email"
89
+ * id="email"
90
+ * name="myEmail"
91
+ * ng-model="email"
92
+ * minlength="5"
93
+ * required />
94
+ *
95
+ * <div ng-messages="myForm.myEmail.$error" ng-messages-include="my-custom-messages">
96
+ * <!-- this required message has overridden the template message -->
97
+ * <div ng-message="required">You did not enter your email address</div>
98
+ *
99
+ * <!-- this is a brand new message and will appear last in the prioritization -->
100
+ * <div ng-message="email">Your email address is invalid</div>
101
+ * </div>
102
+ * </form>
103
+ * ```
104
+ *
105
+ * In the example HTML code above the message that is set on required will override the corresponding
106
+ * required message defined within the remote template. Therefore, with particular input fields (such
107
+ * email addresses, date fields, autocomplete inputs, etc...), specialized error messages can be applied
108
+ * while more generic messages can be used to handle other, more general input errors.
109
+ *
110
+ * ## Animations
111
+ * If the `ngAnimate` module is active within the application then both the `ngMessages` and
112
+ * `ngMessage` directives will trigger animations whenever any messages are added and removed
113
+ * from the DOM by the `ngMessages` directive.
114
+ *
115
+ * Whenever the `ngMessages` directive contains one or more visible messages then the `.ng-active` CSS
116
+ * class will be added to the element. The `.ng-inactive` CSS class will be applied when there are no
117
+ * animations present. Therefore, CSS transitions and keyframes as well as JavaScript animations can
118
+ * hook into the animations whenever these classes are added/removed.
119
+ *
120
+ * Let's say that our HTML code for our messages container looks like so:
121
+ *
122
+ * ```html
123
+ * <div ng-messages="myMessages" class="my-messages">
124
+ * <div ng-message="alert" class="some-message">...</div>
125
+ * <div ng-message="fail" class="some-message">...</div>
126
+ * </div>
127
+ * ```
128
+ *
129
+ * Then the CSS animation code for the message container looks like so:
130
+ *
131
+ * ```css
132
+ * .my-messages {
133
+ * transition:1s linear all;
134
+ * }
135
+ * .my-messages.ng-active {
136
+ * // messages are visible
137
+ * }
138
+ * .my-messages.ng-inactive {
139
+ * // messages are hidden
140
+ * }
141
+ * ```
142
+ *
143
+ * Whenever an inner message is attached (becomes visible) or removed (becomes hidden) then the enter
144
+ * and leave animation is triggered for each particular element bound to the `ngMessage` directive.
145
+ *
146
+ * Therefore, the CSS code for the inner messages looks like so:
147
+ *
148
+ * ```css
149
+ * .some-message {
150
+ * transition:1s linear all;
151
+ * }
152
+ *
153
+ * .some-message.ng-enter {}
154
+ * .some-message.ng-enter.ng-enter-active {}
155
+ *
156
+ * .some-message.ng-leave {}
157
+ * .some-message.ng-leave.ng-leave-active {}
158
+ * ```
159
+ *
160
+ * {@link ngAnimate Click here} to learn how to use JavaScript animations or to learn more about ngAnimate.
161
+ */
162
+ angular.module('ngMessages', [])
163
+
164
+ /**
165
+ * @ngdoc directive
166
+ * @module ngMessages
167
+ * @name ngMessages
168
+ * @restrict AE
169
+ *
170
+ * @description
171
+ * `ngMessages` is a directive that is designed to show and hide messages based on the state
172
+ * of a key/value object that it listens on. The directive itself compliments error message
173
+ * reporting with the `ngModel` $error object (which stores a key/value state of validation errors).
174
+ *
175
+ * `ngMessages` manages the state of internal messages within its container element. The internal
176
+ * messages use the `ngMessage` directive and will be inserted/removed from the page depending
177
+ * on if they're present within the key/value object. By default, only one message will be displayed
178
+ * at a time and this depends on the prioritization of the messages within the template. (This can
179
+ * be changed by using the ng-messages-multiple on the directive container.)
180
+ *
181
+ * A remote template can also be used to promote message reuseability and messages can also be
182
+ * overridden.
183
+ *
184
+ * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.
185
+ *
186
+ * @usage
187
+ * ```html
188
+ * <!-- using attribute directives -->
189
+ * <ANY ng-messages="expression">
190
+ * <ANY ng-message="keyValue1">...</ANY>
191
+ * <ANY ng-message="keyValue2">...</ANY>
192
+ * <ANY ng-message="keyValue3">...</ANY>
193
+ * </ANY>
194
+ *
195
+ * <!-- or by using element directives -->
196
+ * <ng-messages for="expression">
197
+ * <ng-message when="keyValue1">...</ng-message>
198
+ * <ng-message when="keyValue2">...</ng-message>
199
+ * <ng-message when="keyValue3">...</ng-message>
200
+ * </ng-messages>
201
+ * ```
202
+ *
203
+ * @param {string} ngMessages an angular expression evaluating to a key/value object
204
+ * (this is typically the $error object on an ngModel instance).
205
+ * @param {string=} ngMessagesMultiple|multiple when set, all messages will be displayed with true
206
+ * @param {string=} ngMessagesInclude|include when set, the specified template will be included into the ng-messages container
207
+ *
208
+ * @example
209
+ * <example name="ngMessages-directive" module="ngMessagesExample"
210
+ * deps="angular-messages.js"
211
+ * animations="true" fixBase="true">
212
+ * <file name="index.html">
213
+ * <form name="myForm">
214
+ * <label>Enter your name:</label>
215
+ * <input type="text"
216
+ * name="myName"
217
+ * ng-model="name"
218
+ * ng-minlength="5"
219
+ * ng-maxlength="20"
220
+ * required />
221
+ *
222
+ * <pre>myForm.myName.$error = {{ myForm.myName.$error | json }}</pre>
223
+ *
224
+ * <div ng-messages="myForm.myName.$error" style="color:maroon">
225
+ * <div ng-message="required">You did not enter a field</div>
226
+ * <div ng-message="minlength">Your field is too short</div>
227
+ * <div ng-message="maxlength">Your field is too long</div>
228
+ * </div>
229
+ * </form>
230
+ * </file>
231
+ * <file name="script.js">
232
+ * angular.module('ngMessagesExample', ['ngMessages']);
233
+ * </file>
234
+ * </example>
235
+ */
236
+ .directive('ngMessages', ['$compile', '$animate', '$http', '$templateCache',
237
+ function($compile, $animate, $http, $templateCache) {
238
+ var ACTIVE_CLASS = 'ng-active';
239
+ var INACTIVE_CLASS = 'ng-inactive';
240
+
241
+ return {
242
+ restrict: 'AE',
243
+ controller: ['$scope', function($scope) {
244
+ this.$renderNgMessageClasses = angular.noop;
245
+
246
+ var messages = [];
247
+ this.registerMessage = function(index, message) {
248
+ for(var i = 0; i < messages.length; i++) {
249
+ if(messages[i].type == message.type) {
250
+ if(index != i) {
251
+ var temp = messages[index];
252
+ messages[index] = messages[i];
253
+ if(index < messages.length) {
254
+ messages[i] = temp;
255
+ } else {
256
+ messages.splice(0, i); //remove the old one (and shift left)
257
+ }
258
+ }
259
+ return;
260
+ }
261
+ }
262
+ messages.splice(index, 0, message); //add the new one (and shift right)
263
+ };
264
+
265
+ this.renderMessages = function(values, multiple) {
266
+ values = values || {};
267
+
268
+ var found;
269
+ angular.forEach(messages, function(message) {
270
+ if((!found || multiple) && truthyVal(values[message.type])) {
271
+ message.attach();
272
+ found = true;
273
+ } else {
274
+ message.detach();
275
+ }
276
+ });
277
+
278
+ this.renderElementClasses(found);
279
+
280
+ function truthyVal(value) {
281
+ return value !== null && value !== false && value;
282
+ }
283
+ };
284
+ }],
285
+ require: 'ngMessages',
286
+ link: function($scope, element, $attrs, ctrl) {
287
+ ctrl.renderElementClasses = function(bool) {
288
+ bool ? $animate.setClass(element, ACTIVE_CLASS, INACTIVE_CLASS)
289
+ : $animate.setClass(element, INACTIVE_CLASS, ACTIVE_CLASS);
290
+ };
291
+
292
+ //JavaScript treats empty strings as false, but ng-message-multiple by itself is an empty string
293
+ var multiple = angular.isString($attrs.ngMessagesMultiple) ||
294
+ angular.isString($attrs.multiple);
295
+
296
+ var cachedValues, watchAttr = $attrs.ngMessages || $attrs['for']; //for is a reserved keyword
297
+ $scope.$watchCollection(watchAttr, function(values) {
298
+ cachedValues = values;
299
+ ctrl.renderMessages(values, multiple);
300
+ });
301
+
302
+ var tpl = $attrs.ngMessagesInclude || $attrs.include;
303
+ if(tpl) {
304
+ $http.get(tpl, { cache: $templateCache })
305
+ .success(function processTemplate(html) {
306
+ var after, container = angular.element('<div/>').html(html);
307
+ angular.forEach(container.children(), function(elm) {
308
+ elm = angular.element(elm);
309
+ after ? after.after(elm)
310
+ : element.prepend(elm); //start of the container
311
+ after = elm;
312
+ $compile(elm)($scope);
313
+ });
314
+ ctrl.renderMessages(cachedValues, multiple);
315
+ });
316
+ }
317
+ }
318
+ };
319
+ }])
320
+
321
+
322
+ /**
323
+ * @ngdoc directive
324
+ * @name ngMessage
325
+ * @restrict AE
326
+ * @scope
327
+ *
328
+ * @description
329
+ * `ngMessage` is a directive with the purpose to show and hide a particular message.
330
+ * For `ngMessage` to operate, a parent `ngMessages` directive on a parent DOM element
331
+ * must be situated since it determines which messages are visible based on the state
332
+ * of the provided key/value map that `ngMessages` listens on.
333
+ *
334
+ * @usage
335
+ * ```html
336
+ * <!-- using attribute directives -->
337
+ * <ANY ng-messages="expression">
338
+ * <ANY ng-message="keyValue1">...</ANY>
339
+ * <ANY ng-message="keyValue2">...</ANY>
340
+ * <ANY ng-message="keyValue3">...</ANY>
341
+ * </ANY>
342
+ *
343
+ * <!-- or by using element directives -->
344
+ * <ng-messages for="expression">
345
+ * <ng-message when="keyValue1">...</ng-message>
346
+ * <ng-message when="keyValue2">...</ng-message>
347
+ * <ng-message when="keyValue3">...</ng-message>
348
+ * </ng-messages>
349
+ * ```
350
+ *
351
+ * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.
352
+ *
353
+ * @param {string} ngMessage a string value corresponding to the message key.
354
+ */
355
+ .directive('ngMessage', ['$animate', function($animate) {
356
+ var COMMENT_NODE = 8;
357
+ return {
358
+ require: '^ngMessages',
359
+ transclude: 'element',
360
+ terminal: true,
361
+ restrict: 'AE',
362
+ link: function($scope, $element, $attrs, ngMessages, $transclude) {
363
+ var index, element;
364
+
365
+ var commentNode = $element[0];
366
+ var parentNode = commentNode.parentNode;
367
+ for(var i = 0, j = 0; i < parentNode.childNodes.length; i++) {
368
+ var node = parentNode.childNodes[i];
369
+ if(node.nodeType == COMMENT_NODE && node.nodeValue.indexOf('ngMessage') >= 0) {
370
+ if(node === commentNode) {
371
+ index = j;
372
+ break;
373
+ }
374
+ j++;
375
+ }
376
+ }
377
+
378
+ ngMessages.registerMessage(index, {
379
+ type : $attrs.ngMessage || $attrs.when,
380
+ attach : function() {
381
+ if(!element) {
382
+ $transclude($scope, function(clone) {
383
+ $animate.enter(clone, null, $element);
384
+ element = clone;
385
+ });
386
+ }
387
+ },
388
+ detach : function(now) {
389
+ if(element) {
390
+ $animate.leave(element);
391
+ element = null;
392
+ }
393
+ }
394
+ });
395
+ }
396
+ };
397
+ }]);
398
+
399
+
400
+ })(window, window.angular);