var already_submit = 0;

function avertirAmbufor() {
	var advised = this.document.getElementById('form:avert').value;
	if(advised != 1) {
		alert("Vous n' êtes autorisé à utiliser cette application qu'en cas de non-fonctionnement de l'application du SPF");
		this.document.getElementById('form:avert').value = 1;
	}
}

function valideOblig(champ)
/* Fonction qui vérifie qu'un champ obligatoire est rempli (au moins un caractère qui ne soit pas un espace).
A utiliser avec onBlur */
    {
	var msg;
	if (arguments.length > 1) { msg=arguments[1]; } 
	else { msg="Ce champ est obligatoire !"; }

	if (!valideChampRempli(champ))
	{
	  window.alert(msg);
	  // ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
	  champ.focus();
	  champ.select();
	  return false;
	}
        else
        { return true; }
    }

function valideDateOblig(obj)
{
	if(valideOblig(obj)) { return valideDate(obj); } else return false;
}

function isValideHeureMin(obj){
	/* Valide une heure sous un format HHhMM. */
	var formatHeure = /^[012]\d[h][0-5]\d$/;
	var str = obj.value;
	return (str == "" || ( formatHeure.test(str) && str.substr(0,2)!='24' ));
}
function valideHeureMin(obj){
	/* Valide une heure sous un format HHhMM. */
	/* A utiliser avec onBlur. */
	
	if (arguments.length > 1) { msg=arguments[1]; } 
	else { msg="Veuillez introduire une heure au format HHhMM !"; }
	// En cas d'erreur, retour sur zone incorrecte et message d'avertissement
	if(!isValideHeureMin(obj)){
		window.alert(msg);
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		obj.focus();
		obj.select();
		return false;
	} else {
		return true;
	}
}

function isValideDate(obj){
	/* Valide une date sous un format JJ/MM/AAAA. */
	formatDate = /^\d{2}\/\d{2}\/\d{4}$/;

	strDate = obj.value;
	errDate = false; // Vrai si date incorrecte, faux sinon
	if(strDate != "") { // Pas de contrôle si champ pas rempli
		if(!formatDate.test(strDate)){
			errDate = true;
		} else { 
			errDate = !valideDateSep(strDate.substr(0,2),strDate.substr(3,2),strDate.substr(6,4));
		}
	}
	return !errDate;
}
function valideDate(obj){
	/* Valide une date sous un format JJ/MM/AAAA.
	A utiliser avec onBlur. */
	
	if (arguments.length > 1) { msg=arguments[1]; } 
	else { msg="Veuillez introduire une date valide au format JJ/MM/AAAA !"; }
	// En cas d'erreur, retour sur zone incorrecte et message d'avertissement
	if(!isValideDate(obj)){
		window.alert(msg);
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		obj.focus();
		obj.select();
		return false;
	} else {
		return true;
	}
}

function valideDate3(objJour, objMois, objAnnee){
/* Valide une date dont les valeur sont mise dans 3 zones */
	
	var errDate = !valideDateSep(objJour.value,objMois.value,objAnnee.value);

	// En cas d'erreur, retour sur zone incorrecte et message d'avertissement
	if(errDate == true){
		window.alert("Date non valide ! \nVérifiez le jour, le mois et l'année.");
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		objJour.focus();
		objJour.select();
		return false;
	} else {
		return true;
	}
}

function valideDateSep(jj , mm, aaaa)
/* Valide les élements d'une date */
{
	var jour, mois, annee;
	var errDate = false; // Vrai si date incorrecte, faux sinon
	if(jj=="" && mm=="" && aaaa==""){  // Pas de contrôle si champ pas rempli
		errDate = false;
	} else if(jj !="" || isNaN(jj) || mm=="" || isNaN(mm) || aaaa=="" || isNaN(aaaa)) { // Pas de contrôle si champ pas rempli
		jour = new Number(jj);     // Jour dans la date
		mois = new Number(mm);   // Mois dans la date
		annee = new Number(aaaa); // Année dans la date
	     // window.alert(">> jour:" + jour + " mois:" + mois + " annee:" + annee);
		if (mois < 1 || mois > 12 || jour < 1 || annee < 1800 || annee > 2199 || jour > nbJourMois(mois,annee) ) {
			errDate = true;
		}
	}
	return !errDate;
}

/* Valide une période sous un format MM/AAAA */
function isValidePeriode(obj){
	format = /^\d{2}\/\d{4}$/;
	str = obj.value;
	err = false; // Vrai si période incorrecte, faux sinon
	if(str != "") { // Pas de contrôle si champ pas rempli
		if(!format.test(str)){ // Contrôle du format général
			err = true;
		}
		else { // Contrôles des valeurs MM et AAAA
			err = !valideDateSep("01",str.substr(0,2),str.substr(3,4));
		}
	}
	return !err;
}

/* Valide une période sous un format JJ/MM/AAAA.
A utiliser avec onBlur. */
function validePeriode(obj){
	if (arguments.length > 1) { msg=arguments[1]; } 
	else { msg="Veuillez introduire une période au format MM/AAAA !"; }
	// En cas d'erreur, retour sur zone incorrecte et message d'avertissement
	if(!isValidePeriode(obj)){
		window.alert(msg);
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		obj.focus();
		obj.select();
		return false;
	}
	else {
		return true;
	}
}

function nbJourMois(mois,annee)
{
    var nbJour = 0;
    if(mois < 1 || mois > 12) { // Contrôle du mois : entre 1 et 12 (1=jan, 12=dec)
	nbJour = 0;
    } else if (mois == 2){
	if(((annee % 400) == 0) || (((annee % 4) == 0) && ((annee % 100) != 0))) // Année bissextile
	{
		nbJour= 29;
	} else {
		nbJour= 28;
	}
    } else if((mois == 4) || (mois == 6) || (mois == 9) || (mois == 11)) {
	nbJour = 30;
    } else {
	nbJour = 31;
    }
    return nbJour;
}

function valideNissOblig(obj)
{
  if(valideOblig(obj,"Le \"numéro national / niss\" est obligatoire !")) { 
    return valideNiss(obj); 
  } else return false;
}

function isValideNiss(nna){
	var probleme = false;
	if(nna.value != "")/*  Si on ne remplit pas la zone, pas de contrôle */
	   {
		if(nna.value.length != 11 || isNaN(nna.value) )/*  Contrôle sur la taille + nombre */
		   {
			probleme = true;
		   }
		else/*  Contrôle sur la valeur */
		   {
			var debut = new Number(nna.value.substring(0, 9));
			var fin = new Number(nna.value.substring(9, 11));
			/*  Contrôle sur le format */
			if((fin != (97 - (debut % 97))) && (fin != (97 - ((debut + 2000000000) % 97)))) /* Si la personne est née après 2000 */
			  {
				probleme = true;
			  }
		   }
	   }
	 return !probleme;
}
function valideNiss(nna)
/* Vérifie qu'un n° national a une forme correcte (2 derniers chiffres combinaison des 9 premiers) et un contenu correct (6 premiers chiffres sont une date de naissance).
A utiliser avec onBlur. */
	{
	var valide = isValideNiss(nna);
	if(!valide)
	   {
		window.alert("N° national incorrect");
		// ces lignes doivent se trouver après l'alert afin de ne pas bloquer firefox !
		nna.focus();
		nna.select();
	   }
	return valide;
	}

