fomantic-ui-sass 2.9.0 → 2.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/app/assets/fonts/semantic-ui/Lato-Bold.woff +0 -0
  4. data/app/assets/fonts/semantic-ui/Lato-Bold.woff2 +0 -0
  5. data/app/assets/fonts/semantic-ui/Lato-BoldItalic.woff +0 -0
  6. data/app/assets/fonts/semantic-ui/Lato-BoldItalic.woff2 +0 -0
  7. data/app/assets/fonts/semantic-ui/Lato-Italic.woff +0 -0
  8. data/app/assets/fonts/semantic-ui/Lato-Italic.woff2 +0 -0
  9. data/app/assets/fonts/semantic-ui/Lato-Regular.woff +0 -0
  10. data/app/assets/fonts/semantic-ui/Lato-Regular.woff2 +0 -0
  11. data/app/assets/fonts/semantic-ui/LatoLatin-Bold.woff +0 -0
  12. data/app/assets/fonts/semantic-ui/LatoLatin-Bold.woff2 +0 -0
  13. data/app/assets/fonts/semantic-ui/LatoLatin-BoldItalic.woff +0 -0
  14. data/app/assets/fonts/semantic-ui/LatoLatin-BoldItalic.woff2 +0 -0
  15. data/app/assets/fonts/semantic-ui/LatoLatin-Italic.woff +0 -0
  16. data/app/assets/fonts/semantic-ui/LatoLatin-Italic.woff2 +0 -0
  17. data/app/assets/fonts/semantic-ui/LatoLatin-Regular.woff +0 -0
  18. data/app/assets/fonts/semantic-ui/LatoLatin-Regular.woff2 +0 -0
  19. data/app/assets/fonts/semantic-ui/brand-icons.woff +0 -0
  20. data/app/assets/fonts/semantic-ui/brand-icons.woff2 +0 -0
  21. data/app/assets/fonts/semantic-ui/icons.woff +0 -0
  22. data/app/assets/fonts/semantic-ui/icons.woff2 +0 -0
  23. data/app/assets/fonts/semantic-ui/outline-icons.woff +0 -0
  24. data/app/assets/fonts/semantic-ui/outline-icons.woff2 +0 -0
  25. data/app/assets/javascripts/semantic-ui/accordion.js +569 -596
  26. data/app/assets/javascripts/semantic-ui/api.js +1158 -1180
  27. data/app/assets/javascripts/semantic-ui/calendar.js +1935 -1810
  28. data/app/assets/javascripts/semantic-ui/checkbox.js +843 -842
  29. data/app/assets/javascripts/semantic-ui/dimmer.js +707 -738
  30. data/app/assets/javascripts/semantic-ui/dropdown.js +4196 -4237
  31. data/app/assets/javascripts/semantic-ui/embed.js +646 -676
  32. data/app/assets/javascripts/semantic-ui/flyout.js +1503 -1466
  33. data/app/assets/javascripts/semantic-ui/form.js +2035 -2007
  34. data/app/assets/javascripts/semantic-ui/modal.js +1552 -1487
  35. data/app/assets/javascripts/semantic-ui/nag.js +521 -527
  36. data/app/assets/javascripts/semantic-ui/popup.js +1469 -1457
  37. data/app/assets/javascripts/semantic-ui/progress.js +944 -998
  38. data/app/assets/javascripts/semantic-ui/rating.js +508 -524
  39. data/app/assets/javascripts/semantic-ui/search.js +1521 -1535
  40. data/app/assets/javascripts/semantic-ui/shape.js +762 -811
  41. data/app/assets/javascripts/semantic-ui/sidebar.js +1042 -1100
  42. data/app/assets/javascripts/semantic-ui/site.js +437 -477
  43. data/app/assets/javascripts/semantic-ui/slider.js +1311 -1312
  44. data/app/assets/javascripts/semantic-ui/state.js +639 -658
  45. data/app/assets/javascripts/semantic-ui/sticky.js +848 -902
  46. data/app/assets/javascripts/semantic-ui/tab.js +903 -967
  47. data/app/assets/javascripts/semantic-ui/toast.js +911 -885
  48. data/app/assets/javascripts/semantic-ui/transition.js +998 -1078
  49. data/app/assets/javascripts/semantic-ui/visibility.js +1214 -1246
  50. data/app/assets/stylesheets/semantic-ui/collections/_breadcrumb.scss +7 -7
  51. data/app/assets/stylesheets/semantic-ui/collections/_form.scss +311 -377
  52. data/app/assets/stylesheets/semantic-ui/collections/_grid.scss +191 -331
  53. data/app/assets/stylesheets/semantic-ui/collections/_menu.scss +302 -439
  54. data/app/assets/stylesheets/semantic-ui/collections/_message.scss +127 -199
  55. data/app/assets/stylesheets/semantic-ui/collections/_table.scss +549 -776
  56. data/app/assets/stylesheets/semantic-ui/elements/_button.scss +711 -1123
  57. data/app/assets/stylesheets/semantic-ui/elements/_container.scss +9 -8
  58. data/app/assets/stylesheets/semantic-ui/elements/_divider.scss +45 -63
  59. data/app/assets/stylesheets/semantic-ui/elements/_emoji.scss +3558 -3558
  60. data/app/assets/stylesheets/semantic-ui/elements/_flag.scss +272 -270
  61. data/app/assets/stylesheets/semantic-ui/elements/_header.scss +120 -144
  62. data/app/assets/stylesheets/semantic-ui/elements/_icon.scss +667 -747
  63. data/app/assets/stylesheets/semantic-ui/elements/_image.scss +41 -65
  64. data/app/assets/stylesheets/semantic-ui/elements/_input.scss +416 -300
  65. data/app/assets/stylesheets/semantic-ui/elements/_label.scss +361 -412
  66. data/app/assets/stylesheets/semantic-ui/elements/_list.scss +51 -72
  67. data/app/assets/stylesheets/semantic-ui/elements/_loader.scss +69 -157
  68. data/app/assets/stylesheets/semantic-ui/elements/_placeholder.scss +24 -44
  69. data/app/assets/stylesheets/semantic-ui/elements/_rail.scss +17 -22
  70. data/app/assets/stylesheets/semantic-ui/elements/_reveal.scss +46 -85
  71. data/app/assets/stylesheets/semantic-ui/elements/_segment.scss +173 -227
  72. data/app/assets/stylesheets/semantic-ui/elements/_step.scss +79 -152
  73. data/app/assets/stylesheets/semantic-ui/elements/_text.scss +34 -34
  74. data/app/assets/stylesheets/semantic-ui/globals/_reset.scss +10 -15
  75. data/app/assets/stylesheets/semantic-ui/globals/_site.scss +29 -51
  76. data/app/assets/stylesheets/semantic-ui/modules/_accordion.scss +37 -55
  77. data/app/assets/stylesheets/semantic-ui/modules/_calendar.scss +26 -29
  78. data/app/assets/stylesheets/semantic-ui/modules/_checkbox.scss +159 -230
  79. data/app/assets/stylesheets/semantic-ui/modules/_dimmer.scss +55 -174
  80. data/app/assets/stylesheets/semantic-ui/modules/_dropdown.scss +261 -393
  81. data/app/assets/stylesheets/semantic-ui/modules/_embed.scss +21 -32
  82. data/app/assets/stylesheets/semantic-ui/modules/_flyout.scss +97 -143
  83. data/app/assets/stylesheets/semantic-ui/modules/_modal.scss +122 -156
  84. data/app/assets/stylesheets/semantic-ui/modules/_nag.scss +55 -65
  85. data/app/assets/stylesheets/semantic-ui/modules/_popup.scss +573 -206
  86. data/app/assets/stylesheets/semantic-ui/modules/_progress.scss +108 -213
  87. data/app/assets/stylesheets/semantic-ui/modules/_rating.scss +83 -124
  88. data/app/assets/stylesheets/semantic-ui/modules/_search.scss +71 -100
  89. data/app/assets/stylesheets/semantic-ui/modules/_shape.scss +16 -32
  90. data/app/assets/stylesheets/semantic-ui/modules/_sidebar.scss +105 -208
  91. data/app/assets/stylesheets/semantic-ui/modules/_slider.scss +102 -127
  92. data/app/assets/stylesheets/semantic-ui/modules/_sticky.scss +3 -7
  93. data/app/assets/stylesheets/semantic-ui/modules/_tab.scss +12 -16
  94. data/app/assets/stylesheets/semantic-ui/modules/_toast.scss +71 -149
  95. data/app/assets/stylesheets/semantic-ui/modules/_transition.scss +371 -1282
  96. data/app/assets/stylesheets/semantic-ui/views/_ad.scss +36 -47
  97. data/app/assets/stylesheets/semantic-ui/views/_card.scss +221 -367
  98. data/app/assets/stylesheets/semantic-ui/views/_comment.scss +43 -61
  99. data/app/assets/stylesheets/semantic-ui/views/_feed.scss +37 -59
  100. data/app/assets/stylesheets/semantic-ui/views/_item.scss +87 -134
  101. data/app/assets/stylesheets/semantic-ui/views/_statistic.scss +77 -118
  102. data/lib/fomantic/ui/sass/version.rb +2 -2
  103. data/tasks/converter.rb +1 -1
  104. metadata +17 -1
