
/* gcBrigde
** container : ID ou élément qui va contenir le menu
** inMenu    : tableau de menu, cf. CLIENT_declare.js
** type      : String, 'h', 'v'. Defini si le menu est verticale ou horizontale.
*/
function gcBridge(container, inMenu, inType) {

	/* On vérifi l'existence de l'élément passé en paramètre */
	this.container = $(container);
	this.menu = inMenu;
	this.structure;
	this.type = inType;
	this.deep = null;
	this.pied = null;
	this.setDeep = setDeepLevel;
	if(this.container == null) throw("Impossible de créer le menu, l'élément " + this.container + " n'existe pas");
	this.setCss = setCssClasses;
	this.cssClass = new Array();
		//this.cssClass["first"] = new Array("lignetnormale", "lignebnormale", "lignelnormale", "hnormale", "lignernormale");
		//this.cssClass["autres"] = new Array("slignelnormale", "slignebnormale", "slignetnormale", "snormale", "slignernormale");
	
	this.itemTemplate = createItemTemplate(this.type);
	this.items = addItems;
	this.dds = new Array();
	this.fillItemWith = fill;
	this.create = createStructure;
	this.insert = insertStructure;
	this.init = initialisation;
}

function setCssClasses(inCssFirst, inCssOthers) {
	this.cssClass["first"] = inCssFirst;
	this.cssClass["autres"] = inCssOthers;
}

function setDeepLevel(inDeep) {
	this.deep = inDeep;
}

function initialisation(inAction) {
	for(var i=0;i<this.dds.length;i++) {
		new MenuDeroulant(this.dds[i],inAction);
	}
}

function createItemTemplate(inType) {
	
	var liElement = document.createElement("li");

	if(inType == "v") {

		$(liElement).addClassName("normale");
		
		var div_t = document.createElement("div");
			$(div_t).addClassName("_t");
			
		var div_b = document.createElement("div");
			$(div_b).addClassName("_b");
			
		var div_l = document.createElement("div");
			$(div_l).addClassName("_l");
			
		var lien = document.createElement("a");
			$(lien).addClassName("_h");
		
		liElement.appendChild(div_t);
		
		liElement.appendChild(div_b);
		liElement.appendChild(lien);
		liElement.appendChild(div_l);

	} else if(inType == "h") {
		/*$(liElement).addClassName("normale");*/
		
		var div_t = document.createElement("div");
			$(div_t).addClassName("_l");
			
		var div_b = document.createElement("div");
			$(div_b).addClassName("_b");
			
		var div_l = document.createElement("div");
			$(div_l).addClassName("_t");
		
		var div_r = document.createElement("div");
			$(div_r).addClassName("_r");
			
		var lien = document.createElement("a");
			$(lien).addClassName("_h");
		
		liElement.appendChild(div_t);
		liElement.appendChild(div_b);
		div_l.appendChild(lien);
		liElement.appendChild(div_l);
		liElement.appendChild(div_r);
	}
	
	return liElement;
}

