From 3dd0975626b970aa29f69712d66f12be457f9a35 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sun, 12 Dec 2004 22:05:28 +0000
Subject: [PATCH] balise #HTTP_VARS, #SELF & #FORMULAIRE_ en squelette

---
 auteur-dist.html                   |   3 +-
 formulaire_ecrire_auteur-dist.html |  19 +++++
 formulaire_forum-dist.html         |  56 +++++++++++++
 formulaire_inscription-dist.html   |  14 ++++
 formulaire_recherche-dist.html     |   8 ++
 formulaire_signature.html          |  41 ++++++++++
 formulaire_site-dist.html          |  10 +++
 inc-balises.php3                   |  29 ++++++-
 inc-calcul-outils.php3             |  46 +++++------
 inc-compilo.php3                   |  46 +++++------
 inc-criteres.php3                  |  60 +++++++++-----
 inc-ecrire_auteur.php3             |  93 ++++++++--------------
 inc-forum.php3                     | 112 +++++++++-----------------
 inc-html-squel.php3                | 124 ++++++++++++++---------------
 inc-inscription.php3               |  70 +++++++---------
 inc-public-global.php3             |   6 ++
 inc-recherche.php3                 |  13 +--
 inc-signature.php3                 |  82 +++++--------------
 inc-site.php3                      |  11 +--
 sommaire-dist.html                 |   5 +-
 spip_image.php3                    |  22 +++--
 spip_pass.php3                     |  16 ++--
 22 files changed, 482 insertions(+), 404 deletions(-)
 create mode 100644 formulaire_ecrire_auteur-dist.html
 create mode 100644 formulaire_forum-dist.html
 create mode 100644 formulaire_inscription-dist.html
 create mode 100644 formulaire_recherche-dist.html
 create mode 100644 formulaire_signature.html
 create mode 100644 formulaire_site-dist.html

