diff --git a/.gitattributes b/.gitattributes
index b66f74c497a815ada9b303fa80c1ce982c335bdf..db2fe815e9fe410fe5049258ac77b06165a5dd79 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -451,6 +451,7 @@ ecrire/inc/install_ldap3.php -text
 ecrire/inc/install_ldap4.php -text
 ecrire/inc/install_ldap5.php -text
 ecrire/inc/install_unpack.php -text
+ecrire/inc/joindre.php -text
 ecrire/inc/lang_liste.php -text
 ecrire/inc/legender.php -text
 ecrire/inc/maintenance.php -text
diff --git a/ecrire/exec/articles.php b/ecrire/exec/articles.php
index aea0ce81c733a45c7c655a0bd74c1e5998e2e163..d8b271e73a2454f58e963438c172b4bcfc64ae63 100644
--- a/ecrire/exec/articles.php
+++ b/ecrire/exec/articles.php
@@ -14,12 +14,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
 include_spip('inc/texte');
-include_spip('inc/rubriques');
 include_spip('inc/actions');
-include_spip('inc/mots');
-include_spip('inc/forum');
-include_spip('inc/documents');
-include_spip('base/abstract_sql');
 
 // http://doc.spip.org/@exec_articles_dist
 function exec_articles_dist()
@@ -135,35 +130,32 @@ debut_cadre_relief();
 		$modif = array();
  }
 
-//
-// Titre, surtitre, sous-titre
-//
+ $dater = charger_fonction('dater', 'inc');
+ $auteurs = charger_fonction('editer_auteurs', 'inc');
 
- echo titres_articles($titre, $statut_article,$surtitre, $soustitre, $descriptif, $url_site, $nom_site, $flag_editable, $id_article, $id_rubrique, $modif),
-   "<div class='serif' align='$spip_lang_left'>";
+ if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non')
+   $mots = charger_fonction('editer_mot', 'inc');
+ else $mots = '';
 
- $f = charger_fonction('dater', 'inc');
- echo $f($id_article, $flag_editable, $statut_article, $date, $date_redac);
+ if (($GLOBALS['meta']['multi_articles'] == 'oui')
+	OR (($GLOBALS['meta']['multi_rubriques'] == 'oui') AND ($GLOBALS['meta']['gerer_trad'] == 'oui'))) 
+	$traduction = charger_fonction('referencer_traduction', 'inc');
+ else $traduction ='';
 
- $f = charger_fonction('editer_auteurs', 'inc');
- echo $f($id_article, $flag_editable, $cherche_auteur, $ids);
+ echo titres_articles($titre, $statut_article,$surtitre, $soustitre, $descriptif, $url_site, $nom_site, $flag_editable, $id_article, $id_rubrique, $modif),
 
+   "<div>&nbsp;</div>",
+   "<div class='serif' align='$spip_lang_left'>",
 
-if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
-  $f = charger_fonction('editer_mot', 'inc');
-  echo $f('article', $id_article, $cherche_mot, $select_groupe, $flag_editable);
-}
+   $dater($id_article, $flag_editable, $statut_article, $date, $date_redac),
 
-// Les langues
+   $auteurs($id_article, $flag_editable, $cherche_auteur, $ids),
 
-  if (($GLOBALS['meta']['multi_articles'] == 'oui')
-	OR (($GLOBALS['meta']['multi_rubriques'] == 'oui') AND ($GLOBALS['meta']['gerer_trad'] == 'oui'))) {
+   (!$mots ? '' : $mots('article', $id_article, $cherche_mot, $select_groupe, $flag_editable)),
 
-	$f = charger_fonction('referencer_traduction', 'inc');
-	echo $f($id_article, $flag_editable, $id_rubrique, $id_trad, $trad_err);
-  }
+   (!$traduction ? '' : $traduction($id_article, $flag_editable, $id_rubrique, $id_trad, $trad_err)),
 
- echo pipeline('affiche_milieu',array('args'=>array('exec'=>'articles','id_article'=>$id_article),'data'=>''));
+   pipeline('affiche_milieu',array('args'=>array('exec'=>'articles','id_article'=>$id_article),'data'=>''));
 
  if ($statut_rubrique)
    echo debut_cadre_relief('', true),
