// JavaScript Document form-validation.js

/******************************************************************************/
/*  Paste this code into HTML <header>
/*  <script type="text/javascript" src="/common/formValidation.js"></script>  
/******************************************************************************/

/*******************************************************/
/*	Paste this code into HTML above form <table>
/*	<div id="errorMessage" style="color:#FF0000"></div>
/*******************************************************/

/*******************************************************/
/*	Paste this code into HTML in <form> description
/*	onsubmit="return validate(this)"
/*******************************************************/

var errorMsg;
var currentElement;
var groupArray = new Array();

function validate(form){
	errorMsg = '';
	var count = form.elements.length;
	
	for (var i = 0; i < count; i++)	{
		currentElement = form.elements[i];
		switch (currentElement.type)	{
			
			case 'hidden':
				break;

			case 'password':
				switch (currentElement.id) {
					case 'rPassword': 		CheckText();break;		//Check Password
				}
				break;		
			
			case 'text':
				switch (currentElement.id) {
					case 'rFullName': 		CheckText();break;		//Check Full Name
					case 'rFirstName': 		CheckText();break;		//Check First Name
					case 'rSurname': 			 CheckText();break;		//Check Last Name
					case 'rUsername': 		CheckText();break;		//Check Username
					case 'rPassword': 		CheckText();break;		//Check Username

					case 'rDOB': 					CheckText();break;		//Check DOB
					case 'rDay': 					CheckText();break;		//Check DOB
					case 'rMonth': 					CheckText();break;		//Check DOB
					case 'rYear': 					CheckText();break;		//Check DOB

					case 'rEmail': 				CheckText();break;		//Check Email
					case 'rPhone': 				CheckText();break;		//Check Phone
					case 'rMobile': 			CheckText();break;		//Check Mobile
					case 'rFax':		 			CheckText();break;		//Check Fax
					case 'rOrganisation':	CheckText();break;		//Check Organisation
					case 'rAddress': 			CheckText();break;		//Check Address
					case 'rSuburb': 			CheckText();break;		//Check Suburb
					case 'rState': 				CheckText();break;		//Check State
					case 'rPcode': 				CheckText();break;		//Check Pcode
					case 'rCountry': 			CheckText();break;		//Check Country

					case 'rProdCode': 		CheckText();break;		//Check Product Code
					case 'rProdName': 		CheckText();break;		//Check Product Name
					case 'rProdDesc': 		CheckText();break;		//Check Product Description
					case 'rProdPrice': 		CheckText();break;		//Check Product Price
					case 'rProdOrder': 		CheckText();break;		//Check Product Order
					case 'rProdWeight': 	CheckText();break;		//Check Product Weight
					case 'rStockNum': 		CheckText();break;		//Check Stock Number
					case 'rStockAlertNum': CheckText();break;		//Check Sock Alert Number

					case 'rCompanyName': 	CheckText();break;		
					case 'rTradingName': 	CheckText();break;		
					case 'rACN':				 	CheckText();break;		
					case 'rABN':				 	CheckText();break;		
					case 'rBankName':			CheckText();break;		
					case 'rBranch':				CheckText();break;		
					case 'rAccountName':	CheckText();break;		
					case 'rBSB':				 	CheckText();break;		
					case 'rAccountNo':		CheckText();break;
					
					case 'rExpiryMonth':	CheckText();break;	
					case 'rExpiryYear':		CheckText();break;	
					case 'rHolderName':		CheckText();break;	

					case 'rCategoryName':			CheckText();break;		
					case 'rCategoryOrder':		CheckText();break;
					
					case 'rOmniNo':				CheckText();break;
					case 'rCardNumber':				CheckText();break;

					/** Add extra required text fields here **/
					//case 'r': 			CheckText(currentElement, 18);break;	//Check 
				}
				break;
			
			case 'textarea':
				switch (currentElement.id) {
					case 'rMessage':		CheckText();break;		//Check Message
					case 'rEnquiry':		CheckText();break;		//Check Enquiry
				}
				break;
			
			case 'select-one':	
				if (currentElement.selectedIndex == -1){
					AddError(2); //Selected Error Message
				}else{
					currentElement.style.background="#ffffff";
				}
				break;

			case 'select-multiple':
				if (currentElement.id != "") {
					var hasSelections = false;
					for (var smcount = 0; smcount < currentElement.options.length; smcount++)	{
						if(currentElement.options[smcount].selected) {
							hasSelections = true;
							currentElement.style.background="#ffffff";
							break;
						}
					}
					if(!hasSelections) {
						// nothing is selected
						AddError(2); //Selected Error Message
						break;
					}
				}
				break;

			case 'checkbox':
				switch (currentElement.id) {
					case 'address_as_above':	
						if (currentElement.checked)	{
							form.order_address.value = '';
							form.order_suburb.value = '';
							form.order_state.value = '';
							form.order_postcode.value = '';
							form.order_country.value = '';
							//form..selectedIndex = 14;
							break;
						}else if (!currentElement.checked) {
							//second set of company fields become enabled	
							break;
						}
					case 'rTermsAgree': AddError(3); break;		
				}
				break;
				if (!currentElement.checked)	{
					AddError(2); //Selected Error Message
				}
				break;
			
			case 'radio':
				switch (currentElement.id) {
					case 'rShipping': CheckRadio(form);break;		//Check Shipping options
					case 'rPaymentType': CheckRadio(form);break;		//Check Shipping options
					case 'rCardType': CheckRadio(form);break;		//Check Shipping options
				}	
				break;
		}
	}

	//Return Result
	return PrintResult();
}

