/*  These scripts are Copyright, Rich Harding,
		http://www.csscomputing.co.uk, 2002-2010
		You may re-use them free of charge
		as long as you retain this notice   */

// Find out what browser functionality is available:

var NN4 = document.layers? true : false; //Netscape Navigator 4.x.
var IE4 = document.all? true : false; // IE version 4 and above.
var XX7 = document.getElementById? true : false; // Up to date browsers.

// Validation types for checkForm
var FORM_TEXT = 0;               // Text Boxes
var FORM_DD = 1;                 // Drop-Downs
var FORM_RADIO = 2;              // Radio Buttons
var FORM_EMAIL = 3;              // E-Mail Addresses
var FORM_EMAIL_OPTIONAL = 6;     // E-Mail Addresses that can be omitted
var FORM_PHONE = 4;              // Phone
var FORM_PHONE_OPTIONAL = 9;     // Phone that can be omitted
var FORM_NUMBER = 5;             // Number
var FORM_NUMBER_OPTIONAL = 7;    // Number that can be omitted
var FORM_PASSWORD = 8;           // Password
var FORM_SCREEN_NAME = 10;       // Screen Name - min 6 chars
var FORM_DATE = 11;              // Date
var FORM_DATE_OPTIONAL = 12;     // Date that can be omitted
var FORM_DECIMAL = 13;           // Decimal
var FORM_CHECKBOX = 14;          // Single Check Box
var FORM_PASSWORD_OPTIONAL = 15; // Password that can be omitted
var FORM_TIME = 16;              // Time
var FORM_TIME_OPTIONAL = 17;     // Time that can be omitted
var FORM_SORTCODE = 18;          // Bank Sort Code
var FORM_DATE_YYYY = 19;         // Date (4-digit year)
var FORM_DATE_3DD = 20;          // Three-DD Date - remember it's mm/dd/yyyy
var FORM_POSTCODE = 22;          // Post Code
var FORM_POSTCODE_AUS = 23;      // Number - 4 digits or can be omitted
var FORM_PHONE_9 = 24;           // Phone - minimum 9 digit
var FORM_DYNAMIC_SELECT = 25;    // 
var FORM_YEAR = 26;              // Year. 4 digits.
var FORM_INTEGER = 27;           // Integer
var FORM_DATE_3DD_OPTIONAL = 28; // Three-DD Date that can be omitted - remember it's mm/dd/yyyy
var FORM_POSTCODE_OPTIONAL = 29; // Post Code that may be omitted
var FORM_INTEGER_NONZERO = 30;   // Integer that may not be zero

function arraySortCheck(aIn) {
	aIn.sort();
	for (i=0; i<aIn.length; i++) {
		alert(aIn[i][0] + ' ' + aIn[i][1]);
	}
}

function checkFile(lFileCount) {
	if (lFileCount==null || lFileCount=="") {
		lFileCount = 6;
	}
	blnPass = true;
	lngCount = 0;
	var strTest;
	strMsg = 'You must choose at least one file to upload!';
	for (j=3;j<=(lFileCount + 2);j++) {
		iPos = 0;
		strTest = document.frmUpload.elements[j].value
		if (strTest != '') {
			lngCount++;
			for (l=0;l<strTest.length;l++) {
				if (strTest.charCodeAt(l) == 92) {
					iPos = l
				}
			}
			strTest = strTest.slice(iPos + 1);
			if (!validFileChars(strTest)) { // <
				strMsg = 'Filename ' + (j - 2) + ' can only contain a-z, A-Z, 0-9, underscore and a single full stop before the file extension (does not apply to the preceding directory structure).'
				document.frmUpload.elements[j].select();
				document.frmUpload.elements[j].focus();
				blnPass = false
				break;
			}
		}
	}
	if (blnPass && (lngCount > 0)) {
		alert('This process can take some time for large files. Please be patient and do not click Upload File(s) more than once. Thanks.')
		document.frmUpload.submit();
	}
	else {
		alert(strMsg);
	}
}

// Use global variable to allow determination of success/failure:
var bCheckFormPassed = false;

