From e7f651d037a61c06d0f41b102646202d66105aaf Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Fri, 22 Sep 2006 11:25:45 +0000
Subject: [PATCH] =?UTF-8?q?Interface=20des=20fragments=20Ajax:=20un=20form?=
 =?UTF-8?q?ulaire=20pour=20ex=C3=A9cuter=20le=20script=20action/F.php=20es?=
 =?UTF-8?q?t=20=C3=A0=20pr=C3=A9sent=20construit=20par=20une=20fonction=20?=
 =?UTF-8?q?surchargeable,=20inc=5FF,=20d=C3=A9finie=20par=20d=C3=A9faut=20?=
 =?UTF-8?q?comme=20inc=5FF=5Fdist=20dans=20le=20fichier=20inc/F.php.=20Ell?=
 =?UTF-8?q?e=20est=20en=20particulier=20le=20r=C3=A9sultat=20int=C3=A9gral?=
 =?UTF-8?q?=20du=20script=20fragment/F.php=20destin=C3=A9=20=C3=A0=20etre?=
 =?UTF-8?q?=20appel=C3=A9=20en=20mode=20Ajax.=20Elle=20doit=20pr=C3=A9alab?=
 =?UTF-8?q?lement=20avoir=20=C3=A9t=C3=A9=20appel=C3=A9e=20en=20mode=20nor?=
 =?UTF-8?q?mal,=20son=20r=C3=A9sultat=20comportant=20alors=20une=20balise?=
 =?UTF-8?q?=20initiale=20englobante=20dont=20l'attribut=20Id=20commencera?=
 =?UTF-8?q?=20par=20F,ce=20qui=20rep=C3=A8re=20la=20greffe=20op=C3=A9r?=
 =?UTF-8?q?=C3=A9e=20par=20Ajax.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Première tranche: les fragments appelés explicitement dans articles.php.
---
 .gitattributes                             |   5 +
 ecrire/exec/articles.php                   | 226 +++--------------
 ecrire/fragments/dater.php                 |   7 +-
 ecrire/fragments/discuter.php              |  59 +----
 ecrire/fragments/editer_auteurs.php        | 264 +-------------------
 ecrire/fragments/referencer_traduction.php | 186 +-------------
 ecrire/fragments/virtualiser.php           |  42 +---
 ecrire/inc/dater.php                       | 165 +++++++++++++
 ecrire/inc/discuter.php                    |  71 ++++++
 ecrire/inc/editer_auteurs.php              | 271 +++++++++++++++++++++
 ecrire/inc/referencer_traduction.php       | 188 ++++++++++++++
 ecrire/inc/virtualiser.php                 |  40 +++
 12 files changed, 790 insertions(+), 734 deletions(-)
 create mode 100644 ecrire/inc/dater.php
 create mode 100644 ecrire/inc/discuter.php
 create mode 100644 ecrire/inc/editer_auteurs.php
 create mode 100644 ecrire/inc/referencer_traduction.php
 create mode 100644 ecrire/inc/virtualiser.php

diff --git a/.gitattributes b/.gitattributes
index f4d2b9c125..57b6eb2708 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -421,8 +421,11 @@ ecrire/inc/boutons.php -text
 ecrire/inc/chercher_logo.php -text
 ecrire/inc/chercher_rubrique.php -text
 ecrire/inc/cookie.php -text
+ecrire/inc/dater.php -text
+ecrire/inc/discuter.php -text
 ecrire/inc/distant.php -text
 ecrire/inc/drapeau_edition.php -text
+ecrire/inc/editer_auteurs.php -text
 ecrire/inc/filtres_images.php -text
 ecrire/inc/forum_insert.php -text
 ecrire/inc/gadgets.php -text
@@ -452,10 +455,12 @@ ecrire/inc/minipres.php -text
 ecrire/inc/petition.php -text
 ecrire/inc/plugin.php -text
 ecrire/inc/popularites.php -text
+ecrire/inc/referencer_traduction.php -text
 ecrire/inc/sites_voir.php -text
 ecrire/inc/suivi_versions.php -text
 ecrire/inc/syndic.php -text
 ecrire/inc/utils.php -text
+ecrire/inc/virtualiser.php -text
 ecrire/lang/ecrire_br.php -text
 ecrire/lang/ecrire_bs.php -text
 ecrire/lang/ecrire_cs.php -text
diff --git a/ecrire/exec/articles.php b/ecrire/exec/articles.php
index dd7fc0edb7..8c4b3dfa60 100644
--- a/ecrire/exec/articles.php
+++ b/ecrire/exec/articles.php
@@ -17,14 +17,10 @@ include_spip('inc/texte');
 include_spip('inc/rubriques');
 include_spip('inc/actions');
 include_spip('inc/mots');
-include_spip('inc/date');
 include_spip('inc/petition');
+include_spip('inc/forum');
 include_spip('inc/documents');
 include_spip('base/abstract_sql');
-include_spip('fragments/editer_auteurs');
-include_spip('fragments/referencer_traduction');
-include_spip('fragments/virtualiser');
-include_spip('fragments/discuter');
 
 // http://doc.spip.org/@exec_articles_dist
 function exec_articles_dist()
@@ -113,7 +109,7 @@ if ($options == "avancees" && $connect_statut=='0minirezo' && $flag_editable)
   {
 	boites_de_config_articles($id_article);
  
-	boite_article_virtuel($id_article, $virtuel);
+	echo boite_article_virtuel($id_article, $virtuel);
   }
 
 //
@@ -143,23 +139,14 @@ debut_cadre_relief();
 
 $modif = titres_articles($titre, $statut_article,$surtitre, $soustitre, $descriptif, $url_site, $nom_site, $flag_editable, $id_article, $id_rubrique);
 
-
  echo "<div class='serif' align='$spip_lang_left'>";
 
- debut_cadre_couleur();
- echo formulaire_dater($id_article, $flag_editable, $statut_article, $date, $date_redac);
- fin_cadre_couleur();
+ $f = charger_fonction('dater', 'inc');
+ echo $f($id_article, $flag_editable, $statut_article, $date, $date_redac);
 
-//
-// Liste des auteurs de l'article
-//
+ $f = charger_fonction('editer_auteurs', 'inc');
+ echo $f($id_article, $flag_editable, $cherche_auteur, $ids);
 
- echo "\n<div id='editer_auteurs-$id_article'>";
- echo formulaire_editer_auteurs($cherche_auteur, $ids, $id_article,$flag_editable);
- echo "</div>";
-//
-// Liste des mots-cles de l'article
-//
 
 if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
   echo formulaire_mots('article', $id_article, $cherche_mot, $select_groupe, $flag_editable);
@@ -170,7 +157,8 @@ if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
   if (($GLOBALS['meta']['multi_articles'] == 'oui')
 	OR (($GLOBALS['meta']['multi_rubriques'] == 'oui') AND ($GLOBALS['meta']['gerer_trad'] == 'oui'))) {
 
-    echo formulaire_referencer_traduction($id_article, $id_rubrique, $id_trad,  $flag_editable, $trad_err);
+ $f = charger_fonction('referencer_traduction', 'inc');
+ echo $f($id_article, $flag_editable, $id_rubrique, $id_trad, $trad_err);
   }
 
  echo pipeline('affiche_milieu',array('args'=>array('exec'=>'articles','id_article'=>$id_article),'data'=>''));
@@ -190,10 +178,6 @@ if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
 	echo "</div>";
 }
 
