// Fonctions associées à la gestion de formulaire
//////////////////////////////////
// Gestion de formulaire :
// -----------------------
// - valideFormulaire : traitement de l'action sur formulaire
// - controleFormulaire : Contrôle des champs du formulaire
// - controleChamp : Contrôle individuel de champ de formulaire
// - soumetFormulaire : soumission du formulaire avec message d'erreur
//////////////////////////////////
// Validation de formulaire
//////////////////////////////////
function valideFormulaire(bouton)
{
	var form=bouton.form;
	
	form.hf_action.value=bouton.name;
	if (bouton.name=="btEfface")
	{	// Effacement de l'enregistrement
		var message="Effacer cette fiche ?";
		if (confirm(message)) soumetFormulaire(form);
	}
	else if (bouton.name=="btValide")
	{	// validation du formulaire
		ctrl = form.hf_valide_form ? parseInt(form.hf_valide_form.value) : true;
		soumetFormulaire(form,controleFormulaire(form),ctrl);
	}
	else
	{	// autre action : gérée dans la fiche du formulaire
		Controle(bouton)
	}
}
//////////////////////////////////
// Contrôle des champs du formulaire
//////////////////////////////////
function controleFormulaire(form)
{
	var param, ctrl, args;
	var err="",sel;

	// Recherche d'un "tabbed panel" dans le formulaire pour les afficher successivement
	// Les champs non visibles ne sont pas contrôlés
	var nbpanels=1;
	var tp = getElementsByClassName("TabbedPanels", "div", form);
	if (tp.length>1)
	{
		eval ("var tpp="+tp[0].id);
		nbpanels = tpp.getTabbedPanelCount();
		var curpanel = tpp.currentTabIndex;
	}
	for (var ipanel=0;ipanel<nbpanels;ipanel++)
	{
		if (nbpanels>1) tpp.showPanel(ipanel);
		for (var i=0;i<form.length;i++)
		{
			sel = "";
			var champ = form.elements[i];
			if ((ctrl=champ.getAttribute("formate"))!=null)
			{	// Champs à formater avant contrôle
				formate(champ,ctrl);
			}
			if ((ctrl=champ.tagName=="SELECT" && champ.getAttribute("multiple"))=="multiple")
			{	// Champs à formater avant contrôle
				for (j=0;j<champ.length;j++) { if (champ.options[j].selected) sel+="|"+champ.options[j].value; }
				if (!(hf=findObj("hf_"+champ.name)))
				{
					var hf = document.createElement("input");
					hf.type = 'hidden';
					hf.name = "hf_"+champ.name;
					form.appendChild(hf);
				}
				hf.value=sel.substring(1);
			}
			if ((ctrl=champ.getAttribute("ctrl"))!=null
				&& (champ.getAttribute("disabled")==null || champ.getAttribute("disabled")=="")
				&& (champ.getAttribute("readonly")==null || champ.getAttribute("readonly")=="")
				&& champ.offsetHeight>0)
			{	// On ne contrôle pas les champs invisibles, disabled ou readonly
				err += controleChamp(champ,ctrl);
			}
		}
	}
	if (nbpanels>1) tpp.showPanel(curpanel);
	return err !="" ? "<ul>"+err+"</ul>" : "";
}