function checkForm(form, bSubmit) {
	var dF = form;
	sAlert = ''

	// Allow checking of form with no submission:
	if (typeof bSubmit == 'undefined') {
		bSubmit = true;
	}

	// Allow the three checking arrays to be properties of the form:
	if (typeof dF.arrAlert == 'undefined') {
		dF.arrAlert = arrAlert;
	}
	if (typeof dF.arrCheck == 'undefined') {
		dF.arrCheck = arrCheck;
	}
	if (typeof dF.arrType == 'undefined') {
		dF.arrType = arrType;
	}

	// alert(dF.arrCheck[1]);
	for (i=0; i<dF.arrCheck.length; i++) {
		if (sAlert.length != 0) {
			break;
		}

		// New functionality to conditionally check against other elements:
		$bCheck = true;
		$arrCheckSplit = dF.arrCheck[i].toString().split(":");
		$iThisEle = parseInt($arrCheckSplit[0]);
		if ($arrCheckSplit.length > 1) {
			// Check the value of the answer which is being depended upon:
			$iDepEle = parseInt($arrCheckSplit[1]);
			// alert($iDepEle);
			// Get the element type (remember that radio returns undefined):
			switch (dF.elements['answer' + $iDepEle].type) {
			case undefined:
				$strEleType = dF.elements['answer' + $iDepEle][0].type;
				break;
			default:
				$strEleType = dF.elements['answer' + $iDepEle].type;
				break;
			}
			switch ($strEleType) {
			case "radio":
				for (e=0;e<dF.elements['answer' + $iDepEle].length;e++) {
					if (dF.elements['answer' + $iDepEle][e].checked == true) {
						if (dF.elements['answer' + $iDepEle][e].value != 1) {
							$bCheck = false;
							break;
						}
					}
				}
				break;
			default:
				break;
			}
		}

		// Debug:
		// alert(dF.elements[$iThisEle].name + ': ' + dF.elements[$iThisEle].value);

		if ($bCheck) {
			switch (dF.arrType[i]) {
			case FORM_TEXT:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				break;
			case FORM_DD:
				if (dF.elements[$iThisEle].length != 0) {
					if (dF.elements[$iThisEle][dF.elements[$iThisEle].selectedIndex].value == 0) {
						iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
					}
				}
				break;
			case FORM_RADIO:
				if (dF.elements[$iThisEle].checked == false && dF.elements[$iThisEle + 1].checked == false) {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				break;
			case FORM_EMAIL:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validEmail(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = 'dummy';
				}
				break;
			case FORM_PHONE:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validTel(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = 'dummy';
				}
				break;
			case FORM_NUMBER:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (isNaN(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = dF.arrAlert[i] + SITE_NUMBER;
				}
				break;
			case FORM_EMAIL_OPTIONAL:
				if (dF.elements[$iThisEle].value != '') {
					if (!validEmail(dF.elements[$iThisEle].value)) {
						iAlert = $iThisEle; sAlert = 'dummy';
					}
				}
				break;
			case FORM_NUMBER_OPTIONAL:
				if (isNaN(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = dF.arrAlert[i] + SITE_NUMBER;
				}
				break;
			case FORM_PASSWORD:
				if (dF.elements[$iThisEle].value != dF.elements[$iThisEle+1].value) {
					iAlert = $iThisEle; sAlert = SITE_PASSWORD1;
				}
				if (!validPass(dF.elements[$iThisEle].value,dF.elements[$iThisEle+1].value)) {
					iAlert = $iThisEle; sAlert = SITE_PASSWORD2;
				}
				break;
			case FORM_PHONE_OPTIONAL:
				if (dF.elements[$iThisEle].value != '') {
					if (!validTel(dF.elements[$iThisEle].value)) {
						iAlert = $iThisEle; sAlert = 'dummy';
					}
				}
				break;
			case FORM_SCREEN_NAME:
				if (!validScreen(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = SITE_SCREEN;
				}
				break;
			case FORM_DATE:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validDateNew(dF.elements[$iThisEle].value,2)) {
					iAlert = $iThisEle; sAlert = 'dummy';
				}
				break;
			case FORM_DATE_OPTIONAL:
				if (dF.elements[$iThisEle].value != '') {
					if (!validDateNew(dF.elements[$iThisEle].value,2)) {
						iAlert = $iThisEle; sAlert = 'dummy';
					}
				}
				break;
			case FORM_DECIMAL:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validDecimal(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = SITE_INVALID + dF.arrAlert[i] + '.';
				}
				break;
			case FORM_CHECKBOX:
				if (dF.elements[$iThisEle].checked == false) {
					iAlert = $iThisEle; sAlert = dF.arrAlert[i] + '.';
				}
				break;
			case FORM_PASSWORD_OPTIONAL:
				if (dF.elements[$iThisEle].value != '' && dF.elements[$iThisEle+1].value != '') {
					if (dF.elements[$iThisEle].value != dF.elements[$iThisEle+1].value) {
						iAlert = $iThisEle; sAlert = SITE_PASSWORD1;
					}
					if (!validPass(dF.elements[$iThisEle].value,dF.elements[dF.arrCheck[i+1]].value)) {
						iAlert = $iThisEle; sAlert = SITE_PASSWORD2;
					}
				}
				break;
			case FORM_TIME:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validTime(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = 'dummy';
				}
				break;
			case FORM_TIME_OPTIONAL:
				if (dF.elements[$iThisEle].value != '') {
					if (!validTime(dF.elements[$iThisEle].value)) {
						iAlert = $iThisEle; sAlert = 'dummy';
					}
				}
				break;
			case FORM_SORTCODE:
				if (!validSortCode(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = 'dummy';
				}
				break;
			case FORM_DATE_YYYY:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validDateNew(dF.elements[$iThisEle].value,4)) {
					iAlert = $iThisEle; sAlert = 'dummy';
				}
				break;
			case FORM_DATE_3DD:
	//			var strDate1 = new Date(dF.elements[$iThisEle + 1][dF.elements[$iThisEle + 1].selectedIndex].value + '/' + dF.elements[$iThisEle][dF.elements[$iThisEle].selectedIndex].value + '/' + dF.elements[$iThisEle + 2][dF.elements[$iThisEle + 2].selectedIndex].value + ' 00:00');
	//			var strDate2 = strDate1.toString();
	//			var strDate2_arr = strDate2.split(' ');
	//			if (parseInt(strDate2_arr[2]) - parseInt(dF.elements[$iThisEle][dF.elements[$iThisEle].selectedIndex].value) != 0) {
				if (!validDateMac(dF.elements[$iThisEle][dF.elements[$iThisEle].selectedIndex].value,dF.elements[$iThisEle + 1][dF.elements[$iThisEle + 1].selectedIndex].value,dF.elements[$iThisEle + 2][dF.elements[$iThisEle + 2].selectedIndex].value)) {
					iAlert = $iThisEle; sAlert = 'This is not a valid Date!';
				}
				break;
			case FORM_POSTCODE:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validPostcode(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				break;
			case FORM_POSTCODE_OPTIONAL:
				if (dF.elements[$iThisEle].value != '') {
					if (!validPostcode(dF.elements[$iThisEle].value)) {
						iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
					}
				}
				break;
			case FORM_POSTCODE_AUS:
				$lRequired = 0;
				$lNumLength = 4;
				if (!validNumLength(dF.elements[$iThisEle].value, $lRequired, $lNumLength)) {
					iAlert = $iThisEle; sAlert = 'dummy';
				}
				break;
			case FORM_PHONE_9:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validTel(dF.elements[$iThisEle].value, 9)) {
					iAlert = $iThisEle; sAlert = 'dummy';
				}
				break;
			case FORM_INTEGER:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validateNos(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = dF.arrAlert[i] + SITE_INTEGER;
				}
				break;
			case FORM_INTEGER_NONZERO:
				if (dF.elements[$iThisEle].value == '') {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				if (!validateNos(dF.elements[$iThisEle].value)) {
					iAlert = $iThisEle; sAlert = dF.arrAlert[i] + SITE_INTEGER;
				}
				else if (dF.elements[$iThisEle].value == 0) {
					iAlert = $iThisEle; sAlert = SITE_PLEASE_TELL + dF.arrAlert[i] + '.';
				}
				break;
			case FORM_DATE_3DD_OPTIONAL:
				if (!(dF.elements[$iThisEle][dF.elements[$iThisEle].selectedIndex].value == 'dd' && dF.elements[$iThisEle + 1][dF.elements[$iThisEle + 1].selectedIndex].value == 'mmm' && dF.elements[$iThisEle + 2][dF.elements[$iThisEle + 2].selectedIndex].value == 'yyyy')) {
					if (!validDateMac(dF.elements[$iThisEle][dF.elements[$iThisEle].selectedIndex].value,dF.elements[$iThisEle + 1][dF.elements[$iThisEle + 1].selectedIndex].value,dF.elements[$iThisEle + 2][dF.elements[$iThisEle + 2].selectedIndex].value)) {
						iAlert = $iThisEle; sAlert = 'This is not a valid Date!';
					}
				}
				break;
			}
		}
	}

	if (sAlert.length == 0) {
//		alert('Passed: Submit');
		if (bSubmit) {
			dF.submit();
		}
		else {
			bCheckFormPassed = true;
		}
	}
	else {
		if (sAlert != 'dummy') {
			alert(sAlert);
		}
		dF.elements[iAlert].focus();
		bCheckFormPassed = false;
	}
}

function checkUpload(lFileCount) {
	if (lFileCount==null || lFileCount=="") {
		lFileCount = 6;
	}
	blnPass = true;
	lngCount = 0;
	var strTest;
	strMsg = 'You must choose at least one file to upload!';
	for (i=1;i<=6;i++) {
		iPos = 0;
		strTest = document.frmUpload.elements['file' + i].value
		if (strTest != '') {
			lngCount++;
			for (l=0;l<strTest.length;l++) {
				if (strTest.charCodeAt(l) == 92) {
					iPos = l
				}
			}
			strTest = strTest.slice(iPos + 1);
			if (!validFileChars(strTest, true)) { // <
				strMsg = 'Filename ' + i + ' can only contain a-z, A-Z, 0-9, underscore and a single full stop before the file extension (does not apply to the preceding directory structure).'
				document.frmUpload.elements['file' + i].select();
				document.frmUpload.elements['file' + i].focus();
				blnPass = false
				break;
			}
			if (document.frmUpload.elements['LinkType' + i][document.frmUpload.elements['LinkType' + i].selectedIndex].value == 0) {
				strMsg = 'Please select a Type for File ' + i;
				document.frmUpload.elements['LinkType' + i].focus();
				blnPass = false
				break;
			}
		}
	}
	if (blnPass && (lngCount > 0)) {

		alert('This process can take some time for large files. Please be patient and do not click Upload File(s) more than once. Thanks.')
		document.frmUpload.submit();
	}
	else {
		alert(strMsg);
	}
}

function clearDD(eDD) {
	eDD.options.length = 0;
}

function confDel(sMsg,lID1,lID2,lStep,sStep) {
	if (sStep==null || sStep=="") {
		sStep = 'step';
	}
	if (confirm('Are you sure you want to ' + sMsg + '?')) {
		self.location ='?' + sStep + '=' + lStep + '&id=' + lID1 + '&id2=' + lID2;
	}
}

function createMail(who,what,where,why) {

	if (strWhere == '') { strWhere = MAIL_DOMAIN; }

	var strWhat = what;
	if (strWhat == '') { strWhat = 'E-Mail from ' + MAIL_SITENAME + ' Website'; }

	var strWhy = why;

	var strTo = '';
	var strCc = '';

	var strWho = who;
	if (strWho == '') {
		strTo = MAIL_WEBMASTER;
		strTo = strTo + '@' + MAIL_DOMAIN;
		strWhat = 'Incorrect mail link on website';
		strWhy = 'Please tell the webmaster where you found this link as it is incorrectly formatted.';
	}
	else {
		var lngComma = strWho.indexOf(',')
		if (lngComma > 0) {
			var strAddy = strWho.split(',');
			var strDom = strWhere.split(',');
			for (x=0;x<strAddy.length;x++) {
				if (strDom[x] == null) { strDom[x] = strDomain; }
				if (x == 0) {
					strTo = strAddy[x] + '@' + strDom[x];
				}
				else {
					if (x == 1) {
						strCc = strAddy[x] + '@' + strDom[x];
					}
					else {
						strCc = strCc + ',' + strAddy[x] + '@' + strDom[x];
					}
				}
			}
		}
		else {
			strTo = strWho + '@' + strWhere;
		}
	}

	var to = strTo;
	var cc = strCc;
	var subject = strWhat;
	var body = strWhy;
	var doc = "mailto:" + to + "?subject=" + escape(subject);
	if (cc != '') {
		doc += "&cc=" + cc;
	}
	if (body != '') {
		doc += "&body=" + escape(body);
	}
	window.location = doc;
}

function ddClear(eDD) {
	eDD.options.length = 0;
}

function ddFilter(oText, oDD) {

	// Get specified value, having checked its validity:
	if (oText.value == '') {
		return;
	}
	strTV = oText.value.toUpperCase();

	// Create Population arrays, where necessary; if one missing re-read both:
	if (typeof ddText == 'undefined' || typeof ddID == 'undefined') {
		ddID = new Array();
		ddText = new Array();
		for (i=0; i<oDD.length; i++) {
			ddID[i] = oDD[i].value;
			ddText[i] = oDD[i].text;
		}
	}

	// Check some values now available:
	if (ddText.length == 0) {
		return;
	}

	// Clear the DD:
	ddClear(oDD);

	// Repopulate the DD with values matching oText:
	for (i=0; i<ddText.length; i++) {
		if (ddText[i].toUpperCase().indexOf(strTV,0) != -1) {
			oDD.options[oDD.options.length] = new Option(ddText[i], ddID[i], false, false);
		}
	}

}

function ddInsert(lValue, sText, oDD, bSelected) {

	// Get specified value, having checked its validity:
	if (sText == '') {
		return;
	}

	// Create Population arrays from original:
	ddData = new Array();
	for (i=0; i<oDD.length; i++) {
		ddData[i] = Array(oDD[i].text, oDD[i].value);
	}

	// Check values available:
	if (ddData.length == 0) {
		return;
	}

	// Add the new value:
	ddData[ddData.length] = Array(sText, lValue);

	// Sort the array - this will sort on .text and keep .value in sync as it does so:
	ddData.sort();

	// Clear the existing values from the DD:
	ddClear(oDD);

	// Repopulate the DD with values:
	for (i=0; i<ddData.length; i++) {
		blnSelected = false;
		if (ddData[i][0] == sText) {
			blnSelected = true;
		}
		oDD.options[oDD.options.length] = new Option(ddData[i][0], ddData[i][1], false, blnSelected);
	}

}

function ddPopulate(eDD, aVals, aNames, sVal, sName, bClear) {

	// Check there are values to work with:
	if (aVals.length == 0 || aNames.length == 0) {
		return;
	}

	// Conditionally clear the existing entries:
	if (bClear) {
		ddClear(eDD);
	}

	// Iterate the names:
	for (i=0; i<aNames.length; i++) {

		// Check there is also a Value:
		if (i < aVals.length) {

			// Decide if Selected:
			bSelected = false;
			if (aNames[i] == sName) {
				bSelected = true;
			}
			if (aVals[i] == sVal) {
				bSelected = true;
			}

			// Add:
			newOpt = new Option(aNames[i], aVals[i], false, bSelected);
			eDD.options[eDD.length] = newOpt;

		}

	}
}

function filterDD(oText,oDD) {
	if (oText.value != '') {
		strTV = oText.value.toUpperCase();
		if (ddText.length > 0) {
			clearDD(oDD);
			for (i=0;i<ddText.length;i++) {
				blnAdd = false;
				switch (i) {
				case 0: // Always add:
					blnAdd = true;
					break;
				default: // Check for strTV
					if (ddText[i].toUpperCase().indexOf(strTV,0) != -1) {
						blnAdd = true;
					}
					break;
				}
				if (blnAdd) {
					oDD.options[oDD.options.length] = new Option(ddText[i], ddID[i], false, false);
				}
			}
		}
	}
}

function formatSecondsToTime(secs, format) {
	var strReturn = '';
	var hr = Math.floor(secs / 3600);
	var min = Math.floor((secs - (hr * 3600)) / 60);
	var sec = Math.floor(secs - (hr * 3600) - (min * 60));
	
	switch (format) {
	case "h n s":
		// Conditionally show hours:
		if (hr > 0) {
			strReturn += hr + 'h'; 
		}
		// Conditionally show mins:
		if (min > 0 || hr > 0) {
			strReturn += ' ' + min + 'm'; 
		}
		// Conditionally show secs:
		if (sec > 0) {
			strReturn += ' ' + sec + 's'; 
		}
		break;
	case "hh:nn":
		// Add leading zeroes:
		if (hr < 10) {hr = "0" + hr; }
		if (min < 10) {min = "0" + min;}
		strReturn = hr + ':' + min; 
		break;
	}
	return strReturn;
}

function formGetValues(oFrm) {
	
	strReturn = '';

	for (i=0; i<oFrm.elements.length; i++) {
		// alert(oFrm.elements[i].type);
		if (i > 0) {
			strReturn += '&';
		}
		switch (oFrm.elements[i].type) {
		case "hidden":
		case "text":
		case "textarea":
			strReturn	+= oFrm.elements[i].name + '=' + oFrm.elements[i].value;
			break;
		case "select-one":
			strReturn	+= oFrm.elements[i].name + '=' + oFrm.elements[i][oFrm.elements[i].selectedIndex].value;
			break;
		}
	}

	return strReturn;
}

function formSubmit(form, sParams) {
	var dF = form;
	arrParams = sParams.split("&");
	for (i=0;i<arrParams.length;i++) {
		arrParam = arrParams[i].split("=");
		// Make sure there is something to set:
		switch (arrParam.length) {
		case 2:
			// Enable change to form action:
			switch (arrParam[0]) {
			case "formaction":
				dF.action = arrParam[1];
				break;
			default:
				// alert(arrParam[0] + '=' + arrParam[1]);
				dF.elements[arrParam[0]].value = arrParam[1];
				// alert(dF.elements[arrParam[0]].value);
				break;
			}
			break;
		}
	}
	dF.submit();
}

function formUpdateTarget(frmSource, frmDest, lUpdateElementType, oUpdateElement, lClosingActionType, sClosingActionElement, bCheckForm) {

	// Check the form if requested:
	if (bCheckForm) {
		// Reset global var:
		bCheckFormPassed = false;
		checkForm(frmSource, false);
		if (!bCheckFormPassed) {
			// alert('Huh?');
			return;
		}
	}

	// Assemble the post string from the Source Form:
	strPost	= formGetValues(frmSource);
	// alert(strPost);

	// Post the string to the Destination Page:
	var xmlhttp;
	if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
		xmlhttp = new XMLHttpRequest();
	}
	else { // code for IE6, IE5
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }	
	xmlhttp.open("POST", "/common/dd_update_post.php", false);
	xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
	xmlhttp.send(strPost);
	
	// Interpret the response from the Destination Page:
	// alert(xmlhttp.responseText);
	arrReturn = xmlhttp.responseText.split(':');
	vNewValue = arrReturn[1];
	vNewText = arrReturn[0];

	// Apply the response to the Destination Form	
	switch (lUpdateElementType) {
	case 1: // Insert new value into drop-down and select it:
		ddInsert(vNewValue, vNewText, oUpdateElement, true);
		break;
	}

	// Apply closing Action:
	switch (lClosingActionType) {
	case 1: // Hide the specified DIV:
		toggleDIV(sClosingActionElement, false);
		break;
	}

}

function futureDate(year, month, day) {
	// Returns true if the supplied date is in the future. False otherwise.
	var today  = new Date();
	var date = new Date();
	date.setFullYear(year,month-1,day);	// Month is between 0 and 11.
	return date > today;
}

function getHeight() {
	if (XX7 || IE4) { iHeight = document.body.clientHeight; }
	else if (NN4) { iHeight = window.innerHeight; }
	return Math.max(iHeight,minH);
}

function getWidth() {
	if (XX7 || IE4) { iWidth = document.body.clientWidth; }
	else if (NN4) { iWidth = window.innerWidth; }
	return Math.max(iWidth, minW);
}

function getDIVHeight(divID) {
	if (XX7) { return document.getElementById(divID).offsetHeight; }
	else if (IE4) { return document.all[divID].style.height; }
	else if (NN4) { return document.layers[divID].height; }
}

function getDIVLeft(divID) {
	if (XX7) { return document.getElementById(divID).style.left; }
	else if (IE4) { return document.all[divID].style.left; }
	else if (NN4) { return document.layers[divID].left; }
}

function getDIVTop(divID) {
	if (XX7) { return document.getElementById(divID).style.top; }
	else if (IE4) { return document.all[divID].style.top; }
	else if (NN4) { return document.layers[divID].top; }
}

function getDIVWidth(divID) {
	if (XX7) { return document.getElementById(divID).offsetWidth; }
	else if (IE4) { return document.all[divID].style.width; }
	else if (NN4) { return document.layers[divID].width; }
}

function imgWindow(imgName) {

	var xPos = (screen.width - 100) / 2
	var yPos = (screen.height - 100) / 2

	imgWin = window.open('/common/imgauto.php?img=' + imgName, 'iWin', 'toolbar=no,location=no,scrollbars=yes,width=100,height=100,left=' + xPos + ',top=' + yPos)

	setTimeout('reFocus(imgWin)', '500')

}

function infoWindow(htmlFile,w,h,t) {
	var r = Math.random();
	var fN = htmlFile;
	if (fN.indexOf('?') == -1) {
		fN += '?r=' + r;
	}
	else {
		fN += '&r=' + r;
	}
	if (w==null || w=="") {
		w = 500;
	}
	if (h==null || h=="") {
		h = 500;
	}

	if (t==null || t=="" || t==0) {
		t = 'no';
	}
	else {
		t = 'yes';
	}
	var xPos = screen.width - (w + 10);
	var ranWin = 1;
	var myWin = window.name;
	if (myWin.indexOf('infWin') != -1) {
		myNum = myWin.substr(6);
		while (ranWin == myNum) {
			ranWin = Math.round(Math.random()*1000);
		}
	}
	infWindow = window.open(fN, 'infWin' + ranWin, 'toolbar=' + t + ',location=' + t + ',resizable=yes,status=yes,scrollbars=yes,width='+w+',height='+h+',left='+xPos+',top=0')
	if (infWindow != null) {
		infWindow.resizeTo(w,h);
		infWindow.moveTo(xPos,0);
		setTimeout('reFocus(infWindow)', '1000')
	}
	else {
		if (IE4) {
			sAlert = POPUP_REASON + ' Your Internet Explorer browser or other software has blocked a necessary pop-up window from this site. Please enable pop-ups for this site.';
		}
		else if (XX7 || NN4) {
			sAlert = POPUP_REASON + ' Your browser or other software has blocked a necessary pop-up window from this site. Please enable pop-ups for this site.';
		}
		alert(sAlert);
	}
}

// Declare this externally for benefit of reFocus();:
var win;

// New version of infoWindow that will allow direct Posts:
function infoWindowPost(targ,w,h,t) {

	if (w==null || w=="") {
		w = 500;
	}
	if (h==null || h=="") {
		h = 500;
	}
	if (t==null || t=="" || t==0) {
		t = 'no';
	}
	else {
		t = 'yes';
	}
	var xPos = screen.width - (w + 10);

	win = window.open('', targ, 'toolbar=' + t + ',location=' + t + ',resizable=yes,status=yes,scrollbars=yes,width='+w+',height='+h+',left='+xPos+',top=0');

	if (win != null) {
		setTimeout('reFocus(win)', 1000);
	}
	else {
		if (IE4) {
			sAlert = POPUP_REASON + ' Your Internet Explorer browser or other software has blocked a necessary pop-up window from this site. Please enable pop-ups for this site.';
		}
		else if (XX7 || NN4) {
			sAlert = POPUP_REASON + ' Your browser or other software has blocked a necessary pop-up window from this site. Please enable pop-ups for this site.';
		}
		alert(sAlert);
	}
}

function insertAtCursor(myField, myValue) {
	// IE support
	if (document.selection) {
		myField.focus();
		sel = document.selection.createRange();
		sel.text = myValue;
	}
	// MOZILLA/NETSCAPE support
	else if (myField.selectionStart || myField.selectionStart == '0') {
		var startPos = myField.selectionStart;
		var endPos = myField.selectionEnd;
		myField.value = myField.value.substring(0, startPos)
			+ myValue
			+ myField.value.substring(endPos, myField.value.length);
	}
	else {
		myField.value += myValue;
	}

	// calling the function
	// insertAtCursor(document.formName.fieldName, ‘this value’);
}

function insertSampleMovie(sLoc,lW,lH) {
	document.write('<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0" align="middle" width="' + lW + '" height="' + lH + '">\n');
	document.write('<param name="src" value="' + sLoc + '" />\n');
	document.write('<param name="autoplay" value="true"/>\n');
	document.write('<embed src="' + sLoc + '" autoplay="true" align="middle" bgcolor="white" pluginspage="http://www.apple.com/quicktime/download/"></embed>\n');
	document.write('</object>\n');
}

function jumpSelect(fE,lID,lStep) {
	var lThis = fE[fE.selectedIndex].value;
	if (lThis != -1) {
		self.location ='?step=' + lStep + '&id=' + lID + '&ddid=' + lThis;
	}
}

// Declare global keypress vars, as keypresslistener_multiuse needs to be loaded at runtime:
var keyPressUse = -1; // No reaction
var keyPressDIV = '';

function keyPressListener_MultiUse() {

	// Call keyPress_MultiUse:
	if (document.all) { document.onkeydown = keyPress_MultiUse; }
	else if (document.layers || document.getElementById) { document.onkeypress = keyPress_MultiUse; }

}

function keyPress_MultiUse(e){

	// Setup:
	if (!e) var e = window.event;
	if (e.keyCode) keyCode = e.keyCode; else if (e.which) keyCode = e.which;

	// Operate based upon lUse:
	switch (keyPressUse) {
	case 1: // Hide modal:
		switch (keyCode) {
		case 27: // ESC
			toggleDIV(keyPressDIV, false); // Close
			keyPressUse = -1; // Reset
			return false; 
			break;
		}
		break;
	case 2: // Old-Style Gallery:
/*
		switch (keyCode) {
		case 8: window.location="?<?php echo $strGalleryDirLink; ?>id=-1"; return false; break;
		case 63235: case 39: window.location="?<?php echo $strGalleryDirLink; ?>id=<?php echo $lngNext; ?>"; return false; break;
		case 63234: case 37: window.location="?<?php echo $strGalleryDirLink; ?>id=<?php echo $lngPrev; ?>"; return false; break;
		case 63273: case 36: window.location="?<?php echo $strGalleryDirLink; ?>id=0"; return false; break;
		case 63275: case 35: window.location="?<?php echo $strGalleryDirLink; ?>id=<?php echo (count($photoArray) - 1); ?>"; return false; break;
		}
*/
		break;
	}

	return true;
}

function loadMainFromPopup(htmlFile, reload) {
	if (reload==null) {
		window.opener.location = htmlFile;
	}
	else {
		window.opener.reload();
	}
}

function noGo() {
// empty
}

function nReplace(sVal,need,hay){
	var sHold = sVal;
	var j = sHold.indexOf(need);
	while (j > -1) {
		sHold = sHold.replace(need, hay);
		j = sHold.indexOf(need, j + hay.length + 1);
	}
	return sHold;
}

function popDD(eDD,aNames,aVals) {
	for(i=0;i<aNames.length;i++) {
		newOpt = new Option(aNames[i], aVals[i], false, false);
		eDD.options[eDD.length] = newOpt;
	}
}

function positionDIV(divID,divLeft,divTop,divWidth,divHeight) {
	if (XX7) {
		if (divLeft != -1) { document.getElementById(divID).style.left = divLeft; }
		if (divTop != -1) { document.getElementById(divID).style.top = divTop; }
		if (divWidth != -1) { document.getElementById(divID).style.width = divWidth; }
		if (divHeight != -1) { document.getElementById(divID).style.height = divHeight; }
	}
	else if (IE4) {
		if (divLeft != -1) { document.all[divID].style.left = divLeft; }
		if (divTop != -1) { document.all[divID].style.top = divTop; }
		if (divWidth != -1) { document.all[divID].style.width = divWidth; }
		if (divHeight != -1) { document.all[divID].style.height = divHeight; }
	}
	else if (NN4) {
		if (divLeft != -1) { document.layers[divID].left = divLeft; }
		if (divTop != -1) { document.layers[divID].top = divTop; }
		if (divWidth != -1) { document.layers[divID].width = divWidth; }
		if (divHeight != -1) { document.layers[divID].height = divHeight; }
	}
}

function printWindow(htmlFile,w,h) {
	var r = Math.random();
	var fN = htmlFile;
	if (fN.indexOf('?') == -1) {
		fN += '?r=' + r;
	}
	else {
		fN += '&r=' + r;
	}
	if (w==null || w=="") {
		w = 500;
	}
	if (h==null || h=="") {
		h = 500;
	}
	var xPos = screen.width - (w + 10);
	prtWindow = window.open(fN, 'printWin', 'toolbar=no,location=no,resizable=yes,menubar=yes,status=no,scrollbars=yes,width=657,height=800,left='+xPos+',top=0');
	if (prtWindow != null) {
		prtWindow.resizeTo(w,h);
		prtWindow.moveTo(xPos,0);
		setTimeout('reFocus(prtWindow)', '1000')
	}
	else {
		if (IE4) {
			sAlert = POPUP_REASON + ' Your Internet Explorer browser or other software has blocked a necessary pop-up window from this site. Please enable pop-ups for this site.';
		}
		else if (XX7 || NN4) {
			sAlert = POPUP_REASON + ' Your browser or other software has blocked a necessary pop-up window from this site. Please enable pop-ups for this site.';
		}
		alert(sAlert);
	}
}

function reFocus(winObj) {
	winObj.focus();
}

// Function to take action based upon an asynchronous callout;
// Relies upon a separate function - ajaxAction -
// declared in the calling page, so xmlhttpg is global:
var xmlhttpg;
function returnXMLDocAsync(sURL) {

	if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
		xmlhttpg = new XMLHttpRequest();
	}
	else {// code for IE6, IE5
		xmlhttpg = new ActiveXObject("Microsoft.XMLHTTP");
	}

	// Define the onreadystatechange event handler:
	xmlhttpg.onreadystatechange = function() {
		if (xmlhttpg.readyState == 4 && xmlhttpg.status == 200) {
			ajaxAction(); // Run a script defined in the page
		}
	}
	xmlhttpg.open("GET", sURL, true);
	xmlhttpg.send();

}

function returnXMLDocSync(sURL, sPost) {

	var xmlhttp;
	if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
		xmlhttp = new XMLHttpRequest();
	}
	else {// code for IE6, IE5
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}

	// Open the URL:
	xmlhttp.open("POST", sURL, false);
	xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
	xmlhttp.send(sPost);
	
	// Interpret the response from the Destination Page:
	// alert(xmlhttp.responseText);
	return xmlhttp.responseText;

}

function setDDbyIdx(eDD,iSet) {
	if (iSet != -1) {
		eDD.selectedIndex = iSet;
	}
}

function setDDbyTxt(eDD, sSet, bIpt) {
	if (sSet != -1) {
		var sIpt;
		if (bIpt == true) {
			sSet = nReplace(sSet.toUpperCase(),' ','');
		}
		for (i=0;i<eDD.length;i++) {
			sIpt = eDD[i].text;
			if (bIpt == true) {
				sIpt = nReplace(sIpt.toUpperCase(),' ','');
			}
			if (sIpt == sSet) {
				eDD.selectedIndex = i;
				break;
			}
		}
	}
}

function setDDbyPartTxt(eDD,sSet,bIpt) {
	var uI = -1;
	var uC = 0;
	if (sSet != -1) {
		var sIpt;
		if (bIpt == true) {
			sSet = nReplace(sSet.toUpperCase(),' ','');
		}
		for (i=0;i<eDD.length;i++) {
			sIpt = eDD[i].text;
			if (bIpt == true) {
				sIpt = nReplace(sIpt.toUpperCase(),' ','');
			}
			if (sIpt == sSet) {
				uI = i;
				break;
			}
			else {
				for (c=uC;c<sIpt.length;c++) {
					if (sSet.substring(0,c) == sIpt.substring(0,c)) {
						uI = i;
					}
				}
			}
		}
	}
	if (uI.length != -1) {
		eDD.selectedIndex = uI;
	}

}

function setDDbyVal(eDD,iSet) {
	if (iSet != -1) {
		eDD.value = iSet;
	}
}

function setEles(fThis,eFrom,eTo,lType) {
	switch (lType) {
	case 1: // Use SQs to set vals from one set of eles from another:
		for (i=0;i<eFrom.length;i++) {
			// Find the Target Element:
			lTo = -1;
			for (e=0;e<fThis.elements.length;e++) {
				if (fThis.elements[e].name.indexOf('sqid1') > -1 ) {
					if (fThis.elements[e].value == eTo[i]) {
						lTo = e + 6;
					}
				}
				if (fThis.elements[e].name.indexOf('sqid2') > -1 ) {
					if (fThis.elements[e].value == eTo[i]) {
						lTo = e + 5;
					}
				}
			}


			// Exit if not found:
			if (lTo == -1) {
				return false;
			}

			switch (eFrom[i]) {
			case "0":
				sSet = '';
				break;
			default:
				// Find the Source Element:
				lFrom = 0;
				for (e=0;e<fThis.elements.length;e++) {
					if (fThis.elements[e].name.indexOf('sqid1') > -1 ) {
						if (fThis.elements[e].value == eFrom[i]) {
							lFrom = e + 6;
						}
					}
					if (fThis.elements[e].name.indexOf('sqid2') > -1 ) {
						if (fThis.elements[e].value == eFrom[i]) {
							lFrom = e + 5;
						}
					}
				}
				sSet = fThis.elements[lFrom].value;
				break;
			}
			// Set the value:
			fThis.elements[lTo].value = sSet;
		}
	}
}

function showDIV(sNo) {
	if (sNo < lngNC1) { // >
		if (XX7) {
			if (iDIV != -1) {
				document.getElementById('dd' + iDIV).style.visibility = 'hidden';
			}
			if (sNo != -1) {
				document.getElementById('dd' + sNo).style.visibility = 'visible';
			}
		}
		else if (IE4) {
			if (iDIV != -1) {
		   	document.all['dd' + iDIV].style.visibility = 'hidden';
			}
			if (sNo != -1) {
	   		document.all['dd' + sNo].style.visibility = 'visible';
			}
		}
		else if (NN4) {
			if (iDIV != -1) {
		   	document.layers['dd' + iDIV].visibility = 'hide';
			}
			if (sNo != -1) {
	   		document.layers['dd' + sNo].visibility = 'show';
			}
		}
		iDIV = sNo
	}
}

function showInfo(sText) {
	alert(sText);
}

function showNothing() {
	var tNew = new Date();
	if ((tNew - tNow) > 5000) {
		showDIV(-1);
	}
}

function toggleDIV(divName,bShow) {
	if (XX7) {
		if (bShow) {
			document.getElementById(divName).style.visibility = 'visible';
		}
		else {
			document.getElementById(divName).style.visibility = 'hidden';
		}
	}
	else if (IE4) {
		if (bShow) {
			document.all[divName].style.visibility = 'visible';
		}
		else {
			document.all[divName].style.visibility = 'hidden';
		}
	}
	else if (NN4) {
		if (bShow) {
			document.layers[divName].visibility = 'show';
		}
		else {
			document.layers[divName].visibility = 'hide';
		}
	}
}

function validCardNo(fldVal) {
	var pattern = /\d{13,16}/;

	if(fldVal.match(pattern)) {
		return true;
	}
	else {
		alert('Card number must be 13 to 16 digits, with no spaces or other characters present.');
		return false;
	}
}

function validCardDate(fldVal) {
	if(fldVal.match(/\d{4}/)) {
		return true;
	}
	else {
		alert('Expiry date must number must be 4 digits - MMYY');
		return false;
	}
}

function validChars(fldVal) {
	vChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
	for (j=0;j<fldVal.length;j++) {
		if (vChars.indexOf(fldVal.charAt(j)) == -1) {
			ivC = fldVal.charAt(j)
			if (ivC == ' ') {
				ivC = 'Spaces'
			}
			return false
			break;
		}
	}
	return true
}

function validCharsName(fldVal) {
	vChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ -'
	for (j=0;j<fldVal.length;j++) {
		if (vChars.indexOf(fldVal.charAt(j)) == -1) {
			return false
			break;
		}
	}
	return true
}

function validDate(dteVal) {
	var msg = ''
	var ok = true
	var d1 = dteVal.slice(0, 2)
	var m1 = dteVal.slice(3, 5)
	var y1 = dteVal.slice(6, 8)
	var sa1 = dteVal.slice(2, 3)
	var sb1 = dteVal.slice(5, 6)
	if (isNaN(d1) || isNaN(m1) || isNaN(y1)) {
		ok = false;
	}
	if (sa1 != '\/' || sb1 != '\/' ) {
		ok = false;
	}
	if (!ok) {
		alert(SITE_DATE)
 		return false;
	}
	return true;
}

function validDateNew(dteVal,lY) {
	if (lY == 2) {
		var datePat = /^(\d{2})(\/|-)(\d{2})(\/|-)(\d{2})$/;
	}
	else if (lY == 4) {
		var datePat = /^(\d{2})(\/|-)(\d{2})(\/|-)(\d{4})$/;
	}
	else {
		alert("Date Checker incorrectly configured.");
		return false;
	}

	var matchArray = dteVal.match(datePat); // is the format ok?

	if (matchArray == null) {
		if (lY == 2) {
			alert("Please enter date as either dd/mm/yy or dd-mm-yy");
		}
		else if (lY == 4) {
			alert("Please enter date as either dd/mm/yyyy or dd-mm-yyyy");
		}
		return false;
	}
	return validDateNumerical(matchArray[5], matchArray[3], matchArray[1]);
}

function validDateMac(sD,sM,sY) {
	if (sD.charAt(0) == "0") {
		sD = sD.charAt(1)
	}
	if (sM.charAt(0) == "0") {
		sM = sM.charAt(1)
	}
	if (isNaN(sD) || isNaN(sM) || isNaN(sY)) {
		return false;
	}
	lD = parseInt(sD);
	lM = parseInt(sM);
	lY = parseInt(sY);
	if (lD > 31 || lM > 12 || lY > 2030) {
		return false;
	}
	switch (lM) {
	case 4:
	case 6:
	case 9:
	case 11:
		if (lD == 31) {
			return false;
		}
		break;
	case 2:
		var isLeap = (lY % 4 == 0 && (lY % 100 != 0 || lY % 400 == 0));
		if (lD > 29 || (lD == 29 && !isLeap)) {
			return false;
		}
		break;
	}
	return true; // date is valid
}

function validDateNumerical(year, month, day) {

	if (month < 1 || month > 12) { // check month range
		alert("Month must be between 1 and 12.");
		return false;
	}

	if (day < 1 || day > 31) {
		alert("Day must be between 1 and 31.");
		return false;
	}

	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		alert("Month "+month+" doesn`t have 31 days!");
		return false;
	}

	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day==29 && !isleap)) {
			alert("February " + year + " doesn't have " + day + " days!");
			return false;
		}
	}
	return true; // date is valid
}

