diff --git a/formulaires/formidable.php b/formulaires/formidable.php
index d9c998213fd1acec89608a25c542db797408f1e0..49598f3483e646bb3a1dc2b5b46bed22d025a90d 100644
--- a/formulaires/formidable.php
+++ b/formulaires/formidable.php
@@ -1,220 +1,233 @@
 <?php
 
 /**
- * Gestion de l'affichage et traitement d'un formulaire Formidable
- *
- * @package SPIP\Formidable\Formulaires
- **/
+* Gestion de l'affichage et traitement d'un formulaire Formidable
+*
+* @package SPIP\Formidable\Formulaires
+**/
 
 // Sécurité
 if (!defined('_ECRIRE_INC_VERSION')) {
-	return;
+return;
 }
 
 include_spip('inc/formidable');
 include_spip('inc/saisies');
 include_spip('base/abstract_sql');
 include_spip('inc/autoriser');
+include_spip('plugins/installer');
 
 function formidable_id_formulaire($id) {
-	// on utilise une static pour etre sur que si l'appel dans verifier() passe, celui dans traiter() passera aussi
-	// meme si entre temps on perds la base
-	static $id_formulaires = array();
-	if (isset($id_formulaires[$id])) {
-		return $id_formulaires[$id];
-	}
+// on utilise une static pour etre sur que si l'appel dans verifier() passe, celui dans traiter() passera aussi
+// meme si entre temps on perds la base
+static $id_formulaires = array();
+if (isset($id_formulaires[$id])) {
+	return $id_formulaires[$id];
+}
 
-	if (is_numeric($id)) {
-		$where = 'id_formulaire = ' . intval($id);
-	} elseif (is_string($id)) {
-		$where = 'identifiant = ' . sql_quote($id);
-	} else {
-		return 0;
-	}
+if (is_numeric($id)) {
+	$where = 'id_formulaire = ' . intval($id);
+} elseif (is_string($id)) {
+	$where = 'identifiant = ' . sql_quote($id);
+} else {
+	return 0;
+}
 
-	$id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires', $where));
+$id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires', $where));
 
-	if ($id_formulaire
-		and !test_espace_prive()
-		and !objet_test_si_publie('formulaire', $id_formulaire)) {
-		return $id_formulaires[$id] = 0;
-	}
+if ($id_formulaire
+	and !test_espace_prive()
+	and !objet_test_si_publie('formulaire', $id_formulaire)) {
+	return $id_formulaires[$id] = 0;
+}
 
-	return $id_formulaires[$id] = $id_formulaire;
+return $id_formulaires[$id] = $id_formulaire;
 }
 
 /**
- * Chargement du formulaire CVT de Formidable.
- *
- * Genere le formulaire dont l'identifiant (numerique ou texte est indique)
- *
- * @param int|string $id
- *     Identifiant numerique ou textuel du formulaire formidable
- * @param array $valeurs
- *     Valeurs par défauts passées au contexte du formulaire
- *     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.
- **/
+* Chargement du formulaire CVT de Formidable.
+*
+* Genere le formulaire dont l'identifiant (numerique ou texte est indique)
+*
+* @param int|string $id
+*     Identifiant numerique ou textuel du formulaire formidable
+* @param array $valeurs
+*     Valeurs par défauts passées au contexte du formulaire
+*     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, $valeurs = array(), $id_formulaires_reponse = false) {
-	$contexte = array();
+$contexte = array();
 
-	// On peut donner soit un id soit un identifiant
-	if (!$id_formulaire = formidable_id_formulaire($id)) {
-		return;
-	}
+// On peut donner soit un id soit un identifiant
+if (!$id_formulaire = formidable_id_formulaire($id)) {
+	return;
+}
 
-	// On cherche si le formulaire existe
-	if ($formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) {
-		// On ajoute un point d'entrée avec les infos de ce formulaire
-		// pour d'eventuels plugins qui en ont l'utilité
-		$contexte['_formidable'] = $formulaire;
-		
-		// Classes CSS 
-		$contexte['_css'] = $formulaire['css'];
-
-		// 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']);
-
-			// Si on est en train de réafficher les valeurs postées,
-			// ne pas afficher les saisies hidden
-			if ($formulaire['apres'] == 'valeurs'
-				and _request('formidable_afficher_apres') == 'valeurs'
-			) {
-				foreach ($saisies as $k => $saisie) {
-					if (isset($saisie['saisie'])
-						and $saisie['saisie'] == 'hidden'
-					) {
-						unset($saisies[$k]);
-					}
+// On cherche si le formulaire existe
+if ($formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) {
+	// On ajoute un point d'entrée avec les infos de ce formulaire
+	// pour d'eventuels plugins qui en ont l'utilité
+	$contexte['_formidable'] = $formulaire;
+	
+	// Classes CSS 
+	$contexte['_css'] = $formulaire['css'];
+
+	// 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']);
+
+		// Si on est en train de réafficher les valeurs postées,
+		// ne pas afficher les saisies hidden
+		if ($formulaire['apres'] == 'valeurs'
+			and _request('formidable_afficher_apres') == 'valeurs'
+		) {
+			foreach ($saisies as $k => $saisie) {
+				if (isset($saisie['saisie'])
+					and $saisie['saisie'] == 'hidden'
+				) {
+					unset($saisies[$k]);
 				}
 			}
+		}
 
-			// On déclare les champs avec les valeurs par défaut
-			$contexte = array_merge(saisies_lister_valeurs_defaut($saisies), $contexte);
-			$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 déclare les champs avec les valeurs par défaut
+		$contexte = array_merge(saisies_lister_valeurs_defaut($saisies), $contexte);
+		$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];
 					}
 				}
+			}
 
-				// Si on a un tableau,
-				// alors on écrase avec les valeurs données depuis l'appel
-				if ($valeurs and is_array($valeurs)) {
-					$contexte = array_merge($contexte, $valeurs);
-				}
+			// Si on a un tableau,
+			// alors on écrase avec les valeurs données depuis l'appel
+			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 == false) {
-					$contexte['editable'] = false;
-					$contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante');
-				}
-			} else {
-				// calcul des paramètres d'anonymisation
-				$options = isset($traitements['enregistrement']) ? $traitements['enregistrement'] : null;
-
-				$anonymisation = (isset($options['anonymiser']) && $options['anonymiser']==true)
-					? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
-					: '';
-
-				// Si multiple = non mais que c'est modifiable, alors on va chercher
-				// la dernière réponse si elle existe
-				if ($options
-					and !$options['multiple']
-					and $options['modifiable']
-					and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification'], $anonymisation)
-				) {
-					$id_formulaires_reponse = array_pop($reponses);
-					$contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
-				}
+		// 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 == false) {
+				$contexte['editable'] = false;
+				$contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante');
 			}
 		} 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');
