diff --git a/.gitattributes b/.gitattributes
index 23020f5263f383c17a8eff9d918124fe889df62f..75551890c8ecfed80deefb7e4ff0ec8c865f768e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -82,7 +82,6 @@ prive/squelettes/contenu/formulaires_reponse.html -text
 prive/squelettes/contenu/formulaires_reponses.html -text
 prive/squelettes/extra/formulaire.html -text
 prive/squelettes/extra/formulaire_edit.html -text
-prive/squelettes/extra/formulaires_analyse.html -text
 prive/squelettes/extra/formulaires_reponses.html -text
 prive/squelettes/hierarchie/formulaire.html -text
 prive/squelettes/hierarchie/formulaire_edit.html -text
diff --git a/formidable_autorisations.php b/formidable_autorisations.php
index 3df4f4a933245e1af48245caab3ad41e21f3d869..6443c031027cbb4430c2d587fc3567ad05404ddd 100644
--- a/formidable_autorisations.php
+++ b/formidable_autorisations.php
@@ -2,7 +2,7 @@
 
 /**
  * Déclaration des autorisations
- * 
+ *
  * @package SPIP\Formidable\Autorisations
 **/
 
@@ -28,9 +28,7 @@ function formidable_autoriser(){}
  * @return bool          true s'il a le droit, false sinon
 **/
 function autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt){
-    if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and
-        (!$qui['restreint']) or $GLOBALS['formulaires']['autoriser_admin_restreint'])
-            return true;
+    if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and !$qui['restreint']) return true;
     else return false;
 }
 
@@ -47,8 +45,8 @@ function autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt){
  * @return bool          true s'il a le droit, false sinon
 **/
 function autoriser_formulaires_menu_dist($faire, $type, $id, $qui, $opt){
-	if (isset($qui['statut']) and $qui['statut'] <= '1comite') return true;
-	else return false;
+    if (isset($qui['statut']) and $qui['statut'] <= '1comite') return true;
+    else return false;
 }
 
 
@@ -70,38 +68,38 @@ function autoriser_formulaires_menu_dist($faire, $type, $id, $qui, $opt){
  * @return bool          true s'il a le droit, false sinon
 **/
 function autoriser_formulaire_repondre_dist($faire, $type, $id, $qui, $opt){
-	// On regarde si il y a déjà le formulaire dans les options
-	if (isset($options['formulaire']))
-		$formulaire = $options['formulaire'];
-	// Sinon on va le chercher
-	else{
-		$formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id);
-	}
-	
-	$traitements = unserialize($formulaire['traitements']);
-	
-	// S'il n'y a pas d'enregistrement, c'est forcément bon
-	if (!($options = $traitements['enregistrement']))
-		return true;
-	// Sinon faut voir les options
-	else{
-		// Si multiple = oui c'est bon
-		if ($options['multiple'])
-			return true;
-		else{
-			// Si c'est modifiable, c'est bon
-			if ($options['modifiable'])
-				return true;
-			else{
-				include_spip('inc/formidable');
-				// Si la personne n'a jamais répondu, c'est bon
-				if (!formidable_verifier_reponse_formulaire($id))
-					return true;
-				else
-					return false;
-			}
-		}
-	}
+    // On regarde si il y a déjà le formulaire dans les options
+    if (isset($options['formulaire']))
+        $formulaire = $options['formulaire'];
+    // Sinon on va le chercher
+    else{
+        $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id);
+    }
+
+    $traitements = unserialize($formulaire['traitements']);
+
+    // S'il n'y a pas d'enregistrement, c'est forcément bon
+    if (!($options = $traitements['enregistrement']))
+        return true;
+    // Sinon faut voir les options
+    else{
+        // Si multiple = oui c'est bon
+        if ($options['multiple'])
+            return true;
+        else{
+            // Si c'est modifiable, c'est bon
+            if ($options['modifiable'])
+                return true;
+            else{
+                include_spip('inc/formidable');
+                // Si la personne n'a jamais répondu, c'est bon
+                if (!formidable_verifier_reponse_formulaire($id, $options['identification']))
+                    return true;
+                else
+                    return false;
+            }
+        }
+    }
 }
 
 
