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
@@ -0,0 +1,216 @@
1
+ define('xooie/keyboard_navigation', ['jquery', 'xooie/helpers'], function($, helpers){
2
+ var selectors, keyboardNavigation, keybindings;
3
+
4
+
5
+ keybindings = {
6
+ 37: function(event) {
7
+ moveFocus($(event.target), -1);
8
+
9
+ event.preventDefault();
10
+ },
11
+
12
+ 38: function() {
13
+
14
+ },
15
+
16
+ 39: function(event) {
17
+ moveFocus($(event.target), 1);
18
+
19
+ event.preventDefault();
20
+ },
21
+
22
+ 40: function() {
23
+
24
+ }
25
+ };
26
+
27
+ /** internal
28
+ * Xooie.Widget._moveFocus(direction)
29
+ * - direction (Integer): Determines whether or not to increment or decrement the index. Can be 1 or -1.
30
+ *
31
+ * Moves focus to either the next or previous focusable item, if available. Focus order follows the
32
+ * tab order of the page (items without tabindex or tabindex=0 will be focused before tabindex=1). Focusable
33
+ * items with a tabindex=-1 will not be focused.
34
+ **/
35
+ function moveFocus(current, direction) {
36
+ // TODO: Clean this up. It's a mess
37
+ // TODO: Write tests.
38
+ // TODO: Add detection of new contexts
39
+ // TODO: Add recollection of last focused item
40
+
41
+ var selector, selectors, tabindex, index, target;
42
+
43
+ var tabIndicies= [];
44
+
45
+ selectors = {
46
+ unindexed: ['[data-widget-type] a[href]:visible:not(:disabled):not([tabindex])',
47
+ '[data-widget-type] button:visible:not(:disabled):not([tabindex])',
48
+ '[data-widget-type] input:visible:not(:disabled):not([tabindex])',
49
+ '[data-widget-type] select:visible:not(:disabled):not([tabindex])',
50
+ '[data-widget-type] textarea:visible:not(:disabled):not([tabindex])',
51
+ '[data-widget-type] [tabindex=0]:visible:not(:disabled)'].join(','),
52
+ indexed: function(t) {
53
+ if (t > 0) {
54
+ return '[data-widget-type] [tabindex=' + t + ']:visible:not(:disabled)';
55
+ }
56
+ },
57
+ allIndexed: '[data-widget-type] [tabindex]:visible:not(:disabled)'
58
+ };
59
+
60
+ // jquery select the current item
61
+ current = $(current);
62
+
63
+ // we may not be focused on anything. If that's the case, focus on the first focusable item
64
+ if (!current.is(selectors.unindexed) && !current.is(selectors.allIndexed)) {
65
+ // get the lowest tabindex
66
+ $(selectors.allIndexed).each(function(){
67
+ var i = helpers.toInt($(this).attr('tabindex'));
68
+
69
+ if (tabIndicies.indexOf(i) === -1 && i > 0) {
70
+ tabIndicies.push(i);
71
+ }
72
+ });
73
+
74
+ if (tabIndicies.length > 0) {
75
+ tabIndicies.sort(function(a,b) { return a-b; });
76
+
77
+ target = $(selectors.indexed(tabIndicies[0])).first();
78
+ } else {
79
+ target = $(selectors.unindexed).first();
80
+ }
81
+
82
+ if (target.length > 0) {
83
+ target.focus();
84
+
85
+ return;
86
+ }
87
+ }
88
+
89
+ // get the current tabindex
90
+ tabindex = helpers.toInt(current.attr('tabindex'));
91
+
92
+ // check if tabindex is a number and not 0...
93
+ if (!tabindex) {
94
+ // if it is not, assume we're on an element that has no tab index and select other such elements
95
+ selector = selectors.unindexed;
96
+ } else {
97
+ // otherwise, select all items that are of the same tabindex
98
+ selector = selectors.indexed(tabindex);
99
+ }
100
+
101
+ // find the index of the current item
102
+ index = current.index(selector);
103
+
104
+ if (index + direction >= 0) {
105
+ // get the next/previous item
106
+ target = $(selector).eq(index + direction);
107
+
108
+ // Check to see if we have a valid target...
109
+ if (target.length > 0) {
110
+ // if it is, focus the target and return
111
+ target.focus();
112
+
113
+ return;
114
+ }
115
+ }
116
+
117
+ // if it is not, then we have several possibilities:
118
+
119
+ // If the direction is 1 and tabindex is not a number or 0, then we are at the end of the tab order. Do nothing.
120
+ if (direction === 1 && !tabindex) {
121
+ return;
122
+ // If the direction is 1 and the tabindex is a number, then we need to check for the presence of the next tabindex
123
+ } else if (direction === 1 && !isNaN(tabindex)) {
124
+ // Loop through all elements with a tab index
125
+ $(selectors.allIndexed).each(function() {
126
+ // Build a collection of all tab indicies greater than the current tab index:
127
+ var i = helpers.toInt($(this).attr('tabindex'));
128
+
129
+ if (i > tabindex && tabIndicies.indexOf(i) === -1 && i > 0) {
130
+ tabIndicies.push(i);
131
+ }
132
+ });
133
+
134
+ // If there are tab indicies that are greater than the current one...
135
+ if (tabIndicies.length > 0) {
136
+ // sort our tab indicies ascending
137
+ tabIndicies.sort(function(a, b) { return a-b; });
138
+
139
+ // we now have our new tab index
140
+ tabindex = tabIndicies[0];
141
+
142
+ // Get the first item of the new tab index
143
+ target = $(selectors.indexed(tabindex)).first();
144
+ } else {
145
+ // Otherwise, select the first unindexed item
146
+ target = $(selectors.unindexed).first();
147
+ }
148
+
149
+ } else if (direction === -1 && isNaN(tabindex)) {
150
+ // In this case, we are at the first non-indexed focusable item. We need to find the last indexed item.
151
+ // Loop through all elements with a tab index
152
+ $(selectors.allIndexed).each(function() {
153
+ var i = helpers.toInt($(this).attr('tabindex'));
154
+ // Build a collection of all tab indicies
155
+ if (tabIndicies.indexOf(i) === -1) {
156
+ tabIndicies.push(i);
157
+ }
158
+ });
159
+
160
+ if (tabIndicies.length > 0) {
161
+ // sort our tab indicies descending
162
+ tabIndicies.sort(function(a, b) { return b-a; });
163
+
164
+ // we now have our new tab index
165
+ tabindex = tabIndicies[0];
166
+
167
+ // Select the last indexed item
168
+ target = $(selectors.indexed(tabindex)).last();
169
+ }
170
+ } else if (direction === -1 && !isNaN(tabindex) && tabindex > 0) {
171
+ $(selectors.allIndexed).each(function(){
172
+ var i = helpers.toInt($(this).attr('tabindex'));
173
+
174
+ if (i < tabindex && tabIndicies.indexOf(i) === -1 && i > 0) {
175
+ tabIndicies.push(i);
176
+ }
177
+ });
178
+
179
+ if (tabIndicies.length > 0) {
180
+ // sort our tab indicies asceding
181
+ tabIndicies.sort(function(a, b) { return a-b; });
182
+
183
+ // we now have our new tab index
184
+ tabindex = tabIndicies[0];
185
+
186
+ // Select the last indexed item
187
+ target = $(selectors.indexed(tabindex)).last();
188
+ }
189
+ }
190
+
191
+ if (!helpers.isUndefined(target)) {
192
+ // assuming we have a target, focus it.
193
+ target.focus();
194
+ }
195
+
196
+ }
197
+
198
+ var instantiated;
199
+
200
+ keyboardNavigation = function(){
201
+ if (instantiated) {
202
+ return instantiated;
203
+ }
204
+
205
+ $(document).on('keyup', function(event) {
206
+ if (helpers.isFunction(keybindings[event.which])) {
207
+ keybindings[event.which](event);
208
+ }
209
+ });
210
+
211
+ instantiated = this;
212
+ };
213
+
214
+ return keyboardNavigation;
215
+
216
+ });
@@ -0,0 +1,175 @@
1
+ /**
2
+ * class Xooie.shared
3
+ *
4
+ * A module that contains functionality that is used both by [[Xooie.Widget]] and [[Xooie.Addon]]
5
+ * This module exists to abstract common functionality so that it can be maintained in one place.
6
+ * It is not intended to be used independently.
7
+ **/
8
+ define('xooie/shared', ['jquery'], function($){
9
+
10
+ /** internal
11
+ * Xooie.shared.propertyDetails(name) -> Object
12
+ * - name (String): The name of the property
13
+ *
14
+ * Generates a hash of attributes that will be used in setting and getting the property.
15
+ *
16
+ * ##### Return values
17
+ *
18
+ * - **getter** (String): The name of the internal getter method for this property.
19
+ * `_get_name`
20
+ * - **setter** (String): The name of the internal setter method for this property.
21
+ * `_set_name`
22
+ * - **processor** (String): The name of the internal processor method for this property.
23
+ * `_process_name`
24
+ * - **validator** (String): The name of the internal validator method for this property.
25
+ * `_validate_name`
26
+ * **default** (String): The name of the internally stored default value for this property.
27
+ * `_default_name`
28
+ * - **value** (String): The name of the internally stored value for this property.
29
+ * `_name`
30
+ **/
31
+ function propertyDetails (name) {
32
+ return {
33
+ getter: '_get_' + name,
34
+ setter: '_set_' + name,
35
+ processor: '_process_' + name,
36
+ validator: '_validate_' + name,
37
+ defaultValue: '_default_value_' + name,
38
+ value: '_' + name
39
+ };
40
+ }
41
+
42
+ /** internal
43
+ * Xooie.shared.propertyDispatcher(name, prototype)
44
+ * - name (String): The name of the property
45
+ * - prototype (Object): The prototype of the [[Xooie.Widget]] or [[Xooie.Addon]] for which the property is being set.
46
+ *
47
+ * Gets the [[Xooie.shared.propertyDetails]] for the property, adds the `name` to the list of [[Xooie.Widget#_definedProps]]
48
+ * (or [[Xooie.Addon#_definedProps]]). Adds a method called `name` to the prototype that allows this property to be set or
49
+ * retrieved.
50
+ **/
51
+ function propertyDispatcher (name, prototype) {
52
+ var prop = propertyDetails(name);
53
+
54
+ if (typeof prototype[name] !== 'function') {
55
+ prototype._definedProps.push(name);
56
+
57
+ prototype[name] = function(value) {
58
+ if (typeof value === 'undefined') {
59
+ return this[prop.getter]();
60
+ } else {
61
+ return this[prop.setter](value);
62
+ }
63
+ };
64
+ }
65
+ }
66
+
67
+ var shared = {
68
+ /**
69
+ * Xooie.shared.defineReadOnly(module, name[, defaultValue])
70
+ * - module (Widget | Addon): The module on which this property will be defined.
71
+ * - name (String): The name of the property to define as a read-only property.
72
+ * - defaultValue (Object): An optional default value.
73
+ *
74
+ * Defines a read-only property that can be accessed either by [[Xooie.Widget#get]]/[[Xooie.Addon#get]] or
75
+ * calling the `{{name}}` method on the instance of the module.
76
+ **/
77
+ defineReadOnly: function(module, name, defaultValue){
78
+ var prop = propertyDetails(name);
79
+
80
+ propertyDispatcher(name, module.prototype);
81
+
82
+ //The default value is reset each time this method is called;
83
+ module.prototype[prop.defaultValue] = defaultValue;
84
+
85
+ if (typeof module.prototype[prop.getter] !== 'function') {
86
+ module.prototype[prop.getter] = function() {
87
+ var value = typeof this[prop.value] !== 'undefined' ? this[prop.value] : this[prop.defaultValue];
88
+
89
+ if (typeof this[prop.processor] === 'function') {
90
+ return this[prop.processor](value);
91
+ }
92
+
93
+ return value;
94
+ };
95
+ }
96
+ },
97
+ /**
98
+ * Xooie.shared.defineWriteOnly(module, name)
99
+ * - module (Widget | Addon): The module on which this property will be defined.
100
+ * - name (String): The name of the property to define as a write-only property
101
+ *
102
+ * Defines a write-only property that can be set using [[Xooie.Widget#set]]/[[Xooie.Addon#set]] or by passing
103
+ * a value to the `{{name}}` method on the instance of the module.
104
+ **/
105
+ defineWriteOnly: function(module, name){
106
+ var prop = propertyDetails(name);
107
+
108
+ propertyDispatcher(name, module.prototype);
109
+
110
+ if (typeof module.prototype[prop.setter] !== 'function') {
111
+ module.prototype[prop.setter] = function(value){
112
+ if (typeof this[prop.validator] !== 'function' || this[prop.validator](name)) {
113
+ this[prop.value] = value;
114
+ }
115
+ };
116
+ }
117
+ },
118
+ /**
119
+ * Xooie.shared.extend(constr, _super) -> Widget | Addon
120
+ * - constr (Function): The constructor for the new [[Xooie.Widget]] or [[Xooie.Addon]] class.
121
+ * - _super (Widget | Addon): The module which is to be extended
122
+ *
123
+ * Creates a new Xooie widget/addon class that inherits all properties from the extended class.
124
+ * Constructors for the class are called in order from the top-level constructor to the
125
+ * base constructor.
126
+ **/
127
+ extend: function(constr, module){
128
+ var newModule = (function(){
129
+ return function Child() {
130
+ module.apply(this, arguments);
131
+ constr.apply(this, arguments);
132
+ this._extendCount -= 1;
133
+ };
134
+ })();
135
+
136
+
137
+ $.extend(true, newModule, module);
138
+ $.extend(true, newModule.prototype, module.prototype);
139
+
140
+ newModule.prototype._extendCount = newModule.prototype._extendCount === null ? 1 : newModule.prototype._extendCount += 1;
141
+
142
+ return newModule;
143
+ },
144
+ /**
145
+ * Xooie.shared.get(instance, name) -> object
146
+ * - instance (Widget | Addon): The instance from which the property is to be retrieved.
147
+ * - name (String): The name of the property to be retrieved.
148
+ *
149
+ * Retrieves the value of the property. Returns `undefined` if the property has not been defined.
150
+ **/
151
+ get: function(instance, name){
152
+ var prop = propertyDetails(name);
153
+
154
+ return instance[prop.getter]();
155
+ },
156
+ /**
157
+ * Xooie.shared.set(instance, name, value)
158
+ * - instance (Widget | Addon): The instance where the property is being set.
159
+ * - name (String): The name of the property to be set.
160
+ * - value: The value of the property to be set.
161
+ *
162
+ * Sets a property, so long as that property has been defined.
163
+ **/
164
+ set: function(instance, name, value){
165
+ var prop = propertyDetails(name);
166
+
167
+ if (typeof instance[prop.setter] === 'function') {
168
+ instance[prop.setter](value);
169
+ }
170
+ }
171
+
172
+ };
173
+
174
+ return shared;
175
+ });
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2013 Comcast
2
+ * Copyright 2012 Comcast
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
5
5
  * you may not use this file except in compliance with the License.
@@ -14,102 +14,101 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- define('xooie/stylesheet', ['jquery'], function ($) {
18
- 'use strict';
17
+ define('xooie/stylesheet', ['jquery'], function($) {
18
+ var Stylesheet = function(name){
19
+ var i, title;
19
20
 
20
- var Stylesheet = function (name) {
21
- //check to see if a stylesheet already exists with this name
22
- this.element = $('style[id=' + name + ']');
21
+ //check to see if a stylesheet already exists with this name
22
+ this.element = $('style[id=' + name + ']');
23
23
 
24
- if (this.element.length <= 0) {
25
- //if it does, use it, else create a new one
26
- this.element = $(['<style id="' + name + '">',
27
- '/* This is a dynamically generated stylesheet: ' + name + ' */',
28
- '</style>'].join(''));
24
+ if (this.element.length <= 0) {
25
+ //if it does, use it, else create a new one
26
+ this.element = $(['<style id="' + name + '">',
27
+ '/* This is a dynamically generated stylesheet: ' + name + ' */',
28
+ '</style>'].join(''));
29
29
 
30
- this.element.appendTo($('head'));
31
- }
32
-
33
- this._name = name;
34
- };
35
-
36
- Stylesheet.prototype.get = function () {
37
- return this.element[0].sheet || this.element[0].styleSheet;
38
- };
39
-
40
- Stylesheet.prototype.getRule = function (ruleName) {
41
- var i, rules;
30
+ this.element.appendTo($('head'));
31
+ }
42
32
 
43
- ruleName = ruleName.toLowerCase();
33
+ if (document.styleSheets) {
34
+ for (i = 0; i < document.styleSheets.length; i += 1){
35
+ if (document.styleSheets[i].ownerNode.getAttribute('id') === name) {
36
+ this._index = i;
37
+ }
38
+ }
39
+ }
40
+ };
44
41
 
45
- //Check if this uses the IE format (styleSheet.rules) or the Mozilla/Webkit format
46
- rules = this.get().cssRules || this.get().rules;
42
+ Stylesheet.prototype.get = function(){
43
+ return document.styleSheets[this._index];
44
+ };
47
45
 
48
- for (i = 0; i < rules.length; i += 1) {
49
- if (rules[i].selectorText.toLowerCase() === ruleName) {
50
- return rules[i];
51
- }
52
- }
46
+ Stylesheet.prototype.getRule = function(ruleName){
47
+ ruleName = ruleName.toLowerCase();
53
48
 
54
- return false;
55
- };
49
+ var i, rules;
56
50
 
57
- Stylesheet.prototype.addRule = function (ruleName, properties) {
58
- var rule = this.getRule(ruleName), index, prop, propString = '', ruleNameArray, i;
51
+ //Check if this uses the IE format (styleSheet.rules) or the Mozilla/Webkit format
52
+ rules = this.get().cssRules || this.get().rules;
59
53
 
60
- if (!rule) {
61
- for (prop in properties) {
62
- if (properties.hasOwnProperty(prop)) {
63
- propString += prop + ': ' + properties[prop] + ';';
54
+ for (i = 0; i < rules.length; i += 1){
55
+ if (rules[i].selectorText.toLowerCase() === ruleName) {
56
+ return rules[i];
57
+ }
64
58
  }
65
- }
66
-
67
- if (this.get().insertRule) {
68
- //This is the W3C-preferred method
69
- index = this.get().cssRules.length;
70
- this.get().insertRule(ruleName + ' {' + propString + '}', index);
71
- rule = this.get().cssRules[index];
72
- } else {
73
- //support for IE < 9
74
- index = this.get().rules.length;
75
- ruleNameArray = ruleName.split(',');
76
- // READ: http://msdn.microsoft.com/en-us/library/ie/aa358796%28v=vs.85%29.aspx
77
- for (i = 0; i < ruleNameArray.length; i += 1) {
78
- this.get().addRule(ruleNameArray[i], propString, index + i);
59
+
60
+ return false;
61
+ };
62
+
63
+ Stylesheet.prototype.addRule = function(ruleName, properties){
64
+ var rule = this.getRule(ruleName), index, prop, propString = '';
65
+
66
+ if (!rule){
67
+ for (prop in properties) {
68
+ propString += prop + ': ' + properties[prop] + ';';
69
+ }
70
+
71
+ if (this.get().insertRule) {
72
+ //This is the W3C-preferred method
73
+ index = this.get().cssRules.length;
74
+ this.get().insertRule(ruleName + ' {' + propString + '}', index);
75
+ rule = this.get().cssRules[index];
76
+ } else {
77
+ //support for IE < 9
78
+ index = this.get().rules.length;
79
+ this.get().addRule(ruleName, propString, index);
80
+ rule = this.get().rules[index];
81
+ }
79
82
  }
80
83
 
81
- rule = this.get().rules[index];
82
- }
83
- }
84
+ return rule;
85
+ };
84
86
 
85
- return rule;
86
- };
87
+ Stylesheet.prototype.deleteRule = function(ruleName){
88
+ ruleName = ruleName.toLowerCase();
87
89
 
88
- Stylesheet.prototype.deleteRule = function (ruleName) {
89
- var i, rules;
90
+ var i, rules;
90
91
 
91
- ruleName = ruleName.toLowerCase();
92
+ //Check if this uses the IE format (styleSheet.rules) or the Mozilla/Webkit format
93
+ rules = this.get().cssRules || this.get().rules;
92
94
 
93
- //Check if this uses the IE format (styleSheet.rules) or the Mozilla/Webkit format
94
- rules = this.get().cssRules || this.get().rules;
95
+ for (i = 0; i < rules.length; i += 1){
96
+ if (rules[i].selectorText.toLowerCase() === ruleName) {
97
+ if (this.get().deleteRule) {
98
+ //this is the W3C-preferred method
99
+ this.get().deleteRule(i);
100
+ } else {
101
+ //support for IE < 9
102
+ this.get().removeRule(i);
103
+ }
95
104
 
96
- for (i = 0; i < rules.length; i += 1) {
97
- if (rules[i].selectorText.toLowerCase() === ruleName) {
98
- if (this.get().deleteRule) {
99
- //this is the W3C-preferred method
100
- this.get().deleteRule(i);
101
- } else {
102
- //support for IE < 9
103
- this.get().removeRule(i);
105
+ return true;
106
+ }
104
107
  }
105
108
 
106
- return true;
107
- }
108
- }
109
-
110
- return false;
111
- };
109
+ return false;
110
+ };
112
111
 
113
- return Stylesheet;
112
+ return Stylesheet;
114
113
 
115
114
  });
File without changes
@@ -0,0 +1,52 @@
1
+ define('xooie/widgets/accordion', ['jquery', 'xooie/widgets/tab'], function($, Tab){
2
+ var Accordion = Tab.extend(function() {
3
+ var self = this;
4
+
5
+ this._tabEvents.clear('keyup');
6
+ this._tabEvents.clear('mouseup');
7
+
8
+ this._tabEvents.add({
9
+ keyup: function(event){
10
+ var activeTab = self.getActiveTabs();
11
+
12
+ if ([13,32].indexOf(event.which) !== -1){
13
+ if (activeTab.is(this)) {
14
+ self.deactivateTab($(this));
15
+ } else {
16
+ self.activateTab($(this));
17
+ }
18
+
19
+ event.preventDefault();
20
+ }
21
+ },
22
+
23
+ mouseup: function(){
24
+ var activeTab = self.getActiveTabs();
25
+
26
+ if (activeTab.is(this)) {
27
+ self.deactivateTab($(this));
28
+ } else {
29
+ self.activateTab($(this));
30
+ }
31
+ }
32
+ });
33
+ });
34
+
35
+ Accordion.define('namespace', 'accordion');
36
+
37
+ /** internal
38
+ * Xooie.Accordion#_process_role_tablist(tablist) -> Element
39
+ * - tablist (Element): A jQuery-selected collection of [[Xooie.Tab#tablists]]
40
+ *
41
+ * Same as [[Xooie.Tab#_process_role_tablist]] and also adds the [`aria-multiselectable="true"`](http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable) attribute.
42
+ **/
43
+ Accordion.prototype._process_role_tablist = function(tablist) {
44
+ Tab.prototype._process_role_tablist.apply(this, arguments);
45
+
46
+ tablist.attr('aria-multiselectable', true);
47
+
48
+ return tablist;
49
+ };
50
+
51
+ return Accordion;
52
+ });