Ext.ns('Ext.ux');

Ext.ux.Tabs = Ext.extend(Ext.util.Observable, {
    // Configuration options
    activeTab: 0,
    
    // Our class constructor
    constructor : function(element, config) {
        Ext.apply(this, config);
        Ext.ux.Tabs.superclass.constructor.call(this);
        
        this.addEvents(
            'beforetabchange',
            'tabchange'
        );
        
        this.el = Ext.get(element);
        this.init();
    },
    
    init : function() {
        var me = this;

        this.el.addClass('ux-tabs-container');
        
        this.tabStrip = this.el.child('ul');
        this.tabStrip.addClass('ux-tabs-strip');
        
        this.tabStrip.on('click', this.onStripClick, this, {delegate: 'a'});
        
        this.tabs = this.tabStrip.select('> li');
        this.cards = this.el.select('> div');
        
        this.cardsContainer = this.el.createChild({
            cls: 'ux-tabs-cards'
        });     
        this.cardsContainer.setWidth(this.el.getWidth());
        
        this.cards.addClass('ux-tabs-card');
        this.cards.appendTo(this.cardsContainer);
        
        this.el.createChild({
            cls: 'ux-tabs-clearfix'
        });
        
        this.setActiveTab(this.activeTab || 0);
    },
    
    onStripClick : function(ev, t) {
        if(t && t.href && t.href.indexOf('#')) {
            ev.preventDefault();
            this.setActiveTab(t.href.split('#')[1]);
        }
    },
    
    setActiveTab : function(tab) {
        var card;
        var link;
        if(typeof tab === 'string') {
            card = Ext.get(tab);
            link = this.tabStrip.child('a[href=#' + tab + ']');
            tab = this.tabStrip.child('a[href=#' + tab + ']').parent();
        }
        else if (typeof tab === 'number') {
            tab = this.tabs.item(tab);
            link = tab.first();
            card = Ext.get(link.dom.href.split('#')[1]);
        }

        if(tab && card && this.fireEvent('beforetabchange', tab, card) !== false) {
            
            var links = this.tabStrip.select('.ux-tablink-active');
            Ext.each(links.elements, function(v) {
                Ext.get(v).removeClass('ux-tablink-active');
            });
            
            card.radioClass('ux-tabs-card-active');
            tab.radioClass('ux-tabs-tab-active');
            link.addClass('ux-tablink-active');
            
            this.fireEvent('tabchange', tab, card);
        }
    }
});
