Team:SYSU-China/temp/SpryPanelSelector.js

From 2011.igem.org

// SpryPanelSelector.js - version 0.6 - Spry Pre-Release 1.7 // // Copyright (c) 2009. 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("SpryPanelSelector.js requires SpryWidget.js!"); return; }

Spry.Widget.PanelSelector = function(elements, panel, opts) { Spry.Widget.Base.call(this);

this.buttons = Spry.$$(elements); this.panel = panel; this.disablePanelCallbacks = 0; this.currentButton = null;

// Initialize the accordion object with the global defaults.

this.setOptions(this, Spry.Widget.PanelSelector.config);

// Override the defaults with any options passed into the constructor.

this.setOptions(this, opts);

if (typeof (this.defaultButton) == "number") { if (this.defaultButton < 0) this.defaultButton = 0; else { var count = this.getButtonCount(); if (this.defaultButton >= count) this.defaultButton = (count > 1) ? (count - 1) : 0; }

} this.attachBehaviors(); };

Spry.Widget.PanelSelector.config = { event: "click", defaultButton: 0, selectionStopsSlideShow: true, useHrefs: false, selectedClass: "PanelSelectorButtonSelected", unselectedClass: "PanelSelectorButtonUnselected", downClass: "PanelSelectorButtonDown", disabledClass: "PanelSelectorButtonDisabled", hoverClass: "PanelSelectorButtonHover", focusedClass: "PanelSelectorButtonFocused" };

Spry.Widget.PanelSelector.prototype = new Spry.Widget.Base(); Spry.Widget.PanelSelector.prototype.constructor = Spry.Widget.PanelSelector;

Spry.Widget.PanelSelector.prototype.getPanelIDFromHREF = function(ele) { if (ele) { var href = ele.getAttribute("href"); if (href != undefined && href.search(/^#\w/) != -1) return href.replace(/.*#/, "#"); } return null; };

Spry.Widget.PanelSelector.prototype.getButtonCount = function() { return this.buttons.length; };


Spry.Widget.PanelSelector.prototype.getCurrentButton = function() { return this.currentButton; };

Spry.Widget.PanelSelector.prototype.getCurrentButtonIndex = function() { return this.elementToIndex(this.getCurrentButton()); };


Spry.Widget.PanelSelector.prototype.elementToIndex = function(ele) { var ea = this.buttons; var n = ea.length; for (var i = 0; i < n; i++) if (ea[i] == ele) return i; return -1; };

Spry.Widget.PanelSelector.prototype.indexToElement = function(eleOrIndex) { return (typeof eleOrIndex == "number") ? this.buttons[eleOrIndex] : eleOrIndex; };


Spry.Widget.PanelSelector.prototype.enableButton = function(eleOrIndex) { var ele = this.indexToElement(eleOrIndex); if (ele && ele.psButton) ele.psButton.enable(); };


Spry.Widget.PanelSelector.prototype.disableButton = function(eleOrIndex) { var ele = this.indexToElement(eleOrIndex); if (ele && ele.psButton) ele.psButton.disable(); };

Spry.Widget.PanelSelector.prototype.focusButton = function(eleOrIndex) { var ele = this.indexToElement(eleOrIndex); if (ele && ele.psButton) ele.psButton.focus(); };

Spry.Widget.PanelSelector.prototype.selectButton = function(eleOrIndex, suppressPanelSync) { ++this.disablePanelCallbacks;

var buttons = this.buttons; var ele = this.indexToElement(eleOrIndex);

for (var i = 0; i < buttons.length; i++) { var e = buttons[i]; this.removeClassName(e, (e == ele) ? this.unselectedClass : this.selectedClass); this.addClassName(e, (e == ele) ? this.selectedClass : this.unselectedClass); }

this.currentButton = ele;

if (!suppressPanelSync && this.panel) { var href = this.useHrefs ? this.getPanelIDFromHREF(ele) : null; this.panel.showPanel(href ? href : this.elementToIndex(ele)); }

--this.disablePanelCallbacks; };

Spry.Widget.PanelSelector.prototype.selectPreviousButton = function() { var evt = new Spry.Widget.Event(this); this.notifyObservers("onPrePanelSelectorSelectPreviousButton", evt); if (!evt.performDefaultAction) return;

var curIndex = this.getCurrentButtonIndex(); this.handleActivate(((curIndex < 1) ? this.getButtonCount() : curIndex) - 1);

this.notifyObservers("onPostPanelSelectorSelectPreviousButton", evt); };

Spry.Widget.PanelSelector.prototype.selectNextButton = function() { var evt = new Spry.Widget.Event(this); this.notifyObservers("onPrePanelSelectorSelectNextButton", evt); if (!evt.performDefaultAction) return;

this.handleActivate((this.getCurrentButtonIndex()+1) % this.getButtonCount());

this.notifyObservers("onPostPanelSelectorSelectNextButton", evt); };

Spry.Widget.PanelSelector.prototype.selectFirstButton = function() { var evt = new Spry.Widget.Event(this); this.notifyObservers("onPrePanelSelectorSelectFirstButton", evt); if (!evt.performDefaultAction) return;

this.handleActivate(0);

this.notifyObservers("onPostPanelSelectorSelectFirstButton", evt); };

Spry.Widget.PanelSelector.prototype.selectLastButton = function() { var evt = new Spry.Widget.Event(this); this.notifyObservers("onPrePanelSelectorSelectLastButton", evt); if (!evt.performDefaultAction) return;

var count = this.getButtonCount(); this.handleActivate(count > 0 ? count - 1 : 0);

this.notifyObservers("onPostPanelSelectorSelectLastButton", evt); };

Spry.Widget.PanelSelector.prototype.handleActivate = function(ele) { if (typeof ele == "string") ele = document.getElementById(ele);

var evt = new Spry.Widget.Event(this, { target: ele, targetIndex: this.elementToIndex(ele) }); this.notifyObservers("onPrePanelSelectorClick", evt); if (!evt.performDefaultAction) return;

if (this.selectionStopsSlideShow && this.panel) this.panel.stop();

this.selectButton(ele);

this.notifyObservers("onPostPanelSelectorClick", evt); };

Spry.Widget.PanelSelector.prototype.handlePanelChange = function(data) { if (this.disablePanelCallbacks) return;

var panelEle = data.target; var panelIndex = data.targetIndex;

if (!this.panel) return;

var panelID = panelEle.id; var btns = this.buttons; var btn = btns[panelIndex];

if (panelID) { // Search for the button to activate based on // the panel's id.

for (var i = 0; !btn && i < btns.length; i++) { var b = btns[i]; var id = this.getPanelIDFromHREF(b); if (id == panelID) { btn = b; break; } } }

if (btn) this.selectButton(btn, true); };

Spry.Widget.PanelSelector.prototype.attachButtonBehaviors = function(ele) { var self = this;

var activateFunc = function(e) { self.handleActivate(ele); return false; };

ele.psButton = new Spry.Widget.Button(ele, { onclick: activateFunc, downClass: this.downClass, hoverClass: this.hoverClass, disabledClass: this.disabledClass, focusedClass: this.focusedClass });

if (this.event != "click") this.addEventListener(ele, this.event, activateFunc, false); };

Spry.Widget.PanelSelector.prototype.attachBehaviors = function() { var self = this; var buttons = this.buttons;

for (var i = 0; i < buttons.length; i++) this.attachButtonBehaviors(buttons[i]);

if (this.panel) this.panel.addObserver({ onPostShowPanel: function(n, data){ self.handlePanelChange(data); }});

this.selectButton(this.defaultButton); };

})(); // EndSpryComponent