/* Product Name: dhtmlxSuite Version: 4.0.3 Edition: Professional License: content of this file is covered by DHTMLX Commercial or Enterprise license. Usage without proper license is prohibited. To obtain it contact sales@dhtmlx.com Copyright UAB Dinamenta http://www.dhtmlx.com */ function dhtmlXTabBar(conf, mode) { // skin? data? // console.log("context menu for tabs?"); // console.log("first tab open event?"); var that = this; this.conf = { skin: (window.dhx4.skin||(typeof(dhtmlx)!="undefined"?dhtmlx.skin:null)||window.dhx4.skinDetect("dhxtabbar")||"dhx_skyblue"), fullScreen: false, fullScreenResize: false, // autoresize not inited lastActive: null, closeButton: false, align: "left", // tabs aligned to right side, inversed, default "right" align tabsMode: (mode=="bottom"?"bottom":"top"), // top/bottom contZone: true, transSpeed: "0.15s", baseOfs: {w:2,h:2}, // offset for base in fullscreen mode tabsOfs: 1, // dhx_skyblue and dhx_terrace have margin-left:-1px for tabs, should be included tabsTop: 0, // tabs top position, used in attachObject to hide border autoload: {} }; var base; // check if api init if (conf != null && typeof(conf) == "object" && typeof(conf.tagName) == "undefined") { base = conf.parent; if (typeof(conf.skin) != "undefined") this.conf.skin = conf.skin; if (typeof(conf.mode) != "undefined") this.conf.tabsMode = (conf.mode=="bottom"?"bottom":"top"); if (typeof(conf.align) != "undefined") this.conf.align = (conf.align=="right"?"right":"left"); if (typeof(conf.close_button) != "undefined") this.conf.closeButton = window.dhx4.s2b(conf.close_button); if (typeof(conf.content_zone) != "undefined") this.conf.contZone = window.dhx4.s2b(conf.content_zone); if (typeof(conf.xml) != "undefined") this.conf.autoload.xml = conf.xml; if (typeof(conf.json) != "undefined") this.conf.autoload.xml = conf.json; // new in 4.0 if (typeof(conf.tabs) != "undefined") this.conf.autoload.tabs = conf.tabs; if (typeof(conf.onload) != "undefined") this.conf.autoload.tabs = conf.tabs; // new in 4.0 // deprecated from 4.0 // conf { height, offset, margin, image_path, href_mode, scroll, forced, size_by_content, auto_size } } else { base = conf; } if (base == document.body) { document.documentElement.className += " dhxtabbar_fullscreen"; document.body.className += " dhxtabbar_fullscreen"; this.conf.fullScreen = true; this.base = document.createElement("DIV"); this.base.className = "dhxtabbar_base_"+this.conf.skin; this.base.style.position = "absolute"; this.base.style.left = this.conf.baseOfs.w+"px"; this.base.style.top = this.conf.baseOfs.h+"px"; document.body.appendChild(this.base); } else { this.base = (typeof(base) == "string" ? document.getElementById(base) : base); base = null; this.base.className += " dhxtabbar_base_"+this.conf.skin; } // tabsTop override if (this.base._ofs != null && this.base._ofs.t != null) this.conf.tabsTop = this.base._ofs.t; this.tabsMode = document.createElement("DIV"); this.tabsMode.className = "dhxtabbar_tabs_"+this.conf.tabsMode; this.base.appendChild(this.tabsMode); this.tabsArea = document.createElement("DIV"); this.tabsArea.className = "dhxtabbar_tabs dhxtabbar_tabs_"+this.conf.tabsMode; this.tabsArea.innerHTML = "
"+ "
"+ "
"+ "
"+ "
"+ "
"+ "
"; if (this.conf.tabsMode == "top") { this.tabsArea.style.top = this.conf.tabsTop+"px"; } this.tabsMode.appendChild(this.tabsArea); // area to move tabs this.tabsArea.childNodes[1].childNodes[0].style[this.conf.align] = "0px"; this.tabsArea.childNodes[0].onclick = function() { if (that.conf.align == "left") { that._moveTabs(1); } else { that._moveTabs(-1); } } this.tabsArea.childNodes[2].onclick = function() { if (that.conf.align == "left") { that._moveTabs(-1); } else { that._moveTabs(1); } } this._onTabsAreaClick = function(id) { return this._callMainEvent("onTabClose",[id]); } this.tabsArea.onclick = function(e) { e = e||event; var t = (e.target||e.srcElement); while (t != null) { if (typeof(t._tabCloseId) != "undefined") { if (that._onTabsAreaClick(t._tabCloseId) !== true) return; that.t[t._tabCloseId].conf.remove = true; that._hideTab(t._tabCloseId); t = null; } else if (typeof(t._tabId) != "undefined") { that._doOnClick(t._tabId); t = null; } if (t != null) { t = t.parentNode; if (t == this) t = null; } } } this.tabsArea.onselectstart = function(e) { e = e||event; if (e.preventDefault) e.preventDefault(); else e.returnValue = false; } this._doOnClick = function(id) { // onBeforeEvent here this.callEvent("onTabClick", [id, this.conf.lastActive]); if (this.t[id].conf.enabled) this._setTabActive(id); } this.t = {}; this.addTab = function(id, text, width, position, active, close) { // close = show close button, false by default // true - show_closeButton // false - do not show (ignoring enableTabCloseButton) // not set - depending on enableTabCloseButton if (typeof(close) != "boolean") close = (this.conf.closeButton==true); active = window.dhx4.s2b(active); var tab = document.createElement("DIV"); tab.className = "dhxtabbar_tab"; tab.innerHTML = "
"+text+"
"+ (close?"
":""); tab._tabId = id; if (close) tab.childNodes[1]._tabCloseId = id; // close button var p = this.tabsArea.childNodes[1].firstChild; if (position != null && position+1 > 0 && position+1 < p.childNodes.length) { // 1st item - line p.insertBefore(tab, p.childNodes[position+1]); } else { p.appendChild(tab); } // width var autowidth = false; if (typeof(width) == "undefined" || width == null || width == "*") { width = this._getLabelWidth(text, close); autowidth = true; } else { width = parseInt(width); } tab.style.width = width+"px"; var cell = new dhtmlXTabBarCell(id, this); this.tabsMode.appendChild(cell.cell); this.t[id] = { tab: tab, cell: cell, conf: { text: text, visible: true, active: false, enabled: true, close: close, width: width, autowidth: autowidth } }; p = cell = null; if (active) { this._setTabActive(id); } else { this._adjustCell(id); } } this.setSizes = function() { if (this.conf.fullScreen) { this.base.style.width = document.body.offsetWidth-this.conf.baseOfs.w*2+"px"; this.base.style.height = document.body.offsetHeight-this.conf.baseOfs.h*2+"px"; } if (this.conf.tabsAreaOfs == null) { this.tabsArea.style.width = this.base.offsetWidth+"px"; this.conf.tabsAreaOfs = parseInt(this.tabsArea.style.width)-this.tabsArea.offsetWidth; } this.tabsArea.style.width = this.base.offsetWidth+this.conf.tabsAreaOfs+"px"; this.tabsArea.childNodes[1].style.left = this.tabsArea.childNodes[0].offsetWidth-1+"px"; this.tabsArea.childNodes[1].style.width = Math.max(0, this.tabsArea.offsetWidth-this.tabsArea.childNodes[0].offsetWidth-this.tabsArea.childNodes[2].offsetWidth)+1+"px"; // minus 2 arrows this._adjustCell(this.conf.lastActive); this._adjustTabs(); } this._adjustCell = function(id) { // adjust specified cell or active if (!this.conf.contZone || id == null) return; var y = (this.conf.tabsMode=="top"?this.tabsArea.offsetHeight:0)+this.conf.tabsTop; var h = this.base.offsetHeight-this.tabsArea.offsetHeight-this.conf.tabsTop; // if layout attached - move a bit var t = this.t[id].cell.dataType; if (this.conf.skin == "dhx_skyblue" && (t == "layout" || t == "tabbar" || t == "acc")) { if (this.conf.tabsMode == "top") y = y - 1; // only for top h = h + 1; // always } if (id != this.conf.lastActive) { y = -5000; this.t[id].cell.cell.style.visibility = "hidden"; this.t[id].cell.cell.style.zIndex = 0; } this.t[id].cell._setSize(0, y, this.base.offsetWidth, h); } this.setTabsMode = function(mode) { // new this.conf.tabsMode = (mode=="bottom"?"bottom":"top"); this.tabsMode.className = "dhxtabbar_tabs_"+this.conf.tabsMode; this.setSizes(); } // generate tab css depending on actv/en state this._tabCss = function(id, hidden) { var a = this.t[id].conf.active; var d = !this.t[id].conf.enabled; var h = !this.t[id].conf.visible; return "dhxtabbar_tab"+(h?" dhxtabbar_tab_hidden":(a||d?" dhxtabbar_tab"+(a?"_actv":"")+(d?"_dis":""):"")); } // calculate tab width depending on text and close button this._getLabelWidth = function(text, close) { if (!this.tabsTextTest) { this.tabsTextTest = document.createElement("SPAN"); this.tabsTextTest.className = "dhxtabbar_tabs_text_test_"+this.conf.skin; } document.body.appendChild(this.tabsTextTest); this.tabsTextTest.innerHTML = text; var w = this.tabsTextTest.offsetWidth; // move to conf? w += (this.conf.skin == "dhx_terrace" ? 44:35); w += (close ? (this.conf.skin == "dhx_terrace" ? 14:9) : 0); // document.body.removeChild(this.tabsTextTest); return w; } // if tabs overflow left/right side, adjust active tab position this._adjustTabs = function() { var p = this.tabsArea.childNodes[1]; if (p.offsetWidth < 5) { p = null; return; } var x = parseInt(p.childNodes[0].style[this.conf.align]); var k = null; for (var q=0; q