/** 
 * Renvoie à la page "location" si l'action spécifiée par "msg" a été confirmée
 *
 * @param location string, l'url vers où il faut rediriger la page en cas de confirmation
 * @param msg string, le message de confirmation 
 * @return
 */
function Confirmer(location, msg) {
	if (confirm(msg)) {
		window.document.location.href = location;
	}
}



/** 
 * Affiche le message de confirmation pour la déconnexion du portail
 *
 * Renvoie true si l'utilisateur souhaite se déconnecter
 * @return bool
 */
function Confirmation()	{
    if (confirm('Etes-vous sûr de vouloir vous déconnecter ?')) return true;
    return false;
}



/** 
 * Ouvre une popup centrée
 *
 * @param string url, Url d'accès à la page
 * @param int iwidth, largeur de la popup
 * @param int iheight, hauteur de la popup
 * @param string, argument optionnel, permet de personnaliser la popup suivant les propriétés JS 
 * @return
 */
function open_popup(url,iwidth,iheight) { 
    
    // Check des paramètres optionnels
    if (open_popup.arguments.length == 4) {
        options = open_popup.arguments[3] + ',';
    } else {
        options = '';
    }
    
    var hauteur = (screen.height / 2) - (iheight / 2);
    var largeur = (screen.width / 2) - (iwidth / 2); 
    var Infowindow=window.open(url, "Infos" , options + "resizable=yes,top=" + hauteur + ", left=" + largeur + ", width=" + iwidth + ",height=" + iheight + "");
    Infowindow.focus();
}



/** 
 * Teste l'équivalence de deux champs
 *
 * @param val1, l'objet de formulaire contenant la première valeur à tester
 * @parma val2, l'objet de formulaire contenant la seconde valeur à tester
 * @param nom1, libellé du premier objet
 * @param nom2, libellé du second objet
 * @return
 */
function IsEqual(val1, val2, nom1, nom2)
{
	value1 = val1.value;
	value2 = val2.value;
	
	if (value1 != value2)
	{
		alert("La valeur du champ \""+ nom1 +"\" ne correspond pas à celle du champ \""+ nom2 +"\". Merci de vérifier");
		val2.focus();
		return false;
	}
	
	return true;
}



/** 
 * Teste un champ obligatoire
 *
 * @param champ, l'objet du formulaire à vérifier
 * @param nom, le libellé de l'objet
 * @return
 */
function IsEmpty(champ, nom) {
	str = champ.value;
	
	if (str == "") {
 		alert("Merci de saisir une valeur pour le champ \""+ nom +"\"");
 		champ.focus();
 		return(false);
	}
	
	return true;
}



/** 
 * Fonction appelée dans bandeau.htm pour l'affichage de la popup "Veuillez patienter"
 *
 * @return void
 */
function Chargement() {
	chg.visibility = "hidden";
}


// Vérification d'une date
// CheckDate(theform.jour, theform.mois, theform.annee); // et non CheckDate(12, 04, 1979)
// ou CheckDate(theform.jour, theform.mois, theform.annee, 'amin', 'amax')
function CheckDate1(jour,mois,annee) {
    
    // Arguments optionnels
    if (CheckDate1.arguments.length == 3) {
        var amin=1970; // année mini
        var amax=2037; // année maxi    
    } else {
        var amin=CheckDate1.arguments[3];
        var amax=CheckDate1.arguments[4];
    }
    
    var j=jour.value;
    var m=mois.value;
    var a=annee.value;
    
    if ( ((isNaN(j))||(j<1)||(j>31)) ) {
        alert("La date saisie semble incorrecte. Merci de vérifier.");
        jour.focus();
        return(false);
    }
    
    if ( ((isNaN(m))||(m<1)||(m>12)) ) {
        alert("La date saisie semble incorrecte. Merci de vérifier.");
        mois.focus();
        return(false);
    }
    
    if ( ((isNaN(a))||(a<amin)||(a>amax)) ) {
        alert("La date saisie semble incorrecte. Merci de vérifier.");
        annee.focus();
        return(false);
    }
    
    ok=1;
    
    if (ok==1) {
        var d2=new Date(a,m-1,j);
        j2=d2.getDate();
        m2=d2.getMonth()+1;
        a2=d2.getFullYear();
        
        if (a2<=100) {a2=1900+a2; alert(a);}
        
        if ( (j!=j2)||(m!=m2)||(a!=a2) ) {
            alert("La date saisie semble incorrecte. Merci de vérifier.");
            return(false);
            verif=1;
        }
        else {
            verif=0;
        }
    }
    
    if (verif==1) {
        return(false);
    }
    else {
        return(true)
    }
}


