var sBadColor = "#ffff99";
var sGoodColor = "#ffffff";

// validate product view page
function validate(eForm) {

	var iNumElems = eForm.elements.length;
	
	for (var i=0; i<iNumElems; i++) {

		var eElem = eForm.elements[i];
		
		if (eElem.type == "select-one") {
			var cOpts = eElem.options;
			var iNumOpts = cOpts.length;
			var eOpt = cOpts[0];

			if (eOpt.selected == true) {
				alert("Please " + eOpt.text);
				return false;
			}
		}    
	}
}

// validate quantity entered
function isANumber(sObject) {

	if (isNaN(sObject.value) || (sObject.value <= 0)) {
		alert("'" + sObject.value + "' is not a valid Quantity, please try again");
		sObject.select();
		sObject.focus();
		return false;
	}
}

// copy shipping info
function copyShip(eForm, sObject) {
	
	var iNumElems = eForm.elements.length;
	var bChecked = sObject.checked;
	
	// Copy ship info
	if (bChecked) {
		eForm.billFirst.value = eForm.shipFirst.value;
		eForm.billLast.value = eForm.shipLast.value;
		eForm.billAddress1.value = eForm.shipAddress1.value;	
		eForm.billAddress2.value = eForm.shipAddress2.value;
		eForm.billCity.value = eForm.shipCity.value;
		eForm.billState.value = eForm.shipState.value;
		eForm.billZipCode.value = eForm.shipZipCode.value;
		eForm.billAreaCode.value = eForm.shipAreaCode.value;
		eForm.billPhone.value = eForm.shipPhone.value;
		eForm.billEmail.value = eForm.shipEmail.value;
	} else {
		for (var i=0; i<iNumElems; i++) {
			var sElemName = String(eForm.elements[i].name);
			//alert(sElemName + ":" + sElemName.indexOf("bill"));
			if (sElemName.indexOf("bill") == 0) {
				eForm.elements[i].value = "";
			}
		}
	}
	return false;
}

function copyBill(eForm, sObject) {
	
	var iNumElems = eForm.elements.length;
	var bChecked = sObject.checked;
	
	// Copy ship info
	if (bChecked) {
		eForm.shipCompany.value = eForm.billCompany.value;
		eForm.shipFirst.value = eForm.billFirst.value;
		eForm.shipLast.value = eForm.billLast.value;
		eForm.shipAddress1.value = eForm.billAddress1.value;	
		eForm.shipAddress2.value = eForm.billAddress2.value;
		eForm.shipCity.value = eForm.billCity.value;
		eForm.shipState.value = eForm.billState.value;
		eForm.shipZipCode.value = eForm.billZipCode.value;
		eForm.shipPhone.value = eForm.billPhone.value;
	} else {
		for (var i=0; i<iNumElems; i++) {
			var sElemName = String(eForm.elements[i].name);
			//alert(sElemName + ":" + sElemName.indexOf("ship"));
			if (sElemName.indexOf("ship") == 0) {
				eForm.elements[i].value = "";
			}
		}
	}
	return false;
}

// validate shipbill page
function validateShipBill(eForm) {

	var bRet = true;

	// Required fields
	bRet = checkRequiredFields(eForm, 0);

	// Ship Bill info
	if (bRet)
		bRet = validateShipBillInfo(eForm, 0);
	else
		return bRet;

	// Credit Card MOD-10 check
	if (bRet)
		bRet = validateCreditCard(eForm);
	else
		return bRet;
			
	return bRet;
}

// validate new customer page
function validateNewCustomer(eForm) {

	var bRet = true;

	// Required fields
	bRet = checkRequiredFields(eForm, 1);

	// Ship Bill info
	if (bRet)
		bRet = validateShipBillInfo(eForm, 1);
	else
		return bRet;

	// Credit Card MOD-10 check
	if (bRet)
		bRet = validateCreditCard(eForm);
	else
		return bRet;
			
	return bRet;
}

