/***
**  JQUERY MINITREE PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+
***/
var MiniTabBar = function(element, options) {
	var conf = $.extend({}, $.fn.minitabs.defaults, options);
	var tabbar = $(element);
	var tabholder = null;
	var tabbody = null;
	var tabwrap = null;
	var tabs = new Array();
	var intervalID = false;
	
	var _initialize = function(){
		tabbar.addClass("minitabs");
		if(conf.items.length > 0){
			tabbar.html("");
			for(i = 0;i < conf.items.length; i++){
				var link = conf.items[i].url?conf.items[i].url:'';
				tabbar.append($("<a href='"+link+"'>"+conf.items[i].title+"</a>"));					
				tabbar.append($("<div></div>"));
			}
		}
		tabbody = $("<div class='mt-tab-body'></div>");
		tabbar.prepend(tabbody);
		tabwrap = $("<div class='mt-tab-wrapper'></div>");
		tabwrap.append($("<div class='mt-tab-holder-end'></div>"));
		tabwrap.append($("<div class='mt-tab-fadeleft'></div>"));
		tabwrap.append($("<div class='mt-tab-faderight'></div>"));
		
		tabholder = $("<ul class='mt-tab-holder'></ul>");
		tabwrap.prepend(tabholder);
		tabbar.prepend(tabwrap); 
		
		if(conf.height != "auto"){
			tabbody.css("height",conf.height+"px");	
		}
		if(conf.width != "auto"){
			tabbar.css("width",conf.width+"px");
		}
		
		var count = 1;
		var totalwidth = 0;
		
		tabbar.children(conf.tabelement).each(function(){
			var tab = $("<li rel='tab"+count+"'><div class='mt-tab-content'></div><div class='mt-tab-end'></div></li>");
			$("div:first",tab).html($(this).html());
			tab.attr("key",count);
			var content = "";
			if($(this).next().is("div")){
				content = $(this).next().html();
				$(this).next().remove();
			}
			$(this).remove();
			
			var tabpanel = $("<div class='mt-tab-panel' rel='tab"+count+"'></div>");
			tabpanel.html(content);
			tabholder.append(tab);
			tabbody.append(tabpanel);
			
			if(conf.height == "auto"){
				tabpanel.css("overflowY","hidden");
			}
			if(conf.width == "auto"){
				tabpanel.css("overflowX","hidden");
			}
			
			totalwidth += tab.outerWidth() + (tab.css("marginLeft").replace("px","")*1) + (tab.css("marginRight").replace("px","")*1) + 10;
			tab.attr("left",totalwidth);
			
			tabs[tabs.length] = new MiniTab(tab,tabbar,conf);
			
			tabholder.css("width",totalwidth);
			count++;
		});
		if(tabwrap.width() <= totalwidth){
			_initScrolling();
		}

		if(conf.defaultIndex){
			if(tabbar.getTab(conf.defaultIndex-1)){
				tabbar.getTab(conf.defaultIndex-1).activate();
			}
		}
		if(conf.height != "auto"){
			$(window).bind("resize", function(){_updateHeight();});
			_updateHeight();
		}
		
		if($.isFunction(conf.onload)){
			conf.onload();
		}
	};
	var _initScrolling = function(){
		tabholder.css("marginLeft","15px");
		tabwrap.append($("<div class='mt-tab-scroller mt-scroll-left disabled'><div class='mt-scroller'></div></div>"));
		tabwrap.append($("<div class='mt-tab-scroller mt-scroll-right'><div class='mt-scroller'></div></div>"));
		
		$(".mt-scroll-left",tabbar).mousedown(function(){
			if(!$(this).hasClass("disabled")){
				_startscrolling("left");
			}
		});
		$(".mt-scroll-left",tabbar).mouseup(function(){
			_endscrolling("left");
		});
		
		$(".mt-scroll-right",tabbar).mousedown(function(){
			if(!$(this).hasClass("disabled")){
				_startscrolling("right");
			}
		});
		$(".mt-scroll-right",tabbar).mouseup(function(){
			_endscrolling("right");
		});
		
	};
	var _updateHeight = function(){
		
		var paddingTop = (tabbody.css("paddingTop").replace("px","") *1);
		var paddingBottom = (tabbody.css("paddingBottom").replace("px","") *1);
		var pad = paddingTop + paddingBottom;
		var height = tabbody.height();
		var width = tabbody.width();
		$(".mt-tab-panel",tabbar).css("height",height+"px");
		$(".mt-tab-panel",tabbar).css("width",width+"px");
		
	};
	
	var _startscrolling = function(type){
		if(!intervalID){
			intervalID = setInterval(function(){_scroll(type)},conf.scrollInterval);
		}
	};
	var _endscrolling = function(type){
		if(intervalID){
			clearInterval(intervalID);
			intervalID = false;
		}
	};
	
	var _scroll = function(type){
		if(type == "left"){
			if(_getmargins().left < 15){
				tabholder.css("marginLeft",(_getmargins().left + 5)+"px");
			}else{
				_endscrolling(type);
			}
		}else if(type == "right"){
			if(_getmargins().right > -15){
				tabholder.css("marginLeft",(_getmargins().left - 5)+"px");
			}else{
				_endscrolling(type);
			}
		}
		if(_getmargins().left < 15)
			$(".mt-scroll-left",tabbar).removeClass("disabled");
		else
			$(".mt-scroll-left",tabbar).addClass("disabled");
		
		if(_getmargins().right > -15)
			$(".mt-scroll-right",tabbar).removeClass("disabled");
		else
			$(".mt-scroll-right",tabbar).addClass("disabled");
	};
		
	var _getmargins = function(){
		var leftm = (tabholder.css("marginLeft").replace("px","")*1);
		var rightm = tabholder.width() - ((tabwrap.width() + Math.abs(leftm)));
		return {left: leftm, right:rightm};	
	};
	tabbar.deselectAll = function(){
		for(i=0;i<tabs.length;i++){
			if(tabs[i])
				tabs[i].deactivate();
		}
	};
	tabbar.remove = function(key){
		if(tabs[key])
			tabs[key].remove();
	};
	tabbar.unset = function(key){
		tabs[key] = false;
	};
	tabbar.getTab = function(key){
		if(tabs[key])
			return tabs[key];
		else
			return false;
	};
	
	_initialize();
	return tabbar;
};

