/**
 * "Scrollingue"
 *
 * Auteur        : el.Fakir
 * Site          : http://el.fakir.free.fr
 * Version       : 1.0.5
 * Dernière MaJ  : 16 janvier 2002
 *
 * Fichier       : mrqScrollCommon.js
 *                 (fonctions communes)
 *
 * Compatibilité : IE5+ / NS6 (et Mozilla ?)
 *                 NS4+ / IE4+
 *		   Opera 5 supporté uniquement pour le scroll horizontal.
 *
 *                 Utilisez la variable mrqNavErr pour retourner un
 *                 message d'erreur si le navigateur n'est pas
 *                 supporté.
 *
 *
 * Fonctions et variables préfixées "mrq", abréviation de MaRQuee.
 *
 * ATTENTION, avec NS4 : fond transparent et pas de bordure
 * pour le calque conteneur. A priori ne fonctionne pas sur Mac (!).
 */

/**
 * Déclarations des variables utilisées pour
 * paramètrer le scroll. Changements possibles
 * en fonction des besoins.
 *
 * >> Cette partie est recopiée ici pour information,
 * la définition des paramètres perso' s'effectue dans
 * le document HTML parent.
 *
 * mrqContWidth  : largeur du conteneur
 * mrqContHeight : hauteur du conteneur
 * mrqContTop    : position y du conteneur
 * mrqContLeft   : position x du conteneur
 *
 * mrqLoop       : true si le scroll boucle indéfiniment
 *
 * mrqDecall     : nombre de pixels de décalage, une valeur faible
 *                 donnera un scroll plus "soft".
 * mrqSpeed      : fréquence entière en ms entre chaque décalage de
 *                 mrqDecall pixels, plus la valeur est proche de zéro,
 *                 plus le défilement sera rapide.
 *
 * mrqScrollVert : true si c'est un scroll de bas en haut, false si
 *                 c'est un scroll de droite à gauche.
 * mrqScrollSens : -1 de droite à gauche ou de bas en haut, 1 de gauche à droite
 *                 ou de haut en bas (selon la valeur de mrqScrollVert).
 *
 * mrqString     : le texte du scroll, avec éventuellement des liens href.
 * mrqNavErr     : court message d'erreur si le navigateur n'est pas supporté.
 *
 *
 * var mrqContWidth    = 200;
 * var mrqContHeight   = 25;
 * var mrqContTop      = 30;
 * var mrqContLeft     = 20;
 * var mrqLoop         = true;    // mrqLoop       == false || true
 * var mrqDecal        = 1;       // mrqDecal      >= 1
 * var mrqSpeed        = 25;      // mrqSpedd      >= 10
 * var mrqScrollVert   = false;   // mrqScrollVert == false || true
 * var mrqScrollSens   = -1;      // mrqScrollSens ==     1 || -1
 * var mrqString       = 'Et maintenant, direction le <a href="http://el.fakir.free.fr" target="_blank">ouaibe</a> du Fakir !';
 * var mrqNavErr       = 'Opera browser not supported - Navigateur Opera non support&eacute;'
 */

/**
 * Variables globales utilisées par les
 * différentes fonctions mrq... : ne rien changer ici.
 */
var mrqLeft         = 0;
var mrqTop          = 0;
var mrqStringWidth  = 0;
var mrqStringHeight = 0;
var mrqTimerID;


/**
 * Fonction isOpera
 * Détection du navigateur Opera.
 *
 * Retourne le numéro majeur de la version d'Opera, ou 0
 * si l'on a pas à faire à lui.
 */
function isOpera() {

  var strUserAgt = navigator.userAgent;
  var intUserAgt = strUserAgt.length;
  var intStart;
  var intVersion = 0;

  if ((intStart = strUserAgt.indexOf('Opera')) != -1 ) {
    while(intStart < intUserAgt && isNaN(intVersion = parseInt(strUserAgt.charAt(intStart++))));
  }

  return intVersion;
}


/**
 * Détection du type de navigateur.
 */
var ie4  = document.all && !document.getElementById;
var ns4  = document.layers;
var op5  = isOpera() == 5;
var dom2 = document.getElementById;


/**
 * Fonction mrqScroll
 *
 * Démarrage, re-démarrage et arrêt du scroll.
 * Paramètres possibles (type texte) :
 *   - start    : démarrage du scroll (remise à zéro)
 *   - continue : re-démarrage du scroll depuis le point actuel
 *   - stop     : arrêt du scroll
 */
