(function($) {
        // Définition du plugin jQuery 
        $.fn.sliderTE = function(p) {
        	// Paramètres par défaut
			var params = {
				id:'',
				decalX: 534,
				isBoucle: false,
				rapidite: 'slow',
				isDesactiveButton: true,
				isAnimButton: true,
				buttonPosition: false,
				animateSlider: false,
				TimeAnimate: 5000,
				
				nbImg: 0,
				nbImgAffiche: 6,
				maxX: 0,
				offsetX: 0,
				isAnim: false
			};

			// On remplace les paramètres par défaut par ceux de l'user
			params = $.extend(params, p);
			params.id = $(this).attr('id');
			params.nbImg = $('#' + params.id + ' li').length;
			params.maxX = params.decalX*(params.nbImg-1);
			
			if (params.nbImgAffiche>1){
				nbGroupeImg = params.nbImg/params.nbImgAffiche;
				objRegExp = /^[0-9]+[.,][0-9]+$/;
				if(!objRegExp.exec(nbGroupeImg))
				{
					nbGroupeImg = parseInt(nbGroupeImg-1);
				}
				else
				{
					nbGroupeImg = parseInt(nbGroupeImg);
				}
				params.maxX = params.decalX*nbGroupeImg;
			}
			//on met les boutons de position à la bonne position au début.
			changePositionButton();
			
			// On cré les événements sur les boutons déclarés
			$('.btn-slider-' + params.id).each(function(index) {
				// Split sur l'événement
				var event = $(this).attr('alt').split('-');
				
				// Bind le click pour l'événement
				$(this).bind('click', function() {
					// Si une animation n'est pas déjà en cours
					if(params.isAnim == false)
					{
						params.isAnim = true;
						
						// Calcul l'emplacement de l'élément demandé
						switch(event[0])
						{
							// Décalement à droite
							case 'g' : 
								animRight(event[1], params.offsetX);
								break;
							
							// Décalement à gauche
							case 'd' :
								animLeft(event[1], params.offsetX);
								break;
							
							// Accès direct à un item
							case 'i' :
								params.offsetX = -parseInt((params.decalX*event[1]));
								changePositionButton();
								break;	
						}
						
						// Vérifie les options et exécute les fonctions demandées
						if (params.isDesactiveButton && !params.isBoucle)
						{
							switch (event[0])
							{
								case 'd' : 
									if(params.offsetX==0)
									{
										$(this).addClass('next-stop');
										$(this).removeClass('next-play');
									}
									else
									{
										$(this).removeClass('next-stop');
										$(this).addClass('next-play');
										$('.btn-slider-' + params.id + '[alt^="g-"]').each(function(index){$(this).addClass('prev-play');$(this).removeClass('prev-stop');});
									}
									break;

								case 'g' :
									if(params.offsetX== -parseInt(params.maxX)){
										$(this).addClass('prev-stop');
										$(this).removeClass('prev-play');
									}
									else
									{
										$(this).removeClass('prev-stop');
										$(this).addClass('prev-play');
										 $('.btn-slider-' + params.id + '[alt^="d-"]').each(function(){
											 $(this).addClass('next-play');$(this).removeClass('next-stop');});

									}
									break;		
							}
						}
						
						// Anim l'UL
						$('#' + params.id).animate({left: params.offsetX+"px"}, params.rapidite, function()
						{
							params.isAnim = false;
						});	
					}
				});
								
				if(params.isAnimButton)
				{
					switch (event[0])
					{
						case 'd' : 
							$(this).bind('mouseover', function() {
								$(this).addClass('next-hover');
								$(this).removeClass('next-play');
							});
							$(this).bind('mouseout', function(){
								$(this).addClass('next-play');
								$(this).removeClass('next-hover');
							});
						break;
						
						case 'g':
							$(this).bind('mouseover', function(){
								$(this).addClass('prev-hover');
								$(this).removeClass('prev-play');
							});
							
							$(this).bind('mouseout', function(){
								$(this).addClass('prev-play');
								$(this).removeClass('prev-hover');
							});
						break;
					}
				}
			});
			
			function changePositionButton(){
				if (params.buttonPosition)
				{
					$('#bouton_slider div').each(function(index){
						$(this).removeClass("position_selected");
						$(this).removeClass("bouton_position_slider");
						if(index == -(params.offsetX/params.decalX)){
							$(this).addClass("position_selected");
						}
						else{
							$(this).addClass("bouton_position_slider");
						}
					});
				}
			};
			
			if(params.animateSlider)
			{

					var timer = window.setInterval(animAuto,params.TimeAnimate);
			}
				
			function animAuto()
			{
				$('#avant').click();
				/*if(params.isAnim == false)
				{
					params.isAnim = true;
				}*/
			}
			
			function animRight(val, offsetTemp){
				params.offsetX = parseInt(params.offsetX-(params.decalX*val));
				
				// Si on dépasse le tableau
				if(params.offsetX < -params.maxX)
				{
					// Si on ne boucle pas, on vas au dernier élément
					if(!params.isBoucle)
					{
						params.offsetX = -parseInt(params.maxX);
					}
					// Si on boucle, on calcul
					else
					{
						actualImage = parseInt((-offsetTemp)/params.decalX+1);
						imgSuivante = val - (params.nbImg - actualImage);
						while (imgSuivante >= parseInt(params.nbImg+1))
						{
							imgSuivante = imgSuivante-params.nbImg;
						}
						params.offsetX = -(imgSuivante-1)*params.decalX;
						//params.offsetX = (params.offsetX < params.maxX)? parseInt(offsetTemp-((val-params.nbImg)*params.decalX)) : -parseInt(offsetTemp-((val-params.nbImg)*params.decalX));
					}
				}
				changePositionButton();
			};
			
			function animLeft(val, offsetTemp){
				params.offsetX = parseInt(params.offsetX+(params.decalX*val));
				
				// Si on dépasse le tableau
				if(params.offsetX > 0)
				{
					// Si on ne boucle pas, on vas au premier élément
					if(!params.isBoucle)
						params.offsetX = 0;
					// Si on boucle, on calcul
					else
					{
						actualImage = parseInt((-offsetTemp)/params.decalX+1);
						imgSuivante = actualImage-val;
						while(imgSuivante <= 0)
						{
							imgSuivante = params.nbImg + imgSuivante;
						}
						params.offsetX = -(imgSuivante-1)*params.decalX;
						//params.offsetX = (val < params.nbImg-1)? parseInt(offsetTemp-((params.nbImg-val)*params.decalX)) : -parseInt(offsetTemp-((params.nbImg-val)*params.decalX));
					}
				}
				changePositionButton();
			};
        };
})(jQuery);
