// Phone number validation and formatting (JavaScript 1.0 version) 
// 
// $Id: phonenumber.js,v 1.12 2006/05/03 18:05:28 jseverson Exp $ 
// 
// $Log: phonenumber.js,v $ 
// Revision 1.12 2006/05/03 18:05:28 jseverson 
// Setting language variable from get parameter if present. 
// 
// Revision 1.11 2006/03/22 19:16:00 jseverson 
// Adding multi language support for alerts 
// 
// Revision 1.10 2006/02/25 00:53:34 jreed 
// Moved chkPhoneNo() validation function from CRM 
// 
// Revision 1.9 2004/08/02 17:58:00 jreed 
// Fixed phone validation 
// 
// Revision 1.8 2004/07/30 21:43:02 jreed 
// validPhone - Only allow 10 digits for phone in US and Canada 
// 
// Revision 1.7 2004/07/30 20:54:18 jreed 
// Fixed validation functions 
// 
// Revision 1.6 2004/07/30 01:34:00 jreed 
// Changed phone validation function names 
// 
// Revision 1.5 2004/07/22 22:39:09 jreed 
// Added better javascript phone validation 
// 
// Revision 1.4 2002/02/20 18:42:46 nwiggins 
// 
// # removes script tags - forces usage as a javascript src include. no php includes 
// 
// Revision 1.3 2001/07/18 23:07:57 jneil 
// Fixed some problems. 
// 
// Revision 1.2 2001/07/02 06:11:18 vhegde 
// Revision 1.1 2001/05/21 15:53:53 jneil 
// Initial Upload. 
// 
// 
function formatPhone(number,format) { 
	// format = "0" | "none" | ""; 
	// "1" | "()"; 
	// "-" | (user selected separator); 
	// Note: all above must be passed as strings 
	// Otherwise generates an error in comparison 
	var formattedNumber = number + ""; 
	var pre = ""; 
	var area = ""; 
	var trunk = ""; 
	var post = ""; 
	if (number.length == 11) { 
		pre = number.substring(0,1); 
		area = number.substring(1,4); 
		trunk = number.substring(4,7); 
		post = number.substring(7); 
	} 
	else if (number.length == 10) { 
		area = number.substring(0,3); 
		trunk = number.substring(3,6); 
		post = number.substring(6); 
	} 
	else if (number.length == 7) { 
		trunk = number.substring(0,3); 
		post = number.substring(3); 
	} 
	if (format != "" || format != null) { 
		// Use the default U.S. format: 1 (800) 123-4567 
		if (format == "()" || format == "1") { 
			if (number.length == 11) { 
				formattedNumber = pre + " (" + area + ") " + trunk + "-" + post; 
			} 
			else if (number.length == 10) { 
				formattedNumber = "(" + area + ") " + trunk + "-" + post; 
			} 
			else if (number.length == 7) { 
				formattedNumber = trunk + "-" + post; 
			} 
		} 
		// Use a passed separator to hyphenate the output 
		else if (format != "()" || format != "1") { 
			if (number.length == 11) { 
				formattedNumber = pre + format + area + format + trunk + format + post; 
			} 
			else if (number.length == 10) { 
				formattedNumber = area + format + trunk + format + post; 
			} 
			else if (number.length == 7) { 
				formattedNumber = trunk + format + post; 
			} 
		} 
	} 
	return formattedNumber; 
} 
function validPhone(phNumber,format,form,field,required) { 
	// Pass in form and field name 
	// Makes the function reusable 
	// format = "0" | "none" | ""; 
	// "1" | "()"; 
	// "-" | (user selected separator); 
	// Note: all above must be passed as quoted strings 
	// Otherwise generates an error in comparison 
	// required = 0 | false | null for optional; 
	// 1 | true for required; 
	// Note: the above are boolean|numeric, no quotes 
	// VARIABLES USED: 
	// killForm = a numeric flag used to stop or post the form 
	// special = a string of special characters to strip out for validation 
	// phOrig = the stored original user input 
	// phNum = the same, but will be manipulated/changed by the script 
	// phTrunc = the phone number truncated, minus any Ext.; will be changed by the script 
	// phLowCase = the phone number in lowercase; to find "Ext.", "ext", etc. 
	// phLowCaseX = phTrunc in lowercase; to find "x000", "X 000", etc. 
	// phNoExt = the changed number without any extension; sent to the format function 
	// ext = holds the value "Ext" || "ext" || "ex." etc. (if found in the phone number) 
	// x = holds the value "x" || "X" (if found in the phone number) 
	// before = a section of the phone number before an illegal character 
	// after = a section of the phone number after an illegal character 
	// formattedPhone = the final output of both functions v
	var i = 0; 
	var j = 0; 
	var killForm = 0; 
	if (form != null && field != null && form != "" && field != "") { 
		var useForm = true; 
		var phOrig = document[form][field].value; 
		var phNum = document[form][field].value; 
		var phTrunc = document[form][field].value; 
		var phNoExt = document[form][field].value; 
	} 
	else { 
		var useForm = false; 
		var phOrig = validPhone.arguments[0]; 
		var phNum = validPhone.arguments[0]; 
		var phTrunc = validPhone.arguments[0]; 
		var phNoExt = validPhone.arguments[0]; 
	} 
	var formattedPhone = ""; 
	var phLowCase = ""; 
	var phLowCaseX = ""; 
	var before = ""; 
	var after = ""; 
	var x = ""; 
	var ext = ""; 
	var extension = ""; 
	// Add any special characters to strip out here: 
	var special = "()-. ,:;/\|*+#@&="; 
	// If blank and required, kill the form 
	if (phNum == "" && (required == 1 || required == true)) { 
		alert('Sorry! A phone number is required.') 
		// Put the offending field in focus 
		if (useForm) document[form][field].focus(); 
		// Stop the form post 
		return false; 
	} 
	// If it's blank but not required, let it through 
	else if (phNum == "") { 
		return true; 
	} 
	else { 
		// Find "Ext. 000" extensions and separate them out 
		phLowCase = phNum.toLowerCase(); 
		ext = phLowCase.lastIndexOf("ext"); 
		if (ext != -1) { 
			extension = phOrig.substring(ext,phOrig.length); 
			phTrunc = phNum.substring(0,ext); 
			phNoExt = phNum.substring(0,ext); 
		} 
		else { 
			extension = ""; 
		} 
		// This strips out formatting characters for length comparison for (i=0;i 7 && x != -1 && (x == 7 || x == 10 || x == 11)) { 
		// extension = phTrunc.substring(x,phTrunc.length); 
		// phTrunc = phTrunc.substring(0,x); 
		// phNoExt = phNum.substring(0,phNum.indexOf(extension)); 
		// } 
		// } 
		if (phTrunc.length == 11) { 
			// Make sure the first 4 characters (1-800) are numeric 
			for (i=0;i<4;i++) { 
				if (parseInt(phTrunc.charAt(i)) + "" == Number.NaN + "") { 
					killForm = 1; 
				} 
			} 
			// There is no such thing as 2-800 or 1-000 
			if (phTrunc.charAt(0) != "1" && phTrunc.charAt(0) != "0" || phTrunc.charAt(1) == "0") { 
				killForm = 1; 
			} 
		} else if (phTrunc.length == 10) { 
			// Make sure the area code is numeric 
			for (i=0;i<3;i++) { 
				if (parseInt(phTrunc.charAt(i)) + "" == Number.NaN + "") { 
					killForm = 1; 
				} 
			} 
			// No area codes begin with 0 or 1 
			if (phTrunc.charAt(0) == "0" || phTrunc.charAt(0) == "1") { 
				killForm = 1; 
			} 
		} 
		else if (phTrunc.length == 7) { 
			// No phone numbers begin with 0 or 1 
			if (phTrunc.charAt(0) == "0" || phTrunc.charAt(0) == "1") { 
				killForm = 1; 
			} 
		} 
		// A proper US ph# should be 7, 10 or 11 characters now 
		else if (phTrunc.length != 7 && phTrunc.length != 10 && phTrunc.length != 11) { 
			killForm = 1; 
		} 
	} 
	if (killForm == 1) { 
		// Prompt for proper phone number... 
		var msg = "Sorry!\nYou have entered an\ninvalid phone number.\n\nPlease check the number\nand try again."; 
		alert(msg); 
		// Automatically select and focus the phone number form field for easy user correction 
		if (useForm) { 
			document[form][field].select(); 
			document[form][field].focus();
		} 
		// Stop the form post 
		return false; 
	} 
	else { 
		if (format && format != null && format != "" && format != "none" && format != "0") { 
			// If calling field requires phone number formatting 
			phNum = formatPhone(phTrunc,format) + " " + extension; 
		} 
		formattedPhone = phNum; 
		if (useForm) document[form][field].value = formattedPhone; 
		// Garbage collection. Some variables seemed to retain their modified values after exiting? 
		phOrig = phNum = phTrunc = i = j = killForm = formattedPhone = phLowCase = phLowCaseX = phNoExt = before = after = x = ext = extension = null; 
		if (useForm) { 
			return true; 
		} 
		else { 
			return formattedPhone; 
		} 
	} 
} 
// ********************************************************** 
function phoneIsInteger(s) { 
	var i; 
	for (i = 0; i < s.length; i++) { 
		var c = s.charAt(i); 
		if (((c < "0") || (c > "9"))) return false; 
	} 
	return true; 
} 
function phoneStripCharsInBag(s, bag) { 
	var i; 
	var returnString = ""; 
	for (i = 0; i < s.length; i++) { 
		var c = s.charAt(i); 
		if (bag.indexOf(c) == -1) returnString += c; 
	} 
	return returnString; 
} 
function checkInternationalPhone(strPhone,strCountry){ 
	s=phoneStripCharsInBag(strPhone,"()- "); 
	if ((strCountry != "US") && (strCountry != "CA")) return (phoneIsInteger(s) && s.length >= 10); 
	else return (phoneIsInteger(s) && s.length == 10); 
} 
function validPhone(country,cCode,phone,ext,isRequired,label){ 
	if ((country.value == "US") || (country.value == "CA")) { 
		if (phone.value) cCode.value = "01"; 
		else cCode.value = ""; 
	} 
	if (!phone.value && (isRequired || cCode.value || ext.value)){ 
		phone.select(); 
		alert('Please enter your ' + label + '.');
		return false; 
	} 
	if (phone.value && !checkInternationalPhone(phone.value,country.value)){ 
		phone.select(); 
		alert('Please enter a valid ' + label + '.');
		return false; 
	} 
	if (!phoneIsInteger(ext.value)){ 
		ext.select(); 
		alert('Please enter a valid ' + label + ' extension.');
		return false; 
	} 
	if (!cCode.value && (country.value != "US") && (country.value != "CA") && (isRequired || phone.value || ext.value)){ 
		cCode.focus(); 
		alert('Please enter your ' + label + ' country code.');
		return false; 
	} 
	if (!phoneIsInteger(cCode.value)){ 
		cCode.select();
		alert('Please enter a valid ' + label + ' country code.');
		return false; 
	} 
	return true; 
} 
function chkPhoneNo(objPhone) { 
	var valid = 1; 
	var validchar = "0123456789() -+ext."; 
	var i = 0; 
	var phoneNumberDelimiters = "()- +ext."; 
	var normalizedPhone = phoneStripCharsInBag(objPhone.value, phoneNumberDelimiters); 
	if ((normalizedPhone.length > 0) && (normalizedPhone.length < 10)) { 
		alert('Please enter a valid phone number with area code (at least 10 digits)'); 
		objPhone.select(); 
		objPhone.focus(); 
		return false; 
	} 
	for (i=0; i <= objPhone.value.length -1; i++) { 
		if (validchar.indexOf(objPhone.value.charAt(i)) == -1) { 
			alert('Invalid character ' + objPhone.value.charAt(i) + ' entered.'); 
			objPhone.value = ""; 
			objPhone.select(); 
			objPhone.focus(); 
			return false; 
		} 
	} 
	return true; 
} 