﻿/* 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.0 (May 13, 2008)
 * Requires: jQuery 1.2+
 *
 *
 * Modified by Matti Järvi (September 13, 2011)
 * - fixed bug in slides container width calculation
 *
 * Modified by Matti Järvi (September 12, 2011)
 * - set the slide change animation to honour the easing option
 *
 * Modified by Matti Järvi (September 7, 2011)
 * - added hidePrevNext option to control jFlowPrev and jFlowNext
 *   hide when in the first slide and in the last slide respectively
 * - added slideChanged option to dispatch the slide change event
 *
 * Modified by Matti Järvi (August 24, 2011)
 * - fixed bug in jFlowSlideContainer addition
 * - modified jQuery expressions to enable multiple jFlows in
 *   one page
 *
 * Modified by Roope Kärki (August 4, 2010)
 * - set the duration to constant, no matter how many slides is
 *   being jumped over
 *
 * Modified by Matti Järvi (June 9, 2010)
 * - added gotoSlide function to encapsulate common behaviour
 * - added jFlowToSlideControl to use any element on the page
 *   as a link to a certain slide
 * - changed to hide jFlowPrev when in the first slide
 * - changed to hide jFlowNext when in the last slide
 */
 
(function($) {

	$.fn.jFlow = function(options) {
		var opts = $.extend({}, $.fn.jFlow.defaults, options);
    var container = $(this);
		var cur = 0;
		var maxi = container.find(".jFlowControl").length;
    var slideMarginLeft = 0;
    var slideMarginRight = 0;
		
		var gotoSlide = function (toSlide, duration){
			container.find(".jFlowControl").removeClass("jFlowSelected");
			container.find(".jFlowControl").eq(toSlide).addClass("jFlowSelected");
			if (opts.hidePrevNext) {
        if (toSlide == 0) {
          container.find(".jFlowPrev").hide();
          container.find(".jFlowNext").show();
        } else if (toSlide == maxi - 1) {
          container.find(".jFlowPrev").show();
          container.find(".jFlowNext").hide();
        } else {
          container.find(".jFlowPrev").show();
          container.find(".jFlowNext").show();
        }
      }
			container.find(opts.slides).animate({
				marginLeft: "-" + (toSlide * container.find(opts.slides).find(":first-child").width() + "px")
			}, duration, opts.easing);
			cur = toSlide;
      if (opts.slideChanged != null) {
        opts.slideChanged(cur);
      }
		}
		
		container.find(".jFlowControl").each(function(i){
			$(this).click(function(){
				var dur = 1;
				gotoSlide(i, opts.duration*(dur));
			});
		});
		
		container.find(".jFlowToSlideControl").each(function(i){
			$(this).click(function(){
				var toSlide = parseInt($(this).find(".toSlide").text());
				var dur = 1;
				gotoSlide(toSlide, opts.duration*(dur));
			});
		});
		
		container.find(opts.slides).before('<div class="jFlowSlide"></div>').appendTo(container.find(".jFlowSlide"));
		
		container.find(opts.slides).children("div").each(function(){
			var marginLeft = parseInt($( this ).css("margin-left"));
      var marginRight = parseInt($( this ).css("margin-right"));
      if (marginLeft > slideMarginLeft) {
        slideMarginLeft = marginLeft;
        if( $.browser.msie && parseInt( $.browser.version ) == 6 ) {
          slideMarginLeft = marginLeft*2;
        }
      }
			if (marginRight > slideMarginRight) {
        slideMarginRight = marginRight;
        if( $.browser.msie && parseInt( $.browser.version ) == 6 ) {
          slideMarginRight = marginRight*2;
        }
      }
      $(this).before('<div class="jFlowSlideContainer"></div>').appendTo($(this).prev());
		});
		
		container.find(".jFlowControl").eq(cur).addClass("jFlowSelected");
		
		var resize = function (x){
			container.find(".jFlowSlide").css({
				position: "relative",
				width: opts.width,
				height: opts.height,
				overflow: "hidden"
			});
      
			container.find(opts.slides).css({
				position: "relative",
				width: (container.find(".jFlowSlide").width()+slideMarginLeft+slideMarginRight)*container.find(".jFlowControl").length+"px",
				height: container.find(".jFlowSlide").height()+"px",
				overflow: "hidden"
			});
      
			container.find(opts.slides).children().css({
				position: "relative",
				float: "left",
        width: container.find(".jFlowSlide").width()+"px",
				height: container.find(".jFlowSlide").height()+"px"
			});
			
			container.find(opts.slides).css({
				marginLeft: "-" + (cur * container.find(opts.slides).find(":first-child").width() + "px")
			});
		}
		
		resize();
		
		$(window).resize(function(){
			resize();						  
		});
		
		container.find(".jFlowPrev").click(function(){
			var toSlide = cur;
			if (toSlide > 0)
				toSlide--;
			else
				toSlide = maxi - 1;
			gotoSlide(toSlide, opts.duration);
		});
		
		container.find(".jFlowNext").click(function(){
			var toSlide = cur;
			if (toSlide < maxi - 1)
				toSlide++;
			else
				toSlide = 0;
			gotoSlide(toSlide, opts.duration);
		});
	};
	
	$.fn.jFlow.defaults = {
		width: "100%",
    height: "100%",
		duration: 400,
    easing: "swing",
    hidePrevNext: true,
    slideChanged: null
	};
	
})(jQuery);

