/* Copyright (c) 2008 Kean Loong Tan http://www.gimiti.com/kltan
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * jFlow
 * Version: 1.1 (May 22, 2008)
 * Requires: jQuery 1.2+
 */
(function($) {
	$.fn.jFlow = function(settings) {
		$(window).data("jflow-busy", false);

		var config = $.extend( {}, $.fn.jFlow.defaults, settings);
		var currentSlide = 0;
		var numberOfSlides = $(".jFlowControl").length;
		var plugin = this;
		
		$(document).bind("jFlow.jumpToSlide", function(e, slideNumber) {			
			slideNumber = slideNumber - 1;
			var slideIndex = slideNumber;
			var slide = $(plugin).find(".jFlowControl").eq(slideNumber);			

			$(".jFlowControl").removeClass(
					"jFlowSelected");
			slide.addClass(
					"jFlowSelected");
			var H = Math.abs(currentSlide
					- slideIndex);

			var clickedElement = slide[0];

			$(config.slides)
					.animate(
							{
								marginLeft : "-"
										+ (slideIndex
												* $(
														config.slides)
														.find(
																":first-child")
														.width() + "px")
							},
							config.duration
									* (H),
							function() {
								config
										.onRandomNavigationTransitionEnded(clickedElement);
							});
			currentSlide = slideIndex;
		});
		
		$(config.slides).before('<div id="jFlowSlide"></div>').appendTo(
				"#jFlowSlide");
		$(config.slides).find("div").each(
				function() {
					$(this).before('<div class="jFlowSlideContainer"></div>')
							.appendTo($(this).prev());
				});
		$(".jFlowControl").eq(currentSlide).addClass("jFlowSelected");
		var C = function(G) {
			$("#jFlowSlide").css( {
				position : "relative",
				width : config.width,
				height : config.height,
				overflow : "hidden"
			});
			$(config.slides).css(
					{
						position : "relative",
						width : $("#jFlowSlide").width()
								* $(".jFlowControl").length + "px",
						height : $("#jFlowSlide").height() + "px",
						overflow : "hidden"
					});
			$(config.slides).children().css( {
				position : "relative",
				width : $("#jFlowSlide").width() + "px",
				height : $("#jFlowSlide").height() + "px",
				"float" : "left"
			});
			$(config.slides).css(
					{
						marginLeft : "-"
								+ (currentSlide
										* $(config.slides).find(":first-child")
												.width() + "px")
					});
		};
		C();
		$(window).resize(function() {
			C();
		});
		$(".jFlowPrev")
				.mousedown(function() {
					if($(window).attr("flow-busy"))				
						return false;
					$(window).attr("flow-busy", "yes");
				})
				.click(
						function() {
							if (currentSlide > 0) {
								currentSlide--;
							} else {
								// Don't wrap
								//currentSlide = numberOfSlides - 1;
								return false;
							}
							
							config.onPrevClicked(this);
							var clickedElement = this;
							
							$(".jFlowControl").removeClass("jFlowSelected");
							$(config.slides)
									.animate(
											{
												marginLeft : "-"
														+ (currentSlide
																* $(
																		config.slides)
																		.find(
																				":first-child")
																		.width() + "px")
											}, config.duration,
											function() {
												$(window).removeAttr("flow-busy");
												config
														.onPrevClickedTransitionEnded(clickedElement);												
											});
							$(".jFlowControl").eq(currentSlide).addClass(
									"jFlowSelected")
						});
		$(".jFlowNext")
				.mousedown(function() {
					if($(window).attr("flow-busy"))			
						return false;
					$(window).attr("flow-busy", "yes");
				})
				.click(
						function() {														
							if (currentSlide < numberOfSlides - 1) {
								currentSlide++;
							} else {
								// Don't wrap								
								//currentSlide = 0;
								return false;
							}										

							config.onNextClicked(this);
							var clickedElement = this;

							$(".jFlowControl").removeClass("jFlowSelected");
							$(config.slides)
									.animate(
											{
												marginLeft : "-"
														+ (currentSlide
																* $(
																		config.slides)
																		.find(
																				":first-child")
																		.width() + "px")
											},
											config.duration,
											function() {
												$(window).removeAttr("flow-busy");
												config
														.onNextClickedTransitionEnded(clickedElement);
											});
							$(".jFlowControl").eq(currentSlide).addClass(
									"jFlowSelected")
						});
	};
	$.fn.jFlow.defaults = {
		easing : "swing",
		duration : 400,
		width : "100%",
		onNextClicked : function() {
		},
		onNextClickedTransitionEnded : function() {
		},
		onPrevClicked : function() {
		},
		onPrevClickedTransitionEnded : function() {
		},		
		onRandomNavigationTransitionEnded : function() {
		}
	};
})(jQuery);