function Body_Onload()
{
	includeScript('Scripts/LoadGUIControls.js');
	includeScript('Scripts/LanguageConverter.js');
	includeScript('Scripts/pngfix.js');
	
	// Initialise the menus
	initialiseMenus();
	
	// Open current menus.
	var eCurrentMenus = document.getElementById('CurrentMenus');
	if (eCurrentMenus == null && document.getElementsByName('CurrentMenus').length > 0)
		eCurrentMenus = document.getElementsByName('CurrentMenus')[0];
	if (eCurrentMenus != null && eCurrentMenus.value != '')
		openMenus(eCurrentMenus.value);
	
	// Set focus on first control.
	var eFirstControl = document.getElementById('FirstControl');
	if (eFirstControl != null && eFirstControl.value != '')
		document.getElementById(eFirstControl.value).focus();
	else
		focusOnNextControl(null);
	
	// Display message when page loaded.
	var eMessage = document.getElementById('Message');
	var bIsInformationMessage = false;
	if (eMessage != null && eMessage.innerHTML != '')
		if (eMessage.className == 'InformationMessage')
			bIsInformationMessage = true;
		else
			alert(eMessage.innerHTML);
	
	// If openned from another window.
	if (window.opener != null && window.opener.closed == false)
	{
		var eOptionValue = document.getElementById('OptionValue');
		if (eOptionValue != null)
		{
			var sOptionValue = eOptionValue.value;
			if (sOptionValue != '')
			{
				// make sure the openoptionurl of the current "select" control matches this windows url.
				var sOpenOptionURL = window.opener.getSelectOpenOptionURL(null);
				var sHref = window.location.href;
				if (sOpenOptionURL != '' && sHref.substring(sHref.length - sOpenOptionURL.length) == sOpenOptionURL)
				{
					//close and update parent
					window.close();
					window.opener.loadSelectOption(null, sOptionValue);
					return;
				}
			}
		}
		window.opener.setSelectOpenOptionFilter(window);
	}
	
	// Set forms to check if valid on submitting.
	for (i = 0; i < document.forms.length; i++)
		document.forms.item(i).onsubmit = isFormValid;
	
	// Redirect when page loaded.
	var eRedirect = document.getElementById('Redirect');
	if (eRedirect != null && eRedirect.value != '')
	{
		var eBody = document.getElementsByTagName('body')[0];
		if (navigator.userAgent.toLowerCase().indexOf("msie") != -1)
			eBody.disabled = true;
		else
			disableChildControls(eBody);
		if (window.navigate)  
			setTimeout('window.navigate(\'' + eRedirect.value.replace(/\\/g,'\\\\').replace(/\'/g, '\\\'') + '\')', (bIsInformationMessage == true) ? 5000 : 0);
		else 
			setTimeout('window.location = \'' + eRedirect.value.replace(/\\/g,'\\\\').replace(/\'/g, '\\\'') + '\'', (bIsInformationMessage == true) ? 5000 : 0);
	}
}

function submitChangesFirst(sFormID, sURL, bAsk)
{
	var bSave = true;
	if (bAsk == true)
		bSave = confirm('Would you like to submit changes first?');
	if (bSave == true)
	{
		document.getElementById('RedirectURL').value = sURL;
		document.getElementById(sFormID).submit();
		return true;
	}
	else
		return !confirm('Would you like to proceed without saving?');
}

function isFormValid(e)
{
	var eForm;
	if (window.event) // IE
		eForm = window.event.srcElement;
	else
		eForm = e.target;

	for (var i = 0; i < eForm.elements.length; i++)
	{
		var eControl = eForm.elements[i];
		if (eControl.getAttribute('required') != null && eControl.getAttribute('required').toLowerCase() == 'true' && eControl.value == '')
		{
			alert('A value is required for ' + getControlDisplayName(eControl.name) + '.');
			eControl.focus();
			return false;
		}
		if (eControl.value != '')
			if (eControl.getAttribute('valuetype') == 'EmailAddress')
			{
				if (isEmailAddressValid(eControl.value) == false)
				{
					alert(getControlDisplayName(eControl.name) + ' is invalid.');
					eControl.focus();
					return false;
				}
			}
	}
	var aDivs = document.getElementsByTagName('div');
	for (var i = 0; i < aDivs.length; i++)
	{
		var eDiv = aDivs[i];
		if (eDiv.className == 'FormLinkingForeignCollectionControl' && eDiv.getAttribute('required') != null && eDiv.getAttribute('required').toLowerCase() == 'true')
		{
			var bHasValueSelected = false;
			var aControls = eDiv.getElementsByTagName('input');
			for (var j = 0; j < aControls.length; j++)
			{
				bHasValueSelected = aControls[j].checked;
				if (bHasValueSelected == true)
					break;
			}
			if (bHasValueSelected == false)
			{
				alert('A value is required for ' + getControlDisplayName(eDiv.id) + '.');
				eDiv.focus();
				return false;
			}
		}
	}
	
	// Launch the upload bar if required.
    return launchUploadBar(eForm);
}


