// fm_scripts.js
// fonctions de validation des fomulaires form_maker
// (c) Alphmaosa 2007 - Erwan Guehenneux
// charset : UTF-8

// v3.7 add
if (changeclass == null || changeclass == undefined) var changeclass = false;


var form_name = "myform";
window['onunload'] = function(){ try{document.forms[form_name].elements['fm_submit_button'].disabled=false;} catch(e){}};

// fonction qui desactive les chexbox si le nombre max de cases cochées est atteint
function block_checkbox(checkboxes_name, number_max)
	{
	if (!number_max) number_max = 1;
	
	cases = document.forms[form_name].elements[checkboxes_name];
	
	something_checked = 0;
	for (i=cases.length; i--;)
		if (cases[i].checked == true) something_checked++;
	
	if (something_checked >= number_max)
		{for (i=cases.length; i--;) if(!cases[i].checked) cases[i].disabled = true;}
	else 	for (i=cases.length; i--;) cases[i].disabled = false;
	}


// -----------------------------------------------------------
// écrit un cookie
function write_cookie(nom, valeur)
	{
	var argv=write_cookie.arguments;
	var argc=write_cookie.arguments.length;
	var expires=(argc > 2) ? argv[2] : null;
	var path=(argc > 3) ? argv[3] : null;
	var domain=(argc > 4) ? argv[4] : null;
	var secure=(argc > 5) ? argv[5] : false;
	document.cookie=nom+"="+escape(valeur)+
	((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
	((path==null) ? "" : ("; path="+path))+
	((domain==null) ? "" : ("; domain="+domain))+
	((secure==true) ? "; secure" : "");
	}

// récupère la valeur d'un cookie
function getCookieVal(offset)
	{
	var endstr=document.cookie.indexOf (";", offset);
	if (endstr==-1) endstr=document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr)); 
	}

// récupère toutes les valeurs d'un cookie
function read_cookie(nom)
	{
	var arg=nom+"=";
	var alen=arg.length;
	var clen=document.cookie.length;
	var i=0;
	while (i<clen)
		{
		var j=i+alen;
		if (document.cookie.substring(i, j)==arg) return getCookieVal(j);
		i=document.cookie.indexOf(" ",i)+1;
		if (i==0) break;		
		}
	return null; 
	}

// écrit le cookie qui défini le tmps de gel entre 2 validations
function set_cookie(time_seconds)
	{
	var exp_date = new Date();
	exp_date.setTime(exp_date.getTime() + Math.round(time_seconds*1000));
	write_cookie("myform_valid", "true", exp_date);
	write_cookie("myform_date", exp_date, exp_date);
	}

// return true if form was validated
// affiche le message de desactivation de la validation du form (ss forme d'alert)
function check_cookie_alert()
	{
	already_valid = read_cookie("myform_valid");
	if (already_valid)
		{
		exp_date = new Date(read_cookie("myform_date"));

		current = new Date();	
		
		diff = ((current.getTime() - exp_date.getTime()));
						
		if (diff < 0)
			alert(show_error(2000, Math.round(-diff/1000)));
		
		return diff < 0;
		}
	else return false;
	}

// affiche le message de desactivation de la validation du form (ss forme d'insert)
// retourne true si le form a été validé
function check_cookie_submit()
	{
	already_valid = read_cookie("myform_valid");
	if (already_valid)
		{
		exp_date = new Date(read_cookie("myform_date"));

		current = new Date();	
		
		diff = ((current.getTime() - exp_date.getTime()));
						
		if (diff < 0)
			document.getElementById('form_error').innerHTML = show_error(2000, Math.round(-diff/1000));
		
		return diff < 0;
		}
	else return false;
	}

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

function set_classname_error(objname)
	{
	if (document.forms[form_name].elements[objname].className && changeclass)
		{
		tmp_class = new String(document.forms[form_name].elements[objname].className);
		if (tmp_class.substring(tmp_class.length-6, tmp_class.length) != "_error")
			{
			document.forms[form_name].elements[objname].className += "_error";
			//alert("classname change pour "+objname+" : "+document.forms[form_name].elements[objname].className);
			}
		}
	
	}

function set_classname_standard(objname)
	{
	if (document.forms[form_name].elements[objname].className && changeclass)
		{
		tmp_class = new String(document.forms[form_name].elements[objname].className);
		if (tmp_class.substring(tmp_class.length-6, tmp_class.length) == "_error")
			{
			document.forms[form_name].elements[objname].className = tmp_class.substring(0, tmp_class.length-6);
			//alert("classname change pour "+objname+" : "+document.forms[form_name].elements[objname].className);
			}
		}
	}

