function howfar() {
  var d = window.document;
  var els = gettags();
  var pY = window.pageYOffset ? window.pageYOffset : d.documentElement && d.documentElement.scrollTop ? d.documentElement.scrollTop : d.body.scrollTop;
  alert(pY);
}

function buildnote( ol ) {
 var d = window.document,
  a = d.links, i = 0, j = 0, n = a.length,
  li = ol.firstChild, atop = d.createElement( 'a' ), atopcopy;
 atop.insertBefore( d.createTextNode( '^ ' ) );
 atop.title = 'Back up';
 atop.style.color = 'blue';
 for( ; li && i<n; i++ ) {
  if( !a[i].hash.indexOf( '#note' ) ) {
   a[i].id = 'a' + (++j);
   a[i].href = '#n' + j;
   a[i].title = ' Note ' + j + '. ';
   a[i].style.color = 'blue';
   if( !li.id ) { li.id = 'n' + j; }
   atopcopy = atop.cloneNode( true );
   atopcopy.href = '#a' + j;
   atopcopy.onclick = scrollup;
   li.insertBefore( atopcopy, li.firstChild );li = li.nextSibling;
  }
 }
}

function buildnotes(){
  var d = window.document;
  var ol=d.getElementById('footnotes');
  var els=d.getElementsByTagName('span');
  var atag=d.createElement('a');
  var asup=d.createElement('small'); asup.appendChild(d.createElement('sup'));
  var atop=atag.cloneNode(false); atop.appendChild(d.createTextNode('^ ')); 
  for(var i=0;i<els.length;i++) if(els[i].className=='footnote') {
    var el=ol.childNodes[i];
    var anew=atag.cloneNode(true);
    anew.href='#note'+(i+1);
    anew.id='a'+(i+1);
    anew.title=gettext(el);
//    anew.onmouseover=function(){alert(d.getElementById(this.hash.substring(1)).firstChild.nodeValue);}
    anew.appendChild(asup.cloneNode(true));
    anew.firstChild.firstChild.appendChild(d.createTextNode(i+1));
    anew.appendChild(d.createTextNode(')'));
    els[i].replaceChild(anew,els[i].firstChild);
    var atopcopy=atop.cloneNode(true);
    atopcopy.href='#a'+(i+1);
    atopcopy.onclick=scrollup;
    el.id='note'+(i+1);
    el.insertBefore(atopcopy,el.firstChild);
  }
}
function buildtoc(){
  var d = window.document;
  var els=gettags();
  var oltag=d.createElement('ol');
  var litag=d.createElement('li');
  var atag=d.createElement('a');
  var lastnum=0;
  for(var i=0;i<els.length;i++) {
    var el=els[i];
    var txt=gettext(el);
    var num=el.tagName.charAt(1);
    var hash='h'+(i+1);
    el.id=hash;
    var linew=litag.cloneNode(false);
    var anew=atag.cloneNode(false);
    anew.href='#'+hash;
//    anew.style.marginLeft=(num-1)+'em';
    anew.appendChild(d.createTextNode(txt));
    linew.appendChild(anew);
    if(num==1)oltag.appendChild(linew);
    else {
      var add=oltag;var t=num-1;while(t--)add=add.lastChild;
      if(lastnum<num){
        var oladd=oltag.cloneNode(false);
//        var liadd=litag.cloneNode(false);liadd.appendChild(oladd);
        add.appendChild(oladd);//alert(add.tagName);
      }
      add.lastChild.appendChild(linew);
    }
    lastnum=num;
  }
  d.body.insertBefore(oltag,d.body.firstChild.nextSibling);
}

function gettags( o ) {
  o = o || window.document;
  var ar=[];
  for(var i=o.firstChild;i!=null;i=i.nextSibling){
    if(i.tagName)                 // exclude textnodes
     if(/^h\d$/i.test(i.tagName)) // heading tags
      ar[ar.length]=i;
    if(i.firstChild)
      ar=ar.concat(gettags(i));
  }
  return ar;
}
function gettext(node) {
  for (var x = 0, str=''; x < node.childNodes.length; x++) {
    str+=' ';
    var child = node.childNodes[x];
    if (child.nodeType == 3) {
      str+=child.nodeValue?child.nodeValue:'';
    } else if (child.nodeType==1 || child.nodeType==9) {
      str+=gettext(child);
    }
  }
  return str.replace(/\s+/,' ');
}

