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