// *** COMMON CROSS-BROWSER COMPATIBILITY CODE ***

var isDOM=document.getElementById?1:0;
var isIE=document.all?1:0;
var isNS4=navigator.appName=='Netscape'&&!isDOM?1:0;
var isIE4=isIE&&!isDOM?1:0;
var isOp=window.opera?1:0;
var isDyn=isDOM||isIE||isNS4;


// convert all characters to lowercase to simplify testing
var agt=navigator.userAgent.toLowerCase();

// *** BROWSER VERSION ***
// Note: On IE5, these return 4, so use is_ie5up to detect IE5.
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);

var is_ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie3    = (is_ie && (is_major < 4));
var is_ie4    = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
var is_ie4up  = (is_ie && (is_major >= 4));
var is_ie5    = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
var is_ie5_5  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
var is_ie5up  = (is_ie && !is_ie3 && !is_ie4);
var is_ie5_5up =(is_ie && !is_ie3 && !is_ie4 && !is_ie5);


/* --------------------------------------------------
	Recherche un objet DHTML d'ID donné et le renvoit (ou null si inexistant)
*/
function getObj(id) {
	if (isDOM && document.getElementById(id)!=null) {
		return document.getElementById(id);
	}
	
	// on cherche dans document.layers (Netscape)
	if (document.layers && eval("document."+id)!=null) {
		return eval("document."+id);
	}
	
	// on cherche dans document.all
	if (isIE && eval("typeof(document.all[id])")!="undefined") {
		return document.all[id];
	}

	
	// sinon on cherche dans les formulaires
	for(var i=0; i<document.forms.length; i++) {
		if (eval("typeof(document.forms[i]."+id+")")!="undefined")
			return eval("document.forms[i]."+id);
	}

	// sinon on cherche dans les frames
	if (typeof(document.frames)!="undefined") {
		for(var i=0; i<document.frames.length; i++) {
			if (eval("typeof(document.frames[i]."+id+")")!="undefined")
				return eval("document.frames[i]."+id);
		}
	}

	// sinon on cherche dans les images
	for(var i=0; i<document.images.length; i++) {
		if (eval("typeof(document.images[i]."+id+")")!="undefined")
			return eval("document.images[i]."+id);
	}

	// pas trouvé !!
	return null;
}


/* --------------------------------------------------
	Gestion des actions sur le onload du document
*/
var onLoadActions = new Array();

function addOnLoadAction(action)
{
	if (action!=null && action!="")
		onLoadActions[onLoadActions.length] = action;
}

function executeOnLoadActions()
{
	var i;
	for(i=0; i<onLoadActions.length; i++)
		eval(onLoadActions[i]);
}



/* --------------------------------------------------
	Simule un clic sur un lien
*/
function goToURL(u, targetName)
{
	if (typeof(u)=="undefined" || u==null || u=="")
		return true;

	if (u.indexOf("javascript:")==0)
	{
		var jscode = u.substring(11);
		if (eval(jscode))
			return true;
		else
			return false;
	}

	if (typeof(targetName)!="undefined" && targetName!=null){
		var w = window.open(u, targetName);
		w.focus();
  } else {
  	if (is_ie5up) {
		eval("try { window.location.href=u; } catch(e) {}");
	}
	else
		window.location.href=u;
   }
}


/* --------------------------------------------------
	Soumission d'un formulaire en javascript
	(avec appel du callback onsubmit)
*/
function submitForm(f) {
	var result = true;

	if (typeof(f.onsubmit)!="undefined" && f.onsubmit!=null)
		result = f.onsubmit();

	if (result) {
		if (is_ie5up) {
			// pour éviter les bug du unbeforeonload annulé
			eval("try { f.submit(); } catch(e) {}");
		}
		else
			f.submit();
	}

	return result;
}



/* --------------------------------------------------
	Callback appelé sur onKeyPressed pour exécuter une action JSsi ENTER est tapé
*/
function executeOnEnter(action) {
	var key = event.keyCode;

	if (key == 13) {
		eval(action);
		return false;
	}

	return true;
}
/* --------------------------------------------------
	Callback appelé sur onKeyPressed pour soumettre le formulaire si ENTER est tapé
*/
function submitOwnerFormOnEnter(obj, evt) {
	var keyCode = document.layers ? evt.which : document.all ? evt.keyCode : evt.keyCode;

	if (keyCode == 13) {
		submitForm(obj.form);
		return false;
	}

	return true;
}

