// -------------------------------------------------------------------- //
//
//        Fonctions JavaScript propres à Bifurc
//
// -------------------------------------------------------------------- //


//
// Variables globales au module
//
var selAlert = "Select minus 1 ";
//var txtAlert = "You must give";
var txtAlert = "Vous devez renseigner";
var txtError = "ERROR";


// -------------------------------------------------------------------- //
//                        FONCTIONS GENERALES
// -------------------------------------------------------------------- //

//
// Fonction de remplissage d'une liste-sélection avec le contenu d'un tableau
//
//        select        = nom de l'objet liste-sélection à remplir
//        tab        = nom du tableau source du remplissage
//
function Array2Select (select, tab)
{
        // Vidage de la liste avant son remplissage
        RazSelect (select);
        // Boucle de remplissage
        for (var i=0; i < tab.length; i++)
        {
                // Valeurs par défaut pour l'option de la sélection
                txt = tab[i];                // texte de l'option
                val = i;                // indice option
                //
                // Les items du tableau peuvent être formatés pour contenir
                //        - la valeur de l'option
                //        séparés par le caractère #
                //        - le texte de l'option
                //
                idx = tab[i].indexOf ("#",0);
                if (idx > 0)
                {
                        val = tab[i].substring (0, idx);
                        txt = tab[i].substring (idx+1, 100);
                }
                // Ajout de la nouvelle option
                select.options[i] = new Option (txt, val);
        }
}


// -------------------------------------------------------------------- //
//                        FONCTIONS DE GESTION DE DATES
// -------------------------------------------------------------------- //

//
// Fonction de remplissage d'une liste de jours en fonction d'un mois donné
//
//        sday        nom de l'objet liste pour les jours
//        smon        nom de l'objet liste pour les mois
//        syea        nom de l'objet liste pour les années
//
function FillSelDay (sday, smon, syea)
{
        // Calcul du nb de jours du mois/année sélectionné
        // Fonction nbDayMonth() définie dans dates.js
        var nbdays = nbDaysMonth (smon.options[smon.selectedIndex].value, syea.options[syea.selectedIndex].value);

        // Conservation de la sélection courante pour la réappliquer
        var selday = sday.selectedIndex;

        // Vidage de la liste actuelle des jours
        RazSelect (sday);                                        // fonction définie dans select.js

        // Remplissage de la liste des jours
        for (i=0; i < nbdays; i++)
        {
                // Valeur = texte
                var numday = new String (i + 1);
                if (numday.length == 1)                numday = "0" + numday;                // sur 2 chiffres
                // Ajout de l'option
                sday.options[i] = new Option (numday, numday);
        }
        // Sélection du 1er élément par défaut si précédent ne fait plus partie de la liste
        if (selday > nbdays-1)        selday = nbdays-1;
        sday.options[selday].selected = true;
}

// -------------------------------------------------------------------- //
//                        FONCTIONS DE GESTION DE FENETRES
// -------------------------------------------------------------------- //

//
// Fonction d'ouverture d'une fenêtre popup
//
//        action                tableau des caractéristiques de la fenêtre à ouvrir
//
function OpenWpop (action)
{
        var wf = "";
        wf = wf + "width=" + action[3];
        wf = wf + ",height=" + action[4];
        wf = wf + ",resizable=" + (action[5] ? "yes" : "no");
        wf = wf + ",scrollbars=" + (action[6] ? "yes" : "no");
        wf = wf + ",menubar=" + (action[7] ? "yes" : "no");
        wf = wf + ",toolbar=" + (action[8] ? "yes" : "no");
        wf = wf + ",directories=" + (action[9] ? "yes" : "no");
        wf = wf + ",location=" + (action[10] ? "yes" : "no");
        wf = wf + ",status=" + (action[11] ? "yes" : "no");
        return (window.open(action[1],action[2],wf));
}

//
// Fonction d'ouverture d'une fenêtre sur une url
//
function OpenWindow (dest)
{
        zoom = window.open (dest, 'winbifurc');
        zoom.focus();
}

