/*
 * Librairie de fonctions génériques pour le traitement de formulaires
 * 28-oct.-10, ECZ, Contrôle de validité du mois et de l'année (< 2038)
 * 17-nov.-10, ECZ, Auto-correction de la partie 'année' des dates.
 * 18-nov.-10, ECZ, Vérification du domaine des adresses e-mail
 * 01-dec.-10, ECZ, Comparaison de dates.
 * 01-dec.-10, ECZ, "caractère '@'" dans contrôle du format des adresses e-mail.
 * 19-juil.-11, ECZ, onChangeCheckMailFormat() <- champ texte et plus valeur.
 * 28-sept.-11, ECZ, (onChange) checkTimestampFormat()  : 'date + heure'
 */

	/*
	 * ATTENTION : reporter ces valeurs dans 'plugins/utils/utils.BasePlugin.php'
	 */
	var DATE_EX_VALUE		= "JJ/MM/AAAA";
	var TIME_EX_VALUE		= "hh:mm";
	var TIMESTAMP_EX_VALUE		= "JJ/MM/AAAA hh:mm";
	var EMAIL_EX_VALUE	= "contact@eskis.fr";
	var LIST_EX_VALUE		= "A renseigner";
	var URL_EX_VALUE		= "http://adresse.du.site/page";

/*
 * Envoi d'un formulaire.
 * - ATTENTION : Appelle automatiquement la fonction checkFormFields() en lui
 * passant en paramètre l'ID du formulaire. CETTE FONCTION DOIT DONC EXISTER !!
 * - 'action_name' est optionnel. Il permet de spécifier une valeur pour le
 * champ caché 'action' (ajouté si besoin), qui sera interprété par le script
 * défini dans l'attribut 'action' du tag 'form'.
 */
function formSubmit(
//			 ----------
	form_id,
	action_name,
	goto_url
) {
	var form_elt = document.getElementById( form_id);
	//alert( "'"+form_id+"' - '"+action_name+"' Submit !")
	var error_msg = "";
	try {
		error_msg = checkFormFields( form_id);
	}
	catch (e) {
		// Juste pour évite de tout faire planter parce qu'on à rien à vérifier...
	}
	//error_msg = "";
	if (error_msg.length == 0) {
		if (action_name) {
			/*
			 * Si besoin, ajout d'un 'input' caché nommé "action"
			 */
			if (! form_elt.action.value) {
				//alert( "Ajout du champ 'action'");
				var action_input = document.createElement( 'input');
				action_input.name = 'action';
				action_input.id = 'input_action';
				action_input.type = 'hidden';
				form_elt.appendChild( action_input);
			}
			// L'action spécifiée...
			form_elt.action.value = action_name;
		}
		if (goto_url) {
			/*
			 * Si besoin, ajout d'un 'input' caché nommé "goto_url"
			 */
			if (! form_elt.goto_url.value) {
				//alert( "Ajout du champ 'goto_url'");
				var goto_url_input = document.createElement( 'input');
				goto_url_input.name = 'gotoURL';
				goto_url_input.id = 'goto_url';
				goto_url_input.type = 'hidden';
				form_elt.appendChild( goto_url_input);
			}
			// L'URL vers laquelle rediriger ensuite
			form_elt.gotoURL.value = goto_url;
		}
		//alert( "submit !!!");
		form_elt.submit();
	}
	else {
		alert( error_msg);
	}
	/*
	 * 30-août-11, ECZ, return 'false' pour ne pas prendre en compte href="#"
	 * (qui est d'ailleurs interprété d'après le 'base href' = "$VPSERVER" et
	 * renvoie donc vers la page d'accueil)
	 */
	return false;
}

function trim( str ){
//			 ----
	return str.replace( /^\s+|\s+$/g, '') ;
}

/*
 * Construit les paramètres à spécifier dans une URL pour passer tous les
 * champs d'un formulaire.
 * - Optionnellement, on peut spécifier un tableau de nom de champ à ignorer.
 * Ex: form2URLOpts( 'item_edit', ['action', 'gotoURL'])
 */
