if (window.attachEvent) window.attachEvent("onload", initialise);
window.onbeforeunload = checkUnload;
document.onkeypress = keyPress;
document.onkeydown = keyDown;
//document.oncontextmenu = contextMenu;
document.onhelp	= cancelHelp;

var bCheckForChanges = true;
var windowReference = null;		// for child windows
// keystroke values
var CHECK_AGAINST_DECIMAL = "-1234567890.";
var CHECK_AGAINST_INTEGER = "0123456789";
var CHECK_AGAINST_DATE = "0123456789/ ";
var CHECK_AGAINST_TEL = "0123456789 ()+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*";
var CHECK_AGAINST_TIME = "0123456789:";
var CHECK_AGAINST_POSTCODE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ* ";
var GLOB_CANCEL_VALIDATION = "cancel~validation";
var CHECK_AGAINST_ALPHANUMERIC_RE = "^[a-zA-Z0-9]+$";

function voidFunction() {
	return false();
}

function initialise() {

	// on first load, store the form hash
	// this will then be maintained in viewstate
	if (bCheckForChanges && document.frmMain.txtFormHash.value == "")
	{
		document.frmMain.txtFormHash.value = getHashedForm();
	}
	try
	{
		setInitialFocus();
	}
	catch (e) {}

	//run a local script
	try
	{
		temp_doPostBack = __doPostBack;
		__doPostBack = new__doPostBack;
		//localInitialise();
	}
	catch (e) {}
}
function new__doPostBack(eventTarget, eventArgument) {
	var theform;
	if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
		theform = document.forms["frmMain"];
	}
	else {
		theform = document.frmMain;
	}
	theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
	theform.__EVENTARGUMENT.value = eventArgument;
	try
	{
		theform.submit();
	}
	catch(e)
	{
		var et = document.getElementById(theform.__EVENTTARGET.value);
		var i = eval("document.listvalue_" + et.id);
		if(i && et.type=="select-one")
		{
			et.selectedIndex = i;
		}
	}
}
function jsError(sMessage, sErrorURL, iLineNo) {

    // Take & out of sErrorURL, as this confuses popup window querystring.
    sMessage = "URL: " + sErrorURL.replace("&", "?") + "\nLine: " + iLineNo + "\n\n" + sMessage;
	window.location = "../Framework/SystemMessage.aspx?Action=JScriptError&Message=" + encodeURI(sMessage);
}

// supress IE help
function cancelHelp() {
	return false;
}

function beep() {
	try
	{
		document.all.beep.src = "images/ding.wav";
	}
	catch (e) {}
}

// prevent context menu on right click
function contextMenu() {
	window.event.cancelBubble = true;
	window.event.returnValue = false;
	return false;
} 

