function checkPhone(field,displayName,noAlert,allowCountryCode)
{
	var origVal = field.value;
	var countryCodeRE = /^\s*\+\s*\d+\s+/;
	var nanpaCountryCodeRE = /^\s*\+\s*1\s+(.*)$/;
	
	if (allowCountryCode && countryCodeRE.test(origVal))
	{
		// If not NANPA (North American Numbering Plan Area) then allow any format
		if (!nanpaCountryCodeRE.test(origVal))
			return true;
			
		// Otherwise, remove the country code ("+1") and let the rest of the function check the remaining value
		field.value = origVal.replace(nanpaCountryCodeRE,"$1"); 
		origVal = field.value;
	}

	var allDashes = false;
	var phoneFormat = window.globalPhoneFormat;
	if (!phoneFormat && window.opener && window.opener.parent)
		phoneFormat = window.opener.parent.globalPhoneFormat;
	if (!phoneFormat && window.parent)
		phoneFormat = window.parent.globalPhoneFormat;
		
	if (!phoneFormat)
		phoneFormat = "(111) 111-1111";
		
	var allDashes = !/^\(/.test(phoneFormat);
		
	var newVal = "";
	var re = /^\d$/;
	for(var i=0; i<origVal.length; i++)
	{
		theChar = origVal.charAt(i);
		if(re.test(theChar))
			newVal += theChar;
	}
	if((newVal.length!=10 && newVal.length!=11) || (newVal.length==11 && newVal.indexOf("1")!=0) )
	{
		if(!noAlert)
		{
			if (allDashes)
				alert("The format for " + displayName + " must be " + (newVal.length==11?"1-":"") + "999-999-9999.");
			else
				alert("The format for " + displayName + " must be " + (newVal.length==11?"1 ":"") + "(999) 999-9999.");
		}
		return false;
	}
	else
	{
		if (allDashes)
		{
			if(newVal.length==11)
			{
				field.value = "1-" + newVal.substring(1,4) + "-" +
					newVal.substring(4,7) + "-" + newVal.substring(7,11);
			}
			else
			{
				field.value = newVal.substring(0,3) + "-" +
					newVal.substring(3,6) + "-" + newVal.substring(6,10);
			}
		}
		else
		{
			if(newVal.length==11)
			{
				field.value = "1 (" + newVal.substring(1,4) + ") " +
					newVal.substring(4,7) + "-" + newVal.substring(7,11);
			}
			else
			{
				field.value = "(" + newVal.substring(0,3) + ") " +
					newVal.substring(3,6) + "-" + newVal.substring(6,10);
			}
		}
		return true;
	}
	return true;
}


function formElement(formElementName,displayName){
	this.formElementName=formElementName;
	this.displayName=displayName;
}

function checkRequiredFields(form,fields,excludeFields,prefix){
	var errors="";

	for (var i=0; i<fields.length;i++){
		var name = fields[i].formElementName;
		if(!excludeFields || !excludeFields[name])
		{
			var obj = form.elements[name];
			if (obj) {
	//alert ("field is " + name + ", type is " + obj.type + ", value is " + obj.value + ", length is " + obj.length);
				if (obj.type == "text" ||
					 obj.type == "textarea" ||
					 obj.type == "password" ||
					 obj.type == "hidden" ||
					 obj.type == "checkbox" ||
					 obj.type == "select-one" ||
					 obj.type == "select-multiple" || obj.type=="radio") {
					if (((obj.type=="checkbox"||obj.type=="radio") && !obj.checked) || obj.value.length == 0) {
						errors += "\n" + (prefix?prefix:"") + fields[i].displayName;
					}
				}
				else if (obj.type != "button" && obj.type != "reset" && obj.type != "submit") {	// must be a radio button array
	//alert ("Checking array, type is " + obj[0].type);
					var bSelected = false;
					for (var j = 0; j < obj.length; j++) {
						if (((obj[j].type == "checkbox" || obj[j].type == "radio") && obj[j].checked) ||
							(obj[j].type == "text" && obj[j].value.length > 0))
							bSelected = true;
					}
					if (!bSelected)
						errors+="\n" + (prefix?prefix:"") + fields[i].displayName;
				}
			}
		}
	}
	return errors;
}

function checkAddressFields(form,location,prefix,addressRequired,fieldNames){
	var required = 0;
	var errors = "";
	var sp = (location=="" || location==null)? "":" "; // Add a space when location
	location = location==null? "":location;
	prefix = prefix==null? "":prefix;

	var address1Name = "address1";
	var address2Name = "address2";
	var cityName = "city";
	var stateName = "state_id";
	var zipCodeName = "zip_code";
	if(fieldNames && fieldNames.length==5)
	{
		address1Name = fieldNames[0];
		address2Name = fieldNames[1];
		cityName = fieldNames[2];
		stateName = fieldNames[3];
		zipCodeName = fieldNames[4];
	}

	if(addressRequired || form[prefix+address1Name] && form[prefix+address1Name].value!="" || form[prefix+address2Name] && form[prefix+address2Name].value!=""){
		required |= 3;
	}
	if(addressRequired || form[prefix+zipCodeName] && form[prefix+zipCodeName].value!=""){
		required |= 2;
	}

	if(addressRequired || form[prefix+cityName] && form[prefix+cityName].value!=""){
		required |= 1;
	}

	if(required>0){
		if(addressRequired && form[prefix+address1Name] && form[prefix+address1Name].value=="")
			errors += "\n* " + location + sp + "Address 1";
		if((required == 2 || required ==3) && form[prefix+cityName] && form[prefix+cityName].value=="")
			errors += "\n* " + location + sp + "City";
		if(form[prefix+stateName] && form[prefix+stateName].value=="")
			errors+="\n* " + location + sp +"State";
		if((required ==1 || required==3) && (form[prefix+zipCodeName] && form[prefix+zipCodeName].value==""))
			errors+="\n* " + location + sp + "Zip Code";
	}
	return errors;
}

function markRequiredAddressFields(form,home,billing,addressRequired,fieldNames)
{
	var address1Name = "address1";
	var address2Name = "address2";
	var cityName = "city";
	var stateName = "state_id";
	var zipCodeName = "zip_code";

	if(fieldNames && fieldNames.length==5)
	{
		address1Name = fieldNames[0];
		address2Name = fieldNames[1];
		cityName = fieldNames[2];
		stateName = fieldNames[3];
		zipCodeName = fieldNames[4];
	}

	var h = (billing?"billing_":"") + (home? "home_":"");

	var hasAddress1 = (form[h+address1Name] && form[h+address1Name].value!="");
	var hasAddress2 = (form[h+address2Name] && form[h+address2Name].value!="");
	var hasCity = (form[h+cityName] && form[h+cityName].value!="");
	var hasState = (form[h+stateName] && form[h+stateName].options[form[h+stateName].selectedIndex].value != "");
	var hasZip = (form[h+zipCodeName] && form[h+zipCodeName].value!="");

	var markHTML = '&' + 'nbsp;<' + 'font color="red">*<' + '/font>';

	var cityMark = new lib_obj(h+"city_required_mark");
	var stateMark = new lib_obj(h+"state_required_mark");
	var zipMark = new lib_obj(h+"zip_required_mark");

	if(addressRequired || hasAddress1 || hasAddress2)
	{
		if(typeof(cityMark.ref) != "undefined")
			cityMark.writeIt(markHTML);
		if(typeof(zipMark.ref) != "undefined")
			zipMark.writeIt(markHTML);
		if(typeof(stateMark.ref) != "undefined")
			stateMark.writeIt(markHTML);
	}
	else if(hasCity)
	{
		if(typeof(cityMark.ref) != "undefined")
			cityMark.writeIt("&"+"nbsp;");
		if(typeof(zipMark.ref) != "undefined")
			zipMark.writeIt(markHTML);
		if(typeof(stateMark.ref) != "undefined")
			stateMark.writeIt(markHTML);
	}
	else if(hasZip)
	{
		if(typeof(cityMark.ref) != "undefined")
			cityMark.writeIt(markHTML);
		if(typeof(zipMark.ref) != "undefined")
			zipMark.writeIt("&"+"nbsp;");
		if(typeof(stateMark.ref) != "undefined")
			stateMark.writeIt(markHTML);
	}
	else
	{
		if(typeof(cityMark.ref) != "undefined")
			cityMark.writeIt("&"+"nbsp;");
		if(typeof(zipMark.ref) != "undefined")
			zipMark.writeIt("&"+"nbsp;");
		if(typeof(stateMark.ref) != "undefined")
			stateMark.writeIt("&"+"nbsp;");
	}

	var addressMark = new lib_obj(h+"address1_required_mark");
	if(addressRequired)
	{
		if(typeof(addressMark.ref) != "undefined")
			addressMark.writeIt(markHTML);
	}
	else
	{
		if(typeof(addressMark.ref) != "undefined")
			addressMark.writeIt("&"+"nbsp;");
	}


}

// function isChecked(obj)
// Determines if the object passed in has been checked.  the object may represent a collection of
// form elements with the same name as long as the elements are of the same type and have a checked property.
function isChecked(obj)
{
	if(obj==null) return false;
	if(typeof(obj[0])=="object")// Houston, we have an array.
	{
		for(var i = 0; i<obj.length; i ++)
			if(obj[i].checked)
			{
				return true;
			}
		return false;
	}
	else
		return obj.checked;
}

function replaceNonPrintingAsciiCharacters(value)
{
	if (value)
	{
		var re = /([^\x20-\xFF\x09\x0A\x0D])/g;
		if (value.search(re) >= 0)
		{
			value = value.replace(/([\u2013])/g,"-");
			value = value.replace(/([\u2014])/g,"-");
			value = value.replace(/([\u2019])/g,"'");
			value = value.replace(/([\u2026])/g,"...");
			value = value.replace(/([\u201C])/g,"\"");
			value = value.replace(/([\u201D])/g,"\"");
			value = value.replace(re,"");
		}
	}
	return value;
}

