// ****************************************************
// *** Diaporama en fondu enchaine
// ****************************************************

var diaporamaList = new Array();

// ****************************************************
// Exemple d'utilisation
// ****************************************************
// TODO
// ****************************************************

//****************************************************
//*** Creation de l'objet Diaporama
//****************************************************
// pZone : identifiant de la zone (attribut id d'un div par exemple)
// pWidth : largeur de la zone
// pHeight : hauteur de la zone
// pImgList : liste d'image 
// ---------- chaque element de la liste correspond à un tableau : [src,width,height]
// pIdImg1  : identifiant de la premiere image (quelconque mais unique dans le document)
// pIdImg2  : identifiant de la deuxieme image (quelconque mais unique dans le document)
// pPause   : temps de pause entre 2 images en millisecondes
// pAjaxMode : true or false
//****************************************************
function diaporama(pZone, pWidth, pHeight, pImgList, pIdImg1, pIdImg2, pPause, pAjaxMode)
{
   // Initialisation des variables
   this.zone = pZone;
   // * Liste des images
   this.pixList = pImgList;
   // * Identifiants des images
   this.idpix1 = pIdImg1;
   this.idpix2 = pIdImg2;
   this.nodeImg1 = null;
   this.nodeImg2 = null ;
   // * Identifiant du lien (1 balise <a> pour les 2 images)
   this.idpix1href = pIdImg1+"href";
   this.nodeImg1href = null;
   this.activeHref = null;
   // * Autres
   this.temps_pause = pPause;
   this.zoneWidth = pWidth;
   this.zoneHeight = pHeight;
   this.indice = 2; // les 2 premiere image sont deja charger dans le HTML, on commence a la 3eme
   this.sens = -1;
   // * Parametres d'enchainement d'image (par defaut)
   this.coef = 0.05 ; // avancement de l'opacité
   this.temps = 50 ; // temps entre chaque changement d'opacité
   // * mode ajax 
   this.ajaxMode = pAjaxMode;

   // Ajout de l'objet dans la liste globale
   diaporamaList[this.zone] = this;

   // * Déclaration des fonctions
   
   
   //****************************************************
   //*** Lancement du diaporama
   //****************************************************
   this.lire_diaporama = function () {

             // Création des noeuds image
             var attribute = null;

             // Creation des images (si plusieurs images à afficher
             if (this.pixList.length != 1) {

               // LIEN des IMAGES
               // <a href= target=>
               this.nodeImg1href = document.createElement("a");
               this.nodeImg1href.id = this.idpix1href;
               this.activeHref = this.pixList[1];
               defineLinkParameters(this.pixList[0],this.nodeImg1href,this.ajaxMode);

               // IMAGE 1
               // <img id= src= border= style=>
               this.nodeImg1 = document.createElement("img");
               this.nodeImg1.id = this.idpix1;
               definePixParameters(this.pixList[0],this.zoneWidth,this.zoneHeight,this.nodeImg1);
               // <a> child : <img1>
               this.nodeImg1href.appendChild(this.nodeImg1);

               // IMAGE 2
               // <img id= src= border= style=>
               this.nodeImg2 = document.createElement("img");
               this.nodeImg2.id = this.idpix2;
               definePixParameters(this.pixList[1],this.zoneWidth,this.zoneHeight,this.nodeImg2);
               // <a> child : <img2>
               this.nodeImg1href.appendChild(this.nodeImg2);

               // Ajout du bloc <a><img1/><img2/></a> à la zone d'affichage
               document.getElementById(this.zone).appendChild(this.nodeImg1href);

               // Definition de leur premiere opacite
               changeOpacite(1, this.idpix1);
               changeOpacite(0, this.idpix2);
               // Lancement du diaporama
               window.setTimeout("tempo('" + this.zone + "')",this.temps_pause) ; // attente

               } else {

               // Affichage de la seule image sans fondu
               // IMAGE 1
               // <a href= target=>
               this.nodeImg1href = document.createElement("a");
               this.nodeImg1href.id = this.idpix1href
               defineLinkParameters(this.pixList[0],this.nodeImg1href,this.ajaxMode)
               // <img id= src= border= style=>
               this.nodeImg1 = document.createElement("img");
               this.nodeImg1.id = this.idpix1;
               definePixParameters(this.pixList[0],this.zoneWidth,this.zoneHeight,this.nodeImg1);
               // <a> child : <img>
               this.nodeImg1href.appendChild(this.nodeImg1);

               // Ajout de l'image au document
               document.getElementById(this.zone).appendChild(this.nodeImg1href);
               }
   }
   
   //****************************************************
   //*** Gestion du fondu enchaine
   //****************************************************
   this.lecture_diaporama = function() {
   
               // Definit le lien courant juste après la pause entre 2 images
               defineLinkParameters(this.activeHref,document.getElementById(this.idpix1href),this.ajaxMode);

               // Opacite courante
               var opacity1 = parseFloat(getOpacite(this.idpix1)) ;
               var opacity2 = parseFloat(getOpacite(this.idpix2)) ;
               // Nouvelle opacite
               var newOpacite1 = opacity1+(this.coef*this.sens);
               var newOpacite2 = opacity2-(this.coef*this.sens);
               // Modification de l'opacite
               changeOpacite(newOpacite1, this.idpix1);
               changeOpacite(newOpacite2, this.idpix2);
               // Gestion du sens de variation de l'opacite
	       if (newOpacite2  <= 0) {
                 if (this.indice == (this.pixList.length)) this.indice=0;
                 definePixParameters(this.pixList[this.indice],this.zoneWidth,this.zoneHeight,document.getElementById(this.idpix2));
                 this.activeHref = this.pixList[this.indice];
                 this.indice++;
		 this.sens = -1;
		 window.setTimeout("tempo('" + this.zone + "')",this.temps_pause) ; // attente
                 return 0;
	       } else if (newOpacite1 <= 0) {
                 if (this.indice == (this.pixList.length)) this.indice=0;
                 definePixParameters(this.pixList[this.indice],this.zoneWidth,this.zoneHeight,document.getElementById(this.idpix1));
                 this.activeHref = this.pixList[this.indice];
                 this.indice++;
		 this.sens = 1;
		 window.setTimeout("tempo('" + this.zone + "')",this.temps_pause) ; // attente
		 return 0;
               }

                window.setTimeout("tempo('" + this.zone + "')",this.temps) ; // attente
   }
}