function isValideNiss13(nna){
	formatNiss = /^\d{6}-\d{3}-\d{2}$/;
	var probleme = false;
	if(nna.value != "")/*  Si on ne remplit pas la zone, pas de contrôle */
	   {
		if(!formatNiss.test(nna.value))/*  Contrôle sur le format */
		   {
			probleme = true;
		   }
		else/*  Contrôle sur la valeur */
		   {
		    var str = nna.value.replace(/-/g,"")
			var debut = new Number(str.substring(0, 9));
			var fin = new Number(str.substring(9, 11));
			/* Contrôle sur le format */
			if((fin != (97 - (debut % 97))) && (fin != (97 - ((debut + 2000000000) % 97)))) /* Si la personne est née après 2000 */
			  {
				probleme = true;
			  }
		   }
	   }
	return !probleme;
}
function valideNiss13(nna)
/* Vérifie qu'un n° national a une forme correcte (2 derniers chiffres combinaison des 9 premiers) et un contenu correct (6 premiers chiffres sont une date de naissance).
A utiliser avec onBlur. */
	{
	var probleme = !isValideNiss13(nna);
	if(probleme == true)
	   {
		window.alert("N° national incorrect. \nex:123456-123-12");
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		nna.focus();
		nna.select();
	   }
	return !probleme;
	}

function valideTelOblig(obj)
{
  if(valideOblig(obj,"Le \"numéro de téléphone\" est obligatoire !")) { return valideTel(obj); } else return false;
}

function valideTel(tel)
/* Vérifie que le n° de téléphone a un format correct.
A utiliser avec onBlur. */
	{
	txt = tel.value;
	var valide = true;
	if(txt != "")/*  Si on ne remplit pas la zone, pas de contrôle */
		{
/*		 format = /^\d{2,4}\/\d+$/; */
		formatNormalEtGSM = /^\d{3,4}\/\d{6}$/;
		formatNormalEtGSMAvecPoints = /^\d{3,4}\/\d{2}\.\d{2}\.\d{2}$/;
		formatBxl = /^\d{2}\/\d{7}$/;
		formatBxlAvecPoints = /^\d{2}\/\d{3}\.\d{2}\.\d{2}$/;
		if(!(formatNormalEtGSM.test(txt)) && !(formatNormalEtGSMAvecPoints.test(txt)) && !(formatBxl.test(txt)) && !(formatBxlAvecPoints.test(txt)))
			{	  
			valide = false;
			window.alert("Mauvais format de numéro de téléphone");
			// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
			tel.focus();
			tel.select();
			}
		}
	return valide;
	}

function valideTelInterOblig(obj)
{
  if(valideOblig(obj,"Le \"numéro de téléphone\" est obligatoire !")) { return valideTelInter(obj); } else return false;
}

function valideTelInter(tel)
/* Vérifie que le n° de téléphone a un format correct.
A utiliser avec onBlur. */
	{
	txt = tel.value;
	var valide = true;
	if(txt != "")/*  Si on ne remplit pas la zone, pas de contrôle */
		{
		formatNormal = /^[0-9 .\/+]+$/;
		if(!formatNormal.test(txt))
			{	  
			valide = false;
			window.alert("Mauvais format de numéro de téléphone");
			// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
			tel.focus();
			tel.select();
			}
		}
	return valide;
	}
	
function valideFaxInter(fax) {
	/* Vérifie que le n° de fax a un format correct.
	A utiliser avec onBlur. */
	txt = fax.value;
	var valide = true;
	if(txt != "")/*  Si on ne remplit pas la zone, pas de contrôle */
		{
		formatNormal = /^[0-9 .\/+]+$/;
		if(!formatNormal.test(txt))
			{	  
			valide = false;
			window.alert("Mauvais format de numéro de fax");
			// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
			fax.focus();
			fax.select();
			}
		}
	return valide;
}

function valideRadio(ra)
/* A utiliser avec onBlur. */
{
	var valide = isValideRadio(ra);
	var msg;
	if (arguments.length > 1) { msg=arguments[1]; }
	else { msg="Vous devez faire un choix"; }

	if (!valide)
		{
		window.alert(msg);
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		ra[0].focus();
		ra[0].select();
		}
	return valide;
}

function isValideRadio(ra)
/* A utiliser avec onBlur. */
{
	var valide = false;
	var i = 0;
	var txt;
	if (!ra.length){
	   valide = true;
        } else {
	  while (i < ra.length && !valide) {
	    valide = ra[i].checked;
	    i++;
	  }
        }
	return valide;
}

function valideSelect(sel)
/* A utiliser avec onBlur. */
{
	var valide = isValideSelect(sel);
	var msg;
	if (arguments.length > 1) { msg=arguments[1]; }
	else { msg="Vous devez choisir dans la liste"; }

	if (!valide)
		{
		window.alert(msg);
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		sel.focus();
//		sel.options[0].select();
		}
	return valide;
}

function isValideSelect(sel)
/* A utiliser avec onBlur. */
{
	return (sel == null || sel.selectedIndex != 0);
}
	


/* Fonction qui s'assure de la taille minimum et de la taille maximum de la valeur d'un champ.
Appelée par valideTaillePwd, valideTailleId,... */
function valideTailleMinMax(min, max, champ)
	{
	if(champ.value != "") // Pas de contrôle si champ pas rempli
		{
		var valide = true;
		if(champ.value.length > max)
			{
			valide = false;
			window.alert("Attention, cette valeur doit faire maximum " + max + " caractères.");
			champ.focus();
			champ.select();
			}
		else
			{
			if(champ.value.length < min)
				{
				valide = false;
				window.alert("Attention, cette valeur doit faire au minimum " + min + " caractères.");
				champ.focus();
				champ.select();
				}
			}
		}
	return valide;
	}

function valideTaillePwd(champ)
/* Fonction qui s'assure de la taille minimum et de la taille maximum d'un mot de passe.
A utiliser avec onBlur. */
	{
	return valideTailleMinMax(8, 15, champ);
	}

function valideTailleUserId(champ)
/* Fonction qui s'assure de la taille minimum et de la taille maximum d'un user id.
A utiliser avec onBlur. */
	{
	return valideTailleMinMax(6, 15, champ);
	}

function valideUserIdExterne(champ)
	{
	var format=/^[a-zA-Z0-9][-.\w]{5,14}$/;
	var valide = true;
	if (!format.test(champ.value)){
		valide = false;
		window.alert("Les caractères autorisés sont\n- les lettres minuscules ou majuscules (sans accent),\n- les chiffres\n- les caractères - (tiret) _ (souligné) et . (point)\nnb: le 1er caractère doit être un chiffre ou une lettre");
		champ.focus();
		champ.select();
	}
	return valide;	
/*
	var valide = false;
	if (valideTailleUserId(champ)){
	   if (champ.value.charAt(0) == '@'){
		valide = false;
		window.alert("Le code utilisateur ne peut pas commencer par @");
		champ.focus();
		champ.select();
	   } else {
		valide = true;
	   }
	return valide;
	}
*/
	}

function valideUserIdInterne(champ)
/* Contrôle si le champ commence bien par @.
A utiliser avec onBlur */
	{
	var format=/^\$[-.\w]{5,14}$/;
	var valide = true;
	if (champ.value != "" && !format.test(champ.value)){
		valide = false;
		window.alert("Les caractères autorisés sont\n- les lettres minuscules ou majuscules (sans accent),\n- les chiffres\n- les caractères - (tiret) _ (souligné) et . (point)\nnb: le 1er caractère doit être $");
		champ.focus();
		champ.select();
	}
	return valide;	
/*
	var valide = false;
	if (valideTailleUserId(champ))
		{
		if (champ.value.charAt(0) != '@')
			{
			valide = false;
			window.alert("Le code utilisateur interne doit commencer par @");
			champ.focus();
			champ.select();
		   	}
		else
			{
			valide = true;
		   	}
		return valide;
		}
*/
	}

