// Procédures globales du projet
// Début testAdrMail fonction : testAdrMail
// Entrée : adrMail - (String) - Email à analysé.
// Renvoyé : true ou false - (Boolean) - Vrai si l'email est correct sinon Faux

function testAdrMail(adrMail) {

// déclaration et initialisation des variables
adrMailLength=adrMail.length; // longueur de la chaîne adrMail
caractOk="_.-0123456789abcdefghijklmnopqrstuvwxyz"; // caratères corect d'une adresse mail
var posArrobas=adrMail.indexOf('@',1); // position du premier Arrobas
var posPoint=adrMail.lastIndexOf('.',adrMailLength); // position du dernier point
var posCaractFaux=adrMail.indexOf('..',posArrobas+1); // position d'un caractère faux ('..' ou ' ')
var caract=0; // caractère extrait de la chaîne adrMail (utilisée par les boucles while)
var caractFaux=adrMail.charAt(0)+adrMail.charAt(posArrobas-1)+adrMail.charAt(posArrobas+1)+adrMail.charAt(posPoint-1);
var posCaract=0; // position du caractère à extraire de la chaîne adrMail (utilisée par les boucles while)
var posCaractOk=0; // position du caractère extrait de la chaîne adrMail (utilisée par les boucles while)
var posCaractNon=-1;
var retour=false; // l'adresse e-mail est considérée comme fausse au début

// début du teste
// s'il n'existe pas de caractère '..' alors on teste s'il existe un espace dans la chaîne adrMail
if (posCaractFaux!=-1 || adrMail.indexOf(' ',0)!=-1 || adrMail.indexOf('--',0)!=-1 || adrMail.indexOf('__',0)!=-1) {
posCaractFaux=0;
}

// Teste les points ou - ou _ au début de l'adrMail, autour de l'arrobas et autour du dernier point
for (posCaract;posCaract<4;posCaract++) {
caract=caractFaux.charAt(posCaract);
posCaractNon=caractOk.lastIndexOf(caract,2);
if (posCaractNon!=-1) {
posCaractFaux=0;
break;
}
}
// si l'adresse mail contient au moins 1 caractère et qu'elle comporte un arrobas
// et qu'elle comporte un point et que l'arrobas est avant le dernier point
// et qu'elle ne contient pas de '..' ou d'espace et que après le dernier point il y est 2,3 ou 4 caractères
// et qu'il n'y est pas de point autour de l'arrobas et que l'adresse ne commence pas par un point
// Alors
if (adrMailLength>0 && posArrobas!=-1 && posPoint!=-1 && posArrobas<posPoint && posCaractFaux==-1 && adrMailLength-posPoint-1>=2 && adrMailLength-posPoint-1<=4) {

// extraction d'un caractère et teste s'il existe dans la chaîne "_.-0123456789abcdefghijklmnopqrstuvwxyz"
// S'il n'existe pas alors posCaract=-1 donc au prochain 'tour' on passe aux autres boucles (qui ne s'effecturont pas)
// Si il existe on continue la boucle jusqu'au caractère avant l'arrobas et on passe à la boucle while suivante

adrMail=adrMail.toLowerCase();
posCaract=0;

while (posCaract<posArrobas && posCaractOk!=-1) {
caract=adrMail.charAt(posCaract);
posCaractOk=caractOk.indexOf(caract,0);
posCaract++;
}
posCaract++; // on passe l'arrobas

// sur le même principe qu'au dessus mais pour la partie entre l'arrobas et le dernier point
// le test ce fait sur les caractères ".-0123456789abcdefghijklmnopqrstuvwxyz"
// caractOk.indexOf(caract,1) on ne teste plus l'underscore
while (posCaract<posPoint && posCaractOk!=-1) {
caract=adrMail.charAt(posCaract);
posCaractOk=caractOk.indexOf(caract,1);
posCaract++;
}
posCaract++; // on passe le point

// sur le même principe qu'au dessus mais pour la partie entre le dernier point et la fin
// le test ce fait sur les caractères "abcdefghijklmnopqrstuvwxyz"
// caractOk.indexOf(caract,13) on ne teste plus que des lettres
while (posCaract<adrMailLength && posCaractOk!=-1) {
caract=adrMail.charAt(posCaract);
posCaractOk=caractOk.indexOf(caract,13);
posCaract++;
} // fin de la boucle while

// durant le parcour de l'adresse mail si n'y avait pas de caractère interdit
// posCaractOk a changer plusieurs fois de valeur mais na jamais eu la valeur -1
// donc l'adresse est bonne
if (posCaractOk!=-1) {
retour=true;
}
}
return retour; // renvoi le résultat (true ou false)
} // fin de la fonction  