@@ -1,1019 +1,955 @@
1
1
  /*!
2
2
  * # Fomantic-UI - Tab
3
- * http://github.com/fomantic/Fomantic-UI/
3
+ * https://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
6
6
  * Released under the MIT license
7
- * http://opensource.org/licenses/MIT
7
+ * https://opensource.org/licenses/MIT
8
8
  *
9
9
  */
10
10
 
11
- ;(function ($, window, document, undefined) {
12
-
13
- 'use strict';
14
-
15
- $.isWindow = $.isWindow || function(obj) {
16
- return obj != null && obj === obj.window;
17
- };
18
- $.isFunction = $.isFunction || function(obj) {
19
- return typeof obj === "function" && typeof obj.nodeType !== "number";
20
- };
21
-
22
- window = (typeof window != 'undefined' && window.Math == Math)
23
- ? window
24
- : (typeof self != 'undefined' && self.Math == Math)
25
- ? self
26
- : Function('return this')()
27
- ;
28
-
29
- $.fn.tab = function(parameters) {
30
-
31
- var
32
- // use window context if none specified
33
- $allModules = $.isFunction(this)
34
- ? $(window)
35
- : $(this),
36
-
37
- moduleSelector = $allModules.selector || '',
38
- time = new Date().getTime(),
39
- performance = [],
40
-
41
- query = arguments[0],
42
- methodInvoked = (typeof query == 'string'),
43
- queryArguments = [].slice.call(arguments, 1),
44
-
45
- initializedHistory = false,
46
- returnedValue
47
- ;
48
-
49
- $allModules
50
- .each(function() {
51
- var
52
-
53
- settings = ( $.isPlainObject(parameters) )
54
- ? $.extend(true, {}, $.fn.tab.settings, parameters)
55
- : $.extend({}, $.fn.tab.settings),
56
-
57
- className = settings.className,
58
- metadata = settings.metadata,
59
- selector = settings.selector,
60
- error = settings.error,
61
- regExp = settings.regExp,
62
-
63
- eventNamespace = '.' + settings.namespace,
64
- moduleNamespace = 'module-' + settings.namespace,
65
-
66
- $module = $(this),
67
- $context,
68
- $tabs,
69
-
70
- cache = {},
71
- firstLoad = true,
72
- recursionDepth = 0,
73
- element = this,
74
- instance = $module.data(moduleNamespace),
75
-
76
- activeTabPath,
77
- parameterArray,
78
- module,
79
-
80
- historyEvent
81
-
82
- ;
83
-
84
- module = {
85
-
86
- initialize: function() {
87
- module.debug('Initializing tab menu item', $module);
88
- module.fix.callbacks();
89
- module.determineTabs();
90
-
91
- module.debug('Determining tabs', settings.context, $tabs);
92
- // set up automatic routing
93
- if(settings.auto) {
94
- module.set.auto();
95
- }
96
- module.bind.events();
97
-
98
- if(settings.history && !initializedHistory) {
99
- module.initializeHistory();
100
- initializedHistory = true;
101
- }
102
-
103
- var activeTab = module.determine.activeTab();
104
- if(settings.autoTabActivation && instance === undefined && activeTab == null) {
105
- activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;
106
- module.debug('No active tab detected, setting tab active', activeTab);
107
- module.changeTab(activeTab);
108
- }
109
- if(activeTab != null && settings.history) {
110
- var autoUpdate = $.address.autoUpdate();
111
- $.address.autoUpdate(false);
112
- $.address.value(activeTab);
113
- $.address.autoUpdate(autoUpdate);
114
- }
115
-
116
- module.instantiate();
117
- },
118
-
119
- instantiate: function () {
120
- module.verbose('Storing instance of module', module);
121
- instance = module;
122
- $module
123
- .data(moduleNamespace, module)
124
- ;
125
- },
126
-
127
- destroy: function() {
128
- module.debug('Destroying tabs', $module);
129
- $module
130
- .removeData(moduleNamespace)
131
- .off(eventNamespace)
132
- ;
133
- },
11
+ (function ($, window, document) {
12
+ 'use strict';
13
+
14
+ function isWindow(obj) {
15
+ return obj !== null && obj === obj.window;
16
+ }
17
+
18
+ function isFunction(obj) {
19
+ return typeof obj === 'function' && typeof obj.nodeType !== 'number';
20
+ }
21
+
22
+ window = window !== undefined && window.Math === Math
23
+ ? window
24
+ : globalThis;
25
+
26
+ $.fn.tab = function (parameters) {
27
+ var
28
+ // use window context if none specified
29
+ $allModules = isFunction(this)
30
+ ? $(window)
31
+ : $(this),
32
+ $document = $(document),
33
+ moduleSelector = $allModules.selector || '',
34
+ time = Date.now(),
35
+ performance = [],
36
+
37
+ query = arguments[0],
38
+ methodInvoked = typeof query === 'string',
39
+ queryArguments = [].slice.call(arguments, 1),
40
+
41
+ initializedHistory = false,
42
+ returnedValue
43
+ ;
44
+
45
+ $allModules.each(function () {
46
+ var
47
+ settings = $.isPlainObject(parameters)
48
+ ? $.extend(true, {}, $.fn.tab.settings, parameters)
49
+ : $.extend({}, $.fn.tab.settings),
50
+
51
+ className = settings.className,
52
+ metadata = settings.metadata,
53
+ selector = settings.selector,
54
+ error = settings.error,
55
+ regExp = settings.regExp,
56
+
57
+ eventNamespace = '.' + settings.namespace,
58
+ moduleNamespace = 'module-' + settings.namespace,
59
+
60
+ $module = $(this),
61
+ $context,
62
+ $tabs,
63
+
64
+ cache = {},
65
+ firstLoad = true,
66
+ recursionDepth = 0,
67
+ element = this,
68
+ instance = $module.data(moduleNamespace),
69
+
70
+ activeTabPath,
71
+ parameterArray,
72
+ module,
73
+
74
+ historyEvent
75
+ ;
134
76
 
135
- bind: {
136
- events: function() {
137
- // if using $.tab don't add events
138
- if( !$.isWindow( element ) ) {
139
- module.debug('Attaching tab activation events to element', $module);
140
- $module
141
- .on('click' + eventNamespace, module.event.click)
142
- ;
143
- }
144
- }
145
- },
77
+ module = {
78
+
79
+ initialize: function () {
80
+ module.debug('Initializing tab menu item', $module);
81
+ module.determineTabs();
82
+
83
+ module.debug('Determining tabs', settings.context, $tabs);
84
+ // set up automatic routing
85
+ if (settings.auto) {
86
+ module.set.auto();
87
+ }
88
+ module.bind.events();
89
+
90
+ if (settings.history && !initializedHistory) {
91
+ module.initializeHistory();
92
+ initializedHistory = true;
93
+ }
94
+
95
+ var activeTab = module.determine.activeTab();
96
+ if (settings.autoTabActivation && instance === undefined && activeTab === null) {
97
+ activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;
98
+ module.debug('No active tab detected, setting tab active', activeTab);
99
+ module.changeTab(activeTab);
100
+ }
101
+ if (activeTab !== null && settings.history) {
102
+ var autoUpdate = $.address.autoUpdate();
103
+ $.address.autoUpdate(false);
104
+ $.address.value(activeTab);
105
+ $.address.autoUpdate(autoUpdate);
106
+ }
107
+
108
+ module.instantiate();
109
+ },
146
110
 
147
- determineTabs: function() {
148
- var
149
- $reference
150
- ;
111
+ instantiate: function () {
112
+ module.verbose('Storing instance of module', module);
113
+ instance = module;
114
+ $module
115
+ .data(moduleNamespace, module)
116
+ ;
117
+ },
151
118
 
152
- // determine tab context
153
- if(settings.context === 'parent') {
154
- if($module.closest(selector.ui).length > 0) {
155
- $reference = $module.closest(selector.ui);
156
- module.verbose('Using closest UI element as parent', $reference);
157
- }
158
- else {
159
- $reference = $module;
160
- }
161
- $context = $reference.parent();
162
- module.verbose('Determined parent element for creating context', $context);
163
- }
164
- else if(settings.context) {
165
- $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context);
166
- module.verbose('Using selector for tab context', settings.context, $context);
167
- }
168
- else {
169
- $context = $('body');
170
- }
171
- // find tabs
172
- if(settings.childrenOnly) {
173
- $tabs = $context.children(selector.tabs);
174
- module.debug('Searching tab context children for tabs', $context, $tabs);
175
- }
176
- else {
177
- $tabs = $context.find(selector.tabs);
178
- module.debug('Searching tab context for tabs', $context, $tabs);
179
- }
180
- },
119
+ destroy: function () {
120
+ module.debug('Destroying tabs', $module);
121
+ $module
122
+ .removeData(moduleNamespace)
123
+ .off(eventNamespace)
124
+ ;
125
+ },
181
126
 
182
- fix: {
183
- callbacks: function() {
184
- if( $.isPlainObject(parameters) && (parameters.onTabLoad || parameters.onTabInit) ) {
185
- if(parameters.onTabLoad) {
186
- parameters.onLoad = parameters.onTabLoad;
187
- delete parameters.onTabLoad;
188
- module.error(error.legacyLoad, parameters.onLoad);
189
- }
190
- if(parameters.onTabInit) {
191
- parameters.onFirstLoad = parameters.onTabInit;
192
- delete parameters.onTabInit;
193
- module.error(error.legacyInit, parameters.onFirstLoad);
194
- }
195
- settings = $.extend(true, {}, $.fn.tab.settings, parameters);
196
- }
197
- }
198
- },
127
+ bind: {
128
+ events: function () {
129
+ // if using $.tab don't add events
130
+ if (!isWindow(element)) {
131
+ module.debug('Attaching tab activation events to element', $module);
132
+ $module
133
+ .on('click' + eventNamespace, module.event.click)
134
+ ;
135
+ }
136
+ },
137
+ },
199
138
 
200
- initializeHistory: function() {
201
- module.debug('Initializing page state');
202
- if( $.address === undefined ) {
203
- module.error(error.state);
204
- return false;
205
- }
206
- else {
207
- if(settings.historyType == 'state') {
208
- module.debug('Using HTML5 to manage state');
209
- if(settings.path !== false) {
210
- $.address
211
- .history(true)
212
- .state(settings.path)
213
- ;
214
- $(window).trigger('popstate');
215
- }
216
- else {
217
- module.error(error.path);
218
- return false;
219
- }
220
- }
221
- $.address
222
- .bind('change', module.event.history.change)
223
- ;
224
- }
225
- },
139
+ determineTabs: function () {
140
+ var
141
+ $reference
142
+ ;
143
+
144
+ // determine tab context
145
+ if (settings.context === 'parent') {
146
+ if ($module.closest(selector.ui).length > 0) {
147
+ $reference = $module.closest(selector.ui);
148
+ module.verbose('Using closest UI element as parent', $reference);
149
+ } else {
150
+ $reference = $module;
151
+ }
152
+ $context = $reference.parent();
153
+ module.verbose('Determined parent element for creating context', $context);
154
+ } else if (settings.context) {
155
+ $context = [window, document].indexOf(settings.context) < 0 ? $document.find(settings.context) : $(settings.context);
156
+ module.verbose('Using selector for tab context', settings.context, $context);
157
+ } else {
158
+ $context = $('body');
159
+ }
160
+ // find tabs
161
+ if (settings.childrenOnly) {
162
+ $tabs = $context.children(selector.tabs);
163
+ module.debug('Searching tab context children for tabs', $context, $tabs);
164
+ } else {
165
+ $tabs = $context.find(selector.tabs);
166
+ module.debug('Searching tab context for tabs', $context, $tabs);
167
+ }
168
+ },
226
169
 
227
- event: {
228
- click: function(event) {
229
- var
230
- tabPath = $(this).data(metadata.tab)
231
- ;
232
- if(tabPath !== undefined) {
233
- if(settings.history) {
234
- module.verbose('Updating page state', event);
235
- $.address.value(tabPath);
236
- }
237
- else {
238
- module.verbose('Changing tab', event);
239
- module.changeTab(tabPath);
240
- }
241
- event.preventDefault();
242
- }
243
- else {
244
- module.debug('No tab specified');
245
- }
246
- },
247
- history: {
248
- change: function(event) {
249
- var
250
- tabPath = event.pathNames.join('/') || module.get.initialPath(),
251
- pageTitle = settings.templates.determineTitle(tabPath) || false
252
- ;
253
- module.performance.display();
254
- module.debug('History change event', tabPath, event);
255
- historyEvent = event;
256
- if(tabPath !== undefined) {
257
- module.changeTab(tabPath);
258
- }
259
- if(pageTitle) {
260
- $.address.title(pageTitle);
261
- }
262
- }
263
- }
264
- },
170
+ initializeHistory: function () {
171
+ module.debug('Initializing page state');
172
+ if ($.address === undefined) {
173
+ module.error(error.state);
174
+
175
+ return false;
176
+ }
177
+ if (settings.historyType === 'state') {
178
+ module.debug('Using HTML5 to manage state');
179
+ if (settings.path !== false) {
180
+ $.address
181
+ .history(true)
182
+ .state(settings.path)
183
+ ;
184
+ $(window).trigger('popstate');
185
+ } else {
186
+ module.error(error.path);
187
+
188
+ return false;
189
+ }
190
+ }
191
+ $.address
192
+ .bind('change', module.event.history.change)
193
+ ;
194
+ },
265
195
 
266
- refresh: function() {
267
- if(activeTabPath) {
268
- module.debug('Refreshing tab', activeTabPath);
269
- module.changeTab(activeTabPath);
270
- }
271
- },
196
+ event: {
197
+ click: function (event) {
198
+ var
199
+ tabPath = $(this).data(metadata.tab)
200
+ ;
201
+ if (tabPath !== undefined) {
202
+ if (settings.history) {
203
+ module.verbose('Updating page state', event);
204
+ $.address.value(tabPath);
205
+ } else {
206
+ module.verbose('Changing tab', event);
207
+ module.changeTab(tabPath);
208
+ }
209
+ event.preventDefault();
210
+ } else {
211
+ module.debug('No tab specified');
212
+ }
213
+ },
214
+ history: {
215
+ change: function (event) {
216
+ var
217
+ tabPath = event.pathNames.join('/') || module.get.initialPath(),
218
+ pageTitle = settings.templates.determineTitle(tabPath) || false
219
+ ;
220
+ module.performance.display();
221
+ module.debug('History change event', tabPath, event);
222
+ historyEvent = event;
223
+ if (tabPath !== undefined) {
224
+ module.changeTab(tabPath);
225
+ }
226
+ if (pageTitle) {
227
+ $.address.title(pageTitle);
228
+ }
229
+ },
230
+ },
231
+ },
272
232
 
273
- cache: {
233
+ refresh: function () {
234
+ if (activeTabPath) {
235
+ module.debug('Refreshing tab', activeTabPath);
236
+ module.changeTab(activeTabPath);
237
+ }
238
+ },
274
239
 
275
- read: function(cacheKey) {
276
- return (cacheKey !== undefined)
277
- ? cache[cacheKey]
278
- : false
279
- ;
280
- },
281
- add: function(cacheKey, content) {
282
- cacheKey = cacheKey || activeTabPath;
283
- module.debug('Adding cached content for', cacheKey);
284
- cache[cacheKey] = content;
285
- },
286
- remove: function(cacheKey) {
287
- cacheKey = cacheKey || activeTabPath;
288
- module.debug('Removing cached content for', cacheKey);
289
- delete cache[cacheKey];
290
- }
291
- },
240
+ cache: {
241
+
242
+ read: function (cacheKey) {
243
+ return cacheKey !== undefined
244
+ ? cache[cacheKey]
245
+ : false;
246
+ },
247
+ add: function (cacheKey, content) {
248
+ cacheKey = cacheKey || activeTabPath;
249
+ module.debug('Adding cached content for', cacheKey);
250
+ cache[cacheKey] = content;
251
+ },
252
+ remove: function (cacheKey) {
253
+ cacheKey = cacheKey || activeTabPath;
254
+ module.debug('Removing cached content for', cacheKey);
255
+ delete cache[cacheKey];
256
+ },
257
+ },
292
258
 
293
- escape: {
294
- string: function(text) {
295
- text = String(text);
296
- return text.replace(regExp.escape, '\\$&');
297
- }
298
- },
259
+ escape: {
260
+ string: function (text) {
261
+ text = String(text);
299
262
 
300
- set: {
301
- auto: function() {
302
- var
303
- url = (typeof settings.path == 'string')
304
- ? settings.path.replace(/\/$/, '') + '/{$tab}'
305
- : '/{$tab}'
306
- ;
307
- module.verbose('Setting up automatic tab retrieval from server', url);
308
- if($.isPlainObject(settings.apiSettings)) {
309
- settings.apiSettings.url = url;
310
- }
311
- else {
312
- settings.apiSettings = {
313
- url: url
314
- };
315
- }
316
- },
317
- loading: function(tabPath) {
318
- var
319
- $tab = module.get.tabElement(tabPath),
320
- isLoading = $tab.hasClass(className.loading)
321
- ;
322
- if(!isLoading) {
323
- module.verbose('Setting loading state for', $tab);
324
- $tab
325
- .addClass(className.loading)
326
- .siblings($tabs)
327
- .removeClass(className.active + ' ' + className.loading)
328
- ;
329
- if($tab.length > 0) {
330
- settings.onRequest.call($tab[0], tabPath);
331
- }
332
- }
333
- },
334
- state: function(state) {
335
- $.address.value(state);
336
- }
337
- },
263
+ return text.replace(regExp.escape, '\\$&');
264
+ },
265
+ },
338
266
 
339
- changeTab: function(tabPath) {
340
- var
341
- pushStateAvailable = (window.history && window.history.pushState),
342
- shouldIgnoreLoad = (pushStateAvailable && settings.ignoreFirstLoad && firstLoad),
343
- remoteContent = (settings.auto || $.isPlainObject(settings.apiSettings) ),
344
- // only add default path if not remote content
345
- pathArray = (remoteContent && !shouldIgnoreLoad)
346
- ? module.utilities.pathToArray(tabPath)
347
- : module.get.defaultPathArray(tabPath)
348
- ;
349
- tabPath = module.utilities.arrayToPath(pathArray);
350
- $.each(pathArray, function(index, tab) {
351
- var
352
- currentPathArray = pathArray.slice(0, index + 1),
353
- currentPath = module.utilities.arrayToPath(currentPathArray),
267
+ set: {
268
+ auto: function () {
269
+ var
270
+ url = typeof settings.path === 'string'
271
+ ? settings.path.replace(/\/$/, '') + '/{$tab}'
272
+ : '/{$tab}'
273
+ ;
274
+ module.verbose('Setting up automatic tab retrieval from server', url);
275
+ if ($.isPlainObject(settings.apiSettings)) {
276
+ settings.apiSettings.url = url;
277
+ } else {
278
+ settings.apiSettings = {
279
+ url: url,
280
+ };
281
+ }
282
+ },
283
+ loading: function (tabPath) {
284
+ var
285
+ $tab = module.get.tabElement(tabPath),
286
+ isLoading = $tab.hasClass(className.loading)
287
+ ;
288
+ if (!isLoading) {
289
+ module.verbose('Setting loading state for', $tab);
290
+ $tab
291
+ .addClass(className.loading)
292
+ .siblings($tabs)
293
+ .removeClass(className.active + ' ' + className.loading)
294
+ ;
295
+ if ($tab.length > 0) {
296
+ settings.onRequest.call($tab[0], tabPath);
297
+ }
298
+ }
299
+ },
300
+ state: function (state) {
301
+ $.address.value(state);
302
+ },
303
+ },
354
304
 
355
- isTab = module.is.tab(currentPath),
356
- isLastIndex = (index + 1 == pathArray.length),
305
+ changeTab: function (tabPath) {
306
+ var
307
+ pushStateAvailable = window.history && window.history.pushState,
308
+ shouldIgnoreLoad = pushStateAvailable && settings.ignoreFirstLoad && firstLoad,
309
+ remoteContent = settings.auto || $.isPlainObject(settings.apiSettings),
310
+ // only add default path if not remote content
311
+ pathArray = remoteContent && !shouldIgnoreLoad
312
+ ? module.utilities.pathToArray(tabPath)
313
+ : module.get.defaultPathArray(tabPath)
314
+ ;
315
+ tabPath = module.utilities.arrayToPath(pathArray);
316
+ $.each(pathArray, function (index, tab) {
317
+ var
318
+ currentPathArray = pathArray.slice(0, index + 1),
319
+ currentPath = module.utilities.arrayToPath(currentPathArray),
320
+
321
+ isTab = module.is.tab(currentPath),
322
+ isLastIndex = index + 1 === pathArray.length,
323
+
324
+ $tab = module.get.tabElement(currentPath),
325
+ $anchor,
326
+ nextPathArray,
327
+ nextPath,
328
+ isLastTab
329
+ ;
330
+ module.verbose('Looking for tab', tab);
331
+ if (isTab) {
332
+ module.verbose('Tab was found', tab);
333
+ // scope up
334
+ activeTabPath = currentPath;
335
+ parameterArray = module.utilities.filterArray(pathArray, currentPathArray);
336
+
337
+ if (isLastIndex) {
338
+ isLastTab = true;
339
+ } else {
340
+ nextPathArray = pathArray.slice(0, index + 2);
341
+ nextPath = module.utilities.arrayToPath(nextPathArray);
342
+ isLastTab = !module.is.tab(nextPath);
343
+ if (isLastTab) {
344
+ module.verbose('Tab parameters found', nextPathArray);
345
+ }
346
+ }
347
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
348
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
349
+
350
+ return false;
351
+ }
352
+ if (isLastTab && remoteContent) {
353
+ if (!shouldIgnoreLoad) {
354
+ module.activate.navigation(currentPath);
355
+ module.fetch.content(currentPath, tabPath);
356
+ } else {
357
+ module.debug('Ignoring remote content on first tab load', currentPath);
358
+ firstLoad = false;
359
+ module.cache.add(tabPath, $tab.html());
360
+ module.activate.all(currentPath);
361
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
362
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
363
+ }
364
+
365
+ return false;
366
+ }
367
+
368
+ module.debug('Opened local tab', currentPath);
369
+ module.activate.all(currentPath);
370
+ if (!module.cache.read(currentPath)) {
371
+ module.cache.add(currentPath, true);
372
+ module.debug('First time tab loaded calling tab init');
373
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
374
+ }
375
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
376
+ } else if (tabPath.search('/') === -1 && tabPath !== '') {
377
+ // look for in page anchor
378
+ tabPath = module.escape.string(tabPath);
379
+ $anchor = $('#' + tabPath + ', a[name="' + tabPath + '"]');
380
+ currentPath = $anchor.closest('[data-tab]').data(metadata.tab);
381
+ $tab = module.get.tabElement(currentPath);
382
+ // if anchor exists use parent tab
383
+ if ($anchor && $anchor.length > 0 && currentPath) {
384
+ module.debug('Anchor link used, opening parent tab', $tab, $anchor);
385
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
386
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
387
+
388
+ return false;
389
+ }
390
+ if (!$tab.hasClass(className.active)) {
391
+ setTimeout(function () {
392
+ module.scrollTo($anchor);
393
+ }, 0);
394
+ }
395
+ module.activate.all(currentPath);
396
+ if (!module.cache.read(currentPath)) {
397
+ module.cache.add(currentPath, true);
398
+ module.debug('First time tab loaded calling tab init');
399
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
400
+ }
401
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
402
+
403
+ return false;
404
+ }
405
+ } else {
406
+ module.error(error.missingTab, $module, $context, currentPath);
407
+
408
+ return false;
409
+ }
410
+ });
411
+ },
357
412
 
358
- $tab = module.get.tabElement(currentPath),
359
- $anchor,
360
- nextPathArray,
361
- nextPath,
362
- isLastTab
363
- ;
364
- module.verbose('Looking for tab', tab);
365
- if(isTab) {
366
- module.verbose('Tab was found', tab);
367
- // scope up
368
- activeTabPath = currentPath;
369
- parameterArray = module.utilities.filterArray(pathArray, currentPathArray);
370
-
371
- if(isLastIndex) {
372
- isLastTab = true;
373
- }
374
- else {
375
- nextPathArray = pathArray.slice(0, index + 2);
376
- nextPath = module.utilities.arrayToPath(nextPathArray);
377
- isLastTab = ( !module.is.tab(nextPath) );
378
- if(isLastTab) {
379
- module.verbose('Tab parameters found', nextPathArray);
380
- }
381
- }
382
- if (settings.onBeforeChange.call(element, currentPath) === false) {
383
- module.debug('onBeforeChange returned false, cancelling tab change', $tab);
384
- return false;
385
- }
386
- if(isLastTab && remoteContent) {
387
- if(!shouldIgnoreLoad) {
388
- module.activate.navigation(currentPath);
389
- module.fetch.content(currentPath, tabPath);
390
- }
391
- else {
392
- module.debug('Ignoring remote content on first tab load', currentPath);
393
- firstLoad = false;
394
- module.cache.add(tabPath, $tab.html());
395
- module.activate.all(currentPath);
396
- settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
397
- settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
398
- }
399
- return false;
400
- }
401
- else {
402
- module.debug('Opened local tab', currentPath);
403
- module.activate.all(currentPath);
404
- if( !module.cache.read(currentPath) ) {
405
- module.cache.add(currentPath, true);
406
- module.debug('First time tab loaded calling tab init');
407
- settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
408
- }
409
- settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
410
- }
413
+ scrollTo: function ($element) {
414
+ var
415
+ scrollOffset = $element && $element.length > 0
416
+ ? $element.offset().top
417
+ : false
418
+ ;
419
+ if (scrollOffset !== false) {
420
+ module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);
421
+ $document.scrollTop(scrollOffset);
422
+ }
423
+ },
411
424
 
412
- }
413
- else if(tabPath.search('/') == -1 && tabPath !== '') {
414
- // look for in page anchor
415
- tabPath = module.escape.string(tabPath);
416
- $anchor = $('#' + tabPath + ', a[name="' + tabPath + '"]');
417
- currentPath = $anchor.closest('[data-tab]').data(metadata.tab);
418
- $tab = module.get.tabElement(currentPath);
419
- // if anchor exists use parent tab
420
- if($anchor && $anchor.length > 0 && currentPath) {
421
- module.debug('Anchor link used, opening parent tab', $tab, $anchor);
422
- if (settings.onBeforeChange.call(element, currentPath) === false) {
423
- module.debug('onBeforeChange returned false, cancelling tab change', $tab);
424
- return false;
425
- }
426
- if( !$tab.hasClass(className.active) ) {
427
- setTimeout(function() {
428
- module.scrollTo($anchor);
429
- }, 0);
430
- }
431
- module.activate.all(currentPath);
432
- if( !module.cache.read(currentPath) ) {
433
- module.cache.add(currentPath, true);
434
- module.debug('First time tab loaded calling tab init');
435
- settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
436
- }
437
- settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
438
- return false;
439
- }
440
- }
441
- else {
442
- module.error(error.missingTab, $module, $context, currentPath);
443
- return false;
444
- }
445
- });
446
- },
425
+ update: {
426
+ content: function (tabPath, html, evaluateScripts) {
427
+ var
428
+ $tab = module.get.tabElement(tabPath),
429
+ tab = $tab[0]
430
+ ;
431
+ evaluateScripts = evaluateScripts !== undefined
432
+ ? evaluateScripts
433
+ : settings.evaluateScripts;
434
+ if (typeof settings.cacheType === 'string' && settings.cacheType.toLowerCase() === 'dom' && typeof html !== 'string') {
435
+ $tab
436
+ .empty()
437
+ .append($(html).clone(true))
438
+ ;
439
+ } else {
440
+ if (evaluateScripts) {
441
+ module.debug('Updating HTML and evaluating inline scripts', tabPath, html);
442
+ $tab.html(html);
443
+ } else {
444
+ module.debug('Updating HTML', tabPath, html);
445
+ tab.innerHTML = html;
446
+ }
447
+ }
448
+ },
449
+ },
447
450
 
448
- scrollTo: function($element) {
449
- var
450
- scrollOffset = ($element && $element.length > 0)
451
- ? $element.offset().top
452
- : false
453
- ;
454
- if(scrollOffset !== false) {
455
- module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);
456
- $(document).scrollTop(scrollOffset);
457
- }
458
- },
451
+ fetch: {
452
+
453
+ content: function (tabPath, fullTabPath) {
454
+ var
455
+ $tab = module.get.tabElement(tabPath),
456
+ apiSettings = {
457
+ dataType: 'html',
458
+ encodeParameters: false,
459
+ on: 'now',
460
+ cache: settings.alwaysRefresh,
461
+ headers: {
462
+ 'X-Remote': true,
463
+ },
464
+ onSuccess: function (response) {
465
+ if (settings.cacheType === 'response') {
466
+ module.cache.add(fullTabPath, response);
467
+ }
468
+ module.update.content(tabPath, response);
469
+ if (tabPath == activeTabPath) {
470
+ module.debug('Content loaded', tabPath);
471
+ module.activate.tab(tabPath);
472
+ } else {
473
+ module.debug('Content loaded in background', tabPath);
474
+ }
475
+ settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);
476
+ settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
477
+
478
+ if (settings.loadOnce) {
479
+ module.cache.add(fullTabPath, true);
480
+ } else if (typeof settings.cacheType === 'string' && settings.cacheType.toLowerCase() === 'dom' && $tab.children().length > 0) {
481
+ setTimeout(function () {
482
+ var
483
+ $clone = $tab.children().clone(true)
484
+ ;
485
+ $clone = $clone.not('script');
486
+ module.cache.add(fullTabPath, $clone);
487
+ }, 0);
488
+ } else {
489
+ module.cache.add(fullTabPath, $tab.html());
490
+ }
491
+ },
492
+ urlData: {
493
+ tab: fullTabPath,
494
+ },
495
+ },
496
+ request = $tab.api('get request') || false,
497
+ existingRequest = request && request.state() === 'pending',
498
+ requestSettings,
499
+ cachedContent
500
+ ;
501
+
502
+ fullTabPath = fullTabPath || tabPath;
503
+ cachedContent = module.cache.read(fullTabPath);
504
+
505
+ if (settings.cache && cachedContent) {
506
+ module.activate.tab(tabPath);
507
+ module.debug('Adding cached content', fullTabPath);
508
+ if (!settings.loadOnce) {
509
+ if (settings.evaluateScripts === 'once') {
510
+ module.update.content(tabPath, cachedContent, false);
511
+ } else {
512
+ module.update.content(tabPath, cachedContent);
513
+ }
514
+ }
515
+ settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
516
+ } else if (existingRequest) {
517
+ module.set.loading(tabPath);
518
+ module.debug('Content is already loading', fullTabPath);
519
+ } else if ($.api !== undefined) {
520
+ requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);
521
+ module.debug('Retrieving remote content', fullTabPath, requestSettings);
522
+ module.set.loading(tabPath);
523
+ $tab.api(requestSettings);
524
+ } else {
525
+ module.error(error.api);
526
+ }
527
+ },
528
+ },
459
529
 
460
- update: {
461
- content: function(tabPath, html, evaluateScripts) {
462
- var
463
- $tab = module.get.tabElement(tabPath),
464
- tab = $tab[0]
465
- ;
466
- evaluateScripts = (evaluateScripts !== undefined)
467
- ? evaluateScripts
468
- : settings.evaluateScripts
469
- ;
470
- if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && typeof html !== 'string') {
471
- $tab
472
- .empty()
473
- .append($(html).clone(true))
474
- ;
475
- }
476
- else {
477
- if(evaluateScripts) {
478
- module.debug('Updating HTML and evaluating inline scripts', tabPath, html);
479
- $tab.html(html);
480
- }
481
- else {
482
- module.debug('Updating HTML', tabPath, html);
483
- tab.innerHTML = html;
484
- }
485
- }
486
- }
487
- },
530
+ activate: {
531
+ all: function (tabPath) {
532
+ module.activate.tab(tabPath);
533
+ module.activate.navigation(tabPath);
534
+ },
535
+ tab: function (tabPath) {
536
+ var
537
+ $tab = module.get.tabElement(tabPath),
538
+ $deactiveTabs = settings.deactivate === 'siblings'
539
+ ? $tab.siblings($tabs)
540
+ : $tabs.not($tab),
541
+ isActive = $tab.hasClass(className.active)
542
+ ;
543
+ module.verbose('Showing tab content for', $tab);
544
+ if (!isActive) {
545
+ $tab
546
+ .addClass(className.active)
547
+ ;
548
+ $deactiveTabs
549
+ .removeClass(className.active + ' ' + className.loading)
550
+ ;
551
+ if ($tab.length > 0) {
552
+ settings.onVisible.call($tab[0], tabPath);
553
+ }
554
+ }
555
+ },
556
+ navigation: function (tabPath) {
557
+ var
558
+ $navigation = module.get.navElement(tabPath),
559
+ $deactiveNavigation = settings.deactivate === 'siblings'
560
+ ? $navigation.siblings($allModules)
561
+ : $allModules.not($navigation),
562
+ isActive = $navigation.hasClass(className.active)
563
+ ;
564
+ module.verbose('Activating tab navigation for', $navigation, tabPath);
565
+ if (!isActive) {
566
+ $navigation
567
+ .addClass(className.active)
568
+ ;
569
+ $deactiveNavigation
570
+ .removeClass(className.active + ' ' + className.loading)
571
+ ;
572
+ }
573
+ },
574
+ },
488
575
 
489
- fetch: {
576
+ deactivate: {
577
+ all: function () {
578
+ module.deactivate.navigation();
579
+ module.deactivate.tabs();
580
+ },
581
+ navigation: function () {
582
+ $allModules
583
+ .removeClass(className.active)
584
+ ;
585
+ },
586
+ tabs: function () {
587
+ $tabs
588
+ .removeClass(className.active + ' ' + className.loading)
589
+ ;
590
+ },
591
+ },
490
592
 
491
- content: function(tabPath, fullTabPath) {
492
- var
493
- $tab = module.get.tabElement(tabPath),
494
- apiSettings = {
495
- dataType : 'html',
496
- encodeParameters : false,
497
- on : 'now',
498
- cache : settings.alwaysRefresh,
499
- headers : {
500
- 'X-Remote': true
593
+ is: {
594
+ tab: function (tabName) {
595
+ return tabName !== undefined
596
+ ? module.get.tabElement(tabName).length > 0
597
+ : false;
598
+ },
501
599
  },
502
- onSuccess : function(response) {
503
- if(settings.cacheType == 'response') {
504
- module.cache.add(fullTabPath, response);
505
- }
506
- module.update.content(tabPath, response);
507
- if(tabPath == activeTabPath) {
508
- module.debug('Content loaded', tabPath);
509
- module.activate.tab(tabPath);
510
- }
511
- else {
512
- module.debug('Content loaded in background', tabPath);
513
- }
514
- settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);
515
- settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
516
-
517
- if(settings.loadOnce) {
518
- module.cache.add(fullTabPath, true);
519
- }
520
- else if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && $tab.children().length > 0) {
521
- setTimeout(function() {
522
- var
523
- $clone = $tab.children().clone(true)
524
- ;
525
- $clone = $clone.not('script');
526
- module.cache.add(fullTabPath, $clone);
527
- }, 0);
528
- }
529
- else {
530
- module.cache.add(fullTabPath, $tab.html());
531
- }
600
+
601
+ get: {
602
+ initialPath: function () {
603
+ return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);
604
+ },
605
+ path: function () {
606
+ return $.address.value();
607
+ },
608
+ // adds default tabs to tab path
609
+ defaultPathArray: function (tabPath) {
610
+ return module.utilities.pathToArray(module.get.defaultPath(tabPath));
611
+ },
612
+ defaultPath: function (tabPath) {
613
+ var
614
+ $defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + module.escape.string(tabPath) + '/"]').eq(0),
615
+ defaultTab = $defaultNav.data(metadata.tab) || false
616
+ ;
617
+ if (defaultTab) {
618
+ module.debug('Found default tab', defaultTab);
619
+ if (recursionDepth < settings.maxDepth) {
620
+ recursionDepth++;
621
+
622
+ return module.get.defaultPath(defaultTab);
623
+ }
624
+ module.error(error.recursion);
625
+ } else {
626
+ module.debug('No default tabs found for', tabPath, $tabs);
627
+ }
628
+ recursionDepth = 0;
629
+
630
+ return tabPath;
631
+ },
632
+ navElement: function (tabPath) {
633
+ tabPath = tabPath || activeTabPath;
634
+
635
+ return $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
636
+ },
637
+ tabElement: function (tabPath) {
638
+ var
639
+ $fullPathTab,
640
+ $simplePathTab,
641
+ tabPathArray,
642
+ lastTab
643
+ ;
644
+ tabPath = tabPath || activeTabPath;
645
+ tabPathArray = module.utilities.pathToArray(tabPath);
646
+ lastTab = module.utilities.last(tabPathArray);
647
+ $fullPathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
648
+ $simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(lastTab) + '"]');
649
+
650
+ return $fullPathTab.length > 0
651
+ ? $fullPathTab
652
+ : $simplePathTab;
653
+ },
654
+ tab: function () {
655
+ return activeTabPath;
656
+ },
532
657
  },
533
- urlData: {
534
- tab: fullTabPath
535
- }
536
- },
537
- request = $tab.api('get request') || false,
538
- existingRequest = ( request && request.state() === 'pending' ),
539
- requestSettings,
540
- cachedContent
541
- ;
542
658
 
543
- fullTabPath = fullTabPath || tabPath;
544
- cachedContent = module.cache.read(fullTabPath);
659
+ determine: {
660
+ activeTab: function () {
661
+ var activeTab = null;
662
+
663
+ $tabs.each(function (_index, tab) {
664
+ var $tab = $(tab);
665
+
666
+ if ($tab.hasClass(className.active)) {
667
+ var
668
+ tabPath = $(this).data(metadata.tab),
669
+ $anchor = $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]')
670
+ ;
671
+
672
+ if ($anchor.hasClass(className.active)) {
673
+ activeTab = tabPath;
674
+ }
675
+ }
676
+ });
545
677
 
678
+ return activeTab;
679
+ },
680
+ },
681
+
682
+ utilities: {
683
+ filterArray: function (keepArray, removeArray) {
684
+ return $.grep(keepArray, function (keepValue) {
685
+ return $.inArray(keepValue, removeArray) === -1;
686
+ });
687
+ },
688
+ last: function (array) {
689
+ return Array.isArray(array)
690
+ ? array[array.length - 1]
691
+ : false;
692
+ },
693
+ pathToArray: function (pathName) {
694
+ if (pathName === undefined) {
695
+ pathName = activeTabPath;
696
+ }
697
+
698
+ return typeof pathName === 'string'
699
+ ? pathName.split('/')
700
+ : [pathName];
701
+ },
702
+ arrayToPath: function (pathArray) {
703
+ return Array.isArray(pathArray)
704
+ ? pathArray.join('/')
705
+ : false;
706
+ },
707
+ },
546
708
 
547
- if(settings.cache && cachedContent) {
548
- module.activate.tab(tabPath);
549
- module.debug('Adding cached content', fullTabPath);
550
- if(!settings.loadOnce) {
551
- if(settings.evaluateScripts == 'once') {
552
- module.update.content(tabPath, cachedContent, false);
709
+ setting: function (name, value) {
710
+ module.debug('Changing setting', name, value);
711
+ if ($.isPlainObject(name)) {
712
+ $.extend(true, settings, name);
713
+ } else if (value !== undefined) {
714
+ if ($.isPlainObject(settings[name])) {
715
+ $.extend(true, settings[name], value);
716
+ } else {
717
+ settings[name] = value;
718
+ }
719
+ } else {
720
+ return settings[name];
721
+ }
722
+ },
723
+ internal: function (name, value) {
724
+ if ($.isPlainObject(name)) {
725
+ $.extend(true, module, name);
726
+ } else if (value !== undefined) {
727
+ module[name] = value;
728
+ } else {
729
+ return module[name];
730
+ }
731
+ },
732
+ debug: function () {
733
+ if (!settings.silent && settings.debug) {
734
+ if (settings.performance) {
735
+ module.performance.log(arguments);
736
+ } else {
737
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
738
+ module.debug.apply(console, arguments);
739
+ }
740
+ }
741
+ },
742
+ verbose: function () {
743
+ if (!settings.silent && settings.verbose && settings.debug) {
744
+ if (settings.performance) {
745
+ module.performance.log(arguments);
746
+ } else {
747
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
748
+ module.verbose.apply(console, arguments);
749
+ }
750
+ }
751
+ },
752
+ error: function () {
753
+ if (!settings.silent) {
754
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
755
+ module.error.apply(console, arguments);
756
+ }
757
+ },
758
+ performance: {
759
+ log: function (message) {
760
+ var
761
+ currentTime,
762
+ executionTime,
763
+ previousTime
764
+ ;
765
+ if (settings.performance) {
766
+ currentTime = Date.now();
767
+ previousTime = time || currentTime;
768
+ executionTime = currentTime - previousTime;
769
+ time = currentTime;
770
+ performance.push({
771
+ Name: message[0],
772
+ Arguments: [].slice.call(message, 1) || '',
773
+ Element: element,
774
+ 'Execution Time': executionTime,
775
+ });
776
+ }
777
+ clearTimeout(module.performance.timer);
778
+ module.performance.timer = setTimeout(module.performance.display, 500);
779
+ },
780
+ display: function () {
781
+ var
782
+ title = settings.name + ':',
783
+ totalTime = 0
784
+ ;
785
+ time = false;
786
+ clearTimeout(module.performance.timer);
787
+ $.each(performance, function (index, data) {
788
+ totalTime += data['Execution Time'];
789
+ });
790
+ title += ' ' + totalTime + 'ms';
791
+ if (moduleSelector) {
792
+ title += ' \'' + moduleSelector + '\'';
793
+ }
794
+ if (performance.length > 0) {
795
+ console.groupCollapsed(title);
796
+ if (console.table) {
797
+ console.table(performance);
798
+ } else {
799
+ $.each(performance, function (index, data) {
800
+ console.log(data.Name + ': ' + data['Execution Time'] + 'ms');
801
+ });
802
+ }
803
+ console.groupEnd();
804
+ }
805
+ performance = [];
806
+ },
807
+ },
808
+ invoke: function (query, passedArguments, context) {
809
+ var
810
+ object = instance,
811
+ maxDepth,
812
+ found,
813
+ response
814
+ ;
815
+ passedArguments = passedArguments || queryArguments;
816
+ context = context || element;
817
+ if (typeof query === 'string' && object !== undefined) {
818
+ query = query.split(/[ .]/);
819
+ maxDepth = query.length - 1;
820
+ $.each(query, function (depth, value) {
821
+ var camelCaseValue = depth !== maxDepth
822
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
823
+ : query
824
+ ;
825
+ if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {
826
+ object = object[camelCaseValue];
827
+ } else if (object[camelCaseValue] !== undefined) {
828
+ found = object[camelCaseValue];
829
+
830
+ return false;
831
+ } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {
832
+ object = object[value];
833
+ } else if (object[value] !== undefined) {
834
+ found = object[value];
835
+
836
+ return false;
837
+ } else {
838
+ module.error(error.method, query);
839
+
840
+ return false;
841
+ }
842
+ });
843
+ }
844
+ if (isFunction(found)) {
845
+ response = found.apply(context, passedArguments);
846
+ } else if (found !== undefined) {
847
+ response = found;
848
+ }
849
+ if (Array.isArray(returnedValue)) {
850
+ returnedValue.push(response);
851
+ } else if (returnedValue !== undefined) {
852
+ returnedValue = [returnedValue, response];
853
+ } else if (response !== undefined) {
854
+ returnedValue = response;
855
+ }
856
+
857
+ return found;
858
+ },
859
+ };
860
+ if (methodInvoked) {
861
+ if (instance === undefined) {
862
+ module.initialize();
553
863
  }
554
- else {
555
- module.update.content(tabPath, cachedContent);
864
+ module.invoke(query);
865
+ } else {
866
+ if (instance !== undefined) {
867
+ instance.invoke('destroy');
556
868
  }
557
- }
558
- settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
559
- }
560
- else if(existingRequest) {
561
- module.set.loading(tabPath);
562
- module.debug('Content is already loading', fullTabPath);
563
- }
564
- else if($.api !== undefined) {
565
- requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);
566
- module.debug('Retrieving remote content', fullTabPath, requestSettings);
567
- module.set.loading(tabPath);
568
- $tab.api(requestSettings);
869
+ module.initialize();
569
870
  }
570
- else {
571
- module.error(error.api);
572
- }
573
- }
574
- },
871
+ });
575
872
 