function isEmailAddressValid(sEmailAddress)
{
	var rEmailFormat = /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
	return rEmailFormat.test(sEmailAddress);
}


function focusOnNextControl(eControl)
{
	var bNext = (eControl == null || eControl.id == '');
	for (i = 0; i < document.forms.length; i++)
	{
		var eForm = document.forms.item(i);
		for (j = 0; j < eForm.elements.length; j++)
		{
			var eElement = eForm.elements.item(j);
			if (bNext == true)
			{
				if ((eElement.tagName.toLowerCase() != 'input' || eElement.type.toLowerCase() != 'hidden') && eElement.style.display != 'none' && eElement.style.visibility != 'hidden')
				{
					try
					{
						eElement.focus();
						return;
					}
					catch(e)
					{
						// Skip
					}
				}
			}
			else
				bNext = (eControl.id == eElement.id);
		}
	}
}

function disableChildControls(eElement)
{
	for (var i = 0; i < eElement.childNodes.length; i++) {
		var eControl = eElement.childNodes[i];
		try {
			eControl.disabled = true;
		} catch (e) {}
		disableChildControls(eControl);
	}
}

function setCookie(sName, sValue, iExpiryDays)
{
	var dExpiry = new Date();
	dExpiry.setDate(dExpiry.getDate() + iExpiryDays);
	document.cookie = sName + '=' + escape(sValue) + ((iExpiryDays == null) ? '' : ';expires=' + dExpiry.toGMTString());
}


function getCookie(sName)
{
	if (document.cookie.length > 0)
	{
		iStartPosition = document.cookie.indexOf(sName + '=');
		if (iStartPosition != -1)
		{ 
			iStartPosition = iStartPosition + sName.length + 1;
			iEndPosition = document.cookie.indexOf(';', iStartPosition);
			if (iEndPosition == -1)
				iEndPosition = document.cookie.length;
			return unescape(document.cookie.substring(iStartPosition, iEndPosition));
		}
	}
	return '';
}


function getControlDisplayName(sName)
{
	if (sName.substring(sName.length - 8, sName.length) == '_Control')
		return spaceName(sName.substring(0, sName.length - 8));
	else
		return spaceName(sName);
}


function spaceName(sName)
{
	// to be written: put spaces before capitals
	return sName;
}


var sBrowserLanguage = null;
function getBrowserLanguage()
{
	if (sBrowserLanguage == null)
	{
		var aElements = document.getElementsByName('browser-language');
		if (aElements != null)
			sBrowserLanguage = aElements[0].attributes.getNamedItem('content').value;
		else if (navigator.language)
			sBrowserLanguage = navigator.language.toLowerCase();
		else if (navigator.userLanguage)
			sBrowserLanguage = navigator.userLanguage.toLowerCase();
		else if (navigator.systemLanguage)
			sBrowserLanguage = navigator.systemLanguage.toLowerCase();
		else if (navigator.browserLanguage)
			sBrowserLanguage = navigator.browserLanguage.toLowerCase();
	}
	return sBrowserLanguage;
}


// This will close sub menus and set events
// They are initially openned due to SEO
function initialiseMenus()
{
	var aMenus = document.getElementsByTagName('ul');
	for (var i = aMenus.length - 1; i >= 0; i--) // in reverse due to IE not closing properly
	{
		var eMenu = aMenus.item(i);
		if (eMenu.className.split(' ').indexOf('Menu') >= 0)
		{
			var eParentItem = eMenu.parentNode;
			if (eParentItem.tagName.toLowerCase() == 'li')
			{
				var aClassNames = eParentItem.className.split(' ');
				if (aClassNames.indexOf('Item') >= 0)
				{
					if (aClassNames.indexOf('ToggleSubMenu') >= 0)
						eParentItem.onclick = toggleSubMenu;
					else
					{
						eParentItem.onmouseover = new Function('openSubMenu(this);');
						eParentItem.onmouseout = new Function('closeSubMenu(this);');
					}
				}
			}
		}
	}
}