function valideTaille(taille, champ)
/* Contrôle la taille d'un champ.
A utiliser avec onBlur */
	{
	var valide = true;
	if(champ.value != "" && champ.value.length != taille)
		// Pas de contrôle si champ pas rempli
		{
		valide = false;
		window.alert("Attention, cette zone doit contenir " + taille + " caractère(s).");
		champ.focus();
		champ.select();
		}
	return valide;
	}

function isRempli(champ)
	{
	return valideChampRempli(champ);
	}

function valideChampRempli(champ)
/* Fonction qui vérifie qu'un champ est rempli (au moins un caractère qui ne soit pas un espace).
A utiliser avec onBlur, onClick,... */
	{
	var format = /^\s*$/;
	if((champ.value.length == 0) || (champ.value == "") || (format.test(champ.value)))
		{
		return false;
		}
	else
		{
		return true;
		}
	}

/* verification nombre entier */
function valideEntierOblig(obj)
{
  var test;

  if (arguments.length > 1) { 
     test = valideOblig(obj,arguments[1]);
  } else {
     test = valideOblig(obj);
  }

  if(test) { return valideEntier(obj); } else return false;
}

function isValideEntier(nbre)
/* Fonction qui vérifie qu'un champ est <> ' '
A utiliser avec onBlur */
    {
	var regEx = /^\d+$/;
	return (nbre.value == ""  || regEx.test(nbre.value));
    }

function isValideEntierSigne(nbre)
    {
	var regEx = /^[-+\d]*\d$/;
	return (nbre == ""  || regEx.test(nbre));
    }
function valideEntierPositif(nbre){
	if(!isValideEntier(nbre)){
		nbre.value='1';	
	}
	else
	{
		if (nbre.value<1){
			nbre.value=1;
		}
		else
		{
			
		}
	}
	
}
function valideEntier(nbre)
/* Fonction qui vérifie qu'un champ est <> ' '
A utiliser avec onBlur */
    {
	var regEx = /^\d+$/;
	if (nbre.value != ""  && !regEx.test(nbre.value))
	{
	  window.alert("Cette zone ne peut contenir que des chiffres !");
	  nbre.focus();
	  nbre.select();
	  return false;
	} else return true;
    }

/* verification mail */
function valideMailOblig(obj)
{
  if(valideOblig(obj,"L'adresse e-mail est obligatoire !")) { return valideMail(obj); }
  else{ return false; }
}
function valideMail(aMail)
   {
      var valide = true;
	  var formatMail1=/^\w[\w-.]*\w@[\w-.]{1,}\.\w{1,}$/;
	  var formatMail2=/^\w@[\w-.]{1,}\.\w{1,}$/;
      
      mail = aMail.value;  	
      if (mail != null && mail != "") 
      {
	    // p = mail.indexOf("@");
        // if ((p < 0) || (mail.lastIndexOf(".")<p)) {
        if (!formatMail1.test(mail) && !formatMail2.test(mail)){
   	      window.alert("Le format de l'adresse e-mail est incorrect");
	      aMail.focus();
	      aMail.select();
	      valide = false;
        }
      }
      return valide;
   }


function aButton(txtButton,refButton)
   {
       this.document.write("<TABLE border=0 cellPadding=0 cellSpacing=0 bgcolor=#FFFFFF>"
       + "<TR><TD align=right bgColor=#c6cfc6 class=SubmitButton vAlign=top>"
       + "<A class=SubmitButton href=\"" + refButton + "\">" + txtButton + "</A></TD></TR></TABLE>");
   }

function anInactiveButton(txtButton)
   {
       this.document.write("<TABLE border=0 cellPadding=0 cellSpacing=0 bgcolor=#FFFFFF>"
       + "<TR><TD align=right bgColor=#c6cfc6 class=SubmitButton vAlign=top><FONT color=#666666>"+ txtButton +"</FONT></TD></TR></TABLE>");
   }

function isListSelected( obj, val)
{
	if (obj.selectedIndex < 0 ) {
		return false;
	}
	else
	{
		var sel = obj.options[obj.selectedIndex].value;
		if (sel == val) {
		  return true;
		}
		else
		{
		  return false;
		}	
	}

}

function isSelected(obj)
// test si l'obj est valide et si une ligne est sélectionnée
{
	if (obj == null) 
	{
		return false;

	}
	else
	{
		if (obj.selectedIndex < 0 ) {
			return false;
		}
		else
		{
			return true;
		}
	}
}

/* fonction qui affiche un message d'erreur quand la sélection dans une liste correspond à un param */
function valideList(obj, val)
{
  var msg;
  if (arguments.length > 2) { msg=arguments[2]; } 
  else { msg="Le choix '" + val + "' dans la liste " + obj.name + " n'est pas valide"; }

  if (isListSelected(obj, val) )
  {
    window.alert(msg);
    return false;
  }
  return true;
}

/* validation d'un numéro de compte normalisé belge 
Si popup = false pas de message
Si popup = true message
*/

function valideNumCpt(obj, popup) {
    //rc = false; // par défaut, on considère le num de compte comme fautif
	var format = /^\d{3}-\d{7}-\d{2}$/
	if (obj.value != "" ) {
		if (!format.test(obj.value)) {
			if(popup){
				alert("Le format du numéro de compte est incorrect (3-7-2)");
			}
			return false;
		}else{
    		var num1 = new Number(obj.value.substr(0,3) + obj.value.substr(4,7));
		  	var cd  = new Number(obj.value.substr(12,2));
			var mod = num1 % 97 ;
			if ( mod == 0) mod = 97;
			if (mod != cd) {				
				if(popup){
					alert("Le numéro de compte est incorrect");
				}
				return false;
			}else{
				return true;
			} 
		}
	}else{
		return false;
	}
}

/* vérifie que les 2 derniers chiffre d'un nombre sont le modulo97 
 * Attention, contrôle propre aux comptes bancaires uniquement ! 
 * */
function isMod97(numb) {
  if ( (numb != null) && (!isNaN(numb)) ) {
    var base = new Number(numb.substr(0, (numb.length - 2) ) );
    var mod  = new Number(numb.substr( (numb.length - 2)  , numb.length - 1 ) );
    var calc = base % 97;
    if (calc == 0) {
	calc = 97;
    }
    if (mod == calc) {
      // le modulo est correct
      return true;
    }
    else
    {
      // le modulo n'est pas correct
      return false;
    }
  }
}


/* vérifie que les 2 derniers chiffre d'un nombre sont le modulo97 
 * ATTENTION : fonction propre aux numéros de cartes SIS! 
 * */
function isMod97SIS(numb) {
  if ( (numb != null) && (!isNaN(numb)) ) {
    var base = new Number(numb.substr(0, (numb.length - 2) ) );
    var mod  = new Number(numb.substr( (numb.length - 2)  , numb.length - 1 ) );
    var calc = base % 97;
    if (mod == calc) {
      // le modulo est correct
      return true;
    }
    else
    {
      // le modulo n'est pas correct
      return false;
    }
  }
}

