(function ($) {
	/**	
	 * plugin à chainer directement sur le container des images permet de les faire défiler avec différentes transitions.
	 * @version 1.0.2
	 * @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;
		/**
		 * Methode qui initialise le container et les images. Il est executé en premier
		 */
		this.init = function() {
			
			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;
			this.css({
				'position':'relative',
				'overflow':'hidden'
			});
			this.find(".carousel").css({
				'position':'absolute'
			});
			if(nbElement>1){
			switch (mode) {
				case 'fade':
					this.find(".carousel").hide();
					this.find(".carousel:first").show();
					this.fade();
					break;
				case 'slide':
					this.find(".carousel").css({
						'left':largeur
					});
					this.find(".carousel:first").css({'left': 0});
					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() {
			elementPrecedent = elementCourant;
			elementCourant=this.suivant();
	
			$('#carousel'+elementCourant).delay(timer).fadeIn(2000, function() {
				$('#carousel'+elementPrecedent).fadeOut(2000);
				self.fade();
			});
		};
		/**
		 * methode qui gere la transition 'slide', defilement horizontale des images.
		 */
		this.slide= function() {
			elementPrecedent = elementCourant;
			elementCourant=this.suivant();

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

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