// SpryFadingPanels.js - version 0.5 - 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.PanelSet)

{

	alert("SpryFadingPanels.js requires SpryPanelSet.js!");

	return;

}



Spry.Widget.FadingPanels = function(elements, opts)

{

	// Override any of the global defaults with options passed into

	// the constructor.



	var mergedOpts = this.setOptions(this.setOptions({}, Spry.Widget.FadingPanels.config), opts);



	Spry.Widget.PanelSet.call(this, Spry.$$(elements), mergedOpts);

};



Spry.Widget.FadingPanels.prototype = new Spry.Widget.PanelSet();

Spry.Widget.FadingPanels.prototype.constructor = Spry.Widget.FadingPanels;



Spry.Widget.FadingPanels.config = {

	defaultPanel:    0,

	minOpacity:      0,

	maxOpacity:      1,

	minDuration:     500, // msecs

	maxDuration:     500, // msecs

	stoppedMinDuration:     200, // msecs

	stoppedMaxDuration:     200, // msecs



	visibleClass:    "FadingPanelVisible",

	hiddenClass:     "FadingPanelHidden",



	autoPlay:       false,

	displayInterval: 4000, // msecs

	parallelTransition:true

};



Spry.Widget.FadingPanels.prototype.initialize = function()

{

	var evt = new Spry.Widget.Event(this);

	this.notifyObservers("onPreInitialize", evt);

	if (!evt.performDefaultAction)

		return;



	this.disableNotifications();



	Spry.Widget.PanelSet.prototype.initialize.call(this);



	var panels = this.getPanels();

	var cpanel = this.currentPanel;



	for (var i = 0; i < panels.length; i++)

	{

		var p = panels[i];

		this.setOpacity(p, (p == cpanel) ? this.maxOpacity : this.minOpacity);

	}



	this.enableNotifications();



	this.notifyObservers("onPostInitialize", evt);

};



Spry.Widget.FadingPanels.prototype.showPanel = function(eleOrIndex)

{

	var ele = this.indexToElement(eleOrIndex);

	if (ele && ele != this.currentPanel)

	{

		var evt = this.createEvent(ele, { currentPanel: this.currentPanel });

		this.notifyObservers("onPreShowPanel", evt);

		if (!evt.performDefaultAction)

			return;



		if (this.showEffect && !this.parallelTransition) {

			this.showEffect.stop();

		}



		if (this.hideEffect && !this.parallelTransition) {

			this.hideEffect.stop();

		}



		var currentPanel = this.currentPanel;

		this.currentPanel = ele;



		var self = this;

		var showPanelComplete = function() {

			self.currentPanel = ele;

			self.addClassName(ele, self.visibleClass);

			self.removeClassName(ele, self.hiddenClass);



			self.notifyObservers("onPreShowPanelEffect", evt);

			self.showEffect = new Spry.Effect.CSSAnimator(ele, "opacity: " + self.maxOpacity, { duration: self.isPlaying()?self.maxDuration:self.stoppedMaxDuration });

			self.showEffect.addObserver({

				onAnimationComplete: function() {

					self.showEffect = null;

					self.notifyObservers("onPostShowPanelEffect", evt);

				}

			});

			self.showEffect.start();



			self.notifyObservers("onPostShowPanel", evt);

		};



		if (currentPanel)

			this.hidePanel(currentPanel, showPanelComplete);

		else

			showPanelComplete();



	}

};



Spry.Widget.FadingPanels.prototype.hidePanel = function(eleOrIndex, callback)

{

	var ele = this.indexToElement(eleOrIndex);

	if (ele) {

		var evt = this.createEvent(ele);

		this.notifyObservers("onPreHidePanel", evt);

		if (!evt.performDefaultAction)

			return;



		this.currentPanel = null;



		var self = this;

		var hidePanelComplete = function() {

			self.addClassName(ele, self.hiddenClass);

			self.removeClassName(ele, self.visibleClass);

			self.notifyObservers("onPostHidePanel", evt);



			if(callback) {

				callback();

			}

		};



		this.notifyObservers("onPreHidePanelEffect", evt);

		this.hideEffect = new Spry.Effect.CSSAnimator(ele, "opacity: " + this.minOpacity, { duration: this.isPlaying()?this.minDuration:this.stoppedMinDuration });

		this.hideEffect.addObserver({

			onAnimationComplete: function() {

				self.hideEffect = null;

				self.notifyObservers("onPostHidePanelEffect", evt);

				if (!self.parallelTransition) {

					hidePanelComplete();

				}

			}

		})

		this.hideEffect.start();



		if (this.parallelTransition) {

			hidePanelComplete();

		}

	}

};



})(); // EndSpryComponent
