  /*
   *  checkEmail.js 1.12 16/06/2003
   *  checkEmail.js 1.11 31/01/2001
   *  checkEmail.js 1.1  20/09/1999
   *
   * Javascript function for validating the syntax of an email address
   * according to RFC819 (Appendix A: BNF Specification)
   *
   * Copyright (c) 1997 Polzin GmbH, Duesseldorf. All Rights Reserved.
   * Author: Lutz Eymers <ixtab@polzin.com>
   *
   * Permission to use, copy, modify, and distribute this software
   * and its documentation for any purposes and without fee
   * is hereby granted provided that this copyright notice
   * appears in all copies. 
   *
   * Of course, this soft is provided "as is" without express or implied
   * warranty of any kind.
   *
   */
  
  function isDigit( ch )
  {
    if ( (ch >= '0') && (ch <= '9') )
      return true;
    else
      return false;
  }
  
  
  function isAlpha( ch )
  {
    if ( ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) )
      return true;
    else
      return false;
  }
  
  
  function isAlnum( ch )
  {
    if ( isAlpha( ch ) || isDigit( ch ) )
      return true;
    else
      return false;
  }
  
  
  function notIn( str1, str2 )
  {
    var i = 0;
    var j = str2.length; 
    for( ; i<j; i++ )
    {
      var str3 =  str2.charAt(i);
      if( str1.indexOf( str3 ) != -1 )
        return false;
    }
    return true;
  }
  
  
  function checkUsername( username, mustBeQuoted )
  {
    var i = 0;
    var j = username.length;
    if ( username.charAt(0) != '"' )
    {
      for( i=j-1; i>=0; i-- )
      {
        if ( (username.charAt(i) < ' ') || (username.charAt(i) > '~') || !notIn ( mustBeQuoted, username.charAt(i) ) )
          if ( i==0 || username.charAt(i-1) != '\\' ) 
            return false;
          else
            i--
      }  
    }
    else
    {
      if ( username.charAt( j-1 ) != '"' || j==1 )
        return false;
      for( i=j-2; i>0; i-- )
      {
        if ( (username.charAt(i) == '\n') || (username.charAt(i) == '\r') || (username.charAt(i) == '\"') )
          if ( username.charAt(i-1) != '\\') 
            return false;
          else
            i--
      }  
    
    }
    return true;
  }
  
  
  function checkNr ( nr )
  {
    var i=0;
    var j=nr.length;
  
    if( j < 1 )
      return false;
  
    for( ; i<j; i++ )
      if( ( nr.charAt(i) < '0' ) || ( nr.charAt(i) > '9' ) )
        return false;
  
    return true;
  }
  
  
  function checkIpnr( ipnr )
  {
    var iL=0;
    var iC=0;
    var i=0;
    var sNr = "";
  
    for( ; i< ipnr.length; i++ )
    {
      if ( ipnr.charAt(i) == '.' )
      {
        if ( !iL || (iL> 3) || parseInt( sNr,10 ) > 255 )
          return false;
        iC++;
        iL = 0; 
        sNr = "";
        continue;
      }
      if ( isDigit ( ipnr.charAt(i) ) )
      {
        iL++;
        sNr = sNr + ipnr.charAt(i);
        continue;
      }
      return false;
    }
  
    if ( parseInt( sNr,10 ) > 255 )
      return false;
    if ( ( (iC==3) && (iL>=1) && (iL<=3) ) || ( (iC==4) && (!iL) )  )
      return true;
    else
      return false;
  }
  
  
  function checkFqdn( fqdn )
  {
    var iL=0;
    var iC=0;
    var i=fqdn.length-1;
  
    if ( (fqdn.charAt(0) == '.') || (fqdn.charAt(0) == '-') )
      return false;
    if ( fqdn.charAt(i) == '.' )
      i=i-1;
      
    for( ; i>=0; i-- )
    {
      if ( fqdn.charAt(i) == '.' )
      {
        if ( ((iL<2||iL>4 )&& !iC) || (iL<1 && iC) ) 
          return false;
        if ( fqdn.charAt(i-1) == '-' )
          return false;
        iC++;
        iL = 0; 
        continue;
      }
      if ( isAlnum ( fqdn.charAt(i) ) )
      {
        iL++;
        continue;
      }
      if ( fqdn.charAt(i) == '-' )
      {
        if ( !iL )
          return false; 
        iL++;
        continue;
      }
      return false;
    }
  
    if ( !iC || (iL<1 && iC) ) {
      return false;
    }
  
    return true;
       
  }
  
  
  function checkHostname( hostname )
  {
    if ( hostname.charAt(0) == '[' )
    {
      if ( hostname.charAt(hostname.length-1) != ']' )
        return false;
      var ipnr = hostname.substring( 1, hostname.length -1 );
        return checkIpnr( ipnr );
    }
  
    if ( hostname.charAt(0) == '#' )
    {
      var nr = hostname.substring( 1, hostname.length );
        return checkNr( nr );
    }
  
    return checkFqdn( hostname );
  }
  
  
  function checkEmailAdr( address )
  {
    var status = true;
    var username = "";
    var hostname = "";
  
    if ( address.length < 6 )
      return false;
  
    var seperate = address.lastIndexOf("@");
    if ( seperate == -1 ) 
      return false;
  
    username = address.substring(0, seperate );
    if ( ! checkUsername( username, '<>()[],;:@" \\' ) )
      return false;
  
    hostname = address.substring(seperate+1, address.length ); 
    if ( ! checkHostname( hostname ) )
      return false;
    
    return true;
  }
  
  
  function checkEmail( email, allowFullname )
  {
    var existFullname = false;
    var status = true;
    var fullname = "";
    var adress = "";
    if ( email.length < 6 )
      return false;
    var emailBegin = email.indexOf("<");
    var emailEnd = email.lastIndexOf(">");
  
    if ( (emailBegin == -1) && (emailEnd == -1) )
      return checkEmailAdr( email );
  
    if ( ( (emailBegin == -1) && (emailEnd != -1) ) 
        || ( (emailBegin != -1) && (emailEnd == -1) ) )
      return false;
   
    adress = email.substring( emailBegin+1, emailEnd );
  
    if ( ! checkEmailAdr( adress ) )
      return false;
      
    if ( email.length == adress.length + 2 )
      return true;  
    else
      if ( ! allowFullname )
        return false;
  
    if ( emailEnd == email.length - 1 )
    {
      if ( emailBegin == 0 )
        return true;
      if ( email.charAt( emailBegin -1 ) != ' ' )
        return false;
      fullname = email.substring( 0, emailBegin-1 );
      return checkUsername ( fullname, '<>()[],;:@" \\' );
    }
  
    return false ;
  
  }

