/*
	Copyright © Nexion 2007
	
	But:
		Ce script permet la gestion d'un menu simple avec des images en rollover en menu et avec des calques générique en sous-menu.
		Le code est conçu pour que le rollover du menu reste allumé temps et aussi longtemps que sont sous-menu est ouvert.
		
	Date: Avril 2007
	Version: 0.67
	
	TODO: 
	-Augmenter la vitesse de disparition d'un menu tout en maintenant un delai raisonnable de transition.
	-Délaissé le title comme source de l'IS pour le remplacé par une fonction. Ex. AddIS(ImgId, IsSrc);
	-Pour le moment il faut faire PreloadIs() avant de les AddMenuHandling sinon sa plante,  il faudrait remedier à cela.
	-Stucturer le code. Il est trop procédural.
*/

//Indique si les messages de débogage doivent être affiché
var DEBUG_ENABLED = true;

//Le delai avant qu'un menu ne disparraisse.
var DELAI_MENU = 400;

//Minuterie pour la gestion des déplacement
var Minuterie = null;

//Tableau contenant tous les menus.
var Menus = new Array();
var NbOver = 0;


//A kind of foreach
function aTraiter(obj, prefixe)
{
  return obj.id != null && obj.id.indexOf(prefixe) == 0;
}

//A kind of foreach
function traiterCollection(collection, filtre, traitement)
{
  var n = collection.length;
  for (var i = 0; i < n; i++)
    if (aTraiter(collection[i], filtre) || filtre == "")
      traitement(collection[i]);      
}

/*Objectif: Précharger les images survolés et initialiser le mecanisme d'image survollé */
function PreloadIs()
{
	//Obtenir toutes les images du document et determiner le nombre de celle-ci
	var imgs = document.images;
	var n = imgs.length;
	
	//Parcourir toutes les images à la recherche de nos images survollé.
	for (var i = 0; i < n; i++)
	{
		//Obtenir l'image courante
		var img = imgs[i];		
		
		//Déterminer si cette image est une image survollé.
		if (img.title.substr(0,7) == "is:src=")
		{
			//Copie de l'image courante
			img.Out = new Image();
			img.Out.src = img.src;
			
			//Création d'un lien vers l'image survollé
			img.Remp = new Image();
			img.Remp.src = img.title.substr(7, img.title.length);
			
			//Effacer le titre bidon par le texte altenatif
			img.title = img.alt;
			
			//Lier les fontions mouseover et mouseout des trigger à notre images.
			img.onmouseover = TriggerMouseOver;
			img.onmouseout = TriggerMouseOut;
		}
	}
}

/*Objectif: Gérer le mouseout des triggers (Les images survolées)*/
function TriggerMouseOut()
{	
	//Vérifier si l'image possède un sous-menu
	if (PossedeMenu(this))
  {
		/*//Restaurer l'image d'origine seulement si le menu est fermer
  	if (!this.linkedMenu.ouvert)
			this.src = this.Out.src;*/
			
		//Tenter de fermer le menu lors de la sortir du calque, si l'opération n'est pas intercepté par l'un des éléments(i.e. que le curseur est dehors du menu) le menu
		//se fermera
		Minuterie = window.setTimeout("CacherTousMenus()", DELAI_MENU);
	}
	else
		//L'image n'a pas de menu donc un peu restauré l'image sans ce soucier du menu.
		this.src = this.Out.src;
}

/*Objectif: Gérer le mouseover des triggers (Les images survolées)*/
function TriggerMouseOver()
{
	//Cacher tous les autres menus.
	CacherTousMenus();

	//Afficher le menu liée à cette image, s'il en possède un.
	if (PossedeMenu(this))
		AfficherMenu(this.linkedMenu);  
	
	//Affichez l'image survollé
	this.src = this.Remp.src;
}

/*Objectif: Gérer le mouseout des calques de menu */
function MenuMouseOut()
{
	//Tenter de fermer le menu lors de la sortir du calque, si l'opération n'est pas intercepté par l'un des éléments(i.e. que le curseur est dehors du menu) le menu
	//se fermera
  Minuterie = window.setTimeout("CacherTousMenus()", DELAI_MENU);
}

/*Objectif: Gérer le mouseover des éléments du menu */
function ElemMouseOver()
{
	//Empêcher la fermeture du menu car l'utilisateur est sur un des éléments du menu.
	window.clearTimeout(Minuterie);
}

/*Objectif: Gérer le mouseover des calques du menu */
function MenuMouseOver()
{
	//Empêcher la fermeture du menu car l'utilisateur  sur le menu.
	window.clearTimeout(Minuterie);
}



/*Objectif: Gérer l'affichage d'un menu*/
function AfficherMenu(linkedMenu)
{
	//Arrêter le compte à rebours pour de la fermeture du menu
	window.clearTimeout(Minuterie);
	
	//Afficher le menu reçu en paramètre
	linkedMenu.style.display = "block";
	
	//Indiquer que le menu est ouvert
	linkedMenu.ouvert = true;
}

/*Objectif: Gérer le masquage d'un menu*/
function CacherMenu(linkedMenu)
{
	//Cacher le menu et indiquer que le menu est fermé
	linkedMenu.style.display = "none";
	linkedMenu.ouvert = false;
	
	//Restaurer l'image d'origine du déclancheur
	var IsTrigger = linkedMenu.IsTrigger;
	IsTrigger.src = IsTrigger.Out.src;

}

/*Objectif: Gérer le masquage d'un menu par son Id*/
function CacherMenuParId(id_linkedMenu)
{
	//Récupérer une référence sur le menu et le cacher
	var linkedMenu = document.getElementById(id_linkedMenu);
	if (linkedMenu != null)
		CacherMenu(linkedMenu);
}

/*Objectif:  Cacher tous les menus*/
function CacherTousMenus()
{
	for(i=0; i < Menus.length; i++)
		CacherMenu(Menus[i]);
}

/*Objectif:  Déterminer si un images survollé possède un sous-menus*/
function PossedeMenu(IsTrigger)
{
	return IsTrigger.linkedMenu != null;
}

/*Objectif: Ajouter un menu et un trigger */
function AddMenuHandling(MenuIsTrigger, linkedMenu)
{
	//L'image survolée et une référence sur son menu lier
	var IsTrigger;
	var linkedMenu;
	
	//Récupérer une référence sur l'image survolé servant de déclancheur et sur son  menu lié 
	IsTrigger = document.getElementById(MenuIsTrigger);
	linkedMenu = document.getElementById(linkedMenu);
	
	//Vérifier si l'image et le menu lié existe
	if (IsTrigger != null && linkedMenu != null)
	{
		//Ajouté le menu lié à la liste de menu
		Menus[Menus.length] = linkedMenu;
		
		//Ajouter une référence du menu lié à l'image survolée
		IsTrigger.linkedMenu = linkedMenu;
		
		//Lier les évènement mouseover et mouseout des menus à ce menu
		linkedMenu.onmouseover = MenuMouseOver;
		linkedMenu.onmouseout = MenuMouseOut;
		
		//Ajouter une référence de l'image suvolée parente au menu
		linkedMenu.IsTrigger = IsTrigger;
		
		//Lier l'élement mouseover des éléments du menu au gestionnaire d'évènement des éléments
		var collEnfants = linkedMenu.childNodes;
		for (var i = 0; i < collEnfants.length; i++) 
		{
			collEnfants[i].onmouseover = ElemMouseOver;
		}
	}
	else
	{
		//Erreur
		if (DEBUG_ENABLED)
			document.write("Vérifier votre configuration de menu une erreur est survenu!<br />");
	}
}