//////////////////////////////////
// Contrôle des champs de saisie
//////////////////////////////////
function controleChamp(champ,ctrl)
{
	var i;
	var args = ctrl.split(";");
	var parent = "", nom = "";
	var ok = true;
	var err = "";
	
	// on ne contrôle pas les champs cachés
	if(champ.style.display=="none" || champ.parentNode.style.display=="none") return "";
	switch (champ.tagName)
	{	// Analyse du champ
		case "INPUT":
			switch (champ.type)
			{
				case "password":
				case "text":
					for (i=0; i<args.length; i++)
					{
						ok2 = true;
						switch (args[i])
						{
							case 'chk':		// champ obligatoire si le champ défini par l'arguement suivant est visible
								
							case 'vide':	// champ obligatoire
								ok2 = champ.value.length>0;
								err+= !ok2 ? " : saisie obligatoire" : "";
								break;
							case 'date':	// date correcte
								var date = champ.value.split("/");
								if (date.length==3)
								{
									var nbJours = new Array('',31,(date[2]%4 == 0 && date[2]%100 > 0 || date[2]%400 == 0 ) ? 29 : 28,31,30,31,30,31,31,30,31,30,31);
									ok2 = (date[1]>0 && date[1] < 13) && (date[0]>0 && date[0]<=nbJours[Math.round(date['1'])]);
								}
								else if (champ.value!="")
								{
									ok2 = false;
								}
								err+= !ok2 ? " : date incorrecte" : "";
								break;
							case 'mail':	// mail correct
								var mail = /^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]+@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/;
								if (champ.value.length>0) ok2 = mail.test(champ.value);
								err+= !ok2 ? " : adresse incorrecte" : "";
								break;
							default:		// longueur de champ imposée
								var bornes = args[i].split(",");
								if (!isNaN(args[i]) && champ.value.length>0)
								{
									ok2 = trim(champ.value).length==args[i];
									err+= !ok2 ? " : nombre de caract&egrave;res incorrect ("+args[i]+")" : "";
								}
								else if (bornes.length>1 && trim(champ.value).length>0)
								{
									bornes[1]=parseInt(bornes[1]);
									bornes[2]=parseInt(bornes[2]);
									switch(bornes[0])
									{
										case "val":	// Bornes dumériques
											ok2 = ((bornes[1]!="" && parseInt(champ.value)>=bornes[1]) || bornes[1]=="");
											ok2&= ((bornes[2]!="" && parseInt(champ.value)<=bornes[2]) || bornes[2]=="");
											err+= !ok2 ? " : valeur incorrecte ("
												+ (bornes[1]=="" ? "maximum "+bornes[2] : (bornes[2]=="" ? "minimum "+bornes[1] : "entre "+bornes[1]+" et "+bornes[2]))
												+ ")" : "";
											break;
										case "len":	// Bornes de longueur
											ok2 = ((bornes[1]!="" && champ.value.length>=bornes[1]) || bornes[1]=="");
											ok2&= ((bornes[2]!="" && champ.value.length<=bornes[2]) || bornes[2]=="");
											err+= !ok2 ? " : nombre de caract&egrave;res incorrect ("
												+ (bornes[1]=="" ? "maximum "+bornes[2] : (bornes[2]=="" ? "minimum "+bornes[1] : "entre "+bornes[1]+" et "+bornes[2]))
												+ ")" : "";
											break;
									}
								}
								else if (args[i][0]=="=")
								{	// égalité entre 2 champs
									var form=champ.form;
										var autre = args[i].substring(1);
										ok2 = champ.value==form.elements[autre].value;
										err+= !ok2 ? " : valeur incorrecte" : "";
								}
						}
						ok &= ok2;
					}
					break;
				case "radio":
					// ensemble des champs du groupe de radio-boutons
					parent = champ.parentNode;
					var champ_radio = champ.form.elements[champ.name];
					ok = false;
					var nom0 = chercheLabel(champ_radio[0].name);
					for (var j=0; j<champ_radio.length;j++)
					{
						if (champ_radio[j].checked) ok = true;
						if (nom0=="") nom += chercheLabel(champ_radio[j].id) + "/";
					}
					nom = nom0 == "" ? nom : nom0;
					err = !ok ? " : choix obligatoire" : "";
					break;
				case "checkbox":
					parent = champ.parentNode;
					ok = champ.checked;
					err = !ok ? " : choix obligatoire" : "";
					break;
				case "file":
					for (i=0; i<args.length; i++)
					{
						ok2 = true;
						parent=champ.parentNode;
						switch (args[i])
						{
							case 'vide':	// champ obligatoire
								ok2 = champ.value.length>0;
								err+= !ok2 ? " : fichier obligatoire" : "";
								break;
							default:	// nom de fichier
								if(champ.value.length!=0)
								{
									if (!isNaN(args[i]))
									{	// numérique : longueur max du nom
										ok2 = basename(trim(champ.value)).length<=args[i];
										err+= !ok2 ? " : nom de fichier trop long ("+args[i]+" car. max)" : "";
									}
									else
									{	// extension
										ext=champ.value.substring(champ.value.lastIndexOf(".")+1).toLowerCase();
										ok2 = args[i].match(ext) ? true : false;
										err+= !ok2 ? " : type de fichier incorrect ("+args[i]+")" : "";
									}
								}
						}
						ok &= ok2;
					}
			}
			break;
		case "SELECT":
			ok = champ.value!=0;
			err = !ok ? " : choix obligatoire" : "";
			break;
		case "TEXTAREA":
			ok = champ.value.length>0;
			err = !ok ? " : saisie obligatoire" : "";
			break;
	}

	obj = (parent!="") ? parent : champ;			
	if (!ok)
	{
		// Champ en erreur : mise en évidence
		ajouteClasse(obj,'erreur');
		// Si champ radio, on parcourt tous les radioboutons
		if (champ.tagName=="INPUT" && champ.type=="radio")
		{
			var champ_radio = champ.form.elements[champ.name];
			for (var j=0; j<champ_radio.length;j++)
			{
				ajouteClasse(champ_radio[j].parentNode,'erreur');
			}
		}
		// Recherche du label s'il existe
		err = "<li>" + (nom=="" ? chercheLabel(champ.name) : nom) + err + "</li>";
		return err;
	}
	else
	{
		// pas d'erreur
		enleveClasse(obj,'erreur');
		return "";
	}
}
//////////////////////////////////
// Submit avec affichage image d'attente
//////////////////////////////////
function soumetFormulaire(docu)
{
	// args[0] - docu : formulaire
	// args[1] - err  : champs en erreur
	// args[2] - conf : confirmation d'enregistrement si présence d'erreurs
	var args=soumetFormulaire.arguments;
	var ok = (args.length > 1 ? args[1]=="" : true);
	var valide = (args.length > 2 ? args[2] : false);
	var message = (valide ? "Merci de corriger ou compl&eacute;ter votre saisie :" : "Le formulaire est incomplet ou comporte des erreurs.\nEnregistrer tout de m&ecirc;me ?")
				+ (args.length > 1 ? "<ul>"+args[1]+"</ul>" : "");
	if (!ok && !valide) ok = confirm(message);
	if (ok)
	{
		showHideLayers('wait','','show');
		docu.submit();
	}
	else if (valide)
	{
		alerte(message);
	}
}

