	function validateEmailAddress(emailStr)
	{
		var emailPat=/^(.+)@(.+)$/;
		var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
		var validChars="\[^\\s" + specialChars + "\]";
		var quotedUser="(\"[^\"]*\")";
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
		var atom=validChars + '+';
		var word="(" + atom + "|" + quotedUser + ")";
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
		var matchArray=emailStr.match(emailPat);
		if (matchArray==null) {
			return false;
		}
		var user=matchArray[1];
		var domain=matchArray[2];
		
		if (user.match(userPat)==null) {
				return false;
		}
		
		var IPArray=domain.match(ipDomainPat);
		if (IPArray!=null) {
				for (var i=1;i<=4;i++) {
					if (IPArray[i]>255) {
						return false;
					}
				}
				return true;
		}
		
		var domainArray=domain.match(domainPat);
		if (domainArray==null) {
				return false;
		}
		
		var atomPat=new RegExp(atom,"g");
		var domArr=domain.match(atomPat);
		var len=domArr.length;
		if (domArr[domArr.length-1].length<2 || 
				domArr[domArr.length-1].length>6) {
			 return false;
		}
		
		// Make sure there's a host name preceding the domain.
		if (len<2) {
			 return false;
		}
		return true;
	}
	
	function preparePhone(phone)
	{
		return phone.replace(/[\(\)\-\.\s]/gi,"");
	}
	
	function validatePhoneNumber(phone)
	{
		var regex = new RegExp("^\\({0,1}[0-9]{3}\\){0,1}[\\.\\-]{0,1}[0-9]{3}[\\.\\-]{0,1}[0-9]{4}$");
		return regex.test(phone);
	}
	
	function validateRoutingNumber(route)
	{
		var regex = new RegExp("^(0[0-9]|1[012])|(2[1-9]|3[012])|(6[1-9]|7[012])|80$");
		return regex.test(route);
	}

	/////////////////////////////////////////////////////////////////////////////////
	// wrapper function to validate a credit card number
	function isValidCreditCardNumber( cardnumber, cardtype )
	{
		return ( LuhnCheck(cardnumber) && validateCCNum(cardnumber, cardtype) );
	}

	function LuhnCheck(num) 
	{
		var sum = 0;
		var revNum = "";
		var i = 0;
		// First, reverse the CC# and strip out any non-numeric digits
		
		for (i = 0; i < num.length; i++) 
		{
			ch = num.charAt(i);
			if (ch < '0' || ch > '9') 
			{
				continue;
			}
			revNum = ch + revNum;
		}
																		
		for (i = 0; i < revNum.length; i++) 
		{
			var ch = revNum.charAt(i);
			var curNum = parseInt(ch, 10);
			// multiply each 2nd digit by two
			if (i % 2) 
			{
				curNum = curNum * 2;
			}
			// Add the component digits of two-digit numbers together
			if (curNum >= 10) 
			{
				curNum = curNum - 9;
			}
			sum += curNum;
		}
		return (sum % 10 == 0);
	}

	/////////////////////////////////////////////////////////////////////////////////
	// validates a cc number by type and known criterion
	// The 'cardtype' variable is really the 'network' value in AdManage. If the
	// 'other' network is used, modifications will need to made to this file to validate the
	// card numbers.
	function validateCCNum( cardnumber, cardtype )
	{
		var result = false;
		var cardlen = cardnumber.length;
		var firstdig = cardnumber.substring(0,1);
		var seconddig = cardnumber.substring(1,2);
		var first4digs = cardnumber.substring(0,4);
		cardtype = cardtype.toUpperCase();
		
		switch( cardtype ) // the 'cardtype' value is really the 'network' value in AdManage
		{
			case "VISA": // Visa
				result = ( (cardlen == 16) || (cardlen == 13) ) && ( firstdig == "4" );
				break;
			case "AMEX": // American Express
				var validNums = "47";
				result = ( cardlen == 15 ) && ( firstdig == "3" ) && ( validNums.indexOf(seconddig) >= 0 );
				break;
			case "MC": // Mastercard
				var validNums = "12345";
				result = ( cardlen == 16 ) && ( firstdig == "5" ) && ( validNums.indexOf(seconddig) >= 0 );
				break;
			case "DISC": // Discover
				result = ( cardlen == 16 ) && ( first4digs == "6011" );
				break;
			case "DINERS CLUB": // Diners
				var validNums = "068";
				result = ( cardlen == 14 ) && ( firstdig == "3" ) && ( validNums.indexOf(seconddig) >= 0 );
				break;
			case "OTHER": // This code will need to be added if a 'custom' card has been entered into the 'cardTypes' dialog in Admanage
				break;
		}
		return result;
	}