//
// Fonction d'ouverture fenêtre d'impression ....
//
function OpenWprint (dest, w, h)
{
        featur = 'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=no,width='+w+',height='+h;
        zoom = window.open (dest, 'impbifurc', featur );
//        if (navigator.userAgent.indexOf ('MSIE') == -1) {zoom.focus()}
        zoom.focus();
}


//
// Fonction d'ouverture fenêtre d'image bifurc
//
//        image                pth d'accès à l'image
//        texte                texte d'en tête
//        w                largeur fenêtre d'affichage de l'image
//        h                hauteur fenêtre d'affichage de l'image
//
function OpenWimag (imag, texte, w, h)
{
        // Initialisations
        var wimg = w;
        var himg = h;
        //
        if (wimg < 500)                wimg = 500;

        // Traitement
        featur = 'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,width='+wimg+',height='+himg;
        zoom = window.open ("", 'imgbifurc', featur );

        zoom.document.write ("<HTML>");
        zoom.document.write ("<HEAD><TITLE>ICPS - Bifurc.net Image</TITLE></HEAD>\r\n");
        zoom.document.write ("<BODY BGCOLOR='#000000' TEXT='#FFFFFF' LINK='#FFFFFF' ALINK='#FFFFFF' VLINK='#FFFFFF'>\r\n");
        zoom.document.write ("<CENTER><TABLE WIDTH='100%'><TR>");
        zoom.document.write ("<TD ALIGN='LEFT'><A HREF='javascript:window.close();'><IMG BORDER='0' SRC='medias/wclose.gif'></A>\r\n");
        zoom.document.write ("<TD ALIGN='CENTER'>");
        if (texte.length > 0)
                zoom.document.write ("<FONT FACE='Arial' SIZE='3'><B>" + texte + "</B></FONT>\r\n");
        zoom.document.write ("</TD><TD ALIGN='RIGHT'><A HREF='javascript:window.close();'><IMG BORDER='0' SRC='medias/wclose.gif'></A>\r\n");
        zoom.document.write ("</TD></TR></TABLE>");
        zoom.document.write ("<IMG BORDER='0' SRC='" + imag + "'>\r\n");
        zoom.document.write ("<BR><FONT FACE='Arial' SIZE='1'>Copyright &copy; 2002 ICPS - All rights reserved.</FONT>\r\n");
        zoom.document.write ("</CENTER></BODY>\r\n");
        zoom.document.write ("</HTML>\r\n");

        //        if (navigator.userAgent.indexOf ('MSIE') == -1) {zoom.focus()}
        zoom.focus();
}


//
// Fonction d'ouverture de la fenêtre popup des news
//
function OpenWnews()
{
        // Le nom à donner à la fenêtre
        var windowName = 'bifnews';
        // Création du tableau des caractéristiques à appliquer à la fenêtre
        CSAct = new Array ('','commnews.php',windowName,350,150,false,true,false,false,false,false,false);
        var winNews = OpenWpop (CSAct);
        // Placement de la fenêtre en haut à gauche et passage en avant plan
        winNews.moveTo (0,0);
        winNews.focus ();
}

// -------------------------------------------------------------------- //
//                FONCTIONS DE DIALOGUE
// -------------------------------------------------------------------- //

//
// Fonction de confirmation + redirection
//
//        message                message de confirmation
//        location        page destination
//
function ConfirmLocation (message, pageloc)
{
        if (confirm (message))                window.location = pageloc;
}


//
// Fonction de confirmation par arpport au contenu d'un champ
//
//        message                message de confirmation
//        location        page destination
//
function ConfirmAction (message, field)
{
        if (field.value.length > 0)
                return confirm (message);
        else        return (true);
}

// -------------------------------------------------------------------- //
//                FONCTIONS DE CONTROLE DE CONTENU
// -------------------------------------------------------------------- //