// Checks Radio Button groups for selection
function CheckRadio(form) {
	var checked = false;
	var alreadyTested = false;
	currentElement.style.background="";	
	
	//Checks to see if this group name has been checked already
	for (var i = 0; i < groupArray.length; i++) {
		if (currentElement.id == groupArray[i]) {
			alreadyTested = true;
		}
	}
	
	if(!alreadyTested) {
		//Add to group to groupArray to record that it has been tested
		groupArray.push(currentElement.id);
		
		//Check all radio buttons with same name
		var count = 0;
		
		for(var i = 0; i < form.elements.length; i++) {
			if(form.elements[i].id == currentElement.id) {
				if(form.elements[i].checked == true) {
					checked = true;
				}
				count += 1;
			}
		}

		if (!checked) {
			AddError(2); //Selected Error Message
		}
	}
}

//Checks text fields for content
function CheckText(){	
	var value = currentElement.value;
	
	//If text field is empty, add error
	if (value == ''){
		AddError(0);  //Enter error Message
	//If text field has a specific id, check for validity
	} else {
		currentElement.style.background="#ffffff";
	}
	if (value != '') {
		switch (currentElement.id) {
			case 'rEmail': 					if (!CheckEmail(value)) { AddError(1); } break;				//Check for Valid Email Address
			//case 'rPhone': 					if (!CheckForDigits(value)) { AddError(1); } break;		//Check for Valid Phone Number
			case 'rFax': 						if (!CheckForDigits(value)) { AddError(1); } break;		//Check for Valid Fax Number
			case 'rMobile': 				if (!CheckTenDigits(value)) { AddError(1); } break;		//Check for Valid Mobile Number
			//case 'rPcode': 					if (!CheckFourDigits(value)) { AddError(1); } break;	//Check for Valid Post Code
			case 'rDay': 						if (!CheckTwoDigits(value)) { AddError(1); } break;		//Check DOB
			case 'rMonth': 					if (!CheckTwoDigits(value)) { AddError(1); } break;		//Check DOB
			case 'rYear': 					if (!CheckFourDigits(value)) { AddError(1); } break;		//Check DOB


			case 'rExpiryMonth': 		if (!CheckTwoDigits(value)) { AddError(1); } break;		//Check for Valid Mobile Number
			case 'rExpiryYear': 		if (!CheckFourDigits(value)) { AddError(1); } break;		//Check for Valid Mobile Number
			case 'rProdPrice':			if (!CheckTwoDec(value)) { AddError(1); } break;			//Check for Valid Two Decimal Number
			case 'rProdWeight':			if (!CheckForDigits(value)) { AddError(1); } break;			//Check for Valid Two Decimal Number
			case 'rStockNum':				if (!CheckForDigits(value)) { AddError(1); } break;			//Check for Valid Two Decimal Number
			case 'rStockAlertNum':	if (!CheckForDigits(value)) { AddError(1); } break;			//Check for Valid Two Decimal Number

			case 'rACN': 						if (!CheckForDigits(value)) { AddError(1); } break;
			case 'rABN': 						if (!CheckForDigits(value)) { AddError(1); } break;
			case 'rCardNumber': 		if (!CheckForDigits(value)) { AddError(1); } break;
			/**Add extra conditions here**/
			//case 'r...': 		if (!Check...(value)) { AddError(...); } break;	//Check for ...
		}
	//If text field is fine, proceed
	}
}

