/*
  DOMtab Version 3.1415927
  Updated March the First 2006
  written by Christian Heilmann
  check blog for updates: http://www.wait-till-i.com  
  free to use, not free to resell
*/

domtab={
  tabClass:'domtab', // class to trigger tabbing
  listClass:'domtabs', // class of the menus
  activeClass:'active', // class of current link
  contentElements:'div', // elements to loop through
  backToLinks:/#top/, // pattern to check "back to top" links
  printID:'domtabprintview', // id of the print all link
  showAllLinkText:'show all content', // text for the print all link
  prevNextIndicator:'doprevnext', // class to trigger prev and next links
  prevNextClass:'prevnext', // class of the prev and next list
  prevLabel:'previous', // HTML content of the prev link
  nextLabel:'next', // HTML content of the next link
  prevClass:'prev', // class for the prev link
  nextClass:'next', // class for the next link
  init:function(){
    var temp;
    if(!document.getElementById || !document.createTextNode){return;}
    var tempelm=document.getElementsByTagName('div');    
    for(var i=0;i<tempelm.length;i++){
      if(!domtab.cssjs('check',tempelm[i],domtab.tabClass)){continue;}
      domtab.initTabMenu(tempelm[i]);
      domtab.removeBackLinks(tempelm[i]);
      if(domtab.cssjs('check',tempelm[i],domtab.prevNextIndicator)){
        domtab.addPrevNext(tempelm[i]);
      }
      domtab.checkURL();
    }
    if(document.getElementById(domtab.printID) 
       && !document.getElementById(domtab.printID).getElementsByTagName('a')[0]){
      var newlink=document.createElement('a');
      newlink.setAttribute('href','#');
      domtab.addEvent(newlink,'click',domtab.showAll,false);
      newlink.onclick=function(){return false;} // safari hack
      newlink.appendChild(document.createTextNode(domtab.showAllLinkText));
      document.getElementById(domtab.printID).appendChild(newlink);
    }
  },
  checkURL:function(){
    var id;
    var loc=window.location.toString();
    loc=/#/.test(loc)?loc.match(/#(\w.+)/)[1]:'';
    if(loc==''){return;}
    var elm=document.getElementById(loc);
    if(!elm){return;}
    var parentMenu=elm.parentNode.parentNode.parentNode;
    parentMenu.currentSection=loc;
    parentMenu.getElementsByTagName(domtab.contentElements)[0].style.display='none';
    domtab.cssjs('remove',parentMenu.getElementsByTagName('a')[0].parentNode,domtab.activeClass);
    var links=parentMenu.getElementsByTagName('a');
    for(i=0;i<links.length;i++){
      if(!links[i].getAttribute('href')){continue;}
      if(!/#/.test(links[i].getAttribute('href').toString())){continue;}
      id=links[i].href.match(/#(\w.+)/)[1];
      if(id==loc){
        var cur=links[i].parentNode.parentNode;
        domtab.cssjs('add',links[i].parentNode,domtab.activeClass);
        break;
      }
    }
    domtab.changeTab(elm,1);
    elm.focus();
    cur.currentLink=links[i];
    cur.currentSection=loc;
  },
  showAll:function(e){
    document.getElementById(domtab.printID).parentNode.removeChild(document.getElementById(domtab.printID));
    var tempelm=document.getElementsByTagName('div');    
    for(var i=0;i<tempelm.length;i++){
      if(!domtab.cssjs('check',tempelm[i],domtab.tabClass)){continue;}
      var sec=tempelm[i].getElementsByTagName(domtab.contentElements);
      for(var j=0;j<sec.length;j++){
        sec[j].style.display='block';
      }
    }
    var tempelm=document.getElementsByTagName('ul');    
    for(i=0;i<tempelm.length;i++){
      if(!domtab.cssjs('check',tempelm[i],domtab.prevNextClass)){continue;}
      tempelm[i].parentNode.removeChild(tempelm[i]);
      i--;
    }
    domtab.cancelClick(e);
  },
  addPrevNext:function(menu){
    var temp;
    var sections=menu.getElementsByTagName(domtab.contentElements);
    for(var i=0;i<sections.length;i++){
      temp=domtab.createPrevNext();
      if(i==0){
        temp.removeChild(temp.getElementsByTagName('li')[0]);
      }
      if(i==sections.length-1){
        temp.removeChild(temp.getElementsByTagName('li')[1]);
      }
      temp.i=i; // h4xx0r!
      temp.menu=menu;
      sections[i].appendChild(temp);
    }
  },
  removeBackLinks:function(menu){
    var links=menu.getElementsByTagName('a');
    for(var i=0;i<links.length;i++){
      if(!domtab.backToLinks.test(links[i].href)){continue;}
      links[i].parentNode.removeChild(links[i]);
      i--;
    }
  },
  initTabMenu:function(menu){
    var id;
    var lists=menu.getElementsByTagName('ul');
    for(var i=0;i<lists.length;i++){
      if(domtab.cssjs('check',lists[i],domtab.listClass)){
        var thismenu=lists[i];
        break;
      }
    }
    if(!thismenu){return;}
    thismenu.currentSection='';
    thismenu.currentLink='';
    var links=thismenu.getElementsByTagName('a');
    for(i=0;i<links.length;i++){
      if(!/#/.test(links[i].getAttribute('href').toString())){continue;}
      id=links[i].href.match(/#(\w.+)/)[1];
      if(document.getElementById(id)){
        domtab.addEvent(links[i],'click',domtab.showTab,false);
        links[i].onclick=function(){return false;} // safari hack
        domtab.changeTab(document.getElementById(id),0);
      }
    }
    id=links[0].href.match(/#(\w.+)/)[1];
    if(document.getElementById(id)){
      domtab.changeTab(document.getElementById(id),1);
      thismenu.currentSection=id;
      thismenu.currentLink=links[0];
      domtab.cssjs('add',links[0].parentNode,domtab.activeClass);
    }
  },
  createPrevNext:function(){
    // this would be so much easier with innerHTML, darn you standards fetish!
    var temp=document.createElement('ul');
    temp.className=domtab.prevNextClass;
    temp.appendChild(document.createElement('li'));
    temp.getElementsByTagName('li')[0].appendChild(document.createElement('a'));
    temp.getElementsByTagName('a')[0].setAttribute('href','#');
    temp.getElementsByTagName('a')[0].innerHTML=domtab.prevLabel;
    temp.getElementsByTagName('li')[0].className=domtab.prevClass;
    temp.appendChild(document.createElement('li'));
    temp.getElementsByTagName('li')[1].appendChild(document.createElement('a'));
    temp.getElementsByTagName('a')[1].setAttribute('href','#');
    temp.getElementsByTagName('a')[1].innerHTML=domtab.nextLabel;
    temp.getElementsByTagName('li')[1].className=domtab.nextClass;
    domtab.addEvent(temp.getElementsByTagName('a')[0],'click',domtab.navTabs,false);
    domtab.addEvent(temp.getElementsByTagName('a')[1],'click',domtab.navTabs,false);
    // safari fix
    temp.getElementsByTagName('a')[0].onclick=function(){return false;}
    temp.getElementsByTagName('a')[1].onclick=function(){return false;}
    return temp;
  },
  navTabs:function(e){
    var li=domtab.getTarget(e);
    var menu=li.parentNode.parentNode.menu;
    var count=li.parentNode.parentNode.i;
    var section=menu.getElementsByTagName(domtab.contentElements);
    var links=menu.getElementsByTagName('a');
    var othercount=(li.parentNode.className==domtab.prevClass)?count-1:count+1;
    section[count].style.display='none';
    domtab.cssjs('remove',links[count].parentNode,domtab.activeClass);
    section[othercount].style.display='block';
    domtab.cssjs('add',links[othercount].parentNode,domtab.activeClass);
    var parent=links[count].parentNode.parentNode;
    parent.currentLink=links[othercount];
    parent.currentSection=links[othercount].href.match(/#(\w.+)/)[1];
    domtab.cancelClick(e);
  },
  changeTab:function(elm,state){
    do{
      elm=elm.parentNode;
    } while(elm.nodeName.toLowerCase()!=domtab.contentElements)
    elm.style.display=state==0?'none':'block';
  },
  showTab:function(e){
    var o=domtab.getTarget(e);
    if(o.parentNode.parentNode.currentSection!=''){
      domtab.changeTab(document.getElementById(o.parentNode.parentNode.currentSection),0);
      domtab.cssjs('remove',o.parentNode.parentNode.currentLink.parentNode,domtab.activeClass);
    }
    var id=o.href.match(/#(\w.+)/)[1];
    o.parentNode.parentNode.currentSection=id;
    o.parentNode.parentNode.currentLink=o;
    domtab.cssjs('add',o.parentNode,domtab.activeClass);
    domtab.changeTab(document.getElementById(id),1);
    document.getElementById(id).focus();
    domtab.cancelClick(e);
  },
/* helper methods */
  getTarget:function(e){
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target){return false;}
    if (target.nodeName.toLowerCase() != 'a'){target = target.parentNode;}
    return target;
  },
  cancelClick:function(e){
    if (window.event){
      window.event.cancelBubble = true;
      window.event.returnValue = false;
      return;
    }
    if (e){
      e.stopPropagation();
      e.preventDefault();
    }
  },
  addEvent: function(elm, evType, fn, useCapture){
    if (elm.addEventListener) 
    {
      elm.addEventListener(evType, fn, useCapture);
      return true;
    } else if (elm.attachEvent) {
      var r = elm.attachEvent('on' + evType, fn);
      return r;
    } else {
      elm['on' + evType] = fn;
    }
  },
  cssjs:function(a,o,c1,c2){
    switch (a){
      case 'swap':
        o.className=!domtab.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
      break;
      case 'add':
        if(!domtab.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
      break;
      case 'remove':
        var rep=o.className.match(' '+c1)?' '+c1:c1;
        o.className=o.className.replace(rep,'');
      break;
      case 'check':
        var found=false;
        var temparray=o.className.split(' ');
        for(var i=0;i<temparray.length;i++){
          if(temparray[i]==c1){found=true;}
        }
        return found;
      break;
    }
  }
}
domtab.addEvent(window, 'load', domtab.init, false);