//
// Fonction de vérification du dialogue d'admin d'une botm/case/studie
// Vérifier que les champs obligatoires sont bien remplis
//
//        txtTitl                = titre
//        lenTitl                = longueur titre
//        txtName                = nom auteur
//        txtFnam                = prénom auteur
//
function CheckSetBotm (txtTitl, lenTitl, txtName, txtFnam)
{
        // Initialisations
        var ret = true;

        // --- Contrôles de saisies non vides -- //

        // Titre
        if (txtTitl.value.length == 0)
        {
                alert (txtAlert + " a TITLE !!!");
                txtTitl.focus();
                ret = false;
        }
        else if (txtTitl.value.length > lenTitl)
        {
                alert ("The TITLE must not exceed " + lenTitl + " characters !!!\r\n(Actually " + txtTitl.value.length + ")");
                txtTitl.focus();
                ret = false;
        }

        // Nom auteur
        else if (txtName.value.length == 0)
        {
                alert (txtAlert + " an Author NAME !!!");
                txtName.focus();
                ret = false;
        }

        // Nom auteur
        else if (txtFnam.value.length == 0)
        {
                alert (txtAlert + " an Author FIRST NAME !!!");
                txtFnam.focus();
                ret = false;
        }

        // Retour traitement
        return (ret);
}

// -------------------------------------------------------------------- //

//
// Fonction de vérification du dialogue d'admin d'une step de botm/case
// Vérifier que les champs obligatoires sont bien remplis
//
//        txtTitl                = titre
//        txtComm                = zone commentaire
//
function CheckSetBstp (txtTitl, txtComm)
{
        // Initialisations
        var ret = true;

        // --- Contrôles de saisies non vides -- //

        // Titre
        if (txtTitl.value.length == 0)
        {
                alert (txtAlert + " a TITLE !!!");
                txtTitl.focus();
                ret = false;
        }

        // Texte commentaire
        else if (txtComm.value.length == 0)
        {
                alert (txtAlert + " a COMMENT !!!");
                txtComm.focus();
                ret = false;
        }

        // Retour traitement
        return (ret);
}


// -------------------------------------------------------------------- //

//
// Fonction de vérification du dialogue d'ajout d'une bifurcation
// Ajout par les visiteurs du site
// Vérifier que les champs obligatoires sont bien remplis
//
//        txtBtit                titre bifurcation
//        txtBnam                nom auteur bifurcation
//        txtItit                titre introduction
//        txtIcom                commentaire introduction
//        txtYnam                nom contributeur
//        txtYmel                mail contributeur
//        txtYorg                organisme contributeur
//
function CheckSetBadd (txtBtit, txtBnam, txtItit, txtIcom, txtYnam, txtYmel, txtYorg)
{
        // Initialisations
        var ret = true;
        var txtBifur = "to your Bifurcation";
        var txtIntro = "to the Introduction";

        // --- Contrôles saisies BIFURCATION -- //

        // Titre
        if (txtBtit.value.length == 0)
        {
                alert (txtAlert + " a TITLE " + txtBifur + " !!!");
                txtBtit.focus();
                ret = false;
        }

        // Nom auteur
        else if (txtBnam.value.length == 0)
        {
                alert (txtAlert + " an Author NAME " + txtBifur + "!!!");
                txtBnam.focus();
                ret = false;
        }

        // --- Contrôles saisies INTRO BIFURCATION -- //

        // Titre Intro
        else if (txtItit.value.length == 0)
        {
                alert (txtAlert + " a TITLE " + txtIntro + " !!!");
                txtItit.focus();
                ret = false;
        }

        // Commentaire Intro
        else if (txtIcom.value.length == 0)
        {
                alert (txtAlert + " an COMMENT " + txtIntro + "!!!");
                txtIcom.focus();
                ret = false;
        }

        // --- Contrôles saisies COORDONNEEZ CONTRIBUTEUR -- //

        // Nom du contributeur
        else if (txtYnam.value.length == 0)
        {
                alert (txtAlert + " your NAME !!!");
                txtYnam.focus();
                ret = false;
        }

        // Mail du contributeur
        else if (txtYmel.value.length == 0)
        {
                alert (txtAlert + " your EMAIL !!!");
                txtYmel.focus();
                ret = false;
        }
        // Contrôle structure du mail saisi
        else if (!CheckEmail (txtYmel))
        {
                alert ("<" + txtYmel.value + ">: Invalid Mail !");
                txtYmel.focus();
                ret = false;
        }

        // Organisme du contributeur
        else if (txtYorg.value.length == 0)
        {
                alert (txtAlert + " your INSTITUTION !!!");
                txtYorg.focus();
                ret = false;
        }

        // Retour traitement
        return (ret);
}