function validDecimal(fldVal) {
	validChars = "0123456789.,"
	for (k=1; k<fldVal.length; k++) {
		testChar = fldVal.charAt(k)
		if (validChars.indexOf(testChar,0) == -1) {
			return false;
		}
	}
	return true;
}

function validEmail(strVal) {
	strInv = ' /:,;'
	for (l=0;l<strInv.length;l++) { // >
		strBad = strInv.charAt(l)
		if (strVal.indexOf(strBad,0) > -1) { // <
			alert(SITE_EMAIL1 + strBad + '\'')
   		return false;
		}
	}
	atPos = strVal.indexOf('@',1)
	if (atPos == -1) {
		alert(SITE_EMAIL2)
 		return false;
	}
	if (strVal.indexOf('@',atPos+1) > -1) { // <
		alert(SITE_EMAIL3)
		return false;
	}
	dotPos = strVal.indexOf('.',atPos)
	if (dotPos == -1) {
		alert(SITE_EMAIL4)
		return false;
	}
	if (dotPos+3 > strVal.length) { // <
		alert(SITE_EMAIL5)
		return false;
	}
	return true;
}

function validFileChars(fldVal, bAllowSpaces) {
	if (typeof bAllowSpaces == 'undefined') {
		bAllowSpaces = false;
	}
	vChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._'
	if (bAllowSpaces) {
		vChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._ '
	}
	for (k=0;k<fldVal.length;k++) {
		if (vChars.indexOf(fldVal.charAt(k)) == -1) {
			ivC = fldVal.charAt(k)
			if (ivC == ' ') {
				ivC = 'Spaces'
			}
			return false
			break;
		}
	}
	return true
}