// This will open the passed menus
function openMenus(sMenus)
{
	var aMenus = sMenus.split(';');
	for (var iMenu = 0; iMenu < aMenus.length; iMenu++)
	{
		var aSubMenus = aMenus[iMenu].split('.');
		var eSubMenu = document.getElementById(aSubMenus[0]).childNodes[0];
		for (var iSubMenu = 1; iSubMenu < aSubMenus.length; iSubMenu++)
		{
			var sSubMenuClassName = aSubMenus[iSubMenu];
			var aItems = eSubMenu.childNodes;
			for (var iItem = 0; iItem < aItems.length; iItem++)
			{
				var eItem = aItems[iItem];
				var aClassNames = eItem.className.split(' ');
				if (aClassNames.indexOf(sSubMenuClassName) >= 0 && aClassNames.indexOf('HasSubMenu') >= 0)
				{
					openSubMenu(eItem);
					eSubMenu = eItem.getElementsByTagName('ul').item(0);
					break;
				}
			}
		}
	}
}


function openSubMenu(eItem)
{
	var eSubMenu = eItem.getElementsByTagName('ul').item(0);
	eSubMenu.className = eSubMenu.className.replace(' Closed', ' Opened');
}


function closeSubMenu(eItem)
{
	var eSubMenu = eItem.getElementsByTagName('ul').item(0);
	eSubMenu.className = eSubMenu.className.replace(' Opened', ' Closed');
}


function toggleSubMenu(e)
{
	var eItem = getEventTarget(e);
	var eSubMenu = eItem.getElementsByTagName('ul').item(0);
	var bIsOpen = (eSubMenu.className.indexOf(' Closed') == -1);
	eSubMenu.className = eSubMenu.className.replace((bIsOpen)?' Opened':' Closed', (bIsOpen)?' Closed':' Opened');
	stopEventPropagation(e);
}


function stopEventPropagation(e)
{
	if (!e)
		var e = window.event;
	if (e.stopPropagation)
		e.stopPropagation();
	else
		e.cancelBubble = true;
}


function getEventTarget(e)
{
	var targ;
	if (!e)
		e = window.event;
	if (e.target)
		targ = e.target;
	else if (e.srcElement)
		targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	return targ;
}


function toggleRecordSelectors()
{
	var bChecked = document.getElementById('RecordSelectorToggler').checked;
	var aInputs = document.getElementsByTagName('input');
	for (var i = 0; i < aInputs.length; i++)
	{
		var oRecordSelector = aInputs[i];
		if (oRecordSelector.type == 'checkbox')
			if (oRecordSelector.id != null)
				if (oRecordSelector.id != 'RecordSelectorToggler')
					if (oRecordSelector.id.substring(0, 14) == 'RecordSelector')
						oRecordSelector.checked = bChecked;
	}
}


function selectedRecords()
{
	var aInputs = document.getElementsByTagName('input');
	var sRecords = '';
	for (var i = 0; i < aInputs.length; i++)
	{
		var oRecordSelector = aInputs[i];
		if (oRecordSelector.type == 'checkbox')
			if (oRecordSelector.id != null)
				if (oRecordSelector.id != 'RecordSelectorToggler')
					if (oRecordSelector.id.substring(0, 14) == 'RecordSelector')
						if (oRecordSelector.checked == true)
						{
							if (sRecords != '')
								sRecords += ',';
							sRecords += oRecordSelector.id.substring(14);
						}
	}
	return sRecords;
}


function addEvent(fFunction, fFunctionToAdd)
{   
	if (typeof fFunction != 'function')
		return fFunctionToAdd;
	else if (typeof fFunctionToAdd != 'function') 
		return fFunction;
	else
		return function(e) {fFunction(e); fFunctionToAdd(e);}
}


function includeScript(sPath)
{
    var eHead = document.getElementsByTagName('head').item(0);
    var eScript = document.createElement('script');
    eScript.setAttribute('language', 'javascript');
    eScript.setAttribute('type', 'text/javascript');
    eScript.setAttribute('src', sPath);
    eHead.appendChild(eScript);
    return false;
}


function includeStyleSheet(sPath)
{
    var eHead = document.getElementsByTagName('head').item(0);
    var eLink = document.createElement('link');
    eLink.setAttribute('type', 'text/css');
    eLink.setAttribute('rel', 'stylesheet');
    eLink.setAttribute('href', sPath);
    eHead.appendChild(eLink);
    return false;
}


function loadXMLString(sURL)
{
	// returns text result of call to URL
	var oXML;
	if (window.ActiveXObject)
	{
		oXML = new ActiveXObject('Microsoft.XMLDOM');
		oXML.async = false;
		oXML.load(sURL);
		return oXML.xml;
	}
	else
	{
		var oXMLHttpRequest = getXMLHttpRequest();
		oXMLHttpRequest.open('GET', sURL, false);
		oXMLHttpRequest.send('');
		if (oXMLHttpRequest.status == 200)
			return oXMLHttpRequest.responseText;
		else
			throw 'Unable to retrieve information from the server.';
	}
}


