//
// Affichette dynamique et notes avec option de persistance...
// Ca en jette comme titre, hein?
//
// Copyright Gilles Karmasyn 2000-2003
//
// En cas de "recuperation", merci de laisser le copyright dans le code...
// Parce que je me suis vraiment press le cevelat pour tout a...

charge    = false;
refnum    = false;
oldNote   = false;
attente   = 0;      // temps de fermeture apres onMouseOut de la reference
surLaNote = false;
tempoIE   = 0;      // tempo de fermeture pour IE, necessaire pour Mac 
                    // car la detection de la sortie de la note se fait par 
                    // rapport au bas du curseur et non au haut du curseur...
                    // cette tempo donne le temps de cliquer sur un lien
                    // eventuel...
IsIEMac    = false;                    
IsNetscape = false;
IsNS6      = false;
IsIE       = false;
IsSaf      = false; // ncessaire poure grer une diffrence sur style.top
ecartBordIE = 0;
eloignementVert = 0; // pour les legendes (plus eloignees que les notes)
if ((document.layers) || (!document.getElementById)) //navigator.appName == "Netscape"))
{
	adresseCourante = top.location.pathname;
	alert("Vous utilisez un navigateur version 4 ou anterieure. Les pages de PHDN sont mieux visualisees avec des navigateurs plus recents. En attendant, vous etes transporte vers une version du site lisible par votre navigateur actuel (mais incomplete...).");
	top.location = "http://gilkarm.free.fr/phdn"+adresseCourante;
}

if (!document.layers) // || (PAS navigator.appName == "Netscape"))
{
    document.write("<style type='text/css'>");
    document.write("A.appel-note {margin-left: 1px;}");
    document.write("</style>");
}
// initialisation et capture de la taille de l'ecran, tout ca...
function init()
{
    if (document.layers) // || (navigator.appName == "Netscape"))
    {
        largeur = window.innerWidth;
        hauteur = window.innerHeight; 
        charge  = true;
        IsNetscape = true;
    }
    if (document.all) // IE
    {
        largeur = document.documentElement.offsetWidth;
        hauteur = document.documentElement.offsetHeight;
        charge  = true;
        IsIE    = true;
        tempoIE = 500;
        if (navigator.appVersion.indexOf("Win") != -1)
        {
            ecartBordIE = 15; // le bord droit est hors du cadre
        }                     // sur NS Windows !
        else ecartBordIE = 0;
    }
    
    // -------------------
    // NS6 deb
    if (document.getElementById && !IsIE)
    {
        IsNS6   = true;
        largeur = window.innerWidth;
        hauteur = window.innerHeight; 
        charge  = true;
        
        if (navigator.appVersion.indexOf("Safari", 0) > 0)
        {  
            IsSaf = true;
        }
    }   
    // NS6 fin
    // -------------------
    if (navigator.appName == "Opera")
    {
        IsNS6  = true;
        IsIE   = false;
    }
    // desactivation des notes pour IE4 non Windows
    // Mais si IE5, on active...
    // le calcul de la hauteur de fenetre change aussi... :-(
    if ((document.all) && (navigator.platform != "Win32"))
    {
        nomApplication = navigator.appVersion;
        nOccurrence = nomApplication.indexOf("MSIE 5", 0);
        
        if (nOccurrence > 0) // IE5
        {
            charge  = true;
            hauteur = document.documentElement.clientHeight; 
            IsIEMac = true;
        }
        else charge=false;
    }
}

// ---------------------------------------
// reload()
// Teste si la page est dans le bon frame
// top si booself est true...  
// pagecourante contient la reference
// a la page qui *doit* etre dans top
// ---------------------------------------
function reload(pagecourante, boolSelf) 
{
    // routeSiWorldnet();
         
    if (boolSelf)
    {
        if (top.location != self.location) top.location=pagecourante;
    }
    else
    {
        if (top.location == self.location) top.location=pagecourante;    
    } 
    
    init();
}


