// taken from EmailSyntax.cpp on the client

function isValidEmail(email)
{
  var lastChar=' ';
  var atLeastOnePeriod=false;
  var i;

  // Validate that no invalid characters are in string up to @
  for(i=0;i<email.length;i++)
  {
    var cur=email.charAt(i);
    if(cur=='.')
    {
      if(lastChar=='.')
        return false;
      else
      {
        lastChar=cur;
        continue;
      }
    }
    else lastChar=cur;

    // If not printable ascii or a space
    if(!isascii(cur))
      return false;

    // Handle the '@' special case
    if(cur=='@') 
    {
      if(i==0)
        return false; // no chars before @
      break;
    }

    // According to RFC822, the specials 
    // invalid characters: ()<>,;:"
    // I wish there was a slightly more elegant technique, but
    // this should still be faster as an unrolled search loop
    if((cur == ' ') ||
       (cur == '(') ||
       (cur == ')') ||
       (cur == '<') ||
       (cur == '>') ||
       (cur == ',') ||
       (cur == ';') ||
       (cur == ':') ||
       (cur == '"') ||
       (cur == '[') ||
       (cur == ']') ||
       (cur == '\\')) {
        return false;
    }
  }

  // Ok did we hit '@' or the end
  if(email.charAt(i)=='@') i++;
  else return false;
   
  // Ok now look for valid domain pattern

  // first char
  if(isalnum(email.charAt(i)))
    i++;
  else return false;

  // middle
  lastChar=email.charAt(i-1); // Set up for '..' check

  for(;i<email.length;i++)
  {
    // '..' check
    var cur=email.charAt(i);
    if(cur=='.')
    {
      atLeastOnePeriod=true;
      if(lastChar=='.')
        return false;
      else
      {
        lastChar=cur;
        continue;
      }
    }
    else lastChar=cur;

    // Common case
    if(isalnum(cur))
      continue;

    // Handle the '-' special case
    if(cur=='-')
      continue;  

    // If we get here, it is bad
    return false;
  }

  // last char
  if(!isalnum(email.charAt(email.length-1)))
    return false; 

  if(!atLeastOnePeriod)
    return false;
  
  // We got to the end properly
  return true;
}

// implementation of C function isalnum (digit or letter or underscore)
var alnumChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
function isalnum(ch)
{
  return(alnumChars.indexOf(ch)!=-1);
}
 
// checks where char code is >=33 and <127 (printable ascii)
var asciiChars=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
function isascii(ch)
{
  return(asciiChars.indexOf(ch)!=-1);
}