function mrqScroll(type) {

   /**
    * Démarrage.
    */
   if (type == 'start') {
     if (mrqScrollSens == -1) {
       mrqScrollVert ? mrqScrollIt(mrqContHeight)    : mrqScrollIt(mrqContWidth);
     } else {
       mrqScrollVert ? mrqScrollIt(-mrqStringHeight) : mrqScrollIt(-mrqStringWidth);
     }

   /**
    * Re-démarrage.
    */
   } else if (type == 'continue') {
     mrqScrollVert ? mrqScrollIt(mrqTop) : mrqScrollIt(mrqLeft);

   /**
    * Arrêt.
    */
   } else if (type == 'stop') {
     if (mrqTimerID != null) clearTimeout(mrqTimerID);
   }
}


/**
 * Fonction mrqInit
 */
function mrqInit() {

  if (ns4) {
    /**
     * Récupération avec Netscape 4 de la taille du calque texte.
     */
    with (document.mrqDivCont) {
      mrqStringWidth  = document.mrqDivText.document.width;
      mrqStringHeight = document.mrqDivText.document.height;
      clip.width      = mrqContWidth;
      clip.height     = mrqContHeight;
      hidden          = false;
      y               = mrqContTop;
      x               = mrqContLeft;
    }

  } else if ((op5 && !mrqScrollVert) || ((dom2 || ie4) && !op5)) {
    /**
     * On chopppe la taille du calque qui contient le texte,
     * ce - avant - de redimensionner le calque parent. Sinon ça
     * part en sucette et on récupère la taille du calque parent.
     *
     * Ensuite on surcharge le style en renseignant les propriétés
     * 'width' et 'height' afin d'éviter tout étirement lorsque l'on
     * va retoucher le calque parent.
     */
    var objText          = dom2 ? document.getElementById('mrqDivText') : document.all['mrqDivText'];
    
    /**
     * Si offsetWidth n'est pas vierge, alors IE4+ ou NS5,
     * sinon ça sent l'Opera 5.
     */
    mrqStringWidth       = objText.offsetWidth  ? objText.offsetWidth  : objText.style.pixelWidth;
    mrqStringHeight      = objText.offsetHeight ? objText.offsetHeight : objText.style.pixelHeight;
    objText.style.width  = mrqStringWidth  + 'px';
    objText.style.height = mrqStringHeight + 'px';

    /**
     * Redimensionnement du calque parent.
     * ('px' mis en commentaires car bug' avec Opera 5.11)
     */
    var objCont              = dom2 ? document.getElementById('mrqDivCont') : document.all['mrqDivCont'];
    objCont.style.width      = mrqContWidth;   // + 'px';
    objCont.style.height     = mrqContHeight;  // + 'px';
    objCont.style.left       = mrqContLeft;    // + 'px';
    objCont.style.top        = mrqContTop;     // + 'px';
    objCont.style.clip       = 'rect (0,' +  objCont.style.width + ', ' + objCont.style.height + ', 0)';
    objCont.style.visibility = 'visible';

    /**
     * Init. des propriétés top et left du calque texte pour IE4.
     */
    objText.style.top  = mrqTop;  //+ 'px';
    objText.style.left = mrqLeft; //+ 'px';
    
  } else {
    /**
     * Damned, le gars utilise Opera ou un autre navigateur "spécial" : au revoir...
     * On affiche la chaîne mrqNavErr si elle n'est pas vierge.
     */
    if (mrqNavErr != '') {
      document.open();
      document.write(mrqNavErr);
      document.close();
    }
    return;
  }

  /**
   * Centrage du calque texte dans le conteneur.
   * +1, -1 ???  Ouep, bicoz' bug dans Netscape 4.x
   * avec la gestion des parties entières si le numérique < 1
   * Laklass...
   */
  mrqTop  = parseInt((0.5 * (mrqContHeight - mrqStringHeight + 1)) - 1);
  mrqLeft = parseInt((0.5 * (mrqContWidth  -  mrqStringWidth + 1)) - 1);

  /**
   * It burns, on démarre le scroll.
   */
  mrqScroll('start');
}


/**
 * Fonction mrqScrollIt
 *
 * Cette fonction est chargée de faire défiler le calque
 *
 */
