// $Id: toc.js,v 1.1 2006/04/03 21:53:15 nedjo Exp $
var InitLevel = 2;
var EndLevel = 4;
/* Function found on http://www.easy-reader.net/archives/2005/09/02/death-to-bad-dom-implementations/
to fix our dear IE special view of DOM ¬¬ */
function createElementWithName(){}
(function(){
try {
var el=document.createElement( '
' );
if( 'DIV'!=el.tagName ||
'foo'!=el.name ){
throw 'create element error';
}
createElementWithName = function( tag, name ){
return document.createElement( '<'+tag+' name="'+name+'">'+tag+'>' );
}
}catch( e ){
createElementWithName = function( tag, name ){
var el = document.createElement( tag );
// setAttribute might be better here ?
el.name = name;
return el;
}
}
})();
function getElementsByClass(searchClass,node,tag) {
var classElements = new Array();
if ( node == null )
node = document;
if ( tag == null )
tag = '*';
var els = node.getElementsByTagName(tag);
var elsLen = els.length;
var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
for (i = 0, j = 0; i < elsLen; i++) {
if ( pattern.test(els[i].className) ) {
classElements[j] = els[i];
j++;
}
}
return classElements;
}
function ProcessTocFor(parent, tocParent, level)
{
if (level > EndLevel)
return;
var tagname = 'h' + level;
var tag;
var ol = document.createElement('ol');
var i = 0;
tag = parent;
while (tag = tag.nextSibling)
{
i++;
if (tag.tagName == parent.tagName)
break;
if (!tag.tagName || tag.tagName.toUpperCase() != tagname.toUpperCase())
continue;
if (tag) {
var li = document.createElement('li');
var link = document.createElement('a');
link.setAttribute('href', '#toc-' + tagname + '-' + i);
var span = document.createElement('span');
span.appendChild(document.createTextNode(tag.firstChild.nodeValue));
link.appendChild(span);
li.appendChild(link);
ol.appendChild(li);
var anchor = createElementWithName('a','toc-' + tagname + '-' + i);
tag.appendChild(anchor);
ProcessTocFor(tag,li,level + 1);
}
}
tocParent.appendChild(ol);
}
if (isJsEnabled()) {
addLoadEvent(function() {
/*var url = location.href;
if (url.indexOf('node/') == -1) {
return;
}*/
if (getElementsByClass("read-more").length)
return;
var nodeDiv;
// Select all h3 elements
divs = document.getElementsByTagName('div');
for (var i = 0; div = divs[i]; ++i) {
if (hasClass(div, 'node')) {
nodeDiv = div;
break;
}
}
if (nodeDiv) {
var currentLevel = InitLevel;
do
{
var initTag = 'h' + currentLevel;
tags = nodeDiv.getElementsByTagName(initTag);
currentLevel++;
}
while (!tags.length && currentLevel <= EndLevel);
if (tags.length) {
var tag;
var toc = document.createElement('fieldset');
legend = document.createElement('legend');
var a = document.createElement('a');
a.href = '#';
a.onclick = function() {
toggleClass(this.parentNode.parentNode, 'collapsed');
if (!hasClass(this.parentNode.parentNode, 'collapsed')) {
collapseScrollIntoView(this.parentNode.parentNode);
}
this.blur();
return false;
};
a.appendChild(document.createTextNode('contents'));
legend.appendChild(a);
toc.appendChild(legend);
addClass(toc, 'collapsible');
var ol = document.createElement('ol');
for (var i = 0; tag = tags[i]; ++i) {
if (tag) {
var li = document.createElement('li');
var link = document.createElement('a');
link.setAttribute('href', '#toc-' + i);
var span = document.createElement('span');
span.appendChild(document.createTextNode(tag.firstChild.nodeValue));
link.appendChild(span);
li.appendChild(link);
ol.appendChild(li);
var anchor = createElementWithName('a', 'toc-' + i);
tag.appendChild(anchor);
ProcessTocFor(tag,li,currentLevel);
}
}
toc.appendChild(ol);
nodeDiv.insertBefore(toc, nodeDiv.firstChild);
collapseEnsureErrorsVisible(toc);
}
}
});
}