// ==============================================================
//
//                    formulaire.js
//
// - function affiche_tableau(tab,cpt)
// - function js_init(nom_ctrl,valeur)
// - function date_onFocus(ctrl)
// - function date_onBlur(ctrl)
// - function date_onKeyUp(ctrl)
// - function Verif_Numeric(ctrl)
// - function Verif_Decimal(ctrl)
// - function Verif_Alpha(ctrl)
// - function Verif_Bornes(ctrl,borneinf,bornesup)
// - function CodePostal_onBlur(ctrl)
// - function Mail_onBlur(ctrl)
//
// - function verifChiffres(ctrl)
// - function verifDecimal(ctrl)
// - function verifLettres(ctrl)
// - function verif(ctrl,epxReg,msgErreur)
//
// - function viderPressePapier()
// - function confirmationMail(adresse1,adresse2)
//
// -------------------------------------------------------------
//
//     Auteur : CTA                                            
//
//     Date création  : 14/06/2004                             
//
//     Modifications :                                         
//
//       - Le 27/07/2004 par CTA :                             
//
//       - Le 04/10/2004 par CTA : ajout de Verif_Decimal.     
//
//       - Le 07/12/2004 par CTA : modif Mail_onBlur.          
//			 ( + ajout Trim )                                      
//
//       - Le 24/01/2005 par CTA : Blindage Mail_onBlur.       
//			 ( probleme avec .@ et @.) + suppression Trim          
//			 simplification du code.                               
//
//       - Le 03/06/2005 par CTA : event.keyCode!=8            
//			 Permettre le delete sur le separateur de date         
//
//       - Le 16/07/2007 par CTA : Suppression des vérification 
//       à la frappe. La vrif se fait maintenant lorsque le    
//       champs perd le focus.(evenement onblur)               
//       Ajout de verifChiffres/verifDecimal/verifLettres+verif
//       Verif_char                                            
//       Verif_Numeric                                         
//       Verif_Numeric_plus                                    
//       Verif_Decimal                                         
//       Verif_Alpha .. ne devraient plus être utilisées       
//
//       - Le 31/07/2007 par CTA : ajout de 2 fonctions pour gestion des adresses optin
//       viderPressePapier() et confirmationMail(adresse1,adresse2)
//
//       - Le 08/08/2007 par CTA : modif date_onBlur et CodePostal_onBlur
//
//       - Le 21/10/2009 par CTA : Ajout verifDecimalMICM car l'indide pour le calcul micm contient 4 décimales
//
// ==============================================================

tOblig = new Array(50); // Tableau des champs obligatoires
cpt_tOblig = 0; // Compte le nb d'élément du tableau des champs obligatoires
var pas_de_control_svp = 0;

// =============================================================
// Cette fonction affiche le contenu d'un tableau à 2 dimensions
// ( Sert au débuggage )
// =============================================================

function affiche_tableau(tab,cpt){
	var msg = '' ;
	// sort si le tableau est vide
	if(cpt<1){
		return;
	}
	for (i=0; i < cpt ; i++) {
		for (j=0; j < tab[i].length; j++)
			msg += tab[i][j] + " | ";
		msg += "\n";
	}
	alert(msg);
}

// ===================================================================
// Cette fonction rajoute une ligne au tableau des champs obligatoires
// ===================================================================

function chp_oblig(ctrl,msg){
	tOblig[cpt_tOblig] = new Array(ctrl,msg);
	cpt_tOblig++; // incrémentation du compteur d'éléments du tableau.
}

// =================================================
// Cette fonction vide le tableau passé en paramètre
// =================================================

	function vide_tableau_olbig(){
	cpt_tOblig=0;
}

// =============================================================
// Fonction qui vérifie que les chp obligatoires sont renseignés
// =============================================================

function js_verif_obligatoire() {
	if(pas_de_control_svp==1) return true;
	vide_tableau_olbig();  // Vidage du tableau des champs obligatoires
	js_verif_oblg();      // remplit le tableau des champs obligatoires
	// DEBUG affiche_tableau(tOblig,cpt_tOblig); // Affiche le tableau des champs obligatoires
	
	var bool = true;
	var msg = "Vous devez renseigner : \n\n";
	
	for ( i=0 ; i < cpt_tOblig; i++)
	  {
	  if ( js_verif( tOblig[i][0] ) == false)
		  {
		  msg = msg + " - " + tOblig[i][1] + "\n";
		  bool = false;
		  }
	  }
		// Si au moins un champ obligatoire n'a pas été renseigné, on affiche un message.
	if (bool == false)
	  {
	  alert(msg);
	  }
	return bool;
}

