/**
 * @file
 * Implémentation de la classe <b>BMenu</b>.
 * 
 * \$RCSfile: bmenu.js,v $
 * \$Date: 2007/09/24 13:15:01 $
 */

/**
 * @class BMenu
 * Classe de gestion d'un menu DHTML.
 * 
 * Copyright (c) 2007, ABC Soft. Tous droits réservés.
 * 
 * @author \$Author: cedric $
 * @version \$Revision: 1.7 $
 */
// ==========================================================================================
// Constructeur
/**
 * Initialise une nouvelle instance de la classe.
 * @param String id Identifiant du menu.
 */
function BMenu(id)
{
	this.id=String(id);
}
// ==========================================================================================
/**
 * Identifiant du menu.
 * @var String id
 */
BMenu.prototype.id='';

/**
 * Opacité du menu.
 * @var Number opacity
 */
BMenu.prototype.opacity=0;

/**
 * Tableau contenant l'ensemble des menus de la page.
 * @var Array list
 */
BMenu.list=[];

/**
 * Chronomètre de fermeture d'un menu.
 * @var Number timeout
 */
BMenu.timeout=null;
// ==========================================================================================
// Méthodes d'instance
/**
 * Retourne une chaîne qui représente l'objet en cours.
 * @return String Chaîne qui représente l'objet en cours.
 */
BMenu.prototype.toString=function()
{
	return 'BMenu('+this.getId()+')';
}
// =======================================================================================
/**
 * Retourne l'identifiant du menu.
 * @return String Identifiant du menu.
 */
BMenu.prototype.getId=function()
{
	return this.id;
}
// =======================================================================================
/**
 * Retourne l'opacité du calque flottant du menu.
 * @return Number Opacité du calque flottant du menu.
 */
BMenu.prototype.getOpacity=function()
{
	return this.opacity;
}

/**
 * Définit l'opacité du calque flottant du menu.
 * @param Number opacity Opacité (entre 0 et 100) du calque flottant.
 */
BMenu.prototype.setOpacity=function(opacity)
{
	opacity=Number(opacity);
	
	// On s'assure que la valeur transmise est dans les bornes
	if(opacity<0) opacity=0;
	else if(opacity>100) opacity=100;
	
	this.opacity=opacity;

	// Récupération du calque flottant
	var element=document.getElementById(this.getId());
		
	// Modification de l'opacité du calque flottant
	if(element)
	{
		// Opacité définie par la norme CSS 3
		if(element.style.opacity!=null) element.style.opacity=this.opacity/100;
		
		// Opacité définie par les navigateurs Mozilla
		else if(element.style.MozOpacity!=null) element.style.MozOpacity=this.opacity/100;
		
		// Opacité définie par Internet Explorer
		else if(element.style.filter!=null) element.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity='+this.opacity+')';
	}
	
	// On affiche ou on masque le calque en fonction de l'opacité
	if(this.opacity<=0) this.hide();
	else if(element && element.style.visibility=='hidden') this.show();
}
// ==========================================================================================
/**
 * Masque le calque flottant du menu.
 */
BMenu.prototype.hide=function()
{
	// Calque masqué : son opacité est obligatoirement nulle
	this.opacity=0;
	
	// On annule l'éventuel chronomètre de fermeture du calque flottant
	BMenu.stopTimer();

	// On masque le calque flottant du menu
	BMenu.hideElement(this.getId());
}

/**
 * Affiche le calque flottant du menu.
 */
BMenu.prototype.show=function()
{
	var id=this.getId();
	
	// Calque affiché : son opacité est obligatoirement non nulle
	if(this.getOpacity()<=0) this.opacity=100;
	
	// On annule l'éventuel chronomètre de fermeture du calque flottant
	BMenu.stopTimer();

	// On masque tous les autres menus ouverts
	BMenu.hideMenus(id);
	
	// On affiche le calque flottant du menu
	BMenu.showElement(id);
}
// ==========================================================================================
/**
 * Affiche progressivement le calque flottant du menu par un effet de fondu.
 * @param Number delay Vitesse de l'effet de fondu.
 */
BMenu.prototype.fadeIn=function(delay)
{
	var opacity=this.getOpacity();
	
	if(opacity<=100)
	{
		this.setOpacity(opacity+10);
		setTimeout('BMenu.getMenu(\''+this.getId()+'\').fadeIn('+delay+')', delay);
	}
}

/**
 * Masque progressivement le calque flottant du menu par un effet de fondu.
 * @param Number delay Vitesse de l'effet de fondu.
 */
