﻿window.onload = setInitialFormHash;
window.onbeforeunload = checkUnload;
//window.onbeforeunload = showWait;
document.onkeypress = keyPress;
document.onkeydown = keyDown;
//document.oncontextmenu = contextMenu;
document.onhelp	= cancelHelp;
document.onmouseover = showToolTip;
document.onmouseout = hideToolTip;

// 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 CHECK_AGAINST_EMAIL = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@_-.";
var GLOB_CANCEL_VALIDATION = "cancel~validation";

var checkChanges = true;
var initialFormHash = "";

// supress IE help
function cancelHelp() 
{
	return false;
}

function beep() 
{
	try
	{
		document.all.beep.src = "WebResource.axd?d=ausL4HtVRB2fhlK9vGPwgEsiI3J5o75P0A0i_3cdydP0Fepbg0hk9qaM_rLxqiWtbuAFK--29Uq4g52_WQ7mTw2&t=634078762991926111";
	}
	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_F6 = 117;
	var KEY_CODE_F10 = 121;
	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_TAB = 9;
	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 KEY_CODE_DECIMAL = 46;
	var KEY_CODE_COLON = 58;
	var KEY_CODE_AT = 64;

	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() 
{
	if (!window.event.srcElement) 
	{
		return true;
	}

	var KEY_CODE_ESC = 27;
	var KEY_CODE_DECIMAL = 46;
	var KEY_CODE_COLON = 58;
	var KEY_CODE_AT = 64;

	// 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 "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 == KEY_CODE_DECIMAL)) 
				{
					window.event.returnValue = false;
				}
				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 == KEY_CODE_COLON)) 
				{
					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 == KEY_CODE_SPACE)) 
				{
					window.event.returnValue = false;
				}
				break;
				
			case "email":
				checkValidKeyPress(CHECK_AGAINST_EMAIL);
				
				// only allow single @
				if((window.event.srcElement.value.indexOf("@") != -1) && (window.event.keyCode == KEY_CODE_AT)) 
				{
					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 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;
}

function checkUnload()
{
    if (!checkChanges)
    {
        showWait();
        return;
    }

    if (initialFormHash != getHashedForm())
    {
        //alert("Initial:\n" + initialFormHash + "\nCurrent:\n" + getHashedForm())
        return "You have made changes which have not yet been saved.  If you continue these changes will not be saved.";
    }
}

function setInitialFormHash()
{
    initialFormHash = getHashedForm();
}

// Gets a hashed value of the form fields
function getHashedForm()
{
    var objForm = document.forms[0];
    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.CheckChanges == "true")
            {
                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].CheckChanges == "true")
            {
                // 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].CheckChanges == "true")
            {
                sHash += objTextAreas[i].innerText + SEPARATOR;
            }
        }
    }

    return sHash;
}

// show mouseover text
function showToolTip() 
{
    // divToolTip is set up in the master page
    try
    {
	    var tooltip = "";
        var control = window.event.srcElement;

        // Drill up the hierarchy to find the ToolTip property
        while (!control.ToolTip) 
        {
	        control = control.parentElement;
        }					
	    tooltip = control.ToolTip;
    	
	    with (divToolTip) 
	    {
		    if (tooltip != "") 
		    {			
			    innerHTML = tooltip;
    			
			    // Offset by 5 pixels to avoid mouse	
			    var iLeftPos = window.event.clientX + 5;
			    var iTopPos = window.event.clientY + 5;			
			    var iWindowWidth = document.body.offsetWidth;
			    var 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";
			    style.display = "inline";
			    style.position = "absolute";
		    }
		    else 
		    {
			    style.display = "none";
		    }
	    }
	}
	catch (e) {}	
}

function hideToolTip()
{
    // divToolTip is set up in the master page
    try
    {
        divToolTip.style.display = "none";
    }
    catch (e) {}
}

// show wait message
function showWait() 
{
    // waitMessageWindow is declared in master page
    try // will throw exception if page is on non-visible tab in ie7
    {
        waitMessageWindow.show(window.screen.availWidth / 2 - 16, window.screen.availHeight / 2, 32, 32);  
    }
    catch (e) {}
}

function hideWait()
{
    // waitMessageWindow is declared in master page
    try 
    {
		waitMessageWindow.hide();
    }
    catch (e) {}
}

// 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 "";
	}
}