//****************************************************
//*** Gestion de la temporisation
//****************************************************
function tempo(keyzone) {
         var tmpDiapo = diaporamaList[keyzone];
         tmpDiapo.lecture_diaporama();
}
//****************************************************
//*** Gestion de l'opacite sur differents navigateurs
//****************************************************
function changeOpacite(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity);
    object.MozOpacity = (opacity);
    object.KhtmlOpacity = (opacity);
    object.filter = "alpha(opacity=" + opacity * 100 + ")";
}
//****************************************************
function getOpacite(id) {
    var undefined;
    var object = document.getElementById(id).style;
    if (object.opacity != undefined) {
       return object.opacity;
    }
    if (object.MozOpacity != undefined) {
       return object.MozOpacity;
    }
    if (object.KhtmlOpacity != undefined) {
       return object.KhtmlOpacity;
    }
    if (object.filter != undefined) {
       return object.filter.alpha.opacity;
    }
}

//****************************************************
//*** Gestion de la position et de la taille des images
//****************************************************
// pPixInfo : info d'une image
// pWidth : largeur de la zone
// pHeight : hauteur de la zone
// pPixDomNode : noeud DOM de l'image
function definePixParameters(pPixInfo,pWidth,pHeight,pPixDomNode) {
     
     // Definition des variables
     var realWidth;
     var realHeigth;
     var posX = 0;
     var posY = 0;

     // Analyse de la taille
     if ((pPixInfo[1]<=pWidth)&&(pPixInfo[2]<=pHeight)) {
            realWidth = pPixInfo[1];
            realHeigth = pPixInfo[2];
     } else if ((pPixInfo[1]>pWidth)&&(pPixInfo[2]<=pHeight)) {
            realWidth = pWidth;
            realHeigth = Math.round(pWidth*pPixInfo[2]/pPixInfo[1]);
     } else if ((pPixInfo[1]<=pWidth)&&(pPixInfo[2]>pHeight)) {
            realWidth = Math.round(pHeight*pPixInfo[1]/pPixInfo[2]);
            realHeigth = pHeight;
     } else {
            pPixInfo[2] = Math.round(pWidth*pPixInfo[2]/pPixInfo[1]);
            pPixInfo[1] = pWidth;
            definePixParameters(pPixInfo,pWidth,pHeight,pPixDomNode);
            return;
     }

     // Analyse de la position en X pour centrage
     if (realWidth < pWidth) {
            posX = Math.round((pWidth-realWidth)/2);
     }

     // Affectation des parametres
     pPixDomNode.src = pPixInfo[0];
     pPixDomNode.border = 0;
     pPixDomNode.width = realWidth;
     pPixDomNode.height = realHeigth;
     pPixDomNode.style.position = 'absolute';
     pPixDomNode.style.left = posX;
     pPixDomNode.style.top = posY;
}

//****************************************************
//*** Gestion du lien d'une image
//****************************************************
// pPixInfo : info d'une image
// pLinkDomNode : noeud DOM du lien (balise A)
// pMode : true or false
function defineLinkParameters(pPixInfo,pLinkDomNode,pAjaxMode) {

     // Ajout du lien http
     if (pPixInfo.length == 4) {
         pLinkDomNode.href = pPixInfo[3];
         if (!(pAjaxMode&&isJavaScriptLink(pPixInfo[3]))) {
           pLinkDomNode.target = 'blank_';
         } else {
           pLinkDomNode.target = '';
         }
     } else {
         pLinkDomNode.href = '#';
     }
}
//****************************************************
//*** REMARQUE : Gestion du lien d'une image en AJAX
//****************************************************
// La zone cible doit être différente de la zone
// d'affichage du diaporama.
// Modif de code à réaliser sinon pour arrêter les
// temporisations.
// En mode ajax, un lien commençant par JavaScript est 
// considéré comme un lien AJAX
//****************************************************


//****************************************************
//*** Vérifie s'il s'agit d'un lien JavaScript
//****************************************************
function isJavaScriptLink(pLink) {
	// Pattern d'un email
	var linkPattern = "^javascript.*$";
	reg = new RegExp(linkPattern,"gi"); // insensible à la casse
	return (pLink.match(reg));
}



