/*Yetii - Yet (E)Another Tab Interface Implementationversion 1.6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.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);};