function form2URLOpts(
//
	form_id,
	exclude_list
) {
	if (isset("tinyMCE")) {
		tinyMCE.triggerSave();
	}
	
	form_elt = document.getElementById( form_id);
	
	var ret_val = "";
	var name_array;
	var i_max = form_elt.elements.length;
	var skip_this = false;
	for (var i=0; i<i_max; i++){
		var tag = form_elt.elements[i];
		//alert( "'"+tag.name+"', type = '"+tag.type+"', multiple = "+(tag.multiple ? "OUI" : "NON"));
		// we keep only the usable form tags
		if (
			tag.tagName != undefined
			&&
			(
			tag.tagName == "INPUT" ||
			tag.tagName == "TEXTAREA" ||
			tag.tagName == "SELECT"
			) 
			&& 
			tag.type.toUpperCase() != "BUTTON"
		){
			/*
			 * On ignore les éléments spécifiés
			 */
			skip_this = false;
			if (exclude_list.length) {
				for (var excl_nn in exclude_list) {
					if (tag.name == exclude_list[excl_nn]) {
						skip_this = true;
					}
				}
			}
			if (skip_this) {
				//console.log( "'"+tag.name+"' ignoré parcequ'exclu...");
				continue;
			}
			// exception for checkboxes : if checked => value = 1, else value = 0
			var tag_type_upper = tag.type.toUpperCase();
			switch (tag_type_upper) {
				case "CHECKBOX" :
					// Checkbox à nom de la forme 'champ[]'
					if (tag.name.substring( tag.name.length-2,tag.name.length) == "[]"){
						//alert( "****'"+tag.name+"' - '"+tag.value+"' checked = "+(tag.checked ? "OUI": "NON")+"****");
						if (tag.checked) {
							name_array = tag.name.substring(0,tag.name.length-2);
							ret_val += name_array+"[]="+tag.value+"&";
						}
					}
					else {
						ret_val += tag.name+"="+(tag.checked ? "1" : "0")+"&";
					}
				break;
				case "RADIO" :
					if (tag.checked) {
						ret_val += tag.name+"="+escape( tag.value)+"&";
					}
				break;
				case "SELECT" :
					if (tag.multiple) {
						var tag_name_tmp;
						if (tag.name.substring(tag.name.length-2,tag.name.length) == "[]"){
							// security : to avoid a conflict with already formated select name
							tag_name_tmp = tag.name.substring(0,tag.name.length-2);
						}else{
							tag_name_tmp = tag.name;
						}
						var ls = tag.childNodes;
						for (n=0; n<ls.length; n++) {
							if (ls[n].selected){
								ret_val += tag_name_tmp+"[]="+ls[n].value+"&";
							}
						}
					}
				break;
				default :
					ret_val += tag.name+"="+escape( tag.value)+"&";
				break
			}
		}
	}

	return ret_val;
}

/*
 * Au moins 6 caractères
 * Au moins 1 majuscule
 * Au moins 1 minuscule
 * Au moins 1 chiffre
 */
function checkPasswordStrength( pass_word_arg ) {
//			 ---------------------
	var ret_val = true;
	var pass_word = new String( pass_word_arg);
	if (pass_word.length < 6) {
		ret_val = false
	}
	if (ret_val) {
		var pass_word_low = pass_word.toLowerCase();
		if (pass_word_low == pass_word) {
			ret_val = false;
		}
	}
	if (ret_val) {
		var pass_word_upper = pass_word.toUpperCase();
		if (pass_word_upper == pass_word) {
			ret_val = false;
		}
	}
	if (ret_val) {
		var number_ok = false;
		for ( var nn = 0 ; nn < pass_word.length ; nn++ ) {
			if (! isNaN( pass_word.substring( nn, nn + 1))) {
				number_ok = true;
				break;
			}
		}
		ret_val = number_ok;
	}
	return ret_val;
}

function checkMailAddress( email_addr ){
//			 ----------------
	var err_msg = checkMailFormat( email_addr);
	return (err_msg == "");
}

/*
 * 18-nov.-10, ECZ, vérifie que l'adresse e-mail spécifiée n'est pas dans
 * les domaines 'hotmail', 'gmail', 'yahoo', ou ceux spécifiés.
 * @return une chaîne vide, ou le domaine déconseillé
 */
