diff --git a/ecrire/inc_documents.php3 b/ecrire/inc_documents.php3
index 6de61094a3765370e8c17746c33fa94f4c3617db..766e10ac6110abaa95a5e35472feee4ac3813dd5 100644
--- a/ecrire/inc_documents.php3
+++ b/ecrire/inc_documents.php3
@@ -442,7 +442,6 @@ function afficher_formulaire_taille($document, $type_inclus='AUTO') {
 	}
 }
 
-
 //
 // Afficher un formulaire d'upload
 //
@@ -451,97 +450,96 @@ function afficher_upload($image_url, $redirect='', $intitule, $inclus = '', $env
   global $clean_link, $connect_statut, $connect_toutes_rubriques, $options, $spip_lang_right,$connect_id_auteur;
 	static $num_form = 0; $num_form ++;
 
-	if (!$redirect)
-		$redirect = $clean_link->getUrl();
-
-	$link = new Link ($image_url);
-	$link->addVar('redirect', $redirect);
-	$link->addVar('hash', calculer_action_auteur("ajout_doc"));
-	$link->addVar('hash_id_auteur', $connect_id_auteur);
-	$link->addVar('ajout_doc', 'oui');
-	$link->addVar('mode', $mode);
-	$link->addVar('type', $type);
-
-	echo $link->getForm('POST', '', 'multipart/form-data');
-	echo "<div>";
-
-	// bouton permettant de telecharger 10 images ou docs a la fois
-	$envoi_multiple &= ($options == "avancees");
-	if ($envoi_multiple OR ($mode = 'document' AND $type))
-		echo bouton_block_invisible("ftp$num_form");
-
-	if (tester_upload()) {
-		echo "$intitule</div>";
+	$res = "";
+	if ($GLOBALS['flag_upload']) {
+		$res .= "\n<div>" . bouton_block_invisible("ftp$num_form") .
+		  $intitule . "</div>\n<div>" .
+		  "\n<input name='fichier' type='file' style='font-size: 10px;' class='forml' size='15' />" .
+		  "\n<div align='" .
+		  $GLOBALS['spip_lang_right'] . 
+		  "'><input name='sousaction1' type='Submit' VALUE='" .
+		  _T('bouton_telecharger') .
+		  "' CLASS='fondo'></div>\n";
+	}
 
-		// un modele de selecteur de fichier
-		$upload = "<div><input name='fichier*' type='File' style='font-size: 10px;' class='forml' size='15'></div>";
+	$res .= "<div>" . debut_block_invisible("ftp$num_form");
 
-		// afficher le premier
-		echo str_replace('*', '1', $upload);
+	if ($connect_statut == '0minirezo') {
+		$res .= afficher_transferer_upload($type,
+				     texte_upload_manuel(_DIR_TRANSFERT,
+							 $inclus));
 
-		/* (TESTS POUR ENVOI MULTIPLE ; DESACTIVE)
-		// afficher les suivants, masques
-		if ($envoi_multiple) {
-			echo debut_block_invisible ("upload$num_form");
-			for ($i=2; $i<=10; $i++)
-				echo str_replace('*', "$i", $upload);
-			echo fin_block();
-		}
-		*/
+	}
 
-		echo "<div align='".$GLOBALS['spip_lang_right']."'><input name='ok_post' type='Submit' VALUE='"._T('bouton_telecharger')."' CLASS='fondo'></div>\n<div>";
+	// Lien document distant, jamais en mode image
+	if ($mode == 'document' AND $type) {
+	  $res .=
+	    "<p /><div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>" .
+	    "<img src='"._DIR_IMG_PACK.'attachment.gif' .
+	    "' style='float: $spip_lang_right;' alt=\"\" />\n" .
+	    "\n"._T('info_referencer_doc_distant')."<br />" .
+	    "\n<input name='url' size='32' class='fondo' value='http://' />" .
+	    "\n  <div align='".$GLOBALS['spip_lang_right'].
+	    "'><input name='sousaction2' type='Submit' value='"._T('bouton_choisir')."' class='fondo'></div>" .
+	    "</div>\n";
 	}
 
-	echo debut_block_invisible("ftp$num_form");
+	$res .= "</div>\n" . fin_block();
+
+	if (!$redirect)	$redirect = $clean_link->getUrl();
+	return construire_upload($res,
+				array(
+				'redirect' => $redirect,
+				'hash' => calculer_action_auteur("joindre"),
+				'hash_id_auteur' => $connect_id_auteur,
+				'mode' => $mode,
+				'type' => $type),
+				$image_url,
+				'multipart/form-data');
+}
 
-	if ($connect_statut == '0minirezo'  # AND $connect_toutes_rubriques
-	AND $envoi_multiple) {
-		$texte_upload = texte_upload_manuel(_DIR_TRANSFERT, $inclus);
-		if ($texte_upload) {
-		  echo afficher_transferer_upload($texte_upload,$type);
-		}
-		else {
-			echo "<div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>";
-			echo _T('info_installer_ftp').aide("ins_upload");
-			echo "</div>";
-		}
-	}
+function construire_upload($corps, $args, $action, $enc='')
+{
+	$res = "";
+	foreach($args as $k => $v)
+	  $res .= "\n<input type='hidden' name='$k' value='$v' />";
+	$res .= "\n<input type='hidden' name='action' value='joindre' />";
 
-	// Lien document distant, jamais en mode image
-	if ($mode = 'document' AND $type) {
-		echo "<p /><div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>";
-		echo "<img src='"._DIR_IMG_PACK.'attachment.gif',
-			"' style='float: $spip_lang_right;' alt=\"\" />\n";
-		echo "\n"._T('info_referencer_doc_distant')."<br />";
-		echo "\n<input name='image_url' size='32' class='fondo' value='http://' />";
-		echo "\n  <div align='".$GLOBALS['spip_lang_right']."'><input name='ok_url' type='Submit' value='"._T('bouton_choisir')."' class='fondo'></div>";
-		echo "</div>\n";
-	}
+	$link = new Link ($action);
 
-	echo "</div>\n";
-	echo fin_block();
-	echo "</form>\n";
+	return "\n" . $link->getForm('POST', '', $enc) . "<div>" .
+	  $res . $corps . "</div></form>";
 }
 
-function afficher_transferer_upload($texte_upload,$type)
+function afficher_transferer_upload($type, $texte_upload)
 {
-			
-  return "<p><div style='color: #505050;'>" .
-    "\n"._T('info_selectionner_fichier')."&nbsp;:<br />" .
-    "\n<select name='image2' size='1' class='fondl'>" .
-    $texte_upload .
-    "\n</select>" .
-    (($type != 'rubrique') ? "" :
-     ("<br />\n<span style='margin-left: 20px'><input type='radio' name='identifier' />&nbsp;&nbsp;" .
-      _L("et identifier l'arborescence du r&eacute;pertoire &agrave; celle des rubriques.") .
-      "</span>\n")) .
-     "<div align='".
-     $GLOBALS['spip_lang_right'] .
-     "'><input name='ok_ftp' type='Submit' value='" .
-     _T('bouton_choisir').
-     "' class='fondo'></div>" .
-     "</div>\n";
-     }
+	if (!$texte_upload) {
+		return "<div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>" .
+			_T('info_installer_ftp') .
+			aide("ins_upload") .
+			"</div>";
+		}
+	else {  return
+		"<p><div style='color: #505050;'>" .
+		"\n"._T('info_selectionner_fichier')."&nbsp;:<br />" .
+		"\n<select name='chemin' size='1' class='fondl'>" .
+		$texte_upload .
+	  	"\n</select>" .
+		(($type != 'rubrique') ? "" :  ("<br />". _L("et choisir le mode de transfert:"))) .
+		"\n<div align='".
+		$GLOBALS['spip_lang_right'] .
+		"'><input name='sousaction3' type='Submit' value='" .
+		_L('recopier').
+		"' class='fondo'></div>" .
+		(($type != 'rubrique') ? "" :
+		    ("\n<div align='".
+				$GLOBALS['spip_lang_right'] .
+				"'><input name='sousaction4' type='Submit' value='" .
+				_L('identifier repertoires et rubriques').
+		     "' class='fondo'></div>")) .
+	    	"</div>\n";
+	}
+}
 
 //
 // Afficher les documents non inclus
