// 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.match("btEfface_image_"))
	{	// Effacement de l'image
		if (confirm(bouton.title+" ?")) soumetFormulaire(form);
	}
	else if (bouton.name.match("btEfface_fichier_"))
	{	// Effacement du fichier
		if (confirm(bouton.title+" ?")) 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, hf, div_langue;
	var champs = new Array;
	var langues_inactives = new Array;

	// Affichage de toutes les langues
	obj_langue = getElementsByClassName('boLangue','li');
	if (obj_langue.length>0)
	{
		for (i=0;i<obj_langue.length;i++)
		{
			lan = obj_langue[i].id.substring(obj_langue[i].id.lastIndexOf("_"));
			if (!aClasse(obj_langue[i],'active'))
			{	// Mémorisation langues inactives
				langues_inactives[langues_inactives.length] = lan;
			}
		}
		div_langue = getElementsByClassName('input_langue');
		for (i=0;i<div_langue.length;i++)
		{
			for (j=0;j<langues_inactives.length;j++)
			{	// Affichage langues inactives
				if (div_langue[i].id.substring(div_langue[i].id.lastIndexOf("_"))==langues_inactives[j]) showHideLayers(div_langue[i].id,'','show');
			}
		}
	}

	// 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;
		var tabs = tpp.getTabs();

	}
	for (var ipanel=0;ipanel<nbpanels;ipanel++)
	{
		if (nbpanels>1)
		{
			if (tabs[ipanel].offsetHeight==0) continue;
			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)))
				if (!(hf=form.elements["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
				if (nbpanels>1)
				{
					if (!champs[champ.id])
					{
						var tmp = new Array;
						tmp['panel'] = ipanel;
						tmp['err'] = controleChamp(champ,ctrl);
						champs[champ.id] = tmp;
					}
					else
					{	// Champ déjà rencontré : n'appartient pas à un panel
						champs[champ.id]['panel'] = -1;
					}
				}
				else
				{
					err += controleChamp(champ,ctrl);
				}
			}
		}
	}
	if (nbpanels>1)
	{
		var tmp_err = new Array;
		for (ierr in champs)
		{
			ipanel = champs[ierr]['panel'];
			if (champs[ierr]['err']!="")
			{
				if (!tmp_err[ipanel]) tmp_err[ipanel] = "";
				tmp_err[ipanel]+= champs[ierr]['err'];
			}
		}
		for (ipanel in tmp_err)
		{
			err += ipanel>=0 ? "<li>Onglet "+tabs[ipanel].innerHTML+" :<ul>"+tmp_err[ipanel]+"</ul></li>"
							 : tmp_err[ipanel];
		}
		tpp.showPanel(curpanel);
	}
	// Masquage langues inactives
	if (div_langue)
	{
		for (i=0;i<div_langue.length;i++)
		{
			for (j=0;j<langues_inactives.length;j++)
			{
				if (div_langue[i].id.substring(div_langue[i].id.lastIndexOf("_"))==langues_inactives[j]) showHideLayers(div_langue[i].id,'','hide');
			}
		}
	}
	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'argument 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(Number(champ.value))>=bornes[1]) || bornes[1]=="");
											ok2&= ((bornes[2]!="" && parseInt(Number(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" : "";
								}
								else if (args[i][0]=="|")
								{	// au moins un des champs de la liste est non vide
									ok2 = champ.value.length>0;
									if (!ok2)
									{
										var champs = args[i].split("|");
										var form = champ.form;
										var noms = "";
										for (var j=1; j<champs.length;j++)
										{
											if (form.elements[champs[j]].value!="") ok2 = true;
											noms += "/"+chercheLabel(form.elements[champs[j]].id);
										}
										err+= !ok2 ? noms+" : Saisissez au moins une valeur" : "";
									}
								}
						}
						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;
					if (args[0] && args[0][0]=="|")
					{	// Groupe de cases à cocher
						ok = champ.checked;
						if (!ok)
						{
							var champs = args[0].split("|");
							var form = champ.form;
							var noms = "";
							for (var j=1; j<champs.length;j++)
							{
								if (form.elements[champs[j]].checked) ok = true;
								noms += "/"+chercheLabel(form.elements[champs[j]].id);
							}
							err+= !ok ? noms+" : Cochez au moins une case" : "";
						}
					}
					else
					{
						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]+")" : "";
									}
									// Taille du fichier
									// alert(champ.files[0].size);
								}
						}
						ok &= ok2;
					}
			}
			break;
		case "SELECT":
			switch (args[0])
			{
				case 'vide':	// champ obligatoire
					ok = champ.value!=0;
					err = !ok ? " : choix obligatoire" : "";
					break;
				case 'multi':	// champ obligatoire
					ok = champ.length!=0;
					err = !ok ? " : choix obligatoire" : "";
					break;
			}
			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(form)
{
	// args[0] - form : 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 ? args[1] : "");
	if (!ok && !valide) ok = alerte(message,"document."+form.name+".submit()");
	if (ok)
	{
		showHideLayers('wait','','show');
		form.submit();
	}
	else if (valide)
	{
		alerte(message);
	}
}