576
- activate: {
577
- all: function(tabPath) {
578
- module.activate.tab(tabPath);
579
- module.activate.navigation(tabPath);
580
- },
581
- tab: function(tabPath) {
582
- var
583
- $tab = module.get.tabElement(tabPath),
584
- $deactiveTabs = (settings.deactivate == 'siblings')
585
- ? $tab.siblings($tabs)
586
- : $tabs.not($tab),
587
- isActive = $tab.hasClass(className.active)
588
- ;
589
- module.verbose('Showing tab content for', $tab);
590
- if(!isActive) {
591
- $tab
592
- .addClass(className.active)
593
- ;
594
- $deactiveTabs
595
- .removeClass(className.active + ' ' + className.loading)
596
- ;
597
- if($tab.length > 0) {
598
- settings.onVisible.call($tab[0], tabPath);
599
- }
600
- }
601
- },
602
- navigation: function(tabPath) {
603
- var
604
- $navigation = module.get.navElement(tabPath),
605
- $deactiveNavigation = (settings.deactivate == 'siblings')
606
- ? $navigation.siblings($allModules)
607
- : $allModules.not($navigation),
608
- isActive = $navigation.hasClass(className.active)
609
- ;
610
- module.verbose('Activating tab navigation for', $navigation, tabPath);
611
- if(!isActive) {
612
- $navigation
613
- .addClass(className.active)
614
- ;
615
- $deactiveNavigation
616
- .removeClass(className.active + ' ' + className.loading)
617
- ;
618
- }
619
- }
620
- },
873
+ return returnedValue !== undefined
874
+ ? returnedValue
875
+ : this;
876
+ };
621
877
 
