From 14dcaca5e914a496fc0e29a170858d26929f5b76 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sun, 11 Feb 2007 23:11:59 +0000
Subject: [PATCH] gestion des auteurs : on casse tout

---
 .gitattributes                                |   6 +-
 ...{legender_auteur.php => editer_auteur.php} |  95 ++++--
 ecrire/action/editer_auteurs.php              |   2 -
 ecrire/exec/accueil.php                       |   2 +-
 ecrire/exec/auteur_infos.php                  | 111 ++++---
 ecrire/exec/auteurs.php                       |   2 +-
 ecrire/exec/auteurs_edit.php                  |  19 --
 ecrire/exec/editer_auteurs.php                |   3 +-
 ecrire/exec/legender_auteur.php               |  43 ---
 ecrire/exec/message.php                       |   2 +-
 ecrire/exec/messagerie.php                    |   2 +-
 ecrire/exec/naviguer.php                      |   2 +-
 .../{legender_auteur.php => auteur_infos.php} | 283 +++++++++++-------
 ecrire/inc/autoriser.php                      |  35 ++-
 ecrire/inc/boutons.php                        |   2 +-
 ecrire/inc/commencer_page.php                 |   2 +-
 ecrire/inc/editer_auteurs.php                 |  24 +-
 ecrire/inc/formater_auteur.php                |   4 +-
 ecrire/inc/forum.php                          |   2 +-
 ecrire/inc/gadgets.php                        |   2 +-
 ecrire/inc/informer_auteur.php                |   2 +-
 ecrire/inc/instituer_auteur.php               | 208 +++++++------
 ecrire/inc/message_select.php                 |   2 +-
 ecrire/inc/urls.php                           |   3 +-
 ecrire/inc/vieilles_defs.php                  |   2 +-
 25 files changed, 487 insertions(+), 373 deletions(-)
 rename ecrire/action/{legender_auteur.php => editer_auteur.php} (74%)
 delete mode 100644 ecrire/exec/auteurs_edit.php
 delete mode 100644 ecrire/exec/legender_auteur.php
 rename ecrire/inc/{legender_auteur.php => auteur_infos.php} (56%)

diff --git a/.gitattributes b/.gitattributes
index 1ae4290d61..a8a85be01a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -341,6 +341,7 @@ ecrire/action/dater.php -text
 ecrire/action/desinstaller_plugin.php -text
 ecrire/action/documenter.php -text
 ecrire/action/editer_article.php -text
+ecrire/action/editer_auteur.php -text
 ecrire/action/editer_auteurs.php -text
 ecrire/action/editer_breve.php -text
 ecrire/action/editer_message.php -text
@@ -364,7 +365,6 @@ ecrire/action/instituer_rubrique_breves.php -text
 ecrire/action/instituer_syndic.php -text
 ecrire/action/joindre.php -text
 ecrire/action/legender.php -text
-ecrire/action/legender_auteur.php -text
 ecrire/action/logout.php -text
 ecrire/action/petitionner.php -text
 ecrire/action/poster_forum_prive.php -text
@@ -407,7 +407,6 @@ ecrire/exec/articles_tous.php -text
 ecrire/exec/articles_versions.php -text
 ecrire/exec/auteur_infos.php -text
 ecrire/exec/auteurs.php -text
-ecrire/exec/auteurs_edit.php -text
 ecrire/exec/breves.php -text
 ecrire/exec/breves_edit.php -text
 ecrire/exec/breves_voir.php -text
@@ -444,7 +443,6 @@ ecrire/exec/install.php -text
 ecrire/exec/instituer_auteur.php -text
 ecrire/exec/lang_raccourcis.php -text
 ecrire/exec/legender.php -text
-ecrire/exec/legender_auteur.php -text
 ecrire/exec/meme_rubrique.php -text
 ecrire/exec/memoriser.php -text
 ecrire/exec/menu_agenda.php -text
@@ -486,6 +484,7 @@ ecrire/inc/agenda.php -text
 ecrire/inc/aider.php -text
 ecrire/inc/ajouter_documents.php -text
 ecrire/inc/article_select.php -text
+ecrire/inc/auteur_infos.php -text
 ecrire/inc/autoriser.php -text
 ecrire/inc/boutons.php -text
 ecrire/inc/chercher_logo.php -text
@@ -523,7 +522,6 @@ ecrire/inc/instituer_auteur.php -text
 ecrire/inc/joindre.php -text
 ecrire/inc/lang_liste.php -text
 ecrire/inc/legender.php -text
-ecrire/inc/legender_auteur.php -text
 ecrire/inc/maintenance.php -text
 ecrire/inc/message_select.php -text
 ecrire/inc/minipres.php -text
diff --git a/ecrire/action/legender_auteur.php b/ecrire/action/editer_auteur.php
similarity index 74%
rename from ecrire/action/legender_auteur.php
rename to ecrire/action/editer_auteur.php
index 4910445efa..eb86b7985f 100644
--- a/ecrire/action/legender_auteur.php
+++ b/ecrire/action/editer_auteur.php
@@ -16,21 +16,21 @@ include_spip('inc/filtres');
 include_spip('inc/acces');
 include_spip('base/abstract_sql');
 
