/*====================================================
  *
  * Fichier : DESlideMenu.js
  *
  * Auteur : SIMON Jerome
  *
  * Creer le : 19/07/05
  *
  * Modifier le : XX/XX/XX
  *
  * Description : Script permettant de creer un menu deroulant 
  *                           verticale avec effet glisser.
  *                        Ce script permet de gerer plusieur sous-niveau
  *
  * Principe de fonctionnement : le contenu a masquer / derouler 
  *                           est mis dans un calque (div) qui est cacher par 
  *                           un autre calque dont ont fait varier la taille 
  *                           entre 1 pixel (contenu masquer) et la taille
  *                           du calque contenu (contenu afficher)
  *
====================================================*/

/*====================================================
  *
  * Variable globale :
  *
  * divOuvert => (chaine de caractere) permet de stocker 
  *                              l'identifiant du dernier block ouvert
  *
  * vitesse => (entier) permet de regler la vitesse de deroulement 
  *                              du menu
  *
 ===================================================*/
var divOuvert = '-1';
var running = false;
var vitesse = 10;

/*====================================================
  *
  * togglePuce
  *
  * Parametre : id => (chaine de caractere) identifiant du block
  *
  * Valeur de retour : aucune
  *
  * Principe de fonctionnement : inverse l'etat de la puce du block
  *                            Si une puce est defini pour ce block alors 
  *                            son nom de fichier et son etat ('on' ou 'off')
  *                           sont stocker puis son etat est inversé et la 
  *                           source de l'image est remplacé
  *
====================================================*/
function togglePuce(id)
{
	var puce = "";
	var nomImg = "";
	var etat = "";
	 
	if(document.getElementById("puce"+id))
	{
		puce = document.getElementById("puce"+id);
		nomImg = puce.src.substr(0,puce.src.indexOf('_'));
		etat = puce.src.substr((puce.src.indexOf('_')+1), 2);

		if(etat == 'on')
			 etat = 'off';
		else etat = 'on';
		puce.src = nomImg+'_'+etat+'.png';
	}
}

/*====================================================
  *
  * getLvl :
  *
  * Parametre : id => (chaine de caractere) identifiant du block 
  *
  * Valeur de retour : level => (entier) niveau hierarchique du block
  *
  * Principe de fonctionnement : retourne le niveau hierachique du
  *                              block dont l'identifiant est placer en parametre
  *                           
====================================================*/
function getLvl(id)
{
	var level = 0;

	while( id.indexOf(".",level) != -1)
	{
        level ++;
	}

	return level;
}

/*====================================================
  *
  * getDiv
  *
  * Parametre : id => (chaine de caractere) identifiant du block
  *                     lvl => (entier) niveau hierachique
  *
  * Valeur de retour : divTmp => (chaine de caractere) racine
  *                           de l'identifiant de block passer en parametre
  *                           au niveau 'lvl'
  *
  * Principe de fonctionnement : retourne l'identifiant de la
  *                           racine du block 'id' au niveau hierachique 
  *                           lvl (exemple : id = 1.2.1.2.3 / lvl = 2 
  *                                 divTmp = 1.2.1)
  *
====================================================*/
function getDiv(id,lvl)
{
	var divTmp = "";
	
	if(id.indexOf('.',lvl) > -1)
		divTmp  = id.substr(0,id.indexOf('.',lvl));
	else divTmp = id;
	return divTmp;
}

/*====================================================
  *
  * aug
  *
  * Parametre : id => (chaine de caractere) identifiant du block
  *
  * Valeur de retour : aucune
  *
  * Principe de fonctionnement : permet de faire augmenter la 
  *                       taille du calque (div) masque de X pixel où X 
  *                       est egal à 'vitesse'.
  *                      Si la taille du masque est inferieur à la taille du
  *                      contenu alors la fonction est relancer 2 ms apres
  *                      jusqu'a ce que la taille du masque soit egal a la 
  *                      taille du contenu
  *
====================================================*/
function aug(id)
{
	var contenant = document.getElementById("conteneur"+id);
	var contenu   = document.getElementById("layer"+id);

	running = true;
	if(contenu.offsetHeight <= parseInt(contenant.style.height))
	{
		clearTimeout();
		running = false;
	}
	else 
	{
		contenant.style.height = (parseInt(contenant.style.height)+vitesse)+"px";
		adjustParent(id);
		setTimeout('aug("'+id+'")',2);
	}
}