BMenu.prototype.fadeOut=function(delay)
{
	var opacity=this.getOpacity();
	
	if(opacity>=0)
	{
		this.setOpacity(opacity-10);
		setTimeout('BMenu.getMenu(\''+this.getId()+'\').fadeOut('+delay+')', delay);
	}
}
// ==========================================================================================
/**
 * Ajoute l'élément spécifié à la liste des menus gérés par la classe.
 * @param BMenu element Menu à ajouter.
 */
BMenu.addMenu=function(element)
{
	BMenu.list.push(element);
}

/**
 * Retourne l'objet du menu spécifié.
 * @param String id Identifiant du menu.
 * @return BMenu Objet du menu spécifié, ou une référence null si aucun élément avec l'identifiant spécifié n'est défini.
 */
BMenu.getMenu=function(id)
{
	id=String(id);
	
	for(var i=0; i<BMenu.list.length; ++i)
	{
		if(BMenu.list[i].getId()==id) return BMenu.list[i];
	}
	
	return null;
}

/**
 * Masque tous les calques flottants de menu.
 *
 * Si un identifiant de menu est spécifié, son calque flottant sera ignoré et ne sera pas masqué.
 *
 * @param String excludedId Identifiant du menu à ignorer.
 */
BMenu.hideMenus=function(excludedId)
{
	excludedId=String(excludedId);
	
	for(var i=0; i<BMenu.list.length; ++i)
	{
		if(BMenu.list[i].getId()!=excludedId) BMenu.list[i].hide();
	}
}
// =======================================================================================
/**
 * Modifie la classe CSS de l'élément avec l'identifiant spécifié.
 * @param String id Identifiant de l'élément.
 * @param String cssClass Nouvelle classe CSS de l'élément.
 */
BMenu.changeElementClass=function(id, cssClass)
{
	// Récupération de l'élément
	var element=document.getElementById(String(id));
		
	// Modification de la classe CSS
	if(element) element.className=String(cssClass);
}

/**
 * Centre à l'écran l'élément avec l'identifiant spécifié.
 *
 * @param String id Identifiant de l'élément.
 * @param Number width Largeur de l'élément en pixels.
 * @param Number height Hauteur de l'élément en pixels.
 */
BMenu.centerElement=function(id, width, height)
{
	// Récupération de l'élément
	var element=document.getElementById(String(id));
		
	// On centre l'élément spécifié
	if(element)
	{
		var leftPosition=(screen.width-Number(width))/2;
		var topPosition=(screen.height-Number(height))/2;
		
		topPosition+=document.body.scrollTop;
		
		element.style.left=leftPosition+'px';
		element.style.top=topPosition+'px';
	}
}

/**
 * Masque l'élément avec l'identifiant spécifié.
 * @param String id Identifiant de l'élément.
 */
BMenu.hideElement=function(id)
{
	// Récupération de l'élément
	var element=document.getElementById(String(id));
		
	// On masque l'élément spécifié
	if(element)
	{
		element.style.visibility='hidden';
		element.style.display='none';
	}
}

/**
 * Affiche l'élément avec l'identifiant spécifié.
 * @param String id Identifiant de l'élément.
 */
BMenu.showElement=function(id)
{
	// Récupération de l'élément
	var element=document.getElementById(String(id));
		
	// On affiche l'élément spécifié
	if(element)
	{
		element.style.visibility='visible';
		element.style.display='block';
	}
}
// =======================================================================================
/**
 * Démarre le chronomètre de fermeture du dernier calque flottant ouvert.
 * @param String id Identifiant du menu.
 * @param String callback Chaîne spécifiant la méthode appelée pour la fermeture du calque flottant.
 * @param Number delay Délai, en millisecondes, avant la fermeture du calque flottant.
 */
BMenu.startTimer=function(id, callback, delay)
{
	BMenu.timeout=setTimeout('BMenu.getMenu(\''+id+'\').'+callback, Number(delay));				
}

/**
 * Annule le chronomètre de fermeture du dernier calque flottant ouvert.
 */
BMenu.stopTimer=function()
{
	if(BMenu.timeout)
	{
		clearTimeout(BMenu.timeout);
		BMenu.timeout=null;
	}
}
// =======================================================================================
/**
 * Ouvre dans une fenêtre l'URL spécifiée.
 * @param String href URL du document à ouvrir dans la fenêtre.
 * @param String target Nom de la fenêtre à ouvrir.
 * @param String features Chaîne spécifiant les propriétés de la fenêtre.
 */
BMenu.popupWindow=function(href, target, features)
{
	var popupWin=window.open(href, target, features);
	popupWin.focus();
}