// -------------------------------------------------------------------- //

//
// Fonction de vérification du dialogue d'admin d'une publication
// Vérifier que les champs obligatoires sont bien remplis
//
//        txtTitl                = texte titre
//        lenTitl                = longueur max texte titre
//        txtName                = texte nom des auteurs
//        txtRefe                = texte références
//        radType                = bouton radio de type: biblio ou abstract
//        txtText                = texte abstract
//        txtComm                = texte commentaire
//        txtEtbl                = texte etablissement


//
function CheckSetPubl (txtTitl, lenTitl, txtName, txtRefe, txtText, txtComm, txtEtbl)
{
        // Initialisations
        var ret = true;

        // --- Contrôles de saisies non vides -- //

        // Titre
        if (txtTitl.value.length == 0)
        {
                alert (txtAlert + " un Nom de produit !!!");
                txtTitl.focus();
                ret = false;
        }
        else if (txtTitl.value.length > lenTitl)
        {
                alert ("Le titre ne doit pas dépasser " + lenTitl + " caractères !!!\r\n(Actuellement " + txtTitl.value.length + ")");
                txtTitl.focus();
                ret = false;
        }

			// Si une erreur déjà trouvée, ne  pas continuer
			if (!ret)        return (ret);
		
		
		// Responsable
		if (txtName.value.length == 0)
        {
                alert (txtAlert + " un Responsable !!!");
                txtTitl.focus();
                ret = false;
        }
		
			// Si une erreur déjà trouvée, ne  pas continuer
			if (!ret)        return (ret);		
        
		// Ref client
		if (txtRefe.value.length == 0)
        {
                alert (txtAlert + " une Référence client !!!");
                txtTitl.focus();
                ret = false;
        }
        
			// Si une erreur déjà trouvée, ne  pas continuer
			if (!ret)        return (ret);
		
		// Etablissement
		if (txtEtbl.value.length == 0)
        {
                alert (txtAlert + " un Etablissement !!!");
                txtTitl.focus();
                ret = false;
        }

        
			// Si une erreur déjà trouvée, ne  pas continuer
			if (!ret)        return (ret);

        // Lecture du type de la publication: bibliography ou abstract
        /*var type = 0;
        for (var i=0; i < radType.length; i++)
        {
                if (radType[i].checked == 1)
                {
                        // Le bouton radio marqué a été trouvé
                        type = radType[i].value;
                        break;
                }
        }
		*/
        // Contrôle si nécessaire du texte et du commentaire
        var warn = false;
        var text = "";
        /*if (type == pubBIBL)
        {
                // Cas d'une bibliographie: vérifier texte et commentaire vides
                // Confirmation perte abstract et/ou commentaire si renseignés
                if (txtText.value.length > 0  ||  txtComm.value.length > 0)
                        ret = confirm ("BIBLIOGRAPHY\r\nYou will lost the Abstract TEXT and/or COMMENT !\r\nDo you Confirm ?");
        }
        // Modification 24/06/02: on autorise un texte et/ou commentaire pour les publications abstracts
//        else if (txtText.value.length == 0)
        
		*/
		if (txtComm.value.length == 0)
        {
                // Cas d'un abstract: vérification saisie de l'abstract et/ou du commentaire: un des 2 obligatoire
                alert (txtAlert + " le cas réel !!!");
                txtComm.focus();
                ret = false;
        }

        // Retour traitement
        return (ret);
}


// -------------------------------------------------------------------- //

// Fonction de mise à jour du champ libellé de thème en fonction de celui sélectionné
// couramment dans la liste
// Thème de Publications ou Liens
//
//        selThm                = liste de sélection source de l'action
//        txtThm                = zone de saisie du libellé du theme
//
function ChangeSelThem (selThm, txtThm)
{
        // Lecture valeur index sélection
        var idx = selThm.options.selectedIndex;
        // Demande effective de mise à jour de la zone de saisie
        if (idx > 0)
                txtThm.value = selThm.options[idx].text;
        else        txtThm.value = "";
}


