/*--------------------------------------------------
  Fonction Défilement de slide
  
  @paramètre:
  
	@vitesse : vitesse de défilement d'un slide
	@pause : Pause entre le défilement de 2 slide
	@taille : taille d'un slide
	@btn : activation d'un menu de bouton
		@btnContent : ou est le contneur des boutons
		@btn_normal : chemin de l'image du bouton normal
		@btn_select : chemin de l'image du btouon selectionné
	@auto : défilement automatique des slide
	
	
  Structur attendu:
  
  <div class="cadre">
		<div class="slide">
			<!--content-->
		</div>
		<div class="slide">
			<!--content-->
		</div>
		...
		
		<!-option->
		<div id="compteur"></div>
   </div>

-------------------------------------------------*/



(function($) {
        // définition du plugin jQuery
        $.fn.slider = function(params) {
		
                // Fusionner les paramètres par défaut et ceux de l'utilisateur
                params = $.extend( {vitesse: 1000, pause: 4000, taille:0,classSlide:"slide", btnContent:"#nav_slide", puce_navigation:"",btn_navigation:"",navigation_limite:true, navigation_sens:false, auto:true,multiSlide:0}, params);
				
				/*-------------------------------
				variable globale du slider
				--------------------------------*/
	
				//Ou est le cadre engloban les slide
				var context=$(".cadre",this);
				
				//ou sont les slide
				var unSlide=params.classSlide;//<--- mettre une erreur quand il return null!!!!!
				
				//ou est le compteur de slide
				var menu=params.btnContent;
				//nom du conteneur des puce
				var contextPuce="groupe_puce";
				//non du conteneur des flcèeh
				var contextNav="groupe_nav";
				
				//largeur d'une page
				var tailleSlide=params.taille;
				//vitesse de défilement
				var vitesse=params.vitesse;
				//temps de pause entre 2 défilement
				var tempsPause=params.pause;
	
				var sensDef=params.navigation_sens;
	
				//image des puces
				var btnPuce=params.puce_navigation;
				var btnNav=params.btn_navigation;
				
				//mode automatique
				var auto=params.auto;
				//gestion bouton
				var btnOn=params.btn;
				
				//varible de gestion
				var slides=null;
				var nbSlide=0;
				var slideAffiche=0;
				var timeoutID;
				var action=0;
				
				//on lance le script
				initSlider();
				
				
				/*-----------------------------------------
				  0n atten le chargement des images
				------------------------------------------*/
				/*function chargement(pContext,lance){
					var context=$(pContext);
					var nb=$("img",context).length;
					var timerId="";
	
					if(teste()==0){
						if(timerId!=""){
							clearTimeout(timerId);
						}
						//on lance
						lance();
					}else{
						//on reteste
						timerId=setTimeout("teste()",500);
					}
					//on test la largeur de toute les images
					function teste(){
						var compteur=0;
						for(var i=0; i<nb; i++){
							var temp=$("img:eq("+i+")",context).width();
							if(temp==0){
								compteur=1;
							}
						}
						return compteur;
					}
					//
					var r=Math.random();
				}*/
				
				/*-----------------------------------------
				  Intialisation du slider
				------------------------------------------*/
				function initSlider(){
			
					/**/
						//alert($(".contenuCarroussel",context).length);
						
					if( $("."+unSlide,context).length==1){
					
						$(menu).css({"display":"none"});
					
					}
					
					//on transforme si on a défini un multislide
					if(params.multiSlide>0){
					
						//on initialise les variables
						slides=$("."+unSlide,context);
						nbSlide=slides.length;
					
						//on supprimme tous les slide
						for(var i=0;i<nbSlide;i++){
							$(slides[i]).remove();
						}
						
						//le nombre de planche
						var nbPlanche=Math.ceil(nbSlide/params.multiSlide);
						var tempsSlideEnCour=0;
						
						//on regroupe des slides dans les autre pour former des groupe de slide
						for(var y=0;y<nbPlanche; y++){
						
							var tempSlide="<div class='"+unSlide+"'>";
							
							for(var z=0;z<params.multiSlide;z++){
								tempSlide+="<div class='sous_"+unSlide+"'>"+$(slides[tempsSlideEnCour]).html()+"</div>";
								tempsSlideEnCour++;
							}
							
							tempSlide+="</div>";
							
							$(context).append(tempSlide);
						}
						
						
					}
				
					
					//on applique les styles abligatoires
					if(tailleSlide!=0){
						//si la taille d'un slide est défini
						$("."+unSlide,context).css({"width":tailleSlide+"px", "float":"left"});
						$(context).css({"position":"absolute","top":"0px","left":"0px","width":(300+tailleSlide*2)+"px"});
					}else{
						//sinon on la calcule
						$("."+unSlide,context).css({"float":"left"});
						$(context).css({"position":"absolute","top":"0px","left":"0px","width":(300+$("."+unSlide,context).width()*2)+"px"});
					}
					
	
					//on initialise les variables
					slides=$("."+unSlide,context);
					nbSlide=slides.length;
					
					
					//on laisse que 1 slide sur la scène
					for(var i=1;i<nbSlide;i++){
						$(slides[i]).remove();
					}
					
					//on ajoute une class au slides
					for(var i=0;i<nbSlide;i++){
						$(slides[i]).attr("class",unSlide+" "+i);
					}
					
					//on créé les boutons de navigation
					if(btnPuce!=""){
						creeBtn();
					}
					if(btnNav!=""){
						creeBtnNav();
					}
					
					//on lance le défilement automatique
					if(auto){
						defilementAuto();
					}
					
					
					
				}
				

				
				
				
				/* Function defilementAuto() active un Timer pour le défilement automatique */
				function defilementAuto(){
					 timeoutID = window.setTimeout(autoDefile,tempsPause);
				}
				
				/* function auto(), fait défilé la slide suivante */
				function autoDefile(){
					suivant(nextSlide());
				}
				
				
				
				/*-----------------------------------------
					On créé les bouton de navigation 
				------------------------------------------*/
				function creeBtn(){
					$(menu).append("<div class='"+contextPuce+"' ></div>");
					
					for(var i=0;i<nbSlide;i++){
						//si c'est le premier on lui mais la puce selectioner
						if(i==0){
							//on créé un bouton
							var btn="<div class='btn_puce' style='background:url("+btnPuce.btn_select+") no-repeat;'></div>";
						//sinon
						}else{
							//on créé un bouton
							var btn="<div class='btn_puce' style='background:url("+btnPuce.btn_normal+") no-repeat;'></div>";
						}
						//on les ajoutent et on les rends clicable
						
						
						$(menu+" ."+contextPuce).append($(btn).click(allerA));
						
					}
					
				}
				
				function creeBtnNav(){
					//on créé les bouton suivant et précédent
					$(menu).append("<div class='"+contextNav+"' ></div>");
					
					if(params.navigation_limite==true){
						var btn="<div class='retour' style='background:url("+btnNav.btn_precedentD+") no-repeat;'></div>";
					}else{
						var btn="<div class='retour' style='background:url("+btnNav.btn_precedent+") no-repeat;'></div>";
					}
					$(menu+" ."+contextNav).append($(btn).click(precedentNav).css({"cursor":"pointer"}));
					
					var btn="<div class='suivant' style='background:url("+btnNav.btn_suivant+") no-repeat;'></div>";
					$(menu+" ."+contextNav).append($(btn).click(suivantNav).css({"cursor":"pointer"}));
				}
				
				/*---------------end---------------------*/
				
				
				/*-------------------------------------------------
				  Function btnMaje, mais a jour l'état du compteur
				---------------------------------------------------*/
				function btnMaje(num){
					for(var i=0;i<nbSlide;i++){	
						if(i==num){
							$(menu+" ."+contextPuce+" .btn_puce:eq("+i+")").css({"background":"url("+btnPuce.btn_select+") no-repeat"});
						}else{
							$(menu+" ."+contextPuce+" .btn_puce:eq("+i+")").css({"background":"url("+btnPuce.btn_normal+") no-repeat"});
						}
					}
				}
				
				
				function btnMajNav(){
					//alert(slideAffiche+" "+nbSlide);
					if(slideAffiche==nbSlide-1 && params.navigation_limite==true){
						$(menu+" ."+contextNav+" .suivant").css({"background":"url("+btnNav.btn_suivantD+")"});
						
					}else{
						$(menu+" ."+contextNav+" .suivant").css({"background":"url("+btnNav.btn_suivant+")"});
					}
					
					if(slideAffiche==0  && params.navigation_limite==true){
						$(menu+" ."+contextNav+" .retour").css({"background":"url("+btnNav.btn_precedentD+")"});
					}else{
						$(menu+" ."+contextNav+" .retour").css({"background":"url("+btnNav.btn_precedent+")"});
					}
				}
				
				/*-------------------------end-------------------------------------------*/
				
				
				/*---------------------------------------------------------------------------
						Function de défilement
				----------------------------------------------------------------------------*/
				
				
				/*------------------------------
					click sur flèche
				--------------------------------*/
				
				function suivantNav(){
					btnMajNav();
					if(params.navigation_limite!=true){
						suivant(nextSlide(),"+");
					}else{
						if(nextSlide()==0){
							
						}else{
							suivant(nextSlide(),"+");
						}
					}
				}
				
				function precedentNav(){
					btnMajNav();
					if(params.navigation_limite!=true){
						suivant(oldSlide(),"-");
					}else{
						if(oldSlide()==nbSlide-1){
							
						}else{
							suivant(oldSlide(),"-");
						}
					}
				}
				/*---------------End---------------------*/
				
				
				
				/* fonction allerA est activé lors d'un clique, elle affiche le slide suivant l'index de l'objet cliqué*/
				function allerA(){
					
					if($(this).index()>slideAffiche){
						suivant($(this).index(),"+");
					}else{
						suivant($(this).index(),"-");
					}
				}
				
				
				/*--------------------------------------------------------------
					Function nextSlide() et oldSlide, calcule la slide suivant 
				--------------------------------------------------------------*/
				function nextSlide(){
					//on trouve le slide suivant
					var newSlide=0;
					if(parseInt(slideAffiche)==(nbSlide-1)){
						newSlide=0;
					}else{
						newSlide=parseInt(slideAffiche)+1;
					}
					
					return newSlide;
					
				}
				
				
				function oldSlide(){
					var newSlide=0;
					if(parseInt(slideAffiche)==0){
						newSlide=nbSlide-1;
					}else{
						newSlide=parseInt(slideAffiche)-1;
					}
					return newSlide;
				}
				
				/*------------end---------------------------*/
				
				
				
	
				/* Function suivante(num), affiche l'image passé en paramètre avec une transition */
				function suivant(num,sens){
					
					//on regarde si le slide ou on doit allé est celui afficher
					if(slideAffiche!=num && action==0){
						
						if(sensDef==false){
							sens=null;
						}
						
						//on dit qu'une action est en cours
						action=1;
						
						//on mais a jour les états des boutons puce
						if(btnPuce!=""){
							btnMaje(num);
						}
						
						//on stop le timer
						clearTimeout(timeoutID);
						
						var tailleTemp=0;
						
						//on regarde la taille du slide
						if(tailleSlide==0){
							tailleTemp=$("."+unSlide+":eq(0)",context).width();
						}else{
							tailleTemp=tailleSlide;
						}
						
						if(sens=="+" || sens==null){
							//on remplace le slide en fil d'attent par celui quon veu afficher
							$("."+unSlide+":eq(1)",context).remove();
							$("."+unSlide+":eq(0)",context).after($(slides[num]));
							tailleTemp=-tailleTemp;
						}else{
							//on insetr avanet le slide que l'on veu
							$("."+unSlide+":eq(0)",context).before($(slides[num]));
							//on décal tous mine de rien
							$(context).css({"left":-tailleSlide+"px"});
							tailleTemp="+="+tailleTemp;
						}
						
						
						//on fait défiler vers la gauche
						$(context).animate({
							left: tailleTemp
						}, vitesse, function(){
						
							//on suprime le slide qui a défilé
							if(sens=="+" || sens==null){
								$("."+unSlide+":eq(0)",context).remove();
							}else{
								$("."+unSlide+":eq(1)",context).remove();
							}
							//on replace le conteneur
							$(context).css({'left':"0px"});
							
							//on dit qui est le slide afficher
							var tempSlideAffiche=$("."+unSlide+":eq(0)",context).attr("class");
							var reg=new RegExp("("+unSlide+")", "i");
							slideAffiche=tempSlideAffiche.replace(reg, "");
							
							
							
							//on mais a jour les éta des flèche
							if(btnNav!=""){
								btnMajNav();
							}
						
							//on dit que l'action est fini
							action=0;
							
							
							//on lance le défilement auto
							if(auto){
								defilementAuto();
							}
							
						});
					}
				}
				
				
				
			
        };
})(jQuery);



