
/* gcBrigde
** container : ID ou élément qui va contenir le menu
** inMenu    : tableau de menu, cf. CLIENT_declare.js
** inNiveau  : tableau de structures par niveau
*/
function gcBridge(inContainer, inMenu, inNiveaux, inMaxLevel, inTraitement) {
	this.container = $(inContainer);
	this.niveaux = inNiveaux;
	this.menu = inMenu;
	this.maxLevel = inMaxLevel;
	this.traitement = inTraitement;

	/* Contient l'intégralité de la structure
	** que l'on écrit à la fin dans le container
	 */
	this.structure;
	
	/* Permet de savoir quel niveau l'on traite
	** incrémenté à chaque passage dans writeStructure();
	** permet de sélectionner le bon niveau dans le tableau des niveaux
	 */
	this.niveau_en_cours = -1;
	if(this.container == null) throw ("Impossible de créer le menu, le conteneur " + inContainer + " n'existe pas");
	
	this.build = buildStructure;
	this.init = initialisation;
}

function initialisation(inAction) {
	if(this.traitement == 1) {
		new MenuDeroulant(this.container, inAction);
	} else {
		var children = $(this.container).firstDescendant().childElements();
		for(var i=0;i<children.length;i++) {
			
			new MenuDeroulant($(children[i]).select("ul")[0], inAction);
		}
	}
}

function buildStructure() {
	add(0, this.container, this.menu, this.niveaux, this.maxLevel);
	/*var tmp = document.createElement("textarea");
	tmp.value = this.container.innerHTML;
	document.body.appendChild(tmp);*/
}

function add(inNiveau, inParent, inMenu, inNiveaux, inMaxLevel) {
	
	var structureNiveau;
	if(inNiveau >= inNiveaux.length) {
		structureNiveau = inNiveaux[inNiveaux.length-1].cloneNode(true);
	} else {
		structureNiveau = inNiveaux[inNiveau].cloneNode(true);
	}
	
	
	var itemTemplate_tmp = getItemTemplate(structureNiveau);
	var itemTemplate = itemTemplate_tmp.cloneNode(true);
	var container_des_items = itemTemplate_tmp.parentNode;
	
	container_des_items.removeChild(itemTemplate_tmp);
	
	for(var i=1; i<inMenu.length; i++) {
		itemTemplate_tmp =  $(itemTemplate.cloneNode(true));
		
		if(itemTemplate_tmp.select("a").length > 0) {
			if(itemTemplate_tmp.select("a:first-of-type")[0].select("*[class~='_txt']")[0]) {
				itemTemplate_tmp.select("a:first-of-type")[0].select("*[class~='_txt']")[0].insert(inMenu[i][0]);
			} else {
				itemTemplate_tmp.select("a:first-of-type")[0].insert(inMenu[i][0]);
			}
			
			if(inMenu[i][1] != "") {
				itemTemplate_tmp.select("a:first-of-type")[0].href = inMenu[i][1];
			}
		} else {
			itemTemplate_tmp.select("*[class~='_txt']")[0].insert(inMenu[i][0]);
		}
		
		try {
			itemTemplate_tmp.removeChild(itemTemplate_tmp.select("fils:first-of-type")[0]);
		} catch(e) {}
		
		
		if(inMenu[i][2] != "" && (inNiveau+1 < inMaxLevel || inMaxLevel == -1)) {
			add(inNiveau + 1, itemTemplate_tmp, getArbo(inMenu[i][2]), inNiveaux, inMaxLevel);
		}
		container_des_items.appendChild(itemTemplate_tmp);
		
	}

	inParent.appendChild(structureNiveau);
}

/* Retourne l'élément qui correspond à un item
** ici il s'agit d'un li
 */
function getItemTemplate(inOb) {
	var ob = $(inOb);
	
	if(ob.select("*[class*=\"_item\"]").length == 0) {
		return ob;
	} else {
		return ob.select("*[class*=\"_item\"]")[0];
	}
}

/* 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
}

function getArbo(nom){
	var result=new Array();
	for(var rt=0;rt<window.Dmc_declars.length;rt++){
		if(window.Dmc_declars[rt][0][0]==nom){
			result=window.Dmc_declars[rt];
			break;
		}
	}
	return result;
}