function loadXML(sURL)
{
	var oXML;
	if (window.ActiveXObject)
	{
		oXML = new ActiveXObject('Microsoft.XMLDOM');
		oXML.async = false;
		oXML.load(sURL);
	}
	else
		oXML = (new DOMParser()).parseFromString(loadXMLString(sURL), "text/xml");
	return(oXML);
}


function getXMLHttpRequest()
{
	if (window.XMLHttpRequest)
		return new XMLHttpRequest();
    else if(window.ActiveXObject)
        return new ActiveXObject('Microsoft.XMLHTTP');
    else
		throw 'Your browser is unable to retrieve information from the server.';
}


Array.prototype.indexOf = function(value)
{
	for (var i = 0; i < this.length; i++)
		if (this[i] == value)
			return i;
	return -1;
}


function getAttributeValue(eElement, sName)
{
	var a = eElement.attributes.getNamedItem(sName);
	if (a == null)
		return '';
	else
		return a.value;
}


function calculateElementTop(eElement)
{
	return eElement.offsetTop + (eElement.offsetParent == null ? 0 : calculateElementTop(eElement.offsetParent));
}


function calculateElementLeft(eElement)
{
	return eElement.offsetLeft + (eElement.offsetParent == null ? 0 : calculateElementLeft(eElement.offsetParent));
}


function getURLParameter(sName)
{
	var r = new RegExp('[\\?&]' + sName + '=([^&#]*)');
	var aResults = r.exec(window.location.href);
	if( aResults == null )
		return '';
	else
		return unescape(aResults[1]);
}


function getInnerText(eElement)
{
	if (typeof eElement.textContent != 'undefined')
		return eElement.textContent;
	else
		return eElement.innerText;
}

function generateShortUid()
{
    var result, i, j;
    result = '';
    for(j=0; j<8; j++)   {
        i = Math.floor(Math.random()*16).toString(16).toUpperCase();
        result = result + i;
    }
    return result
}


var meSubmitForm;
var msSubmitFormOrigAction;
var meAddedUploadDiv;

function launchUploadBar(eForm) {

// Look for all the File Input elements.

    var sFilenames = '';
    var aFileInputs = eForm.getElementsByTagName('input');
    var eBody = document.getElementsByTagName('body')[0];
   
    if (aFileInputs != null) {
        var HasFileInputs = 0;
	    for (var i = 0; i < aFileInputs.length; i++)   {
		    var eInput = aFileInputs[i];
		    if (eInput.type == 'file') {
		        if (eInput.value != '') {
		            HasFileInputs = 1;
		            if (sFilenames != '') {
		                sFilenames = sFilenames + ', ';
		            }
	                var nLastBackslash = eInput.value.lastIndexOf('\\');
	                var sNameOnly = eInput.value.substring(nLastBackslash+1);
	                sFilenames += escape(sNameOnly);
			    }
		    }
	    }
	    if (HasFileInputs) {
            meSubmitForm = eForm; // aForms[0];
            msSubmitFormOrigAction = meSubmitForm.action;
            var uid =  generateShortUid();
            meSubmitForm.action = msSubmitFormOrigAction + '&PageUid=' + uid;

            removeUploadDiv();
            var sOpenURL ='UploadStatus.aspx?PageUid=' + uid + '&Files=' + sFilenames;	 
            var aUploadDiv = document.createElement('div');
            aUploadDiv.setAttribute('id','UploadDisplay');
            // Use inner HTML since any other technique produces a inset frame in IE.
            aUploadDiv.innerHTML = '<iframe frameborder="0" scrolling="no" height="100%" width="100%" src="' + sOpenURL + '"/>';
            eBody.insertBefore(aUploadDiv, eBody.childNodes[0]);
            meAddedUploadDiv = document.getElementById('UploadDisplay');
			// Don't submit now: submit in 1000ms so the GUI has time to draw the new elements.
            setTimeout('submitForm()',1000);
            // return false so the form is not submitted by the Submit button, but by the submitForm() code instead.
            return false;
        } else {
            return true;
        }
	}
    return true;
}


function removeUploadDiv()
{
    if (meAddedUploadDiv != null) {
        meAddedUploadDiv.parentNode.removeChild(meAddedUploadDiv);
        meAddedUploadDiv = null;
    }
}


function submitForm() {
    meSubmitForm.submit();
	// Restore the URL.
	meSubmitForm.action = msSubmitFormOrigAction;
}
