/*****************************************************************************************************
 Script permettant l'affichage de listes dépliées, menus en arbres.
 Version : 1.0
 Auteur : Laurent CAILLETEAU
******************************************************************************************************/

//
// Classe listeDepliable.
//
function listeDepliable() {
	this.treeImg = arguments[0];
	this.expdImg = arguments[1];
	this.sub = [];
}
 
//
// Sous-classe sub.
//
function sub() {
	this.expanded = arguments[0];
	this.idligne;
	this.sub = [];
	this.infocellule = [];
}

//
// Sous-classe infocellule.
//
function infocellule() {
	this.texte = arguments[0];
	this.width = arguments[1];
	this.height = arguments[2];
	this.lien = arguments[3];
}

//
// Fonction de création de la liste en Javascript.
//
function creerListe(in_listeObjets, in_listeNom) {
	// Appel à la méthode récursive.
	l_texteComplet = "<table><tr><td>";
	l_texteComplet += creerListeRecursive(true, in_listeObjets, 'cle' + in_listeNom, in_listeObjets, in_listeNom, false, true);	
	l_texteComplet += "</td></tr></table>";
	
	// Retournons la solution.
	return l_texteComplet;
}

//
// Fonction de création de la liste en Javascript.
//
function creerListeRecursive(in_premierAppel, in_listeObjets, in_cleRecursion, in_listeObjetsBase, in_listeNom, in_pictotreeParental, in_deplie) {
	// Initialisation de la variable stockant l'ensemble des informations.
	var l_texteComplet = '';

	// Boucle sur l'ensemble des objets de la liste.
	for (var i=0; i<in_listeObjets.sub.length; i++) {
		// Début de ligne.
		var l_nouvelleCleRecursion = in_cleRecursion + '_' + i;

		// DIV de ligne.
		var l_display = '';
		if (! in_premierAppel) {
			if (!in_deplie || !in_listeObjets.expanded) {
				l_display = 'display:none;';
			}
		}		
		l_texteComplet += '\r\n<div style="height:21px;width:700px;' + l_display + '" ID="' + l_nouvelleCleRecursion + '">';

		// Mise à jour de la clé de récursion pour le sub.
		in_listeObjets.sub[i].idligne = l_nouvelleCleRecursion;
									  
		// Créons le tableau de pictostree pour notre élément. Il faut prendre le
		// pictotree parental auquel on ajoute soit un T renversé, soit un demi T.
		var l_pictotree = clonerTableau(in_pictotreeParental);
		var l_pictotreePourEnfants = clonerTableau(in_pictotreeParental);
		if (! l_pictotree) {
			l_pictotree = [];
			l_pictotreePourEnfants = [];
		} else {
			if (i == in_listeObjets.sub.length - 1) {
				// En bout de ligne, demi-T donc...
				l_pictotree[l_pictotree.length] = in_listeObjetsBase.treeImg[3];
				l_pictotreePourEnfants[l_pictotreePourEnfants.length] = in_listeObjetsBase.treeImg[5];
			} else {
				l_pictotree[l_pictotree.length] = in_listeObjetsBase.treeImg[2];
				l_pictotreePourEnfants[l_pictotreePourEnfants.length] = in_listeObjetsBase.treeImg[4];
			}
		}

		// DIV de première cellule pour l'arbre.
		// l_texteComplet += '\r\n  <div style="height:21px;width:400px;float:left;background-color: red;">';
		var l_infoCellule = in_listeObjets.sub[i].infocellule[0];
		l_texteComplet += '\r\n  <div style="height:' + l_infoCellule.height + ';width:' + l_infoCellule.width + ';float:left;">';
		if (in_listeObjets.sub[i].sub.length) {
			// En cas de dossier.
			var l_imageDossier = in_listeObjetsBase.expdImg[4];
			if (in_listeObjets.sub[i].expanded) {
				l_imageDossier = in_listeObjetsBase.expdImg[5];
			}

			// Ajout de l'ancre.
			l_texteComplet += '<A HREF="#" ONCLICK="deplierOuReplierListe(\'' + l_nouvelleCleRecursion + '\', ' + in_listeNom + ');';
			l_texteComplet += 'if (this.blur) { this.blur(); }';
			l_texteComplet += 'return false;">';
			for (var j=0; j<l_pictotree.length; j++) {
				l_texteComplet += '<IMG SRC="' + l_pictotree[j] + '" ALIGN="absmiddle" WIDTH="' + in_listeObjetsBase.expdImg[0] + '" HEIGHT="' + in_listeObjetsBase.expdImg[1] + '" ALT="[+/-]" BORDER="0" />';
			}
			l_texteComplet += '<IMG SRC="' + l_imageDossier + '" ALIGN="absmiddle" id="' + l_nouvelleCleRecursion + 'i' + '" WIDTH="' + in_listeObjetsBase.expdImg[0] + '" HEIGHT="' + in_listeObjetsBase.expdImg[1] + '" ALT="[+/-]" BORDER="0" />';
			l_texteComplet += '</A>';
		} else {
			for (var j=0; j<l_pictotree.length; j++) {
				l_texteComplet += '<IMG SRC="' + l_pictotree[j] + '" ALIGN="absmiddle" WIDTH="' + in_listeObjetsBase.expdImg[0] + '" HEIGHT="' + in_listeObjetsBase.expdImg[1] + '" ALT="[+/-]" BORDER="0" />';
			}
			l_texteComplet += '<IMG SRC="' + in_listeObjetsBase.expdImg[3];
			l_texteComplet += '" ALIGN="absmiddle" width="' + in_listeObjetsBase.expdImg[0];
			l_texteComplet += '" HEIGHT="' + in_listeObjetsBase.expdImg[1] + '" ALT="-----" border="0"> ';
		}
			
		// Ajout du texte et du lien éventuel.
		if (l_infoCellule.lien != null) {
			l_texteComplet += '<a href="' + l_infoCellule.lien + '" onclick=\"javascript:affiche_barre();\">' + l_infoCellule.texte + '</a>';		
		} else {
			l_texteComplet += '' + l_infoCellule.texte;
		}
                  
		// Fin de DIV de première cellule.
		l_texteComplet += '\r\n  </div>';

		// Il faut ensuite générer la suite des colonnes.
		// l_texteComplet += '\r\n  <div style="height:21px;width:400px;float:left;margin-left: 20px;background-color: green;">Testons !</div>';
		// l_texteComplet += '\r\n  <div style="height:21px;width:300px;float:left;margin-left: 20px;">Testons !</div>';
		for (var j=1; j<in_listeObjets.sub[i].infocellule.length; j++) {
			var l_infoCelluleCourante = in_listeObjets.sub[i].infocellule[j];
			l_texteComplet += '\r\n  <div style="height:' + l_infoCelluleCourante.height + ';width:' + l_infoCellule.width + ';float:left;margin-left: 20px;"><span style="float:right">';
			
			// Ajout du texte et du lien éventuel.
			if (l_infoCelluleCourante.lien != null) {
				l_texteComplet += '<a href="' + l_infoCelluleCourante.lien + '">' + l_infoCelluleCourante.texte + '</a>';		
			} else {
				l_texteComplet += '' + l_infoCelluleCourante.texte;
			}
		
			l_texteComplet += '</span></div>';
		}

    	// Fin de DIV de ligne.
		l_texteComplet += '\r\n</div>';

    	// Ajoutons les lignes correspondant aux sous-lignes de tableau.
    	if (in_listeObjets.sub[i].sub.length) {
			// Nous devons créer notre sous-liste et l'ajouter à notre élément.
			var l_depliage;	 
			if (! in_deplie) {
				 l_depliage = false;	 
			} else {  
				if (! in_listeObjets.idligne) {
					// On est au premier appel de notre boucle, il faut déplier par défaut.
					l_depliage = true;
				} else {
					if (! in_listeObjets.expanded) {
						l_depliage = false;
					} else {
						l_depliage = true;
					}
				}
			}

			// Appel à la création de liste de manière récursive.
			l_texteAAjouter = creerListeRecursive(false, in_listeObjets.sub[i], l_nouvelleCleRecursion, in_listeObjetsBase, in_listeNom, l_pictotreePourEnfants, l_depliage);
			l_texteComplet += l_texteAAjouter;
		}
	}

	// Retournons la solution.
	return l_texteComplet;
}