@@ -181,8 +173,31 @@ if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
 	  "</div>";
 }
 
- if ($spip_display != 4)
-	echo formulaire_joindre($id_article, "article", 'articles', $flag_editable);
+ if ($spip_display != 4) {
+
+   if  ($GLOBALS['meta']["documents_$type"]!='non' AND $flag_editable) {
+
+	  $f = charger_fonction('joindre', 'inc');
+	  $res = debut_cadre_relief("image-24.gif", true, "", _T('titre_joindre_document'))
+	  . $f('articles', "id_article=$id_article", $id_article, _T('info_telecharger_ordinateur'), 'document', 'article')
+	  . fin_cadre_relief(true);
+
+	// eviter le formulaire upload qui se promene sur la page
+	// a cause des position:relative incompris de MSIE
+
+	  if (!($align = $GLOBALS['browser_name']=="MSIE")) {
+		$res = "\n<table width='50%' cellpadding='0' cellspacing='0' border='0'>\n<tr><td style='text-align: $spip_lang_left;'>\n$res</td></tr></table>";
+		$align = " align='right'";
+	  }
+	  $res = "<div$align>$res</div>";
+   } else $res ='';
+
+   $f = charger_fonction('documenter', 'inc');
+
+   echo $f($id_article, 'article', 'portfolio', $flag_editable)
+     . $f($id_article, 'article', 'documents', $flag_editable)
+     . $res;
+ }
 
  if ($flag_auteur AND  $statut_article == 'prepa' AND !$statut_rubrique)
 	echo demande_publication($id_article);
@@ -416,7 +431,6 @@ function titres_articles($titre, $statut_article,$surtitre, $soustitre, $descrip
 
 
 	$res .= "</tr></table>\n";
-	$res .= "<div>&nbsp;</div>";
 	return $res;
 }
 
