// SlideShow functions

///////////////////////////////////////////////////////////////////////////

var slideshow_List = new Array;

///////////////////////////////////////////////////////////////////////////


SlideshowHandler = function (inId1, inId2, inDoFadeBackImage, inScaleToFit, inFirstShowTime, inNormalShowTime, inFadeTime, inStartIndex, inFadeOverPages)
{
	// configurable parameters:
	this.id1 = inId1;	// back image
	this.id2 = inId2;	// front image
	this.obj1 = document.getElementById(this.id1);
	this.obj2 = document.getElementById(this.id2);
	this.mDoFadeBackImage = inDoFadeBackImage;	// set to true if images are of different sizes; otherwise set to false
	this.mFirstShowTime = inFirstShowTime;
	this.mNormalShowTime = inNormalShowTime;
	this.mFadeTime = inFadeTime;
	this.mCrossFadeOverPages = inFadeOverPages;
	this.mCurrIndex = inStartIndex;
	this.mScaleToFit = inScaleToFit;

	// internal
	this.mTimer = null;
	this.mStartTime = 0;
	this.mNextIndex = 1;
	this.mPaused = false;
	this.mUsesDivs = false;
	this.mCrossFadeOpacity = 0;

	this.mSlideUrls = new Array();
	this.mNextImage = new Image();
	this.mNextHtml = '';
	
	// control
	this.mOnChangeCallback = null;
	this.mOnChangeCallbackDone = false;
	
	slideshow_List.push (this);

	var me = this;
//	document.observe('dom:loaded', function() { me.Init() });
	$(document).ready(function() { me.Init() });
//	addLoadEvent (function() { me.Init() });
	addUnloadEvent (function() { me.Exit() });
}


SlideshowHandler.prototype.addSlide = function (inUrl)
{
	this.mSlideUrls.push (inUrl);
}


SlideshowHandler.prototype.shuffleSlides = function ()
{
	for (i = this.mSlideUrls.length-1; i >= 0 ; i++)
	{
		var j = Math.floor (Math.random() * (i+1));
		var temp = this.mSlideUrls[i];
		this.mSlideUrls[i] = this.mSlideUrls[j];
		this.mSlideUrls[j] = temp;
	}
}


SlideshowHandler.prototype.loadImage = function (inIndex)
{
	var me = this;
	var newImage = new Image();
	newImage.onload = function() { me.loadImageCallback (inIndex, newImage) };
	newImage.src = this.mSlideUrls[inIndex];
}


SlideshowHandler.prototype.loadImageCallback = function (inIndex, inImage)
{
	if (inIndex == this.mCurrIndex)
	{
		obj = this.obj1;
		obj.style.filter = "alpha(Opacity=100)";
		obj.style.opacity = 1;
	}
	else if (inIndex == this.mNextIndex)
		obj = this.obj2;
	
	if (this.mScaleToFit)
	{
		var parent = obj.parentNode;
		var scale = Math.min (parent.clientWidth / inImage.width, parent.clientHeight / inImage.height);
		var newWidth = Math.round (scale * inImage.width);
		var newHeight = Math.round (scale * inImage.height);
		
		obj.width = newWidth;
		obj.height = newHeight;
		obj.style.width = newWidth + 'px';
		obj.style.height = newHeight + 'px';
		obj.style.left = Math.round ((parent.clientWidth - newWidth) / 2) + 'px';
		obj.style.top = Math.round ((parent.clientHeight - newHeight) / 2) + 'px';
	}

	obj.src = inImage.src;
}