// récupère la valeur d'un champs txt name
function get_input_value(name)
	{
	return document.forms[form_name].elements[name].value;
	}

// récupère la valeur d'un bouton radio radiobouton
function get_radio_value (radiobutton)
	{
	myradiovalue="";
	
	if (radiobutton.length == 1) myradiovalue = radiobutton.value;
	else for (i=0;i<radiobutton.length;i++)
		if (radiobutton[i].checked==true) myradiovalue = radiobutton[i].value;
	return myradiovalue;
	}

// récupère la valeur d'un menu déroulant
function get_select_value(form_element)
	{
	if (form_element.selectedIndex >= 0)
	return form_element.options[form_element.selectedIndex].value;
	else return "";
	}

// check la longueure d'un champ
function fm_maxlength_check(elt, maxlength)
	{
	if (elt.value.length < maxlength) return true;
	else  elt.value = new String(elt.value).substring(0, elt.value.length-1);
	return true;
	}

// remplacement de caractères
function Remplace(str,find,rep)
	{
	var reg = new RegExp(find,"gi")
	return(str.replace(reg,rep));
	}

	
//-------------------------
// check un fiel -name- en mode 'a la saisie'
function instant_check_field(name, required, mail, numbers, letters, regexp, length, length_type)
	{
	all_ok = true;
	
	if (required)	all_ok = all_ok && check_required(name);
	if (!all_ok) 	show_instant_error_required(name);
	else 
		{
		if (mail)	 all_ok = all_ok && check_mail(name);
		if (!all_ok) show_instant_error_mail(name);
		else 
			{
			if (numbers) all_ok = all_ok && check_numbers(name);
			if (!all_ok) show_instant_error_numbers(name);
			else 
				{
				if (letters) all_ok = all_ok && check_letters(name);
				if (!all_ok) show_instant_error_letters(name);
				else 
					{
					if (regexp)	 all_ok = all_ok && check_regexp(regexp, name);
					if (!all_ok) show_instant_error_regexp(name);
					else 
						{
						if (length)  all_ok = all_ok && check_length(name, length, length_type);
						if (!all_ok) show_instant_error_length(name, length, length_type);
						}
					}
				}
			}
		}
	
	if (all_ok)
		{
		if (get_input_value(name).length <= 0) document.getElementById(name+'_info').innerHTML = "";
		else show_instant_good_text(name);
		return true;
		}
	else return false;	
	}

// check un fiel -name- en mode 'a la saisie'
function instant_start_check_field(name, required, mail, numbers, letters, regexp, length, length_type)
	{
	all_ok = true;
	
	if (required)	all_ok = all_ok && check_required(name);
	if (!all_ok) 	show_instant_bad_text(name);
	else 
		{
		if (mail)	 all_ok = all_ok && check_mail(name);
		if (!all_ok) show_instant_bad_text(name);
		else 
			{
			if (numbers) all_ok = all_ok && check_numbers(name);
			if (!all_ok) show_instant_bad_text(name);
			else 
				{
				if (letters) all_ok = all_ok && check_letters(name);
				if (!all_ok) show_instant_bad_text(name);
				else 
					{
					if (regexp)	 all_ok = all_ok && check_regexp(regexp, name);
					if (!all_ok) show_instant_bad_text(name);
					else 
						{
						if (length)  all_ok = all_ok && check_length(name, length, length_type);
						if (!all_ok) show_instant_bad_text(name, length, length_type);
						}
					}
				}
			}
		}
	
	if (all_ok)
		{
		if (get_input_value(name).length <= 0) document.getElementById(name+'_info').innerHTML = "";
		else show_instant_good_text(name);
		return true;
		}
	else return false;	
	}

