| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952 | /*! * # Semantic UI 2.4.2 - Tab * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.tab = function(parameters) {  var    // use window context if none specified    $allModules     = $.isFunction(this)        ? $(window)        : $(this),    moduleSelector  = $allModules.selector || '',    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    initializedHistory = false,    returnedValue  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.tab.settings, parameters)          : $.extend({}, $.fn.tab.settings),        className       = settings.className,        metadata        = settings.metadata,        selector        = settings.selector,        error           = settings.error,        eventNamespace  = '.' + settings.namespace,        moduleNamespace = 'module-' + settings.namespace,        $module         = $(this),        $context,        $tabs,        cache           = {},        firstLoad       = true,        recursionDepth  = 0,        element         = this,        instance        = $module.data(moduleNamespace),        activeTabPath,        parameterArray,        module,        historyEvent      ;      module = {        initialize: function() {          module.debug('Initializing tab menu item', $module);          module.fix.callbacks();          module.determineTabs();          module.debug('Determining tabs', settings.context, $tabs);          // set up automatic routing          if(settings.auto) {            module.set.auto();          }          module.bind.events();          if(settings.history && !initializedHistory) {            module.initializeHistory();            initializedHistory = true;          }          module.instantiate();        },        instantiate: function () {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.debug('Destroying tabs', $module);          $module            .removeData(moduleNamespace)            .off(eventNamespace)          ;        },        bind: {          events: function() {            // if using $.tab don't add events            if( !$.isWindow( element ) ) {              module.debug('Attaching tab activation events to element', $module);              $module                .on('click' + eventNamespace, module.event.click)              ;            }          }        },        determineTabs: function() {          var            $reference          ;          // determine tab context          if(settings.context === 'parent') {            if($module.closest(selector.ui).length > 0) {              $reference = $module.closest(selector.ui);              module.verbose('Using closest UI element as parent', $reference);            }            else {              $reference = $module;            }            $context = $reference.parent();            module.verbose('Determined parent element for creating context', $context);          }          else if(settings.context) {            $context = $(settings.context);            module.verbose('Using selector for tab context', settings.context, $context);          }          else {            $context = $('body');          }          // find tabs          if(settings.childrenOnly) {            $tabs = $context.children(selector.tabs);            module.debug('Searching tab context children for tabs', $context, $tabs);          }          else {            $tabs = $context.find(selector.tabs);            module.debug('Searching tab context for tabs', $context, $tabs);          }        },        fix: {          callbacks: function() {            if( $.isPlainObject(parameters) && (parameters.onTabLoad || parameters.onTabInit) ) {              if(parameters.onTabLoad) {                parameters.onLoad = parameters.onTabLoad;                delete parameters.onTabLoad;                module.error(error.legacyLoad, parameters.onLoad);              }              if(parameters.onTabInit) {                parameters.onFirstLoad = parameters.onTabInit;                delete parameters.onTabInit;                module.error(error.legacyInit, parameters.onFirstLoad);              }              settings = $.extend(true, {}, $.fn.tab.settings, parameters);            }          }        },        initializeHistory: function() {          module.debug('Initializing page state');          if( $.address === undefined ) {            module.error(error.state);            return false;          }          else {            if(settings.historyType == 'state') {              module.debug('Using HTML5 to manage state');              if(settings.path !== false) {                $.address                  .history(true)                  .state(settings.path)                ;              }              else {                module.error(error.path);                return false;              }            }            $.address              .bind('change', module.event.history.change)            ;          }        },        event: {          click: function(event) {            var              tabPath = $(this).data(metadata.tab)            ;            if(tabPath !== undefined) {              if(settings.history) {                module.verbose('Updating page state', event);                $.address.value(tabPath);              }              else {                module.verbose('Changing tab', event);                module.changeTab(tabPath);              }              event.preventDefault();            }            else {              module.debug('No tab specified');            }          },          history: {            change: function(event) {              var                tabPath   = event.pathNames.join('/') || module.get.initialPath(),                pageTitle = settings.templates.determineTitle(tabPath) || false              ;              module.performance.display();              module.debug('History change event', tabPath, event);              historyEvent = event;              if(tabPath !== undefined) {                module.changeTab(tabPath);              }              if(pageTitle) {                $.address.title(pageTitle);              }            }          }        },        refresh: function() {          if(activeTabPath) {            module.debug('Refreshing tab', activeTabPath);            module.changeTab(activeTabPath);          }        },        cache: {          read: function(cacheKey) {            return (cacheKey !== undefined)              ? cache[cacheKey]              : false            ;          },          add: function(cacheKey, content) {            cacheKey = cacheKey || activeTabPath;            module.debug('Adding cached content for', cacheKey);            cache[cacheKey] = content;          },          remove: function(cacheKey) {            cacheKey = cacheKey || activeTabPath;            module.debug('Removing cached content for', cacheKey);            delete cache[cacheKey];          }        },        set: {          auto: function() {            var              url = (typeof settings.path == 'string')                ? settings.path.replace(/\/$/, '') + '/{$tab}'                : '/{$tab}'            ;            module.verbose('Setting up automatic tab retrieval from server', url);            if($.isPlainObject(settings.apiSettings)) {              settings.apiSettings.url = url;            }            else {              settings.apiSettings = {                url: url              };            }          },          loading: function(tabPath) {            var              $tab      = module.get.tabElement(tabPath),              isLoading = $tab.hasClass(className.loading)            ;            if(!isLoading) {              module.verbose('Setting loading state for', $tab);              $tab                .addClass(className.loading)                .siblings($tabs)                  .removeClass(className.active + ' ' + className.loading)              ;              if($tab.length > 0) {                settings.onRequest.call($tab[0], tabPath);              }            }          },          state: function(state) {            $.address.value(state);          }        },        changeTab: function(tabPath) {          var            pushStateAvailable = (window.history && window.history.pushState),            shouldIgnoreLoad   = (pushStateAvailable && settings.ignoreFirstLoad && firstLoad),            remoteContent      = (settings.auto || $.isPlainObject(settings.apiSettings) ),            // only add default path if not remote content            pathArray = (remoteContent && !shouldIgnoreLoad)              ? module.utilities.pathToArray(tabPath)              : module.get.defaultPathArray(tabPath)          ;          tabPath = module.utilities.arrayToPath(pathArray);          $.each(pathArray, function(index, tab) {            var              currentPathArray   = pathArray.slice(0, index + 1),              currentPath        = module.utilities.arrayToPath(currentPathArray),              isTab              = module.is.tab(currentPath),              isLastIndex        = (index + 1 == pathArray.length),              $tab               = module.get.tabElement(currentPath),              $anchor,              nextPathArray,              nextPath,              isLastTab            ;            module.verbose('Looking for tab', tab);            if(isTab) {              module.verbose('Tab was found', tab);              // scope up              activeTabPath  = currentPath;              parameterArray = module.utilities.filterArray(pathArray, currentPathArray);              if(isLastIndex) {                isLastTab = true;              }              else {                nextPathArray = pathArray.slice(0, index + 2);                nextPath      = module.utilities.arrayToPath(nextPathArray);                isLastTab     = ( !module.is.tab(nextPath) );                if(isLastTab) {                  module.verbose('Tab parameters found', nextPathArray);                }              }              if(isLastTab && remoteContent) {                if(!shouldIgnoreLoad) {                  module.activate.navigation(currentPath);                  module.fetch.content(currentPath, tabPath);                }                else {                  module.debug('Ignoring remote content on first tab load', currentPath);                  firstLoad = false;                  module.cache.add(tabPath, $tab.html());                  module.activate.all(currentPath);                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);                  settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);                }                return false;              }              else {                module.debug('Opened local tab', currentPath);                module.activate.all(currentPath);                if( !module.cache.read(currentPath) ) {                  module.cache.add(currentPath, true);                  module.debug('First time tab loaded calling tab init');                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);                }                settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);              }            }            else if(tabPath.search('/') == -1 && tabPath !== '') {              // look for in page anchor              $anchor     = $('#' + tabPath + ', a[name="' + tabPath + '"]');              currentPath = $anchor.closest('[data-tab]').data(metadata.tab);              $tab        = module.get.tabElement(currentPath);              // if anchor exists use parent tab              if($anchor && $anchor.length > 0 && currentPath) {                module.debug('Anchor link used, opening parent tab', $tab, $anchor);                if( !$tab.hasClass(className.active) ) {                  setTimeout(function() {                    module.scrollTo($anchor);                  }, 0);                }                module.activate.all(currentPath);                if( !module.cache.read(currentPath) ) {                  module.cache.add(currentPath, true);                  module.debug('First time tab loaded calling tab init');                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);                }                settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);                return false;              }            }            else {              module.error(error.missingTab, $module, $context, currentPath);              return false;            }          });        },        scrollTo: function($element) {          var            scrollOffset = ($element && $element.length > 0)              ? $element.offset().top              : false          ;          if(scrollOffset !== false) {            module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);            $(document).scrollTop(scrollOffset);          }        },        update: {          content: function(tabPath, html, evaluateScripts) {            var              $tab = module.get.tabElement(tabPath),              tab  = $tab[0]            ;            evaluateScripts = (evaluateScripts !== undefined)              ? evaluateScripts              : settings.evaluateScripts            ;            if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && typeof html !== 'string') {              $tab                .empty()                .append($(html).clone(true))              ;            }            else {              if(evaluateScripts) {                module.debug('Updating HTML and evaluating inline scripts', tabPath, html);                $tab.html(html);              }              else {                module.debug('Updating HTML', tabPath, html);                tab.innerHTML = html;              }            }          }        },        fetch: {          content: function(tabPath, fullTabPath) {            var              $tab        = module.get.tabElement(tabPath),              apiSettings = {                dataType         : 'html',                encodeParameters : false,                on               : 'now',                cache            : settings.alwaysRefresh,                headers          : {                  'X-Remote': true                },                onSuccess : function(response) {                  if(settings.cacheType == 'response') {                    module.cache.add(fullTabPath, response);                  }                  module.update.content(tabPath, response);                  if(tabPath == activeTabPath) {                    module.debug('Content loaded', tabPath);                    module.activate.tab(tabPath);                  }                  else {                    module.debug('Content loaded in background', tabPath);                  }                  settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);                  settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);                  if(settings.loadOnce) {                    module.cache.add(fullTabPath, true);                  }                  else if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && $tab.children().length > 0) {                    setTimeout(function() {                      var                        $clone = $tab.children().clone(true)                      ;                      $clone = $clone.not('script');                      module.cache.add(fullTabPath, $clone);                    }, 0);                  }                  else {                    module.cache.add(fullTabPath, $tab.html());                  }                },                urlData: {                  tab: fullTabPath                }              },              request         = $tab.api('get request') || false,              existingRequest = ( request && request.state() === 'pending' ),              requestSettings,              cachedContent            ;            fullTabPath   = fullTabPath || tabPath;            cachedContent = module.cache.read(fullTabPath);            if(settings.cache && cachedContent) {              module.activate.tab(tabPath);              module.debug('Adding cached content', fullTabPath);              if(!settings.loadOnce) {                if(settings.evaluateScripts == 'once') {                  module.update.content(tabPath, cachedContent, false);                }                else {                  module.update.content(tabPath, cachedContent);                }              }              settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);            }            else if(existingRequest) {              module.set.loading(tabPath);              module.debug('Content is already loading', fullTabPath);            }            else if($.api !== undefined) {              requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);              module.debug('Retrieving remote content', fullTabPath, requestSettings);              module.set.loading(tabPath);              $tab.api(requestSettings);            }            else {              module.error(error.api);            }          }        },        activate: {          all: function(tabPath) {            module.activate.tab(tabPath);            module.activate.navigation(tabPath);          },          tab: function(tabPath) {            var              $tab          = module.get.tabElement(tabPath),              $deactiveTabs = (settings.deactivate == 'siblings')                ? $tab.siblings($tabs)                : $tabs.not($tab),              isActive      = $tab.hasClass(className.active)            ;            module.verbose('Showing tab content for', $tab);            if(!isActive) {              $tab                .addClass(className.active)              ;              $deactiveTabs                .removeClass(className.active + ' ' + className.loading)              ;              if($tab.length > 0) {                settings.onVisible.call($tab[0], tabPath);              }            }          },          navigation: function(tabPath) {            var              $navigation         = module.get.navElement(tabPath),              $deactiveNavigation = (settings.deactivate == 'siblings')                ? $navigation.siblings($allModules)                : $allModules.not($navigation),              isActive    = $navigation.hasClass(className.active)            ;            module.verbose('Activating tab navigation for', $navigation, tabPath);            if(!isActive) {              $navigation                .addClass(className.active)              ;              $deactiveNavigation                .removeClass(className.active + ' ' + className.loading)              ;            }          }        },        deactivate: {          all: function() {            module.deactivate.navigation();            module.deactivate.tabs();          },          navigation: function() {            $allModules              .removeClass(className.active)            ;          },          tabs: function() {            $tabs              .removeClass(className.active + ' ' + className.loading)            ;          }        },        is: {          tab: function(tabName) {            return (tabName !== undefined)              ? ( module.get.tabElement(tabName).length > 0 )              : false            ;          }        },        get: {          initialPath: function() {            return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);          },          path: function() {            return $.address.value();          },          // adds default tabs to tab path          defaultPathArray: function(tabPath) {            return module.utilities.pathToArray( module.get.defaultPath(tabPath) );          },          defaultPath: function(tabPath) {            var              $defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + tabPath + '/"]').eq(0),              defaultTab  = $defaultNav.data(metadata.tab) || false            ;            if( defaultTab ) {              module.debug('Found default tab', defaultTab);              if(recursionDepth < settings.maxDepth) {                recursionDepth++;                return module.get.defaultPath(defaultTab);              }              module.error(error.recursion);            }            else {              module.debug('No default tabs found for', tabPath, $tabs);            }            recursionDepth = 0;            return tabPath;          },          navElement: function(tabPath) {            tabPath = tabPath || activeTabPath;            return $allModules.filter('[data-' + metadata.tab + '="' + tabPath + '"]');          },          tabElement: function(tabPath) {            var              $fullPathTab,              $simplePathTab,              tabPathArray,              lastTab            ;            tabPath        = tabPath || activeTabPath;            tabPathArray   = module.utilities.pathToArray(tabPath);            lastTab        = module.utilities.last(tabPathArray);            $fullPathTab   = $tabs.filter('[data-' + metadata.tab + '="' + tabPath + '"]');            $simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + lastTab + '"]');            return ($fullPathTab.length > 0)              ? $fullPathTab              : $simplePathTab            ;          },          tab: function() {            return activeTabPath;          }        },        utilities: {          filterArray: function(keepArray, removeArray) {            return $.grep(keepArray, function(keepValue) {              return ( $.inArray(keepValue, removeArray) == -1);            });          },          last: function(array) {            return $.isArray(array)              ? array[ array.length - 1]              : false            ;          },          pathToArray: function(pathName) {            if(pathName === undefined) {              pathName = activeTabPath;            }            return typeof pathName == 'string'              ? pathName.split('/')              : [pathName]            ;          },          arrayToPath: function(pathArray) {            return $.isArray(pathArray)              ? pathArray.join('/')              : false            ;          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};// shortcut for tabbed content with no defined navigation$.tab = function() {  $(window).tab.apply(this, arguments);};$.fn.tab.settings = {  name            : 'Tab',  namespace       : 'tab',  silent          : false,  debug           : false,  verbose         : false,  performance     : true,  auto            : false,      // uses pjax style endpoints fetching content from same url with remote-content headers  history         : false,      // use browser history  historyType     : 'hash',     // #/ or html5 state  path            : false,      // base path of url  context         : false,      // specify a context that tabs must appear inside  childrenOnly    : false,      // use only tabs that are children of context  maxDepth        : 25,         // max depth a tab can be nested  deactivate      : 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together  alwaysRefresh   : false,      // load tab content new every tab click  cache           : true,       // cache the content requests to pull locally  loadOnce        : false,      // Whether tab data should only be loaded once when using remote content  cacheType       : 'response', // Whether to cache exact response, or to html cache contents after scripts execute  ignoreFirstLoad : false,      // don't load remote content on first load  apiSettings     : false,      // settings for api call  evaluateScripts : 'once',     // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content  onFirstLoad : function(tabPath, parameterArray, historyEvent) {}, // called first time loaded  onLoad      : function(tabPath, parameterArray, historyEvent) {}, // called on every load  onVisible   : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible  onRequest   : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content  templates : {    determineTitle: function(tabArray) {} // returns page title for path  },  error: {    api        : 'You attempted to load content without API module',    method     : 'The method you called is not defined',    missingTab : 'Activated tab cannot be found. Tabs are case-sensitive.',    noContent  : 'The tab you specified is missing a content url.',    path       : 'History enabled, but no path was specified',    recursion  : 'Max recursive depth reached',    legacyInit : 'onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.',    legacyLoad : 'onTabLoad has been renamed to onLoad in 2.0. Please adjust your code',    state      : 'History requires Asual\'s Address library <https://github.com/asual/jquery-address>'  },  metadata : {    tab    : 'tab',    loaded : 'loaded',    promise: 'promise'  },  className   : {    loading : 'loading',    active  : 'active'  },  selector    : {    tabs : '.ui.tab',    ui   : '.ui'  }};})( jQuery, window, document );
 |