SlideshowHandler.prototype.xfadeSlides = function ()
{
	this.mCrossFadeOpacity = Math.round (100 * (this.getTime() - this.mStartTime) / this.mFadeTime);
	if (this.mCrossFadeOpacity > 100)
		this.mCrossFadeOpacity = 100;
		
	if (this.mDoFadeBackImage)
	{
		this.obj1.style.filter = "alpha(Opacity=" + (100-this.mCrossFadeOpacity) + ")";
		this.obj1.style.opacity = (100-this.mCrossFadeOpacity)/100;
	}

	this.obj2.style.filter = "alpha(Opacity=" + this.mCrossFadeOpacity + ")";
	this.obj2.style.opacity = this.mCrossFadeOpacity/100;

	if (this.mOnChangeCallback)
		this.mOnChangeCallback (this.mCurrIndex, 100-this.mCrossFadeOpacity, this.mNextIndex, this.mCrossFadeOpacity);
		
/*
	if (this.mCrossFadeOpacity >= 50)
	{
		if (this.mOnChangeCallback && !this.mOnChangeCallbackDone)
		{
			this.mOnChangeCallback (this.mCurrIndex, this.mNextIndex);
			this.mOnChangeCallbackDone = true;
		}
		
	}
*/
	var me = this;
	
	if (this.mCrossFadeOpacity == 100)
	{
		this.mCrossFadeOpacity = 0;
		
		if (this.mUsesDivs)
			this.obj1.innerHTML = this.obj2.innerHTML;
		else
		{
			this.obj1.src = this.obj2.src;
			this.obj1.style.width = this.obj2.style.width;
			this.obj1.style.height = this.obj2.style.height;
			this.obj1.style.left = this.obj2.style.left;
			this.obj1.style.top = this.obj2.style.top;
		}
		if (this.mDoFadeBackImage)
		{
			this.obj1.style.filter = "alpha(Opacity=100)";
			this.obj1.style.opacity = 1;
		}
		this.obj2.style.filter = "alpha(Opacity=0)";
		this.obj2.style.opacity = 0;
		
		this.mCurrIndex = this.mNextIndex;
		this.mNextIndex++;
		if (this.mNextIndex >= this.mSlideUrls.length)
			this.mNextIndex = 0;
//		this.mNextImage = new Image();
		this.loadImage (this.mNextIndex);
//		this.mNextImage.src = this.mSlideUrls[this.mNextIndex];

//		this.mOnChangeCallbackDone = false;
		if (!this.mPaused)
			this.mTimer = setTimeout (function() { me.changeSlide() }, this.mNormalShowTime);
	}
	else
		this.mTimer = setTimeout (function() { me.xfadeSlides() }, 5);
}


SlideshowHandler.prototype.changeSlide = function ()
{
	if (this.mNextIndex == this.mCurrIndex)
	{
		// this happens if we have only one slide
//		alert('x');
	}
	else
	{
/*
		if (this.mUsesDivs)
			this.obj2.innerHTML = this.mNextImage.innerHTML;
		else
		{
			this.obj2.src = this.mNextImage.src;
			
			if (this.mScaleToFit)
			{
				var parent = this.obj2.parentNode;
				var scale = Math.min (parent.clientWidth / this.mNextImage.width, parent.clientHeight / this.mNextImage.height);
				var newWidth = Math.round (scale * this.mNextImage.width);
				var newHeight = Math.round (scale * this.mNextImage.height);
				
				this.obj2.style.width = newWidth + 'px';
				this.obj2.style.height = newHeight + 'px';
				this.obj2.style.left = Math.round ((parent.clientWidth - newWidth) / 2) + 'px';
				this.obj2.style.top = Math.round ((parent.clientHeight - newHeight) / 2) + 'px';
			}
		}
*/
		if (!this.mDoFadeBackImage)
		{
			this.obj2.style.filter = "alpha(Opacity=0)";
			this.obj2.style.opacity = 0;
		}
	
		this.mStartTime = this.getTime();
	
		setCookie ("slideShowStart", this.mStartTime, 1);
		setCookie ("slideShowIndex", this.mNextIndex, 1);
	
		this.xfadeSlides();
	}
}


