/* (C) 2005 Nicolas Richasse
 *
 * Manuel d'utilisation de la bibliotheque
 *
 * * Creation de bulles d'aide
 * ===========================
 *
 * - insérer dans le body : 
 
<SCRIPT language="JavaScript">
	initBulle();             <!-- appel à l'initialisation des infos bulles (laisser dans le BODY) -->
	ajouterBulle("bulle");   <!-- ajout d'une bulle de nom 'bulle' -->
	ajouterBulle("aide");    <!-- pareil ... -->
</SCRIPT>

 *
 * - puis pour appeler une bulle par exemple : 
 
 <A href="#" onMouseDown="afficherBulleMouse('aide', 'Une bulle d'aide géniale')">bla bla bla bla</a>
 
 *
 * - pour cacher une bulle, appeler la méthode : hideBulle(idBulle);
 *
 *
 * * Création d'un calendrier
 * ==========================
 * 
 * - créer une bulle
 *
 * - créer une balise FORM contenant des champs invisibles représentant le JOUR, le MOIS et l'ANNEE
 *
 * - dans cette balise FORM, insérer une zone de texte pour l'affichage de la date, par exemple : 
 
 <input type="texte" name="dateTexte" disabled class="zone_texte_disabled">
 
 *
 * - appeler la méthode afficherCalendrier() sur une image ou un texte (dans cet exemple sur une image)
 
 <a href="javascript:afficherCalendrier('maBulle', 'maFORM', 'monJour', 'monMois', 'monAnnee', 'monImage', 'dateTexte');">
 	<img border=0 src="calendar.gif" name="monImage">
 </a>
 
 *
 * - rajouter le script suivant apres la déclaration de la FORM
 
 <SCRIPT language="JavaScript">
	initDate('maForm', 'monJour', 'monMois', 'monAnnee', 'dateTexte');
 </SCRIPT>
 
 *
 */


/*
 * FONCTIONS DE BULLE
 */

var mouseX=0;mouseY=0;

function afficherBulleMouse(idBulle, contenu)
{
  afficherBullePosition(idBulle, contenu, mouseY, mouseX);
}

function afficherBulle(idBulle, contenu, imageRelative)
{
  var img = document.all[imageRelative];
  var tmp = getPositionBulle(img);
  afficherBullePosition(idBulle, contenu, tmp.top, tmp.left);
}

function afficherBullePosition(idBulle, cont, myTop, myLeft)
{
  // decalages
  var xOffset=0;yOffset=1;
  
  // le contenu de la bulle

  var contenu="<TABLE cellspacing=0 cellpadding=0 class=\"bulle\">"+
  	"<TR>"+
	"<TD>"+
	"<TABLE width=\"100%\" border=0 cellpadding=0 cellspacing=0>"+
	"  <TR>"+
	"    <TD>"+
	"      "+cont+
	"    </TD>"+
	"  </TR>"+
	"  </TABLE>"+
	"</TD>"+
	"</TR>"+
	"</TABLE>&nbsp;";
	
  var finalPosX=myLeft-xOffset;
  if (finalPosX<0)
    finalPosX=0;
  
  if (document.layers)
    {
      document.layers[idBulle].document.write(contenu);
      document.layers[idBulle].document.close();
      
      document.layers[idBulle].top=myTop+yOffset;
      document.layers[idBulle].left=finalPosX;
      
      document.layers[idBulle].visibility="show";
    }
  if (document.all) 
    {
      document.all[idBulle].innerHTML=contenu;
      
      document.all[idBulle].style.top=myTop+yOffset;
      document.all[idBulle].style.left=finalPosX;
      
      document.all[idBulle].style.visibility="visible";
    }
  else if (document.getElementById) 
    {
      document.getElementById(idBulle).innerHTML=contenu;
      
      document.getElementById(idBulle).style.top=myTop+yOffset;
      document.getElementById(idBulle).style.left=finalPosX;
      
      document.getElementById(idBulle).style.visibility="visible";
    }
}

