/*
Copyright (C) 2004-2010  Copyright MICHAEL CULTURE AISBL
See LICENCE file.
*/					
/**
Afin d'éviter les onclick semé dans le html (mal vu, navigateurs version 2)
<http://www.quirksmode.org/js/events_early.html>
ou au chargement un truc qui parse tous les liens (et ralentit la page)
cette fonction est à mettre en event onclick sur le body du doc

attraper tous les clics dans la page
Si cela vient d'un élément attendu, on l'habille, et on l'active
Sinon, ciao
*/
function list_click(e, action ) {
    // pas de propagation ?
    var propagate=false;
    // Qui a cliqué ?
    var a;
    if (!e) var e = window.event;
    if (e.tagName) a=e;
    else if (e.target) a = e.target;
    else if (e.srcElement) a = e.srcElement;
    // pas de noeud, rien à faire, on laisse courir
    if (!a) return true;
    // si le noeud n'est pas un lien (ou contenu dans un lien, on dégage)
    if (!(a=get_parent(a, 'A'))) return true;
    // si le lien a un href, c'est que quelqu'un a envie d'aller quelque part, on laisse y aller
    if (a.hash != '#list') return true;
    // si on l'a déjà vu, et que l'on peut rien en faire, on l'aura tagger
    if (a.ul == false ) return true;
    // s'il est tout nu, on l'habille
    if (a.ul == null) list_wear(a);
    // s'il on a rien trouvé à sa taille, on laisse courir
    if ( !a.ul ) return true;
    // et maintenant on lui fait faire un click
    a.onclick(action);
    // si on lui a calé ses objets
    return propagate;    
}

/**
un déplie tout
prends tous les liens et laisse faire les test à list_click
*/
function list_clickall(action) {
    if (action == 'hide' || action == 'show');
    // balance sur la dernière action effectué
    else if (window.list_action == 'hide') action='show';
    else if (window.list_action == 'show') action='hide';
    else action='show';
    // sauvegarde de la dernière action globale effectuée
    window.list_action=action;
    var a;
    for (var i=document.links.length - 1 ;  i > -1 ; i--) {
        a=document.links[i];
        if (a.hash != '#list') continue;
        // s'il est tout nu, on l'habille
        if (!a.ul) list_wear(a);
        // s'il a une liste attachée, on le clique
        if (a.ul ) {
		if (a.onclick){
			a.onclick(null, action, true);
		}
	}
    }
}

/**
habiller un lien a
fixer les propriétés
a.ul     (la liste à cacher montrer)
a.img  (l'image à modifier)

*/
function list_wear(a) {
    if (!a) return false;
    a.ul=false;
    if (!a.ul) {
        var ul=get_ul(a);
        if (!ul) return false;
        a.ul=ul;
    }
    if (!a.img) {
        var img=get_img(a);
        if (!img) return false;
        a.img=img;
    }
    // attacher l'événement sur le click
    a.onclick=list_a;
}

/**
La fonction caché/montré sur un lien
*/
function list_a(e, action, multi) {
    
    // pas initialisé, dégage
    if (!this.ul || !this.ul.style) return true;
    
    // l'action à exécuter 
    if (action == 'hide' || action == 'show');  
    else if (this.ul.style.display == 'none') action='show';
    else action='hide';

    // identique au dernier ouvert, pour ouvrir, dégage
    if (this == window.list_last && action=='show') return false;

    // montrer celui-ci et cacher le précédent
    if  (action == 'show') {
        // s'il y en a une un autre de montré, on le cache (attention aux balances, risque de surprise)
        /*if (window.list_last && window.list_last.ul && !multi) {
            window.list_last.onclick( null, 'hide');
        }*/
        window.list_last=this;
        this.ul.style.display = '';
        if (this.img) this.img.src=this.img.src.replace('plus', 'minus');
    } 
    // cacher celui-ci 
    else if (action== 'hide') {
        window.list_last=null;
        this.ul.style.display="none";
        if (this.img) this.img.src=this.img.src.replace('minus', 'plus');
    }
    
    // arrêter l'événement ici, ne pas remonter plus haut
    
    if (!e) var e = window.event;
    if (!e);
    else if (e.stopPropagation) e.stopPropagation();    
    else e.cancelBubble = true;
    return false;
}

/**

Recherche d'un noeud parent d'un certain nom, 
Pour ne pas remonter l'arbre jusqu'au body (perfs) on peut 
limiter le nombre de niveau par count

*/
function get_parent(node, name) {
    if (!name || !node) return null;
    // en DOM html, le tag en majuscules est plus sûr
    name=name.toUpperCase();
    // au cas où, pour limiter en niveau
    // count=3
    var count=-1;
    while (count != 0 && node) {
        if (node.tagName == name) return node;
        node=node.parentNode;
        count--;
    }
    return null;
}


/**
à partir d'un noeud, regarder s'il est dans un li, et prendre
son frère ul
*/
function get_ul(inline) {
    li = get_parent(inline, 'li');
    if(!li) return false;
    ul=li.firstChild;
    while (ul) {
        if (ul.tagName == 'UL') return ul;
        ul = ul.nextSibling;
    }
    return null;
}

/**
à partir d'un noeud, prendre la première image
qu'il contient
*/
function get_img(el) {
    if (!el || !el.tagName) return null;
    var img = el.getElementsByTagName('IMG');
    if (img) return img[0];
    else return null;
}

/** pour déboguer */
function props(o) {
   var result = ""
   var a=new Array();
   var i=0
   for (var prop in o) {
      a[i]= prop  + "\t"; // + " = " + o[prop]
      i++;
   }
   a.sort();
   return a;
}
				