// check required fields on register form
function checkRegisterRequiredFields(eForm) {

	var iNumElems = eForm.elements.length;
	var iRet = 0;

	for (var i=0; i<iNumElems; i++) {
		var sElemName = String(eForm.elements[i].name);
		var sElemType = eForm.elements[i].type;

		//alert("sElemType=" + sElemType + " : sElemName=" + sElemName);

		if (sElemType != "hidden" && sElemType != "submit" && sElemType != "image" && sElemName != "websiteURL") {

			if (eForm.elements[i].value == "") {
				iRet++;
				eForm.elements[i].style.backgroundColor = sBadColor;
			}  else {
				eForm.elements[i].style.backgroundColor = sGoodColor;
			}
		}
	}

	if (iRet > 0) {
		alert("Please enter all required fields.");
		return false;
	} else {
		return true;
	}
}

// check required fields
function checkRequiredFields(eForm, nCreate) {

	var iNumElems = eForm.elements.length;
	var iRet = 0;

	for (var i=0; i<iNumElems; i++) {
		var sElemName = String(eForm.elements[i].name);
		var sElemType = eForm.elements[i].type;

		//alert("sElemType=" + sElemType + " : sElemName=" + sElemName);

		if (sElemType != "hidden" && sElemType != "submit" && sElemType != "image" && 
				sElemType != "checkbox" && sElemName != "shipAddress2" && sElemName != "billAddress2") {

			if (eForm.elements[i].value == "") {
				iRet++;
				eForm.elements[i].style.backgroundColor = sBadColor;
			}  else {
				eForm.elements[i].style.backgroundColor = sGoodColor;
			}
		}
	}


	if (nCreate == 1) {
		if (eForm.elements.save.checked) {

			if (eForm.elements.password1.value == "") {
				iRet++;
				eForm.password1.style.backgroundColor = sBadColor;
			} else {
				eForm.password1.style.backgroundColor = sGoodColor;
			}
		
			if (eForm.elements.password2.value == "") {
				iRet++;
				eForm.password2.style.backgroundColor = sBadColor;
			} else {
				eForm.password2.style.backgroundColor = sGoodColor;
			}

		} else {
			eForm.password1.style.backgroundColor = sGoodColor;
			eForm.password2.style.backgroundColor = sGoodColor;
		}
	}

	if (iRet > 0) {
		alert("Please enter all required fields.");
		return false;
	} else {
		return true;
	}
}


