xooie 0.1.7 → 1.0.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 (28) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -6
  3. data/lib/xooie.rb +1 -3
  4. data/vendor/assets/javascripts/xooie/addons/base.js +211 -46
  5. data/vendor/assets/javascripts/xooie/addons/carousel_lentils.js +0 -0
  6. data/vendor/assets/javascripts/xooie/addons/carousel_pagination.js +0 -0
  7. data/vendor/assets/javascripts/xooie/addons/dropdown_accordion.js +0 -0
  8. data/vendor/assets/javascripts/xooie/addons/tab_animation.js +0 -0
  9. data/vendor/assets/javascripts/xooie/addons/tab_automation.js +0 -0
  10. data/vendor/assets/javascripts/xooie/base.js +1 -4
  11. data/vendor/assets/javascripts/xooie/carousel.js +5 -5
  12. data/vendor/assets/javascripts/xooie/dialog.js +2 -31
  13. data/vendor/assets/javascripts/xooie/dropdown.js +5 -17
  14. data/vendor/assets/javascripts/xooie/event_handler.js +83 -0
  15. data/vendor/assets/javascripts/xooie/helpers.js +61 -0
  16. data/vendor/assets/javascripts/xooie/keyboard_navigation.js +216 -0
  17. data/vendor/assets/javascripts/xooie/shared.js +175 -0
  18. data/vendor/assets/javascripts/xooie/stylesheet.js +77 -78
  19. data/vendor/assets/javascripts/xooie/tab.js +0 -0
  20. data/vendor/assets/javascripts/xooie/widgets/accordion.js +52 -0
  21. data/vendor/assets/javascripts/xooie/widgets/base.js +644 -0
  22. data/vendor/assets/javascripts/xooie/widgets/carousel.js +769 -0
  23. data/vendor/assets/javascripts/xooie/widgets/dialog.js +132 -0
  24. data/vendor/assets/javascripts/xooie/widgets/dropdown.js +283 -0
  25. data/vendor/assets/javascripts/xooie/widgets/tab.js +332 -0
  26. data/vendor/assets/javascripts/xooie/xooie.js +282 -0
  27. data/vendor/assets/javascripts/xooie.js +0 -0
  28. metadata +17 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 602799066fe9227b564b94b1b7d1ccc2c9c19761
4
- data.tar.gz: c29216021a9316b37eef6620d51ef54405aba818
3
+ metadata.gz: 4ab042b8a8738d53a37ca8896d4cdc6a58240e40
4
+ data.tar.gz: 092d46a6f2abd0b7142c5d7325e2bcc5a86baafa
5
5
  SHA512:
6
- metadata.gz: 4556350ac6fb0aa61340262440789340ada0065345eaca9658c27d0100269b53e21a9e7ecd89e0fd4ca44101179795788a5c1e60f659ac4d1f2f97c658fb4373
7
- data.tar.gz: 1d5821b24eb0eb33575196f582dec64f2c5c6c1b056c05b7290f5669917220aee9e30b5afe52d2c428b0d3801e865587c735e9554466cbec44d57e34bca67795
6
+ metadata.gz: 072980e920a4abd117dbc89b6136d0baf1101c56bfe45021983afb0d5fdcd6b1bd46e9c9c0129acd184c591aed11b24150994ddba644783328b90d97a17b6eef
7
+ data.tar.gz: 9e1241ae13314e68ce0fb9b195f0924dee1120026dd5335428b08ad0e73b82e19b69db9e99c37c6d7037e92bcb04ffb161eee4c3ebf79c2d12ce2ca1595b8fdb
data/README.md CHANGED
@@ -30,12 +30,6 @@ Xooie will work by just loading xooie.js on your page; all other files will be l
30
30
 
31
31
  Instantiation happens automatically when the page is loaded. All HTML elements tagged with the "data-widget-type" attribute will offer the associated Xooie widget functionality.
32
32
 