-//
-// Documents associes a l'article
-//
-
  if ($spip_display != 4) {
 
 	echo formulaire_joindre($id_article, "article", 'articles', $flag_editable);
@@ -206,17 +190,15 @@ if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
  echo "</div>";
  fin_cadre_relief();
 
-  echo "<br /><br />";
-  
+ // forum interne
+
   $tm = rawurlencode($titre);
-  echo "\n<div align='center'>";
-  icone(_T('icone_poster_message'), generer_url_ecrire("forum_envoi","statut=prive&id_article=$id_article&titre_message=$tm&url=" . generer_url_retour("articles","id_article=$id_article")), "forum-interne-24.gif", "creer.gif");
-  echo "</div><br />";
+  $f = charger_fonction('discuter', 'inc');
 
-  $f = charger_fonction('discuter', 'fragments');
-  echo  "<div id='forum'>";
-  echo $f($id_article, $debut);
-  echo "</div>";
+  echo "<br /><br />\n<div align='center'>",
+	icone(_T('icone_poster_message'), generer_url_ecrire("forum_envoi","statut=prive&id_article=$id_article&titre_message=$tm&url=" . generer_url_retour("articles","id_article=$id_article")), "forum-interne-24.gif", "creer.gif", false),
+	"</div><br />",
+	$f($id_article, false, $debut);
 
   fin_page();
 
@@ -336,27 +318,20 @@ function boites_de_config_articles($id_article)
 function boite_article_virtuel($id_article, $virtuel)
 {
 
-	debut_cadre_relief("site-24.gif");
-
-	echo "\n<div class='verdana1' style='text-align: center;'>";
-	if ($virtuel)
-		echo bouton_block_visible("redirection");
-	else
-		echo bouton_block_invisible("redirection");
-
-	echo '<b>', _T('bouton_redirection'), '</b>';
-	echo aide ("artvirt");
-	echo "</div>";
-
-	if ($virtuel)
-		echo debut_block_visible("redirection");
-	else
-		echo debut_block_invisible("redirection");
-	echo "<div id='virtualiser-$id_article'>";
-	echo formulaire_virtualiser($id_article, $virtuel, "articles", "id_article=$id_article");
-	echo "</div>";
-	echo fin_block();
-	fin_cadre_relief();
+	$f = charger_fonction('virtualiser', 'inc');
+
+	return debut_cadre_relief("site-24.gif", true)
+	. "\n<div class='verdana1' style='text-align: center;'>"
+	. ($virtuel ? bouton_block_visible("redirection") : bouton_block_invisible("redirection"))
+	. '<b>'
+	._T('bouton_redirection')
+	. '</b>'
+	. aide ("artvirt")
+	. "</div>"
+	. ($virtuel ? debut_block_visible("redirection") : debut_block_invisible("redirection"))
+	. $f($id_article, false, $virtuel, "articles", "id_article=$id_article")
+	. fin_block()
+	. fin_cadre_relief(true);
 }
 
 // http://doc.spip.org/@meme_rubrique_articles
@@ -469,149 +444,6 @@ function titres_articles($titre, $statut_article,$surtitre, $soustitre, $descrip
 }
 
 
-// http://doc.spip.org/@formulaire_dater
-function formulaire_dater($id_article, $flag_editable, $statut_article, $date, $date_redac)
-{
-	global $spip_lang_left, $spip_lang_right, $options;
-
-	if (ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})", $date_redac, $regs)) {
-		$annee_redac = $regs[1];
-		$mois_redac = $regs[2];
-		$jour_redac = $regs[3];
-		$heure_redac = $regs[4];
-		$minute_redac = $regs[5];
-		if ($annee_redac > 4000) $annee_redac -= 9000;
-	}
-
-	if (ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})", $date, $regs)) {
-		$annee = $regs[1];
-		$mois = $regs[2];
-		$jour = $regs[3];
-		$heure = $regs[4];
-		$minute = $regs[5];
-	}
-
-  if ($flag_editable AND $options == 'avancees') {
-
-	if ($statut_article == 'publie') {
-
-		$js = "onchange=\"findObj_forcer('valider_date').style.visibility='visible';\"";
-		$res = ajax_action_auteur("dater", 
-			"$id_article",
-			'articles',
-			"id_article=$id_article",
-			(
- bouton_block_invisible("datepub") .
- "<b><span class='verdana1'>".
- _T('texte_date_publication_article').
- '</span> ' . 
- majuscules(affdate($date)) .
- "</b>".
- aide('artdate') . 
- debut_block_invisible("datepub") .
- "<div style='margin: 5px; margin-$spip_lang_left: 20px;'>" .
- afficher_jour($jour, "name='jour' size='1' class='fondl' $js", true) .
- afficher_mois($mois, "name='mois' size='1' class='fondl' $js", true) .
- afficher_annee($annee, "name='annee' size='1' class='fondl' $js") .
- ' - ' .
- afficher_heure($heure, "name='heure' size='1' class='fondl' $js") .
- afficher_minute($minute, "name='minute' size='1' class='fondl' $js") .
- "<span class='visible_au_chargement' id='valider_date'>" .
- " &nbsp;\n<input type='submit' class='fondo' value='".
- _T('bouton_changer')."' />" .
- "</span>" .
- "</div>" .
- fin_block()));
-	} else {
-		$res = "\n<div><b> <span class='verdana1'>"
-		. _T('texte_date_creation_article')
-		. "</span>\n"
-		. majuscules(affdate($date))."</b>".aide('artdate')."</div>";
-	}
-
-	$possedeDateRedac= ($annee_redac.'-'.$mois_redac.'-'.$jour_redac != '0000-00-00');
-	if (($options == 'avancees' AND $GLOBALS['meta']["articles_redac"] != 'non')
-	OR $possedeDateRedac) {
-		if ($possedeDateRedac)
-			$date_affichee = majuscules(affdate($date_redac))
-#			." " ._T('date_fmt_heures_minutes', array('h' =>$heure_redac, 'm'=>$minute_redac))
-			;
-		else
-			$date_affichee = majuscules(_T('jour_non_connu_nc'));
-
-		$js = "\"findObj_forcer('valider_date_redac').style.visibility='visible';\"";
-		$res .= ajax_action_auteur("dater", 
-			"$id_article",
-			'articles',
-			"id_article=$id_article",
-			(bouton_block_invisible('dateredac') .
- "<b>" .
- "<span class='verdana1'>" .
- majuscules(_T('texte_date_publication_anterieure')) .
-'</span> '.
- $date_affichee .
- " " .
- aide('artdate_redac') .
- "</b>" .
- debut_block_invisible('dateredac') .
- "<div style='margin: 5px; margin-$spip_lang_left: 20px;'>" .
- '<table cellpadding="0" cellspacing="0" border="0" width="100%">' .
- '<tr><td align="$spip_lang_left">' .
- '<input type="radio" name="avec_redac" value="non" id="avec_redac_on"' .
- ($possedeDateRedac ? '' : ' checked="checked"') .
- " onClick=$js" .
- ' /> <label for="avec_redac_on">'.
- _T('texte_date_publication_anterieure_nonaffichee').
- '</label>' .
- '<br /><input type="radio" name="avec_redac" value="oui" id="avec_redac_off"' .
- (!$possedeDateRedac ? '' : ' checked="checked"') .
- " onClick=$js /> <label for='avec_redac_off'>" .
- _T('bouton_radio_afficher').
- ' :</label> ' .
- afficher_jour($jour_redac, "name='jour_redac' class='fondl' onchange=$js", true) .
- afficher_mois($mois_redac, "name='mois_redac' class='fondl' onchange=$js", true) .
- "<input type='text' name='annee_redac' class='fondl' value='".$annee_redac."' size='5' maxlength='4' onclick=$js />" .
- '<div align="center">' .
- afficher_heure($heure_redac, "name='heure_redac' class='fondl' onchange=$js", true) .
- afficher_minute($minute_redac, "name='minute_redac' class='fondl' onchange=$js", true) .
- "</div>\n" .
-
- '</td><td align="$spip_lang_right">' .
- "<span class='visible_au_chargement' id='valider_date_redac'>" .
- '<input type="submit" class="fondo" value="'.
- _T('bouton_changer').'" />' .
- "</span>" .
- '</td></tr>' .
- '</table>' .
- '</div>' .
- fin_block()) #, " method='post'"
-);
-	}
-  } else {
-
-	$res .= "<div style='text-align:center;'><b> <span class='verdana1'>"
-	. (($statut_article == 'publie')
-		? _T('texte_date_publication_article')
-		: _T('texte_date_creation_article'))
-	. "</span> "
-	.  majuscules(affdate($date))."</b>".aide('artdate')."</div>";
-
-	if ($possedeDateRedac) {
-		$res .= "<div style='text-align:center;'><b><span class='verdana1'>"
-		. _T('texte_date_publication_anterieure')
-		. "</span> "
-		. ' : '
-		. majuscules(affdate($date_redac))
-		. "</b>"
-		. aide('artdate_redac')
-		. "</div>";
-	}
-  }
-  return ($flag_editable === 'ajax')
-    ? $res
-    : "<div id='dater-$id_article'>$res</div>";
-}
-
 
 // http://doc.spip.org/@afficher_corps_articles
 function afficher_corps_articles($virtuel, $chapo, $texte, $ps,  $extra)
diff --git a/ecrire/fragments/dater.php b/ecrire/fragments/dater.php
index 2eacf88a48..0f809b1e69 100644
--- a/ecrire/fragments/dater.php
+++ b/ecrire/fragments/dater.php
@@ -30,10 +30,7 @@ function fragments_dater_dist()
 	$date = $row["date"];
 	$date_redac = $row["date_redac"];
 
-	include_spip('inc/actions');
-	include_spip('exec/articles');
-
-	return formulaire_dater($id_article, 'ajax', $statut_article, $date, $date_redac);
+	$f = charger_fonction('dater', 'inc');
+	return $f($id_article, 'ajax', $statut_article, $date, $date_redac);
 }
-
 ?>