/* --------------------------------------------------
	Va au champ du formulaire suivant (simule TAB) sur un appui sur ENTER
*/
function tabOnEnter (field, evt) {
	var keyCode = document.layers ? evt.which : document.all ? evt.keyCode : evt.keyCode;
	if (keyCode != 13)
		return true;
	else {
		var nextField = getNextElement(field);
		if (typeof(nextField.focus)!="undefined")
			nextField.focus();

		if (typeof(nextField.select)!="undefined")
			nextField.select();

		return false;
	}
}


function getNextElement(field) {
	var fieldFound = false;
	var form = field.form;

	for (var e = 0; e < form.elements.length; e++) {
		if (fieldFound && form.elements[e].type != 'hidden')
			break;
		if (field == form.elements[e])
			fieldFound = true;
	}

	return form.elements[e % form.elements.length];
}




/* --------------------------------------------------
	Ouvre une fenêtre de taille donnée, centrée sur l'écran
*/
function openCenteredWindow(name, url, w, h, notResizable)
{
	var features = ",directories=no,location=no,status=no,toolbar=no,scrollbars=yes";
	if (notResizable)
		features += ",resizable=no";
	else
		features += ",resizable=yes";
	var w = window.open(url, name, getCenteringWinPos(w,h)+features, true);
	w.focus();
	return w;
}

function getCenteringWinPos(w,h){
    var sW = parseInt(screen.availWidth, 10);
    var sH = parseInt(screen.availHeight, 10);
    if (sW / sH > 2)    // si double ecran
        sW = Math.round(sW/2);

    var x = Math.round((sW - w)/2);
    var y = Math.round((sH - h)/2);

    return "width="+w+",height="+h+",top="+y+",left="+x;
}

function zoomPhoto(url) {
	openCenteredWindow("zoomPhoto", url, 660, 520, false);
}

function forceDisplayOnTopFrame() {
	if (window.top != self) {
		var url = location.href;
		top.location.href = url;
	}
}


/* ----------------------------- */
function submitWithLink(f, lnk) {
	f.action = lnk.href;
	submitForm(f);
	return false;
}

/* ----------------------------- */
function hideDiv(obj) {
	obj.style.display = "none";
}

function showDiv(obj) {
	obj.style.display = "block";
}

function showSelectedDiv(divName, divNames, hiddenField) {
	for(var p in divNames) {
		if (divNames[p]==divName)
			continue;
		hideDiv(getObj(divNames[p]));
	}
	showDiv(getObj(divName));
	
	if (typeof(hiddenField)!="undefined" && hiddenField!=null)
		hiddenField.value = divName;
}


/* ----------------------------- */
function getRadioValue(radioButtonOrGroup) {
  var value = null;
  if (radioButtonOrGroup.length) { // group 
    for (var b = 0; b < radioButtonOrGroup.length; b++)
      if (radioButtonOrGroup[b].checked)
        value = radioButtonOrGroup[b].value;
  }
  else if (radioButtonOrGroup.checked)
    value = radioButtonOrGroup.value;
  return value;
}

function getSelectedValue(field) {
	return field.options[field.selectedIndex].value;
}

function getSelectedLabel(field) {
	return field.options[field.selectedIndex].text;
}



function getNbSelectedValues(select) {
	var nb=0;
/*	if (typeof(select.options)=="undefined")
		return 0;*/

	for (var i = 0; i < select.options.length; i++)
		if ((select.options[i].selected) && (select.options[i].value!="NOTHING_SELECTED"))
			nb++;
	return nb;
}

function isValueSelected(select, svalue) {
	for (var i = 0; i < select.options.length; i++)
		if ((select.options[i].selected) &&	(select.options[i].value==svalue))
			return true;
	return false;
}




function selectOptionByValue(field, value) {
	for(var i=0; i<field.options.length; i++) {
		if (field.options[i].value==value) {
			field.selectedIndex = i;
			break;
		}
	}
}