function checkMailDomain(
//			 ---------------
	email_addr,
	dom_list		// liste optionnelle de domaines (séparateur = espace)
){
	var err_msg = "";
	var list_of_domains;
	if (dom_list && dom_list.length != 0) {
		list_of_domains = dom_list.split( " ");
	}
	else {
		list_of_domains = new Array( "hotmail", "gmail", "yahoo");
	}
	var reg_exp;
	for (var ii = 0 ; ii < list_of_domains.length ; ii ++) {
		dom_name = list_of_domains[ii];
//alert( "["+ii+"] : '"+dom_name+"' / '"+email_addr+"'");
		reg_exp = new RegExp( "@"+dom_name);
		if (email_addr.match( reg_exp)) {
			err_msg = dom_name;
			break;
		}
	}
	return err_msg;
}

/*
 * Vérifie le format de l'heure spécifiée pra rapport au modèle
 */
function checkTimeFormat(
//			---------------
	time_str,
	time_format
) {
	var err_msg = "";
	var time_str_split;
	var hh, mm, ss;
	switch (time_format) {
		case 'hh:mm:ss' :
		case 'HH:MM:SS' :
			time_str_split = time_str.split(":");
			hh = time_str_split[0];
			mm = time_str_split[1];
			ss = time_str_split[2];
			// Trois nombres...
			if (
				(hh == "") ||
				(mm == "") ||
				(ss == "") ||
				isNaN( hh) ||
				isNaN( mm) ||
				isNaN( ss)
			) {
				err_msg = "format invalide. '"+time_format+"' attendu.";
			}
		break;
		case 'hh:mm' :
		case 'HH:MM' :
			time_str_split = time_str.split(":");
			hh = time_str_split[0];
			mm = time_str_split[1];
			// Deux nombres...
			if (
				(hh == "") ||
				(mm == "") ||
				isNaN( hh) ||
				isNaN( mm)
			) {
				err_msg = "format invalide. '"+time_format+"' attendu.";
			}
		break;
		default :
			err_msg = "format non géré : '"+time_format+"'";
		break;
	}
	return err_msg;
}

/*
 * Comparaison de deux dates
 * - O : Les dates sont identiques
 * - +1 : date_a postérieure à date_b
 * - -1 : date_a antérieure à date_b
 */
function dateCompare(
//			 -----------
	date_a,
	date_b,
	date_format
)
{
	var java_date_a = javaDate( date_a, date_format);
	var java_date_b = javaDate( date_b, date_format);
	var utc_date_a = java_date_a.getTime();
	var utc_date_b = java_date_b.getTime();
	/*
	alert(
		"'"+date_a+"' -> '"+java_date_a+"' -> "+utc_date_a
		+", '"+date_b+"' -> '"+java_date_b+"' -> "+utc_date_b
	);
	*/
	if (utc_date_a == utc_date_b) {
		ret_val = 0
	}
	else {
		ret_val = (
			(utc_date_a < utc_date_b)
			? -1
			: 1
		);
	}
	return ret_val;
}

/*
 * Conversion d'une chaîne en objet Date
 */
function javaDate(
//			 --------
	date_str,
	date_format
) {
	var date_str_split = splitDate( date_str, date_format);
	// L'année doit être sur 4 digit
	if (date_str_split[2].length == 2) {
		date_str_split[2] = "20"+date_str_split[2];
	}
	/*
	alert(
		"'"+date_str+"' - jour: '"+date_str_split[0]
		+"', mois: '"+date_str_split[1]
		+"', année: '"+date_str_split[2]+"'"
	);
	*/
	return new Date(
		parseInt( date_str_split[2]),
		parseInt( date_str_split[1]) - 1,
		parseInt( date_str_split[0])
	);
}

/*
 * Découpage d'une date exprimée sous forme de chaîne de caractère
 */
function splitDate(
//			 ---------
	date_str,
	date_format
) {
	var date_str_split;
	var jj, mm, aa;
	if (! date_format) {
		date_format = 'JJ/MM/AA';
	}
	switch (date_format) {
		case 'JJ/MM/AA' :
		case 'DD/MM/YY' :
		case 'JJ/MM/AAAA' :
		case 'DD/MM/YYYY' :
			date_str_split = date_str.split("/");
		break;
		case 'JJ-MM-AA' :
		case 'DD-MM-YY' :
		case 'JJ-MM-AAAA' :
		case 'DD-MM-YYYY' :
			date_str_split = date_str.split("-");
		break;
		/*
		case 'JJMMAA' :
		case 'DDMMYY' :
		case 'JJMMAAAA' :
		case 'DDMMYYYY' :
		*/
		default :
			date_str_split[0] = date_str.slice( 0,2);
			date_str_split[1] = date_str.slice( 2,4);
			date_str_split[2] = date_str.slice( 4);
		break;
	}
	return date_str_split;
}

