/*
	FONCTION DE VERIFICATION DE FORMULAIRE
	UTILISATION: ETAPE 1 : Placer la condition onsubmit="return verifForm(this)" dans la balise form du formulaire.
				 ETAPE 2 : Placer préfixe(voir legende) et title(pour le message d'erreur) correspond au champ à vérifier dans le formulaire.
		LEGENDE: va__ = Valeur alphanumérique
				 vt__ = Valeur Alpha, de A à Z comprenant des : (- ' espace)
				 vn__ = Valeur Numérique
				 vm__ = E-mail
				 vp__ = Numéro de téléphone de 10 caractère comment avec ou sans indicatif (+33) comprenan séparation des nombres par (espace)
				 cp__ = Code Postale
				 vr__ = Au moins un bouton Radio coché
				 vc__ = Au moins une checkbox cochée
*/
function trim(valeur)
{
	valeur = valeur.replace(/^\s*|\s*$/,'');
	return valeur;
}

function verifAlphanum(objet, valeur)
{
	var verifVide = trim(valeur);
	if (verifVide == '')
	{
		return {element:objet, boo:false};
	}
	else
	{
		return {element:objet, boo:true};
	}
}

function verifTexte(objet, valeur)
{
	if (valeur.search(/^[a-zA-Zéèàêâùïüëç\-\'\s]{1,}$/) == -1)
	{
		return {element:objet, boo:false};
	}
	else
	{
		return {element:objet, boo:true};
	}
}

function verifNombre(objet, valeur)
{
	if (valeur.search(/^[0-9]{1,}$/) == -1)
	{
		return {element:objet, boo:false};
	}
	else
	{
		return {element:objet, boo:true};
	}
}

function verifMail(objet, valeur)
{
	if (valeur.search(/^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,4}$/) == -1)
	{
		return {element:objet, boo:false};
	}
	else
	{
		return {element:objet, boo:true};
	}
}

function verifPhone(objet, valeur)
{
	if (valeur.search(/^((0[1-9])|(\+[0-9]{3}))((([0-9]{2}){4})|((\s[0-9]{2}){4}))$/) == -1)
	{
		return {element:objet, boo:false};
	}
	else
	{
		return {element:objet, boo:true};
	}
}

function verifCodepostal(objet, valeur)
{
	if (valeur.search(/^[0-9]{5}$/) == -1)
	{
		return {element:objet, boo:false};
	}
	else
	{
		return {element:objet, boo:true};
	}
}

function verifRadio(formulaire, nomRadio, tabDejaFaits)
{
	var traite = false;
	for(i = 0 ; i < tabDejaFaits.length ; i++)
	{
		if(tabDejaFaits[i] == nomRadio)
		{
			traite = true;
		}
	}
	if(!traite)
	{
		tabDejaFaits.push(nomRadio);
		for (var i = 0 ; i < formulaire[nomRadio].length ; i++)
		{
			if (formulaire[nomRadio][i].checked)
			{
				return {element:formulaire[nomRadio][i], boo:true};			
			}
		}
		return {element:formulaire[nomRadio][0], boo:false};
	}
	else
	{
		return {element:formulaire[nomRadio][0], boo:null};
	}
}

function verifCheckBox(formulaire, nomCB, chekedCB, tabDejaFaits, CBaverifier, nbCbByGroup, eltComplet)
{
	var traite = false;
	for(j = 0 ; j < tabDejaFaits.length ; j++)
	{
		if(tabDejaFaits[j].nom == nomCB)
		{
			traite = true;
			break;
		}
	}
	
	// SI CETTE CB N'A JAMAIS ETE TRAITEE 
	if(!traite && nomCB.substr(0,4) == 'vc__')
	{
		var GroupCheckBox = nomCB.substr(4,3);
		
		if(!chekedCB)
		{
			tabDejaFaits.push({group:GroupCheckBox, nom:nomCB, element:eltComplet, check:false});
		}
		else
		{
			tabDejaFaits.push({group:GroupCheckBox, nom:nomCB, element:eltComplet, check:true});
		}
	}
	
	// ON PARCOURS LE TABLEAU CONTENANT LE NB DE CB PAR GROUPE
	for(j = 0 ; j < nbCbByGroup.length ; j++)
	{
		// POUR LE GROUPE EN COURS ...
		if(nbCbByGroup[j].group == GroupCheckBox)
		{
			// ... ON ANALYSE COMBIEN DE CB ONT DEJA ETE TRAITEES
			var countDejaFait = 0;
			for(k = 0 ; k < tabDejaFaits.length ; k++)
			{
				if(tabDejaFaits[k].group == nbCbByGroup[j].group)
				{
					countDejaFait++;
				}
			}
			
			// LORSQUE TOUTES LES CB D'UN GROUPE ONT ETE TRAITEES ...
			if(countDejaFait == nbCbByGroup[j].nbElement)
			{
				// ... ON VERIFIE SI AU MOINS UNE CB EST COCHEE
				var countErreurs = 0;
				for(k = 0 ; k < tabDejaFaits.length ; k++)
				{
					if(tabDejaFaits[k].group == nbCbByGroup[j].group && tabDejaFaits[k].check == true)
					{
						countErreurs = 0;
						break;
					}
					else
					{
						countErreurs++;	
					}
				}
				// SI IL N'Y A PAS DE CB COCHEE ON RETURN UN FALSE 
				if(countErreurs != 0)
				{
					return {element:eltComplet, boo:false};	
				}
				// SINON ON RETURN UN TRUE
				else
				{
					return {element:eltComplet, boo:true};	
				}
			}
		}
	}
	return {element:eltComplet, boo:null};	
}

function verifForm(formulaire)
{				
	var checkErrors = [];
	var msgErrors = '';
	var checkRadiosTraites = [];
	var tabCheckBox = [];
	var nbCheckBoxByGroup = [];
	var checkCheckBoxTraites = [];
	
	// ON STOCK LES NOMS DES CB ET LEUR GROUPE DANS UN TABLEAU
	for(i = 0 ; i < formulaire.length ; i++)
	{
		var isCB = formulaire[i].name.substr(0,4);
		if (isCB == 'vc__')
		{
			var groupCB = formulaire[i].name.substr(4,3);
			tabCheckBox.push({group:groupCB, composant:formulaire[i]});
		}
	}
	
	// ON STOCK LE NB DE CHECKBOX PAR GROUPE DANS UN TABLEAU
	var count = 0;
	var groupEnCour = '';
	for(i = 0 ; i < tabCheckBox.length ; i++)
	{
		if (i == 0)
		{
			groupEnCour = tabCheckBox[i].group;
		}
		
		if(i != (tabCheckBox.length - 1))
		{
			if (groupEnCour == tabCheckBox[i].group)
			{
				count++;
			}
			else
			{
				nbCheckBoxByGroup.push({group:groupEnCour, nbElement:count});
				groupEnCour = tabCheckBox[i].group;
				count = 1;	
			}
		}
		else if(i == (tabCheckBox.length - 1))
		{
			count++;
			nbCheckBoxByGroup.push({group:groupEnCour, nbElement:count});	
		}
	}
		
	// ON PARCOURS TOUS LES ELEMENTS DU FORMULAIRE
	for(i = 0 ; i < formulaire.length ; i++)
	{
		var typeVerif = formulaire[i].name.substr(0,4);
		
		switch(typeVerif)
		{
			case 'va__'	:	checkErrors.push(verifAlphanum(formulaire[i], formulaire[i].value));
							break;
			case 'vt__'	:	checkErrors.push(verifTexte(formulaire[i], formulaire[i].value));
							break;
			case 'vn__' :	checkErrors.push(verifNombre(formulaire[i], formulaire[i].value));
							break;
			case 'vr__' :	checkErrors.push(verifRadio(formulaire, formulaire[i].name, checkRadiosTraites));
							break;
			case 'vc__' :	checkErrors.push(verifCheckBox(formulaire, formulaire[i].name, formulaire[i].checked, checkCheckBoxTraites, tabCheckBox, nbCheckBoxByGroup, formulaire[i]));
							break;
			case 'vm__' :	checkErrors.push(verifMail(formulaire[i], formulaire[i].value));
							break;
			case 'vp__' :	checkErrors.push(verifPhone(formulaire[i], formulaire[i].value));
							break;
			case 'cp__' :	checkErrors.push(verifCodepostal(formulaire[i], formulaire[i].value));
							break;
			default :		break;
		}
	}
	
	for(i = 0 ; i < checkErrors.length ; i++)
	{
		if(checkErrors[i].boo == false)
		{
			msgErrors += 'Le champs "' + checkErrors[i].element.title + '" est incorrect.\n';
		}
	}
	
	if(msgErrors == '')
	{
		return true;
	}
	else
	{
		alert(msgErrors);
		return false;
	}
}