// some code borrowed from Javascript.com
// whole script requires Javascript 1.2

function isReasonableEmail(addr) {
	var eMail = (new String(addr)).toLowerCase();
	var validation = new Array();
	validation[0] = -1;
	var problems = new Array();
	// The following code is from JavaScript.com, modified.
	/* The following variable tells the rest of the function whether or not to verify that the address ends in a 
	two-letter country or well-known TLD.  1 means check it, 0 means don't. */
	var checkTLD=1;
	/* The following is the list of known TLDs that an e-mail address must end with. */
	var knownDoms = "aero,asia,biz,cat,com,coop,edu,gov,info,int,jobs,mil,mobi,museum,name,net,org,pro,tel,travel"
	var knownDomsPat=/^(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel)$/;
	/* The following pattern is used to check if the entered e-mail address fits the user@domain format.  
	It also is used to separate the username from the domain. */
	var emailPat=/^(.+)@(.+)$/;
	/* The following string represents the pattern for matching all special characters.  We don't want to allow 
	special characters in the address.  These characters include ( ) < > @ , ; : \ " . [ ] */
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	/* The following string represents the range of characters allowed in a username or domainname.  
	It really states which chars aren't allowed.*/
	var validChars="\[^\\s" + specialChars + "\]";
	/* The following pattern applies if the "user" is a quoted string (in which case, there are no rules about which 
	characters are allowed and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com is a legal e-mail address. */
	var quotedUser="(\"[^\"]*\")";
	/* The following pattern applies for domains that are IP addresses, rather than symbolic names.  
	E.g. joe@[123.124.233.4] is a legal e-mail address. NOTE: The square brackets are required. */
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	/* The following string represents an atom (basically a series of non-special characters.) */
	var atom=validChars + '+';
	/* The following string represents one word in the typical username.  For example, in john.doe@somewhere.com, john 
	and doe are words.  Basically, a word is either an atom or quoted string. */
	var word="(" + atom + "|" + quotedUser + ")";
	// The following pattern describes the structure of the user
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	/* The following pattern describes the structure of a normal symbolic domain, as opposed to ipDomainPat, shown above. */
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");

	/* Finally, let's start trying to figure out if the supplied address is valid. */
	/* Begin with the coarse pattern to simply break up user@domain into different pieces that are easy to analyze. */
	var matchArray=eMail.match(emailPat);
	
	if (matchArray==null) {
		/* Too many/few @'s or something; basically, this address doesn't
		even fit the general mould of a valid e-mail address. */
		problems.push("\nThe eMail Address seems incorrect (check @ and .'s)");
		validation[0] = 0;
	} else {
		var user=matchArray[1];
		var domain=matchArray[2];
		
		// Start by checking that only basic ASCII characters are in the strings (0-127).
		for (i=0; i<user.length; i++) {
			if (user.charCodeAt(i)>127) {
				problems.push("\nThe username contains invalid characters.");
				validation[0] = 0;
		   }
		}
		for (i=0; i<domain.length; i++) {
			if (domain.charCodeAt(i)>127) {
				problems.push("\nThe eMail Address contains illegal characters.");
				validation[0] = 0;
		   }
		}
		
		// See if "user" is valid 
		if (user.match(userPat)==null) {
			// user is not valid
			problems.push("\nThe eMail Address appears to have an error in the user name.");
			validation[0] = 0;
		}
		
		// if the e-mail address is at an IP address (as opposed to a symbolic host name) make sure the IP address is valid. 
		var IPArray=domain.match(ipDomainPat);
		if (IPArray!=null) {  // this is an IP address
			for (var i=1;i<=4;i++) {
				if (IPArray[i]>255) {
					problems.push("\nThe entered eMail Address contains an invalid IP address.");
					validation[0] = 0;
			   }
			}
		} else {  // Domain is symbolic name.  Check if it's valid.
			var atomPat=new RegExp("^" + atom + "$");
			var domArr=domain.split(".");
			var len=domArr.length;
			for (i=0;i<len;i++) {
				if (domArr[i].search(atomPat)==-1) {
					problems.push("\nThe eMail address' domain name does not seem to be valid.");
					validation[0] = 0;
			   }
			}
			/* domain name seems valid, but now make sure that it ends in a known top-level domain (like com, edu, gov) or a 
			two-letter word, representing country (uk, nl), and that there's a hostname preceding the domain or country. */
			if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
				problems.push("\nThe eMail Address must end in a well-known domain (eg. " + knownDoms + ") or two letter country.  ("+domArr[domArr.length-1].length+" submitted).");
				validation[0] = 0;
			} else if (len<2) {  // Make sure there's a host name preceding the domain.
				problems.push("\nThe eMail Address requires a hostname after the @ symbol.");
				validation[0] = 0;
			}
		}
	}
	// End borrowed code
	validation[1] = problems;
	return validation;
}

/***********************************************************************************************************************
Function that uses Regular Expressions to validate telephone numbers.
--Expects US phone number patterns with area code.
--Requires JavaScript 1.2
--Input: string phone number
--Return: two-slot array.
	array[0] = true/false
	array[1] = error message / result description

Largely stolen from http://devedge.netscape.com/library/manuals/2000/javascript/1.3/guide/regexp.html#1010922
************************************************************************************************************************/
function isReasonablePhoneNumber(candidate) {
	//  "\(?\d{3}\)?([ -\/\.])?" = 1 or 0 "("s, 3 digits, 1 or 0 ")"s, then 1 or 0 of " ","-","/", or "."
	//  "\d{3}[ -\/\.]?\d{4}" = 3 digits; a " ","-","/","."; then 4 digits
	//  "( ?x\d+)? = (1 or 0 " "s, an "x", then 1 or more digits) or nothing at all
	var regEx = /^\(?\d{3}\)?[ -\/\.]?\d{3}[ -\/\.]?\d{4}( ?x\d+)?$/;
	var OK = new Array();
	
	// Test the candidate string.  If it doesn't match, say so.
	OK[0] = regEx.test(candidate);
	if (!OK[0]) { 
		OK[1] = "\n\tPhone or fax number does not conform to expected patterns.\n\tPlease make sure you include an area code and preceed any extension with an \"X\"";
	}
	
	// return the results.
	return OK;
}