jQuery.fn.melodySlide = function(params)
{ 
	/*
	 * by Melody - http://www.melody-script.com
	 * 
	 * params.timeSlide = tps entre chaque slide (int en milliseconde)
	 * params.nextBtn = id du bouton suivant (ex:"#btnNext")
	 * params.prevBtn = id fu bouton precedent (ex:"#btnPrev")
	 * params.gap = ecart entre les slide (int en px)
	 * params.duration = temps d'animation du slide (int en milliseconde)
	 * params.stopOver = stop le slide quand on passe la souris dessu (true ou false)
	 * params.autoPlay = anim tous seul le slide (true ou false)
	 */
	
	//Initialisation des params ou fusion avec les params de l'utilisateur
	params = $.extend({ 
		timeSlide: 4000, 
		nextBtn: "", 
		prevBtn: "", 
		gap: 20, 
		duration: 1500, 
		stopOver: true, 
		autoPlay: true 
	}, params);
	
	
	/*************************************/
	/********* LA CONFIGURATION **********/
	/*************************************/
	var idContainer = $(this).attr('id'); //Recuperation de l'id du container
	var containerWidth = $(this).width(); //Recuperation de la Width du container
	var containerHeight = $(this).height(); //Recuperation de la Height du container
	var nbSlide = $(this).children('div').size(); //Initialisation du nombre d'element dans le slide 
	var sliderName = "melodySlider"; //On determine le nom de la class utilise pour le slider
	var sliderDefaultPosition = $(this).css('position'); //On recupere la valeur css de l'attribut position
	var widthSlider = (Number(containerWidth)+Number(params.gap))*nbSlide; //On calcule la taille de notre slider
	var widthPerSlide = Number(containerWidth)+Number(params.gap);
	var mouseOver = 0; //On determine que par default la souris n'est pas sur le container
	var pos = 1; //On determine que par default le slide commence a la vue numeros 1
	
	//Si l'attribut position par default du container est different de "relative", "absolute" et "fixed"
	//On l'initialise sur "relative"
	if(sliderDefaultPosition != "relative" && sliderDefaultPosition != "absolute" && sliderDefaultPosition != "fixed")
		$(this).css('position', 'relative');
	
	//On configure le container pour qu'il cache tout ce qui va depasser
	$(this).css('overflow', 'hidden');
	
	//On entoure tout les elements interne d'un div slider
	$(this).children('div').wrapAll('<div class="'+sliderName+'" />');
	
	//On configure le slider
	$(this).children('.'+sliderName).css(
	{
		'position': 'absolute', 
		'top': '0px',
		'left': '0px',
		'width': widthSlider+'px',
		'height': containerHeight+'px'
	});

	//On configure chacune des div contenu dans le slider
	$(this).children('.'+sliderName).children('div').css(
	{
		'width': containerWidth+'px',
		'height': containerHeight+'px',
		'float': 'left',
		'margin-right': params.gap+'px'
	});
	
	//On ajoute un element avec un style clear:both pour arreter le float:left dans le slider
	$(this).children('.'+sliderName).append('<br style="clear: both;" />');
	
	//On ajoute un div de debug ie7 pour le overflow hidden du container;
	$(this).prepend('<div></div>');
	/*************************************/
	
	
	
	/*************************************/
	/***** LES ECOUTEURS D'EVENEMENTS ****/
	/*************************************/
	//Si le paramettre stopOver est configure sur true
	//On permet a l'utilisateur de stoper l'animation en survolant le container
	if(params.stopOver)
	{
		$('#'+idContainer).bind('mouseover', function(){ mouseOver = 1; });
		$('#'+idContainer).bind('mouseout', function(){ mouseOver = 0; });
	}
	
	//Si nextBtn est reference
	if(params.nextBtn != "")
	{
		//On ajoute un ecouteur d'evenement permettant de passer au slide suivant au click
		$(params.nextBtn).bind('click', function(){ goNextSlide(); });
		//Et si stopOver est configure sur true 
		//alors on ajoute les ecouteur d evenement pour stopper l'animation
		if(params.stopOver)
		{
			$(params.nextBtn).bind('mouseover', function(){ mouseOver = 1; });
			$(params.nextBtn).bind('mouseout', function(){ mouseOver = 0; });
		}
	}
	
	//Si prevBtn est reference
	if(params.prevBtn != "")
	{
		//On ajoute un ecouteur d'evenement permettant de passer au slide precedent au click
		$(params.prevBtn).bind('click', function(){ goPrevSlide(); });
		//Et si stopOver est configure sur true 
		//alors on ajoute les ecouteur d evenement pour stopper l'animation
		if(params.stopOver)
		{
			$(params.prevBtn).bind('mouseover', function(){ mouseOver = 1; });
			$(params.prevBtn).bind('mouseout', function(){ mouseOver = 0; });
		}
	}
	
	/*************************************/
	
	
	
	/*************************************/
	/********** LES FONCTIONS ************/
	/*************************************/
	function goNextSlide()
	{
		pos++; //On incremente la position du slide de 1
		if(pos<nbSlide+1) //On test si le slide suivant existe
		{
			moveSlide();
		}
		else //Sinon on rembobine le slide
		{
			pos = 1;
			moveSlide();
		}
	}
	
	function goPrevSlide()
	{
		pos--; //On decremente la position du slide de 1
		if(pos>0) //On test si le slide precedent et superieur a 0
		{
			moveSlide();
		}
		else //Sinon on envoie au dernier slide
		{
			pos = nbSlide;
			moveSlide();
		}
	}
	
	function moveSlide()
	{		
		//On calcule la nouvelle position du slide
		var newLeft = (pos*widthPerSlide)-widthPerSlide;
		//On applique la nouvelle position avec animation
		$('#'+idContainer).children('.'+sliderName).stop().animate({ left: -newLeft+'px' },params.duration);
	}
	/*************************************/
	
	
	//On lance l'anim si autoplay est configurer sur true
	if(params.autoPlay)
		var intervalSlide = setInterval(function(){ if(mouseOver == 0) goNextSlide(); }, Number(params.timeSlide)+Number(params.duration));
};