// fonction de teste d'un champ -name-
// retourne true si le champs est correct
// remplis les différents tableaux d'erreurs sinon...
function submit_check_field(name, label, required, mail, numbers, letters, regexp, length, length_type)
	{
	all_ok = true;
	
	if (required)	all_ok = all_ok && check_required(name);		
	if (!all_ok)
		{
		set_classname_error(name);
		required_mess[required_mess.length] = '"'+label+'"';
		}
	else 
		{
		set_classname_standard(name);
		if (mail)	 all_ok = all_ok && check_mail(name);
		if (!all_ok)
			{
			set_classname_error(name);
			mail_mess[mail_mess.length] = '"'+label+'"';
			}
		else 
			{
			set_classname_standard(name);
			if (numbers) all_ok = all_ok && check_numbers(name);
			if (!all_ok) 
				{
				set_classname_error(name);
				numbers_mess[numbers_mess.length] = '"'+label+'"';
				}
			else 
				{
				set_classname_standard(name);
				if (letters) all_ok = all_ok && check_letters(name);
				if (!all_ok) 
					{
					set_classname_error(name);
					letters_mess[letters_mess.length] = '"'+label+'"';
					}
				else 
					{
					set_classname_standard(name);
					if (regexp)	 all_ok = all_ok && check_regexp(regexp, name);
					if (!all_ok)
						{
						set_classname_error(name);
						regexp_mess[regexp_mess.length] = '"'+label+'"';
						}
					else 
						{
						set_classname_standard(name);
						if (length)	 all_ok = all_ok && check_length(name, length, length_type);
						if (!all_ok) 
							{
							set_classname_error(name);
							length_mess[length_mess.length] = show_submit_error_length(name, '"'+label+'"', length, length_type);
							}
						else set_classname_standard(name);
						}
					}
				}
			}
		}
	
	return all_ok;
	}

function submit_check_checkbox(name, label, check_type)
	{
	set_classname_standard(name);
	all_ok = check_checked(name, check_type);
	if (!all_ok)
		{
		set_classname_error(name);
		if (check_type == 1)	checked_mess[checked_mess.length] = '"'+label+'"';
		else  					not_checked_mess[not_checked_mess.length] = '"'+label+'"';
		}
	return all_ok;
	}

function instant_check_checkbox(name, check_type)
	{
	all_ok = check_checked(name, check_type);
	if (!all_ok)
		{
		if (check_type == 1)	show_instant_error_checkbox(name, check_type);
		else  					show_instant_error_checkbox(name, check_type);
		}
	else show_instant_good_text(name);
	return all_ok;
	}

function instant_start_check_checkbox(name, check_type)
	{
	all_ok = check_checked(name, check_type);
	if (!all_ok) show_instant_bad_text(name);
	
	else show_instant_good_text(name);
	return all_ok;
	}

// met en forme les erreur d'un champs (ajout des virgules et un 'et' entre les nomss des champs)
// table est un tableau qui contient tous les noms des champs mal saisi par rapport a un critère
function submit_format_error(table)
	{
	if (table.length == 1) return new String(table[0]);
	if (table.length == 2) return new String(table[0]+' '+show_error(1000)+' '+table[1]);
	else
		{
		var table_mess = new String();
		for (i = 0; i < table.length-1; i++) table_mess += table[i]+', ';
		return new String(table_mess.substring(0, table_mess.length-2)+ ' '+show_error(1000)+' '+table[table.length-1]);
		}
	}

// fonction de mise en forme des messages d'erreur
// pour chaque tableau d'erreur, on vérifie le type de messages d'erreur a afficher (singulier, pluriel)
// renvoie le message final contenant toutes les erreurs formattées
function manage_submited_errors()
	{
	message 		= new String();
	requ_message 	= new String();
	mail_message 	= new String();
	numbers_message	= new String();
	letters_message	= new String();
	regexp_message 	= new String();
	length_message 	= new String();
	checked_messages = new String();
	not_checked_messages = new String();

// try car si en mode "key", pas de messages managés...	
try
	{
	// required
	if (required_mess.length > 0)
		{
		requ_message = submit_format_error(required_mess);
		if (required_mess.length == 1)	requ_message = show_error(0, requ_message);//"Le champs "+requ_message+" est obligatoire.\n";
		else 							requ_message = show_error(1, requ_message);//"Les champs "+requ_message+" sont obligatoires.\n";
		message += requ_message;
		}
	
	// mail
	if (mail_mess.length > 0)
		{
		mail_message = submit_format_error(mail_mess);
		if (mail_mess.length == 1)	mail_message = show_error(2, mail_message);//"Le champs "+mail_message+" requiert une adresse email valide.\n";
		else 						mail_message = show_error(3, mail_message);//"Les champs "+mail_message+" requièrent des adresses email valides.\n";
		message += mail_message;
		}
	
	// numbers
	if (numbers_mess.length > 0)
		{
		numbers_message = submit_format_error(numbers_mess);
		if (numbers_mess.length == 1)	numbers_message = show_error(4, numbers_message);//"Le champs "+numbers_message+" ne doit contenir que des nombres.\n";
		else 							numbers_message = show_error(5, numbers_message);//"Les champs "+numbers_message+" ne doivent contenir que des nombres.\n";
		message += numbers_message;
		}
	
	// letters
	if (letters_mess.length > 0)
		{
		letters_message = submit_format_error(letters_mess);
		if (letters_mess.length == 1)	letters_message = show_error(6, letters_message);//"Le champs "+letters_message+" ne doit contenir que des lettres.\n";
		else 							letters_message = show_error(7, letters_message);//"Les champs "+letters_message+" ne doivent contenir que des lettres.\n";
		message += letters_message;
		}
	
	// regexp
	if (regexp_mess.length > 0)
		{
		regexp_message = submit_format_error(regexp_mess);		
		if (regexp_mess.length == 1)	regexp_message = show_error(8, regexp_message);//"Le champs "+regexp_message+" est mal formatté.\n";
		else 							regexp_message = show_error(9, regexp_message);//"Les champs "+regexp_message+" sont mal formattés.\n";
		message += regexp_message;
		}
	
	// length
	if (length_mess.length > 0)
		{
		for (i = 0; i < length_mess.length; i++) length_message += length_mess[i];
		message += length_message;
		}
	
	// checkbox
	if (checked_mess.length > 0)
		{
		checked_messages = submit_format_error(checked_mess);
		if (checked_mess.length == 1)	checked_messages = show_error(75, checked_messages);//"La case %mess% doit être cochée.\n";
		else 							checked_messages = show_error(76, checked_messages);//"Les cases %mess% doivent être cochées.\n";
		message += checked_messages;
		}
	
	if (not_checked_mess.length > 0)
		{
		not_checked_messages = submit_format_error(not_checked_mess);
		if (not_checked_mess.length == 1)	not_checked_messages = show_error(77, not_checked_messages);//"La case %mess% ne doit pas être cochée.\n";
		else 							not_checked_messages = show_error(78, not_checked_messages);//"Les cases %mess% ne doivent pas être cochées.\n";
		message += not_checked_messages;
		}
	}
catch (e) {}
	return message;
	}

