//-------------------------------
// * Xythe Studios *
// * Coded by Rob Kleffner (Cyborg) *
// * Started: 3/18/2010 *
// * Last updated: 4/29/2010 *
//-------------------------------
// This file contains a class that
// implements a slide show that fades
// an image in and then out.
//-------------------------------

//-------------------------------
// * SlideShow *
//-------------------------------
// This class sets up and runs a
// simple slide show that fades one
// image out and fades the new one
// in.
//-------------------------------
var SlideShow = new Object();

//-------------------------------
// * Variables *
//-------------------------------
SlideShow.FadeTime = 1000.0;
SlideShow.ViewTime = 3000.0;
SlideShow.TimeLeft = 0;
SlideShow.Opaque = 4;
SlideShow.Transparent = 1;
SlideShow.FadingIn = 3;
SlideShow.FadingOut = 2;
SlideShow.ImageList = new Array();
SlideShow.ImageCount = 4;
SlideShow.CurrentImage = 0;

//-------------------------------
// * AddImages(folder, images) *
//-------------------------------
// Adds an image url to the list of
// images.
//-------------------------------
SlideShow.AddImages = function(folder, images)
{
	SlideShow.ImageCount = images.length;
	alert(SlideShow.ImageCount);
	for (var i = 0; i < SlideShow.ImageCount; i++)
	{
		SlideShow.ImageList[i] = folder + images[i];
		alert(SlideShow.ImageList[i]);
	}
}

//-------------------------------
// * AddImage(image) *
//-------------------------------
// Adds an image url to the list of
// images.
//-------------------------------
SlideShow.AddImage = function(image)
{
	SlideShow.ImageCount++;
	SlideShow.ImageList[ImageCount - 1] = image;
	alert(SlideShow.ImageCount);
	alert(SlideShow.ImageList[ImageCount - 1]);
}

//-------------------------------
// * RemoveImage(image) *
//-------------------------------
// Removes an image url to the list of
// images.
//-------------------------------
SlideShow.RemoveImage = function(image)
{
	var index = 0;
	for (var i = 0; i < SlideShow.ImageCount; i++)
	{
		if (SlideShow.ImageList[i] == image)
		{
			index = i;
			break;
		}
	}
	SlideShow.ImageList.splice(index, 1);
}

//-------------------------------
// * SwitchFadeState(lastTime, id) *
//-------------------------------
// Switches the fade state of the element specified,
// from fading out to fading in.
//-------------------------------
SlideShow.SwitchFadeState = function(lastTime, id)
{
	//make sure we have images to show!
	if (SlideShow.ImageCount <= 0)
		return;
	
	var curTime = new Date().getTime();
	var elapsed = curTime - lastTime;
	SlideShow.TimeLeft -= elapsed;
	
	if (SlideShow.TimeLeft > 0)
	{
		//not ready to change the slide
		setTimeout("SlideShow.SwitchFadeState(" + new Date().getTime() + ", '" + id + "')", 33);
		return;
	}

	element = document.getElementById(id);

	//check if the element exists
	if (element == null)
		return;
		
	//elements have four states
	//1: completely transparent
	//2: fading out
	//3: fading in
	//4: completely opaque
	if (element.FadeState == null)
	{
		//create a fade state based on the current style
		if (element.style.opacity == null || element.style.opacity == '' || element.style.opacity == '1')
			element.FadeState = SlideShow.Opaque;
		else
			element.FadeState = SlideShow.Transparent;
	}
	
	//fade has been called, so we need to either reverse the current fade direction
	//or begin fading in one of the directions
	if (element.FadeState == SlideShow.FadingOut)
	{
		//fading out
		element.FadeState = SlideShow.FadingIn;
		element.TimeLeft = FadeTime - element.TimeLeft;
	}
	else if (element.FadeState == SlideShow.FadingIn)
	{
		//fading in
		element.FadeState = SlideShow.FadingOut;
		element.TimeLeft = FadeTime - element.TimeLeft;
	}
	else if (element.FadeState == SlideShow.Transparent)
	{
		//transparent
		element.FadeState = SlideShow.FadingIn;
		element.TimeLeft = SlideShow.FadeTime;
		//reset the view time
		SlideShow.TimeLeft = SlideShow.ViewTime;
		//cycle the image
		SlideShow.CurrentImage++;
		if (SlideShow.CurrentImage == SlideShow.ImageCount)
			SlideShow.CurrentImage = 0;
		element.style.backgroundImage = "url(" + SlideShow.ImageList[SlideShow.CurrentImage] + ")";
	}
	else if (element.FadeState == SlideShow.Opaque)
	{
		//opaque
		element.FadeState = SlideShow.FadingOut;
		element.TimeLeft = SlideShow.FadeTime;
	}
	setTimeout("SlideShow.FadeAnimate(" + curTime + ", '" + id + "')", 33);
}

//-------------------------------
// * FadeAnimate(lastTime, id) *
//-------------------------------
// Function that updates the fade state
// of the specified html element.
//-------------------------------
SlideShow.FadeAnimate = function(lastTime, id)
{
	element = document.getElementById(id);

	var curTime = new Date().getTime();
	var elapsed = curTime - lastTime;
	
	//if we're done animating, set the state so that it doesn't continue
	if (element.TimeLeft <= elapsed)
	{
			if (element.FadeState == SlideShow.FadingIn)
			{
				CSSMod.SetOpacity(element, 1);
				element.FadeState = SlideShow.Opaque;
				setTimeout("SlideShow.SwitchFadeState(" + new Date().getTime() + ", '" + id + "')", 33);
			}
			else if (element.FadeState == SlideShow.FadingOut)
			{
				CSSMod.SetOpacity(element, 0);
				element.FadeState = SlideShow.Transparent;
				setTimeout("SlideShow.SwitchFadeState(" + new Date().getTime() + ", '" + id + "')", 33);
			}
			return;
	}
	
	//update the fade
	element.TimeLeft -= elapsed;
	var percent = element.TimeLeft / SlideShow.FadeTime;
	if (element.FadeState == SlideShow.FadingIn)
		percent = 1 - percent;
		
	CSSMod.SetOpacity(element, percent);
	
	setTimeout("SlideShow.FadeAnimate(" + curTime + ", '" + id + "')", 33);
}

//-------------------------------
// * Initialize() *
//-------------------------------
// Sets up the slide show.
//-------------------------------
SlideShow.Initialize = function(parameters)
{
	SlideShow.FadeTime = 1000.0;
	SlideShow.ViewTime = 3000.0;
	SlideShow.Opaque = 4;
	SlideShow.Transparent = 1;
	SlideShow.FadingIn = 3;
	SlideShow.FadingOut = 2;
	SlideShow.ImageList = new Array();
	SlideShow.ImageCount = parameters.length;
	SlideShow.CurrentImage = 0;
	SlideShow.TimeLeft = SlideShow.ViewTime;
	for (var i = 0; i < parameters.length; i++)
	{
		SlideShow.ImageList[i] = parameters[i];
	}

	//start the switching of the images
	SlideShow.SwitchFadeState(new Date().getTime(), "slideshow");
}