// -----------------------------------------------------
// Initialisation des reflexes onMouseOver et onMouseOut 
// de la Layer/note courante
// Appele uniquement s'il y a un lien dans la note...
//
// nb layers: Netscape: document.layers.length
//            IE:       document.all.tags('SPAN').length
//
// On aura note que le fonctionnement pour IE et NC n'est
// pas tout a fait le meme...
// Comme dirait un gourou unix de ma connaissance: 
// bestial... :-)
// 
// -----------------------------------------------------
function initReflexesNote()
{
    if (IsNetscape)
    {
        document[refnum].onmouseover = new Function ("SignalerOnMouseOver();");
        document[refnum].onmouseout  = new Function ("fermerNoteBrute();");
    }
    
    if (document.all)
    {
        document.all[refnum].onmouseover = new Function ("SignalerOnMouseOver();");
        document.all[refnum].onmouseout  = new Function ("SignalerOnMouseOut();");
    }
    if (IsNS6)
    {
          document.getElementById(refnum).onmouseover = new Function ("SignalerOnMouseOver();");
          document.getElementById(refnum).onmouseout  = new Function ("SignalerOnMouseOut();");
     //     document.getElementById(refnum).onmouseout  = new Function ("fermerNoteBrute();");
    }
}

function riendutout()
{
    // rien du tout!
    // puissant, hein?
}