function selectMultipleOptionsByValue(field, values, addToCurrentSelection) {
	if (typeof(addToCurrentSelection)=="undefined" || !addToCurrentSelection) {
		// on remet à zéro la sélection
		for(var i=0; i<field.options.length; i++)
			field.options[i].selected = false;
	}

	var vals = values.split(",");
	
	// on sélectionne les valeurs souhaitées
	for(var i=0; i<vals.length; i++) {
		for(var j=0; j<field.options.length; j++) {
			if (field.options[j].value == vals[i])
				field.options[j].selected = true;				
		}
	}
}

function getMultipleSelectedValues(field) {
	var values = "";
	for(var i=0; i<field.options.length; i++) {
		var opt = field.options[i];
		if (opt.selected) {
			if (values.length>0)
				values+=",";
			values+=opt.value;
		}
	}
	return values;
}

function getCheckedValues(f, fieldName) {
	var values = new Array();
	for (var i=0; i<f.elements.length; i++) {
		var field = f.elements[i];
		if (field.name==fieldName &  field.type=="checkbox" && field.checked)
			values[values.length] = field.value;
	}
	
	return values;
}

/* ----------------------------- */
var ONEDAY = 1000*60*60*24;

function showCalendar(field, anchorname, startDate, endDate, format) {
	var calendar = new CalendarPopup();
	calendar.setMonthNames('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');
	calendar.setDayHeaders('D','L','M','M','J','V','S');
	calendar.setWeekStartDay(1);
	calendar.setTodayText("Aujourd'hui");
	calendar.showYearNavigation();

	if (typeof(anchorname)=="undefined")
		anchorname=null;

	if (typeof(startDate)!="undefined" && startDate!=null && startDate!="") {
		var dayBefore = addDaysToDate(startDate, -1);
		calendar.addDisabledDates(null, dayBefore);
	}

	if (typeof(endDate)!="undefined" && endDate!=null && endDate!="") {
		var dayAfter = addDaysToDate(endDate, 1);
		calendar.addDisabledDates(dayAfter, null);
	}		
		
	if (typeof(format)=="undefined" || format==null || format=="")
		format="dd/MM/yyyy";

	calendar.select(field, anchorname, format);
}


function addDaysToDate(strDate, nbDays) {
	var d = parseDate(strDate);
	if (d==null)
		return null;
		
	return formatDate(new Date(d.getTime() + ONEDAY*nbDays), "dd/MM/yyyy");
}


/* --------------------------------------------------
	Simule le comportement d'une fenêtre modale à partir d'une fenêtre
	"fille".
	
	childWindow : objet fenêtre fille
	onCloseExpression : expression javascript facultative à évaluer lorsque la fenêtre pseudo-modale sera fermée.
*/
var forceFocusWindow = null;
var simulateModalOnCloseExpression = null;

function simulateModalBehavior(childWindow, onCloseExpression) {
	try {
		forceFocusWindow = childWindow;
		simulateModalOnCloseExpression = onCloseExpression;
		
		window.onfocus=focusChildModal;
		forceFocusUntilClosed();	
	}
	catch(e)  {
	}
}

function forceFocusUntilClosed() {
	try {
		if (typeof(forceFocusWindow)=="undefined" || forceFocusWindow==null)
			return;
			
		if (forceFocusWindow.closed) {
			forceFocusWindow=null;
			window.onfocus=null;
			window.focus();
			
			// éxécution du callback éventuel sur fermeture
			if (typeof(simulateModalOnCloseExpression)!="undefined" && simulateModalOnCloseExpression!=null && simulateModalOnCloseExpression!="") {
				eval(simulateModalOnCloseExpression);
				simulateModalOnCloseExpression = null;
			}
			return;
		}
		
		setTimeout("forceFocusUntilClosed();", 300);
	}
	catch(e) {
		forceFocusWindow=null;
	}
}

function focusChildModal() {
	try {
		if (typeof(forceFocusWindow)=="undefined" || forceFocusWindow==null || forceFocusWindow.closed)
			return;

		forceFocusWindow.focus();
		setTimeout("forceFocusWindow.focus();",50);
	}
	catch(e) {}
	
	return false;
}


