function validateForm(form, bConfirm, bDisable, bDisabler)
{
	var testOk;
	blankOK=false
	var confirmMsg = 'Your data is about to be sent.\nPlease click Ok to proceed or Cancel to abort.';
	var confirmAbortMsg = 'Submission cancelled.  Data has not been sent.';
	
	for (var i=0; i<form.elements.length; i++)		// Loops through all the form's elements
	{
		if (form.elements[i].alt)		// Gets the ALT text if it exists, starting the validation
		{
			var validateType = form.elements[i].alt;
			var validateObj = form.elements[i];
			testOk = false;			
			var params = validateType.split(/[|]/);		// Separates validation string into parameters
		
						
			if (params[params.length-1] == 'bok')		// Sets flag if field is allowed to be blank
				blankOK = true;
	
			switch (params[0])	// Calls appropriate validation function based on type
			{
				case 'pin'		: if (validatePin(validateObj)) testOk = true; break;
				case 'blank'	: if (validateBlank(validateObj)) testOk = true; break;
				case 'equalto'	: if (validateEqualTo(validateObj, params[1], form)) testOk = true; break;
				case 'length'	: if (validateLength(validateObj, params[1])) testOk = true; break;
				case 'number'	: if (validateNumber(validateObj)) testOk = true; break;
				case 'numberl'	: if (validateNumberL(validateObj, params[1])) testOk = true; break;				
				case 'money'	: if (validateMoney(validateObj)) testOk = true; break;
				case 'postcode'	: if (validatePostcode(validateObj)) testOk = true ;break;
				case 'phone'	: if (validatePhone(validateObj)) testOk = true; break;
				case 'email'	: if (validateEmail(validateObj)) testOk = true; break;
				case 'phoneno'	: if (validatePhoneno(validateObj)) testOk = true; break; 
				case 'cc'	: if (validateCC(validateObj, params[1], form)) testOk = true; break;
				case 'select'	: if (validateSelect(validateObj)) testOk = true; break;
				case 'hphone'   : if (validateHphone(validateObj)) testOk= true; break;
				default		: window.alert('Validation Type Not Found');
			}
			if (!testOk) return false;
		}		
	}
		
	if (typeof bConfirm == 'undefined') bConfirm = 0;				
	if (typeof bDisable == 'undefined') bDisable = 0;	
	if (typeof bDisabler == 'undefined') bDisabler = 0;	
	if (bConfirm)
	{
		if(!confirm(confirmMsg))
		{
			if (confirmAbortMsg != '') alert(confirmAbortMsg);		
			return false;
		}
	}
	//if (bDisable) form.elements["submit"].disabled=true;		// Disables submit if requested
	//if (bDisabler) form.elements["reset"].disabled=true;		// Disables reset if requested
	return true;							// Form has been validated
	}

function validatePin(formObj)
{
	var objName = formatName(formObj.name);
	if (formObj.value == "")
	{
		alert('Please enter your Pin No.');
		errorProcess(formObj,0,1);
		return false;
	}
	var regex = new RegExp(/\S/);
	if (!regex.test(formObj.value))
	{
		alert('Please enter your Pin No.');
		errorProcess(formObj,1,1);
		return false;			
	}
	return true;
}

function validateBlank(formObj)
{
	var objName = formatName(formObj.name);
	if (formObj.value == "")
	{
		alert('Please enter the '+objName);
		errorProcess(formObj,0,1);
		return false;
	}
	var regex = new RegExp(/\S/);
	if (!regex.test(formObj.value))
	{
		alert('Please enter the '+objName);
		errorProcess(formObj,1,1);
		return false;			
	}
	return true;
}

// Special function used for bok
function checkBlank(formObj)
{
	if (formObj.value == "")
		return true;
	var regex = new RegExp(/\S/);
	if (!regex.test(formObj.value))
		return true;			
	return false;
}
		

function validateEqualTo(formObj, otherObjName, Frm)
{
	var objName = formatName(formObj.name);
	var equalToValue = Frm.elements[otherObjName].value;

	if (formObj.value != equalToValue)
	{
		alert('Password must be the same as retype-password.\nPlease make sure the data you entered are matched.');
		errorProcess(formObj,1,1);
		return false;
	}
	return true;
}


