// -------------------------
// --- utility functions ---
// -------------------------

// requires:
// 	nothing

function sEscapeHTML(sText) {
  if (sText == null) {
		return "";
	}
  sText = sText.replace(/'/g,"&#39;");
  sText = sText.replace(/\"/g,"&#34;");
  sText = sText.replace(/>/g,"&gt;");
  sText = sText.replace(/</g,"&lt;");
  return sText;
}

function oValidate(sObject) {
	var asObject = sObject.split(".");
	var sTemp = asObject[0];
	for (var i=1; i<asObject.length; ++i) {
		if (eval(sTemp) == null) {
			return null;
		}
		sTemp += "." + asObject[i];
	}
	return eval(sObject);
}

function CancelEvent(oEvent) {
	if (oEvent.preventDefault) {
		oEvent.preventDefault();
	}
	else {
		oEvent.returnValue = false;
	}
}

var sTryCatchTest = "try { } catch(e) { }";
var bInTryCatchTest = false;
var bInWindowAccessTest = false;
var bInWindowUnload = false;
var oWindowParent = null;
var oWindowOpener = null;

function TestCrossWindowAccess() {
	bInTryCatchTest = true;
	if (sTryCatchTest != null) {
		eval(sTryCatchTest); // check if try/catch is available, causes error if not
	}
	bInTryCatchTest = false;
	var sTryCatchPrefix = (sTryCatchTest != null) ? "try {" : "";
	var sTryCatchPostfix = (sTryCatchTest != null) ? "} catch(oEvent) { }" : "";
	
	// each of these tests causes an error if windows are cross-domain - handled by CatchCrossWindowError
	bInWindowAccessTest = true;
	eval (sTryCatchPrefix + "oWindowParent = (window.parent && window.parent != window && window.parent.location.href != null) ? window.parent : null;" + sTryCatchPostfix);
	eval (sTryCatchPrefix + "oWindowOpener = (window.opener && window.opener != window && window.opener.location.href != null) ? window.opener : null;" + sTryCatchPostfix);
	eval (sTryCatchPrefix + "oWindowOpener = (window.parent && window.parent != window && window.parent.opener != null && window.parent.opener.location.href != null) ? window.parent.opener : oWindowOpener;" + sTryCatchPostfix);
	bInWindowAccessTest = false;
	// cross-window tests are performed first, so that onload handlers can access other windows safely if needed
	ExecuteOnloadHandlers()	
}

function CatchCrossWindowErrors() {
	if (bInTryCatchTest) {
		sTryCatchTest = null;
		setTimeout("TestCrossWindowAccess()", 5);
		return true;
	}
	if (bInWindowAccessTest == true) { // were testing parent window access before error
		bInWindowAccessTest = false; // simply reset test flag - access is set true only if no error occurs
		ExecuteOnloadHandlers(); // proceed with other onload handlers
		return true; // cancel normal error mesage
	}
	if (bInWindowUnload == true) { // suppress error messages from unload functions (may refer to non-existent windows)
		bInWindowUnload = false;
		return true; // cancel normal error message
	}
	return false; // all other errors proceed as normal
}

var aoOnloadHandlers = new Array;

function AddOnloadHandler(oFunction) {
	aoOnloadHandlers[aoOnloadHandlers.length] = (typeof(oFunction) == "string") ? new Function(oFunction) : oFunction;
}

function ExecuteOnloadHandlers() {
	for (var i=0; i< aoOnloadHandlers.length; ++i) {
		aoOnloadHandlers[i]();
	}
}

var aoOnunloadHandlers = new Array;

function AddOnunloadHandler(oFunction) {
	aoOnunloadHandlers[aoOnunloadHandlers.length] = (typeof(oFunction) == "string") ? new Function(oFunction) : oFunction;
}

function ExecuteOnunloadHandlers() {
	bInWindowUnload = true; 
	for (var i=0; i< aoOnunloadHandlers.length; ++i) {
		aoOnunloadHandlers[i]();
	}
	bInWindowUnload = false;
}

window.onerror = CatchCrossWindowErrors;
window.onload = TestCrossWindowAccess;
window.onunload = ExecuteOnunloadHandlers;