diff --git a/ecrire/exec/naviguer.php b/ecrire/exec/naviguer.php
index e277170db571ac31b9562e17f6046795e1e67dbd..580487f60d3949aa024c034fefc8235b5026b220 100644
--- a/ecrire/exec/naviguer.php
+++ b/ecrire/exec/naviguer.php
@@ -409,7 +409,7 @@ if ($relief) {
 /// Documents associes a la rubrique
 	if ($id_rubrique > 0) {
 
-	echo formulaire_joindre($id_rubrique, "rubrique", 'naviguer', $flag_editable);
+	echo naviguer_doc($id_rubrique, "rubrique", 'naviguer', $flag_editable);
 	}
 
 
@@ -418,6 +418,33 @@ if ($relief) {
 	bouton_supprimer_naviguer($id_rubrique, $id_parent, $ze_logo, $flag_editable);
 }
 
+function naviguer_doc ($id, $type = "article", $script, $flag_editable) {
+	global $spip_lang_left;
+
+	if ($GLOBALS['meta']["documents_$type"]!='non' AND $flag_editable) {
+
+	  $f = charger_fonction('joindre', 'inc');
+	  $res = debut_cadre_relief("image-24.gif", true, "", _T('titre_joindre_document'))
+	  . $f($script, "id_$type=$id", $id, _T('info_telecharger_ordinateur'), 'document', $type)
+	  . fin_cadre_relief(true);
+
+	// eviter le formulaire upload qui se promene sur la page
+	// a cause des position:relative incompris de MSIE
+
+	  if (!($align = $GLOBALS['browser_name']=="MSIE")) {
+		$res = "\n<table width='50%' cellpadding='0' cellspacing='0' border='0'>\n<tr><td style='text-align: $spip_lang_left;'>\n$res</td></tr></table>";
+		$align = " align='right'";
+	  }
+	  $res = "<div$align>$res</div>";
+	} else $res ='';
+
+	$f = charger_fonction('documenter', 'inc');
+
+	return $f($id, $type, 'portfolio', $flag_editable)
+	. $f($id, $type, 'documents', $flag_editable)
+	. $res;
+}
+
 // http://doc.spip.org/@montre_naviguer
 function montre_naviguer($id_rubrique, $titre, $descriptif, $logo, $flag_editable)
 {
diff --git a/ecrire/inc/documents.php b/ecrire/inc/documents.php
index bfc245a47a5621c569907581054491321fbd3a67..9f63fff8669b0624ef8f00d67a6bf0f03e304c33 100644
--- a/ecrire/inc/documents.php
+++ b/ecrire/inc/documents.php
@@ -107,199 +107,6 @@ function document_et_vignette($document, $url, $portfolio=false) {
 		return "<a href='$url'\n\ttype='$mime'>$image</a>";
 }
 
-//
-// Retourner le code HTML d'utilisation de fichiers envoyes
-//
-
-// http://doc.spip.org/@texte_upload_manuel
-function texte_upload_manuel($dir, $inclus = '', $mode = 'document') {
-	$fichiers = preg_files($dir);
-	$exts = array();
-	$dirs = array(); 
-	$texte_upload = array();
-	foreach ($fichiers as $f) {
-		$f = preg_replace(",^$dir,",'',$f);
-		if (ereg("\.([^.]+)$", $f, $match)) {
-			$ext = strtolower($match[1]);
-			if (!isset($exts[$ext])) {
-				if ($ext == 'jpeg') $ext = 'jpg'; # cf. corriger_extension dans inc/getdocument
-				if (spip_abstract_fetsel('extension', 'spip_types_documents', "extension='$ext'" . (!$inclus ? '':  " AND inclus='$inclus'")))
-					$exts[$ext] = 'oui';
-				else $exts[$ext] = 'non';
-			}
-			
-			$k = 2*substr_count($f,'/');
-			$n = strrpos($f, "/");
-			if ($n === false)
-			  $lefichier = $f;
-			else {
-			  $lefichier = substr($f, $n+1, strlen($f));
-			  $ledossier = substr($f, 0, $n);
-			  if (!in_array($ledossier, $dirs)) {
-				$texte_upload[] = "\n<option value=\"$ledossier\">"
-				. str_repeat("&nbsp;",$k) 
-				._T('tout_dossier_upload', array('upload' => $ledossier))
-				."</option>";
-				$dirs[]= $ledossier;
-			  }
-			}
-
-			if ($exts[$ext] == 'oui')
-			  $texte_upload[] = "\n<option value=\"$f\">" .
-			    str_repeat("&nbsp;",$k+2) .
-			    $lefichier .
-			    "</option>";
-		}
-	} 
-
-	$texte = join('', $texte_upload);
-
-	if ($mode == "document" AND count($texte_upload)>1) {
-		$texte = "\n<option value=\"/\" style='font-weight: bold;'>"
-				._T('info_installer_tous_documents')
-				."</option>" . $texte;
-	}
-
-	return $texte;
-}
-
-
-//
-// Construire un formulaire pour telecharger un fichier
-//
-
-function formulaire_upload($script, $args, $id=0, $intitule='', $mode='', $type='', $ancre='', $id_document=0) {
-	global $spip_lang_right;
-	$vignette_de_doc = ($mode == 'vignette' AND $id_document>0);
-	$distant = ($mode == 'document' AND $type);
-	if ($intitule) $intitule = "<span>$intitule</span><br />";
-
-	if (!_DIR_RESTREINT AND !$vignette_de_doc) {
-		$dir_ftp = determine_upload();
-		// quels sont les docs accessibles en ftp ?
-		$l = texte_upload_manuel($dir_ftp, '', $mode);
-		// s'il n'y en a pas, on affiche un message d'aide
-		// en mode document, mais pas en mode vignette
-		if ($l OR ($mode == 'document'))
-			$dir_ftp = afficher_transferer_upload($l);
-		else
-			$dir_ftp = '';
-	}
-
-	// Un menu depliant si on a une possibilite supplementaire
-
-	if ($dir_ftp OR $distant OR $vignette_de_doc) {
-		$bloc = "ftp_$mode" .'_'. intval($id_document);
-		$debut = "\n\t<div style='float:".$GLOBALS['spip_lang_left'].";'>"
-			. bouton_block_invisible($bloc) ."</div>\n";
-		$milieu = debut_block_invisible($bloc);
-		$fin = "\n\t" . fin_block();
-
-	} else $debut = $milieu = $fin = '';
-
-	// Lien document distant, jamais en mode image
-	if ($distant) {
-		$distant = "<p />\n<div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>" .
-			"\n\t<img src='"._DIR_IMG_PACK.'attachment.gif' .
-			"' style='float: $spip_lang_right;' alt=\"\" />\n" .
-			_T('info_referencer_doc_distant') .
-			"<br />\n\t<input name='url' class='fondo' value='http://' />" .
-			"\n\t<div align='$spip_lang_right'><input name='sousaction2' type='Submit' value='".
-			_T('bouton_choisir').
-			"' class='fondo'></div>" .
-			"\n</div>";
-	}
-
-	$res = "<input name='fichier' type='file' style='font-size: 10px;' class='forml' size='15' />"
-	. "\n\t\t<input type='hidden' name='ancre' value='$ancre' />"
-	. "\n\t\t<div align='$spip_lang_right'><input name='sousaction1' type='submit' value='"
-	. _T('bouton_telecharger')
-	. "' class='fondo' /></div>";
-
-	if ($vignette_de_doc)
-		$res = $milieu . $res;
-	else
-		$res = $res . $milieu;
-
-	$f = generer_action_auteur('joindre',
-		(intval($id) .'/' .intval($id_document) . "/$mode/$type"),
-		generer_url_ecrire($script, $args),
-		"$debut$intitule$res$dir_ftp$distant$fin",
-		" method='post' enctype='multipart/form-data' style='border: 0px; margin: 0px;'");
-
-	return $f;
-}
-
-// http://doc.spip.org/@construire_upload
-function construire_upload($corps, $args, $enctype='')
-{
-	$res = "";
-	foreach($args as $k => $v)
-	  if ($v)
-	    $res .= "\n<input type='hidden' name='$k' value='$v' />";
-
-# ici enlever $action pour uploader directemet dans l'espace prive (UPLOAD_DIRECT)
-	return "\n<form method='post' action='" . generer_url_action('joindre') .
-	  "'" .
-	  (!$enctype ? '' : " enctype='$enctype'") .
-	  " 
-	  >\n" .
-	  "<div>" .
-  	  "\n<input type='hidden' name='action' value='joindre' />" .
-	  $res . $corps . "</div></form>";
-}
-
-// http://doc.spip.org/@afficher_transferer_upload
-function afficher_transferer_upload($texte_upload)
-{
-	$doc = array('upload' => '<b>' . joli_repertoire(determine_upload()) . '</b>');
-	if (!$texte_upload) {
-		return "\n<div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>" .
-			_T('info_installer_ftp', $doc) .
-			aide("ins_upload") .
-			"</div>";
-		}
-	else {  return
-		"\n<div style='color: #505050;'>"
-		._T('info_selectionner_fichier', $doc)
-		."&nbsp;:<br />\n" .
-		"\n<select name='chemin' size='1' class='fondl'>" .
-		$texte_upload .
-		"\n</select>" .
-		"\n<div align='".
-		$GLOBALS['spip_lang_right'] .
-		"'><input name='sousaction3' type='Submit' value='" .
-		_T('bouton_choisir').
-		"' class='fondo'></div>" .
-		"</div>\n";
-	}
-}
-
-function formulaire_joindre($id, $type = "article", $script, $flag_editable) {
-	global $spip_lang_left;
-
-	if ($GLOBALS['meta']["documents_$type"]!='non' AND $flag_editable) {
-
-	  $res = debut_cadre_relief("image-24.gif", true, "", _T('titre_joindre_document'))
-	  . formulaire_upload($script, "id_$type=$id", $id, _T('info_telecharger_ordinateur'), 'document', $type)
-	  . fin_cadre_relief(true);
-
-	// eviter le formulaire upload qui se promene sur la page
-	// a cause des position:relative incompris de MSIE
-
-	  if (!($align = $GLOBALS['browser_name']=="MSIE")) {
-		$res = "\n<table width='50%' cellpadding='0' cellspacing='0' border='0'>\n<tr><td style='text-align: $spip_lang_left;'>\n$res</td></tr></table>";
-		$align = " align='right'";
-	  }
-	  $res = "<div$align>$res</div>";
-	} else $res ='';
-
-	$f = charger_fonction('documenter', 'inc');
-
-	return $f($id, $type, 'portfolio', $flag_editable)
-	. $f($id, $type, 'documents', $flag_editable)
-	. $res;
-}
 
 //
 // Afficher un document dans la colonne de gauche
@@ -315,8 +122,10 @@ function afficher_documents_colonne($id, $type="article", $flag_modif = true) {
 	/// Ajouter nouvelle image
 	echo "<a name='images'></a>\n";
 	$titre_cadre = _T('bouton_ajouter_image').aide("ins_img");
+
+	$joindre = charger_fonction('joindre', 'inc');
 	debut_cadre_relief("image-24.gif", false, "creer.gif", $titre_cadre);
-	echo formulaire_upload($script, "id_$type=$id", $id, _T('info_telecharger'),'vignette',$type);
+	echo $joindre($script, "id_$type=$id", $id, _T('info_telecharger'),'vignette',$type);
 
 	fin_cadre_relief();
 
@@ -351,7 +160,7 @@ function afficher_documents_colonne($id, $type="article", $flag_modif = true) {
 		if ($GLOBALS['meta']["documents_article"] != 'non') {
 			$titre_cadre = _T('bouton_ajouter_document').aide("ins_doc");
 			debut_cadre_enfonce("doc-24.gif", false, "creer.gif", $titre_cadre);
-			echo formulaire_upload($script, "id_$type=$id", $id, _T('info_telecharger_ordinateur'), 'document',$type);
+			echo $joindre($script, "id_$type=$id", $id, _T('info_telecharger_ordinateur'), 'document',$type);
 			fin_cadre_enfonce();
 		}
 
diff --git a/ecrire/inc/getdocument.php b/ecrire/inc/getdocument.php
index a67cc81713bfb42211962253196cccf21e5a7c98..48393eb1d80ec4cd196d61d1010709a92345138a 100644
--- a/ecrire/inc/getdocument.php
+++ b/ecrire/inc/getdocument.php
@@ -468,16 +468,6 @@ function traite_svg($file)
 }
 
 
-// http://doc.spip.org/@afficher_compactes
-function afficher_compactes($action) {
-	minipres(_T('upload_fichier_zip'),
-	  "<p>" .
-		_T('upload_fichier_zip_texte') .
-	  "</p><p>" .
-		_T('upload_fichier_zip_texte2') .
-	  "</p>" .
-	  $action);
-}
 
 //
 // Traiter la liste des fichiers (action joindre3)
@@ -506,7 +496,6 @@ function examiner_les_fichiers($files, $mode, $type, $id, $id_document, $hash, $
 			include_spip('inc/pclzip');
 			$archive = new PclZip($zip);
 			if ($archive) {
-			  include_spip('inc/documents');
 			  $valables = verifier_compactes($archive);
 			  if ($valables) {
 			    liste_archive_jointe($valables, $mode, $type, $id, $id_document, $hash, $redirect, $zip);
@@ -546,14 +535,43 @@ function liste_archive_jointe($valables, $mode, $type, $id, $id_document, $hash,
 		"<div style='text-align: right;'><input class='fondo' style='font-size: 9px;' type='submit' value='".
 		_T('bouton_valider').
 		  "'></div>";
-	afficher_compactes(construire_upload($texte, array(
+	$action = (construire_upload($texte, array(
 					 'redirect' => $redirect,
 					 'hash' => $hash,
 					 'chemin' => $zip,
 					 'arg' => $arg)));
+	minipres(_T('upload_fichier_zip'),
+	  "<p>" .
+		_T('upload_fichier_zip_texte') .
+	  "</p><p>" .
+		_T('upload_fichier_zip_texte2') .
+	  "</p>" .
+	  $action);
 	// a tout de suite en joindre4, joindre5, ou joindre6
 }
 
+
+// Reconstruit un generer_action_auteur 
+
+// http://doc.spip.org/@construire_upload
+function construire_upload($corps, $args, $enctype='')
+{
+	$res = "";
+	foreach($args as $k => $v)
+	  if ($v)
+	    $res .= "\n<input type='hidden' name='$k' value='$v' />";
+
+# ici enlever $action pour uploader directemet dans l'espace prive (UPLOAD_DIRECT)
+	return "\n<form method='post' action='" . generer_url_action('joindre') .
+	  "'" .
+	  (!$enctype ? '' : " enctype='$enctype'") .
+	  " 
+	  >\n" .
+	  "<div>" .
+  	  "\n<input type='hidden' name='action' value='joindre' />" .
+	  $res . $corps . "</div></form>";
+}
+
 //
 // Convertit le type numerique retourne par getimagesize() en extension fichier
 //
diff --git a/ecrire/inc/joindre.php b/ecrire/inc/joindre.php
new file mode 100644
index 0000000000000000000000000000000000000000..07c56914c39aeaddbb2608afcb5943953d5c82bf
--- /dev/null
+++ b/ecrire/inc/joindre.php
@@ -0,0 +1,167 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/actions'); // *action_auteur et determine_upload
+include_spip('base/abstract_sql');
+
+//
+// Construire un formulaire pour telecharger un fichier
+//
+
+function inc_joindre_dist($script, $args, $id=0, $intitule='', $mode='', $type='', $ancre='', $id_document=0) {
+	global $spip_lang_right;
+	$vignette_de_doc = ($mode == 'vignette' AND $id_document>0);
+	$distant = ($mode == 'document' AND $type);
+	if ($intitule) $intitule = "<span>$intitule</span><br />";
+
+	if (!_DIR_RESTREINT AND !$vignette_de_doc) {
+		$dir_ftp = determine_upload();
+		// quels sont les docs accessibles en ftp ?
+		$l = texte_upload_manuel($dir_ftp, '', $mode);
+		// s'il n'y en a pas, on affiche un message d'aide
+		// en mode document, mais pas en mode vignette
+		if ($l OR ($mode == 'document'))
+			$dir_ftp = afficher_transferer_upload($l);
+		else
+			$dir_ftp = '';
+	}
+
+	// Un menu depliant si on a une possibilite supplementaire
+
+	if ($dir_ftp OR $distant OR $vignette_de_doc) {
+		$bloc = "ftp_$mode" .'_'. intval($id_document);
+		$debut = "\n\t<div style='float:".$GLOBALS['spip_lang_left'].";'>"
+			. bouton_block_invisible($bloc) ."</div>\n";
+		$milieu = debut_block_invisible($bloc);
+		$fin = "\n\t" . fin_block();
+
+	} else $debut = $milieu = $fin = '';
+
+	// Lien document distant, jamais en mode image
+	if ($distant) {
+		$distant = "<p />\n<div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>" .
+			"\n\t<img src='"._DIR_IMG_PACK.'attachment.gif' .
+			"' style='float: $spip_lang_right;' alt=\"\" />\n" .
+			_T('info_referencer_doc_distant') .
+			"<br />\n\t<input name='url' class='fondo' value='http://' />" .
+			"\n\t<div align='$spip_lang_right'><input name='sousaction2' type='Submit' value='".
+			_T('bouton_choisir').
+			"' class='fondo'></div>" .
+			"\n</div>";
+	}
+
+	$res = "<input name='fichier' type='file' style='font-size: 10px;' class='forml' size='15' />"
+	. "\n\t\t<input type='hidden' name='ancre' value='$ancre' />"
+	. "\n\t\t<div align='$spip_lang_right'><input name='sousaction1' type='submit' value='"
+	. _T('bouton_telecharger')
+	. "' class='fondo' /></div>";
+
+	if ($vignette_de_doc)
+		$res = $milieu . $res;
+	else
+		$res = $res . $milieu;
+
+	$f = generer_action_auteur('joindre',
+		(intval($id) .'/' .intval($id_document) . "/$mode/$type"),
+		generer_url_ecrire($script, $args),
+		"$debut$intitule$res$dir_ftp$distant$fin",
+		" method='post' enctype='multipart/form-data' style='border: 0px; margin: 0px;'");
+
+	return $f;
+}
+
+
+//
+// Retourner le code HTML d'utilisation de fichiers envoyes
+//
+
+// http://doc.spip.org/@texte_upload_manuel
+function texte_upload_manuel($dir, $inclus = '', $mode = 'document') {
+	$fichiers = preg_files($dir);
+	$exts = array();
+	$dirs = array(); 
+	$texte_upload = array();
+	foreach ($fichiers as $f) {
+		$f = preg_replace(",^$dir,",'',$f);
+		if (ereg("\.([^.]+)$", $f, $match)) {
+			$ext = strtolower($match[1]);
+			if (!isset($exts[$ext])) {
+				if ($ext == 'jpeg') $ext = 'jpg'; # cf. corriger_extension dans inc/getdocument
+				if (spip_abstract_fetsel('extension', 'spip_types_documents', "extension='$ext'" . (!$inclus ? '':  " AND inclus='$inclus'")))
+					$exts[$ext] = 'oui';
+				else $exts[$ext] = 'non';
+			}
+			
+			$k = 2*substr_count($f,'/');
+			$n = strrpos($f, "/");
+			if ($n === false)
+			  $lefichier = $f;
+			else {
+			  $lefichier = substr($f, $n+1, strlen($f));
+			  $ledossier = substr($f, 0, $n);
+			  if (!in_array($ledossier, $dirs)) {
+				$texte_upload[] = "\n<option value=\"$ledossier\">"
+				. str_repeat("&nbsp;",$k) 
+				._T('tout_dossier_upload', array('upload' => $ledossier))
+				."</option>";
+				$dirs[]= $ledossier;
+			  }
+			}
+
+			if ($exts[$ext] == 'oui')
+			  $texte_upload[] = "\n<option value=\"$f\">" .
+			    str_repeat("&nbsp;",$k+2) .
+			    $lefichier .
+			    "</option>";
+		}
+	} 
+
+	$texte = join('', $texte_upload);
+
+	if ($mode == "document" AND count($texte_upload)>1) {
+		$texte = "\n<option value=\"/\" style='font-weight: bold;'>"
+				._T('info_installer_tous_documents')
+				."</option>" . $texte;
+	}
+
+	return $texte;
+}
+
+
+// http://doc.spip.org/@afficher_transferer_upload
+function afficher_transferer_upload($texte_upload)
+{
+	$doc = array('upload' => '<b>' . joli_repertoire(determine_upload()) . '</b>');
+	if (!$texte_upload) {
+		return "\n<div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>" .
+			_T('info_installer_ftp', $doc) .
+			aide("ins_upload") .
+			"</div>";
+		}
+	else {  return
+		"\n<div style='color: #505050;'>"
+		._T('info_selectionner_fichier', $doc)
+		."&nbsp;:<br />\n" .
+		"\n<select name='chemin' size='1' class='fondl'>" .
+		$texte_upload .
+		"\n</select>" .
+		"\n<div align='".
+		$GLOBALS['spip_lang_right'] .
+		"'><input name='sousaction3' type='Submit' value='" .
+		_T('bouton_choisir').
+		"' class='fondo'></div>" .
+		"</div>\n";
+	}
+}
+?>
diff --git a/ecrire/inc/legender.php b/ecrire/inc/legender.php
index 19bb80e75877aceedcf8d0d00d6aee980d440ff6..cd101ce87ba32d0bcb81248bf48b90af84d00acb 100644
--- a/ecrire/inc/legender.php
+++ b/ecrire/inc/legender.php
@@ -143,9 +143,11 @@ function vignette_formulaire_legender($id_document, $document, $script, $type, $
 		$action = ajax_action_auteur('documenter', "$s$id/$type/$id_vignette", $script, "id_$type=$id&type=$type&s=$s&show_docs=$id_document#$ancre", array($texte));
 	}
 
+	$joindre = charger_fonction('joindre', 'inc');
+
 	return "<hr style='margin-left: -5px; margin-right: -5px; height: 1px; border: 0px; color: #eeeeee; background-color: white;' />"
 	. (!$id_vignette
-	? formulaire_upload($script, "id_$type=$id",$id, _T('info_vignette_personnalisee'), 'vignette', $type, $ancre, $id_document)
+	   ? $joindre($script, "id_$type=$id",$id, _T('info_vignette_personnalisee'), 'vignette', $type, $ancre, $id_document)
 	   : icone_horizontale($texte, $action, "vignette-24.png", "supprimer.gif", false));
 }