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