(function(glob){

var EVENT_PREFIX = 'tabs:';
var EVENT_OPEN = EVENT_PREFIX + 'open';
var EVENT_CLOSE = EVENT_PREFIX + 'close';
var ACTIVE_CLASS = 'active';

var TabWidget = glob.TabWidget = function(selector, defaultTabID) {
	var tabContainer = jQuery(selector);
	var tabListItems = tabContainer.find('.tabList li');
	var tabListLinks = tabListItems.find('a')
	var tabs = tabContainer.find('.tab');
	
	var defaultTabID = (defaultTabID) ? defaultTabID : tabs.eq(0).attr('id');
	var activeTab;
	
	function openTab(id){
		var targetTab = tabs.filter('#' + id);
		if (targetTab.size() == 0) {
			throw new Error('Tab with id ' + id + ' is not in this group.');
		}
		
		// hide currently selected tab and deactivate link, if necessary
		if (activeTab) {
			activeTab.hide().trigger(EVENT_CLOSE);
			tabListLinks.filter('[href=#' + activeTab.attr('id') + ']').parent().removeClass(ACTIVE_CLASS);
		}
		
		// show target tab and activate link
		targetTab.show().trigger(EVENT_OPEN);
		tabListLinks.filter('[href=#' + id + ']').parent().addClass(ACTIVE_CLASS);
		
		activeTab = targetTab;
	}
	
	this.open = function(id) {
		if (!isNaN(parseInt(id))) {
			var id = tabs.eq(id).attr('id');
		}
		openTab(id);
	}
	
	this.getTabs = function(){ return tabs; }
	
	this.getTabListLinks = function(){ return tabListLinks; }
	
	this.getDefaultTabID = function(){ return defaultTabID; }
	
	tabListLinks.click(function(){
		openTab(jQuery(this).attr('href').substr(1));
		return false;
	});
	
	openTab(defaultTabID);
	
	return this;
};

})(window || this);
