/*
'-------------------------------------------------------------------------------------------------
' Nom du fichier : arborescence.js
' Projet : Personnel
' Auteur : Harmen CHRISTOPHE - bigrenouille@club-internet.fr
' Date de modification : 04/09/2003
' Version : 2.5.6
'-------------------------------------------------------------------------------------------------
Role : Definition de la classe Arborescence
	permet le contruction de menus en arborescence

NAVIGATEURS TESTES:
	PlateForme: Win
		Client:
			IE4, IE5, IE6
			NC4, NC6
			Mozilla 0.9.8
			Opera 5 (Sauf Selection de l'item : selectedColor), Opera 6 (a revoir Onresize)
	PlateForme: Mac
		Client: IE5, NC4


MODELE RAPIDE:
// ======== LEGENDE ==========
// (+)	-->	Collection
// (-)	-->	Objet
// (/)	-->	Propriété
// (*)	-->	Methode
// ===========================
	Arborescence(-)
	|
	\___id(/)
	\___maxLevel(/)
	\___selectedId(/)
	\___selectedColor(/)
	\___heightItem(/)
	\___top(/)
	\___left(/)
	\___img_dir(/)
	\___img_blank(/)
	\___img_item(/)
	\___img_last_item(/)
	\___img_node_closed(/)
	\___img_node_open(/)
	\___img_last_node_closed(/)
	\___img_last_node_open(/)
	\___img_root(/)
	\___img_line(/)
	\___cookieName(/)
	\___baseTarget(/)
	\___itemClass(/)
	\___nodeClass(/)
	\___falseTranspColor(/)
	|
	\___addItem(*)
	\___createIndex(*)
	\___build(*)
	\___buildExpanded(*)
	\___buildItem(*)
	\___showHideItem(*)
	\___moveEnd(*)
	\___selectItem(*)
	\___loadCookie(*)
	\___loadItem(*)
	\___expandAll(*)
	\___collapseAll(*)
	\___expandLevel(*)
	|
	\___browser(-)
	|	|
	|	\___dom(/)
	|	\___ns4(/)
	|	\___ie(/)
	|	\___ie4(/)
	|
	|
	\___all(+)
	|	|
	|	\___Cf. index
	\___index(+)
		|
		\___Item(-)
			|
			\___children(+)
			|
			\___id(/)
			\___indexId(/)
			\___level(/)
			\___arborescenceId(/)
			\___parentId(/)
			\___childrenId(/)
			\___lastPosition(/)
			\___visible(/)
			\___state(/)
			\___libelle(/)
			\___link(/)
			\___leftSide(/)
			\___target(/)
			|
			\___subItem(*)
			\___addItem(*)
			\___setPopup(*)
			\___loadPopup(*)
			|
			\___style(-)
			\___linkStyle(-)
			\___image(-)
			
			
DETAILS DU MODELE :
	OBJET : Arborescence
	Constructeur Arborescence()
		Collection:
			all			-->	contient tous les items ajoutes dans l'ordre de leur declaration (Array)
			index			-->	contient tous les items dans l'ordre de la structure finale (le rendu HTML) (Array)
		Propriete:	
			id			-->	identifiant unique d'une instance Arborescence (numeric)
			maxLevel		-->	profondeur de l'arborescence (numeric)
			selectedId		-->	id de l'item selectionne (numeric)
			selectedColor		-->	couleur appliquee, au niveau du rendu, à l'item selectionne (couleur Html : #CCCCCC) ou "none" pour ne pas surligner l'item en couleur
			heightItem		-->	hauteur d'un item (numeric)
			top			-->	position superieur du rendu (numeric)
			left			-->	position gauche du rendu (numeric)
			img_dir			-->	dossier contenant les images utilisees (Chaine)
			img_blank		-->	nom de l'image transparante (Chaine)
			img_item		-->	nom de l'image representant un item (sans sous-item) ne se trouvant pas en derniere position (Chaine)
			img_last_item		-->	nom de l'image representant un item (sans sous-item) se trouvant en derniere position (Chaine)
			img_node_closed		-->	nom de l'image representant un item (avec sous-item) ne se trouvant pas en derniere position et dont les sous-item ne sont pas visible (Chaine)
			img_node_open		-->	nom de l'image representant un item (avec sous-item) ne se trouvant pas en derniere position et dont les sous-item sont visible (Chaine)
			img_last_node_closed	-->	nom de l'image representant un item (avec sous-item) se trouvant en derniere position et dont les sous-item ne sont pas visible (Chaine)
			img_last_node_open	-->	nom de l'image representant un item (avec sous-item) se trouvant en derniere position et dont les sous-item sont visible (Chaine)
			img_root		-->	nom de l'image associee au premier item de l'arborescence (Chaine)
			img_line		-->	nom de l'image liant, au niveau du rendu, les diferents items(Chaine)
			cookieName		-->	nom du cokie devant contenir un id item (utilise pour la persitence de l'arborescence) (Chaine)
			baseTarget		-->	cible de base pour les liens des items. Represente une chaine d'acces a la propriete de l'objet permetant de cibler le lien ex : "window.location.href" (Chaine)
			itemClass		-->	classe css associee aux items simple (chaine)
			nodeClass		-->	classe css associee aux items avec sous item (chaine)
			falseTranspColor	-->	fausse couleur transparante pour les clients qui n'implémentent pas la transparance (--> couleur d'arriere plan de l'arborescence)
		 Methode:
			addItem			-->	ajoute un item à l'arborescence
			createIndex		-->	construit la collection index
			build			-->	realise le rendu de l'ensemble de l'arborescence
			buildExpanded		-->	realise le rendu de l'ensemble de l'arborescence en laissant déplié l'ensemble de la structure
			buildItem		-->	realise le rendu d'un item
			showHideItem		-->	ouvre ou ferme (plie ou deplie) un element de l'arborescence
			moveEnd			-->	deplace la fin de l'arborescence a chaque showHideItem
			selectItem		-->	selectionne un item mais sans effectuer l'ouverture ou la fermeture
			loadCookie		-->	lit un cookie contenant l'id d'un item et le selectionne
			loadItem		-->	selectionne l'item dont l'objet item a ete passe en parametre
			expandAll		-->	deplie l'ensemble de la structure
			collapseAll		-->	ferme l'ensemble de la structure
			expandLevel     --> ouvre l'ensemble de la structure avec une profondeur maximale d'exploration
		Objet:
			browser			-->	Regroupe les proprietes du navigateur client
	
	
	OBJET : browser
	Constructeur : BrowserSniff()
		Propriete:
			dom			-->	represente un navigateur implementant la methode getElementById (Booleen)
			ns4			-->	represente un navigateur implementant la collection document.layers (Netscape 4) (Booleen)
			ie			-->	represente un navigateur implementant la collection document.all (Internet Explorer) (Booleen)
			ie4			-->	represente un navigateur implementant "ie" mais pas "dom" (Booleen)
	
	
	OBJET : Item
	Constructeur : Item(libelle,link,target)
		Collection:
			children		-->	contient tous les sous-items directe (Array)
		Propriete:
			id			-->	identifiant unique de l'item (incrementation a chaque instance de Item) correspond a la position dans arborescence.all (numeric)
			indexId			-->	position de l'item dans la collection Arborescence.index (numeric)
			level			-->	niveau de l'item dans la structure Arborescence (numeric)
			arborescenceId		-->	reference vers l'intance Arborescence associee a l'item
			parentId		-->	reference de l'item parent dans la collection Arborescence.all (correspond a la propriete id de l'item parent) (numeric)
			childrenId		-->	position de l'item dans la collection children de l'item parent (numeric)
			lastPosition		-->	booleen specifiant si l'item est en derniere position (booleen)
			visible			-->	booleen specifiant si l'item est visible (affiche) ou non (booleen)
			state			-->	etat de l'item courant (open ou closed) (chaine)
			libelle			-->	libelle de l'item (chaine)
			link			-->	lien de l'item (chaine)
			leftSide		-->	code Html represantant l'ensemble du rendu pour la partie structure (cote gauche de l'item) (chaine)
			target			-->	cible du lien de l'item. Represente une chaine d'acces a la propriete de l'objet permetant de cibler le lien ex : "window.location.href" (chaine)
		Methode:
			subItem			-->	retourne le nombre total de sous-item direct et indirecte de l'item courant
			addItem			-->	ajoute à l'item courant un sous-item
			setPopup		-->	initialise une popup pour la cible du lien
			loadPopup		-->	Charge le lien associee a l'item dans un popup
		Objet:
			style			-->	objet html permetant de garder une reference de l'objet style
			linkStyle		-->	objet html permetant de garder une reference de la partie lien de l'item (utilise pour modifier la couleur de l'item selectionne)
			image			-->	reference a un objet image pourvant etre modifiee (item avec sous item pouvant etre ferme ou ouvert)
'-------------------------------------------------------------------------------------------------
*/
arborescences = new Array();