SlideshowHandler.prototype.Pause = function (inIndex)
{
	this.mPaused = true;
	
	if (inIndex == this.mCurrIndex)
	{
		if (this.mCrossFadeOpacity != 0)
		{
			clearTimeout (this.mTimer);
			
			// we're fading out, reverse the process
			var now = this.getTime();
			this.mStartTime = now + (now - this.mStartTime) - this.mFadeTime;
			
			this.mCurrIndex = this.mNextIndex;
			this.mNextIndex = inIndex;
			this.obj2.src = this.obj1.src;
			this.obj1.src = this.mNextImage.src;
	
			setCookie ("slideShowStart", this.mStartTime, 1);
			setCookie ("slideShowIndex", this.mNextIndex, 1);
			
			this.xfadeSlides();
		}
	}
	else if (inIndex == this.mNextIndex)
	{
		if (this.mCrossFadeOpacity == 0)
		{
			clearTimeout (this.mTimer);
			this.changeSlide(); // start now
		}
	}
	else
	{
		clearTimeout (this.mTimer);
		
		if (this.mCrossFadeOpacity != 0)
		{
			this.mStartTime = 0;
			this.xfadeSlides();
//			this.mOnChangeCallback (this.mCurrIndex, 100-this.mCrossFadeOpacity, this.mNextIndex, 0);
		}
	
		this.mNextIndex = inIndex;
		this.loadImage (this.mNextIndex);
//		this.mNextImage = new Image();
//		this.mNextImage.src = this.mSlideUrls[this.mNextIndex];
			
		this.changeSlide();
	}
}


SlideshowHandler.prototype.Resume = function (inDelay)
{
	if (this.mPaused)
	{
		this.mPaused = false;
		var me = this;
		// only set the timeout if we're not already fading (which can be the case if 
		// the pause switched to another slide and this switch is not finished yet)
		if (this.mCrossFadeOpacity == 0)
		{
			clearTimeout (this.mTimer);
			this.mTimer = setTimeout (function() { me.changeSlide() }, inDelay);
		}
	}
}


SlideshowHandler.prototype.nextSlide = function()
{
	wasPaused = this.mPaused;
	this.Pause (this.mNextIndex);
	this.mPaused = wasPaused;
}


SlideshowHandler.prototype.previousSlide = function()
{
	prevIndex = this.mCurrIndex - 1;
	if (prevIndex < 0)
		prevIndex = this.mSlideUrls.length - 1;
	
	wasPaused = this.mPaused;
	this.Pause (prevIndex);
	this.mPaused = wasPaused;
}


SlideshowHandler.prototype.getTime = function ()
{
	var dateObj = new Date();
	return dateObj.getTime();
}


SlideshowHandler.prototype.Init = function ()
{
	if (this.mSlideUrls.length > 0)
	{
		this.mNextIndex = this.mCurrIndex + 1;
		if (this.mNextIndex >= this.mSlideUrls.length)
			this.mNextIndex = 0;
		this.loadImage (this.mNextIndex);
//		this.mNextImage = new Image();
//		this.mNextImage.src = this.mSlideUrls[this.mNextIndex];

		startTime = getCookie ("slideShowStart");
		var now = this.getTime();
		if (startTime != null && this.mCrossFadeOverPages)
		{
			this.mFirstShowTime = this.mFirstShowTime - (now-startTime);
			if (this.mFirstShowTime < 0)
				this.mFirstShowTime = 100;
		}
		
		setCookie ("slideShowStart", now, 1);
		setCookie ("slideShowIndex", this.mCurrIndex, 1);
//		setCookie ("slideShowImage", this.obj1.src, 1);

		if (this.mOnChangeCallback)
			this.mOnChangeCallback (this.mCurrIndex, 0, this.mCurrIndex, 100);
		this.mOnChangeCallbackDone = false; // really!

		var me = this;
		this.mTimer = setTimeout (function() { me.changeSlide() }, this.mFirstShowTime);
	}
}


SlideshowHandler.prototype.Exit = function ()
{
	if (this.mTimer != null)
		clearTimeout (this.mTimer);
}


