/* -----------------------------------------------------
NOM    :  arbre.js
AUREUR :  Rui Nibau (RNB) <rui.nibau@omacronides.com>
DATE   :  avril 2006.
URL    :  http://www.omacronides.com/informatique/web/arbre-hierarchique-js
FUNC   :  Convertir une série de listes à puces hiérarchisées en arbre à explorer.
NOTE   :  D'après Stuart Langridge (http://www.kryogenix.org/code/browser/aqlists/)
          - Suppression de addevent, remplacer par window.onload (???)
          - Modifs du code avec fonction perso getElBy
          - Modif des icônes
          - Ajout des personnalisation (choix balise, plier/déplier par défaut)
          - Ajout des liens replier tout / déplier tout
-------------------------------------------------------- */
// Tests pour navigateurs
var OPE = (window.opera) ? true : false;
var IE  = (document.all && !OPE) ? true : false;
var MOZ = (!IE && !OPE) ? true : false;
// -----------------------------------------------------
// Fonction d'initialisation de l'arbre
function arbre() {
    // Choix de la balise contenant le texte. <strong> par défaut.
    balise = "STRONG";
    // Présentation de l'arbre au départ : déployée ('yes') ou fermée ('no')
    extend = "yes";
    // Textes du lien plier / déplier
    plier_text = 'Replier tout';
    plier_title = 'Replier tous les noeuds de l\'arbre'
    deplier_text = 'Déplier tout';
    deplier_title = 'Déplier tous les noeuds de l\'arbre'
    // Récupération de tous les arbres de la page
    uls = getElBy('ul','class','arbre');
    for (uli=0;uli<uls.length;uli++) {
        ul = uls[uli];
        linkSwitch(ul);
        processULEL(ul);
    }
}
// -------------------------------------------------------
// Création des liens plier /déplier tout
function linkSwitch(ul) {
    var a=document.createElement('a');
    a.setAttribute('href','#');
    if (extend=='yes') {
        a.appendChild(document.createTextNode(plier_text));
        a.setAttribute('title',plier_title);
    }
    else {
        a.appendChild(document.createTextNode(deplier_text));
        a.setAttribute('title',deplier_title);
    }
    var parbre = document.createElement('p');
    parbre.setAttribute('class','arbre-switch');
    parbre.appendChild(a);
    ul.parentNode.insertBefore(parbre,ul);
    listenlink(ul);
}
// Gestion des Clics sur les liens plier / déplier tout
function listenlink(ul) {
    var link = ul.previousSibling.childNodes[0];
    link.onclick = function() {
        if (this.childNodes[0].nodeValue == plier_text) {
            plier(ul,'replier');
            this.childNodes[0].nodeValue = deplier_text;
            this.setAttribute('title',deplier_title);
        }
        else {
            plier(ul,'déplier');
            this.childNodes[0].nodeValue = plier_text;
            this.setAttribute('title',plier_title);
        }
        return false;
    }
}
// Action Plier / déplier tout
function plier(ul,act) {
    for (var i=0; i<ul.childNodes.length; i++) {
        var li = ul.childNodes[i];
        if (li.nodeName == 'LI') {
            for (var j=0; j<li.childNodes.length; j++) {
                var child = li.childNodes[j];
                if (child.nodeName==balise) {
                    var strong = child;
                }
                if (child.nodeName=='UL') {
                    if (act=='replier') {
                        child.className='hide';
			if (strong!=null)
                        strong.className='arbre-plier';
                    }
                    else {
			child.className='';
			if (strong!=null)
                        strong.className='arbre-deplier';
                    }
                    var sub = child;
                    plier(sub,act);
                }
            }
        }
    }
}
// ---------------------------------------------------------
// Analyse de l'arbre
function processULEL(ul) {
    if (!ul.childNodes || ul.childNodes.length == 0) return;
    // Iterate LIs
    for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
        var item = ul.childNodes[itemi];
        if (item.nodeName == "LI") {
            // Contenu des balises LI
            var a;
            var subul;
            subul = "";
            for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
                // Uniquement pour moz-firefox
                if (MOZ) {item.style.background = "url(images/arbre-trait.png) repeat-y 0 0";}
                // Enfants des li : balise ou sous-ul
                var sitem = item.childNodes[sitemi];
                switch (sitem.nodeName) {
                    case balise:
                        a = sitem;
                        break;
                    case "UL":
                        subul = sitem;
                        if (extend != "yes") {sitem.className = 'hide';}
                        processULEL(subul);
                        break;
                }
            }
            if (subul && a!=null) {
                if (extend!="yes") {
                    a.className='arbre-plier';
                }
                else {
                    a.className='arbre-deplier';
                    subul.className='';

                }
                associateEL(a,subul);
            }
        }
    }
}
// Swicth des noeuds
function associateEL(a,ul) {
    a.onclick = function () {
        this.className = (ul.className=='hide') ? 'arbre-deplier' : 'arbre-plier';
        ul.className = (ul.className=='hide') ? '' : 'hide';
        return false;
    }
}
// -----------------------------------------------------
// Nom  : GetElBy(tag,attr,val)
// By   : Rui Nibau
// Date : aout 2005
// Func : Tableau des éléments 'tag' dont l'attribut 'attr' a la valeur 'val'.
// -----------------------------------------------------
function getElBy(tag,attr,val) {
	var dbRes = [];
	var dbEl = document.getElementsByTagName(tag);
	for (e=0; e<dbEl.length; e++) {
		if (attr == 'class') {if (dbEl[e].className==val) {dbRes.push(dbEl[e]);}}
		else {if (dbEl[e].getAttribute(attr)==val) {dbRes.push(dbEl[e]);}}	
	}
	return dbRes;
}

// -----------------------------------------------------

