var vsgneSite = function(){	// private attributes	var _doTest = false;	var _doLog = false;	var _cookieName_Tabname = "tabname";	var _cookieName_SubTab = "subtab";	var _coeffMsg = "<span style='font-size:16px;'>&lt;== Please select a value</span>";	var _incompleteMsg = "<div style='font-size:12px; padding-top:4px; font-weight:normal;'>(Select Values above)</div>";	var _noselValue = 999;	var _paneContent = {};	// private methods	var _renderTabs = function()	{		var td = $("#tabs");		for(var t in vsgnedata.tabs) 		{			var tab = vsgnedata.tabs[t];			var tabid = _makeTabId(tab.id);			td.append("<div id='"+tabid+"' class='tab'>"+tab.title+"</div>");		}		td.append("<div class='tabs_filler'></div>"); // force min-height				extendNoSelect();	};		var _makeTabId = function(name)	{		name = _getTabName(name);	// JIC		return "tab_"+name;	};	var _getTabName = function(id)	{		return id.replace("tab_", "");	};		var _setEventHandlers = function()	{		$(".tab").click(function () {			_selectTab(this.id);		});		$(".tab").mouseover(function () {			_mouseoverTab(this.id, true);		});		$(".tab").mouseleave(function () {			_mouseoverTab(this.id, false);		});	};		var _loadPane = function(tabname)	{		var name = _getTabName(tabname);		$("#tab_content").html("");				_fetch("pane_"+name+".html", 				function(data){					$("#tab_content").html(data);										// The render_*() fcn is in the just-loaded content.					// For some reason we need to delay it's invocation.					var fcn = "render_"+name+"();";					vsgneSite.log("Calling "+fcn+"...");					setTimeout ( fcn, 1 );					});	};		var _fetch = function(url, callback)	{		vsgneSite.log("fetch("+url+")");		try		{					$.ajax({				url: url,				success: function(data) {					vsgneSite.log("->success");					callback(data);				},				error : function(XMLHttpRequest, textStatus, errorThrown) {					vsgneSite.logErr(errorThrown);				}			});				}		catch(err)		{			vsgneSite.logErr(err);		}		};		var _showContent = function(name)	{		$("#tab_content").html(_paneContent[name]);	};		var _selectTab = function(id)	{		vsgneSite.log("_selectTab("+id+")");		var name = _getTabName(id);		vsgneSite.saveTabname(name);				$("#subtabsContainer").html("")								.height(0)	// Else it'll overflow in IE, even when hidden								.hide();		$("#tab_content").removeClass("tab_content_with_subtabs");			_loadPane(id);		$(".pane").hide();		$("#pane_"+name).show();		// De-select all tabs: remove all generic selection and custom selection styles		$(".tab").each(function() {			$("#"+this.id).removeClass("tab_selected");			var tabid = this.id;			$("#"+tabid).removeClass(tabid+"_selected");		});				$("#"+id).addClass("tab_selected");			// Select the new tab		$("#"+id).addClass(id+"_selected");	};		var _mouseoverTab = function(id, over)	{		$("#"+id).toggleClass("tab_highlight", over);	};		var _detectFlags = function()	{		var q = window.location.href.indexOf('?');		if(q > 0)		{			var params = window.location.href.slice(q + 1);			if(params.search(/test/i) >= 0) {				_doTest = true;			}			if(params.search(/log/i) >= 0) {				_doLog = true;				$("#log").show();			}		}	};		var _getQueryValue = function(key)	{		var qs = window.location.search.substring(1).toLowerCase();		var qsa = qs.split("&");		for (i=0;i<qsa.length;i++) 		{			var kvp = qsa[i].split("=");			if (kvp[0] == key) {				return kvp[1];			}		}		return "";	};		var _getInitialTab = function()	{		var tabid = _makeTabId(vsgnedata.tabs[0].id);	// Presumably the Home tab				var qt = _getQueryValue('tab');		if(qt.length > 0)		{			vsgneSite.saveTabname("");	// Clear old values			vsgneSite.saveSubtab("");	// ""			if(_isValidTabName(qt))			{				tabid = _makeTabId(qt);				var st = _getQueryValue('subtab');				vsgneSite.saveTabname(qt);				vsgneSite.saveSubtab(st);				// Reload page w/o query string				var url = document.location.href;				var q = url.indexOf('?');				if(q > 0)				{					url = url.substr(0, q);					document.location.href = url;				}			}		}		else		{ 			// Attempt to retrieve stored tabname form cookie			var tabname = vsgneSite.readTabname();			if(_isValidTabName(tabname)) {				tabid = _makeTabId(tabname);			} else {				vsgneSite.saveTabname("");	// Clear old values				vsgneSite.saveSubtab("");	// ""			}		}				return  tabid;	};		var _writeSessionCookie = function(name, value)	{		document.cookie = name +"=" + escape(value) + "; path=/";	};		var _getCookieValue = function(cookiename)	{		var value = "";		var exp = new RegExp (escape(cookiename) + "=([^;]+)");		if (exp.test (document.cookie + ";")) 		{			exp.exec (document.cookie + ";");			value = unescape(RegExp.$1);		}		return value;	};		var _isValidTabName = function(tabname)	{		var valid = false;		try		{			var tabid = _makeTabId(tabname);			valid = ($("#"+tabid).length > 0);		}		catch(ex)		{		}		return valid;	};	return {		// public attributes		doTest : function() 		{			return _doTest;		},		// public methods		init : function() 		{			_detectFlags();		},				build : function() 		{			_renderTabs();			_setEventHandlers();						var tabid = _getInitialTab();			_selectTab(tabid);		},				fetch : function(url, callback) 		{			_fetch(url, callback);		},				dbgBreak : function()		{			alert("dbgBreak");		},		log : function(data)		{			if(_doLog)			{				var zzz = $("#log").html();				zzz += (data + "<br>");				$("#log").html(zzz);			}		},		logErr : function(data)		{			if(_doLog) {				vsgneSite.log("<span style='color:red;'>"+data+"</span>");			}		},				saveTabname : function(tabname)		{			tabname = _getTabName(tabname);	// JIC			_writeSessionCookie(_cookieName_Tabname, tabname);		},				readTabname : function()		{			return _getCookieValue(_cookieName_Tabname);		},				saveSubtab : function(subtab)		{			_writeSessionCookie(_cookieName_SubTab, subtab);		},		readSubtab : function()		{			return _getCookieValue(_cookieName_SubTab);		}			}}();	