/* vérifie que les 2 derniers chiffre d'un nombre sont 97 - le modulo97 */
function is97Mod97(numb) {
  if ( (numb != null) && (!isNaN(numb)) ) {
    var base = new Number(numb.substr(0, (numb.length - 2) ) );
    var mod  = new Number(numb.substr( (numb.length - 2)  , numb.length - 1 ) );
    var calc = 97 - (base % 97);
    if (mod == calc) {
      // le modulo est correct
      return true;
    }
    else
    {
      // le modulo n'est pas correct
      return false;
    }
  }
}

function valideOnss(obj) 
{
	var rc = false ;
	/* format = /^\d{7,8}-\d{2}$/ */

	format1 = /^\d{7}-\d{2}$/
	format2 = /^5\d{7}-\d{2}$/

	/* if (!format.test(obj.value)) */
	if (!format1.test(obj.value) && !format2.test(obj.value))
	{
	  alert("Format du n° ONSS incorrect");
	  rc = false;
	}
	else
	{
	  re = /(\w+)-(\w+)/ ;
	  numb = obj.value.replace(re , "$1$2");
	  var base = new Number(numb.substr(0, (numb.length - 2) ) );
	  var mod  = new Number(numb.substr( (numb.length - 2)  , numb.length - 1 ) );
	  var calc = ( base * 100 ) % 97;
	  if ( (  (96 - calc) != mod) && ((96 - calc + 97) != mod) )
	  {
		alert("Numéro Onss incorrect");
		rc = false;
	  }
	  else
	  {
		rc = true;
	  }
	  
	}

	if (rc == false) 
	{
		obj.select();
		obj.focus();
		return false;
	}
	else
	{
		return true;
	}

}

function isValideNombre(nb,chifAvant,chifApres){
//	var regEx1 = /^\d{1,}$/;
//	var regEx2 = /^\d{1,},\d{1,}$/;
//	var regEx3 = /^0,\d{1,}$/;
	var posDec;

	var res = 0;
	var msg = "";

	if (nb.value == "") res = 1;

	if (res == 0 && !isNumber(nb.value)) 
	   res = 2;
//	if (res == 0 && !regEx1.test(nb.value) && !regEx2.test(nb.value)) 
//	   res = 2;
	var nbValue = nb.value.replace(/\./g,"");
	if (res == 0 && chifAvant == 0 && nbValue.charAt(0) == '0') 
	   chifAvant = 1;
	if (res == 0) {
	  posDec = nbValue.indexOf(',');
          if ( (posDec != -1 && posDec > chifAvant) || (posDec == -1 && nbValue.length > chifAvant) ){
	    res = 2;
	  }
	} // --> ok pour les chiffres devant la ,

	/* nb : 12,12345 contient 8 - 2 - 1 càd 5 chiffres décimaux. */

	if ( res == 0 && posDec != -1 && chifApres < nbValue.length - posDec - 1  ) {
	    res = 2;
	}
	return (res != 2);
}

function valideNombre(nb,chifAvant,chifApres) 
{
	if (!isValideNombre(nb,chifAvant,chifApres)) {
	   window.alert("Ce nombre n'a pas un format correct ! \n - Le séparateur des décimales doit être une virgule. \n - "+chifAvant+" chiffre(s) maximum avant la virgule. \n - "+chifApres+" chiffre(s) maximum après la virgule.");
	   // ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
	   nb.focus();
	   nb.select();
	   return false;
	} else {
	   return true;
	}
} 

// validation d'un nombre avec possibilité d'utiliser le '.' comme séparateur de millier ...
function valideNombreBE(nb,chifAvant,chifApres) 
{
	var posDec;

	var res = 0;
	var msg = "";
	var nbr = nb.value;

	if (nbr == "") res = 1;

	if (res == 0 && !isNumber(nbr)) 
	   res = 2;

	if (res == 0 && chifAvant == 0 && nbr.charAt(0) == '0') 
	   chifAvant = 1;
	if (res == 0) {
	  nbr = nbr.replace(/\./g,"");
	  posDec = nbr.indexOf(',');
          if ( (posDec != -1 && posDec > chifAvant) || (posDec == -1 && nbr.length > chifAvant) ){
	    res = 2;
	  }
	} // --> ok pour les chiffres devant la ,

	/* nb : 12,12345 contient 8 - 2 - 1 càd 5 chiffres décimaux. */

	if ( res == 0 && posDec != -1 && chifApres < nbr.length - posDec - 1  ) {
	    res = 2;
	}

	if (res == 2) {
	   window.alert("Ce nombre n'a pas un format correct ! \n - Le séparateur des décimales doit être une virgule. \n - "+chifAvant+" chiffre(s) maximum avant la virgule. \n - "+chifApres+" chiffre(s) maximum après la virgule.");
	   // ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
	   nb.focus();
	   nb.select();
	   return false;
	} else {
	   return true;
	}
} 

// validation d'un nombre avec possibilité d'utiliser le '.' comme séparateur de millier ...
function isValideNombreBE(nb,chifAvant,chifApres) 
{
	var posDec;

	var res = 0;
	var msg = "";
	var nbr = nb.value;

	if (nbr == "") res = 1;

	if (res == 0 && !isNumber(nbr)) 
	   res = 2;

	if (res == 0 && chifAvant == 0 && nbr.charAt(0) == '0') 
	   chifAvant = 1;
	if (res == 0) {
	  nbr = nbr.replace(/\./g,"");
	  posDec = nbr.indexOf(',');
          if ( (posDec != -1 && posDec > chifAvant) || (posDec == -1 && nbr.length > chifAvant) ){
	    res = 2;
	  }
	} // --> ok pour les chiffres devant la ,

	/* nb : 12,12345 contient 8 - 2 - 1 càd 5 chiffres décimaux. */

	if ( res == 0 && posDec != -1 && chifApres < nbr.length - posDec - 1  ) {
	    res = 2;
	}

	return (res != 2);
} 

function valideNegMontantEuro(nb, chifAvant){
	tmp = new Object();
	tmp.value = nb.value;
	if (tmp.value.charAt(0) == '-'){		
		tmp.value = tmp.value.substr(1, tmp.value.length);		
	}
	return valideMontantEuro(tmp, chifAvant);

}
function valideMontantEuro(nb,chifAvant) 
{
	var regEx1 = /^\d{1,}$/;
	var regEx2 = /^\d{1,},\d{1,2}$/;
	var res = 0;
	var posDec;

	if (nb.value == "")
	  res = 1;
	if (res == 0 && !regEx1.test(nb.value) && !regEx2.test(nb.value)){
	  res = 2;
	}
	if (res == 0 && chifAvant == 0 && nb.value.charAt(0) == '0'){
	  chifAvant = 1; 
	}

	if (res == 0) {
	  posDec = nb.value.indexOf(',');
      if (posDec > chifAvant || ( posDec == -1 && nb.value.length > chifAvant )){
	    res = 2;
	  }
	} // --> ok pour les chiffres devant la ,

	if (res == 2) {
	   window.alert("Ce nombre n'a pas un format correct !");
	   // ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
	   nb.focus();
	   nb.select();
	   return false;
	} else {
	   return true;
	}
}

function strToNumber(nbr1) {
	// format accepté: ...99.999,99... ou ..9999,99.. ou ...9999...
	// sinon le résultat donne 0
	var c1;
	var n1;

	if (typeof(nbr1)=='object'){
		c1 = nbr1.value;
	} else {
		c1 = nbr1;
	}

	c1 = c1.replace(/\./g,"").replace(/,/g,".");

	if (!isNaN(c1)){
	    n1 = new Number(c1);
	} else {
	    n1 = 0;
	}
	return n1;
}