// supress keystroke
function keyDown() {
	var KEY_CODE_F1 = 112;
	var KEY_CODE_F5 = 116;
	var KEY_CODE_BACKSPACE = 8;
	var KEY_CODE_HOME = 36;
	var KEY_CODE_RIGHT_ARROW = 39;
	var KEY_CODE_LEFT_ARROW = 37;
	var KEY_CODE_F10 = 121;
	var KEY_CODE_TAB = 9;
	var KEY_CODE_F6 = 117;
	var KEY_CODE_R = 82;
	var KEY_CODE_O = 79;
	var KEY_CODE_N = 78;
	var KEY_CODE_L = 76;
	var KEY_CODE_E = 69;
	var KEY_CODE_I = 73;
	var KEY_CODE_H = 72;
	var KEY_CODE_SPACE = 32;
	var KEY_CODE_ENTER = 13;
	var KEY_CODE_ESC = 27;

	var iKeyCode = window.event.keyCode;
	var bAltKey = window.event.altKey;
	var bCtrlKey = window.event.ctrlKey;
	var bShiftKey = window.event.shiftKey;

	var sTagName = "";
	if (window.event.srcElement && window.event.srcElement.tagName) {
		sTagName = window.event.srcElement.tagName.toLowerCase();
	}
	
	// suppress other shortcuts
	if ((window.event) && 
		((bAltKey && iKeyCode == KEY_CODE_RIGHT_ARROW) ||
		(bAltKey && iKeyCode == KEY_CODE_LEFT_ARROW) || 
		(bShiftKey && iKeyCode == KEY_CODE_F10)) ) {
		
		window.event.cancelBubble = true;
		window.event.returnValue = false;
		return;
	}
	// some key codes require window.event.keycode to be reset
	if ((window.event) && 
		((bAltKey && iKeyCode == KEY_CODE_HOME) || 
		((iKeyCode == KEY_CODE_BACKSPACE) && ((sTagName != "input") && (sTagName != "textarea"))) ||
		(bCtrlKey && iKeyCode == KEY_CODE_TAB) ||
		(bCtrlKey && bShiftKey && iKeyCode == KEY_CODE_TAB) ||
		(iKeyCode == KEY_CODE_F6) || 
		(bCtrlKey && iKeyCode == KEY_CODE_O) ||
		(bCtrlKey && iKeyCode == KEY_CODE_L) ||
		(bCtrlKey && iKeyCode == KEY_CODE_N) ||
		(bCtrlKey && iKeyCode == KEY_CODE_E) ||
		(bCtrlKey && iKeyCode == KEY_CODE_I) ||
		(bCtrlKey && iKeyCode == KEY_CODE_H)) ) {
			
		window.event.keyCode = KEY_CODE_SPACE;
		window.event.cancelBubble = true;
		window.event.returnValue = false;
		return;
	}
		 
	// Override the F1 key
	if (window.event && iKeyCode == KEY_CODE_F1) {
		window.event.keyCode = KEY_CODE_SPACE;
		window.event.cancelBubble = true;
		window.event.returnValue = false;
		// Open the help window
	}

	// Handle the Enter key to pick up a default button
	if (window.event && iKeyCode == KEY_CODE_ENTER) {
		var objInputFlds = document.all.tags("INPUT");
		if (objInputFlds != null) {
			for (var i = 0; i < objInputFlds.length; i++) {
				if (objInputFlds[i].defaultAction == "true") {
					event.returnValue=false;
					event.cancel = true;
					objInputFlds[i].focus();
					objInputFlds[i].click();
					break;
				}
			}
		}	
	}

	// Handle the Escape key to pick up a cancel button
	if (window.event && iKeyCode == KEY_CODE_ESC) {
		var objInputFlds = document.all.tags("INPUT");
		if (objInputFlds != null) {
			for (var i = 0; i < objInputFlds.length; i++) {
				if (objInputFlds[i].defaultCancel == "true") {
					event.returnValue=false;
					event.cancel = true;
					objInputFlds[i].focus();
					objInputFlds[i].click();
					break;
				}
			}
		}	
	}
}
// handle keypress validation
function keyPress(e) {
	//catch e for non ie browsers and event for ie
	if (!window.event.srcElement) {
		return true;
	}

	// deal with any text transform
	if (window.event.srcElement.textTransform) {
		switch (window.event.srcElement.textTransform.toLowerCase()) {
			case "lowercase":
				var vString  = String.fromCharCode(window.event.keyCode).toLowerCase();
				window.event.keyCode = vString.charCodeAt(0);
				break;
				
			case "uppercase":
				var vString  = String.fromCharCode(window.event.keyCode).toUpperCase();
				window.event.keyCode = vString.charCodeAt(0);
				break
				
			case "propercase":
				window.event.srcElement.value = capitalize(window.event.srcElement.value);
				break;
		}
	}

	// deal with any key press validation
	if (window.event.srcElement.textBoxStyle) {
		switch (window.event.srcElement.textBoxStyle.toLowerCase()) {
			case "longasstring":
			case "long":
			case "integerasstring":			
			case "integer":
				checkValidKeyPress(CHECK_AGAINST_INTEGER);
				break;
			
			case "decimal":
				checkValidKeyPress(CHECK_AGAINST_DECIMAL);
				
				// only allow single decimal
				if((window.event.srcElement.value.indexOf(".") != -1) && (window.event.keyCode == 46)) {
					window.event.returnValue = false;
				}
				break;
			
			case "alphanumeric":
				checkValidKeyPressRegEx(CHECK_AGAINST_ALPHANUMERIC_RE);
				break;
			
			case "date":
				checkValidKeyPress(CHECK_AGAINST_DATE);
				break;
			
			case "time":
				checkValidKeyPress(CHECK_AGAINST_TIME);
				
				// only allow single colon
				if((window.event.srcElement.value.indexOf(":") != -1) && (window.event.keyCode == 58)) {
					window.event.returnValue = false;
				}
				break;
			
			case "postcode":
				checkValidKeyPress(CHECK_AGAINST_POSTCODE);
				
				// only allow single space
				if((window.event.srcElement.value.indexOf(" ") != -1) && (window.event.keyCode == 32)) {
					window.event.returnValue = false;
				}
				break;
				
		}
	}

	return true;
}

