/**
 * @author Povilas Balzaravičius
 * @copyright 2009 M2 technologijos <http://www.m2.lt>
 * @require prototype.js
 */


if(typeof(Prototype) == "undefined") {
    throw "Control.Tabs requires Prototype to be loaded.";
}


var Tabs = Class.create({

    links: [],
    options: {
        cookieName: 'cr_tabs',
        linkSelector: 'li a',
        activeClassName: 'active',
        rememberActiveTab: true
    },

    initialize: function(tab_list_container, options) {
        if(!$(tab_list_container)) {
            throw "Control.Tabs could not find the element: " + tab_list_container;
        }

        Object.extend(this.options, options || {});
        this.observeTabs(tab_list_container)
        this.setActiveTabFromCookie();
    },


    observeTabs: function(list_container) {
        var tabs = $(list_container).select(this.options.linkSelector);

        tabs.each(function (link){
            this.addTab(link);
        }.bind(this));
    },


    addTab: function(link) {
        if (this.links.size() > 0) {
            this.hide(link);
        }

        this.links.push(link);

        link.observe('click', function(event) {
            Event.stop(event);
            this.setActiveTab(link);
            return false;
        }.bindAsEventListener(this));
    },


    setActiveNTab: function(i) {
        i--;
        if (this.links[i] !== undefined) {
            this.setActiveTab(this.links[i]);
        }
    },


    setActiveTabFromCookie: function() {
        if (this.options.rememberActiveTab) {
            var data = this.readCookie(this.options.cookieName);
            if (data !== null && data !== undefined) {
                this.setActiveNTab(data);
            }
        }
    },


    setActiveTab: function(link) {
        this.links.each(function (item, i) {
            if (item != link) {
                this.hide(item);
            }
            else {
                if (this.options.rememberActiveTab === true) {
                    this.createCookie(this.options.cookieName, i + 1, 1);
                }
            }
        }.bind(this));
        this.show(link);
    },


    show: function(link) {
        var target = this.getTargetContainer(link.href);
        if ($(target)) {
            $(target).show();
            link.up().addClassName(this.options.activeClassName);
        }
    },
    

    hide: function(link) {
        var target = (this.getTargetContainer(link.href));
        if ($(target)) {
            $(target).hide();
            link.up().removeClassName(this.options.activeClassName);
        }
    },

    
    getTargetContainer: function(href) {
        return href.split('#')[1];
    },


    createCookie: function(name, value, days) {
        var expires = "";
        if (days) {
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            expires = "; expires="+date.toGMTString();
        }
        document.cookie = name+"="+value+expires+"; path=/";
    },

    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;
    },

    eraseCookie: function(name) {
        createCookie(name,"",-1);
    }

});