var MiniTab = function(element,tabbar,conf) {
	var tab = $(element);
	var status = "inactive";
	var related = null;
	var key = tab.attr("key");
	var _initialize = function(){
		tab.click(function(){
			tab.activate();
			return false;
		});
		if(tab.attr("rel")){
			related = $("div[rel='"+tab.attr("rel")+"']",tabbar);
		}
		related.hide();
	};
	
	tab.deactivate = function(){
		if(status == "active"){
			tab.removeClass("active");
			related.hide();
			status = "inactive";
			if($.isFunction(conf.ondeactive)){
				conf.ondeactive(tab,related);
			}
		}
	};
	tab.activate = function(){
		if(status == "inactive"){
			tabbar.deselectAll();
			tab.addClass("active");
			related.show();
			status = "active";
			if($.isFunction(conf.onactive)){
				conf.onactive(tab,related);
			}
		}
	};
	tab.remove = function(){
		$(tab,tabbar).remove();
		tabbar.unset(key);
	};
	
	
	_initialize();
	return tab;
};

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minitabs = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minitabs')) return;
			var w = new MiniTabBar(this, options);
			element.data('minitabs', w);
		});
	};
	
})(jQuery);

$.fn.minitabs.defaults = {
	tabelement		:	"a",
	items 			:	[],
	defaultIndex	:	1,
	height			:	"auto",
	width			:	"auto",
	scrollInterval	:	15,
	onload			:	false,
	onactive		:	false,
	ondeactive		:	false
};