var zindex = 1;

( function($)
{
	$.fn.config =
	{
		rows : 3,
		columns : 3,
		showTime : 3
	};

	$.fn.paused = false;
	$.fn.SlideShowImages = [];

	$.fn.SlideShowGridInit = function( options )
	{
		$.fn.sourceUl = this;
		$.fn.config = $.extend( options, $.fn.config );

		// Create the target ul
		$.fn.targetUl = document.createElement( "ul" );
		$.fn.targetUl.className = 'slideshowgrid';
		$( $.fn.targetUl ).mouseover( $.fn.PauseSlideShow );
		$( $.fn.targetUl ).mouseout( $.fn.ResumeSlideShow );

		$( this ).before( $.fn.targetUl );

		// Work out how many slots we have to fill with the current rows/columns
		var slotNumbers = $.fn.config.rows * $.fn.config.columns;

		for( var i = 0; i < slotNumbers; i++ )
		{
			var className = '';

			if ( i % 3 == 2 )
			{
				className = ' class="last"';
			}

			$( $.fn.targetUl ).append( "<li" + className + "></li>" );
		}

		$( this ).children( "li" ).each( function()
		{
			$.fn.SlideShowImages[ $.fn.SlideShowImages.length ] = $( this ).children( "div" ).clone()[0];
			$( this ).children( "div" ).remove();
		});

		$( this ).remove();

		$( $.fn.targetUl ).children( "li" ).each( function()
		{
			$.fn.PickImageForLi( $(this ) );
		} );

		setInterval( $.fn.CycleImages, 3000 );
	}

	$.fn.lastLiIndex = -1;

	$.fn.CycleImages = function()
	{
		if ( $.fn.paused )
		{
			return;
		}

		var selectedLiIndex = Math.floor( Math.random() * ( $( $.fn.targetUl ).children( "li" ).length - 1 ) );

		while( selectedLiIndex == $.fn.lastLiIndex )
		{
			selectedLiIndex = Math.floor( Math.random() * ( $( $.fn.targetUl ).children( "li" ).length - 1 ) );
		}

		var selectedLi = $( $.fn.targetUl ).children( "li" )[ selectedLiIndex ];

		$.fn.PickImageForLi( $( selectedLi ) );
		$.fn.lastLiIndex = selectedLiIndex;
	}

	$.fn.PickImageForLi = function( targetLi )
	{
		var availableImages = [];

		for( var i = 0; i < $.fn.SlideShowImages.length; i++ )
		{
			var imageToTest = $.fn.SlideShowImages[ i ];
			var available = ( $( imageToTest ).parent("li").length == 0 );

			if ( available )
			{
				availableImages[ availableImages.length ] = imageToTest;
			}
		}

		var selectedImageIndex = Math.floor( Math.random() * ( availableImages.length - 1 ) );
		var selectedImage = availableImages[ selectedImageIndex ];

		$.fn.AssignImageToLi( targetLi, selectedImage );
	}

	$.fn.AssignImageToLi = function( targetLi, image )
	{
		$( image ).hide();
		targetLi.append( image );

		$( image ).fadeIn( 1000, function()
		{
			$(this).parent().children( "div" ).not( image ).remove();
		});
	}

	$.fn.PauseSlideShow = function()
	{
		$.fn.paused = true;
	}

	$.fn.ResumeSlideShow = function()
	{
		$.fn.paused = false;
	}

})(jQuery);

