// SpryImageViewer.js - version 0.1 - Spry Pre-Release 1.6.1

//

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



var Spry; if (!Spry) Spry = {}; if (!Spry.Widget) Spry.Widget = {};



Spry.Widget.ImageViewer = function(ele, options)

{

	Spry.Utils.Notifier.call(this);



	this.element = Spry.$(ele);

	this.imageSelector = "img";

	this.elementToResizeSelector = "*";

	

	this.currentEffect = null;

	this.currentLoader = null;

};



Spry.Widget.ImageViewer.prototype = new Spry.Utils.Notifier();

Spry.Widget.ImageViewer.prototype.constructor = Spry.Widget.ImageViewer;



Spry.Widget.ImageViewer.prototype.killLoader = function()

{

	if (this.currentLoader)

	{

		this.currentLoader.onload = null;

		this.currentLoader = null;

	}

};



Spry.Widget.ImageViewer.prototype.setImage = function(url)

{

	var img = Spry.$$(this.imageSelector, this.element)[0];

	if (!img) return;



	if (this.currentEffect)

	{

		this.currentEffect.stop();

		this.currentEffect = null;

	}



	this.killLoader();

	var loader = this.currentLoader = new Image;

	var self = this;



	this.notifyObservers("onPreUpdate", url);



	this.currentEffect = new Spry.Effect.Opacity(img, Spry.Effect.getOpacity(img), 0, { duration: 400,

		finish: function()

		{

			// Use an image loader to make sure we only fade in the new image after

			// it is completely loaded.

			loader.onload = function()

			{

				var w = loader.width;

				var h = loader.height;



				var eleToResize = img;

				if (self.elementToResizeSelector)

					eleToResize = Spry.Utils.getAncestor(img, self.elementToResizeSelector);



				self.currentEffect = new Spry.Effect.Size(eleToResize, Spry.Effect.getDimensions(eleToResize), { width: w, height: h, units:"px"}, {duration: 400, finish: function()

				{

					img.src = loader.src;

					loader = null;

					self.currentEffect = new Spry.Effect.Opacity(img, 0, 1, { duration: 400,

						finish: function()

						{

							self.currentEffect = null;

							

							// Our new image is fully visible now. Remove any opacity related

							// style properties on the img to workaround the IE bug that creates

							// white dots/holes in the images. Removing the properties forces

							// IE to re-render the image correctly.



							img.style.opacity = "";

							img.style.filter = "";



							// If the slide show is on, fire off the timer for the next image.



							self.notifyObservers("onPostUpdate", url);

						}});

					self.currentEffect.start();					

				}});

				self.currentEffect.start();

			};

			loader.src = url;

		}

	});

	this.currentEffect.start();

};