function mrqScrollIt(intTopLeft) {

  /**
   * Décalage en hauteur ?
   */
  if (mrqScrollVert) {
    mrqTop  = intTopLeft + (mrqScrollSens * mrqDecal);
  } else {
    mrqLeft = intTopLeft + (mrqScrollSens * mrqDecal);
  }

  /**
   * Décalage du calque contenant le texte.
   */
  if (ns4) {
    var objText        = document.mrqDivCont.document.mrqDivText;
    objText.top        = mrqTop;
    objText.left       = mrqLeft;
  } else {
    var objText        = dom2 ? document.getElementById('mrqDivText') : document.all['mrqDivText'];
    objText.style.top  = mrqTop  + 'px';
    objText.style.left = mrqLeft + 'px';
  }

  /**
   * Si la bande de texte a complètement défilé et
   * que le booléen mrqLoop est vrai, alors c'est
   * reparti pour un tour.
   */
  if (mrqLoop) {
  
    /**
     * Scroll vertical ?
     */
    if (mrqScrollVert) {
    
      if (mrqTop <= -mrqStringHeight     && mrqScrollSens == -1) {
	    mrqTop =  mrqContHeight;
      } else if (mrqTop >= mrqContHeight && mrqScrollSens != -1) {
        mrqTop = -mrqStringHeight;
      }
      
    /**
     * Non. Donc horizontal Boy George !
     */
    } else {
    
      if (mrqLeft <= -mrqStringWidth     && mrqScrollSens == -1) {
        mrqLeft = mrqContWidth;
      } else if (mrqLeft >= mrqContWidth && mrqScrollSens != -1) {
        mrqLeft = -mrqStringWidth;
      }
      
    }
  }

  /**
   * Si le scroll n'est pas en bout de course, alors on
   * active un timer qui va appeler cette même fonction
   * mrqScrollIt après mrqSpeed millisecondes.
   *
   * Idem que précédemment, un if..else pour le cas vertical
   * puis horizontal, 
   */
  if (mrqScrollVert) {
    if ((mrqTop > -mrqStringHeight) || (mrqTop < mrqContHeight)) 
      mrqTimerID = setTimeout('mrqScrollIt(' + mrqTop  + ')', mrqSpeed);

  } else {
    if ((mrqLeft > -mrqStringWidth) || (mrqLeft < mrqContWidth))
  	  mrqTimerID = setTimeout('mrqScrollIt(' + mrqLeft + ')', mrqSpeed);
  }
}


/**
 * Création de la feuille de style ainsi que des deux
 * calques emboîtés utilisés par le scroll.
 */
document.open();

/**
 * Feuille de styles
 */
document.write('<style type="text/css"><!--');
document.write('#mrqDivCont { position: absolute; overflow: hidden; visibility: hidden; }');
document.write('#mrqDivText, mrqNS4DivText { position: relative; width: 1px; height: 1px; top: 0px; left: 0px; }');
document.write('--></style>');

/**
 * Claques - on est obligé d'utiliser un <layer> avec NS4 pour le calque
 * du texte car sinon ce naze nous claque un retour à la ligne supplémentaire
 * à la fin de mrqString. Du coup le calcul de la hauteur est ensuite foireux.
 */
document.write('<div id="mrqDivCont" width="' + mrqContWidth + '" height="' + mrqContHeight + '">');
if (ns4) {
  document.write('<layer name="mrqDivText" class="mrqNS4DivText" onMouseOver="mrqScroll(\'stop\');" onMouseOut="mrqScroll(\'continue\');">');
  document.write('<nobr>' + mrqString + '</nobr>');
  document.write('</layer>');
} else {
  document.write('<span id="mrqDivText" onMouseOver="mrqScroll(\'stop\');" onMouseOut="mrqScroll(\'continue\');">');
  document.write('<nobr>' + mrqString + '</nobr>');
  document.write('</span>');
}
document.write('</div>');

document.close();


/**
 * Activation sur l'événement onLoad de la fonction
 * mrqInit() pour démarrer le défilement.
 *
 * On utilise de préférence l'eventListener pour
 * éviter le bug de NS6, NS6.01 qui "ignore" la
 * ligne window.onLoad = fonction().
 */
if (window.addEventListener && !ns4) {
  window.addEventListener('load', mrqInit, false);
} else {
  window.onLoad = mrqInit();
}