function ouvrirFenDyn(event, note, largeurFen)
{
    if (charge)
    {
        ouvert = true;
        refnum = note;
 
        // -------------------
        // NS6 deb
        if (IsNS6)
        {            
            abscisse=event.clientX; 
            ordonnee=event.clientY; // ordonne par rapport au haut *visible* de la fentre
                                    // pour le positionnement on rajoutera le pageYOffset
                                    // qui mesure la distance de dcalage due au dplacement
                                    // par l'ascenceur
            layerNote = document.getElementById(note);
            // ---------------------------------
            // gestion des grosses notes
            myClass = layerNote.className;
            if (myClass == "notesmax-dyn")
            {
                if (abscisse>(largeur/2))
                {
                    layerNote.style.width = abscisse - 50;
                } else 
                {
                    layerNote.style.width  = largeur - abscisse - 50;
                }
            }
            // fin gestion des grosses notes
            // ---------------------------------
            
            if (ordonnee>(hauteur/2))
            {
                // h = (document.getElementById(note).style.clip.height+5); // note au dessus
                h = (layerNote.offsetHeight+5) + eloignementVert; // note au dessus
                diffH = ordonnee - h; // pour gestion dpassement vertical
            } else 
            {
                h = -5 - eloignementVert;   // note en dessous
                diffH = hauteur - ordonnee + 5 - layerNote.offsetHeight;
            }
            
            // ---------------------------
            // gestion de Safari. Diffrence dans la dfinition de style.top (ou event.clientY ???)
            if (IsSaf && pageYOffset>0)
            {
                if ( (ordonnee-pageYOffset)<(hauteur/2) ) // note en dessous
                {
                    h = -5 - eloignementVert;   // note en dessous
                    diffH = hauteur - (ordonnee - pageYOffset) + 5 - layerNote.offsetHeight;
                }
                else 
                {
                    h = (layerNote.offsetHeight+5) + eloignementVert; // note au dessus
                    diffH = ordonnee - pageYOffset - h; // pour gestion dpassement vertical                    
                }
            }
            // fin gestion de Safari
            // ---------------------------
            
            var sommet = pageYOffset + ordonnee - h;
                        
            // pageYOffset = decalage de la partie sup. gauche de la partie
            //               visible de la page  l'intrieur de la fenetre
            largeurFen = layerNote.offsetWidth;
              
            if (abscisse>(largeur/2))
            {
                l = largeurFen + 10 ;
            } else 
            {
                l = -5;
            }
                 
            var cote_gauche = abscisse - l;
            
            // --------------------------------------
            // Gestion du dpassement horizontal (cas Netscape 7)
            // dpassement   gauche ou  droite => on dcale
            //
            if (cote_gauche < 0) cote_gauche = 5; 
            if ( (cote_gauche+largeurFen) >  (largeur-15)) cote_gauche = largeur - largeurFen - 15;
            //
            // fin gestion dpassement horizontal
            // -----------------------------------------
            // --------------------------------------
            // Gestion du dpassement vertical
            if (diffH-15 < 0) // note trop grande verticalement pour tre vue en entier
            {
                cote_gauche = 0 + 5;
                layerNote.style.width = largeur - 50;
                
                // l'largissement entrane un changement de hauteur  grer si
                // la note est au dessus....
                
                // On gre le cas Safari... pour lequel la condition de dpassement est diffrente
                // car la dfinition de ordonne = event.clientY semble diffrente de Gecko
                // Dans les deux cas de dpassement le code conditionn est le mme car dans
                // dans le cas de Safari, il y a un rattrapage plus bas
                
                if (!IsSaf && (ordonnee>(hauteur/2)) )
                {
                    h = (layerNote.offsetHeight+5) + eloignementVert;
                    sommet = pageYOffset + ordonnee - h;
                }
                
                if (IsSaf && ((ordonnee-pageYOffset)>(hauteur/2)) )
                {
                    h = (layerNote.offsetHeight+5) + eloignementVert;
                    sommet = pageYOffset + ordonnee - h;
                }
            }
            // fin gestion dpassement vertical
            // -----------------------------------------
            // Pb avec Safari: style.top prend le dbut rel de la page et non le dbut affich =>
            // Il ne faut pas prendre pageYOffset, le dfilement, en compte
            if (IsSaf) sommet = sommet - pageYOffset;
            // fin Safari
            
            layerNote.style.left       = cote_gauche+"px";
            layerNote.style.top        = sommet+"px";
            layerNote.style.visibility = "visible";
        }
        // NS6 fin
        // -------------------
    
        if (IsNetscape) // Netscape
        {
        
            abscisse=event.pageX; //  abscisse=event.screenX;
            ordonnee=event.pageY; //  ordonnee=event.screenY;
            
            layerNote = document[note];
            
            // ---------------------------------
            // gestion des grosses notes
            // PAS DE GESTION POSSIBLE POUR NETSCAPE 4!!!
            // CAR LES LAYER NE SE RESIZENT PAS...
            // => GERER PAR POSITIONNEMENT + INTELLIGENT          
            // fin gestion des grosses notes
            // ---------------------------------
            
            largeurFen = layerNote.clip.width;
            
            if (abscisse>(largeur/2))
            {
                l = largeurFen+5 ;
                
                // gestion grosse note => positionnement intelligent
                // trop fort le mec!
                if ( largeurFen > abscisse ) l = abscisse - 5;
            } 
            else 
            {
                l = -5;
                
                // gestion grosse note => positionnement intelligent
                // trop fort le mec!
                if ( (largeur-abscisse) < largeurFen) l = abscisse - largeur + largeurFen + 5;              
            }
        
            // pageYOffset = decalage de la partie sup. gauche de la partie
            //               visible de la page  l'intrieur de la fenetre
                                
            if (ordonnee>pageYOffset + (hauteur/2))
            {
                h = (layerNote.clip.height+5) + eloignementVert; // note au dessus
            } else 
            {
                h = -5 - eloignementVert;   // note en dessous
            }   
        
            var cote_gauche = abscisse - l;
            var sommet      = ordonnee - h;
       
            layerNote.left       = cote_gauche+"px";
            layerNote.top        = sommet+"px";
            layerNote.visibility = "show";
        }
    
    
        if (document.all) //IE
        {
            abscisse=event.clientX;
            ordonnee=event.clientY;
            
            layerNote = document.all[note];
    
            if (layerNote.offsetWidth> (largeur/2))
            {
                layerNote.style.width = ((largeur/2)-15);
            }
        
            // ---------------------------------
            // gestion des grosses notes
            myClass = document.getElementById(note).className;
            if (myClass == "notesmax-dyn")
            {
                if (abscisse>(largeur/2))
                {
                    layerNote.style.width = abscisse - 15;
                } else 
                {
                    layerNote.style.width  = largeur - abscisse - 30 - ecartBordIE;
                }
            }
            // fin gestion des grosses notes
            // ---------------------------------
            if (ordonnee>(hauteur/2))
            {
                h = (layerNote.offsetHeight+5) + eloignementVert;
                diffH = ordonnee - h; // pour gestion dpassement vertical
            } else 
            {
                h = -5 - eloignementVert;
                diffH = hauteur - ordonnee + 5 - layerNote.offsetHeight;
            }
            var sommet = document.documentElement.scrollTop  + ordonnee - h;
            
            if (abscisse>(largeur/2))
            {
                l = layerNote.offsetWidth+5 ;
            } else 
            {
                l = -10;
            }
         
            var cote_gauche = document.documentElement.scrollLeft + abscisse - l; 
            // --------------------------------------
            // Gestion du dpassement vertical
            if (diffH-15 < 0) // note trop grande verticalement pour tre vue ne entier
            {
                cote_gauche = 0 + 5;
                layerNote.style.width = largeur - 15 - ecartBordIE;
                
                // l'largissement entrane un changement de hauteur  grer si
                // la note est au dessus....
                if (ordonnee>(hauteur/2))
                {
                    h = (layerNote.offsetHeight+5) + eloignementVert;
                    sommet = document.documentElement.scrollTop  + ordonnee - h;
                }
            }
            // fin gestion dpassement vertical
            // -----------------------------------------
            layerNote.style.pixelTop   = sommet;
            layerNote.style.pixelLeft  = cote_gauche;
            layerNote.style.visibility = "visible";
        }
    }
    else // affichettes non fonctionnelles
    {
        // rien du tout
    }
}