-// http://doc.spip.org/@action_legender_auteur_dist
-function action_legender_auteur_dist()
-{
-        $securiser_action = charger_fonction('securiser_action', 'inc');
-        $arg = $securiser_action();
+function action_editer_auteur_dist() {
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$arg = $securiser_action();
 
-        if (!preg_match(",^(\d+)\D(\d*)(\D(\w*))?$,", $arg, $r)) {
-		$r = "action_legender_auteur_dist $arg pas compris";
+	if (!preg_match(",^(\d+)$,", $arg, $r)) {
+		$r = "action_editer_auteur_dist $arg pas compris";
 		spip_log($r);
-        } else 	redirige_par_entete(action_legender_auteur_post($r));
+	} else {
+		$url = action_legender_auteur_post($r);
+		redirige_par_entete($url);
+	}
 }
 
 // http://doc.spip.org/@action_legender_auteur_post
-function action_legender_auteur_post($r)
-{
+function action_legender_auteur_post($r) {
 	global $auteur_session;
 
 	$bio = _request('bio');
@@ -183,7 +183,49 @@ function action_legender_auteur_post($r)
 		spip_query("UPDATE spip_auteurs SET $query_pass		nom=" . _q($auteur['nom']) . ",						login=" . _q($auteur['login']) . ",					bio=" . _q($auteur['bio']) . ",						email=" . _q($auteur['email']) . ",					nom_site=" . _q($auteur['nom_site']) . ",				url_site=" . _q($auteur['url_site']) . ",				pgp=" . _q($auteur['pgp']) .					(!$extra ? '' : (", extra = " . _q($extra) . "")) .			" WHERE id_auteur=".$auteur['id_auteur']);
 	}
 
-	// Si on modifie la fiche auteur, reindexer 
+
+	//
+	// Modifications de statut
+	//
+	// TODO : autorisations correspondantes !
+	//
+	if ($statut = _request('statut')
+	AND autoriser('modifier', 'auteur', $id_auteur, $qui = null,
+	$opt = array('statut'=>$statut))) {
+		if (!ereg("^(0minirezo|1comite|5poubelle|6forum)$",$statut)) {
+		  spip_log("action_instituer_auteur_dist: $statut incompris  pour $id_auteur");
+		} else {
+			spip_query("UPDATE spip_auteurs SET statut="._q($statut) . " WHERE id_auteur=" . _q($id_auteur));
+		}
+	}
+
+	// Rubriques restreintes
+	$restreintes = _request('restreintes');
+	if ($id_parent = intval(_request('id_parent'))) {
+		if (is_array($restreintes))
+			$restreintes[] = $id_parent;
+		else
+			$restreintes = array($id_parent);
+	}
+	if (is_array($restreintes)
+	AND autoriser('modifier', 'auteur', $id_auteur, $qui = null,
+	$opt = array('restreint'=>$restreintes))) {
+		include_spip('base/abstract_sql');
+		spip_query("DELETE FROM spip_auteurs_rubriques WHERE id_auteur="._q($id_auteur));
+		foreach (array_unique($restreintes) as $id_rub)
+			if ($id_rub = intval($id_rub)) // si '0' on ignore
+				spip_abstract_insert('spip_auteurs_rubriques', "(id_auteur,id_rubrique)", "($id_auteur,$id_rub)");
+	}
+
+
+	// Lier a un article
+	if ($id_article = intval(_request('lier_id_article'))
+	#AND autoriser('modifier', 'article', $id_article)
+	) {
+		spip_query("INSERT spip_auteurs_articles (id_article,id_auteur) VALUES ($id_article,$id_auteur)");
+	}
+
+	// Si on modifie la fiche auteur, reindexer
 	if ($GLOBALS['meta']['activer_moteur'] == 'oui') {
 		include_spip("inc/indexation");
 		marquer_indexer('spip_auteurs', $id_auteur);
@@ -193,28 +235,21 @@ function action_legender_auteur_post($r)
 
 	$echec = $echec ? '&echec=' . join('@@@', $echec) : '';
 
-	// il faudrait rajouter OR $echec mais il y a conflit avec Ajax
-
-	if ($echec OR ($init = ($tout[0]=='0'))) {
-	  // tout nouveau. envoyer le formulaire de saisie du reste
-	  // en transmettant le retour eventuel
-	  // decode / encode car encode pas necessairement deja fait.
+	$redirect = rawurldecode($redirect);
 
-		$ret = !$redirect ? '' 
-		  : ('&redirect=' . rawurlencode(rawurldecode($redirect)));
+	if ($echec) {
+		// revenir au formulaire de saisie
+		$ret = !$redirect
+			? '' 
+			: ('&redirect=' . rawurlencode($redirect));
 
-		$script = (_request('var_ajaxcharset') ? 'legender_auteur' : 'auteur_infos');
-
-		return generer_url_ecrire($script, "id_auteur=$id_auteur&initial=$init$echec$ret",true);
+		return generer_url_ecrire('auteur_infos',
+			"id_auteur=$id_auteur$echec$ret",'&');
 	} else {
-	  // modif: renvoyer le resultat ou a nouveau le formulaire si erreur
-		  if (!$redirect) {
-		    $redirect = generer_url_ecrire("auteur_infos", "id_auteur=$id_auteur", true, true);
-		    $anc = '';
-		  } else 
-		    list($redirect,$anc) = split('#',rawurldecode($redirect));
-
-		  $redirect .= $echec . $anc . ($echec ? '' : '&initial=-1');
+		// modif: renvoyer le resultat ou a nouveau le formulaire si erreur
+		if (!$redirect)
+			$redirect = generer_url_ecrire("auteur_infos", "id_auteur=$id_auteur", '&', true);
+
 		return $redirect;
 	}
 }
diff --git a/ecrire/action/editer_auteurs.php b/ecrire/action/editer_auteurs.php
index 092bdcd9e9..3978230f93 100644
--- a/ecrire/action/editer_auteurs.php
+++ b/ecrire/action/editer_auteurs.php
@@ -20,8 +20,6 @@ function action_editer_auteurs_dist() {
 	$securiser_action = charger_fonction('securiser_action', 'inc');
 	$arg = $securiser_action();
 	$redirect = urldecode(_request('redirect'));
-	if ($script_aut = _request('script_aut'))
-		$redirect = parametre_url($redirect,'script_aut',$script_aut,'&');
 	if ($script = _request('script'))
 		$redirect = parametre_url($redirect,'script',$script,'&');
 	if ($titre = _request('titre'))
diff --git a/ecrire/exec/accueil.php b/ecrire/exec/accueil.php
index 3cdb150edd..43b9d1a661 100644
--- a/ecrire/exec/accueil.php
+++ b/ecrire/exec/accueil.php
@@ -257,7 +257,7 @@ function personnel_accueil($coockcookie)
 					 $t);
 		$res .= $t;
 	}
-	$titre_cadre = afficher_plus(generer_url_ecrire("auteurs_edit","id_auteur=$connect_id_auteur"));
+	$titre_cadre = afficher_plus(generer_url_ecrire("auteur_infos","id_auteur=$connect_id_auteur"));
 	$titre_cadre .= majuscules(typo($GLOBALS['auteur_session']['nom']));
 	
 	return debut_cadre_relief("fiche-perso-24.gif",true, '',$titre_cadre)
diff --git a/ecrire/exec/auteur_infos.php b/ecrire/exec/auteur_infos.php
index 63bf27fe2e..91a2dd96e8 100644
--- a/ecrire/exec/auteur_infos.php
+++ b/ecrire/exec/auteur_infos.php
@@ -13,44 +13,43 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 include_spip('inc/presentation');
 include_spip('inc/acces');
+include_spip('inc/autoriser');
 
-// http://doc.spip.org/@exec_auteur_infos_dist
-function exec_auteur_infos_dist()
-{
-	global $id_auteur, $redirect, $echec, $initial, $spip_display,
-	  $connect_statut, $connect_toutes_rubriques, $connect_id_auteur;
+function exec_auteur_infos_dist() {
+	global $connect_id_auteur;
 
-	$id_auteur = intval($id_auteur);
+	$id_auteur = intval(_request('id_auteur'));
 
 	pipeline('exec_init',
 		array('args' => array(
-			'exec'=>'auteur_infos',
+			'exec'=> 'auteur_infos',
 			'id_auteur'=>$id_auteur),
-			'data'=>'')	);
-
-
-	// id_auteur nul ==> creation, et seuls les admins complets creent
-	if (!$id_auteur AND $connect_toutes_rubriques) {
-		$arg = "0/";
-		include_spip('inc/headers');
-		redirige_par_entete(generer_action_auteur('legender_auteur', $arg, $redirect, true));
-		exit;
+			'data'=>''
+		)
+	);
+
+	if ($id_auteur) {
+		$s = spip_query("SELECT * FROM spip_auteurs WHERE id_auteur=$id_auteur");
+		$auteur = spip_fetch_array($s);
+	} else {
+		$auteur = array();
+		if (strlen(_request('nom')))
+			$auteur['nom'] = _request('nom');
 	}
 
-	$auteur = spip_fetch_array(spip_query("SELECT * FROM spip_auteurs WHERE id_auteur=$id_auteur"));
-
-	if (!$auteur) {
-                gros_titre(_T('info_acces_interdit'));
-                exit;
-        }
+	$auteur_infos = charger_fonction('auteur_infos', 'inc');
+	$fiche = $auteur_infos($auteur, _request('redirect'));
 
-	$legender_auteur = charger_fonction('legender_auteur', 'inc');
-	$legender_auteur_r = $legender_auteur($id_auteur, $auteur, $initial, $echec, $redirect);
 
-	if (_request('var_ajaxcharset'))
-		ajax_retour($legender_auteur_r);
+/*	// Si on est appele en ajax, on renvoie la fiche
+	if (_request('var_ajaxcharset')) {
+		ajax_retour($fiche);
+	}
+	
+	// Sinon on la met en page
 	else {
-
+*/
+		// Entete
 		if ($connect_id_auteur == $id_auteur) {
 			$commencer_page = charger_fonction('commencer_page', 'inc');
 			echo $commencer_page($auteur['nom'], "auteurs", "perso");
@@ -65,20 +64,12 @@ function exec_auteur_infos_dist()
 		echo cadre_auteur_infos($id_auteur, $auteur);
 
 		echo pipeline('affiche_gauche',
-			      array('args' => array(
-						    'exec'=>'auteur_infos',
-						    'id_auteur'=>$id_auteur),
-				    'data'=>'')
-			      );
-
-  // charger ça tout de suite pour diposer de la fonction ci-dessous
-		$instituer_auteur = charger_fonction('instituer_auteur', 'inc');
-		$instituer_auteur_r = $instituer_auteur($id_auteur, $auteur['statut'], "auteurs_edit");
+			array('args' => array (
+				'exec'=>'auteur_infos',
+				'id_auteur'=>$id_auteur),
+			'data'=>'')
+		);
 
-		if (statut_modifiable_auteur($id_auteur, $auteur) AND ($spip_display != 4)) {
-			$iconifier = charger_fonction('iconifier', 'inc');
-			$icone = $iconifier('id_auteur', $id_auteur, 'auteur_infos');
-		} else $icone ='';
 
 		creer_colonne_droite();
 		echo pipeline('affiche_droite',
@@ -87,9 +78,26 @@ function exec_auteur_infos_dist()
 						    'id_auteur'=>$id_auteur),
 				    'data'=>'')
 			      );
-		echo $icone, debut_droite();
-		echo 	  debut_cadre_relief("redacteurs-24.gif", true),
-		  $legender_auteur_r, $instituer_auteur_r;
+
+
+		// Interface de logo
+		if ($id_auteur > 0
+		AND $spip_display != 4) {
+			$iconifier = charger_fonction('iconifier', 'inc');
+			echo $iconifier('id_auteur', $id_auteur, 'auteur_infos');
+		}
+
+		echo debut_droite();
+
+		echo debut_cadre_relief("redacteurs-24.gif", true);
+
+		// $fiche est vide si on demande par exemple
+		// a creer un auteur alors que c'est interdit
+		if ($fiche) {
+			echo $fiche;
+		} else {
+			gros_titre(_T('info_acces_interdit'));
+		}
 
 		echo pipeline('affiche_milieu',
 			      array('args' => array(
@@ -97,12 +105,13 @@ function exec_auteur_infos_dist()
 						    'id_auteur'=>$id_auteur),
 				    'data'=>''));
 		
-		auteurs_interventions($id_auteur, $auteur['statut']);
+		auteurs_interventions($auteur);
 		
 		echo fin_cadre_relief(true),
-		  fin_gauche(),
-		  fin_page();
-	}
+			fin_gauche(),
+			fin_page();
+/*	} */
+
 }
 
 // http://doc.spip.org/@cadre_auteur_infos
