/*
**
**	créateur : Benjamin SPETH
**	date création : 22/04/2010
**
**	MISE A JOUR :	4/06/2010
**		ajout de l'utilisation du jQuery pour les menus dynamiques
**	
**	cet objet a pour but de gérer des menus dynamiques qui s'ouvrent et se ferment
**	je me suis aidé de ce tutoriel pour le réaliser : http://t-templier.developpez.com/tutoriel/javascript/javascript-poo1/
**	
**	utilisation : 
**	l'action de cacher ou afficher un element du html se fait via le CSS
**	le menuControler va seulement modifier l'attribut class de l'element à afficher/cacher
**	il vous faudrat créer deux class CSS (une quand l'élément est affiché, l'autre quand il est caché)
**	et donner leur nom au menuControler.
**	(le code css pour cacher une node est : "display: none;").
**
**	pour pouvoir utiliser le menuControler il faut qu'au moins une des nodes  de chaque paire clickable/hidable aient un attribut id.
**	il faut aussi pourvoir la fonction javascript qui va être appellée au moment du clique sur les nodes.
**	voici un exemple de fonction :

function	show_hide(un_id)
{
	var MC = menuControler.getInstance();
	
	var	M =	MC.getMenu("monMenu");
	if (M != null)	{
		M.onClickCategory(un_id);
	}	else	{
		M = MC.addMenu("monMenu");
		M.hideClass = "caché";
		M.showClass = "pas_caché";
		M.closeOthers = true;
		
		M.addCategory(document.getElementById("node_cliquable1"), document.getElementById("node_affichable1"));
		M.addCategory(document.getElementById("node_cliquable2"), document.getElementById("node_affichable2"));
	}
}

**	voici enfin un exemple de code html : 

<div id="menu">
	<div id="node_cliquable1" onclick="show_hide('node_cliquable1');">une categorie</div>
	<div id="node_affichable1">un contenu</div>
	<div id="node_cliquable2" onclick="show_hide('node_cliquable2');">une autre categorie</div>
	<div id="node_affichable2">un autre contenu</div>
</div>

**
*/

/*
**	***********************************************************************
**	menuObject
**	***********************************************************************
**	classe représentant un menu. vous devez définir les catégorie qui composent le menu.
**	une catégorie est composée de la node cliquable et celle qui sera cachée/affichée.
**	chaque node cliquable devra avoir un attribut id pour pouvoir les différencier.
*/
function	menuObject()	{
	
	//	Attributs
	this.catList = new Array();
	this.sClass = "discovered_menu";
	this.hClass = "not_discovered_menu";
	this.closeOthers = false;	//	mettre ce booléen a true va, au moment de l'appel de onClickCategory, fermer toutes les category a part celle sur laquelle on clique
	
	//	Méthodes
	if( typeof menuObject.initialized == "undefined" )	{
		
		/*	ajoute unr category au menu et la ferme directement	*/
		menuObject.prototype.addCategory = function(clickableNode, hidableNode)	{
			if ((clickableNode == null) || (hidableNode == null))	{
				return false;
			}
			this.catList.push(new Array(clickableNode, hidableNode, false));
			jQuery(hidableNode).slideUp("fast");
			jQuery(clickableNode).attr("class", this.hClass);
			return true;
		};
		
		/*	methode qui va fermer toutes les category du menu	*/
		/*	sauf celle specifiée par le parametre index	*/
		/*	A NE PAS APPELER EN DEHORS DE LA CLASSE	*/
		menuObject.prototype.closeOtherCategories = function(index)	{
			var i = 0;
			while (i < this.catList.length)	{
				if ((i != index) && (this.catList[i][2] == true))	{
					jQuery(this.catList[i][1]).slideUp("slow");
					jQuery(this.catList[i][0]).attr("class", this.hClass);
					this.catList[i][2] = false;
				}
				++i;
			}
		};
		
		/*	méthode qui va effectuer l'action d'afficher/cacher l'élément	*/
		menuObject.prototype.onClickCategory = function(idCategory)	{
			var	i = 0;
			var cNode = "";
			
			while (i < this.catList.length)	{
				sNode = jQuery(this.catList[i][0]);
				hNode = jQuery(this.catList[i][1]);
				if ((hNode.attr("id") == idCategory) || (sNode.attr("id") == idCategory))	{
					if (this.catList[i][2] == false)	{
						hNode.slideDown("slow");
						sNode.attr("class", this.sClass);
						this.catList[i][2] = true;
					}	else	{
						hNode.slideUp("slow");
						sNode.attr("class", this.hClass);
						this.catList[i][2] = false;
					}
					if (this.closeOthers == true)	{
						this.closeOtherCategories(i);
					}
					return true;
				}
				++i;
			}
			return false;
		};

		menuObject.initialized = true;
	}
}

/*
**	***********************************************************************
*/

/*
**	***********************************************************************
**	menuControler
**	***********************************************************************
**	classe Singleton dont le rôle est de stocker les objets représentant le menu
**	on peut l'assimiler a une table de hashage.
*/
function 	menuControler() {

	//	Condition qui empêche d'instancier l'objet en dehors de getInstance
	if ( menuControler.caller != menuControler.getInstance ) {  
		throw new Error("This object cannot be instanciated");  
	}

	//	Attributs
	this.listMenu = new Array();  

	//	Méthodes
	if( typeof menuControler.initialized == "undefined" )	{
	
		menuControler.prototype.addMenu = function(menuName)	{
			if (this.listMenu[menuName] == null)	{
				this.listMenu[menuName] = new menuObject();
			}	else	{
				return null;
			}
			return this.listMenu[menuName];
		};
		
		menuControler.prototype.getMenu = function(menuName)	{
			return this.listMenu[menuName];
		};
		
		menuControler.initialized = true; 
	} 
}  
// 	propriété statique qui contient l'instance unique
menuControler.instance = null;  

//	méthode qui va créer le menuControler
menuControler.getInstance = function() {  
	if (this.instance == null) {
		this.instance = new menuControler();  
	}
	return this.instance;  
}
/*
**	***********************************************************************
*/

