/*************************************************************************
  Name      : EMail_Validate_en.js
  Purpose   : JavaScript EMail check function

  Version   : 13-02-2006 JH  Moved error messages outside of the source
  History   : 24-11-2001 JH  Added support for new (4 character) Top Level Domains.
  Language  : English

  Usage     : Description in Basics Help.htm
  variables : 
  functions : function emailCheck(emailStr)
*/


var emNoEmailAddr   = "Email address seems incorrect (check @ and dots)\n\tPlease try again.";
var emInvalidName   = "Email address seems incorrect (check the username, this is the part before @).";
var emInvalidIP     = "Email address seems incorrect (check IP address)\n\tPlease try again.";
var emInvalidDomain = "Email address seems incorrect (check the domain name, this is the part after @)\n\tPlease try again.";
var emInvalidTLD    = "Email address seems incorrect (check the domain name, this is the part after the last .)\n\tPlease try again.";
var emInvalidHost   = "Email address seems incorrect (check hostname, this is the part direct after @)\n\tPlease try again.";



function emailCheck (emailStr, report) {
   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 +")*$");
   
   emailStr = trim(emailStr);

   var matchArray=emailStr.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. */
      if (report)
        alert(emNoEmailAddr);
      return false;
   }
   var user=matchArray[1];
   var domain=matchArray[2];

   // See if "user" is valid 
   if (user.match(userPat)==null) {
     // user is not valid
     if (report)
       alert(emInvalidName);
     return false;
   }

   /* 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) {
         if (report)
           alert(emInvalidIP);
         return false;
       }
     }
     return true;
   }

   // Domain is symbolic name
   var domainArray=domain.match(domainPat)
   if (domainArray==null) {
     if (report)
       alert(emInvalidDomain);
     return false
   }

   /* domain name seems valid, but now make sure that it ends in a
      three-letter word (like com, edu, gov) or a two-letter word,
      representing country (uk, nl), and that there's a hostname preceding 
      the domain or country. */

   /* Now we need to break up the domain to get a count of how many atoms
      it consists of. */
   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>=3) {
      // the address must end in a two letter or three letter word.

     if (! ((domArr[domArr.length-1].toLowerCase() == 'aero')   || 
            (domArr[domArr.length-1].toLowerCase() == 'arpa')   || 
            (domArr[domArr.length-1].toLowerCase() == 'biz')    || 
            (domArr[domArr.length-1].toLowerCase() == 'com')    || 
            (domArr[domArr.length-1].toLowerCase() == 'coop')   || 
            (domArr[domArr.length-1].toLowerCase() == 'edu')    || 
            (domArr[domArr.length-1].toLowerCase() == 'gov')    || 
            (domArr[domArr.length-1].toLowerCase() == 'info')   || 
            (domArr[domArr.length-1].toLowerCase() == 'int')    || 
            (domArr[domArr.length-1].toLowerCase() == 'mil')    || 
            (domArr[domArr.length-1].toLowerCase() == 'museum') ||
            (domArr[domArr.length-1].toLowerCase() == 'name')   ||
            (domArr[domArr.length-1].toLowerCase() == 'nato')   ||
            (domArr[domArr.length-1].toLowerCase() == 'net')    || 
            (domArr[domArr.length-1].toLowerCase() == 'org')    ||
            (domArr[domArr.length-1].toLowerCase() == 'asia')   ||
            (domArr[domArr.length-1].toLowerCase() == 'cat')    ||
            (domArr[domArr.length-1].toLowerCase() == 'jobs')   ||
            (domArr[domArr.length-1].toLowerCase() == 'mobi')   ||
            (domArr[domArr.length-1].toLowerCase() == 'tel')    ||
            (domArr[domArr.length-1].toLowerCase() == 'travel') ||
            (domArr[domArr.length-1].toLowerCase() == 'pro'))) {

       if (report)
         alert(emInvalidTLD);
       return false;
     }
   }

   // Make sure there's a host name preceding the domain.
   if (len<2) {
     if (report)
       alert(emInvalidHost);
     return false;
   }

   // If we've gotten this far, everything's valid!
   return true;
}

