(function($){
	var options = {
		tabstripPrefix : "tabstrip_",
		tabpanePrefix : "tabpane_",
		transforms : {
			"*"         : "tab_active",
			"tab_first" : "tab_first_active",
			"tab_last"  : "tab_last_active"
		},
		onChange : null
	};

	$.fn.tabs = function(_options) {
		options = $.extend(true, options, _options);

		return this.each(function() {
			var tabStrips = $(this).find('*[id^="' + options.tabstripPrefix + '"]');
			var $tabPane;

			tabStrips.click(function(evt) {
				for(key in tabStrips) {
					if(isNaN(key)) continue;

					$tabPane = $('#' + options.tabpanePrefix + tabStrips[key].id.substr(9));

					if(typeof tabStrips[key] != "object") continue;

					if(tabStrips[key] != this) {
						setTabState($(tabStrips[key]), false, options);
						$tabPane.hide();
					} else {
						setTabState($(tabStrips[key]), true, options);
						$tabPane.show();
					}
				}

				evt.cancelBubble = true;
				evt.returnValue = false;
				return false;
			})
		});
	}

	function setTabState($tab, active, options) {
		for(key in options.transforms) {
			if(key != "*") {
				if(active && $tab.hasClass(key)) {
					$tab.removeClass(key);
					$tab.addClass(options.transforms[key]);
				} else if(!active && $tab.hasClass(options.transforms[key])) {
					$tab.removeClass(options.transforms[key]);
					$tab.addClass(key);
				}
			} else {
				if(active) {
					$tab.addClass(options.transforms[key]);
				} else {
					$tab.removeClass(options.transforms[key]);
				}
			}
		}

		if(typeof options.onChange == "function") {
			options.onChange.call($tab.get(0), active);
		}
	}
})(jQuery)