33
- 1.x vs 0.1.x:
34
- ---
35
- v1.0 is our official release of Xooie. All new feature development & bug fixes occur on [master](https://github.com/Comcast/Xooie) & are released from a release_1_x branch (e.g. [release_1_1](https://github.com/Comcast/Xooie/tree/release_1_1)). So if you're just getting started with Xooie, be sure to grab the latest 1.x version.
36
-
37
- If you were already using a pre-1.0 release of Xooie, there is a [release_0_1_x branch](https://github.com/Comcast/Xooie/tree/release_0_1_x) that is updated with bug fixes only. Any 0.1.x release is from the pre-1.0 Xooie development work.
38
-
39
33
  Documentation:
40
34
  ---
41
35
  Carousel
data/lib/xooie.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  module Xooie
2
2
  module Rails
3
- if defined?(::Rails)
4
- class Engine < ::Rails::Engine
5
- end
3
+ class Engine < ::Rails::Engine
6
4
  end
7
5
  end
8
6
  end
@@ -14,63 +14,228 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- define('xooie/addons/base', ['jquery'], function($) {
18
- var Base = function(name, constructor){
19
- var defaultOptions, initEvent, className, wrapper;
20
-
21
- defaultOptions = {};
22
- initEvent = 'xooie-addon-init.' + name.toLowerCase();
23
- className = 'has-' + name.toLowerCase() + '-addon';
24
-
25
- wrapper = function(module) {
26
- //Let's check to see if module is defined...
27
- //TODO: intelligently check if module is an instance of the base ui class
28
- if (typeof module === 'undefined') {
29
- return false;
17
+ /**
18
+ * class Xooie.Addon
19
+ *
20
+ * The base xooie addon module. This module defines how addons function in relation to
21
+ * widgets, but contains no specific functionality.
22
+ **/
23
+ define('xooie/addons/base', ['jquery', 'xooie/shared'], function($, shared) {
24
+ /**
25
+ * Xooie.Addon@xooie-addon-init(event)
26
+ * - event (Event): A jQuery event object
27
+ *
28
+ * A jQuery special event triggered when the addon is successfully initialized. Triggers on the `root` element
29
+ * of the adodn's widget. Unlike [[Xooie.Widget@xooie-init]], this event only triggers when the addon is first instantiated.
30
+ **/
31
+
32
+ /**
33
+ * new Xooie.Addon(widget)
34
+ * - widget (Widget): An instance of [[Xooie.Widget]].
35
+ *
36
+ * Instantiating a new Addon associates the addon with the widget passed into the constructor. The addon is
37
+ * stored in the [[Xooie.Widget#addons]] collection.
38
+ **/
39
+ var Addon = function(widget) {
40
+ var self = this;
41
+
42
+ // Check to see if the module is defined:
43
+ if (typeof widget === 'undefined') {
44
+ return false;
45
+ }
46
+
47
+ // If there is already an instance of this addon instantiated for the module, return it:
48
+ if (widget.addons() && widget.addons().hasOwnProperty(this.name())) {
49
+ return widget.addons()[this.name()];
50
+ }
51
+
52
+ // Add this addon to the widget's addons collection:
53
+ widget.addons()[this.name()] = this;
54
+
55
+ widget.root().addClass(this.addonClass());
56
+
57
+ // Reference the widget:
58
+ this.widget(widget);
59
+
60
+ // Check to see if there are any additional constructors to call;
61
+ var initCheck = function(){
62
+ var i;
63
+
64
+ if (!self._extendCount || self._extendCount <= 0) {
65
+ self.widget().root().trigger(self.get('initEvent'));
66
+ self._extendCount = null;
67
+ } else {
68
+ setTimeout(initCheck, 0);
30
69
  }
70
+ };
31
71
 
32
- //if we've already instantiated an instance of this addon for this module, return it
33
- if (module.addons && typeof module.addons[name] !== 'undefined') {
34
- return module.addons[name];
35
- }
36
-
37
- //module is the module we are extending.
38
- this.module = module;
39
-
40
- //track this addon on the parent module
41
- this.module.addons[name] = this;
42
-
43
- //We'll need to extend the module's base properties
44
- this.options = $.extend({}, wrapper.getDefaultOptions(), this.module.options);
72
+ if (this._extendCount > 0) {
73
+ setTimeout(initCheck, 0);
74
+ } else {
75
+ initCheck();
76
+ }
77
+ };
45
78
 
46
- this.module.root.addClass(className);
79
+ /**
80
+ * Xooie.Addon.defineReadOnly(name, defaultValue)
81
+ * - name (String): The name of the property to define as a read-only property.
82
+ * - defaultValue (Object): An optional default value.
83
+ *
84
+ * See [[Xooie.shared.defineReadOnly]].
85
+ **/
86
+ Addon.defineReadOnly = function(name, defaultValue){
87
+ shared.defineReadOnly(this, name, defaultValue);
88
+ };
47
89
 
48
- constructor.apply(this, arguments);
90
+ /**
91
+ * Xooie.Addon.defineWriteOnly(name)
92
+ * - name (String): The name of the property to define as a write-only property
93
+ *
94
+ * See [[Xooie.shared.defineWriteOnly]].
95
+ **/
96
+ Addon.defineWriteOnly = function(name){
97
+ shared.defineWriteOnly(this, name);
98
+ };
49
99
 
50
- this.module.root.trigger(initEvent);
100
+ /**
101
+ * Xooie.Widget.define(name[, defaultValue])
102
+ * - name (String): The name of the property to define.
103
+ * - defaultValue: An optional default value.
104
+ *
105
+ * A method that defines a property as both readable and writable. In reality it calls both [[Xooie.Addon.defineReadOnly]]
106
+ * and [[Xooie.Addon.defineWriteOnly]].
107
+ **/
108
+ Addon.define = function(name, defaultValue){
109
+ this.defineReadOnly(name, defaultValue);
110
+ this.defineWriteOnly(name);
111
+ };
51
112
 
52
- };
113
+ /**
114
+ * Xooie.Addon.extend(constr) -> Addon
115
+ * - constr (Function): The constructor for the new [[Xooie.Addon]] class.
116
+ *
117
+ * See [[Xooie.shared.extend]].
118
+ **/
119
+ Addon.extend = function(constr){
120
+ return shared.extend(constr, this);
121
+ };
53
122
 
54
- wrapper.prototype.cleanup = function() {
55
- this.module.root.removeClass(className);
56
- };
123
+ /** internal
124
+ * Xooie.Addon#_definedProps -> Array
125
+ *
126
+ * Same as [[Xooie.Widget#_definedProps]].
127
+ **/
128
+ Addon.prototype._definedProps = [];
129
+
130
+ /** internal
131
+ * Xooie.Addon#_extendCount -> Integer | null
132
+ *
133
+ * Same as [[Xooie.Widget#_extendCount]].
134
+ **/
135
+ Addon.prototype._extendCount = null;
136
+
137
+ /** internal
138
+ * Xooie.Addon#_widget -> Widget
139
+ *
140
+ * The widget for which this addon was instantiated.
141
+ **/
142
+ /**
143
+ * Xooie.Addon#widget([value]) -> Widget
144
+ * - value: an optional value to be set.
145
+ *
146
+ * The method for setting or getting [[Xooie.Addon#_widget]]. Returns the current value of
147
+ * [[Xooie.Addon#_widget]] if no value is passed or sets the value.
148
+ **/
149
+ Addon.define('widget');
150
+
151
+ /** internal
152
+ * Xooie.Addon#_name -> String
153
+ *
154
+ * The name of the addon.
155
+ **/
156
+ /**
157
+ * Xooie.Addon#name([value]) -> String
158
+ * - value: an optional value to be set.
159
+ *
160
+ * The method for setting or getting [[Xooie.Addon#_name]]. Returns the current value of
161
+ * [[Xooie.Addon#_name]] if no value is passed or sets the value.
162
+ **/
163
+ Addon.define('name', 'addon');
164
+
165
+ /** internal, read-only
166
+ * Xooie.Addon#_initEvent -> String
167
+ *
168
+ * The name of the event triggered when the addon is instantiated.
169
+ **/
170
+ /** read-only
171
+ * Xooie.Addon#initEvent() -> String
172
+ *
173
+ * The method for getting [[Xooie.Addon#_initEvent]].
174
+ **/
175
+ Addon.defineReadOnly('initEvent', 'xooie-addon-init');
176
+
177
+ /** internal, read-only
178
+ * Xooie.Addon#_addonClass -> String
179
+ *
180
+ * The class added to the widget root indicating that this addon has been instantiated.
181
+ **/
182
+ /** read-only
183
+ * Xooie.Addon#addonClass() -> String
184
+ *
185
+ * The method for getting [[Xooie.Addon#_addonClass]].
186
+ **/
187
+ Addon.defineReadOnly('addonClass', 'has-addon');
188
+
189
+ /**
190
+ * Xooie.Addon#get(name) -> object
191
+ * - name (String): The name of the property to be retrieved.
192
+ *
193
+ * See [[Xooie.shared.get]].
194
+ **/
195
+ Addon.prototype.get = function(name) {
196
+ return shared.get(this, name);
197
+ };
57
198
 
58
- wrapper.prototype.cleanup = function() {
59
- this.module.root.removeClass(className);
60
- };
199
+ /**
200
+ * Xooie.Addon#set(name, value)
201
+ * - name (String): The name of the property to be set.
202
+ * - value: The value of the property to be set.
203
+ *
204
+ * See [[Xooie.shared.set]].
205
+ **/
206
+ Addon.prototype.set = function(name, value) {
207
+ return shared.set(this, name, value);
208
+ };
61
209
 
62
- wrapper.getDefaultOptions = function(){
63
- return defaultOptions;
64
- };
210
+ /**
211
+ * Xooie.Addon#cleanup()
212
+ *
213
+ * Removes the `addonClass` from the `root` of the associated `widget` and prepares this widget to be
214
+ * garbage collected.
215
+ **/
216
+ Addon.prototype.cleanup = function() {
217
+ this.widget().root().removeClass(this.addonClass());
218
+ };
65
219
 
66
- wrapper.setDefaultOptions = function(options){
67
- if (typeof options !== 'undefined') {
68
- $.extend(defaultOptions, options);
69
- }
70
- };
220
+ /** internal
221
+ * Xooie.Addon#_process_initEvent(initEvent) -> String
222
+ * - initEvent (String): The unmodified initEvent string.
223
+ *
224
+ * Adds the [[Xooie.Addon#name]] to the `initEvent`
225
+ **/
226
+ Addon.prototype._process_initEvent = function(initEvent) {
227
+ return this.name() === 'addon' ? initEvent : initEvent + '.' + this.name();
228
+ };
71
229
 
72
- return wrapper;
230
+ /** internal
231
+ * Xooie.Addon#_process_addonClass(className) -> String
232
+ * - className (String): The unmodified className string.
233
+ *
234
+ * Adds the [[Xooie.Addon#name]] to the `addonClass`
235
+ **/
236
+ Addon.prototype._process_addonClass = function(addonClass) {
237
+ return this.name() === 'addon' ? addonClass : 'has-' + this.name() + '-addon';
73
238
  };
74
239
 
75
- return Base;
240
+ return Addon;
76
241
  });
@@ -29,10 +29,7 @@ define('xooie/base', ['jquery', 'xooie', 'xooie/stylesheet'], function($, $X, St
29
29
  };
30
30
 
31
31
  var Base = function(name, constructor) {
32
- var instances, defaultOptions, instanceCounter,
33
- initEvent, refreshEvent,
34
- instanceName, cssRules,
35
- stylesInstance, className, Xooie;
32
+ var instances, defaultOptions, instanceCounter, initEvent, instanceName, cssRules, stylesInstance, className, Xooie;
36
33
 
37
34
  instances = [];
38
35
 
@@ -45,7 +45,7 @@ define('xooie/carousel', ['jquery', 'xooie/base'], function($, Base) {
45
45
  this.positionUpdaters = {
46
46
 
47
47
  "item": function(quantity, direction) {
48
- var items = self.content.children(':visible'),
48
+ var items = self.content.children(),
49
49
  bias, offset,
50
50
  position = self.wrapper.scrollLeft(),
51
51
  i;
@@ -73,7 +73,7 @@ define('xooie/carousel', ['jquery', 'xooie/base'], function($, Base) {
73
73
 
74
74
  "px": function(quantity, direction) {
75
75
  var position;
76
-
76
+
77
77
  if (typeof direction === 'undefined') {
78
78
  position = 0;
79
79
  direction = 1;
@@ -199,7 +199,7 @@ define('xooie/carousel', ['jquery', 'xooie/base'], function($, Base) {
199
199
  //It is possible that images may load after the carousel has instantiated/
200
200
  //Also, this can be used for lazy-loading images
201
201
  //TODO: This can be problematic, since it is triggering update dimensions for each image load
202
- this.content.find('img').first().on('load', this.updateDimensions.bind(this));
202
+ this.content.find('img').on('load', this.updateDimensions.bind(this));
203
203
 
204
204
  carouselElements = carouselElements.add(this.root);
205
205
  });
@@ -244,7 +244,7 @@ define('xooie/carousel', ['jquery', 'xooie/base'], function($, Base) {
244
244
  };
245
245
 
246
246
  Carousel.prototype.currentItem = function(bias) {
247
- var i, items = this.content.children(':visible'),
247
+ var i, items = this.content.children(),
248
248
  position, itemWidth;
249
249
 
250
250
  if (typeof bias === 'undefined') {
@@ -366,7 +366,7 @@ define('xooie/carousel', ['jquery', 'xooie/base'], function($, Base) {
366
366
  if (this.isScrolling) {
367
367
  self.wrapper.stop(true,true);
368
368
  }
369
-
369
+
370
370
  callback();
371
371
 
372
372
  };
@@ -17,22 +17,16 @@
17
17
  define('xooie/dialog', ['jquery', 'xooie/base'], function($, Base) {
18
18
 
19
19
  var Dialog = Base('dialog', function(){
20
- var self = this,
21
- contentId;
20
+ var self = this;
22
21
 
23
22
  this.id = Dialog._counter++;
24
23
 
25
- contentId = 'modal-content-' + this.id;
26
-
27
24
  Dialog._instances[this.id] = this;
28
25
 
29
26
  this.root.attr('data-dialog-id', this.id);
30
27
 
31
- this.root.find(this.options.contentSelector).attr('id', contentId);
32
-
33
28
  //add accessibility attributes
34
- this.root.find(this.options.containerSelector).attr('role', 'dialog')
35
- .attr('aria-describedby', contentId);
29
+ this.root.find(this.options.containerSelector).attr('role', 'dialog');
36
30
 
37
31
  this.root.addClass('xooie-dialog');
38
32
 
@@ -52,7 +46,6 @@ define('xooie/dialog', ['jquery', 'xooie/base'], function($, Base) {
52
46
  Dialog.setDefaultOptions({
53
47
  closeButtonSelector: '[data-role="closeButton"]',
54
48
  containerSelector: '[data-role="container"]',
55
- contentSelector: '[data-role="content"]',
56
49
 
57
50
  dialogActiveClass: 'is-dialog-active'
58
51
  });
@@ -83,8 +76,6 @@ define('xooie/dialog', ['jquery', 'xooie/base'], function($, Base) {
83
76
 
84
77
  Dialog._active = this;
85
78
 
86
- this.getTabbable().first().focus();
87
-
88
79
  this.root.trigger('dialogActive');
89
80
  };
90
81
 
@@ -103,26 +94,6 @@ define('xooie/dialog', ['jquery', 'xooie/base'], function($, Base) {
103
94
  this.root.trigger('dialogInactive');
104
95
  };
105
96
 
106
- // Loosely based on jQueryUI's tabbable selector logic
107
- Dialog.prototype.getTabbable = function () {
108
- return this.root.find(this.options.containerSelector).find('*').filter(function (i) {
109
- var tag, tabindex, istabbable;
110
-
111
- tag = this.nodeName.toLowerCase();
112
- tabindex = parseInt($(this).attr('tabindex'), 10);
113
-
114
- if (/input|select|textarea|button|object/.test(tag)) {
115
- istabbable = !this.disabled && (isNaN(tabindex) || tabindex > -1);
116
- } else if ('a' === tag || 'area' === tag) {
117
- istabbable = this.href || tabindex > -1;
118
- } else {
119
- istabbable = tabindex > -1;
120
- }
121
-
122
- return istabbable && !$(this)['area' === tag ? 'parents' : 'closest'](':hidden').length;
123
- });
124
- };
125
-
126
97
  Dialog._instances = [];
127
98
  Dialog._counter = 0;
128
99
  Dialog._active = null;
@@ -15,7 +15,7 @@
15
15
  */
16
16
 
17
17
  define('xooie/dropdown', ['jquery', 'xooie/base'], function($, Base) {
18
-
18
+
19
19
  var parseWhich = function(which) {
20
20
  if (typeof which === 'string') {
21
21
  which = which.split(',');
@@ -83,10 +83,6 @@ define('xooie/dropdown', ['jquery', 'xooie/base'], function($, Base) {
83
83
 
84
84
  $(this).attr('aria-selected', false);
85
85
  self.getExpander(index).attr('aria-hidden', true);
86
- },
87
-
88
- forceCollapse: function(event, data) {
89
- self.collapse(data.index, data);
90
86
  }
91
87
  }, this.options.dropdownHandleSelector);
92
88
 
@@ -154,12 +150,8 @@ define('xooie/dropdown', ['jquery', 'xooie/base'], function($, Base) {
154
150
  }
155
151
  };
156
152
 
157
- Dropdown.prototype.getNamespacedTrigger = function(trigger, state){
158
- return trigger + '.' + state + 'XooieDropdown';
159
- };
160
-
161
153
  Dropdown.prototype.addHandlers = function(state, index){
162
- var trigger, nsTrigger, handle, triggerData, countName;
154
+ var trigger, handle, triggerData, countName;
163
155
 
164
156
  triggerData = this.options.triggers[state];
165
157
 
@@ -174,14 +166,12 @@ define('xooie/dropdown', ['jquery', 'xooie/base'], function($, Base) {
174
166
 
175
167
  handle.data(countName, handle.data(countName) + 1 || 1);
176
168
 
177
- nsTrigger = this.getNamespacedTrigger(trigger, state);
178
-
179
- handle.on(nsTrigger, $.extend({delay: 0, index: index}, triggerData[trigger]), this.handlers[state]);
169
+ handle.on(trigger, $.extend({delay: 0, index: index}, triggerData[trigger]), this.handlers[state]);
180
170
  }
181
171
  };
182
172
 
183
173
  Dropdown.prototype.removeHandlers = function(state, index){
184
- var trigger, nsTrigger, handle, triggerData, countName, eventCount;
174
+ var trigger, handle, triggerData, countName, eventCount;
185
175
 
186
176
  triggerData = this.options.triggers[state];
187
177
 
@@ -193,9 +183,7 @@ define('xooie/dropdown', ['jquery', 'xooie/base'], function($, Base) {
193
183
  eventCount = handle.data(countName) - 1;
194
184
 
195
185
  if (eventCount <= 0) {
196
- nsTrigger = this.getNamespacedTrigger(trigger, state);
197
-
198
- handle.unbind(nsTrigger);
186
+ handle.unbind(trigger, this.handlers[state]);
199
187
 
200
188
  handle.data(countName, 0);
201
189
  } else {
@@ -0,0 +1,83 @@
1
+ /*
2
+ * Copyright 2012 Comcast
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ define('xooie/event_handler', ['jquery', 'xooie/helpers'], function($, helpers) {
18
+
19
+ var EventHandler = function(namespace) {
20
+ this.namespace = namespace;
21
+
22
+ this.handlers = {};
23
+
24
+ this._callbacks = {};
25
+ };
26
+
27
+ function format(type, namespace) {
28
+ if (typeof namespace === 'undefined') {
29
+ return type;
30
+ } else {
31
+ return type + '.' + namespace;
32
+ }
33
+ }
34
+
35
+ EventHandler.prototype.add = function(type, method) {
36
+ var self = this,
37
+ formattedType, t;
38
+
39
+ if (helpers.isObject(type) && helpers.isUndefined(method)) {
40
+ for(t in type) {
41
+ if (helpers.isFunction(type[t])) {
42
+ this.add(t, type[t]);
43
+ }
44
+ }
45
+
46
+ return;
47
+ }
48
+
49
+ formattedType = format(type, this.namespace);
50
+
51
+ if (helpers.isUndefined(this.handlers[formattedType])) {
52
+ this.handlers[formattedType] = function(e) {
53
+ self.fire(e, this, arguments);
54
+ };
55
+ }
56
+
57
+ if (helpers.isUndefined(this._callbacks[type])) {
58
+ this._callbacks[type] = $.Callbacks('unique');
59
+ }
60
+
61
+ this._callbacks[type].add(method);
62
+ };
63
+
64
+ EventHandler.prototype.clear = function(type) {
65
+ delete(this.handlers[format(type, this.namespace)]);
66
+
67
+ if (!helpers.isUndefined(this._callbacks[type])) {
68
+ this._callbacks[type].empty();
69
+ }
70
+ };
71
+
72
+ EventHandler.prototype.fire = function(event, context, args) {
73
+ if (event.namespace && event.namespace !== this.namespace) {
74
+ return;
75
+ }
76
+
77
+ if (!helpers.isUndefined(this._callbacks[event.type])) {
78
+ this._callbacks[event.type].fireWith(context, args);
79
+ }
80
+ };
81
+
82
+ return EventHandler;
83
+ });
@@ -0,0 +1,61 @@
1
+ /*
2
+ * Copyright 2012 Comcast
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ /**
18
+ * class Xooie.helpers
19
+ *
20
+ * A collection of helper methods used by Xooie modules.
21
+ **/
22
+
23
+ define('xooie/helpers', ['jquery'], function($){
24
+ var helpers = {};
25
+ /**
26
+ * Xooie.helpers.toAry(str) -> Array
27
+ * - str (String | Array): The string to be converted to an array, or an array.
28
+ *
29
+ * Converts a string to an array, or returns the passed argument if it is already an array. Used
30
+ * when parsing data attributes that can be either a space-delineated string or an array.
31
+ **/
32
+ helpers.toAry = function(str) {
33
+ if (typeof str === 'string') {
34
+ return str.split(/\s+/);
35
+ } else if (str instanceof Array) {
36
+ return str;
37
+ }
38
+ };
39
+
40
+ helpers.toInt = function(int) {
41
+ return parseInt(int, 10);
42
+ };
43
+
44
+ helpers.isArray = Array.isArray || function(ary) {
45
+ return Array.prototype.toString(ary) === '[object Array]';
46
+ };
47
+
48
+ helpers.isObject = function(obj) {
49
+ return Object.prototype.toString(obj) === '[object Object]';
50
+ };
51
+
52
+ helpers.isUndefined = function(obj) {
53
+ return obj === void 0;
54
+ };
55
+
56
+ helpers.isFunction = function(func) {
57
+ return typeof func === 'function';
58
+ };
59
+
60
+ return helpers;
61
+ });