diff --git a/ecrire/fragments/discuter.php b/ecrire/fragments/discuter.php
index fabb9d3152..df79aa1e3c 100644
--- a/ecrire/fragments/discuter.php
+++ b/ecrire/fragments/discuter.php
@@ -12,60 +12,11 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/forum');
-include_spip('inc/presentation');
-
-// http://doc.spip.org/@formulaire_discuter
-function formulaire_discuter($query, $total, $debut, $total_afficher, $script, $args, $mute=false)
-{
-	$res = $nav ='';
-	if ($total > $total_afficher) {
-		$evt = $_COOKIE['spip_accepte_ajax'] == 1;
-		$nav = "<div class='serif2' align='center'>";
-		for ($i = 0; $i < $total; $i = $i + $total_afficher){
-			$y = $i + $total_afficher - 1;
-			if ($i == $debut)
-				$nav .= "<font size='3'><b>[$i-$y]</b></font> ";
-			else {
-				$a = "$args&debut=$i";
-				if (!$evt) {
-					$h = generer_url_ecrire($script, $a);
-				} else {
-					$h = generer_url_ecrire('discuter', $a);
-					$evt = "\nonclick='return AjaxSqueeze(\"$h\",\n\t\"forum\")'";
-				}
-				$nav .= "[<a href='$h#forum'$evt>$i-$y</a>] ";
-			}
-		}
-		$nav .= "</div>";
-	}
-
-	$res = $nav 
-	. afficher_forum($query, $script, $args, $mute)
-	. "<br />"
-	. $nav;
-
-	return $res;
-}
-
-// http://doc.spip.org/@fragments_discuter_dist
-function fragments_discuter_dist($id_article=-1, $debut=-1)
+function fragments_discuter_dist()
 {
-  if ($debut == -1) $debut = _request('debut');
-  if ($id_article == -1) $id_article = _request('id_article');
-  
-  $debut = intval($debut);
-  $id_article = intval($id_article);
-
-  $row = spip_fetch_array(spip_query("SELECT COUNT(*) AS cnt FROM spip_forum WHERE statut='prive' AND id_article='$id_article' AND id_parent=0"));
-  $total = $row["cnt"];
-
-  if (!$total) return '';
-
-  $total_afficher = 8;
-  $forum = spip_query("SELECT * FROM spip_forum WHERE statut='prive' AND id_article='$id_article' AND id_parent=0 ORDER BY date_heure DESC" .   " LIMIT $debut,$total_afficher"   );
-#				   " LIMIT $total_afficher OFFSET $debut" # PG
-
-  return formulaire_discuter($forum, $total, $debut, $total_afficher, 'articles', "id_article=$id_article");
+	$debut = _request('debut');
+	$id_article = _request('id_article');
+	$f = charger_fonction('discuter', 'inc');
+	return $f($id_article, 'ajax', $debut);
 }
 ?>
