/*###################################################### */
/*###################################################### */
/*###################################################### */

/*
  Copyright Lutz Eymers <ixtab@polzin.com>, 1997
  Polzin GmbH, Duesseldorf
*/

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 Check_eMailAdr( 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 Check_eMail( email_field, allowFullname ) {
	//
	email = email_field.value;
	//
	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 Check_eMailAdr( email );
	//
	if(    ( (emailBegin == -1) && (emailEnd != -1) )
	    || ( (emailBegin != -1) && (emailEnd == -1) ) )
	  return false;
	//
	adress = email.substring( emailBegin+1, emailEnd );
	if( ! Check_eMailAdr( 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;
}

/*
Es folgt eine kurze Übersicht über die definierten Funktionen

isDigit( ch ) : wahr, wenn das Zeichen eine Zahl ist 
isAlpha( ch ) : wahr, wenn das Zeichen ein Buchstabe ist 
isAlnum( ch ) : wahr, wenn das Zeichen alphanumerisch ist 
notIn( str1, str2 ) : wahr, wenn kein Zeichen aus str2 in str1 vorkommt 

checkUsername( username, mustBeQuoted ) : wahr, wenn der Username gültig ist 
checkNr( nr ) : wahr, wenn eine Zifferfolge vorliegt 
checkIpnr( ipnr ) : wahr, wenn IP-Adresse als gütig eingestuft wurde 
checkFqdn( fqdn ) : wahr, wenn der Fully Qualified Domain Name als gütig eingestuft wurde 
checkHostname( hostname ) : wahr, wenn der Hostname als gütig eingestuft wurde 

Check_eMailAdr( address ) : wahr, wenn die E-mail ohne Realname als gütig eingestuft wurde 

Check_eMail( email, allowFullname ) : wahr, wenn die E-Mail Adresse als gütig eingestuft wurde,
	wobei der zweite Parameter festlegt, ob Realname akzeptiert werden oder nicht 

Das Script zerlegt eine E-Mail Adresse sukzessive in ihre semantische Bestandteile und
überprüft diese dann einzeln auf syntaktische Korrektheit. 
*/
