(function($){
	var old = $.fn.tabs;
	$.fn.extend({
		tabs: function(opts) {
			var $this = this.not(function(i) {
				return $.data(this, "tabsinit") || $(this).hasClass("noInit");
			}).data("tabsinit", true);
			
			opts = $.extend(opts, $this.ParseClass());
			var ret = old.call($this, opts),
			tab = String(window.location).match(/[\?&]tab=([^&#]*)/);
			if (tab && tab[1]) {
				old.call($this, "select", /^\d*$/.test(tab[1]) ? tab[1] : "#" + tab[1]);
				$("select.redirectOnChange").data("extraParams", "tab="+tab[1]);
			}
			
			ret.bind('tabsselect', function(event, ui) {
				$("select.redirectOnChange").data("extraParams", "tab=" + $(ui.tab).attr("href").substring(1));
				if ($.initFixPNGElements) {
					setTimeout(function() {
						$.initFixPNGElements('div.tabContent');
					}, 1);
				}
				if (opts.formKeepTabs === true) {
					formKeepTabs($(ui.tab).attr("href"));
				}
				
				var tab = $(ui.tab);
				if (tab.hasClass("trackTab") && window.dcsMultiTrack) {
					var obj = $(ui.tab).ParseClass(true);
					if (obj.name && obj.content) {
						try {
							dcsMultiTrack(obj.name, obj.content);
						} catch(e) {}
					}
				}
				$("div.messageStack:visible").hide();
			});
			
			var formKeepTabs = function(tab) {
				tab = tab.replace(/^#/, "");
				$("form").each(function() {
					var $this = $(this),
					action = $this.attr("action").replace(/[?&]tab=(\w*)/, "");
					
					action += action.indexOf("?") == -1 ? "?" : "&";
					$this.attr("action", action + "tab=" + tab);
				});
			};
			var loc = String(window.location);
			if (opts.formKeepTabs && loc.indexOf("#") !== -1) {
				formKeepTabs(loc.substring(loc.indexOf("#")));
			}
			
			$("a.tabLink").click(function(e) {
				var ele = $(this),
				href = ele.attr("href"),
				tab = String(window.location).match(/[\?&]tab=([^&#]*)/),
				id = (href.indexOf("#") != -1) ? href.substring(href.indexOf("#")+1) : tab[1],
				cont = function() {
					old.call($this, "select", id);
				};
				$.data(e.target, "continueFunc", cont);
				setTimeout(function() {
					if ($.data(e.target, "isCancelled") !== true) {
						cont();
						$.data(e.target, "continueFunc", null);
					}
					$.data(e.target, "isCancelled", null);
				}, 10);
				if ($this.find("#"+id).length) {
					return false;
				}
			});
			return this;
		}
	});
	$.tabs = {
		init: function(sel) {
			$(sel || "div.box.tabs").tabs();
		}
	};
	$(document).ready(function() {
		$.tabs.init();
	});
})(jQuery);