function validateLength(formObj,len)
{
	var objName = formatName(formObj.name);	
	if (blankOK && checkBlank(formObj))
	{ 	blankOK=false; return true; }
	
	if (formObj.value.length < parseInt(len))
	{
		alert('The '+objName+' must be at least '+len+' characters');
		errorProcess(formObj,1,1);
		return false;
	}		
	return true;
}
	

function validateNumber(formObj)
{
	var objName = formatName(formObj.name);
	if (blankOK && checkBlank(formObj))
	{ 	blankOK=false; return true; }
	
	numReg = "^[0-9]*$"
	var regex = new RegExp(numReg);
	if (!regex.test(formObj.value))
	{
		window.alert('Only numeric values are valid for the '+objName);
		errorProcess(formObj,1,1);
		return false;
	}
	return true;
}


function validateNumberL(formObj, len)
{
	var objName = formatName(formObj.name);
	if (blankOK && checkBlank(formObj))
	{	blankOK=false; return true; }
	
	numReg = "^[0-9]{"+parseInt(len)+",}$"
	var regex = new RegExp(numReg);
	if (!regex.test(formObj.value))
	{
		window.alert('A minimum of '+len+' numeric values are required for the '+objName);
		errorProcess(formObj,1,1);
		return false;
	}
	return true;
}



function validateMoney(formObj)
{
	var objName = formatName(formObj.name);	
	if (blankOK && checkBlank(formObj))
	{ 	blankOK=false; return true; }
	
	var moneySyntax;
	    moneyReg="^(?:(?:[0-9]{1,3},)(?:[0-9]{3},)*[0-9]{3}|[0-9]{1,3})(\\.[0-9]{2})?$"; moneySyntax="XX,XXX.XX";	
		var regex = new RegExp(moneyReg);
	if (!regex.test(formObj.value))
	{
		window.alert('The input you entered does not match the required format of '+moneySyntax+' for '+objName+'.\n Please enter again.');
		errorProcess(formObj,1,1);
		return false;
	}
	return true;
}


function validateSelect(formObj)
{
	var objName = formatName(formObj.name);
	if (formObj.selectedIndex == 0)
	{
		window.alert('Please select the '+objName);
		errorProcess(formObj,0,1);
		return false;
	}
	return true;
}
	

function validatePostcode(formObj)
{
	var objName = formatName(formObj.name);	
	if (blankOK && checkBlank(formObj))
	{ 	blankOK=false; return true; }	
						
	postcodeReg = "^[0-9]{5}$";
	var regex = new RegExp(postcodeReg);
	if (!regex.test(formObj.value))
	{
		window.alert("Please enter a valid 5 digit postcode.");
		errorProcess(formObj,1,1);
		return false;
	}
	return true;
}


function validateEmail(formObj)
{	
	//if (blankOK && checkBlank(formObj))
	//{ 	blankOK=false; return true; }
	var objName = formatName(formObj.name);
		if (formObj.value == "")
		{
			alert('Please enter your Email Address.');
			errorProcess(formObj,0,1);
			var emailStr = formObj.value;
			var emailReg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
			var emailReg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid
		if (!emailReg1.test(emailStr) && emailReg2.test(emailStr)) // if syntax is valid
		{
			return true;
		}
		else
		{
			//window.alert("Please enter a valid E-mail address.");
			errorProcess(formObj,1,1);
			return false;
		}
			//return false;
	}
	var regex = new RegExp(/\S/);
	if (!regex.test(formObj.value))
	{
		alert('Please enter your Email Address.');
		errorProcess(formObj,1,1);
		return false;			
	}
	
	var emailStr = formObj.value;
	var emailReg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
	var emailReg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid
	if (!emailReg1.test(emailStr) && emailReg2.test(emailStr)) // if syntax is valid
	{
		return true;
	}
	else
	{
		window.alert("Please enter a valid E-mail address.");
		errorProcess(formObj,1,1);
		return false;
	}
	return true;
}
	
function validatePhoneno(formObj)
{
	var objName = formatName(formObj.name);
	if (formObj.value == "")
	{
		alert('Please enter your Mobile Phone No.');
		errorProcess(formObj,0,1);
		return false;
	}
	var regex = new RegExp(/\S/);
	if (!regex.test(formObj.value))
	{
		alert('Please enter your Mobile Phone No.');
		errorProcess(formObj,1,1);
		return false;			
	}
	return true;
}