function createStructure() {
	
	if(this.type == "v") {
		/* DL de base */
		this.structure = document.createElement("dl");
		
		/* Niveau 2 */
		for(var i=1;i<this.menu.length;i++) {
			var dtElement = document.createElement("dt");
				if(this.menu[i][1] != "") {
					aElement = document.createElement("a");
					aElement.appendChild(surroundTextWith(this.menu[i][0], new Array("span","strong")));
					aElement.href = this.menu[i][1];
					dtElement.appendChild(aElement);
				} else {
					dtElement.appendChild(surroundTextWith(this.menu[i][0], new Array("span","strong")));
				}
			var ddElement = document.createElement("dd");
			/* ajout de l'élément dd à la liste */
			this.dds[this.dds.length] = ddElement;
			var olElement = document.createElement("ol");
			
			/* Restons cohérent, il s'agit bien du niveau 2
			** lors du premier appelle;
			 */
			this.items(getArbo(this.menu[i][2]), olElement, 2);

			ddElement.appendChild(olElement);
			this.structure.appendChild(dtElement);
			this.structure.appendChild(ddElement);
		}
	} else {
		/* OL de base */
		this.structure = document.createElement("ol");
		this.structure.id = "menuhh";
		this.dds[this.dds.length] = this.structure;
		/* Niveau 2 */
		
		for(var i=1;i<this.menu.length;i++) {

			var liElement = document.createElement("li");
			
			liElement = $(liElement);

			liElement.addClassName("first");

			liElement.addClassName("a");
			if(i == 1) {
				liElement.addClassName("firstli");
			}

			var aElement = document.createElement("a");
				aElement = $(aElement);

			aElement.appendChild(surroundTextWith(this.menu[i][0], new Array("strong")));

			if(this.menu[i][1] != "") {
				aElement.href = this.menu[i][1];
			} else {
				aElement.href = "#";
			}

			aElement.addClassName("_h");
			aElement.addClassName("hnormale");

			aElement.select("strong:first-child")[0].addClassName("normale");
			
			liElement.appendChild(aElement);
			
			if(this.menu[i][2] != "") {
				var div_smenuh = document.createElement("div");
					div_smenuh = $(div_smenuh);
					div_smenuh.addClassName("_c");
					div_smenuh.addClassName("smenuh");
				var div_smenuhf = document.createElement("div");
					div_smenuhf = $(div_smenuhf);
					div_smenuhf.addClassName("smenuhf");

				div_smenuh.appendChild(div_smenuhf);

				var olElement = document.createElement("ol");
				
				/* pied */
				var divMenuhpied = document.createElement("div");
					divMenuhpied.className = "menuhpied";
				
				var divMpiedg = document.createElement("div");
					divMpiedg.className = "divMpiedg";
				
				var divMpiedc = document.createElement("div");
					divMpiedc.className  = "divMpiedc";
				
				var divMpiedd = document.createElement("div");
					divMpiedd.className = "divMpiedd";
					
				divMenuhpied.appendChild(divMpiedg);
				divMenuhpied.appendChild(divMpiedc);
				divMenuhpied.appendChild(divMpiedd);
				this.pied = divMenuhpied;
				/* fin pied */
				
				this.items(getArbo(this.menu[i][2]), olElement, 3);
				
				div_smenuhf.appendChild(olElement);
				
				
				
				div_smenuhf.appendChild(this.pied.cloneNode(true));
				
				
				liElement.appendChild(div_smenuh);
			}
			this.structure.appendChild(liElement);
		}
	}
	
}

/* Cette fonction insert la structure dans le conteneur
**
*/
function insertStructure() {
	this.container.appendChild(this.structure);
	/*if(this.type == "h") {
		var jklm = document.createElement("textarea");
		jklm.value = document.getElementById("menuh").innerHTML;
		document.body.appendChild(jklm);
	}*/
}

/* Rempli le template d'items d'après le tableau passé en paramètre
** inItem   : les données de l'item
** position : String > last | first, idique si l'item et le premier ou le dernier enfant de son conteneur
** niveau   : permet de savoir quelles class css appliquer à l'item
*/
function fill(inItem, position, niveau) {
	
	var tmpItem = this.itemTemplate.cloneNode(true);
	tmpItem = $(tmpItem);
	
	if(this.type == "v") {
		if(position == "first") {
			tmpItem.addClassName("firstli");
		} else if(position == "last") {
			tmpItem.addClassName("lastli");
		} else if(position == "unique") {
			tmpItem.addClassName("uniqueli");
		}
	}

	
	if(niveau == 2) {
		tmpItem.select("div:first-child")[0].addClassName(this.cssClass["first"][0]);
		tmpItem.select("div:nth-child(2)")[0].addClassName(this.cssClass["first"][1]);
		tmpItem.select("div:nth-child(4)")[0].addClassName(this.cssClass["first"][2]);
		tmpItem.select("a:nth-child(3)")[0].addClassName(this.cssClass["first"][3]);
	} else if(niveau > 2) {
		if(this.type == "h") {
			
			tmpItem.select("div:first-child")[0].addClassName(this.cssClass["autres"][0]);
			
			tmpItem.select("div:nth-child(2)")[0].addClassName(this.cssClass["autres"][1]);
			tmpItem.select("div:nth-child(4)")[0].addClassName(this.cssClass["autres"][4]);
			tmpItem.select("div:nth-child(3)")[0].addClassName(this.cssClass["autres"][2]);
			if(this.type == "v") {
				tmpItem.select("a:nth-child(3)")[0].addClassName(this.cssClass["first"][3]);
			} else if(this.type == "h") {
				tmpItem.select("div:nth-child(3) a")[0].addClassName(this.cssClass["autres"][3]);
			}
		} else if(this.type == "v") {
			tmpItem.select("div:first-child")[0].addClassName(this.cssClass["autres"][0]);
			tmpItem.select("div:nth-child(2)")[0].addClassName(this.cssClass["autres"][1]);
			tmpItem.select("div:nth-child(4)")[0].addClassName(this.cssClass["autres"][2]);
			tmpItem.select("a:nth-child(3)")[0].addClassName(this.cssClass["autres"][3]);
		}
	}

	
	var lien = tmpItem.getElementsByTagName("a")[0];
	var tmp = surroundTextWith(inItem[0], new Array("strong"));
	tmp = $(tmp);
	if(this.type == "h") {
		tmp.addClassName("snormale");
	}
	lien.appendChild(tmp);
	if(inItem[1] != "") {
		lien.href = inItem[1];
	}
	
	return tmpItem;
}

