// -*- JavaScript -*- // Adapted from function H_getText(el) { var text = ""; for (var i = el.firstChild; i != null; i = i.nextSibling) { if (i.nodeType == 3 /* Node.TEXT_NODE, IE doesn't speak constants */) text += i.data; else if (i.firstChild != null) text += H_getText(i); } return text; } function TOC_EL(el, text, level) { this.element = el; this.text = text; this.level = level; } function getHeadlines(el) { var l = new Array; var rx = /[hH]([1-6])/; // internal recursive function that scans the DOM tree var rec = function (el) { for (var i = el.firstChild; i != null; i = i.nextSibling) { if (i.nodeType == 1 /* Node.ELEMENT_NODE */) { if (rx.exec(i.tagName)) l[l.length] = new TOC_EL(i, H_getText(i), parseInt(RegExp.$1)); rec(i); } } } rec(el); return l; } function generate_TOC(parent_id) { var parent = document.getElementById(parent_id); var body = document.getElementsByTagName("body")[0]; body.id = "Top"; var hs = getHeadlines(body); // for (var i = 0; i < hs.length; ++i) { // var hi = hs[i]; // var d = document.createElement("div"); // if (hi.element.id == "") // hi.element.id = "gen" + i; // var a = document.createElement("a"); // a.href = "#" + hi.element.id; // a.appendChild(document.createTextNode(hi.text)); // d.appendChild(a); // d.className = "level" + hi.level; // parent.appendChild(d); // } // The code below assumes the first level is always higher than // or equal to all the levels that apper later. There is no // guarantee, however, that levels do not hop. For example, // level 3 could appear right after level 1, skipping level 2. var make_list_elm = function ( hdr ) { var a = document.createElement("a"); a.href = "#" + hdr.element.id; a.appendChild( document.createTextNode( hdr.text ) ); return a; } var listtops = new Array ; listtops[ 0 ] = parent ; var current_level = 0 ; var make_list = function ( elm ) { if ( elm.level <= current_level ) { current_level = elm.level ; var li = document.createElement( "li" ); // List Item li.id = "Ind" + elm.element.id ; li.appendChild( make_list_elm( elm ) ); listtops[ current_level ].appendChild( li ); } else { // elm.level > current_level var lt = document.createElement( "ul" ); // List Top listtops[ current_level ].appendChild( lt ); listtops[ ++current_level ] = lt ; lt.className = "Level" + current_level ; make_list ( elm ); } } for ( var i = 0; i < hs.length; ++i ) { var hi = hs[i]; if (hi.element.id == "") hi.element.id = "Cnt" + i; make_list ( hi ); } var createList = function ( ) { /* takes variable number of arguments */ var ul = document.createElement( "ul" ); ul.className = "sectnav"; for ( var i = 0; i < arguments.length; i++ ) { var li = document.createElement( "li" ); li.innerHTML=arguments[i]; ul.appendChild ( li ); } return ul; } for ( var i = 0; i < hs.length; ++i ) { var node = hs[i].element; var l = createList ( '[back]', '[top]', '[index]' ); /* marginBottom = node.style.marginBottom; */ marginBottom = getStyle(node, "margin-bottom"); node.style.marginBottom = "0px" ; l.style.marginBottom = marginBottom; node.parentNode.insertBefore(l, node.nextSibling); } } // from function getStyle(el, style) { if(!document.getElementById) return; var value = el.style[toCamelCase(style)]; if(!value) if(document.defaultView) value = document.defaultView. getComputedStyle(el, "").getPropertyValue(style); else if(el.currentStyle) value = el.currentStyle[toCamelCase(style)]; return value; } /** toCamelCase(input) * Converts string input to a camel cased version of itself. * For example: * toCamelCase("z-index"); // returns zIndex * toCamelCase("border-bottom-style"); // returns borderBottomStyle. */ function toCamelCase(s) { for(var exp = toCamelCase.exp; exp.test(s); s = s.replace(exp, RegExp.$1.toUpperCase()) ); return s; } toCamelCase.exp = /-([a-z])/;