﻿/*------------------------------------------------------------------------------------*/
/*-------------------------------GENERIC SCROLLER-------------------------------------*/
/*------------------------------------------------------------------------------------*/


/*EDITER ICI POUR MODIFIER LE COMPORTEMENT*/
/*------------------------------------------------------------------------------------*/
var pxRemoved=1;                    //pixels retirés à chaque tour de scroll
var repeatScroll=3;                 //en msec, vitesse du scroll en debut de mouvement  |\
var repeatScrollMid=20;             //en msec, vitesse du scroll en milieu de mouvement | --> + petit = + vite !
var repeatScrollEnd=55;             //en msec, vitesse du scroll en fin de mouvement    |/
var pxTrigMid=15;                   //ecart en px à partir duquel on enclenche la vitesse moyenne  
var pxTrigEnd=7;                    //ecart en px à partir duquel on enclenche la vitesse de fin -> Arret

var timeToWait=3500;                //temps passé sur chaque écran de news
var timeToWaitAfterMouseOver=2000;  //temps avant de relancer le scroll onmouseout
var idElem='news';                  //id des éléments à scroller (news1, news2, news3...)
var idConteneur='conteneurNews';    //id du cadre contenant le défilant (position:relative)
var idDefilant='readerNews';        //id du défilant dont on va faire varier la hauteur (position:relative)
var idDebug='debug';                //id du div ou afficher le débug
var isDebug=false;                  //Debug Enabled ?
/*------------------------------------------------------------------------------------*/


//On ajoute l'evenement de survol des news pour stopper le scroll
YAHOO.util.Event.addListener(idConteneur,'mouseover',killNews);
YAHOO.util.Event.addListener(idConteneur,'mouseout',liveNews);

var screens=1;
var splits="0-";
var reader;
var waitScroll;
var over=false;
var launched=false;

function setScroll(){
  //On tronçonne les news par ecrans affichables : toutes celles qui ne seraient pas entières sont poussées
  //suffisament pour devenir invisibles sur l'écran en cours. Ensuite en gros le scroll défile jusqu'a la coupure et s'arrête.
  
  var blocH=0;
  var cont = document.getElementById(idConteneur);  
  var debug = document.getElementById(idDebug);
  
  for(var i=1;i<=nbNews;i++){
    var bloc = document.getElementById(idElem+i);
    var marge;
    if(isNaN((parseInt(bloc.style.marginTop.replace('px',''),10)))){
      marge=0;
    }
    else{
      marge=(parseInt(bloc.style.marginTop.replace('px',''),10));
    }
    var tmpH=bloc.offsetHeight+marge;
    
    //On dépasserait si on affichait ce bloc. Donc on le passe a l'écran suivant
    if((blocH+tmpH)>cont.offsetHeight-25){
      
      //Le bloc est déjà en dessous, on ne fait rien
      if((blocH)>=(cont.offsetHeight*screens)){
        
        if(isDebug){debug.innerHTML=debug.innerHTML+' - '+'Césure naturelle';}
      }
      //Sinon on le pousse jusqu'a ce qu'il disparaisse 
      else{        
        bloc.style.marginTop=(parseInt(bloc.style.marginTop.replace('px',''),10))+((cont.offsetHeight)-blocH)+'px';
        if(isDebug){debug.innerHTML=debug.innerHTML+' - '+'Césure forcée au niveau'+i;}
      }
      
      blocH=0;
      screens++;      
      splits=splits+(bloc.offsetTop)+"-";
    }
    //C'est bon, la somme ne dépasse pas la taille du conteneur, on ajoute la news
    else{      
      blocH=blocH+tmpH;    
      if(isDebug){debug.innerHTML=debug.innerHTML+' - '+blocH+'/'+(cont.offsetHeight);        }
    }        
  } 
  
  //Si pas + d'1 écran on abandonne le scroll
  if(screens>1){
    if(isDebug){debug.innerHTML=debug.innerHTML+' - '+'On lance le scroll pour '+screens+' écrans';}
    if(isDebug){debug.innerHTML=debug.innerHTML+' - '+'Hauteurs des splits : ('+splits+')';}
    splits=splits.substring(0,splits.length-1).split('-');
    for(i=0;i<splits.length;i++){splits[i]=-(parseInt(splits[i],10));}
    screens=0;
    launchScroll()
  }
  else{
    screens='N/A';
  }
}


function launchScroll(){
  reader=document.getElementById(idDefilant); 
  reader.style.top='0px'; 
  if(!over){waitScroll=setTimeout('proceedScroll()',timeToWait);}
}
function proceedScroll(){
  
  //Un seul scroller à la fois, on a dit !
  if(launched){return;}
  launched=true;
  
  clearTimeout(waitScroll);
  if(screens<splits.length-1){
    screens++;
  }
  else{    
    screens=0; 
    scrollerRew();
    launched=false;
    return;      
  }  
  scroller();
  launched=false;
}

var idx=0;
//Le scroller standard, passe à l'écran d'après et attend
function scroller(){
  if(idx==0){idx=(parseInt(reader.style.top.replace('px',''),10));}
  var zeTop=idx;
  var aim = splits[screens];
      
  if(zeTop<=aim){    
    if(!over){waitScroll=setTimeout('proceedScroll()',timeToWait);}    
    idx=0;
  }
  else{    
    idx=(zeTop-pxRemoved);
    reader.style.top=idx+'px';
    
    if((zeTop-aim) > pxTrigMid){setTimeout('scroller()',repeatScroll);}
    else if((zeTop-aim) > pxTrigEnd){setTimeout('scroller()',repeatScrollMid);}
    else {setTimeout('scroller()',repeatScrollEnd);}    
  }
}
//Le scroller Rewinder : passe le dernier écran, réinitialise tout et relance le Scroll immédiatement pour simuler un "rouleau".
function scrollerRew(){
  if(idx==0){idx=(parseInt(reader.style.top.replace('px',''),10));}
  var zeTop=idx;
  var aim =(-(reader.offsetHeight));
    
  if(zeTop<=aim){ 
    reader.style.top= document.getElementById(idConteneur).offsetHeight+'px';  
    screens=-1;
    idx=0;
    proceedScroll();
  }
  else{
    idx=(zeTop-pxRemoved);
    reader.style.top=idx+'px';    
    setTimeout('scrollerRew()',repeatScroll);    
  }
}

function killNews(){
  clearTimeout(waitScroll);
  over=true;
}
function liveNews(){
  if(screens!='N/A'){waitScroll=setTimeout('proceedScroll()',timeToWaitAfterMouseOver); }
  over=false;
}
/*------------------------------------------------------------------------------------*/
/*---------------------------FIN GENERIC SCROLLER-------------------------------------*/
/*------------------------------------------------------------------------------------*/