    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) != '"' )
      {
        if ( (username.charAt(0) <  ' ') || (username.charAt(0) >  '~')
              || !notIn( mustBeQuoted, username.charAt(0) ) )
          return false;
        for( i=1; i<j; i++ )
        {
          if ( ( (username.charAt(i) < ' ') || (username.charAt(i) >  '~')
                || !notIn ( mustBeQuoted, username.charAt(i) ) )
               && ( username.charAt(i-1) != '\\' ) )
            return false;
        }  
      }
      else
      {
        if ( username.charAt( j-1 ) != '"' )
          return false;
        for( i=1; i<j-1; i++ )
        {
          if ( ( (username.charAt(i) == '\n') || (username.charAt(i) == '\r')
                || (username.charAt(i) == '\"') )
              && (username.charAt(i-1) != '\\') )
            return false;
        }  
      
      }
      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 && iC < 2 ) 
            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 < 2 ) || ( !iL && iC==1 ) ) {
        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 < 8 )
        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 checkaddress( email )
    {
     allowFullname = true;
      var existFullname = false;
      var status = true;
      var fullname = "";
      var adress = "";
      if ( email.length < 8 )
        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 ;
    
    }
