var vsgneSite = function(){	// private attributes	var _doTest = false;	var _doLog = false;	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 = "tab_"+tab.id;			td.append("<div id='"+tabid+"' class='tab'>"+tab.title+"</div>");		}		td.append("<div class='tabs_filler'></div>"); // force min-height				extendNoSelect();	};		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 = tabname.replace("tab_", "");		$("#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);				}			});						/*					// get() provides synchronous behavior; load() doesn't			$.get(url, function(data) {				callback(data);			});	*/					/*			$.ajax({ url: "pane_"+name+".zhtml", 					async:false,					context: document.body, 					success: function(data) {						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 = id.replace("tab_", "");				$("#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();			}		}	};		return {		// public attributes		doTest : function() 		{			return _doTest;		},		// public methods		init : function() 		{			_detectFlags();		},				build : function() 		{			_renderTabs();			_setEventHandlers();			_selectTab("tab_home");		},				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>");			}		}			}}();	