/* Yetii - Yet (E)Another Tab Interface Implementation version 1.5 http://www.kminek.pl/lab/yetii/ Copyright (c) 2007-2008 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() { this.defaults.active++; if(this.defaults.active > this.tabs.length) this.defaults.active = 1; this.show(this.defaults.active); }; 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.parseurl = function(tabinterfaceid) { var result = this.gup(tabinterfaceid); 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.contains = function(el, item, from) { return el.indexOf(item, from) != -1; }; this.hasClass = function(el, className){ return this.contains(el.className, className, ' '); }; 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); };