@@ -118,8 +116,8 @@ function autoriser_formulaire_repondre_dist($faire, $type, $id, $qui, $opt){
  * @return bool          true s'il a le droit, false sinon
 **/
 function autoriser_formulaires_reponse_instituer_dist($faire, $type, $id, $qui, $opt){
-	if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and !$qui['restreint']) return true;
-	else return false;
+    if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and !$qui['restreint']) return true;
+    else return false;
 }
 
 /**
@@ -135,8 +133,8 @@ function autoriser_formulaires_reponse_instituer_dist($faire, $type, $id, $qui,
  * @return bool          true s'il a le droit, false sinon
 **/
 function autoriser_formulaires_reponse_voir_dist($faire, $type, $id, $qui, $opt){
-	if (isset($qui['statut']) and $qui['statut'] <= '1comite') return true;
-	else return false;
+    if (isset($qui['statut']) and $qui['statut'] <= '1comite') return true;
+    else return false;
 }
 
 /**
@@ -152,11 +150,11 @@ function autoriser_formulaires_reponse_voir_dist($faire, $type, $id, $qui, $opt)
  * @return bool          true s'il a le droit, false sinon
 **/
 function autoriser_formulaires_reponse_supprimer_dist($faire, $type, $id, $qui, $opt){
-	// On récupère l'id du formulaire
-	if ($id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires_reponses', $id)))
-		return autoriser('editer', 'formulaire', $id_formulaire);
-	else
-		return false;
+    // On récupère l'id du formulaire
+    if ($id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires_reponses', $id)))
+        return autoriser('editer', 'formulaire', $id_formulaire);
+    else
+        return false;
 }
 
 ?>
diff --git a/formidable_options.php b/formidable_options.php
index b7ffd1a0d40c711857efc8a852180e7c55b771c3..d46c5262a2f6e2e6f93b894d9e4c9cf72a72cc2f 100644
--- a/formidable_options.php
+++ b/formidable_options.php
@@ -11,108 +11,97 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 // On déclare le formulaire pour éditer un formulaire
 $GLOBALS['formulaires']['editer_formulaire'] = array(
-	array(
-		'saisie' => 'input',
-		'options' => array(
-			'nom' => 'titre',
-			'label' => '<:formidable:editer_titre:>',
-			'obligatoire' => 'oui',
-			'class' => 'multilang'
-		)
-	),
-	array(
-		'saisie' => 'input',
-		'options' => array(
-			'nom' => 'identifiant',
-			'label' => '<:formidable:editer_identifiant:>',
-			'explication' => '<:formidable:editer_identifiant_explication:>',
-			'obligatoire' => 'oui'
-		),
-		'verifier' => array(
-			'type' => 'regex',
-			'options' => array(
-				'modele' => '/^[\w]+$/'
-			)
-		)
-	),
-	array(
-		'saisie' => 'textarea',
-		'options' => array(
-			'nom' => 'message_retour',
-			'label' => '<:formidable:editer_message_ok:>',
-			'explication' => '<:formidable:editer_message_ok_explication:>',
-			'rows' => 5,
-			'li_class' => 'editer_texte',
-			'class' => 'multilang'
-		)
-	),
-	array(
-		'saisie' => 'textarea',
-		'options' => array(
-			'nom' => 'descriptif',
-			'label' => '<:formidable:editer_descriptif:>',
-			'explication' => '<:formidable:editer_descriptif_explication:>',
-			'rows' => 5,
-			'class' => 'multilang'
-		)
-	),
-	array(
-		'saisie' => 'selection',
-		'options' => array(
-			'nom' => 'apres',
-			'label' => '<:formidable:editer_apres_label:>',
-			'explication' => '<:formidable:editer_apres_explication:>',
-			'datas' => array(
-				'formulaire' => _T('formidable:editer_apres_choix_formulaire'),
-				'valeurs' => _T('formidable:editer_apres_choix_valeurs'),
-				'stats' => _T('formidable:editer_apres_choix_stats'),
-				'rien' => _T('formidable:editer_apres_choix_rien'),
-				'redirige' => _T('formidable:editer_apres_choix_redirige'),
-			),
-			'defaut' => 'formulaire',
-			'cacher_option_intro' => 'on'
-		)
-	),
-	array(
-		'saisie' => 'input',
-		'options' => array(
-			'nom' => 'url_redirect',
-			'label' => '<:formidable:editer_redirige_url:>', 
-			'explication' => '<:formidable:editer_redirige_url_explication:>',
-			'obligatoire' => 'non'
-		)
-	)
+    array(
+        'saisie' => 'input',
+        'options' => array(
+            'nom' => 'titre',
+            'label' => '<:formidable:editer_titre:>',
+            'obligatoire' => 'oui',
+            'class' => 'multilang'
+        )
+    ),
+    array(
+        'saisie' => 'input',
+        'options' => array(
+            'nom' => 'identifiant',
+            'label' => '<:formidable:editer_identifiant:>',
+            'explication' => '<:formidable:editer_identifiant_explication:>',
+            'obligatoire' => 'oui'
+        ),
+        'verifier' => array(
+            'type' => 'regex',
+            'options' => array(
+                'modele' => '/^[\w]+$/'
+            )
+        )
+    ),
+    array(
+        'saisie' => 'textarea',
+        'options' => array(
+            'nom' => 'message_retour',
+            'label' => '<:formidable:editer_message_ok:>',
+            'explication' => '<:formidable:editer_message_ok_explication:>',
+            'rows' => 5,
+            'li_class' => 'editer_texte',
+            'class' => 'multilang'
+        )
+    ),
+    array(
+        'saisie' => 'textarea',
+        'options' => array(
+            'nom' => 'descriptif',
+            'label' => '<:formidable:editer_descriptif:>',
+            'explication' => '<:formidable:editer_descriptif_explication:>',
+            'rows' => 5,
+            'class' => 'multilang'
+        )
+    ),
+    array(
+        'saisie' => 'selection',
+        'options' => array(
+            'nom' => 'apres',
+            'label' => '<:formidable:editer_apres_label:>',
+            'explication' => '<:formidable:editer_apres_explication:>',
+            'datas' => array(
+                'formulaire' => _T('formidable:editer_apres_choix_formulaire'),
+                'valeurs' => _T('formidable:editer_apres_choix_valeurs'),
+                'stats' => _T('formidable:editer_apres_choix_stats'),
+                'rien' => _T('formidable:editer_apres_choix_rien'),
+                'redirige' => _T('formidable:editer_apres_choix_redirige'),
+            ),
+            'defaut' => 'formulaire',
+            'cacher_option_intro' => 'on'
+        )
+    ),
+    array(
+        'saisie' => 'input',
+        'options' => array(
+            'nom' => 'url_redirect',
+            'label' => '<:formidable:editer_redirige_url:>',
+            'explication' => '<:formidable:editer_redirige_url_explication:>',
+            'obligatoire' => 'non'
+        )
+    )
 );
 
-/* déclaration des différentes variables utilisées pour effectuer l'anonymisation */
-$GLOBALS['formulaires']['variables_anonymisation'] = array(
-	'remote_user' => '$_SERVER["REMOTE_USER"]',
-	'php_auth_user' => '$_SERVER["PHP_AUTH_USER"]',
-);
-
-$GLOBALS['formulaires']['passwd'] = array(
-	'interne' => 'palabresecreta',
-);
-
-$GLOBALS['formulaires']['autoriser_admin_restreint'] = true;
 
 if (!function_exists('array_fill_keys')) {
-	/**
-	 * Remplit un tableau avec des valeurs, en spécifiant les clés
-	 *
-	 * Fonction dans PHP 5.2+
-	 * @see http://php.net/manual/fr/function.array-fill-keys.php
-	 * 
-	 * @param array $keys
-	 *     Tableau de valeurs qui sera utilisé comme clés. 
-	 * @param mixed $value
-	 *     Valeur à utiliser pour remplir le tableau.
-	 * @return array
-	 *     Le tableau rempli. 
-	**/
-	function array_fill_keys($keys, $value){
-		array_combine($keys,array_fill(0,count($keys),$value));
-	}
+    /**
+     * Remplit un tableau avec des valeurs, en spécifiant les clés
+     *
+     * Fonction dans PHP 5.2+
+     * @see http://php.net/manual/fr/function.array-fill-keys.php
+     *
+     * @param array $keys
+     *     Tableau de valeurs qui sera utilisé comme clés.
+     * @param mixed $value
+     *     Valeur à utiliser pour remplir le tableau.
+     * @return array
+     *     Le tableau rempli.
+    **/
+    function array_fill_keys($keys, $value){
+        array_combine($keys,array_fill(0,count($keys),$value));
+    }
 }
 
 ?>
diff --git a/formulaires/formidable.html b/formulaires/formidable.html
index e3c8dd0a33d60fe6a1f3dfb938952dd4cbcd0df0..b5f9f99fa080da6bb7c0a8b5b4b2ab021233f4d0 100644
--- a/formulaires/formidable.html
+++ b/formulaires/formidable.html
@@ -1,46 +1,41 @@
 <BOUCLE_remplacer_le_formulaire(CONDITION){si #ENV{_remplacer_formulaire}}>
-	[(#REM) Afficher du HTML si prévu par un plugin ou pour les stats ]
-	[(#ENV**{_remplacer_formulaire})]
+    [(#REM) Afficher du HTML si prévu par un plugin ou pour les stats ]
+    [(#ENV**{_remplacer_formulaire})]
 </BOUCLE_remplacer_le_formulaire>
-<BOUCLE_formulaire(FORMULAIRES){id_formulaire=#ENV{id}}>
-	[(#SET{enregistrement,[(#TRAITEMENTS**|unserialize|table_valeur{'enregistrement'})]})]
-	[(#SET{anonymiser,[(#GET{enregistrement}|table_valeur{'anonymiser'})]})]
-	[(#GET{anonymiser}|=={on}|oui)<h3><:formidable:formulaire_anonyme_explication:>]</h3>
-</BOUCLE_formulaire>
 <div class="formulaire_spip formulaire_#ENV{form}[ formulaire_#ENV{form}-(#ENV{id,nouveau})]">
-	[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
-	[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+    [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+    [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
 
-	[(#ENV{editable}|oui)
-	<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
-		[(#REM) declarer les hidden qui declencheront le service du formulaire 
-		parametre : url d'action ]
-		#ACTION_FORMULAIRE{#ENV{action}}
-		
-		<ul>
-			#GENERER_SAISIES{#ENV{_saisies}}
-			<li style="display:none;">
-				<label for="mechantrobot-#ENV{id}"><:antispam_champ_vide:></label>
-				<input type="text" id="mechantrobot-#ENV{id}" name="mechantrobot" value="#ENV{mechantrobot}" />
-			</li>
-		</ul>
-		
-		[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
-		<!--extra-->
-		
-		<p class='boutons'>
-			<span class='image_loading'></span>
-			<input type='submit' class='submit' value='<:bouton_valider:>' />
-		</p>
-	</div></form>
-	]
-	[(#EDITABLE|non)
-		[(#ENV{formidable_afficher_apres}|=={valeurs}|oui) 
-			#VOIR_SAISIES{#ENV*{_saisies},#ENV}
-		]
-		[(#ENV{formidable_afficher_apres}|=={rien}|oui) 
-		]
-	]
-	<br />
+    [(#ENV{editable}|oui)
+    <form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
+        [(#REM) declarer les hidden qui declencheront le service du formulaire
+        parametre : url d'action ]
+        #ACTION_FORMULAIRE{#ENV{action}}
+
+        <ul>
+            #GENERER_SAISIES{#ENV{_saisies}}
+            <li style="display:none;">
+                <label for="mechantrobot-#ENV{id}"><:antispam_champ_vide:></label>
+                <input type="text" id="mechantrobot-#ENV{id}" name="mechantrobot" value="#ENV{mechantrobot}" />
+            </li>
+        </ul>
+
+        [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
+        <!--extra-->
+
+        <p class='boutons'>
+            <span class='image_loading'></span>
+            <input type='submit' class='submit' value='<:bouton_valider:>' />
+        </p>
+    </div></form>
+    ]
+    [(#EDITABLE|non)
+        [(#ENV{formidable_afficher_apres}|=={valeurs}|oui)
+            #VOIR_SAISIES{#ENV*{_saisies},#ENV}
+        ]
+        [(#ENV{formidable_afficher_apres}|=={rien}|oui)
+        ]
+    ]
+    <br />
 </div>
 <//B_remplacer_le_formulaire>
diff --git a/formulaires/formidable.php b/formulaires/formidable.php
index 96529d96de2b7dd71f78882bc0c54e1f0abbb509..1ff68b16d85a2e61831f7e05c8582e0e4e1a5d25 100644
--- a/formulaires/formidable.php
+++ b/formulaires/formidable.php
@@ -16,7 +16,7 @@ include_spip('inc/autoriser');
 
 /**
  * Chargement du formulaire CVT de Formidable.
- * 
+ *
  * Genere le formulaire dont l'identifiant (numerique ou texte est indique)
  *
  * @param int|string $id_formulaire
@@ -26,120 +26,120 @@ include_spip('inc/autoriser');
  *     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
  * @param int|bool $id_formulaires_reponse
  *     Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
- * 
+ *
  * @return array
  *     Contexte envoyé au squelette HTML du formulaire.
 **/
 function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
-	$contexte = array();
-
-	// On peut donner soit un id soit un identifiant
-	if (intval($id_formulaire) > 0)
-		$where = 'id_formulaire = '.intval($id_formulaire);
-	elseif (is_string($id_formulaire))
-		$where = 'identifiant = '.sql_quote($id_formulaire);
-	else
-		return;
-	
-	// On cherche si le formulaire existe
-	if ($formulaire = sql_fetsel('*', 'spip_formulaires', $where)) {
-		// on ajoute un point d'entrée avec les infos de ce formulaire
-		// pour d'eventuels plugins qui en ont l'utilité
-		$contexte += array('_formidable' => $formulaire);
-		// Est-ce que la personne a le droit de répondre ?
-		if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire'=>$formulaire))){
-			$saisies = unserialize($formulaire['saisies']);
-			$traitements = unserialize($formulaire['traitements']);
-			// On déclare les champs
-			$contexte += array_fill_keys(saisies_lister_champs($saisies), '');
-			$contexte['mechantrobot'] = '';
-			// On ajoute le formulaire complet
-			$contexte['_saisies'] = $saisies;
-		
-			$contexte['id'] = $formulaire['id_formulaire'];
-			$contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="'.$contexte['id'].'"/>';
-			
-			// S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit
-			if ($valeurs){
-				// Si c'est une chaine on essaye de la parser
-				if (is_string($valeurs)){
-					$liste = explode(',', $valeurs);
-					$liste = array_map('trim', $liste);
-					$valeurs = array();
-					foreach ($liste as $i=>$cle_ou_valeur){
-						if ($i % 2 == 0)
-							$valeurs[$liste[$i]] = $liste[$i+1];
-					}
-				}
-				
-				// On regarde si maintenant on a un tableau
-				if ($valeurs and is_array($valeurs)){
-					$contexte = array_merge($contexte, $valeurs);
-				}
-			}
-
-			// Si on passe un identifiant de reponse, on edite cette reponse si elle existe
-			if ($id_formulaires_reponse = intval($id_formulaires_reponse)) {
-				$contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
-				if ($ok) {
-					// On ajoute un hidden pour dire que c'est une modif
-					$contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>';
-				} else {
-					$contexte['editable'] = false;
-					$contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante');
-				}
-			} else {
-				
-				// Si multiple = non mais que c'est modifiable, alors on va chercher
-				// la dernière réponse si elle existe
-				if ($options = $traitements['enregistrement']
-					and !$options['multiple']
-					and $options['modifiable']
-					and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options)
-				) {
-					$id_formulaires_reponse = array_pop($reponses);
-					$contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
-
-					// On ajoute un hidden pour dire que c'est une modif
-					$contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>';
-				}
-				
-			}
-		}
-		else{
-			$contexte['editable'] = false;
-			// le formulaire a déjà été répondu.
-			// peut être faut il afficher les statistiques des réponses
-			if ($formulaire['apres'] == 'stats') {
-				// Nous sommes face à un sondage auquel on a déjà répondu !
-				// On remplace complètement l'affichage du formulaire
-				// par un affichage du résultat de sondage !
-				$contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array(
-					'id_formulaire' => $formulaire['id_formulaire'],
-				));
-			} else {
-				$contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu');
-			}
-		}
-	}
-	else{
-		$contexte['editable'] = false;
-		$contexte['message_erreur'] = _T('formidable:erreur_inexistant');
-	}
-	if (!isset($contexte['_hidden'])) {
-		$contexte['_hidden'] = '';
-	}
-	$contexte['_hidden'] .= "\n".'<input type="hidden" name="formidable_afficher_apres'/*.$formulaire['id_formulaire']*/.'" value="'.$formulaire['apres'].'"/>';// marche pas
-	
-	$contexte['formidable_afficher_apres']=$formulaire['apres'];
-	
-	return $contexte;
+    $contexte = array();
+
+    // On peut donner soit un id soit un identifiant
+    if (intval($id_formulaire) > 0)
+        $where = 'id_formulaire = '.intval($id_formulaire);
+    elseif (is_string($id_formulaire))
+        $where = 'identifiant = '.sql_quote($id_formulaire);
+    else
+        return;
+
+    // On cherche si le formulaire existe
+    if ($formulaire = sql_fetsel('*', 'spip_formulaires', $where)) {
+        // on ajoute un point d'entrée avec les infos de ce formulaire
+        // pour d'eventuels plugins qui en ont l'utilité
+        $contexte += array('_formidable' => $formulaire);
+        // Est-ce que la personne a le droit de répondre ?
+        if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire'=>$formulaire))){
+            $saisies = unserialize($formulaire['saisies']);
+            $traitements = unserialize($formulaire['traitements']);
+            // On déclare les champs
+            $contexte += array_fill_keys(saisies_lister_champs($saisies), '');
+            $contexte['mechantrobot'] = '';
+            // On ajoute le formulaire complet
+            $contexte['_saisies'] = $saisies;
+
+            $contexte['id'] = $formulaire['id_formulaire'];
+            $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="'.$contexte['id'].'"/>';
+
+            // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit
+            if ($valeurs){
+                // Si c'est une chaine on essaye de la parser
+                if (is_string($valeurs)){
+                    $liste = explode(',', $valeurs);
+                    $liste = array_map('trim', $liste);
+                    $valeurs = array();
+                    foreach ($liste as $i=>$cle_ou_valeur){
+                        if ($i % 2 == 0)
+                            $valeurs[$liste[$i]] = $liste[$i+1];
+                    }
+                }
+
+                // On regarde si maintenant on a un tableau
+                if ($valeurs and is_array($valeurs)){
+                    $contexte = array_merge($contexte, $valeurs);
+                }
+            }
+
+            // Si on passe un identifiant de reponse, on edite cette reponse si elle existe
+            if ($id_formulaires_reponse = intval($id_formulaires_reponse)) {
+                $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
+                if ($ok) {
+                    // On ajoute un hidden pour dire que c'est une modif
+                    $contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>';
+                } else {
+                    $contexte['editable'] = false;
+                    $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante');
+                }
+            } else {
+
+                // Si multiple = non mais que c'est modifiable, alors on va chercher
+                // la dernière réponse si elle existe
+                if ($options = $traitements['enregistrement']
+                    and !$options['multiple']
+                    and $options['modifiable']
+                    and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification'])
+                ){
+                    $id_formulaires_reponse = array_pop($reponses);
+                    $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
+
+                    // On ajoute un hidden pour dire que c'est une modif
+                    $contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>';
+                }
+
+            }
+        }
+        else{
+            $contexte['editable'] = false;
+            // le formulaire a déjà été répondu.
+            // peut être faut il afficher les statistiques des réponses
+            if ($formulaire['apres'] == 'stats') {
+                // Nous sommes face à un sondage auquel on a déjà répondu !
+                // On remplace complètement l'affichage du formulaire
+                // par un affichage du résultat de sondage !
+                $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array(
+                    'id_formulaire' => $formulaire['id_formulaire'],
+                ));
+            } else {
+                $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu');
+            }
+        }
+    }
+    else{
+        $contexte['editable'] = false;
+        $contexte['message_erreur'] = _T('formidable:erreur_inexistant');
+    }
+    if (!isset($contexte['_hidden'])) {
+        $contexte['_hidden'] = '';
+    }
+    $contexte['_hidden'] .= "\n".'<input type="hidden" name="formidable_afficher_apres'/*.$formulaire['id_formulaire']*/.'" value="'.$formulaire['apres'].'"/>';// marche pas
+
+    $contexte['formidable_afficher_apres']=$formulaire['apres'];
+
+    return $contexte;
 }
 
 
 /**
  * Vérification du formulaire CVT de Formidable.
- * 
+ *
  * Pour chaque champ posté, effectue les vérifications demandées par
  * les saisies et retourne éventuellement les erreurs de saisie.
  *
@@ -150,35 +150,35 @@ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_fo
  *     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
  * @param int|bool $id_formulaires_reponse
  *     Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
- * 
+ *
  * @return array
  *     Tableau des erreurs
 **/
 function formulaires_formidable_verifier($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
-	$erreurs = array();
-	
-	// Sale bête !
-	if (_request('mechantrobot') != ''){
-		$erreurs['hahahaha'] = 'hahahaha';
-		return $erreurs;
-	}
-	
-	$id_formulaire = intval(_request('id_formulaire'));
-	$formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
-	$saisies = unserialize($formulaire['saisies']);
-	
-	$erreurs = saisies_verifier($saisies);
-	
-	if ($erreurs and !isset($erreurs['message_erreur']))
-		$erreurs['message_erreur'] = _T('formidable:erreur_generique');
-
-	return $erreurs;
+    $erreurs = array();
+
+    // Sale bête !
+    if (_request('mechantrobot') != ''){
+        $erreurs['hahahaha'] = 'hahahaha';
+        return $erreurs;
+    }
+
+    $id_formulaire = intval(_request('id_formulaire'));
+    $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
+    $saisies = unserialize($formulaire['saisies']);
+
+    $erreurs = saisies_verifier($saisies);
+
+    if ($erreurs and !isset($erreurs['message_erreur']))
+        $erreurs['message_erreur'] = _T('formidable:erreur_generique');
+
+    return $erreurs;
 }
 
 
 /**
  * Traitement du formulaire CVT de Formidable.
- * 
+ *
  * Exécute les traitements qui sont indiqués dans la configuration des
  * traitements de ce formulaire formidable.
  *
@@ -195,66 +195,66 @@ function formulaires_formidable_verifier($id_formulaire, $valeurs=array(), $id_f
  *     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
  * @param int|bool $id_formulaires_reponse
  *     Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
- * 
+ *
  * @return array
  *     Tableau des erreurs
 **/
 function formulaires_formidable_traiter($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
-	$retours = array();
-	
-	$id_formulaire = intval(_request('id_formulaire'));
-	$formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
-	$traitements = unserialize($formulaire['traitements']);
-
-	// selon le choix, le formulaire se remet en route à la fin ou non
-	$retours['editable'] = ($formulaire['apres']=='formulaire');
-	$retours['formidable_afficher_apres'] = $formulaire['apres'];
-
-	// Si on a une redirection valide
-	if (($formulaire['apres']== "redirige") AND ($formulaire['url_redirect']!="")) {
-		refuser_traiter_formulaire_ajax();
-		// traiter les raccourcis artX, brX
-		include_spip("inc/lien");
-		$url_redirect = typer_raccourci($formulaire['url_redirect']);
-		if (count($url_redirect)>2) {
-			$url_redirect = $url_redirect[0].$url_redirect[2];
-		} else {
-			$url_redirect = $formulaire['url_redirect'];      // URL classique
-		}
-
-		$retours['redirect'] = $url_redirect; 
-	}
-
-	// Si on a des traitements 
-	if (is_array($traitements) and !empty($traitements)) {
-		foreach($traitements as $type_traitement=>$options){
-			if ($appliquer_traitement = charger_fonction($type_traitement, 'traiter/', true)) {
-				$retours = $appliquer_traitement(
-					array(
-						'formulaire' => $formulaire,
-						'options' => $options
-					),
-					$retours
-				);
-			}
-		}
-
-		// Si on a personnalisé le message de retour, c'est lui qui est affiché uniquement
-		if ($formulaire['message_retour']) {
-			$retours['message_ok'] = _T_ou_typo($formulaire['message_retour']);
-		}
-	}
-	else{
-		$retours['message_ok'] = _T('formidable:retour_aucun_traitement');
-	}
-
-	return $retours;
+    $retours = array();
+
+    $id_formulaire = intval(_request('id_formulaire'));
+    $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
+    $traitements = unserialize($formulaire['traitements']);
+
+    // selon le choix, le formulaire se remet en route à la fin ou non
+    $retours['editable'] = ($formulaire['apres']=='formulaire');
+    $retours['formidable_afficher_apres'] = $formulaire['apres'];
+
+    // Si on a une redirection valide
+    if (($formulaire['apres']== "redirige") AND ($formulaire['url_redirect']!="")) {
+        refuser_traiter_formulaire_ajax();
+        // traiter les raccourcis artX, brX
+        include_spip("inc/lien");
+        $url_redirect = typer_raccourci($formulaire['url_redirect']);
+        if (count($url_redirect)>2) {
+            $url_redirect = $url_redirect[0].$url_redirect[2];
+        } else {
+            $url_redirect = $formulaire['url_redirect'];      // URL classique
+        }
+
+        $retours['redirect'] = $url_redirect;
+    }
+
+    // Si on a des traitements
+    if (is_array($traitements) and !empty($traitements)) {
+        foreach($traitements as $type_traitement=>$options){
+            if ($appliquer_traitement = charger_fonction($type_traitement, 'traiter/', true)) {
+                $retours = $appliquer_traitement(
+                    array(
+                        'formulaire' => $formulaire,
+                        'options' => $options
+                    ),
+                    $retours
+                );
+            }
+        }
+
+        // Si on a personnalisé le message de retour, c'est lui qui est affiché uniquement
+        if ($formulaire['message_retour']) {
+            $retours['message_ok'] = _T_ou_typo($formulaire['message_retour']);
+        }
+    }
+    else{
+        $retours['message_ok'] = _T('formidable:retour_aucun_traitement');
+    }
+
+    return $retours;
 }
 
 
 /**
  * Ajoute dans le contexte les elements
- * donnés par une reponse de formulaire indiquée 
+ * donnés par une reponse de formulaire indiquée
  *
  * @param array $contexte
  *     Contexte pour le squelette HTML du formulaire
@@ -264,24 +264,24 @@ function formulaires_formidable_traiter($id_formulaire, $valeurs=array(), $id_fo
  *     La reponse existe bien ?
  * @return array $contexte
  *     Contexte complète des nouvelles informations
- * 
+ *
 **/
 function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, &$ok) {
-	// On va chercher tous les champs
-	$champs = sql_allfetsel(
-		'nom, valeur',
-		'spip_formulaires_reponses_champs',
-		'id_formulaires_reponse = '.$id_formulaires_reponse
-	);
-	$ok = count($champs) ? true : false;
-	
-	// On remplit le contexte avec
-	foreach ($champs as $champ){
-		$test_array = unserialize($champ['valeur']);
-		$contexte[$champ['nom']] = is_array($test_array) ? $test_array : $champ['valeur'];
-	}
-
-	return $contexte;
+    // On va chercher tous les champs
+    $champs = sql_allfetsel(
+        'nom, valeur',
+        'spip_formulaires_reponses_champs',
+        'id_formulaires_reponse = '.$id_formulaires_reponse
+    );
+    $ok = count($champs) ? true : false;
+
+    // On remplit le contexte avec
+    foreach ($champs as $champ){
+        $test_array = unserialize($champ['valeur']);
+        $contexte[$champ['nom']] = is_array($test_array) ? $test_array : $champ['valeur'];
+    }
+
+    return $contexte;
 }
 
 ?>
diff --git a/inc/formidable.php b/inc/formidable.php
index 03fc160f43051474fcf7c99519d716732fc2ff1b..1319dc3c13e4720a6b5663c66092da2495499a50 100644
--- a/inc/formidable.php
+++ b/inc/formidable.php
@@ -9,29 +9,29 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
  * @return array Un tableau listant des saisies et leurs options
  */
 function traitements_lister_disponibles(){
-	static $traitements = null;
-	
-	if (is_null($traitements)){
-		$traitements = array();
-		$liste = find_all_in_path('traiter/', '.+[.]yaml$');
-		
-		if (count($liste)){
-			foreach ($liste as $fichier=>$chemin){
-				$type_traitement = preg_replace(',[.]yaml$,i', '', $fichier);
-				$dossier = str_replace($fichier, '', $chemin);
-				// On ne garde que les traitements qui ont bien la fonction
-				if (charger_fonction($type_traitement, 'traiter', true)
-					and (
-						is_array($traitement = traitements_charger_infos($type_traitement))
-					)
-				){
-					$traitements[$type_traitement] = $traitement;
-				}
-			}
-		}
-	}
-	
-	return $traitements;
+    static $traitements = null;
+
+    if (is_null($traitements)){
+        $traitements = array();
+        $liste = find_all_in_path('traiter/', '.+[.]yaml$');
+
+        if (count($liste)){
+            foreach ($liste as $fichier=>$chemin){
+                $type_traitement = preg_replace(',[.]yaml$,i', '', $fichier);
+                $dossier = str_replace($fichier, '', $chemin);
+                // On ne garde que les traitements qui ont bien la fonction
+                if (charger_fonction($type_traitement, 'traiter', true)
+                    and (
+                        is_array($traitement = traitements_charger_infos($type_traitement))
+                    )
+                ){
+                    $traitements[$type_traitement] = $traitement;
+                }
+            }
+        }
+    }
+
+    return $traitements;
 }
 
 /**
@@ -41,17 +41,17 @@ function traitements_lister_disponibles(){
  * @return array Un tableau contenant le YAML décodé
  */
 function traitements_charger_infos($type_traitement){
-	include_spip('inc/yaml');
-	$fichier = find_in_path("traiter/$type_traitement.yaml");
-	$traitement = yaml_decode_file($fichier);
-
-	if (is_array($traitement)) {
-		$traitement += array('titre' => '', 'description' => '', 'icone' => '');
-		$traitement['titre'] = $traitement['titre'] ? _T_ou_typo($traitement['titre']) : $type_traitement;
-		$traitement['description'] = $traitement['description'] ? _T_ou_typo($traitement['description']) : '';
-		$traitement['icone'] = $traitement['icone'] ? find_in_path($traitement['icone']) : '';
-	}
-	return $traitement;
+    include_spip('inc/yaml');
+    $fichier = find_in_path("traiter/$type_traitement.yaml");
+    $traitement = yaml_decode_file($fichier);
+
+    if (is_array($traitement)) {
+        $traitement += array('titre' => '', 'description' => '', 'icone' => '');
+        $traitement['titre'] = $traitement['titre'] ? _T_ou_typo($traitement['titre']) : $type_traitement;
+        $traitement['description'] = $traitement['description'] ? _T_ou_typo($traitement['description']) : '';
+        $traitement['icone'] = $traitement['icone'] ? find_in_path($traitement['icone']) : '';
+    }
+    return $traitement;
 }
 
 /*
@@ -60,23 +60,23 @@ function traitements_charger_infos($type_traitement){
  * @return array Retourne un tableau listant les types d'échanges
  */
 function echanges_formulaire_lister_disponibles(){
-	// On va chercher toutes les fonctions existantes
-	$liste = find_all_in_path('echanger/formulaire/', '.+[.]php$');
-	$types_echange = array('exporter'=>array(), 'importer'=>array());
-	if (count($liste)){
-		foreach ($liste as $fichier=>$chemin){
-			$type_echange = preg_replace(',[.]php$,i', '', $fichier);
-			$dossier = str_replace($fichier, '', $chemin);
-			// On ne garde que les échanges qui ont bien la fonction
-			if ($f = charger_fonction('exporter', "echanger/formulaire/$type_echange", true)){
-				$types_echange['exporter'][$type_echange] = $f;
-			}
-			if ($f = charger_fonction('importer', "echanger/formulaire/$type_echange", true)){
-				$types_echange['importer'][$type_echange] = $f;
-			}
-		}
-	}
-	return $types_echange;
+    // On va chercher toutes les fonctions existantes
+    $liste = find_all_in_path('echanger/formulaire/', '.+[.]php$');
+    $types_echange = array('exporter'=>array(), 'importer'=>array());
+    if (count($liste)){
+        foreach ($liste as $fichier=>$chemin){
+            $type_echange = preg_replace(',[.]php$,i', '', $fichier);
+            $dossier = str_replace($fichier, '', $chemin);
+            // On ne garde que les échanges qui ont bien la fonction
+            if ($f = charger_fonction('exporter', "echanger/formulaire/$type_echange", true)){
+                $types_echange['exporter'][$type_echange] = $f;
+            }
+            if ($f = charger_fonction('importer', "echanger/formulaire/$type_echange", true)){
+                $types_echange['importer'][$type_echange] = $f;
+            }
+        }
+    }
+    return $types_echange;
 }
 
 /*
@@ -87,70 +87,59 @@ function echanges_formulaire_lister_disponibles(){
  * @return string Retourne le nom du cookie
  */
 function formidable_generer_nom_cookie($id_formulaire){
-	return $GLOBALS['cookie_prefix'].'cookie_formidable_'.$id_formulaire;
+    return $GLOBALS['cookie_prefix'].'cookie_formidable_'.$id_formulaire;
 }
 
 /*
  * Vérifie si le visiteur a déjà répondu à un formulaire
  *
  * @param int $id_formulaire L'identifiant du formulaire
- * @param string $options : options du formulaire definies dans l'espace prive
+ * @param string $choix_identification Comment verifier une reponse. Priorite sur 'cookie' ou sur 'id_auteur'
  * @return unknown_type Retourne un tableau contenant les id des réponses si elles existent, sinon false
  */
-function formidable_verifier_reponse_formulaire($id_formulaire, $options){
-	global $auteur_session;
-	$id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
-	$nom_cookie = formidable_generer_nom_cookie($id_formulaire);
-	$cookie = isset($_COOKIE[$nom_cookie]) ? $_COOKIE[$nom_cookie] : false;
+function formidable_verifier_reponse_formulaire($id_formulaire, $choix_identification='cookie'){
+    global $auteur_session;
+    $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
+    $nom_cookie = formidable_generer_nom_cookie($id_formulaire);
+    $cookie = isset($_COOKIE[$nom_cookie]) ? $_COOKIE[$nom_cookie] : false;
+
+    // ni cookie ni id, on ne peut rien faire
+    if (!$cookie and !$id_auteur) {
+        return false;
+    }
 
-	$anonymiser = isset($options['anonymiser']) ? $options['anonymiser'] : false;
-	$anonymiser_variable = isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : '';
+    // priorite sur le cookie
+    if ($choix_identification == 'cookie' or !$choix_identification) {
+        if ($cookie)
+            $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.intval($id_auteur).')' : ')');
+        else
+            $where = 'id_auteur='.intval($id_auteur);
+    }
+
+    // sinon sur l'id_auteur
+    else {
+        if ($id_auteur)
+            $where = 'id_auteur='.intval($id_auteur);
+        else
+            $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.intval($id_auteur).')' : ')');
+    }
 
-	// traitement de l'anonymisation
-	if ($anonymiser != false) {
-	    // mod de l'id_auteur
-	    $variables_anonymisation =
-	            $GLOBALS['formulaires']['variables_anonymisation'][$options['anonymiser_variable']];
-	    $id = eval("return $variables_anonymisation;");
-	    $id_auteur = formidable_scramble($id);
-	}
-	// ni cookie ni id, on ne peut rien faire
-	if (!$cookie and !$id_auteur) {
-		return false;
-	}
-	
-	// priorite sur le cookie
-	if ($choix_identification == 'cookie' or !$choix_identification) {
-		if ($cookie)
-			$where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.$id_auteur.')' : ')');
-		else
-			$where = 'id_auteur='.$id_auteur;
-	}
-	
-	// sinon sur l'id_auteur
-	else {
-		if ($id_auteur)
-			$where = 'id_auteur='.$id_auteur;
-		else
-			$where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.$id_auteur.')' : ')');
-	}
-	
-	$reponses = sql_allfetsel(
-		'id_formulaires_reponse',
-		'spip_formulaires_reponses',
-		array(
-			array('=', 'id_formulaire', intval($id_formulaire)),
-			array('=', 'statut', sql_quote('publie')),
-			$where
-		),
-		'',
-		'date'
-	);
-	
-	if (is_array($reponses))
-		return array_map('reset', $reponses);
-	else
-		return false;
+    $reponses = sql_allfetsel(
+        'id_formulaires_reponse',
+        'spip_formulaires_reponses',
+        array(
+            array('=', 'id_formulaire', intval($id_formulaire)),
+            array('=', 'statut', sql_quote('publie')),
+            $where
+        ),
+        '',
+        'date'
+    );
+
+    if (is_array($reponses))
+        return array_map('reset', $reponses);
+    else
+        return false;
 }
 
 /*
@@ -160,162 +149,68 @@ function formidable_verifier_reponse_formulaire($id_formulaire, $options){
  * @param array $env L'environnement, contenant normalement la réponse à la saisie
  * @return string Retour le HTML des vues
  */
-function formidable_analyser_saisie($saisie, $valeurs=array(), $reponses_total=0, $format_brut=false) {
-	// Si le paramètre n'est pas bon ou que c'est un conteneur, on génère du vide
-	if (!is_array($saisie) or (isset($saisie['saisies']) and $saisie['saisies']))
-		return '';
-	
-	$contexte = array('reponses_total'=>$reponses_total);
-	
-	// On sélectionne le type de saisie
-	$contexte['type_saisie'] = $saisie['saisie'];
-	
-	// Peut-être des transformations à faire sur les options textuelles
-	$options = $saisie['options'];
-	foreach ($options as $option => $valeur){
-		$options[$option] = _T_ou_typo($valeur, 'multi');
-	}
-	
-	// On ajoute les options propres à la saisie
-	$contexte = array_merge($contexte, $options);
-	
-	// On récupère toutes les valeurs du champ
-	if (isset($valeurs[$contexte['nom']]) and $valeurs[$contexte['nom']] and is_array($valeurs[$contexte['nom']])){
-		$contexte['valeurs'] = $valeurs[$contexte['nom']];
-	}
-	else{
-		$contexte['valeurs'] = array();
-	}
-	
-	// On génère la saisie
-    if ($format_brut) {
-        return analyser_saisie($contexte);
-    } else {
-        return recuperer_fond(
-            'saisies-analyses/_base',
-            $contexte
-        );
-    }
-}
-
-/*
- * Renvoie une ligne de réponse sous la forme d'un tableau
- *
- * @param array $saisie Un tableau décrivant une saisie
- * @return array Tableau contenant une ligne
- */
-function analyser_saisie($saisie) {
-    if (!isset($saisie['type_saisie']) or $saisie['type_saisie'] == '')
+function formidable_analyser_saisie($saisie, $valeurs=array(), $reponses_total=0){
+    // Si le paramètre n'est pas bon ou que c'est un conteneur, on génère du vide
+    if (!is_array($saisie) or (isset($saisie['saisies']) and $saisie['saisies']))
         return '';
 
-    $ligne = array();
+    $contexte = array('reponses_total'=>$reponses_total);
 
-    switch($saisie['type_saisie']) {
-        case 'selecteur_rubrique' :
-        case 'selecteur_rubrique_article' :
-        case 'selecteur_article' :
-            $ligne['plein'] = count(array_filter($saisie['valeurs']));
-            $ligne['vide'] = count(array_diff_key($saisie['valeurs']
-                , array_filter($saisie['valeurs'])));
-        break;
-        case 'radio' :
-        case 'selection' :
-        case 'selection_multiple' :
-        case 'checkbox' :
-            $stats = array();
-            foreach($saisie['valeurs'] as $valeur) {
-                if (is_array($valeur)) {
-                    foreach($valeur as $choix) {
-                        if (isset($stats["choix-$choix"]))
-                            $stats["choix-$choix"]++;
-                        else $stats["choix-$choix"] = 1;
-                    }
-                } else {
-                    if (isset($stats["choix-$valeur"]))
-                            $stats["choix-$valeur"]++;
-                        else $stats["choix-$valeur"] = 1;
-                }
-            }
-            $datas = is_string($saisie['datas'])
-                ? saisies_chaine2tableau($saisie['datas'])
-                : $saisie['datas'];
-            foreach($datas as $key => $val) {
-                $nb = (isset($stats["choix-$key"]))
-                    ? $stats["choix-$key"]
-                    : 0;
-                $ligne[$val] = $nb;
-            }
-        break;
-        case 'destinataires' :
-            $stats = array();
-            foreach($saisie['valeurs'] as $valeur) {
-                foreach($valeur as $choix) {
-                    if (isset($stats["choix-$choix"]))
-                        $stats["choix-$choix"]++;
-                    else $stats["choix-$choix"] = 1;
-                }
-            }
-            foreach($stats as $key => $val) {
-                $key = str_replace('choix-', '', $key);
-                if ($key == '') $key = '<valeur vide>';
-                $auteur = sql_getfetsel('nom','spip_auteurs',"id_auteur=$key");
-                $ligne[$auteur] = $val;
-            }
-        break;
+    // On sélectionne le type de saisie
+    $contexte['type_saisie'] = $saisie['saisie'];
+
+    // Peut-être des transformations à faire sur les options textuelles
+    $options = $saisie['options'];
+    foreach ($options as $option => $valeur){
+        $options[$option] = _T_ou_typo($valeur, 'multi');
     }
 
-    $vide = 0;
-    foreach($saisie['valeurs'] as $valeur) {
-        if ($valeur == '') $vide++;
-        switch($saisie['type_saisie']) {
-            case 'case' :
-            case 'oui_non' :
-                if(isset($ligne['oui']) == false) $ligne['oui'] = 0;
-                if(isset($ligne['non']) == false) $ligne['non'] = 0;
-                if ($valeur) $ligne['oui']++; else $ligne['non']++;
-            break;
-            case 'input' :
-            case 'hidden' :
-            case 'explication' :
-            break;
-        }
+    // On ajoute les options propres à la saisie
+    $contexte = array_merge($contexte, $options);
+
+    // On récupère toutes les valeurs du champ
+    if (isset($valeurs[$contexte['nom']]) and $valeurs[$contexte['nom']] and is_array($valeurs[$contexte['nom']])){
+        $contexte['valeurs'] = $valeurs[$contexte['nom']];
+    }
+    else{
+        $contexte['valeurs'] = array();
     }
-    $ligne['sans_reponse'] = $vide;
-    $ligne['header'] = $saisie['label'] != ''
-        ? $saisie['label']
-        : $saisie['type_saisie'];
 
-    return $ligne;
+    // On génère la saisie
+    return recuperer_fond(
+        'saisies-analyses/_base',
+        $contexte
+    );
 }
 
 
 /**
- * Tente de déserialiser un texte 
+ * Tente de déserialiser un texte
  *
  * Si le paramètre est un tableau, retourne le tableau,
  * Si c'est une chaîne, tente de la désérialiser, sinon
  * retourne la chaîne.
  *
  * @filtre tenter_unserialize
- * 
+ *
  * @param string|array $texte
  *     Le texte (possiblement sérializé) ou un tableau
  * @return array|string
  *     Tableau, texte désérializé ou texte
 **/
 function filtre_tenter_unserialize_dist($texte) {
-	if (is_array($texte)) {
-		return $texte;
-	}
-	if ($tmp = @unserialize($texte)) {
-		return $tmp;
-	}
-	return $texte;
+    if (is_array($texte)) {
+        return $texte;
+    }
+    if ($tmp = @unserialize($texte)) {
+        return $tmp;
+    }
+    return $texte;
 }
 
 
 /**
- * Retourne un texte du nombre de réponses 
+ * Retourne un texte du nombre de réponses
  *
  * @param int $nb
  *     Nombre de réponses
@@ -323,55 +218,9 @@ function filtre_tenter_unserialize_dist($texte) {
  *     Texte indiquant le nombre de réponses
 **/
 function titre_nb_reponses($nb) {
-	if (!$nb) return _T('formidable:reponse_aucune');
-	if ($nb == 1) return _T('formidable:reponse_une');
-	return _T('formidable:reponses_nb', array('nb' => $nb));
-}
-
-/**
- * Transforme le hash MD5 en une valeur numérique unique
- *
- * trouvé ici : http://stackoverflow.com/questions/1422725/represent-md5-hash-as-an-integer
- * @param string $hex_str La valeur alphanumérique à transformer
- * @return string Valeur numérique
-*/
-function md5_hex_to_dec($hex_str) {
-	$arr = str_split($hex_str, 4);
-	foreach ($arr as $grp) {
-	    $dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT);
-	}
-
-	/* on s'assure que $result ne commence pas par un zero */
-	$result = implode('', $dec);
-	for ($cpt = 0 ; $cpt < strlen($result) ; $cpt++) {
-	    if ($result[$cpt] != '0') break;
-	}
-	$result = substr($result, $cpt);
-	return $result;
-}
-
-/**
- * Transforme un login en une valeur numérique de 19 caractères
- *
- * NOTE: il devient impossible de retrouver la valeur d'origine car le HASH
- * est coupé à 19cars et est donc incomplet. L'unicité n'est pas garantie mais
- * les chances pour que deux logins tombent sur le même HASH sont de 1 sur
- * 10 milliards de milliards
- * A la fin, on recherche et supprime les éventuels zéros de début
- * @param string $login Login à transformer
- * @param string $passwd Chaîne 'secrète' ajoutée au login et id_formulaire pour éviter
- *  les recoupements d'identité entre plusieurs formulaires
- * @return string Un nombre de 19 chiffres
-*/
-function formidable_scramble($login, $passwd = '') {
-	$id_form = (isset($flux['args']['id_form']) ? $flux['args']['id_form'] : '');
-	if ($passwd == '')
-	    $passwd = $GLOBALS['formulaires']['passwd']['interne'];
-	$login_md5 = md5("$login$passwd$id_form");
-	$login_num = md5_hex_to_dec($login_md5);
-	$login_num = substr($login_num, 0, 19);
-
-	return $login_num;
+    if (!$nb) return _T('formidable:reponse_aucune');
+    if ($nb == 1) return _T('formidable:reponse_une');
+    return _T('formidable:reponses_nb', array('nb' => $nb));
 }
 
 ?>
diff --git a/prive/squelettes/extra/formulaires_analyse.html b/prive/squelettes/extra/formulaires_analyse.html
deleted file mode 100755
index 9810f7574dca1ea3243dd4158bced28830301f1a..0000000000000000000000000000000000000000
--- a/prive/squelettes/extra/formulaires_analyse.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<BOUCLE_formulaire(FORMULAIRES){id_formulaire}>
-<BOUCLE_autoriser(CONDITION){si #AUTORISER{voir, formulaires_analyse}}>
-[(#BOITE_OUVRIR{<:formidable:titre_cadre_raccourcis:>,'info'})]
-[(#URL_ACTION_AUTEUR{exporter_analyse_reponses,#ID_FORMULAIRE}
-    |icone_horizontale{<:formidable:analyse_exporter:>,formulaire,formulaire-analyse-exporter-24,center})]
-#BOITE_FERMER
-</BOUCLE_autoriser>
-</BOUCLE_formulaire>
diff --git a/traiter/enregistrement.php b/traiter/enregistrement.php
index 8edaaa518937f2f1385fdaebadadea4263ae87c0..4a5115af7ace5aab0f768a8a12e4a909c1dda910 100644
--- a/traiter/enregistrement.php
+++ b/traiter/enregistrement.php
@@ -4,135 +4,126 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 function traiter_enregistrement_dist($args, $retours){
-	include_spip('inc/formidable');
-	include_spip('base/abstract_sql');
-	$options = $args['options'];
-	$formulaire = $args['formulaire'];
-	$id_formulaire = intval($formulaire['id_formulaire']);
-	$saisies = unserialize($formulaire['saisies']);
-	$saisies = saisies_lister_par_nom($saisies);
-	
-	// La personne a-t-elle un compte ?
-	global $auteur_session;
-	$id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
-	
-	// traitement de l'anonymisation
-	if ($options['anonymiser'] == 'on') {
-		// mod de l'id_auteur
-		$variables_anonymisation =
-			$GLOBALS['formulaires']['variables_anonymisation'][$options['anonymiser_variable']];
-		$id = eval("return $variables_anonymisation;");
-		$id_auteur = formidable_scramble($id);
-	}
-
-	// On cherche le cookie et sinon on le crée
-	$nom_cookie = formidable_generer_nom_cookie($id_formulaire);
-	if (isset($_COOKIE[$nom_cookie]))
-		$cookie = $_COOKIE[$nom_cookie];
-	else {
-		include_spip("inc/acces");
-		$cookie = creer_uniqid();
-	}
-	
-	// On regarde si c'est une modif d'une réponse existante
-	$id_formulaires_reponse = intval(_request('deja_enregistre_'.$id_formulaire));
-	
-	// Si la moderation est a posteriori ou que la personne est un boss, on publie direct
-	if ($options['moderation'] == 'posteriori' or autoriser('instituer', 'formulaires_reponse', $id_formulaires_reponse, null, array('id_formulaire'=>$id_formulaire, 'nouveau_statut'=>'publie')))
-		$statut='publie';
-	else
-		$statut = 'prop';
-	
-	// Si ce n'est pas une modif d'une réponse existante, on crée d'abord la réponse
-	if (!$id_formulaires_reponse){
-		$id_formulaires_reponse = sql_insertq(
-			'spip_formulaires_reponses',
-			array(
-				'id_formulaire' => $id_formulaire,
-				'id_auteur' => $id_auteur,
-				'cookie' => $cookie,
-				'ip' => $GLOBALS['ip'],
-				'date' => 'NOW()',
-				'statut' => $statut
-			)
-		);
-		// Si on a pas le droit de répondre plusieurs fois ou que les réponses seront modifiables, il faut poser un cookie
-		if (!$options['multiple'] or $options['modifiable']){
-			include_spip("inc/cookie");
-			// Expiration dans 30 jours
-			spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie, time() + 30 * 24 * 3600);
-		}
-	}
-	
-	// Si l'id n'a pas été créé correctement alors erreur
-	if (!($id_formulaires_reponse > 0)){
-		$retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_enregistrement_erreur_base');
-	}
-	// Sinon on continue à mettre à jour
-	else{
-		$champs = array();
-		$insertions = array();
-		foreach($saisies as $nom => $saisie){
-			// On ne prend que les champs qui ont effectivement été envoyés par le formulaire
-			if (($valeur = _request($nom)) !== null){
-				$champs[] = $nom;
-				$insertions[] = array(
-					'id_formulaires_reponse' => $id_formulaires_reponse,
-					'nom' => $nom,
-					'valeur' => is_array($valeur) ? serialize($valeur) : $valeur
-				);
-			}
-		}
-		
-		// S'il y a bien des choses à modifier
-		if ($champs){
-			// On supprime d'abord les champs
-			sql_delete(
-				'spip_formulaires_reponses_champs',
-				array(
-					'id_formulaires_reponse = '.$id_formulaires_reponse,
-					sql_in('nom', $champs)
-				)
-			);
-			
-			// Puis on insère les nouvelles valeurs
-			sql_insertq_multi(
-				'spip_formulaires_reponses_champs',
-				$insertions
-			);
-		}
-	}
-	
-	return $retours;
+    include_spip('inc/formidable');
+    include_spip('base/abstract_sql');
+    $options = $args['options'];
+    $formulaire = $args['formulaire'];
+    $id_formulaire = intval($formulaire['id_formulaire']);
+    $saisies = unserialize($formulaire['saisies']);
+    $saisies = saisies_lister_par_nom($saisies);
+
+    // La personne a-t-elle un compte ?
+    global $auteur_session;
+    $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
+
+    // On cherche le cookie et sinon on le crée
+    $nom_cookie = formidable_generer_nom_cookie($id_formulaire);
+    if (isset($_COOKIE[$nom_cookie]))
+        $cookie = $_COOKIE[$nom_cookie];
+    else {
+        include_spip("inc/acces");
+        $cookie = creer_uniqid();
+    }
+
+    // On regarde si c'est une modif d'une réponse existante
+    $id_formulaires_reponse = intval(_request('deja_enregistre_'.$id_formulaire));
+
+    // Si la moderation est a posteriori ou que la personne est un boss, on publie direct
+    if ($options['moderation'] == 'posteriori' or autoriser('instituer', 'formulaires_reponse', $id_formulaires_reponse, null, array('id_formulaire'=>$id_formulaire, 'nouveau_statut'=>'publie')))
+        $statut='publie';
+    else
+        $statut = 'prop';
+
+    // Si ce n'est pas une modif d'une réponse existante, on crée d'abord la réponse
+    if (!$id_formulaires_reponse){
+        $id_formulaires_reponse = sql_insertq(
+            'spip_formulaires_reponses',
+            array(
+                'id_formulaire' => $id_formulaire,
+                'id_auteur' => $id_auteur,
+                'cookie' => $cookie,
+                'ip' => $GLOBALS['ip'],
+                'date' => 'NOW()',
+                'statut' => $statut
+            )
+        );
+        // Si on a pas le droit de répondre plusieurs fois ou que les réponses seront modifiables, il faut poser un cookie
+        if (!$options['multiple'] or $options['modifiable']){
+            include_spip("inc/cookie");
+            // Expiration dans 30 jours
+            spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie, time() + 30 * 24 * 3600);
+        }
+    }
+
+    // Si l'id n'a pas été créé correctement alors erreur
+    if (!($id_formulaires_reponse > 0)){
+        $retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_enregistrement_erreur_base');
+    }
+    // Sinon on continue à mettre à jour
+    else{
+        $champs = array();
+        $insertions = array();
+        foreach($saisies as $nom => $saisie){
+            // On ne prend que les champs qui ont effectivement été envoyés par le formulaire
+            if (($valeur = _request($nom)) !== null){
+                $champs[] = $nom;
+                $insertions[] = array(
+                    'id_formulaires_reponse' => $id_formulaires_reponse,
+                    'nom' => $nom,
+                    'valeur' => is_array($valeur) ? serialize($valeur) : $valeur
+                );
+            }
+        }
+
+        // S'il y a bien des choses à modifier
+        if ($champs){
+            // On supprime d'abord les champs
+            sql_delete(
+                'spip_formulaires_reponses_champs',
+                array(
+                    'id_formulaires_reponse = '.$id_formulaires_reponse,
+                    sql_in('nom', $champs)
+                )
+            );
+
+            // Puis on insère les nouvelles valeurs
+            sql_insertq_multi(
+                'spip_formulaires_reponses_champs',
+                $insertions
+            );
+        }
+    }
+
+    return $retours;
 }
 
 function traiter_enregistrement_update_dist($id_formulaire, $traitement, $saisies_anciennes, $saisies_nouvelles){
-	include_spip('inc/saisies');
-	include_spip('base/abstract_sql');
-	$comparaison = saisies_comparer($saisies_anciennes, $saisies_nouvelles);
-	
-	// Si des champs ont été supprimés, il faut supprimer les réponses à ces champs
-	if ($comparaison['supprimees']){
-		// On récupère les réponses du formulaire
-		$reponses = sql_allfetsel(
-			'id_formulaires_reponse',
-			'spip_formulaires_reponses',
-			'id_formulaire = '.$id_formulaire
-		);
-		$reponses = array_map('reset', $reponses);
-		
-		// Tous les noms de champs à supprimer
-		$noms = array_keys($comparaison['supprimees']);
-		
-		// On supprime
-		sql_delete(
-			'spip_formulaires_reponses_champs',
-			array(
-				sql_in('id_formulaires_reponse', $reponses),
-				sql_in('nom', $noms)
-			)
-		);
-	}
+    include_spip('inc/saisies');
+    include_spip('base/abstract_sql');
+    $comparaison = saisies_comparer($saisies_anciennes, $saisies_nouvelles);
+
+    // Si des champs ont été supprimés, il faut supprimer les réponses à ces champs
+    if ($comparaison['supprimees']){
+        // On récupère les réponses du formulaire
+        $reponses = sql_allfetsel(
+            'id_formulaires_reponse',
+            'spip_formulaires_reponses',
+            'id_formulaire = '.$id_formulaire
+        );
+        $reponses = array_map('reset', $reponses);
+
+        // Tous les noms de champs à supprimer
+        $noms = array_keys($comparaison['supprimees']);
+
+        // On supprime
+        sql_delete(
+            'spip_formulaires_reponses_champs',
+            array(
+                sql_in('id_formulaires_reponse', $reponses),
+                sql_in('nom', $noms)
+            )
+        );
+    }
 }
 
 ?>
diff --git a/traiter/enregistrement.yaml b/traiter/enregistrement.yaml
index 41c9ced81d11b7ff95abf4ff9452d69633417214..3fae3210633292047b494c64795a2cc709d11650 100644
--- a/traiter/enregistrement.yaml
+++ b/traiter/enregistrement.yaml
@@ -26,24 +26,6 @@ options:
         cookie: '<:formidable:identification_par_cookie:>'
         id_auteur: '<:formidable:identification_par_id_auteur:>'
       defaut: 'cookie'
-  -
-    saisie: 'oui_non'
-    options:
-      nom: 'anonymiser'
-      label: '<:formidable:traiter_enregistrement_option_anonymiser_label:>'
-      explication: '<:formidable:traiter_enregistrement_option_anonymiser_explication:>'
-      defaut: ''
-  -
-    saisie: 'selection'
-    options:
-      option_intro: '<:formidable:traiter_enregistrement_option_choix_select_label:>'
-      nom: 'anonymiser_variable'
-      label: '<:formidable:traiter_enregistrement_option_anonymiser_variable_label:>'
-      explication: '<:formidable:traiter_enregistrement_option_anonymiser_variable_explication:>'
-      datas:
-        remote_user: "Variable serveur : REMOTE_USER"
-        php_auth_user: "Variable serveur : PHP_AUTH_USER"
-      defaut: ''
   -
     saisie: 'radio'
     options: