/*
 * Librairie de fonctions génériques pour le traitement de formulaires
 */

/*
 * 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
) {
	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 parcequ'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;
		}
		//alert( "submit !!!");
		form_elt.submit();
	}
	else {
		alert( error_msg);
	}
}

function trim( str ){
//			 ----
	return str.replace( /^\s+|\s+$/g, '') ;
}
/*
 * 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 == "");
}

/*
 * Vérifie le format de la date 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 {
		switch (date_format) {
			case 'JJ/MM/AA' :
			case 'DD/MM/YY':
			case 'JJMMAA' :
			case 'DDMMYY':
				if (aa.length != 2) {
					err_msg = "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) {
					err_msg = "L'année doit être sur quatre chiffres.";
				}
			break;
		}
	}
	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.
 */
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 court";
	}
	else
		if (point_pos == -1) {
			err_msg = "Pas de point";
		}
	else
		if (arobase_pos == -1) {
			err_msg = "Pas de '@'";
		}
	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 '@' 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 '@' et le dernier point";
	}
	return err_msg;
}

/*
 * 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, "");
	}
}

/*
 * 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.";

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;
	if( trim( text_field.value) == "") return;
	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;
	if (text_field_1.value == text_field_2.value) {
		result = "ok";
	}
	else {
		result = "alert";
	}
	
	if (
		trim( text_field_2.value) == ""
		||
		trim( 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 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 displayMessageInDIV(
//			 -------------------
	div_result,
	msg_text,
	msg_type
){
	var 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;
}


