// check dependencies

if( typeof FeaturedSlideControl == "undefined" )
	throw "FeaturesSlideShow Error: Missing dependency: FeaturedSlideControl (featured-slide-control.js)";

if( typeof FeaturedSlide == "undefined" )
	throw "FeaturesSlideShow Error: Missing dependency: FeaturedSlide (featured-slide.js)";

// define static class

var FeaturedSlideShow 			= {};
FeaturedSlideShow._slides 		= [];
FeaturedSlideShow._currentSlide = null;
FeaturedSlideShow._inTransition = false;
FeaturedSlideShow._intervalRef	= null; // setInterval() reference for play/pause
FeaturedSlideShow._timeoutRef 	= null; // setTimeout() references for pauseFor
FeaturedSlideShow._requested 	= null; // if a user presses a button during auto-play fade, it will be placed here

// slide show settings

FeaturedSlideShow.fadeDuration 		= 2.5; 	// seconds: how long it takes to transition to another slide
FeaturedSlideShow.slideDuration 	= 8.0; 	// seconds: how long auto-play lingers on a slide
FeaturedSlideShow.lingerDuration 	= 30.0; // seconds: how long a user-selected slide lingers

FeaturedSlideShow.initialize = function( element )
{
	FeaturedSlideShow._element = $( element );
	FeaturedSlideShow._initDOM();
	FeaturedSlideShow._initOther();
	FeaturedSlideShow.play();
};

FeaturedSlideShow._initDOM = function()
{
	var slides = $$( '#featured-images a' );
	
	for( var i = 0; i < slides.length; i++ )
		FeaturedSlideShow._slides.push( new FeaturedSlide( slides[i], i ) );
};

FeaturedSlideShow._initOther = function()
{
	FeaturedSlideShow._slides[0].getImage().setStyle( { display: "block" } );
	FeaturedSlideShow._slides[0].getControl().activate();
	FeaturedSlideShow._currentSlide = FeaturedSlideShow._slides[0];
};

FeaturedSlideShow.addControl = function( control )
{	
	$( "featured-control" ).insert( { top: control.getElement() } );
};

FeaturedSlideShow.getElement = function()
{
	return FeaturedSlideShow._element;
};

FeaturedSlideShow.getCurrentSlide = function()
{
	return FeaturedSlideShow._currentSlide;
};

FeaturedSlideShow.setCurrentSlide = function( slide )
{
	FeaturedSlideShow._currentSlide = slide;
};

FeaturedSlideShow.isInTransition = function()
{
	return FeaturedSlideShow._inTransition;
};

FeaturedSlideShow.fadeToSlide = function( slide )
{
	if( slide === FeaturedSlideShow.getCurrentSlide() )
		return false; // already selected
		
	FeaturedSlideShow._inTransition = true;
	var src = "url(" + slide.getImage().getAttribute( "src" ) + ")";
	
	FeaturedSlideShow.getCurrentSlide().getControl().deactivate();
	FeaturedSlideShow.getElement().setStyle( { backgroundImage: src, backgroundPosition: "top left" } );
	
	new Effect.Opacity( FeaturedSlideShow.getCurrentSlide().getImage(),
	{
		from: 1,
		to: 0,
		duration: 2.5/*FeaturedSlideShow.fadeDuration*/,
		afterFinish: function()
		{
			FeaturedSlideShow.getCurrentSlide().getImage().setStyle( { display: "none" } );
			FeaturedSlideShow.getCurrentSlide().getImage().setOpacity( 1 );
			FeaturedSlideShow.setCurrentSlide( slide );
			slide.getImage().setStyle( { display: "block" } );
			FeaturedSlideShow._inTransition = false;
			FeaturedSlideShow.handleQueue();
		}
	});
	
	return true;
};

FeaturedSlideShow.getNextSlide = function()
{
	var current = FeaturedSlideShow.getCurrentSlide();
	
	if( current === null )
		return null;
	
	var currIndex = FeaturedSlideShow._slides.indexOf( current );
	
	if( currIndex + 1 === FeaturedSlideShow._slides.length )
		return FeaturedSlideShow._slides[0];
	else
		return FeaturedSlideShow._slides[ currIndex + 1 ];
};

FeaturedSlideShow.getPreviousSlide = function()
{
	var current = FeaturedSlideShow.getCurrentSlide();
	
	if( current === null )
		return null;
	
	var currIndex = FeaturedSlideShow._slides.indexOf( current );
	
	if( currIndex === 0 )
		return FeaturedSlideShow._slides[ FeaturedSlideShow._slides.length - 1 ];
	else
		return FeaturedSlideShow._slides[ currIndex - 1 ];
};

FeaturedSlideShow.fadeToNextSlide = function()
{
	var next = FeaturedSlideShow.getNextSlide();
	if( next === null )
		throw "FeaturedSlideShow Error: Cannot fade to next slide: No slides found";
	
	FeaturedSlideShow.highlightSlideControl( next );
	FeaturedSlideShow.fadeToSlide( next );
};

FeaturedSlideShow.fadeToPreviousSlide = function()
{
	var previous = FeaturedSlideShow.getPreviousSlide();
	if( previous === null )
		throw "FeaturedSlideShow Error: Cannot fade to previous slide: No slided found";
	
	FeaturedSlideShow.highlightSlideControl( previous );
	FeaturedSlideShow.fadeToSlide( previous );
};

FeaturedSlideShow.highlightSlideControl = function( slide )
{
	var current = FeaturedSlideShow.getCurrentSlide();
	
	if( current === slide )
		return false;
	
	current.getControl().deactivate();
	slide.getControl().activate();
	return true;
};

FeaturedSlideShow.addToQueue = function( slide )
{
	FeaturedSlideShow._requested = slide;
};

FeaturedSlideShow.handleQueue = function()
{
	if( FeaturedSlideShow._requested === null )
		return false;
	
	FeaturedSlideShow.pauseFor( FeaturedSlideShow.lingerDuration );
	FeaturedSlideShow.highlightSlideControl( FeaturedSlideShow._requested );
	FeaturedSlideShow.fadeToSlide( FeaturedSlideShow._requested );
	FeaturedSlideShow._requested = null;
	return true;
};	

FeaturedSlideShow.play = function()
{
	FeaturedSlideShow._intervalRef = setInterval( FeaturedSlideShow.fadeToNextSlide, FeaturedSlideShow.slideDuration * 1000 );
};

FeaturedSlideShow.pause = function()
{
	clearInterval( FeaturedSlideShow._intervalRef );
};

FeaturedSlideShow.pauseFor = function( seconds )
{
	clearTimeout( FeaturedSlideShow._timeoutRef );
	
	FeaturedSlideShow.pause();
	// set timer.  We subtract slide duration from pause seconds, because, for example, we don't was 30s pause + 8s slide = 38 seconds. We want exactly 30 seconds.
	FeaturedSlideShow._timeoutRef = setTimeout( FeaturedSlideShow.play, ( seconds - FeaturedSlideShow.slideDuration ) * 1000 );
};

document.observe( "dom:loaded", function(){ FeaturedSlideShow.initialize( 'featured' ) } );