(function($) {

	$.fn.Tabs = function(options){
	  
		// default configuration properties
		var defaults = {			
			onBeforeInit: function(){},
			onAfterInit: function(){},
			Disabled: [],
			Selected: 0,
			onTabClick: function(){},
			afterTabClick: function(){},
			onBeforeComplete: function(){}
		}; 
		
		var o = $.extend(defaults, options);  
				
		this.each(function() {
			var obj = $(this); 				
			var tl = $(this).find(".TabsLinks a"); 
			var tsc = $(this).find(".TabsContent"); 
			var tc = $(this).find(".TabContent"); 

			if(!$(this).hasClass("jTab"))
			{				
				if(tc.length == tl.length)
				{ 
					//these commands is for others plugin to work before these tabs init
					$(tc).addClass("SelectedTab");
					o.onBeforeComplete();
					
					o.Disabled.length && o.Disabled.sort(function(a,b){return a - b});
					if($.inArray(o.Selected,o.Disabled)==-1)
					{
						if(o.Selected>=0 && o.Selected<tl.length)
						{
							$(tl).parent().removeClass("Selected").eq(o.Selected).addClass("Selected");
							$(tc).removeClass("SelectedTab").eq(o.Selected).addClass("SelectedTab");							
						}
					}
					else
					{
						var flag=-1;
						for(var j=0;j<tl.length;j++)
							if(j!=o.Disabled[j])
							{
								flag=j;
								break;
							}
							
						if(o.Disabled.length < tl.length && flag!=-1)
						{
							$(tl).parent().removeClass("Selected").eq(flag).addClass("Selected");
							$(tc).removeClass("SelectedTab").eq(flag).addClass("SelectedTab");
						}else
						{
							$(tc).removeClass("SelectedTab");
							$(tl).parent().removeClass("Selected");
						}
					}
					tl.each(function(i){
						o.onBeforeInit();
						
						if($.inArray(i,o.Disabled)!=-1)
						{
							$(this).parent().addClass("Disabled");
						}
						
						$(this).bind("click",function(e){
							if(!$(this).parent().hasClass("Disabled"))
							{ 
								o.onTabClick();
								$(this).parent().siblings(".Selected").removeClass("Selected");
								$(this).parent().addClass("Selected");
								tsc.find(".SelectedTab").removeClass("SelectedTab");
								tsc.find(this.rel).addClass("SelectedTab");
								o.afterTabClick();
							}
							e.preventDefault();
						});
						
						o.onAfterInit();
					});
				}
				$(this).addClass("jTab");
			}
			else
			{
				o.Disabled.length && o.Disabled.sort(function(a,b){return a - b});
				if($.inArray(o.Selected,o.Disabled)==-1)
				{
					if(o.Selected>=0 && o.Selected<tl.length)
					{
						$(tl).parent().removeClass("Selected").eq(o.Selected).addClass("Selected");
						$(tc).removeClass("SelectedTab").eq(o.Selected).addClass("SelectedTab");
					}
				}
				else
				{
					var flag=-1;
					for(var j=0;j<tl.length;j++)
						if(j!=o.Disabled[j])
						{
							flag=j;
							break;
						}
						
					if(o.Disabled.length < tl.length && flag!=-1)
					{
						$(tl).parent().removeClass("Selected").eq(flag).addClass("Selected");
						$(tc).removeClass("SelectedTab").eq(flag).addClass("SelectedTab");
					}else
					{
						$(tc).removeClass("SelectedTab");
						$(tl).parent().removeClass("Selected");
					}
				}
				tl.each(function(i){
					if($.inArray(i,o.Disabled)!=-1)
					{
						$(this).parent().addClass("Disabled");
					}else
					{
						$(this).parent().removeClass("Disabled");
					}
				});
			}
		});
		
		return this;
	  
	};

})(jQuery);



