function generateTOC() {
        if(document.getElementsByTagName("BODY")[0]) {
                var firstElt=document.getElementsByTagName("H1")[0].nextSibling;
                var arrayOfH;
                arrayOfH=putHInArray(firstElt);
                if(arrayOfH[0]) {
                        firstElt=document.getElementsByTagName(arrayOfH[0].nodeName);
                        createTOC(firstElt[0],arrayOfH);
                }
        }
}
//Crée une TOC avant etlAfter à partir du tableau de noeuds H* arrayOfTitles
function createTOC(eltAfter,arrayOfTitles) {
        var currentTitle=arrayOfTitles[0];
        var currentLevel=currentTitle.nodeName.substring(1,2);
        var newLevel=0;
        var realLevel=1;
        var id=1;
        var currentUl=insertUl(createDiv(eltAfter));
        for(index=0;index<arrayOfTitles.length;++index) {
                currentTitle=arrayOfTitles[index];
                newLevel=currentTitle.nodeName.substring(1,2);
                if(newLevel>currentLevel) {
                        if(newLevel>realLevel) {
                                currentLevel=newLevel;
                                ++realLevel;
                                currentUl=insertUl(currentUl.lastChild);
                        }
                }
                else if(newLevel<currentLevel) {
                        currentLevel=newLevel;
                        if(newLevel<realLevel) {
                                for(indexLvl=newLevel;indexLvl<realLevel;++indexLvl)
                                        currentUl=currentUl.parentNode.parentNode
                                realLevel=newLevel;
                        }
                }
                createLi(currentUl,currentTitle,id);
                id++;
        }
}
//Crée le div contenant la TOC avant elt
function createDiv(elt) {
        var parentElt=elt.parentNode;
        var div = document.createElement("DIV");
        div.setAttribute('class','TOC');
        parentElt.insertBefore(div,elt);
        return div;
}

//Crée un ul dans ulElt
function insertUl(elt) {
        var ul = document.createElement("UL");
        elt.appendChild(ul);
        return ul;
}

//Crée un li dans ulElt
function createLi(ulElt,content,id) {
        var li = document.createElement("LI");
        var id=createId(content,id);
        var lnk = createLnk(content);
        li.appendChild(lnk);
        ulElt.appendChild(li);
}

//Génère une id pour elt à partir de id
function createId(elt,id) {
        if(elt.getAttribute("id"))
                return elt.getAttribute("id");
        else {
                elt.setAttribute("id","toc_" + id);
                return id;
        }
}

//Génère un node A pointant vers l'id de elt
function createLnk(elt) {
        var a=document.createElement("A");
        a.setAttribute("href","#" + elt.getAttribute("id"));
        var extraText=document.createTextNode(elt.firstChild.nodeValue);
        a.appendChild(extraText);
        return a;
}
//retourne un tableau contenant tous les noeuds H* avec leurs noeuds fils texts
function putHInArray(elt) {
        var elt;
        var myArray=new Array();
        if(isAH(elt)) {
                myArray.push(elt);
        }
        if(elt.hasChildNodes())
                myArray=myArray.concat(putHInArray(elt.firstChild));
        if(elt.nextSibling)
                myArray=myArray.concat(putHInArray(elt.nextSibling));
        return myArray;
}

//test si un élément est un H* ou non
function isAH(elt) {
        var name=elt.nodeName;
        if(name=="H1" || name=="H2" || name=="H3" || name=="H4" || name=="H5" || name=="H6")
                return true;
        else
                return false;
}

//Attache les evenements
if (document.getElementById && document.createTextNode) {
        if(navigator.appName=="Microsoft Internet Explorer")
                window.onload=generateTOC;
        else
                window.addEventListener("load", generateTOC, false);
}


