
/* gcBrigde
** container : ID ou élément qui va contenir le menu
** inMenu    : tableau de menu, cf. viazimut_declare.js
** inNiveau  : tableau de structures par niveau
*/
function gcBridge(inContainer, inMenu, inNiveaux, inMaxLevel, inPrefixUrl) {
	this.container = jQuery(inContainer);
	this.niveaux = inNiveaux;
	this.menu = inMenu;
	this.maxLevel = inMaxLevel;
	this.prefixUrl = inPrefixUrl;

	/* 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;
	
}

function buildStructure() {
	add(0, this.container, this.menu, this.niveaux, this.maxLevel, this.prefixUrl);
}

function add(inNiveau, inParent, inMenu, inNiveaux, inMaxLevel, inPrefixUrl) {
	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 =  jQuery(itemTemplate.cloneNode(true));
		
		if(itemTemplate_tmp.find("a").size() > 0) {
			if(itemTemplate_tmp.find("._txt").size() > 0) {
				itemTemplate_tmp.find("._txt").html(inMenu[i][0]);
			} else {
				itemTemplate_tmp.find("a:first").html(inMenu[i][0]); // first-of-type
			}
			
			if(inMenu[i][1] != "") {
				itemTemplate_tmp.find("a:first").attr("href", inPrefixUrl + inMenu[i][1]); // first-of-type
			}
		} else {
			itemTemplate_tmp.find("._txt").html(inMenu[i][0]);
		}
		
		try {
			itemTemplate.find("fils:first").remove(); // first of type
		} catch(e) {}
		
		
		if(inMenu[i][2] != "" && (inNiveau+1 < inMaxLevel || inMaxLevel == -1)) {
			add(inNiveau + 1, itemTemplate_tmp, getArbo(inMenu[i][2]), inNiveaux, inMaxLevel, inPrefixUrl);
		}
		
		jQuery(container_des_items).append(itemTemplate_tmp);
		
	}
	
	inParent.append(structureNiveau);
}

/* Retourne l'élément qui correspond à un item
** ici il s'agit d'un li
 */
function getItemTemplate(inOb) {
	var ob = jQuery(inOb);
	
	if(ob.find("*[class*=\"_item\"]").size() == 0) {
		return ob[0];
	} else {
		return ob.find("*[class*=\"_item\"]").eq(0)[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;
}
