1/* 2 DOMtab Version 3.1415927 3 Updated March the First 2006 4 written by Christian Heilmann 5 check blog for updates: http://www.wait-till-i.com 6 free to use, not free to resell 7*/ 8 9domtab={ 10 tabClass:'domtab', // class to trigger tabbing 11 listClass:'domtabs', // class of the menus 12 activeClass:'active', // class of current link 13 contentElements:'div', // elements to loop through 14 backToLinks:/#top/, // pattern to check "back to top" links 15 printID:'domtabprintview', // id of the print all link 16 showAllLinkText:'show all content', // text for the print all link 17 prevNextIndicator:'doprevnext', // class to trigger prev and next links 18 prevNextClass:'prevnext', // class of the prev and next list 19 prevLabel:'previous', // HTML content of the prev link 20 nextLabel:'next', // HTML content of the next link 21 prevClass:'prev', // class for the prev link 22 nextClass:'next', // class for the next link 23 init:function(){ 24 var temp; 25 if(!document.getElementById || !document.createTextNode){return;} 26 var tempelm=document.getElementsByTagName('div'); 27 for(var i=0;i<tempelm.length;i++){ 28 if(!domtab.cssjs('check',tempelm[i],domtab.tabClass)){continue;} 29 domtab.initTabMenu(tempelm[i]); 30 domtab.removeBackLinks(tempelm[i]); 31 if(domtab.cssjs('check',tempelm[i],domtab.prevNextIndicator)){ 32 domtab.addPrevNext(tempelm[i]); 33 } 34 domtab.checkURL(); 35 } 36 if(document.getElementById(domtab.printID) 37 && !document.getElementById(domtab.printID).getElementsByTagName('a')[0]){ 38 var newlink=document.createElement('a'); 39 newlink.setAttribute('href','#'); 40 domtab.addEvent(newlink,'click',domtab.showAll,false); 41 newlink.onclick=function(){return false;} // safari hack 42 newlink.appendChild(document.createTextNode(domtab.showAllLinkText)); 43 document.getElementById(domtab.printID).appendChild(newlink); 44 } 45 }, 46 checkURL:function(){ 47 var id; 48 var loc=window.location.toString(); 49 loc=/#/.test(loc)?loc.match(/#(\w.+)/)[1]:''; 50 if(loc==''){return;} 51 var elm=document.getElementById(loc); 52 if(!elm){return;} 53 var parentMenu=elm.parentNode.parentNode.parentNode; 54 parentMenu.currentSection=loc; 55 parentMenu.getElementsByTagName(domtab.contentElements)[0].style.display='none'; 56 domtab.cssjs('remove',parentMenu.getElementsByTagName('a')[0].parentNode,domtab.activeClass); 57 var links=parentMenu.getElementsByTagName('a'); 58 for(i=0;i<links.length;i++){ 59 if(!links[i].getAttribute('href')){continue;} 60 if(!/#/.test(links[i].getAttribute('href').toString())){continue;} 61 id=links[i].href.match(/#(\w.+)/)[1]; 62 if(id==loc){ 63 var cur=links[i].parentNode.parentNode; 64 domtab.cssjs('add',links[i].parentNode,domtab.activeClass); 65 break; 66 } 67 } 68 domtab.changeTab(elm,1); 69 elm.focus(); 70 cur.currentLink=links[i]; 71 cur.currentSection=loc; 72 }, 73 showAll:function(e){ 74 document.getElementById(domtab.printID).parentNode.removeChild(document.getElementById(domtab.printID)); 75 var tempelm=document.getElementsByTagName('div'); 76 for(var i=0;i<tempelm.length;i++){ 77 if(!domtab.cssjs('check',tempelm[i],domtab.tabClass)){continue;} 78 var sec=tempelm[i].getElementsByTagName(domtab.contentElements); 79 for(var j=0;j<sec.length;j++){ 80 sec[j].style.display='block'; 81 } 82 } 83 var tempelm=document.getElementsByTagName('ul'); 84 for(i=0;i<tempelm.length;i++){ 85 if(!domtab.cssjs('check',tempelm[i],domtab.prevNextClass)){continue;} 86 tempelm[i].parentNode.removeChild(tempelm[i]); 87 i--; 88 } 89 domtab.cancelClick(e); 90 }, 91 addPrevNext:function(menu){ 92 var temp; 93 var sections=menu.getElementsByTagName(domtab.contentElements); 94 for(var i=0;i<sections.length;i++){ 95 temp=domtab.createPrevNext(); 96 if(i==0){ 97 temp.removeChild(temp.getElementsByTagName('li')[0]); 98 } 99 if(i==sections.length-1){ 100 temp.removeChild(temp.getElementsByTagName('li')[1]); 101 } 102 temp.i=i; // h4xx0r! 103 temp.menu=menu; 104 sections[i].appendChild(temp); 105 } 106 }, 107 removeBackLinks:function(menu){ 108 var links=menu.getElementsByTagName('a'); 109 for(var i=0;i<links.length;i++){ 110 if(!domtab.backToLinks.test(links[i].href)){continue;} 111 links[i].parentNode.removeChild(links[i]); 112 i--; 113 } 114 }, 115 initTabMenu:function(menu){ 116 var id; 117 var lists=menu.getElementsByTagName('ul'); 118 for(var i=0;i<lists.length;i++){ 119 if(domtab.cssjs('check',lists[i],domtab.listClass)){ 120 var thismenu=lists[i]; 121 break; 122 } 123 } 124 if(!thismenu){return;} 125 thismenu.currentSection=''; 126 thismenu.currentLink=''; 127 var links=thismenu.getElementsByTagName('a'); 128 for(i=0;i<links.length;i++){ 129 if(!/#/.test(links[i].getAttribute('href').toString())){continue;} 130 id=links[i].href.match(/#(\w.+)/)[1]; 131 if(document.getElementById(id)){ 132 domtab.addEvent(links[i],'click',domtab.showTab,false); 133 links[i].onclick=function(){return false;} // safari hack 134 domtab.changeTab(document.getElementById(id),0); 135 } 136 } 137 id=links[0].href.match(/#(\w.+)/)[1]; 138 if(document.getElementById(id)){ 139 domtab.changeTab(document.getElementById(id),1); 140 thismenu.currentSection=id; 141 thismenu.currentLink=links[0]; 142 domtab.cssjs('add',links[0].parentNode,domtab.activeClass); 143 } 144 }, 145 createPrevNext:function(){ 146 // this would be so much easier with innerHTML, darn you standards fetish! 147 var temp=document.createElement('ul'); 148 temp.className=domtab.prevNextClass; 149 temp.appendChild(document.createElement('li')); 150 temp.getElementsByTagName('li')[0].appendChild(document.createElement('a')); 151 temp.getElementsByTagName('a')[0].setAttribute('href','#'); 152 temp.getElementsByTagName('a')[0].innerHTML=domtab.prevLabel; 153 temp.getElementsByTagName('li')[0].className=domtab.prevClass; 154 temp.appendChild(document.createElement('li')); 155 temp.getElementsByTagName('li')[1].appendChild(document.createElement('a')); 156 temp.getElementsByTagName('a')[1].setAttribute('href','#'); 157 temp.getElementsByTagName('a')[1].innerHTML=domtab.nextLabel; 158 temp.getElementsByTagName('li')[1].className=domtab.nextClass; 159 domtab.addEvent(temp.getElementsByTagName('a')[0],'click',domtab.navTabs,false); 160 domtab.addEvent(temp.getElementsByTagName('a')[1],'click',domtab.navTabs,false); 161 // safari fix 162 temp.getElementsByTagName('a')[0].onclick=function(){return false;} 163 temp.getElementsByTagName('a')[1].onclick=function(){return false;} 164 return temp; 165 }, 166 navTabs:function(e){
167 var li=domtab.getTarget(e); 168 var menu=li.parentNode.parentNode.menu; 169 var count=li.parentNode.parentNode.i; 170 var section=menu.getElementsByTagName(domtab.contentElements); 171 var links=menu.getElementsByTagName('a'); 172 var othercount=(li.parentNode.className==domtab.prevClass)?count-1:count+1; 173 section[count].style.display='none'; 174 domtab.cssjs('remove',links[count].parentNode,domtab.activeClass); 175 section[othercount].style.display='block'; 176 domtab.cssjs('add',links[othercount].parentNode,domtab.activeClass); 177 var parent=links[count].parentNode.parentNode; 178 parent.currentLink=links[othercount]; 179 parent.currentSection=links[othercount].href.match(/#(\w.+)/)[1]; 180 domtab.cancelClick(e); 181 }, 182 changeTab:function(elm,state){ 183 do{ 184 elm=elm.parentNode; 185 } while(elm.nodeName.toLowerCase()!=domtab.contentElements) 186 elm.style.display=state==0?'none':'block'; 187 }, 188 showTab:function(e){ 189 var o=domtab.getTarget(e); 190 if(o.parentNode.parentNode.currentSection!=''){ 191 domtab.changeTab(document.getElementById(o.parentNode.parentNode.currentSection),0); 192 domtab.cssjs('remove',o.parentNode.parentNode.currentLink.parentNode,domtab.activeClass); 193 } 194 var id=o.href.match(/#(\w.+)/)[1]; 195 o.parentNode.parentNode.currentSection=id; 196 o.parentNode.parentNode.currentLink=o; 197 domtab.cssjs('add',o.parentNode,domtab.activeClass); 198 domtab.changeTab(document.getElementById(id),1); 199 document.getElementById(id).focus(); 200 domtab.cancelClick(e); 201 }, 202/* helper methods */ 203 getTarget:function(e){ 204 var target = window.event ? window.event.srcElement : e ? e.target : null; 205 if (!target){return false;} 206 if (target.nodeName.toLowerCase() != 'a'){target = target.parentNode;} 207 return target; 208 }, 209 cancelClick:function(e){ 210 if (window.event){ 211 window.event.cancelBubble = true; 212 window.event.returnValue = false; 213 return; 214 } 215 if (e){ 216 e.stopPropagation(); 217 e.preventDefault(); 218 } 219 }, 220 addEvent: function(elm, evType, fn, useCapture){ 221 if (elm.addEventListener) 222 { 223 elm.addEventListener(evType, fn, useCapture); 224 return true; 225 } else if (elm.attachEvent) { 226 var r = elm.attachEvent('on' + evType, fn); 227 return r; 228 } else { 229 elm['on' + evType] = fn; 230 } 231 }, 232 cssjs:function(a,o,c1,c2){ 233 switch (a){ 234 case 'swap': 235 o.className=!domtab.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2); 236 break; 237 case 'add': 238 if(!domtab.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;} 239 break; 240 case 'remove': 241 var rep=o.className.match(' '+c1)?' '+c1:c1; 242 o.className=o.className.replace(rep,''); 243 break; 244 case 'check': 245 var found=false; 246 var temparray=o.className.split(' '); 247 for(var i=0;i<temparray.length;i++){ 248 if(temparray[i]==c1){found=true;} 249 } 250 return found; 251 break; 252 } 253 } 254} 255domtab.addEvent(window, 'load', domtab.init, false); 256
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.