@@ -834,7 +832,7 @@ function bloc_gerer_vignette($document, $image_url, $redirect_url, $album) {
 
 		// lien "upload vignette"
 	  $image_url .= "&id_document=$id_document&ancre=$album";
-	  afficher_upload($image_url,
+	  echo afficher_upload($image_url,
 				$redirect_url.'&show_docs='.$id_document,
 				/* _T('info_remplacer_vignette') */'',
 				'portfolio',
@@ -928,7 +926,7 @@ function afficher_documents_non_inclus($id_article, $type = "article", $flag_mod
 		echo debut_cadre_relief("image-24.gif", false, "", _T('titre_joindre_document'));
 		
 		
-		afficher_upload($image_url, $redirect_url, _T('info_telecharger_ordinateur'), '', true, 'document', $type);
+		echo afficher_upload($image_url, $redirect_url, _T('info_telecharger_ordinateur'), '', true, 'document', $type);
 		
 		echo fin_cadre_relief();
 		
@@ -964,7 +962,7 @@ function afficher_documents_colonne($id_article, $type="article", $flag_modif =
 	$titre_cadre = _T('bouton_ajouter_image').aide("ins_img");
 	debut_cadre_relief("image-24.gif", false, "creer.gif", $titre_cadre);
 
-	afficher_upload($image_url, $redirect_url, _T('info_telecharger'),'',true,'vignette',$type);
+	echo afficher_upload($image_url, $redirect_url, _T('info_telecharger'),'',true,'vignette',$type);
 
 	fin_cadre_relief();
 
@@ -1011,7 +1009,7 @@ function afficher_documents_colonne($id_article, $type="article", $flag_modif =
 		$titre_cadre = _T('bouton_ajouter_document').aide("ins_doc");
 
 		debut_cadre_enfonce("doc-24.gif", false, "creer.gif", $titre_cadre);
-		afficher_upload($image_url, $redirect_url,_T('info_telecharger_ordinateur'), '',true,'document',$type);
+		echo afficher_upload($image_url, $redirect_url,_T('info_telecharger_ordinateur'), '',true,'document',$type);
 		fin_cadre_enfonce();
 	}
 
diff --git a/ecrire/inc_getdocument.php3 b/ecrire/inc_getdocument.php3
index 388994467dae8fc0746058d510778bdb649f98ab..4035fb8e355ef34e31865762e14ee84a0d23e912 100644
--- a/ecrire/inc_getdocument.php3
+++ b/ecrire/inc_getdocument.php3
@@ -184,36 +184,6 @@ function verifier_compactes($zip) {
 	}
 }
 
-function afficher_compactes($image_name /* not used */, $fichiers, $link) {
-// presenter une interface pour choisir si fichier joint ou decompacter
-// passer ca en squelette un de ces jours.
-
-	include_ecrire ("inc_presentation.php3");
-	install_debut_html(_T('upload_fichier_zip'));
-	echo "<p>",
-		_T('upload_fichier_zip_texte'),
-		"</p>",
-		"<p>",
-		_T('upload_fichier_zip_texte2'),
-		"</p>",
-		$link->getForm('POST'),
-		"<div><input type='radio' checked name='action_zip' value='telquel'>",
-		_T('upload_zip_telquel'),
-		"</div>",
-		"<div><input type='radio' name='action_zip' value='decompacter'>",
-		_T('upload_zip_decompacter'),
-		"</div>",
-		"<ul><li>" ,
-		 join("</li>\n<li>",$fichiers) ,
-		 "</li></ul>",
-		"<div>&nbsp;</div>",
-		"<div style='text-align: right;'><input class='fondo' style='font-size: 9px;' type='submit' value='",
-		_T('bouton_valider'),
-		"'></div>",
-		"</form>";
-	install_fin_html();
-}
-
 // Si on doit conserver une copie locale des fichiers distants, autant que ca
 // soit a un endroit canonique -- si ca peut etre bijectif c'est encore mieux,
 // mais la tout de suite je ne trouve pas l'idee, etant donne les limitations
@@ -321,11 +291,23 @@ function recuperer_infos_distantes($source, $max=0) {
 //
 // Ajouter un document (au format $_FILES)
 //
+# $source,	# le fichier sur le serveur (/var/tmp/xyz34)
+# $nom_envoye,	# son nom chez le client (portequoi.pdf)
+# $type_lien,	# lie a un article, une breve ou une rubrique ?
+# $id_lien,	# identifiant de l'article (ou rubrique) lie
+# $mode,	# 'vignette' => image en mode image
+#		# ou vignette personnalisee liee a un document
+		# 'document' => doc ou image en mode document
+		# 'distant' => lien internet
+# $id_document,	# pour une vignette, l'id_document de maman
+# $actifs	# les documents dont il faudra ouvrir la boite de dialogue
+
 function ajouter_un_document ($source, $nom_envoye, $type_lien, $id_lien, $mode, $id_document, &$documents_actifs) {
 
-	// Documents distants : pas trop de verifications bloquantes, mais un test
-	// via une requete HEAD pour savoir si la ressource existe (non 404), si le
-	// content-type est connu, et si possible recuperer la taille, voire plus.
+// Documents distants : pas trop de verifications bloquantes, mais un test
+// via une requete HEAD pour savoir si la ressource existe (non 404), si le
+// content-type est connu, et si possible recuperer la taille, voire plus.
+	spip_log ("ajout du document $nom_envoye  ($mode $type_lien $id_lien $id_document)");
 	if ($mode == 'distant') {
 		if ($a = recuperer_infos_distantes($source)) {
 			# fichier local pour creer la vignette (!!),
@@ -521,144 +503,182 @@ function ajouter_un_document ($source, $nom_envoye, $type_lien, $id_lien, $mode,
 	return true;
 }
 
+function afficher_compactes($fichiers, $args, $action) {
+// presenter une interface pour choisir si fichier joint ou decompacte
+// passer ca en squelette un de ces jours.
+
+	include_ecrire ("inc_presentation.php3");
+	install_debut_html(_T('upload_fichier_zip'));
+	echo "<p>",
+		_T('upload_fichier_zip_texte'),
+		"</p>",
+		"<p>",
+		_T('upload_fichier_zip_texte2'),
+		"</p>",
+		construire_upload(
+			"<div><input type='radio' checked='checked' name='sousaction5' value='5'>" .
+			_T('upload_zip_telquel').
+			"</div>".
+			"<div><input type='radio' name='sousaction5' value='6'>".
+			_T('upload_zip_decompacter').
+			"</div>".
+			"<ul><li>" .
+			join("</li>\n<li>",$fichiers) .
+			"</li></ul>".
+			"<div>&nbsp;</div>".
+			"<div style='text-align: right;'><input class='fondo' style='font-size: 9px;' type='submit' value='".
+			_T('bouton_valider').
+			"'></div>",
+			$args, $action);
+	install_fin_html();
+}
+
 //
-// Upload d'un ZIP
+// Traiter la liste des fichiers
 //
 
-function deballer_upload($_FILES, $source, $action_zip, $hash, $hash_id_auteur, $id_article, $id_document, $mode, $redirect, $type)
+function examiner_les_fichiers($files, $mode, $type, $id, $id_document, $hash, $hash_id_auteur, $redirect, &$actifs)
 {
-  // traiter la reponse de l'utilisateur ('telquel' ou 'decompacter')
-  if ($source AND !strstr($source, '..')) # securite
-    {
-	$_FILES = array(
-		array('name' => basename($source),
-			'tmp_name' => $source)
-		);
-    }
-	
-  // traiter le zip si c'en est un tout seul
-  if (count($_FILES) == 1 AND $action_zip!='telquel') {
-	$desc = array_pop($_FILES); # recuperer la description
-	$_FILES = array($desc);
-	
-	if (preg_match('/\.zip$/i', $desc['name'])
-	    OR ($desc['type'] == 'application/zip')) {
+	if (function_exists('gzopen') 
+	AND !($mode == 'distant')
+	AND (count($files) == 1)) {
+
+		$desc = $files[0];
+		if (preg_match('/\.zip$/i', $desc['name'])
+		    OR ($desc['type'] == 'application/zip')) {
 	
-	  // on pose le fichier dans le repertoire zip et on met
-	  // a jour $_FILES (nota : copier_document n'ecrase pas
-	  // un fichier avec lui-meme : ca autorise a boucler)
-	  $zip = copier_document("zip",
+	  // on pose le fichier dans le repertoire zip 
+	  // (nota : copier_document n'ecrase pas un fichier avec lui-meme
+	  // ca autorise a boucler)
+			$zip = copier_document("zip",
 					$desc['name'],
 					$desc['tmp_name']
 				);
-	  if (!$zip) die ('Erreur upload zip'); # pathologique
-	  $desc['tmp_name'] = $zip;	# nouvel emplacement du fichier
-	  $_FILES = array($desc);
-	
-	  // Est-ce qu'on sait le lire ?
-	  require_once(_DIR_RESTREINT . 'pclzip.lib.php');
-	  $archive = new PclZip($zip);
-	  $contenu = verifier_compactes($archive);
-	
-	  // si non, on le force comme document
-	    // sans effet meme en global !!
-	  /*	  if (!$contenu) {
-	    	$forcer_document = 'oui';
-	    }
-	  else  */
-	  // si le deballage est demande
-	  if ($action_zip == 'decompacter') {
-	    // 1. on deballe
-	    define('_tmp_dir', creer_repertoire_documents($hash));
-	    if (_tmp_dir == _DIR_DOC) die(_L('Op&eacute;ration impossible'));
-	    $archive->extract(
-			      PCLZIP_OPT_PATH, _tmp_dir,
-			      PCLZIP_CB_PRE_EXTRACT, 'callback_deballe_fichier'
-			      );
-	    $contenu = verifier_compactes($archive);
-	    // 2. on supprime le fichier temporaire
-	    @unlink($zip);
-	    
-	    $_FILES = array();
-	    foreach ($contenu as $fichier) {
-	      $_FILES[] = array(
-				'name' => basename($fichier),
-				'tmp_name' => _tmp_dir.basename($fichier));
-	    }
-	  }
-	  
-	  // sinon on demande une reponse
-	  else {
-		$link = new Link('spip_image.php3');
-		$link->addVar('ajout_doc', 'oui');
-		$link->addVar('redirect', $redirect);
-		$link->addVar('id_article', $id_article);
-		$link->addVar('mode', $mode);
-		$link->addVar('type', $type);
-		$link->addVar('hash', $hash);
-		$link->addVar('hash_id_auteur', $hash_id_auteur);
-		$link->addVar('source_zip', $zip);
-		afficher_compactes($desc, $contenu, $link);
-		exit;
-	  }
+			if (!$zip) die ('Erreur upload zip'); # pathologique
+			// Est-ce qu'on sait le lire ?
+			require_once(_DIR_RESTREINT . 'pclzip.lib.php');
+			$archive = new PclZip($zip);
+			if ($archive) {
+			  // demander confirmation
+			  afficher_compactes(verifier_compactes($archive),
+					     array(
+					 'redirect' => $redirect,
+					 'hash' => $hash,
+					 'hash_id_auteur' => $hash_id_auteur,
+					 'chemin' => $zip,
+					 'mode' => $mode,
+					 'type' => $type),
+				   "spip_image.php3?id_article=$id");
+			  // a tout de suite en joindre5 ou joindre6
+			  exit;
+			}
+		}
+	}
+	foreach ($files as $arg) {
+		check_upload_error($arg['error']);
+		ajouter_un_document($arg['tmp_name'], $arg['name'], 
+				    $type, $id, $mode, $id_document, $actifs);
 	}
-  }
-  return $_FILES;
 }
 
-	//
-	// Traiter la liste des fichiers
-	//
+//
+// Fonctions referencees dans spip-image par calcul
+//
+
+// Cas d'un document distant reference sur internet
 
-function ajouter_les_fichiers($_FILES, $mode, $type, $id, $id_document, &$actifs)
+function joindre2($arg, $mode, $type, $id, $id_document,$hash, $hash_id_auteur, $redirect, &$actifs)
 {
-	foreach ($_FILES as $file) {
-		// afficher l'erreur 'fichier trop gros' ou autre
-		check_upload_error($file['error']);
-
-		spip_log ("ajout du document ".$file['name'].", $mode ($type $id $id_document)");
-		ajouter_un_document (
-			$file['tmp_name'],	# le fichier sur le serveur (/var/tmp/xyz34)
-			$file['name'],		# son nom chez le client (portequoi.pdf)
-			$type,				# lie a un article, une breve ou une rubrique ?
-			$id,		# identifiant de l'article (ou rubrique) lie
-			$mode,				# 'vignette' => image en mode image
-								# ou vignette personnalisee liee a un document
-								# 'document' => doc ou image en mode document
-								# 'distant' => lien internet
-			$id_document,		# pour une vignette, l'id_document de maman
-			$actifs	# tableau des id_document "actifs" (par ref)
-		);
-	}	// foreach $_FILES
-
-	// Nettoyer le repertoire temporaire d'extraction des fichiers
-	if (defined('_tmp_dir'))
-		effacer_repertoire_temporaire(_tmp_dir);
+	examiner_les_fichiers(array(
+				   array('name' => basename($arg),
+					 'tmp_name' => $arg)
+				   ), 'distant', $type, $id, $id_document,
+			     $hash, $hash_id_auteur, $redirect, &$actifs);
 }
 
-// lire le repertoire upload et retourner ses fichiers
+// Cas d'un fichier transmis
 
-function ajouter_par_upload($upload, $identifier, $id, $id_auteur, &$actifs)
+function joindre1($arg, $mode, $type, $id, $id_document,$hash, $hash_id_auteur, $redirect, &$actifs)
 {
-		$files = array();
-		if ($identifier)
-		  { 
-		    identifie_repertoire_et_rubrique($upload, $id, $id_auteur, $actifs);
-		    include_ecrire("inc_rubriques.php3");
-		    calculer_rubriques();
-		  }
-		else {
-			foreach (fichiers_upload($upload) as $fichier) {
-				$files[] = array (
+	$files = array();
+	if (is_array($arg))
+	  foreach ($arg as $file) {
+		if (!$file['error'] == 4 /* UPLOAD_ERR_NO_FILE */)
+			$files[]=$file;
+	}
+	examiner_les_fichiers($files, $mode, $type, $id, $id_document,
+			     $hash, $hash_id_auteur, $redirect, $actifs);
+} 
+
+// copie de tout ou partie du repertoire upload
+
+function joindre3($arg, $mode, $type, $id, $id_document,$hash, $hash_id_auteur, $redirect, &$actifs)
+{
+	if (!$arg || strstr($arg, '..')) return;
+	    
+	$upload = (_DIR_TRANSFERT .$arg);
+
+	if (!is_dir($upload))
+	  // seul un fichier est demande
+	  $files = array(array ('name' => basename($upload),
+				'tmp_name' => $upload)
+			 );
+	else {
+	  $files = array();
+	  foreach (fichiers_upload($upload) as $fichier) {
+			$files[]= array (
 					'name' => basename($fichier),
 					'tmp_name' => $fichier
 					);
-			}
-		}
-		return $files;
+	  }
+	}
+
+	examiner_les_fichiers($files, $mode, $type, $id, $id_document,
+			     $hash, $hash_id_auteur, $redirect, $actifs);
+}
+
+//  identifie les repertoires de upload aux rubriques Spip
+
+function joindre4($arg, $mode, $type, $id, $id_document, $hash, $hash_id_auteur, $redirect, &$documents_actifs)
+{
+	if (!$arg || strstr($arg, '..')) return;
+	$upload = (_DIR_TRANSFERT .$arg);
+	identifie_repertoire_et_rubrique($upload, $id, $id_auteur);
+	include_ecrire("inc_rubriques.php3");
+	calculer_rubriques();
 }
 
-function identifie_repertoire_et_rubrique($DIR, $id_rubrique, $id_auteur, $art, &$actifs)
+//  Zip avec confirmation "tel quel"
+
+function joindre5($arg, $mode, $type, $id, $id_document,$hash, $hash_id_auteur, $redirect, &$actifs)
+{
+  	ajouter_un_document($arg, basename($arg), $type, $id, $mode, $id_document, $actifs);
+}
+
+// cas du zip a deballer. On ressort la bibli 
+
+function joindre6($arg, $mode, $type, $id, $id_document,$hash, $hash_id_auteur, $redirect, &$actifs)
+{
+	    define('_tmp_dir', creer_repertoire_documents($hash));
+	    if (_tmp_dir == _DIR_DOC) die(_L('Op&eacute;ration impossible'));
+	    require_once(_DIR_RESTREINT . 'pclzip.lib.php');
+	    $archive = new PclZip($arg);
+	    $archive->extract(
+			      PCLZIP_OPT_PATH, _tmp_dir,
+			      PCLZIP_CB_PRE_EXTRACT, 'callback_deballe_fichier'
+			      );
+	    $contenu = verifier_compactes($archive);
+	    //  on supprime la copie temporaire
+	    @unlink($arg);
+	    
+	    foreach ($contenu as $fichier)
+		ajouter_un_document(_tmp_dir.basename($fichier),
+				    basename($fichier),
+				    $type, $id, $mode, $id_document, $actifs);
+	    effacer_repertoire_temporaire(_tmp_dir);
+}
+
+function identifie_repertoire_et_rubrique($DIR, $id_rubrique, $id_auteur, $art=0)
 {
   static $exts = array();
 
@@ -742,7 +762,7 @@ function identifie_repertoire_et_rubrique($DIR, $id_rubrique, $id_auteur, $art,
 	$rub=spip_abstract_insert($GLOBALS['table_prefix'] . "_rubriques",
 				  "(titre,id_parent,statut)",
 				  "('" . addslashes($v) . "', $id_rubrique, 'prepa')");
-	$m = identifie_repertoire_et_rubrique($k, $rub, $id_auteur, $art, $actifs);
+	$m = identifie_repertoire_et_rubrique($k, $rub, $id_auteur, $art);
 	if ($m)
 	  $n++;
 	else {
@@ -756,6 +776,7 @@ function identifie_repertoire_et_rubrique($DIR, $id_rubrique, $id_auteur, $art,
  
 }
 
+
 //
 // Convertit le type numerique retourne par getimagesize() en extension fichier
 //
diff --git a/spip_image.php3 b/spip_image.php3
index ee69849869b09eef5ddf0e6bbf4201e6f5c25e8d..93cb9428892a538a053c48782558a9f37518cc42 100644
--- a/spip_image.php3
+++ b/spip_image.php3
@@ -15,14 +15,14 @@
 // supprimer cet element, creer les vignettes, etc.
 
 include ("ecrire/inc_version.php3");
-include_ecrire('inc_presentation.php3');	# regler la langue en cas d'erreur
-include_ecrire('inc_getdocument.php3');		# diverses fonctions de ce fichier
-include_ecrire("inc_charsets.php3");		# pour le nom de fichier
-include_ecrire("inc_meta.php3");			# ne pas faire confiance au cache
-											# (alea_ephemere a peut-etre change)
-include_ecrire("inc_admin.php3");			# verifier_action_auteur
-include_ecrire("inc_abstract_sql.php3");	# spip_insert
-include_ecrire('inc_documents.php3');		# fichiers_upload()
+include_ecrire('inc_presentation.php3');# regler la langue en cas d'erreur
+include_ecrire('inc_getdocument.php3');	# diverses fonctions de ce fichier
+include_ecrire("inc_charsets.php3");	# pour le nom de fichier
+include_ecrire("inc_meta.php3");	# ne pas faire confiance au cache
+					# (alea_ephemere a peut-etre change)
+include_ecrire("inc_admin.php3");	# verifier_action_auteur
+include_ecrire("inc_abstract_sql.php3");# spip_insert
+include_ecrire('inc_documents.php3');	# fichiers_upload()
 
 $documents_actifs = array();
 //
@@ -33,49 +33,27 @@ $documents_actifs = array();
 if ($test_vignette)
 	redirige_par_entete(tester_vignette($test_vignette));
 
- else if ($ajout_doc == "oui")
+ else if ($action == 'joindre')
    {
-
 // Autorisation ?
-     if (!verifier_action_auteur("ajout_doc", $hash, $hash_id_auteur))
+     if (!verifier_action_auteur("joindre", $hash, $hash_id_auteur))
 	die ('Interdit');
-
-// Cas d'un document distant reference sur internet
-     if (preg_match(',^https?://....+,i', $_POST['image_url'])) {
-	ajouter_les_fichiers(array(
-			array('name' => basename($_POST['image_url']),
-			'tmp_name' => $_POST['image_url'])
-			), 'distant', $type, $id_article, $id_document, $documents_actifs);
- } else {
-
-  $image2 = $_POST['image2'];
-  if ($image2 AND !strstr($image2, '..') AND $_POST['ok_ftp']) {
-  //
-  // Cas d'un fichier ou d'un repertoire installe dans ecrire/upload/
-  //
-	$upload = _DIR_TRANSFERT .$image2;
-	if (!is_dir($upload))
-	  // seul un fichier est demande
-	  $_FILES = array(
-				array ('name' => basename($upload),
-				'tmp_name' => $upload)
-				);
-	else $_FILES = ajouter_par_upload($upload, $_POST['identifier'], $id_article, $hash_id_auteur);
-  } else {
-	if (!$_FILES)
-		$_FILES = &$HTTP_POST_FILES;
-	if (!is_array($_FILES))
-		$_FILES = array();
-	foreach ($_FILES as $id => $file) {
-		if ($file['error'] == 4 /* UPLOAD_ERR_NO_FILE */)
-			unset ($_FILES[$id]);
-	}
-  }
-  if (function_exists('gzopen') AND !($mode == 'distant'))
-	$_FILES = deballer_upload($_FILES, $_POST['source_zip'],$action_zip, $hash, $hash_id_auteur, $id_article, $id_document, $mode, $redirect, $type);
-  
-  ajouter_les_fichiers($_FILES, $mode, $type, $id_article, $id_document, $documents_actifs);
-     }
+     // pas terrible, mais c'est le pb du bouton Submit qui retourne son texte
+     // et son transcodage est couteux et perilleux
+     $fonc = 'joindre' . 
+       ($sousaction1 ? 1 :
+	($sousaction2 ? 2 :
+	 ($sousaction3 ? 3 : 
+	  ($sousaction4 ? 4 :
+	   $sousaction5 ))));
+
+     $arg = ($sousaction1 ? ($_FILES ? $_FILES : $HTTP_POST_FILES) :
+	     ($sousaction2 ? $url : $chemin));
+
+     if (function_exists($fonc))
+       $fonc($arg, $mode, $type, $id_article, $id_document, 
+	     $hash, $hash_id_auteur, $redirect, $documents_actifs);
+     else spip_log("spip_image ne connait pas $fonc");
    }
 // Ajout d'un logo
 else if ($ajout_logo == "oui" and $logo) {