"use strict"; (function(F){ const E = (s)=>document.querySelector(s), EA = (s)=>document.querySelectorAll(s), D = F.dom; const TabManager = function(domElem, options){ this.e = {}; this.options = F.mergeLastWins(TabManager.defaultOptions , options); if(domElem) this.init(domElem); }; TabManager.defaultOptions = { tabAccessKeys: true }; const tabArg = function(arg,tabMgr){ if('string'===typeof arg) arg = E(arg); else if(tabMgr && 'number'===typeof arg && arg>=0){ arg = tabMgr.e.tabs.childNodes[arg]; } return arg; }; const setVisible = function(e,yes){ D[yes ? 'removeClass' : 'addClass'](e, 'hidden'); }; TabManager.prototype = { init: function(container){ container = tabArg(container); const cID = container.getAttribute('id'); if(!cID){ throw new Error("Tab container element is missing 'id' attribute."); } const c = this.e.container = container; this.e.tabBar = D.addClass(D.div(),'tab-bar'); this.e.tabs = D.addClass(D.div(),'tabs'); D.append(c, this.e.tabBar, this.e.tabs); let selectIndex = 0; EA('[data-tab-parent='+cID+']').forEach((c,n)=>{ if(+c.dataset.tabSelect) selectIndex=n; this.addTab(c); }); return this.switchToTab(selectIndex); }, getButtonForTab: function(tab){ tab = tabArg(tab,this); var i = -1; this.e.tabs.childNodes.forEach(function(e,n){ if(e===tab) i = n; }); return i>=0 ? this.e.tabBar.childNodes[i] : undefined; }, addTab: function f(tab){ if(!f.click){ f.click = function(e){ e.target.$manager.switchToTab(e.target.$tab); }; } tab = tabArg(tab); tab.remove(); D.append(this.e.tabs, D.addClass(tab,'tab-panel')); const tabCount = this.e.tabBar.childNodes.length+1; const lbl = tab.dataset.tabLabel || 'Tab #'+tabCount; const btn = D.addClass(D.append(D.span(), lbl), 'tab-button'); D.append(this.e.tabBar,btn); btn.$manager = this; btn.$tab = tab; if(this.options.tabAccessKeys){ D.attr(btn, 'accesskey', tabCount); } btn.addEventListener('click', f.click, false); return this; }, _dispatchEvent: function(name, detail){ try{ this.e.container.dispatchEvent( new CustomEvent(name, {detail: detail}) ); }catch(e){ } return this; }, addEventListener: function(eventName, callback){ this.e.container.addEventListener(eventName, callback, false); return this; }, addCustomWidget: function(e){ this.e.container.insertBefore(e, this.e.tabs); return this; }, switchToTab: function(tab){ tab = tabArg(tab,this); const self = this; if(tab===this._currentTab) return this; else if(this._currentTab){ this._dispatchEvent('before-switch-from', this._currentTab); } delete this._currentTab; this.e.tabs.childNodes.forEach((e,ndx)=>{ const btn = this.e.tabBar.childNodes[ndx]; if(e===tab){ if(D.hasClass(e,'selected')){ return; } self._dispatchEvent('before-switch-to',tab); setVisible(e, true); this._currentTab = e; D.addClass(btn,'selected'); self._dispatchEvent('after-switch-to',tab); }else{ if(D.hasClass(e,'selected')){ return; } setVisible(e, false); D.removeClass(btn,'selected'); } }); return this; } }; F.TabManager = TabManager; })(window.fossil);