/**
 * @param htmlElementId -
 *            Id of the HTML element whose corresponding Apex element has to be
 *            validated
 * @param blankValidationValue -
 *            Value to be used to check if the user has not entered or selected
 *            any value for a field
 * @param blankMessage -
 *            Message to be displayed when the field is blank
 * @param invalidMessage -
 *            Message to be displayed when the field had invalid data
 */
function processApexElement(formId, htmlElementId, sourceElementId, blankValidationValue, blankMessage, invalidMessage){
	
	// Form the HTML field id of the Apex element
	var dataObjectId = formId+':';
	dataObjectId = dataObjectId + sourceElementId;

	// Validate the field
	var validationMessage = validateHtmlElement(dataObjectId, blankValidationValue, blankMessage, invalidMessage);

	// If the validation message is null, field has passed the validation check.
	if(validationMessage == ''){
		// Populate value from Apex field to HTML field to be sent to
		// cybersource
		var dataObject = document.getElementById(dataObjectId);
		var htmlElementObject = document.getElementById(htmlElementId);
		if (null != htmlElementObject) {
			htmlElementObject.value = dataObject.value;
		}
	}
	return validationMessage;
}

/**
 * @param htmlElementId -
 *            Id of the HTML element whose value has to be validated
 * @param blankValidationValue -
 *            Value to be used to check if the user has not entered or selected
 *            any value for a field
 * @param blankMessage -
 *            Message to be displayed when the field is blank
 * @param invalidMessage -
 *            Message to be displayed when the field had invalid data
 */
function validateHtmlElement( htmlElementId,  validationValue,  blankMessage, validationMessage){
	var messageToBeReturned = '';
	var dataObject = document
			.getElementById(htmlElementId);
	if (null == dataObject
			|| dataObject.value == validationValue) {
		messageToBeReturned = blankMessage;
	} 
	else{
		if(htmlElementId.indexOf('bill_to_phone') > -1){

			var bill_to_phone_val = document.getElementById(htmlElementId).value;
			bill_to_phone_val = bill_to_phone_val.replace(/\s+/g, '');
			document.getElementById(htmlElementId).value = bill_to_phone_val;

			if(!checkInternationalPhone(dataObject.value)){
				messageToBeReturned = validationMessage;
			}
		}
		if(htmlElementId.indexOf('bill_to_email') > -1){
			if(!validateEmail(dataObject.value)){
				messageToBeReturned = validationMessage;
			}
		}
		if(htmlElementId.indexOf('bill_to_address_postal_code') > -1){
			if(!validateZip(dataObject.value)){
				messageToBeReturned = validationMessage;
			}
		}
		if(htmlElementId.indexOf('vatNumber') > -1){
			if(dataObject.value == ''){
				messageToBeReturned = validationMessage;
			}
		}
	}
	return appendNewLine(messageToBeReturned);
}

// Validates the credit card number
function validateCreditCard( blankMessage,  validationMessage){
	var cardTypeObjectValue = document.getElementById('card_type').value;
	var cardNumberObjectValue = document.getElementById('card_number').value;
	
	if(null != cardNumberObjectValue && cardNumberObjectValue.value == ''){
		return appendNewLine(blankMessage);
	}
	else if (!validateCCNum(cardTypeObjectValue, cardNumberObjectValue)) {
		return appendNewLine(validationMessage);
	}
	else{
		// Remove the spaces in the card number
		cardNumberObjectValue = htTrim(cardNumberObjectValue);
		document.getElementById('card_number').value = cardNumberObjectValue;
	}
	return '';
}

function validateZip(zip)
{
	var countryObj = document.getElementById('bill_to_address_country');
	if(null != countryObj && countryObj.value != ''){
		if (countryObj.value == 'US') {
			if(zip.match(/^\d{5}([\-]?\d{4})?$/)){
				return true;			
			}
			else{
				return false;
			}
		}
		else{
			return true;
		}	
	}
	return true;
}

// Appends a new line to message if the message is not empty
function appendNewLine(message){
	if(message != ''){
		message += '<br />';
	}
	return message;
}

function validateCCNum(cardType, cardNum) {
	var result = false;
	cardTye = cardType.toUpperCase();
	
	cardNum = htTrim(cardNum);

	var cardLen = cardNum.length;
	var firstdig = cardNum.substring(0, 1);
	var seconddig = cardNum.substring(1, 2);
	var first4digs = cardNum.substring(0, 4);

	switch (cardType) {
	case '001':
		result = ((cardLen == 16) || (cardLen == 13))
				&& (firstdig == '4');
		break;
	case '003':
		var validNums = '47';
		result = (cardLen == 15) && (firstdig == '3')
				&& (validNums.indexOf(seconddig) >= 0);
		break;
	case '002':
		var validNums = '12345';
		result = (cardLen == 16) && (firstdig == '5')
				&& (validNums.indexOf(seconddig) >= 0);
		break;
	case '007':
		var validNums = '068';
		result = (((cardLen == 16) && (firstdig == '3')))
				|| ((cardLen == 15) && ((first4digs == '2131') || (first4digs == '1800')));
		break;
	}
	return result;
}
function validateEmail(str) {

	if (str.match(/^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,7}$/)) {
		return true;
	}
	return false;
}

function checkInternationalPhone(strPhone) {
	
	if (strPhone.match(/^([0-9xX\(\)\/\+ \-]*)$/)) {
		return true;
	}
	return false;
}

function htTrim(s) {
	var i;
	var returnString = "";
	// Search through string's characters one by one.
	// If character is not a whitespace, append to
	// returnString.
	for (i = 0; i < s.length; i++) {
		// Check that current character isn't
		// whitespace.
		var c = s.charAt(i);
		if (c != " ")
			returnString += c;
	}
	return returnString;
}

function displayStateBasedOnCountry(countryApexElement,fieldSet){
	if(null != countryApexElement){

		var billingStateNonUSDiv = fieldSet=='PO'?document.getElementById('poBillingStateNonUS'):document.getElementById('billingStateNonUS');
		var billingStateUSDiv = fieldSet=='PO'?document.getElementById('poBillingStateUS'):document.getElementById('billingState');
		
		if(countryApexElement.value == 'US'){
			billingStateNonUSDiv.style.display = "none";
			billingStateUSDiv.style.display = "block";
		}else{
			billingStateNonUSDiv.style.display = "block";
			billingStateUSDiv.style.display = "none";
		}
		
	}
}

function displayVATNumber(countryApexElement) {
	if (countryApexElement != null) {
		var vatNumberDiv = document.getElementById('vatNumberDiv');
		if(countryApexElement.value == 'GB'){
			vatNumberDiv.style.display = "block";
		} else {
			vatNumberDiv.style.display = "none";
		}
	}
}

function imposeMaxLength(object, maxLength)
{
  return (object.value.length < maxLength);
}

function validateVatNumber(formId, sourceElementId, blankValidationValue, blankMessage){

	var dataObjectId = formId+':';
	dataObjectId = dataObjectId + sourceElementId;

	var dataObject = document.getElementById(dataObjectId);
	if (null == dataObject){
		return '';
	} 
	else if(dataObject.value == blankValidationValue){
		return appendNewLine(blankMessage);
	}
	return '';
}

// Adding dummy line to force update of this Static Resource and override the existing in Production