/*
 * Vérifie le format 'date + heure' spécifiée.
 * - Renvoie le message d'erreur correspondant ou vide si OK.
 */
function checkTimestampFormat(
//			 --------------------
	timestamp_str,
	timestamp_format
) {
	/*
	 * Découpage en deux partie de la saisie et du modèle
	 * '28/09/2011 18:10' => '28/09/2011' et  '18:10'
	 * 'JJ/MM/AAAA hh:mm' => 'JJ/MM/AAAA' et  'hh:mm'
	 */
	date_time_str = timestamp_str.split( " ");
	date_time_format = timestamp_format.split( " ");
	
	/*
	 * Vérification des deux éléments...
	 */
	var date_err_msg = checkDateFormat( date_time_str[0], date_time_format[0]);
	var time_err_msg = "";
	if (date_time_str[1]) {
		time_err_msg = checkTimeFormat( date_time_str[1], date_time_format[1]);
	}
	var err_msg = date_err_msg;
	if (time_err_msg.length != 0) {
		err_msg += (
			(err_msg.length != 0)
			?", "
			: ""
		) + time_err_msg;
	}
	return err_msg;
}

/*
 * Vérifie le format de la time spécifiée.
 * - Renvoie le message d'erreur correspondant ou vide si OK.
 */
function checkDateFormat(
//			 ---------------
	date_str,
	date_format
) {
	/*
	 * JJ/MM/AA ou JJ/MM/AAAA
	 */
	var err_msg = "";
	var date_str_split;
	var jj, mm, aa;
	switch (date_format) {
		case 'JJ/MM/AA' :
		case 'DD/MM/YY' :
		case 'JJ/MM/AAAA' :
		case 'DD/MM/YYYY' :
			date_str_split = date_str.split("/");
			jj = date_str_split[0];
			mm = date_str_split[1];
			aa = date_str_split[2];
		break;
		case 'JJMMAA' :
		case 'DDMMYY' :
		case 'JJMMAAAA' :
		case 'DDMMYYYY' :
			jj = date_str.slice( 0,2);
			mm = date_str.slice( 2,4);
			aa = date_str.slice( 4);
		break;
	}
	//alert( "'"+date_str+"' : '"+jj+"' '"+mm+"' '"+aa+"'");
	
	// Trois nombres...
	if (
		(jj == "") ||
		(mm == "") ||
		(aa == "") ||
		isNaN( jj) ||
		isNaN( mm) ||
		isNaN( aa)
	) {
		err_msg = "format invalide. '"+date_format+"' attendu.";
	}
	else {
		// Le mois doit être entre 1 et 12
		if ((mm == 0) || (mm > 12)) {
			err_msg = "Le numéro du mois doit être compris en 01 et 12.";
		}
		switch (date_format) {
			case 'JJ/MM/AA' :
			case 'DD/MM/YY':
			case 'JJMMAA' :
			case 'DDMMYY':
				if (aa.length != 2) {
					/*
					 * 17-nov.-10, ECZ, Si l'année est tout de même sur 4 chiffres, on
					 * enlève 2000
					 */
					if (aa.length == 4) {
						aa -= 2000;
					}
					else {
						err_msg += (err_msg.length ? "\n" : "")
						+"L'année doit être sur deux chiffres.";
					}
				}
			break;
			case 'JJ/MM/AAAA' :
			case 'DD/MM/YYYY':
			case 'JJMMAAAA' :
			case 'DDMMYYYY':
			default :
				if (aa.length != 4) {
					/*
					 * 17-nov.-10, ECZ, On complète avec '20' si l'année est tout de même
					 * sur 2 chiffres
					 */
					if (aa.length == 2) {
						aa += 2000;
					}
					else {
						err_msg += (err_msg.length ? "\n" : "")
						+"L'année doit être sur quatre chiffres.";
					}
				}
			break;
		}
		// Dû à des limitations du PHP, l'année ne peut excéder 2037
		if (
			(
				(aa.length == 2)
				&&
				(aa > 37)
			)
			||
			(
				(aa.length == 4)
				&&
				(aa > 2037)
			)
		) {
			err_msg += (err_msg.length ? "\n" : "")
			+"L'année ne peut excéder 2037.";
		}
	}
	return err_msg;
}