/* Fonction récursive d'ajout des items
** inItems     : tableau des items de 2nd niveau, cf. CLIENT_declare.js
** inOlElement : conteneur OL de base
** niveau      : niveau de récursion
*/
function addItems(inItems, inOlElement, niveau) {
	
	/* la position de l'item dans la liste */
	var position;
	
	for(var i=1;i<inItems.length;i++) {
		
		/* first ou last */
		if(inItems.length == 2) {
			position = "unique";
		} else if((i+1) == inItems.length) {
			position = "last";
		} else if(i == 1) {
			position = "first";
		} else position = "";

		/* */

		if(inItems[i][2] != "" && (niveau < this.deep || this.deep == null)) {
			/*
			S'il existe des enfants, il faut ajouter un item
			mais cet item contient deux div suplémentaires :
			li > div > div > ol
			Il faut rappeler la fonction addItems avec en paramètre
			le nouveau tableau d'items et le nouveau OL conteneur
			*/
			
			
			var tmpLi = this.fillItemWith(inItems[i], position, niveau);
			
			/* On ajoute les éléments nécessaires */
			var div_c = document.createElement("div");
				div_c = $(div_c);
				div_c.addClassName("_c");
				div_c.addClassName("smodmenug");
			var div_ol = document.createElement("div");
				div_ol = $(div_ol);
				div_ol.addClassName("smodmenugf");
			var ol = document.createElement("ol");
			div_c.appendChild(div_ol);
			div_ol.appendChild(ol);
			if(this.pied != null) {
				div_c.appendChild(this.pied.cloneNode(true));
			}
			this.items(getArbo(inItems[i][2]), ol, (niveau+1));
			
			tmpLi.appendChild(div_c);
			inOlElement.appendChild(tmpLi);
		} else {
			
			inOlElement.appendChild(this.fillItemWith(inItems[i], position, niveau));
			
		}
	}
	
}

/* Entour le text par les éléments passés en paramètre
** inText          : le text à traiter
** inElementsArray : tableau de String correspondant aux éléments à créer
** return          : NodeElement;
*/ 
function surroundTextWith(inText, inElementsArray) {
	
	var rootElement = document.createElement(inElementsArray[0]);
	
	var deeperElement = null;
	for(var i=1;i<inElementsArray.length;i++) {
		
		deeperElement = document.createElement(inElementsArray[1]);
		rootElement.appendChild(deeperElement);
	}
	
	if(deeperElement != null) {
		deeperElement.appendChild(document.createTextNode(MYunescapeHTML(inText)));
	} else {
		rootElement.appendChild(document.createTextNode(MYunescapeHTML(inText)));
	}

	return rootElement;
}

/* Retourne un text nettoyé du code html
** Utilise la méthode interne d'échapement du navigateur
** en attendant que String#unescapeHTML de prototype fonctionne sous ie
** html : String, le contenu html/texte à échapper
*/
function MYunescapeHTML(html) {
   var htmlNode = document.createElement("DIV");
   htmlNode.innerHTML = html;
   if(htmlNode.innerText)
      return htmlNode.innerText; // IE
   return htmlNode.textContent; // FF
}
