// SpryImageSlideShow.js - version 0.12 - 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("SpryImageSlideShow.js requires SpryWidget.js!");	return;}var defaultConfig = {	plugIns:               [],	defaultSlide: 0,	injectionType: "inside",        // "inside" or "replace"	repeatingElementSelector: null,	useButtonControls: false,       // true == <button>, false == <a>	dropFrames: true,	autoPlay: true,	transitionDuration: 2000,       // msecs	displayInterval: 6000,          // msecs	slideLinkStopsSlideShow: true,	widgetID: null,	widgetClass: "ImageSlideShow",          // Sliceable	playingClass: "ISSPlaying",	nameClass: "ISSName",                   // Sliceable	clipClass: "ISSClip",	viewClass: "ISSView",	slideClass: "ISSSlide",                 // Sliceable	slideVisibleClass: "ISSSlideVisible",	slideHiddenClass: "ISSSlideHidden",	slideTitleClass: "ISSSlideTitle",       // Sliceable	slideCaptionClass: "ISSSlideCaption",   // Sliceable	countClass: "ISSSlideCount",            // Sliceable	slideLinksClass: "ISSSlideLinks",       // Sliceable	slideLinkClass: "ISSSlideLink",         // Sliceable	controlsClass: "ISSControls",           // Sliceable	firstBtnClass: "ISSFirstButton",        // Sliceable	prevBtnClass: "ISSPreviousButton",      // Sliceable	playBtnClass: "ISSPlayButton",          // Sliceable	nextBtnClass: "ISSNextButton",          // Sliceable	lastBtnClass: "ISSLastButton",          // Sliceable	playLabelClass: "ISSPlayLabel",	pauseLabelClass: "ISSPauseLabel",	slideShowBusy: "ISSBusy",	slideLoading: "ISSSlideLoading",	sliceMap: {},	componentOrder: [ "view", "controls" ] // "name", "view", "controls", "links", " title", "caption", "count"};Spry.Widget.ImageSlideShow = function(ele, opts){	Spry.Widget.Base.call(this);	this.element = Spry.$$(ele)[0];	this.rootContainer = this.element;	this.slideShowName = null;	this.imageInfo = [];	this.slideElements = [];	this.slideElementCount = 2;	this.currentSlideElementIndex = -1;	this.currentVirtualSlideIndex = -1;	this.isReady = false;	this.loader = new Spry.Utils.ImageLoader();	this.isPlaying = false;	// Initialize the accordion object with the global defaults.	this.setOptions(this, Spry.Widget.ImageSlideShow.config);		// Override the defaults with any options passed into the constructor.	this.setOptions(this, opts);	var self = this;	this.firstFunc = function(e) { return self.showFirstSlide(); };	this.prevFunc = function(e) { return self.showPreviousSlide(); };	this.playFunc = function(e) { return self.togglePlayMode(); };	this.nextFunc = function(e) { return self.showNextSlide(); };	this.lastFunc = function(e) { return self.showLastSlide(); };	this.initializePlugIns(Spry.Widget.ImageSlideShow.config.plugIns, opts);	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreInitialize", evt);	if (!evt.performDefaultAction)		return;	this.transformMarkup();	this.attachBehaviors();	this.updateSlideTitle();	this.updateSlideCaption();	this.updateSlideCountLabel();	this.triggerCallbackAfterOnLoad(this.loadImages, this);	this.notifyObservers("onPostInitialize", evt);};Spry.Widget.ImageSlideShow.prototype = new Spry.Widget.Base();Spry.Widget.ImageSlideShow.prototype.constructor = Spry.Widget.ImageSlideShow;Spry.Widget.ImageSlideShow.config = defaultConfig;Spry.Widget.ImageSlideShow.prototype.getOffscreenSlideIndex = function(){	var si = this.currentSlideElementIndex;	var si = this.panelSet.getCurrentPanelIndex();	return si < 0 ? 0 : ((si + 1) % this.slideElements.length);};Spry.Widget.ImageSlideShow.prototype.setupOffscreenSlideForDisplay = function(virtualSlideIndex){	var info = this.imageInfo[virtualSlideIndex];	if (!info)		return;	var si = this.getOffscreenSlideIndex();	var slideEle = this.slideElements[si];	var img = Spry.$$("img", slideEle)[0];	img.src = "";	img.src = info.src;	img.style.width = info.width + "px";	img.style.height = info.height + "px";};Spry.Widget.ImageSlideShow.prototype.showSlide = function(slideIndex){	var ps = this.panelSet;	if (!ps || !ps.showPanel)		return;	// Figure out the index of the offscreen slide.	var offscreenIndex = this.getOffscreenSlideIndex();	this.setupOffscreenSlideForDisplay(slideIndex);	var evt = new Spry.Widget.Event(this, { target: this.slideElements[offscreenIndex], slideIndex: slideIndex });	this.notifyObservers("onPreShowSlide", evt);	if (!evt.performDefaultAction)		return false;	if (this.panelSelector)		this.panelSelector.selectButton(slideIndex);	this.currentSlideElementIndex = offscreenIndex;	this.currentVirtualSlideIndex = slideIndex;	this.updateSlideTitle();	this.updateSlideCaption();	this.updateSlideCountLabel();	ps.showPanel(offscreenIndex);	this.notifyObservers("onPostShowSlide", evt);};Spry.Widget.ImageSlideShow.prototype.hideSlide = function(slideIndex){	var ps = this.panelSet;	if (ps && ps.hidePanel)		ps.hidePanel(slideIndexs);};Spry.Widget.ImageSlideShow.prototype.showFirstSlide = function(){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreShowFirstSlide", evt);	if (!evt.performDefaultAction)		return false;	if (this.imageInfo.length)		this.showSlide(0);	this.notifyObservers("onPostShowFirstSlide", evt);	return false;};Spry.Widget.ImageSlideShow.prototype.showPreviousSlide = function(){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreShowPreviousSlide", evt);	if (!evt.performDefaultAction)		return false;	if (this.imageInfo.length)	{		var prevIndex = this.currentVirtualSlideIndex - 1;		prevIndex = prevIndex < 0 ? this.imageInfo.length - 1 : prevIndex;		this.showSlide(prevIndex);	}	this.notifyObservers("onPostShowPreviousSlide", evt);	return false;};Spry.Widget.ImageSlideShow.prototype.showNextSlide = function(){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreShowNextSlide", evt);	if (!evt.performDefaultAction)		return false;	if (this.imageInfo.length)	{		var nextIndex = (this.currentVirtualSlideIndex + 1) % this.imageInfo.length;		this.showSlide(nextIndex);	}	this.notifyObservers("onPostShowNextSlide", evt);	return false;};Spry.Widget.ImageSlideShow.prototype.showLastSlide = function(){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreShowLastSlide", evt);	if (!evt.performDefaultAction)		return false;	if (this.imageInfo.length)		this.showSlide(this.imageInfo.length - 1);	this.notifyObservers("onPostShowLastSlide", evt);	return false;};Spry.Widget.ImageSlideShow.prototype.play = function(){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreStartSlideShow", evt);	if (!evt.performDefaultAction)		return false;	if (this.panelSet)		this.panelSet.play();	this.notifyObservers("onPostStartSlideShow", evt);	return false;};Spry.Widget.ImageSlideShow.prototype.stop = function(){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreStopSlideShow", evt);	if (!evt.performDefaultAction)		return false;	if (this.panelSet)		this.panelSet.stop();	this.notifyObservers("onPostStopSlideShow", evt);	return false;};Spry.Widget.ImageSlideShow.prototype.togglePlayMode = function(){	if (this.element)	{		if (Spry.Utils.hasClassName(this.element, this.playingClass))			this.stop();		else			this.play();	}	return false;};Spry.Widget.ImageSlideShow.prototype.getCurrentSlide = function(){	return this.panelSet ? this.panelSet.getCurrentPanel() : null;};Spry.Widget.ImageSlideShow.prototype.getCurrentSlideIndex = function(idx){	return this.currentVirtualSlideIndex;};Spry.Widget.ImageSlideShow.prototype.getSlideIndex = function(ele){	var ps = this.panelSet;	return ps && ps.getPanelIndex ? ps.getPanelIndex(ele) : -1;};Spry.Widget.ImageSlideShow.prototype.getSlides = function(){	var results = [];	var clip = Spry.$$("." + this.clipClass, this.element)[0];	if (clip)		return Spry.$$("." + this.slideClass, clip);	return results;};Spry.Widget.ImageSlideShow.prototype.isInPlayMode = function(){	return this.isPlaying;};Spry.Widget.ImageSlideShow.prototype.handlePanelSetStart = function(e){	this.isPlaying = true;	this.addClassName(this.element, this.playingClass);	return false;};Spry.Widget.ImageSlideShow.prototype.handlePanelSetStop = function(e){	this.isPlaying = false;	this.removeClassName(this.element, this.playingClass);	return false;};Spry.Widget.ImageSlideShow.prototype.handlePanelSetShowNextPanel = function(e){	this.showNextSlide();	e.preventDefault();};Spry.Widget.ImageSlideShow.prototype.updateLabel = function(className, labelStr){	var eles = Spry.$$("." + className, this.element);	if (eles.length)	{		for (var i = 0; i < eles.length; i++)		{			var e = eles[i];			var c = e ? e.contentContainer : e;			c.innerHTML = labelStr;		}	}};Spry.Widget.ImageSlideShow.prototype.updateSlideTitle = function(){	var info = this.imageInfo[this.currentVirtualSlideIndex];	var title = (info && info.title) ? info.title : "";	var evt = new Spry.Widget.Event(this, { title: title });	this.notifyObservers("onPreUpdateSlideTitle", evt);	if (!evt.performDefaultAction)		return false;	this.updateLabel(this.slideTitleClass, title);	this.notifyObservers("onPostUpdateSlideTitle", evt);};Spry.Widget.ImageSlideShow.prototype.updateSlideCaption = function(){	var info = this.imageInfo[this.currentVirtualSlideIndex];	var caption = (info && info.caption) ? info.caption : "";	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreUpdateSlideCaption", evt, { caption: caption });	if (!evt.performDefaultAction)		return false;	this.updateLabel(this.slideCaptionClass, caption);	this.notifyObservers("onPostUpdateSlideCaption", evt);};Spry.Widget.ImageSlideShow.prototype.updateSlideCountLabel = function(){	var slideIndex = this.currentVirtualSlideIndex;	var slideCount = this.imageInfo.length;	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreUpdateSlideCount", evt, { slideIndex: slideIndex, slideCount: slideCount });	if (!evt.performDefaultAction)		return false;	var label = (slideIndex >= 0) ? ((slideIndex+1) + " of " + slideCount) : "";	this.updateLabel(this.countClass, label);	this.notifyObservers("onPostUpdateSlideCount", evt);};Spry.Widget.ImageSlideShow.prototype.createButtonElement = function(label, className, clickFunc, useLink){	var btn = this.createOptionalSlicedStructure(null, useLink ? "a" : "button", className, null, "span");	if (useLink)		btn.href = "#";	else		btn.setAttribute("type", "button");	this.addClassName(btn, className);	btn.contentContainer.appendChild(document.createTextNode(label));	return btn;};Spry.Widget.ImageSlideShow.prototype.addImageToLoader = function(slideIndex, info){	var self = this;	this.loader.load(info.src, function(src,img)	{		info.width = img.width;		info.height = img.height;		var lastSlideIndex = self.imageInfo.length - 1;		if (!self.isReady && (slideIndex > lastSlideIndex || slideIndex > (self.defaultSlide + 1)))		{			self.removeClassName(self.element, self.slideShowBusy);			self.showSlide(self.defaultSlide);			if (self.autoPlay)				self.play();			self.isReady = true;		}		// Show the corresponding slide link for this slide.		if (self.panelSelector)			self.panelSelector.enableButton(slideIndex);	});};Spry.Widget.ImageSlideShow.prototype.loadImages = function(){	var numImages = this.imageInfo.length;	for (var i = 0; i < numImages; i++)		this.addImageToLoader(i, this.imageInfo[i]);};Spry.Widget.ImageSlideShow.prototype.extractInfoFromElement = function(ele){	var info = new Object();	if (ele)	{		info.src = ele.href ? ele.href : ele.src;		info.title = ele.title;		if (ele.nodeName.toLowerCase() == "a")		{			var img = ele.getElementsByTagName("img").item(0);			if (img)				info.caption = img.alt;		}		else			info.caption = ele.alt;	}	return info;}Spry.Widget.ImageSlideShow.prototype.extractImageInfo = function(elements){	var evt = new Spry.Widget.Event(this, { repeatingElements: elements });	this.notifyObservers("onPreExtractImageInfo", evt);	if (!evt.performDefaultAction)		return;	var cnt = elements.length;	for (var i = 0; i < cnt; i++)	{		var e = elements[i];		var n = e.nodeName.toLowerCase();		if (n != "a" && n != "img")			e = Spry.$$("a, img", e)[0];		this.imageInfo.push(this.extractInfoFromElement(e));			}	this.notifyObservers("onPostExtractImageInfo", evt);}Spry.Widget.ImageSlideShow.prototype.transformMarkup = function(){	var elements = [];	if (!this.repeatingElementSelector)		elements = this.getElementChildren(this.element);	else		elements = Spry.$$(this.repeatingElementSelector, this.element);	if (this.element.title)		this.slideShowName = this.element.title;	this.extractImageInfo(elements);	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreTransformMarkup", evt);	if (!evt.performDefaultAction)		return;	// Create the 9-Sliced top-level element for the widget.	var root = this.createOptionalSlicedStructure(null, "div", this.widgetClass);	var rootCC = root.contentContainer;	if (this.widgetID)		root.id = this.widgetID;	for (var i = 0; i < this.componentOrder.length; i++)	{		var itemName = this.componentOrder[i];		switch (itemName)		{			case "view":				// Create a clip + view combination and stick it into the content container of the root element.								var clip = this.createElement("div", this.clipClass, null);				var view = this.createElement("div", this.viewClass, clip);								for (var j = 0; j < this.slideElementCount; j++)				{					var bufEle = this.slideElements[j] = this.createOptionalSlicedStructure(null, "div", this.slideClass);					bufEle.appendChild(document.createElement("img"));					view.appendChild(bufEle);				}				rootCC.appendChild(clip);				break;			case "controls":				// Create the slide show control buttons.							var controls = this.createOptionalSlicedStructure(null, "div", this.controlsClass);				var controlsCC = controls.contentContainer;								controlsCC.appendChild(this.firstBtn = this.createButtonElement("First", this.firstBtnClass, this.firstFunc, !this.useButtonControls));				controlsCC.appendChild(this.prevBtn = this.createButtonElement("Previous", this.prevBtnClass, this.prevFunc, !this.useButtonControls));				controlsCC.appendChild(this.playBtn = this.createButtonElement("", this.playBtnClass, this.playFunc, !this.useButtonControls));				controlsCC.appendChild(this.nextBtn = this.createButtonElement("Next", this.nextBtnClass, this.nextFunc, !this.useButtonControls));				controlsCC.appendChild(this.lastBtn = this.createButtonElement("Last", this.lastBtnClass, this.lastFunc, !this.useButtonControls));							this.playBtn.contentContainer.innerHTML = "<span class=\"" + this.playLabelClass + "\">Play</span><span class=\"" + this.pauseLabelClass + "\">Pause</span>";				rootCC.appendChild(controls);				break;			case "links":				var links = this.createOptionalSlicedStructure(null, "div", this.slideLinksClass);				var linksCC = links.contentContainer;							for (var j = 0; j < elements.length; j++)					linksCC.appendChild(this.createButtonElement((j+1)+"", this.slideLinkClass, null, true));				rootCC.appendChild(links);				break;			case "name":				var nameEle = this.createOptionalSlicedStructure(null, "div", this.nameClass);				if (this.slideShowName)					nameEle.contentContainer.innerHTML = this.slideShowName;				rootCC.appendChild(nameEle);				break;			case "title":				rootCC.appendChild(this.createOptionalSlicedStructure(null, "div", this.slideTitleClass));				break;			case "caption":				rootCC.appendChild(this.createOptionalSlicedStructure(null, "div", this.slideCaptionClass));				break;			case "count":				rootCC.appendChild(this.createOptionalSlicedStructure(null, "div", this.countClass));				break;		}	}	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.element = root;	}	this.addClassName(this.element, this.slideShowBusy);	this.notifyObservers("onPostTransformMarkup", evt);};Spry.Widget.ImageSlideShow.prototype.attachViewBehaviors = function(){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreAttachViewBehaviors", evt);	if (!evt.performDefaultAction)		return;	this.panelSet = new Spry.Widget.FadingPanels(Spry.$$("." + this.slideClass, this.element),	{		defaultPanel: -1,		dropFrames: this.dropFrames,		minDuration: this.transitionDuration,		maxDuration: this.transitionDuration,		displayInterval: this.displayInterval,		visibleClass: this.slideVisibleClass,		hiddenClass: this.slideHiddenClass	});	var self = this;	this.panelSet.addObserver(	{		onPreStartSlideShowMode: function(n,evt){ self.handlePanelSetStart(evt); },		onPreStopSlideShowMode: function(n,evt){ self.handlePanelSetStop(evt); },		onPreShowNextPanel: function(n,evt){ self.handlePanelSetShowNextPanel(evt); }	});	this.notifyObservers("onPostAttachViewBehaviors", evt);	};Spry.Widget.ImageSlideShow.prototype.attachButtonBehavior = function(ele, className, clickFunc){	var w = new Spry.Widget.Button(ele,	{		downClass: className + "Down",		hoverClass: className + "Hover",		disabledClass: className + "Disabled",		onclick: clickFunc	});};Spry.Widget.ImageSlideShow.prototype.attachControlBehaviors = function(){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreAttachControlBehaviors", evt);	if (!evt.performDefaultAction)		return;	// Search for the buttons by class name. We do this just in case a	// plugin altered the default markup to add or remove controls.	var self = this;	Spry.$$("." + this.firstBtnClass, this.element).forEach(function(n){ self.attachButtonBehavior(n, self.firstBtnClass, self.firstFunc); });	Spry.$$("." + this.prevBtnClass, this.element).forEach(function(n){ self.attachButtonBehavior(n, self.prevBtnClass, self.prevFunc); });	Spry.$$("." + this.playBtnClass, this.element).forEach(function(n){ self.attachButtonBehavior(n, self.playBtnClass, self.playFunc); });	Spry.$$("." + this.nextBtnClass, this.element).forEach(function(n){ self.attachButtonBehavior(n, self.nextBtnClass, self.nextFunc); });	Spry.$$("." + this.lastBtnClass, this.element).forEach(function(n){ self.attachButtonBehavior(n, self.lastBtnClass, self.lastFunc); });	this.notifyObservers("onPostAttachControlBehaviors", evt);	};Spry.Widget.ImageSlideShow.prototype.handleSlideLinkClick = function(slideLinkEle, slideLinkIndex){	if (!slideLinkEle || slideLinkIndex == this.currentVirtualSlideIndex)		return;	if (this.slideLinkStopsSlideShow)		this.stop();	this.showSlide(slideLinkIndex);};Spry.Widget.ImageSlideShow.prototype.attachLinkBehaviors = function(){	var links = Spry.$$("." + this.slideLinkClass, this.element);	if (links.length > 0)	{		var evt = new Spry.Widget.Event(this);		this.notifyObservers("onPreAttachLinkBehaviors", evt);		if (!evt.performDefaultAction)			return;			this.panelSelector = new Spry.Widget.PanelSelector(links, null,		{			downClass: this.slideLinkClass + "Down",			disabledClass: this.slideLinkClass + "Disabled",			selectedClass: this.slideLinkClass + "Selected",			unselectedClass: this.slideLinkClass + "Unselected",			hoverClass: this.slideLinkClass + "Hover",			focusedClass: this.slideLinkClass + "Focused"		});			var self = this;		this.panelSelector.addObserver({ onPostPanelSelectorClick: function(n, evt)		{			self.handleSlideLinkClick(evt.target, evt.targetIndex);			if (self.panelSet)				self.panelSet.stop();		}});			for (var i = 0; i < links.length; i++)			this.panelSelector.disableButton(i);			this.notifyObservers("onPostAttachLinkBehaviors", evt);		}};Spry.Widget.ImageSlideShow.prototype.attachBehaviors = function(link){	var evt = new Spry.Widget.Event(this);	this.notifyObservers("onPreAttachBehaviors", evt);	if (!evt.performDefaultAction)		return;	this.attachViewBehaviors();	this.attachLinkBehaviors();	this.attachControlBehaviors();	this.notifyObservers("onPostAttachBehaviors", evt);	};///////////////////////////////////////////////////////////////////////////////// PLUGINS /////////////////////////////////////////////////////////////////////////////////})(); // EndSpryComponent