// On ne passe plus la date décomposée en jour, mois, année mais directement au format jj/mm/aaaa.
function CheckDate2(Date_var) {
    // Cette fonction vérifie le format JJ/MM/AAAA saisi et la validité de la date.
    
    // Arguments optionnels
    if (CheckDate2.arguments.length == 1) {
        var amin=1970; // année mini
        var amax=2037; // année maxi    
    } else {
        var amin=CheckDate2.arguments[1];
        var amax=CheckDate2.arguments[2];
    }
    
    var DateData = Date_var.value;
    
    pos_first_slash = DateData.indexOf("/");
    pos_last_slash  = DateData.lastIndexOf("/");
   
    var j = DateData.substring(0,pos_first_slash);
    var m = DateData.substring( (pos_first_slash +1), pos_last_slash);
    var a = DateData.substring( (pos_last_slash +1 ) , DateData.length);
  
    if (((isNaN(j))||(j<1)||(j>31)) ) {
        alert("La date saisie semble incorrecte. Merci de vérifier.");
        Date_var.focus();
        return(false);
    }
    
    if ( ((isNaN(m))||(m<1)||(m>12)) ) {
        alert("La date saisie semble incorrecte. Merci de vérifier.");
        Date_var.focus();
        return(false);
    }
    
    if ( ((isNaN(a))||(a<amin)||(a>amax)) ) {
        alert("La date saisie semble incorrecte. Merci de vérifier.");
        Date_var.focus();
        return(false);
    }
    
    ok=1;
    
    if (ok==1) {
        var d2=new Date(a,m-1,j);
        j2=d2.getDate();
        m2=d2.getMonth()+1;
        a2=d2.getFullYear();
        
        if (a2<=100) {a2=1900+a2; alert(a);}
        
        if ( (j!=j2)||(m!=m2)||(a!=a2) ) {
            alert("La date saisie semble incorrecte. Merci de vérifier.");
            Date_var.focus();
            return(false);
            verif=1;    
        }
        else {
            verif=0;
        }
    }
    
    if (verif==1) {
        return(false);
    }
    else {
        return(true)
    }
}


// Masque de saisie pour les dates
// Ex d'un appel : <input type="text" size="12" maxlength="11" value="" name="date_deb" onFocus="FormatDate(this)" onKeyPress="FormatDate(this)" onKeyUp="FormatDate(this)" onBlur="FormatDate(this)">
function FormatDate(champ_date) {
    var value_date = champ_date.value;
    
    if ( (value_date.length == 2) && (value_date.indexOf("/") == -1) ) {
        value_date = value_date  + "/";
        champ_date.value = value_date;
    }
    
    if ( (value_date.length == 5) && (value_date.lastIndexOf("/") == 2) ) {
        value_date = value_date  + "/";
        champ_date.value = value_date;
    }
    
    // Empêche la double saisie d'un "/"
    p = "\/\/";
    if (value_date.match(p)) {
        value_date = value_date.replace(p, "/");
        champ_date.value = value_date;
    }
    
}

// Ex d'utilisation : 
// IsDecimal(test, 'test') => vérifiera un nombre décimal d'une précision 2 positif avec un point comme séparateur
// IsDecimal(test, 'test', ',' , '4', 'false') => vérifiera un nombre décimal d'une précision 4 signé avec une virgule comme séparateur
function IsDecimal(champ, libelle) {
    // Paramétrage
    if (IsDecimal.arguments.length == 2) {
        separateur = '.';
        precision  = 2;
        positif    = true;
    } else {
        separateur = IsDecimal.arguments[2];
        precision  = IsDecimal.arguments[3];
        positif    = IsDecimal.arguments[4];;
    }
    // Vérifie la numérotation avec un "." comme séparateur
    tmp_val = champ.value;
    
    // On passe en point
    p = /[,]/; // chaine à rechercher
    valeur  = tmp_val.replace(p, '\.');
    
    // si le champ vaut 0, on arrête les traitements
    if (valeur == 0) {
        return true;
    }
    
    // Déclaration objet Number
    var valeur = new Number(valeur);
    
    // Vérifie qu'il s'agit d'un nombre décimal
    if (!parseFloat(valeur)) {
        alert("Le champ \"" + libelle +"\" doit être un nombre décimal.");
        champ.focus();
        return false;
    }
    
    // Vérifie valeur positive
    if ( (positif) && (valeur<0) ) {
        alert("Le champ \"" + libelle +"\" doit être un nombre décimal positif.");
        champ.focus();
        return false;
    }
    
    // Limite le nombre de chiffre après la virgule à la précision spécifiée
    valeur = valeur.toFixed(precision); 
    
    // Si c'est ',' en tant que séparateur décimal
    if (separateur == ',') {
        p       = '\.';  // à rechercher
        tmp_val = valeur;
        valeur  = tmp_val.replace(p, ',');
    }
    
    // Retour du résultat
    champ.value=valeur;
    return true;
}


