var BANNER_IMG_ID = 'banner-slideshow';
var BANNER_IMG_CONTAINER_ID = 'banner-slideshow-container';
var GALLERY_LOADER_ID = 'gallery-loader';
var LOADING_MESSAGE = 'Loading...';
var TRANSITION_DELAY = 3500;
var USERINTERACTIVE_TRANSITION_DELAY = 1000;
var AUTOPLAY_NEXT_DELAY = 1000;
var AUTOPLAY_RESTART_DELAY = 8000;
var l0 = new Image().src = GALLERY_LOADER_PATH;
var l1 = new Image().src = GALLERY_ARROW_NEXT_PATH;
var l1 = new Image().src = GALLERY_ARROW_PREV_PATH;

var GALLERY_ARROW_CONTAINER_NEXT = 'gallery-next';
var GALLERY_ARROW_CONTAINER_PREV = 'gallery-prev';
var ARROW_FADE_SPEED = 300;

var gallery_image_ids = [];
var current_gallery_index = 0;


function image_click( img_id, user_interaction )
{
	var thisimg = $("#" + img_id );
	var current_image_src = $(thisimg).data('image_src');
	if ( !current_image_src ) { return; }

	var image = $("<img src=''/>");
	image.css({position:'absolute', opacity:0, top:'0px'});
	$('#' + BANNER_IMG_ID).append(image);
	var delay = ( user_interaction !== undefined && user_interaction ? USERINTERACTIVE_TRANSITION_DELAY : TRANSITION_DELAY );
	var f = function()
	{
		image.load(function()
		{
			stop_gallery_loader( function() 
			{
				var top = 0;
				if ( image.height() > 0 ) { top = ( ( $('#' + BANNER_IMG_ID).height() - image.height() ) / 2 ); }
				image.css({top: top + 'px'});
				
				current_gallery_index = $(thisimg).data('gallery_index');

				image.siblings().stop().animate({opacity:0}, delay, function() { $(this).remove(); });
				image.stop().animate({opacity:1}, delay );
				
			});
		}).attr('src', current_image_src );
	};
	start_gallery_loader( f );
}


function register_gallery_image( id, src )
{	
	$(document).ready( function()
	{
		$('#'+id).data('gallery_index', gallery_image_ids.push(id) -1 );
		$('#'+id).data('image_src', src );
		
		$('#'+id).click( function(e)
		{
			e.preventDefault();
			autoplay_reset();
			image_click(id, true);
		});
	});
}

var is_loading = false;

function start_gallery_loader( callback )
{
	if ( is_loading ) { return; }
	is_loading=true;
	
	var loader = $("#" + GALLERY_LOADER_ID);
	if (!loader[0])
	{
		var banner = $("#" + BANNER_IMG_ID);
		var gallery_loader = "<div id='" + GALLERY_LOADER_ID + "' style='" +
			"display:none; " +
			"position:absolute; " +
			"height:" + banner.height() + "px; " +
			"width:" + banner.width() + "px; " +
			"top:" + banner.offset().top + "px; " +
			"left:" + banner.offset().left+ "px; " +
			"' " +
			"class='gallery-loader'>" +
				"<div><img src='" + GALLERY_LOADER_PATH + "' alt='" + LOADING_MESSAGE + "'/></div>" +
			"</div>";
		$("body").append(gallery_loader);
	}
	
	if ( is_autoplaying() ) { callback(); return; }
	
	$("#" + GALLERY_LOADER_ID).show();
	$("#" + GALLERY_LOADER_ID).animate( {opacity:1}, 200, callback );
}

function stop_gallery_loader( callback )
{
	$("#" + GALLERY_LOADER_ID).animate( {opacity:0}, 200, function(){ callback(); $("#" + GALLERY_LOADER_ID).hide(); is_loading=false; } );
}