// validate ship bill data
function validateShipBillInfo(eForm, nCreate) {
	
	var nRet = 0;
	var sMessage = "Error(s):\n";
	
	// ==============================================
	// First and Last names can not be numeric
	// ==============================================
	var sBillFirst = eForm.billFirst.value;
	if (!isNotNumeric(sBillFirst)) {
		nRet++;
		eForm.billFirst.style.backgroundColor = sBadColor;
		sMessage += "Bill to First Name can not be numeric.\n";
	}

	var sBillLast = eForm.billLast.value;
	if (!isNotNumeric(sBillLast)) {
		nRet++;
		eForm.billLast.style.backgroundColor = sBadColor;
		sMessage += "Bill to Last Name can not be numeric.\n";
	}

	var sShipFirst = eForm.shipFirst.value;
	if (!isNotNumeric(sShipFirst)) {
		nRet++;
		eForm.shipFirst.style.backgroundColor = sBadColor;
		sMessage += "Ship to First Name can not be numeric.\n";
	}

	var sShipLast = eForm.shipLast.value;
	if (!isNotNumeric(sShipLast)) {
		nRet++;
		eForm.shipLast.style.backgroundColor = sBadColor;
		sMessage += "Ship to Last Name can not be numeric.\n";
	}

	// ==============================================
	// City can not be numeric
	// ==============================================
	var sBillCity = eForm.billCity.value;
	if (!isNotNumeric(sBillCity)) {
		nRet++;
		eForm.billCity.style.backgroundColor = sBadColor;
		sMessage += "Bill to City can not be numeric.\n";
	}

	var sShipCity = eForm.shipCity.value;
	if (!isNotNumeric(sShipCity)) {
		nRet++;
		eForm.shipCity.style.backgroundColor = sBadColor;
		sMessage += "Ship to City can not be numeric.\n";
	}

	// ==============================================
	// Zip Codes must be numeric and at least 5 chars
	// ==============================================
	var sShipZip = eForm.shipZipCode.value;
	if (sShipZip.length < 5) {
		nRet++;
		eForm.shipZipCode.style.backgroundColor = sBadColor;
		sMessage += "Ship Zip Code must be 5 characters long.\n";
	} else {
		if (isNotNumeric(sShipZip)) {
			nRet++;
			eForm.shipZipCode.style.backgroundColor = sBadColor;
			sMessage += "Ship Zip Code must be numeric.\n";
		}
	}

	var sBillZip = eForm.billZipCode.value;
	if (sBillZip.length < 5) {
		nRet++;
		eForm.billZipCode.style.backgroundColor = sBadColor;
		sMessage += "Bill Zip Code must be 5 characters long.\n";
	} else {
		if (isNotNumeric(sBillZip)) {
			nRet++;
			eForm.billZipCode.style.backgroundColor = sBadColor;
			sMessage += "Bill Zip Code must be numeric.\n";
		}
	}

	// email address
	var sBillEmail = eForm.billEmail.value;
	if (!isEmailValid(sBillEmail)) {
		nRet++;
		eForm.billEmail.style.backgroundColor = sBadColor;
		sMessage += "Invalid email format.\n";
	}

	if (nCreate == 1) {
		// password
		if (eForm.elements.save.checked) {
			var sPassword1 = eForm.password1.value;
			var sPassword2 = eForm.password2.value;

			if (sPassword1.length < 6) {
				nRet++;
				eForm.password1.style.backgroundColor = sBadColor;
				sMessage += "Password must be at least 6 characters long.\n";
			} else {
				if (sPassword1 != sPassword2) {
					nRet++;
					eForm.password2.style.backgroundColor = sBadColor;
					sMessage += "The passwords do not match.\n";
				}
			}
		}
	}

	// ==============================================
	// Return Error Message
	// ==============================================
	if (nRet > 0) {
		alert(sMessage);
		return false;
	} else {
		return true;
	}

	return false;
}

// check tell-a-friend email address
function validReferPage(eForm) {

	var iNumElems = eForm.elements.length;
	var iRet = 0;
	var iEmail, sElemName, sElemType;

	if (eForm.txtSubmit.value == "1") {

		for (var i=0; i<iNumElems; i++) {

			sElemName = String(eForm.elements[i].name);
			sElemType = eForm.elements[i].type;
			iEmail = sElemName.indexOf('email');

			if (iEmail != -1) {

				eForm.elements[i].style.backgroundColor = sGoodColor;

				if (eForm.elements[i].value == "") {
					iRet++;
				}
			}
		}
	}

	if (iRet == 5) {
		alert("Please enter an email address");
		return false;
	}

}

// Validate Email Address
function isEmailValid(sEmailAddress) {
	
	var EmailOk  = true;
	var Temp     = String(sEmailAddress);
	var AtSym    = Temp.indexOf('@');
	var Period   = Temp.lastIndexOf('.');
	var Space    = Temp.indexOf(' ');
	var Length   = Temp.length - 1;   // Array is from 0 to length-1

	// '@' cannot be in first position
	// Must be atleast one valid char btwn '@' and '.'
	// Must be atleast one valid char after '.'
	// No empty spaces permitted
	if ((AtSym < 1) || (Period <= AtSym+1) || (Period == Length) || (Space  != -1)) {  
		EmailOk = false;
	}

	return EmailOk;
}