// -------------------------------------------------------------------- //

// Fonction de mise à jour du champ libellé de thème en fonction de celui sélectionné
// couramment dans la liste
// Thème de Publications ou Liens
//
//        selSpe                = liste de sélection source de l'action
//        txtSpe                = zone de saisie du libellé du theme
//
function ChangeSelSpe (selSpe, txtSpe, selThm, tabid)
{

        // Lecture valeur index sélection
        var idx = selSpe.options.selectedIndex;
	var tab = eval (tabid);
//alert (tab.length);

        // Demande effective de mise à jour de la zone de saisie
        if (idx > 0) {
		txtSpe.value = selSpe.options[idx].text;
                idSpe = selSpe.options[idx].value;
/**/		for (idThm=0, fin=false, itab=0; !fin  &&  itab < tab.length; itab++)
		{
			// Recherche de la spec dans le tablo
			//
        		var t = tabid + "[" + itab + "]";
			var val = (eval (t))[0];
			if (val == idSpe)
			{
				idThm = (eval (t))[1];
				fin = true;
			}
		}	/**/
		
		// Parcours de la liste des thème et sélection du bon item
		//
		for (fin=false, isel=0; !fin  &&  isel < selThm.options.length; isel++)
		{
			if (selThm.options[isel].value == idThm)
			{
				selThm.options.selectedIndex = isel;
				fin = true;
			}
		}
	}
}

// -------------------------------------------------------------------- //

// Fonction de mise à jour du champ libellé de thème en fonction de celui sélectionné
// couramment dans la liste
// Thème de Publications ou Liens
//
//        selThm                = liste de sélection source de l'action
//        txtThm                = zone de saisie du libellé du theme
//
/*function ChangeSpeThem (selThm, txtThm)
{
        // Lecture valeur index sélection
        var idx = selThm.options.selectedIndex;
        // Demande effective de mise à jour de la zone de saisie
        if (idx > 0)
                txtThm.value = selThm.options[idx].text;
        else        txtThm.value = "";
}

*/

// -------------------------------------------------------------------- //

//
// Fonction de vérification d'un changement de libellé de thème ou pas
// Pour les publications uniquement
//
// Il s'agit de détecter le cas suivant:
//        - un thème sélectionné dans la liste
//        - une saisie réalisée dans la zone de saisie
//
//        selThm                liste de sélction des thèmes de publication
//        txtThm                zone de saisie des thèmes de publications
//
function CheckChgTpubl (selThm, txtThm)
{
        // Initialisations
        var ret = true;

        // Lecture si une saisie faite ou pas dans la zone de saisie
//        if (txtThm.value.length > 0)
        if (txtThm.value.length > 0  &&  selThm.options.selectedIndex > 0)
        {
                // Lecure de la sélection en cours dans la liste des thèmes
                // Si autre que 0, il faut contrôler la similitude des 2 ou pas
                var selIdx = selThm.options.selectedIndex;
                var selTxt = selThm.options[selIdx].text;
                // Contrôle que les contenus sont identiques ou pas
                if (selTxt != txtThm.value)
                {
                        // Un changement de libellé de thème a été détecté: demande cnfirmation
                        ret = confirm ("Are you sure you want to Modify this Theme ?\r\nThe change will take effect on every Publication on this Theme !\r\n\r\nFrom: "+selTxt+"\r\nTo: "+txtThm.value);
                }
        }

        // Retour du résultat du contrôle
        return (ret);
}


// -------------------------------------------------------------------- //

