fomantic-ui-sass 2.8.8.1 → 2.9.1

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