// ====================================
// Fonction principale de vérification 
// ====================================
function js_verif_form(){
	return js_verif_obligatoire();
}

// ===================================================================================
// Cette fonction prends le nom d'un champ en argument et vérifie s'il est renseigné.	
// Renvoie TRUE ou FALSE
// ===================================================================================
function  js_verif(nom_ctrl)
{
	var js_form = document.forms[0];
	
	//alert('Dans fonction js_init :\n nom_ctrl = ' + nom_ctrl + ' | valeur = ' + valeur + " | Type = " + js_form.elements[nom_ctrl].type);
	
	//////////////////////////////////////
	// CAS - Chp TEXTE	ou COMBO Box	//
	//////////////////////////////////////
	if ( (js_form.elements[nom_ctrl].type == "text") || (js_form.elements[nom_ctrl].type == "select-one") || (js_form.elements[nom_ctrl].type == "hidden"))
	{
	// Fonction vérifiant que le champ est renseigné
	if ( ( js_form.elements[nom_ctrl].value.length < 1) || ( js_form.elements[nom_ctrl].value == "JJMMAAAA") )
			{
			return false;
			}
	}
	else
	{
	
	//////////////////////
	// CAS - CheckBox	//
	//////////////////////
	if( js_form.elements[nom_ctrl].type  == "checkbox" )
		{
		// On ne peut pas vérifié si un checkbox est renseigné !!!
		}
		else
		{
	
		////////////////////////
		// CAS - Bouton RADIO //
		////////////////////////
		if(js_form.elements[nom_ctrl][0].type == "radio")
			{
				var bool = false;
	
				for( j=0 ; j < js_form.elements[nom_ctrl].length  ; j++ )
				{
	
					if ( js_form.elements[nom_ctrl][j].checked == true )
					{
	
					bool=true;
					}
				}
	
				if (!(bool))
				{
					return false;
				}
	
			} // Fin si "radio"
		} // Fin si "checkbox" else ...
	} // Fin si "text" else ...
} // Fin fonction




// fonction qui met une valeur dans un champ input (chp texte ou groupe de boutons radio bouton ou combo-box )
function js_init(nom_ctrl,valeur) {

	if ( valeur.length > 0 )
		{
		// alert('Dans fonction js_init :\n nom_ctrl = ' + nom_ctrl + ' | valeur = ' + valeur + " | Type = " + document.forms[0].elements[nom_ctrl].type);
	
		// Champ text
		if(( document.forms[0].elements[nom_ctrl].type == "text" )||(document.forms[0].elements[nom_ctrl].type == "hidden"))
			{
			document.forms[0].elements[nom_ctrl].value = valeur;
			}
		else
			{
	
			// Checkbox
			if( document.forms[0].elements[nom_ctrl].type  == "checkbox" )
				{
				if ( valeur == '1' )document.forms[0].elements[nom_ctrl].checked = true;
				else{document.forms[0].elements[nom_ctrl].checked = false;}
				return;
			}
			else
			{
	
				// Combo box
				if( document.forms[0].elements[nom_ctrl].type  == "select-one" )
					{
					for( i=0 ; i < document.forms[0].elements[nom_ctrl].length  ; i++ )
						{
						if ( document.forms[0].elements[nom_ctrl].options[i].value == valeur )
							{
							document.forms[0].elements[nom_ctrl].options[i].selected = true;
							return;
							}
	
						}
					}
					else
					{
	
					// Radio bouton
					if(document.forms[0].elements[nom_ctrl][0].type == "radio")
						{
							{
							for( i=0 ; i < document.forms[0].elements[nom_ctrl].length  ;i++ )
								{
								if ( document.forms[0].elements[nom_ctrl][i].value == valeur )
									{
									document.forms[0].elements[nom_ctrl][i].checked = true;
									return;
									}
								}
							}
						}
					}
				}
			}
		}
	}

	
