var TabElement = Class.create({ initialize: function(params) { this.ID_=params.id; this.TabBar=params.tabbar; this.root = $(params.id); this.menuitem = $(params.id + '_tabitem'); this.root.JSControl=this; this.label = this.root.readAttribute('label'); this.width = this.root.offsetWidth; if(Prototype.Browser.IE) { this.root.observe('keydown', this.OnKeyDown.bind(this)); } else { this.root.observe('keypress', this.OnKeyDown.bind(this)); } this.root.observe('click', this.OnClick.bind(this)); this.root.observe('focus', this.Focus.bind(this, true)); this.root.observe('blur', this.Focus.bind(this, false)); AControl.AddDefaultHandler('CLICK', this.ID_); this.Visible = true; }, Show: function(show) { this.Visible = show; if (show) { this.root.show(); this.menuitem.hide(); } else { this.root.hide(); this.menuitem.show(); } }, SetLast: function(last) { if (last) this.root.addClassName("LastTab"); else this.root.removeClassName("LastTab"); }, Width: function() { return this.width; }, OnClick: function() { this.TabBar.Highlight(this); new AEvent('CLICK', {}, this.ID_); }, Focus: function(focused, evt) { if (focused) this.root.addClassName('TabBarFocus'); else this.root.removeClassName('TabBarFocus'); }, Highlight: function(selected) { if (selected) { this.root.addClassName('TabBarActive'); this.menuitem.addClassName('TabMenuActive'); } else { this.root.removeClassName('TabBarActive'); this.menuitem.removeClassName('TabMenuActive'); } }, OnKeyDown: function(evt) { var key=$(evt).which || evt.keyCode; switch(key) { case 32: // space case 13: // enter this.OnClick(); break; } }, SetTabOrder: function(nTabBase) { this.root.writeAttribute('tabindex', nTabBase); return ++nTabBase; }, ID: function() { return this.ID_; } }); var TabBar = Class.create({ initialize: function(params) { this.id=params.id; this.htmlid=params.htmlid; this.winID=params.winID; this.visible = true; this.tabs = []; this.path = []; GWindowManager.GetWindow( this.winID ) .RegisterResizeableChild(this.htmlid + "_tabbar"); this.popup = new PopupMenu({htmlid: this.htmlid + "_tabmenu"}); this.tabcontainer = $(this.htmlid + "_tabbar"); this.morebutton = $(this.htmlid + "_tabmore"); this.tabcontainer.JSControl = this; if (this.morebutton) { this.morebutton.observe('click', this.OnMoreClick.bind(this)); this.morewidth = this.morebutton.offsetWidth; } new AEvent('WM_TABBAR', { winID: this.winID } , this.htmlid); SubscribeOnEvent("WM_TABBAR", this.winID, this.Tabbar, this); SubscribeOnEvent("WM_RESTORE", this.winID, this.Restore, this); SubscribeOnEvent("WM_PUSH", this.winID, this.MainClicked, this); SubscribeOnEvent("WM_BACK", this.winID, this.Back, this); }, OnMoreClick: function() { var b = this.morebutton; b.addClassName('TabMoreActive'); this.popup.Show( function(tab) { b.removeClassName('TabMoreActive'); if (tab) tab.OnClick(); }); }, OnResize: function() { this.UpdateWidth(); }, UpdateWidth: function(evt) { if (!this.tabs.length || !this.morebutton) return; for (var i = 0; i < this.tabs.length; ++i) { this.tabs[i].Show(false); } var w = 0; var availW = this.tabcontainer.offsetWidth; var i = 0; for (; i < this.tabs.length; ++i) { w += this.tabs[i].Width(); if (w + this.morewidth > availW) break; else { this.tabs[i].SetLast(false); this.tabs[i].Show(true); } } if (i > 0) this.tabs[i - 1].SetLast(true); if (i == this.tabs.length) this.morebutton.hide(); else this.morebutton.show(); for (; i < this.tabs.length; ++i) { this.tabs[i].Show(false); } }, Tabbar: function(evt) { if (this.visible) { evt.Data().oldWinID = this.winID; this.visible = false; } }, Restore: function(evt) { this.visible = true; this.tabs[this.selected].OnClick(); this.path.length=0; evt.Stop(); }, Built: function() { var selected = 0; for (var i = 0; i < this.tabs.length; ++i) { var a = $( this.tabs[i].ID() ).readAttribute('selected'); if (a == 'true' || a == 'yes') { selected = i; break; } } if (this.tabs.length > 0) this.tabs[selected].OnClick(); this.UpdateWidth(); }, AddTab: function(id) { var tab = new TabElement({'id': id, 'tabbar': this}); this.tabs.push(tab); if (this.morebutton) this.popup.AddItem(id + '_tabitem', tab); }, Back: function(evt) { if (!this.visible) return; var data=evt.Data(); var step=parseInt(data.step); if(this.path.length-step<0) return; var index=this.path.length-step; var winHnd=this.path[index]; var newParams=winHnd.params; if(data.refresh=='yes') { var vp=URLRestoreVS(winHnd.params); for(var p in vp) { data.args[p]=vp[p]; } newParams=URLSerializeVS(data.args); } // TODO: rename 'refresh' to something more understandable if(data.refresh=='override') { var vp=URLRestoreVS(winHnd.params); for(var p in data.args) { vp[p]=data.args[p]; } newParams=URLSerializeVS(vp); } var win=GWindowManager.RefreshWindow({ sURL: winHnd.src, sParent: winHnd.parent, sControlID: winHnd.htmlid, sParams: newParams, sInstanceID: winHnd.instanceID }); // TODO: kosherize access to internal AWindow variables if (data.refresh=='yes' && win) win.sParams_=winHnd.params; this.path.length=index; if (GPopupContainer) GPopupContainer.RemoveAllPopups() evt.Stop(); }, MainClicked: function(evt) { if (!this.visible) return; var data=evt.Data(); var sArgs=""; if(data.args) sArgs=URLSerializeVS(data.args); if(data.target!='tabbar') { var bCheckChanges=true; // default behaviour if(evt.Name()=="WM_PUSH") bCheckChanges=false; if(data['track-changes']) { if(data['track-changes']=='no' || data['track-changes']=='false') bCheckChanges=false; else bCheckChanges=true; } // remember an old window var win=$(this.htmlid+"_WorkSpace").select('DIV')[0].JSControl; GWindowManager.CreateWindow({ sURL: data.src, sParent: this.winID, sControlID: this.htmlid+"_WorkSpace", 'bCheckChanges': bCheckChanges, sParams: sArgs}); // looks very bad (uses AWindow internals, esp. sControlID_. TODO: kosherize this.path.push({src: win.XMLSource(), parent: win.Parent(), htmlid: win.sControlID_, params: win.sParams_, instanceID: win.InstanceID()}); if (GPopupContainer) GPopupContainer.RemoveAllPopups(); evt.Stop(); } else { evt.Data()['CurrentWindow']=this.root; } }, Highlight: function(tab) { for (var i = 0; i < this.tabs.length; ++i) { var sel = (this.tabs[i] == tab); this.tabs[i].Highlight(sel); if (sel) this.selected = i; } this.activeTabHidden = !tab.Visible; if (!this.morebutton) return; if (this.activeTabHidden) this.morebutton.addClassName('TabMoreActive'); else this.morebutton.removeClassName('TabMoreActive'); }, SetTabOrder: function(nTabBase) { for(var i = 0; i < this.tabs.length; ++i) { this.tabs[i].SetTabOrder(nTabBase + i); } return nTabBase + this.tabs.length; }, ID: function() { return this.ID_; } });