// check keystroke is appropriate for validation specified
function checkValidKeyPress(checkType) {
	if(checkType.indexOf(String.fromCharCode(window.event.keyCode)) == -1) {
		window.event.returnValue = false;
	}
}

function checkValidKeyPressRegEx(checkType)
{
	var s = String.fromCharCode(window.event.keyCode)
	if (s != s.match(checkType))
	{
		window.event.returnValue = false;
	}
}

// validate that for form is ok to save
// if so, turn off check for changes...
function validate() 
{
	if (validateForm())
	{
		// try to call a local page validation routine (may not exist)
		try
		{
			if (!localValidate())
			{
				return false;
			}
		}
		catch (e) {}
		return true;
	}
	return false;
}

// check to see if there are outstanding changes before unloading page
function checkUnload() {
	if (bCheckForChanges && document.frmMain.txtFormHash != null) {
		//alert("(s)" + document.frmMain.txtFormHash.value + "\n\n" + "(e)" + getHashedForm())
		if (document.frmMain.txtFormHash.value != getHashedForm()) {
			return "You have made changes which have not been saved.\nYou will lose these changes if you leave this screen.";
		}
	}
	// close any child windows that have been opened...
	if (windowReference != null && !windowReference.closed)
		windowReference.close();
	showPleaseWait(true);
}


// Gets a hashed value of the form fields
function getHashedForm() {
	var objForm = document.frmMain;
	var objInputFlds = objForm.tags("INPUT");
	var objSelectFlds = objForm.tags("SELECT");
	var objTextAreas = objForm.tags("TEXTAREA");
	var objField;
	var sHash = "";
	var SEPARATOR = "-"
	
	// Add the field data
	if (objInputFlds != null) {
		for (var i = 0; i < objInputFlds.length; i++) 
		{
			objField = objInputFlds[i];
			if (objField.noChangeCheck == null)
			{			
				if (objField.type == "hidden")
				{	
					if (objField.hiddenChangeCheck == "true")
					{
						sHash += objField.value + SEPARATOR;
					}
				}
			
				if (objField.type == "text") 
				{
					sHash += objField.value + SEPARATOR;
				}
				else if (objField.type == "checkbox" || objField.type == "radio") 
				{
					sHash += objField.checked + SEPARATOR;
				}
			}
		}
	}

	// Add the select fields
	if (objSelectFlds != null) {
		for (var i = 0; i < objSelectFlds.length; i++) {
			if (objSelectFlds[i].noChangeCheck == null) {
				// If multiple selection.
				if (objSelectFlds[i].size != 0){
					for (var j = 0; j < objSelectFlds[i].options.length; j++){
						sHash += objSelectFlds[i].options[j].value + objSelectFlds[i].id + SEPARATOR;
					} 
				}
				else
						sHash += objSelectFlds[i].value + SEPARATOR;
			}
		}
	}

	// Add the textareas
	if (objTextAreas != null) {
		for (var i = 0; i < objTextAreas.length; i++) {
			if (objTextAreas[i].noChangeCheck == null) {
				// remove CRLF
				var reg = new RegExp("\r\n{0,}");
				var singleLine = objTextAreas[i].value
				while (singleLine != singleLine.replace(reg, ""))
				{
					singleLine = singleLine.replace(reg, "")
				}
				sHash += singleLine + SEPARATOR;
			}
		}
	}
	
	return sHash;
}

