//-------------------------------------------------------------
//  Nom Document : GFBULLE.JS
//  Auteur       : G.Ferraz
//  Objet        : Info Bulle...
//  Création     : 01.12.2003
//-------------------------------------------------------------
//  Mise à Jour  : 29.05.2006
//  Objet        : Compatibilité IE6 et DOCTYPE
//  -----------------------------------------------------------
//  Mise à Jour  : 21.06.2006
//  Objet        : Prise en compte des <SELECT>
//  -----------------------------------------------------------
//  Mise à Jour  : 15.09.2006
//  Objet        : Amélioration et modif suite à commentaires
//  -----------------------------------------------------------
//  Mise à Jour  : 10.11.2006
//  Objet        : Correction Bug sous FF si document <DIV style="float...">
//  -----------------------------------------------------------
var DOM = (document.getElementById ? true : false);
var IE  = (document.all && !DOM ? true : false);
var NAV_OK   = ( DOM || IE );
var NETSCAPE = ( navigator.appName == 'Netscape');
var EXPLORER = ( navigator.appName == 'Microsoft Internet Explorer');
var OPERA    = ( window.opera ? true : false);
var Mouse_X;          // Position X en Cours de la Mouse
var Mouse_Y;          // Position Y en Cours de la Mouse
var Decal_X  = -10;   // Décalage X entre Pointeur Mouse et Bulle
var Decal_Y  = -10;   // Décalage Y entre Pointeur Mouse et Bulle
var bBULLE   = false; // Flag Affichage de la Bulle
// Flag pour présence Select sous IE
var bSELECT  = (navigator.appName =='Microsoft Internet Explorer') && !OPERA;

