var SlideIn = function(){
    //Variable globale
    this.idObj = null;
    this.timer = null;
    this.from = null;
    this.to = null;
    this.direction = null;
    this.pas = 1;  // en pixel
    this.vitesse = 100 // en milliseconde  (plus grand moin rapide)
    //Tableau d'élément a déplacé
    this.elementToSlide = new Array();
    //Index de l'élément en cours
    this.currentIndex = 0;
    //Paramètre pour lancement automatique
    this.timePause = 0 ; //permet de définir le temps de pause entre deux slide
    this.auto = false ; //Permet d'activer ou non le slide automatique
    }
    
    /*##########################################################
    ####################  On ajoute les méthodes sur l'objet  ###################
    ##########################################################*/
    //Permet de récupérer un élément par id
    SlideIn.prototype.$ = function(element){
        return document.getElementById(element);
    };
    
    //Méthode permettant de lancer les animations si en auto :)
    SlideIn.prototype.go = function(){
        if(this.auto){
            switch (this.direction ){
                case 'left':
                    this.SlideToLeft();
                break;
                case 'right':
                    this.SlideToRight();
                break;
                case 'top':
                    this.SlideToTop();
                break;
                case 'bottom':
                    this.SlideToBottom();
                break;
            }
        }
    }
    
    //Méthode permettant d'ajouter un élément
    SlideIn.prototype.AddElement = function(element){
        if(typeof(element) == "string"){
            this.elementToSlide.push(this.$(element));
        }
        else if(typeof(element) == "object"){
            this.elementToSlide.push(element);
        }
    }
    
    //Méthode permettant d'ajouter plusieurs élément d'un coup
    SlideIn.prototype.AddElements = function (elements){
        for(var i = 0 , l = elements.length; i < l ;i++){
            this.AddElement(elements[i]);
        }
    }
    
    //Méthode permettant de déplacer les éléments vers la gauche
    SlideIn.prototype.SlideToLeft = function()
    {
      if(this.direction == null || this.direction == 'left')
      {
        var me = this ;
        //On vérifit la direction pour initialiser le positionnement
        if(this.direction != 'left')
        {
          this.direction = 'left';
          if(this.timer == null){ this.Positionne(); }
        }
        else if(this.direction == 'left' && this.auto && this.timer == null)
        {
          this.Positionne();
        }
            
            if(this.timer != null){
                clearTimeout(this.timer);
                this.timer = null;
            }
            //Si le timer n'est pas finit on détruit l'ancienne div
            //if(parseInt(this.from.style.left) == Number.NaN || (parseInt(this.from.parentNode.offsetWidth) + parseInt(this.from.style.left))> 0){
            if(parseInt(this.from.style.left) == Number.NaN || (parseInt(this.from.offsetWidth) + parseInt(this.from.style.left))> 0){
                this.from.style.left = parseInt(this.from.style.left) - this.pas + "px";
                this.to.style.left  =parseInt(this.to.style.left) - this.pas + "px";
                //alert((parseInt(this.$(from).offsetWidth) + parseInt(this.$(from).style.left)));
                this.timer = setTimeout(function(){me.SlideToLeft()},this.vitesse);
            }
            else{
                clearTimeout(this.timer);
                this.timer = null;
                this.currentIndex = (this.currentIndex == (this.elementToSlide.length-1)) ? 0:this.currentIndex + 1;
                //this.$('debug').innerHTML = this.currentIndex;
                this.Positionne();
                if(this.auto){
                    setTimeout(function(){me.SlideToLeft()},this.timePause);
                }
                else{
                    this.direction = null;
                }
            }
        }
    };
    
    //Méthode permettant de déplacer les éléments vers la droite
    SlideIn.prototype.SlideToRight = function(){
        var me = this ;
        if(this.direction == null || this.direction == 'right'){
                if(this.direction != 'right'){
                    this.direction = 'right';
                    if(this.timer == null){
                        this.Positionne();
                    }
                }
                else if(this.direction == 'right' && this.auto && this.timer == null){
                    this.Positionne();
                }
                
                if(this.timer != null){
                    clearTimeout(this.timer);
                    this.timer = null;
                }
                //Si le timer n'est pas finit on détruit l'ancienne div
                if(parseInt(this.from.style.left) == Number.NaN ||  parseInt(this.from.style.left) < parseInt(this.from.parentNode.offsetWidth)){
                    this.from.style.left = parseInt(this.from.style.left) + this.pas + "px";
                    this.to.style.left  =parseInt(this.to.style.left) + this.pas + "px";
                    //alert((parseInt(this.$(from).offsetWidth) + parseInt(this.$(from).style.left)));
                    this.timer = setTimeout(function(){me.SlideToRight()},this.vitesse);
                }
                else{
                    clearTimeout(this.timer);
                    this.timer = null;
                    this.currentIndex = (this.currentIndex == 0) ? this.elementToSlide.length-1:this.currentIndex - 1;
                    //this.$('debug').innerHTML = this.currentIndex;
                    this.Positionne();
                    if(this.auto){
                        setTimeout(function(){me.SlideToRight()},this.timePause);
                    }
                    else{
                        this.direction = null;
                    }
                }
        }
        
 
    };
    
    //Méthode permettant de déplacer les éléments vers le haut
    SlideIn.prototype.SlideToTop = function()
    {
      if(this.direction == null || this.direction == 'top')
      {
        var me = this ;
        //On vérifit la direction pour initialiser le positionnement
        if(this.direction != 'top')
        {
          this.direction = 'top';
          if(this.timer == null){ this.Positionne(); }
        }
        else if(this.direction == 'top' && this.auto && this.timer == null)
        {
          this.Positionne();
        }
            
        if(this.timer != null)
        {
          clearTimeout(this.timer);
          this.timer = null;
        }
        //Si le timer n'est pas finit on détruit l'ancienne div

        if(parseInt(this.from.style.top) == Number.NaN || (parseInt(this.from.style.top) > - parseInt(this.from.offsetHeight)))
        {
          this.from.style.top = parseInt(this.from.style.top) - this.pas + "px";
          this.to.style.top  = parseInt(this.to.style.top) - this.pas + "px";
          this.timer = setTimeout(function(){me.SlideToTop()},this.vitesse);
        }
        else
        {
          clearTimeout(this.timer);
          this.timer = null;
          this.currentIndex = (this.currentIndex == 0) ? this.elementToSlide.length-1:this.currentIndex - 1;
          //this.$('debug').innerHTML = this.currentIndex;
          this.Positionne();                    
          
          if(this.auto)
          {
            setTimeout(function(){me.SlideToTop()},this.timePause);
          }
          else
          {
            this.direction = null;
          }
        }
      }
    };
    
    //Méthode permettant de déplacer les éléments vers le bas
    SlideIn.prototype.SlideToBottom = function(){
        var me = this 
        if(this.direction == null || this.direction == 'bottom'){
            //On vérifit la direction pour initialiser le positionnement
            if(this.direction != 'bottom'){
                    this.direction = 'bottom';
                    if(this.timer == null){
                        this.Positionne();
                    }
            }
            if(this.timer != null){
                clearTimeout(this.timer);
                this.timer = null;
            }
            //Si le timer n'est pas finit on détruit l'ancienne div
            if(parseInt(this.from.style.top) == Number.NaN || parseInt(this.from.style.top) < parseInt(this.from.parentNode.offsetHeight)){
                this.from.style.top = parseInt(this.from.style.top) + this.pas + "px";
                this.to.style.top  =parseInt(this.to.style.top) + this.pas + "px";
                this.timer = setTimeout(function(){me.SlideToBottom()},this.vitesse);
            }
            else{
                clearTimeout(this.timer);
                this.timer = null;
                this.currentIndex = (this.currentIndex == this.elementToSlide.length-1) ? 0:this.currentIndex + 1;
                //this.$('debug').innerHTML = this.currentIndex;
                this.Positionne();
                if(this.auto){
                    setTimeout(function(){me.SlideToBottom()},this.timePause);
                }
                else{
                    this.direction = null;
                }
            }
        }
    };
    
    //Fonction initialisant le tableau en positionnant tous les éléments :)
    SlideIn.prototype.Positionne = function(){
        if(this.direction == 'left'){
            //On vérifit que l'on est pas a la fin sinon le premier devient le dernier
            if(this.currentIndex == this.elementToSlide.length-1){
                //récupération des éléments : 
                this.from = this.elementToSlide[this.currentIndex];
                this.to = this.elementToSlide[0]; //Premier élément
            }
            else{
                this.from = this.elementToSlide[this.currentIndex];
                this.to = this.elementToSlide[this.currentIndex + 1];
            }
                this.from.style.display = "block" ;
                this.from.style.left = 0 + "px";
                this.to.style.left = this.from.parentNode.offsetWidth + "px";
                this.to.style.display = "block";
                //Posionement vertical
                this.to.style.top = 0 + "px";
                this.from.style.top = 0 + "px" ;
        }
        else if(this.direction == 'right'){
            if(this.currentIndex == 0)
            {
                this.from = this.elementToSlide[this.currentIndex];
                this.to = this.elementToSlide[this.elementToSlide.length-1]; // dernier élément
                alert('1 '+this.from);
            }
            else
            {
                this.from = this.elementToSlide[this.currentIndex];
                this.to = this.elementToSlide[this.currentIndex-1];
                alert('2 '+this.from);
            }
            this.from.style.display = "block" ;
            this.from.style.left = 0 + "px";
            this.to.style.left = - (this.from.parentNode.offsetWidth )+ "px";
            this.to.style.display = "block";
            //Posionement vertical
            this.to.style.top = 0 + "px";
            this.from.style.top = 0 + "px" ;
        }
        else if(this.direction == 'bottom'){
            if(this.currentIndex == this.elementToSlide.length-1){
                this.from = this.elementToSlide[this.currentIndex];
                this.to = this.elementToSlide[0]; // dernier élément
            }
            else{
                this.from = this.elementToSlide[this.currentIndex];
                this.to = this.elementToSlide[this.currentIndex+1];
            }
            this.from.style.display = "block" ;
            this.from.style.top = 0 + "px";
            this.to.style.top = - (this.from.parentNode.offsetHeight )+ "px";
            this.to.style.display = "block";
            //Posionement horizontal
            this.to.style.left = 0 + "px";
            this.from.style.left = 0 + "px" ;
        }
        else if(this.direction == 'top'){
            if(this.currentIndex == 0){
                this.from = this.elementToSlide[this.currentIndex];
                this.to = this.elementToSlide[this.elementToSlide.length-1]; // dernier élément
            }
            else{
                this.from = this.elementToSlide[this.currentIndex];
                this.to = this.elementToSlide[this.currentIndex-1];
            }
            this.from.style.display = "block" ;
            this.from.style.top = 0 + "px";
            this.to.style.top = (this.from.parentNode.offsetHeight )+ "px";
            this.to.style.display = "block";
            //Posionement horizontal
            this.to.style.left = 0 + "px";
            this.from.style.left = 0 + "px" ;
        }
    };