//
// Fonction de vérification du dialogue d'envoi de mail
// Vérifier que les champs obligatoires sont bien remplis
//
//        txtTit                = le titre à associer au lien
//        txtUrl                = l'url du lien
//        txtCom                = le commentaire sur le lien
//
function CheckSetLink (txtTit, txtUrl, txtCom)
{
        // Initialisations
        var ret = true;

        // --- Contrôles de saisies non vides -- //

        // Titre
        if (txtTit.value.length == 0)
        {
                alert (txtAlert + " a TITLE !!!");
                txtTit.focus();
                ret = false;
        }

        // Titre
        else if (txtUrl.value.length == 0)
        {
                alert (txtAlert + " the URL !!!");
                txtUrl.focus();
                ret = false;
        }

        // Commentaire
        else if (txtCom.value.length == 0)
        {
                alert (txtAlert + " a COMMENT !!!");
                txtCom.focus();
                ret = false;
        }

        // Retour traitement
        return (ret);
}


// -------------------------------------------------------------------- //

//
// Fonction de vérification du dialogue d'enregistrement dans news letter
// Vérifier que les champs obligatoires sont bien remplis
//
//        txtYnam                = le nom de la personne
//        txtYmel                = le mai de la personne
//        txtYorg                = l'institut
//
function CheckSetLdif (txtYnam, txtYmel, txtYorg)
{
        // Initialisations
        var ret = true;

        // --- Contrôles saisies COORDONNEEZ CONTRIBUTEUR -- //

        // Nom du contributeur
        if (txtYnam.value.length == 0)
        {
                alert (txtAlert + " your NAME !!!");
                txtYnam.focus();
                ret = false;
        }

        // Mail du contributeur
        else if (txtYmel.value.length == 0)
        {
                alert (txtAlert + " your EMAIL !!!");
                txtYmel.focus();
                ret = false;
        }
        // Contrôle structure du mail saisi
        else if (!CheckEmail (txtYmel))
        {
                alert ("<" + txtYmel.value + ">: Invalid Mail !");
                txtYmel.focus();
                ret = false;
        }

        // Organisme du contributeur
        else if (txtYorg.value.length == 0)
        {
                alert (txtAlert + " your INSTITUTION !!!");
                txtYorg.focus();
                ret = false;
        }


        // Retour traitement
        return (ret);
}


// -------------------------------------------------------------------- //

//
// Fonction de vérification du dialogue d'envoi de mail
// Vérifier que les champs obligatoires sont bien remplis
//
//        txtSubj                = nom champ sujet du message
//        txtMess                = nom champ texte message
//        txtMail                = nom champ email émetteur
//
function CheckSendMail (txtSubj, txtMess, txtMail)
{
        // Initialisations
        var ret = true;

        // --- Contrôles de saisies non vides -- //
        // Mail du contributeur
        if (txtMail  &&  txtMail.value.length == 0)
        {
                alert (txtAlert + " your EMAIL !!!");
                txtMail.focus();
                ret = false;
        }
        // Contrôle structure du mail saisi
        else if (txtMail  &&  !CheckEmail (txtMail))
        {
                alert ("<" + txtMail.value + ">: Invalid Mail !");
                txtMail.focus();
                ret = false;
        }

        // Suject
        else if (txtSubj.value.length == 0)
        {
                alert (txtAlert + " a SUBJECT !!!");
                txtSubj.focus();
                ret = false;
        }

        // Nom auteur
        else if (txtMess.value.length == 0)
        {
                alert (txtAlert + " a MESSAGE !!!");
                txtMess.focus();
                ret = false;
        }

        // Retour traitement
        return (ret);
}


// -------------------------------------------------------------------- //
//                        FONCTIONS DE GESTION DE FICHIERS
// -------------------------------------------------------------------- //

//
// Fonction de contrôle de l'extension d'un fichier
//
//        tabext                = extensions reconnues
//        fldfile                = nom du champ html qu contient le path du fuchier à contrôler (peut être vide)
//
function CheckExtFile (forme, fldfile, tabext)
{
        // La zone de saisie du nom du fichier est-elle renseignée ?
        var file = fldfile.value;
        if (file.length == 0)        return (true);

        // Un nom de fichier saisi: extraction de son extension
        var idx = file.lastIndexOf ('.');
        if (idx < 0)        return (true);
        var ext = file.substring (idx+1, idx+10);

        // Boucle de comparaison des extensions autorisées avec celle du fichier saisi
        var lstext="";
        var sep="";
        for (var i=0; i < tabext.length; i++, sep=",")
        {
                var str = tabext[i];
                if (ext.toLowerCase() == str.toLowerCase())                return (true);
                lstext = lstext + sep + str;
        }

        // Retour traitement: on est en erreur
        // => sélectionner le contenu et mettre le focus dessus
        // Champ en lecture seule en js: on ne peut vider le contenu
        //
        alert (txtError + ": Bad File TYPE '" + ext + "' !  Waiting for a '" + lstext + "' file ...");
        fldfile.select();
        fldfile.focus();
        return (false);
}


