dojo.require('actijscore.parser');

dojo.provide('frontpage.tabs');

dojo.declare('frontpage.tabs', null, 
{
    domNode: null,
    arrTabList: [],
    arrPanelList: [],
    arrKeyboardHandler: [],
    arrClickHandler: [],
    index: 0,
    
    constructor: function( params, srcNodeRef )
    {
	this.arrTabList = [];
	this.arrPanelList = [];
	this.arrKeyboardHandler = [];
	this.arrClickHandler = [];
	this.index = 0;
	
	this.domNode = srcNodeRef;
	this.arrTabList = dojo.query( 'ul.tabs:first-child li' );
	this.arrPanelList = dojo.query( '.jsTabPanel' );
	
	this.arrTabList.forEach( dojo.hitch( this, function( domTab, i )
	{
		this.connectTab( domTab, i );
	} ) );
    },
    
    connectTab: function( domTab, i )
    {
	this.arrClickHandler.push( dojo.connect( domTab, 'click', this, function( e )
									{  
									    dojo.stopEvent( e );
									    this.index = i;
									    this.setTab( domTab );
									} ) );

	this.arrKeyboardHandler.push( dojo.connect( domTab, 'keypress', this, this.hubKeyBoardEvent ) );
    },
    
    hubKeyBoardEvent: function( e )
    {
	switch( e.charOrCode )
	{
	    case dojo.keys.LEFT_ARROW:	dojo.stopEvent( e );
					this.previousTab();
					break;

	    case dojo.keys.RIGHT_ARROW:	dojo.stopEvent( e );
					this.nextTab();
					break;
					
	    case dojo.keys.UP_ARROW:	dojo.stopEvent( e );
					this.previousTab();
					break;
					
	    case dojo.keys.DOWN_ARROW:	dojo.stopEvent( e );
					this.nextTab();
					break;
	}
    },
    
    nextTab: function()
    {
	this.index = ( this.index + 1 ) % this.arrTabList.length;
	this.setTab( this.arrTabList[this.index] );
    },
    
    previousTab: function()
    {
	this.index = ( this.index - 1 + this.arrTabList.length ) % this.arrTabList.length;
	this.setTab( this.arrTabList[this.index] );
    },
    
    setTab: function( domTabToSet )
    {
	domTabToSet.focus();
	
	this.arrTabList.forEach( dojo.hitch( this, function( domTab, i )
	{
	    var domPanel = this.arrPanelList[i];
	    if( i == this.index )
	    {
		dojo.attr( domTab, {'aria-selected': 'true', tabindex: '0'} );
		dojo.addClass( domTab, 'active' );
		
		if( domPanel != null )
		{
		    dojo.attr( domPanel, {'aria-hidden': 'false', tabindex: '0'} );
		    dojo.addClass( domPanel, 'active' );
		    dojo.style( domPanel, {display: 'block'} );
		}
	    }
	    else
	    {
		dojo.attr( domTab, {'aria-selected': 'false', tabindex: '-1'} );
		dojo.removeClass( domTab, 'active' );

		if( domPanel != null )
		{
		    dojo.attr( domPanel, {'aria-hidden': 'true', tabindex: '-1'} );
		    dojo.removeClass( domPanel, 'active' );
		    dojo.style( domPanel, {display: 'none'} );
		}
	    }
		
	}));
    },
    
    destroy: function()
    {
	var h;
	while ( ( h = this.arrKeyboardHandler.pop() ) != undefined)
	{
		dojo.disconnect( h );
	}
	
	while ( ( h = this.arrClickHandler.pop() ) != undefined)
	{
		dojo.disconnect( h );
	}
    }
});

actiJSCoreParser.addDefinition( '.jsTabs', frontpage.tabs, {} );