// Vérification sur un nombre entier
function IsNumber(champ, libelle)
{
    if (champ.value != parseInt(champ.value) || champ.value=="") {
        alert("Le champ \"" + libelle +"\" doit être un nombre entier.");
        champ.value = "";
        champ.focus();   
        return false;   
    }
    else {
        return true;
   }
}


// Convertit un nombre décimal dont le séparateur est une virgule en point
function VirguleEnPoint(tmp_val) {
    p = /[,]/; // chaine à rechercher
    valeur  = tmp_val.replace(p, '\.');
    return valeur;
}


// Teste si la valeur de champ est compris entre iMin et iMax
function IsBetween(champ, libelle, iMin, iMax) {
    valeur = VirguleEnPoint(champ.value);
    
    if ((valeur < iMin) || (valeur > iMax)) {
        alert('Le champ ' + libelle + ' doit être compris entre ' + iMin + ' et ' + iMax + '.');
        champ.focus();
        return false;
    } else {
        return true;
    }
}


// Vérifie si le formulaire a été validé et affiche un msg d'attente si double validation
// Ex d'utilisation : <form onSubmit="return HasBeenSubmited(this);">
var Submitted = 0;
function HasBeenSubmited(formulaire) {
    if(Submitted) {
        alert("Le formulaire est déjà en cours de transfert (appuyez sur Ok et patientez SVP).");
        return false;
    } else {
        Submitted = 1;
        return true;
    }
}

// Limite le nombre de caractères max d'un champ de type textarea
function Compter(Target, max) {
	StrLen = Target.value.length;

	if (StrLen > max ) {
		Target.value = Target.value.substring(0,max);
		CharsLeft = max;
	}
}


// Va vers l'ancre spécifiée par num
function GoToAnchor(num) {
    if (num != '' ) {
        window.document.location.href= "#" + num;
    }
}

/** ACCESSIBILITE DES CALQUES **/
if (!document.getElementById) {
    layerAdr="document.all";
    openTag="[";
    endTag="]";
    
    // Raccourci pour s'adresser directement à un style par le nom (et non par l'objet)
    layerRef="document.all['";
	styleSwitch="'].style.";
}
else {
    layerAdr="document.getElementById";
    openTag="(";
    endTag=")";
    
    // Raccourci pour s'adresser directement à un style par le nom (et non par l'objet)
    layerRef="document.getElementById('";
	styleSwitch="').style.";
}

/**
  * Change la couleur d'une balise TD
  * @params champ => identifiant de l'objet
  *         color => couleur de remplacement en hexa
  */

function highligth(objet, color) {
    eval(layerAdr + openTag + "objet.id" + endTag + ".style.backgroundColor = '" + color + "';");
}


/**
 * Gère la couleur d'une ligne d'un tableau
 * @params  row   => l'objet ligne (<tr></tr>)
 *          event => évènement javascript :
 *                      "over" pour "onMouseOver"
 *                      "click" pour "onClik"
 *                      "out" pour "onMouseOut"
 *          color => couleur à affecter à la ligne
 * @exemple <tr bgcolor="#FEFEFE" id="row_1" onClick="setRowColor(this, '#FFCF9C', 'click')" onMouseOver="setRowColor(this, '#CEFFCE', 'over')" onMouseOut="setRowColor(this, '', 'out')">
 */

var wichRow = new Array();

function setRowColor(row, color, event) {
    
    // Colorisation de la ligne sur l'évènement "onClick"
    if (event == 'click') {
        
        // La ligne n'était pas encore cliquée
        if (!wichRow[row.id]) {
            wichRow[row.id] = 1;
            highligth(row, color);
        }
        // La ligne était déjà cliquée
        else  {
            wichRow[row.id] = false;
            highligth(row, '');
        }
    }
    
    // Colorisation de la ligne sur l'évènement "onMouseOver"
    else if (event == 'over' && (!wichRow[row.id])) {
        highligth(row, color);
    }
    
    // Colorisation de la ligne sur l'évènement "onMouseOut"
    else if (event == 'out' && (!wichRow[row.id])) {
        highligth(row, color);
    }
}

/** 
 * Compte le nombre d'éléments sélectionnés dans une liste de type "select"
 *
 * @params liste, l'objet "select"
 * @return int le nombre d'éléments sélectionnés dans la liste
 */
function countSelOpt(liste) {
    nbselect = 0;
    
    for (i=0; i!=liste.length; i++) {
        if (liste.options[i].selected == true) {
            nbselect++;
        }
    }
    
    return nbselect;
}


