-// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-TabBox = Class.create();
-TabBox.className = {
- tabBox: 'tabBox_tabBox',
- panelContainer: 'tabBox_panelContainer',
- tabContainer: 'tabBox_tabContainer',
- tab: 'tabBox_tab',
- tabLeftInactive: 'tabBox_tabLeftInactive',
- tabLeftActive: 'tabBox_tabLeftActive',
- tabMiddleInactive: 'tabBox_tabMiddleInactive',
- tabMiddleActive: 'tabBox_tabMiddleActive',
- tabRightInactive: 'tabBox_tabRightInactive',
- tabRightActive: 'tabBox_tabRightActive',
- tabTitle: 'tabBox_tabTitle',
- closeButton: 'tabBox_closeButton'
-}
-TabBox.prototype = {
-
- initialize: function(element) {
- var options = Object.extend({
- selected: 1,
- cssPrefix: 'custom_',
- beforeSelect: function() {return true},
- afterSelect: Prototype.emptyFunction,
- onRemove: function() {return true},
- sortable: false,
- closeButton: false,
- afterSort: Prototype.emptyFunction,
- onSort: Prototype.emptyFunction,
- lazyLoadUrl: [],
- onLazyLoad: Prototype.emptyFunction,
- afterLazyLoad: Prototype.emptyFunction,
- lazyLoadFailure: Prototype.emptyFunction,
- failureLimitOver: Prototype.emptyFunction,
- failureLimit: 5,
- tabRow: null,
- titleLength: null
- }, arguments[1] || {});
-
- this.options = options;
- this.element = $(element);
- Element.setStyle(this.element, {visibility: 'hidden'});
- Element.hide(this.element);
- this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;
-
- var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TabBox.className);
- this.classNames = new CssUtil([TabBox.className, customCss]);
- this.classNames.addClassNames(this.element, 'tabBox');
-
- this.start();
- Element.setStyle(this.element, {visibility: 'visible'});
- Element.show(this.element);
-
- if (this.options.lazyLoadUrl.length > 0) this.lazyLoad(0);
- },
-
- start: function() {
- this.tabs = [];
- this.panelList = [];
-
- this.tabId = this.element.id + '_tab';
- this.tabLeftId = this.tabId + '_left';
- this.tabMiddleId = this.tabId + '_middle';
- this.tabRightId = this.tabId + '_right';
- this.tabContainerId = this.element.id + '_tabContainer';
- this.panelId = this.element.id + '_panel';
- this.panelContainerId = this.element.id + '_panelContainer';
-
- this.tabContainer = null;
- this.panelContainer = null;
- this.build();
- if (this.options.sortable) this.setDrag();
- },
-
- setDrag: function() {
- Sortable.create(this.tabContainerId, {
- tag: 'div',
- overlap: 'horizontal',
- constraint: 'horizontal',
- onChange: this.options.onSort,
- onUpdate: this.options.afterSort,
- starteffect: Prototype.emptyFunction,
- endeffect: Prototype.emptyFunction
- });
- },
-
- build: function() {
- this.buildContainers();
-
- Element.cleanWhitespace(this.element);
- var tabSets = this.element.childNodes;
-
- if (tabSets.length <= this.selected) {
- this.selected = 0;
- }
- var i = 0;
- while(tabSets.length > 0) {
- this.buildTabSet(tabSets[0], i);
- i++;
- }
- this.addContainers();
- this.selectTab();
- },
-
- buildTabSet: function(element, i) {
- if (element.nodeType != 1) {
- Element.remove(element);
- return;
- }
- Element.cleanWhitespace(element);
- var panelContents = element.childNodes[1];
- this.buildPanel(panelContents, i);
- this.buildTab(element, i);
- },
-
- buildContainers : function() {
- this.tabContainer = Builder.node('div',{id:this.tabContainerId});
- this.classNames.addClassNames(this.tabContainer, 'tabContainer');
-
- this.panelContainer = Builder.node('div', {id:this.panelContainerId});
- this.classNames.addClassNames(this.panelContainer, 'panelContainer');
- },
-
- addContainers : function() {
- this.element.appendChild(this.tabContainer);
- this.element.appendChild(this.panelContainer);
- },
-
- buildTab: function(tab, i) {
- tab.id = this.tabId + i
- this.classNames.addClassNames(tab, 'tab');
- var tabTitle = Builder.node('div', [$A(tab.childNodes)]);
- this.classNames.addClassNames(tabTitle, 'tabTitle');
- var tabLeft = Builder.node('div', {id:this.tabLeftId + i});
- var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i}, [tabTitle]);
- var tabRight = Builder.node('div',{id:this.tabRightId + i});
-
- tab.appendChild(tabLeft);
- tab.appendChild(tabMiddle);
- tab.appendChild(tabRight);
- Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));
- Event.observe(tab, 'mouseover', this.onMouseOver.bindAsEventListener(this));
- Event.observe(tab, 'mouseout', this.onMouseOut.bindAsEventListener(this));
-
- if (this.options.closeButton) {
- var button = Builder.node('div', {
- id: this.element.id.appendSuffix('closeButton_' + i)
- });
- this.classNames.addClassNames(button, 'closeButton');
- tabMiddle.appendChild(button);
- Event.observe(button, 'click', this.onRemove.bindAsEventListener(this));
- }
-
- if (this.options.tabRow && !isNaN(this.options.tabRow) && (i % this.options.tabRow == 0)) {
- Element.setStyle(tab, {clear: 'left', styleFloat: 'none'});
- }
-
- this.setTitle(tabMiddle);
- this.tabs[i] = tab;
- this.setTabInactive(tab);
- this.tabContainer.appendChild(tab);
- },
-
- setTitle: function(container) {
- var node = Element.getTextNodes(container, true)[0];
- title = node.nodeValue.replace(/^(\s)*/, '');
- title = title.replace(/(\s)*$/, '');
- var sortTitle = title;
- if (this.options.titleLength && !isNaN(this.options.titleLength)) {
- sortTitle = title.substring(0, this.options.titleLength);
- }
- node.nodeValue = sortTitle;
- container.parentNode.title = title;
- },
-
- buildPanel: function(panelContent, i) {
- var panel = Builder.node('div', {id: this.panelId + i});
- panel.appendChild(panelContent);
- Element.hide(panel);
- this.panelList[i] = panel;
- this.panelContainer.appendChild(panel);
- },
-
- selectTab: function(e){
- if (!this.options.beforeSelect()) return;
- if (!e) {
- this.setTabActive(this.tabs[this.selected]);
- Element.show(this.panelList[this.selected]);
- return;
- }
- var currentPanel = this.getCurrentPanel();
- var currentTab = this.getCurrentTab();
-
- var targetElement = null;
- if (e.nodeType) {
- targetElement = e;
- } else {
- targetElement = Event.element(e);
- }
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex == this.selected) {
- return;
- }
- var targetPanel = this.panelList[targetIndex];
- var targetTab = this.tabs[targetIndex];
-
- if (currentTab) this.setTabInactive(currentTab);
- this.setTabActive(targetTab);
-
- if (currentPanel) Element.toggle(currentPanel);
- Element.toggle(targetPanel);
-
- this.selected = targetIndex;
- this.options.afterSelect(targetPanel, currentPanel);
- },
-
- setTabActive: function(tab) {
- var tabChildren = tab.childNodes;
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');
- },
-
- setTabInactive: function(tab) {
- var tabChildren = tab.childNodes;
- this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');
- this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');
- this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');
- },
-
- getTargetIndex: function(element) {
- while(element) {
- if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {
- var index = element.id.substring(this.tabId.length);
- if (!isNaN(index)) {
- return index;
- }
- }
- element = element.parentNode;
- }
- },
-
- onRemove: function(event) {
- Event.stop(event);
- var element = Event.element(event);
- var index = this.getTargetIndex(element);
- var tab = this.tabs[index];
- if (this.options.onRemove(tab)) {
- this.remove(tab);
- }
- },
-
- remove: function(tab) {
- if (tab) {
- var index = this.getTargetIndex(tab);
- var nextActiveTab = this.getNextTab();
- if (!nextActiveTab) nextActiveTab = this.getPreviousTab();
- Element.remove(tab);
- Element.remove(this.panelList[index]);
- this.tabs[index] = null;
- this.panelList[index] = null;
-
- if (index == this.selected) {
- if (nextActiveTab) {
- this.selectTab(nextActiveTab);
- }
- }
- }
- },
-
- addByElement: function(element) {
- this.buildTabSet($(element), this.tabs.length);
- if (this.options.sortable) this.setDrag();
- },
-
- add: function(title, content) {
- var contents = [];
- var node = Builder.node('div');
- node.innerHTML = title;
- contents.push(node);
- node = Builder.node('div');
- node.innerHTML = content;
- contents.push(node);
- this.addByElement(Builder.node('div', contents));
- },
-
- lazyLoad: function(index) {
- this.errorCount = 0;
- this.loadedList = [];
- this.load(index);
- },
-
- load: function(index) {
- var container = this.panelList[index];
- var url = this.options.lazyLoadUrl[index];
- var self = this;
- if (container && url) {
- new Ajax.Updater(
- {success: container},
- url,
- {
- onSuccess: function() {
- self.setLoaded(index);
- self.options.onLazyLoad(container, self);
- self.load(++index);
- if (self.isFinishLazyLoad()) self.options.afterLazyLoad(self);
- },
- onFailure: function() {
- self.errorCount++;
- self.options.lazyLoadFailure(container, self);
- if (self.errorCount <= self.options.failureLimit) {
- self.load(index);
- } else {
- self.options.failureLimitOver(self);
- }
- },
- asynchronous: true,
- evalScripts: true
- }
- );
- }
- },
-
- isFinishLazyLoad: function() {
- return this.loadedList.length == this.panelList.length;
- },
-
- setLoaded: function(i) {
- this.loadedList.push(i);
- },
-
- onMouseOver: function(event) {
- var targetElement = Event.element(event);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex != this.selected) {
- var targetTab = this.tabs[targetIndex];
- this.setTabActive(targetTab);
- }
- },
-
- onMouseOut: function(event) {
- var targetElement = Event.element(event);
- var targetIndex = this.getTargetIndex(targetElement);
- if (targetIndex != this.selected) {
- var targetTab = this.tabs[targetIndex];
- this.setTabInactive(targetTab);
- }
- },
-
- hasNextTab: function() {
- return this.getNextTab() ? true : false;
- },
-
- hasPreviousTab: function() {
- return this.getPreviousTab() ? true : false;
- },
-
- getNextTab: function() {
- return Element.next(this.getCurrentTab());
- },
-
- getPreviousTab: function() {
- return Element.previous(this.getCurrentTab());
- },
-
- selectNextTab: function() {
- this.selectTab(this.getNextTab());
- },
-
- selectPreviousTab: function() {
- this.selectTab(this.getPreviousTab());
- },
-
- tabCount: function() {
- return this.tabs.inject(0, function(i, t) {
- return t ? ++i : i;
- })
- },
-
- getCurrentPanel: function() {
- return this.panelList[this.selected];
- },
-
- getCurrentTab: function() {
- return this.tabs[this.selected];
- }
-}
+// Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)\r
+// \r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+TabBox = Class.create();\r
+TabBox.className = {\r
+ tabBox: 'tabBox_tabBox',\r
+ panelContainer: 'tabBox_panelContainer',\r
+ tabContainer: 'tabBox_tabContainer',\r
+ tab: 'tabBox_tab',\r
+ tabLeftInactive: 'tabBox_tabLeftInactive',\r
+ tabLeftActive: 'tabBox_tabLeftActive',\r
+ tabMiddleInactive: 'tabBox_tabMiddleInactive',\r
+ tabMiddleActive: 'tabBox_tabMiddleActive',\r
+ tabRightInactive: 'tabBox_tabRightInactive',\r
+ tabRightActive: 'tabBox_tabRightActive',\r
+ tabTitle: 'tabBox_tabTitle',\r
+ closeButton: 'tabBox_closeButton'\r
+}\r
+TabBox.prototype = {\r
+ \r
+ initialize: function(element) {\r
+ var options = Object.extend({\r
+ selected: 1,\r
+ cssPrefix: 'custom_',\r
+ beforeSelect: function() {return true},\r
+ afterSelect: Prototype.emptyFunction,\r
+ onRemove: function() {return true},\r
+ sortable: false,\r
+ closeButton: false,\r
+ afterSort: Prototype.emptyFunction,\r
+ onSort: Prototype.emptyFunction,\r
+ lazyLoadUrl: [],\r
+ onLazyLoad: Prototype.emptyFunction,\r
+ afterLazyLoad: Prototype.emptyFunction,\r
+ lazyLoadFailure: Prototype.emptyFunction,\r
+ failureLimitOver: Prototype.emptyFunction,\r
+ failureLimit: 5,\r
+ tabRow: null,\r
+ titleLength: null\r
+ }, arguments[1] || {});\r
+ \r
+ this.options = options;\r
+ this.element = $(element);\r
+ Element.setStyle(this.element, {visibility: 'hidden'});\r
+ Element.hide(this.element);\r
+ this.selected = (this.options.selected > 0) ? this.options.selected - 1 : 0 ;\r
+ \r
+ var customCss = CssUtil.appendPrefix(this.options.cssPrefix, TabBox.className);\r
+ this.classNames = new CssUtil([TabBox.className, customCss]);\r
+ this.classNames.addClassNames(this.element, 'tabBox');\r
+ \r
+ this.start();\r
+ Element.setStyle(this.element, {visibility: 'visible'});\r
+ Element.show(this.element);\r
+\r
+ if (this.options.lazyLoadUrl.length > 0) this.lazyLoad(0);\r
+ },\r
+ \r
+ start: function() {\r
+ this.tabs = [];\r
+ this.panelList = [];\r
+\r
+ this.tabId = this.element.id + '_tab';\r
+ this.tabLeftId = this.tabId + '_left';\r
+ this.tabMiddleId = this.tabId + '_middle';\r
+ this.tabRightId = this.tabId + '_right';\r
+ this.tabContainerId = this.element.id + '_tabContainer';\r
+ this.panelId = this.element.id + '_panel';\r
+ this.panelContainerId = this.element.id + '_panelContainer';\r
+ \r
+ this.tabContainer = null; \r
+ this.panelContainer = null;\r
+ this.build(); \r
+ if (this.options.sortable) this.setDrag();\r
+ },\r
+\r
+ setDrag: function() {\r
+ Sortable.create(this.tabContainerId, {\r
+ tag: 'div',\r
+ overlap: 'horizontal',\r
+ constraint: 'horizontal',\r
+ onChange: this.options.onSort,\r
+ onUpdate: this.options.afterSort,\r
+ starteffect: Prototype.emptyFunction,\r
+ endeffect: Prototype.emptyFunction\r
+ });\r
+ },\r
+ \r
+ build: function() {\r
+ this.buildContainers();\r
+ \r
+ Element.cleanWhitespace(this.element);\r
+ var tabSets = this.element.childNodes;\r
+ \r
+ if (tabSets.length <= this.selected) {\r
+ this.selected = 0;\r
+ }\r
+ var i = 0;\r
+ while(tabSets.length > 0) {\r
+ this.buildTabSet(tabSets[0], i);\r
+ i++;\r
+ }\r
+ this.addContainers();\r
+ this.selectTab();\r
+ },\r
+\r
+ buildTabSet: function(element, i) {\r
+ if (element.nodeType != 1) {\r
+ Element.remove(element);\r
+ return;\r
+ }\r
+ Element.cleanWhitespace(element);\r
+ var panelContents = element.childNodes[1];\r
+ this.buildPanel(panelContents, i); \r
+ this.buildTab(element, i);\r
+ },\r
+\r
+ buildContainers : function() {\r
+ this.tabContainer = Builder.node('div',{id:this.tabContainerId});\r
+ this.classNames.addClassNames(this.tabContainer, 'tabContainer');\r
+ \r
+ this.panelContainer = Builder.node('div', {id:this.panelContainerId});\r
+ this.classNames.addClassNames(this.panelContainer, 'panelContainer'); \r
+ },\r
+ \r
+ addContainers : function() {\r
+ this.element.appendChild(this.tabContainer);\r
+ this.element.appendChild(this.panelContainer);\r
+ },\r
+\r
+ buildTab: function(tab, i) {\r
+ tab.id = this.tabId + i\r
+ this.classNames.addClassNames(tab, 'tab');\r
+ var tabTitle = Builder.node('div', [$A(tab.childNodes)]); \r
+ this.classNames.addClassNames(tabTitle, 'tabTitle');\r
+ var tabLeft = Builder.node('div', {id:this.tabLeftId + i});\r
+ var tabMiddle = Builder.node('div', {id:this.tabMiddleId + i}, [tabTitle]);\r
+ var tabRight = Builder.node('div',{id:this.tabRightId + i});\r
+ \r
+ tab.appendChild(tabLeft);\r
+ tab.appendChild(tabMiddle);\r
+ tab.appendChild(tabRight);\r
+ Event.observe(tab, 'click', this.selectTab.bindAsEventListener(this));\r
+ Event.observe(tab, 'mouseover', this.onMouseOver.bindAsEventListener(this));\r
+ Event.observe(tab, 'mouseout', this.onMouseOut.bindAsEventListener(this));\r
+\r
+ if (this.options.closeButton) {\r
+ var button = Builder.node('div', {\r
+ id: this.element.id.appendSuffix('closeButton_' + i)\r
+ });\r
+ this.classNames.addClassNames(button, 'closeButton');\r
+ tabMiddle.appendChild(button);\r
+ Event.observe(button, 'click', this.onRemove.bindAsEventListener(this));\r
+ }\r
+\r
+ if (this.options.tabRow && !isNaN(this.options.tabRow) && (i % this.options.tabRow == 0)) {\r
+ Element.setStyle(tab, {clear: 'left', styleFloat: 'none'});\r
+ }\r
+\r
+ this.setTitle(tabMiddle);\r
+ this.tabs[i] = tab;\r
+ this.setTabInactive(tab);\r
+ this.tabContainer.appendChild(tab); \r
+ },\r
+\r
+ setTitle: function(container) {\r
+ var node = Element.getTextNodes(container, true)[0];\r
+ title = node.nodeValue.replace(/^(\s)*/, '');\r
+ title = title.replace(/(\s)*$/, '');\r
+ var sortTitle = title;\r
+ if (this.options.titleLength && !isNaN(this.options.titleLength)) {\r
+ sortTitle = title.substring(0, this.options.titleLength);\r
+ }\r
+ node.nodeValue = sortTitle;\r
+ container.parentNode.title = title;\r
+ },\r
+ \r
+ buildPanel: function(panelContent, i) {\r
+ var panel = Builder.node('div', {id: this.panelId + i});\r
+ panel.appendChild(panelContent);\r
+ Element.hide(panel);\r
+ this.panelList[i] = panel;\r
+ this.panelContainer.appendChild(panel);\r
+ },\r
+ \r
+ selectTab: function(e){\r
+ if (!this.options.beforeSelect()) return;\r
+ if (!e) {\r
+ this.setTabActive(this.tabs[this.selected]);\r
+ Element.show(this.panelList[this.selected]);\r
+ return;\r
+ }\r
+ var currentPanel = this.getCurrentPanel();\r
+ var currentTab = this.getCurrentTab();\r
+ \r
+ var targetElement = null;\r
+ if (e.nodeType) {\r
+ targetElement = e; \r
+ } else {\r
+ targetElement = Event.element(e);\r
+ }\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex == this.selected) {\r
+ return;\r
+ }\r
+ var targetPanel = this.panelList[targetIndex];\r
+ var targetTab = this.tabs[targetIndex];\r
+ \r
+ if (currentTab) this.setTabInactive(currentTab);\r
+ this.setTabActive(targetTab);\r
+\r
+ if (currentPanel) Element.toggle(currentPanel);\r
+ Element.toggle(targetPanel);\r
+\r
+ this.selected = targetIndex;\r
+ this.options.afterSelect(targetPanel, currentPanel);\r
+ },\r
+ \r
+ setTabActive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftActive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleActive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightActive');\r
+ },\r
+ \r
+ setTabInactive: function(tab) {\r
+ var tabChildren = tab.childNodes;\r
+ this.classNames.refreshClassNames(tabChildren[0], 'tabLeftInactive');\r
+ this.classNames.refreshClassNames(tabChildren[1], 'tabMiddleInactive');\r
+ this.classNames.refreshClassNames(tabChildren[2], 'tabRightInactive');\r
+ },\r
+\r
+ getTargetIndex: function(element) {\r
+ while(element) {\r
+ if (element.id && element.id.indexOf(this.tabId, 0) >= 0) {\r
+ var index = element.id.substring(this.tabId.length);\r
+ if (!isNaN(index)) {\r
+ return index;\r
+ }\r
+ }\r
+ element = element.parentNode;\r
+ }\r
+ },\r
+\r
+ onRemove: function(event) {\r
+ Event.stop(event);\r
+ var element = Event.element(event);\r
+ var index = this.getTargetIndex(element);\r
+ var tab = this.tabs[index];\r
+ if (this.options.onRemove(tab)) {\r
+ this.remove(tab);\r
+ }\r
+ },\r
+\r
+ remove: function(tab) {\r
+ if (tab) {\r
+ var index = this.getTargetIndex(tab);\r
+ var nextActiveTab = this.getNextTab();\r
+ if (!nextActiveTab) nextActiveTab = this.getPreviousTab();\r
+ Element.remove(tab);\r
+ Element.remove(this.panelList[index]);\r
+ this.tabs[index] = null;\r
+ this.panelList[index] = null;\r
+ \r
+ if (index == this.selected) {\r
+ if (nextActiveTab) {\r
+ this.selectTab(nextActiveTab);\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ addByElement: function(element) {\r
+ this.buildTabSet($(element), this.tabs.length);\r
+ if (this.options.sortable) this.setDrag();\r
+ },\r
+\r
+ add: function(title, content) {\r
+ var contents = [];\r
+ var node = Builder.node('div');\r
+ node.innerHTML = title;\r
+ contents.push(node);\r
+ node = Builder.node('div');\r
+ node.innerHTML = content;\r
+ contents.push(node);\r
+ this.addByElement(Builder.node('div', contents));\r
+ },\r
+\r
+ lazyLoad: function(index) {\r
+ this.errorCount = 0;\r
+ this.loadedList = [];\r
+ this.load(index);\r
+ },\r
+\r
+ load: function(index) {\r
+ var container = this.panelList[index];\r
+ var url = this.options.lazyLoadUrl[index];\r
+ var self = this;\r
+ if (container && url) {\r
+ new Ajax.Updater(\r
+ {success: container},\r
+ url,\r
+ {\r
+ onSuccess: function() {\r
+ self.setLoaded(index);\r
+ self.options.onLazyLoad(container, self);\r
+ self.load(++index);\r
+ if (self.isFinishLazyLoad()) self.options.afterLazyLoad(self);\r
+ },\r
+ onFailure: function() {\r
+ self.errorCount++;\r
+ self.options.lazyLoadFailure(container, self);\r
+ if (self.errorCount <= self.options.failureLimit) {\r
+ self.load(index);\r
+ } else {\r
+ self.options.failureLimitOver(self);\r
+ }\r
+ },\r
+ asynchronous: true, \r
+ evalScripts: true\r
+ }\r
+ );\r
+ }\r
+ },\r
+\r
+ isFinishLazyLoad: function() {\r
+ return this.loadedList.length == this.panelList.length;\r
+ },\r
+\r
+ setLoaded: function(i) {\r
+ this.loadedList.push(i);\r
+ },\r
+\r
+ onMouseOver: function(event) {\r
+ var targetElement = Event.element(event);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex != this.selected) {\r
+ var targetTab = this.tabs[targetIndex];\r
+ this.setTabActive(targetTab);\r
+ }\r
+ },\r
+\r
+ onMouseOut: function(event) {\r
+ var targetElement = Event.element(event);\r
+ var targetIndex = this.getTargetIndex(targetElement);\r
+ if (targetIndex != this.selected) {\r
+ var targetTab = this.tabs[targetIndex];\r
+ this.setTabInactive(targetTab);\r
+ }\r
+ },\r
+\r
+ hasNextTab: function() {\r
+ return this.getNextTab() ? true : false;\r
+ },\r
+\r
+ hasPreviousTab: function() {\r
+ return this.getPreviousTab() ? true : false;\r
+ },\r
+\r
+ getNextTab: function() {\r
+ return Element.next(this.getCurrentTab());\r
+ },\r
+\r
+ getPreviousTab: function() {\r
+ return Element.previous(this.getCurrentTab());\r
+ },\r
+\r
+ selectNextTab: function() {\r
+ this.selectTab(this.getNextTab());\r
+ },\r
+\r
+ selectPreviousTab: function() {\r
+ this.selectTab(this.getPreviousTab());\r
+ },\r
+\r
+ tabCount: function() {\r
+ return this.tabs.inject(0, function(i, t) {\r
+ return t ? ++i : i;\r
+ })\r
+ },\r
+\r
+ getCurrentPanel: function() {\r
+ return this.panelList[this.selected];\r
+ },\r
+\r
+ getCurrentTab: function() {\r
+ return this.tabs[this.selected];\r
+ }\r
+}\r