diff --git a/auteur-dist.html b/auteur-dist.html
index 8fab45ed52..eacd9278fe 100644
--- a/auteur-dist.html
+++ b/auteur-dist.html
@@ -66,7 +66,8 @@
 [<div class="notes">(#NOTES)</div>]
 </div>
 
-[<p><b><:envoyer_message:></b></p>(#FORMULAIRE_ECRIRE_AUTEUR)]
+[<p><b><:envoyer_message:></b></p>
+<div class='spip_encadrer'><b>(#FORMULAIRE_ECRIRE_AUTEUR)</b></div>]
 
 <!-- Articles de l'auteur -->
 
diff --git a/formulaire_ecrire_auteur-dist.html b/formulaire_ecrire_auteur-dist.html
new file mode 100644
index 0000000000..8b54cf3086
--- /dev/null
+++ b/formulaire_ecrire_auteur-dist.html
@@ -0,0 +1,19 @@
+[<br /><img src='puce(#HTTP_VARS{sujetko}).gif' border='0' alt='-' /> <:form_prop_indiquer_sujet:><br />&nbsp;]
+[<br /><img src='puce(#HTTP_VARS{mailko}).gif' border='0' alt='-' /> <:form_prop_indiquer_email:><br /><br />]
+<form action="#SELF" method='post'>
+<:form_pet_votre_email:><br />
+	<input type="text" class="forml" name="email_message_auteur"
+		 value="[(#HTTP_VARS{mail})]" SIZE="30" />
+<p><:form_prop_sujet:><br />
+	<input type="text" class="forml" name="sujet_message_auteur"
+		 value="[(#HTTP_VARS{sujet})]" SIZE="30" />
+</p>
+<p>
+<textarea name='texte_message_auteur' rows='10' class='forml' cols='40' wrap=soft>[(#HTTP_VARS{texte})]</textarea>
+</p>
+[<input type="hidden" name="id_auteur" value="(#HTTP_VARS{id_auteur})" />]
+<div align="right">
+	<input type="submit"  class="spip_bouton" name="valide"
+		 value="[(#HTTP_VARS{valide})"] />
+</div>
+</form>
diff --git a/formulaire_forum-dist.html b/formulaire_forum-dist.html
new file mode 100644
index 0000000000..f5a43ad70a
--- /dev/null
+++ b/formulaire_forum-dist.html
@@ -0,0 +1,56 @@
+<form action='[(#HTTP_VARS{url})]' method='post' name='formulaire'>
+<input type='hidden' name='ajout_forum' value='oui' />
+<input type='hidden' name='id_message', value='[(#HTTP_VARS{id_message})]' />
+<input type='hidden' name='alea', value='[(#HTTP_VARS{alea})]' />
+<input type='hidden' name='hash', value='[(#HTTP_VARS{hash})]' />
+<input type='hidden' name='retour' value='[(#HTTP_VARS{retour})]' />
+[(#HTTP_VARS{modere})]
+[(#HTTP_VARS{afficher_non})]
+[(#HTTP_VARS{previsu})
+      <div class='spip_encadrer'><b><:forum_titre:></b>
+	<br />
+	<input type='text' name='titre' 
+	  value='[(#HTTP_VARS{titre})]' class='forml' size='40' />
+      </div>
+      <br />
+      <div class='spip_encadrer'><b><:forum_texte:></b>
+	<br />
+	<:info_creation_paragraphe:>
+	<br /> 
+	[(#HTTP_VARS{afficher_barre})]
+  <textarea name='texte'    rows='12' class='forml' cols='40'
+	  [(#HTTP_VARS{afficher_claret})] >[(#HTTP_VARS{texte})]</textarea>
+      </div>
+	  [(#HTTP_VARS{table})]
+      <br /><div class='spip_encadrer'>
+	<:forum_lien_hyper:>
+	<br />
+	<:forum_page_url:>
+	<br />
+	<:forum_titre:>
+	<br />
+	<input type='text' name='nom_site_forum' class='forml' size='40'"
+	  value='[(#HTTP_VARS{nom_site_forum})]'  />
+	<br />
+	<:forum_url:>
+	<br />
+	<input type='text' name='url_site' class='forml'  size='40'
+	  value='[(#HTTP_VARS{url_site})]' />
+	</div>
+	  <br /><div class='spip_encadrer'>
+	<:forum_qui_etes_vous:>
+	<br />
+	<:forum_votre_nom:>
+	<br />
+	<input type='text' name='auteur' value='[(#HTTP_VARS{auteur})]'
+	  class='forml' size='40[(#HTTP_VARS{disabled})] />
+	  <br />
+	  <:forum_votre_email:>
+	  <br />
+	  <input type='text' name='email_auteur' value='[(#HTTP_VARS{email_auteur})]'
+	  class='forml' size='40[(#HTTP_VARS{disabled})] />
+      </div>
+      <br /><div align='right'>
+	<input type='submit'  value='<:forum_voir_avant:>' class='spip_bouton'></div>]
+</form>
+
diff --git a/formulaire_inscription-dist.html b/formulaire_inscription-dist.html
new file mode 100644
index 0000000000..0348166ea9
--- /dev/null
+++ b/formulaire_inscription-dist.html
@@ -0,0 +1,14 @@
+</b></div><:form_forum_indiquer_nom_email:>
+<form method='post' action='#SELF' style='border: 0px; margin: 0px;'> 
+<div><b>
+<:form_pet_votre_nom:>
+</b></div>
+<div><input type="text" class="forml" name="nom_inscription" value="" size="30" /></div>
+<div><b>
+<:form_pet_votre_email:>
+</b></div>
+<div><input type="text" class="forml" name="mail_inscription" value="" size="30" /></div>
+<br />
+<div align="right"><input type="submit" class="spip_bouton" value="<:bouton_valider:>" /></div> 
+</form>
+<div><b>
diff --git a/formulaire_recherche-dist.html b/formulaire_recherche-dist.html
new file mode 100644
index 0000000000..154cbd4580
--- /dev/null
+++ b/formulaire_recherche-dist.html
@@ -0,0 +1,8 @@
+<form action='[(#HTTP_VARS{lien})]' method='get' class='formrecherche'>
+	<input	type='text'
+		id='formulaire_recherche'
+		size='50'
+		class='formrecherche'
+		name='recherche'
+		value='[(#HTTP_VARS{recherche})]' />
+</form>
diff --git a/formulaire_signature.html b/formulaire_signature.html
new file mode 100644
index 0000000000..2ba6abbc8c
--- /dev/null
+++ b/formulaire_signature.html
@@ -0,0 +1,41 @@
+<BOUCLE1(ARTICLES){id_article}>
+<form	method='post'
+	action='#SELF#sp#ID_ARTICLE' >
+
+<input type="hidden" name="url_page" value="#URL_SITE_SPIP/#SELF">
+[(#HTTP_VARS{texte}|traiter_raccourcis|interdire_scripts)]
+<div>
+	<a name='#sp#ID_ARTICLE'></a>
+	<fieldset>
+		<p>
+			<b><:form_pet_votre_nom:></b><br />
+			<input type="text" class="forml" name="nom_email" value="" size="20" />
+    		</p>
+		<p>
+			<b><:form_pet_votre_email:></b><br />
+			<input type="text" class="forml" name="adresse_email" value="" size="20" />
+		</p>
+	</fieldset>
+	<br />
+	<fieldset>
+		<p>
+			[(#HTTP_VARS{site_obli}) <:form_pet_votre_site:><br />]
+			<b><:form_pet_nom_site2:></b><br />
+			<input type="text" class="forml" name="nom_site" value="" size="20" />
+		</p>
+		<p>
+			<b><:form_pet_adresse_site:></b><br />
+			<input type="text" class="forml" name="url_site" value="http://" size="20" />
+		</p>
+	</fieldset>
+	[(#HTTP_VARS{message}) <br />
+		<fieldset>
+			<b><:form_pet_message_commentaire:></b><br />
+			<textarea name="message" rows="3" class="forml" cols="20" wrap='soft'></textarea>
+		</fieldset>
+	]
+</div>
+<br />
+<div align="right"><input type="submit" name="Valider" class="spip_bouton" value="<:bouton_valider:>" /></div>
+</form>
+</BOUCLE1>
\ No newline at end of file
diff --git a/formulaire_site-dist.html b/formulaire_site-dist.html
new file mode 100644
index 0000000000..fbb5b8e70d
--- /dev/null
+++ b/formulaire_site-dist.html
@@ -0,0 +1,10 @@
+<form action="#SELF" method="post">
+<p><div class='spip_encadrer'><b><:form_prop_nom_site:></b><br />
+<input type="text" class="forml" name="nom_site" value="" size="30">
+</p><p><b><:form_prop_url_site:></b></p><br />
+<input type="text" class="forml" name="url_site" value="" size="30"></div>
+<p><b><: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=" <:bouton_valider:>">
+</div>
+</form>
diff --git a/inc-balises.php3 b/inc-balises.php3
index 0892482084..9ff8e10dc6 100644
--- a/inc-balises.php3
+++ b/inc-balises.php3
@@ -1,3 +1,4 @@
+
 <?php
 
 //
@@ -655,7 +656,7 @@ function balise_PARAMETRES_FORUM_dist($p) {
 // 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)
+// ainsi que les filtres (qui ne sont donc pas traites ā la compil)
 
 function calculer_balise_formulaire($p) {
 	balise_distante_interdite($p);
@@ -670,6 +671,7 @@ function calculer_balise_formulaire($p) {
 	  . (!$filtres ? '' : ("'" . join("','", $filtres) . "'"))
 	  . "))";
 	$p->statut = 'php';
+	$p->fonctions = '';
 	return $p;
 }
 
@@ -701,4 +703,29 @@ function balise_FORMULAIRE_ADMIN_dist($p) {
 	return $p;
 }
 
+// reference a l'URL de la page courante
+
+function balise_SELF_dist($p) {
+	$p->code = 'quote_amp($GLOBALS["clean_link"]->getUrl())';
+	$p->statut = 'php';
+	return $p;
+}
+
+// reference aux parametres GET & POST
+
+function balise_HTTP_VARS_dist($p) {
+	$a = $p->fonctions;
+	if ($a) list(,$nom) = each($a) ; else $nom = '';
+	if (!ereg(' *\{ *([][a-zA-Z0-9_-]+) *\} *',$nom, $m))
+		erreur_squelette(_L("Champ #HTTP_VARS argument '$nom' fautif"),
+				$p->id_boucle);
+	else {
+		$p->code = '$Pile[0]["' . addslashes($m[1]) . '"]';
+		$p->statut = 'php';
+		$filtres= array();
+		while (list(, $nom) = each($a)) if ($nom) $filtres[] = $nom;
+		$p->fonctions = $filtres;
+	}
+	return $p;
+}
 ?>
diff --git a/inc-calcul-outils.php3 b/inc-calcul-outils.php3
index 67acd66fa8..73ee061457 100644
--- a/inc-calcul-outils.php3
+++ b/inc-calcul-outils.php3
@@ -84,14 +84,14 @@ function affiche_logos($arton, $artoff, $lien, $align) {
 	global $espace_logos;
 
 	$num_survol++;
-	if ($arton) {
-		if ($align) $align="align='$align' ";
-
-		$milieu = "<img src='$arton' $align".
-			" name='image$num_survol' border='0' alt=''".
-			" hspace='$espace_logos' vspace='$espace_logos' class='spip_logos' />";
-
-		if ($artoff) {
+	if (!$arton) return '';
+	$milieu = "<img src='$arton'"
+		. ($align ? " align='$align' " : '') 
+		. " name='image$num_survol' border='0' "
+		. "alt='image$num_survol'"
+		. " hspace='$espace_logos' vspace='$espace_logos' class='spip_logos' />";
+
+	if ($artoff) {
 			if ($lien) {
 				$afflien = "<a href='$lien'";
 				$afflien2 = "a>";
@@ -103,13 +103,11 @@ function affiche_logos($arton, $artoff, $lien, $align) {
 			$milieu = "$afflien onmouseover=\"image$num_survol.src=".
 				"'$artoff'\" onmouseout=\"image$num_survol.src=".
 				"'$arton'\">$milieu</$afflien2";
-		}
+	}
 		else if ($lien) {
 			$milieu = "<a href='$lien'>$milieu</a>";
 		}
-	} else {
-		$milieu="";
-	}
+
 	return $milieu;
 }
 
@@ -155,7 +153,7 @@ function calculer_formulaire($nom, $args, $filtres)
   $r = $f($args, $filtres);
   if (is_string($r))
     return $r;
-  else 
+  else { 
     return
     ('<'.'?php 
 include_ecrire(\'inc_lang.php3\');
@@ -165,14 +163,15 @@ lang_select(\''
 include_local("'
      . $file
      . '");
-echo '
+inclure_formulaire('
      . $nom
-     . '_dyn('
-     . join(',',$r)
-     . ');
+     . '_dyn(\''
+     . join("', '", array_map("addslashes", $r))
+     . '\'));
 lang_dselect();
 ?'
      .">");
+  }
 }
 
 //
@@ -370,18 +369,17 @@ function sql_auteurs($id_article, $table, $id_boucle, $serveur='')
 
 function sql_petitions($id_article, $table, $id_boucle, $serveur, &$Cache) {
 	$retour = spip_abstract_fetsel(
-		array('id_article', 'email_unique', 'site_obli', 'site_unique',
-		'message', 'texte'),
-		array('petitions'),
-		array("id_article=".intval($id_article)),
-		'','','','',1, 
-		$table, $id_boucle, $serveur);
+				       array('id_article'),
+				       array('petitions'),
+				       array("id_article=".intval($id_article)),
+				       '','','','',1, 
+				       $table, $id_boucle, $serveur);
 
 	# cette page est invalidee par toute petition
 	if ($retour AND $Cache)
 		$Cache['petition']['petition'] = 1;
 
-	return $retour;
+	return ($retour ? $id_article : '');
 }
 
 # retourne le chapeau d'un article, et seulement s'il est publie
diff --git a/inc-compilo.php3 b/inc-compilo.php3
index 8344a2ad7b..8501ac66e2 100644
--- a/inc-compilo.php3
+++ b/inc-compilo.php3
@@ -37,36 +37,32 @@ include_ecrire('inc_serialbase.php3');
 function calculer_inclure($fichier, $params, $id_boucle, &$boucles) {
 	global $dossier_squelettes;
 
-	$criteres = '';
+	$l = array();
 	if ($params) {
-		foreach($params as $param) {
-			if (ereg("^([_0-9a-zA-Z]+)[[:space:]]*(=[[:space:]]*([^}]+))?$", $param, $args)) {
-				$var = $args[1];
-				$val = ereg_replace('^["\'](.*)["\']$', "\\1", trim($args[3]));
-				$val = addslashes(addslashes($val));
-
-				// Cas de la langue : passer $spip_lang
-				// et non table.lang (car depend de {lang_select})
-				if ($var =='lang') {
-					if ($val)
-						$l[] = "\'lang\' => \'$val\'";
-					else
-						$l[] = "\'lang\' => \''.\$GLOBALS[\"spip_lang\"].'\'";
-				}
-
-				// Cas normal {var=val}
-				else
-				if ($val)
-					$l[] = "\'$var\' => \'$val\'";
+		foreach($params as $var => $val) {
+			if ($val) {
+			  $val = trim($val);
+			  $val = ereg_replace('^["\'](.*)["\']$', "\\1",$val);
+			  $l[] = "\'$var\' => \'" .
+				 addslashes(calculer_param_dynamique($val,
+								     $boucles,
+								     $idb)) .
+				  "\'";
+			}
+			else {
+			// Cas de la langue : passer $spip_lang
+			  // et non table.lang (car depend de {lang_select})
+				if ($var =='lang')
+					$l[] = "\'lang\' => \''.\$GLOBALS[\"spip_lang\"].'\'";
 				else
 					$l[] = "\'$var\' => \'' . addslashes(" . index_pile($id_boucle, $var, $boucles) . ") .'\'";
-		    }
-		$criteres = join(", ",$l);
-		}
+				}
+			}
 	}
 	return "\n'<".
-		"?php\n\t\$contexte_inclus = array($criteres);\n\t".
-		"\$fichier_inclus = \'$fichier\';\n" .
+		"?php\n\t\$contexte_inclus = array(" .
+		join(", ",$l) .
+		");\n\t\$fichier_inclus = \'$fichier\';\n" .
 		(($dossier_squelettes) ?
 		("
 			if (@file_exists(\'$dossier_squelettes/$fichier\')){
diff --git a/inc-criteres.php3 b/inc-criteres.php3
index 61b5e28efc..83305ac7f3 100644
--- a/inc-criteres.php3
+++ b/inc-criteres.php3
@@ -258,6 +258,33 @@ function critere_par_dist($idb, &$boucles, $param, $not) {
 
 
 
+function calculer_critere_parties($idb, &$boucles, $param, $not, $match) {
+  global $tables_relations, $table_des_tables, $table_date, $tables_des_serveurs_sql;
+	$boucle = &$boucles[$idb];
+	list(,$a1,$op,$a2) = $match;
+	list($a11,$a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
+	list($a21,$a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
+
+	if (($op== ',')&&(is_numeric($a11) && (is_numeric($a21))))
+		$boucle->limit = $a11 .',' . $a21;
+	else {
+	  $boucle->partie =	($a11 != 'n') ? $a11 : $a12;
+		$boucle->total_parties =  ($a21 != 'n') ? $a21 : $a22;
+		$boucle->mode_partie = (($op == '/') ? '/' :
+				(($a1=='n')?'-':'+').(($a2=='n')?'-':'+'));
+	}
+}
+
+function calculer_critere_parties_aux($idb, &$boucles, $param) {
+	ereg('^(([0-9]+)|n|(#.*))(-([0-9]+))?$', $param, $m);
+	if ($m[1] == 'n') 
+	  $a = 'n';
+	else {
+	  $a = calculer_param_dynamique($m[1], $boucles, $idb);
+	  if (ereg('" \. *addslashes(.*)\. "', $a, $m2)) $a = $m2[1];
+	}
+	return array($a, ($m[5] ? $m[5] : 0));
+}
 
 //
 // La fonction d'aiguillage sur le nom du criteres
@@ -299,28 +326,11 @@ function calculer_critere_DEFAUT($idb, &$boucles, $param, $not) {
 	$primary = $boucle->primary;
 	$id_field = $id_table . '.' . $primary; 
 
-	if (ereg('^([0-9]+)/([0-9]+)$', $param, $match)) {
-			$boucle->partie = $match[1];
-			$boucle->total_parties = $match[2];
-			$boucle->mode_partie = '/';
-		}
-		else if (ereg('^(([0-9]+)|n)(-([0-9]+))?,(([0-9]+)|n)(-([0-9]+))?$', $param, $match)) {
-			if (($match[2]!='') && ($match[6]!=''))
-				$boucle->limit = $match[2].','.$match[6];
-			else {
-				$boucle->partie =
-					($match[1] != 'n') ? $match[1] :
-					($match[4] ? $match[4] : 0);
-				$boucle->total_parties =
-					($match[5] != 'n') ? $match[5] :
-					($match[8] ? $match[8] : 0);
-				$boucle->mode_partie =
-				(($match[1]=='n')?'-':'+').(($match[5]=='n')?'-':'+');
-			}
-		}
+	if (ereg('^([0-9a-zA-Z#_\{\}]+)([,/])([0-9a-zA-Z#_\{\}]+)$', $param, $match))
+	  calculer_critere_parties($idb, $boucles, $param, $not, $match);
 
 		// Restriction de valeurs (implicite ou explicite)
-		else if (eregi('^([a-z_]+\(?[a-z_]*\)?) *(\??)((!?)(<=?|>=?|==?|IN) *"?([^<>=!"]*))?"?$', $param, $match)) {
+	else if (eregi('^([a-z_]+\(?[a-z_]*\)?) *(\??)((!?)(<=?|>=?|==?|IN) *"?([^<>=!"]*))?"?$', $param, $match)) {
 			$op = $match[5];
 			// Variable comparee
 			$col = $match[1];
@@ -574,11 +584,14 @@ define("_REF_HTTP_GET_VAR", '%');
 // Calculer les parametres
 //
 function calculer_param_dynamique($val, &$boucles, $idb) {
-	if (ereg(NOM_DE_CHAMP, $val, $regs)) {
+#	if (ereg('^ *\((.*)) *$', $val, $m)) $val = $m[1]; # si on veut (#...)
+	if (ereg(NOM_DE_CHAMP . "(\{[^}]*\})?", $val, $regs)) {
+	  spip_log("dyn: '$val'" . join("','", $regs));
 	  	$champ = new Champ;
 		$champ->nom_boucle = $regs[2];
 		$champ->nom_champ = $regs[3];
 		$champ->etoile = $regs[4];
+		$champ->fonctions = $regs[5] ? array($regs[5]) : '';
 		$champ->id_boucle = $boucles[$idb]->id_parent;
 		$champ->boucles = &$boucles;
 		$champ->id_mere = $idb;
@@ -586,8 +599,11 @@ function calculer_param_dynamique($val, &$boucles, $idb) {
 		return '" . addslashes(' . $champ . ') . "';
 
 	} else {
-		if ($val[0]==_REF_HTTP_GET_VAR)
+	  if ($val[0]==_REF_HTTP_GET_VAR) {
+	    spip_log($val .
+		     " est obsolete; utiliser HTTP_VARS{" .  substr($val,1) . "}");
 		  return '" . addslashes($Pile[0][\''. substr($val,1)  ."']) . \"";
+	  }
 		else
 		  return addslashes($val);
 	}
diff --git a/inc-ecrire_auteur.php3 b/inc-ecrire_auteur.php3
index c9b4a1d4f9..f7b1791bf6 100644
--- a/inc-ecrire_auteur.php3
+++ b/inc-ecrire_auteur.php3
@@ -12,70 +12,41 @@ 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) ."'"));
+	  array($id_auteur, $mail,$sujet, $texte, $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($mail,
-				     $sujet, $texte, $adres,
+  global $flag_wordwrap, $clean_link, $spip_lang_rtl;
+	include_ecrire("inc_lang.php3"); // pour spip_lang_rtl 
+	if (!$spip_lang_rt) $spip_lang_rtl = '_rtl'; # INDISPENSABLE cf skel
+	$mailko = $texte && !email_valide($adres);
+	$validable = $texte && $sujet && (!$mailko);
+
+	if ($validable && ($GLOBALS['valide'] == _T('form_prop_confirmer_envoi'))) { 
+		$texte .= "\n\n-- "._T('envoi_via_le_site')." ".lire_meta('nom_site')." (".lire_meta('adresse_site')."/) --\n";
+		include_ecrire("inc_mail.php3");
+		envoyer_mail($mail, $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>";
-
+		return _T('form_prop_message_envoye');
+	    }
+
+	$clean_link->delVar('sujet_message_auteur');
+	$clean_link->delVar('texte_message_auteur');
+	$clean_link->delVar('email_message_auteur');
+	$clean_link->delVar('id_auteur');
+	return 
+	  array('formulaire_ecrire_auteur', 0,
+		array(
+		      'id_auteur' => $id_auteur,
+		      'mailko' => $mailko ? $spip_lang_rtl : '',
+		      'mail' => entites_html($adres),
+		      'sujetko' => ($texte && !$sujet) ? $spip_lang_rtl : '',
+		      'sujet' => entites_html($sujet),
+		      'texte' => entites_html($texte),
+		      'valide' => ($validable ?
+				    _T('form_prop_confirmer_envoi') :
+				    _T('form_prop_envoyer'))
+		      )
+		);
 }
-
 ?>
diff --git a/inc-forum.php3 b/inc-forum.php3
index 31030da7c2..ee31160efd 100644
--- a/inc-forum.php3
+++ b/inc-forum.php3
@@ -41,6 +41,10 @@ function retour_forum($id_rubrique, $id_forum, $id_article, $id_breve, $id_syndi
 
 	global $REMOTE_ADDR, $id_message, $afficher_texte, $spip_forum_user;
 
+	// ne pas mettre '', sinon le squelette n'affichera rien.
+
+	$previsu = ' ';
+
 	// Recuperer le message a previsualiser
 	if ($id_message = intval($GLOBALS[HTTP_POST_VARS][id_message]))  {
 		$titre = $GLOBALS[HTTP_POST_VARS][titre];
@@ -92,7 +96,7 @@ function retour_forum($id_rubrique, $id_forum, $id_article, $id_breve, $id_syndi
 			$previsu = preg_replace("@<(/?)f(orm[>[:space:]])@ism", "<\\1no-f\\2", $previsu);
 		}
 	} else {
-		// Si premiere edition, initialiser l'auteur
+		// Premiere edition, initialiser l'auteur
 	  	// puis s'accorder une nouvelle entree dans la table
 		if ($spip_forum_user && is_array($cookie_user = unserialize($spip_forum_user))) {
 			$auteur = $cookie_user['nom'];
@@ -120,8 +124,6 @@ function retour_forum($id_rubrique, $id_forum, $id_article, $id_breve, $id_syndi
 	$forum_id_syndic = intval($id_syndic);
 	$hash = calculer_action_auteur("ajout_forum $forum_id_rubrique $forum_id_forum $forum_id_article $forum_id_breve $forum_id_syndic $alea");
 	$titre = entites_html($titre);
-	if (!$url_site) $url_site = "http://";
-	if ($forums_publics == "abo") $disabled = " disabled='disabled'";
 
 	// Faut-il ajouter des propositions de mots-cles
 	if ((lire_meta("mots_cles_forums") == "oui") && ($table != 'forum'))
@@ -129,64 +131,37 @@ function retour_forum($id_rubrique, $id_forum, $id_article, $id_breve, $id_syndi
 	else
 		$table = '';
 
-	$url = quote_amp($url);
-
-	return ("<form action='$url' method='post' name='formulaire'>\n" .
-		boutonne('hidden', 'retour', $retour) .
-		boutonne('hidden', 'ajout_forum','oui') .
-		boutonne('hidden', 'id_message', $id_message) .
-		boutonne('hidden', 'alea', $alea) .
-		boutonne('hidden', 'hash', $hash) .
-		(($forums_publics != 'pri') ? '' :
-		 (_T('forum_info_modere'). '<p>')) .
-		(($afficher_texte == "non") ?
-		 (boutonne('hidden', 'titre', $titre) .
-		  $table .
-		  "\n<br /><div align='right'>" .
-		  boutonne('submit', '', _T('forum_valider'), "class='spip_bouton'") .
-		  "</div>") :
-		 ($previsu . "<div class='spip_encadrer'><b>"._T('forum_titre')."</b>\n<br />".
-		  boutonne('text', 'titre', $titre, "class='forml' size='40'") . "</div>\n<br />"
-		  ."<div class='spip_encadrer'><b>" .
-		  _T('forum_texte') .
-		  "</b>\n<br />" .
-		  _T('info_creation_paragraphe') .
-		  "\n<br /> " .
-		  afficher_barre('formulaire', 'texte', true) .
-		  "<textarea name='texte' " .
-		  afficher_claret() .
-		  " rows='12' class='forml' cols='40'>" .
-		  entites_html($texte) .
-		  "</textarea></div>" .
-		  $table  .
-		 "\n<br /><div class='spip_encadrer'>" .
-		  _T('forum_lien_hyper') .
-		  "\n<br />" .
-		  _T('forum_page_url') .
-		  "\n<br />" .
-		  _T('forum_titre') .
-		  "\n<br />" .
-		  boutonne('text', 'nom_site_forum', entites_html($nom_site_forum), " class='forml' size='40'") .
-		  "\n<br />" .
-		  _T('forum_url') .
-		  "\n<br />" .
-		  boutonne('text', 'url_site', entites_html($url_site),
-			   " class='forml'  size='40'") . 
-		  "</div>\n<br /><div class='spip_encadrer'>" .
-		  _T('forum_qui_etes_vous') .
-		  "\n<br />" .
-		  _T('forum_votre_nom') .
-		  "\n<br />" .
-		  boutonne('text', 'auteur', entites_html($auteur),
-			   "class='forml' size='40'$disabled") .
-		  "\n<br />" .
-		  _T('forum_votre_email') .
-		  "\n<br />" .
-		  boutonne('text', 'email_auteur', entites_html($email_auteur),
-			   "class='forml' size='40'$disabled") .
-		  "</div>\n<br /><div align='right'>" .
-		  boutonne('submit', '',  _T('forum_voir_avant'), "class='spip_bouton'") . 
-		  "</div>\n</form>")));
+	return array(
+		     'formulaire_forum',
+		     0,
+		     array(
+		     'afficher_claret' => afficher_claret(),
+		     // ca devrait plutot etre un squelette
+		     'afficher_barre' => afficher_barre('formulaire', 'texte', true),
+		     'afficher_non' => 
+		     ($afficher_texte != 'non' ? '' :
+		      (boutonne('hidden', 'titre', $titre) .
+		       $table .
+		       "\n<br /><div align='right'>" .
+		       boutonne('submit', '', _T('forum_valider'), "class='spip_bouton'") .
+		       "</div>")),
+		     'alea' => $alea,
+		     'auteur' => entites_html($auteur),
+		     'disabled' => ($forums_publics == "abo")? " disabled='disabled'" : '',
+		     'email_auteur' => entites_html($email_auteur),
+		     'hash' => $hash,
+		     'id_message' => $id_message,
+		     'modere' => (($forums_publics != 'pri') ? '' :
+				  (_T('forum_info_modere'). '<p>')),
+		     'nom_site_forum' => entites_html($nom_site_forum),
+		     'previsu' => $previsu,
+		     'retour' => $retour,
+		     'table' => $table,
+		     'texte' =>   entites_html($texte),
+		     'titre' => $titre,
+		     'url' =>  quote_amp($url),
+		     'url_site' => ($url_site ? entites_html($url_site) : "http://")
+		     ));
 }
 
 
@@ -342,21 +317,12 @@ function forum_stat($args, $filtres)
   // recuperer les donnees du forum auquel on repond, false = forum interdit
   if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
     return '';
+  list($titre, $table, $accepter_forum) = $r;
   return 
-    array("'"
-	  . str_replace('\'', '\\\'', 
-			str_replace('\\', '\\\\', serialize($args)))
-	  . "'",
-	  "'"
-	  . str_replace('\'', '\\\'', 
-			str_replace('\\', '\\\\', serialize($r)))
-	  . "'");
+    array($titre, $table, $accepter_forum, $idr, $idf, $ida, $idb, $ids);
 }
 
-function forum_dyn($args, $donnees_forum) {
-
-  list ($idr, $idf, $ida, $idb, $ids) = unserialize($args);
-  list($titre, $table, $accepter_forum) = unserialize($donnees_forum);
+function forum_dyn($titre, $table, $accepter_forum, $idr, $idf, $ida, $idb, $ids) {
 
 	// url de reference
 	if (!$url = rawurldecode($GLOBALS['url'])) 
diff --git a/inc-html-squel.php3 b/inc-html-squel.php3
index 97fd95605b..fa2ebe050a 100644
--- a/inc-html-squel.php3
+++ b/inc-html-squel.php3
@@ -9,30 +9,36 @@ define("_INC_HTML_SQUEL", "1");
 # il est charge par un include calcule dans inc-calcul-squel
 # pour permettre differentes syntaxes en entree
 
-define(NOM_DE_BOUCLE, "[0-9]+|[-_][-_.a-zA-Z0-9]*");
-define(NOM_DE_CHAMP, "#((" . NOM_DE_BOUCLE . "):)?([A-Z_]+)(\*?)");
-define(CHAMP_ETENDU, '\[([^]\[]*)\(' . NOM_DE_CHAMP . '([^]\[)]*)\)([^]\[]*)\]');
-define(PARAM_DE_BOUCLE,'\{[^}]*\}');
-define(TYPE_DE_BOUCLE, "[^)]*");
-define(BALISE_DE_BOUCLE,
+define('NOM_DE_BOUCLE', "[0-9]+|[-_][-_.a-zA-Z0-9]*");
+define('NOM_DE_CHAMP', "#((" . NOM_DE_BOUCLE . "):)?([A-Z_]+)(\*?)");
+define('CHAMP_ETENDU', '\[([^]\[]*)\(' . NOM_DE_CHAMP . '([^]\[)]*)\)([^]\[]*)\]');
+define('PARAM_DE_BOUCLE','[[:space:]]*\{[[:space:]]*([^{}]*(\{[^\}]*\}[^\} ]*)?)[[:space:]]*\}');
+define('TYPE_DE_BOUCLE', "[^)]*");
+define('BALISE_DE_BOUCLE',
 	"^<BOUCLE(" .
 	NOM_DE_BOUCLE .
 	')[[:space:]]*\((' .
 	TYPE_DE_BOUCLE .
-	')\)[[:space:]]*(([[:space:]]*' .
+	')\)((' .
 	PARAM_DE_BOUCLE .
 	')*)[[:space:]]*>');
-define(BALISE_INCLURE,"<INCLU[DR]E[[:space:]]*\(([-_0-9a-zA-Z./ ]+)\)([^>]*)>");
+define('PARAM_INCLURE','[[:space:]]*\{[[:space:]]*([_0-9a-zA-Z]+)[[:space:]]*(=[[:space:]]*([^\{\}]*(\{[^\}]*\}[^\} ]*)?))?[[:space:]]*\}');
+define('BALISE_INCLURE',"<INCLU[DR]E[[:space:]]*\(" .
+       '([-_0-9a-zA-Z./ ]+)' .
+	'\)((' .
+	PARAM_INCLURE .
+	')*)[[:space:]]*>');
+define('DEBUT_DE_BOUCLE','/<B('.NOM_DE_BOUCLE.')>.*?<BOUCLE\1[^-_.a-zA-Z0-9]|<BOUCLE('.NOM_DE_BOUCLE.')/ms');	# preg
 
-define(DEBUT_DE_BOUCLE,'/<B('.NOM_DE_BOUCLE.')>.*?<BOUCLE\1[^-_.a-zA-Z0-9]|<BOUCLE('.NOM_DE_BOUCLE.')/ms');	# preg
 
+function parser_inclure($texte) {
+  while (($p=strpos($texte, '<INCLU')) !== false) {
+		$fin = substr($texte, $p);
 
-function parser_texte($texte) {
-	while (ereg(BALISE_INCLURE, $texte, $match)) {
+		if (!ereg('^' . BALISE_INCLURE, $fin, $match)) break;
 		$s = $match[0];
-		$p = strpos($texte, $s);
 		$debut = substr($texte, 0, $p);
-		$texte = substr($texte, $p + strlen($s));
+		$texte = substr($fin, strlen($s));
 
 		if ($debut) {
 			$champ = new Texte;
@@ -41,27 +47,22 @@ function parser_texte($texte) {
 		}
 		$champ = new Inclure;
 		$champ->fichier = $match[1];
-
+		$champ->params = array();
 		$p = trim($match[2]);
-		if (!$p)
-			$champ->params = '';
-		else {
-			if (!(ereg('^\\{(.*)\\}$', $p, $params))) {
-				erreur_squelette(_L("Param&egrave;tres d'inclusion incorrects"), $s);
+		if ($p) {
+			while (ereg('^' . PARAM_INCLURE . '(.*)$', $p, $m)) {
+				$champ->params[$m[1]] = $m[3];
+				$p = $m[5];
 			}
-			else
-				$champ->params = split("\}[[:space:]]*\{", $params[1]);
+			
+			if ($p)	erreur_squelette(_L("Param&egrave;tres d'inclusion incorrects"), $s);
 		}
 		$result[] = $champ;
 	}
 
-	if ($texte) {
-		$champ = new Texte;
-		$champ->texte = $texte;
-		$result[] = $champ;
-	}
-
-	return $result;
+	if ($texte) 
+		return array_merge($result, parser_champs_etendus($texte));
+	else	return $result;
 }
 
 function parser_champs($texte) {
@@ -69,8 +70,9 @@ function parser_champs($texte) {
 	while (ereg(NOM_DE_CHAMP . '(.*)$', $texte, $regs)) {
 		$p = strpos($texte, $regs[0]);
 		if ($p) {
-			$result = array_merge($result,
-					      parser_texte(substr($texte, 0, $p)));
+			$champ = new Texte;
+			$champ->texte = (substr($texte, 0, $p));
+			$result[] = $champ;
 		}
 
 		$champ = new Champ;
@@ -80,10 +82,12 @@ function parser_champs($texte) {
 		$texte = $regs[5];
 		$result[] = $champ;
 	}
-	if (!$texte)
+	if ($texte) {
+		$champ = new Texte;
+		$champ->texte = $texte;
+		$result[] = $champ;
+	}
 		return $result;
-	else
-		return array_merge($result, parser_texte($texte));
 }
 
 // Gestion des imbrications:
@@ -126,7 +130,6 @@ function parser_champs_interieurs($texte, $sep, $result) {
 		$champ->cond_avant = parser_champs_exterieurs($regs[1],$sep,$result);
 		$champ->cond_apres = parser_champs_exterieurs($regs[7],$sep,$result);
 		$fonctions = $regs[6];
-
 		if ($fonctions) {
 			$fonctions = explode('|', ereg_replace("^\|", "", $fonctions));
 			foreach($fonctions as $f) $champ->fonctions[]= $f;
@@ -153,12 +156,20 @@ function parser_champs_interieurs($texte, $sep, $result) {
 function parser_param($params, &$result) {
 	$params2 = Array();
 	$type = $result->type_requete;
-	$i = 1;
-	while (ereg('^[[:space:]]*\{[[:space:]]*([^ }])([^"}]*)(["}])(.*)$', $params, $args)) {
-		if ($args[3] == "}") {
-			$params = $args[4];
-			ereg("^(.*[^ \t\n])[[:space:]]*$", $args[2], $m);
-			$param = $args[1] . $m[1];
+	while (ereg('^' . PARAM_DE_BOUCLE . '[[:space:]]*(.*)$', $params, $m)) {
+	  $params = $m[3];
+	  // cas d'un critere avec {...}
+	  if ($m[2])
+	    $params2[] = $m[1];
+	  else {
+	    if (strlen($m[1]) < 2 )
+	      $params2[] = $m[1];
+	    else {
+	      ereg('(.)([^"}]*)(.)', $m[1], $args);
+	      // cas syntaxique general, 
+	      // traiter qq lexemes particuliers pour faciliter la suite
+	      if ($args[3] != '"') {
+			$param = $m[1];
 			if (($param == 'tout') OR ($param == 'tous')) {
 				$result->tout = true;
 				unset ($param);
@@ -185,35 +196,21 @@ function parser_param($params, &$result) {
 			// l'ajouter
 			if ($param)
 				$params2[] = $param;
-		}
+	      }
 		else {
+		  // cas d'un guillemet final
 			if ($args[1] == '"') {
-				if (!ereg("[[:space:]]*\}(.*)$", $params, $m))
-					break;
-				else {
-					$params = $m[1];
-					$result->separateur = 
+			  // si tout le param est entre guillement, vite vu
+				$result->separateur = 
 					ereg_replace("'","\'",$args[2]);
-				}
 			}
 			else {
-				if (!ereg("([^\"]*\"[[:space:]]*)\}(.*)$", $args[4], $m))
-					break;
-				else {
-					$params = $m[2];
-					$params2[] = $args[1] . $args[2] . '"' . $m[1];
-				}
+				$params2[] = $args[1] . $args[2] . '"' . $m[1];
 			}
 		}
-		$i++;
-	}
-
-	if ($params) {
-		erreur_squelette(($result->id_boucle .
-				  _L(": Param&egrave;tre $i (ou suivants) incorrect")),
-				 $params);
+	    }
+	  }
 	}
-
 	$result->param = $params2;
 }
 
@@ -238,6 +235,7 @@ function parser($texte, $id_parent, &$boucles, $nom) {
 		//
 		$debut = substr($texte, 0, $p);
 		$milieu = substr($texte, $p);
+
 		if (!ereg(BALISE_DE_BOUCLE, $milieu, $match)) {
 			erreur_squelette((_T('erreur_boucle_syntaxe')), $milieu);
 		}
@@ -321,7 +319,7 @@ function parser($texte, $id_parent, &$boucles, $nom) {
 		$result->cond_altern = parser($result->cond_altern,$id_parent,$boucles, $nom);
 		$result->milieu = parser($milieu, $id_boucle,$boucles, $nom);
 
-		$all_res = array_merge($all_res, parser_champs_etendus($debut));
+		$all_res = array_merge($all_res, parser_inclure($debut));
 		$all_res[] = $result;
 		if ($boucles[$id_boucle]) {
 			erreur_squelette(_T('erreur_boucle_syntaxe'),
@@ -331,7 +329,7 @@ function parser($texte, $id_parent, &$boucles, $nom) {
 			$boucles[$id_boucle] = $result;
 	}
 
-	return array_merge($all_res, parser_champs_etendus($texte));
+	return array_merge($all_res, parser_inclure($texte));
 }
 
 ?>
diff --git a/inc-inscription.php3 b/inc-inscription.php3
index 8fdfb394ed..a686ff1aee 100644
--- a/inc-inscription.php3
+++ b/inc-inscription.php3
@@ -1,53 +1,25 @@
 <?php
 
-global $inscription_array;
-$inscription_array = array();
+global $inscription_array ;
+$inscription_array = array('mail_inscription', 'nom_inscription');
 
 function inscription_stat($args, $filtres)
 {
+  list($mail_inscription, $nom_inscription) = $args;
   return ((lire_meta('accepter_inscriptions') != 'oui') ? '' :
-	  array("'redac'"));
+	  array('redac', $mail_inscription, $nom_inscription));
 }
 
-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='post' 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\" class=\"spip_bouton\" value=\""._T('bouton_valider')."\" /></div>" .
-			  "</form>";
-	}
-}
-
-function status_inscription($type) {
-
+function inscription_dyn($type, $mail_inscription, $nom_inscription) {
 	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;
+	else return ''; // tentative de hack...?
 
-	if ($mail_inscription && $nom_inscription) {
+	if (test_mail_ins($type, $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")))
@@ -62,7 +34,7 @@ function status_inscription($type) {
 					 "('".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
@@ -71,15 +43,31 @@ function status_inscription($type) {
 			} else {
 				if ($row['statut'] == '5poubelle')
 		  // dead
-				  return 5;
+				  return _T('form_forum_access_refuse');
 				else  
 		  // deja inscrit
-				  return 6;
+				  return _T('form_forum_email_deja_enregistre');
 			}
 		}
 	}
 	// demande du formulaire
-	else return 7;
+	else {
+		if (!$nom_inscription) 
+		  {
+		       return array("formulaire_inscription-dist",0);
+		  }
+		else {
+		  spip_log("Mail incorrect: '$mail_inscription'");
+		  return _L('adresse mail incorrecte');
+		}
+	}
+}
+
+// fonction qu'on peut redefinir pour filtrer selon l'adresse mail
+// cas general: controler juste que l'adresse n'est pas vide
+
+function test_mail_ins($type, $mail_inscription) {
+  return trim($mail_inscription);
 }
 
 	// envoyer identifiants par mail
@@ -98,9 +86,9 @@ function envoyer_inscription($mail, $statut, $type, $login, $pass) {
 
 	include_ecrire("inc_mail.php3");
 	if (envoyer_mail($mail, "[$nom_site_spip] "._T('form_forum_identifiants'), $message))
-	  return 3;
+	  return _T('form_forum_identifiant_mail');
 	else
-	  return 4;
+	  return _T('form_forum_probleme_mail');
 }
 
 
diff --git a/inc-public-global.php3 b/inc-public-global.php3
index bfbf312c9a..6fe4ab832a 100644
--- a/inc-public-global.php3
+++ b/inc-public-global.php3
@@ -250,6 +250,12 @@ function inclure_page($fond, $delais_inclus, $contexte_inclus, $cache_incluant='
 
 }
 
+function inclure_formulaire($r) {
+	if (is_string($r))
+	echo $r;
+	else { list($fond, $delais, $contexte_inclus) = $r; include('inc-public.php3'); }
+}
+
 //
 // Le bouton des administrateurs
 //
diff --git a/inc-recherche.php3 b/inc-recherche.php3
index e7b383406c..e880a5a53d 100644
--- a/inc-recherche.php3
+++ b/inc-recherche.php3
@@ -5,12 +5,13 @@ $recherche_array = array();
 
 function recherche_stat($args, $filtres)
 {
-  if (lire_meta("activer_moteur") != "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>";
-  }
+  return (lire_meta("activer_moteur") != "oui") ? '' : array($filtres[0]);
+}
+ 
+function recherche_dyn($lien) {
+	return array('formulaire_recherche', 0, 
+		     array('lien' => ($lien ? $lien : 'recherche.php3'),
+			   'recherche' => ($GLOBALS['recherche'] ? $GLOBALS['recherche'] : _T('info_rechercher'))));
 }
 
 ?>
\ No newline at end of file
diff --git a/inc-signature.php3 b/inc-signature.php3
index 32ed1bdce3..4962e0aa28 100644
--- a/inc-signature.php3
+++ b/inc-signature.php3
@@ -5,78 +5,36 @@
 //
 
 global $signature_array;
-$signature_array = array('id_article', 'petition');
+$signature_array = array('petition');
 
 function signature_stat($args, $filtres)
 {
-  list($id_article, $petition) = $args;
-  return (!$petition ? '' :
-	  array("'$id_article'",
-		"'"
-		. str_replace('\'', '\\\'', 
-			      str_replace('\\', '\\\\', serialize($petition)))
-		. "'"));
+  return ($args[0] ? $args : '');
 }
 
-function signature_dyn($id_article,$petition) {
+function signature_dyn($id_article) {
 	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;
+		include(_FILE_CONNECT);
+		$query_petition = "SELECT * FROM spip_petitions WHERE id_article='$id_article'";
+		$result_petition = spip_query($query_petition);
+		
+		if (!$row = spip_fetch_array($result_petition)) return '';
+		$site_obli = $row['site_obli'];
+		$message = $row['message'];
+		$texte = $row['texte'];
+		return array('formulaire_signature',
+			     0,
+			     array(
+				'id_article' => $id_article,
+				'texte' => $texte,
+				'message' => (($message == 'oui') ? ' ' : ''),
+				'site_obli' => (($site_obli != 'oui') ? ' ' : '')
+				)
+			     );
 	}
 }
 
diff --git a/inc-site.php3 b/inc-site.php3
index 0cf7e96545..ed118ef4e4 100644
--- a/inc-site.php3
+++ b/inc-site.php3
@@ -51,16 +51,7 @@ function site_dyn($la_rubrique) {
 		$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>";
+	  $res = array('formulaire_site', 0);
 		}
 	return $res;
 }
diff --git a/sommaire-dist.html b/sommaire-dist.html
index 4c0b9bd4d2..bedc291ea1 100644
--- a/sommaire-dist.html
+++ b/sommaire-dist.html
@@ -143,9 +143,8 @@
 
 	<!-- Inscription au site -->
 
-	[<div class="formulaire"><:participer_site:>
-	<br /><br />
-	(#FORMULAIRE_INSCRIPTION)</div>]
+	[<div class="formulaire"><:participer_site:><br /><br />
+	  <div class='reponse_formulaire'><b>(#FORMULAIRE_INSCRIPTION)</b></div></div>]
 
 	</div>
 
diff --git a/spip_image.php3 b/spip_image.php3
index b655cf33f1..c2da970bc3 100644
--- a/spip_image.php3
+++ b/spip_image.php3
@@ -39,8 +39,16 @@ function effacer_image($nom) {
 }
 
 function creer_repertoire_documents($ext) {
+	global $dossier_squelettes;
+
 # est-il bien raisonnable d'accepter de creer si creer_rep retourne '' ?
 	$rep = _DIR_DOC . creer_repertoire(_DIR_DOC, $ext);
+	// Securite
+	if (($rep == $dossier_squelettes) || (substr($rep,0,-1) == $dossier_squelettes))
+		{
+		  spip_log("dossier squelette egal a DIR_DOC/html!!!");
+		  exit;
+		}
 	if (lire_meta("creer_htaccess") == 'oui') {
 		include_ecrire('inc_acces.php3');
 		verifier_htaccess($rep);
@@ -217,20 +225,22 @@ function corriger_extension($ext) {
 //
 
 function ajout_image($source, $dest) {
-	global $redirect_url, $hash_id_auteur, $hash, $num_img;
+	global $redirect_url, $hash_id_auteur, $hash, $num_img, $dossier_squelettes;
 
 	// Securite
-	if (verifier_action_auteur("ajout_image $dest", $hash, $hash_id_auteur)) {
+	if (verifier_action_auteur("ajout_image $dest", $hash, $hash_id_auteur)
+	    AND _DIR_DOC != $dossier_squelettes) {
 
 		// analyse le type de l'image (on ne fait pas confiance au nom de
 		// fichier envoye par le browser : pour les Macs c'est plus sur)
-		deplacer_fichier_upload($source, _DIR_DOC . $dest . '.tmp');
-		$size = @getimagesize(_DIR_DOC . $dest . '.tmp');
+		$f =_DIR_DOC . $dest . '.tmp';
+		deplacer_fichier_upload($source, $f);
+		$size = @getimagesize($f);
 		$type = decoder_type_image($size[2], true);
 		if ($type)
-			@rename (_DIR_DOC . $dest . '.tmp', _DIR_DOC . $dest . ".$type");
+			@rename ($f, _DIR_DOC . $dest . ".$type");
 		else
-			@unlink (_DIR_DOC . $dest . '.tmp');
+			@unlink ($f);
 	}
 }
 
diff --git a/spip_pass.php3 b/spip_pass.php3
index 17295891a6..4cd88667fe 100644
--- a/spip_pass.php3
+++ b/spip_pass.php3
@@ -17,7 +17,7 @@ utiliser_langue_visiteur();
 unset($erreur);
 
 $mode = $GLOBALS['mode'];
-
+spip_log("mode $mode");
 // recuperer le cookie de relance
 if ($p = addslashes($p)) {
 	$mode = 'oubli_pass';
@@ -117,7 +117,10 @@ else {
 		echo "\n</p>";
 
 		include_local("inc-inscription.php3");
-		echo inscription_dyn($mode);
+		include_local("inc-public-global.php3"); 
+		echo inclure_formulaire(inscription_dyn($mode,
+							$GLOBALS['mail_inscription'],
+							$GLOBALS['nom_inscription']));
 	}
 	else {
 		install_debut_html(_T('pass_erreur'));
@@ -125,12 +128,13 @@ else {
 	}
 }
 
-echo "<p align='right'>" .
+echo "<p align='right'>",
 http_script("if (window.opener) document.write(\"<a href='javascript:close();'>\");
 else document.write(\"<a href='./'>\");
-document.write(\""._T('pass_quitter_fenetre')."</a>\");"),
-"<noscript>[<a href='./'>"._T('pass_retour_public')."</a>]</noscript>
-</p>";
+document.write(\""._T('pass_quitter_fenetre')."</a>\");",
+	    '',
+	    "[<a href='./'>"._T('pass_retour_public')."</a>]"),
+  "</p>";
 
 install_fin_html();
 
-- 
GitLab