function strToDate(dateParam) {
	// format accepté: "JJ/MM/AAAA" ou "j, m, aaaa" dans des zone séparée
	// sinon le résultat donne 0

	var jour, mois, annee;

	if (arguments.length > 1) {
		if (typeof(dateParam)=='object'){
			jour = dateParam.value;
			mois = arguments[1].value;
			annee = arguments[2].value;
		} else {
			jour = dateParam;
			mois = arguments[1];
			annee = arguments[2];
		}
	} else {
		if (typeof(dateParam)=='object'){
			strDate = dateParam.value;
		} else {
			strDate = dateParam;
		}
		jour = strDate.substr(0,2);
		mois = strDate.substr(3,2);
		annee = strDate.substr(6,4);
	}

	// window.alert("jour:" + jour + " mois:" + mois + " annee:" + annee);

	if (jour=="" || mois=="" || annee=="" || !valideDateSep(jour,mois,annee)){
		return null;
	} else {
	   	var dd = new Date(annee, mois - 1, jour);
		return dd; // new Date(annee, mois, jour);
	}
}

function nissToDate13(nna){
	var dateRetour;
	if (nna != "") { /*  Si on ne remplit pas la zone, pas de contrôle */
		if (nna.length != 13)/*  Contrôle sur la taille */ {
			dateRetour = null;
		}
		else {
			var partie1 = nna.substring(0,6);
			var partie2 = nna.substring(7,10);
			var partie3 = nna.substring(11);
			return nissToDate(partie1+partie2+partie3);
		}
	} else {
	    dateRetour = null;
	}
	return dateRetour;
}

function nissToDate(nna) {
	// retourne la date de naissance correspondant au niss
	// (si niss incorrect ou date incorrecte, retourne NULL)

	var probleme = false;
	var dateRetour;
	if(nna != "") { /*  Si on ne remplit pas la zone, pas de contrôle */
		if(nna.length != 11 || isNaN(nna) )/*  Contrôle sur la taille + nombre */ {
			dateRetour = null;
		   }
		else/*  Contrôle sur la valeur */
		   {
			var debut = new Number(nna.substring(0, 9));
			var fin = new Number(nna.substring(9, 11));
			var moisNumber = new Number(nna.substr(2,2));
			var dateNaiss;
			// S'il s'agit d'un NISS provisoire, on rectifie le mois
			// Niss provisoire ? (BIS)
			if(moisNumber >= 20 && moisNumber <= 32) {
				moisNumber -= 20;
				if(moisNumber < 10) {
					nna = nna.substr(0,2) + '0' + moisNumber.toString() + nna.substr(4);
				} else {
					nna = nna.substr(0,2) + moisNumber.toString() + nna.substr(4);
				}
			} else {
				// Niss provisoire ? (TER)
				if(moisNumber >= 40 && moisNumber <= 52) {
					moisNumber -= 40;
					if(moisNumber < 10) {
						nna = nna.substr(0,2) + '0' + moisNumber.toString() + nna.substr(4);
					} else {
						nna = nna.substr(0,2) + moisNumber.toString() + nna.substr(4);
					}
				}
			}
			if(fin == (97 - (debut % 97))) {
				dateNaiss = '19' + nna.substring(0, 6);
			} else if (fin == (97 - ((debut + 2000000000) % 97))) {
				dateNaiss = '20' + nna.substring(0, 6);
			} else {
				dateNaiss = null;
			}
			// window.alert("dateNaiss =" + dateNaiss);
			if (dateNaiss != null){
				// var moisNaiss = new Number(dateNaiss.substr(4,2)) % 12;
				return strToDate(dateNaiss.substr(6,2),dateNaiss.substr(4,2),dateNaiss.substr(0,4));
			}
		   }
	} else {
	    dateRetour = null;
	}
	return dateRetour;
}

function onSizeGoto(currentZone, newZone, tailleMax) {
	 if (tailleMax > 0 && currentZone.value.length == tailleMax) {
	   newZone.focus();
	   newZone.select();
	 }

}

// nombre de jour de différence entre 2 dates au format jj/mm/aaaa
function jourDiff(date1, date2){
	var strDate1=(date1==null)?null:(typeof(date1)=='object')?date1.value:date1;
	var strDate2=(date2==null)?null:(typeof(date2)=='object')?date2.value:date2;
	var i1 = -9999999;
	if (strDate1!=null){
		i1 = strToDate(strDate1).getTime();
		i1 = (i1<0)?Math.floor(i1/86400000):Math.ceil(i1/86400000);
	}
	var i2 = 9999999;
	if (strDate2!=null){
		i2 = strToDate(strDate2).getTime();
		i2 = (i2<0)?Math.floor(i2/86400000):Math.ceil(i2/86400000);
	}
	
	// window.alert("il a " + ((strDate1==null && strDate2==null)?0:i2-i1) + " jours de différence");
	return (strDate1==null && strDate2==null)?0:i2-i1
}

function isNumber(sNr)
{
   var format1d = /^\d{1,},\d{1,}$/;
   var format2d = /^\d{1,3}\.\d{3},\d{1,}$/;
   var format3d = /^\d{1,3}\.\d{3}\.\d{3},\d{1,}$/;
   var format4d = /^\d{1,3}\.\d{3}\.\d{3}\.\d{3},\d{1,}$/;
   var format5d = /^\d{1,3}\.\d{3}\.\d{3}\.\d{3}\.\d{3},\d{1,}$/;

   var format1 = /^\d{1,}$/;
   var format2 = /^\d{1,3}\.\d{3}$/;
   var format3 = /^\d{1,3}\.\d{3}\.\d{3}$/;
   var format4 = /^\d{1,3}\.\d{3}\.\d{3}\.\d{3}$/;
   var format5 = /^\d{1,3}\.\d{3}\.\d{3}\.\d{3}\.\d{3}$/;

   return (format1.test (sNr) || format1d.test (sNr)
	|| format2.test (sNr) || format2d.test (sNr)
	|| format3.test (sNr) || format3d.test (sNr)
	|| format4.test (sNr) || format4d.test (sNr)
	|| format5.test (sNr) || format5d.test (sNr));
}

/* verification numéro d'entreprise */
function valideNumEntrepriseOblig(obj)
{
  var test;

  if (arguments.length > 1) { 
     test = valideOblig(obj,arguments[1]);
  } else {
     test = valideOblig(obj);
  }

  if(test) { return valideNumEntreprise(obj); } else return false;
}
function valideNumEntreprise(zone)
/* A utiliser avec onBlur 
   accepte les . dans le numéro d'entreprise */
    {
	var regEx = /^[0-1]\d{9}$/;
	var nume = zone.value.replace(/\./g,"");
	if (nume != ""  && (!regEx.test(nume)||!is97Mod97(nume)))
	{
	  window.alert("Le numéro d'entreprise n'est pas correct !");
	  zone.focus();
	  zone.select();
	  return false;
	} else return true;
    }
    
/* Valide le format du n° d'entreprise */
function valideNumEntrepriseFormat(zone) {
	regExp = /^[0-1]\d{9}$/;
	var nume = zone.replace(/\./g, "");
	if((nume != "") && ((!regExp.test(nume)) || (!is97Mod97(nume)))) {
		return false;
	}
	else {
		return true;
	}
}

/* Valide le format du n° d'établissement */
function valideNumUeFormat(num) {
	regExp = /^[2-8]\d{9}$/;
	if((num != "") && ((!regExp.test(num)) || (!is97Mod97(num)))) {
		return false;
	}
	else {
		return true;
	}
}

