$.fn.Tabs = function(options) {
	
	/*** Default Configuration Options ***/
	var defaults = {			
		index : 0,
		navs : '.navs',
		tabs : '.tabs',
		current : 'currrent',
		hover : 'hover',
		effect : '',
		duration : 200,
		callback : $.noop
	};
	
	var options = $.extend({}, defaults,options);

	/*** Create Tabs ***/
	return this.each(function() {

		/*** Set jQuery Elements ***/
		var $this = $(this);	
		var $navs = $this.find(options.navs);
		var $tabs = $this.find(options.tabs);

		/*** Copacetic? ***/
		if ($navs.length==0 || $tabs.length==0 || $navs.length>$tabs.length) return;
	
		/*** Events ***/
		$navs.hover(function(e){
			$(this).toggleClass(options.hover) 
		}).click(function(e){
			setTab($(this).index());
		})

		/*** Methods ***/
		var nextTab = function() {
			var cur = $this.data('index');
			var len = $tabs.length;
			var next = (cur==len-1)?0:cur+1;
			setTab(next);
		}

		var setTab = function(i) {
			var c = $this.data('index');
			var n = options.current;

			$($navs[c]).removeClass(n);
			$($navs[i]).addClass(n);

			if (i==c) return;
			effect($($tabs[i]),$($tabs[c]),n);

			$this.data('index', i);
		}

		/*** Transitions ***/

		var tNone = function($ti,$tc,n) {
			$tc.removeClass(n);
			$ti.addClass(n);
			options.callback();
		};

		var tFade = function($ti,$tc,n) {
			if (animating) return;
			animating = true;
			$ti.hide().addClass(n);
			$tc.addClass('transitioning').removeClass(n);
			$ti.fadeIn(options.duration, function() { animating=false; $tc.removeClass('transitioning'); options.callback();  })
		};

		var tScroll = function($ti,$tc,n) {
			if (animating) return;
			animating = true;
			var left = $this.innerWidth();
			$ti.hide().css({left:left+'px'}).addClass(n).show();
			$tc.addClass('transitioning').removeClass(n);
			$ti.animate({left:'-='+ left +'px'}, options.duration, function() { animating=false; $tc.removeClass('transitioning'); options.callback($this); })
		};

		var effect = (function(o){switch(o){case'fade':return tFade;case'scroll':return tScroll;default:return tNone}})(options.effect);
		var animating = false;

		/*** Init to Default Index ***/
		var i = (defaults.index>=$navs.length?0:defaults.index);
		$this.data('index', i)
		$this.data('nextTab', nextTab)
		$($navs[i]).addClass(options.current);
		$($tabs[i]).addClass(options.current);
	});

}
