function countryChanged(element)
{
	function $(id){return document.getElementById(id);}
	
	if (element.value == 'US')
	{
		$('state').style.display = "inline";
		$('state_label').style.display = "inline";
	}
	else
	{
		$('state').style.display = "none";
		$('state_label').style.display = "none";
	}
}

function setErrors(element, errorClass, labelErrorClass, multiPart)
{
	if (!multiPart)
	{
		if (element.id != 'tos')
			element.className = errorClass;
		document.getElementById(element.id + '_label').className = labelErrorClass;
	}
	else
	{
		element.className = errorClass;
		document.getElementById(element.id + '_label').style.display = "inline";
	}
}

function clearErrors(element, defaultInputClass, defaultLabelClass)
{
	if (element.id != 'tos')
		element.className = defaultInputClass;
	document.getElementById(element.id + '_label').className = defaultLabelClass;
}

function clearMultiPartErrors(element, defaultClass)
{
	element.className = defaultClass;
	document.getElementById(element.id + '_label').style.display = "none";
}

function validateField(element, minLength)
{
	if (element.value.length < minLength) 
		return false;
	
	return true;
}

function validateCardWithoutType(element)
{
	var number=element.value.replace(/\D/g, '');
	var number_length=number.length;
	var parity=number_length % 2;
	var total=0;
	
	if (number_length >= 13 && number_length <= 16)
	{
		for (i=0; i < number_length; i++) 
		{	
			var digit=number.charAt(i);
			if (i % 2 == parity) 
			{
				digit=digit * 2;

				if (digit > 9)
					digit=digit - 9;
			}

			total = total + parseInt(digit);
		}

		if (total % 10 == 0)
			return true;
	}

    return false;
}

function validateCard (element, elementCardType) 
{
	var number=element.value.replace(/\D/g, '');
	var number_length=number.length;
	var parity=number_length % 2;
	var total=0;
	
	if ((elementCardType.value == "Visa" && number_length == 13) || number_length == 16)
	{
		for (i=0; i < number_length; i++) 
		{	
			var digit=number.charAt(i);
			if (i % 2 == parity) 
			{
				digit=digit * 2;

				if (digit > 9)
					digit=digit - 9;
			}

			total = total + parseInt(digit);
		}

		if (total % 10 == 0)
			return true;
	}

    return false;
}

function validateCvv(element)
{
   if ((element.value.length != 3 && element.value.length != 4) || isNaN(parseInt(element.value))) 
	   return false;
   
   return true;
}

function validatePhone(element, elementCountry)
{
	// Strip out acceptable non-numeric characters
	var stripped = element.value.replace(/[\(\)\.\-\ ]/g, '');
	
	if (stripped.length == 10)
		return true;
		
	if (stripped.length > 1 && stripped.length <= 40 && elementCountry.value != "US")
		return true;
	
	return false;
}

function validateEmail(element)
{
	if (element.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != 0) 
		return false;
	
	return true;
}

function validateEmails(element, element2)
{
	if (element.value != element2.value)
		return false;
	
	return validateEmail(element);
}

function validateState(element, elementCountry)
{	
	if (elementCountry.value == "US" && element.value == 'NA')
		return false;
	
	return true;
}

function validateTos(element)
{
	if (element != null && !element.checked)
		return false;
	
	return true;
}

function validateZipcode(element, elementCountry)
{
	if (elementCountry.value != "US")
		return true;
	
	var validZipcode = /^\d{5}([\-]\d{4})?$/;
	return validZipcode.test(element.value);
}

function validateSelect(element, invalidValue)
{
	if (element.value == invalidValue)
		return false;
	
	return true;
}

function validateSupportForm(formElement, errorClass, labelErrorClass)
{
	function $(id){return document.getElementById(id);}
	
	var errorCount = 0;
	var errMessage = '';
	if (!validateField($('name'), 1)) { setErrors($('name'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Name"; }
	if (!validateEmail($('email'))) { setErrors($('email'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Email"; }
	if (!validateSelect($('issueType'), "0")) { setErrors($('issueType'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Type of Issue"; }
	if (!validateField($('issue'), 20)) { setErrors($('issue'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Issue: Please give more details (Minimum 20 characters.)"; }
	
	if (errorCount > 0)
	{
		alert("There were " + errorCount + " errors. Please correct these." + errMessage);
		return false;
	}
	
	formElement.submit();
	return true;
}

function validatePaymentFormWithShipping(formElement, errorClass, labelErrorClass)
{
	function $(id){return document.getElementById(id);}
	
	var errorCount = 0;
	var errMessage = '';
	if (!validateField($('fname'), 1)) { setErrors($('fname'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid First Name"; }
	if (!validateField($('lname'), 1)) { setErrors($('lname'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Last Name"; }
	if (!validateField($('address'), 3)) { setErrors($('address'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Address"; }
	if (!validateField($('city'), 2)) { setErrors($('city'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid City"; }
	if (!validateZipcode($('zip'), $('country'))) { setErrors($('zip'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Zip: Must be either ##### or #####-#### format."; }
	if (!validatePhone($('phone'), $('country'))) { setErrors($('phone'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Home Phone: Must have area code"; }
	if (!validateEmails($('email'), $('email2'))) { setErrors($('email'), errorClass, labelErrorClass, false); setErrors($('email2'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Email"; }
	if (!validateState($('state'), $('country'), errorClass, false)) { setErrors($('state'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid State or Country"; }
	if (!validateField($('password'), 6)) { setErrors($('password'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Desired Password: Must be at least 6 characters in length."; }
	if (!validateCardWithoutType($('cc'))) { setErrors($('cc'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Card Number"; }

	if (!validateField($('bfname'), 1)) { setErrors($('bfname'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Billing First Name"; }
	if (!validateField($('blname'), 1)) { setErrors($('blname'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Billing Last Name"; }
	if (!validateField($('baddress'), 3)) { setErrors($('baddress'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Billing Address"; }
	if (!validateField($('bcity'), 2)) { setErrors($('bcity'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Billing City"; }
	if (!validateZipcode($('bzip'), $('bcountry'))) { setErrors($('bzip'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Billing Zip: Must be either ##### or #####-#### format."; }
	if (!validateState($('bstate'), $('bcountry'), errorClass, false)) { setErrors($('bstate'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Invalid Billing State or Billing Country"; }

	if (!validateTos($('tos'))) { setErrors($('tos'), errorClass, labelErrorClass, false); errorCount++; errMessage += "\r\n- Please accept the Terms of Service"; }
	
	if (errorCount > 0)
	{
		alert("There were " + errorCount + " errors. Please correct these." + errMessage);
		return false;
	}
	
	formElement.submit();
	return true;
}