/* Valide le format du n° national */
function valideNnaFormat(num) {
	if(num != "") {
		if(isNaN(num) || (num.length < 11)) {
			return false;
		}
		else {
			var base = new Number(num.substring(0, 9));
			var mod = new Number(num.substring(9, 11));
			/*    numero national          ou        numero national bis       */
			if((mod != (97 - (base % 97))) && (mod != (97 - ((base + 2000000000) % 97)))) {
				return false;
			}
			else {
				return true;
			}
		}
	}
	else {
		return true;
	}
}

/* Valide le format du n° de compte */
function valideNumCptFormat(num) {
	if((num != "") && (isNaN(num) || (num.length < 12) || (!isMod97(num)))) {
		return false;
	}
	else {
		return true;
	}
}

/* Valide le n° d'entreprise (3 zones de saisie : 9999.999.999) */
function valideNumEnt3(num1, num2, num3) {
	num = num1.value + "" + num2.value + "" + num3.value;
 	if((num != "") && (num.length < 10)) {
 		num = "0" + num;
	}
	test = valideNumEntrepriseFormat(num);
	if(!test) {
		window.alert("Format du n° d'entreprise incorrect");
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		num1.focus();
		num1.select();
	}
	return test;
}

/* Valide le n° d'UE (4 zones de saisie : 9.999.999.999) */
function valideNumUE4(num1, num2, num3, num4) {
	num = num1.value + "" + num2.value + "" + num3.value + "" + num4.value;
	test = valideNumUeFormat(num);
	if(!test) {
		window.alert("Format du n° d'établissement incorrect");
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		num1.focus();
		num1.select();
	}
	return test;
}

/* Valide le n° national (3 zones de saisie : 999999-999-99) */
function valideNna3(num1, num2, num3) {
	num = num1.value + "" + num2.value + "" + num3.value;
	test = valideNnaFormat(num);
	if(!test) {
		window.alert("Format du n° incorrect");
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		num1.focus();
		num1.select();
	}
	return test;
}

/* Valide le n° national (99999999-999-99) */
function valideNna1(num) {
	num = num.value.substring(2);
	test = valideNnaFormat(num);
	if(!test) {
		window.alert("N° National/NISS incorrect");
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		num.focus();
		num.select();
	}
	return test;
}

/* Valide le n° national (3 zones de saisie : 99999999-999-99) */
function valideNna13(num1, num2, num3) {
	if (num1.value != "" && num1.value.length != 8) return false;

    num = num1.value.substring(2) + "" + num2.value + "" + num3.value;
	
	test = valideNnaFormat(num);
	if(!test) {
		window.alert("N° National/NISS incorrect");
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		num1.focus();
		num1.select();
	}
	return test;
}


/* Valide le n° de compte (3 zones de siasie : 999-9999999-99) */
function valideNumCpt3 (num1, num2, num3) {
	num = num1.value + "" + num2.value + "" + num3.value;
	test = valideNumCptFormat(num);
	if(!test) {
		window.alert("Format du n° de compte incorrect");
		// ces lignes doivent se trouver après l'alert pour ne pas bloquer firefox !
		num1.focus();
		num1.select();
	}
	return test;
}

/* Soumet le formulaire */
function submitForm(act) {
	formulaire = this.document.forms[0];
	formulaire.action = act;
	formulaire.submit();
}

/* 
	Soumet le formulaire en empêchant un resubmit (double validation) 
	Un test est effectué sur la valeur de la variable globale 
	already_submit (0 = pas encore validé, 1 = déjà validé)
	Le cursor est transformé en sablier de manière à ce que le user 
	visualise que son action est bien prise en compte
*/
function submitFormWithWait(act) {
	if (already_submit != 1) {
		already_submit = 1;		
		document.body.className = document.body.className + ' sablier';
		submitForm(act);
	}
}

/** 
	Submit d'une form avec :
		- désactivation des boutons <button>
		- appel de la fonction submitFormWithWait
*/
function submitWaitAndDisable(act) {
	if (already_submit != 1) {
		// recherche du tableau des boutons
		var type_button = document.body.getElementsByTagName("button");

		// recherche des boutons à disabler
		for (var n = 0; n < type_button.length; n++) {
			/**
				FireFox : check for type = "submit"
				IE : 	  check for type = "button"
			*/
			if (type_button[n].type == "submit" || type_button[n].type == "button") {
				type_button[n].disabled = true;
			}
		}
		
		// appel de la fonction submitFormWithWait
		submitFormWithWait(act);
	}
}


/*
 	Test ou met à jour la valeur de la variable globale
	already_submit (0 = pas encore validé, 1 = déjà validé)
*/
function isFormSubmited() {
     if (already_submit > 0){
        return true;
     }

     already_submit++;      
     
     if (this.document.container && this.document.container != null) this.document.container.style.cursor = "wait";
     if (this.document.commands && this.document.commands != null) this.document.commands.style.cursor = "wait";
     
     /*Le disabled des buttons fonctionne mais alors l'action jsf n'est pas invoquée */
//   	 var type_button = document.body.getElementsByTagName("input");
//
//	 // recherche des boutons à disabler
//	 for (var n = 0; n < type_button.length; n++) {
//	    /**
//			FireFox : check for type = "submit"
//	 		IE : 	  check for type = "button"
//		*/
//	    if (type_button[n].type == "submit") {
//		   type_button[n].disabled = true;
//	    }
//	 }          
     
     return false;
}


function waitAndDisable() {
	if (already_submit != 1) {
		// recherche du tableau des boutons
		var type_button = document.body.getElementsByTagName("input");

		// recherche des boutons à disabler
		for (var n = 0; n < type_button.length; n++) {
			/**
				FireFox : check for type = "submit"
				IE : 	  check for type = "button"
			*/
			if (type_button[n].type == "submit" ) {
				type_button[n].disabled = true;
			}
		}

	}
}


/* Annulation = retour à la page d'acceuil, ou, si 2ème paramètre présent, à la page précisée par ce paramètre */
function cancelForm(txt) {
	if(confirm(txt)) {
		var action;
		if(arguments.length > 1) {
			action = arguments[1];
		}
		else {
			action = "/AccesServlet";
		}
		submitForm(action);
	}
}

/* Facilite l'encodage d'une date en insérant les séparateurs "/" automatiquement 
et en enlevant ceux qui seraient mal placés.
A utiliser sur un champ text avec onKeyUp */
function saisieDate(zone) {
  // 2ème param "event" optionnel : permet de tester le backspace
  var event = (arguments.length>1)?arguments[1]:null;
  var keyCode = (event==null)?0:event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
  if (keyCode == 8) return;
  
  dateValue = zone.value;
  var i =0;
  while (i<dateValue.length) {
  	var char = dateValue.charAt(i);
  	if (char == "/" && (i != 2 && i!= 5)) {
  		dateValue = dateValue.substring(0, i) + dateValue.substring(i+1, dateValue.length);
  	}
  	i++;
  }
  if (dateValue.length >= 3 && dateValue.charAt(2) != '/') {
  	dateValue = dateValue.substring(0, 2) + "/" + dateValue.substring(2, dateValue.length);
  }
  if(dateValue.length >=6 && dateValue.charAt(5) != '/') {
    dateValue = dateValue.substring(0, 5) + "/" + dateValue.substring(5, dateValue.length);
  }
  
  zone.value = dateValue;
}