function checkURLNotEmpty(
//			 ---------------
	url_str
){
	var ret_val = (
		(url_str.length != 0)
		&&
		(url_str != "http://adresse.du.site/page")
	);
	/*
	alert(
		"checkURLNotEmpty( "+url_str+") : "
		+(ret_val ? "TRUE" : "FALSE")
	);
	*/
	return ret_val;
}

function checkURLFormat(
//			 --------------
	url_str
){
	var err_msg = "";
	if (url_str.length > 0) {
		var reg_exp = new RegExp( "^(http|ftp)://");
		if (! url_str.match( reg_exp)) {
			err_msg = "Une URL doit commencer par 'http://' ou 'ftp://'";
		}
	}
	/*
	alert(
		"checkURLFormat( "+url_str+") : "
		+((err_msg.length != 0) ? "KO!!" : "OK")
	);
	*/
	return err_msg;
}

/*
 * Vérification du format d'une adresse e-mail
 * - Au minimum, on a 'a@b.cc' = 6 caractères
 * - Un, et un seul, '@'
 * - Au moins un caractère avant le '@'
 * - Deux caractères aux moins après le dernier point
 * - Au moins un caractère entre le '@' et le dernier point.
 * 
 * 01-dec.-10, ECZ, "caractère '@'"
 */
function checkMailFormat(
//			 ---------------
	email_str
){
	var err_msg = "";
	var arobase_pos = email_str.indexOf( "@");
	var point_pos = email_str.lastIndexOf( ".");
	var point_virgule_pos = email_str.indexOf( ";");
	var espace_pos = email_str.indexOf( " ");
	if (email_str.length < 6) {
		err_msg = "Trop courte";
	}
	else
		if (point_pos == -1) {
			err_msg = "Pas de point";
		}
	else
		if (arobase_pos == -1) {
			err_msg = "Il manque le caractère '@'";
		}
	else
		if (point_virgule_pos != -1) {
			err_msg = "Point-virgules interdits";
		}
	else
		if (espace_pos != -1) {
			err_msg = "Espaces interdits";
		}
	else
	if (email_str.split( '@').length > 2) {
		err_msg = "Un seul caractère '@' autorisé";
	}
	else
	if (arobase_pos < 2) {
		err_msg = "Au moins un caractère avant le '@'";
	}
	else
	if ((point_pos + 2) > email_str.length) {
		err_msg = "Deux caractères aux moins après le dernier point";
	}
	else
	if (point_pos < (arobase_pos + 2)) {
		err_msg = "Au moins un caractère entre le caractère '@' et le dernier point";
	}
	return err_msg;
}

function forceTel(
//		 --------
	field_obj
){
	if (field_obj) {
		var reg_exp = new RegExp( "[^0-9. ]", "g")
		field_obj.value = field_obj.value.replace( reg_exp, "");
	}
}

/*
 * Filtre sur les caractères : chiffres et point seulement (pas virgule !)
 * - les autres caractères sont supprimés.
 * (à appeller sur 'onKeyUp' en passant 'this' en paramètre)
 */
function forceDec(
//		 --------
	field_obj
){
	if (field_obj) {
		var reg_exp = new RegExp( "[^0-9.]", "g")
		field_obj.value = field_obj.value.replace( reg_exp, "");
	}
}

/*
 * Filtre sur les caractères : chiffres seulement
 * - les autres caractères sont supprimés.
* (à appeller sur 'onKeyUp' en passant 'this' en paramètre)
 */
function forceInt(
//		 --------
	field_obj
){
	if (field_obj) {
		var reg_exp = new RegExp( "[^0-9]", "g")
		field_obj.value = field_obj.value.replace( reg_exp, "");
	}
}

/*
 * Filtre sur les caractères spéciaux.
 * (à appeller sur 'onKeyUp' en passant 'this' en paramètre)
 */
function noSpecials(
//		 ---------
	field_obj
){
	if (field_obj) {
		var reg_exp = new RegExp( "[\ \t\,\;\:\.\/\(\)\[\\]\{\}\|\\\\&~'\"=%]", "g");
		field_obj.value = field_obj.value.replace( reg_exp, "");
	}
}

