/**
 * Ce fichier contient toutes les fonctions javascript utiles pour la vérification des champs de formulaires
 * 
  * par exemple : vérification générique d'un champ obligatoire, avec son type de données particulier...
 *
 * @author Laurent Marlin (créé le 12/09/2006)
 * @version 1.0
 * 
 */

/**
 * Vérifie si une valeur a été saisie dans le champ $in_champ_a_controler.
 * @param		string		Champ dont la saisie d'une valeur doit être contrôlée.
 * @param 	bool 			Spécifie si vérification champ vide ou non
 * @param		string		Message d'erreur à afficher si le champ est vide.
 * @param		string		Message d'erreur à afficher si type de donnée du champ à contrôler n'est pas valide.
 * @param		string		Format du champ, exemple : tél1 : n° de téléphone, number : nombre entier ...
 * @param		number	 	Nombre de caractères exact que doit comporter le champ.
  * @param	number	 	Nombre de caractères maximum que doit accepter le champ.
 * @return	bool	 		True si une valeur est saisie, false sinon.
 */

function verification_champ (champ,champ_non_vide,msg_cas_champ_vide,msg_type_donnee_invalide,champ_format,nombre_de_caracteres,nombre_de_caracteres_max)
{
	/*Expression régulière servant pour la vérification des données*/
	var modele;
	/*Variable temporaire de stockage de message si message non paramétré par l'utilisateur*/
	var msg_tmp_donnee_invalide;
	
	if ((champ.value == "" || champ.value == null) && champ_non_vide == true)
	{
		if (msg_cas_champ_vide == "" || msg_cas_champ_vide == null)
		{
			msg_cas_champ_vide = 'Ce champ doit être obligatoirement renseigné';
		}
		
		/*Affichage du message en cas de champ vide + focus*/
		alert(msg_cas_champ_vide);
		champ.focus();
		return false;
	}
	if (champ.value != "")
	{
		if (champ_format != null && champ_format != "")
		{
		/*On détermine le format de données défini par l'utilisateur*/
		switch (champ_format)
		{
			case 'alpha' :
				if (nombre_de_caracteres!=0 && nombre_de_caracteres!='' && nombre_de_caracteres!=null)
				{
					modele = new RegExp("^[a-zA-Z0-9 \'éëêè^°àäâçôùûüî><:.;,!()\-]{"+nombre_de_caracteres.toString()+"}$");
				}
				else
				{
					modele = new RegExp("^[a-zA-Z0-9 \'éëêè^°àäâçôùûüî><:.;,!()\-]*$");
				}
				msg_tmp_donnee_invalide = "Ce champ n'accepte que des caractères alphanumériques";			
				break;

			case 'char' :
				if (nombre_de_caracteres!=0 && nombre_de_caracteres!='' && nombre_de_caracteres!=null)
				{
					modele = new RegExp("^[a-zA-Z \'éëêè^°àäâçôùûüî><:.;,!()\-]{"+nombre_de_caracteres.toString()+"}$");
				}
				else
				{
					modele = new RegExp("^[a-zA-Z \'éëêè^°àäâçôùûüî><:.;,!()\-]*$");
				}
				msg_tmp_donnee_invalide = "Ce champ n'accepte que des caractères alphabétiques";
				break;
			
			case 'parametre' :
				if (nombre_de_caracteres!=0 && nombre_de_caracteres!='' && nombre_de_caracteres!=null)
				{
					modele = new RegExp("^[a-zA-Z0-9 éëêè^°àäâçôùûüî><:.;,!()\-\_\/]{"+nombre_de_caracteres.toString()+"}$");
				}
				else
				{
					modele = new RegExp("^[a-zA-Z0-9 éëêè^°àäâçôùûüî><:.;,!()\-\_\/]*$");
				}
				msg_tmp_donnee_invalide = "Ce champ accepte uniquement des caractères pour paramètre";			
				break;
				
			case 'date1' :
				modele = /^[0-3][0-9]\/[0-1][0-9]\/[0-9]{4}$/;
				msg_tmp_donnee_invalide = "Ce champ n'accepte qu'une date au format JJ/MM/AAAA";
				break;

			case 'date2' :
				modele = /^[0-3][0-9]\/[0-1][0-9]\/[0-9]{2}$/;
				msg_tmp_donnee_invalide = "Ce champ n'accepte qu'une date au format JJ/MM/AA";
				break;

			case 'heure1' :
				modele = /^[0-2][0-9]:[0-5][0-9]$/;
				msg_tmp_donnee_invalide = "Ce champ n'accepte qu'une heure au format HH:MI";
				break;

			case 'mail' :
				modele = /[\w|\W][\w|\W]*@[\w|\W][\w|\W]*[.]{1}[\w|\W][\w|\W]*/;
				msg_tmp_donnee_invalide = "Ce champ n'accepte qu'un mail au format nom@domaine.";
				break;
				
			case 'url1' :
				modele = /^(((ht|f)tp(s?))\:\/\/)?(([a-zA-Z0-9]+([@\-\.]?[a-zA-Z0-9]+)*)(\:[a-zA-Z0-9\-\.]+)?@)?(www.|ftp.|[a-zA-Z]+.)?[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,})(\:[0-9]+)?\/?/;
				msg_tmp_donnee_invalide = "Ce champ n'accepte qu'une url au format http://sous-domaine.domaine.origine";
				break;

			case 'number' :
				if (nombre_de_caracteres!=0 && nombre_de_caracteres!='' && nombre_de_caracteres!=null)
				{
					modele = new RegExp("[0-9]{"+nombre_de_caracteres.toString()+"}");
				}
				else
				{
					modele = new RegExp("^[0-9]*$");
				}
				msg_tmp_donnee_invalide = "Ce champ n'accepte qu'un nombre entier";
				break;
				
			case 'float' :
				modele = new RegExp("^[0-9]+[,.]*[0-9]*$");
				msg_tmp_donnee_invalide = "Ce champ n'accepte qu'un nombre flottant";
				break;

			case 'tel1' :
				modele = /[0-9]{10}/;
				msg_tmp_donnee_invalide = "Ce champ n'accepte qu'un numéro de téléphone au format NNNNNNNNNN";
				break;

			default :
				alert("Le type de données fourni à la fonction de vérification de données n'est pas valide");
				champ.focus();
				return false;
		}
		
		/*Vérification du type de données*/
		var pos = (champ.value).search(modele);
		if (pos==-1)
		{
			/*Le type de donnée ne correspond pas on affiche le message + focus*/
			if (msg_type_donnee_invalide == "" || msg_type_donnee_invalide == null)
			{
				msg_type_donnee_invalide = msg_tmp_donnee_invalide;
			}
			
			/*Message d'erreur + focus*/
			alert(msg_type_donnee_invalide);
			champ.focus();
			return false;
		}
		else
		{
			//Vérification du nombre max de caractères
			if (nombre_de_caracteres_max != null && nombre_de_caracteres_max != "" && nombre_de_caracteres_max > 0)
			{
				if (champ.value.length>nombre_de_caracteres_max)
				{
					alert("Ce champ ne peut comporter que "+nombre_de_caracteres_max+" caractères au maximum");
					champ.focus();
					return false;
				}
			}
			else
			{
				return true;	
			}
			
			//Gestion du cas spécial date1
			if (champ_format=='date1')
			{
				/*On sait que le format est correct d'où le traitement de la chaîne*/
				JJ = champ.value.substring(0,2);
				MM = champ.value.substring(3,5);
				AAAA = champ.value.substring(6,10);
				/*Vérification de la validité de la date passée*/
				if (IsDate(JJ, MM, AAAA)==false)
				{	
					alert("La date que vous avez entré n'est pas valide");
					champ.focus();
					return false;
				}
			}
		}
	}
		else
		{
			/*Message d'erreur + focus*/
			alert("Le format de la donnée à vérifier n'est pas renseigné");
			champ.focus();
			return false;
		}
	}
	else
	{
		return true;
	}
}

//fonction de vérification de date
function IsDate(JJ, MM, AAAA)
{
	if(JJ<1||JJ>31||MM<1||MM>12) {return false;}
	//Gestion du cas du mois de février
	if(MM==02)
	{
		if(JJ==30||JJ==31) {return false;}
	  	if(JJ==29) {return ((AAAA%4==0&&AAAA%100!=0)||AAAA%400==0)};
	}
	else 
	{
		//Vérification dernier jour du mois
		if(JJ==31) 
		{
			return !(MM==04||MM==06||MM==09||MM==11);
		}
	}
	return true;
}