//-- Pour Test mode Cadre
var ZObjet = new RECT();   // Zone pour MouseMove
var ZBulle = new RECT();
var bCADRE = false;        // Flag Affichage du Cadre
var bINIT  = false;
var Fenetre = new RECT();
//=========================
// Définition pour le Cadre
//=========================
function RECT()
{
  this.Left   =0;
  this.Top    =0;
  this.Right  =0;
  this.Bottom =0;
  this.InitRECT = RECT_Set; 
  this.PtInRECT = RECT_PtIn;

}
//-------------------------------------------
function RECT_Set(left_,top_,larg_,haut_)
{
  with(this)
  {
    Left   = ( left_ ? left_ : -1);
    Top    = ( top_  ? top_  : -1);
    Right  = Left + ( larg_ ? (larg_ -1): 0);
    Bottom = Top  + ( haut_ ? (haut_ -1): 0);
  }
}
//-------------------------
function RECT_PtIn(x_, y_)
{
  with(this)
  {
    return(( x_ > Left) && ( x_ < Right) && ( y_ > Top ) && ( y_ < Bottom));
    if( x_ < Left || x_ > Right)  return(false);
    if( y_ < Top  || y_ > Bottom) return(false);
    return(true);
  }
}
//---------------------
function GetObjet(div_)
{
  if(DOM) return document.getElementById(div_);
  if(IE)  return document.all[div_];
  return(null);
}
//-----------------------------
function ObjWrite(div_,html_)
{
  var Obj=GetObjet(div_);
  if(Obj) Obj.innerHTML=html_;
}
//-- 10.11.2006 ----------------------------
// correction bug sur <DIV style="float...">
//------------------------------------------
function Get_DimFenetre()
{
  var L_Doc;
  var H_Doc;
  var DocRef;
  
  with(Fenetre)
  {
    if(window.innerWidth)
	{
      with(window)
	  {
        Left   = pageXOffset;
        Top    = pageYOffset;
        Right  = innerWidth;
        Bottom = innerHeight;
        //-- Modif du 10.11.2006
        L_Doc = document.body.clientWidth;
        H_Doc = document.body.clientHeight;
        //-- fin modif.
        if( Right  > L_Doc) Right  = L_Doc;
        if( Bottom > H_Doc) Bottom = H_Doc;
      }
    }
    else
	{ // Cas Explorer à part
      if(document.documentElement && document.documentElement.clientWidth) DocRef = document.documentElement;
      else DocRef = document.body;
      with(DocRef)
	  {
        Left   = scrollLeft;
        Top    = scrollTop;
        Right  = clientWidth;
        Bottom = clientHeight;
      }
    }
    //-- limite Maxi Fenêtre Affichage
    Right  += Left;
    Bottom += Top;
  }
}
//------------------------------------
function ObjShowAll(div_, x_, y_, z_)
{
  var B_Obj = GetObjet(div_);
  var F_Obj = GetObjet('F'+div_);
  var MaxX, MaxY;
  var Haut, Larg;
  var SavY = y_;
  if(B_Obj)
  {
    //-- Récup. dimension du DIV
    if(NETSCAPE)
	{
      Larg = B_Obj.offsetWidth;
      Haut = B_Obj.offsetHeight;
    }
    else
	{
      Larg = B_Obj.scrollWidth;
      Haut = B_Obj.scrollHeight;
    }
    with(Fenetre)
	{
	 //-- Réajuste dimension fenêtre
      MaxX = Right  - Larg;
      MaxY = Bottom - Haut;
		
      //-- Application Bornage
      if(x_ > MaxX) x_ = MaxX;
      if(x_ < Left) x_ = Left;
      if(y_ > MaxY) y_ = MaxY;
      if(y_ < Top)  y_ = Top;
    }
	
    //-- si en bas On réajuste
    //-- pour que la bulle ne prenne pas le focus
    if(y_==MaxY)
	{
      var DeltaY = MaxY -SavY;
      y_ = MaxY - DeltaY -Haut -2*Decal_Y;
    }
    //-- On place la Bulle
    if(bSELECT)	//-- Ajout pour SELECT sous IE
	{
      with(F_Obj.style)
	  {
		left       	= x_ +"px";
        top        	= y_ +"px";
        zIndex     	= z_-1;
        visibility 	= "visible";
      }
    }
	with(B_Obj.style)
	{
	  width		 	= "600px";
	 /*  
	  opacity	 	= 0.85;
	  MozOpacity 	= 0.85;
	  KhtmlOpacity 	= 0.85;
	  filter 		= "alpha(opacity=85)"; 
	  */
	  left       	= x_+"px";
      top        	= y_+"px";
      zIndex     	= z_;
      visibility 	= "visible";
    }
    //-- Affectation Zone du Rectangle
   ZBulle.InitRECT( x_, y_, Larg, Haut);
  }
}
//-- 15.09.2006 ------------------------
// Ajout Fonction Add_Event
//--------------------------------------
function Add_Event(obj_,event_,func_,mode_)
{
  if(obj_.addEventListener) obj_.addEventListener(event_,func_,mode_?mode_:false);
  else obj_.attachEvent('on'+event_,func_);
}
//-- 15.09.2006 ------------------------
// Utilisation de Add_Event
//--------------------------------------
function Init_Bulle()
{
  //-- Pour les SELECT on supprime l'événement hérite
  var Obj = document.body.getElementsByTagName('SELECT');
  if(Obj && Obj.length)
  {
    for(var i=0; i < Obj.length; i++)
	{
      if( Obj[i].size == 1)
	  {
        for(var k=0; k < Obj[i].options.length; k++)
		{
          Add_Event(Obj[i].options[k],'mousemove',BulleHide);
        }
      }
      Add_Event(Obj[i],'mousedown',BulleHide);
      Add_Event(Obj[i],'scroll',BulleHide);
    }
  }
  else bSELECT = false; // Pas de SELECT dans le document
  bINIT=true;
}
////////////////////////////
// mode Cadre Indépendant //
////////////////////////////
//------------------------
function CadreWrite(txt_)
{
  var Html;
  var B_Obj = GetObjet('Bulle');
  var F_Obj = GetObjet('FBulle');
  if(!bINIT) Init_Bulle();
  if(B_Obj)
  {
    //-- Récup dimension d'affichage
    Get_DimFenetre();
    Decal_X = -10;  // Decalage dans de la Bulle
    Decal_Y = -10;
    Html = '<table class="TableBulle" border="0" cellspacing="0" cellpadding="4">';
    Html += '<tr><td class="Bulle">'+txt_+'</td></tr></table>';
    B_Obj.innerHTML = Html;
	//-- Ajout pour SELECT sous IE
    if(bSELECT)
	{ 
      with(F_Obj.style)
	  {
        height = B_Obj.offsetHeight;
        width  = B_Obj.offsetWidth;
        left   = B_Obj.offsetLeft;
        top    = B_Obj.offsetTop;
      }
    }
    //-- On affiche le résultat
    ObjShowAll('Bulle',Mouse_X +Decal_X,Mouse_Y +Decal_Y,1000);
    bCADRE= true;
    EnableInfoBulle=false; 
	return( true);
  }
  return(false);
}
////////////////////////////
// mode Bulle Indépendant //
////////////////////////////
//-- 15.09.2006 ------------------------
// Ajout paramètre x_ et y_
//--------------------------------------
function BulleWrite(txt_,x_,y_)
{
  var B_Obj = GetObjet( 'Bulle');
  var F_Obj = GetObjet( 'FBulle');
  var Html;
  if(!bINIT) Init_Bulle();
  if(B_Obj)
  {
    //-- Récup dimension d'affichage
    Get_DimFenetre();
    // Decalage hors de la Bulle
    Decal_X =( x_ ? x_: 15);//    Decal_X = 5 par défaut
    Decal_Y =( y_ ? y_: 15);//    Decal_Y = 5 par défaut
   //-- Ecriture de la Bulle 
    Html  = '';
	//Html  += '<table border="0" cellspacing="0"><tr><td bgcolor="#0000c0">';
	Html += '<table class="TableBulle" border="0" cellspacing="0" cellpadding="4"><tr><td class="Bulle">'+txt_+'</td></tr></table>';
	//Html += '</TD></TR></TABLE>';
    B_Obj.innerHTML = Html;
    //-- Ajout pour SELECT sous IE
    if(bSELECT)
	{
      with(F_Obj.style)
	  {
        height = B_Obj.offsetHeight;
        width  = B_Obj.offsetWidth;
        left   = B_Obj.offsetLeft;
        top    = B_Obj.offsetTop;
      }
    }
    //-----------------------------------------//
    // IMPORTANT on n'affiche pas la Bulle     //
    // l'événement MouseOver va avec MouseMove //
    //-----------------------------------------//
    ObjShowAll('Bulle', Mouse_X +Decal_X, Mouse_Y +Decal_Y, 1000);
	bBULLE= true;
   return(true);
  }
 return(false);
}
//------------------
function BulleHide(){
  var B_Obj = GetObjet('Bulle');
  var F_Obj = GetObjet('FBulle');

  if( bSELECT){ //-- Ajout pour SELECT sous IE
    F_Obj.style.height = 0 +"px";
  }
  with(B_Obj)
  {
    innerHTML        = "&nbsp;"
	style.left       = -1000 +"px";
    style.top        = -1000 +"px";
    style.zIndex     = 0;
    style.visibility = "hidden";
  }
  //-- Pose les Flags
  bCADRE = false;
  bBULLE = false;
  return(true);
}
//--------------------
function WhereMouse(e)
{
  var DocRef;
  var Obj  = null;
  var bRECT= true;
  //-- On traque les hybrides
  if(e && e.target)
  {
	Mouse_X = e.pageX;
    Mouse_Y = e.pageY;
    Obj     = e.target;
    //-- Spécifique FireFox
    if(Obj.boxObject)
	{
      with(Obj)
	  {
        //-- La Zone de prise en compte
        ZObjet.InitRECT( boxObject.x, boxObject.y, boxObject.width, boxObject.height);
      }
      //-- Barre de défilement et autre sous FireFox
      Obj = e.originalTarget;
      if(Obj) if(Obj.prefix=="xul") { BulleHide(); return(true); }
      //-- Test pour SELECT sous FireFox
      bRECT = ZObjet.PtInRECT( Mouse_X, Mouse_Y);
    }
  }//-- Endif NETSCAPE
  else
  {
	if(document.documentElement && document.documentElement.clientWidth) DocRef = document.documentElement;
    else DocRef = document.body;
	Mouse_X = event.clientX +DocRef.scrollLeft;
    Mouse_Y = event.clientY +DocRef.scrollTop;
  }

  if(bBULLE) if(bRECT) ObjShowAll('Bulle',Mouse_X +Decal_X,Mouse_Y +Decal_Y,1000);

  if(bCADRE) if(!ZBulle.PtInRECT( Mouse_X, Mouse_Y)) BulleHide(); // on ne move pas on test juste si dans Rect

  return(true);
}
//== INITIALISATION ==================================
//-- 15.09.2006 ------------------------
// Ajout Fonction Add_Event
// Permet de faire autre chose...
//--------------------------------------
//document.onmousemove = WhereMouse;
Add_Event(document,'mousemove',WhereMouse);

//-- Création STYLE Bulle et DIV----------------------
var Html;
//if(NETSCAPE) document.write('<style TYPE="text/css">.TableBulle{width:500px;}</style>');
 
  //-- On met du style pour la bulle
  //Html  = '<STYLE TYPE="text/css">';
 // Html += '.Bulle{cursor:default;color:#000000;font-size:13px;font-family:Verdana;}';
 // Html += '</STYLE>';
  //document.write( Html);
  //-- Création du DIV Bulle
  Html ='<div id="Bulle" style="position:absolute; left:auto; top:auto; width:auto; height:auto; z-index:0; visibility:hidden"></div>';
  if(bSELECT) Html +='<iframe id="FBulle" style="position:absolute;visibility:hidden;border:0px;" frameborder="0" scrolling="no">&nbsp;</iframe>';
  document.write(Html);
  //-- Ajout pour SELECT sous IE
//-- EOF ------------------------------------------------------