/*
 * Filtre sur les caractères spéciaux et/ou accentué.
 * (à appeller sur 'onKeyUp' en passant 'this' en paramètre)
 */
function noSpecialsNoAccents(
//		 -------------------
	field_obj
){
	if (field_obj) {
		var reg_exp = new RegExp(
			"[\ \t\,\;\:\.\/\(\)\[\\]\{\}\|\\\\&~'\"=%àâäéêëèîïôöûüùç]",
			"g"
		);
		field_obj.value = field_obj.value.replace( reg_exp, "");
	}
}


/*
 * Affichage/Masquage des caractères des mots de passes saisis
 * - Bascule le type des deux champs de saisie de mots de passe
 * ('password' et 'passconfirm') de 'password' à 'texte'
 */
function showPasswords(
//			 -------------
	form_id
) {
	var form_elmt = document.getElementById( form_id);
	/*
	alert(
		form_elmt.pass_en_clair.checked
		+"\n"
		+form_elmt.password.type
	);
	*/
	var pass_str = form_elmt.password.value;
	var passconfirm_str = form_elmt.passconfirm.value;
	if (form_elmt.pass_en_clair.checked) {
		document.getElementById( 'div_for_password').innerHTML =
			'<input'
			+'	class="txtfield"'
			+'	type="text"'
			+'	name="password"'
			+'	size="20"'
			+'	maxlength="12"'
			+'	onFocus="displayPasswordFormattingRules( \'pass_result\');"'
			+'	onKeyUp="onChangeCheckPassword( \''+form_id+'\');"'
			+'	value="'+pass_str
			+'" />';
		document.getElementById( 'div_for_passconfirm').innerHTML =
			'<input'
			+'	class="txtfield"'
			+'	type="text"'
			+'	name="passconfirm"'
			+'	size="20"'
			+'	maxlength="12"'
			+'	onKeyUp="onChangeCheckPasswordconfirm( \''+form_id+'\');"'
			+'	value="'+passconfirm_str
			+'" />';
	}
	else {
		document.getElementById( 'div_for_password').innerHTML =
			'<input'
			+'	class="txtfield"'
			+'	type="password"'
			+'	name="password"'
			+'	size="20"'
			+'	maxlength="12"'
			+'	onFocus="displayPasswordFormattingRules( \'pass_result\');"'
			+'	onKeyUp="onChangeCheckPassword( \''+form_id+'\');"'
			+'	value="'+pass_str
			+'" />';
		document.getElementById( 'div_for_passconfirm').innerHTML =
			'<input'
			+'	class="txtfield"'
			+'	type="password"'
			+'	name="passconfirm"'
			+'	size="20"'
			+'	maxlength="12"'
			+'	onKeyUp="onChangeCheckPasswordconfirm( \''+form_id+'\');"'
			+'	value="'+passconfirm_str
			+'" />';
	}
}
/*
 * Globals...
 */
var Pass_Rules = "Le mot de passe doit avoir entre 6 et 12 caractères";
Pass_Rules += "\net comporter au moins une majuscule, une minuscule,";
Pass_Rules += "\net un chiffre.";
Pass_Rules += "\nLes caractères accentués et les caractères de ponctuation";
Pass_Rules += " sont interdits.";

function displayPasswordFormattingRules(
//			 ------------------------------
	div_id
){
	var div_result = document.getElementById( div_id);
	displayMessageInDIV( div_result, Pass_Rules, 'norm'); 
}

function onChangeCheckPassword(
//			 ---------------------
	form_id
){
	// The pass has been modified : (used for MOD process
	_PASS_CHANGED = true;
	var result;
	var text_field = document.getElementById( form_id).password;
	text_field.value = trim( text_field.value)
	if( text_field.value.length == 0) return;
	var reg_exp = new RegExp( "[^0-9,A-z]", "g")
	text_field.value = text_field.value.replace( reg_exp, "");
	var div_result = document.getElementById( 'pass_result');
	if (checkPasswordStrength( text_field.value)) {
		okTextField( text_field); 
		displayMessageInDIV( div_result, "Mot de passe valide", 'good');
		document.getElementById( form_id).passconfirm.disabled=false;
	}
	else { 
		alertTextFieldIsEmpty( text_field);
		displayMessageInDIV( div_result, Pass_Rules, 'alert');
		document.getElementById( form_id).passconfirm.disabled=true;
	}
	// if we change the pass, the passconfirm has to be reset
	var tf_passconfirm = document.getElementById( form_id).passconfirm;
	tf_passconfirm.value = "";
	alertTextFieldIsEmpty( tf_passconfirm);
}

