﻿function isValidEmail (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 countryCodes = new Array ( "AF" , "AL" ,  "DZ" ,  "AS" ,  "AD" ,  "AO" ,  "AI" ,  "AQ" ,  "AG" ,  "AR" ,  "AM" ,  "AW" , 
 	 "AU" ,  "AT" ,  "AZ" ,  "BS" ,  "BH" ,  "BD" ,  "BB" ,  "BY" ,  "BE" ,  "BZ" ,  "BJ" ,  "BM" ,  "BT" ,  "BO" ,  "BA" ,  "BW" , 
	 "BV" ,  "BR" ,  "BN" ,  "BG" ,  "BF" ,  "BI" ,  "KH" ,  "CM" ,  "CA" ,  "CV" , 
	 "KY" ,  "CF" ,  "TD" ,  "CL" ,  "CN" ,  "HK" ,  "CX" ,  "CC" ,  "CO" ,  "KM" ,  "CG" ,  "CD" ,  "CK" ,  "CR" ,  "CI" ,  "HR" , 
	 "CU" ,  "CY" ,  "CZ" ,  "DK" ,  "DJ" ,  "DM" ,  "DO" ,  "TP" ,  "EC" ,  "EG" ,  "SV" ,  "GQ" ,  "ER" ,  "EE" ,  "ET" , 
	 "FK" ,  "FO" ,  "FJ" ,  "FI" ,  "FR" ,  "GF" ,  "PF" ,  "GA" ,  "GM" ,  "GE" ,  "DE" ,  "GH" ,  "GI" ,  "GR" ,  "GL" ,  "GD" , 
	 "GP" ,  "GU" ,  "GT" ,  "GN" ,  "GW" ,  "GY" ,  "HT" ,  "HN" ,  "HU" ,  "IS" ,  "IN" ,  "ID" ,  "IR" ,  "IQ" ,  "IE" ,  "IL" ,  "IT" , 
	 "JM" ,  "JP" ,  "JO" ,  "KZ" ,  "KE" ,  "KI" ,  "KR" ,  "KP" ,  "KW" ,  "KG" ,  "LA" ,  "LV" ,  "LB" ,  "LS" ,  "LR" ,  "LY" , 
	 "LI" ,  "LT" ,  "LU" ,  "MO" ,  "MK" ,  "MG" ,  "MW" ,  "MY" ,  "MV" ,  "ML" ,  "MT" ,  "MH" ,  "MQ" ,  "MR" ,  "MU" ,  "YT" ,  "MX" , 
	 "FM" ,  "MD" ,  "MC" ,  "MN" ,  "MS" ,  "MA" ,  "MZ" ,  "MM" ,  "NA" ,  "NR" ,  "NP" ,  "AN" ,  "NL" ,  "NC" ,  "NZ" ,  "NI" , 
	 "NE" ,  "NG" ,  "NU" ,  "NF" ,  "NO" ,  "OM" ,  "PK" ,  "PW" ,  "PA" ,  "PG" ,  "PY" ,  "PE" ,  "PH" ,  "PN" ,  "PL" , 
	 "PT" ,  "PR" ,  "QA" ,  "RE" ,  "RO" ,  "RU" ,  "RW" ,  "SH" ,  "LC" ,  "WS" ,  "SM" ,  "SA" ,  "SN" ,  "SC" ,  "SL" , 
	 "SG" ,  "SK" ,  "SI" ,  "SB" ,  "SO" ,  "ZA" ,  "ES" ,  "LK" ,  "SD" ,  "SR" ,  "SZ" ,  "SE" ,  "CH" ,  "SY" ,  "TW" ,  "TJ" ,  "TZ" , 
	 "TH" ,  "TG" ,  "TK" ,  "TO" ,  "TT" ,  "TN" ,  "TR" ,  "TM" ,  "TV" ,  "UG" ,  "UA" ,  "AE" ,  "UK" ,  "US" ,  "UY" ,  "UZ" ,  "VU" , 
	 "VA" ,  "VE" ,  "VN" ,  "VG" ,  "VI" ,  "EH" ,  "YE" ,  "YU" ,  "ZM" ,  "ZW" )

	var matchArray=emailStr.match(emailPat);
	if (matchArray==null) 
		return("Email address seems incorrect (check @ and .'s)");
	var user=matchArray[1];
	var domain=matchArray[2];
	if ((user.match(userPat)==null) || (user.charAt(0)=="-") || (user.charAt(user.length-1)=="-") || (user.charAt(0)=="_") || (user.charAt(user.length-1)=="_"))
	    return("The username in email address doesn't seem to be valid.");
	for(var i=0; i<user.length-1; i++)
		{	var ch= user.substring(i, i + 2);
		 	if((ch=="--") || (ch=="-.") || (ch==".-") || (ch=="__") || (ch=="_.") || (ch=="._") || (ch=="_-") || (ch=="-_"))
				return("The username in email address doesn't seem to be valid.");	
		}
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) 
		{	for (var i=1;i>=4;i++) 
				{  if (IPArray[i]>255)
				     return("Destination IP address is invalid!");
				}
		 	return true;
		}
	if ((domain.match(domainPat)==null) || (domain.charAt(0)=="-") || (domain.charAt(domain.length-1)=="-") || (domain.indexOf("_") != -1 ))
		return("The domain name doesn't seem to be valid.");
	for(var i=0; i<domain.length-1; i++)
		{	var ch= domain.substring(i, i + 2);
		 	if(ch=="--" || ch=="-." || ch==".-")
				return("The domain name doesn't seem to be valid.");	
		}
	var atomPat=new RegExp(atom,"g");
	var domArr=domain.match(atomPat);
	var len=domArr.length;
	if (len<2)
	   return("This email address is missing a hostname!");
	var domainExt = domArr[domArr.length-1]
	/*if (domainExt.length<2 || domainExt.length>3)
	   return("The address must end in a three-letter domain, or two letter country.");*/
	if (domainExt.length==2)
		{	var validCountryCode = true;
			for (var i=0; i<countryCodes.length-1; i++)
				{	if (domainExt.toUpperCase()== countryCodes[i])
						{	validCountryCode = true;
							break;	
						}
				}
			if (!validCountryCode)
				return ("This email address is missing a country code!");
		}
	else
		{	for(var i=0; i>3; i++)
				{	if((domainExt.charAt(i) < "a" || "z" < domainExt.charAt(i)) && (domainExt.charAt(i) < "A" || "Z" < domainExt.charAt(i)) && (domainExt.charAt(i)!= ' '))
			   			return("Only letters are accepted in domain extension!");
				}
		}
	return ("Yes");
}