function init_previous_next()
{
	if( $("#" + GALLERY_ARROW_CONTAINER_NEXT)[0] && $("#" + GALLERY_ARROW_CONTAINER_PREV)[0] ) { return; }
	
	var prev = "<div style='display:none;' id='" + GALLERY_ARROW_CONTAINER_PREV + "'><a href='#'><img src='" + GALLERY_ARROW_PREV_PATH + "'/></a></div>";
	var next = "<div style='display:none;' id='" + GALLERY_ARROW_CONTAINER_NEXT + "'><a href='#'><img src='" + GALLERY_ARROW_NEXT_PATH + "'/></a></div>";
	
	var container = $("#" + BANNER_IMG_CONTAINER_ID)
	container.append(prev);
	container.append(next);
	
	container.css({position:'relative'});
	$("#" + GALLERY_ARROW_CONTAINER_PREV + "").css
	({ 
		opacity  : 0,
		position : 'absolute',
		top: ( container.height()/2 ) + 'px', 
		left: '0px'
	});
	$("#" + GALLERY_ARROW_CONTAINER_NEXT + "").css
	({ 
		opacity  : 0,
		position : 'absolute',
		top: ( container.height()/2 ) + 'px', 
		right: '0px'
	});
	
	$("#" + GALLERY_ARROW_CONTAINER_NEXT + " a").click( function(e)
	{
		e.preventDefault();
		autoplay_reset();
		image_next( true );
	});
	
	$("#" + GALLERY_ARROW_CONTAINER_PREV + " a").click( function(e)
	{
		e.preventDefault();
		autoplay_reset();
		image_previous( true );
	});
}

function image_next( user_interaction )
{
	current_gallery_index = ( current_gallery_index + 1 ) % gallery_image_ids.length;
	image_click( gallery_image_ids[ current_gallery_index ], user_interaction );
}

function image_previous( user_interaction )
{
	current_gallery_index = ( --current_gallery_index < 0 ? gallery_image_ids.length + current_gallery_index : current_gallery_index );
	image_click( gallery_image_ids[ current_gallery_index ], user_interaction );
}

function start_previous_next()
{
	if( gallery_image_ids.length == 0 ) { return; }
	init_previous_next();
	$("#" + GALLERY_ARROW_CONTAINER_NEXT).stop().css({display:'block'}).animate({opacity:1},ARROW_FADE_SPEED);
	$("#" + GALLERY_ARROW_CONTAINER_PREV).stop().css({display:'block'}).animate({opacity:1},ARROW_FADE_SPEED);
}

function stop_previous_next()
{
	if( gallery_image_ids.length == 0 ) { return; }
	$("#" + GALLERY_ARROW_CONTAINER_NEXT).stop().animate({opacity:0},ARROW_FADE_SPEED);
	$("#" + GALLERY_ARROW_CONTAINER_PREV).stop().animate({opacity:0},ARROW_FADE_SPEED);
}

var gallery_autoplay = false;
var gallery_autoplay_timeout_func = null;
var start_gallery_autoplay_timeout_func = null;

function is_autoplaying( ) { return gallery_autoplay; }

function autoplay_start( )
{
	gallery_autoplay = true;
	image_next();
	gallery_autoplay_timeout_func = setTimeout( autoplay_start, AUTOPLAY_NEXT_DELAY + TRANSITION_DELAY );
}

function autoplay_stop( )
{
	clearTimeout( start_gallery_autoplay_timeout_func );
	clearTimeout( gallery_autoplay_timeout_func );
	gallery_autoplay = false; 
}

function autoplay_reset( )
{
	autoplay_stop();
	start_gallery_autoplay_timeout_func = setTimeout( autoplay_start, USERINTERACTIVE_TRANSITION_DELAY + AUTOPLAY_RESTART_DELAY );
}


$(document).ready( function()
{
	$("#" + BANNER_IMG_CONTAINER_ID).bind( 'mouseenter', start_previous_next );
	$("#" + BANNER_IMG_CONTAINER_ID).bind( 'mouseleave', stop_previous_next );
	var image = $("#" + BANNER_IMG_CONTAINER_ID).find( "img:first" );
	image.load( function(){ start_gallery_autoplay_timeout_func = setTimeout(autoplay_start,TRANSITION_DELAY); } ).attr('src', image.attr('src') + '#');
});