function stretchBigImage(imgName, maxW, maxH) {
	var img = document.images[imgName];

	if (typeof(img)=="undefined")
		return;

	if (typeof(img.width==null)=="undefined" || img.width<1) {
		setTimeout("stretchBigImage('"+imgName+"', "+maxW+", "+maxH+");", 100);
		return;
	}
	
	var w = img.width;
	var h = img.height;
	
	if (w<=maxW && h<=maxH)
		return;
		
	// on essaie de fixer la largeur
	var w2 = maxW;
	var h2 = Math.round(h*(maxW/w));
	
	if (h2>maxH) {
		h2 = maxH;
		w2 = Math.round(w*(maxH/h));
	}

	img.width = w2;
	img.height = h2;	
}

// ------------------------------------------------


function ValidCreditCard(CreditCard){
// Valid Input Syntax:
// Type1: **************** (16 columns)
// Type2: **** **** **** **** (19)
// Type3: ****-****-****-**** (19)
// Input is a credit card number in the form of a string.
// Validates numbers which use a "double-add-double MOD 10"
// check digit Output is False if not valid, True if valid.
var Validity = false;       // Assume invalid card
var LN = CreditCard.length;	 // Get input value length

  if ((16 <= LN) && (LN <= 19)){
    LN --;
    CheckSum = 0;	// start with 0 checksum
    Dbl = false;	// Start with a non-doubling

    //------------------------------------------------------------
    //	Beginning backward loop through string
    //-------------------------------------------------------------

    for (Idx = LN; Idx >= 0; Idx --){
	Digit = CreditCard.substr(Idx, 1);	  // Isolate character
	if (("0" <= Digit && Digit <= "9")
             || Digit == " " || Digit == "-"){
	    if (Digit != " " && Digit != "-"){ // Skip connector
		Digit -= "0";	  // Remove ASCII bias
		if (Dbl){		  // If in the "double-add" phase
		    Digit += Digit; // Then double first
		    if (Digit > 9){ // Cast nines
			Digit -= 9;
		    }
		}
		Dbl = !Dbl; // Flip doubling flag
		CheckSum += Digit;  // Add to running sum
		if (CheckSum > 9){  // Cast tens
		    CheckSum -= 10; // Same as MOD 10, but faster
		}
	    }
	} else {
	    return(Validity);	// Invalid
	}
    }
    Validity = (CheckSum == 0) ? true : false; // Must sum to 0
  }
  return(Validity);
}


function bientotDispo() {
	alert("Cette fonctionnalité sera très bientôt disponible !");
}

//////////////////////////////////////////////////////////////////////////////////////

//------------------------------------------------------------------
// fonction trim() - Ote les blancs en debut et en fin d'une chaine
//------------------------------------------------------------------
String.prototype.trim = function(){
    return this.replace(/(^\s*)|(\s*$)/g, "");
}
////////////////////// @deprecated //////////////////////////////////////////
function trimString(str) {
  return str.trim();
}


// Generic Form Validation
// Jacob Hage (jacob@hage.dk)
var checkObjects	= new Array();
var errors		= "";
var formValReturnVal = true;
var language		= new Array();


// Reset des tests
function resetChecks() {
	checkObjects = new Array();
	errors = "";
	formValReturnVal = true;
}


function initLanguage(lang)
{
	if (lang=="en")
	{
		language["header"]	= "The following error(s) occured :"
		language["start"]	= "-";
		language["field"]	= " Field ";
		language["require"]	= " is required";
		language["min"]		= " and must consist of at least ";
		language["max"]		= " and must not contain more than ";
		language["minmax"]	= " and no more than ";
		language["chars"]	= " characters";
		language["num"]		= " and must contain a number";
		language["email"]	= " must contain a valid e-mail address";
		language["selmin"]		= " and must consist of at least ";
		language["selexact"]	= " and must consist of exactly ";
		language["selmax"]		= " and must not contain more than ";
		language["selminmax"]	= " and no more than ";
		language["selects"]	= " selected values";
		language["samevalueas"]	= " must have the same value as the field ";
		language["date"]	= "\" must be a date that fits the pattern dd/mm/yyyy.";
	}
	else
	{
		language["header"]	= "L'erreur suivante est survenue :\n"
		language["start"]	= "-";
		language["field"]	= " Le champ \"";
		language["require"]	= "\" est requis";
		language["min"]		= " et doit contenir au moins ";
		language["max"]		= " et ne dois pas contenir plus de ";
		language["minmax"]	= " et pas plus de ";
		language["chars"]	= " caractere(s)";
		language["num"]		= " et doit etre un nombre";
		language["email"]	= "\" doit etre une adresse email valide";
		language["selmin"]		= " et doit contenir au moins ";
		language["selexact"]	= " et doit contenir exactement ";
		language["selmax"]		= " et ne dois pas contenir plus de ";
		language["selminmax"]	= " et pas plus de ";
		language["selects"]	= " selection(s)";
		language["samevalueas"]	= "\" doit avoir la meme valeur que le champ \"";
		language["date"]	= "\" doit etre une date au format jj/mm/aaaa.";
	}
}