// fonction d'affichage des erreurs en mode 'insert'
function show_submit_error_text(personnal_message)
	{
	message = manage_submited_errors();
	
	// si pas de div 'form_error', on met quand même une alert !
	if (!document.getElementById('form_error')) alert(personnal_message + message);
	if (message != '' || personnal_message != '')
		document.getElementById('form_error').innerHTML = personnal_message + Remplace(message, "\n", "<br>");
	else document.getElementById('form_error').innerHTML = show_error(1500);
	}

// fonction d'affichage des erreurs perso en mode 'key'
function show_key_error_text(personnal_message)
	{	
	// si pas de div 'form_error', on met quand même une alert !
	if (!document.getElementById('form_error')) alert(personnal_message);
	if (personnal_message != '')
		document.getElementById('form_error').innerHTML = Remplace(personnal_message, "\n", "<br>");
	else document.getElementById('form_error').innerHTML = "";
	}


//fonction d'affichage des erreurs en mode 'alert'
function show_alert_error_text(personnal_message)
	{
	message = manage_submited_errors();
		
	if (message != '' || personnal_message != "" )
		alert(personnal_message + message);
	else alert(show_error(1500));
	}

// affiche le span "correct"" quand le champs est bien formatt�
function show_instant_good_text(name)
	{
	document.getElementById(name+'_info').innerHTML = "<span class='myform_success'>&nbsp;</span>";
	}

// affiche le span "incorrect" simple quand le champs est bien formatt�
function show_instant_bad_text(name)
	{
	document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>&nbsp;</span>";
	}


//-------------------------
// vérifie l'intégrité d'un champs obligatoire
function check_required(name)
	{
	if (get_input_value(name) == "" || get_input_value(name).length <= 0) return false;
	else return true;
	}

// affiche le message d'erreur à la saisie pour les champs obligatoires
function show_instant_error_required(name)
	{
	document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(50)+"</span>";
	}


//-------------------------
// vérifie la validité d'un champs email
function check_mail(name)
	{	
	if (get_input_value(name).length <= 0) return true;
	else
		{
		/*
		atom	= '[-a-z0-9!#$%&\'*+/=?^_`{|}~]';
		domain	= '([a-z]([-a-z0-9]*[a-z0-9]+)?)';
		regexp	= '^'+atom+'+(\.'+atom+'+)*@('+domain+'{1,63}[\.-])+('+domain+'{2,63})+$';
		*/
		regexp = "^[A-Z0-9._%-]+@[A-Z0-9._%-]+[\.]+[A-Z]{2,6}$";
		return new RegExp(regexp, "i").test(get_input_value(name));
		}
	}

// affiche le message instantané d'erreur de mail
function show_instant_error_mail(name)
	{
	document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(51, get_input_value(name))+"</span>";//"adresse "+get_input_value(name)+" incorrecte</span>";
	}