function getPositionBulle(imageReference)
{
  var retour = new Object();
  
  var dB=document.body;
  var eL=0;
  var eT=0;
  /*
  var divL=0;
  var divT=0;
  var nbDiv=0;
  */
  for(var p=imageReference;p&&p.tagName!='BODY'&&p.tagName!='DIV';p=p.offsetParent)
    {
		//alert("p : "+p.tagName+" --> tagName == 'BODY' ? : "+(p.tagName=='BODY'));
      eL+=p.offsetLeft;
      eT+=p.offsetTop;
    }
  
  var eH=imageReference.offsetHeight;
  var dH=0;
  var sT=dB.scrollTop;
  //alert("eL = "+eL+" - eT = "+eT+" - imageReference.offsetHeight = "+imageReference.offsetHeight);
  
  retour.top = eT+imageReference.offsetHeight;
  retour.left = eL;
  
  return retour;
  //if(eT-dH>=sT&&eT+eH+dH>dB.clientHeight+sT) eT-=dH;else eT+=eH;cF.style.left=eL;cF.style.top=eT;
}

function getMousePos(e) 
{
  if (document.all) 
    {
      mouseX=event.x+document.body.scrollLeft; //modifs CL 09/2001 - IE : regrouper l'évènement
      mouseY=event.y+document.body.scrollTop;
    }
  else 
    {
      mouseX=e.pageX; //modifs CL 09/2001 - NS6 : celui-ci ne supporte pas e.x et e.y
      mouseY=e.pageY; 
    }
}

function hideBulle(idBulle)
{
  if (document.layers) 
    {
      document.layers[idBulle].visibility="hide";
    }
  if (document.all) 
    {
      document.all[idBulle].style.visibility="hidden";
    }
  else if (document.getElementById)
    {
      document.getElementById(idBulle).style.visibility="hidden";
    }
}

function isBulleVisible(idBulle)
{
  if (document.layers) 
    {
      return document.layers[idBulle].visibility == "show";
    }
  if (document.all) 
    {
      return document.all[idBulle].style.visibility == "visible";
    }
  else if (document.getElementById)
    {
      return document.getElementById(idBulle).style.visibility == "visible";
    }
}

function initBulle()
{
  if (document.layers)
    {
      window.captureEvents(Event.MOUSEMOVE);
      window.onMouseMove=getMousePos;
    }
  if (document.all)
    {
      document.onmousemove=getMousePos;
    }
  //modif CL 09/2001 - NS6 : celui-ci ne supporte plus document.layers mais document.getElementById
  else if (document.getElementById)
    {
      document.onmousemove=getMousePos;
    }
}

function ajouterBulle(nomBulle)
{
  if (document.layers)
    {
      document.write("<LAYER name='"+nomBulle+"' top=0 left=0 visibility='hide' ></LAYER>");
    }
  else if ((document.all) || (document.getElementById))
    {
      document.write("<DIV id='"+nomBulle+"' style='position:absolute;top:0;left:0;visibility:hidden;z-index:1'></DIV>");
    }
}


/*
 * FONCTIONS DE CALENDRIER
 */
nbJoursParMois = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
joursDeSemaine = new Array("dimanche", 
			   "lundi", 
			   "mardi", 
			   "mercredi", 
			   "jeudi", 
			   "vendredi", 
			   "samedi", 
			   "dimanche");
joursDeSemaineCourts = new Array("dim", 
				 "lun", 
				 "mar", 
				 "mer", 
				 "jeu", 
				 "ven", 
				 "sam", 
				 "dim");
moisDeLannee = new Array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre");

nbJoursQuadrillageInitial = 28;

function isAnneeBissextile(annee)
{
  return (annee % 4 == 0) && (annee % 100 != 0) || (annee % 400 == 0); 
}

function mod(nb, modulo)
{
  if (nb < 0)
    {
      return mod(modulo+nb, modulo);
    }
  else
    {
      return nb%modulo;
    }
}

