
// Standards-compliant script builds live table of contents
// and links table elements to corresponding document elements
// Adapted from Scott Isaacs
// http://www.siteexperts.com/tips/contents/ts17/page1.asp
// Modified by Walter Maner in March 2004
// The code has been beautified, optional semicolons
// were added, and the code has been changed so that
// the TOC must be generated on demand (users may not need it):
//    <input type="button" value="Table of Contents" onClick=doLoad()>
// With this last change, it became necessary to ensure that the TOC
// could not be generated a second time after it had already been loaded

var tocLoaded = false;

function getTextForElement( obj ) {
    var str = "";
    for ( var i = 0; i < obj.childNodes.length; i++ ) {
        if ( obj.childNodes[ i ].nodeType == 1 )
            str += getTextForElement( obj.childNodes[ i ] );
        else if ( obj.childNodes[ i ].nodeType == 3 )
            str = obj.childNodes[ i ].data;
    }
    return str;
}

function getHeaders() {
    var obj = document.getElementsByTagName( "*" );
    var el = document.createElement( "UL" );
    var tagList = "H1;H2;H3;H4;H5;H6;";
    for ( var i = 0; i < obj.length; i++ )
        if ( tagList.indexOf( obj[ i ].tagName + ";" ) >= 0 ) {
            // Create the LI element
            var eLI = document.createElement( "LI" );
            eLI.className = "toc" + obj[ i ].tagName;
            // Create the bookmark
            var eBookmark = document.createElement( "A" );
            // Set the destination ID
            eBookmark.id = "destHeader" + i;
            // Create the link
            var eALink = document.createElement( "A" );
            eALink.href = "#" + eBookmark.id;

            // Build the tree
            var eLIText = document.createTextNode( getTextForElement( obj[ i ] ));
            obj[ i ].appendChild( eBookmark );
            eALink.appendChild( eLIText );
            eLI.appendChild( eALink );
            el.appendChild( eLI );
        }
    return el;
}

function ie_getElementsByTagName( str ) {
    if ( str == "*" )
        return document.all;
    else
        return document.all.tags( str );
}

if ( document.all )
    document.getElementsByTagName = ie_getElementsByTagName;

function doLoad() {
    if ( !tocLoaded ) {
        var el = getHeaders();
        var startEl = document.getElementsByName( "content" )[ 0 ];
        startEl.insertBefore( el, startEl.childNodes[ 0 ] );
        tocLoaded = true;
    } else
        alert( "Table of Contents already created." );
}