function validatePhone(formObj)
{
	var objName = formatName(formObj.name);	
	if (blankOK && checkBlank(formObj))
	{ 	blankOK=false; return true; }
	
	phoneReg = "^[0-9]{2}[-.]?[0-9]{8}$";
	var regex = new RegExp(phoneReg);
	if (regex.test(formObj.value))
	{
		return true;
	}
	else
	{
		window.alert("Please enter a valid phone number plus area code.");
		errorProcess(formObj,1,1);
		return false;
	}
	return true;
}
	

function validateHphone(formObj)
{
	var objName = formatName(formObj.name);	
	if (blankOK && checkBlank(formObj))
	{ 	blankOK=false; return true; }
	
	phoneReg = "^[0-9]{3}[-.]?[0-9]{7}$";
	var regex = new RegExp(phoneReg);
	if (regex.test(formObj.value))
	{
		return true;
	}
	else
	{
		window.alert("Please enter a valid handphone number.");
		errorProcess(formObj,1,1);
		return false;
	}
	return true;
}
	

function validateCheckbox(formObj, FRM, chkbxName, minC, maxC)
	{
	var formObj = eval(FRM+'.'+chkbxName);
	var objName = chkbxName;
	var checkTotal = eval(FRM+'.'+chkbxName+'.length');
	var checkCount = 0;
	if (maxC == 999) maxC = checkTotal;
	for (var i=0; i<checkTotal; i++)
	{
		if (formObj[i].checked) checkCount++;
	}
	if (checkCount < minC || checkCount > maxC)
	{
		window.alert('Please select between '+minC+' and '+maxC+' options for '+objName+'.\nYou currently have '+checkCount+' selected');
		errorProcess(formObj[0],0,1);
		return false;
	}
	return true;
}


function validateRadio(formObj, FRM, radioName)
{	
	var radioLength = eval(FRM+'.'+radioName+'.length');
	var objName = formatName(formObj.name);
	var selectTotal = 0;
	for (i=0; i<radioLength; i++)
	{
		if (eval(FRM+'.'+radioName+'['+i+'].checked'))
			selectTotal++;	
	}
	if (selectTotal != 1)
	{
		window.alert('Please select an option for '+objName);
		errorProcess(formObj,0,1);
		return false;
	}		
	return true;
}


function formatName(wStr)
{
	wStr = wStr.replace(/_/g," ");
	return wStr;
}


function errorProcess(tempObj, sel, foc)
{
	var errorClass = 'text';
	revertClass = tempObj.className;
	tempObj.className = errorClass;
	if (sel) tempObj.select();
	if (foc) tempObj.focus();
}


function clearStyle(tempObj)
{
	if (tempObj.className == errorClass) tempObj.className = revertClass;
}


function cleanupCCNum(ccNum)
{
	return ccNum.replace(/\D/g,'');
}
	

function validateCC(formObj, otherObj, Frm)
{
	var objName = formatName(formObj.name);	
	var type=Frm.elements[otherObj].value;
	if (blankOK && checkBlank(formObj))
	{ 	blankOK=false; return true; }
	
	switch (type)
	{
		case 'Visa'		        : var ccReg = new RegExp(/^4\d{12}(\d{3})?$/); break;
		case 'MasterCard'		: var ccReg = new RegExp(/^5[1-5]\d{14}$/); break;
		case 'AmericanExpress'		: var ccReg = new RegExp(/^6011\d{12}$/); break;		
		default			        : alert('Error! Card Type not found!'); return false;
	}
		
	var formatOK = ccReg.test(formObj.value);
	var luhnOK = validateLUHN(formObj.value);	
	if (!formatOK || !luhnOK)
	{
		window.alert('The '+objName+' you entered is not valid. Please check again and re-enter');
		errorProcess(formObj,1,1);
		return false;
	}		
	return true;
}


function validateLUHN(ccString)
{
	var odds = "";
	var evens = "";
	var i=1;
	for (i=0; i<ccString.length; i=i+2)
	{
		var digit = parseInt(ccString.charAt(i)) * 2;
		odds += digit+"";
	}
	for (i=1; i<ccString.length; i=i+2)
		evens += ccString.charAt(i);
	var luhnStr = odds + evens;
	var checkSum = 0;
	for (i=0; i<luhnStr.length; i++)
		checkSum += parseInt(luhnStr.charAt(i));
	var bool;
	(checkSum % 10 == 0)?bool=true:bool=false;
	return bool;
}
	