function decAnnee(annee)
{
  if (annee < 1971)
    {
      return 1970;
    }
  else
    return annee-1;
}

function setVariable(formulaire, variable, valeur)
{
  document.forms[formulaire].elements[variable].value = valeur;
}

function getVariable(formulaire, variable)
{
  return document.forms[formulaire].elements[variable].value;
}

function initDate(idForm, formJour, formMois, formAnnee, idZoneTexte)
{
	dateCourante = new Date();
   
   annee = getVariable(idForm, formAnnee)*1;
   mois = getVariable(idForm, formMois)*1 - 1;
   jour = getVariable(idForm, formJour)*1;
   
   dateVoulue = new Date(annee, mois, jour);
   
   if ((dateVoulue.getDate() != jour) ||
		 (dateVoulue.getMonth() != mois) ||
		 (annee <= 1970))
	{
	  jour = dateCourante.getDate()*1;
	  mois = dateCourante.getMonth()*1;
	  
	  annee = dateCourante.getFullYear()*1;
	}
   
   setVariable(idForm, formJour, jour);
   setVariable(idForm, formMois, mois*1+1);
   setVariable(idForm, formAnnee, annee);
	
	setVariable(idForm, idZoneTexte, jour+'/'+(mois*1+1)+'/'+annee);
}

function afficherCalendrier(idBulle, idForm, formJour, formMois, formAnnee, imageRelative, idZoneTexte)
{
  if (isBulleVisible(idBulle))
    {
      hideBulle(idBulle);
      return;
    }
  else
    {
	 	//initDate(idForm, formJour, formMois, formAnnee, idZoneTexte);
		
      dateCourante = new Date();
      
      annee = getVariable(idForm, formAnnee)*1;
      mois = getVariable(idForm, formMois)*1 - 1;
      jour = getVariable(idForm, formJour)*1;
      
      dateVoulue = new Date(annee, mois, jour);
      
      if ((dateVoulue.getDate() != jour) ||
	  		 (dateVoulue.getMonth() != mois) ||
	  		 (annee <= 1970))
		{
	  		jour = dateCourante.getDate()*1;
	  		mois = dateCourante.getMonth()*1;
	  		
	  		annee = dateCourante.getFullYear()*1;
		}
      
      setVariable(idForm, formJour, jour);
      setVariable(idForm, formMois, mois*1 + 1);
      setVariable(idForm, formAnnee, annee);
      
      getCalendrier(idBulle, mois, annee, idForm, formJour, formMois, formAnnee, imageRelative, idZoneTexte);
    }
}

