(function($) {

	$.fn.slide = function (options) {

		var dirLeft  = -1;
		var dirRight = 1;

		// définition des paramètres par défaut
		var defaults = {
			container : '',
			slider    : '',
			slides    : '',
			links     : '',
			way       : 'horizontal',
			direction : dirRight,//-1 <-, 1 ->
			effect    : 'slide',
			auto      : true,
			delay     : 5000,
			timer     : '',
			noactiv   : false//Paramètre court-circuit qui à true permet de ne pas modifier la class des liens
		};

		// mélange des paramètres fournis et des paramètres par défaut
		var opts = $.extend(defaults,options);

		var nbSlides    = opts.slides.size();
		var slideWidth  = parseInt(opts.slides.innerWidth());
		var sliderWidth = slideWidth*nbSlides;
		var indexOn     = 0;
		var indexMin    = 0;
		var indexMax    = nbSlides-1;
		var indexToGo   = null;

		/**Initialisation du module**/
		switch (opts.effect) {
			case 'slide' :
				opts.slider.css({
					width      : sliderWidth,
					height     : opts.container.height(),
					marginLeft : '0'
				});

				break;
			case 'fade' :
				opts.slides.each(function () {
					if ($(this).index() != 0) $(this).hide().css('opacity','0');
				});

				break;
		}

		//Création des liens cliquables
		if (opts.links) {
			if (!opts.noactiv) setActivLink();

			opts.links.children('a').click(function () {
				if ($(this).attr('rel').match('slide')) {
					indexToGo = $(this).attr('rel').replace('slide','')-1;
				} else {
					indexToGo = $(this).closest(opts.links.selector).index();
				}

				initAuto();//Met à jour le timer
				if (indexToGo != indexOn) move();//Lance l'animation si le slide a afficher n'est pas celui en cours

				return false;
			});
		}

		initDirection();
		initAuto();
		/****/

		/**
		 * Function move 
		 * 
		 * @description : Fonction gérant le lancement de l'animation
		 * @access : public
		 * @return : void
		 * @date : 2010-06-01
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function move() {
			
			if (opts.slides.length <= 1) return false;

			switch (opts.effect) {
				case 'slide' : slide(); break;
				case 'fade'  : fade(); break;
			}

			updateIndexOn();
			updateDirection();

			setActivLink();
			resetIndexToGo();
		}

		/**
		 * Function slide 
		 * 
		 * @description : Effectue le slide du slider 
		 * @access : public
		 * @return : void
		 * @date : 2010-06-01
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function slide() {
			var posToGo   = getPosToGo();
			var slideToGo = '';
			var prevSlide = '';

			//Effectuer le slide en fonction de la direction et du positionnement du slide
			if (opts.direction == dirRight && indexOn >= indexMin && indexOn < indexMax) {
				opts.slider.stop().animate({
					marginLeft: posToGo
				},'normal','easeInOutCubic');
			} else if (opts.direction == dirLeft && indexOn <= indexMax && indexOn > indexMin) {
				opts.slider.stop().animate({
					marginLeft: posToGo
				},'normal','easeInOutCubic');
			}
		}
	
		/**
		 * Function fade 
		 * 
		 * @description : Effectue le fadeIn / fadeOut des slides
		 * @access : public
		 * @return : void
		 * @date : 2010-06-01
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function fade() {
			var slideToMove = '';
			var prevSlide   = '';
			var indexToMove = getIndexToMove();

			if (opts.direction == dirRight && indexOn >= indexMin && indexOn < indexMax) {
				slideToMove = opts.slides.eq(indexToMove);
				prevSlide   = opts.slides.eq(indexOn);

			} else if (opts.direction == dirLeft && indexOn <= indexMax && indexOn > indexMin) {
				slideToMove = opts.slides.eq(indexToMove);
				prevSlide   = opts.slides.eq(indexOn);

			}
			if(slideToMove != '' && prevSlide != ''){
				//slideToMove.fadeIn();
				prevSlide.css('z-index','100');
				slideToMove.css('z-index','10');
				prevSlide.animate({opacity:0},1100,'easeInOutCubic',function(){
					$(this).hide();
				});
				slideToMove.css('display','block').fadeTo(1400,1);
				//prevSlide.fadeOut();
			}
		}

		/**
		 * Function initDirection 
		 * 
		 * @description : Initialise la direction à prendre 
		 * @access : public
		 * @return : void
		 * @date : 2010-06-04
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function initDirection() {
			if (indexToGo != null) {
				if (indexToGo < indexOn) {
					opts.direction = dirLeft;
				} else if (indexToGo > indexOn) {
					opts.direction = dirRight;
				} else if (indexToGo == indexOn) return false;
			}
		}

		/**
		 * Function resetIndexToGo 
		 * 
		 * @description : Remet l'indexToGo à null
		 * @access : public
		 * @return : void
		 * @date : 2010-06-04
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function resetIndexToGo() {
			indexToGo = null;
		}

		/**
		 * Function initAuto 
		 * 
		 * @description : Lance l'animation automatique et clear le timer si besoin
		 * @access : public
		 * @return : void
		 * @date : 2010-06-04
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function initAuto() {
			if (opts.auto) {
				if (opts.timer != '') clearInterval(opts.timer);

				opts.timer = window.setInterval(function () {move()},opts.delay);
			}
		}

		/**
		 * Function updateDirection 
		 * 
		 * @description : Met à jour la direction à prendre en fonction des limites atteintes
		 * @access : public
		 * @return : void
		 * @date : 2010-06-04
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function updateDirection() {
			if (opts.direction == dirRight && indexOn == indexMax) opts.direction = dirLeft;
			else if (opts.direction == dirLeft && indexOn == indexMin) opts.direction = dirRight;
		}

		/**
		 * Function updateIndexOn 
		 * 
		 * @description : Met à jour l'indexOn suivant le slide affiché
		 * @access : public
		 * @return : void
		 * @date : 2010-06-04
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function updateIndexOn() {
			if (indexToGo != null) indexOn = indexToGo;
			else {
				if (opts.direction == dirRight) indexOn++;
				else if (opts.direction == dirLeft) indexOn--;
			}
		}

		/**
		 * Function getSliderPosition
		 * 
		 * @description : 
		 * @access : public
		 * @return : void
		 * @date : 2010-06-01
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function getSliderPosition() {
			return parseInt(opts.slider.css('marginLeft'));
		}

		/**
		 * Function getPosToGo 
		 * 
		 * @description : Calcule la position à adopter pour le slide
		 * @access : public
		 * @return : void
		 * @date : 2010-06-04
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function getPosToGo() {
			var sliderPos = getSliderPosition();
			var posToGo = false;

			if (indexToGo != null) {
				posToGo = -(indexToGo*slideWidth);
			} else {
				if (opts.direction == dirRight) posToGo = sliderPos-slideWidth;
				else if (opts.direction == dirLeft) posToGo = sliderPos+slideWidth;
			}

			return posToGo;
		}

		/**
		 * Function getIndexToMove 
		 * 
		 * @description : Calcul l'index à afficher 
		 * @access : public
		 * @return : void
		 * @date : 2010-06-04
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function getIndexToMove() {
			var indexToMove = false;

			if (indexToGo != null) {
				indexToMove = indexToGo;
			} else {
				if (opts.direction == dirRight) indexToMove = indexOn+1;
				else if (opts.direction == dirLeft) indexToMove = indexOn-1;
			}

			return indexToMove;
		}

		/**
		 * Function setActivLink 
		 * 
		 * @description : Modifie les liens pour leur affecter la classe activ
		 * @access : public
		 * @return : void
		 * @date : 2010-06-01
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function setActivLink() {
			resetActivLink();

			if (opts.links && !opts.noactiv) {
				if (opts.links.children('a[rel=slide'+(indexOn+1)+']').length) opts.links.children('a[rel=slide'+(indexOn+1)+']').addClass('activ');
				if (opts.links.filter('.slide'+(indexOn+1)).children('a').length) opts.links.filter('.slide'+(indexOn+1)).children('a').addClass('activ');
			}
		}

		/**
		 * Function resetActivLink 
		 * 
		 * @description : Supprime la class activ de tous les liens
		 * @access : public
		 * @return : void
		 * @date : 2010-06-01
		 * @author : François Guémard <f.guemard@hegyd.com>
		 */
		function resetActivLink() {
			if (opts.links && !opts.noactiv) opts.links.children('a').removeClass('activ');
		}

		return $(this);
	};

})(jQuery);

