OSDN Git Service

setup spinelz environment
[cloudmanganw/git_repo.git] / war / WEB-INF / classes / jp / sourceforge / manganetwork / page / javascripts / spinelz / tabBox.js
index c512ace..ed84069 100644 (file)
-// 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