// =========================================================
// Fonction concernant les champs dates - Evenement onFocus 
// =========================================================
function date_onFocus(ctrl)	{
	if(ctrl.value=='JJMMAAAA') ctrl.value='';
	}


// =======================================================
// Fonction concernant les champs dates - Evenement onBlur
// =======================================================

	function date_onBlur(ctrl) {
		
		var d = ctrl.value;
		
		if (d=='')	{
			ctrl.value='JJMMAAAA';
			return false;
			}

		// Si le champ est vide, pas de verif, pas de msg.
		if(d == '') return true;
		 
		// booleen indiquant si la date est valide ou non.
		var bool = true;

		// Variables jour/mois/année
		var jour;
		var mois;
		var annee;

		// On vérifie qu'il y a 2 séparateurs
		// ----------------------------------
		d = "" + d; // Caste en string
		resultat = d.split(/[\.\-\_\/]/);
		if(resultat.length==3){

			jour   = resultat[0];
			mois   = resultat[1];
			annee = resultat[2];

			// Si les valeurs ne sont pas numériques
			if(isNaN(jour) || isNaN(mois) || isNaN(annee)) bool = false;
			
			}
		else {
			// S'il n'y a pas 2 séparateurs, alors 
			// on prends les chiffres en considération
			// ---------------------------------------
			chiffres = d.match(/\d/g);
			
			if(chiffres){
				switch (chiffres.length) {
					case 8:
						jour  = chiffres[0] + chiffres[1];
						mois  = chiffres[2] + chiffres[3];
						annee = chiffres[4] + chiffres[5] + chiffres[6] + chiffres[7];
					break;
					case 6:
						jour  = chiffres[0] + chiffres[1];
						mois  = chiffres[2] + chiffres[3];
						annee = chiffres[4] + chiffres[5];
					break;
					case 4:
						jour  = chiffres[0]
						mois  = chiffres[1];
						annee = chiffres[2] + chiffres[3] ;
					break;
					default:
						// Erreur si longueur différente de 4,6 ou 8.
						// DEBUG alert('CASE DEFAULT = longueur différente de 4, 6 ou 8.');
						bool= false;
					break;
					} 
				}
			else{
					// Erreur pas de chiffres
					bool= false;
				}
			}

		// Si jour,mois,année valide
		if(bool){

			// On met le jour sur 2 chiffres s'il etait sur 1
			if(jour.length == 1) jour = "0" + jour;
			
			// On met l'annee sur 4 chiffres si elle etait sur 1
			if(mois.length == 1) mois = "0" + mois;
				
			// On met l'annee sur 4 chiffres si elle etait sur 2
			if(annee.length == 2){
				annee = (parseInt(annee,10) < 50)? '20' + annee : '19' + annee;	
				}

			// DEBUG alert('JOUR= ' + jour +' | ' + 'MOIS = ' + mois + ' | ' + 'ANNEE =  ' + annee  );
			
			// On reformate la valeur du controle.
			ctrl.value=jour + "/" + mois + "/" + annee;				
			
			// Vérification des valeurs jour, mois et année.
			// ---------------------------------------------
			
			// Mois entre 1 et 12
			if (mois < 1 || mois > 12) bool = false;
			
			// Mois entre 1 et 31
			if (jour < 1 || jour > 31) bool = false;
			
			// Mois a 31 jours
			if ((mois == 4 || mois == 6 || mois == 9 || mois == 11) && (jour == 31)) bool = false;
			    
			// Année
		  if(annee.length!=4)
		  	bool = false;
		  else {
				// Verif si février annees bissextiles
				if (mois == 2) {
				  var leap = (annee % 4 == 0 && (annee % 100 != 0 || annee % 400 == 0));
				  if (jour>29 || (jour == 29 && !leap)) bool = false;
				  }
		  		}
			}

		// Si la date n'est pas valide
		// ---------------------------
		if(!bool) {
			alert('Date invalide');
			ctrl.value="";
			ctrl.focus();
			return false;
			}
		return true;
		}