function validateNos(fldVal) {
	if (fldVal != '') {
   	var valid = '0123456789'
      var temp;
		for (j=0; j<fldVal.length; j++) { // >
      	temp = '' + fldVal.substring(j, j+1);
         if (valid.indexOf(temp) == -1) {
         	return false
			}
		}
		return true
	}
	else {
     	return true
	}
}

function validNumLength(strVal, lRequired, lNumLength) {
	if (lRequired == 0 && strVal.length == 0) {
		return true;
	}
	if (strVal.length < lNumLength) {
	  alert(arrAlert[i] + SITE_LENGTH1 + lNumLength + SITE_LENGTH3)
		return false;
	}
	validChars = " 0123456789"
	for (k=1; k<strVal.length; k++) {
		testChar = strVal.charAt(k)
		if (validChars.indexOf(testChar,0) == -1) {
	    alert(arrAlert[i] + SITE_NUMBER)
			return false;
		}
	}
	return true;
}

function validPass(fldVal) {
	vC1 = 'abcdefghijklmnopqrstuvwxyz'; vC2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; vC3 = '0123456789'
	lng1 = 0; lng2 = 0; lng3 = 0;
	for (j=0;j<fldVal.length;j++) {
		if (vC1.indexOf(fldVal.charAt(j)) != -1) {
			lng1++
		}
		else if (vC2.indexOf(fldVal.charAt(j)) != -1) {
			lng2++
		}
		else if (vC3.indexOf(fldVal.charAt(j)) != -1) {
			lng3++
		}
		else {
			return false;
			break;
		}
	}
	if (lng1 == 0 || lng2 == 0 || lng3 == 0) {
		return false
	}
	else {
		return true
	}
}