/*CONSTRUCTEUR: ARBORESCENCE
Role:
	INITIALISE L'ENSEMBLES DES METHODES ET PROPRIETES
Parametre:
	- Atop: position haute de l'Arborescence
	- Aleft: position gauche de l'Arborescence
Retour:
	-
Action:
	- initialise l'ensemble des methodes et proprietes
*/
function Arborescence(Atop,Aleft) {
	this.all = new Array();
	this.index = new Array();
	this.id = arbo_id();
	this.maxLevel = 0;
	this.addItem = arbo_addItem;
	this.createIndex = arbo_createIndex;
	this.selectedId = null;
	this.selectedColor = "none"; //"#FFEEB0";
	this.heightItem = 22;
	this.top = Atop?Atop:0;
	this.left = Aleft?Aleft:0;
	this.browser = new BrowserSniff();
	this.build = arbo_build;
	this.buildExpanded = arbo_buildExpanded
	this.buildItem = arbo_buildItem;
	this.showHideItem = arbo_showHideItem;
	this.moveEnd = arbo_moveEnd;
	this.selectItem = arbo_selectItem;
	this.expandAll = arbo_expandAll;
	this.expandLevel = arbo_expandLevel;
	this.collapseAll = arbo_collapseAll;
	this.img_dir = "shop_image/vendor/menu/";
	this.img_blank = this.img_dir + "blank.gif";
	this.img_item = this.img_dir + "Item.gif";
	this.img_last_item = this.img_dir + "Item_Last.gif";
	this.img_node_closed = this.img_dir + "Node_Closed.gif";
	this.img_node_open = this.img_dir + "Node_Open.gif";
	this.img_last_node_closed = this.img_dir + "Node_Last_Closed.gif";
	this.img_last_node_open = this.img_dir + "Node_Last_Open.gif";
	this.img_root = this.img_dir + "root.gif";
	this.img_line = this.img_dir + "Line.gif";
	this.loadCookie = arbo_loadCookie;
	this.loadItem = arbo_loadItem;
	this.cookieName = null;
	this.baseTarget = "window.location.href";
	this.itemClass = "itemContent";
	this.nodeClass = "nodeContent";
	this.falseTranspColor = "#FFFFFF";
}
/*METHODE: ARBORESCENCE
Role:
	RETOURNE UN IDENTIFIANT UNIQUE POUR UNE INSTANCE DE ARBORESCENCE
Parametre:
	-
Retour:
	- longueur du tableau "arborescences" - 1
Action:
	- place dans le tableau arborescences l'instance de Arborescence
*/
function arbo_id() {
	arborescences[arborescences.length] = this;
	return arborescences.length-1;
}
/*METHODE: ARBORESCENCE
Role:
	AJOUTER UN ITEM A L'ARBORESCENCE
Parametre:
	- libelle: Libelle de l'item
	- link: lien associe a l'item
	- taget: cible du lien
Retour:
	- objet Item nouvellement cree
Action:
	- cree une nouvelle instance de la classe Item
	- lui affecte la propriete arborescenceId
	- lui affecte la propriete id qui correspond au nb d'element de la collection all -1
	- ajoute l'objet item a la collection all
	- reaffecte au tableau arborescences l'instance de Arborescence
*/
function arbo_addItem(libelle,link,target) {
	var itemObject;
	itemObject = new Item(libelle,link,target);
	itemObject.arborescenceId = this.id;
	itemObject.id = this.all.length;
	this.all[this.all.length] = itemObject;
	arborescences[this.id] = this;
	return itemObject;
}
/*METHODE: ARBORESCENCE
Role:
	CONSTRUIT LA COLLECTION INDEX
Parametre:
	-
Retour:
	-
Action:
	- initialise le tableau (la collection) index de l'instance Arborescence
	- met a jour la propriete indexId de l'item root (le premier declare) en lui attribuant la valeur 0
	- pour chaque niveau de l'arborescence et a chaque item ayant le niveau courant on met a jour la propriete indexId en rajoutant a l'indexId de l'item pere le nombre de sous item direct et indirect (de x niveau) qui precede l'item courant
	- on met a jour la collection index de l'instance Arborescence en y affectant l'ensemble des items recupere par indexId croissant
	
*/
function arbo_createIndex() {
	var level, i, nbItem, childrenId, indexElement;
	this.index = new Array();
	this.all[0].indexId = 0;
	// De level = a 1 au level max
	for (level = 1; level <= this.maxLevel; level ++) {
		// Et de i=0 au nombre d'element de l'arborescence
		for (i = 0; i < this.all.length; i++) {
			// si le niveau de l'element est egal a la variable level
			if (this.all[i].level == level) {
		 		nbItem = 1;
		 		// De childrenId =0 a la valeur childrenId de l'element 
				for (childrenId = 0; childrenId < this.all[i].childrenId; childrenId++) {
					// On calcul le nombre d'item existant avant l'element courant a partir de l'element pere (frere plus ancien et neuveu )
					nbItem = nbItem + this.all[this.all[i].parentId].children[childrenId].subItem()+1;
				}
				// L'indexId de l'element est = a l'indexId du pere plus le nombre d'element precedant
				this.all[i].indexId = this.all[this.all[i].parentId].indexId + nbItem;
			}
		}
	 }
	// De indexElement = 0 a indexElement egal au nombre d'item de l'arborescence
	for (indexElement = 0; indexElement < this.all.length; indexElement++) {
		// De i = 0 a i = Nombre d'item de l'arborescence
	 	for (i = 0; i < this.all.length; i++) {
	 		if (this.all[i].indexId == indexElement) {
	 			this.index[indexElement] = this.all[i];
	 			break;
	 		}
	 	}
	 }
}
/*CONSTRUCTEUR: BROWSERSNIFF
Role:
	REGROUPE LES PROPRIETE DU NAVIGATEUR CLIENT
Parametre:
	-
Retour:
	-
Action:
	- test differentes methodes specifiques aux diferents types de client et effecte le resultat a des proprietes de l'instance BrowserSniff
*/
function BrowserSniff() {
	this.dom = (document.getElementById) ? true : false;
	this.ns4 = (document.layers) ? true : false;
	this.ie = (document.all) ? true : false;
	this.ie4 = this.ie && !this.dom;
}
/*METHODE: ARBORESCENCE
Role:
	REALISE LE RENDU DE L'ENSEMBLE D'UNE ARBORESCENCE
Parametre:
	-
Retour:
	-
Action:
	- verifi si le rendu n'est pas deja realise
	- execute la methode buildExpanded
	- pour chacun des items  on execute la methode showHideItem avec le parametre "close" qui a pour resultat de replier l'item
	- reaffecte au tableau arborescences l'instance de Arborescence
*/
function arbo_build() {
	var count;
	if (this.all[0].style!=null) {return;}
	this.buildExpanded();
	// ON REMBALLE LE MENU
	for (count = 1; count < this.index.length ; count++) {
		this.showHideItem(this.index[count],"close");
	}
	arborescences[this.id] = this;
	// NON IMPLEMENTEE DANS CETTE VERSION :ON ETEND L'EVENEMENT ONRESIZE POUR NC4 ET OPERA
	//strEventOnResize = 'extendEvent(window,"onresize","extendOnresize(' + this.id + ')","after");';
	//alert(window.onresize);
	//eval(strEventOnResize);
}
/*METHODE: ARBORESCENCE
Role:
	REALISE LE RENDU DE L'ENSEMBLE D'UNE ARBORESCENCE EN LAISSANT DEPLIEE L'ENSEMBLE DE LA STRUCTURE
Parametre:
	-
Retour:
	-
Action:
	- verifi si le rendu n'est pas deja realise
	- execute la methode createIndex
	- insere une image transparante de hauteut = au nb d'element de la structure * la hauteur d'un item (pour provoquer l'apparition d'un scrollbar, sur certain clients, en cas de debordement de fenetre
	- pour chacun des items de la collection index lance le rendu de l'item
	- reaffecte au tableau arborescences l'instance de Arborescence
	- on ettend l'evenenement Onresize pour NC4 pour qu'il reload la page
*/
function arbo_buildExpanded() {
	var i, count;
	if (this.all[0].style!=null) {return;}
	this.createIndex();
	// ON INSERT UN IMAGE DE LA HAUTEUR DU MENU POUR PREVOIR LE DEBORDEMENT DE FENETRE ET AJOUTER LA SCROLLBAR
	if (this.browser.ie4) {
		document.write('<div style="position:absolute;top:' + this.top + ';left:' + this.left + '"><img src="' + this.img_blank + '" border="0" width="1" hspace="0" vspace="0" height="' +  (this.heightItem * this.index.length)  + '"></div>');
	}
	if (this.browser.ns4) {
		document.write('<layer position="absolute" top="' + this.top + '" left="' + this.left + '"><img src="' + this.img_blank + '" border="0" width="1" hspace="0" vspace="0" height="' +  (this.heightItem * this.index.length)  + '"></layer>');
	}
	if (this.browser.dom) {
		document.write('<div style="position:absolute;top:' + this.top + ';left:' + this.left + '"><img src="' + this.img_blank + '" border="0" width="1" hspace="0" vspace="0" height="' +  (this.heightItem * this.index.length)  + '"></div>');
	}
	for (i = 0; i < this.index.length; i++) {
		this.buildItem(this.index[i]);
	}
	arborescences[this.id] = this;
	// POUR LA PREMIERE INSTANCE DE LA PAGE ON COMPLETE L'EVENEMENT ONRESIZE POUR NS4
	if ((this.id==0) && (this.browser.ns4)) {
		extendEvent(window,"onresize","window.location.reload()","after");
	}
}
/*METHODE: ARBORESCENCE
Role:
	REALISE LE RENDU D'UN ITEM
Parametre:
	- objItem: Objet Item pour lequel il faut realiser le rendu HTMLM
Retour:
	-
Action:
	- initialise quelques variables locales
	- pour chaque type de client initialise le code html de l'item ainsi que les parties de code qui contiendront le lien
	- si l'item est l'item root initialise la propriete leftSide qui correspond pour chaque item au rendu situe a gauche du libelle et de la derniere image (toute la partie structure)
	- sinon:
		- recupere le nombre de sous item
		- initialise la variable nextItemIndexId qui correspond a la propriete  indexId du prochain item de meme niveau
		- si nextItemIndexId est supperieur a la longueur de la collection index, cela signifie que l'item courant est en dernier position
		- dans ce cas on initialise la propriete lastPosition et la propriete leftSide qui sera utilisee par les sous item de l'item courant
			- si nextItemIndexId est inferieur a la longueur de la collection index
				- mais que la propriete level est diference entre l'item courant et l'item nextItemIndexId, cela signifie que l'item courant est en dernier position
				- dans ce cas on initialise les proprietes lastPosition et leftSide
					- mais si les proprietes level ont les meme valeur, cela signifie que l'item courant n'est pas en derniere position
					- on initialise les proprietes lastPosition et leftSide en consequence
		- si l'item courant possede des sous items et qu'il est en derniere position on inclut au code HTML la partite structure anisi qu'une image clickable reresentant un item deplie (ouvert) de dernier position
		- si l'item courant possede des sous items et qu'il est en derniere position on inclut au code HTML la partite structure anisi qu'une image clickable reresentant un item deplie (ouvert) simple
		- si l'item courant ne possede des sous items et qu'il est en derniere position on inclut au code HTML la partite structure anisi qu'une image reresentant un item simple de derniere position
		- si l'item courant ne possede pas des sous items et qu'il n'est pas en derniere position on inclut au code HTML la partite structure anisi qu'une image reresentant un item simple
	- inclut au code HTML la partie lien. si l'item possede des sous item on affecte au TD la classe nodeContent sinon on attribut la classe  itemContent
	- pour chaque type de client on finalise le code html, on ecrit le contenu dans le flux du document , on recupere les objets style (permetant de modifer la propriete visibility), linkStyle (pour modifier le background de l'item selectionne) et image (pour modifier l'image associee a l'item lorsque celui ci peut être plie ou deplie) et on finit par mettre a jour les proprietes "state" et "visible".
*/
function arbo_buildItem(objItem) {
	var htmlCode, whithChild, itemName, imageName, linkName, thetop, linkContainerStart, linkContainerEnd, subItemCount, nextItemIndexId;
	htmlCode = "";
	whithChild = objItem.children.length!=0?true:false;
	itemName = "Arbo" + this.id + "Item" + objItem.id;
	imageName = itemName + "Img";
	linkName = itemName + "Link";
	thetop = (this.top + this.heightItem  * objItem.indexId);
	if (this.browser.ie4) {
		linkContainerStart = '<TD ID="' +  linkName +  '" NOWRAP>';
		linkContainerEnd = '</TD>';
		htmlCode = '<DIV STYLE="POSITION:ABSOLUTE;VISIBILITY:VISIBLE;TOP:' + thetop + ';LEFT:' + this.left + '" ID="' + itemName + '" HEIGHT="' + this.heightItem + '" ><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR>';
	}
	if (this.browser.ns4) {
		linkContainerStart = '<TD><ILAYER ID="' +  linkName +  '"><NOBR>';
		linkContainerEnd = '</NOBR></ILAYER></TD>';
		htmlCode = '<LAYER VISIBILITY="VISIBLE" TOP="' + thetop + '" LEFT="' + this.left + '" NAME="' + itemName + '" HEIGHT="' + this.heightItem + '" ><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR>';
	}
	if (this.browser.dom) {
		linkContainerStart = '<TD ID="' +  linkName +  '" NOWRAP valign="middle">';
		linkContainerEnd = '</TD>';
		htmlCode = '<DIV STYLE="POSITION:ABSOLUTE;VISIBILITY:VISIBLE;TOP:' + thetop + ';LEFT:' + this.left + '" ID="' + itemName + '" HEIGHT="' + this.heightItem + '" ><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR>';
	}
	if (objItem.level == 0) {
		objItem.leftSide = '';
		htmlCode = htmlCode + '<TD><IMG HEIGHT="' + this.heightItem + '" SRC="'+this.img_root+'"></TD>';
	} else {
		subItemCount = objItem.subItem();
		nextItemIndexId = objItem.indexId + subItemCount + 1;
		if (nextItemIndexId >= this.index.length) {
			// Dernier
			objItem.lastPosition= true;
			objItem.leftSide = this.all[objItem.parentId].leftSide + '<TD><IMG HEIGHT="' + this.heightItem + '" SRC="' + this.img_blank + '"></TD>';
		} else {
			if (objItem.level != this.index[nextItemIndexId].level) {
				// Dernier
				objItem.lastPosition= true;
				objItem.leftSide = this.all[objItem.parentId].leftSide + '<TD><IMG HEIGHT="' + this.heightItem + '" SRC="' + this.img_blank + '"></TD>';
			} else {
				// Non Dernier
				objItem.lastPosition= false;
				objItem.leftSide = this.all[objItem.parentId].leftSide + '<TD><IMG HEIGHT="' + this.heightItem + '" SRC="'+this.img_line+'"></TD>';
			}
		}
		if (whithChild) {
			if (objItem.lastPosition) {
				htmlCode = htmlCode + this.all[objItem.parentId].leftSide + '<TD><A HREF="javascript:openItem(' + this.id + ',' + objItem.id + ');" target="_self"><IMG HEIGHT="' + this.heightItem + '" SRC="'+this.img_last_node_open+'" ID="'  +  imageName + '" NAME="'  +  imageName + '" BORDER="0"></A></TD>';
			} else {
				htmlCode = htmlCode + this.all[objItem.parentId].leftSide + '<TD><A HREF="javascript:openItem(' + this.id + ',' + objItem.id + ');" target="_self"><IMG HEIGHT="' + this.heightItem + '" SRC="'+this.img_node_open+'" ID="'  +  imageName + '" NAME="'  +  imageName + '" BORDER="0"></A></TD>';
			}
		} else {
			if (objItem.lastPosition) {
				htmlCode = htmlCode + this.all[objItem.parentId].leftSide + '<TD><IMG HEIGHT="' + this.heightItem + '" SRC="'+this.img_last_item+'" ID="'  +  imageName + '" NAME="'  +  imageName + '"></TD>';
			} else {
				htmlCode = htmlCode + this.all[objItem.parentId].leftSide + '<TD><IMG HEIGHT="' + this.heightItem + '" SRC="'+ this.img_item +'" ID="'  +  imageName + '" NAME="'  +  imageName + '"></TD>';
			}
		}
	}
	if (whithChild) {
		htmlCode = htmlCode + linkContainerStart + '&nbsp;<A HREF="javascript:clickOnItem(' + this.id + ',' + objItem.id + ');" CLASS="' + this.nodeClass + '" target="_self">' + objItem.libelle + '</A>&nbsp;' + linkContainerEnd;
	} else {
		htmlCode = htmlCode + linkContainerStart + '&nbsp;<A HREF="javascript:clickOnItem(' + this.id + ',' + objItem.id + ');" CLASS="' + this.itemClass + '" target="_self">' + objItem.libelle + '</A>&nbsp;' + linkContainerEnd;
	}
	if (this.browser.ie4) {
		htmlCode = htmlCode + '</TR></TABLE></DIV>';
		document.write(htmlCode);
		objItem.style = document.all.item(itemName).style;
		objItem.linkStyle = document.all.item(linkName).style;
		objItem.image = document.all.item(imageName);
	}
	if (this.browser.ns4) {
		htmlCode = htmlCode + '</TR></TABLE></LAYER>';
		document.write(htmlCode);
		objItem.style = document.layers[itemName];
		objItem.linkStyle = document.layers[itemName].document.layers[linkName];
		objItem.image = document.layers[itemName].document.images[imageName];
	}
	if (this.browser.dom) {
		htmlCode = htmlCode + '</TR></TABLE></DIV>';
		document.write(htmlCode);
		objItem.style = document.getElementById(itemName).style;
		objItem.linkStyle = document.getElementById(linkName).style;
		objItem.image = document.getElementById(imageName);
	}
	objItem.visible = true;
	objItem.state = "open";
}
/*METHODE: ARBORESCENCE
Role:
	- OUVRE OU FERME (PLIE OU DEPLIE) UN ELEMENT DE L'ARBORESCENCE
Parametre:
	- objItem: objet Item
	- state: chaine specifiant l'action a mener "close" pour plier lelement ou "open" pour deplier l'element de l'arborescence
Retour:
	-
Action:
	- initialise quelques variables locales
	- selon la valeur de state on initialise d'autre variables et on met a jour certaine propriete de objItem dont:
		- si l'item est deja dans l'etat recherche on sort de la methode (objItem.state)
		- pour chaque type de client on initialise la variable visibilityTest qui represente la valeur de la propriete style.visibility a tester pour chacun des sous item de l'item courant
		- pour chaque type de client on initialise la variable visibilityNew qui represente la nouvelle valeur de la propriete style.visibility pour chacun des sous item de l'item courant
		- la variable moveEndSens represente le sens de deplacerment du reste de l'arborescence quant l'item courant sera plie ou deplie
	- si l'item courant possede des sous item  et qu'il est en derniere position on recupere le chemin de l'image img_last_node_ pour l'etat de l'item (open ou closed)
	- si l'item courant possede des sous item  et qu'il n'est pas en derniere position on recupere le chemin de l'image img_node_ pour l'etat de l'item (open ou closed)
	- si l'iten courant ne possede pas de sous item et qu'il est en derniere position on recupere le chemin de l'image img_last_item
	- si l'iten courant ne possede pas de sous item et qu'il n'est pas en derniere position on recupere le chemin de l'image img_item
	- pour chacun des sous item direct et indirect (de x niveau)
		- on recupere l'item "pere"
		- si la propriete visibility de l'item courant passe le test
			- si cet item courant est juste au niveau inferieur de l'item que l'on ouvre ou on deplie, on modifi dans tous les cas sa visibilite et sa propriete visible
			- si on depli un element d'arborescence (state == "open")
				- on verifie les propriete visible et state de l'item pere
					- si le pere est visible et ouvert on affiche l'item courant et on replace la fin de l'arborescence (moveEnd())
			- si on repli un element d'arborescence (state == "close")
				- on cache l'item courant dans tous les cas et on replace la fin de l'arborescence (moveEnd())
	- on modifi la source de l'image associe a l'item passe en parametre
*/
function arbo_showHideItem(objItem,state) {
	var whithChild, childWidthChild, nbChild, nextIndexId, visibilityTest, visibilityNew, moveEndSens, imgNewSrc, j, objParent;
	if (objItem.level !=0) {
		whithChild = objItem.children.length!=0?true:false;
		nbChild = objItem.subItem();
		// INDEXID DU PROCHAIN ITEM DE MEME NIVEAU
		nextIndexId = objItem.indexId + nbChild + 1;
		if (state=="close") {
			if (objItem.state == "closed") {return;}
			objItem.state ="closed";
			visibilityTest = this.browser.ie4?"visible":this.browser.ns4?"show":this.browser.dom?"visible":null;
			visibilityNew = this.browser.ie4?"hidden":this.browser.ns4?"hidden":this.browser.dom?"hidden":null;
			// SENS PASSEE A LA METHODE MOVEEND
			moveEndSens = "up";
		} else if (state=="open") {
			if (objItem.state == "open") {return;}
			objItem.state = "open";
			visibilityTest = this.browser.ie4?"hidden":this.browser.ns4?"hide":this.browser.dom?"hidden":null;
			visibilityNew = this.browser.ie4?"visible":this.browser.ns4?"visible":this.browser.dom?"visible":null;
			moveEndSens = "down";
		}
		// MISE A JOUR DE LA SRC POUR LE FUTUR CHANGEMENT D'IMAGE
		if (whithChild) {
			if (objItem.lastPosition) {
				imgNewSrc = eval("this.img_last_node_" + objItem.state);
			} else if (!objItem.lastPosition) {
				imgNewSrc = eval("this.img_node_" + objItem.state)
			}
		} else {
			if (objItem.lastPosition) {
				imgNewSrc = this.img_last_item;
			} else if (!objItem.lastPosition) {
				imgNewSrc = this.img_item;
			}
		}
		
		for (j = (objItem.indexId + 1); j < nextIndexId; j++) {
			objParent = this.all[this.index[j].parentId];
			if (this.index[j].style.visibility.toLowerCase() == visibilityTest) {
				if ((parseInt(this.index[j].level)-1) == objItem.level) {
					this.index[j].style.visibility = visibilityNew;
					if (state == "close") {this.index[j].visible = false;}
					if (state == "open") {this.index[j].visible = true;}
					this.moveEnd(j+1,moveEndSens,(1 * this.heightItem));
					continue;	
				}
				if (state == "open") {
					if (objParent.visible && objParent.state == "open") {
						this.index[j].style.visibility = visibilityNew;
						this.index[j].visible = true;
						this.moveEnd(j+1,moveEndSens,(1 * this.heightItem));
						continue;
					}
				}
				if (state == "close") {
					this.index[j].style.visibility = visibilityNew;
					this.index[j].visible = false;
					this.moveEnd(j+1,moveEndSens,(1 * this.heightItem));
					continue;
				}
			}
			
		}
		// MISE A JOUR DE L'IMAGE DE L'ITEM
		objItem.image.src = imgNewSrc;
	}
}
/*METHODE: ARBORESCENCE
Role:
	DEPLACE LA FIN DE L'ARBORESCENCE A CHAQUE SHOWHIDEITEM
Parametre:
	- firstIndexId: valeur de la propriete indexId du premier Item a deplacer
	- sens: chaine representent le sens de deplacement des items ("up" pour monter, "down" pour descendre)
	- px: valeur en px du deplacement a effectuer
Retour:
	-
Action:
	- selon le parametre sens on initialise la variable ope qui represente l'operateur a applique a la proriete top
	- pour chacun des items de la collection index a compter de l'element firstIndexId on modifie la propriete top de l'objet style
*/
function arbo_moveEnd(firstIndexId,sens,px) {
	var ope, i, newTop, regPx;
	if (px!=0) {
		if (sens == "up") {ope = "-";}
		if (sens == "down") {ope = "+";}
		for (i=firstIndexId; i < this.index.length; i++) {
			newTop = this.index[i].style.top;
			// POUR IE4 ET DOM LE style.top comporte la mention px (pour pixel) (SAUF OPERA)
			regPx = /px/;
			if (regPx.test(newTop)) {
				newTop = newTop.substring(0,newTop.length-2);
			}
			newTop = eval('parseInt(newTop)' + ope + px);
			this.index[i].style.top = newTop;
		}
	}
}
/*METHODE: ARBORESCENCE
Role:
	SELECTIONNE UN ITEM SANS EFFECTUER L'OUVERTURE OU LA FERMETURE DE CE DERNIER
Parametre:
	- objItem: Objet Item a selectionner
Retour:
	-
Action:
	- si le niveau de l'item est superieur a 1 on verifi que l'ensemble des items pere soient ouvert. Si ce n'est pas le cas on realise l'ouverture
	- Si la propriété selectedColor est différente de "none" pour chacun des type de client on recupere la propriete background ainsi que la valeur de cette propriete pour la couleur transparante
		- on verifi si il existe un item selectionne (propriete selectedId de l'instance Arborescence)
			- si c'est le cas on applique la couleur transparente (ou la couleur de fond pour les client qui n'implemente pas la transparance : opera 6) à l'item selectionne
		- on applique a l'objet linkStyle de l'item passe en parametre la couleur de fond defini par la propriete selectedColor de l'objet Arborescence
	- on met a jour la propriete selectedId par la valeur id de l'item passe en parametre
	- Si la propriéte cookieName est definie on met à jour la valeur du cookie
*/
function arbo_selectItem(objItem) {
	var parentObject, level, bgCProp, transpColor;
	// Si on veut selectionner un objet dans l'arboressence dont le parent n'est pas ouvert
	if (objItem.level > 1) {
		parentObject = this.all[objItem.parentId];
		invLevel = new Array();
		for (level = objItem.level; level > 0; level --) {
			invLevel[invLevel.length] = parentObject;
			//this.showHideItem(parentObject,"open");
			parentObject = this.all[parentObject.parentId];
		}
		for (parentCount = (invLevel.length-1); parentCount >= 0; parentCount--) {
			this.showHideItem(invLevel[parentCount],"open");
		}
	}
	if (this.selectedColor!="none") {
		if (this.browser.ie4) {
			bgCProp = ".backgroundColor";
			transpColor = "transparent";
		}
		if (this.browser.ns4) {
			bgCProp = ".bgColor";
			transpColor = null;
		}
		if (this.browser.dom) {
			bgCProp = ".backgroundColor";
			transpColor = "transparent";
		}
		if(this.selectedId!=null) {
			// POUR LES CLIENTS QUI N'IMPLEMENTE PAS LA COULEUR TRANSPARENTE (OPERA 6)
			eval("this.all[this.selectedId].linkStyle" + bgCProp + " = " + "this.falseTranspColor");
			eval("this.all[this.selectedId].linkStyle" + bgCProp + " = " + "transpColor");
		}
		eval("objItem.linkStyle" + bgCProp + " = \"" + this.selectedColor + "\"");
	}
	this.selectedId = objItem.id;
}
/*METHODE: ARBORESCENCE
Role:
	LIT UN COOKIE CONTENANT L'ID D'UN ITEM ET LE SELECTIONNE
Parametre:
	-
Retour:
	-
Action:
	- recupere la valeur du cookie ayant le nom fixe par la propriete cookieName de l'objet Arborescence
	- verifi que l'eventuel id recupere represente bien un id d'un des items existant et recupere l'objet Item associe
	- si ce n'est pas le cas on recupere l'item root
	- on verifi que le rendu HTML de l'arborescence est realise. si ce n'est pas le cas on le realise
	- on selectione l'objet item
	- si l'item est diferent de l'item root on deplie l'element d'arborescence associe a l'item
*/
function arbo_loadCookie() {
	var idItem, objItem;
	if (this.cookieName!=null) {
		idItem = GetCookie(this.cookieName);
	} else {
		idItem = null;	
	}
	if ((idItem != null) && (idItem < this.all.length)) {
	 	objItem = this.all[idItem];
	} else {
	 	objItem = this.all[0];
	}
	if (objItem.style==null) {this.build();}
	this.selectItem(objItem);
	if (objItem.level != 0) this.showHideItem(objItem,"open");
}
/*METHODE: ARBORESCENCE
Role:
	SELECTIONNE L'ITEM DONT L'OBJET ITEM A ETE PASSE EN PARAMETRE
Parametre:
	- objItem: Objet Item
Retour:
	-
Action:
	- on verifi que le rendu HTML de l'arborescence est realise. si ce n'est pas le cas on le realise
	- on selectione l'objet item
	- si l'item est diferent de l'item root on deplie l'element d'arborescence associe a l'item
*/
function arbo_loadItem(objItem) {
	if (objItem.style==null) {this.build();}
	this.selectItem(objItem);
	if (objItem.level != 0) {
		this.showHideItem(objItem,"open");
	}
}
/*METHODE: ARBORESCENCE
Role:
	DEPLIE L'ENSEMBLE DE L'ARBORESCENCE
Parametre:
	-
Retour:
	-
Action:
	- on ouvre chacun des items de la structure
*/
function arbo_expandAll() {
	// ON DEBALLE LE MENU
	for (count = 1; count < this.index.length ; count++) {
		this.showHideItem(this.index[count],"open");
	}
	arborescences[this.id] = this;
}
/*MÉTHODE: ARBORESCENCE
Rôle:
    DÉPLIE L'ARBORESCENCE JUSQU'AU NIVEAU iLevel
Paramètre:
    - iLevel : niveau sur lequel on va arrêter le dépliage
Retour:
    -
Action:
    - on ouvre chacun des items de la structure jusqu'au niveau iLevel
*/
function arbo_expandLevel(iLevel) {
    // ON DÉBALLE LE MENU
    for (count = 1; count < this.index.length ; count++) {
        if (this.index[count].level < iLevel)
            this.showHideItem(this.index[count],"open");
        else
            this.showHideItem(this.index[count],"close");
    }
    arborescences[this.id] = this;
}
/*METHODE: ARBORESCENCE
Role:
	FERME L'ENSEMBLE DE L'ARBORESCENCE
Parametre:
	-
Retour:
	-
Action:
	- on ferme chacun des items de la structure
*/
function arbo_collapseAll() {
	// ON REMBALLE LE MENU
	for (count = 1; count < this.index.length ; count++) {
		this.showHideItem(this.index[count],"close");
	}
	arborescences[this.id] = this;
}
/*CONSTRUCTEUR: ITEM
Role:
	INITIALISE L'ENSEMBLES DES METHODES ET PROPRIETES
Parametre:
	- libelle: Libelle de l'item
	- link: lien associe a l'item
	- taget: cible du lien
Retour:
	-
Action:
	- initialise l'ensemble des methodes et proprietes
*/
function Item(libelle,link,target) {
	this.id = null;
	this.indexId = null;
	this.level = 0;
	this.arborescenceId = null;
	this.parentId = null;
	this.childrenId = null;
	this.lastPosition = null;
	this.children = new Array();
	this.subItem = item_subItem;
	this.addItem = item_addItem;
	this.state = null;
	this.libelle = libelle?libelle:"Item";
	this.style = null;
	this.linkStyle = null;
	this.image = null;
	this.leftSide = null;
	this.state = null;
	this.link = link?link:null;
	this.target= target?target:null;
	// NEW: SI EST AFFICHE OU NON
	this.visible = null;
	// POPUP
	this.setPopup = item_setPopup;
	this.loadPopup = item_loadPopup;
}
/*METHODE: ITEM
Role:
	RETOURNE LE NOMBRE TOTAL DE SOUS ITEM DIRECT ET INDIRECT DE L'ITEM COURANT
Parametre:
	-
Retour:
	- nombre d'item
Action:
	- initialise quelques variables locales
	- pour chaque element de la collection children increment la variable "si" du nombre de sous elements pour l'item courant
*/
function item_subItem() {
	var i, si;
	i = 0;
	si = this.children.length;
	for (i=0; i < this.children.length; i++){
		si = si + this.children[i].subItem();
	}
	return si;
}
/*METHODE: ITEM
Role:
	AJOUTE A L'ITEM COURANT UN SOUS ITEM
Parametre:
	- libelle: Libelle de l'item
	- link: lien associe a l'item
	- taget: cible du lien
Retour:
	- objet Item nouvellement cree
Action:
	- recupere l'instance de Arborescence
	- execute la methode addItem de la classe Arborescence
	- met a jour la collection children de l'item courant
	- affect au nouvel Item les proprietes childrenId, parentId et level
	- met eventuellement a jour le propriete maxLevel de l'instance de Arborescence
*/
function item_addItem(libelle,link,target) {
	var structure, subItemObject;
	if (this.arborescenceId == null) {
		alert("Vous ne pouver rajouter un Item sans creer un objet structure de type \"Arborescence\"");
		return false;
	} else {
		structure = arborescences[this.arborescenceId];
		subItemObject = structure.addItem(libelle,link,target);
		this.children[this.children.length] = subItemObject;
		subItemObject.childrenId = this.children.length - 1;
		subItemObject.parentId = this.id;
		subItemObject.level = this.level+1;
		if (structure.maxLevel < subItemObject.level) {structure.maxLevel = subItemObject.level;}
		return subItemObject;
	}
}
/*METHODE: ITEM
Role:
	INITIALISE LES PROPRIETES SPECIFIQUES A LA CIBLE DE TYPE POPUP
Parametre:
	- name: nom de la popup (utilisé pour garder une eventuelle reference de la fenetre nouvellement ouverte
Retour:
	- 
Action:
	- met a jour la propriete target
	- initialise les variable specifique a la commande windo.open()
*/
function item_setPopup(name) {
	// ON MET A JOUR LA PROPRIETE TARGET
	this.target="popup";
	this.poName = name?name:"_blank";
	/* NON IMPLEMENTEE DANS CETTE VERION
	this.poHeight = height?height:null;
	this.poWidth = width?width:null;
	this.poLocation = 1;
	this.poMenubar = 1;
	this.poStatus = 1;
	this.poToolbar = 1;
	*/
}
/*METHODE: ITEM
Role:
	CHARGE LE LIEN ASSOCIE A UN ITEM DANS UN POPUP
Parametre:
	-
Retour:
	-
Action:
	- verifi si la methode setPopup a ete executee
	- effectue un window.open
*/
function item_loadPopup() {
	// ONVERIFI L'EXECUTION DE LA METHODE setPopup
	if (!this.poName) {this.setPopup();}
	/* PAS IMPLEMENTEE DANS CETTE VERSION
	var feature = "";
	feature = this.poHeight!=null?"height="+this.poHeight:"";
	feature = feature!=""?feature + ",":"";
	feature = this.poWidth!=null?"width="+this.poHeight:"";
	feature = feature!=""?feature + ",":"";
	feature = feature + "status=" + this.poStatus +",toolbar=" + this.poToolbar + ",menubar=" + this.poMenubar + ",location=" + this.poLocation
	//window.open(this.link,this.poName, feature);
	*/
	window.open(this.link,this.poName);
}
/*METHODE: GLOBALE
Role:
	METHODE EXECUTEE LORS DE DU CLICK SUR UN ITEM
Parametre:
	- ArboId: valeur de la propriete id de l'instance Arborescence qui est concernee par la methode
	- ItemId: valeur de la propriete id de l'instance Item qui est concernee par la methode
Retour:
	-
Action:
	- on verifi si l'instance Arborescence ayant la propriete id ayant comme valeur ArboId existe. si c'est le cas on recupere l'objet Arborescence
	- on verifi si l'instance Item ayant la propriete id ayant comme valeur ItemId existe. si c'est le cas on recupere l'objet Item
	- ensuite et suivant le niveau de l'item on execute la methode showHideItem pour plier ou deplier l'element d'arborescence
	- on verifi que l'objet item possede la propriete link
	- on verifi si la propriete target est definie. si c'est le cas on evalue le lien
	- si le target (ou baseTarget) est indefini on recupere le baseTarget pour evaluer le lien
		- si le target vaut "popup" il faut charger le lien dans un popup. pour cela on execute la methode loadPopup
	
*/
function clickOnItem(ArboId,ItemId) {
	var objArbo, objItem, action;
	if (ArboId < arborescences.length) {
		objArbo = arborescences[ArboId];
		if (ItemId < objArbo.all.length) {
			objItem = objArbo.all[ItemId];
			objArbo.selectItem(objItem);
			if (objItem.level != 0) {
				action = objItem.state=="closed"?"open":"close";
				objArbo.showHideItem(objArbo.all[ItemId],action);
			}
			if (objItem.link != null) {
				// Mise a jour du cookie
				if (objArbo.cookieName!=null) {
					SetCookie(objArbo.cookieName, objItem.id, null,"/");
				}
				// EVOCATION DU LIEN
				if (objItem.target=="popup") {
					objItem.loadPopup();
				} else if (objItem.target!=null) {
					eval(objItem.target + " = objItem.link");
				} else {
					eval(objArbo.baseTarget + " = objItem.link ");
				}
			}
		}
	}
}
/*METHODE: GLOBALE
Role:
	METHODE EXECUTEE LORS DE DU CLICK SUR LA PARTIE GAUCHE D'UN ITEM AVEC SOUS ITEM
Parametre:
	- ArboId: valeur de la propriete id de l'instance Arborescence qui est concernee par la methode
	- ItemId: valeur de la propriete id de l'instance Item qui est concernee par la methode
Retour:
	-
Action:
	- on verifi si l'instance Arborescence ayant la propriete id ayant comme valeur ArboId existe. si c'est le cas on recupere l'objet Arborescence
	- on verifi si l'instance Item ayant la propriete id ayant comme valeur ItemId existe. si c'est le cas on recupere l'objet Item
	- ensuite et suivant le niveau de l'item on execute la methode showHideItem pour plier ou deplier l'element d'arborescence
*/
function openItem(ArboId,ItemId) {
	var objArbo, objItem, action;
	if (ArboId < arborescences.length) {
		objArbo = arborescences[ArboId];
		if (ItemId < objArbo.all.length) {
			objItem = objArbo.all[ItemId];
			if (objItem.level != 0) {
				action = objItem.state=="closed"?"open":"close";
				objArbo.showHideItem(objArbo.all[ItemId],action);
			}
		}
	}
}
/*
permet de corriger le pb de NC4 et Opera sur l'evenement Onresize
*/
/* NON IMPLEMENTE DANS CETTE VERSION
function extendOnresize(arborescenceId) {
	if (arborescences[arborescenceId]) {
		objArbo = arborescences[arborescenceId];
		alert("onresize : " + objArbo.all[0].libelle);
		// TOUJOURS LE MEME BUG
		//for (icount = 0; icount < objArbo.index.length; icount++) {
		for (icount = (objArbo.index.length-1); icount >=0; icount--) {
			if (objArbo.index[icount].level != 0) {
				action = objArbo.index[icount].state=="closed"?"close":"open";
				// VERIFIE QUE showHideItem TRAITE LE SHOW ET HIDE
				objArbo.showHideItem(objArbo.index[icount],action);
			}
			//break;
		}
		//if (objArbo.selectedId!=null) {
		//	objArbo.selectItem(objArbo.all[objArbo.selectedId]);
		//}
		
	}
}
*/
/*METHODE: GLOBALE
Role:
	PERMET D'ETTENDRE UN EVENEMENT
Parametre:
	- objDOMobject: Objet auquel on veut completer un evenement (objet)
	- strEventName: Nom de l'evenement (chaine)
	- strNewEvent: Chaine represant le code javascript a executer lors de l'evenement (chaine)
	- strPos: position du code rajouté par rapport au contenu de l'evenement existant (before ou after) (chaine)
Retour:
	-
Action:
	- recupere l'évenement à completer
	- recupere les index du debut et de la fin du code de l'evenement (entre { et })
	- recupere le corp de l'evenement.
	- selon le parametre strPos place le complement d'evenement avant ou après le code existant
	- redefini l'évenement
*/
function extendEvent(objDOMobject,strEventName,strNewEvent,strPos) {
	var strOldEvent = new String(eval("objDOMobject." + strEventName));
	var intStart = strOldEvent.indexOf("{") + 1;
	var intLen = (strOldEvent.lastIndexOf("}")- intStart);
	var strOldEventBody = strOldEvent.substr(intStart, intLen);
	if (strPos == "before") {
		var strNewEventBody = strNewEvent + strOldEventBody;
	} else if (strPos == "after") {
		var strNewEventBody = strOldEventBody + strNewEvent;
	}
	eval("objDOMobject." + strEventName + " = new Function(strNewEventBody)");
}
/* */
/*METHODE: GLOBALE
	SOURCE RECUPERABLE SUR http://www.hidaho.com/
*/
function getCookieVal (offset) {
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1) endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}
/*METHODE: GLOBALE
	SOURCE RECUPERABLE SUR http://www.hidaho.com/
*/
function GetCookie (name) {
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;
	while (i < clen) {
		var j = i + alen;
		if (document.cookie.substring(i, j) == arg) return getCookieVal (j);
		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) break; 
	}
	return null;
}
/*METHODE: GLOBALE
	SOURCE RECUPERABLE SUR http://www.hidaho.com/
*/
function SetCookie (name,value,expires,path,domain,secure) {
	document.cookie = name + "=" + escape (value) +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
}