/**
* Coche / décoche un groupe de case à cocher.
*
* @param Le nombre de checkbox à cocher/décocher    
* @param idStartText L'id des checkBoxs doivent être composées de la sorte : idStartText + Number (example : id="checkBox1", id="checkBox2" => idStartText = checkBox)
* @param formulaire L'objet formulaire
*
* <code>
* <form name="formulaire">
* <input type="checkbox" id="toggle" name="toggle" onClick="checkAll('checkBox', 5, document.formulaire)">Tous / Aucun<br>
* 
* <input type="checkbox" id="checkBox1">1<br>
* <input type="checkbox" id="checkBox2">2<br>
* <input type="checkbox" id="checkBox3">3<br>
* <input type="checkbox" id="checkBox4">4<br>
* 
* </form>
* </code>
*/
function checkAll(idStartText, n, formulaire) {
    var f = formulaire;
	var c = f.toggle.checked;
	var n2 = 0;
	for (i=0; i < n; i++) {
		cb = eval( 'f.' + idStartText + i );
		if (cb) {
			cb.checked = c;
			n2++;
		}
	}
}

/** 
 * Retourne le timestamp d'une date précisée par "date_fr" au format français MM/JJ/AAAA
 *
 * @param string date_fr (mm/jj/aaaa)
 * @return timestamp
 */
function DateFrToTimeStamp(date_fr) {
    pos_first_slash = date_fr.indexOf("/");
    pos_last_slash  = date_fr.lastIndexOf("/");
    
    j = date_fr.substring(0, pos_first_slash);
    m = date_fr.substring((pos_first_slash +1), pos_last_slash);
    a = date_fr.substring((pos_last_slash +1 ), date_fr.length);
    
    objetDate = new Date(a, m, j);
    
    return Date.parse(objetDate);
}

/** 
 * Les deux fonctions ci-dessous (HideTip & ShowTip)servent à faire apparaître une bulle d'aide
 *
 * <code>
 * <div class="CTooltip" id="tt1"> Un lien se traduit en HTML par l'emploi de la balise [HREF]...</div>
 * <div class="CTooltip" id="tt2"> Un tooltip peut être placé sur n'importe quel élément html, du moment que les évnèments javascript OnmouseOver &amp; ONmouseOut soient acceptés</div>
 * <a href="toto" onmouseover="ShowTip(1);" onmouseout="HideTip(1);">Exemple sur un lien HREF</a>
 * <br>
 * <table border="1">
 *   <tr>
 *     <th colspan="2" onmouseover="ShowTip(2);" onmouseout="HideTip(2);">Entete de colonne</th>  
 *   </tr>
 *   <tr>
 *     <td>Colonne 1</td>
 *     <td>Colonne 2</td>
 *   </tr>
 * </table>
 * </code>
 */
function ShowTip(fArg)
{
	var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']");
	if (tooltipOBJ != null) {
		var tooltipLft = (document.body.offsetWidth?document.body.offsetWidth:document.body.style.pixelWidth) - (tooltipOBJ.offsetWidth?tooltipOBJ.offsetWidth:(tooltipOBJ.style.pixelWidth?tooltipOBJ.style.pixelWidth:380)) - 30;
		if (navigator.appName != 'Netscape') {
			var tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10);
			if ((event.clientX > tooltipLft) && (event.clientY < (tooltipOBJ.scrollHeight?tooltipOBJ.scrollHeight:tooltipOBJ.style.pixelHeight) + 10)) {
				tooltipTop = (document.body.scrollTop?document.body.scrollTop:document.body.offsetTop) + event.clientY + 20;
			}
			tooltipOBJ.style.pixelLeft = tooltipLft; tooltipOBJ.style.pixelTop = tooltipTop;
		}
		else {
			var tooltipTop = 10;
			tooltipOBJ.style.left = tooltipLft; tooltipOBJ.style.top = tooltipTop;
		}
		tooltipOBJ.style.visibility = "visible";
	}
}
function HideTip(fArg)
{
	var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']");
	if (tooltipOBJ != null) {
		tooltipOBJ.style.visibility = "hidden";
	}
}

// Valide un email
function IsMail(champ)
{
	str = champ.value;
    
    error = "Votre adresse email est invalide.";
    
	if (str.indexOf('@', 0) == -1)
	{
		alert(error);
		champ.focus();
		return false;
	}

	if (str.indexOf('.', 0) == -1)
	{
		alert(error);
		champ.focus();
		return false;
	}
	
	return true;
}


/**************** Fonctions pour rollovers ************************/

function MM_swapImgRestore() { //v3.0
    var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
    var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
    var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
    if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
    for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
    if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
    var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
    if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
} 

/****************************************************************************************************/