(function ($) {
	/**	
	 * plugin à chainer directement sur le container des images permet de les faire défiler avec différentes transitions.
	 * @version 1.0.3
	 * @author Yann Vignolet - Les ateliers Apicius
	 * @param interval : temps en milliseconde entre deux transitions par defaut reglé à 3000
	 * @param transition : type de transition 'fade' ou 'slide'
	 * @return this
	 */
	$.fn.laaCarousel = function (interval, transition) {
		/**
		 * self : egale a this dans tout les contexte du plugin
		 * timer : temps en milliseconde entre deux transitions
		 * nbElement : nombre d'image dans this
		 * elementCourant : image actuellement active dans le defilement
		 * elementPrecedent : image qui était précédement active dans le défilement
		 * mode : type de transition
		 * largeur : largeur en px de this
		 */
		var self = this , timer = (interval && typeof interval === 'number')?interval:3000 , nbElement = 1 , elementCourant = 1 , elementPrecedent = null , mode = (transition)?transition:'fade',largeur = null,tempo=null;
		/**
		 * Methode qui initialise le container et les images. Il est executé en premier
		 */
		this.init = function() {
			$(this).addClass('carouselcontainer');
			this.find("img").each( function(index) {
				$(this).addClass('carousel');
				$(this).attr('id', 'carousel'+(index+1));
			});
			largeur = this.width();
			nbElement = self.find('.carousel').length;
			elementPrecedent = nbElement;
			$('.carousel').stop(true,true);
			if(nbElement>1){
			switch (mode) {
				case 'fade':
					this.find(".carousel").hide();
					this.find(".carousel:first").show();
					
					break;
				case 'slide':
					this.find(".carousel").css({
						'left':largeur
					});
					this.find(".carousel:first").css({'left': 0});
					
					break;
			}
			this.run();
			}
			
		};
		this.run=function(){
			
			
			switch (mode) {
				case 'fade':
					this.fade();
					break;
				case 'slide':
					this.slide();
					break;
			}
			
		}
		/**
		 * methode renvoi le numero de l'image desormée active durant le défilement
		 * @return num numero de l'image active
		 */
		this.suivant= function() {
			var num = 0;
			num  = Number(elementCourant) + 1;
			if(num  > nbElement) {
				num  = 1;
			}

			return num;
		};
		/**
		 * methode qui gere la transition 'fade', les images passe d'un etat de transparance totale à un etat d'opacité totale
		 */
		this.fade= function() {
			nbElement = self.find('.carousel').length;

			elementPrecedent = elementCourant;
			elementCourant=this.suivant();

			$('#carousel'+elementCourant).delay(timer).fadeIn(1200, function() {

				$('#carousel'+elementPrecedent).fadeOut();
				self.fade();
				
			});
		};
		/**
		 * methode qui gere la transition 'slide', defilement horizontale des images.
		 */
		this.slide= function() {
			elementPrecedent = elementCourant;
			elementCourant=this.suivant();

			$('#carousel'+elementPrecedent).animate({
				'left': '-'+largeur+'px'
			}, 'slow', function() {

			});
			
			$('#carousel'+elementCourant).css({'left': largeur+'px'}).animate({'left':0}, 'slow', function() {
				
			});
		};
		this.init();//lance par defaut la methode init() à l'appel du plugin sur un objet jQuery
		
		return this;
	};
})(jQuery);