// ============================================================
// Fonction vérifiant que la valeur saisie est comprise entre
//  les bornes passées en paramètres - Evenement onBlur
// Renvoie true ou false
// ============================================================
function Verif_Bornes(ctrl,borneinf,bornesup) {
	// ctrl     -> control
	// borneinf -> borne inférieure
	// bornesup -> borne supérieure
	if (ctrl.value=='')	{
		ctrl.value=valdef;
		return false;
		}
	else {
		if ( (ctrl.value < borneinf) || (ctrl.value > bornesup) ){
			ctrl.focus();
			return false;
			}
		ctrl.value=ctrl.value;
		}
	return true;
}


// =========================================================
// Fonction concernant les champs dates - Evenement onKeyUp 
// ATTENTION PB de compatibilité avec certain navigateurs
// =========================================================
function date_onKeyUp(ctrl) {
	var strTest;
	strTest = ctrl.value;
	flag_ok = true;
	Verif_Numeric_plus(ctrl,'-');
	if ((strTest.length == 2||strTest.length == 5) && (event.keyCode!=8)) {
		var fin = strTest.substr(strTest.length-1,1)
		if(fin!='-') {
			ctrl.value +='-';
			return false;
			}
		}
	if(strTest.length == 10) {
		var jour = strTest.substr(0,2);
		if(jour.match(/-/g))flag_ok = false;
		day = parseInt(jour, 10);
		var mois = strTest.substr(3,2);
		if(mois.match(/-/g))flag_ok = false;
		var an = strTest.substr(6,4);
		if(an.match(/-/g))flag_ok = false;
		month = parseInt(mois, 10);
		var moisArray = new Array(13);
		moisArray[0] = 0;
		moisArray[1] = 31;
		moisArray[2] = 29;
		moisArray[3] = 31;
		moisArray[4] = 30;
		moisArray[5] = 31;
		moisArray[6] = 30;
		moisArray[7] = 31;
		moisArray[8] = 31;
		moisArray[9] = 30;
		moisArray[10] = 31;
		moisArray[11] = 30;
		moisArray[12] = 31;
		
		if( day > 0 && month > 0  && month <=12 && day <= moisArray[month] && an > 1900 && flag_ok==true) {
			ctrl.value=jour + '-' + mois + '-' + an;
			return true;
			}
		else {
			alert('Date invalide');
			ctrl.value='JJMMAAAA';
			ctrl.focus();
			return false;
			}
		}
	else
		{
		return false;
		}
	}

// ==============================================================
// Fonction concernant les champs cose postal - Evenement onBlur
// ==============================================================

function CodePostal_onBlur(ctrl){
	if ( (ctrl.value.length<5 && ctrl.value.length>0) || (isNaN(ctrl.value))) {
		alert('Code postal invalide');
		ctrl.value = "";
		ctrl.focus();
		}
	}

function verifNumericOnBLur(ctrl) {
	alert('OK');
	if(isNaN(ctrl.value)) {
		alert('Ce champ ne peut contenir que des chiffres');
		ctrl.value="";
		ctrl.focus();
		return false;
		}
	return true;
}

// ===================================================
// Fonctions qui vérifient la valeur saisie sur onblur
// ===================================================
	
// uniquement des lettres
function verifLettres(ctrl){
	var expression = /^([a-zA-Z])+$/;
	var msg = "Ce champ doit contenir uniquement des lettres";
	verif(ctrl,expression,msg);
	};
	
// numérique entière
function verifChiffres(ctrl){
	// On supprime tout les caracteres blancs
	ctrl.value = ctrl.value.replace(/ /g, '');
	var expression = /^[0-9]+$/;
	var msg = "Ce champ doit contenir uniquement des chiffres";
	verif(ctrl,expression,msg);
	};

// numérique décimale
function verifDecimal(ctrl){
	// On supprime tout les caracteres blancs
	ctrl.value = ctrl.value.replace(/ /g, '');
	// Le séparateur est le point
	ctrl.value = ctrl.value.replace(',','.');
	var expression = /^([0-9])+([\.][0-9]{1,2})?$/;
	var msg = "Ce champ doit contenir uniquement des chiffres";
	verif(ctrl,expression,msg);
	};
	
// Fonction générique de verification de la valeur d'un champ sur onblur
// Parametres : le controle / l'expression régulière / le message d'erreur
function verif(ctrl,expression,msg){
	var valeur = ctrl.value;
	if ( valeur.length > 0 ) {
		// Si l'adresse est invalide
		if (!( expression.test(valeur))) {
			alert(msg);
			ctrl.value = '';
			ctrl.focus();
			}
		}
  };