//
// Fonction de récupération d'un objet 'sub'.
//
function recupererSub(in_listeObjets, in_cleRecursion) {
	var l_cleTemp = in_cleRecursion;
	var l_table = [];
	var l_index = 0;
	while (l_cleTemp.indexOf('_') != -1) {
		l_table[l_index] = l_cleTemp.substr(0, l_cleTemp.indexOf('_'));
		l_index++;
		l_cleTemp = l_cleTemp.substr(l_cleTemp.indexOf('_') + 1, l_cleTemp.length);
	}
	l_table[l_index] = l_cleTemp;

	// Récupérons le sub.
	var l_subRecherche = in_listeObjets;
	var l_tot = '';
	for (var i=1; i<l_table.length; i++) {
		l_tot += l_table[i] + ' ';
		l_subRecherche = l_subRecherche.sub[l_table[i]];
	}

	// Retournons la solution.
	return l_subRecherche;
}

//
// Fonction de création de la liste en Javascript.
//
function deplierOuReplierListe(in_cleRecursion, in_listeNom) {
	// Récupérons notre sub associé à notre clé de récursion.
	var l_subRecherche = recupererSub(in_listeNom, in_cleRecursion);

	// Modifions son expand.
	if (l_subRecherche.expanded) {
		l_subRecherche.expanded = false;
	} else {
		l_subRecherche.expanded = true;
	}

	// Commençons par afficher notre sub.
	afficherSub(l_subRecherche, in_listeNom);
}

