/**
* jQuery Slideshow
* by Equisoft (equisoft.com)
* Author: Savut Sang
*
* Usage:
* Ex: jQuery("#slides").slideshow();
* Ex: jQuery("#slides").slideshow( {'speed': 300, 'auto': false, 'transition' : 'slideUp'} );
* Ex: jQuery("#slides").slideshow( {'speed': 900} );
*
* Pause animation:  jQuery("#slides").slideshow( "pause" );
* Resume animation: jQuery("#slides").slideshow( "resume" );
* 
* Change default values for all instance:
* ex: jQuery.slideshow.defaults.speed = 900;
* ex: jQuery.slideshow.defaults.auto = false;
*
* FYI: $e represente tous le temps une instance individuel des selectors, donc equivalent du $(this) dans le each() loop.
*/
(function($) {
	$.slideshow = {
		// default options
		defaults: {
			speed: 500, 	/* (Integer) animation speed */
			auto: true,  	/* [true|false] change slides automatically */
			timeout: 7000, 	/* (Integer) milliseconds pour le auto scroll */
			transition: "fade", 	/* ["slideUp"|"slideLeft"|"fade"] */
			tabsSelector: ".tabs",
			slidesSelector: ".slides"
		},
		
		setOptions: function($e, options) {
			$e.data("jQuerySlideshowOptions", options);
		},
		
		getOptions: function($e) {
			return $e.data("jQuerySlideshowOptions");;
		},
		
		clearTimer: function($e){
			var opts = $.slideshow.getOptions($e);
			clearTimeout(opts.timer);
		},
		
		startTimer: function($e){
			var opts = $.slideshow.getOptions($e);
			$.slideshow.clearTimer($e); // dans le cas ou il nous reste un timer en cour, on veut le clear parce on restart un nouveau.
			
			opts.timer = setTimeout(function(){
				$.slideshow.timerHit($e);
			}, opts.timeout);
		},
		
		timerHit: function($e) {
			var opts = $.slideshow.getOptions($e);
			
			var nextIndex = opts.currentIndex + 1;
			if (nextIndex >= opts.countSlides) {
				nextIndex = 0;
			}
			
			$.slideshow.changeSlide($e, nextIndex);
			
			$.slideshow.startTimer($e);
		},
		
		changeSlide: function($e, index) {
			var opts = $.slideshow.getOptions($e);
			opts.currentIndex = index;
			
			// Gestion des tabs et change le current index a celui qui est clique
			$(opts.tabsSelector, $e).find(">li").removeClass("active");
			$(opts.tabsSelector, $e).find(">li:eq("+index+")").addClass("active");
			
			switch (opts.transition) {
				case 'slideUp':
					var topPosition = opts.slideHeight * -1;
					
					$(opts.slidesSelector, $e).append("<li>" + opts.items[index] + "</li>");
					$(opts.slidesSelector, $e).animate({'top': topPosition}, opts.speed, function(){
						$(opts.slidesSelector, $e).find(">li:first").remove();
						$(opts.slidesSelector, $e).css('top', 0);
					});
					break;
				case 'slideLeft':
					leftPosition = opts.slideWidth * -1;
					
					$(opts.slidesSelector, $e).append("<li>" + opts.items[index] + "</li>");
					$(opts.slidesSelector, $e).animate({'left': leftPosition}, opts.speed, function(){
						$(opts.slidesSelector, $e).find(">li:first").remove();
						$(opts.slidesSelector, $e).css('left', 0);
					});
					break;
				case 'fade':
					$(opts.slidesSelector, $e).find("li:visible").fadeOut(opts.speed);
					$(opts.slidesSelector, $e).find(">li:eq("+index+")").fadeIn(opts.speed);
					break;
			}
			
			// restart the timer if auto (keep going)
			if (opts.auto == true) {
				$.slideshow.startTimer($e);
			}
		}
	}
	
	
	/**
	 * params peut etre un objet pour l'initialisation
	 * ou un string pour une commande
	 */
	$.fn.slideshow = function(params) {
		if (typeof params == 'string') {
			
			return this.each(function() {
				var $e = $(this);
				
				switch (params) {
					case "pause":
						$.slideshow.clearTimer($e);
						break;
						
					case "resume":
						$.slideshow.startTimer($e);
						break;
				}
			});
			
		} else {
		
			// Continue pour creation
			var options = $.extend({}, $.slideshow.defaults, params);
			
			// selector options
			return this.each(function() {
				var $e = $(this);
				
				// instance options
				var opts = $.extend({}, options, {
					timer: null,
					items: null,
					currentIndex: 0,
					countSlides: $(options.slidesSelector, $e).find(">li").length,
					slideHeight: $(options.slidesSelector, $e).find(">li:first").height(),
					slideWidth: $(options.slidesSelector, $e).find(">li:first").width()
				});
				
				var $t = $(opts.tabsSelector, $e);
				var $s = $(opts.slidesSelector, $e);
				
				// On sauvegarde l'options dans l'objet mere, cela permet d'appeler encore l'objet et d'avoir access a ses options
				$.slideshow.setOptions($e, opts);
				
				// Ajoute le container "slidesContainer" s'il n'existe pas
				if ($(".slidesContainer", $e).length == 0) {
					$s.wrap($("<div/>").addClass("slidesContainer"));
				}
				
				// Transition effect between slide
				
				switch (opts.transition) {
					case 'slideUp':
						opts.items = new Array;
						$s.addClass("slides-vertical");
						$s.find(">li").each(function(index){
							opts.items.push( $(this).html() );
							if (index > 0) {
								$(this).remove();
							}
						});
						break;
					case 'slideLeft':
						opts.items = new Array;
						$s.width( opts.slideWidth * 2 );
						$s.addClass("slides-horizontal");
						$s.find(">li").each(function(index){
							opts.items.push( $(this).html() );
							if (index > 0) {
								$(this).remove();
							}
						});
						break;
					case 'fade':
						$s.addClass("slides-absolute");
						$s.find(">li:first").show();
						break;
				}

				// Ajoute les events pour les tabs, quand on click sur un tabs, ca affiche le content
				// et ca clear le timer automatic rotation
				var tabIndex = 0;
				$t.find(">li").each(function(){
					$(this)
						.data("tabIndex", tabIndex)
						.click(function(){
							$.slideshow.changeSlide($e, $(this).data("tabIndex"));
						});
					tabIndex++;
				});
				
				/**
				 * Initial
				 */
				$t.find(">li:first").addClass("active");
				opts.currentIndex = 0;
				
				// Demarre le timer pour Auto
				if (opts.auto == true) {
					$.slideshow.startTimer($e);
				}
			});
			
		}
	};

})(jQuery);
