MediaWiki:Tab.js

/*Yetii - Yet (E)Another Tab Interface Implementation,version 1.8,http://www.kminek.pl/lab/yetii/,Copyright (c) Grzegorz Wojcik,Code licensed under the BSD License: http://www.kminek.pl/bsdlicense.txt*/ function Yetii{this.defaults={id:null,active:1,interval:null,wait:null,persist:null,tabclass:'tab',activeclass:'active',callback:null,leavecallback:null};this.activebackup=null;for(var n in arguments[0]){this.defaults[n]=arguments[0][n]};this.getTabs=function{var retnode=[];var elem=document.getElementById(this.defaults.id).getElementsByTagName('*');var regexp=new RegExp("(^|\\s)"+this.defaults.tabclass.replace(/\-/g,"\\-")+"(\\s|$)");for(var i=0;i<elem.length;i++){if(regexp.test(elem[i].className))retnode.push(elem[i])}return retnode};this.links=document.getElementById(this.defaults.id+'-nav').getElementsByTagName('a');this.listitems=document.getElementById(this.defaults.id+'-nav').getElementsByTagName('li');this.show=function(number){for(var i=0;i<this.tabs.length;i++){this.tabs[i].style.display=((i+1)==number)?'block':'none';if((i+1)==number){this.addClass(this.links[i],this.defaults.activeclass);this.addClass(this.listitems[i],this.defaults.activeclass+'li')}else{this.removeClass(this.links[i],this.defaults.activeclass);this.removeClass(this.listitems[i],this.defaults.activeclass+'li')}}if(this.defaults.leavecallback&&(number!=this.activebackup))this.defaults.leavecallback(this.defaults.active);this.activebackup=number;this.defaults.active=number;if(this.defaults.callback)this.defaults.callback(number)};this.rotate=function(interval){this.show(this.defaults.active);this.defaults.active++;if(this.defaults.active>this.tabs.length)this.defaults.active=1;var self=this;if(this.defaults.wait)clearTimeout(this.timer2);this.timer1=setTimeout(function{self.rotate(interval)},interval*1000)};this.next=function{var _target=(this.defaults.active+1>this.tabs.length)?1:this.defaults.active+1;this.show(_target);this.defaults.active=_target};this.previous=function{var _target=((this.defaults.active-1)==0)?this.tabs.length:this.defaults.active-1;this.show(_target);this.defaults.active=_target};this.previous=function{this.defaults.active--;if(!this.defaults.active)this.defaults.active=this.tabs.length;this.show(this.defaults.active)};this.gup=function(name){name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");var regexS="[\\?&]"+name+"=([^&#]*)";var regex=new RegExp(regexS);var results=regex.exec(window.location.href);if(results==null)return null;else return results[1]};this.guh=function{var regexS="#([^&#]*)";var regex=new RegExp(regexS);var results=regex.exec(window.location.hash);if(results==null)return null;else return results[1]};this.parseurl=function(tabinterfaceid){var result=this.gup(tabinterfaceid);if(result==null)result=this.guh;if(result==null)return null;if(parseInt(result))return parseInt(result);if(document.getElementById(result)){for(var i=0;i<this.tabs.length;i++){if(this.tabs[i].id==result){return(i+1)}}}return null};this.createCookie=function(name,value,days){if(days){var date=new Date;date.setTime(date.getTime+(days*24*60*60*1000));var expires="; expires="+date.toGMTString}else var expires="";document.cookie=name+"="+value+expires+"; path=/"};this.readCookie=function(name){var nameEQ=name+"=";var ca=document.cookie.split(';');for(var i=0;i<ca.length;i++){var c=ca[i];while(c.charAt(0)==' ')c=c.substring(1,c.length);if(c.indexOf(nameEQ)==0)return c.substring(nameEQ.length,c.length)}return null};this.hasClass=function(el,className){var classes=el.className.split(' ');for(var i=0;i<classes.length;i++){if(classes[i]==className)return true}return false};this.addClass=function(el,className){if(!this.hasClass(el,className))el.className=(el.className+' '+className).replace(/\s{2,}/g,' ').replace(/^\s+|\s+$/g,)};this.removeClass=function(el,className){el.className=el.className.replace(new RegExp('(^|\\s)'+className+'(?:\\s|$)'),'$1');el.className.replace(/\s{2,}/g,' ').replace(/^\s+|\s+$/g,)};this.tabs=this.getTabs;this.defaults.active=(this.parseurl(this.defaults.id))?this.parseurl(this.defaults.id):this.defaults.active;if(this.defaults.persist&&this.readCookie(this.defaults.id))this.defaults.active=this.readCookie(this.defaults.id);this.activebackup=this.defaults.active;this.show(this.defaults.active);var self=this;for(var i=0;i<this.links.length;i++){this.links[i].customindex=i+1;this.links[i].onclick=function{if(self.timer1)clearTimeout(self.timer1);if(self.timer2)clearTimeout(self.timer2);self.show(this.customindex);if(self.defaults.persist)self.createCookie(self.defaults.id,this.customindex,0);if(self.defaults.wait)self.timer2=setTimeout(function{self.rotate(self.defaults.interval)},self.defaults.wait*1000);return false}}if(this.defaults.interval)this.rotate(this.defaults.interval)};