/*====================================================
  *
  * dec
  *
  * Parametre : id => (chaine de caractere) identifiant du block
  *
  * Valeur de retour : aucune
  *
  * Principe de fonctionnement : permet de faire diminuer la 
  *                       taille du calque (div) masque de X pixel où X 
  *                      est egal à 'vitesse'.
  *                      Si la taille du masque est superieur à 1 pixel
  *                      alors la fonction est relancer 2 ms apres
  *                      jusqu'a ce que la taille du masque soit egal a la 
  *                      taille du contenu
  *
====================================================*/
function dec(id)
{
	var contenant = document.getElementById("conteneur"+id);
	var contenu   = document.getElementById("layer"+id);

	running = true;
	if( 1 >= parseInt(contenant.style.height) )
	{
		clearTimeout();
		running = false;
	}
	else 
	{
		if((parseInt(contenant.style.height)-vitesse) < 1) contenant.style.height = '1px';
		else contenant.style.height = (parseInt(contenant.style.height)-vitesse)+"px";
		
		adjustParent(id);
		setTimeout('dec("'+id+'")',2);
	}
}

/*====================================================
  *
  * adjustParent
  *
  * Parametre : id => (chaine de caractere) identifiant du block
  *
  * Valeur de retour : aucune
  *
  * Principe de fonctionnement : ajuste la taille du calque (div)
  *                              de niveau hierachique superieur a celui 
  *                              passer en argument, puis, recursivement,
  *                              sur tout les calques de niveau hierachique 
  *                              superieur.
  *
====================================================*/
function adjustParent(id)
{
	var contenant = "";
	var contenu   = "";
	var idParent  = "";
	
	if(getLvl(''+id+'')>0)
	{
		idParent = getDiv(''+id+'',(getLvl(''+id+'')-1));
		contenant = document.getElementById('conteneur'+idParent);
		contenu   = document.getElementById('layer'+idParent);
		contenant.style.height = contenu.offsetHeight+'px';
		adjustParent(idParent);
	}
}

/*====================================================
  *
  * openClose
  *
  * Parametre : id => (chaine de caractere) identifiant du block
  *
  * Valeur de retour : aucune
  *
  * Principe de fonctionnement : fonction d'entree du script.
  *                               Elle permet d'activer le deroulement d'un
  *                               menu dont l'identifiant est passer en parametre
====================================================*/
function openClose(id)
{
	var divTmp = divOuvert;
	var cpt = 0;
	
	if(!running)
	{		
		if(divOuvert == '-1')
		{
			divOuvert = id;
			togglePuce(id);
			aug(id);
		}
		else
		{
			if(id != divOuvert && getLvl(''+id+'') < getLvl(''+divOuvert+''))		// on click sur un autre div de niveau inferieur
			{
				if(getDiv(''+divOuvert+'',getLvl(''+id+'')) == id)
				{
					for(cpt = getLvl(''+divOuvert+''); cpt > getLvl(''+id+''); cpt--)
					{
						togglePuce(getDiv(''+divOuvert+'',cpt));
						dec(getDiv(''+divOuvert+'',cpt));
					}
					if(getLvl(''+id+'') == 0) divOuvert = '-1';
					else divOuvert = getDiv(''+divOuvert+'',(getLvl(''+id+'')-1));
				}
				else
				{
					divOuvert = id;
					for(cpt = getLvl(''+divTmp+''); cpt > getLvl(''+id+''); cpt--)
					{
						togglePuce(getDiv(''+divTmp+'',cpt));
						dec(getDiv(''+divTmp+'',cpt));
					}
					togglePuce(id);
					aug(id);
				}
			}
			else if(id != divOuvert && getLvl(''+id+'') == getLvl(''+divOuvert+''))	// on click sur un autre div de meme niveau
			{
				divOuvert = id; 
				togglePuce(divTmp);
				dec(divTmp);
				togglePuce(id);
				aug(id);
			}
			else if(id != divOuvert && getLvl(''+id+'') > getLvl(''+divOuvert+''))	// on click sur un autre div de niveau superieur
			{
				divOuvert = id;
				togglePuce(id);
				aug(id);		
			}
			else																	// on click sur le meme div
			{
				if(getLvl(''+id+'')>0)
				{
					divOuvert = getDiv(''+id+'',(getLvl(''+id+'')-1));
				}
				else divOuvert = '-1';
				togglePuce(id);
				dec(id);
				for(cpt = (getLvl(''+id+'')-1); cpt>=0; cpt--)
				{
					togglePuce(getDiv(''+id+'',cpt));
					aug(getDiv(''+id+'',cpt));
				}
			}
		}
	}
}

