/**
 * jQuery Aba(Tab) Plugin
 * @author Estevão Lucas <estevao[dot]lucas[at]gmail[dot]com>
 * @date 1/10/2007
 *
 * Copyright (c) 2006 Estevão Lucas
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Built on top of the jQuery library
 *   http://jquery.com
 *
 * Library to tab divs
 */
 
( function( $ )
{
	var defaults = {
			tabs: null,
			menu: null,
			contentArea: null,
			parent: false,
			item: "a",
			event: "click",
			attr: "class",
			active: "ativo",
			jScrollPane: null
		};
	
	$.fn.aba = function( settings, callback )
	{
		typeof settings == "function"
			? callback = settings
			: callback = callback || null;
			
		return this.each( function()
		{
			new $a( this, settings, callback );
		});
	}
	
	$.abaFunc = function( container, settings, callback )
	{
		this.settings = $.extend( {}, defaults, settings || {});
		this.div = $( container );
		this.callback = callback;
		
		this.settings.menu = typeof this.settings.menu == "string" 
			? $( this.settings.menu )
			: this.settings.menu;
			
		this.init();
	}
	
	var self = $a = $.abaFunc;
	
	$a.fn = $a.prototype = {
        version: '0.1'
    };
	
	$a.fn.extend = $.extend;
	
	$a.fn.extend( {
				 
		init: function()
		{
			var self = this;
			
			this.changing = false;
			this.visualized = [ $( "> div:visible", self.settings.contentArea ).attr( "class" ) ];
			this.button();
		},
		
		button: function()
		{
			var self = this,
				o = self.settings;
			
			// Troca de aba
			$( o.item, o.menu ).unbind().bind( o.event, function()
			{
				!self.changing && self.select( this );
				
				return false;
			});
			
		},
		
		select: function( aba )
		{
			var self = this,
				o = self.settings,
				jAba = $( aba ),
				attr = o.parent ? jAba.parent() : jAba,
				attr = attr.attr( o.attr ),
				contentAba = $( "div." + attr, o.contentArea );
			
			contentAba.length
				? self.change( jAba, contentAba, attr )
				: aba.tagName == "A" && self.ajax( aba.href, aba, function( response )
					{
						var response = $( response ).appendTo( o.contentArea )

						self.change( jAba, response, attr );
					});
		},
		
		change: function( aba, element, classe )
		{
			var self = this,
				o = self.settings,
				form = false,
				visible = $( "> div:visible", o.contentArea ),
				visiblePai = visible.parent(),
				visibleTag = visiblePai[ 0 ].tagName,
				pai = element.parent(),
				tag = pai[ 0 ].tagName,
				$this;
			
			if( !visible.is( "." + classe ) )
			{
				this.changing = true; 
				
				var callback2 = function()
					{						
						element.fadeIn( function()
						{
							self.changing = false;
							
							// Será passado para a fução callback os tres paramentros recebidos pelo metodo change
							// Afim de ajudar a alteração de informações fora do plugin
							if( $.inArray( classe, self.visualized ) == -1 && self.callback )
							{
								self.callback( element, aba, classe );
								self.visualized.push( classe );
							}
							
							element.addClass( self.settings.active );
							
						})
					},
					callback = function()
					{
						var active = $( o.item + "." + o.active, o.menu );
						
						active.add( o.item == "a" ? active.parent() : [] ).removeClass( o.active );

						o.menu
							.removeClass( visible.attr( "class" ) )
							.addClass( element.attr( "class" ) );
							
						aba.add( o.item == "a" ? aba.parent() : [] ).addClass( o.active );
						
						visible.length && visible.removeClass( self.settings.active )
						
						visibleTag != tag 
							? visiblePai.fadeOut( function()
							{
								pai.fadeIn( callback2 );
							})
							: callback2();
					}
				
				visible.length
					? visible.fadeOut( callback )
					: callback();
			}
			else
				this.changing = false; 
		},
		
		ajax: function( url, aba, back )
		{
			var self = this,
				o = self.settings,
				content = o.contentArea,
				menu = $( aba ).parents( "ul:first" ),
				c = $( aba ).attr( "class" ).split( " " ),
				visible = $( "div." + c[ 0 ], content );
			

			visible.length
				? self.change( $( aba ), visible, c[ 0 ] )
				: $.ajax({
					type: "GET", 
					url: url,
					success: function( response )
					{
						back && back( response );
					}
				})
		}
	})
})( jQuery );