function fermerNoteBrute()
{
    if (refnum && ouvert)
    {
        if (IsNetscape)
        {
            document[refnum].visibility = "hide";
        }
        if (document.all)
        {
            document.all[refnum].style.visibility = "hidden";
        }
        
        if (IsNS6)
        {
            document.getElementById(refnum).style.visibility = "hidden";
        }
        ouvert    = false;
        surLaNote = false;
    }
}

// ---------------------------------------
// fermeture de la note seulement si on 
// n'est pas sur la Layer note
// ---------------------------------------
function fermerNoteIntelligent()
{
    if (!surLaNote) // le test sur refnum et ouvert
    {               // est dans fermerNoteBrute
        fermerNoteBrute();
    }
}

// ---------------------------------------
// Appele par onMouseOver de la Layer note
// ---------------------------------------
function SignalerOnMouseOver()
{
    surLaNote = true; 
}
// ---------------------------------------
// Appele par onMouseOut de la Layer note
// ---------------------------------------
function SignalerOnMouseOut()
{
    surLaNote = false; 
}

// ---------------------------------------
// fermerNote()
// Entree principale de fermeture de note
// Fermeture selon tempo avec enclenchement
// de la mecanique de detection d'entree
// sortie de la layer
// ---------------------------------------
function fermerNote(boolFermerImmediat)
{
    if (refnum && ouvert)
    {
        if (attente == 0 || boolFermerImmediat)
        {   
            fermerNoteBrute();
        } 
        else // cas d'une note contenant des liens: on doit
             // pouvoir se positionner dessus... 
        {
            initReflexesNote();
            oldNote = refnum; 
	        tempo = setTimeout("enfinFermerNote()", attente);
	    }
	}
} 

// ---------------------------------------
// enfinFermerNote()
// Tentative de fermeture initiale si hors
// de la layer, puis mecanique de detection
// de sortie de la layer  
// ---------------------------------------
function enfinFermerNote()
{
    if (refnum == oldNote) // sinon on a ouvert une autre note avant l'coulement de la seconde
    {
        fermerNoteIntelligent(); // ferme la note si on n'est pas dessus
    
        if (ouvert)              // note non fermee => on est dessus 
        {
            if (IsNetscape) document.captureEvents(Event.MOUSEMOVE); // bestial!
            document.onmousemove = dedansDehors;
        }
   }
}

// ---------------------------------------
// dedansDehors()
// Ferme la note des que l'on sort de la 
// Layer note
// ---------------------------------------
function dedansDehors(e) 
{
    if (IsInside(e) == false)
    {
        tempo = setTimeout("fermerNoteBrute()", tempoIE);
    	if (IsNetscape)
        {
	       document.releaseEvents(Event.MOUSEMOVE);
        }
    	if (document.all)
    	{
	       document.onmousemove = null;
    	} 
    	if (IsNS6)
    	{
	       document.onmousemove = null;
    	} 
    }
} 

