/*
        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);