//////////////////////////////////
// Effacement du statut "erreur" sur un champ de saisie
//////////////////////////////////
function effaceErreur(champ)
{
	if (!champ.form) return;
	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;
	}
}
//////////////////////////////////
// Vérification adresse mail n'existe pas
//////////////////////////////////
function VerifieMailExiste(champ,table,tag,enreg)
{
	if (champ.value.length>0) MajAjax(ressources+"php/FonctionsAjax.php","VerifieMailExiste","enreg="+enreg+"&table="+table+"&tag="+tag+"&champ="+champ.id+"&form="+champ.form.name+"&mail="+champ.value);
}

//////////////////////////////////
// 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)
		{	// Recherche langue associée
			if (aClasse(obj[label],"label_langue"))
			{
				return obj[label].innerHTML+" ("+id.substring(id.lastIndexOf("_")+1)+")";
			}
			else
			{
				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)
	{
		var lstAvant=findObj(id+"_avant");
		var lstApres=findObj(id+"_apres");
		var hfApres=findObj("hf_"+id+"_apres");
		
		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)
	{
		var lstAvant=findObj(id+"_avant");
		var lstApres=findObj(id+"_apres");
		var hfApres=findObj("hf_"+id+"_apres");

		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","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)
{
	if (!champ.value) champ=findObj(champ);
	var lien=champ.value;
	if (lien!="") window.open("mailto:"+lien,"_parent");
}
//////////////////////////////////
// Gestion de liste : ajout d'un élément dans un formulaire de saisie
//////////////////////////////////
// Nouvelle entrée de liste, appelé uniquement depuis le formulaire de gestion de liste
//////////////////////////////////
function NouvelleListe(form,table)
{
	var champ=form.elements["ch_l_"+table];
	champ.selectedIndex = champ.size>0 ? -1 : 0;
	showHideLayers("bo_btEfface_"+table,"","hide","bo_btNouveau_"+table,"","hide","bo_btOrdH_"+table,"","hide","bo_btOrdB_"+table,"","hide");

	var prem=true;
	for (var i=0;i<form.length;i++)
	{	// Champs texte dans chaque langue
		var text = form.elements[i];
		if (text.tagName=="INPUT" && text.type=="text")
		{
			text.value="";
			if (prem) text.focus();
			prem = false;
		}
	}

}
//////////////////////////////////
// Chargement d'une entrée de liste, appelé depuis le formulaire de gestion de liste ou depuis un champ multilingue
//////////////////////////////////
function ChargeListe(champ,table,indice)
{
	var form = champ.form;
	var enreg = champ.options[champ.selectedIndex].value;
	if (enreg>0)
	{
		// affichage des données de la liste
		var argu = "enreg="+enreg+"&form="+form.name+"&table="+table+"&indice="+indice;
		showHideLayers("bo_btEfface_"+table,"","show","bo_btNouveau_"+table,"","show","bo_btOrdH_"+table,"","show","bo_btOrdB_"+table,"","show");
		// modifie est VRAI pour la page de gestion des listes, FAUX pour l'appel de la liste dans un formulaire
		MajAjax(ressources+"php/FonctionsAjax.php","ChargeListe",argu);
	}
	else
	{	// Masquage champs
		for (var i=0;i<form.length;i++)
		{	// Champs texte dans chaque langue
			var text = form.elements[i];
			if (text.tagName=="INPUT" && text.type=="text" && text.id.match("ch_"+table))
			{
				text.value="";
				text.setAttribute("disabled","disabled");
			}
		}
	}
}
//////////////////////////////////
// Validation d'une entrée de liste
//////////////////////////////////
function ValideListe(form,table)
{
	var champ = form.elements["ch_l_"+table];
	var enreg = champ.selectedIndex>=0 ? champ.options[champ.selectedIndex].value : 0;
	var argu = "enreg="+enreg+"&form="+form.name+"&table="+table;
	
	for (var i=0;i<form.length;i++)
	{	// Champs texte dans chaque langue
		var text = form.elements[i];
		if (text.tagName=="INPUT" && text.type=="text")
		{
			argu += "&nom"+text.id.replace("ch_"+table,"")+"="+escape(text.value);
		}
	}
	MajAjax(ressources+"php/FonctionsAjax.php","ValideListe",argu);
}
//////////////////////////////////
// Effacement d'une entrée de liste, appelé uniquement depuis le formulaire de gestion de liste
//////////////////////////////////
function EffaceListe(form,table)
{
	if (confirm("Voulez-vous effacer cet élément ?"))
	{
		var champ=form.elements["ch_l_"+table];
		MajAjax(ressources+"php/FonctionsAjax.php","EffaceListe","form="+form.name+"&enreg="+champ.options[champ.selectedIndex].value+"&table="+table);
	}
}
//////////////////////////////////
// Ordonne une liste, appelé uniquement depuis le formulaire de gestion de liste
//////////////////////////////////
function OrdonneListe(form,table,sens)
{
	var champ = form.elements["ch_l_"+table];
	var index;
	if ((index = champ.selectedIndex) >=0)
	{
		var nb = champ.length;
		autre = sens>0 ? Math.min(index+1,nb-1) : Math.max(index-1,0);
		if (autre!=index)
		{
			tmpval=champ.options[index].value;
			tmptxt=champ.options[index].text;
			champ.options[index].value=champ.options[autre].value;
			champ.options[index].text=champ.options[autre].text;
			champ.options[autre].value=tmpval;
			champ.options[autre].text=tmptxt;
			champ.selectedIndex=autre;
			
			// enregistrement de l'ordre
			var uid = "";
			var rang = "";
			for (i=0;i<champ.length;i++)
			{
				uid += champ[i].value + ",";
				rang += i + ",";
			}
			MajAjax(ressources+"php/FonctionsAjax.php","OrdonneListe","form="+form.name+"&enreg="+uid+"&rang="+rang+"&table="+table);
		}
	}
}
//////////////////////////////////
// Bascule de la liste vers le mode saisie nouvelle entrée de liste
//////////////////////////////////
function BasculeListe(form,table,langue,indice)
{
	var nom_liste = table+indice+langue;
	var champ = form.elements["ch_"+nom_liste];
	// on cache la liste et les conteneurs des boutons
	showHideLayers("ch_l_"+table+indice,"","hide","bo_"+table+indice,"","hide");
	if (langue=="")
	{	// Mono-langue
		showHideLayers("ch_"+nom_liste,"","show");
		champ.value="";
		champ.focus();
	}
	else
	{	// Multilingue
		showHideLayers("div_ch_"+nom_liste,"","show");
		champ.removeAttribute("disabled");
		champ.value="";
		champ.focus();
	}
}

//////////////////////////////////
// Sauvegarde la nouvelle entrée de liste (une entrée)
//////////////////////////////////
function SauveListe(champ,table,indice)
{
	var enreg = 0;
	var form = champ.form;
	var nom_liste = table+indice;
	var liste = form.elements["ch_l_"+table+indice];
	var langue = champ.lang;
	// on affiche la liste et les conteneurs des boutons
	showHideLayers("ch_l_"+table+indice,"","show","bo_"+table+indice,"","show");
	if (langue=="")
	{	// On cache le champ de saisie en mono-langue
		showHideLayers(champ.id,"","hide");
	}
	else if (langue=='FR')
	{	// On remet le champ en "disabled"
		champ.setAttribute("disabled","disabled");
	}
	else
	{
		// mise à jour d'une autre langue d'un enregistrement existant
		enreg=(liste.selectedIndex>=0 ? liste.options[liste.selectedIndex].value : 0);
	}
	if (champ.value.length>0)
	{
		var argu = "enreg="+enreg+"&form="+form.name+"&table="+table+"&indice="+indice;
		var lan = langue=="" ? "" : champ.id.substring(champ.id.lastIndexOf("_"));
		argu+="&nom"+lan+"="+escape(champ.value);
		argu+="&langue="+lan;
		MajAjax(ressources+"php/FonctionsAjax.php","ValideListe",argu);
	}
	else if (langue=='FR')
	{	// On est sur la langue par défaut, on rétablit la valeur précédente
		var indice = liste.selectedIndex;
		if (liste.options[indice].value!=0) champ.value = liste.options[indice].text;
	}
}

function popupListe(table,form,indice)
{
	var liste = form.elements["ch_l_"+table+indice];
	var enreg=(liste.selectedIndex>=0 ? liste.options[liste.selectedIndex].value : 0);
	// Au retour, la fonction doit mettre à jour la liste appelante
	popup('Gestion de liste',"admin/utile/ficheListe.php",'table',table,'form',form.name,'enreg',enreg,'indice',indice,'close','FermePopupListe()','onclick','',400, 400);
}
//-----------------------------------------
// Change l'ordre des items d'une liste
//-----------------------------------------
function OrdonneTable(obj,nodeName,table,tag,sens)
{
	// Permute 2 lignes de niveau nodeName
	var ligne = chercheParent(obj,nodeName);
	var parent = ligne.parentNode;
	var autre = sens>0 ? ligne.nextSibling : ligne.previousSibling;
	if (autre)
	{
		if (autre.nodeName==nodeName)
		{
			var tmp1 = ligne.cloneNode(true);
			var tmp2 = autre.cloneNode(true);
			// récupération uid
			var uid1 = ligne.getAttribute("uid");
			var uid2 = autre.getAttribute("uid");
			// premutation lignes
			parent.replaceChild(tmp2,ligne);
			parent.replaceChild(tmp1,autre);
			
			// Enregistrement de l'ordre des items
			MajAjax(ressources+"php/FonctionsAjax.php","OrdonneTable","table="+table+"&tag="+tag+"&uid1="+uid1+"&uid2="+uid2);
		}
	}
}