622
- deactivate: {
623
- all: function() {
624
- module.deactivate.navigation();
625
- module.deactivate.tabs();
626
- },
627
- navigation: function() {
628
- $allModules
629
- .removeClass(className.active)
630
- ;
631
- },
632
- tabs: function() {
633
- $tabs
634
- .removeClass(className.active + ' ' + className.loading)
635
- ;
636
- }
637
- },
878
+ // shortcut for tabbed content with no defined navigation
879
+ $.tab = function () {
880
+ $(window).tab.apply(this, arguments);
881
+ };
638
882
 
639
- is: {
640
- tab: function(tabName) {
641
- return (tabName !== undefined)
642
- ? ( module.get.tabElement(tabName).length > 0 )
643
- : false
644
- ;
645
- }
646
- },
883
+ $.fn.tab.settings = {
647
884
 
648
- get: {
649
- initialPath: function() {
650
- return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);
651
- },
652
- path: function() {
653
- return $.address.value();
654
- },
655
- // adds default tabs to tab path
656
- defaultPathArray: function(tabPath) {
657
- return module.utilities.pathToArray( module.get.defaultPath(tabPath) );
658
- },
659
- defaultPath: function(tabPath) {
660
- var
661
- $defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + module.escape.string(tabPath) + '/"]').eq(0),
662
- defaultTab = $defaultNav.data(metadata.tab) || false
663
- ;
664
- if( defaultTab ) {
665
- module.debug('Found default tab', defaultTab);
666
- if(recursionDepth < settings.maxDepth) {
667
- recursionDepth++;
668
- return module.get.defaultPath(defaultTab);
669
- }
670
- module.error(error.recursion);
671
- }
672
- else {
673
- module.debug('No default tabs found for', tabPath, $tabs);
674
- }
675
- recursionDepth = 0;
676
- return tabPath;
677
- },
678
- navElement: function(tabPath) {
679
- tabPath = tabPath || activeTabPath;
680
- return $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
681
- },
682
- tabElement: function(tabPath) {
683
- var
684
- $fullPathTab,
685
- $simplePathTab,
686
- tabPathArray,
687
- lastTab
688
- ;
689
- tabPath = tabPath || activeTabPath;
690
- tabPathArray = module.utilities.pathToArray(tabPath);
691
- lastTab = module.utilities.last(tabPathArray);
692
- $fullPathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
693
- $simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(lastTab) + '"]');
694
- return ($fullPathTab.length > 0)
695
- ? $fullPathTab
696
- : $simplePathTab
697
- ;
698
- },
699
- tab: function() {
700
- return activeTabPath;
701
- }
702
- },
885
+ name: 'Tab',
886
+ namespace: 'tab',
703
887
 
