Team:SYSU-China/temp/SpryTabbedPanels2.js
From 2011.igem.org
// SpryTabbedPanels2.js - version 0.9 - Spry Pre-Release 1.7 // // Copyright (c) 2010. Adobe Systems Incorporated. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Adobe Systems Incorporated nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE.
(function() { // BeginSpryComponent
if (typeof Spry == "undefined" || !Spry.Widget || !Spry.Widget.Base) { alert("SpryTabbedPanels2.js requires SpryWidget.js!"); return; }
if (!Spry.Widget) Spry.Widget = {};
var defaultConfig = { defaultTab: 0, // Show the first panel by default. event: "click", // DOM Event name to trigger the panel change; click or mouseover. hideHeader: true, // Hide the header elements used to create the tabs. tabsPosition: "top", // One of "top", "bottom", "left", "right".
// Slide show features. autoPlay: false, // Start the slide show immediately after the widget is created. displayInterval: 5000, // Interval (msecs) between display of each panel. stopOnUserAction: true, // If the user clicks on a tab, stop the slide show.
injectionType: "replace", // "inside" or "replace"
tabSelector: "h1,h2,h3,h4,h5,h6", contentDelimiterSelector: null, // When null, the tabSelector is used to find the delimiter.
widgetClass: "TabbedPanels", tabClass: "TabbedPanelsTab", // Class name used for the tab elements. contentClass: "TabbedPanelsContent", // Class name used for the content panel elements.
// These strings are used as class names placed on every element used // within the widget markup. tabHoverClass: "TabbedPanelsTabHover", tabSelectedClass: "TabbedPanelsTabSelected", tabFocusedClass: "TabbedPanelsTabFocused", panelVisibleClass: "TabbedPanelsContentVisible",
groupClassStr: "Group", firstClassStr: "First", lastClassStr: "Last",
plugIns: [], sliceMap: {},
// After the widget markup is generated and inserted into the document, you // can have the widget automatically remove and/or add any class name to the // top-level element that contains the tab and content group element. classToRemove: "", classToAdd: "",
enableKeyboardNavigation: true };
Spry.Widget.TabbedPanels2 = function(element, opts) { this.element = this.getElement(element);
// This is the top-level element of the tabbed panel that is injected at // runtime.
this.widgetRoot = null;
this.tgObj = null; this.cgObj = null;
// Initialize to global configuration defaults.
this.setOptions(this, Spry.Widget.TabbedPanels2.config);
// Pick up the configuration overrides.
this.setOptions(this, opts);
if (this.tabsPosition == "bottom" || this.tabsPosition == "right") { this.tabsAfterContent = true; } else { this.tabsAfterContent = false; }
// Initialize any plugins.
this.initializePlugIns(Spry.Widget.TabbedPanels2.config.plugIns, opts);
var evt = new Spry.Widget.Event(this); this.notifyObservers("onPreInitialize", evt); if (!evt.performDefaultAction) return;
this.transformMarkup(); this.attachBehaviors();
this.notifyObservers("onPostInitialize", evt); };
Spry.Widget.TabbedPanels2.config = defaultConfig;
Spry.Widget.TabbedPanels2.prototype = new Spry.Widget.Base(); Spry.Widget.TabbedPanels2.prototype.constructor = Spry.Widget.TabbedPanels2;
Spry.Widget.TabbedPanels2.prototype.transformMarkup = function() { var evt = new Spry.Widget.Event(this); this.notifyObservers("onPreTransformMarkup", evt); if (!evt.performDefaultAction) return;
// Find the elements, within the initial markup, that will serve as the // content for the tab buttons.
var tabContent = Spry.$$(this.tabSelector, this.element);
// Find the elements, within the initial markup, that will serve as the // delimiter between content. This is usually the element that contains // the content for the tabbed buttons.
var delimSelector = this.contentDelimiterSelector; if (!delimSelector) delimSelector = this.tabSelector;
var delimiters = Spry.$$(delimSelector, this.element);
if (tabContent.length != delimiters.length) alert("SpryTabbedPanels2.js - WARNING: Mismatch between tab elements and content delimiters!"); if (tabContent.length == 0) { alert("SpryTabbedPanels2.js - ERROR: Failed to find tab markup."); return; }
// Create the widget element, and slice it. var root = this.createOptionalSlicedStructure(null, "div", this.widgetClass);
if (this.widgetID) root.id = this.widgetID;
// Create the tab group element, and slice it.
this.tgObj = this.createOptionalSlicedStructure(null ,"div", this.tabClass + this.groupClassStr); // For each tab content element, create a tab markup structure and add it // to the content container of the tab group.
var numTabs = tabContent.length; var lastTabIndex = numTabs - 1;
for (var i = 0; i < numTabs; i++) { var t = this.createOptionalSlicedStructure(null, "div", this.tabClass); var txt = this.getElementText(tabContent[i]); var linkEle = document.createElement("a"); linkEle.href = "#"; linkEle.appendChild(document.createTextNode(txt)); t.contentContainer.appendChild(linkEle);
// If this the first or last tab, add our special class name to it. if (i == 0) this.addClassName(t, this.tabClass + this.firstClassStr); if (i == lastTabIndex) this.addClassName(t, this.tabClass + this.lastClassStr);
this.tgObj.contentContainer.appendChild(t);
if (tabContent[i].id) { t.id = tabContent[i].id; tabContent[i].removeAttribute("id"); } var ti = parseInt(tabContent[i].getAttribute("tabIndex")); if (!isNaN(ti)) { t.tabIndex = tabContent[i].tabIndex; tabContent[i].removeAttribute("tabindex"); }
// Hide the initial tab content if necessary.
if (this.hideHeader) tabContent[i].style.display = "none"; }
// Create a content group element and fill it with the optional slice element structure.
this.cgObj = this.createOptionalSlicedStructure(null, "div", this.contentClass + this.groupClassStr);
// The content for each panel follows the delimiter element. For each tab content element, // grab the nodes that follow it, up until the next tab content element, and stick it // into a tabbed panel content structure.
for (var i = 0; i < delimiters.length; i++) { // Create a content panel and fill it with the 9-slice structure, then // add it to the content group.
var c = this.createOptionalSlicedStructure(null, "div", this.contentClass); this.cgObj.contentContainer.appendChild(c);
// Grab all of the content that follows the tab content element and stick // it into the content structure we just created.
var d = delimiters[i]; var nd = delimiters[i+1];
while (d && d != nd) { var ns = d.nextSibling; c.contentContainer.appendChild(d); d = ns; }
// Hide the delimiter content if necessary.
if (this.hideHeader) delimiters[i].style.display = "none"; }
while (this.element.firstChild) this.element.removeChild(this.element.firstChild);
// Insert the tab and content groups into the document. if (this.tabsAfterContent) { root.contentContainer.appendChild(this.cgObj); root.contentContainer.appendChild(this.tgObj); } else { root.contentContainer.appendChild(this.tgObj); root.contentContainer.appendChild(this.cgObj); }
// Insert our newly constructed widget structure into the document.
if (this.injectionType == "replace") { var parent = this.element.parentNode; parent.replaceChild(root, this.element); this.element = root; } else // "inside" { this.element.innerHTML = ""; this.element.appendChild(root); }
this.widgetRoot = root;
if (this.tabsPosition == "bottom") { this.addClassName(this.widgetRoot, "BTabbedPanels"); } if (this.tabsPosition == "left" || this.tabsPosition == "right") { this.removeClassName(this.widgetRoot, "TabbedPanels"); this.addClassName(this.widgetRoot, "VTabbedPanels"); }
if (this.classToRemove) this.removeClassName(this.widgetRoot, this.classToRemove);
if (this.classToAdd) this.addClassName(this.widgetRoot, this.classToAdd);
this.notifyObservers("onPostTransformMarkup", evt);
};
Spry.Widget.TabbedPanels2.prototype.getElementText = function(ele) { var ta = []; var c = ele.firstChild; while (c) { if (c.nodeType == 3 || c.nodeType == 4) // Node.TEXT_NODE || Node.CDATA_NODE ta.push(c.data); else if (c.firstChild) { var str = this.getElementText(c); if (str) ta.push(str); } c = c.nextSibling; } return ta.join(""); };
Spry.Widget.TabbedPanels2.prototype.getTabs = function() { var tabs = []; if (this.element && this.tgObj && this.tgObj.contentContainer) tabs = this.getElementChildren(this.tgObj.contentContainer); return tabs; };
Spry.Widget.TabbedPanels2.prototype.getContentPanels = function() { var panels = []; if (this.element && this.cgObj && this.cgObj.contentContainer) panels = this.getElementChildren(this.cgObj.contentContainer); return panels; };
Spry.Widget.TabbedPanels2.prototype.getTabbedPanelCount = function(ele) { return Math.min(this.panelSelector.getButtonCount(), this.panelSet.getPanelCount()); };
Spry.Widget.TabbedPanels2.prototype.getTabIndex = function(ele) { return this.panelSelector.elementToIndex(ele); };
Spry.Widget.TabbedPanels2.prototype.getCurrentTabIndex = function() { return this.panelSelector.getCurrentButtonIndex(); };
Spry.Widget.TabbedPanels2.prototype.showPanel = function(idxOrId) { this.panelSelector.handleActivate(idxOrId); };
Spry.Widget.TabbedPanels2.prototype.showPreviousPanel = function() { this.panelSelector.selectPreviousButton(); };
Spry.Widget.TabbedPanels2.prototype.showNextPanel = function() { this.panelSelector.selectNextButton(); };
Spry.Widget.TabbedPanels2.prototype.showFirstPanel = function() { this.panelSelector.selectFirstButton(); };
Spry.Widget.TabbedPanels2.prototype.showLastPanel = function() { this.panelSelector.selectLastButton(); };
Spry.Widget.TabbedPanels2.prototype.markOpenPanel = function(panel) { var panels = this.panelSet.getPanels();
for (var i = 0; i < panels.length; i++) { var p = panels[i]; if (panel == p) { this.addClassName(p, this.panelVisibleClass); p.style.display = "block"; } else { this.removeClassName(p, this.panelVisibleClass); p.style.display = "none"; } } };
Spry.Widget.TabbedPanels2.prototype.attachBehaviors = function() { var evt = new Spry.Widget.Event(this); this.notifyObservers("onPreAttachBehaviors", evt); if (!evt.performDefaultAction) return;
this.attachViewBehaviors(); this.attachTabBehaviors();
this.notifyObservers("onPostAttachBehaviors", evt); };
Spry.Widget.TabbedPanels2.prototype.attachViewBehaviors = function()
{
var evt = new Spry.Widget.Event(this);
this.notifyObservers("onPreAttachViewBehaviors", evt);
if (!evt.performDefaultAction)
return;
var panels = this.getContentPanels(); this.panelSet = new Spry.Widget.PanelSet(panels, { defaultPanel:this.defaultTab, autoPlay:this.autoPlay, displayInterval: this.displayInterval, visibleClass: this.panelVisibleClass });
var self = this;
this.panelSet.addObserver({ onPostShowPanel: function(n,d){ self.markOpenPanel(d.target); } });
var p = this.panelSet.getCurrentPanel(); if (p) { this.markOpenPanel(p); }
this.notifyObservers("onPostAttachViewBehaviors", evt); };
Spry.Widget.TabbedPanels2.prototype.attachTabBehaviors = function() { var evt = new Spry.Widget.Event(this); this.notifyObservers("onPreAttachTabBehaviors", evt); if (!evt.performDefaultAction) return;
var tabs = this.getTabs();
this.panelSelector = new Spry.Widget.PanelSelector(tabs, this.panelSet, { event: this.event, selectionStopsSlideShow:this.stopOnUserAction, defaultButton:this.defaultTab, selectedClass: this.tabSelectedClass, focusedClass: this.tabFocusedClass, hoverClass: this.tabHoverClass });
this.notifyObservers("onPostAttachTabBehaviors", evt); };
})(); // EndSpryComponent