@@ -132,10 +141,14 @@ function cadre_auteur_infos($id_auteur, $auteur)
 
 
 // http://doc.spip.org/@auteurs_interventions
-function auteurs_interventions($id_auteur, $statut)
-{
+function auteurs_interventions($auteur) {
+	$id_auteur = $auteur['id_auteur'];
+	$statut = $auteur['statut'];
+
 	global $connect_statut, $connect_id_auteur;
 
+	include_spip('inc/message_select');
+
 	if ($connect_statut == "0minirezo") $aff_art = "'prepa','prop','publie','refuse'";
 	else if ($connect_id_auteur == $id_auteur) $aff_art = "'prepa','prop','publie'";
 	else $aff_art = "'prop','publie'";
diff --git a/ecrire/exec/auteurs.php b/ecrire/exec/auteurs.php
index 42172187c6..143bd5bd46 100644
--- a/ecrire/exec/auteurs.php
+++ b/ecrire/exec/auteurs.php
@@ -114,7 +114,7 @@ function bandeau_auteurs($tri, $statut)
 			$res = icone_horizontale(_T('icone_creer_nouvel_auteur'), generer_url_ecrire("auteur_infos"), "auteur-24.gif", "creer.gif", false);
 		else $res = '';
 
-		$res .= icone_horizontale(_T('icone_informations_personnelles'), generer_url_ecrire("auteur_infos","id_auteur=$connect_id_auteur&initial=-1"), "fiche-perso-24.gif","rien.gif", false);
+		$res .= icone_horizontale(_T('icone_informations_personnelles'), generer_url_ecrire("auteur_infos","id_auteur=$connect_id_auteur"), "fiche-perso-24.gif","rien.gif", false);
 
 		$n = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs WHERE statut='6forum' LIMIT 1"));
 		if ($n) {
diff --git a/ecrire/exec/auteurs_edit.php b/ecrire/exec/auteurs_edit.php
deleted file mode 100644
index 15bae5be27..0000000000
--- a/ecrire/exec/auteurs_edit.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-/***************************************************************************\
- *  SPIP, Systeme de publication pour l'internet                           *
- *                                                                         *
- *  Copyright (c) 2001-2007                                                *
- *  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;
-
-$id_auteur = intval(_request('id_auteur'));
-include_spip('inc/headers');
-redirige_par_entete("./?exec=auteur_infos&id_auteur=$id_auteur&initial=-1");
-
-?>
diff --git a/ecrire/exec/editer_auteurs.php b/ecrire/exec/editer_auteurs.php
index c04be373df..68fb44d83c 100644
--- a/ecrire/exec/editer_auteurs.php
+++ b/ecrire/exec/editer_auteurs.php
@@ -26,11 +26,10 @@ function exec_editer_auteurs_dist()
 		echo minipres();
 		exit;
 	}
-	$script_aut = _request('script_aut');
 	$script = _request('script');
 	$titre = ($titre=_request('titre'))?urldecode($titre):$titre;
 
 	$editer_auteurs = charger_fonction('editer_auteurs', 'inc');
-	ajax_retour($editer_auteurs($type, $id, 'ajax', _request('cherche_auteur'), _request('ids'),$titre,$script,$script_aut));
+	ajax_retour($editer_auteurs($type, $id, 'ajax', _request('cherche_auteur'), _request('ids'),$titre,$script));
 }
 ?>
diff --git a/ecrire/exec/legender_auteur.php b/ecrire/exec/legender_auteur.php
deleted file mode 100644
index 5fe474c7b4..0000000000
--- a/ecrire/exec/legender_auteur.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/***************************************************************************\
- *  SPIP, Systeme de publication pour l'internet                           *
- *                                                                         *
- *  Copyright (c) 2001-2007                                                *
- *  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/acces');
-include_spip('inc/action');
-
-// http://doc.spip.org/@exec_legender_auteur_dist
-function exec_legender_auteur_dist()
-{
-  global $id_auteur, $retour, $echec, $initial,
-	  $connect_statut, $connect_toutes_rubriques, $connect_id_auteur;
-
-	$id_auteur = intval($id_auteur);
-
-	$auteur = spip_fetch_array(spip_query("SELECT * FROM spip_auteurs WHERE id_auteur=$id_auteur"));
-
-	if (!$auteur) {
-                gros_titre(_T('info_acces_interdit'));
-                exit;
-        }
-
-	if (!$echec AND $retour) {
-		include_spip('inc/headers');
-		redirige_par_entete(rawurldecode($retour));
-		exit;
-	}
-
-	$legender_auteur = charger_fonction('legender_auteur', 'inc');
-
-	ajax_retour($legender_auteur($id_auteur, $auteur, $initial, $echec, $retour));
-}
-?>
diff --git a/ecrire/exec/message.php b/ecrire/exec/message.php
index fc376168a3..fe7286f4cf 100644
--- a/ecrire/exec/message.php
+++ b/ecrire/exec/message.php
@@ -223,7 +223,7 @@ function http_message_avec_participants($id_message, $statut, $forcer_dest, $che
 				$ifond = 1 - $ifond;
 
 				$auteurs_tmp[] = "<a href='" .
-				  generer_url_ecrire('auteurs_edit',"id_auteur=" . $id_auteur) ."'>". $nom_auteur . "</a>";
+				  generer_url_ecrire('auteur_infos',"id_auteur=" . $id_auteur) ."'>". $nom_auteur . "</a>";
 
 				$aut =  (($id_auteur != $expediteur) ? '' :
 					 ("<span class='arial0'>".  _T('info_auteur_message') ."</span> "));
diff --git a/ecrire/exec/messagerie.php b/ecrire/exec/messagerie.php
index 341d7c62c9..400d1d18fc 100644
--- a/ecrire/exec/messagerie.php
+++ b/ecrire/exec/messagerie.php
@@ -125,7 +125,7 @@ if (spip_num_rows($result) > 0) {
 		$id_auteur = $row['id_auteur'];
 		$nom = typo($row["nom"]);
 		$total = $row["total"];
-		echo "<div class='tr_liste'\nonmouseover=\"changeclass(this,'tr_liste_over');\"\nonmouseout=\"changeclass(this,'tr_liste');\"\nstyle='padding: 2px; padding-left: 10px; border-bottom: 1px solid #cccccc;'><div class='verdana1'><img src='" . _DIR_IMG_PACK . "redac-12.gif'\nstyle='border: 0px' alt=' ' /> <a href='" . generer_url_ecrire("auteurs_edit","id_auteur=$id_auteur"), "'>",
+		echo "<div class='tr_liste'\nonmouseover=\"changeclass(this,'tr_liste_over');\"\nonmouseout=\"changeclass(this,'tr_liste');\"\nstyle='padding: 2px; padding-left: 10px; border-bottom: 1px solid #cccccc;'><div class='verdana1'><img src='" . _DIR_IMG_PACK . "redac-12.gif'\nstyle='border: 0px' alt=' ' /> <a href='" . generer_url_ecrire("auteur_infos","id_auteur=$id_auteur"), "'>",
 		  $nom,
 		  "</a> ($total)</div></div>";
 		if ($count == ceil(spip_num_rows($result)/2)) echo "</td><td valign='top' width='50%' style='background-color: #eeeeee;'>";
diff --git a/ecrire/exec/naviguer.php b/ecrire/exec/naviguer.php
index 170367aca8..6d82efa206 100644
--- a/ecrire/exec/naviguer.php
+++ b/ecrire/exec/naviguer.php
@@ -177,7 +177,7 @@ function infos_naviguer($id_rubrique, $statut, $ze_logo)
 
 			  echo 
 				http_img_pack('admin-12.gif','',''),
-			    " <a href='", generer_url_ecrire('auteurs_edit', "id_auteur=$id"),
+			    " <a href='", generer_url_ecrire('auteur_infos', "id_auteur=$id"),
 				"'>",
 				extraire_multi($row['nom']),
 				'</a><br />';
diff --git a/ecrire/inc/legender_auteur.php b/ecrire/inc/auteur_infos.php
similarity index 56%
rename from ecrire/inc/legender_auteur.php
rename to ecrire/inc/auteur_infos.php
index bff7a9f49f..39deaf825e 100644
--- a/ecrire/inc/legender_auteur.php
+++ b/ecrire/inc/auteur_infos.php
@@ -13,44 +13,77 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 
-// http://doc.spip.org/@inc_legender_auteur_dist
-function inc_legender_auteur_dist($id_auteur, $auteur, $initial, $echec='', $redirect='')
-{
+// Affiche la fiche de renseignements d'un auteur
+// eventuellement editable
+function inc_auteur_infos_dist($auteur, $redirect) {
+	if (!$auteur['id_auteur']) {
+		if (_request('new') == 'oui') {
+			$new = true;
+		} else {
+			include_spip('inc/headers');
+			redirige_par_entete(generer_url_ecrire('auteurs'));
+		}
+	}
 
-	$corps = (($initial < 0) OR !statut_modifiable_auteur($id_auteur, $auteur))
-	? legender_auteur_voir($auteur, $redirect)
-	: legender_auteur_saisir($id_auteur, $auteur, $initial, $echec, $redirect);
-	
-	return  $redirect ? $corps :
-	  ajax_action_greffe("legender_auteur-$id_auteur", $corps);
+	if (!$new) {
+		$corps = "<div id='auteur_infos_voir'>"
+			. legender_auteur_voir($auteur, $redirect)
+			. "</div>\n";
+	} else
+		$corps = '';
+
+	if (_request('echec'))
+		$corps .= afficher_erreurs_auteur(_request('echec'));
+
+
+	// Calculer le bloc de statut (modifiable ou non selon)
+	$instituer_auteur = charger_fonction('instituer_auteur', 'inc');
+	$bloc_statut = $instituer_auteur($auteur);
+
+	// Calculer le formulaire general
+	if (autoriser('modifier', 'auteur', $auteur['id_auteur'])) {
+		$corps = legender_auteur_saisir($auteur, $corps, $bloc_statut, $redirect);
+	} else {
+		// Indiquer le bloc statut (cas non modifiable) ?
+		$corps .= $bloc_statut;
+	}
+
+	return $corps;
+
+}
+
+function afficher_erreurs_auteur($echec) {
+	foreach (split('@@@',$echec) as $e)
+		$corps .= '<p>' . _T($e) . "</p>\n";
 
+	$corps = debut_cadre_relief('', true)
+	.  "<span style='color: red; left-margin: 5px'>"
+	.  http_img_pack("warning.gif", _T('info_avertissement'), "style='width: 48px; height: 48px; float: left; margin: 5px;'")
+	. $corps
+	.  _T('info_recommencer')
+	.  "</span>\n"
+	. fin_cadre_relief(true);
+
+	return $corps;
 }
 
+
 // http://doc.spip.org/@legender_auteur_saisir
-function legender_auteur_saisir($id_auteur, $auteur, $initial, $echec='', $redirect='')
-{
+function legender_auteur_saisir($auteur, $auteur_infos_voir, $bloc_statut, $redirect) {
 	global $options, $connect_statut, $connect_id_auteur, $connect_toutes_rubriques;
-	$corps = '';
 
-	if ($echec){
+	$id_auteur = $auteur['id_auteur'];
+
 
-		foreach (split('@@@',$echec) as $e)
-			$corps .= '<p>' . _T($e) . "</p>\n";
-		
-		$corps = debut_cadre_relief('', true)
-		.  "<span style='color: red; left-margin: 5px'>"
-		.  http_img_pack("warning.gif", _T('info_avertissement'), "style='width: 48px; height: 48px; float: left; margin: 5px;'")
-		. $corps
-		.  _T('info_recommencer')
-		.  "</span>\n"
-		. fin_cadre_relief(true);
-	}
 
 	$setmail = ($connect_statut == "0minirezo"
 		AND ($connect_toutes_rubriques OR $auteur['statut']<>'0minirezo'));
 
 	$setconnecte = ($connect_id_auteur == $id_auteur);
 
+
+	// Elaborer le formulaire
+	$corps = '';
 	$corps .= _T('titre_cadre_signature_obligatoire')
 	. "("
 	. _T('entree_nom_pseudo')
@@ -92,16 +125,13 @@ function legender_auteur_saisir($id_auteur, $auteur, $initial, $echec='', $redir
 	. fin_cadre_enfonce(true)
 	. "\n<br />";
 
-	if ($options == "avancees") {
+	if ($options == "avancees"
+	OR strlen($auteur['pgp'])) {
 		$corps .= debut_cadre_enfonce("cadenas-24.gif", true, "", _T('entree_cle_pgp'))
 		. "<textarea name='pgp' class='forml' rows='4' cols='40'>"
 		. entites_html($auteur['pgp'])
 		. "</textarea>\n"
 		. fin_cadre_enfonce(true);
-	} else {
-		$corps .= "<input type='hidden' name='pgp' value=\""
-		. entites_html($auteur['pgp'])
-		. "\" />";
 	}
 
 	$corps .= "\n<br />";
@@ -165,26 +195,64 @@ function legender_auteur_saisir($id_auteur, $auteur, $initial, $echec='', $redir
 		$corps .= $res;
 	}
 
-	$corps .= fin_cadre_relief(true)
-	. "<br />"
-	  . (!$setconnecte ? '' : apparait_auteur_infos($id_auteur, $auteur));
-
-	$att = " style='float: 	"
-	.  $GLOBALS['spip_lang_right']
-	. "' class='fondo'";
-
-	$arg = intval($id_auteur) . '/';
-
-	return '<div>&nbsp;</div>'
-	. "\n<div class='serif'>"
-	. debut_cadre_relief("fiche-perso-24.gif", true, "", _T("icone_informations_personnelles"))
-	. (
-	$redirect
-	     ? generer_action_auteur('legender_auteur', $arg, $redirect,
-	     	$corps . "<div align='right'><input type='submit' value='"._T('bouton_enregistrer')."' class='fondo' /></div>")
-	   : ajax_action_post('legender_auteur', $arg, 'auteur_infos', "id_auteur=$id_auteur&initial=-1", $corps, _T('bouton_enregistrer'), $att))
-	. fin_cadre_relief(true)
-	. '</div>';
+	$corps .= fin_cadre_relief(true);
+
+
+	
+	//
+	// Retour
+	//
+
+	$corps = $auteur_infos_voir
+		. "<div id='auteur_infos_edit'>\n"
+		. '<div>&nbsp;</div>'
+		. "\n<div class='serif'>"
+		. debut_cadre_relief("fiche-perso-24.gif",
+			true, "", _T("icone_informations_personnelles"))
+		. $corps
+		. fin_cadre_relief(true)
+		. (!$setconnecte ? '' : apparait_auteur_infos($id_auteur, $auteur))
+		. "</div>\n" # /serif
+		. "</div>\n"; # /auteur_infos_edit
+
+	// Installer la fiche "auteur_infos_voir"
+	// et masquer le formulaire si on n'en a pas besoin
+	$new = ($auteur_infos_voir == '');
+	if (!$new
+	AND !_request('echec')
+	AND !_request('edit')) {
+		$corps .= "<script>jQuery('#auteur_infos_edit').hide()</script>\n";
+	} else {
+		$corps .= "<script>jQuery('#auteur_infos_voir').hide()</script>\n";
+	}
+
+
+	// Formulaire de statut
+	$corps .= $bloc_statut;
+
+
+	// Lier a un article (creation d'un auteur depuis un article)
+	if ($id_article = intval(_request('lier_id_article')))
+		$corps .= "<input type='hidden' name='lier_id_article' value='$id_article' />\n";
+
+	// Redirection apres enregistrement ?
+	if ($redirect)
+		$corps .= "<input type='hidden' name='redirect' value=\"".attribut_html($redirect)."\" />\n";
+
+	$corps .= "<div align='right'><input type='submit' value='"._T('bouton_enregistrer')."' class='fondo' /></div>";
+
+
+	if (!$redirect)
+		$redirect = generer_url_ecrire('auteur_infos', "id_auteur=$id_auteur", '&');
+
+	$arg = intval($id_auteur);
+	$ret .= generer_action_auteur('editer_auteur', $arg, $redirect, $corps, ' method="POST"');
+
+	$ret .= fin_cadre_relief(true)
+		. '</div>';
+
+
+	return $ret;
 }
 
 //
@@ -192,8 +260,7 @@ function legender_auteur_saisir($id_auteur, $auteur, $initial, $echec='', $redir
 //
 
 // http://doc.spip.org/@apparait_auteur_infos
-function apparait_auteur_infos($id_auteur, $auteur)
-{
+function apparait_auteur_infos($id_auteur, $auteur) {
 
 	if ($auteur['imessage']=="non"){
 		$res = "<input type='radio' name='perso_activer_imessage' value='oui' id='perso_activer_imessage_on'>"
@@ -211,86 +278,84 @@ function apparait_auteur_infos($id_auteur, $auteur)
 		. "</label> ";
 	}
 
-	return 	debut_cadre_formulaire('', true)
-	. debut_cadre_relief("messagerie-24.gif", true, "", _T('info_liste_redacteurs_connectes'))
-	. "\n<div>"
-	. _T('texte_auteur_messagerie')
-	. "</div>"
-	. $res
-	. fin_cadre_relief(true)
-	. "<br />"
-	. fin_cadre_formulaire(true);
+	return
+		"<br />"
+		.debut_cadre_formulaire('', true)
+		. debut_cadre_relief("messagerie-24.gif", true, "", _T('info_liste_redacteurs_connectes'))
+		. "\n<div>"
+		. _T('texte_auteur_messagerie')
+		. "</div>"
+		. $res
+		. fin_cadre_relief(true)
+		. "<br />"
+		. fin_cadre_formulaire(true);
 }
 
 
 // http://doc.spip.org/@legender_auteur_voir
-function legender_auteur_voir($auteur, $redirect)
-{
-	global $connect_toutes_rubriques, $connect_statut, $connect_id_auteur, $champs_extra, $options,$spip_lang_right ;
-
-	$id_auteur=$auteur['id_auteur'];
-	$nom=$auteur['nom'];
-	$bio=$auteur['bio'];
-	$email=$auteur['email'];
-	$nom_site_auteur=$auteur['nom_site'];
-	$url_site=$auteur['url_site'];
-	$statut=$auteur['statut'];
-	$pgp=$auteur["pgp"];
-	$extra = $auteur["extra"];
+function legender_auteur_voir($auteur) {
+	global $connect_toutes_rubriques, $connect_statut, $connect_id_auteur, $champs_extra, $options, $spip_lang_right;
+
+	if (!$id_auteur = $auteur['id_auteur']) {
+		$new = true;
+	}
 
 	$res = "<table width='100%' cellpadding='0' border='0' cellspacing='0'>"
 	. "<tr>"
 	. "<td  style='width: 100%' valign='top'>"
-	. gros_titre($nom,'',false)
+	. gros_titre(
+		sinon($auteur['nom'],_T('item_nouvel_auteur')),
+		'',false)
 	. "<div>&nbsp;</div>";
 
-	if (strlen($email) > 2)
-		$res .= "<div>"._T('email_2')." <b><a href='mailto:$email'>$email</a></b></div>";
+	if (strlen($auteur['email']))
+		$res .= "<div>"._T('email_2')
+			." <b><a href='mailto:".htmlspecialchars($auteur['email'])."'>"
+			.$auteur['email']."</a></b></div>";
 
-	if ($url_site) {
-		if (!$nom_site_auteur) $nom_site_auteur = _T('info_site');
-		$res .= propre(_T('info_site_2')." [{{".$nom_site_auteur."}}->".$url_site."]");
+	if ($auteur['url_site']) {
+		if (!$auteur['nom_site'])
+			$auteur['nom_site'] = _T('info_site');
+		$res .= propre(_T('info_site_2')." [{{".$auteur['nom_site']."}}->".$auteur['url_site']."]");
 	}
-		
-	$res .= "</td>"
-	.  "<td>";
-	
-	if (statut_modifiable_auteur($id_auteur, $auteur)) {
-		$ancre = "legender_auteur-$id_auteur";
+
+	// Bouton "modifier" ?
+	if (autoriser('modifier', 'auteur', $id_auteur)) {
+		$res .= "</td>\n<td id='bouton_modifier_auteur'>";
 		$clic = _T("admin_modifier_auteur");
-		$h = generer_url_ecrire("auteur_infos","id_auteur=$id_auteur");
-		if ((_SPIP_AJAX === 1 ) AND !$redirect) {
-		  $evt = "\nonclick=" . ajax_action_declencheur($h,$ancre);
-		  $h = "<a\nhref='$h#$ancre'$evt>$clic</a>";
-		}
-	  $res .= icone($clic, $h, "redacteurs-24.gif", "edit.gif", '', '',true);
+		$h = generer_url_ecrire("auteur_infos","id_auteur=$id_auteur&edit=oui");
+		$h = "<a\nhref='$h'>$clic</a>";
+		$res .= icone($clic, $h, "redacteurs-24.gif", "edit.gif", '', '',true);
+
+		$res .= "<script type='text/javascript'><!--
+		jQuery('#bouton_modifier_auteur a')
+		.click(function() {
+			jQuery('#auteur_infos_edit')
+			.show();
+			jQuery('#auteur_infos_voir')
+			.hide();
+			return false;
+		});
+		// --></script>\n";
 	}
+
 	$res .= "</td></tr></table>";
 
-	if (strlen($bio) > 0) { $res .= "<div>".propre("<quote>".$bio."</quote>")."</div>"; }
-	if (strlen($pgp) > 0) { $res .= "<div>".propre("PGP:<cadre>".$pgp."</cadre>")."</div>"; }
+	if (strlen($auteur['bio'])) {
+		$res .= propre("<quote>".$auteur['bio']."</quote>");
+	}
+
+	if (strlen($auteur['pgp'])) {
+		$res .= propre("PGP: <cadre>".$auteur['pgp']."</cadre>");
+	}
 
-	if ($champs_extra AND $extra) {
+	if ($GLOBALS['champs_extra'] AND $auteur['extra']) {
 		include_spip('inc/extra');
-		$res .= extra_affichage($extra, "auteurs");
+		$res .= extra_affichage($auteur['extra'], 'auteurs');
 	}
 
 	return $res;
 
 }
 
-// http://doc.spip.org/@statut_modifiable_auteur
-function statut_modifiable_auteur($id_auteur, $auteur)
-{
-	global $connect_statut, $connect_toutes_rubriques, $connect_id_auteur;
-
-// on peut se changer soi-meme
-	  return  (($connect_id_auteur == $id_auteur) ||
-  // sinon on doit etre admin
-  // et pas admin restreint pour changer un autre admin ou creer qq
-		(($connect_statut == "0minirezo") &&
-		 ($connect_toutes_rubriques OR 
-		  ($id_auteur AND ($auteur['statut'] != "0minirezo")))));
-}
-
 ?>
diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php
index 65e840dcd4..046c96fcf4 100644
--- a/ecrire/inc/autoriser.php
+++ b/ecrire/inc/autoriser.php
@@ -310,6 +310,7 @@ function autoriser_webmestre_dist($faire, $type, $id, $qui, $opt) {
 // Attention tout depend de ce qu'on veut modifier
 // http://doc.spip.org/@autoriser_auteur_modifier_dist
 function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
+
 	// Ni admin ni redacteur => non
 	if (!in_array($qui['statut'], array('0minirezo', '1comite')))
 		return false;
@@ -319,14 +320,42 @@ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
 	if ($qui['statut'] == '1comite') {
 		if ($opt['statut'] OR $opt['restreintes'])
 			return false;
-		if ($id == $qui['id_auteur'])
+		else if ($id == $qui['id_auteur'])
 			return true;
-		return false;
+		else
+			return false;
+	}
+
+	// Un admin restreint peut modifier/creer un auteur non-admin mais il
+	// n'a le droit ni de le promouvoir admin, ni de changer les rubriques
+	if ($qui['restreint']) {
+		if ($opt['statut'] == '0minirezo'
+		OR $opt['restreintes']) {
+			return false;
+		} else {
+			if ($id == $qui['id_auteur']) {
+				if ($opt['statut'])
+					return false;
+				else
+					return true;
+			}
+			else if ($id_auteur = intval($id)) {
+				$s = spip_query("SELECT statut FROM spip_auteurs WHERE id_auteur=$id_auteur");
+				if ($t = spip_fetch_array($s)
+				AND $t['statut'] != '0minirezo')
+					return true;
+				else
+					return false;
+			}
+			// id = 0 => creation
+			else
+				return true;
+		}
 	}
 
+	// Un admin complet fait ce qu'elle veut
 	return
 		true;
 }
 
-
 ?>
diff --git a/ecrire/inc/boutons.php b/ecrire/inc/boutons.php
index 3b67cda20c..a97561f618 100644
--- a/ecrire/inc/boutons.php
+++ b/ecrire/inc/boutons.php
@@ -264,7 +264,7 @@ function definir_barre_onglets($rubrique) {
 	case 'auteur':
 		$onglets['auteur']=
 		  new Bouton('auteur-24.gif', 'onglet_auteur',
-			generer_url_ecrire("auteurs_edit","id_auteur=$id_auteur"));
+			generer_url_ecrire("auteur_infos","id_auteur=$id_auteur"));
 		$onglets['infos']=
 		  new Bouton('fiche-perso-24.gif', 'icone_informations_personnelles',
 			generer_url_ecrire("auteur_infos","id_auteur=$id_auteur"));
diff --git a/ecrire/inc/commencer_page.php b/ecrire/inc/commencer_page.php
index 9c837e3515..9c53e03aff 100644
--- a/ecrire/inc/commencer_page.php
+++ b/ecrire/inc/commencer_page.php
@@ -126,7 +126,7 @@ function init_body($rubrique='accueil', $sous_rubrique='accueil', $id_rubrique='
 		. (($spip_ecran == "large") ? 300 : 110)
 		. "px; height: 14px; overflow: hidden;'>"
 		. "<a href='"
-		. generer_url_ecrire("auteur_infos","id_auteur=$connect_id_auteur&initial=-1") 
+		. generer_url_ecrire("auteur_infos","id_auteur=$connect_id_auteur") 
 		. "' class='icone26' title=\""
 		. entites_html(_T('icone_informations_personnelles'))
 		. '">'
diff --git a/ecrire/inc/editer_auteurs.php b/ecrire/inc/editer_auteurs.php
index 32fbdb8931..479d5993d8 100644
--- a/ecrire/inc/editer_auteurs.php
+++ b/ecrire/inc/editer_auteurs.php
@@ -20,14 +20,9 @@ define('_SPIP_SELECT_MIN_AUTEURS', 10); // en dessous: balise Select
 define('_SPIP_SELECT_MAX_AUTEURS', 100); // au-dessus: saisie + return
 
 // http://doc.spip.org/@inc_editer_auteurs_dist
-function inc_editer_auteurs_dist($type, $id, $flag, $cherche_auteur, $ids, $titre_boite = NULL, $script_edit_objet = NULL, $script_edit_auteur = NULL)
-{
+function inc_editer_auteurs_dist($type, $id, $flag, $cherche_auteur, $ids, $titre_boite = NULL, $script_edit_objet = NULL) {
 	global $options;
 	$arg_ajax = "&id_{$type}=$id";
-	if ($script_edit_auteur===NULL) 
-		$script_edit_auteur = 'auteur_infos';
-	else
-		$arg_ajax .= "&script_aut=$script_edit_auteur";
 	if ($script_edit_objet===NULL) $script_edit_objet = $type.'s';
 	if ($titre_boite===NULL) 
 		$titre_boite = _T('texte_auteurs'). aide("artauteurs");
@@ -36,7 +31,7 @@ function inc_editer_auteurs_dist($type, $id, $flag, $cherche_auteur, $ids, $titr
 
 
 	$cond_les_auteurs = "";
-	$aff_les_auteurs = afficher_auteurs_objet($type, $id, $flag, $cond_les_auteurs, $script_edit_objet, $script_edit_auteur, $arg_ajax);
+	$aff_les_auteurs = afficher_auteurs_objet($type, $id, $flag, $cond_les_auteurs, $script_edit_objet, $arg_ajax);
 	
 	if ($flag AND $options == 'avancees') {
 		$futurs = ajouter_auteurs_objet($type, $id, $cond_les_auteurs,$script_edit_objet, $arg_ajax);
@@ -55,7 +50,7 @@ function editer_auteurs_objet($type, $id, $flag, $cherche_auteur, $ids, $les_aut
 
 	$bouton_creer_auteur =  $GLOBALS['connect_toutes_rubriques'];
 	$clic = _T('icone_creer_auteur');
-	$arg = "0/$id/"  . ($statut ? $statut : '1comite');
+
 //
 // complement de action/editer_auteurs.php pour notifier la recherche d'auteur
 //
@@ -67,8 +62,10 @@ function editer_auteurs_objet($type, $id, $flag, $cherche_auteur, $ids, $les_aut
 
 		if ($type=='article' && $bouton_creer_auteur) { // pas generique pour le moment
 
-			$legende = redirige_action_auteur("legender_auteur", $arg, "articles","id_article=$id");
+			$legende = generer_url_ecrire("bolino", "new=oui&lier_id_article=$id");
 			$legende = parametre_url($legende, 'nom', $cherche_auteur);
+			$legende = parametre_url($legende, 'redirect',
+				generer_url_ecrire('articles', "id_article=$id", '&'));
 
 			$reponse .="<div style='width: 200px;'>"
 			. icone_horizontale($clic, $legende, "redacteurs-24.gif", "creer.gif", false)
@@ -92,7 +89,10 @@ function editer_auteurs_objet($type, $id, $flag, $cherche_auteur, $ids, $les_aut
 
 		if ($type=='article' && $bouton_creer_auteur) { // pas generique pour le moment
 
-			$legende = redirige_action_auteur("legender_auteur",$arg, "articles","id_article=$id");
+			$legende = generer_url_ecrire("bolino", "new=oui&lier_id_article=$id");
+			$legende = parametre_url($legende, 'nom', $cherche_auteur);
+			$legende = parametre_url($legende, 'redirect',
+				generer_url_ecrire('articles', "id_article=$id", '&'));
 
 			$clic = "<span class='verdana1'><b>$clic</b></span>";
 			$res = "<div style='width:170px;'>"
@@ -201,7 +201,7 @@ function rechercher_auteurs_objet($cherche_auteur, $ids, $type, $id, $script_edi
 }
 
 // http://doc.spip.org/@afficher_auteurs_objet
-function afficher_auteurs_objet($type, $id, $flag_editable, $cond_les_auteurs, $script_edit, $script_edit_auteur, $arg_ajax)
+function afficher_auteurs_objet($type, $id, $flag_editable, $cond_les_auteurs, $script_edit, $arg_ajax)
 {
 	global $connect_statut, $options,$connect_id_auteur, $spip_display;
 	
@@ -236,7 +236,7 @@ function afficher_auteurs_objet($type, $id, $flag_editable, $cond_les_auteurs, $
 
 	while ($row = spip_fetch_array($result)) {
 		$id_auteur = $row['id_auteur'];
-		$vals = $formater_auteur($id_auteur, $script_edit_auteur);
+		$vals = $formater_auteur($id_auteur);
 
 		if ($flag_editable AND ($connect_id_auteur != $id_auteur OR $connect_statut == '0minirezo') AND $options == 'avancees') {
 			$vals[] =  ajax_action_auteur('editer_auteurs', "$id,$type,-$id_auteur", $script_edit, "id_{$type}=$id", array(_T('lien_retirer_auteur')."&nbsp;". http_img_pack('croix-rouge.gif', "X", " class='puce' style='vertical-align: bottom;'")),$arg_ajax);
diff --git a/ecrire/inc/formater_auteur.php b/ecrire/inc/formater_auteur.php
index cca9fadbae..71f8268504 100644
--- a/ecrire/inc/formater_auteur.php
+++ b/ecrire/inc/formater_auteur.php
@@ -24,7 +24,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 //
 
 // http://doc.spip.org/@inc_formater_auteur_dist
-function inc_formater_auteur_dist($id_auteur, $script_edition = 'auteur_infos') {
+function inc_formater_auteur_dist($id_auteur) {
 
   global $connect_id_auteur, $spip_lang_rtl, $connect_statut;
 
@@ -48,7 +48,7 @@ function inc_formater_auteur_dist($id_auteur, $script_edition = 'auteur_infos')
 		$nom = "<span style='color: red'>" . _T('texte_vide') . '</span>';
 
 	$vals[] = "<a href='"
-	. generer_url_ecrire($script_edition, "id_auteur=$id_auteur&initial=-1")
+	. generer_url_ecrire('auteur_infos', "id_auteur=$id_auteur")
 	. "' $bio_auteur>$nom</a>";
 
 	if ($url_site_auteur = $row["url_site"]) $vals[] =  "<a href='$url_site_auteur'>"._T('info_site_min')."</a>";
diff --git a/ecrire/inc/forum.php b/ecrire/inc/forum.php
index 727edb463e..2ff24eb567 100644
--- a/ecrire/inc/forum.php
+++ b/ecrire/inc/forum.php
@@ -101,7 +101,7 @@ function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref
 			$suppression = false;
 			$controle = "<br /><span style='color: red; font-weight: bold;'>"._T('info_message_supprime')." $forum_ip</span>";
 			if($forum_id_auteur)
-				$controle .= " - <a href='" . generer_url_ecrire('auteurs_edit', "id_auteur=$forum_id_auteur") .
+				$controle .= " - <a href='" . generer_url_ecrire('auteur_infos', "id_auteur=$forum_id_auteur") .
 				  "'>" ._T('lien_voir_auteur'). "</a>";
 			break;
 		# forum propose (a moderer) sur le site public
diff --git a/ecrire/inc/gadgets.php b/ecrire/inc/gadgets.php
index b878b5e2c8..b577cfab83 100644
--- a/ecrire/inc/gadgets.php
+++ b/ecrire/inc/gadgets.php
@@ -101,7 +101,7 @@ function bandeau_gadgets($largeur, $options, $id_rubrique) {
 	
 		// Infos perso
 	$bandeau .= "\n<div id='bandeauinfoperso' class='bandeau bandeau_couleur_sous' style='$spip_lang_left: 200px;'>"
-	. "<a href='" . generer_url_ecrire("auteurs_edit","id_auteur=$connect_id_auteur") . "' class='lien_sous'>"
+	. "<a href='" . generer_url_ecrire("auteur_infos","id_auteur=$connect_id_auteur") . "' class='lien_sous'>"
 	. _T('icone_informations_personnelles')
 	. "</a>"
 	. "</div>";
diff --git a/ecrire/inc/informer_auteur.php b/ecrire/inc/informer_auteur.php
index 03f2f1175a..e50b6914bc 100644
--- a/ecrire/inc/informer_auteur.php
+++ b/ecrire/inc/informer_auteur.php
@@ -54,7 +54,7 @@ function inc_informer_auteur_dist($id)
 	return 	"<div class='arial2' style='padding: 5px; background-color: white; border: 1px solid $couleur_foncee; border-top: 0px;'>"
 	. (!$res ? '' : $res)
 	. "<div><a href='"
-	. generer_url_ecrire('auteur_infos', "id_auteur=$id&initial=-1")
+	. generer_url_ecrire('auteur_infos', "id_auteur=$id")
 	. "'>"
 	. bonhomme_statut($row)
 	. "</a> "
diff --git a/ecrire/inc/instituer_auteur.php b/ecrire/inc/instituer_auteur.php
index 8eb040d05a..10ef03b9a3 100644
--- a/ecrire/inc/instituer_auteur.php
+++ b/ecrire/inc/instituer_auteur.php
@@ -23,118 +23,62 @@ include_spip('inc/message_select');
 // les admins restreints les voient mais 
 // ne peuvent les utiliser que pour mettre un auteur a la poubelle
 
-// http://doc.spip.org/@inc_instituer_auteur_dist
-function inc_instituer_auteur_dist($id_auteur, $statut, $url_self)
-{
+function inc_instituer_auteur_dist($auteur) {
 	global $connect_toutes_rubriques, $connect_id_auteur, $connect_statut, $spip_lang_right, $spip_lang;
-					 
-	if (($connect_statut != '0minirezo')
-	OR (!($id_auteur = intval($id_auteur))))
-		return '';
-
-	$result_admin = spip_query("SELECT rubriques.id_rubrique, " . creer_objet_multi ("titre", $spip_lang) . " FROM spip_auteurs_rubriques AS lien, spip_rubriques AS rubriques WHERE lien.id_auteur=$id_auteur AND lien.id_rubrique=rubriques.id_rubrique ORDER BY multi");
-
-	$restreint = spip_num_rows($result_admin);
-
-	if (!$restreint) 
-		$res = _T('info_admin_gere_toutes_rubriques');
-	else {
-		$modif = ($connect_toutes_rubriques AND $connect_id_auteur != $id_auteur) ? "id_auteur=$id_auteur" : '';
-
-		$lien = !$modif 
-		? ''
-		: array(_T('lien_supprimer_rubrique'));
-
-		$res = '';
-
-		while ($row_admin = spip_fetch_array($result_admin)) {
-			$id_rubrique = $row_admin["id_rubrique"];
-			
-			$res .= "\n<li><a href='"
-			. generer_url_ecrire("naviguer","id_rubrique=$id_rubrique")
-			. "'>"
-			. typo($row_admin["multi"])
-			. "</a>"
-			. (!$modif ? '' :
-				"&nbsp;&nbsp;&nbsp;&nbsp;[<span class='spip_x-small'>"
-				. ajax_action_auteur('instituer_auteur', "$id_auteur/-$id_rubrique", $url_self, $modif, $lien)
-				. "</span>]")
-			. '</li>';
-		}
-
-		$res =  _T('info_admin_gere_rubriques')
-		. "\n<ul style='list-style-image: url("
-		. _DIR_IMG_PACK
-		. "rubrique-12.gif)'>"
-		. $res
-		. "</ul>";
-	}
-
-	// si pas admin au chargement, rien a montrer. 
-	$vis = ($statut == '0minirezo') ? '' : " style='display: none'";
-
-		// Ajouter une rubrique a un administrateur restreint
-	if ($connect_toutes_rubriques AND $connect_id_auteur != $id_auteur) {
 
-		$label = $restreint ? _T('info_ajouter_rubrique') : _T('info_restreindre_rubrique');
+	if ($connect_statut != '0minirezo') return '';
 
-		$chercher_rubrique = charger_fonction('chercher_rubrique', 'inc');
+	$statut = $auteur['statut'];
 
-		$res .= debut_block_visible("statut$id_auteur")
-		. "\n<div id='ajax_rubrique' class='arial1'><br />\n"
-		. "<b>"
-		. $label 
-		. "</b><br />"
-		. "\n<input name='id_auteur' value='"
-		. $id_auteur
-		. "' type='hidden' />"
-		. $chercher_rubrique(0, 'auteur', false)
-		. "</div>\n"
-		. fin_block();
+	if (!$id_auteur = $auteur['id_auteur']) {
+		$new = true;
+		$statut = '1comite';
 	}
-		
-	$droit = (($connect_toutes_rubriques OR $statut != "0minirezo")
-		   && ($connect_id_auteur != $id_auteur));
 
 	$ancre = "instituer_auteur-" . intval($id_auteur);
 
-	if ($droit) {
-		$res = "<b>"._T('info_statut_auteur')." </b> "
-		. choix_statut_auteur($statut, "$ancre-aff")
-		. "<div id='$ancre-aff'$vis>"
-		. $res		  
-		. "</div>";
+	if ($menu = choix_statut_auteur($statut, $id_auteur, "$ancre-aff"))
+		$res = "<b>"._T('info_statut_auteur')."</b> " . $menu;
 
-		$res = ajax_action_post('instituer_auteur', $id_auteur, $url_self, (!$id_auteur ? "" : "id_auteur=$id_auteur"), $res, _T('bouton_valider'), " style='float: $spip_lang_right' class='fondo'")."<br class='nettoyeur' />";
-	}
+	// Prepare le bloc des rubriques restreintes ;
+	// si l'auteur n'est pas admin, on le cache
+	$vis = ($statut == '0minirezo') ? '' : " style='display: none'";
+	if ($menu_restreints = choix_rubriques_admin_restreint($auteur))
+		$res .= "<div id='$ancre-aff'$vis>"
+			. $menu_restreints
+			. "</div>";
 
-	return (_request('var_ajaxcharset'))
-	? $res
-	: (debut_cadre_relief('',true)
+	return debut_cadre_relief('',true)
 		. "<div id='"
 		. $ancre
 		. "'>"
 		. $res 
 		. '</div>'
-		. fin_cadre_relief(true));
+		. fin_cadre_relief(true);
 }
 
 
-
 // Menu de choix d'un statut d'auteur
 // http://doc.spip.org/@choix_statut_auteur
-function choix_statut_auteur($statut, $ancre) {
-	global $connect_toutes_rubriques;
+function choix_statut_auteur($statut, $id_auteur, $ancre) {
+
+	// Le menu doit-il etre actif ?
+	if (!autoriser('modifier', 'auteur', $id_auteur,
+	null, array('statut' => '?')))
+		return '';
 
+	// Calculer le menu
 	$menu = "<select name='statut' size='1' class='fondl'
-		onchange=\"(this.selectedIndex==0)?jQuery('#$ancre').slideDown():jQuery('#$ancre:visible').slideUp();\">";
+		onchange=\"(this.options[this.selectedIndex].value == '0minirezo')?jQuery('#$ancre').slideDown():jQuery('#$ancre:visible').slideUp();\">";
 
-	// Si on est admin restreint, on n'a pas le droit de modifier un admin
-	if ($connect_toutes_rubriques)
+	// A-t-on le droit de promouvoir cet auteur comme admin ?
+	if (autoriser('modifier', 'auteur', intval($id_auteur),
+	null, array('statut' => '0minirezo'))) {
 		$menu .= "\n<option" .
 			mySel("0minirezo",$statut) .
 			">" . _T('item_administrateur_2')
 			. '</option>';
+	}
 
 	// Ajouter le choix "comite"
 	$menu .=
@@ -187,4 +131,98 @@ function choix_statut_auteur($statut, $ancre) {
 
 	return $menu;
 }
+
+
+function choix_rubriques_admin_restreint($auteur) {
+	global $connect_toutes_rubriques, $connect_id_auteur, $connect_statut, $spip_lang_right, $spip_lang;
+
+	$id_auteur = intval($auteur['id_auteur']);
+
+	$result_admin = spip_query("SELECT rubriques.id_rubrique, " . creer_objet_multi ("titre", $spip_lang) . " FROM spip_auteurs_rubriques AS lien, spip_rubriques AS rubriques WHERE lien.id_auteur=$id_auteur AND lien.id_rubrique=rubriques.id_rubrique ORDER BY multi");
+
+
+	if (spip_num_rows($result_admin) == 0) {
+		$phrase = _T('info_admin_gere_toutes_rubriques')."\n";
+		$menu = '';
+	} else {
+		// L'autorisation de modifier les rubriques restreintes
+		// est egale a l'autorisation de passer en admin
+		$modif = autoriser('modifier', 'auteur', $id_auteur, null, array('statut' => '0minirezo'));
+
+		// Il faut un element zero pour montrer qu'on a l'interface
+		// sinon il est impossible de deslectionner toutes les rubriques
+		$menu = $modif
+			? "<input type='hidden' name='restreintes[]' value='0' />\n"
+			: '';
+
+		while ($row_admin = spip_fetch_array($result_admin)) {
+			$id_rubrique = $row_admin["id_rubrique"];
+
+			$menu .= "\n<li id='rubrest_$id_rubrique'>"
+			. ($modif
+				? "<input type='checkbox' checked='checked' name='restreintes[]' value='$id_rubrique' />\n"
+				: ''
+			)
+			. "<a href='?exec=naviguer&amp;id_rubrique=$id_rubrique'>"
+			. typo($row_admin["multi"])
+			. "</a>"
+			. '</li>';
+		}
+
+		$phrase = _T('info_admin_gere_rubriques');
+	}
+
+	if ($auteur['statut'] != '0minirezo')
+		$phrase = '';
+
+	$res = "<p>$phrase</p>\n"
+		. "<ul id='liste_rubriques_restreintes' style='list-style-image: url("
+		. _DIR_IMG_PACK
+		. "rubrique-12.gif)'>"
+		. $menu
+		. "</ul>\n";
+
+	// Ajouter une rubrique a un administrateur restreint
+	if ($connect_toutes_rubriques AND $connect_id_auteur != $id_auteur) {
+
+		$label = $restreint
+			? _T('info_ajouter_rubrique')
+			: _T('info_restreindre_rubrique');
+
+		$chercher_rubrique = charger_fonction('chercher_rubrique', 'inc');
+
+		$res .= debut_block_visible("statut$id_auteur")
+		. "\n<div id='ajax_rubrique' class='arial1'><br />\n"
+		. "<b>"
+		. $label 
+		. "</b><br />"
+		. "\n<input name='id_auteur' value='"
+		. $id_auteur
+		. "' type='hidden' />"
+		. $chercher_rubrique(0, 'auteur', false)
+		. "</div>\n"
+
+		// onchange = pour le menu
+		// l'evenement doit etre provoque a la main par le selecteur ajax
+		. "<script type='text/javascript'><!--
+		jQuery('input[@name=id_parent]')
+		.bind('change', function(){
+			var id_parent = this.value;
+			var titre = jQuery('#titreparent').attr('value') || this.options[this.selectedIndex].text;
+			// Ajouter la rubrique selectionnee au formulaire,
+			// sous la forme d'un input name='rubriques[]'
+			var el = '<input type=\'checkbox\' checked=\'checked\' name=\'restreintes[]\' value=\''+id_parent+'\' /> ' + '<a href=\'?exec=naviguer&amp;id_rubrique='+id_parent+'\'>'+titre+'</a>';
+			if (jQuery('#rubrest_'+id_parent).size() == 0) {
+				jQuery('#liste_rubriques_restreintes')
+				.append('<li id=\'rubrest_'+id_parent+'\'>'+el+'</li>');
+			}
+		}); //--></script>\n"
+
+		. fin_block();
+	}
+
+	return $res;
+}
+
+
 ?>
diff --git a/ecrire/inc/message_select.php b/ecrire/inc/message_select.php
index d5591e1b98..ad2d9e95e8 100644
--- a/ecrire/inc/message_select.php
+++ b/ecrire/inc/message_select.php
@@ -94,7 +94,7 @@ function afficher_message_boucles($row, &$messages_vus, $voir_logo, $afficher_au
 		$auteurs = '';
 		while ($row_auteurs = spip_fetch_array($result_auteurs)) {
 			$id_auteur = $row_auteurs['id_auteur'];
-			$auteurs[] = "<a href='" . generer_url_ecrire("auteurs_edit","id_auteur=$id_auteur") . "'>".typo($row_auteurs['nom'])."</a>";
+			$auteurs[] = "<a href='" . generer_url_ecrire("auteur_infos","id_auteur=$id_auteur") . "'>".typo($row_auteurs['nom'])."</a>";
 		}
 
 		if ($auteurs AND $type == 'normal') {
diff --git a/ecrire/inc/urls.php b/ecrire/inc/urls.php
index 007461194b..f736670e32 100644
--- a/ecrire/inc/urls.php
+++ b/ecrire/inc/urls.php
@@ -66,7 +66,8 @@ function generer_url_ecrire_auteur($id_auteur, $statut='') {
 	$args = "id_auteur=" . intval($id_auteur);
 	if (!$statut)
 		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('auteurs_edit',$args);
+	else
+		return generer_url_ecrire('auteur_infos',$args);
 }
 
 // http://doc.spip.org/@generer_url_ecrire_forum
diff --git a/ecrire/inc/vieilles_defs.php b/ecrire/inc/vieilles_defs.php
index 90e50ddcbe..2cbb57d6f8 100644
--- a/ecrire/inc/vieilles_defs.php
+++ b/ecrire/inc/vieilles_defs.php
@@ -95,7 +95,7 @@ spip_log('affiche_auteur_boucle() '.$GLOBALS['REQUEST_URI'].' - '.$_SERVER['SCRI
 	$nom = $row['nom'];
 
 	$s = bonhomme_statut($row);
-	$s .= "<a href='" . generer_url_ecrire("auteurs_edit","id_auteur=$id_auteur") . "'>";
+	$s .= "<a href='" . generer_url_ecrire("auteur_infos","id_auteur=$id_auteur") . "'>";
 	$s .= typo($nom);
 	$s .= "</a>";
 	$vals[] = $s;
-- 
GitLab