/* Facilite l'encodage d'une période en insérant les séparateurs "/" automatiquement 
et en enlevant ceux qui seraient mal placés.
A utiliser sur un champ text avec onKeyUp */
function saisiePeriode(zone) {
  // 2ème param "event" optionnel : permet de tester le backspace
  var event = (arguments.length>1)?arguments[1]:null;
  var keyCode = (event==null)?0:event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
  if (keyCode == 8) return;
  
  periodeValue = zone.value;
  var i =0;
  while (i<periodeValue.length) {
  	var char = periodeValue.charAt(i);
  	if (char == "/" && i != 2) {
  		periodeValue = periodeValue.substring(0, i) + periodeValue.substring(i+1, periodeValue.length);
  	}
  	i++;
  }
  
  if (periodeValue.length >= 3 && periodeValue.charAt(2) != '/') {
	periodeValue = periodeValue.substring(0, 2) + "/" + periodeValue.substring(2, periodeValue.length);
  }
  
  
  zone.value = periodeValue;
}
function saisieFacture(zone) {
  // 2ème param "event" optionnel : permet de tester le backspace
  var event = (arguments.length>1)?arguments[1]:null;
  var keyCode = (event==null)?0:event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
  if (keyCode == 8) return;
  
  
  periodeValue = zone.value;
  periodeLength = zone.value.length;
  
  if (periodeLength == 4) {
	periodeValue += "/";
  }
  if (periodeLength >= 5 && periodeValue.charAt(4) != "/") {
	periodeValue = periodeValue.substr(0,4) + "/" + periodeValue.substr(4,periodeLength);
  }
  if (periodeLength == 7) {
	periodeValue += "/";
  }
  if (periodeLength >= 8 && periodeValue.charAt(7) != "/") {
	periodeValue = periodeValue.substr(0,7) + "/" + periodeValue.substr(7,periodeLength);
  }
  
  zone.value = periodeValue;
}

/* Facilite l'encodage d'une heure en insérant le "h" automatiquement 
et en enlevant ceux qui seraient mal placés.
A utiliser sur un champ text avec onKeyUp */
function saisieHeure(zone) {
  // 2ème param "event" optionnel : permet de tester le backspace
  var event = (arguments.length>1)?arguments[1]:null;
  var keyCode = (event==null)?0:event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;

  var heureValue = zone.value;
  var heureLength = zone.value.length;
  if(heureLength != 3 && heureValue.charAt(heureLength - 1) == 'h') {
    heureValue = heureValue.substring(0, heureLength - 1);
    zone.value = heureValue;
  }
  else {
    if(keyCode!=8 && (heureLength == 2)) {
      heureValue += "h";
      zone.value = heureValue;
    }
  }
}

function saisieCptBanque(zone) {
  // 2ème param "event" optionnel : permet de tester le backspace
  var event = (arguments.length>1)?arguments[1]:null;
  var keyCode = (event==null)?0:event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;

  dateValue = zone.value;
  dateLength = zone.value.length;
  if(dateLength != 4 && dateLength != 12 && dateValue.charAt(dateLength - 1) == '-') {
    dateValue = dateValue.substring(0, dateLength - 1);
    zone.value = dateValue;
  }
  else {
    if(keyCode!=8 && (dateLength == 3 || dateLength == 11)) {
      dateValue += "-";
      zone.value = dateValue;
    }
  }
}

/* Lorsqu'une zone (1er paramètre) est remplie avec le bon nombre de caractères (2ème paramètre),
passe à la zone suivante (3ème paramètre).
A utiliser sur un champ texte avec onKeyUp (pour n° entreprise, date, n° national,... avec zones séparées) */
function nextZone(zone, taille, zoneSuivante) {
  if(zone.value.length == taille) {
    zoneSuivante.focus();
    zoneSuivante.select();
  }
}

/* Permet notament dans une TextArea d'empécher de taper + de 'size' caractère 
   ( appeller sur le onkeypress )
   nb: - sous windows un saut de ligne = 2 caractère (LF + CR) 
       - si la zone est remplie par un copier/coller elle risque malgrès 
         tout de contenir trop de caractères */
function limitText(obj, size){
	var result = (obj.value.length < size);
	if (window.event)
		window.event.returnValue = result;
	return result;
}

/* Fonction de "trim"...identique à celle définie en Java*/
function trim(str){
   return str.replace(/^\s*|\s*$/g,"");
}

/**
 * Opens a new popup window.
 * The new window is always scrollable and resizable. 
 * 
 * @param url URL of the page to load as document
 * @param name window name. A new window with that name is created unless one already exists; 
 *	  in which case, the existing window is reused and focused.
 *    ATTENTION: IE doesn't allow popup windows with names containing 
 * 	  the character '-'. 
 * @param attributes window attributes: "all", "none" or javascript window.open() properties
 * @param width window width in pixels, must be smaller than the screen width
 * @param height window height in pixels, must be smaller than the screen height
 * @param [centerOnScreen] (optional) center window on the usable portion of the screen
 *	  rather than the parent window
 * @return the new open window
 */
function openWindow(url, name, attributes, width, height, centerOnScreen) {
    var parentWidth;
    var parentHeight;
    
    if (centerOnScreen) {
        // screen.availHeight takes into account the task bar.
        parentWidth = screen.availWidth;
        parentHeight = screen.availHeight;
    } else {
        // Get parent window dimensions.
        if (document.all) { // IE only.
            parentWidth = document.body.clientWidth;
            parentHeight = document.body.clientHeight;
        } else { // NS only.
            parentWidth = window.outerWidth;
            parentHeight = window.outerHeight;
        }
    }
    
    var x = (parentWidth - width) / 2;
    var y = (parentHeight - height) / 2;

    var properties;

    if (attributes == "all") {
        properties = "menubar=yes,toolbar=yes,location=yes,directories=yes,status=yes";
    } else if (attributes == "none") {
        properties = "menubar=no,toolbar=no,location=no,directories=no,status=no";
    } else {
        properties = attributes;
    }
    properties = "width=" + width + ",height=" + height + ",top=" + y + ",left=" + x + ",scrollbars=yes,resizable=yes," + properties;
    
    var popupWindow = window.open(url, name, properties);
    
    // Make sure the window has the focus if it was already open!
    popupWindow.focus();
    
    return popupWindow;
}

/**
 * Opens the default help window, with a menu and status bar only.
 * 
 * @param url URL of the help page to load in the new window
 * @param [width] optional window width, defaults to 760
 * @param [height] optional window height, defaults to 540
 * @return the new open window named "helpWindow"
 * @see openWindow()
 */
function openHelpWindow(url, width, height) {
    if (width == null) {
        width = 760;
    }
    if (height == null) {
        height = 540;
    }
    return openWindow(url, "helpWindow", "menubar=yes,status=yes", width, height, true);
}

/**
 * Opens the default info popup window, with a menu and status bar only.
 * 
 * @param url URL of the help page to load in the new window
 * @param [width] optional window width, defaults to 580
 * @param [height] optional window height, defaults to 400
 * @return the new open window named "infoWindow"
 * @see openWindow()
 */
function openInfoWindow(url, width, height) {
    if (width == null) {
        width = 580;
    }
    if (height == null) {
        height = 400;
    }
    return openWindow(url, "infoWindow", "menubar=yes,status=yes", width, height, true);
}

/**
 * Opens the default print window, with a menu and status bar only.
 *
 * @param url URL of the printer-friendly page to load in the new window
 * @param [width] optional window width, defaults to 760
 * @param [height] optional window height, defaults to 540
 * @return the new open window named "printWindow"
 * @see openWindow()
 */
