(function($) {
  // définition du plugin jQuery
  $.fn.investCarousel = function(params) {
    
    // Valeurs par défaut des options
    params = $.extend({
      nextBtn: "carouselFlecheDroite",        // ID du btn "suivant"
      prevBtn: "carouselFlecheGauche",        // ID du btn "précédént"
      paginationClass: "carouselCercle",      // Classe CSS des btns de pagination
      autoSlide: true,                        // Défilement automatique
      delayAutoSlide:6000                     // Délai pour le défilement automatique
      }, params);    
      
  // Traverse tous les nœuds
  return this.each(function() {
    // Exprimer un nœud seul en objet jQuery
    var $t = $(this);
    var li = $t.find("li"); // LI's (objets DOM)
    var timer;    
    var data = {};
    data.totalLi = li.length; // Nbre de LI
    init($t, li, params, data);  

    
  });
  };
  
  function init(t, li, params, data){    
           
    // initialise la pagination
    li.each(function(index) {
      var activeClass = "";
      if(index=="0"){
        var activeClass = "carouselCercleActive";
      }
      var code = '<a href="#" class="'+params.paginationClass+' '+ activeClass +'" id="carousel'+index+'"></a>';
      $("#carouselFlecheDroite").before(code);    
    });

    // Repositionne (CSS) les btns de pagination en fonction du nombre de LI (css par défaut=3)
    if(data.totalLi==5){
      $('#'+params.prevBtn).css("margin", "9px 7px 9px 24px");
      $('#'+params.nextBtn).css("margin", "9px 9px 9px 7px");
    } else if(data.totalLi==4){
      $('#'+params.prevBtn).css("margin", "9px 12px 9px 31px");
      $('#'+params.nextBtn).css("margin", "9px 9px 9px 12px");
    } else if(data.totalLi==2){
      $('#'+params.prevBtn).css("margin", "9px 18px 9px 52px");
    } else if(data.totalLi<=1) {
     $('#carouselNav').css("display","none");
 
    }
    data.currentLi = 1;

    //Attribue les comportements aux btns
    $("#"+params.nextBtn).click(function() {
      slideTo('','next',data, li);
      data.currentLi++;      
      updatePagination(data.currentLi, params); 
      return false;
    });
    
    $("#"+params.prevBtn).click(function() {
      slideTo('','prev',data, li);
      data.currentLi--;      
      updatePagination(data.currentLi, params); 
      return false;
    });
    
    // Attribue les comportements aux btns de pagination
    $('.'+params.paginationClass).each(function(index) {
      $('#carousel'+index).click(function() {
        data.currentLi=index+1;
        slideTo(data.currentLi,'',data, li);
        updatePagination(data.currentLi, params);  
        return false;
      });
    });
    
    if(params.autoSlide==true){
     // Mise en route du timer
     playTimer(params);
     
     // Dès que la souris passe au-dessus du carousel : arrêt du timer
     t.mouseover(function() {
      pauseTimer(params);
     });
    
     // Dès que la souris sort du carousel : reprise du timer
     t.mouseout(function() {
       playTimer(params);
     });     
    }       
        
  };
  
  function playTimer(params){
    timer = setTimeout(function(){slideNext(params)}, params.delayAutoSlide); 
  }
  function pauseTimer(params){
    clearTimeout(timer);
  } 
  function slideNext(params){
    $("#"+params.nextBtn).click();  
    playTimer(params);
  }
  
  function slideTo(liNum, sens, data, li){   
    // liNum : le n° du LI à afficher
    // Sens : next ou prev
    // Data : objet qui contient le nombre de LI et le Li affiché
    // LI : objets DOM (li's) 
    
    if(sens=="next") {
      // Si on arrive au bout > retour LI de départ
      if(data.currentLi>=data.totalLi){
        data.currentLi=0;
        liNum=1;
      } else {
        liNum=data.currentLi+1;
      }     
  	
    } else if(sens=="prev") {
      // Si on est au début > retour LI de fin
      if(data.currentLi==1){
        data.currentLi=data.totalLi+1;
        liNum=data.totalLi;
      } else {
        liNum=data.currentLi-1;
      }
    }
    // Slide
    $(li).animate({left: -(642*(liNum-1))+'px'}, 700, 'swing');
  };
  
  function updatePagination(liNum, params){
     $('.'+params.paginationClass).removeClass('carouselCercleActive');
     $('#carousel'+(liNum-1)).addClass('carouselCercleActive');
  };
      
})(jQuery);