+			// calcul des paramètres d'anonymisation
+			$options = isset($traitements['enregistrement']) ? $traitements['enregistrement'] : null;
+
+			$anonymisation = (isset($options['anonymiser']) && $options['anonymiser']==true)
+				? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
+				: '';
+
+			// Si multiple = non mais que c'est modifiable, alors on va chercher
+			// la dernière réponse si elle existe
+			if ($options
+				and !$options['multiple']
+				and $options['modifiable']
+				and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification'], $anonymisation)
+			) {
+				$id_formulaires_reponse = array_pop($reponses);
+				$contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
 			}
 		}
 	} else {
 		$contexte['editable'] = false;
-		$contexte['message_erreur'] = _T('formidable:erreur_inexistant');
-	}
-	if (!isset($contexte['_hidden'])) {
-		$contexte['_hidden'] = '';
+		// 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');
+		}
 	}
-	$contexte['_hidden'] .= "\n" . '<input type="hidden" name="formidable_afficher_apres' /*.$formulaire['id_formulaire']*/ . '" value="' . $formulaire['apres'] . '"/>'; // marche pas
+} 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'];
+$contexte['formidable_afficher_apres'] = $formulaire['apres'];
 
-	return $contexte;
+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.
- *
- * @param int|string $id
- *     Identifiant numerique ou textuel du formulaire formidable
- * @param array $valeurs
- *     Valeurs par défauts passées au contexte du formulaire
- *     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
- **/
+* 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.
+*
+* @param int|string $id
+*     Identifiant numerique ou textuel du formulaire formidable
+* @param array $valeurs
+*     Valeurs par défauts passées au contexte du formulaire
+*     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, $valeurs = array(), $id_formulaires_reponse = false) {
-	$erreurs = array();
+$erreurs = array();
+
+// On peut donner soit un id soit un identifiant
+if (!$id_formulaire = formidable_id_formulaire($id)) {
+	$erreurs['message_erreur'] = _T('formidable:erreur_base');
+} else {
+	// Sale bête !
+	if (_request('mechantrobot')!='') {
+		$erreurs['hahahaha'] = 'hahahaha';
+		return $erreurs;
+	}
 
-	// On peut donner soit un id soit un identifiant
-	if (!$id_formulaire = formidable_id_formulaire($id)) {
-		$erreurs['message_erreur'] = _T('formidable:erreur_base');
-	} else {
-		// Sale bête !
-		if (_request('mechantrobot')!='') {
-			$erreurs['hahahaha'] = 'hahahaha';
-			return $erreurs;
-		}
+	$formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire));
+	$saisies = unserialize($formulaire['saisies']);
 
-		$formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire));
-		$saisies = unserialize($formulaire['saisies']);
+	$erreurs_par_fichier = array(); 
+	$erreurs = saisies_verifier($saisies,true,$erreurs_par_fichier);
 
-		$erreurs = saisies_verifier($saisies);
+	// On supprime de $_FILES les fichiers envoyés qui ne passent pas le test de vérification	
+	
+	//$infos_plugins = charger_fonction('infos_plugins','plugins');
+	$plugins_actifs = liste_plugin_actifs();
+	if (isset($plugins_actifs['CVTUPLOAD'])) {
+		include_spip('inc/cvtupload');
+		foreach ($erreurs as $champ => $erreur) {
+				cvtupload_nettoyer_files_selon_erreurs($champ, $erreurs_par_fichier[$champ]);
+				}
+		}
 
 		// Si on a pas déjà une erreur sur le champ unicite, on lance une verification
 		if ($formulaire['unicite'] != '') {