function validPostcode(fldVal) {
	if (fldVal.length < 5) { // >
		return false;
	}
	return true;
}

function validScreen(fldVal) {
	if (fldVal.length < 6) { // >
		return false;
	}
	return true;
}

function validSortCode(fldVal) {
	if (fldVal.length < 6) { // >
		alert(SITE_SORT_CODE);
		return false;
	}
	if (isNaN(fldVal)) { // >
		alert(SITE_SORT_CODE);
		return false;
	}
	return true;
}

function validTel(strVal) {
	if (strVal.charAt(0) != '0' && strVal.charAt(0) != '+') {
		alert(SITE_TELNO1)
		return false;
	}
	validChars = " 0123456789-/"
	for (k=1; k<strVal.length; k++) {
		testChar = strVal.charAt(k)
		if (validChars.indexOf(testChar,0) == -1) {
			alert(SITE_TELNO2 + testChar)
			return false;
		}
	}
	if (strVal.length < 10) {
		alert(SITE_TELNO3)
		return false;
	}
	return true;
}

function validTime(sTime) {
	var msg = ''
	var ok = true
	var h1 = sTime.slice(0, 2)
	var m1 = sTime.slice(3, 5)
	var sa1 = sTime.slice(2, 3)
	if (isNaN(h1) || isNaN(m1)) {
		ok = false;
	}
	else {
		if (h1 < 0 || h1 > 23) {
			ok = false;
		}
		if (m1 < 0 || m1 > 59) {
			ok = false;
		}
	}
	if (sa1 != ':') {
		ok = false;
	}
	if (!ok) {
		alert(SITE_TIME)
 		return false;
	}
	return true;
}