diff --git a/ecrire/fragments/editer_auteurs.php b/ecrire/fragments/editer_auteurs.php
index 153cb445a8..6b0b4dfcc6 100644
--- a/ecrire/fragments/editer_auteurs.php
+++ b/ecrire/fragments/editer_auteurs.php
@@ -12,275 +12,17 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/presentation');
-include_spip('inc/actions');
-
 function fragments_editer_auteurs_dist()
 {
 	$id_article = intval(_request('id_article'));
 
-	if ($GLOBALS['connect_toutes_rubriques']) // pour eviter SQL
-		$droit = true;
-	else	$droit = acces_article($id_article);
-
-	if (!$droit) {
+	if (! acces_article($id_article)) {
 		spip_log("Tentative d'intrusion de " . $GLOBALS['auteur_session']['nom'] . " dans " . $GLOBALS['exec']);
 		include_spip('inc/minipres');
 		minipres(_T('info_acces_interdit'));
 	}
 
-	return formulaire_editer_auteurs(_request('cherche_auteur'), _request('ids'), $id_article, 'ajax'); 
-}
-
-function formulaire_editer_auteurs($cherche_auteur, $ids, $id_article, $flag_editable)
-{
-  global $spip_lang_left, $spip_lang_right, $options;
-
-//
-// complement de action/editer_auteurs.php pour notifier la recherche d'auteur
-//
-
- $bouton_creer_auteur =  $GLOBALS['connect_toutes_rubriques'];
-
- if ($cherche_auteur) {
-
-	$reponse ="<p align='$spip_lang_left'>"
-	. debut_boite_info(true)
-	. rechercher_auteurs_articles($cherche_auteur, $ids,  $id_article);
-
-	if ($bouton_creer_auteur) {
-
-		$reponse .="<div style='width: 200px;'>"
-		. icone_horizontale(_T('icone_creer_auteur'), generer_url_ecrire("auteur_infos","ajouter_id_article=$id_article&nom=" . rawurlencode($cherche_auteur). "&redirect=" . generer_url_retour("articles","id_article=$id_article")), "redacteurs-24.gif", "creer.gif", false)
-		. "</div> ";
-
-		$bouton_creer_auteur = false;
-	}
-
-	$reponse .= fin_boite_info(true)
-	. '</p>';
- } else $reponse ='';
-
-//
-// Afficher les auteurs
-//
-	$les_auteurs = array();
-
-	$result = spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=$id_article");
-
-	while ($row = spip_fetch_array($result))
-		$les_auteurs[]= $row['id_auteur'];
-
-	if ($les_auteurs = join(',', $les_auteurs)) 
-		$reponse .= afficher_auteurs_articles($id_article, $flag_editable, $les_auteurs);
-
-//
-// Ajouter un auteur
-//
-
- $res = '';
- if ($flag_editable AND $options == 'avancees') {
-
-	if ($bouton_creer_auteur) {
-
-		$res = "<div style='width:170px;'><span class='verdana1'><b>"
-		. icone_horizontale(_T('icone_creer_auteur'), generer_url_ecrire("auteur_infos","ajouter_id_article=$id_article&redirect=" .generer_url_retour("articles","id_article=$id_article")), "redacteurs-24.gif", "creer.gif", false)
-		. "</b></span></div>\n";
-	}
-
-	$res = "<div style='float:$spip_lang_right; width:280px;position:relative;display:inline;'>"
-	. ajouter_auteurs_articles($id_article, $les_auteurs, $bouton_creer_auteur)
-	."</div>\n"
-	. $res;
-
- }
-
- $bouton = (!$flag_editable 
-	    ? ''
-	    : (($flag_editable === 'ajax')
-	        ? bouton_block_visible("auteursarticle")
-	       : bouton_block_invisible("auteursarticle")))
- . _T('texte_auteurs')
-. aide("artauteurs");
-
- $res = '<div>&nbsp;</div>' // pour placer le gif patienteur
- . debut_cadre_enfonce("auteur-24.gif", true, "", $bouton)
- . $reponse
- .  ($flag_editable === 'ajax' ?
-     debut_block_visible("auteursarticle") :
-     debut_block_invisible("auteursarticle"))
- . $res
- . fin_block()
- . fin_cadre_enfonce(true);
-
- return $res;
-}
-
-// http://doc.spip.org/@rechercher_auteurs_articles
-function rechercher_auteurs_articles($cherche_auteur, $ids, $id_article)
-{
-	if (!$ids) {
-		return "<B>"._T('texte_aucun_resultat_auteur', array('cherche_auteur' => $cherche_auteur)).".</B><BR />";
-	}
-	elseif ($ids == -1) {
-		return "<B>"._T('texte_trop_resultats_auteurs', array('cherche_auteur' => $cherche_auteur))."</B><BR />";
-	}
-	elseif (preg_match('/^\d+$/',$ids)) {
-
-		$row = spip_fetch_array(spip_query("SELECT nom FROM spip_auteurs WHERE id_auteur=$ids"));
-		return "<B>"._T('texte_ajout_auteur')."</B><BR /><UL><LI><FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=2><B><FONT SIZE=3>".typo($row['nom'])."</FONT></B></UL>";
-	}
-	else {
-		$ids = preg_replace('/[^0-9,]/','',$ids); // securite
-		$result = spip_query("SELECT * FROM spip_auteurs WHERE id_auteur IN ($ids) ORDER BY nom");
-
-		$res = "<B>"
-		. _T('texte_plusieurs_articles', array('cherche_auteur' => $cherche_auteur))
-		. "</B><BR />"
-		.  "<UL class='verdana1'>";
-		while ($row = spip_fetch_array($result)) {
-				$id_auteur = $row['id_auteur'];
-				$nom_auteur = $row['nom'];
-				$email_auteur = $row['email'];
-				$bio_auteur = $row['bio'];
-
-				$res .= "<li><b>".typo($nom_auteur)."</b>";
-
-				if ($email_auteur) $res .= " ($email_auteur)";
-
-				$res .= " | "
-				  .  ajax_action_auteur('editer_auteurs', "$id_article,$id_auteur","articles","id_article=$id_article", array(_T('lien_ajouter_auteur')));
-
-				if (trim($bio_auteur)) {
-					$res .= "<br />".couper(propre($bio_auteur), 100)."\n";
-				}
-				$res .= "</li>\n";
-			}
-		$res .= "</UL>";
-		return $res;
-	}
-}
-
-// http://doc.spip.org/@afficher_auteurs_articles
-function afficher_auteurs_articles($id_article, $flag_editable, $les_auteurs)
-{
-	global $connect_statut, $options,$connect_id_auteur;
-
-	$table = array();
-
-	$result = spip_query("SELECT * FROM spip_auteurs AS A WHERE A.id_auteur IN ($les_auteurs) ORDER BY A.nom");
-
-	while ($row = spip_fetch_array($result)) {
-			$vals = array();
-			$id_auteur = $row["id_auteur"];
-			$nom_auteur = $row["nom"];
-			$email_auteur = $row["email"];
-			if ($bio_auteur = attribut_html(propre(couper($row["bio"], 100))))
-			  $bio_auteur = " TITLE=\"$bio_auteur\"";
-			$url_site_auteur = $row["url_site"];
-			$statut_auteur = $row["statut"];
-			if ($row['messagerie'] == 'non' OR $row['login'] == '') $messagerie = 'non';
-
-			$vals[] = bonhomme_statut($row);
-
-			$vals[] = "<a href='" . generer_url_ecrire('auteurs_edit', "id_auteur=$id_auteur") . "' $bio_auteur>".typo($nom_auteur)."</a>";
-
-			$vals[] = bouton_imessage($id_auteur);
-		
-			if ($email_auteur) $vals[] =  "<A href='mailto:$email_auteur'>"._T('email')."</A>";
-			else $vals[] =  "&nbsp;";
-
-			if ($url_site_auteur) $vals[] =  "<A href='$url_site_auteur'>"._T('info_site_min')."</A>";
-			else $vals[] =  "&nbsp;";
-
-			$cpt = spip_fetch_array(spip_query("SELECT COUNT(articles.id_article) AS n FROM spip_auteurs_articles AS lien, spip_articles AS articles WHERE lien.id_auteur=$id_auteur AND articles.id_article=lien.id_article AND articles.statut IN " . ($connect_statut == "0minirezo" ? "('prepa', 'prop', 'publie', 'refuse')" : "('prop', 'publie')") . " GROUP BY lien.id_auteur"));
-
-			$nombre_articles = intval($cpt['n']);
-
-			if ($nombre_articles > 1) $vals[] =  $nombre_articles.' '._T('info_article_2');
-			elseif ($nombre_articles == 1) $vals[] =  _T('info_1_article');
-			else $vals[] =  "&nbsp;";
-
-			if ($flag_editable AND ($connect_id_auteur != $id_auteur OR $connect_statut == '0minirezo') AND $options == 'avancees') {
-				$vals[] =  ajax_action_auteur('editer_auteurs', "$id_article,-$id_auteur",'articles', "id_article=$id_article", array(_T('lien_retirer_auteur')."&nbsp;". http_img_pack('croix-rouge.gif', "X", "width='7' height='7' border='0' align='middle'")));
-			} else {
-			  $vals[] = "";
-			}
-		
-			$table[] = $vals;
-	}
-	
-	$largeurs = array('14', '', '', '', '', '', '');
-	$styles = array('arial11', 'arial2', 'arial11', 'arial11', 'arial11', 'arial11', 'arial1');
-
-	return "<div class='liste'><table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>"
-	. afficher_liste($largeurs, $table, $styles)
-	. "</table></div>\n";
+	$f = charger_fonction('editer_auteurs', 'inc');
+	return $f($id_article, 'ajax', _request('cherche_auteur'), _request('ids'));
 }
-
-
-// http://doc.spip.org/@ajouter_auteurs_articles
-function ajouter_auteurs_articles($id_article, $les_auteurs)
-{
-	$result = spip_query("SELECT * FROM spip_auteurs WHERE " . (!$les_auteurs ? '' : "id_auteur NOT IN ($les_auteurs) AND ") . "statut!='5poubelle' AND statut!='6forum' AND statut!='nouveau' ORDER BY statut, nom");
-
-	if (!$num = spip_num_rows($result)) return '';
-
-	$js = "\"findObj_forcer('valider_ajouter_auteur').style.visibility='visible';\"";
-
-	return ajax_action_auteur('editer_auteurs', $id_article,'articles', "id_article=$id_article",
-				      (
-			"<span class='verdana1'><B>"._T('titre_cadre_ajouter_auteur')."&nbsp; </B></span>\n" .
-
-			($num > 200 
-			? ("<input type='text' name='cherche_auteur' onClick=$js CLASS='fondl' VALUE='' SIZE='20' />" .
-			  "<span  class='visible_au_chargement' id='valider_ajouter_auteur'>\n<input type='submit' value='"._T('bouton_chercher')."' CLASS='fondo' /></span>")
-			: ("<select name='nouv_auteur' size='1' style='width:150px;' CLASS='fondl' onChange=$js>" .
-			   articles_auteur_select($result) .
-			   "</select>" .
-			   "<span  class='visible_au_chargement' id='valider_ajouter_auteur'>" .
-			   " <input type='submit' value='"._T('bouton_ajouter')."' CLASS='fondo'>" .
-			   "</span>"))));
-}
-
-// http://doc.spip.org/@articles_auteur_select
-function articles_auteur_select($result)
-{
-	global $couleur_claire ;
-
-	$statut_old = $premiere_old = $res = '';
-
-	while ($row = spip_fetch_array($result)) {
-		$id_auteur = $row["id_auteur"];
-		$nom = $row["nom"];
-		$email = $row["email"];
-		$statut = $row["statut"];
-
-		$statut=str_replace("0minirezo", _T('info_administrateurs'), $statut);
-		$statut=str_replace("1comite", _T('info_redacteurs'), $statut);
-		$statut=str_replace("6visiteur", _T('info_visiteurs'), $statut);
-				
-		$premiere = strtoupper(substr(trim($nom), 0, 1));
-
-		if ($connect_statut != '0minirezo')
-			if ($p = strpos($email, '@'))
-				  $email = substr($email, 0, $p).'@...';
-		if ($email)
-			$email = " ($email)";
-
-		if ($statut != $statut_old) {
-			$res .= "\n<OPTION VALUE=\"x\">";
-			$res .= "\n<OPTION VALUE=\"x\" style='background-color: $couleur_claire;'> $statut";
-		}
-
-		if ($premiere != $premiere_old AND ($statut != _T('info_administrateurs') OR !$premiere_old))
-			$res .= "\n<OPTION VALUE=\"x\">";
-				
-		$res .= "\n<OPTION VALUE=\"$id_auteur\">&nbsp;&nbsp;&nbsp;&nbsp;" . supprimer_tags(couper(typo("$nom$email"), 40));
-		$statut_old = $statut;
-		$premiere_old = $premiere;
-	}
-	return $res;
-}
-
 ?>
diff --git a/ecrire/fragments/referencer_traduction.php b/ecrire/fragments/referencer_traduction.php
index a327d51cf9..5e4b57fc94 100644
--- a/ecrire/fragments/referencer_traduction.php
+++ b/ecrire/fragments/referencer_traduction.php
@@ -12,19 +12,11 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/presentation');
-
 function fragments_referencer_traduction_dist()
 {
-	include_spip('inc/actions');
-
 	$id_article = intval(_request('id_article'));
 
-	if ($GLOBALS['connect_toutes_rubriques']) // pour eviter SQL
-		$droit = true;
-	else	$droit = acces_article($id_article);
-
-	if (!$droit) {
+	if (!acces_article($id_article)) {
 		spip_log("Tentative d'intrusion de " . $GLOBALS['auteur_session']['nom'] . " dans " . $GLOBALS['exec']);
 		include_spip('inc/minipres');
 		minipres(_T('info_acces_interdit'));
@@ -32,179 +24,7 @@ function fragments_referencer_traduction_dist()
 
 	$row = spip_fetch_array(spip_query("SELECT id_trad, id_rubrique FROM spip_articles WHERE id_article=$id_article"));
 
-	return formulaire_referencer_traduction($id_article, $row['id_rubrique'], $row['id_trad'], 'ajax'); 
-}
-
-function formulaire_referencer_traduction($id_article, $id_rubrique, $id_trad, $flag_editable, $trad_err='')
-{
-	global $connect_statut, $couleur_claire, $options, $connect_toutes_rubriques, $spip_lang_right, $dir_lang;
-
-	$langue_article = spip_fetch_array(spip_query("SELECT lang FROM spip_articles WHERE id_article=$id_article"));
-
-	$langue_article = $langue_article['lang'];
-
-	$reponse = '';
-	// Choix langue article
-	if ($GLOBALS['meta']['multi_articles'] == 'oui' AND $flag_editable) {
-
-		$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
-		$langue_parent = $row['lang'];
-
-		if (!$langue_parent)
-			$langue_parent = $GLOBALS['meta']['langue_site'];
-		if (!$langue_article)
-			$langue_article = $langue_parent;
-
-		$menu = menu_langues('changer_lang', $langue_article, _T('info_multi_cet_article').' ', $langue_parent, 'ajax');
-
-		$menu = ajax_action_auteur('referencer_traduction', "$id_article,$id_rubrique","articles","id_article=$id_article", $menu);
-
-		$reponse .= debut_cadre_couleur('',true)
-		. "\n<div style='text-align: center;'>"
-		. $menu
-		. "</div>\n"
-		. fin_cadre_couleur(true);
-	}
-
-	if ($trad_err)
-		$reponse .= "<div><font color='red' size='2' face='verdana,arial,helvetica,sans-serif'>"._T('trad_deja_traduit'). "</font></div>";
-
-		// Afficher la liste des traductions
-	$table = !$id_trad ? array() : articles_traduction($id_article, $id_trad);
-
-		// bloc traductions
-	if (count($table) > 0) {
-
-		$largeurs = array(7, 12, '', 100);
-		$styles = array('', '', 'arial2', 'arial2');
-
-		$liste = "\n<div class='liste'>"
-		. bandeau_titre_boite2(_T('trad_article_traduction'),'', 'white', 'black', false)
-		. "<table width='100%' cellspacing='0' border='0' cellpadding='2'>"
-		. afficher_liste ($largeurs, $table, $styles)
-		. "</table>"
-		. "</div>";
-	}
-
-	// changer les globales $dir_lang etc
-	changer_typo($langue_article);
-
-	$form = "<table width='100%'><tr>";
-
-	if ($flag_editable AND $options == "avancees" AND !$table) {
-			// Formulaire pour lier a un article
-		$form .= "<td class='arial2' width='60%'>"
-		. ajax_action_auteur("referencer_traduction",
-				$id_article,
-				'articles',
-				"id_article=$id_article",
-				(_T('trad_lier') .
-				 "\n<input type='text' class='fondl' name='lier_trad' size='5' />\n<input type='submit' value='"._T('bouton_valider')."' class='fondl' />"))
-		. "</td>\n"
-		. "<td background='' width='10'> &nbsp; </td>"
-		. "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>"
-		. "<td background='' width='10'> &nbsp; </td>";
-	}
-
-	$form .= "<td>"
-	. icone_horizontale(_T('trad_new'), generer_url_ecrire("articles_edit","new=oui&lier_trad=$id_article&id_rubrique=$id_rubrique"), "traductions-24.gif", "creer.gif", false)
-	. "</td>";
-
-	if ($flag_editable AND $options == "avancees" AND $table) {
-		$clic = _T('trad_delier');
-		$form .= "<td background='' width='10'> &nbsp; </td>"
-		. "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>"
-		. "<td background='' width='10'> &nbsp; </td>"
-		. "<td>"
-		  // la 1ere occurrence de clic ne sert pas en Ajax
-		. icone_horizontale($clic, ajax_action_auteur("referencer_traduction","$id_article,-$id_trad",'articles', "id_article=$id_article",array($clic)), "traductions-24.gif", "supprimer.gif", false)
-		. "</td>\n";
-	}
-
-	$form .= "</tr></table>";
-
-	if ($GLOBALS['meta']['gerer_trad'] == 'oui')
-		$bouton = _T('titre_langue_trad_article');
-	else
-		$bouton = _T('titre_langue_article');
-
-	if ($langue_article)
-		$bouton .= "&nbsp; (".traduire_nom_langue($langue_article).")";
-
-	return ($flag_editable === 'ajax')
-		? 
-			debut_cadre_enfonce('langues-24.gif', true, "", 
-				bouton_block_visible('languearticle,lier_traductions')
-				. $bouton)
-			. debut_block_visible('languearticle')
-			. $reponse
-			. fin_block()
-			. $liste
-			. debut_block_visible('lier_traductions')
-			. $form
-			. fin_block()
-			. fin_cadre_enfonce(true)
-			. fin_block()
-		:
-			"<div id='referencer_traduction-$id_article'>"
-			. debut_cadre_enfonce('langues-24.gif', true, "",
-				bouton_block_invisible('languearticle,lier_traductions')
-				. $bouton)
-			. debut_block_invisible('languearticle')
-			. $reponse
-			. fin_block()
-			. $liste
-			. debut_block_invisible('lier_traductions')
-			. $form
-			. fin_block()
-			. fin_cadre_enfonce(true)
-			. "</div>";
-}
-
-
-// http://doc.spip.org/@articles_traduction
-function articles_traduction($id_article, $id_trad)
-{
-	global $connect_toutes_rubriques, $dir_lang;
-
-	$result_trad = spip_query("SELECT id_article, id_rubrique, titre, lang, statut FROM spip_articles WHERE id_trad = $id_trad");
-	
-	$table= array();
-
-	while ($row = spip_fetch_array($result_trad)) {
-		$vals = array();
-		$id_article_trad = $row["id_article"];
-		$id_rubrique_trad = $row["id_rubrique"];
-		$titre_trad = $row["titre"];
-		$lang_trad = $row["lang"];
-		$statut_trad = $row["statut"];
-
-		changer_typo($lang_trad);
-		$titre_trad = "<span $dir_lang>$titre_trad</span>";
-
-		$vals[] = http_img_pack("puce-".puce_statut($statut_trad).'.gif', "", "width='7' height='7' border='0' NAME='statut'");
-		
-		if ($id_article_trad == $id_trad) {
-			$vals[] = http_img_pack('langues-12.gif', "", "width='12' height='12' border='0'");
-			$titre_trad = "<b>$titre_trad</b>";
-		} else {
-		  if (!$connect_toutes_rubriques)
-			$vals[] = http_img_pack('langues-off-12.gif', "", "width='12' height='12' border='0'");
-		  else 
-		    $vals[] = ajax_action_auteur("referencer_traduction", "$id_article,$id_trad,$id_article_trad", 'articles', "id_article=$id_article", array(http_img_pack('langues-off-12.gif', _T('trad_reference'), "width='12' height='12' border='0'"), ' title="' . _T('trad_reference') . '"'));
-		}
-
-		$s = typo($titre_trad);
-		if ($id_article_trad != $id_article) 
-			$s = "<a href='" . generer_url_ecrire("articles","id_article=$id_article_trad") . "'>$s</a>";
-		if ($id_article_trad == $id_trad)
-			$s .= " "._T('trad_reference');
-
-		$vals[] = $s;
-		$vals[] = traduire_nom_langue($lang_trad);
-		$table[] = $vals;
-	}
-
-	return $table;
+	$f = charger_fonction('referencer_traduction', 'inc');
+	return $f($id_article, 'ajax', $row['id_rubrique'], $row['id_trad']); 
 }
 ?>
diff --git a/ecrire/fragments/virtualiser.php b/ecrire/fragments/virtualiser.php
index 2761d30d25..ea18864e9f 100644
--- a/ecrire/fragments/virtualiser.php
+++ b/ecrire/fragments/virtualiser.php
@@ -11,38 +11,6 @@
 \***************************************************************************/
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
-include_spip('inc/actions');
-
-// http://doc.spip.org/@formulaire_virtualiser
-function formulaire_virtualiser($id_article, $virtuel, $script, $args)
-{
-	global $spip_lang_right, $spip_lang_left;
-
-	if ($virtuel === 'ajax') {
-		$row = spip_fetch_array(spip_query("SELECT chapo FROM spip_articles WHERE id_article='$id_article'"));
-		$virtuel = $row['chapo'];
-		if (substr($virtuel, 0, 1) == '=') {
-			$virtuel = substr($virtuel, 1);
-		}
-	}
-
-	$http = ($virtuel ? "" : "http://");
-
-	$r = "<input type='text' name='virtuel' class='formo' style='font-size:9px;' value='"
-	. $http
-	. $virtuel
-	. "' size='40' /><br />\n"
-	. "<font face='Verdana,Arial,Sans,sans-serif' size='2'>"
-	. "(<b>"._T('texte_article_virtuel')
-	. "&nbsp;:</b> "
-	. _T('texte_reference_mais_redirige')
-	. ")</font>"
-	. "\n<div align='$spip_lang_right'><input type='submit' class='fondo' value='"
-	. _T('bouton_changer')
-	. "' style='font-size:10px' /></div>";
-
-	return ajax_action_auteur('virtualiser', $id_article, $script, $args, $r);
-}
 
 // http://doc.spip.org/@exec_virtualiser_dist
 function fragments_virtualiser_dist()
@@ -56,7 +24,13 @@ function fragments_virtualiser_dist()
 		minipres(_T('info_acces_interdit'));
 	}
 
-	return formulaire_virtualiser($id_article, 'ajax', $script, "id_article=$id_article");
-}
+	$row = spip_fetch_array(spip_query("SELECT chapo FROM spip_articles WHERE id_article='$id_article'"));
+	$virtuel = $row['chapo'];
+	if (substr($virtuel, 0, 1) == '=') {
+			$virtuel = substr($virtuel, 1);
+	}
 
+	$f = charger_fonction('virtualiser', 'inc');
+	return  $f($id_article, 'ajax', $virtuel, "articles", "id_article=$id_article");
+}
 ?>