//////////////////////////////////
// Effacement du statut "erreur" sur un champ de saisie
//////////////////////////////////
function effaceErreur(champ)
{
	switch (champ.tagName)
	{	// Analyse du champ
		case "INPUT":
			switch (champ.type)
			{
				case "password":
				case "text":
					enleveClasse(champ,'erreur');
					break;
				case "radio":
					// ensemble des champs du groupe de radio-boutons
					var champ_radio = champ.form.elements[champ.name];
					for (var j=0; j<champ_radio.length;j++)
					{
						enleveClasse(champ_radio[j].parentNode,'erreur');
					}
					break;
				case "checkbox":
				case "file":
					enleveClasse(champ.parentNode,'erreur');
					break;
			}
			break;
		case "SELECT":
		case "TEXTAREA":
			enleveClasse(champ,'erreur');
			break;
	}
}

//////////////////////////////////
// Recherche du <label> associé à un champ de formulaire
//////////////////////////////////
function chercheLabel(id)
{
	var obj = document.getElementsByTagName("LABEL");
	for (label in obj)
	{
		if (obj[label].htmlFor==id) return obj[label].innerHTML
	}
	return "";
}

//////////////////////////////////
// Filtre sur saisie de caractères
//////////////////////////////////
function filtre (e,type) {
  var e = (e) ? e : ((window.event) ? window.event : null);
	switch (navigateur.name)
	{
		case 'firefox':
			charCode = (e.charCode) ? e.charCode : 0;
			keyCtrl = charCode==0 || e.ctrlKey;
			break;
		case 'msie':
		case 'chrome':
			charCode=e.keyCode;
			keyCtrl = false;
			break;
		default:
			charCode=e.keyCode;
			keyCtrl = false;
			break;
	}
  keyNum = (charCode>=48 && charCode<=57);
  keyFloat = keyNum || charCode==44 || charCode==46;
  keyTel = keyNum || charCode==32;
  keyDate = keyNum || charCode==47;
  keyHexa = keyNum || (charCode>=65 && charCode<=70) || (charCode>=97 && charCode<=102);
  keyAlpha = keyNum || (charCode>=65 && charCode<=90) || (charCode>=97 && charCode<=122) || (charCode>=224 && charCode<=252) || charCode==32;
  
  if (!keyCtrl && ((type=="num" && !keyNum) || (type=="float" && !keyFloat) || (type=="tel" && !keyTel) || (type=="date" && !keyDate) || (type=="hexa" && !keyHexa) || (type=="alpha" && !keyAlpha)))
  {
  	switch (navigateur.name)
	{
		case 'firefox':
			e.preventDefault();
			break;
		case 'msie':
		case 'chrome':
			e.returnValue = false;
			break;
		default:
			e.returnValue = false;
			break;
	}
    return false;
  }
}