// make DOMs cross browser
function removeemptytextnodes(node) {if(!node){node=window.document;}
  for(var x = 0; x < node.childNodes.length; x++) {
    var child = node.childNodes[x];
    if( (child.nodeType == 3)&&(!/\S/.test(child.nodeValue)) ) {
      node.removeChild(node.childNodes[x]);
      x--;
    } else if( child.nodeType == 1 || child.nodeType == 9 ) {
      removeemptytextnodes(child);
    }
  }
}
function buildtop( s ) { s = s || 'Inhoud';
 var d = window.document,
  dv = d.createElement( 'div' ),
  el = d.createElement( 'a' ), em;
 el.className = 'side tr';
 el.style.background = '#f8f0e8';
 el.style.top = 0;
 em = el.cloneNode( true );
 el.href = '#top'; em.href = '#toe';
 el.title = 'Top'; em.title = 'End';
 el.id = 'trtop'; em.id = 'trtoe';
 el.insertBefore( d.createTextNode( '\u005e' ) );
 em.insertBefore( d.createTextNode( s ) );
 el.onclick = function(){window.status=scrollhead();};
 dv.insertBefore( el, null );
 dv.insertBefore( em, null );
 d.body.insertBefore( dv, null );
 if( (dv=d.getElementById( 'note' )) ) { buildnote( dv ); }
 if( (dv=d.getElementById( 'p0' )) ) { el = dv.childNodes; em = el.length; while( em-- ) { if(el[em].href)el[em].onclick=scrollup; } }
 window.onscroll = scrolled;
 window.onresize = scrolled;
 scrolled();
}
function scrollhead() {
  var d = window.document,
   pY = window.pageYOffset ? window.pageYOffset : d.documentElement && d.documentElement.scrollTop ? d.documentElement.scrollTop : d.body.scrollTop;
  var els=gettags();
  for(var i=0;i<els.length;i++) {
    if(els[i].offsetTop>pY){return i;}
  } return 'no';
}
function buildcells() {
  var d = window.document;
  var els=d.getElementsByTagName('td');
  for(var i=0;i<els.length;i++){
    var el=els[i];
    var t=gettext(el).replace(/\s/g,'').replace(/[,\.]/g,''); 
    if(t=='-') el.style.textAlign = 'center'; 
    if(t=='"') el.style.textAlign = 'center';
    if(!isNaN(t)&&(t<1850||t>1909)) el.style.textAlign="right";
  }
}
function scrolled() {
  var d = window.document,
   pY = window.pageYOffset ? window.pageYOffset : d.documentElement && d.documentElement.scrollTop ? d.documentElement.scrollTop : d.body.scrollTop;
  if( (d=d.getElementById( 'trtop' )) ) { d.style.top = pY+'px'; }
}
function scrollup() { for( var i=1; i<50; i++ ) { window.setTimeout( 'window.scrollBy(0,-1)', i*4+10 ); } }

function spanover( o ) { o = o || this; o.style.overflow = 'visible'; o.className = 'sn p'; o.onmouseout = spanout; }
function spanout( o ) { o = o || this; o.style.overflow = ''; o.className = 'sn'; }

function zap( o ) { o.src = /2(\.\w+)$/.test( o.src )>0 ? o.src.replace( /2(\.\w+)$/, '$1' ) : o.src.replace( /(\.\w+)$/, '2$1' ); }

function zoomover( o, n, t ) {
 var d = window.document, a = d.createElement('img');
 a.src = o.src;
 a.alt = o.alt;
 a.width = n;
 a.onclick = o.onclick;
 a.width = n;
 a.style.position = 'absolute';
 a.style.left = o.parentNode.offsetLeft-(n-o.width) + 'px';
 a.style.top = o.parentNode.offsetTop + 'px';
 d.body.insertBefore( a, null ); a.onmouseout = zoomout;
}
//function zoomover( o, n, t ) { o.oldwidth = o.width; o.width = n; o.that = t; if( t ) { t.style.display = 'none'; } o.parentNode.className = 'pn p'; o.onmouseout = zoomout; }
function zoomout() { if(this){this.parentNode.removeChild(this);}else{this.width = this.oldwidth; this.parentNode.className = 'pn'; if( this.that ) {  this.that.style.display = ''; } }}

function getwindow( o ) { o = o || window; var v = o.document, w, h, l, t, x, y; if( typeof o.innerWidth==='number' ) { w = o.innerWidth; h = o.innerHeight; l = o.pageXOffset; t = o.pageYOffset; x = o.scrollMaxX; y = o.scrollMaxY; } else if( ( o = v.documentElement ) && typeof o.clientWidth==='number' && o.clientWidth || ( o = v.body ) ) { w = o.clientWidth; h = o.clientHeight; l = o.scrollLeft; t = o.scrollTop; x = o.scrollWidth; y = o.scrollHeight; } return {w: w, h: h, l: l, t: t, x: x, y: y}; }

function initall(){
  var now = new Date();
  removeemptytextnodes();
  buildtoc();
  buildnotes();
  buildtop();
  buildcells();
  window.status=((new Date())-now)/1000+' sec.';
}

(function(){
 var s = window.location.href;
 if( s.indexOf( 'Chineezen' )>0 ) {
  window.onload = function() { window.setTimeout( 'initall();', 10 ); }
 } else if( /In_het_Rijk_van_Vulcaan\/(\d|voorrede)/.test( s ) ) {
  window.onload = function() { window.setTimeout( 'buildtop(\'v\');', 10 ); }
 }
})();