// ---------------------------------------
// IsInside()
// Informe si on est dans ou hors de la
// Layer note  
// Surtout utile pour IE5 Mac, mais utilise
// pour IE5 systematiquement... En attendant de
// tester l'aute mecanisme sur IE5 PC
// ---------------------------------------
function IsInside(e)
{
	if (IsNetscape)
	{
       wecy      = e.pageY;
       wecx      = e.pageX;
       layerNote = document[refnum];
       
       som       = layerNote.top;
       cote_gau  = layerNote.left;
       larg      = layerNote.clip.right;
       haut      = layerNote.clip.bottom;
    }
    
	if (document.all)
	{
       wecy      = window.event.clientY + document.documentElement.scrollTop;
       wecx      = window.event.clientX + document.documentElement.scrollLeft;
       layerNote = document.all[refnum];
       
       som       = layerNote.offsetTop;
     
       cote_gau  = layerNote.offsetLeft;
       larg      = layerNote.offsetWidth;
       haut      = layerNote.offsetHeight;
	}
	if (IsNS6)
	{
       wecy      = e.clientY + pageYOffset;
       wecx      = e.clientX;
       layerNote = document.getElementById(refnum);
       
       som       = parseInt(layerNote.style.top);
            
       cote_gau  = layerNote.offsetLeft;
       larg      = layerNote.offsetWidth;
       haut      = layerNote.offsetHeight;
	} 
	
	// Et maintenant, Zeu formule of calcule top astucieuse
    if((wecy>som && wecy<som+haut) && (wecx>cote_gau && wecx<cote_gau+larg)) 
	{
       surLaNote = true; 
	   return true;
	}
	else 
	{
       surLaNote = false;
	   return false;
	}
}
function ouvrirNote(event, note)
{
    if (refnum && ouvert) fermerNoteBrute();
    
    if (document.getElementById)
    {
        myClass = document.getElementById(note).className;
        if (myClass == "legende1")
        {
            eloignementVert = 15;
        }
        else eloignementVert = 0;
    }
    
    ouvrirFenDyn(event, note, 300);
    attente = 1000;
}

function ouvrirCommentaire(event, note)
{
    if (refnum && ouvert) fermerNoteBrute();
    ouvrirFenDyn(event, note, 120);
    attente = 0;
}
// --------------------------------------------------------------
// --------------------------------------------------------------
// --------------------------------------------------------------
function getRealLeft(el) 
{
    xPos   = el.offsetLeft;
    tempEl = el.offsetParent;
    while (tempEl != null)
    {
        xPos += tempEl.offsetLeft;
        tempEl = tempEl.offsetParent;
    }
    return xPos;
}
xLeftLegende  = 100; // valeur moyenne crdible si on a oubli "referenceLegende"
wLargeurWidth = 100;
bPasPasse     = true;
bParLegende2  = false;
bPasPasseIE   = true;
function ouvrirlegende (note)
{ 
    if (refnum && ouvert) fermerNoteBrute();
    refnum = note;
    layerNote = document.getElementById(note);
    
    if (bPasPasseIE && IsIE && !IsIEMac) // Putain de d?passement ? droite sur IE6 Win!
    {
        xPosition     = layerNote.offsetLeft + layerNote.offsetParent.offsetLeft;
        wLargeurWidth = largeur - xPosition - 40 - ecartBordIE;
        bPasPasseIE = false;
    }
    if (IsIE && !IsIEMac) layerNote.style.width = wLargeurWidth;
    layerNote.style.visibility = "visible";
}
function ouvrirlegende2 (event, note)
{
    layerNote = document.getElementById(note);
    
    if (bPasPasse)
    {
        layerReference = document.getElementById("referenceLegende");
        if (layerReference != null) 
        {
            xLeftLegende   = getRealLeft(layerReference);
            bPasPasse      = false;
            
            if (IsIE && !IsIEMac) // bizarre offsetLeft sur IE5.5 win
            {
                xLeftLegende = layerReference.offsetLeft;
            }
        }
    }
    
    if (!document.all) 
    {
        layerNote.style.top = event.pageY - layerNote.offsetHeight - 25;
    }
    else
    {   
        layerNote.style.top = event.clientY + document.documentElement.scrollTop  - layerNote.offsetHeight - 23;
    }
    layerNote.style.left = xLeftLegende; // getRealLeft() d'un blockquote legende normal
                                         // => style position asbolute avec left=0 au dpart
    bParLegende2 = true;
    ouvrirlegende(note);
    bParLegende2 = false;
}

function fermerlegende (note)
{ 
    layerNote = document.getElementById(note);
    layerNote.style.visibility = "hidden";
    ouvert = false;
}
function fermerlegende2 (note)
{ 
    attente = 500;
    ouvert = true;
    refnum = note;
    fermerNote(false);   
    attente = 0;
}