diff --git a/ecrire/inc/dater.php b/ecrire/inc/dater.php
new file mode 100644
index 0000000000..ac7d77218b
--- /dev/null
+++ b/ecrire/inc/dater.php
@@ -0,0 +1,165 @@
+<?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/presentation');
+include_spip('inc/texte');
+include_spip('inc/actions');
+include_spip('inc/date');
+
+function inc_dater_dist($id_article, $flag_editable, $statut_article, $date, $date_redac)
+{
+	global $spip_lang_left, $spip_lang_right, $options;
+
+	if (ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})", $date_redac, $regs)) {
+		$annee_redac = $regs[1];
+		$mois_redac = $regs[2];
+		$jour_redac = $regs[3];
+		$heure_redac = $regs[4];
+		$minute_redac = $regs[5];
+		if ($annee_redac > 4000) $annee_redac -= 9000;
+	}
+
+	if (ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})", $date, $regs)) {
+		$annee = $regs[1];
+		$mois = $regs[2];
+		$jour = $regs[3];
+		$heure = $regs[4];
+		$minute = $regs[5];
+	}
+
+  if ($flag_editable AND $options == 'avancees') {
+
+	if ($statut_article == 'publie') {
+
+		$js = "onchange=\"findObj_forcer('valider_date').style.visibility='visible';\"";
+		$res = ajax_action_auteur("dater", 
+			"$id_article",
+			'articles',
+			"id_article=$id_article",
+			(
+ bouton_block_invisible("datepub") .
+ "<b><span class='verdana1'>".
+ _T('texte_date_publication_article').
+ '</span> ' . 
+ majuscules(affdate($date)) .
+ "</b>".
+ aide('artdate') . 
+ debut_block_invisible("datepub") .
+ "<div style='margin: 5px; margin-$spip_lang_left: 20px;'>" .
+ afficher_jour($jour, "name='jour' size='1' class='fondl' $js", true) .
+ afficher_mois($mois, "name='mois' size='1' class='fondl' $js", true) .
+ afficher_annee($annee, "name='annee' size='1' class='fondl' $js") .
+ ' - ' .
+ afficher_heure($heure, "name='heure' size='1' class='fondl' $js") .
+ afficher_minute($minute, "name='minute' size='1' class='fondl' $js") .
+ "<span class='visible_au_chargement' id='valider_date'>" .
+ " &nbsp;\n<input type='submit' class='fondo' value='".
+ _T('bouton_changer')."' />" .
+ "</span>" .
+ "</div>" .
+ fin_block()));
+	} else {
+		$res = "\n<div><b> <span class='verdana1'>"
+		. _T('texte_date_creation_article')
+		. "</span>\n"
+		. majuscules(affdate($date))."</b>".aide('artdate')."</div>";
+	}
+
+	$possedeDateRedac= ($annee_redac.'-'.$mois_redac.'-'.$jour_redac != '0000-00-00');
+	if (($options == 'avancees' AND $GLOBALS['meta']["articles_redac"] != 'non')
+	OR $possedeDateRedac) {
+		if ($possedeDateRedac)
+			$date_affichee = majuscules(affdate($date_redac))
+#			." " ._T('date_fmt_heures_minutes', array('h' =>$heure_redac, 'm'=>$minute_redac))
+			;
+		else
+			$date_affichee = majuscules(_T('jour_non_connu_nc'));
+
+		$js = "\"findObj_forcer('valider_date_redac').style.visibility='visible';\"";
+		$res .= ajax_action_auteur("dater", 
+			"$id_article",
+			'articles',
+			"id_article=$id_article",
+			(bouton_block_invisible('dateredac') .
+ "<b>" .
+ "<span class='verdana1'>" .
+ majuscules(_T('texte_date_publication_anterieure')) .
+'</span> '.
+ $date_affichee .
+ " " .
+ aide('artdate_redac') .
+ "</b>" .
+ debut_block_invisible('dateredac') .
+ "<div style='margin: 5px; margin-$spip_lang_left: 20px;'>" .
+ '<table cellpadding="0" cellspacing="0" border="0" width="100%">' .
+ '<tr><td align="$spip_lang_left">' .
+ '<input type="radio" name="avec_redac" value="non" id="avec_redac_on"' .
+ ($possedeDateRedac ? '' : ' checked="checked"') .
+ " onClick=$js" .
+ ' /> <label for="avec_redac_on">'.
+ _T('texte_date_publication_anterieure_nonaffichee').
+ '</label>' .
+ '<br /><input type="radio" name="avec_redac" value="oui" id="avec_redac_off"' .
+ (!$possedeDateRedac ? '' : ' checked="checked"') .
+ " onClick=$js /> <label for='avec_redac_off'>" .
+ _T('bouton_radio_afficher').
+ ' :</label> ' .
+ afficher_jour($jour_redac, "name='jour_redac' class='fondl' onchange=$js", true) .
+ afficher_mois($mois_redac, "name='mois_redac' class='fondl' onchange=$js", true) .
+ "<input type='text' name='annee_redac' class='fondl' value='".$annee_redac."' size='5' maxlength='4' onclick=$js />" .
+ '<div align="center">' .
+ afficher_heure($heure_redac, "name='heure_redac' class='fondl' onchange=$js", true) .
+ afficher_minute($minute_redac, "name='minute_redac' class='fondl' onchange=$js", true) .
+ "</div>\n" .
+
+ '</td><td align="$spip_lang_right">' .
+ "<span class='visible_au_chargement' id='valider_date_redac'>" .
+ '<input type="submit" class="fondo" value="'.
+ _T('bouton_changer').'" />' .
+ "</span>" .
+ '</td></tr>' .
+ '</table>' .
+ '</div>' .
+ fin_block()) #, " method='post'"
+);
+	}
+  } else {
+
+	$res .= "<div style='text-align:center;'><b> <span class='verdana1'>"
+	. (($statut_article == 'publie')
+		? _T('texte_date_publication_article')
+		: _T('texte_date_creation_article'))
+	. "</span> "
+	.  majuscules(affdate($date))."</b>".aide('artdate')."</div>";
+
+	if ($possedeDateRedac) {
+		$res .= "<div style='text-align:center;'><b><span class='verdana1'>"
+		. _T('texte_date_publication_anterieure')
+		. "</span> "
+		. ' : '
+		. majuscules(affdate($date_redac))
+		. "</b>"
+		. aide('artdate_redac')
+		. "</div>";
+	}
+  }
+
+  $res =  debut_cadre_couleur('',true) . $res .  fin_cadre_couleur(true);
+
+  return ($flag_editable === 'ajax')
+    ? $res
+    : "<div id='dater-$id_article'>$res</div>";
+}
+
+?>
diff --git a/ecrire/inc/discuter.php b/ecrire/inc/discuter.php
new file mode 100644
index 0000000000..893751f019
--- /dev/null
+++ b/ecrire/inc/discuter.php
@@ -0,0 +1,71 @@
+<?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/forum');
+include_spip('inc/presentation');
+
+// http://doc.spip.org/@formulaire_discuter
+function formulaire_discuter($query, $total, $debut, $total_afficher, $script, $args, $mute=false)
+{
+	$res = $nav ='';
+	if ($total > $total_afficher) {
+		$evt = $_COOKIE['spip_accepte_ajax'] == 1;
+		$nav = "<div class='serif2' align='center'>";
+		for ($i = 0; $i < $total; $i = $i + $total_afficher){
+			$y = $i + $total_afficher - 1;
+			if ($i == $debut)
+				$nav .= "<font size='3'><b>[$i-$y]</b></font> ";
+			else {
+				$a = "$args&debut=$i";
+				if (!$evt) {
+					$h = generer_url_ecrire($script, $a);
+				} else {
+					$h = generer_url_ecrire('discuter', $a);
+					$evt = "\nonclick='return AjaxSqueeze(\"$h\",\n\t\"forum\")'";
+				}
+				$nav .= "[<a href='$h#forum'$evt>$i-$y</a>] ";
+			}
+		}
+		$nav .= "</div>";
+	}
+
+	$res = $nav 
+	. afficher_forum($query, $script, $args, $mute)
+	. "<br />"
+	. $nav;
+
+	return $res;
+}
+
+// http://doc.spip.org/@fragments_discuter_dist
+function inc_discuter_dist($id_article, $flag, $debut=1)
+{
+  $debut = intval($debut);
+  $id_article = intval($id_article);
+
+  $res = spip_fetch_array(spip_query("SELECT COUNT(*) AS cnt FROM spip_forum WHERE statut='prive' AND id_article='$id_article' AND id_parent=0"));
+  $res = $res["cnt"];
+
+  if ($res) {
+
+	  $total_afficher = 8;
+	  $forum = spip_query("SELECT * FROM spip_forum WHERE statut='prive' AND id_article='$id_article' AND id_parent=0 ORDER BY date_heure DESC" .   " LIMIT $debut,$total_afficher"   );
+#				   " LIMIT $total_afficher OFFSET $debut" # PG
+
+	  $res = formulaire_discuter($forum, $res, $debut, $total_afficher, 'articles', "id_article=$id_article");
+  }
+
+  return ($flag=='ajax') ? $res : "<div id='forum'>$res</div>";
+}
+?>
diff --git a/ecrire/inc/editer_auteurs.php b/ecrire/inc/editer_auteurs.php
new file mode 100644
index 0000000000..67451aa63a
--- /dev/null
+++ b/ecrire/inc/editer_auteurs.php
@@ -0,0 +1,271 @@
+<?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/presentation');
+include_spip('inc/actions');
+
+function inc_editer_auteurs_dist($id_article, $flag_editable, $cherche_auteur, $ids)
+{
+  global $spip_lang_left, $spip_lang_right, $options;
+
+//
+// complement de action/editer_auteurs.php pour notifier la recherche d'auteur
+//
+
+ $bouton_creer_auteur =  $GLOBALS['connect_toutes_rubriques'];
+
+ if ($cherche_auteur) {
+
+	$reponse ="<p align='$spip_lang_left'>"
+	. debut_boite_info(true)
+	. rechercher_auteurs_articles($cherche_auteur, $ids,  $id_article);
+
+	if ($bouton_creer_auteur) {
+
+		$reponse .="<div style='width: 200px;'>"
+		. icone_horizontale(_T('icone_creer_auteur'), generer_url_ecrire("auteur_infos","ajouter_id_article=$id_article&nom=" . rawurlencode($cherche_auteur). "&redirect=" . generer_url_retour("articles","id_article=$id_article")), "redacteurs-24.gif", "creer.gif", false)
+		. "</div> ";
+
+		$bouton_creer_auteur = false;
+	}
+
+	$reponse .= fin_boite_info(true)
+	. '</p>';
+ } else $reponse ='';
+
+//
+// Afficher les auteurs
+//
+	$les_auteurs = array();
+
+	$result = spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=$id_article");
+
+	while ($row = spip_fetch_array($result))
+		$les_auteurs[]= $row['id_auteur'];
+
+	if ($les_auteurs = join(',', $les_auteurs)) 
+		$reponse .= afficher_auteurs_articles($id_article, $flag_editable, $les_auteurs);
+
+//
+// Ajouter un auteur
+//
+
+ $res = '';
+ if ($flag_editable AND $options == 'avancees') {
+
+	if ($bouton_creer_auteur) {
+
+		$res = "<div style='width:170px;'><span class='verdana1'><b>"
+		. icone_horizontale(_T('icone_creer_auteur'), generer_url_ecrire("auteur_infos","ajouter_id_article=$id_article&redirect=" .generer_url_retour("articles","id_article=$id_article")), "redacteurs-24.gif", "creer.gif", false)
+		. "</b></span></div>\n";
+	}
+
+	$res = "<div style='float:$spip_lang_right; width:280px;position:relative;display:inline;'>"
+	. ajouter_auteurs_articles($id_article, $les_auteurs, $bouton_creer_auteur)
+	."</div>\n"
+	. $res;
+
+ }
+
+ $bouton = (!$flag_editable 
+	    ? ''
+	    : (($flag_editable === 'ajax')
+	        ? bouton_block_visible("auteursarticle")
+	       : bouton_block_invisible("auteursarticle")))
+ . _T('texte_auteurs')
+. aide("artauteurs");
+
+ $res = '<div>&nbsp;</div>' // pour placer le gif patienteur
+ . debut_cadre_enfonce("auteur-24.gif", true, "", $bouton)
+ . $reponse
+ .  ($flag_editable === 'ajax' ?
+     debut_block_visible("auteursarticle") :
+     debut_block_invisible("auteursarticle"))
+ . $res
+ . fin_block()
+ . fin_cadre_enfonce(true);
+
+ return ($flag_editable === 'ajax')
+   ? $res
+   :  "\n<div id='editer_auteurs-$id_article'>$res</div>";
+}
+
+// http://doc.spip.org/@rechercher_auteurs_articles
+function rechercher_auteurs_articles($cherche_auteur, $ids, $id_article)
+{
+	if (!$ids) {
+		return "<B>"._T('texte_aucun_resultat_auteur', array('cherche_auteur' => $cherche_auteur)).".</B><BR />";
+	}
+	elseif ($ids == -1) {
+		return "<B>"._T('texte_trop_resultats_auteurs', array('cherche_auteur' => $cherche_auteur))."</B><BR />";
+	}
+	elseif (preg_match('/^\d+$/',$ids)) {
+
+		$row = spip_fetch_array(spip_query("SELECT nom FROM spip_auteurs WHERE id_auteur=$ids"));
+		return "<B>"._T('texte_ajout_auteur')."</B><BR /><UL><LI><FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=2><B><FONT SIZE=3>".typo($row['nom'])."</FONT></B></UL>";
+	}
+	else {
+		$ids = preg_replace('/[^0-9,]/','',$ids); // securite
+		$result = spip_query("SELECT * FROM spip_auteurs WHERE id_auteur IN ($ids) ORDER BY nom");
+
+		$res = "<B>"
+		. _T('texte_plusieurs_articles', array('cherche_auteur' => $cherche_auteur))
+		. "</B><BR />"
+		.  "<UL class='verdana1'>";
+		while ($row = spip_fetch_array($result)) {
+				$id_auteur = $row['id_auteur'];
+				$nom_auteur = $row['nom'];
+				$email_auteur = $row['email'];
+				$bio_auteur = $row['bio'];
+
+				$res .= "<li><b>".typo($nom_auteur)."</b>";
+
+				if ($email_auteur) $res .= " ($email_auteur)";
+
+				$res .= " | "
+				  .  ajax_action_auteur('editer_auteurs', "$id_article,$id_auteur","articles","id_article=$id_article", array(_T('lien_ajouter_auteur')));
+
+				if (trim($bio_auteur)) {
+					$res .= "<br />".couper(propre($bio_auteur), 100)."\n";
+				}
+				$res .= "</li>\n";
+			}
+		$res .= "</UL>";
+		return $res;
+	}
+}
+
+// http://doc.spip.org/@afficher_auteurs_articles
+function afficher_auteurs_articles($id_article, $flag_editable, $les_auteurs)
+{
+	global $connect_statut, $options,$connect_id_auteur;
+
+	$table = array();
+
+	$result = spip_query("SELECT * FROM spip_auteurs AS A WHERE A.id_auteur IN ($les_auteurs) ORDER BY A.nom");
+
+	while ($row = spip_fetch_array($result)) {
+			$vals = array();
+			$id_auteur = $row["id_auteur"];
+			$nom_auteur = $row["nom"];
+			$email_auteur = $row["email"];
+			if ($bio_auteur = attribut_html(propre(couper($row["bio"], 100))))
+			  $bio_auteur = " TITLE=\"$bio_auteur\"";
+			$url_site_auteur = $row["url_site"];
+			$statut_auteur = $row["statut"];
+			if ($row['messagerie'] == 'non' OR $row['login'] == '') $messagerie = 'non';
+
+			$vals[] = bonhomme_statut($row);
+
+			$vals[] = "<a href='" . generer_url_ecrire('auteurs_edit', "id_auteur=$id_auteur") . "' $bio_auteur>".typo($nom_auteur)."</a>";
+
+			$vals[] = bouton_imessage($id_auteur);
+		
+			if ($email_auteur) $vals[] =  "<A href='mailto:$email_auteur'>"._T('email')."</A>";
+			else $vals[] =  "&nbsp;";
+
+			if ($url_site_auteur) $vals[] =  "<A href='$url_site_auteur'>"._T('info_site_min')."</A>";
+			else $vals[] =  "&nbsp;";
+
+			$cpt = spip_fetch_array(spip_query("SELECT COUNT(articles.id_article) AS n FROM spip_auteurs_articles AS lien, spip_articles AS articles WHERE lien.id_auteur=$id_auteur AND articles.id_article=lien.id_article AND articles.statut IN " . ($connect_statut == "0minirezo" ? "('prepa', 'prop', 'publie', 'refuse')" : "('prop', 'publie')") . " GROUP BY lien.id_auteur"));
+
+			$nombre_articles = intval($cpt['n']);
+
+			if ($nombre_articles > 1) $vals[] =  $nombre_articles.' '._T('info_article_2');
+			elseif ($nombre_articles == 1) $vals[] =  _T('info_1_article');
+			else $vals[] =  "&nbsp;";
+
+			if ($flag_editable AND ($connect_id_auteur != $id_auteur OR $connect_statut == '0minirezo') AND $options == 'avancees') {
+				$vals[] =  ajax_action_auteur('editer_auteurs', "$id_article,-$id_auteur",'articles', "id_article=$id_article", array(_T('lien_retirer_auteur')."&nbsp;". http_img_pack('croix-rouge.gif', "X", "width='7' height='7' border='0' align='middle'")));
+			} else {
+			  $vals[] = "";
+			}
+		
+			$table[] = $vals;
+	}
+	
+	$largeurs = array('14', '', '', '', '', '', '');
+	$styles = array('arial11', 'arial2', 'arial11', 'arial11', 'arial11', 'arial11', 'arial1');
+
+	return "<div class='liste'><table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>"
+	. afficher_liste($largeurs, $table, $styles)
+	. "</table></div>\n";
+}
+
+
+// http://doc.spip.org/@ajouter_auteurs_articles
+function ajouter_auteurs_articles($id_article, $les_auteurs)
+{
+	$result = spip_query("SELECT * FROM spip_auteurs WHERE " . (!$les_auteurs ? '' : "id_auteur NOT IN ($les_auteurs) AND ") . "statut!='5poubelle' AND statut!='6forum' AND statut!='nouveau' ORDER BY statut, nom");
+
+	if (!$num = spip_num_rows($result)) return '';
+
+	$js = "\"findObj_forcer('valider_ajouter_auteur').style.visibility='visible';\"";
+
+	return ajax_action_auteur('editer_auteurs', $id_article,'articles', "id_article=$id_article",
+				      (
+			"<span class='verdana1'><B>"._T('titre_cadre_ajouter_auteur')."&nbsp; </B></span>\n" .
+
+			($num > 200 
+			? ("<input type='text' name='cherche_auteur' onClick=$js CLASS='fondl' VALUE='' SIZE='20' />" .
+			  "<span  class='visible_au_chargement' id='valider_ajouter_auteur'>\n<input type='submit' value='"._T('bouton_chercher')."' CLASS='fondo' /></span>")
+			: ("<select name='nouv_auteur' size='1' style='width:150px;' CLASS='fondl' onChange=$js>" .
+			   articles_auteur_select($result) .
+			   "</select>" .
+			   "<span  class='visible_au_chargement' id='valider_ajouter_auteur'>" .
+			   " <input type='submit' value='"._T('bouton_ajouter')."' CLASS='fondo'>" .
+			   "</span>"))));
+}
+
+// http://doc.spip.org/@articles_auteur_select
+function articles_auteur_select($result)
+{
+	global $couleur_claire ;
+
+	$statut_old = $premiere_old = $res = '';
+
+	while ($row = spip_fetch_array($result)) {
+		$id_auteur = $row["id_auteur"];
+		$nom = $row["nom"];
+		$email = $row["email"];
+		$statut = $row["statut"];
+
+		$statut=str_replace("0minirezo", _T('info_administrateurs'), $statut);
+		$statut=str_replace("1comite", _T('info_redacteurs'), $statut);
+		$statut=str_replace("6visiteur", _T('info_visiteurs'), $statut);
+				
+		$premiere = strtoupper(substr(trim($nom), 0, 1));
+
+		if ($connect_statut != '0minirezo')
+			if ($p = strpos($email, '@'))
+				  $email = substr($email, 0, $p).'@...';
+		if ($email)
+			$email = " ($email)";
+
+		if ($statut != $statut_old) {
+			$res .= "\n<OPTION VALUE=\"x\">";
+			$res .= "\n<OPTION VALUE=\"x\" style='background-color: $couleur_claire;'> $statut";
+		}
+
+		if ($premiere != $premiere_old AND ($statut != _T('info_administrateurs') OR !$premiere_old))
+			$res .= "\n<OPTION VALUE=\"x\">";
+				
+		$res .= "\n<OPTION VALUE=\"$id_auteur\">&nbsp;&nbsp;&nbsp;&nbsp;" . supprimer_tags(couper(typo("$nom$email"), 40));
+		$statut_old = $statut;
+		$premiere_old = $premiere;
+	}
+	return $res;
+}
+
+?>
diff --git a/ecrire/inc/referencer_traduction.php b/ecrire/inc/referencer_traduction.php
new file mode 100644
index 0000000000..088eaec3c1
--- /dev/null
+++ b/ecrire/inc/referencer_traduction.php
@@ -0,0 +1,188 @@
+<?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/presentation');
+
+function inc_referencer_traduction_dist($id_article, $flag_editable, $id_rubrique, $id_trad, $trad_err='')
+{
+	global $connect_statut, $couleur_claire, $options, $connect_toutes_rubriques, $spip_lang_right, $dir_lang;
+
+	$langue_article = spip_fetch_array(spip_query("SELECT lang FROM spip_articles WHERE id_article=$id_article"));
+
+	$langue_article = $langue_article['lang'];
+
+	$reponse = '';
+	// Choix langue article
+	if ($GLOBALS['meta']['multi_articles'] == 'oui' AND $flag_editable) {
+
+		$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
+		$langue_parent = $row['lang'];
+
+		if (!$langue_parent)
+			$langue_parent = $GLOBALS['meta']['langue_site'];
+		if (!$langue_article)
+			$langue_article = $langue_parent;
+
+		$menu = menu_langues('changer_lang', $langue_article, _T('info_multi_cet_article').' ', $langue_parent, 'ajax');
+
+		$menu = ajax_action_auteur('referencer_traduction', "$id_article,$id_rubrique","articles","id_article=$id_article", $menu);
+
+		$reponse .= debut_cadre_couleur('',true)
+		. "\n<div style='text-align: center;'>"
+		. $menu
+		. "</div>\n"
+		. fin_cadre_couleur(true);
+	}
+
+	if ($trad_err)
+		$reponse .= "<div><font color='red' size='2' face='verdana,arial,helvetica,sans-serif'>"._T('trad_deja_traduit'). "</font></div>";
+
+		// Afficher la liste des traductions
+	$table = !$id_trad ? array() : articles_traduction($id_article, $id_trad);
+
+		// bloc traductions
+	if (count($table) > 0) {
+
+		$largeurs = array(7, 12, '', 100);
+		$styles = array('', '', 'arial2', 'arial2');
+
+		$liste = "\n<div class='liste'>"
+		. bandeau_titre_boite2(_T('trad_article_traduction'),'', 'white', 'black', false)
+		. "<table width='100%' cellspacing='0' border='0' cellpadding='2'>"
+		. afficher_liste ($largeurs, $table, $styles)
+		. "</table>"
+		. "</div>";
+	}
+
+	// changer les globales $dir_lang etc
+	changer_typo($langue_article);
+
+	$form = "<table width='100%'><tr>";
+
+	if ($flag_editable AND $options == "avancees" AND !$table) {
+			// Formulaire pour lier a un article
+		$form .= "<td class='arial2' width='60%'>"
+		. ajax_action_auteur("referencer_traduction",
+				$id_article,
+				'articles',
+				"id_article=$id_article",
+				(_T('trad_lier') .
+				 "\n<input type='text' class='fondl' name='lier_trad' size='5' />\n<input type='submit' value='"._T('bouton_valider')."' class='fondl' />"))
+		. "</td>\n"
+		. "<td background='' width='10'> &nbsp; </td>"
+		. "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>"
+		. "<td background='' width='10'> &nbsp; </td>";
+	}
+
+	$form .= "<td>"
+	. icone_horizontale(_T('trad_new'), generer_url_ecrire("articles_edit","new=oui&lier_trad=$id_article&id_rubrique=$id_rubrique"), "traductions-24.gif", "creer.gif", false)
+	. "</td>";
+
+	if ($flag_editable AND $options == "avancees" AND $table) {
+		$clic = _T('trad_delier');
+		$form .= "<td background='' width='10'> &nbsp; </td>"
+		. "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>"
+		. "<td background='' width='10'> &nbsp; </td>"
+		. "<td>"
+		  // la 1ere occurrence de clic ne sert pas en Ajax
+		. icone_horizontale($clic, ajax_action_auteur("referencer_traduction","$id_article,-$id_trad",'articles', "id_article=$id_article",array($clic)), "traductions-24.gif", "supprimer.gif", false)
+		. "</td>\n";
+	}
+
+	$form .= "</tr></table>";
+
+	if ($GLOBALS['meta']['gerer_trad'] == 'oui')
+		$bouton = _T('titre_langue_trad_article');
+	else
+		$bouton = _T('titre_langue_article');
+
+	if ($langue_article)
+		$bouton .= "&nbsp; (".traduire_nom_langue($langue_article).")";
+
+	return ($flag_editable === 'ajax')
+		? 
+			(debut_cadre_enfonce('langues-24.gif', true, "", 
+				bouton_block_visible('languearticle,lier_traductions')
+				. $bouton)
+			. debut_block_visible('languearticle')
+			. $reponse
+			. fin_block()
+			. $liste
+			. debut_block_visible('lier_traductions')
+			. $form
+			. fin_block()
+			. fin_cadre_enfonce(true)
+			. fin_block())
+		:	("<div id='referencer_traduction-$id_article'>"
+			. debut_cadre_enfonce('langues-24.gif', true, "",
+				bouton_block_invisible('languearticle,lier_traductions')
+				. $bouton)
+			. debut_block_invisible('languearticle')
+			. $reponse
+			. fin_block()
+			. $liste
+			. debut_block_invisible('lier_traductions')
+			. $form
+			. fin_block()
+			. fin_cadre_enfonce(true)
+			. "</div>");
+}
+
+
+// http://doc.spip.org/@articles_traduction
+function articles_traduction($id_article, $id_trad)
+{
+	global $connect_toutes_rubriques, $dir_lang;
+
+	$result_trad = spip_query("SELECT id_article, id_rubrique, titre, lang, statut FROM spip_articles WHERE id_trad = $id_trad");
+	
+	$table= array();
+
+	while ($row = spip_fetch_array($result_trad)) {
+		$vals = array();
+		$id_article_trad = $row["id_article"];
+		$id_rubrique_trad = $row["id_rubrique"];
+		$titre_trad = $row["titre"];
+		$lang_trad = $row["lang"];
+		$statut_trad = $row["statut"];
+
+		changer_typo($lang_trad);
+		$titre_trad = "<span $dir_lang>$titre_trad</span>";
+
+		$vals[] = http_img_pack("puce-".puce_statut($statut_trad).'.gif', "", "width='7' height='7' border='0' NAME='statut'");
+		
+		if ($id_article_trad == $id_trad) {
+			$vals[] = http_img_pack('langues-12.gif', "", "width='12' height='12' border='0'");
+			$titre_trad = "<b>$titre_trad</b>";
+		} else {
+		  if (!$connect_toutes_rubriques)
+			$vals[] = http_img_pack('langues-off-12.gif', "", "width='12' height='12' border='0'");
+		  else 
+		    $vals[] = ajax_action_auteur("referencer_traduction", "$id_article,$id_trad,$id_article_trad", 'articles', "id_article=$id_article", array(http_img_pack('langues-off-12.gif', _T('trad_reference'), "width='12' height='12' border='0'"), ' title="' . _T('trad_reference') . '"'));
+		}
+
+		$s = typo($titre_trad);
+		if ($id_article_trad != $id_article) 
+			$s = "<a href='" . generer_url_ecrire("articles","id_article=$id_article_trad") . "'>$s</a>";
+		if ($id_article_trad == $id_trad)
+			$s .= " "._T('trad_reference');
+
+		$vals[] = $s;
+		$vals[] = traduire_nom_langue($lang_trad);
+		$table[] = $vals;
+	}
+
+	return $table;
+}
+?>
diff --git a/ecrire/inc/virtualiser.php b/ecrire/inc/virtualiser.php
new file mode 100644
index 0000000000..4ce28b65f4
--- /dev/null
+++ b/ecrire/inc/virtualiser.php
@@ -0,0 +1,40 @@
+<?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');
+
+// http://doc.spip.org/@formulaire_virtualiser
+function inc_virtualiser_dist($id_article, $flag, $virtuel, $script, $args)
+{
+	global $spip_lang_right;
+
+	$http = ($virtuel ? "" : "http://");
+
+	$res = "<input type='text' name='virtuel' class='formo' style='font-size:9px;' value='"
+	. $http
+	. $virtuel
+	. "' size='40' /><br />\n"
+	. "<font face='Verdana,Arial,Sans,sans-serif' size='2'>"
+	. "(<b>"._T('texte_article_virtuel')
+	. "&nbsp;:</b> "
+	. _T('texte_reference_mais_redirige')
+	. ")</font>"
+	. "\n<div align='$spip_lang_right'><input type='submit' class='fondo' value='"
+	. _T('bouton_changer')
+	. "' style='font-size:10px' /></div>";
+
+	$res = ajax_action_auteur('virtualiser', $id_article, $script, $args, $res);
+	return ($flag=='ajax') ? $res : "<div id='virtualiser-$id_article'>$res</div>";
+}
+
+?>
-- 
GitLab