function capitalize(inputString) {

	if (inputString.length == 0) {
		return "";
	}

	// space followed by any single alphabetic character
	var regExpr = / [a-zA-Z]/g;
	
	// get the first character and convert it
	var firstChar = inputString.substr(0,1).toUpperCase();
	
	// convert the string to lower case
	var outputString = inputString.toLowerCase();
	
	// get all matches
	outputString = outputString.replace(regExpr, function($0) {return(arguments[0].toUpperCase());});
	
	// pre-pend the matches with the first char
	outputString = firstChar + outputString.substr(1);

	return outputString;
}

// show mouseover text
function showMouseOver(bShow) {
	var sText = "";
	var objMouseOver = window.event.srcElement;
	var iLeftPos, iTopPos, iWindowWidth, iWindowHeight;

	// Drill up the hierarchy to find the ToolTip property
	try {
		while (!objMouseOver.ToolTip) {
			objMouseOver = objMouseOver.parentElement;
		}					
	}
	catch (e) {
		return;
	}
		
	if (bShow) {
		sText = objMouseOver.ToolTip;
	}

	with (document.all.divMouseOver) {
		if (sText != "") {	
		
			innerHTML = sText;
			style.display = "inline";
			
			// Offset by 5 pixels to avoid mouse	
			iLeftPos = window.event.clientX + 5;
			iTopPos = window.event.clientY + 5;
			
			iWindowWidth = document.body.offsetWidth;
			iWindowHeight = document.body.offsetHeight;
			if (clientWidth <= iWindowWidth && ((clientWidth + iLeftPos) > iWindowWidth)) {
				iLeftPos -= ((clientWidth + iLeftPos) - iWindowWidth) + 5;
			}
			
			if (clientHeight <= iWindowHeight && ((clientHeight + iTopPos) > iWindowHeight)) {
				iTopPos -= ((clientHeight + iTopPos) - iWindowHeight) + 5;
			}
			style.top = iTopPos + "px";
			style.left = iLeftPos + "px";
		}
		else {
			style.display = "none";
		}
	}
}

// show wait message
function showPleaseWait(bShow) {
    var waitMessage = document.getElementById("pleasewait");
    if (bShow) {
		waitMessage.style.visibility = 'visible';
	}
	else {
		waitMessage.style.visibility = 'hidden';
	}
}


// encode string for HTML
function encodeHTML(sString) {
	sString = encodeQuote(sString);
	sString = encodeLessThan(sString);
	sString = encodeGreaterThan(sString);
	return sString;
}

// encode quotes
function encodeQuote(sString) {
	var objPattern;

	if (sString.length > 0) {
		if (arguments.length == 2 && arguments[1] == true) {
			objPattern = /&quot;/g;
			return sString.replace(objPattern, '"');
		}
		objPattern = /"/g;
		return sString.replace(objPattern, '&quot;');
	}
	return sString;
}

// encode commas
function encodeComma(sString, bDecode) {
	var objPattern;

	if (sString.length > 0) {
		if (bDecode) {
			objPattern = /%2C/g;
			sString = sString.replace(objPattern, ",");
		}
		else {
			objPattern = /\,/g;
			sString = sString.replace(objPattern, "%2C");
		}
	}
	
	return sString;
}

// encode less than symbol
function encodeLessThan(sString) {
	var objPattern;

	if (sString.length > 0) {
		if (arguments.length == 2 && arguments[1] == true) {
			objPattern = /&lt;/g;
			return sString.replace(objPattern, '<');
		}
		objPattern = /</g;
		return sString.replace(objPattern, '&lt;');
	}
	return sString;
}


// encode greater than symbol
function encodeGreaterThan(sString) {
	var objPattern;

	if (sString.length > 0) {
		if (arguments.length == 2 && arguments[1] == true) {
			objPattern = /&gt;/g;
			return sString.replace(objPattern, '>');
		}
		objPattern = />/g;
		return sString.replace(objPattern, '&gt;');
	}
	return sString;
}

// return the value for a query string parameter
function getQueryStringParameter(sParam) {
	var objRegExp = eval("new RegExp('" + sParam + "=[^&]*', 'i');");
	var objMatches = window.location.href.match(objRegExp);
	
	if (objMatches != null) {
		var objRegExp = new RegExp('=.*$', 'i')
		return objMatches[0].match(objRegExp)[0].substr(1);
	}
	else {
		return "";
	}
}