//////////////////////////////////
// Formatage de champs
//////////////////////////////////
function formate (champ,type)
{
	var reg=new RegExp("( )", "g");
	valeur=champ.value.replace(reg,"");
  	switch (type)
	{
		case 'siret':
			var reg=new RegExp("([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{5})");
			if (valeur.length==14) champ.value=valeur.replace(reg,"$1 $2 $3 $4");
			break;
		case 'tel':
			var reg=new RegExp("([0-9]{2}).?([0-9]{2}).?([0-9]{2}).?([0-9]{2}).?([0-9]{2})");
			if (valeur.length>=10) champ.value=valeur.replace(reg,"$1 $2 $3 $4 $5");
			break;
		case 'float':
			champ.value = isNaN (parseFloat(champ.value)) ? "" : parseFloat(champ.value).toFixed(2);
			break;
	}
}
//////////////////////////////////
// Gestion de liste à sélection multiple : bascule d'une liste vers l'autre
//////////////////////////////////
function ajouteSelectMultiple(id,index)
{
	if (index>0)
	{
		lstAvant=findObj("ch_avant_"+id);
		lstApres=findObj("ch_apres_"+id);
		hfApres=findObj("hf_apres_"+id);
		
		var o=new Option(lstAvant.options[index].text,lstAvant.options[index].value);
		lstApres.options[lstApres.options.length]=o;
		lstAvant.options[index]=null;
	
		hfApres.value = "";
		for (i=0;i<lstApres.options.length;i++)
		{
			hfApres.value += lstApres.options[i].value+",";
		}
	}
}

function enleveSelectMultiple(id,index)
{
	if (index>=0)
	{
		lstAvant=findObj("ch_avant_"+id);
		lstApres=findObj("ch_apres_"+id);
		hfApres=findObj("hf_apres_"+id);
		
		
		var o=new Option(lstApres.options[index].text,lstApres.options[index].value);
		lstAvant.options[lstAvant.options.length]=o;
		lstApres.options[index]=null;
		
		hfApres.value = "";
		for (i=0;i<lstApres.options.length;i++)
		{
			hfApres.value += lstApres.options[i].value+",";
		}
	}
}
//////////////////////////////////
// Effacement pièce jointe - cas de pièces jointes multiples
//////////////////////////////////
function EffacePJ(enreg,objet)
{
	if (confirm("Voulez-vous effacer la pièce jointe ?"))
	{
		var ligne=objet.parentNode;
		while(ligne.parentNode.nodeName!="TBODY") {
			ligne=ligne.parentNode;
		}
		// Suppression de la ligne du tableau
		ligne.parentNode.deleteRow(ligne.rowIndex);
		
		MajAjax(ressources+"php/FonctionsAjax.php","action=EffacePJ&enreg="+enreg);
	}
}
//////////////////////////////////
// Ouvre une fenêtre avec le lien spécifié
//////////////////////////////////
function atteintUrl(champ)
{
	var lien=champ.value;
	if (lien!="") window.open(lien.match("://") ? lien : "http://"+lien,"_blank");
}
//////////////////////////////////
// Envoi d'un mail
//////////////////////////////////
function envoiMail(champ)
{
	var lien=champ.value;
	if (lien!="") window.open("mailto:"+lien,"_parent");
}

