﻿/* JSLint
var $ = null;
var jQuery = null;
var Abl = null;
var swapImage = null;
var clearTimeout = null;
var setTimeout = null;
*/


Abl.UI.ImageSwapper = function(baseImage, gallery, options) {
	var _self = this;
	var $baseImage = (baseImage instanceof jQuery) ? baseImage : $(baseImage);
	var params = $.extend(true, {}, Abl.UI.ImageSwapper.defaults, options);

	// Use the ImagePreLoader to manage the images
	var images = new Abl.UI.ImagePreLoader(gallery);
	var toggle = 0; 			// index for the presenters array
	var timer = null;


	var clearTimer = function() {
		if (timer) {
			clearTimeout(timer);
			timer = null;
		}
	};

	// Create a second image element
	var $cloneImage = $baseImage.clone(true);
	if ($baseImage.attr("id"))
	{
		$cloneImage.attr("id", $baseImage.attr("id") + "_clone");
	}


	// Store an array of the physical image elements used as placeholders
	// for presenting the images in the gallery.  The visiblility of these
	// elements is toggled, i.e. as one fades out the other fades in
	var presenters = [
		$baseImage.fadeIn(0).attr({ src: gallery[0].src, alt: gallery[0].alt }),
		$cloneImage.fadeOut(0).insertAfter($baseImage)
	];

	var getNextToggle = function() {
		var i = toggle + 1;
		return (i >= presenters.length) ? 0 : i;
	};


	var scheduleImageSwap = function() {
		timer = setTimeout(function() {
			swapImage();
		}, params.swapDelay);
	};

	// Fades out the current image and fades in the next image
	var swapImage = function() {
		clearTimer();
		presenters[toggle].fadeOut(params.fadeTime);
		toggle = getNextToggle();

		var $img = images.getNextImage();
		presenters[toggle]
		.attr({
			src: $img.attr("src"),
			alt: $img.attr("alt")
		})
		.fadeIn(params.fadeTime, function() {
			scheduleImageSwap();
		});
	};

	// Start the ball rolling, schedule the inital swapImage()
	this.start = function() {
		scheduleImageSwap();
	};
	
	this.stop = function() {
		clearTimer();
	};

	this.dispose = function() {
		clearTimer();
		$cloneImage.remove();
		images.dispose();
	};

};

Abl.UI.ImageSwapper.defaults = {
	fadeTime: 4000,				// time to fade the image in/out
	swapDelay: 5000				// delay between rotating the images
};