/*
Sky.Tabs 
copyright by MySign AG (http://www.mysign.ch), Dominik Richner
depencies: Prototype 1.6
*/
// creating namespace
var Sky;
if ( !Sky ) Sky = {};

Sky.Tabs = Class.create();

Sky.Tabs._REQUIRED_PROTOTYPE = '1.6.0.2';

Sky.Tabs.EVENT_TABSELECTION = 'Tabs:tabselection';

Sky.Tabs.prototype =
{
	initialize: function( id, opts ) 
	{
		// checking Sky.PrototypeExtensions
		if( Object.isUndefined( Sky.PrototypeExtensions ) )
		{
			throw( "Sky.Tabs requires the Sky.PrototypeExtensions JavaScript framework" );
		}
		// checking Prototype
		if( !Sky.PrototypeExtensions.isPrototypeLoaded( Sky.Tabs._REQUIRED_PROTOTYPE ) )
		{
			throw( "Sky.Tabs requires the Prototype JavaScript framework >= " + Sky.Tabs._REQUIRED_PROTOTYPE );
		}
	
		this.currentTab = '';
		
		this.options = 
		{
			defaultPanel:			'',
			actNavClassName:		'selected',
			classNameNavBefActNav:	null,
			blurSelectedNav:		false,
			ajaxUrls:				{},
			ajaxLoadingText:		'Loading...'
		}
		Object.extend( this.options, opts || {} );
		
		var element = $(id);
		
		this.listElements = $A(element.getElementsByTagName('li'));
		for( i = 0; i < this.listElements.length; i++ )
		{
			var tabLI = this.listElements[i];
			var itemLinks = tabLI.getElementsByTagName('a');
			tabLI.itemId = itemLinks[0].href.split("#")[1];
			tabLI.linkedPanel = $(tabLI.itemId);
			tabLI.linkedPanel.style.clear = "both";
			
			if( this.options.defaultPanel == tabLI.itemId )
			{
				this.openTab( tabLI );
			}
			else
			{
				$($(tabLI).linkedPanel).hide();
			}
			
			$(itemLinks[0]).observe( 'click',	function( event )
												{
													element = Event.findElement( event, 'li' );
													this.openTab( element );					
													Event.stop( event );
												}.bind( this ) );
		}
	},
	
	openTab: function( tab )
	{
		tab = $(tab);
		
		if ( this.currentTab == '' || this.currentTab.itemId != tab.itemId )
		{
			if( this.currentTab != '' )
			{
				this.currentTab.linkedPanel.hide();
				this.currentTab.removeClassName( this.options.actNavClassName );
			}
			
			this.currentTab = tab;
			
			if ( this.options.blurSelectedNav )
			{
				this.currentTab.blur();
			}
			
			tab.linkedPanel.show();
			tab.addClassName( this.options.actNavClassName );
			
			if( !Object.isUndefined( this.options.ajaxUrls[tab.itemId] ) )
			{
				var url = this.options.ajaxUrls[tab.itemId];
				tab.linkedPanel.update( this.options.ajaxLoadingText );
				new Ajax.Request( url, { onComplete: function( transport )
													{
														tab.linkedPanel.update( transport.responseText );
													}
										} );
			}
			
			if ( this.options.classNameNavBefActNav !== null )
			{
				var elements = this.getListElements();
				for ( var i = 0; i < elements.length; i++ )
				{
					var element = $(elements[i]);
					if ( element.hasClassName( this.options.classNameNavBefActNav ) )
					{
						element.removeClassName( this.options.classNameNavBefActNav );
					}
					
					if ( element.itemId === this.currentTab.itemId && i > 0 )
					{
						var tabLeft = elements[i-1];
						tabLeft.addClassName( this.options.classNameNavBefActNav );
					}
				}
			}
			
			tab.fire( this.EVENT_TABSELECTION, { currentTab: tab } );
		}
	},
	
	getCurrentTab: function()
	{
		return this.currentTab;
	},
	
	_getNextTab: function( reverseOrder )
	{
		var returnValue;
		var currentTab = this.currentTab;
		var elements = this.getListElements();
		if( currentTab != '' )
		{
			for ( var i = 0; i < elements.length; i++ )
			{
				var element = $(elements[i]);
				if(currentTab.itemId == element.itemId)
				{
					if( reverseOrder )
					{
						if( i == 0 )
						{
							returnValue = $(elements.last());
						}
						else
						{
							returnValue = $(elements[i-1]);
						}
					}
					else
					{
						if( (i + 1) == elements.length )
						{
							returnValue = $(elements.first());
						}
						else
						{
							returnValue = $(elements[i+1]);
						}
					}
					break;
				}
			}
		}
		else
		{
			if( reverseOrder )
			{
				returnValue = $(elements.last());
			}
			else
			{
				returnValue = $(elements.first());
			}
		}
		return returnValue;
	},
	
	next: function()
	{
		this.openTab( this._getNextTab( false ) );
	},
	
	prev: function()
	{
		this.openTab( this._getNextTab( true ) );
	},
	
	first: function()
	{
		var elements = this.getListElements();
		if( elements.length > 0 )
		{
			this.openTab( $(elements.first()) );
		}
	},
	
	last: function()
	{
		var elements = this.getListElements();
		if( elements.length > 0 )
		{
			this.openTab( $(elements.last()) );
		}
	},
	
	getListElements: function ()
	{
		return this.listElements;
	}
};

// For compatibility reasons
var My;
if( !My ) My = {};
My.Tabs = Sky.Tabs;