var treeMenu = new Object(); // arbre
var ulPersistants = new Object(); // tableau des <UL> qui restent ouverts

treeMenu.closedImg = "img/tree/closed.gif" //chemin vers image dossier "ferme"
treeMenu.openImg = "img/tree/open.gif" //chemin vers image dossier "ouvert"

/*******************
	treeMenu.createTree(string, bool [, int])
	Cree un arbre 
	
	@param:	treeId (string) id de l'ul principal
	@param: enablepersist (bool) vrai si position persistente de l'arbre (à l'actualisation de la page)
	@param: persistdays int (par defaut = 1) nbre de jours de validite du cookie (cf. persistence de l'arbre)
********************/
treeMenu.createTree = function(treeId, enablepersist, persistdays) {
	var ulTag = document.getElementById(treeId).getElementsByTagName("ul");
	// on recupere les UL persistants
	if (typeof ulPersistants[treeId] == "undefined")
		ulPersistants[treeId] = (enablepersist == true && treeMenu.getCookie(treeId) != "") ? treeMenu.getCookie(treeId).split(",") : "";
	for (var i = 0; i < ulTag.length; i++)
		treeMenu.buildSubTree(treeId, ulTag[i], i);
	
	if (enablepersist == true){ //pour la persistance de l'arbre
		var durationdays = (typeof persistdays == "undefined") ? 1 : parseInt(persistdays);
		treeMenu.dotask(window, function(){treeMenu.rememberstate(treeId, durationdays)}, "unload"); //save opened UL indexes on body unload
	}
}

/*******************
	treeMenu.buildSubTree(treeId, ulElement, index)
	Cree un sous-menu 
	
	@param:	treeId (string) id de l'ul principal
	@param: ulElement (string) id de l'ul où le sous-menu sera construit
	@param: index int (par defaut = 1) nbre de jours de validite du cookie (cf. persistence de l'arbre)
********************/
treeMenu.buildSubTree = function(treeId, ulElement, index) {
	ulElement.parentNode.className = "subMenu";
	
	// on verifie s'il existe une liste (cookie) d'UL à ouvrir et 
	// si le sous-menu est dans cette liste, on l'ouvre sinon on le ferme
	if (typeof ulPersistants[treeId] == "object"){ 
		if (treeMenu.searcharray(ulPersistants[treeId], index)){
			ulElement.setAttribute("rel", "open");
			ulElement.style.display = "block";
			ulElement.parentNode.style.backgroundImage = "url(" + treeMenu.openImg + ")";
			ulElement.parentNode.style.backgroundPosition="top left";
		}
		else
			ulElement.setAttribute("rel", "closed");
	} 
	
	// si pas de cookie et UL n'a pas d'attribut REL, on le précise "closed"
	else if (ulElement.getAttribute("rel") == null || ulElement.getAttribute("rel") == false) 
		ulElement.setAttribute("rel", "closed");
	
	// si pas de cookie et UL a son attribut REL positionne à "open",	
	// on ouvre l'UL et tous ses parents de type UL 
	else if (ulElement.getAttribute("rel") == "open") 
		treeMenu.expandSubTree(treeId, ulElement); 
	
	// on gere le click sur les dossiers ici (open/close)
	// en fonction de leur attribut REL
	ulElement.parentNode.onclick = function(e) {
		var subMenu = this.getElementsByTagName("ul")[0];
		if (subMenu.getAttribute("rel") == "closed"){
			subMenu.style.display = "block";
			subMenu.setAttribute("rel", "open");
			ulElement.parentNode.style.backgroundImage = "url(" + treeMenu.openImg + ")";
			ulElement.parentNode.style.backgroundPosition="top left";
		}
		else if (subMenu.getAttribute("rel") == "open"){
			subMenu.style.display = "none";
			subMenu.setAttribute("rel", "closed");
			ulElement.parentNode.style.backgroundImage = "url(" + treeMenu.closedImg + ")";
		}
		treeMenu.preventpropagate(e);
	}
	ulElement.onclick = function(e){
		treeMenu.preventpropagate(e);
	}
}

