(function($){
	dsg.fn.initTopSellers = function(visibleTabs, params){
		
		var params = $.extend({
			loaderOpacity: 0.6
		},params);
		
		
		// After top-sellers ready
		var $topSellers = $("#col-main div.top-sellers").addClass("top-sellers-js");
		var $categories = $topSellers.find("div.categories");
		var nbVisibleTabs = visibleTabs;
		var $firstVisibleTab = $topSellers.find(".box-content ul li:first").addClass("first-visible-tab");
		var $loader = $('<div class="loader"></div>');
		var $loadingTab;
		
		// Switch worlds
		$topSellers.find("div.box-header ul a").click(function(e){
			e.preventDefault();
			var $this = $(this);
			
			$topSellers.find("div.box-header li.active").removeClass("active");
			$this.parent("li").addClass("active");
					
			$categories.hide()
			.filter( $this.attr("href") ).trigger("show");
		});
		
		// Each Category
		$categories.each(function(){
			
			// Category elements
			var $elts = { wrap: $(this) };
			$elts.navWrap = $elts.wrap.find("div.nav-wrap");
			$elts.nav = $elts.navWrap.find("ul");
			$elts.tabs = $elts.nav.find("li");
			$elts.wrapTable = $elts.wrap.find("div.table-wrap");
			
			// Nav slider
			$elts.wrap.bind("show", function(){
				$categories.hide();
				$elts.wrap.show();
				if (!$elts.wrap.data("init")) initCategory($elts);
			});
			
			// Tabs events
			$elts.tabs.find("a").click(function(e){
				e.preventDefault();
				var $this = $(this);
				var ajaxUrl = $this.attr("rel").slice(8);
				loadTab($elts, $this, ajaxUrl);
			});

		}).hide().slice(0,1).trigger("show");
		
		
		// Init category (next / prev buttons, ...)
		function initCategory($catElts){
			
			// Nav width (same width for each tab)
			var tabWidth = $catElts.nav.find("li:eq(1)").width();
			
			// Nav width = default tab width + active tab width
			$catElts.nav.width( (tabWidth * ($catElts.tabs.length-1)) + $catElts.nav.find("li:eq(0)").width() );
			
			// Next / Prev buttons
			$catElts.prevBtn = $('<a class="prev" role="button" tabindex="0">Previous</a>').insertBefore($catElts.navWrap)
				.data("tabIncrement", -1)
				.data("disableClass", "prev-disabled")
				.data("offClass", "prev-off");
			
			$catElts.nextBtn = $('<a class="next" role="button" tabindex="0">Next</a>').insertAfter($catElts.navWrap)
				.data("tabIncrement", 1)
				.data("disableClass", "next-disabled")
				.data("offClass", "next-off");
			
			// Next / Prev buttons events
			var firstVisibleTab = 0;
			$catElts.prevBtn.add($catElts.nextBtn)
				.click(function(){

					if ($(this).data("enabled")){
						firstVisibleTab += $(this).data("tabIncrement") - 0;
						
						$catElts.nav.animate({
							left: - ((tabWidth) * firstVisibleTab) + 'px'
						}, 300, function(){});
						
						$firstVisibleTab.removeClass("first-visible-tab");
						$firstVisibleTab = $catElts.nav.find("li:eq("+(firstVisibleTab)+")").addClass("first-visible-tab");
						updateButtonsState($catElts, firstVisibleTab);
					}
				})
				.bind("disable", disableButton)
				.bind("enable", enableButton)
				.bind("off", offButton)
				.bind("clearClasses", function(){
					var $btn = $(this);
					$btn.removeClass($btn.data("disableClass") + " " + $btn.data("offClass"))
				});
			
			updateButtonsState($catElts, firstVisibleTab);
			
			// Init loader
			initLoader($catElts);
			
			// Init = true
			$catElts.wrap.data("init", true);
		};
		
		// Disable/Enable "next" and "prev" buttons
		function updateButtonsState($catElts, firstVisibleTab){
			
			// Num tabs < visible tabs ?
			if ($catElts.nav.children().length < nbVisibleTabs+1) {
				$catElts.prevBtn.add($catElts.nextBtn).trigger("off");
			}
			
			else {
				
				// Disable prev button
				if (firstVisibleTab == 0) {
					$catElts.prevBtn.trigger("disable");
				}
				// Enable prev button
				else {
					$catElts.prevBtn.trigger("enable");
				}
				
				// Disable next button
				if (firstVisibleTab + nbVisibleTabs == $catElts.tabs.length) {
					$catElts.nextBtn.trigger("disable");
				}
				// Enable next button
				else {
					$catElts.nextBtn.trigger("enable");
				}
				
				// Update visibleTabs object
				$catElts.visibleTabs = $catElts.tabs.slice(firstVisibleTab, firstVisibleTab + nbVisibleTabs);
				
				// Active first tab if active tab is not visible
				if (!$catElts.visibleTabs.is(".active")){
					$catElts.visibleTabs.slice(0,1).find("a").click();
				}
				
			}
		};
		
		
		// Init loader
		function initLoader($catElts){
			$loader.css({
				width: $catElts.wrap.width(),
				height: $catElts.wrap.height() - $catElts.nav.height(),
				opacity: 0
			}).appendTo( $catElts.wrap.parent() ).hide();
		};
		
		
		// Load a tab
		function loadTab($catElts, $tab, ajaxUrl){
			$catElts.tabs.removeClass("active");
			$tab.parent().addClass("active");
			
			$loader.show().css("height", $catElts.wrapTable.height()).fadeTo(300, params.loaderOpacity);
			
			// Currently loaded tab = current tab
			$loadingTab = $tab;
			
			$.get(ajaxUrl, function(data){
				
				// If loaded tab is last clicked tab
				if ($tab == $loadingTab){
					$loader.fadeTo(300,0, function(){ $loader.hide() });
					$catElts.wrapTable.html(data);
					
					// Price Tooltips
					if ($.isFunction(dsg.fn.priceTooltip)){
						dsg.fn.priceTooltip($catElts.wrapTable);
					}
				}
			});
		};
		
		// Disable button event
		function disableButton(e){
			var $btn = $(this);
			$btn
				.trigger("clearClasses")
				.addClass($btn.data("disableClass"))
				.data("enabled", false);
		};
		
		// Enable button event
		function enableButton(e){
			$(this)
				.trigger("clearClasses")
				.data("enabled", true);
		};
		
		// Completely disable button
		function offButton(e){
			var $btn = $(this);
			$btn
				.trigger("clearClasses")
				.addClass($btn.data("offClass"))
				.data("enabled", false);
		};
		
	};
})(jQuery);