// validate credit card
function validateCreditCard(eForm) {

	var nRet = 0;
	var sMessage = "Error(s):\n";

	var sCardType = eForm.cardType.value;
	var sCardNumber = eForm.cardNumber.value;
	var sExpMonth = eForm.cardExpMonth.value;
	var sExpYear = eForm.cardExpYear.value;
	
	// card number must be numeric
	if (isNotNumeric(sCardNumber)) {
		eForm.cardNumber.style.backgroundColor = sBadColor;
		sMessage += "Invalid Credit Card Number.\n";
		alert(sMessage);
		return false;
	}
	
	// validate card type and number
	if (sCardType == "AX") {
		if (sCardNumber.substr(0,1) != 3) {
			eForm.cardNumber.style.backgroundColor = sBadColor;
			sMessage += "Invalid American Express number.\n";
			alert(sMessage);
			return false;
		} else {
			if (sCardNumber.length != 15) {
				eForm.cardNumber.style.backgroundColor = sBadColor;
				sMessage += "Invalid American Express number.\n";
				alert(sMessage);
				return false;
			}
		}
	}
	
	if (sCardType == "DI") {
		if (sCardNumber.substr(0,1) != 6) {
			eForm.cardNumber.style.backgroundColor = sBadColor;
			sMessage += "Invalid Discard Card number.\n";
			alert(sMessage);
			return false;
		} else {
			if (sCardNumber.length != 16) {
				eForm.cardNumber.style.backgroundColor = sBadColor;
				sMessage += "Invalid Discard Card number.\n";
				alert(sMessage);
				return false;
			}
		}
	}
	
	if (sCardType == "MC") {
		if (sCardNumber.substr(0,1) != 5) {
			eForm.cardNumber.style.backgroundColor = sBadColor;
			sMessage += "Invalid MasterCard number.\n";
			alert(sMessage);
			return false;
		} else {
			if (sCardNumber.length != 16) {
				eForm.cardNumber.style.backgroundColor = sBadColor;
				sMessage += "Invalid MasterCard number.\n";
				alert(sMessage);
				return false;
			}
		}
	}

	if (sCardType == "VI") {
		if (sCardNumber.substr(0,1) != 4) {
			eForm.cardNumber.style.backgroundColor = sBadColor;
			sMessage += "Invalid Visa number.\n";
			alert(sMessage);
			return false;
		} else {
			if (sCardNumber.length != 16) {
				eForm.cardNumber.style.backgroundColor = sBadColor;
				sMessage += "Invalid Visa number.\n";
				alert(sMessage);
				return false;
			}
		}
	}
	
	// validate card number
	if (!LuhnCheck(sCardNumber)) {
		eForm.cardNumber.style.backgroundColor = sBadColor;
		sMessage += "Invalid Credit Card number.\n";
		alert(sMessage);
		return false;
	}
	
	// validate expiration date
	var sThisDate = new Date();
	var sThisMonth = sThisDate.getMonth()+ 1;
	var sThisYear = sThisDate.getFullYear();
	
	// check expiration date
	var bContinue = false;
	if (sExpYear < sThisYear) {
		bContinue = true;
		sMessage += "Your credit card has expired.";
		eForm.cardExpYear.style.backgroundColor = sBadColor;
		alert(sMessage);
		return false;
	} else {
		if ((sExpYear == sThisYear) && (sExpMonth < sThisMonth)) {
			sMessage += "Your credit card has expired.";
			eForm.cardExpMonth.style.backgroundColor = sBadColor;
			alert(sMessage);
			return false;
		}
	}
	
	return true;
}

// Is Not Numeric
function isNotNumeric(sValue) {
	return isNaN(sValue);
}

// Check Card Number algorithm
function LuhnCheck(sCardNumber) {
  
  var bRet = true;

  var sum = 0; 
  var mul = 1; 
  var strLen = sCardNumber.length;
  
  for (i = 0; i < strLen; i++) {
  
    var digit = sCardNumber.substring(strLen-i-1, strLen-i);
    var tproduct = parseInt(digit, 10) * mul;
  
    if (tproduct >= 10)
      sum += (tproduct % 10) + 1;
    else
      sum += tproduct;
    
    if (mul == 1)
      mul++;
    else
      mul--;
  }
  
  if ((sum % 10) != 0)
    bRet = false;
    
  return bRet;
  
}

// minimum length
function isMinLength(sValue, nMinLength) {
	var bRet = true;
	var sStr = String(sValue);
	var nLength = sStr.length;

	if (nLength < nMinLength)
		bRet = false;

	return bRet;
}

// print page
function printPage() {
	window.print();
}