/*******************
	treeMenu.expandSubTree(treeId, ulElement)
	ouvre un noeud (ulElement) et tous ses parents
	
	@param:	treeId (string) id de l'ul principal (l'arbre)
	@param: ulElement (string) id de l'ul à ouvrir (le noeud)
*******************/
treeMenu.expandSubTree = function(treeId, ulElement){
	var rootNode = document.getElementById(treeId); // le menu
	var curNode = ulElement;	// le noeud passé en paramètre
	
	curNode.style.display = "block";
	curNode.parentNode.style.backgroundImage = "url(" + treeMenu.openImg + ")";
	curNode.parentNode.style.backgroundPosition="top left";
	
	//on remonte jusqu'à la racine et si un noeud parent est un UL, on l'ouvre
	while (curNode != rootNode){
		if (curNode.tagName == "UL"){ 
			curNode.style.display = "block";
			curNode.setAttribute("rel", "open"); //note qu'il est ouvert
			curNode.parentNode.style.backgroundImage = "url(" + treeMenu.openImg + ")";
			curNode.parentNode.style.backgroundPosition="top left";
		}
		curNode = curNode.parentNode;
	}
}

/*********************
	treeMenu.closeAll(treeId, action)
	ferme tout
	@param treeId (string) id de l'ul principal (l'arbre)
	@param action (bool) vrai s'il faut fermer tous les noeuds, faux s'il faut les ouvrir tous
**********************/
treeMenu.closeAll = function(treeId, action) { //expand or contract all UL elements
	var ulTag = document.getElementById(treeId).getElementsByTagName("ul");
	for (var i = 0; i < ulTag.length; i++) {
		ulTag[i].style.display = (action == false) ? "block" : "none";
		var relValue = (action == false) ? "open" : "closed";
		ulTag[i].setAttribute("rel", relValue);
		ulTag[i].parentNode.style.backgroundImage = (action == false) ? "url(" + treeMenu.openImg + ")" : "url(" + treeMenu.closedImg + ")";
		ulTag[i].parentNode.style.backgroundPosition="top left";
	}
}

treeMenu.rememberstate = function(treeId, durationdays){ //store index of opened ULs relative to other ULs in Tree into cookie
	var ulTag = document.getElementById(treeId).getElementsByTagName("ul");
	var openuls = new Array();
	for (var i = 0; i < ulTag.length; i++) {
		if (ulTag[i].getAttribute("rel") == "open")
			openuls[openuls.length] = i; //save the index of the opened UL (relative to the entire list of ULs) as an array element
	}
	if (openuls.length == 0) //if there are no opened ULs to save/persist
		openuls[0]="none open"; //set array value to string to simply indicate all ULs should persist with state being closed
	treeMenu.setCookie(treeId, openuls.join(","), durationdays); //populate cookie with value treeId=1,2,3 etc (where 1,2... are the indexes of the opened ULs)
}

////A few utility functions below//////////////////////

treeMenu.getCookie = function(Name){ //get cookie value
	var re = new RegExp(Name +"=[^;]+", "i"); //construct RE to search for target name/value pair
	if (document.cookie.match(re)) //if cookie found
		return document.cookie.match(re)[0].split("=")[1]; //return its value
	return "";
}

treeMenu.setCookie = function(name, value, days) { //set cookei value
	var expireDate = new Date();
	//set "expstring" to either future or past date, to set or delete cookie, respectively
	var expstring = expireDate.setDate(expireDate.getDate() + parseInt(days));
	document.cookie = name + "=" + value + "; expires=" + expireDate.toGMTString() + "; path=/";
}

treeMenu.searcharray=function(thearray, value){ //searches an array for the entered value. If found, delete value from array
	var isfound = false;
	for (var i = 0; i < thearray.length; i++){
		if (thearray[i] == value){
			isfound = true;
			thearray.shift(); //delete this element from array for efficiency sake
			break;
		}
	}
	return isfound;
}

treeMenu.preventpropagate = function(e) { //prevent action from bubbling upwards
	if (typeof e != "undefined")
		e.stopPropagation();
	else
		event.cancelBubble = true;
}

/* Assign une function (functionref) à executer 
		lors d'un evenement (evenement)
*/
treeMenu.dotask = function(target, functionref, evenement){ 
	// on verifie l'événement déclencheur
	var evenement = (window.addEventListener) ? evenement : "on" + evenement;
	if (target.addEventListener)
		target.addEventListener(evenement, functionref, false);
	else if (target.attachEvent)
		target.attachEvent(evenement, functionref);
}