function openPrintWindow(url, width, height) {
    if (width == null) {
        width = 760;
    }
    if (height == null) {
        height = 540;
    }
    return openWindow(url, "printWindow", "menubar=yes,status=yes", width, height, true);
}

/**
 * NumberFormat object constructor. 
 * Formats the given number in the fr_BE locale.
 * 
 * @param [fractionDigits] number of decimal digits, defaults to 2
 */
function NumberFormat(fractionDigits) {
    
    this.fractionDigits = fractionDigits ? fractionDigits : 2;
    this.decimalSeparator = ',';
    // this.groupingSeparator = '';

    /**
     * Formats the given number. 
     *
     * @param number to format
     * @param [fractionDigits] overrides the fractionDigits property
     * @return formatted string
     */
    this.format = function(number, fractionDigits) {
	if (isNaN(number)) {
	    return "NaN";
	}
	
	if (!fractionDigits) {
	    fractionDigits = this.fractionDigits;
	}
	
	var sign = (number < 0) ? -1 : 1;

	// Round to the specified number of digits.
	number *= Math.pow(10, fractionDigits);
	number = Math.round(Math.abs(number));
	number /= Math.pow(10, fractionDigits);
	number *= sign;

	// Create a string object to do our formatting on
	var str = new String(number);

	return str.replace(/\./, this.decimalSeparator);
    };
    
}

/* Convertit un nombre en string avec le nombre de décimales voulu */
function numberToStr(nbr, fractionDigits) {
	var nbFormat = new NumberFormat(fractionDigits);
	var nbrStr = nbFormat.format(nbr);
	if(fractionDigits != 0) { // Complète la partie décimale si nécessaire
		var posDecimal = nbrStr.search(/,/);
		var nbrDecimal;
		if(posDecimal != -1) { // Nombre décimal (virgule déjà présente)
			nbrDecimal = nbrStr.length - 1 - posDecimal;
		}
		else { // Nombre entier, ajout de la virgule
			nbrStr += ",";
			nbrDecimal = 0;
		}
		while(nbrDecimal < fractionDigits) {
			nbrStr += "0";
			nbrDecimal++;
		}
	}
	return nbrStr;
}

/* Convertit la valeur de la zone passée en 1er paramètre en un nombre avec le nombre de décimales
passé en 2ème paramètre.
A utiliser sur un champ text avec onBlur */
function saisieNombre(zone, fractionDigits) {
//	var nbr = strToNumber(zone.value); // Hélas pas utilisable car . supprimés
	var nbrStr = zone.value.replace(/,/g,".");
	if (!isNaN(nbrStr)){
	    nbr = new Number(nbrStr);
	} else {
	    nbr = 0;
	}
	zone.value = numberToStr(nbr, fractionDigits);
}

// Méthode qui permet d'arrondir un nombre avec le nombre de décimal précisé
// L'arrondi se fait sans l'affichage des zéro non significatif
// La valeur renvoyée est un nombre
// ex : round (8.1234,2) 	--> 8.12
// ex : round (8.9876,3) 	--> 8.988
// ex : round (8,2) 		--> 8
function round (nombre, nbChiffres) {
	return parseFloat((""+nombre.toFixed(nbChiffres)).replace(/0+$/g,''));
}	 

// Méthode qui permet d'arrondir un nombre avec le nombre de décimal précisé
// L'arrondi se fait sans l'affichage des zéro non significatif à l'exception de la première décimale
// La valeur renvoyée est un string dont la marque décimale est la virgule
// ex : round (8.1234,2) 	--> 8,12
// ex : round (8.9876,3) 	--> 8,988
// ex : round (8,2) 		--> 8,0
function roundMinOneDec (nombre, nbChiffres) {
	var nbr = parseFloat((""+nombre.toFixed(nbChiffres)).replace(/0+$/g,''));
	var totSt = nbr.toString();
	totSt = totSt.replace(",","");
	if(totSt.lastIndexOf(".") == -1){
		totSt = totSt + ",0";
	}else{
		totSt = totSt.replace(".",",");
	}
	return totSt;
}	 

function afficheCache(nObjet) {
 if(document.getElementById) { // mozilla, ie5 ...
	 var element = document.getElementById(nObjet);
	 if (element != null) {
		 element.style.visibility =
			 (element.style.visibility == 'visible' ? 'hidden' : 'visible');
	 }
 } else if(document.all) { // Internet explorer
   eval(nObjet).style.visibility =
    (eval(nObjet).style.visibility=='visible'?'hidden':'visible');
 } else if(document.layers) { // Netscape 4.x
   document.eval(nObjet).visibility =
    (document.eval(nObjet).visibility=='show'?'hidden':'show');
 }
}

function affiche(nObjet) {
 if(document.getElementById) { // mozilla, ie5 ...
	 var element = document.getElementById(nObjet);
	 if (element != null) {
		 element.style.visibility = 'visible';
	 }
 } else if(document.all) { // Internet explorer
   eval(nObjet).style.visibility = 'visible';
 } else if(document.layers) { // Netscape 4.x
   document.eval(nObjet).visibility = 'show';
 }
}

function cache(nObjet) {
 if(document.getElementById) { // mozilla, ie5 ...
	 var element = document.getElementById(nObjet);
	 if (element != null) {
		 element.style.visibility = 'hidden';
	 }
 } else if(document.all) { // Internet explorer
   eval(nObjet).style.visibility = 'hidden';
 } else if(document.layers) { // Netscape 4.x
   document.eval(nObjet).visibility = 'hidden';
 }
}

/**
 * Sets the focus on an element with the given ID and selects its contents
 * if it is a text input or textarea.
 * Returns silently if the element can't be found.
 * @param elementId 
 */
function focusById(elementId) {
    var element = document.getElementById(elementId);

    if (element != null) {
	element.focus();

        if (element.select) {
            element.select();
        }
    }
}

/**
 * Ajoute un ou plusieurs objet Calendar correspondant aux calendriers "cliquable"
 * 
 * L'id du bouton correspondant doit être : dateFieldId + "Button". 
 * 
 * @param dateFieldId (vararg) Id de la/des zone(s) date
 */
function setupCalendar(dateFieldId) {
  for (var c=0; c < arguments.length; c++) {
	Calendar.setup({
		inputField     :    arguments[c],     		// id of the input field
		ifFormat       :    "%d/%m/%Y",      		// format of the input field
		button         :    arguments[c]+"Button",  // trigger for the calendar (button ID)
		singleClick    :    true
	});
  }
}

/**
 * Toggles the display style on or off. 
 * 
 * @param toggleImage IMG element used as toggle switch
 * @param elementId id of the element to display or not
 * @param [displayStyle] optional display style (defaults to "")
 */
function toggleDisplayStyle(toggleImage, elementId, displayStyle) {
    var element = document.getElementById(elementId);

    if (element.style.display == "none") {
        if (displayStyle == null) {
            alert 
            displayStyle = "";
        }
        element.style.display = displayStyle;
        toggleImage.src = "/images/toggle_minus.gif";
        toggleImage.title = "Masquer le détail";
    } else {
        element.style.display = "none";
        toggleImage.src = "/images/toggle_plus.gif";
        toggleImage.title = "Afficher le détail";
    }
}

function onChangeQSecurite(champReponseId) {
	var champReponse = document.getElementById(champReponseId);
	if(champReponse != null && champReponse != undefined) {
		champReponse.value = "";
	}
}