function onChangeCheckPasswordconfirm(
//			 ----------------------------
	form_id
) {
	var result;
	var text_field_1 = document.getElementById( form_id).password;
	var text_field_2 = document.getElementById( form_id).passconfirm;
	text_field_1.value = trim( text_field_1.value)
	text_field_2.value = trim( text_field_2.value)
	var reg_exp = new RegExp( "[^0-9,A-z]", "g")
	text_field_1.value = text_field_1.value.replace( reg_exp, "");
	text_field_2.value = text_field_2.value.replace( reg_exp, "");
	if (text_field_1.value == text_field_2.value) {
		result = "ok";
	}
	else {
		result = "alert";
	}
	
	if (
		text_field_1.value.length < 6
	) return;
	var div_result = document.getElementById( 'passconfirm_result');
	var msg_ok = "";
	var msg_nook = "Le mot de passe et sa confirmation ne sont pas identiques.";
	
	if (result == 'alert'){ 
		alertTextFieldIsEmpty(text_field_2);
		displayMessageInDIV(div_result, msg_nook,'alert'); 
	}else{ 
		okTextField(text_field_2);
		displayMessageInDIV(div_result, msg_ok, 'good'); 
	};
}

function onChangeCheckTextFieldNotEmpty(
//			 ------------------------------
	text_field
){
	var result;
	if ( trim( text_field.value) == "") var result = 'alert';
	if (result == 'alert'){ 
		alertTextFieldIsEmpty( text_field);
	}else{ 
		okTextField( text_field); 
	}
}

function onChangeCheckURLFormat(
//	 -----------------------
	text_field
) {
	var error_msg;
	var url_str = text_field.value;
	var div_result = document.getElementById( text_field.name+'_result');
	if ((error_msg = checkURLFormat( url_str)) != "") {
		alertTextFieldIsEmpty( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, error_msg, 'alert');
		}
	}
	else {
		okTextField( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, "Format d'URL valide.", 'good');
		}
	}
}

function onChangeCheckTimeFormat(
//			 -----------------------
	text_field,
	time_format
	) {
	var error_msg;
	var time_str = text_field.value;
	var div_result = document.getElementById( text_field.name+'_result');
	if ((error_msg = checkTimeFormat( time_str, time_format)) != "") {
		alertTextFieldIsEmpty( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, error_msg, 'alert');
		}
	}
	else {
		okTextField( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, "Format d'heure valide.", 'good');
		}
	}
}

function onChangeCheckTimestampFormat(
//			 ----------------------------
	text_field,
	timestamp_format
) {
	var error_msg;
	var timestamp_str = text_field.value;
	var div_result = document.getElementById( text_field.name+'_result');
	if ((error_msg = checkTimestampFormat( timestamp_str, timestamp_format)) != "") {
		/*
		alert(
			"Format invalide : "+error_msg
		);
		*/
		alertTextFieldIsEmpty( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, error_msg, 'alert');
		}
	}
	else {
		okTextField( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, "Format de date+heure valide.", 'good');
		}
	}
}

function onChangeCheckDateFormat(
//			 -----------------------
	text_field,
	date_format
) {
	var error_msg;
	var date_str = text_field.value;
	var div_result = document.getElementById( text_field.name+'_result');
	if ((error_msg = checkDateFormat( date_str, date_format)) != "") {
		/*
		alert(
			"Format invalide : "+error_msg
		);
		*/
		alertTextFieldIsEmpty( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, error_msg, 'alert');
		}
	}
	else {
		okTextField( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, "Format de date valide.", 'good');
		}
	}
}

function onChangeCheckMailFormat(
//			 -----------------------
	text_field
) {
	var error_msg;
	var email_str = text_field.value;
	var div_result = document.getElementById( text_field.name+'_result');
	if ((error_msg = checkMailFormat( email_str)) != "") {
		alertTextFieldIsEmpty( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, error_msg, 'alert');
		}
	}
	else {
		okTextField( text_field);
		if (div_result) {
			displayMessageInDIV( div_result, "Format d'adresse e-mail valide.", 'good');
		}
	}
}