//
// Fonction d'affichage d'un sub, avec parcours récursif.
//
function afficherSub(in_sub, in_listeObjetsBase) {
	// Affichons la ligne de tableau.
	modifierVisibiliteLigneTableau(in_sub.idligne, true);

	// Parcours des sous-subs.
	if (in_sub.expanded) {
		// Modifions le picto par défaut.
		modifierPicto(in_sub.idligne, false, in_listeObjetsBase);
		for (var i=0; i<in_sub.sub.length; i++) {
			var l_sousSub = in_sub.sub[i];
			afficherSub(l_sousSub, in_listeObjetsBase);
		}
	} else {
		// Modifions le picto par défaut.
		modifierPicto(in_sub.idligne, true, in_listeObjetsBase);
		for (var i=0; i<in_sub.sub.length; i++) {
			modifierVisibiliteLigneTableau(in_sub.sub[i].idligne, false);
			cacherSub(in_sub.sub[i]);
		}
	}
}

//
// Fonction de cache d'un sub.
//
function cacherSub(in_sub) {
	for (var i=0; i<in_sub.sub.length; i++) {
		modifierVisibiliteLigneTableau(in_sub.sub[i].idligne, false);
		cacherSub(in_sub.sub[i]);
	}
}

//
// Fonction de modification de la visibilité d'un élément HTML.
//
function modifierVisibiliteLigneTableau(in_idElement, in_visible) {
	// Recherche de notre élément.
	var l_element = document.getElementById(in_idElement);
	if (! l_element) { 
		return; 
	} 
	var l_styleElement;
	if (l_element.style) { 
		l_styleElement = l_element.style; 
	}
	if (typeof(l_styleElement.display ) == 'undefined') {
		// Impossible d'accéder au style de notre élément, donc il ne sera pas dépliable.
		window.alert('Désolé, impossible de déplier les menus, votre navigateur ne supporte pas cette fonction.' );
	} else {
		if (in_visible)	{
			l_styleElement.display = 'block';
		} else {
			l_styleElement.display = 'none';
		}
	}
}

//
// Méthode de modification du picto de dossier : ouvert ou fermé.
//
function modifierPicto(in_idElement, in_visible, in_listeObjetsBase) {
	var l_element = document.getElementById(in_idElement + 'i');
	if (! l_element) { 
		return; 
	} 

	// Modifions l'image du dossier.
	if (in_visible) {
		l_element.src = in_listeObjetsBase.expdImg[4];
	} else {
		l_element.src = in_listeObjetsBase.expdImg[5];
	}  
}

//
// Fonction de copie indépendante de tableaux.
//
function clonerTableau(in_tableau) {
	var l_tableauResultat = [];
	for (var i=0; i<in_tableau.length; i++)	{
		l_tableauResultat[i] = in_tableau[i];
	}
	return l_tableauResultat;
}