// -----------------------------------------------------------------------------
// defineChecks - Call this function in the beginning of the page. I.e. onLoad.
// n = name of the input field (Required)
// type= string, num, date, email, select, radio (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional document reference)
// -----------------------------------------------------------------------------
function defineChecks(n, type, HTMLname, min, max, isRequired, sameAs, d) {
	var p;
	var i;
	var x;
	if (!d) d = document;

	if (typeof(sameAs)=="undefined")
		sameAs = null;

	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 = defineChecks(n, type, HTMLname, min, max, d.layers[i].document);
		return x;
	}

	if (typeof(x)=="undefined" || x==null)
		alert("ERREUR : le champ '"+HTMLname+"' ("+n+") n'existe pas ou pose probleme !");

	eval("V_"+n+" = new formResult(x, type, HTMLname, min, max, isRequired, sameAs);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);

	return null;
}


function formResult(form, type, HTMLname, min, max, isRequired, sameAs) {
	this.form = form;
	this.type = type;
	this.HTMLname = HTMLname;
	this.min  = min;
	this.max  = max;
	this.isRequired = isRequired;
	this.sameAs = sameAs;
	
	// si pas de min mais requis, min=1
	if (!min && isRequired)
		this.min = 1;
}


function forceValidForm() {
    formValReturnVal=true;
}