function onChangeCheckMailFormat_OBSOLETE(
//			 -----------------------
	mail_str
) {
	var error_msg;
	if ((error_msg = checkMailFormat( mail_str)) != "") {
		alert(
			"Format invalide : "+error_msg+" (aa@bb.cc)"
		);
	}
}


function alertTextFieldIsEmpty(text_field){
	text_field.style.borderColor = "#990000";
	text_field.style.background = "#ffCCCC";
	text_field.style.color = "#990000";
}
function okTextField(text_field){
	text_field.style.borderColor = "#009900";
	text_field.style.background = "#CCFFCC";
	text_field.style.color = "#009900";
}
function neutralTextField(text_field){
	text_field.style.borderColor = "";
	text_field.style.background = "";
	text_field.style.color = "";
}

function displayMessageInDIV(
//			 -------------------
	div_result,
	msg_text,
	msg_type
){
	var result;
	if (div_result) {
		div_result.innerHTML = msg_text;
		var col;
		if (msg_type == "alert") {
			col = "#993333";
		}
		else if (msg_type == "good"){
			col = "#aaa";
		}
		div_result.style.color = col;
		div_result.style.display = "block";
	}
}

/*
 * Utilitaire pour faire des appels AJAX
 */
function getXhr() {
	var xhr;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest(); 
	}
	else if (window.ActiveXObject) { 
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
		} catch (e) {
			xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
		}
	}
	else { 
		alert (
			"Votre navigateur ne supporte pas les objets XMLHTTPRequest,\n\n"
			+"Veuillez le mettre à jour."
		); 
		xhr = false; 
	}
	return xhr;
}

/*
 * Assigne le contenu d'un DIV
 */
function setDIVContent(
//			 -------------
	div_id,
	div_content
) {
	var div_obj = document.getElementById( div_id);
	if (div_obj) {
		div_obj.innerHTML = div_content;
	}
}

/*
 * Insère un contenu généré pas un script PHP dans un DIV
 * - Appelle le script spécifié pour obtenir le contenu à insérer.
 * - Insère le dit contenu ans le DIV dont l'ID est spécifié.
 */
function insertDIVContent(
//			 ----------------
	div_id,
	php_script,		// URL
	etc_args			// paramètres de l'URL
) {
	/*
	alert(
		"insertDIVContent(). div: "+div_id
		+", goto_url: "+php_script
		+", args: "+etc_args
	);
	*/
	
	var xhr = getXhr();
	if (xhr) {
		// Requête au PHP
		xhr.open( "POST", php_script,true); 
		xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xhr.send( etc_args); 
		// Callback sur changement d'état...
		xhr.onreadystatechange = function() {
			if (xhr.readyState == 4) {
				// OK. Réponse reçue.
				if (xhr.status == 200) {
					setDIVContent(
						div_id,
						xhr.responseText
					);
				}
				else {
					alert(
						"insertDIVContent() FAILED. Erreur : "+xhr.statusText
						+"\n- div: "+div_id
						+", action: "+php_script
						+", args: "+etc_args
						+"\nErreur : "+xhr.statusText
					);
				}
			}
		}
	}
	else {
		alert(
			"insertDIVContent() FAILED ! Appels AJAX pas supporté."
			+"\n- div: "+div_id
			+", action: "+php_script
			+", args: "+etc_args
		);
	}
}

/*
 * Sélection l'option du bouton-radio dont la valeur est indiquée
 */
function setRadioButtonState(
//			 -------------------
	radio_button_obj,
	selected_value
) {
	if (radio_button_obj) {
		var radio_length = radio_button_obj.length;
		if (radio_length == undefined) {
			radio_button_obj.checked = (
				radio_button_obj.value == selected_value.toString()
			);
		}
		else {
			for(var ii = 0; ii < radio_length; ii++) {
				radio_button_obj[ii].checked = (
					radio_button_obj[ii].value == selected_value.toString()
				);
			}
		}
	}
	else {
		alert( "setRadioButtonState() : '"+radio_button_id+"' introuvable !");
	}
}


