// SpryFilmStrip.js - version 0.3 - Spry Pre-Release 1.6.1

//

// Copyright (c) 2008. 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.Button)

{

	alert("SpryFilmStrip.js requires SpryButton.js!");

	return;

}



var defaultConfig = {

	plugIns:                  [],

	defaultPanel:             0,

	pageIncrement:            1,

	wraparound:               true,

	injectionType:            "inside",  // "inside" or "replace"

	extractionType:           "element", // "element" or "content"

	repeatingElementSelector: null,



	widgetID:                 null,

	widgetClass:              "FilmStrip",                        // Sliceable

	currentPanelClass:        "FilmStripCurrentPanel",

	focusedClass:             "FilmStripFocused",

	animatingClass:           "FilmStripAnimating",

	previousBtnClass:         "FilmStripPreviousButton",          // Sliceable

	previousBtnHoverClass:    "FilmStripPreviousButtonHover",

	previousBtnDownClass:     "FilmStripPreviousButtonDown",

	previousBtnDisabledClass: "FilmStripPreviousButtonDisabled",

	nextBtnClass:             "FilmStripNextButton",              // Sliceable

	nextBtnHoverClass:        "FilmStripNextButtonHover",

	nextBtnDownClass:         "FilmStripNextButtonDown",

	nextBtnDisabledClass:     "FilmStripNextButtonDisabled",

	trackClass:               "FilmStripTrack",

	containerClass:           "FilmStripContainer",

	panelClass:               "FilmStripPanel",                   // Sliceable



	sliceMap:                 {},

	componentOrder: [ "previous", "next", "track" ]

};



Spry.Widget.FilmStrip = function(ele, opts)

{

	Spry.Widget.Base.call(this);



	this.element = Spry.$$(ele)[0];

	this.sliderPanel = null;



	// Apply the default settings.



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



	// Override the defaults with user specified settings.



	this.setOptions(this, opts);



	this.initializePlugIns(Spry.Widget.FilmStrip.config.plugIns, opts);



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

	this.notifyObservers("onPreInitialize", evt);

	if (!evt.performDefaultAction)

		return;



	this.transformMarkup();



	this.trackEle = Spry.$$("." + this.trackClass, this.element)[0];

	this.panelEle = this.getElementChildren(this.trackEle)[0];



	this.attachBehaviors();



	this.notifyObservers("onPostInitialize", evt);

};





Spry.Widget.FilmStrip.prototype = new Spry.Widget.Base();

Spry.Widget.FilmStrip.prototype.constructor = Spry.Widget.FilmStrip;



Spry.Widget.FilmStrip.config = defaultConfig;



Spry.Widget.FilmStrip.prototype.transformMarkup = function()

{

	var elements = [];



	if (!this.repeatingElementSelector)

		elements = this.getElementChildren(this.element);

	else

		elements = Spry.$$(this.repeatingElementSelector, this.element);



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

	this.notifyObservers("onPreTransformMarkup", evt);

	if (!evt.performDefaultAction)

		return;



	// Create the top-level widget element. 



	var root = this.createOptionalSlicedStructure(null, "div", this.widgetClass);

	if (this.widgetID)

		root.id = this.widgetID;



	// Create the previous button.



	var prev = this.createOptionalSlicedStructure(null, "a", this.previousBtnClass);

	prev.href = "#";



	// Create the next button.



	var next = this.createOptionalSlicedStructure(null, "a", this.nextBtnClass);

	next.href = "#";



	// Create the panel track and container.



	var track = this.createElement("div", this.trackClass, null);

	var container = this.createElement("div", this.containerClass, track);



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

	{

		var itemName = this.componentOrder[i];

		switch (itemName)

		{

			case "track":

				root.appendChild(track);

				break;

			case "previous":

				root.appendChild(prev);

				break;

			case "next":

				root.appendChild(next);

				break;

		}

	}



	var extractElement = (this.extractionType == "element");



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

	{

		var e = elements[i];



		var p = this.createOptionalSlicedStructure(null, "div", this.panelClass);

		var c = p.contentContainer;



		container.appendChild(p);



		if (extractElement)

			c.appendChild(e);

		else

			this.appendChildNodes(c, this.extractChildNodes(e));

	}



	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.notifyObservers("onPostTransformMarkup", evt);

};



