var gsa_donnees_form; /** * Renvoie les modifications effectuées sur les champs d'un formulaire * @param string ps_id_form l'identifiant du formulaire dans lequel vérifier les champs * @return array tableau associatif des éléments DOM de champ de formulaire=>valeur après modification */ function detecter_changement_formulaire( ps_id_form ) { // Récupération du formulaire lfrm = getelement( ps_id_form ); // Initialisation du tableau associatif champ de formulaire=>valeur après modification lsa_champs_modifies = new Array(); lb_lecture_initiale = false; /* Si la globale des données de formulaire n'est pas renseignée, cette fonction effectue une lecture initiale * du formulaire et en stocke les valeurs */ if( gsa_donnees_form == null ) { gsa_donnees_form = new Array(); lb_lecture_initiale = true; } // Parcourt du formulaire, champs par champ for( var li=0 ; li < lfrm.elements.length ; li++ ) { lb_champ_modifie = false; // Récupération du champ et de sa valeur linp_element = lfrm.elements[li]; ls_valeur_element = linp_element.value; /* * Sont exclus du traitement les champs : * - cachés qui ne peuvent pas être modifiés * - de type radio : on n'en a pas eu besoin pour l'instant, mais sinon il faudrait parcourir les différents * boutons radios du même nom, voir lequel est coché et mémoriser la valeur correspondante * - de type fichier : utilisé pour les images, ce champ de formulaire devrait être posté localement par ajax en * cours de saisie de formulaire afin de pouvoir faire des comparaisons. Ce que nous ne faisons pas pour l'instant */ if( linp_element.type != "hidden" && linp_element.type != "radio" && linp_element.type != "file") { // Dans le contexte d'une lecture initiale, le tableau global gsa_donnees_form est renseigné if( lb_lecture_initiale ) { // Traitement du cas particulier des checkbox if( linp_element.type == "checkbox" ) { /* Par convention, si le nom du champ de checkbox contient [], il s'agit d'un champ pouvant * contenir plusieurs valeurs (exemple d'une diffusion vers plusieurs zones). On mémorise * les différentes valeurs possibles dans un sous-tableau. */ if( linp_element.name.indexOf("[]") != -1 ) { gsa_donnees_form[linp_element.name] = new Array(); // Récupération des valeurs des champs du même nom var tmp = document.getElementsByName( linp_element.name ); for( var index=0; index < tmp.length; index++ ) { // La valeur est ajoutée si la case est cochée if( tmp[index].checked ) { gsa_donnees_form[tmp[index].name].push(tmp[index].value); } } } // Récupération de la valeur de la checkbox (1 si cochée, 0 sinon) else { gsa_donnees_form[linp_element.name] = (linp_element.checked?1:0); } } // Récupération de la valeur d'un champ qui n'est pas une checkbox else { gsa_donnees_form[linp_element.name] = ls_valeur_element; } } // Contexte d'une détection des modifications de valeur des champs du formulaire else { // Cas particulier des checkbox if( linp_element.type == "checkbox" ) { /* Par convention, si le nom du champ de checkbox contient [], il s'agit d'un champ pouvant * contenir plusieurs valeurs (exemple d'une diffusion vers plusieurs zones). On mémorise * les différentes valeurs possibles dans un sous-tableau. */ if( linp_element.name.indexOf("[]") != -1 ) { b_trouve = false; // Parcourt des différentes valeurs trouvées dans le tableau for( var index=-1; !b_trouve && (index < gsa_donnees_form[linp_element.name].length); ++index ) { b_trouve |= gsa_donnees_form[linp_element.name][index]==ls_valeur_element } if( linp_element.checked ) { lb_champ_modifie = !b_trouve; if( lb_champ_modifie ) { gsa_donnees_form[linp_element.name].push( ls_valeur_element ); } } else { lb_champ_modifie = b_trouve; if( lb_champ_modifie ) { gsa_donnees_form[linp_element.name].splice( index-1, index ); } } } else if( gsa_donnees_form[linp_element.name] != (linp_element.checked?1:0) ) { lb_champ_modifie = true; gsa_donnees_form[linp_element.name] = (linp_element.checked?1:0); } } // Traitement des champs qui ne sont pas des checkbox else if( gsa_donnees_form[linp_element.name] != ls_valeur_element ) { lb_champ_modifie = true; gsa_donnees_form[linp_element.name] = ls_valeur_element; } if( lb_champ_modifie ) { lsa_champs_modifies[linp_element.name] = gsa_donnees_form[linp_element.name]; } } } } return lsa_champs_modifies; }