diff --git a/inc-balises.php3 b/inc-balises.php3
index 0c22f1289b3bef385a2645e649b55c1e43d91813..08924820847fc4981c664974f2107ae84dff765d 100644
--- a/inc-balises.php3
+++ b/inc-balises.php3
@@ -17,7 +17,6 @@ if (defined("_INC_BALISES")) return;
 define("_INC_BALISES", "1");
 
 
-
 //
 // Traitements standard de divers champs
 //
@@ -92,7 +91,6 @@ function balise_CHARSET_dist($p) {
 	return $p;
 }
 
-
 function balise_LANG_LEFT_dist($p) {
 	$_lang = champ_sql('lang', $p);
 	$p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'left','right')";
@@ -478,16 +476,17 @@ function balise_LESAUTEURS_dist ($p) {
 
 // #PETITION
 // Champ testant la presence d'une petition
-// non documente ???
+// non documente mais indispensable a FORMULAIRE_PETITION
+
 function balise_PETITION_dist ($p) {
 	$nom = $p->id_boucle;
 	$p->code = "sql_petitions(" .
 			champ_sql('id_article', $p) .
 			",'" .
-			$nom .
-			"','" .
 			$p->boucles[$nom]->type_requete .
 			"','" .
+			$nom .
+			"','" .
 			$p->boucles[$nom]->sql_serveur .
 			"', \$Cache)";
 	$p->statut = 'php';
@@ -510,7 +509,7 @@ function balise_POPULARITE_dist ($p) {
 // Fonction commune aux balises #LOGO_XXXX
 // (les balises portant ce type de nom sont traitees en bloc ici)
 //
-function calcul_balise_logo ($p) {
+function calculer_balise_logo ($p) {
 
 	eregi("^LOGO_([A-Z]+)(_.*)?$", $p->nom_champ, $regs);
 	$type_objet = $regs[1];
@@ -641,108 +640,48 @@ function balise_EXTRA_dist ($p) {
 	return $p;
 }
 
-
-
 //
-// Traduction des champs "formulaire"
-//
-
-//
-// Note : les balises de gestion de forums (FORMULAIRE_FORUM et
-// PARAMETRES_FORUM) sont definies dans le fichier inc-forum.php3
-// qui centralise toute la gestion des forums
+// Gros morceau inséparable du formulaire associe. On delegue
 //
 
-//
-// Formulaire de recherche
-//
-function balise_FORMULAIRE_RECHERCHE_dist($p) {
-	if ($p->fonctions) {
-		list(, $lien) = each($p->fonctions);	// le premier est un url
-		while (list(, $filtre) = each($p->fonctions))
-			$filtres[] = $filtre;	// les suivants sont des filtres
-		$p->fonctions = $filtres;
-	}
-	if (!$lien) $lien = 'recherche.php3';
-
-	$formulaire_recherche = "\"<form action='$lien' method='get' class='formrecherche'><input type='text' id='formulaire_recherche' size='20' class='formrecherche' name='recherche' value='\" . _T('info_rechercher') . \"' /></form>\"";
-
-	$p->code = "((lire_meta('activer_moteur') != 'oui') ? '' :
-	$formulaire_recherche)";
-
-	$p->statut = 'html';
-	return $p;
-}
-
-
-//
-// Formulaire d'inscription comme redacteur (dans inc-formulaires.php3)
-//
-function balise_FORMULAIRE_INSCRIPTION_dist($p) {
-	balise_distante_interdite($p);
-	$p->code = '((lire_meta("accepter_inscriptions") != "oui") ? "" :
-		("<"."?php include_local(\'inc-formulaires.php3\'); lang_select(\'".$GLOBALS[\'spip_lang\']."\'); echo formulaire_inscription(\"redac\"); lang_dselect(); ?".">"))';
-
-	$p->statut = 'php';
-	return $p;
+function balise_PARAMETRES_FORUM_dist($p) {
+  include_local("inc-forum.php3");
+  return calculer_balise_parametres($p);
 }
 
 //
-// Formulaire ecrire auteur
-//
-function balise_FORMULAIRE_ECRIRE_AUTEUR_dist($p) {
-	balise_distante_interdite($p);
-	$_id_auteur = champ_sql('id_auteur', $p);
-	$_mail_auteur = champ_sql('email', $p);
-
-	$p->code = '(!email_valide('.$_mail_auteur.') ? "" :
-		("<'.'?php include_local(\'inc-formulaires.php3\'); lang_select(\'".$GLOBALS[\'spip_lang\']."\'); echo formulaire_ecrire_auteur(".'.$_id_auteur.'.", \'".texte_script('.$_mail_auteur.')."\'); lang_dselect(); ?'.'>"))';
-
-	$p->statut = 'php';
-	return $p;
-}
+// Traduction des champs "formulaire"
+// Inclusion du fichier associe a son nom.
+// Ca donne les arguments a chercher dans la pile,on compile leur localisation
+// Ensuite on delegue a une fonction generale definie dans inc-calcul-outils
+// qui recevra a l'execution la valeurs des arguments, 
+// ainsi que les filtres (que la compilation ignore pour le moment)
 
-//
-// Formulaire signature de petition
-//
-function balise_FORMULAIRE_SIGNATURE_dist($p) {
+function calculer_balise_formulaire($p) {
 	balise_distante_interdite($p);
-	$_id_article = champ_sql('id_article', $p);
-	$nom = $p->id_boucle;
-	$code = "sql_petitions(" .
-			$_id_article .
-			",'" .
-			$nom .
-			"','" .
-			$p->boucles[$nom]->type_requete .
-			"','" .
-			$p->boucles[$nom]->sql_serveur .
-			"', \$Cache)";
-
-	$p->code = '(!($petition = '.
-		$code .
-		') ? "" : ("<"."?php include_local(\'inc-formulaires.php3\'); lang_select(\'".$GLOBALS[\'spip_lang\']."\'); 
-echo formulaire_signature(".' .
-		$_id_article .
-		'.", \'".texte_script(serialize($petition))."\'); lang_dselect(); ?".">"))';
-
+	$nom = strtolower(substr($p->nom_champ, strlen('FORMULAIRE_')));
+	$filtres = $p->fonctions;
+	$file = 'inc-' . $nom . _EXTENSION_PHP;
+	include_local($file);
+	$l = $GLOBALS[$nom . '_array'];
+	$p->code = "calculer_formulaire('$nom', array("
+	  . join(',',calculer_multiple_balise($l, $p))
+	  . '), array('
+	  . (!$filtres ? '' : ("'" . join("','", $filtres) . "'"))
+	  . "))";
 	$p->statut = 'php';
 	return $p;
 }
 
-// Formulaire d'inscription de site dans l'annuaire
-function balise_FORMULAIRE_SITE_dist($p) {
-	balise_distante_interdite($p);
-	$_id_rubrique = champ_sql('id_rubrique', $p);
-
-	$p->code = '((lire_meta("proposer_sites") != 2) ? "":
-		("<"."?php include_local(\'inc-formulaires.php3\'); lang_select(\'".$GLOBALS[\'spip_lang\']."\'); echo formulaire_site(\'".'.$_id_rubrique.'."\'); lang_dselect(); ?".">"))';
+// construire un tableau des valeurs interessant un formulaire
 
-	$p->statut = 'php';
-	return $p;
+function calculer_multiple_balise($l, $p) {
+  $args = array();
+  foreach($l as $c) { $x = calculer_balise($c, $p); $args[] = $x->code;}
+  return $args;
 }
 
-// il faudrait traiter le formulaire en local 
+// il faudrait savoir traiter les formulaires en local 
 // tout en appelant le serveur SQL distant.
 // En attendant, refuser une authentification sur qqch qui n'a rien à voir.
 
@@ -753,7 +692,6 @@ function balise_distante_interdite($p) {
 	}
 }
 
-
 //
 // Boutons d'administration: 
 //
@@ -763,19 +701,4 @@ function balise_FORMULAIRE_ADMIN_dist($p) {
 	return $p;
 }
 
-
-function balise_HTTP_dist($p) {
-	if (is_array($p->fonctions)) {
-		foreach($p->fonctions as $nom) {
-			if (is_numeric($nom))
-				$p->code = " http_status($nom);";
-			else
-				$p->code = " header($nom);";
-		}
-		$p->code = '("<" . "?php ' . $p->code . ' ?" . ">")';
-		$p->fonctions = array();
-	}
-	$p->statut = 'php';
-	return $p;
-}
 ?>
diff --git a/inc-calcul-outils.php3 b/inc-calcul-outils.php3
index 4ef07c49f6a34c7e5c416e3c9631f0cda31f2849..6093df51804f671b0dc1d34899ec50d4032ccb82 100644
--- a/inc-calcul-outils.php3
+++ b/inc-calcul-outils.php3
@@ -146,6 +146,34 @@ function calcul_introduction ($type, $texte, $chapo='', $descriptif='') {
 	}
 }
 
+function calculer_formulaire($nom, $args, $filtres)
+{
+  $file = 'inc-' .$nom . _EXTENSION_PHP;
+  include_local($file);
+
+  $f = $nom . '_stat';
+  $r = $f($args, $filtres);
+  if (is_string($r))
+    return $r;
+  else 
+    return
+    ('<'.'?php 
+lang_select(\''
+    . $GLOBALS["spip_lang"] 
+    . '\');
+include_local("'
+     . $file
+     . '");
+echo '
+     . $nom
+     . '_dyn('
+     . join(',',$r)
+     . ');
+lang_dselect();
+?'
+     .">");
+}
+
 //
 // FONCTIONS FAISANT DES APPELS SQL
 //
@@ -348,8 +376,9 @@ function sql_petitions($id_article, $table, $id_boucle, $serveur, &$Cache) {
 		'','','','',1, 
 		$table, $id_boucle, $serveur);
 
-	if ($retour)
-		$Cache['petition']['petition'] = 1;	# cette page est invalidee par toute petition
+	# cette page est invalidee par toute petition
+	if ($retour AND $Cache)
+		$Cache['petition']['petition'] = 1;
 
 	return $retour;
 }
diff --git a/inc-compilo-index.php3 b/inc-compilo-index.php3
index 9a3f442abd994c0b922f9e66b92c7e3f3e8a2936..5caf0aa7acc8c7de20e362f9b3815c6a9dfa2852 100644
--- a/inc-compilo-index.php3
+++ b/inc-compilo-index.php3
@@ -90,57 +90,61 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') {
 	return('$Pile[0][\''.$nom_champ.'\']');
 }
 
+# calculer_champ genere le code PHP correspondant a une balise Spip
+# Retourne une EXPRESSION php 
+function calculer_champ($p) {
+	$p = calculer_balise($p->nom_champ, $p);
+
+	// definir le type et les traitements
+	// si ca ramene le choix par defaut, ce n'est pas un champ 
+
+	if (($p->code) && ($p->code != '$Pile[0][\''.$nom.'\']')) {
+		// Par defaut basculer en numerique pour les #ID_xxx
+		if (substr($nom,0,3) == 'ID_') $p->statut = 'num';
+	}
+
+	else {
+	// on renvoie la forme initiale '#TOTO'
+	$p->code = "'#" . $nom . "'";
+	$p->statut = 'php';	// pas de traitement
+	
+	}
+
+	// Retourner l'expression php correspondant au champ + ses filtres
+	return applique_filtres($p);
+}
+
 // cette fonction sert d'API pour demander le champ '$champ' dans la pile
 function champ_sql($champ, $p) {
 	return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle);
 }
 
-# calculer_champ genere le code PHP correspondant a la balise Spip $nom_champ
-# Retourne une EXPRESSION php 
-function calculer_champ($p) {
-
-	$nom_champ = $p->nom_champ;
+// cette fonction sert d'API pour demander une balise quelconque sans filtre
+function calculer_balise($nom, $p) {
 
 	// regarder s'il existe une fonction personnalisee balise_NOM()
-	$f = 'balise_' . $nom_champ;
+	$f = 'balise_' . $nom;
 	if (function_exists($f))
-		$p = $f($p);
+		return $f($p);
 
-	else {
 	// regarder s'il existe une fonction standard balise_NOM_dist()
-	$f = 'balise_' . $nom_champ . '_dist';
+	$f = 'balise_' . $nom . '_dist';
 	if (function_exists($f))
-		$p = $f($p);
+		return $f($p);
 
-	else {
 	// S'agit-il d'un logo ? Une fonction speciale les traite tous
-	if (ereg('^LOGO_', $nom_champ))
-		$p = calcul_balise_logo($p);
-
-	else {
-	// On regarde ensuite s'il y a un champ SQL homonyme,
-	// et on definit le type et les traitements
-	$p->code = index_pile($p->id_boucle, $nom_champ, $p->boucles, $p->nom_boucle);
-	if (($p->code) && ($p->code != '$Pile[0][\''.$nom_champ.'\']')) {
-
-		// Par defaut basculer en numerique pour les #ID_xxx
-		if (substr($nom_champ,0,3) == 'ID_') $p->statut = 'num';
-	}
+	if (ereg('^LOGO_', $nom))
+		return calculer_balise_logo($p);
 
-	else {
-	// si index_pile a ramene le choix par defaut, 
-	// ca doit plutot etre un champ SPIP non SQL,
-	// ou ni l'un ni l'autre => on le renvoie sous la forme brute '#TOTO'
-	$p->code = "'#" . $nom_champ . "'";
-	$p->statut = 'php';	// pas de traitement
-	
-	}}}}
+	// S'agit-il d'un formulaire ? Une fonction speciale les traite tous
+	if (ereg('^FORMULAIRE_', $nom))
+		return calculer_balise_formulaire($p);
 
-	// Retourner l'expression php correspondant au champ + ses filtres
-	return applique_filtres($p);
+	// ca doit etre un champ SQL homonyme,
+	$p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
+	return $p;
 }
 
-
 // Genere l'application d'une liste de filtres
 function applique_filtres($p) {
 	$statut = $p->statut;
diff --git a/inc-compilo.php3 b/inc-compilo.php3
index 5caa9efaa919c32ed3d1b704609ab4502e5f6059..8344a2ad7babee861022a5f7622e2c0a666664c7 100644
--- a/inc-compilo.php3
+++ b/inc-compilo.php3
@@ -22,9 +22,6 @@ include_local("inc-criteres.php3");
 // definition des balises
 include_local("inc-balises.php3");
 
-// gestion des balises de forums
-include_local("inc-forum.php3");
-
 // definition de l'API
 include_local("inc-compilo-api.php3");
 
diff --git a/inc-criteres.php3 b/inc-criteres.php3
index 9c4de79404eb01a83a135d3776ec4e87a55d2112..61b5e28efcf8ff3451e74f76c2f99fbdc5b15c6b 100644
--- a/inc-criteres.php3
+++ b/inc-criteres.php3
@@ -25,13 +25,13 @@ function critere_racine_dist($idb, &$boucles, $param, $not) {
 // http://www.spip.net/@exclus
 function critere_exclus_dist($idb, &$boucles, $param, $not) {
 	$boucle = &$boucles[$idb];
+	$id = $boucle->primary;
 
-	if ($param != 'exclus' OR $not)
+	if ($param != 'exclus' OR $not OR !$id)
 		erreur_squelette(_T('info_erreur_squelette'), $param);
 
-	$boucle->where[] = $boucle->id_table . '.' . $boucle->primary."!='\"."
-	. calculer_argument_precedent($idb,$boucle->primary, $boucles) .
-	 ".\"'";
+	$arg = calculer_argument_precedent($idb,$id, $boucles);
+	$boucle->where[] = $boucle->id_table . '.' . $id."!='\"." . $arg . ".\"'";
 
 }
 
diff --git a/inc-ecrire_auteur.php3 b/inc-ecrire_auteur.php3
new file mode 100644
index 0000000000000000000000000000000000000000..08e48cdfa673d51af53aee385acc10506691e81f
--- /dev/null
+++ b/inc-ecrire_auteur.php3
@@ -0,0 +1,81 @@
+<?php
+
+global $ecrire_auteur_array ;
+$ecrire_auteur_array = array('id_auteur',
+			     'email',
+			     'sujet_message_auteur',
+			     'texte_message_auteur',
+			     'email_message_auteur'
+);
+
+function ecrire_auteur_stat($args, $filtres)
+{
+  list($id_auteur, $mail, $sujet, $texte, $adres) = $args;
+  return (!email_valide($mail) ? '' :
+	  array("$id_auteur",
+		"'$mail'",
+		"'" . addslashes($sujet) ."'",
+		"'" . addslashes($texte) ."'",
+		"'" . addslashes($adres) ."'"));
+}
+
+function ecrire_auteur_dyn($id_auteur, $mail, $sujet, $texte, $adres) {
+	global $flag_wordwrap, $spip_lang_rtl;
+	$puce_ligne = "<br /><img src='puce$spip_lang_rtl.gif' border='0' alt='-' /> ";
+
+	include_ecrire("inc_filtres.php3");
+
+	if ($texte) {
+		if ($sujet == "")
+			$erreur = _T('form_prop_indiquer_sujet');
+		else if (! email_valide($adres) )
+			$erreur = _T('form_prop_indiquer_email');
+		else if ($GLOBALS['valide_message_auteur']) {  // verifier hash ?
+			$texte .= "\n\n-- "._T('envoi_via_le_site')." ".lire_meta('nom_site')." (".lire_meta('adresse_site')."/) --\n";
+			include_ecrire("inc_mail.php3");
+			envoyer_mail(texte_script($email_auteur),
+				     $sujet, $texte, $adres,
+				"X-Originating-IP: ".$GLOBALS['REMOTE_ADDR']);
+			return $puce_ligne . _T('form_prop_message_envoye');
+		} else { //preview
+			if ($flag_wordwrap) $texte = wordwrap($texte);
+			$link = $GLOBALS['clean_link'];
+			$link->addVar('email_message_auteur', $adres);
+			$link->addVar('sujet_message_auteur', $sujet);
+			$link->addVar('texte_message_auteur', $texte);
+			$link->addVar('valide_message_auteur', 'oui');
+			return 
+			  "<br />"
+			  .  _T('form_prop_sujet')	
+			  .  " <b>"
+			  . entites_html($sujet)
+			  . "</b></div>" 
+			  .  "<pre>"
+			  . entites_html($texte)
+			  . "</pre>" 
+			  . $link->getForm('post') 
+			  .  "<div align=\"right\"><input type=\"submit\" class=\"spip_bouton\" value=\""
+			  . _T('form_prop_confirmer_envoi')
+			  . "\" />" 
+			  . "</form>";
+		}
+	}
+
+	if ($erreur) $res = $puce_ligne . $erreur . '<br /><br />&nbsp;';
+
+	$retour = $GLOBALS['REQUEST_URI'];
+	$link = $GLOBALS['clean_link'];
+	return $res
+	  . $link->getForm('post')
+	  ._T('form_pet_votre_email')."<br />" .
+	  "<input type=\"text\" class=\"forml\" name=\"email_message_auteur\" value=\"".entites_html($adres)."\" SIZE=\"30\" />\n" .
+	  "<p>"._T('form_prop_sujet')."<br />" .
+	  "<input type=\"text\" class=\"forml\" name=\"sujet_message_auteur\" value=\"".entites_html($sujet)."\" SIZE=\"30\" /></p>\n" .
+	  "<p><textarea name='texte_message_auteur' rows='10' class='forml' cols='40' wrap=soft>"
+	  .entites_html($texte)."</textarea></p>\n" .
+	  "<div align=\"right\"><input type=\"submit\"  class=\"spip_bouton\" value=\""._T('form_prop_envoyer')."\" /></div>" .
+	  "</form>";
+
+}
+
+?>
diff --git a/inc-formulaires.php3 b/inc-formulaires.php3
deleted file mode 100644
index f0c098f99a39b9f03f8686191adc811ba83ff79c..0000000000000000000000000000000000000000
--- a/inc-formulaires.php3
+++ /dev/null
@@ -1,573 +0,0 @@
-<?php
-
-//
-// Ce fichier ne sera execute qu'une fois
-if (defined("_INC_FORMULAIRES")) return;
-define("_INC_FORMULAIRES", "1");
-
-include_ecrire('inc_filtres.php3');
-include_ecrire('inc_lang.php3');	// pour lang_select
-
-function test_pass() {
-	include_ecrire("inc_acces.php3");
-	for (;;) {
-		$passw = creer_pass_aleatoire();
-		$query = "SELECT statut FROM spip_signatures WHERE statut='$passw'";
-		$result = spip_query($query);
-		if (!spip_num_rows($result)) break;
-	}
-	return $passw;
-}
-
-function test_login($mail) {
-	if (strpos($mail, "@") > 0) $login_base = substr($mail, 0, strpos($mail, "@"));
-	else $login_base = $mail;
-
-	$login_base = strtolower($login_base);
-	$login_base = ereg_replace("[^a-zA-Z0-9]", "", $login_base);
-	if (!$login_base) $login_base = "user";
-
-	for ($i = 0; ; $i++) {
-		if ($i) $login = $login_base.$i;
-		else $login = $login_base;
-		$query = "SELECT id_auteur FROM spip_auteurs WHERE login='$login'";
-		$result = spip_query($query);
-		if (!spip_num_rows($result)) break;
-	}
-
-	return $login;
-}
-
-function erreur($zetexte){
-	global $spip_lang_rtl;
- 	return "<br /><img src='puce$spip_lang_rtl.gif' border='0' alt='-' /> $zetexte";
-}
-
-
-//
-// Retour a l'ecran du lien de confirmation d'une signature de petition
-//
-
-function reponse_confirmation($id_article, $val_confirm) {
-
-	include(_FILE_CONNECT);
-	
-	if ($GLOBALS['db_ok']) {
-		include_ecrire("inc_texte.php3");
-		include_ecrire("inc_filtres.php3");
-
-		// Eviter les doublons
-		$lock = "petition $id_article $val_confirm";
-		if (!spip_get_lock($lock, 5)) {
-			$texte = _T('form_pet_probleme_technique');
-		}
-		else {
-			$query_sign = "SELECT * FROM spip_signatures WHERE statut='".addslashes($val_confirm)."'";
-			$result_sign = spip_query($query_sign);
-			if (spip_num_rows($result_sign) > 0) {
-				while($row = spip_fetch_array($result_sign)) {
-					$id_signature = $row['id_signature'];
-					$id_article = $row['id_article'];
-					$date_time = $row['date_time'];
-					$nom_email = $row['nom_email'];
-					$adresse_email = $row['ad_email'];
-					$nom_site = $row['nom_site'];
-					$url_site = $row['url_site'];
-					$message = $row['message'];
-					$statut = $row['statut'];
-				}
-	
-				$query_petition = "SELECT * FROM spip_petitions WHERE id_article=$id_article";
-				$result_petition = spip_query($query_petition);
-	
-				while ($row = spip_fetch_array($result_petition)) {
-					$id_article = $row['id_article'];
-					$email_unique = $row['email_unique'];
-					$site_obli = $row['site_obli'];
-					$site_unique = $row['site_unique'];
-					$message_petition = $row['message'];
-					$texte_petition = $row['texte'];
-				}
-	
-				if ($email_unique == "oui") {
-					$email = addslashes($adresse_email);
-					$query = "SELECT * FROM spip_signatures WHERE id_article=$id_article AND ad_email='$email' AND statut='publie'";
-					$result = spip_query($query);
-					if (spip_num_rows($result) > 0) {
-						$texte .= erreur(_T('form_pet_deja_signe'));
-						$refus = "oui";
-					}
-				}
-	
-				if ($site_unique == "oui") {
-					$site = addslashes($url_site);
-					$query = "SELECT * FROM spip_signatures WHERE id_article=$id_article AND url_site='$site' AND statut='publie'";
-					$result = spip_query($query);
-					if (spip_num_rows($result) > 0) {
-						$texte .= erreur(_T('form_pet_deja_enregistre'));
-						$refus = "oui";
-					}
-				}
-	
-				if ($refus == "oui") {
-					$texte .= erreur(_T('form_deja_inscrit'));
-				}
-				else {
-					$query = "UPDATE spip_signatures SET statut='publie' WHERE id_signature='$id_signature'";
-					$result = spip_query($query);
-					// invalider les pages ayant des boucles signatures
-					include_ecrire('inc_invalideur.php3');
-					suivre_invalideur("id='petition/petition'");
-	
-					$texte .= erreur(_T('form_pet_signature_validee'));
-				}
-			}
-			else {
-				$texte .= erreur(_T('form_pet_aucune_signature'));
-			}
-			spip_release_lock($lock);
-		}
-	}
-	else {
-		$texte = _T('form_pet_probleme_technique');
-	}
-
-	$texte = "<div class='reponse_formulaire'><a name='sp$id_article'></a>$texte</div>";
-
-	// message pour formulaire_signature()
-	define('_REPONSE_CONFIRMATION_SIGNATURE', $texte);
-
-}
-
-//
-// Retour a l'ecran de la signature d'une petition
-//
-
-function reponse_signature($id_article) {
-	global $nom_email, $adresse_email, $message, $nom_site, $url_site, $url_page;
-	spip_log("signature petition $id_article ($adresse_email)");
-	include(_FILE_CONNECT);
-	
-	if ($GLOBALS['db_ok']) {
-		include_ecrire("inc_texte.php3");
-		include_ecrire("inc_filtres.php3");
-		include_ecrire("inc_mail.php3");
-
-		// Eviter les doublons
-		$lock = "petition $id_article $adresse_email";
-		if (!spip_get_lock($lock, 5)) {
-			$reponse_signature = _T('form_pet_probleme_technique');
-		}
-		else {
-			$query_petition = "SELECT * FROM spip_petitions WHERE id_article=$id_article";
-			$result_petition = spip_query($query_petition);
-	
-			while ($row = spip_fetch_array($result_petition)) {
-				$id_article = $row['id_article'];
-				$email_unique = $row['email_unique'];
-				$site_obli = $row['site_obli'];
-				$site_unique = $row['site_unique'];
-				$message_petition = $row['message'];
-				$texte_petition = $row['texte'];
-			}
-	
-			if (strlen($nom_email) < 2) {
-				$reponse_signature .= erreur(_T('form_indiquer_nom'));
-				$refus = "oui";
-			}
-	
-			if ($adresse_email == _T('info_mail_fournisseur')) {
-				$reponse_signature .= erreur(_T('form_indiquer_email'));
-				$refus = "oui";
-			}
-	
-			if ($email_unique == "oui") {
-				$email = addslashes($adresse_email);
-				$query = "SELECT * FROM spip_signatures WHERE id_article=$id_article AND ad_email='$email' AND statut='publie'";
-				$result = spip_query($query);
-				if (spip_num_rows($result) > 0) {
-					$reponse_signature .= erreur(_T('form_pet_deja_signe'));
-					$refus = "oui";
-				}
-			}
-	
-			if (!email_valide($adresse_email)) {
-				$reponse_signature .= erreur(_T('form_email_non_valide'));
-				$refus = "oui";
-			}
-	
-			if ($site_obli == "oui") {
-				if (!$nom_site) {
-					$reponse_signature .= erreur(_T('form_indiquer_nom_site'));
-					$refus = "oui";
-				}
-				include_ecrire("inc_sites.php3");
-	
-				if (!recuperer_page($url_site)) {
-					$reponse_signature .= erreur(_T('form_pet_url_invalide'));
-					$refus = "oui";
-				}
-			}
-			if ($site_unique == "oui") {
-				$site = addslashes($url_site);
-				$query = "SELECT * FROM spip_signatures WHERE id_article=$id_article AND url_site='$site' AND (statut='publie' OR statut='poubelle')";
-				$result = spip_query($query);
-				if (spip_num_rows($result) > 0) {
-					$reponse_signature .= erreur(_T('form_pet_site_deja_enregistre'));
-					$refus = "oui";
-				}
-			}
-	
-			$passw = test_pass();
-	
-			if ($refus == "oui") {
-				$reponse_signature.= "<P><FONT COLOR='red'><B>"._T('form_pet_signature_pasprise')."</B></FONT><P>";
-			}
-			else {
-				$query_site = "SELECT titre FROM spip_articles WHERE id_article=$id_article";
-				$result_site = spip_query($query_site);
-				while ($row = spip_fetch_array($result_site)) {
-					$titre = $row['titre'];
-				}
-
-				$link = new Link($url_page);
-				$link->addVar('val_confirm', $passw);
-				$url = $link->getUrl("sp$id_article");
-	
-				$messagex = _T('form_pet_mail_confirmation', array('titre' => $titre, 'nom_email' => $nom_email, 'nom_site' => $nom_site, 'url_site' => $url_site, 'url' => $url));
-
-				if (envoyer_mail($adresse_email, _T('form_pet_confirmation')." ".$titre, $messagex)) {
-					$reponse_signature .= "<P><B>"._T('form_pet_envoi_mail_confirmation')."</B>";
-
-					$nom_email = addslashes($nom_email);
-					$adresse_email = addslashes($adresse_email);
-					$nom_site = addslashes($nom_site);
-					$url_site = addslashes($url_site);
-					$message = addslashes($message);
-	
-					$query = "INSERT INTO spip_signatures (id_article, date_time, nom_email, ad_email, nom_site, url_site, message, statut) ".
-						"VALUES ('$id_article', NOW(), '$nom_email', '$adresse_email', '$nom_site', '$url_site', '$message', '$passw')";
-					$result = spip_query($query);
-				}
-				else {
-					$reponse_signature = _T('form_pet_probleme_technique');
-				}
-			}
-			spip_release_lock($lock);
-		}
-	}
-	else {
-		$reponse_signature = _T('form_pet_probleme_technique');
-	}
-	return  "<div class='reponse_formulaire'><a name='sp$id_article'></a>$reponse_signature</div>";
-}
-
-//
-// Formulaire de signature d'une petition
-//
-
-function formulaire_signature_normal($id_article, $row_petition) {
-	include_ecrire("inc_texte.php3");
-	include_ecrire("inc_mail.php3");
-
-
-		$id_article = $row_petition['id_article'];
-		$email_unique = $row_petition['email_unique'];
-		$site_obli = $row_petition['site_obli'];
-		$site_unique = $row_petition['site_unique'];
-		$message_petition = $row_petition['message'];
-		$texte_petition = $row_petition['texte'];
-
-		$link = new Link;
-		$url = lire_meta("adresse_site").'/'.$link->getUrl();
-		$link->addVar('url_page', $url);
-		$retour .= $link->getForm('post', "sp$id_article");
-
-		$retour .= propre($texte_petition);
-
-		$retour .= "<div><a name='sp$id_article'></a><fieldset><p><b>"._T('form_pet_votre_nom')."</b><br />";
-		$retour .= "<input type=\"text\" class=\"forml\" name=\"nom_email\" value=\"\" size=\"20\" /></p>";
-
-		$retour .= "<p><b>"._T('form_pet_votre_email')."</b><br />";
-		$retour .= "<input type=\"text\" class=\"forml\" name=\"adresse_email\" value=\"\" size=\"20\" /></p></fieldset>";
-
-		$retour .= "<br /><fieldset><p>";
-		if ($site_obli != "oui") {
-			$retour .= _T('form_pet_votre_site')."<br />";
-		}
-		$retour .= "<b>"._T('form_pet_nom_site2')."</b><br />";
-		$retour .= "<input type=\"text\" class=\"forml\" name=\"nom_site\" value=\"\" size=\"20\" /></p>";
-
-		$retour .= "<p><b>"._T('form_pet_adresse_site')."</b><br />";
-		$retour .= "<input type=\"text\" class=\"forml\" name=\"url_site\" value=\"http://\" size=\"20\" /></p></fieldset>";
-
-		if ($message_petition == "oui") {
-			$retour .= "<br /><fieldset>";
-
-			$retour .= "<b>"._T('form_pet_message_commentaire')."</b><br />";
-			$retour .= "<textarea name=\"message\" rows=\"3\" class=\"forml\" cols=\"20\" wrap='soft'>";
-			$retour .= "</textarea></fieldset>\n";
-		}
-		else {
-			$retour .= "<input type=\"hidden\" name=\"message\" value=\"\" />";
-		}
-		$retour .= "</div>";
-
-		$retour .= "<br /><div align=\"right\"><input type=\"submit\" name=\"Valider\" class=\"spip_bouton\" value=\""._T('bouton_valider')."\" />";
-		$retour .= "</div></form>\n";
-
-	return $retour;
-}
-
-// Aiguillage sur traitement de signature
-
-function formulaire_signature($id_article,$petition_s) {
-	lang_select($GLOBALS['spip_lang']); 
-	if ($GLOBALS['val_confirm'])
-		$return= _REPONSE_CONFIRMATION_SIGNATURE;	// geree par inc-public.php3
-	else if ($GLOBALS['nom_email'] AND $GLOBALS['adresse_email'])
-		$return= reponse_signature($id_article);
-	else
-		if ($petition = unserialize($petition_s))
-			$return= formulaire_signature_normal($id_article,$petition);
-		else $return='';
-	lang_dselect();
-	return $return;
-}
-
-// inscrire les visiteurs dans l'espace public (statut 6forum) ou prive (statut nouveau->1comite)
-// on n'est plus tres loin de faire de cette fonction un squelette.
-
-function formulaire_inscription($type) {
-	lang_select($GLOBALS['spip_lang']);
-	switch (status_inscription($type)) {
-		case 1: $res = '';
-			break;
-		case 2: $res = '';
-			break;
-		case 3:
-			$res = "<div class='reponse_formulaire'><b>" .
-			  _T('form_forum_identifiant_mail') .
-			  "</b></div>";
-			break;
-		case 4:
-			$res = "<div class='reponse_formulaire'><b>" .
-			  _T('form_forum_probleme_mail') .
-			  "</b></div>";
-			break;
-		case 5:
-			$res = "<div class='reponse_formulaire'><b>" .
-			  _T('form_forum_access_refuse')."</b>" .
-			  "</b></div>";
-			break;
-		case 6:
-			$res = "<div class='reponse_formulaire'><b>" .
-			  _T('form_forum_email_deja_enregistre') .
-			  "</b></div>";
-			break;
-		case 7:
-		  {
-			$link = new Link;
-			$url = $link->getUrl();
-			$url = quote_amp($url);
-			$res =  _T('form_forum_indiquer_nom_email') .
-			  "<form method='get' action='$url' style='border: 0px; margin: 0px;'>\n" .
-			  "<div><b>"._T('form_pet_votre_nom')."</b></div>" .
-			  "<div><input type=\"text\" class=\"forml\" name=\"nom_inscription\" value=\"\" size=\"30\" /></div>" .
-			  "<div><b>"._T('form_pet_votre_email')."</b></div>" .
-			  "<div><input type=\"text\" class=\"forml\" name=\"mail_inscription\" value=\"\" size=\"30\" /></div>" .
-			  "<div align=\"right\"><input type=\"submit\" name=\"Valider\" class=\"spip_bouton\" value=\""._T('bouton_valider')."\" /></div>" .
-			  "</form>";
-			break;
-		  }
-	}
-	lang_dselect();
-	return $res;
-}
-
-function status_inscription($type) {
-
-	if ($type == 'redac') {
-		if (lire_meta("accepter_inscriptions") != "oui") return 1;
-		$statut = "nouveau";
-	}
-	else if ($type == 'forum') {
-		$statut = "6forum";
-	}
-	else return 2; // tentative de hack...?
-
-	global $mail_inscription, $nom_inscription;
-
-	if ($mail_inscription && $nom_inscription) {
-		include(_FILE_CONNECT);
-		// envoyer les identifiants si l'abonne n'existe pas déjà.
-		if (!$row = spip_fetch_array(spip_query("SELECT statut, id_auteur, login, pass FROM spip_auteurs WHERE email='".addslashes($mail_inscription)."' LIMIT 1")))
-		  {
-			include_ecrire("inc_acces.php3");
-			$pass = creer_pass_aleatoire(8, $mail_inscription);
-			$login = test_login($mail_inscription);
-			$mdpass = md5($pass);
-			$htpass = generer_htpass($pass);
-			$r = spip_insert('spip_auteurs', 
-					 '(nom, email, login, pass, statut, htpass)',
-					 "('".addslashes($nom_inscription)."',  '".addslashes($mail_inscription)."', '$login', '$mdpass', '$statut', '$htpass')");
-			ecrire_acces();
-			return envoyer_inscription($mail_inscription, $statut, $type, $login, $pass);
-		  } 
-
-		else {
-		  // existant mais encore muet, renvoyer les infos
-			if ($row['statut'] == 'nouveau') {
-			  return (envoyer_inscription($mail_inscription, $row['statut'], $type, $row['login'], $row['pass']));
-			} else {
-				if ($row['statut'] == '5poubelle')
-		  // dead
-				  return 5;
-				else  
-		  // deja inscrit
-				  return 6;
-			}
-		}
-	}
-	// demande du formulaire
-	else return 7;
-}
-
-	// envoyer identifiants par mail
-function envoyer_inscription($mail, $statut, $type, $pass, $login) {
-	$nom_site_spip = lire_meta("nom_site");
-	$adresse_site = lire_meta("adresse_site");
-	
-	$message = _T('form_forum_message_auto')."\n\n"._T('form_forum_bonjour')."\n\n";
-	if ($type == 'forum') {
-		$message .= _T('form_forum_voici1', array('nom_site_spip' => $nom_site_spip, 'adresse_site' => $adresse_site)) . "\n\n";
-	} else {
-		$message .= _T('form_forum_voici2', array('nom_site_spip' => $nom_site_spip, 'adresse_site' => $adresse_site)) . "\n\n";
-	}
-	$message .= "- "._T('form_forum_login')." $login\n";
-	$message .= "- "._T('form_forum_pass')." $pass\n\n";
-
-	include_ecrire("inc_mail.php3");
-	if (envoyer_mail($mail, "[$nom_site_spip] "._T('form_forum_identifiants'), $message))
-	  return 3;
-	else
-	  return 4;
-}
-		
-
-function formulaire_site($la_rubrique) {
-  include_ecrire("inc_mail.php3");
-  lang_select($GLOBALS['spip_lang']);
-
-	global $nom_site;
-	global $url_site;
-	global $description_site;
-
-	if ($nom_site) {
-		// Tester le nom du site
-		if (strlen ($nom_site) < 2){
-			$reponse_signature .= erreur(_T('form_prop_indiquer_nom_site'));
-			$refus = "oui";
-		}
-
-		// Tester l'URL du site
-		include_ecrire("inc_sites.php3");
-		if (!recuperer_page($url_site)) {
-			$reponse_signature .= erreur(_T('form_pet_url_invalide'));
-			$refus = "oui";
-		}
-
-		// Integrer a la base de donnees
-		
-		if ($refus !="oui"){
-			$nom_site = addslashes($nom_site);
-			$url_site = addslashes($url_site);
-			$description_site = addslashes($description_site);
-			
-			spip_query("INSERT INTO spip_syndic (nom_site, url_site, id_rubrique, descriptif, date, date_syndic, statut, syndication) ".
-				   "VALUES ('$nom_site', '$url_site', $la_rubrique, '$description_site', NOW(), NOW(), 'prop', 'non')");
-			$res =  _T('form_prop_enregistre');
-		}
-		else {
-			$res = $reponse_signature .
-			  "<p> "._T('form_prop_non_enregistre') . "</p>";
-		}
-		
-		$res = "<div class='reponse_formulaire'>$res</div>";
-	}
-	else {
-		$link = $GLOBALS['clean_link'];
-		$res = $link->getForm('POST') .
-		  "<p><div class='spip_encadrer'><b>"._T('form_prop_nom_site')."</b><br />" .
-		  "<input type=\"text\" class=\"forml\" name=\"nom_site\" value=\"\" size=\"30\">" .
-		  "</p><p><b>"._T('form_prop_url_site')."</b></p><br />" .
-		  "<input type=\"text\" class=\"forml\" name=\"url_site\" value=\"\" size=\"30\"></div>" .
-		  "<p><b>"._T('form_prop_description')."</b></p><br />" .
-		  "<textarea name='description_site' rows='5' class='forml' cols='40' wrap=soft></textarea>" .
-		  "<div align=\"right\"><input type=\"submit\" name=\"valider\" class=\"spip_bouton\" value=\""._t('bouton_valider')."\">" .
-		  "</div></form>";
-		}
-	lang_dselect();
-	return $res;
-}
-
-function formulaire_ecrire_auteur($id_auteur, $email_auteur) {
-	global $flag_wordwrap;
-
-	include_ecrire("inc_texte.php3");
-	include_ecrire("inc_filtres.php3");
-	include_ecrire("inc_mail.php3");
-
-	lang_select($GLOBALS['spip_lang']);
-	$affiche_formulaire = true;
-	if ($GLOBALS['texte_message_auteur'.$id_auteur]) {
-		if ($GLOBALS['sujet_message_auteur'.$id_auteur] == "")
-			$erreur .= erreur(_T('form_prop_indiquer_sujet'));
-		else if (! email_valide($GLOBALS['email_message_auteur'.$id_auteur]) )
-			$erreur .= erreur(_T('form_prop_indiquer_email'));
-		else if ($GLOBALS['valide_message_auteur'.$id_auteur]) {  // verifier hash ?
-			$GLOBALS['texte_message_auteur'.$id_auteur] .= "\n\n-- "._T('envoi_via_le_site')." ".lire_meta('nom_site')." (".lire_meta('adresse_site')."/) --\n";
-			envoyer_mail($email_auteur,
-				$GLOBALS['sujet_message_auteur'.$id_auteur],
-				$GLOBALS['texte_message_auteur'.$id_auteur], $GLOBALS['email_message_auteur'.$id_auteur],
-				"X-Originating-IP: ".$GLOBALS['REMOTE_ADDR']);
-			$erreur .= erreur(_T('form_prop_message_envoye'));
-			$affiche_formulaire = false;
-		} else { //preview
-			$res = "<br /><div class='spip_encadrer'>"._T('form_prop_sujet')." <b>".entites_html($GLOBALS['sujet_message_auteur'.$id_auteur])."</b></div>";
-			if ($flag_wordwrap)
-				$GLOBALS['texte_message_auteur'.$id_auteur] = wordwrap($GLOBALS['texte_message_auteur'.$id_auteur]);
-			$res .= "<pre>".entites_html($GLOBALS['texte_message_auteur'.$id_auteur])."</pre>";
-			$affiche_formulaire = false;
-			$link = $GLOBALS['clean_link'];
-			$link->addVar('email_message_auteur'.$id_auteur, $GLOBALS['email_message_auteur'.$id_auteur]);
-			$link->addVar('sujet_message_auteur'.$id_auteur, $GLOBALS['sujet_message_auteur'.$id_auteur]);
-			$link->addVar('texte_message_auteur'.$id_auteur, $GLOBALS['texte_message_auteur'.$id_auteur]);
-			$link->addVar('valide_message_auteur'.$id_auteur, 'oui');
-			$res .= $link->getForm('post') .
-			  "<div align=\"right\"><input type=\"submit\" name=\"Confirmer\" class=\"spip_bouton\" value=\""._T('form_prop_confirmer_envoi')."\" />" .
-			  "</div></form>";
-		}
-	}
-
-	if ($erreur)
-		$res = "<div class='spip_encadrer'><b>$erreur<br />&nbsp;</b></div>\n";
-
-	if ($affiche_formulaire) {
-		$retour = $GLOBALS['REQUEST_URI'];
-		$link = $GLOBALS['clean_link'];
-		$res .= $link->getForm('post') .
-		  "<div class='spip_encadrer'><b>"._T('form_pet_votre_email')."</b><br />" .
-		  "<input type=\"text\" class=\"forml\" name=\"email_message_auteur$id_auteur\" value=\"".entites_html($GLOBALS['email_message_auteur'.$id_auteur])."\" SIZE=\"30\" />\n" .
-		  "<p><b>"._T('form_prop_sujet')."</b><br />" .
-		  "<input type=\"text\" class=\"forml\" name=\"sujet_message_auteur$id_auteur\" value=\"".entites_html($GLOBALS['sujet_message_auteur'.$id_auteur])."\" SIZE=\"30\" /></p>\n" .
-		  "<p><textarea name='texte_message_auteur$id_auteur' rows='10' class='forml' cols='40' wrap=soft>".entites_html($GLOBALS['texte_message_auteur'.$id_auteur])."</textarea></p>\n" .
-		  "<div align=\"right\"><input type=\"submit\" name=\"Valider\" class=\"spip_bouton\" value=\""._T('form_prop_envoyer')."\" /></div>" .
-		  "</div></form>";
-	}
-	lang_dselect();
-	return $res;
-}
-
-
-?>
diff --git a/inc-forum.php3 b/inc-forum.php3
index af2812be3da8abcec42dab999f4c51f500f3fec2..dab47f072bf3a88ffea975d8162ee309fd40f835 100644
--- a/inc-forum.php3
+++ b/inc-forum.php3
@@ -280,25 +280,8 @@ function code_invalideur_forums($p, $code) {
 				"?'':\n" . $code .")";
 }
 
-
-// Formulaire de reponse a un forum
-function balise_FORMULAIRE_FORUM_dist($p) {
-	$code = "code_de_forum_spip(" .
-	champ_sql('id_rubrique', $p) . ', ' .
-	champ_sql('id_forum', $p) . ', ' .
-	champ_sql('id_article', $p) . ', ' .
-	champ_sql('id_breve', $p) . ', ' .
-	champ_sql('id_syndic', $p) . ')';
-
-	$p->code = code_invalideur_forums($p, "(".$code.")");
-
-	$p->statut = 'php';
-	return $p;
-}
-
-
 // Parametres de reponse a un forum
-function balise_PARAMETRES_FORUM_dist($p) {
+function calculer_balise_parametres($p) {
 	$_accepter_forum = champ_sql('accepter_forum', $p);
 	$p->code = '
 	// refus des forums ?
@@ -344,14 +327,32 @@ function balise_PARAMETRES_FORUM_dist($p) {
 /*******************************************************/
 /* FONCTIONS DE CALCUL DES DONNEES DU FORMULAIRE FORUM */
 /*******************************************************/
-function code_de_forum_spip ($idr, $idf, $ida, $idb, $ids) {
 
-	// recuperer les donnees du forum auquel on repond, false = forum interdit
-	if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
-		return false;
+global $forum_array;
+$forum_array = array('id_rubrique', 'id_forum', 'id_article', 'id_breve', 'id_syndic');
+
+function forum_stat($args, $filtres)
+{
+  list ($idr, $idf, $ida, $idb, $ids) = $args;
+  include_local("inc-forum.php3");
+  // recuperer les donnees du forum auquel on repond, false = forum interdit
+  if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
+    return '';
+  return 
+    array("'"
+	  . str_replace('\'', '\\\'', 
+			str_replace('\\', '\\\\', serialize($args)))
+	  . "'",
+	  "'"
+	  . str_replace('\'', '\\\'', 
+			str_replace('\\', '\\\\', serialize($r)))
+	  . "'");
+}
 
-	list($titre, $table, $accepter_forum) = $r;
+function forum_dyn($args, $donnees_forum) {
 
+  list ($idr, $idf, $ida, $idb, $ids) = unserialize($args);
+  list($titre, $table, $accepter_forum) = unserialize($donnees_forum);
 	// titre propose pour la reponse
 	$titre = '> '.supprimer_numero(ereg_replace('^[>[:space:]]*', '',$titre));
 
@@ -380,30 +381,20 @@ function code_de_forum_spip ($idr, $idf, $ida, $idb, $ids) {
 	    $retour_forum = $url;
 	}
 
-
+	// verifier l'identite des posteurs pour les forums sur abo
+	if (($accepter_forum == "abo") && (!$GLOBALS["auteur_session"]))
+	  return login_pour_tous($url, false, true, $url);
+	else
 	// debut formulaire forum
-	$lacible = "
-	include_local('inc-forum.php3');
-	lang_select(\$GLOBALS['spip_lang']);
-	echo retour_forum('$idr','$idf','$ida','$idb','$ids','".
-	  texte_script($titre).
-	  "','".$table."', '".$accepter_forum."', '".$url."', \"
-	<input type='hidden' name='retour' value='".$retour_forum."' />
+	 return retour_forum($idr,$idf,$ida,$idb,$ids,
+			     texte_script($titre),
+		      $table,
+		      $accepter_forum,
+		      $url,
+		      "<input type='hidden' name='retour' value='".$retour_forum."' />
 	<input type='hidden' name='ajout_forum' value='oui' />
 	" .
-	  (($accepter_forum != 'pri') ? '' : (_T('forum_info_modere'). '<p>')) . 
-	  "\"); lang_dselect();";
-
-	// verifier l'identite des posteurs pour les forums sur abo
-	if ($accepter_forum == "abo")
-		$lacible = "
-		if (\$GLOBALS[\"auteur_session\"]) {\n$lacible
-		} else {
-			include_local('inc-login.php3'); 
-			login_pour_tous('$url', false, true, '$url');
-		}";
-
-	return "<" . "?php" . $lacible . "?" . ">";
+		      (($accepter_forum != 'pri') ? '' : (_T('forum_info_modere'). '<p>')));
 }
 
 //
diff --git a/inc-inscription.php3 b/inc-inscription.php3
new file mode 100644
index 0000000000000000000000000000000000000000..452aa0b1c626db9b8b2c93de772364a64b8424b4
--- /dev/null
+++ b/inc-inscription.php3
@@ -0,0 +1,125 @@
+<?php
+
+global $inscription_array;
+$inscription_array = array();
+
+function inscription_stat($args, $filtres)
+{
+  return ((lire_meta('activer_moteur') != 'oui') ? '' :
+	  array("'redac'"));
+}
+
+function inscription_dyn($type) {
+	switch (status_inscription($type)) {
+		case 1: return '';
+		case 2: return '';
+		case 3: return "<div class='reponse_formulaire'><b>" ._T('form_forum_identifiant_mail') . "</b></div>";
+		case 4: return "<div class='reponse_formulaire'><b>" ._T('form_forum_probleme_mail')  . "</b></div>";
+		case 5: return "<div class='reponse_formulaire'><b>" ._T('form_forum_access_refuse')  . "</b></div>";
+		case 6: return "<div class='reponse_formulaire'><b>" ._T('form_forum_email_deja_enregistre')  . "</b></div>";
+		case 7: 
+
+			$link = new Link;
+			$url = $link->getUrl();
+			$url = quote_amp($url);
+			return  _T('form_forum_indiquer_nom_email') .
+			  "<form method='get' action='$url' style='border: 0px; margin: 0px;'>\n" .
+			  "<div><b>"._T('form_pet_votre_nom')."</b></div>" .
+			  "<div><input type=\"text\" class=\"forml\" name=\"nom_inscription\" value=\"\" size=\"30\" /></div>" .
+			  "<div><b>"._T('form_pet_votre_email')."</b></div>" .
+			  "<div><input type=\"text\" class=\"forml\" name=\"mail_inscription\" value=\"\" size=\"30\" /></div>" .
+			  "<div align=\"right\"><input type=\"submit\" name=\"Valider\" class=\"spip_bouton\" value=\""._T('bouton_valider')."\" /></div>" .
+			  "</form>";
+	}
+}
+
+function status_inscription($type) {
+
+	if ($type == 'redac') {
+		if (lire_meta("accepter_inscriptions") != "oui") return 1;
+		$statut = "nouveau";
+	}
+	else if ($type == 'forum') {
+		$statut = "6forum";
+	}
+	else return 2; // tentative de hack...?
+
+	global $mail_inscription, $nom_inscription;
+
+	if ($mail_inscription && $nom_inscription) {
+		include(_FILE_CONNECT);
+		// envoyer les identifiants si l'abonne n'existe pas déjà.
+		if (!$row = spip_fetch_array(spip_query("SELECT statut, id_auteur, login, pass FROM spip_auteurs WHERE email='".addslashes($mail_inscription)."' LIMIT 1")))
+		  {
+			include_ecrire("inc_acces.php3");
+			$pass = creer_pass_aleatoire(8, $mail_inscription);
+			$login = test_login($mail_inscription);
+			$mdpass = md5($pass);
+			$htpass = generer_htpass($pass);
+			$r = spip_insert('spip_auteurs', 
+					 '(nom, email, login, pass, statut, htpass)',
+					 "('".addslashes($nom_inscription)."',  '".addslashes($mail_inscription)."', '$login', '$mdpass', '$statut', '$htpass')");
+			ecrire_acces();
+			return envoyer_inscription($mail_inscription, $statut, $type, $login, $pass);
+		  } 
+
+		else {
+		  // existant mais encore muet, renvoyer les infos
+			if ($row['statut'] == 'nouveau') {
+			  return (envoyer_inscription($mail_inscription, $row['statut'], $type, $row['login'], $row['pass']));
+			} else {
+				if ($row['statut'] == '5poubelle')
+		  // dead
+				  return 5;
+				else  
+		  // deja inscrit
+				  return 6;
+			}
+		}
+	}
+	// demande du formulaire
+	else return 7;
+}
+
+	// envoyer identifiants par mail
+function envoyer_inscription($mail, $statut, $type, $pass, $login) {
+	$nom_site_spip = lire_meta("nom_site");
+	$adresse_site = lire_meta("adresse_site");
+	
+	$message = _T('form_forum_message_auto')."\n\n"._T('form_forum_bonjour')."\n\n";
+	if ($type == 'forum') {
+		$message .= _T('form_forum_voici1', array('nom_site_spip' => $nom_site_spip, 'adresse_site' => $adresse_site)) . "\n\n";
+	} else {
+		$message .= _T('form_forum_voici2', array('nom_site_spip' => $nom_site_spip, 'adresse_site' => $adresse_site)) . "\n\n";
+	}
+	$message .= "- "._T('form_forum_login')." $login\n";
+	$message .= "- "._T('form_forum_pass')." $pass\n\n";
+
+	include_ecrire("inc_mail.php3");
+	if (envoyer_mail($mail, "[$nom_site_spip] "._T('form_forum_identifiants'), $message))
+	  return 3;
+	else
+	  return 4;
+}
+
+
+function test_login($mail) {
+	if (strpos($mail, "@") > 0) $login_base = substr($mail, 0, strpos($mail, "@"));
+	else $login_base = $mail;
+
+	$login_base = strtolower($login_base);
+	$login_base = ereg_replace("[^a-zA-Z0-9]", "", $login_base);
+	if (!$login_base) $login_base = "user";
+
+	for ($i = 0; ; $i++) {
+		if ($i) $login = $login_base.$i;
+		else $login = $login_base;
+		$query = "SELECT id_auteur FROM spip_auteurs WHERE login='$login'";
+		$result = spip_query($query);
+		if (!spip_num_rows($result)) break;
+	}
+
+	return $login;
+}
+
+?>
diff --git a/inc-login.php3 b/inc-login.php3
index 6bfa159647dc44f0c8978cc4515e59405875a9f0..c448bd37ecacc63e8d3c6e00fa72958939bcc929 100644
--- a/inc-login.php3
+++ b/inc-login.php3
@@ -5,12 +5,10 @@
 if (defined("_INC_LOGIN")) return;
 define("_INC_LOGIN", "1");
 
-
 include_ecrire("inc_meta.php3");
 include_ecrire("inc_session.php3");
 include_ecrire("inc_filtres.php3");
 include_ecrire("inc_texte.php3");
-include_local("inc-formulaires.php3");
 
 // gerer l'auth http
 function auth_http($url, $essai_auth_http) {
@@ -63,7 +61,7 @@ function login($cible, $prive = 'prive') {
 		echo "<a href='$cible'>"._T('login_par_ici')."</a>\n";
 		return;
 	}
-	login_pour_tous($cible, $prive, '', $action);
+	echo login_pour_tous($cible, $prive, '', $action);
 }
 
 
@@ -126,20 +124,20 @@ function login_pour_tous($cible, $prive, $message, $action) {
 		// login inconnu (sauf LDAP) ou refuse
 		if ($statut_login == -1 OR ($statut_login == 0 AND !$flag_autres_sources)) {
 			$erreur = _T('login_identifiant_inconnu', array('login' => htmlspecialchars($login)));
-			$login = '';
+ 			$login = '';
 			@spip_setcookie("spip_admin", "", time() - 3600);
 		}
 	}
 
 	if ($echec_cookie == "oui") {
-	  echo "<div><h3 class='spip'>",
-	    (_T('erreur_probleme_cookie')),
-	    '</h3><div style="font-family: Verdana,arial,helvetica,sans-serif; font-size: 12px;"><p /><b>' .
+	  $res = "<div><h3 class='spip'>" .
+	    (_T('erreur_probleme_cookie')) .
+	    '</h3><div style="font-family: Verdana, arial,helvetica,sans-serif; font-size: 12px;"><p /><b>' .
 	    _T('login_cookie_oblige')."</b> " .
 	    _T('login_cookie_accepte')."\n";
 	}
 	else {
-		echo '<div><div style="font-family: Verdana,arial,helvetica,sans-serif; font-size: 12px;">',
+		$res = '<div><div style="font-family: Verdana,arial,helvetica,sans-serif; font-size: 12px;">' .
 		  (!$message ? '' :
 		   ("<br />" . 
 		    _T("forum_vous_enregistrer") . 
@@ -165,73 +163,73 @@ function login_pour_tous($cible, $prive, $message, $action) {
 				this.next_session_password_md5.value = calcMD5(\"$alea_futur\" + this.session_password.value);
 				this.session_password.value = \"\";
 			}'");
-			echo http_script('', _DIR_INCLUDE . 'md5.js');
+			$res .= http_script('', _DIR_INCLUDE . 'md5.js');
 		}
-		echo "<form name='form_login' action='spip_cookie.php3' method='post'",
-		  $challenge,
-		  ">\n",
-		  "<input type='hidden' name='session_login_hidden' value='$login' />\n",
-		  "<div class='spip_encadrer' style='text-align:".$GLOBALS["spip_lang_left"].";'>\n",
-		  (!$erreur ? '' : "<div class='reponse_formulaire'><b>$erreur</b></div>\n"),
+		$res .= "<form name='form_login' action='spip_cookie.php3' method='post'" .
+		  $challenge .
+		  ">\n" .
+		  "<input type='hidden' name='session_login_hidden' value='$login' />\n" .
+		  "<div class='spip_encadrer' style='text-align:".$GLOBALS["spip_lang_left"].";'>\n" .
+		  (!$erreur ? '' : "<div class='reponse_formulaire'><b>$erreur</b></div>\n") .
 		  (!$challenge ? $session :
 		   http_script("document.write('".addslashes(_T('login_login'))." <b>$login</b><br /><a href=\"spip_cookie.php3?cookie_admin=non&amp;url=".rawurlencode($action)."\"><font size=\"2\">["._T('login_autre_identifiant')."]</font></a>');",
 			       '',
 				"<font face='Georgia, Garamond, Times, serif' size='3'>" .
 				_T('login_non_securise') .
-			       "\n<a href=\"".quote_amp($action)."\">"._T('login_recharger')."</a>.\n</font>$session")),
-		  "\n<p /><label><b>"._T('login_pass2')."</b><br /></label>",
-		  "<input type='password' name='session_password' class='forml' value=\"\" size='40' />\n",
-		  "<input type='hidden' name='essai_login' value='oui' />\n",
-		  "<br />&nbsp;&nbsp;&nbsp;&nbsp;<input type='checkbox' name='session_remember' value='oui' id='session_remember'$rester_checked /> ",
-		  "<label for='session_remember'>",
-		  _T('login_rester_identifie'),
-		  "</label>",
-		  "<input type='hidden' name='url' value='$cible' />\n",
-		  "<input type='hidden' name='session_password_md5' value='' />\n",
-		  "<input type='hidden' name='next_session_password_md5' value='' />\n",
-		  "<div align='right'><input type='submit' class='spip_bouton' value='"._T('bouton_valider')."' /></div>\n",
-		  "</div>",
+			       "\n<a href=\"".quote_amp($action)."\">"._T('login_recharger')."</a>.\n</font>$session")) .
+		  "\n<p /><label><b>"._T('login_pass2')."</b><br /></label>" .
+		  "<input type='password' name='session_password' class='forml' value=\"\" size='40' />\n" .
+		  "<input type='hidden' name='essai_login' value='oui' />\n" .
+		  "<br />&nbsp;&nbsp;&nbsp;&nbsp;<input type='checkbox' name='session_remember' value='oui' id='session_remember'$rester_checked /> " .
+		  "<label for='session_remember'>" .
+		  _T('login_rester_identifie') .
+		  "</label>" .
+		  "<input type='hidden' name='url' value='$cible' />\n" .
+		  "<input type='hidden' name='session_password_md5' value='' />\n" .
+		  "<input type='hidden' name='next_session_password_md5' value='' />\n" .
+		  "<div align='right'><input type='submit' class='spip_bouton' value='"._T('bouton_valider')."' /></div>\n" .
+		  "</div>" .
 		  "</form>";
 	}
 	else { // demander seulement le login
 		$action = quote_amp($action);
-		echo "<form name='form_login' action='$action' method='post'>\n",
+		$res .= "<form name='form_login' action='$action' method='post'>\n" .
 		  "<div class='spip_encadrer' style='text-align:".$GLOBALS["spip_lang_left"].";'>";
-		if ($erreur) echo "<span style='color:red;'><b>$erreur</b></span><p />";
-		echo
-		  "<label><b>"._T('login_login2')."</b><br /></label>",
-		  "<input type='text' name='var_login' class='forml' value=\"\" size='40' />\n",
-		  "<input type='hidden' name='var_url' value='$cible' />\n",
-		  "<div align='right'><input type='submit' class='spip_bouton' value='"._T('bouton_valider')."'/></div>\n",
-		  "</div>",
+		if ($erreur) $res .= "<span style='color:red;'><b>$erreur</b></span><p />";
+		$res .=
+		  "<label><b>"._T('login_login2')."</b><br /></label>" .
+		  "<input type='text' name='var_login' class='forml' value=\"\" size='40' />\n" .
+		  "<input type='hidden' name='var_url' value='$cible' />\n" .
+		  "<div align='right'><input type='submit' class='spip_bouton' value='"._T('bouton_valider')."'/></div>\n" .
+		  "</div>" .
 		  "</form>";
 	}
 
 	// Gerer le focus
-	echo http_script($login ?
+	$res .= http_script($login ?
 			 'document.form_login.session_password.focus();' :
 			 'document.form_login.var_login.focus();');
 
 	if ($echec_cookie == "oui" AND $php_module AND !$ignore_auth_http) {
-		echo "<form action='spip_cookie.php3' method='get'>";
-		echo "<fieldset>\n<p>";
-		echo _T('login_preferez_refuser')." \n";
-		echo "<input type='hidden' name='essai_auth_http' value='oui'/> ";
-		echo "<input type='hidden' name='url' value='$cible'/>\n";
-		echo "<div align='right'><input type='submit' class='spip_bouton' value='"._T('login_sans_cookiie')."'/></div>\n";
-		echo "</fieldset></form>\n";
+		$res .= "<form action='spip_cookie.php3' method='get'>";
+		$res .= "<fieldset>\n<p>";
+		$res .= _T('login_preferez_refuser')." \n";
+		$res .= "<input type='hidden' name='essai_auth_http' value='oui'/> ";
+		$res .= "<input type='hidden' name='url' value='$cible'/>\n";
+		$res .= "<div align='right'><input type='submit' class='spip_bouton' value='"._T('login_sans_cookiie')."'/></div>\n";
+		$res .= "</fieldset></form>\n";
 	}
 
-	echo "\n<div align='center' style='font-size: 12px;' >"; // debut du pied de login
+	$res .= "\n<div align='center' style='font-size: 12px;' >"; // debut du pied de login
 
 	if ((lire_meta("accepter_inscriptions") == "oui") OR
 	    (!$prive AND (lire_meta('forums_publics') == 'abo')))
-		echo " [<a $pass_popup>" . _T('login_sinscrire').'</a>]';
+		$res .= " [<a $pass_popup>" . _T('login_sinscrire').'</a>]';
 
 	// bouton oubli de mot de passe
 	include_ecrire("inc_mail.php3");
 	if (tester_mail()) {
-		echo ' [<a href="spip_pass.php3?oubli_pass=oui" target="spip_pass" onclick="'
+		$res .= ' [<a href="spip_pass.php3?oubli_pass=oui" target="spip_pass" onclick="'
 			."javascript:window.open(this.href, 'spip_pass', 'scrollbars=yes, resizable=yes, width=480, height=280'); return false;\">"
 			._T('login_motpasseoublie').'</a>]';
 	}
@@ -240,12 +238,12 @@ function login_pour_tous($cible, $prive, $message, $action) {
 	if ($prive) {
 	  $url_site = lire_meta('adresse_site');
 	  if (!$url_site) $url_site = "./";
-	  echo " [<a href='$url_site'>"._T('login_retoursitepublic')."</a>]";
+	  $res .= " [<a href='$url_site'>"._T('login_retoursitepublic')."</a>]";
 	}
 
-	echo "</div>\n";
+	$res .= "</div>\n";
 
-	echo  "</div></div>";
+	return $res .  "</div></div>";
 
 }
 
diff --git a/inc-public.php3 b/inc-public.php3
index 4c8fec59b169dec145ff33e3fc54914b8630c932..8640066e300ab9c4321facac4c4df3fd1208a971 100644
--- a/inc-public.php3
+++ b/inc-public.php3
@@ -55,7 +55,7 @@ else {
 		// il nous faut id_article ! C'est donc encore a nettoyer...
 		include_local('inc-calcul.php3');
 		calculer_contexte();
-		include_local('inc-formulaires.php3');
+		include_local('inc-signature.php3');
 		reponse_confirmation($id_article, $val_confirm);
 	}
 
@@ -77,6 +77,7 @@ else {
 	$affiche_boutons_admin = (!$flag_preserver
 		AND ($HTTP_COOKIE_VARS['spip_admin']
 			OR $HTTP_COOKIE_VARS['spip_debug']));
+
 	if ($affiche_boutons_admin)
 		include_local('inc-admin.php3');
 
@@ -102,6 +103,7 @@ else {
 		($var_debug OR $var_recherche OR $affiche_boutons_admin));
 
 		// Cas d'une page contenant uniquement du HTML :
+
 	if ($page['process_ins'] == 'html') {
 			if (!spip_active_ob) {
 				echo $page['texte'];
diff --git a/inc-recherche.php3 b/inc-recherche.php3
new file mode 100644
index 0000000000000000000000000000000000000000..f7e8eb584fd6e917325e8f05afd3f07d77576045
--- /dev/null
+++ b/inc-recherche.php3
@@ -0,0 +1,16 @@
+<?php
+
+global $recherche_array;
+$recherche_array = array();
+
+function recherche_stat($args, $filtres)
+{
+  if (lire_meta("accepter_inscriptions") != "oui")
+    return '';
+  else {
+    if (!($lien = $filtre[0])) $lien = 'recherche.php3';
+    return "<form action='$lien' method='get' class='formrecherche'><input type='text' id='formulaire_recherche' size='20' class='formrecherche' name='recherche' value='" . _T('info_rechercher') . "' /></form>";
+  }
+}
+
+?>
\ No newline at end of file
diff --git a/inc-signature.php3 b/inc-signature.php3
new file mode 100644
index 0000000000000000000000000000000000000000..32ed1bdce306889231c452a7b313b7e54d23c55b
--- /dev/null
+++ b/inc-signature.php3
@@ -0,0 +1,318 @@
+<?php
+
+//
+// Formulaire de signature d'une petition
+//
+
+global $signature_array;
+$signature_array = array('id_article', 'petition');
+
+function signature_stat($args, $filtres)
+{
+  list($id_article, $petition) = $args;
+  return (!$petition ? '' :
+	  array("'$id_article'",
+		"'"
+		. str_replace('\'', '\\\'', 
+			      str_replace('\\', '\\\\', serialize($petition)))
+		. "'"));
+}
+
+function signature_dyn($id_article,$petition) {
+	if ($GLOBALS['val_confirm'])
+		return _REPONSE_CONFIRMATION_SIGNATURE;	// geree par inc-public.php3
+	else if ($GLOBALS['nom_email'] AND $GLOBALS['adresse_email'])
+		return reponse_signature($id_article);
+	else if (!$petition)
+		return '';
+	else {
+		$row_petition = (unserialize($petition));
+		include_ecrire("inc_texte.php3");
+		include_ecrire("inc_mail.php3");
+
+		$id_article = $row_petition['id_article'];
+		$email_unique = $row_petition['email_unique'];
+		$site_obli = $row_petition['site_obli'];
+		$site_unique = $row_petition['site_unique'];
+		$message_petition = $row_petition['message'];
+		$texte_petition = $row_petition['texte'];
+
+		$link = new Link;
+		$url = lire_meta("adresse_site").'/'.$link->getUrl();
+		$link->addVar('url_page', $url);
+
+		$retour = $link->getForm('post', "sp$id_article");
+
+		$retour .= propre($texte_petition);
+
+		$retour .= "<div><a name='sp$id_article'></a><fieldset><p><b>"._T('form_pet_votre_nom')."</b><br />";
+		$retour .= "<input type=\"text\" class=\"forml\" name=\"nom_email\" value=\"\" size=\"20\" /></p>";
+
+		$retour .= "<p><b>"._T('form_pet_votre_email')."</b><br />";
+		$retour .= "<input type=\"text\" class=\"forml\" name=\"adresse_email\" value=\"\" size=\"20\" /></p></fieldset>";
+
+		$retour .= "<br /><fieldset><p>";
+		if ($site_obli != "oui") {
+			$retour .= _T('form_pet_votre_site')."<br />";
+		}
+		$retour .= "<b>"._T('form_pet_nom_site2')."</b><br />";
+		$retour .= "<input type=\"text\" class=\"forml\" name=\"nom_site\" value=\"\" size=\"20\" /></p>";
+
+		$retour .= "<p><b>"._T('form_pet_adresse_site')."</b><br />";
+		$retour .= "<input type=\"text\" class=\"forml\" name=\"url_site\" value=\"http://\" size=\"20\" /></p></fieldset>";
+
+		if ($message_petition == "oui") {
+			$retour .= "<br /><fieldset>";
+
+			$retour .= "<b>"._T('form_pet_message_commentaire')."</b><br />";
+			$retour .= "<textarea name=\"message\" rows=\"3\" class=\"forml\" cols=\"20\" wrap='soft'>";
+			$retour .= "</textarea></fieldset>\n";
+		}
+		else {
+			$retour .= "<input type=\"hidden\" name=\"message\" value=\"\" />";
+		}
+		$retour .= "</div>";
+
+		$retour .= "<br /><div align=\"right\"><input type=\"submit\" name=\"Valider\" class=\"spip_bouton\" value=\""._T('bouton_valider')."\" />";
+		$retour .= "</div></form>\n";
+
+	return $retour;
+	}
+}
+
+//
+// Retour a l'ecran du lien de confirmation d'une signature de petition
+//
+
+function reponse_confirmation($id_article, $val_confirm) {
+
+	include(_FILE_CONNECT);
+	
+	if ($GLOBALS['db_ok']) {
+		include_ecrire("inc_texte.php3");
+		include_ecrire("inc_filtres.php3");
+
+		// Eviter les doublons
+		$lock = "petition $id_article $val_confirm";
+		if (!spip_get_lock($lock, 5)) {
+			$texte = _T('form_pet_probleme_technique');
+		}
+		else {
+			$query_sign = "SELECT * FROM spip_signatures WHERE statut='".addslashes($val_confirm)."'";
+			$result_sign = spip_query($query_sign);
+			if (spip_num_rows($result_sign) > 0) {
+				while($row = spip_fetch_array($result_sign)) {
+					$id_signature = $row['id_signature'];
+					$id_article = $row['id_article'];
+					$date_time = $row['date_time'];
+					$nom_email = $row['nom_email'];
+					$adresse_email = $row['ad_email'];
+					$nom_site = $row['nom_site'];
+					$url_site = $row['url_site'];
+					$message = $row['message'];
+					$statut = $row['statut'];
+				}
+	
+				$query_petition = "SELECT * FROM spip_petitions WHERE id_article=$id_article";
+				$result_petition = spip_query($query_petition);
+	
+				while ($row = spip_fetch_array($result_petition)) {
+					$id_article = $row['id_article'];
+					$email_unique = $row['email_unique'];
+					$site_obli = $row['site_obli'];
+					$site_unique = $row['site_unique'];
+					$message_petition = $row['message'];
+					$texte_petition = $row['texte'];
+				}
+	
+				if ($email_unique == "oui") {
+					$email = addslashes($adresse_email);
+					$query = "SELECT * FROM spip_signatures WHERE id_article=$id_article AND ad_email='$email' AND statut='publie'";
+					$result = spip_query($query);
+					if (spip_num_rows($result) > 0) {
+						$texte .= erreur(_T('form_pet_deja_signe'));
+						$refus = "oui";
+					}
+				}
+	
+				if ($site_unique == "oui") {
+					$site = addslashes($url_site);
+					$query = "SELECT * FROM spip_signatures WHERE id_article=$id_article AND url_site='$site' AND statut='publie'";
+					$result = spip_query($query);
+					if (spip_num_rows($result) > 0) {
+						$texte .= erreur(_T('form_pet_deja_enregistre'));
+						$refus = "oui";
+					}
+				}
+	
+				if ($refus == "oui") {
+					$texte .= erreur(_T('form_deja_inscrit'));
+				}
+				else {
+					$query = "UPDATE spip_signatures SET statut='publie' WHERE id_signature='$id_signature'";
+					$result = spip_query($query);
+					// invalider les pages ayant des boucles signatures
+					include_ecrire('inc_invalideur.php3');
+					suivre_invalideur("id='petition/petition'");
+	
+					$texte .= erreur(_T('form_pet_signature_validee'));
+				}
+			}
+			else {
+				$texte .= erreur(_T('form_pet_aucune_signature'));
+			}
+			spip_release_lock($lock);
+		}
+	}
+	else {
+		$texte = _T('form_pet_probleme_technique');
+	}
+
+	$texte = "<div class='reponse_formulaire'><a name='sp$id_article'></a>$texte</div>";
+
+	// message pour formulaire_signature()
+	define('_REPONSE_CONFIRMATION_SIGNATURE', $texte);
+
+}
+
+//
+// Retour a l'ecran de la signature d'une petition
+//
+
+function reponse_signature($id_article) {
+	global $nom_email, $adresse_email, $message, $nom_site, $url_site, $url_page;
+	spip_log("signature petition $id_article ($adresse_email)");
+	include(_FILE_CONNECT);
+	
+	if ($GLOBALS['db_ok']) {
+		include_ecrire("inc_texte.php3");
+		include_ecrire("inc_filtres.php3");
+		include_ecrire("inc_mail.php3");
+
+		// Eviter les doublons
+		$lock = "petition $id_article $adresse_email";
+		if (!spip_get_lock($lock, 5)) {
+			$reponse_signature = _T('form_pet_probleme_technique');
+		}
+		else {
+			$query_petition = "SELECT * FROM spip_petitions WHERE id_article=$id_article";
+			$result_petition = spip_query($query_petition);
+	
+			while ($row = spip_fetch_array($result_petition)) {
+				$id_article = $row['id_article'];
+				$email_unique = $row['email_unique'];
+				$site_obli = $row['site_obli'];
+				$site_unique = $row['site_unique'];
+				$message_petition = $row['message'];
+				$texte_petition = $row['texte'];
+			}
+	
+			if (strlen($nom_email) < 2) {
+				$reponse_signature .= erreur(_T('form_indiquer_nom'));
+				$refus = "oui";
+			}
+	
+			if ($adresse_email == _T('info_mail_fournisseur')) {
+				$reponse_signature .= erreur(_T('form_indiquer_email'));
+				$refus = "oui";
+			}
+	
+			if ($email_unique == "oui") {
+				$email = addslashes($adresse_email);
+				$query = "SELECT * FROM spip_signatures WHERE id_article=$id_article AND ad_email='$email' AND statut='publie'";
+				$result = spip_query($query);
+				if (spip_num_rows($result) > 0) {
+					$reponse_signature .= erreur(_T('form_pet_deja_signe'));
+					$refus = "oui";
+				}
+			}
+	
+			if (!email_valide($adresse_email)) {
+				$reponse_signature .= erreur(_T('form_email_non_valide'));
+				$refus = "oui";
+			}
+	
+			if ($site_obli == "oui") {
+				if (!$nom_site) {
+					$reponse_signature .= erreur(_T('form_indiquer_nom_site'));
+					$refus = "oui";
+				}
+				include_ecrire("inc_sites.php3");
+	
+				if (!recuperer_page($url_site)) {
+					$reponse_signature .= erreur(_T('form_pet_url_invalide'));
+					$refus = "oui";
+				}
+			}
+			if ($site_unique == "oui") {
+				$site = addslashes($url_site);
+				$query = "SELECT * FROM spip_signatures WHERE id_article=$id_article AND url_site='$site' AND (statut='publie' OR statut='poubelle')";
+				$result = spip_query($query);
+				if (spip_num_rows($result) > 0) {
+					$reponse_signature .= erreur(_T('form_pet_site_deja_enregistre'));
+					$refus = "oui";
+				}
+			}
+	
+			$passw = test_pass();
+	
+			if ($refus == "oui") {
+				$reponse_signature.= "<P><FONT COLOR='red'><B>"._T('form_pet_signature_pasprise')."</B></FONT><P>";
+			}
+			else {
+				$query_site = "SELECT titre FROM spip_articles WHERE id_article=$id_article";
+				$result_site = spip_query($query_site);
+				while ($row = spip_fetch_array($result_site)) {
+					$titre = $row['titre'];
+				}
+
+				$link = new Link($url_page);
+				$link->addVar('val_confirm', $passw);
+				$url = $link->getUrl("sp$id_article");
+	
+				$messagex = _T('form_pet_mail_confirmation', array('titre' => $titre, 'nom_email' => $nom_email, 'nom_site' => $nom_site, 'url_site' => $url_site, 'url' => $url));
+
+				if (envoyer_mail($adresse_email, _T('form_pet_confirmation')." ".$titre, $messagex)) {
+					$reponse_signature .= "<P><B>"._T('form_pet_envoi_mail_confirmation')."</B>";
+
+					$nom_email = addslashes($nom_email);
+					$adresse_email = addslashes($adresse_email);
+					$nom_site = addslashes($nom_site);
+					$url_site = addslashes($url_site);
+					$message = addslashes($message);
+	
+					$query = "INSERT INTO spip_signatures (id_article, date_time, nom_email, ad_email, nom_site, url_site, message, statut) ".
+						"VALUES ('$id_article', NOW(), '$nom_email', '$adresse_email', '$nom_site', '$url_site', '$message', '$passw')";
+					$result = spip_query($query);
+				}
+				else {
+					$reponse_signature = _T('form_pet_probleme_technique');
+				}
+			}
+			spip_release_lock($lock);
+		}
+	}
+	else {
+		$reponse_signature = _T('form_pet_probleme_technique');
+	}
+	return  "<div class='reponse_formulaire'><a name='sp$id_article'></a>$reponse_signature</div>";
+}
+
+
+function test_pass() {
+	include_ecrire("inc_acces.php3");
+	for (;;) {
+		$passw = creer_pass_aleatoire();
+		$query = "SELECT statut FROM spip_signatures WHERE statut='$passw'";
+		$result = spip_query($query);
+		if (!spip_num_rows($result)) break;
+	}
+	return $passw;
+}
+
+function erreur($zetexte){
+	global $spip_lang_rtl;
+ 	return "<br /><img src='puce$spip_lang_rtl.gif' border='0' alt='-' /> $zetexte";
+}
+
+?>
diff --git a/inc-site.php3 b/inc-site.php3
new file mode 100644
index 0000000000000000000000000000000000000000..0cf7e96545fa0af320579aa4e36dd31248e57de4
--- /dev/null
+++ b/inc-site.php3
@@ -0,0 +1,67 @@
+<?php
+
+global $site_array;
+$site_array = array();
+
+function site_stat($args, $filtres)
+{
+  return ((lire_meta("proposer_sites") != 2) ? '' :
+	  array("'" . $args[0] . "'"));
+}
+
+function site_dyn($la_rubrique) {
+  include_ecrire("inc_mail.php3");
+
+	global $nom_site;
+	global $url_site;
+	global $description_site;
+	global $spip_lang_rtl;
+	$puce_ligne = "<br /><img src='puce$spip_lang_rtl.gif' border='0' alt='-' /> ";
+
+	if ($nom_site) {
+		// Tester le nom du site
+		if (strlen ($nom_site) < 2){
+			$reponse_signature .= $puce_ligne . (_T('form_prop_indiquer_nom_site'));
+			$refus = "oui";
+		}
+
+		// Tester l'URL du site
+		include_ecrire("inc_sites.php3");
+		if (!recuperer_page($url_site)) {
+			$reponse_signature .=  $puce_ligne . (_T('form_pet_url_invalide'));
+			$refus = "oui";
+		}
+
+		// Integrer a la base de donnees
+		
+		if ($refus !="oui"){
+			$nom_site = addslashes($nom_site);
+			$url_site = addslashes($url_site);
+			$description_site = addslashes($description_site);
+			
+			spip_query("INSERT INTO spip_syndic (nom_site, url_site, id_rubrique, descriptif, date, date_syndic, statut, syndication) ".
+				   "VALUES ('$nom_site', '$url_site', $la_rubrique, '$description_site', NOW(), NOW(), 'prop', 'non')");
+			$res =  _T('form_prop_enregistre');
+		}
+		else {
+			$res = $reponse_signature .
+			  "<p> "._T('form_prop_non_enregistre') . "</p>";
+		}
+		
+		$res = "<div class='reponse_formulaire'>$res</div>";
+	}
+	else {
+		$link = $GLOBALS['clean_link'];
+		$res = $link->getForm('POST') .
+		  "<p><div class='spip_encadrer'><b>"._T('form_prop_nom_site')."</b><br />" .
+		  "<input type=\"text\" class=\"forml\" name=\"nom_site\" value=\"\" size=\"30\">" .
+		  "</p><p><b>"._T('form_prop_url_site')."</b></p><br />" .
+		  "<input type=\"text\" class=\"forml\" name=\"url_site\" value=\"\" size=\"30\"></div>" .
+		  "<p><b>"._T('form_prop_description')."</b></p><br />" .
+		  "<textarea name='description_site' rows='5' class='forml' cols='40' wrap=soft></textarea>" .
+		  "<div align=\"right\"><input type=\"submit\" name=\"valider\" class=\"spip_bouton\" value=\""._t('bouton_valider')."\">" .
+		  "</div></form>";
+		}
+	return $res;
+}
+?>
diff --git a/spip_pass.php3 b/spip_pass.php3
index d01631902c7e47603b63b8a8b33e5f21c60c097c..56db5836da572a06caa33f3df3ddc42b1af6cc4f 100644
--- a/spip_pass.php3
+++ b/spip_pass.php3
@@ -11,8 +11,6 @@ include_ecrire("inc_meta.php3");
 include_ecrire("inc_mail.php3");
 include_ecrire("inc_acces.php3");
 
-include_local("inc-formulaires.php3");
-
 utiliser_langue_site();
 utiliser_langue_visiteur();