/*
 *      lib_validation.js
 *      
 *      Auteur : Marc FREREBEAU <marc.frerebeau@agama.fr>
 *      Société : AGAMA, www.agama.fr
 *      Licence : GPL
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *      
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 *      
 *      
 *      Application : Monplannnig
 *      Version : 2.0 
 *      
 *      Nom module :
 *      Description :
 *      		librairie générale de validation de champs
 *      Nécessite : 
 *      		
 *      Date : 18/03/2010
 *      Version : 0.1
 */

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_vide
//
// Description :
//		Retourne true si la chaine est un texte composé uniquement de 
//		caractères numériques.
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un texte valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 17/12/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_entier( chaine )
{
	var regex = /^[0-9]*$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_vide
//
// Description :
//		Retourne true si la chaine est un texte composé de caractères
//		invisibles (espaces, retours à la ligne, tabulation, etc.).
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un texte valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 06/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_vide( chaine )
{
	var regex = /^[ \t\n\r]*$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_nom
//
// Description :
//		Retourne true si la chaine est un nom valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un nom valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 06/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_nom( chaine )
{
	regex = /^[a-z\-\' éèùàâêûîôäëÿüïöç]*$/gi;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_nom_avec_numeros
//
// Description :
//		Retourne true si la chaine est un nom valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un nom valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 06/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_nom_avec_numeros( chaine )
{
	regex = /^[a-z0-9\-\' éèùàâêûîôäëÿüïöç]*$/gi;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}




//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_identifiant
//
// Description :
//		Retourne true si la chaine est un identifiant valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un identifiant valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 06/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_identifiant( chaine )
{
	var regex = /^[a-z_\-\.0-9]*$/gi;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_email
//
// Description :
//		Retourne true si la chaine est un email valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un email valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 06/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_email( chaine )
{
	var regex = /^[0-9a-z_\-]+(\.[0-9a-z_\-]+)*@([0-9a-z\-]+\.)+[a-z]{2,}$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_email_majuscules
//
// Description :
//		Retourne true si la chaine est un email valide. Accepte les 
//		majuscules.
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un email valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 06/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_email_majuscules( chaine )
{
	var regex = /^[0-9a-z_\-]+(\.[0-9a-z_\-]+)*@([0-9a-z\-]+\.)+[a-z]{2,}$/gi;
	regex.test( 'chaine_ne_validant_pas_l_expression' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_telephone
//
// Description :
//		Retourne true si la chaine est un numéro de téléphone valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un numéro de téléphone valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 06/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_telephone( chaine )
{
	//var regex = /^((\+[0-9]{2}[ \.\-]*\(?[0-9]\)?)|[0-9])([ \.\-]*[0-9][ \.\-]*){9}$/g;
	var regex = /^(\+?33|0)/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	if( regex.test( chaine ) )
		// Numéro français
		regex = /^((\+?33[ \.\-]*\(?[1-9]\)?)|0[ \.\-]*[1-9])([ \.\-]*[0-9][ \.\-]*){8}$/g;
	else
		// Numéro internationnal
		regex = /^\+?[1-9]([ \.\-]*[0-9][ \.\-]*){0,5}([ \.\-]*[0-9][ \.\-]*){3,9}$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_code_postal_francais
//
// Description :
//		Retourne true si la chaine est un code postal valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un code postal valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 07/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_code_postal_francais( chaine )
{
	var regex = /^[0-1]?[0-9]{1,2} *[0-9]{3}$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_url
//
// Description :
//		Retourne true si la chaine est une url valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est une url valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 07/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_url( chaine )
{
	var regex = /^(|http:\/\/|https:\/\/)(%[0-9]{2}|[a-z0-9\.\-])+\.[a-z]{2,3}(\/(%[0-9]{2}|[a-z0-9_\-\.])+\/?)*(\?(([a-z0-9_\-\.]+=[^&=]*)(\&[a-z0-9_\-\.]+=[^&=]*)*)?)?$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_siren
//
// Description :
//		Retourne true si la chaine est un numéro de SIREN valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un numéro de SIREN valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 07/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_siren( chaine )
{
	var regex = /^[0-9]{3}([ \-\.]?[0-9]{3}){2}$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_siret
//
// Description :
//		Retourne true si la chaine est un numéro de SIRET valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un numéro de SIRET valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 07/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_siret( chaine )
{
	var regex = /^[0-9]{3}([ \-\.]?[0-9]{3}){2}[ \-\.]?[0-9]{5}$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_numero_organisme_formation
//
// Description :
//		Retourne true si la chaine est un numéro d'organisme de formation
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un nombre valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 07/04/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_numero_organisme_formation( chaine )
{
	var regex = /^[0-9a-z]{10,}$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@ ' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_date_fr
//
// Description :
//		Retourne true si la chaine est une date au format français
//		JJ/MM/AAAA
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un nombre valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 07/04/2010
// Commentaires :
//	Ne valide pas les dates antérieures à l'an 1000 ou postérieures à 9999.
//////////////////////////////////////////////////////////////////////
function lib_validation_est_date_fr( chaine )
{
	var mois_nb_jours = Array( 31, 28, 31, 30,31,30,31,31,30,31,30,31 );
	// Décompose la date
	var decompose = chaine.split( '/' );
	// Assure qu'il s'agit de chiffres
	decompose[0] = parseInt( decompose[0], 10 ); // jour ; le 10 spécifie de ne pas interpréter le nombre en octal
	decompose[1] = parseInt( decompose[1], 10 ); // mois
	decompose[2] = parseInt( decompose[2], 10 ); // année
	// Valide le mois
	if( ( decompose[1] < 1 ) || ( decompose[1] > 12 ) || isNaN(decompose[1]) )
		return false;
	// Valide l'année
	if( isNaN(decompose[2]) || decompose[2].toString().length != 4 )
		return false;
	if( decompose[1] == 2 )
	{
		// Détermine si l'année est bissextile
		var date_test = new Date( decompose[2], 1, 29 );
		if( date_test.getDate() == 29 )
			mois_nb_jours[1] = 29;
	}
	// Valide le jour
	if( isNaN(decompose[0]) || ( decompose[0] < 1 ) || ( decompose[0] > mois_nb_jours[decompose[1]-1] ) )
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_est_securite_sociale
//
// Description :
//		Retourne true si la chaine est un numéro de sécurité social.
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est un nombre valide
//		* false : la chaine n'est pas valide
// Auteurs : Marc FREREBEAU
// Date dernière modification : 15/06/2010
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_est_securite_sociale( chaine )
{
	var regex = /^[0-9]([ .\-]*[0-9]){14}$/g;
	regex.test( 'chaine_ne_validant_pas_l_expression@ ' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_recherche_telcp
//
// Description :
//		Retourne true si la chaine est une portion de numéro de téléphone valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est valide
//		* false : la chaine n'est pas valide
// Auteurs : Romain PINA
// Date dernière modification : 30/06/2011
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_recherche_telcp( chaine )
{
	var regex = /^[ \.\-0-9]*$/;
	regex.test( 'chaine_ne_validant_pas_l_expression@ ' );
	return regex.test( chaine );
}

//////////////////////////////////////////////////////////////////////
// Fonction lib_validation_recherche_telcp
//
// Description :
//		Retourne true si la chaine est une portion d'adresse mail valide
// Entrées :
//		@chaine (string) : chaine à valider
// Sorties :
//		@Néant
// Valeur de retour :
//		* true : la chaine est valide
//		* false : la chaine n'est pas valide
// Auteurs : Romain PINA
// Date dernière modification : 30/06/2011
// Commentaires :
//		
//////////////////////////////////////////////////////////////////////
function lib_validation_recherche_email( chaine )
{
	var regex = /^[^&~"#'{(\[|`\\^)\]=}+*$ø£µ%!:\/;,?<>°^]*$/;
	regex.test( 'chaine_ne_validant_pas_l_expression@ ' );
	return regex.test( chaine );
}