/*
Cross-Browser Collapsible Menu System
Copyright Rich Harding, CSS Computing, 2002-2011;
http://www.csscomputing.co.uk
You may re-use this free of charge
as long as you retain this notice.

Currently collapsing at any level collapses all levels below too
This could do with more work but will do!!

Requires definition of:

blnPM = new Array(false,true...) - Parent requiring Plus/Minus signs
blnViz = new Array(false,true...) - Visible Y/N
blnOpen = new Array(false,true...) - Open Y/N
lngL = new Array(-1,0,1,2...) - Indentation

*/

function vN(dNo,bPM) {
	if (bPM) { sD1 = 'div' + dNo + 'p' }
	else { sD1 = 'div' + dNo }
	if (XX7) { document.getElementById(sD1).style.visibility = 'visible' }
	else if (IE4) {	document.all[sD1].style.visibility = 'visible' }
	else if (NN4) {	document.layers[sD1].visibility = 'show' }
}

function cN(dNo,bPM,bOp) {
	if (bPM) {
		sD1 = 'div' + dNo + 'p'
		sD2 = 'div' + dNo + 'm'
	}
	else {
		sD1 = 'div' + dNo
	}
	if (XX7) {
		if (document.getElementById(sD1).style.visibility == 'visible') {
			document.getElementById(sD1).style.visibility = 'hidden';
			if (bPM && bOp) {
				document.getElementById(sD2).style.visibility = 'visible';
			}
			return true;
		}
		else {
			if (bOp) {
				document.getElementById(sD1).style.visibility = 'visible';
			}
			if (bPM) {
				document.getElementById(sD2).style.visibility = 'hidden';
			}
			return false;
		}
	}
	else if (IE4) {
		if (document.all[sD1].style.visibility == 'visible') {
			document.all[sD1].style.visibility = 'hidden'
			if (bPM && bOp) {
				document.all[sD2].style.visibility = 'visible';
			}
			return true;
		}
		else {
			if (bOp) {
				document.all[sD1].style.visibility = 'visible';
			}
			if (bPM) {
				document.all[sD2].style.visibility = 'hidden';
			}
			return false;
		}
	}
	else if (NN4) {
		if (document.layers[sD1].visibility == 'show') {
			document.layers[sD1].visibility = 'hide'
			if (bPM && bOp) {
				document.layers[sD2].visibility = 'show';
			}
			return true;
		}
		else {
			if (bOp) {
				document.layers[sD1].visibility = 'show';
			}
			if (bPM) {
				document.layers[sD2].visibility = 'hide';
			}
			return false;
		}
	}
}

