/**
 * The functions in this script are responsible for checking if
 * an email address provided by the user is valdi.
 */
 
var defaultLanguage = "DE";
var knownLanguages = new Array();
knownLanguages[0] = "DE";
knownLanguages[1] = "EN";

var msgEmailCheck = new Array();
msgEmailCheck["DE"] = new Array();
msgEmailCheck["DE"]["EMAIL_CONFIRM_NOT_IDENTICAL"]  = "Die beiden angegebenen Emailadressen stimmen nicht überein.";
msgEmailCheck["DE"]["INVALID_EMAIL_ADRESS"]         = "Das sieht irgendwie nicht wie eine Emailadresse aus. (Überprüfe @-Zeichen und Punkte.)";
msgEmailCheck["DE"]["INVALID_CHARACTERS_IN_USER"]   = "Der Benutzer (der Teil der Emailadresse vor dem @) enthält ungültige Zeichen.";
msgEmailCheck["DE"]["INVALID_CHARACTERS_IN_DOMAIN"] = "Die Domäne (der Teil der Emailadresse nach dem @) enthält ungültige Zeichen.";
msgEmailCheck["DE"]["INVALID_USER"]                 = "Der Benutzer (der Teil der Emailadresse vor dem @) scheint ungültig zu sein.";
msgEmailCheck["DE"]["INVALID_IP"]                   = "Die IP in der Emailadresse ist nicht gültig.";
msgEmailCheck["DE"]["INVALID_DOMAIN"]               = "Die Domäne (der Teil der Emailadresse nach dem @) scheint nicht gültig zu sein.";
msgEmailCheck["DE"]["INVALID_OR_NO_TLD"]            = "Die Emailadresse muss mit einer bekannten Top-Level-Domain aufhören (.de, .ch, .at, .uk, .com, .net, .org, .edu, .int, .mil, .gov, .arpa, .biz, .aero, .name, .coop, .info, .pro, .museum, ...).";
msgEmailCheck["DE"]["NO_HOST"]                      = "Die Emailadresse enthält keinen Hostnamen.";
msgEmailCheck["EN"] = new Array();
msgEmailCheck["EN"]["EMAIL_CONFIRM_NOT_IDENTICAL"]  = "Please enter your email address exactly the same way in both email fields.";
msgEmailCheck["EN"]["INVALID_EMAIL_ADRESS"]         = "That does not look like a valid email address. (Check the @ character and dots and such.)";
msgEmailCheck["EN"]["INVALID_CHARACTERS_IN_USER"]   = "The user (the part of the email address before the @) contains invalid characters.";
msgEmailCheck["EN"]["INVALID_CHARACTERS_IN_DOMAIN"] = "The domain (the part of the email address following the @) contains invalid characters.";
msgEmailCheck["EN"]["INVALID_USER"]                 = "The user (the part of the email address before the @) seems to be invalid.";
msgEmailCheck["EN"]["INVALID_IP"]                   = "The IP in this email address is not valid.";
msgEmailCheck["EN"]["INVALID_DOMAIN"]               = "The domain (the part of the email address following the @) seems to be invalid.";
msgEmailCheck["EN"]["INVALID_OR_NO_TLD"]            = "The email address has to end with a known top level domain (.uk, .de, .ch, .at, .com, .net, .org, .edu, .int, .mil, .gov, .arpa, .biz, .aero, .name, .coop, .info, .pro, .museum, ...).";
msgEmailCheck["EN"]["NO_HOST"]                      = "The email address does not contain a host name.";

function checkUnconfirmedEmailDefaultLanguage(email) 
{
  return checkConfirmedEmailLanguageGiven(email, email, defaultLanguage);
}

function checkUnconfirmedEmailLanguageGiven(email, alertLanguage) 
{
  return checkConfirmedEmailLanguageGiven(email, email, alertLanguage);
}

function checkConfirmedEmailLanguageGiven(email, emailConfirm, alertLanguage) 
{
  if ( undefined == alertLanguage || null == alertLanguage || !(alertLanguage in msgEmailCheck) )
  {
    alertLanguage = defaultLanguage;
  }

  // check if email and emailConfirm are identical
  if ( !(email === emailConfirm) )
  {
    alert(msgEmailCheck[alertLanguage]["EMAIL_CONFIRM_NOT_IDENTICAL"]);
  	return false;
  }

  // check if given email is indeed a valid email address
  var checkTLD=1;
  var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
  var emailPat=/^(.+)@(.+)$/;
  var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
  var validChars="\[^\\s" + specialChars + "\]";
  var quotedUser="(\"[^\"]*\")";
  var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
  var atom=validChars + '+';
  var word="(" + atom + "|" + quotedUser + ")";
  var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
  var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
  
  var matchArray=email.match(emailPat);
  if (matchArray==null) 
  {
  	alert(msgEmailCheck[alertLanguage]["INVALID_EMAIL_ADRESS"]);
  	return false;
  }
  var user=matchArray[1];
  var domain=matchArray[2];
  
  for (i = 0; i < user.length; i++) 
  {
  	if (user.charCodeAt(i) > 127) 
  	{
  		alert(msgEmailCheck[alertLanguage]["INVALID_CHARACTERS_IN_USER"]);
  		return false;
  	}
  }
  for (i = 0; i < domain.length; i++) 
  {
  	if (domain.charCodeAt(i) > 127) 
  	{
      alert(msgEmailCheck[alertLanguage]["INVALID_CHARACTERS_IN_DOMAIN"]);
  		return false;
  	}
  }
  if (user.match(userPat) == null) 
  {
    alert(msgEmailCheck[alertLanguage]["INVALID_USER"]);
  	return false;
  }
  var IPArray = domain.match(ipDomainPat);
  if (IPArray != null) 
  {
  	for (var i = 1; i <= 4; i++) 
  	{
  		if (IPArray[i] > 255) 
  		{
        alert(msgEmailCheck[alertLanguage]["INVALID_IP"]);
  			return false;
  		}
  	}
  	return true;
  }
  var atomPat = new RegExp("^" + atom + "$");
  var domArr = domain.split(".");
  var len = domArr.length;
  for (i = 0; i < len; i++) 
  {
    if (domArr[i].search(atomPat) == -1) 
    {
      alert(msgEmailCheck[alertLanguage]["INVALID_DOMAIN"]);
    	return false;
  	}
  }
  if (checkTLD && domArr[domArr.length-1].length != 2 
     && domArr[domArr.length-1].search(knownDomsPat) == -1) 
  {
    alert(msgEmailCheck[alertLanguage]["INVALID_OR_NO_TLD"]);
  	return false;
  }
  if (len < 2) 
  {
    alert(msgEmailCheck[alertLanguage]["NO_HOST"]);
  	return false;
  }
  return true;
}