// Add specific error to errorMsg
// 0 == "Please enter a (element)
// 1 == "Please enter a Valid (element)
// 2 == "Please select a (element)
// 3 == "Please Agree to the (element)
function AddError(index){
	if (index == 0) {
		errorMsg += "Please enter a <strong>" + currentElement.title + "</strong>.\n<br />";
	} else if (index == 1) {
		errorMsg += "Please enter a <strong>Valid " + currentElement.title + "</strong>.\n<br />"; 
	} else if (index == 2) {
		errorMsg += "Please select a <strong>Valid " + currentElement.title + "</strong>.\n<br />"; 
	} else if (index == 3) {
		errorMsg += "Please Agree to the <strong> " + currentElement.title + "</strong>.\n<br />"; 
	}
	currentElement.style.background="#ffdfdf";
}

//Prints resulting Error Message to Document or returns TRUE
function PrintResult(){
	if (errorMsg == "") {
		return true;
	}else{
		document.getElementById("errorMessage").innerHTML =  "Please repair the following errors.<br />" + errorMsg + "<br />";
		//alert(errorMsg);
		return false;
	}
}

//Checks for a valid email address
function CheckEmail(email) {
	var regexp = /^[a-zA-Z_0-9\-\.]*@[a-zA-Z_0-9\-]*(\.[a-zA-Z_0-9\-]*)+$/;
	return regexp.test(email);
}

//Checks that value contains only numerical digits.
function CheckForDigits(argVal) {
	var regexp = /^\d+$/;
	return regexp.test(argVal);
}
//Checks that value contains only 10 numerical digits.
function CheckTenDigits(argVal){
	var regexp = /^\d{10}$/;
	return regexp.test(argVal);
}
//Checks that value contains only 4 numerical digits.
function CheckFourDigits(argVal){
	var regexp = /^\d{4}$/;
	return regexp.test(argVal);
}
//Checks that value contains only 3 numerical digits.
function CheckThreeDigits(argVal){
	var regexp = /^\d{3}$/;
	return regexp.test(argVal);
}
//Checks that value contains only 2 numerical digits.
function CheckTwoDigits(argVal){
	var regexp = /^\d{2}$/;
	return regexp.test(argVal);
}
//Checks that value contains only numerical digits with two decials "1345.34".
function CheckTwoDec(argVal) {
	var regexp = /^\d*\.\d{2}$/;
	return regexp.test(argVal);
}
//Checks that value contains Currency  with $ and two decimals "$345.34".
function CheckCurrencyTwoDec(argVal) {
	var regexp = /^\$[0-9]+(\.[0-9][0-9])?$/;
	return regexp.test(argVal);
}

//Disables certain form fields respective of a radio button onclick="disableCredit()"
function disableCredit(){
	//make DIRECT enabled
	document.details.bank_name.disabled = false; 
	document.details.bank_branch.disabled = false;
	document.details.bank_bsb.disabled = false;
	document.details.bank_accountno.disabled = false;
	document.details.bank_account_holder_name.disabled = false;

	//make DIRECT required
	document.details.bank_name.id = "rBankName"; 
	document.details.bank_branch.id = "rBranch";
	document.details.bank_bsb.id = "rBSB";
	document.details.bank_accountno.id = "rAccountNo";
	document.details.bank_account_holder_name.id = "rAccountName";

	//make DIRECT background normal color
	document.details.bank_name.style.background=""; 
	document.details.bank_branch.style.background=""; 
	document.details.bank_bsb.style.background=""; 
	document.details.bank_accountno.style.background=""; 
	document.details.bank_account_holder_name.style.background=""; 

	//make CREDIT disabled
	document.details.card_type[0].disabled = true; 
	document.details.card_type[1].disabled = true; 
	document.details.card_type[2].disabled = true; 
	document.details.card_type[3].disabled = true; 
	document.details.expiry_month.disabled = true;
	document.details.expiry_year.disabled = true;
	document.details.cardholder_number.disabled = true;
	document.details.cardholder_name.disabled = true;
	
	//make CREDIT not required
	document.details.card_type[0].id = "CardType"; 
	document.details.card_type[1].id = "CardType"; 
	document.details.card_type[2].id = "CardType"; 
	document.details.card_type[3].id = "CardType"; 
	document.details.expiry_month.id = "ExpiryMonth";
	document.details.expiry_year.id = "ExpiryYear";
	document.details.cardholder_number.id = "CardNumber";
	document.details.cardholder_name.id = "HolderName";
	
	//make CREDIT background disabled color
	document.details.card_type[0].style.background="#bbbbbb"; 
	document.details.card_type[1].style.background="#bbbbbb";
	document.details.card_type[2].style.background="#bbbbbb";
	document.details.card_type[3].style.background="#bbbbbb";
	document.details.expiry_month.style.background="#bbbbbb";
	document.details.expiry_year.style.background="#bbbbbb";
	document.details.cardholder_number.style.background="#bbbbbb";
	document.details.cardholder_name.style.background="#bbbbbb";
}