704
- determine: {
705
- activeTab: function() {
706
- var activeTab = null;
888
+ silent: false,
889
+ debug: false,
890
+ verbose: false,
891
+ performance: true,
707
892
 
708
- $tabs.each(function(_index, tab) {
709
- var $tab = $(tab);
893
+ auto: false, // uses pjax style endpoints fetching content from same url with remote-content headers
894
+ history: false, // use browser history
895
+ historyType: 'hash', // #/ or html5 state
896
+ path: false, // base path of url
710
897
 
711
- if( $tab.hasClass(className.active) ) {
712
- var
713
- tabPath = $(this).data(metadata.tab),
714
- $anchor = $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]')
715
- ;
898
+ context: false, // specify a context that tabs must appear inside
899
+ childrenOnly: false, // use only tabs that are children of context
900
+ maxDepth: 25, // max depth a tab can be nested
716
901
 
717
- if( $anchor.hasClass(className.active) ) {
718
- activeTab = tabPath;
719
- }
720
- }
721
- });
902
+ deactivate: 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together
722
903
 
723
- return activeTab;
724
- }
725
- },
904
+ alwaysRefresh: false, // load tab content new every tab click
905
+ cache: true, // cache the content requests to pull locally
906
+ loadOnce: false, // Whether tab data should only be loaded once when using remote content
907
+ cacheType: 'response', // Whether to cache exact response, or to html cache contents after scripts execute
908
+ ignoreFirstLoad: false, // don't load remote content on first load
726
909
 