// -------------------------------------------------------------------- //
//                FONCTIONS DE VERIFICATION DE STRUCTURE
// -------------------------------------------------------------------- //

//
// Vérification de la structure d'un mail
//
//        mail                le champ qui contien l'email
//
function CheckEmail (mail)
{
        // Valeur de retour
        var ret = true;

        // Calcul longueur chaine
        var ilgmail = mail.value.length - 1;

        // Lecture des posiions des différents @
        var fidxaro = mail.value.indexOf ("@");                // position premier @
        var lidxaro = mail.value.lastIndexOf ("@");                // postion dernier @

        // Lecture des posiions des différents .
        var fidxpoi = mail.value.indexOf (".");                // position premier .
        var lidxpoi = mail.value.lastIndexOf (".");                // postion dernier .

        // Test qu'aucun espace dans le mail
        if (mail.value.indexOf (" ") >= 0)
                ret = false;
        // Test qu'un et un seul @ et position > 0 et position <> lg
        else if (fidxaro <= 0  ||  (lidxaro > 0  &&  fidxaro != lidxaro)  ||  fidxaro == ilgmail  ||  lidxaro == ilgmail)
                ret = false;
        // Test qu'au moins 1 . et dernier (autre que premier, si existant) après @
        else if (fidxpoi <= 0  ||  (lidxpoi > 0  &&  lidxpoi < fidxaro)  ||  fidxpoi == ilgmail  ||  lidxpoi == ilgmail)
                ret = false;

        // Valeur de retour
        return (ret);
}


// -------------------------------------------------------------------- //
//                        FONCTIONS D'AFFICHAGE/MASQUAGE
// -------------------------------------------------------------------- //


//
// Fonction générale d'affichage/masquage des blocs texte
// Traitement fonction du type de navigateur: STYLE valable que pour IE
//
//        obj        l'objet associé au bloc texte: pour IE
//
function fVis (obj)
{
        // Pour IE: exploiter les styles de blocs
        if (obj.style.display == "block")
                obj.style.display = "none";
        else    obj.style.display = "block";
}

// -------------------------------------------------------------------- //

//
// Fonction de masuqage/affichage de blocs texte pour les news
// La source de l'évènement est une Ancre placée dans la 2° cellule de la première ligne d'une table
// Le bloc de texte à masquer/afficher se trouve dans la cellule (colspan = 2 !!!) de la 2° ligne de cette même table
//
//        url        l'adresse éventuelle de lien: pour Netscape
//
function fVisNews (url)
{
        // Lecture type du navigateur client
        CSAg = window.navigator.userAgent;
        // Comportement différent suivant type de navigateur
        if (IsIE())
                fVis (window.event.srcElement.parentElement.parentElement.parentElement.children[1].children[0], url);
        else        // Pour Netscape et les autres, appliquer une nouvelle requête vis url: par redirection
                window.location.href=url;
}

// -------------------------------------------------------------------- //

//
// Fonction de masuqage/affichage de blocs texte pour les abstracts
// La source de l'évènement est une Ancre placée dans la 2° cellule de la première ligne d'une table
// Le bloc de texte à masquer/afficher se trouve dans la 2° cellule de cette même table
//
//        url        l'adresse éventuelle de lien: pour Netscape
//
function fVisAbst (url)
{
        // Lecture type du navigateur client
        CSAg = window.navigator.userAgent;
        // Comportement différent suivant type de navigateur
        if (IsIE())
                fVis (window.event.srcElement.parentElement.parentElement.children[1], url);
        else        // Pour Netscape et les autres, appliquer une nouvelle requête vis url: par redirection
                window.location.href=url;
}