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 checkEmail( email, allowFullname )
{
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 ;

}