function validateForm() {
	formValReturnVal=true;


	if (checkObjects.length > 0)
	{
		if (typeof(language["header"])=="undefined")
			initLanguage("fr");

		errorObject = "";

		for (i = 0; i < checkObjects.length; i++) {
			validateObject = new Object();
			validateObject.original = checkObjects[i].form;
			validateObject.form = checkObjects[i].form;
			validateObject.HTMLname = checkObjects[i].HTMLname;
			validateObject.val = checkObjects[i].form.value;
			validateObject.len = validateObject.val!=null?validateObject.val.length:0;
			//validateObject.len = checkObjects[i].form.value.length;
			validateObject.min = checkObjects[i].min;
			validateObject.max = checkObjects[i].max;
			validateObject.isRequired = checkObjects[i].isRequired;
			validateObject.type = checkObjects[i].type;

			// verification d'identite a un autre champ
			validateObject.sameAs = checkObjects[i].sameAs;
			
			if (validateObject.sameAs!=null)
			{
				var asObject = null;
				for (j = 0; !asObject && (j<checkObjects.length); j++)
				{
					if (checkObjects[j].form.name == validateObject.sameAs)
						asObject = checkObjects[j];
				}
				if ((asObject != null) && (validateObject.val!=asObject.form.value))
				{
					errors += language['start'] + language['field'] + validateObject.HTMLname + language['samevalueas'] + asObject.HTMLname + "\"\n";
				}
			}

			if (validateObject.type == "num" || validateObject.type == "string") {
				var trimedValue = trimString(validateObject.val);
				if ((validateObject.isRequired) || (trimedValue != ""))
				{
					if ((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n";
					} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
					} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
					} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
					} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
				}
			    }
			}
			else if (validateObject.type == "date") {				
				var trimedValue = trimString(validateObject.val);
				if ((validateObject.isRequired) || (trimedValue != ""))
				{
					var decomp = validateObject.val.split("/");
					for(j=0; j<decomp.length; j++)
						decomp[j] = trimString(decomp[j]);

					if (decomp.length == 2)
					{
						var d = new Date();
						decomp[2] = d.getYear();
					}
					
					if (	(decomp.length != 3)
						||	(isNaN(decomp[0]))
						||	(decomp[0]<1)
						||	(decomp[0]>31)
						||	(isNaN(decomp[1]))
						||	(decomp[1]<1)
						||	(decomp[1]>12)
						||	(isNaN(decomp[2])) )
					{
							errors += language['start'] + language['field'] + validateObject.HTMLname + language['date'] + "\n";
					}
					else
					{	
						decomp[0] *= 1;
						decomp[1] *= 1;
						decomp[2] *= 1;
						
						if (decomp[0]<10)
							decomp[0] = "0" + decomp[0];
						if (decomp[1]<10)
							decomp[1] = "0" + decomp[1];						
						if (decomp[2]<60)
							decomp[2] = 2000 + decomp[2];
						else if ((decomp[2]>=60) && (decomp[2]<100))
							decomp[2] = 1900 + decomp[2];

						validateObject.form.value = ""+decomp[0]+"/"+decomp[1]+"/"+decomp[2];
					}
				}
			}
			else if (validateObject.type == "email") {
				var trimedValue = trimString(validateObject.val);
				if ((validateObject.isRequired) || (trimedValue != ""))
				{
					// Checking existense of "@" and ".".
					// Length of must >= 5 and the "." must
					// not directly precede or follow the "@"
					var emailPat=/^([^@]+)@([^@]+)$/
					if (!emailPat.test(validateObject.val)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['email'] + "\n";
					}
				}
			}
			else if ((validateObject.type == "select") && (validateObject.isRequired || getNbSelectedValues(validateObject.original)>0 )) {
				var nbSel = getNbSelectedValues(validateObject.original);

				if (nbSel==1 && (!validateObject.min || (validateObject.min==1 && (!validateObject.max || validateObject.max==1)))) {
					var selValue = getSelectedValue(validateObject.original);
					if (selValue=="-1" || selValue=="")						
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
				}
				else if (nbSel==0 && (!validateObject.min || (validateObject.min==1 && (!validateObject.max || validateObject.max==1))))
					errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
				else if (validateObject.min && validateObject.max && (nbSel < validateObject.min || nbSel > validateObject.max)) {
					if (validateObject.min == validateObject.max)
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['selexact'] + validateObject.min + language['selects'] + "\n";
					else
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['selmin'] + validateObject.min + language['selminmax'] + validateObject.max+language['selects'] + "\n";
				} else if (validateObject.min && !validateObject.max && (nbSel < validateObject.min)) {
					errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['selmin'] + validateObject.min + language['selects'] + "\n";
				} else if (validateObject.max && !validateObject.min &&(nbSel > validateObject.max)) {
					errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['selmax'] + validateObject.max + language['selects'] + "\n";
				}
			}
			else if ((validateObject.type == "radio") && (validateObject.isRequired)
				 	&& getRadioValue(validateObject.original)==null) {
				errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
			}
		}
	}

	if (errors) {
		alert(language["header"].concat("\n" + errors));
		errors = "";
		formValReturnVal = false;
	}
	else {
		formValReturnVal = true;
	}
	
	return formValReturnVal;
}


// ------------------------------------------
function arrondiDecimales(val, nb) {
	var v = val*1;
	if (isNaN(v))
		v = 0;
	var k = Math.pow(10, nb);	
		
	v = Math.round(v*k)/k;
	v = v+"";
	
	var p = v.indexOf(".");
	var delta = nb - (v.length - p) + 1;
	if (p<0) {
		v+=".";
		delta = nb;
	}

	for(i=0; i<delta; i++)
		v += "0";

	return v;
}




/* --------------------------------------------------
	Ajoute une URL à la liste des favoris (IE seulement)
*/
function addToFavorites(url, title) {
	if (typeof(window.external)!="undefined" && typeof(window.external.addFavorite)!="undefined") {
		// Favori IE
		window.external.addFavorite(url, title);
	}
	else if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function")) {
		// Sidebar Mozilla
		window.sidebar.addPanel (title, url, "");
	}
	else {	  
		alert("Votre navigateur ne permet pas d'ajouter automatiquement cette page à vos favoris. Désolé !");
	}	
}
