/**

 * Slideshow Lite plugin for jQuery

 *

 * v0.5.3

 *

 * Copyright (c) 2009 Fred Wu

 *

 * Dual licensed under the MIT and GPL licenses:

 *   http://www.opensource.org/licenses/mit-license.php

 *   http://www.gnu.org/licenses/gpl.html

 */


/**

 * Configuration options:

 *

 * pauseSeconds  float    number of seconds between each photo to be displayed

 * fadeSpeed     float    number of seconds for the fading transition, the value should not exceed 'pauseSeconds'

 * width         integer  width of the slideshow, in pixels

 * height        integer  height of the slideshow, in pixels

 * caption       boolean  display photo caption?

 * cssClass      string   name of the CSS class, defaults to 'slideshowlite'

 */


(function($){


	$.fn.slideshow = function(options){


		var defaults = {

			pauseSeconds: 8,

			fadeSpeed: 0.5,

			width: 495,

			height: 230,

			caption: true,

			cssClass: 'slideshowlite'

		};


		var options = $.extend(defaults, options);


		// ----------------------------------------

		// slideshow objects and variables

		// ----------------------------------------


		var target = this;

		var items  = $(target).children("a");

		var instance;


		// ----------------------------------------

		// some mandontory styling

		// ----------------------------------------


		if ( ! $(this).hasClass(options.cssClass)) $(this).addClass(options.cssClass);

		$(this).css({

			width: options.width + "px",

			height: options.height + "px"

		});


		// ----------------------------------------

		// create anchor links to make the structure simpler for manupilation

		// ----------------------------------------


		$(this).children("img").wrap(document.createElement("a"));

		$(this).children("a").attr("target", "blank");


		// ----------------------------------------

		// add item sequence markups

		// ----------------------------------------


		var i = 1;

		$(this).children("a").each(function(){

			$(this).attr("rel", i++);


		});



		// ----------------------------------------

		// create pagination and caption

		// ----------------------------------------


		$(this).append("<ul></ul>");

		$(this).append("<ol></ol>");

		var pagination = $(this).children("ul");

		var caption = $(this).children("ol");


		var i = 1;

		var j = 0;


		$(this).children("a").each(function(){

			pagination.append("<li><a href=\"#\">" + i++ + "</a></li>");

			caption.append("<li>" + $("#" + $(target).attr("id") + " img:nth(" + j++ + ")").attr("alt") + "</li>");


		});


		pagination.fadeTo(0, 1);

		caption.fadeTo(0, 0.6);

		caption.hide();


		// ----------------------------------------

		// shortcuts

		// ----------------------------------------


		var firstItem   = $(target).children("a:first");

		var lastItem    = $(target).children("a:last");

		var currentItem = firstItem;


		// ----------------------------------------

		// pagination highlight

		// ----------------------------------------


		var paginationHighlight = function(sequence){

			pagination.children("li").children("a").removeClass("current");

			pagination.children("li").children("a:nth(" + sequence + ")").addClass("current");


		}


		// ----------------------------------------

		// caption

		// ----------------------------------------


		var showCaption = function(sequence){

			caption.show();

			caption.children("li").hide();

			caption.children("li:nth(" + sequence + ")").fadeIn();


		}


		// ----------------------------------------

		// slideshow logic

		// ----------------------------------------


		var makeSlideshow = function(){


			// pagination click

			pagination.children("li").children("a").click(function(){

				if ( ! $(this).hasClass("current"))


				{

					// select the current item after the pagination click

					currentItem = $(target).children("a:nth(" + ($(this).text()-1) + ")");

					currentItem.show();

					startSlideshow();


				}


			});



			// pagination highlight

			paginationHighlight(currentItem.attr("rel")-1);


			// show caption

			if (options.caption == true)


			{

				showCaption(currentItem.attr("rel")-1);


			}


			// show the current slide

			currentItem.fadeIn(options.fadeSpeed*1000, function(){

				$(target).children("a").hide();

				$(this).show().css("z-index", 1);


			});


			// prepare for the next slide

			// determines the next item (or we need to rewind to the first item?)

			if (currentItem.children("img").attr("src") == lastItem.children("img").attr("src"))


			{

				currentItem = firstItem;

				currentItem.css("z-index", 2);


			}


			else


			{


				currentItem = currentItem.next();


			}



		};


		var startSlideshow = function(){

			clearInterval(instance);

			makeSlideshow();

			instance = setInterval(makeSlideshow, options.pauseSeconds*1000);


		};


		// ----------------------------------------

		// start the slideshow!

		// ----------------------------------------

		startSlideshow();


	};

})(jQuery);