Spry.Widget.FilmStrip.prototype.attachBehaviors = function()

{

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

	this.notifyObservers("onPreAttachBehaviors", evt);

	if (!evt.performDefaultAction)

		return;



	var prevBtnEle = Spry.$$("." + this.previousBtnClass, this.element)[0];

	var nextBtnEle = Spry.$$("." + this.nextBtnClass, this.element)[0];



	var self = this;



	if (prevBtnEle)

		this.previousBtn = new Spry.Widget.Button(prevBtnEle, {

				downClass: this.previousBtnDownClass,

				hoverClass: this.previousBtnHoverClass,

				disabledClass: this.previousBtnDisabledClass,

				onclick: function(e){ self.previous(); }});



	if (nextBtnEle)

		this.nextBtn = new Spry.Widget.Button(nextBtnEle, {

				downClass: this.nextBtnDownClass,

				hoverClass: this.nextBtnHoverClass,

				disabledClass: this.nextBtnDisabledClass,

				onclick: function(e){ self.next(); }});



	if (this.trackEle)

		this.sliderPanel = new Spry.Widget.SliderPanels(this.trackEle, {

				defaultPanel: this.defaultPanel,

				pageIncrement: this.pageIncrement,

				currentPanelClass: this.currentPanelClass,

				focusedClass: this.focusedClass,

				animatingClass: this.animatingClass

		});



	this.notifyObservers("onPostAttachBehaviors", evt);

};



Spry.Widget.FilmStrip.prototype.syncScrollButtons = function()

{

	if (this.wraparound)

	{

		this.previousBtn.enable();

		this.nextBtn.enable();

		return;

	}



	var sp = this.sliderPanel;

	var curPage = sp.getCurrentPageIndex();

	var numPages = sp.getPageCount();



	if (curPage == 0)

		this.previousBtn.disable();

	else

		this.previousBtn.enable();



	if ((curPage + 1) >= numPages)

		this.nextBtn.disable();

	else

		this.nextBtn.enable();

};



Spry.Widget.FilmStrip.prototype.getCurrentPanel = function()

{

	return this.sliderPanel ? this.sliderPanel.getCurrentPanel() : null;

};



Spry.Widget.FilmStrip.prototype.getCurrentPanelIndex = function()

{

	return this.sliderPanel ? this.sliderPanel.getCurrentPanelIndex() : -1;

};



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

{

	var evt = new Spry.Widget.Event(this, { target: eleOrIndex });

	this.notifyObservers("onPreShowPanel", evt);

	if (!evt.performDefaultAction)

		return;



	if (this.sliderPanel)

		this.sliderPanel.showPanel(eleOrIndex);



	this.notifyObservers("onPostShowPanel", evt);

};



Spry.Widget.FilmStrip.prototype.previous = function(e)

{

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

	this.notifyObservers("onPrePreviousPage", evt);

	if (!evt.performDefaultAction)

		return;



	if (this.sliderPanel)

	{

		this.sliderPanel.previousPage();

		this.syncScrollButtons();

	}



	this.notifyObservers("onPostPreviousPage", evt);

};



Spry.Widget.FilmStrip.prototype.next = function(e)

{

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

	this.notifyObservers("onPreNextPage", evt);

	if (!evt.performDefaultAction)

		return;



	if (this.sliderPanel)

	{

		this.sliderPanel.nextPage();

		this.syncScrollButtons();

	}



	this.notifyObservers("onPostNextPage", evt);

};



/*

Spry.Utils.addLoadListener(function()

{

	Spry.$$(".FilmStrip").forEach(function(n){ var w = new Spry.Widget.FilmStrip(n); });

});

*/



})(); // EndSpryComponent