727
- utilities: {
728
- filterArray: function(keepArray, removeArray) {
729
- return $.grep(keepArray, function(keepValue) {
730
- return ( $.inArray(keepValue, removeArray) == -1);
731
- });
732
- },
733
- last: function(array) {
734
- return Array.isArray(array)
735
- ? array[ array.length - 1]
736
- : false
737
- ;
738
- },
739
- pathToArray: function(pathName) {
740
- if(pathName === undefined) {
741
- pathName = activeTabPath;
742
- }
743
- return typeof pathName == 'string'
744
- ? pathName.split('/')
745
- : [pathName]
746
- ;
747
- },
748
- arrayToPath: function(pathArray) {
749
- return Array.isArray(pathArray)
750
- ? pathArray.join('/')
751
- : false
752
- ;
753
- }
754
- },
910
+ apiSettings: false, // settings for api call
911
+ evaluateScripts: 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content
912
+ autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab
755
913
 
756
- setting: function(name, value) {
757
- module.debug('Changing setting', name, value);
758
- if( $.isPlainObject(name) ) {
759
- $.extend(true, settings, name);
760
- }
761
- else if(value !== undefined) {
762
- if($.isPlainObject(settings[name])) {
763
- $.extend(true, settings[name], value);
764
- }
765
- else {
766
- settings[name] = value;
767
- }
768
- }
769
- else {
770
- return settings[name];
771
- }
914
+ onFirstLoad: function (tabPath, parameterArray, historyEvent) {}, // called first time loaded
915
+ onLoad: function (tabPath, parameterArray, historyEvent) {}, // called on every load
916
+ onVisible: function (tabPath, parameterArray, historyEvent) {}, // called every time tab visible
917
+ onRequest: function (tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
918
+ onBeforeChange: function (tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change
919
+
920
+ templates: {
921
+ determineTitle: function (tabArray) {}, // returns page title for path
772
922
  },
773
- internal: function(name, value) {
774
- if( $.isPlainObject(name) ) {
775
- $.extend(true, module, name);
776
- }
777
- else if(value !== undefined) {
778
- module[name] = value;
779
- }
780
- else {
781
- return module[name];
782
- }
923
+
924
+ error: {
925
+ api: 'You attempted to load content without API module',
926
+ method: 'The method you called is not defined',
927
+ missingTab: 'Activated tab cannot be found. Tabs are case-sensitive.',
928
+ noContent: 'The tab you specified is missing a content url.',
929
+ path: 'History enabled, but no path was specified',
930
+ recursion: 'Max recursive depth reached',
931
+ state: 'History requires Asual\'s Address library <https://github.com/asual/jquery-address>',
783
932
  },
784
- debug: function() {
785
- if(!settings.silent && settings.debug) {
786
- if(settings.performance) {
787
- module.performance.log(arguments);
788
- }
789
- else {
790
- module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
791
- module.debug.apply(console, arguments);
792
- }
793
- }
933
+
934
+ regExp: {
935
+ escape: /[\s#$()*+,.:=?@[\\\]^{|}-]/g,
794
936
  },
795
- verbose: function() {
796
- if(!settings.silent && settings.verbose && settings.debug) {
797
- if(settings.performance) {
798
- module.performance.log(arguments);
799
- }
800
- else {
801
- module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
802
- module.verbose.apply(console, arguments);
803
- }
804
- }
937
+
938
+ metadata: {
939
+ tab: 'tab',
940
+ loaded: 'loaded',
941
+ promise: 'promise',
805
942
  },
806
- error: function() {
807
- if(!settings.silent) {
808
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
809
- module.error.apply(console, arguments);
810
- }
943
+
944
+ className: {
945
+ loading: 'loading',
946
+ active: 'active',
811
947
  },
812
- performance: {
813
- log: function(message) {
814
- var
815
- currentTime,
816
- executionTime,
817
- previousTime
818
- ;
819
- if(settings.performance) {
820
- currentTime = new Date().getTime();
821
- previousTime = time || currentTime;
822
- executionTime = currentTime - previousTime;
823
- time = currentTime;
824
- performance.push({
825
- 'Name' : message[0],
826
- 'Arguments' : [].slice.call(message, 1) || '',
827
- 'Element' : element,
828
- 'Execution Time' : executionTime
829
- });
830
- }
831
- clearTimeout(module.performance.timer);
832
- module.performance.timer = setTimeout(module.performance.display, 500);
833
- },
834
- display: function() {
835
- var
836
- title = settings.name + ':',
837
- totalTime = 0
838
- ;
839
- time = false;
840
- clearTimeout(module.performance.timer);
841
- $.each(performance, function(index, data) {
842
- totalTime += data['Execution Time'];
843
- });
844
- title += ' ' + totalTime + 'ms';
845
- if(moduleSelector) {
846
- title += ' \'' + moduleSelector + '\'';
847
- }
848
- if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
849
- console.groupCollapsed(title);
850
- if(console.table) {
851
- console.table(performance);
852
- }
853
- else {
854
- $.each(performance, function(index, data) {
855
- console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
856
- });
857
- }
858
- console.groupEnd();
859
- }
860
- performance = [];
861
- }
948
+
949
+ selector: {
950
+ tabs: '.ui.tab',
951
+ ui: '.ui',
862
952
  },
863
- invoke: function(query, passedArguments, context) {
864
- var
865
- object = instance,
866
- maxDepth,
867
- found,
868
- response
869
- ;
870
- passedArguments = passedArguments || queryArguments;
871
- context = context || element;
872
- if(typeof query == 'string' && object !== undefined) {
873
- query = query.split(/[\. ]/);
874
- maxDepth = query.length - 1;
875
- $.each(query, function(depth, value) {
876
- var camelCaseValue = (depth != maxDepth)
877
- ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
878
- : query
879
- ;
880
- if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
881
- object = object[camelCaseValue];
882
- }
883
- else if( object[camelCaseValue] !== undefined ) {
884
- found = object[camelCaseValue];
885
- return false;
886
- }
887
- else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
888
- object = object[value];
889
- }
890
- else if( object[value] !== undefined ) {
891
- found = object[value];
892
- return false;
893
- }
894
- else {
895
- module.error(error.method, query);
896
- return false;
897
- }
898
- });
899
- }
900
- if ( $.isFunction( found ) ) {
901
- response = found.apply(context, passedArguments);
902
- }
903
- else if(found !== undefined) {
904
- response = found;
905
- }
906
- if(Array.isArray(returnedValue)) {
907
- returnedValue.push(response);
908
- }
909
- else if(returnedValue !== undefined) {
910
- returnedValue = [returnedValue, response];
911
- }
912
- else if(response !== undefined) {
913
- returnedValue = response;
914
- }
915
- return found;
916
- }
917
- };
918
- if(methodInvoked) {
919
- if(instance === undefined) {
920
- module.initialize();
921
- }
922
- module.invoke(query);
923
- }
924
- else {
925
- if(instance !== undefined) {
926
- instance.invoke('destroy');
927
- }
928
- module.initialize();
929
- }
930
- })
931
- ;
932
- return (returnedValue !== undefined)
933
- ? returnedValue
934
- : this
935
- ;
936
-
937
- };
938
-
939
- // shortcut for tabbed content with no defined navigation
940
- $.tab = function() {
941
- $(window).tab.apply(this, arguments);
942
- };
943
-
944
- $.fn.tab.settings = {
945
-
946
- name : 'Tab',
947
- namespace : 'tab',
948
-
949
- silent : false,
950
- debug : false,
951
- verbose : false,
952
- performance : true,
953
-
954
- auto : false, // uses pjax style endpoints fetching content from same url with remote-content headers
955
- history : false, // use browser history
956
- historyType : 'hash', // #/ or html5 state
957
- path : false, // base path of url
958
-
959
- context : false, // specify a context that tabs must appear inside
960
- childrenOnly : false, // use only tabs that are children of context
961
- maxDepth : 25, // max depth a tab can be nested
962
-
963
- deactivate : 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together
964
-
965
- alwaysRefresh : false, // load tab content new every tab click
966
- cache : true, // cache the content requests to pull locally
967
- loadOnce : false, // Whether tab data should only be loaded once when using remote content
968
- cacheType : 'response', // Whether to cache exact response, or to html cache contents after scripts execute
969
- ignoreFirstLoad : false, // don't load remote content on first load
970
-
971
- apiSettings : false, // settings for api call
972
- evaluateScripts : 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content
973
- autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab
974
-
975
- onFirstLoad : function(tabPath, parameterArray, historyEvent) {}, // called first time loaded
976
- onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load
977
- onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible
978
- onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
979
- onBeforeChange: function(tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change
980
-
981
- templates : {
982
- determineTitle: function(tabArray) {} // returns page title for path
983
- },
984
-
985
- error: {
986
- api : 'You attempted to load content without API module',
987
- method : 'The method you called is not defined',
988
- missingTab : 'Activated tab cannot be found. Tabs are case-sensitive.',
989
- noContent : 'The tab you specified is missing a content url.',
990
- path : 'History enabled, but no path was specified',
991
- recursion : 'Max recursive depth reached',
992
- legacyInit : 'onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.',
993
- legacyLoad : 'onTabLoad has been renamed to onLoad in 2.0. Please adjust your code',
994
- state : 'History requires Asual\'s Address library <https://github.com/asual/jquery-address>'
995
- },
996
-
997
- regExp : {
998
- escape : /[-[\]{}()*+?.,\\^$|#\s:=@]/g
999
- },
1000
-
1001
- metadata : {
1002
- tab : 'tab',
1003
- loaded : 'loaded',
1004
- promise: 'promise'
1005
- },
1006
-
1007
- className : {
1008
- loading : 'loading',
1009
- active : 'active'
1010
- },
1011
-
1012
- selector : {
1013
- tabs : '.ui.tab',
1014
- ui : '.ui'
1015
- }
1016
-
1017
- };
1018
-
1019
- })( jQuery, window, document );
953
+
954
+ };
955
+ })(jQuery, window, document);