//Disables certain form fields respective of a radio button onclick()
function disableDirect(){
	//make DIRECT disabled
	document.details.bank_name.disabled = true; 
	document.details.bank_branch.disabled = true;
	document.details.bank_bsb.disabled = true;
	document.details.bank_accountno.disabled = true;
	document.details.bank_account_holder_name.disabled = true;

	//make DIRECT not required
	document.details.bank_name.id = "BankName"; 
	document.details.bank_branch.id = "Branch";
	document.details.bank_bsb.id = "BSB";
	document.details.bank_accountno.id = "AccountNo";
	document.details.bank_account_holder_name.id = "AccountName";

	//make DIRECT background disabled color
	document.details.bank_name.style.background="#bbbbbb"; 
	document.details.bank_branch.style.background="#bbbbbb"; 
	document.details.bank_bsb.style.background="#bbbbbb"; 
	document.details.bank_accountno.style.background="#bbbbbb"; 
	document.details.bank_account_holder_name.style.background="#bbbbbb"; 

	//make CREDIT enabled
	document.details.card_type[0].disabled = false; 
	document.details.card_type[1].disabled = false; 
	document.details.card_type[2].disabled = false; 
	document.details.card_type[3].disabled = false; 
	document.details.expiry_month.disabled = false;
	document.details.expiry_year.disabled = false;
	document.details.cardholder_number.disabled = false;
	document.details.cardholder_name.disabled = false;
	
	//make CREDIT required
	document.details.card_type[0].id = "rCardType"; 
	document.details.card_type[1].id = "rCardType"; 
	document.details.card_type[2].id = "rCardType"; 
	document.details.card_type[3].id = "rCardType"; 
	document.details.expiry_month.id = "rExpiryMonth";
	document.details.expiry_year.id = "rExpiryYear";
	document.details.cardholder_number.id = "rCardNumber";
	document.details.cardholder_name.id = "rHolderName";

//make Credit background normal color
	document.details.card_type[0].style.background=""; 
	document.details.card_type[1].style.background=""; 
	document.details.card_type[2].style.background=""; 
	document.details.card_type[3].style.background=""; 
	document.details.expiry_month.style.background=""; 
	document.details.expiry_year.style.background=""; 
	document.details.cardholder_number.style.background="";
	document.details.cardholder_name.style.background=""; 
}

//change the color of all disabled fields on load 
//<body onload="javascript:start();">
function disabledColor(){
	var count = 0;
	for(var i = 0; i < document.details.elements.length; i++) {
		if(document.details.elements[i].disabled == true) {
			document.details.elements[i].style.background="#bbbbbb";
			count += 1;
		}
	}
}

//Disables certain address fields respective of a checkbox onclick()
function disableAddress(currentElement){
	if (currentElement.checked) {
		//make address fields disabled
		document.details.order_address.disabled = true; 
		document.details.order_suburb.disabled = true;
		document.details.order_state.disabled = true;
		document.details.order_postcode.disabled = true;
		document.details.order_country.disabled = true;
		//make address background disabled color
		document.details.order_address.style.background="#bbbbbb"; 
		document.details.order_suburb.style.background="#bbbbbb"; 
		document.details.order_state.style.background="#bbbbbb"; 
		document.details.order_postcode.style.background="#bbbbbb"; 
		document.details.order_country.style.background="#bbbbbb"; 
	}else if(!currentElement.checked) {
		//make address fields enabled
		document.details.order_address.disabled = false; 
		document.details.order_suburb.disabled = false;
		document.details.order_state.disabled = false;
		document.details.order_postcode.disabled = false;
		document.details.order_country.disabled = false;
		//make address background normal color
		document.details.order_address.style.background=""; 
		document.details.order_suburb.style.background=""; 
		document.details.order_state.style.background=""; 
		document.details.order_postcode.style.background=""; 
		document.details.order_country.style.background=""; 
	}
}