function getCalendrier(idBulle, mois, annee, idForm, formJour, formMois, formAnnee, imageRelative, idZoneTexte)
{
  nbJoursQuadrillage = nbJoursQuadrillageInitial;
	
  // la chaine de caracteres a retourner représentant le calendrier en HTML
  retour = "";
  
  // le numéro du 1er jour de la semaine du mois et de l'année spécifiés
  numJour = new Date(annee, mois, 1).getDay();
  
  // on écrit les noms des jours
  retour += "<table class=\"calendrier\" width=\"100%\">";
  
  // on affiche le bouton de fermeture
  retour += "<tr><td colspan=7 class=\"barre_de_selection\">"+
    "<a href=\"#\" onclick=\"hideBulle('"+idBulle+"')\">x</a>&nbsp;"+
    "</td></tr>";
  
  // on écrit la date avec modificateurs
  retour += "<tr><td colspan=7 align=\"center\" class=\"barre_selection_date\">"+
    "<table border=0 width=\"100%\"><tr>"+
    "<td align=\"center\" width=\"60%\">"+
    "<a href=\"#\" onclick=\"getCalendrier('"+idBulle+"',";
  
  newMois = mod((mois-1),12);
  
  newAnnee = annee;
  if (newMois == 11)
    {
      newAnnee = decAnnee(annee);
    }
  
  retour += newMois+","+newAnnee+",'"+idForm+"','"+formJour+"','"+formMois+"','"+formAnnee+
    "', '"+imageRelative+"', '"+idZoneTexte+"')\">&lt;</a> <font>"+moisDeLannee[mois]+
    " </font><a href=\"#\" onclick=\"getCalendrier('"+idBulle+"',";
  
  newMois = ((mois+1)%12);
  
  newAnnee = annee;
  if (newMois == 0)
    {
      newAnnee = annee+1;
    }
  
  retour += newMois+","+newAnnee+",'"+idForm+"','"+formJour+"','"+formMois+"','"+formAnnee+"', '"+imageRelative+"', '"+idZoneTexte+"')\">&gt;</a>"+
    "</td>"+
    "<td align=\"center\">"+
    "<a href=\"#\" onclick=\"getCalendrier('"+idBulle+"',"+mois+","+decAnnee(annee)+",'"+idForm+"','"+formJour+
    "','"+formMois+"','"+formAnnee+"', '"+imageRelative+"', '"+idZoneTexte+"')\">&lt;</a> <font>"+annee+
    " </font><a href=\"#\" onclick=\"getCalendrier('"+idBulle+"',"+mois+","+(annee+1)+",'"+idForm+"','"+formJour+
    "','"+formMois+"','"+formAnnee+"', '"+imageRelative+"', '"+idZoneTexte+"')\">&gt;</a>"+
    "</td>"+
    "</tr></table>"+
    "</td></tr>";
  
  retour += "<tr>";
  for (i=0 ; i<7 ; i++)
    {
      retour += "<td class=\"cellule_nom_jour\"><font>"+joursDeSemaineCourts[(i+1)%7]+"</font></td>";
    }
  retour += "</tr>";
  
  // on écrit les jours
  nbJours = nbJoursParMois[mois];
  
  if (mois == 1 && isAnneeBissextile(annee))
    {
      nbJours++;
    }
  
  if (numJour == 0)
    numJour = 7;
  
  // on ajuste le nombre de cases du cadrillage
  
  if (nbJours+numJour-1 > nbJoursQuadrillage)
    {
      nbJoursQuadrillage += 7 * Math.ceil((nbJours+numJour-1-nbJoursQuadrillage)/7);
    }
  
  for (i=0 ; i<nbJoursQuadrillage ; i++)
    {
      if((i%7 == 0) || (i == 0))
	{
	  retour += "<tr>";
	}
      
      if ((i<numJour-1) || (i>=nbJours+numJour-1))
	{
	  retour += "<td class=\"cellule_jour_vide\">";
	  retour += "&nbsp;";
	}
      else
	{
		tmp = (i+2-numJour);
		
		if (getVariable(idForm, formJour)*1 == tmp &&
			 getVariable(idForm, formMois)*1-1 == mois &&
			 getVariable(idForm, formAnnee)*1 == annee)
		{
			retour += "<td class=\"cellule_jour_selectionne\">";
		}
		else
		{
	  		retour += "<td class=\"cellule_jour\">";
		}
			
	  retour += "<a href=\"#\" onclick=\"setVariable('"+idForm+"','"+formJour+"',"+tmp+");"+
	    "setVariable('"+idForm+"','"+formMois+"',"+(mois*1+1)+");"+
	    "setVariable('"+idForm+"','"+formAnnee+"',"+annee+");"+
		 "setVariable('"+idForm+"', '"+idZoneTexte+"', '"+tmp+"/"+(mois*1+1)+"/"+annee+"');"+
	    "hideBulle('"+idBulle+"');"+
	    "\">";
	  
	  retour += tmp;
	  
	  retour += "</a>";
	}
      retour += "</td>";
      
      if(((i+1)%7 == 0) || (i == nbJoursQuadrillage-1))
	{
	  retour += "</tr>";
	}
    }
  
  retour += "</table>";
  
  afficherBulle(idBulle, retour, imageRelative);
}