function getTop(dNo,bPM) {
	if (bPM) { sD = 'div' + dNo + 'p' }
	else { sD = 'div' + dNo	}
	lTop = 0;
	if (XX7) { lTop = document.getElementById(sD).style.top	}
	else if (IE4) {	lTop = document.all[sD].style.top }
	else if (NN4) {	lTop = document.layers[sD].top }
	if (isNaN(lTop)) {
		lTop = Number(lTop.substr(0,(lTop.length - 2)));
	}
	return lTop;
}

function setTop(dNo,bPM,iTop) {
	iTop = iTop + 'px';
	if (bPM) {
		sD1 = 'div' + dNo + 'p';
		sD2 = 'div' + dNo + 'm';
	}
	else {
		sD1 = 'div' + dNo;
	}
	if (XX7) {
		document.getElementById(sD1).style.top = iTop;
		if (bPM) {
			document.getElementById(sD2).style.top = iTop;
		}
	}
	else if (IE4) {
		document.all[sD1].style.top = iTop;
		if (bPM) {
			document.all[sD2].style.top = iTop;
		}
	}
	else if (NN4) {
		document.layers[sD1].top = iTop;
		if (bPM) {
			document.layers[sD2].top = iTop;
		}
	}
}

function cA(dNo,lDIVs) {
	var strTop = getTop(dNo,blnPM[dNo]);
	if (isNaN(strTop)) {
		var iTop = Number(strTop.substr(0,3));
		if (isNaN(iTop)) {
			var iTop = Number(strTop.substr(0,2));
		}
	}
	else {
		var iTop = Number(strTop);
	}
	var bOpen = cN(dNo,blnPM[dNo],true);
	var iL = lngL[dNo] + 1
	for (i=dNo+1;i<lDIVs+1;i++) { // >
		if (lngL[i] == iL) {
			blnGetS = cN(i,blnPM[i],bOpen);
			blnViz[i] = !blnGetS;
		}
		if (lngL[i] <= lngL[dNo]) { // >
			break;
		}
		if (!bOpen) {
			blnViz[i] = false;
			cN(i,blnPM[i],false);
		}
		else if (blnViz[i]) {
			blnOpen[i] = true;
			vN(i,blnPM[i]);
		}
	}
//	alert (blnViz[16] + ' - ' + blnOpen[16])
	for (i=dNo+1;i<lDIVs+1;i++) { // >
		if (blnViz[i]) {
			iTop = iTop + 18
			setTop(i,blnPM[i],iTop);
		}
	}
}


