function createTOC() {
    var y = document.createElement('div');
    y.id = 'innertoc';

    var hdr = y.appendChild(document.createElement('h2'));
    hdr.id = 'toc_heading';
    hdr.appendChild(document.createTextNode('page contents'));

    var z = y.appendChild(document.createElement('ul'));
    var toBeTOCced = getElementsByTagNames('h3,h4,h5');
    var looplen = toBeTOCced.length;
    // only create a toc for pages containing 3 or more headings
    if (looplen <= 2) {
        return false;
    }
    for (var i = 0; i < looplen; i++) {
        var textSrc = toBeTOCced[i];
        if (textSrc.firstChild && textSrc.firstChild.nodeName == 'A') {
            textSrc = textSrc.firstChild;
        }
        var li = document.createElement('li');
        var tmp = document.createElement('a');
        tmp.innerHTML = textSrc.innerHTML;
        tmp.className = 'page';
        li.appendChild(tmp);
        z.appendChild(li);
        if (toBeTOCced[i].nodeName == 'H4') {
            tmp.className += ' indent';
        }
        if (toBeTOCced[i].nodeName == 'H5') {
            tmp.className += ' extraindent';
        }
        var headerId = toBeTOCced[i].id || 'link' + i;
        tmp.href = '#' + headerId;
        toBeTOCced[i].id = headerId;
/*
        if (toBeTOCced[i].nodeName == 'H2') {
            tmp.innerHTML = 'Top';
            tmp.href = '#top';
            toBeTOCced[i].id = 'top';
        }
*/
    }

    var divs_before = '<div class="rounded"><div class="rounded_sides"><div class="rounded_top"><div class="rounded_content">';
    var divs_after = '</div></div></div></div>';

    y.innerHTML = divs_before + y.innerHTML + divs_after;
    return y;
}

function getElementsByTagNames(list, obj) {
    if (!obj) {
        var obj = document;
    }
    var tagNames = list.split(",");
    var resultArray = new Array;
    for (var i = 0; i < tagNames.length; i++) {
        var tags = obj.getElementsByTagName(tagNames[i]);
        for (var j = 0; j < tags.length; j++) {
            /**
            * zyt: 08.03.2008.
            * headings with a className of 'notoc' are not included
            * in the results (since this func generates what needs
            * to be TOCed)
            */
            if (tags[j].className.indexOf('notoc') == -1) {
                resultArray.push(tags[j]);
            }
        }
    }
    var testNode = resultArray[0];
    if (!testNode) {
        return [];
    }
    if (testNode.sourceIndex) {
        resultArray.sort(function (a, b) {return a.sourceIndex - b.sourceIndex;});
    } else if (testNode.compareDocumentPosition) {
        resultArray.sort(function (a, b) {return 3 - (a.compareDocumentPosition(b) & 6);});
    }
    return resultArray;
}