// ===================================================================
// Fonction qui oblige la saisie de caracteres de type 'type' (RegExp)
// ou un des caractères contenu dans la chaine 'cars'
// dans un champ texte 'ctrl'
// à mettre dans l'évènement onKeyUp
// ===================================================================
function Verif_char(ctrl,type, cars){
	if(cars!=null) {
		resultat = ctrl.value.match(eval('/\\'+type+'|[' + cars + ']/g'));
		}
	else {
		resultat = ctrl.value.match(eval('/\\'+type+'/g'));
		}

	ctrl.value = '';
	if(resultat) {
		for(i=0 ; i < resultat.length ; i++)
			ctrl.value += resultat[i];
		}
	}

// ============================================================
// Fonction qui oblige la saisie de chiffres dans un champ texte
// à mettre dans l'évènement onKeyUp
// ============================================================
function Verif_Numeric(ctrl) {
	Verif_char(ctrl,'d');
	}

 function Verif_Numeric_plus(ctrl,cars) {
	Verif_char(ctrl,'d', cars);
	}

 function Verif_Decimal(ctrl) {
	Verif_char(ctrl,'d','.,');	
	// on remplace , par . pour les calculs.
	res = ctrl.value.replace(',','.');

	var cpt=0;
	var nbdec=0;

	ctrl.value = '';	
	for(i=0 ; i < res.length ; i++){
		car = res.substr(i,1)
		// si virgule
		if (car=='.') {
			cpt++;
			if (cpt < 2 ) ctrl.value += car;
			}
		else {
		// si décimale ...
			if (cpt > 0 ){
				nbdec++;
				// pas plus de 2
				if (nbdec < 3) ctrl.value += car;
				}
			else {
				ctrl.value += car;
				}
			}		
		}
	}
	
 function verifDecimalMICM(ctrl) {
	Verif_char(ctrl,'d','.,');	
	// on remplace , par . pour les calculs.
	res = ctrl.value.replace(',','.');

	var cpt=0;
	var nbdec=0;

	ctrl.value = '';	
	for(i=0 ; i < res.length ; i++){
		car = res.substr(i,1)
		// si virgule
		if (car=='.') {
			cpt++;
			if (cpt < 4 ) ctrl.value += car;
			}
		else {
		// si décimale ...
			if (cpt > 0 ){
				nbdec++;
				// pas plus de 2
				if (nbdec < 5) ctrl.value += car;
				}
			else {
				ctrl.value += car;
				}
			}		
		}
	}
	
// ============================================================
// Fonction qui oblige la saisie de lettre dans un champ texte
// à mettre dans l'évènement onKeyUp
// ============================================================
function Verif_Alpha(ctrl) {
	Verif_char(ctrl,'D');
	ctrl.value = ctrl.value.toUpperCase(); // Lettre clé du N°adh. en majuscule.
	}

	
// ======================================================
//	Fonction qui oblige la saisie de d'une adresse mail		
//	(format boite@provideur.com)
//	à mettre dans l'évènement onBlur 
// =====================================================
function Mail_onBlur(ctrl) {
	// On supprime tout les caracteres blancs
	ctrl.value = ctrl.value.replace(/ /g,'');
	if ( ctrl.value.length > 0 ) {
		var mail = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-zA-Z]{2,4}$/;
		// Si l'adresse est invalide 
		if (!( mail.test(ctrl.value))) {
			alert("L'adresse e-mail que vous avez saisie est invalide");
			//ctrl.value = '';
			ctrl.focus();
			}
		}
	}

// ==================================================================================================
// Vide le presse-papier ( afin d'interdir le copier-coller lors de la confirmation d'adresse e-mail
// ==================================================================================================
function viderPressePapier(){
	window.clipboardData.setData('Text', ''); 
	}
	
// =============================================================================
// Vérifie que l'adresse mail et l'adresse mail de confirmation sont identiques.
// =============================================================================
function confirmationMail(adresse1,adresse2){
	if (adresse1 != adresse2) {
		alert('Incohérence entre l\'adresse e-mail et l\'adresse e-mail de confirmation.');
		return false;
		}
	return true;
	}