//-------------------------
// vérifie que le champs ne contient que des nombres
function check_numbers(name)
	{
	if (get_input_value(name).length <= 0) return true;
	else return new RegExp("^[+-]?[0-9]*[\.|,]?[0-9]+$").test(get_input_value(name));
	}

// affiche le message d'erreur instantané pour un champs ne devant contenir que des nombres
function show_instant_error_numbers(name)
	{
	document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(52, get_input_value(name))+"</span>";//ce champs ne doit contenir que des nombres</span>";
	}

//-------------------------
// vérifie que le champs ne contient que des lettres
function check_letters(name)
	{
	if (get_input_value(name).length <= 0) return true;
	else return new RegExp("^[a-zA-ZéèçàñäïöüùÄÏÜÑâîôûêÂÎÔÛÊ\\-/ ']+$", "i").test(get_input_value(name));
	}

// affichage du message d'erreur instantanné pour un champs ne devant contenir que des lettres
function show_instant_error_letters(name)
	{
	document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(53, get_input_value(name))+"</span>";//ce champs ne doit contenir que des lettres</span>";
	}

//-------------------------
// vérification regexp
function check_regexp(regexp, name)
	{
	if (get_input_value(name).length <= 0) return true;
	else return new RegExp(regexp, "i").test(get_input_value(name));
	}

// affichage erreur instant pour regexp
function show_instant_error_regexp(name)
	{
	document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(54, get_input_value(name))+"</span>";//format incorrect</span>";
	}
//-------------------------

// verifie qu'une case à cocher est cochée ou non
// 1 : cochée
// 2 : non cochée
function check_checked(name, verification_type)
	{
	switch (verification_type)
		{
		case 1 : return document.forms[form_name].elements[name].checked == true; break;
		case 2 : return document.forms[form_name].elements[name].checked == false; break;
		default: show_error(1500);
		}
	}

function show_instant_error_checkbox(name, verification_type)
	{
	switch (verification_type)
		{
		case 1 : document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(70)+"</span>"; break;//ce champs doit contenir moins de "+length+" caract&egrave;res</span>"; break;
		case 2 : document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(71)+"</span>"; break;//ce champs doit contenir au plus "+length+" caract&egrave;res</span>"; break;
		default: show_error(1500);
		}
	}


//-------------------------
/*
verification type : 
0 : equals
1 : minus
2 : minus or equals
3 : superior
4 : superior or equals
*/
function check_length(name, length, verification_type)
	{
	length2 = get_input_value(name).length;
	if (length2 <= 0) return true;
	else
	switch (verification_type)
		{
		case 0 : return length2 == length; break;
		case 1 : return length2 <  length; break;
		case 2 : return length2 <= length; break;
		case 3 : return length2 >  length; break;
		case 4 : return length2 >= length; break;
		default: show_error(1500);
		}
	}

function show_instant_error_length(name, length, verification_type)
	{
	switch (verification_type)
		{
		case 0 : document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(55, get_input_value(name), length)+"</span>"; break;//ce champs doit contenir "+length+" caract&egrave;res</span>"; break;
		case 1 : document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(56, get_input_value(name), length)+"</span>"; break;//ce champs doit contenir moins de "+length+" caract&egrave;res</span>"; break;
		case 2 : document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(57, get_input_value(name), length)+"</span>"; break;//ce champs doit contenir au plus "+length+" caract&egrave;res</span>"; break;
		case 3 : document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(58, get_input_value(name), length)+"</span>"; break;//ce champs doit contenir plus de "+length+" caract&egrave;res</span>"; break;
		case 4 : document.getElementById(name+'_info').innerHTML = "<span class='myform_error'>"+show_error(59, get_input_value(name), length)+"</span>"; break;//ce champs doit contenir au moins "+length+" caract&egrave;res</span>"; break;
		default: show_error(1500);
		}
	}

function show_submit_error_length(name, label, length, verification_type)
	{
	switch (verification_type)
		{
		case 0 : return show_error(10, label, length); break;//"Le champs "+label+" doit contenir "+length+" caractères.\n"; break;
		case 1 : return show_error(11, label, length); break;//return "Le champs "+label+" doit contenir moins de "+length+" caractères.\n"; break;
		case 2 : return show_error(12, label, length); break;//return "Le champs "+label+" doit contenir au plus "+length+" caractères.\n"; break;
		case 3 : return show_error(13, label, length); break;//return "Le champs "+label+" doit contenir plus de "+length+" caractères.\n"; break;
		case 4 : return show_error(14, label, length); break;//return "Le champs "+label+" doit contenir au moins "+length+" caractères.\n"; break;
		default: return show_error(1500); break;
		}
	}
