Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_couleur.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_couleur.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_couleur.php	(revision 152)
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat 2007-2008, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+// apres que le parseur a trouve les champs (mais avant l'action 'charger' des parametres)
+// ajouter automatiquement le parametre 'selecteur_couleur'
+// (ajoute les js du plugin Palette et la librairie farbtastic d'une faÃ§on mutualisable entre plugins)
+function cfg_charger_cfg_couleur($nom, &$cfg){
+
+	$cfg->param['selecteur_couleur'] = 1;
+	$cfg->ajouter_extension_parametre('selecteur_couleur');
+	    
+	return $cfg;
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_fichier.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_fichier.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_fichier.php	(revision 152)
@@ -0,0 +1,318 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat 2007-2008, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// si non definie, _COMPAT_CFG_192 vaut "_COMPAT_CFG_192" :(
+define ('_COMPAT_CFG_192',false);
+
+
+function cfg_pre_verifier_cfg_fichier($nom, &$cfg){	
+	$f = cfg_get_info_fichier_upload($nom);
+	// si pas de fichier envoye, on ne traite pas le champ
+	if (!$f['tmp_name']) {
+		unset ($cfg->champs[$nom], $cfg->extensions['cfg_fichier'][$nom]);
+	// sinon indiquer un changement
+	// pour eviter le message d'erreur "pas de changement"
+	} else {
+		set_request($nom, '<OLD>'.	$cfg->val[$nom]);
+	}
+	return $cfg;
+}
+
+
+function cfg_pre_traiter_cfg_fichier($nom, &$cfg){
+	include_spip('inc/flock');
+	
+	// enlever <OLD>
+	$cfg->val[$nom] = str_replace('<OLD>','', $cfg->val[$nom]);
+	
+	// effacement
+	if (_request('_cfg_delete')){
+		$supprimer_fichier = _COMPAT_CFG_192 ? 'cfg_supprimer_fichier' : 'supprimer_fichier';
+		if (!$supprimer_fichier(get_spip_doc($cfg->val[$nom]))) {
+			$cfg->messages['erreurs'][$nom] = _T('cfg:erreur_suppression_fichier', array('fichier'=>get_spip_doc($cfg->val[$nom])));		
+		}
+	// ajout ou modification
+	} else {
+		$f = cfg_get_info_fichier_upload($nom);
+		if ($f['tmp_name']) {
+			// suppression de l'ancien fichier
+			$supprimer_fichier = _COMPAT_CFG_192 ? 'cfg_supprimer_fichier' : 'supprimer_fichier';
+			if ($cfg->val[$nom] && !$supprimer_fichier(get_spip_doc($cfg->val[$nom]))) {
+				$cfg->messages['erreurs'][$nom] = _T('cfg:erreur_suppression_fichier', array('fichier'=>get_spip_doc($cfg->val[$nom])));	
+			} else {
+				if (!$fichier = cfg_ajoute_un_document($f['tmp_name'],$f['name'],$nom, 'config/'.$cfg->vue)){
+					$cfg->messages['erreurs'][$nom] = _T('cfg:erreur_copie_fichier', array('fichier'=>'config/'.$cfg->vue . '/' . $f['name']));	
+				} else {
+					$cfg->val[$nom] = set_spip_doc($fichier);
+				}
+			}
+		}
+	}
+
+	return $cfg;
+}
+
+
+function cfg_get_info_fichier_upload($nom){
+	return $_FILES ? $_FILES[$nom] : $GLOBALS['HTTP_POST_FILES'][$nom];
+}
+
+
+
+
+//
+// Ajouter un document (au format $_FILES)
+//
+# $source,	# le fichier sur le serveur (/var/tmp/xyz34)
+# $nom_envoye,	# son nom chez le client (portequoi.pdf)
+// (n'ajoute pas le contenu en base dans spip_documents...)
+function cfg_ajoute_un_document($source, $nom_envoye, $nom_dest, $dans='config') {
+
+	include_spip('inc/modifier');
+	include_spip('inc/ajouter_documents');
+	
+	$type_image = ''; // au pire
+	// tester le type de document :
+	// - interdit a l'upload ?
+	// - quelle extension dans spip_types_documents ?
+	// - est-ce "inclus" comme une image ?
+
+	preg_match(",^(.*)\.([^.]+)$,", $nom_envoye, $match);
+	@list(,$titre,$ext) = $match;
+	$ext = corriger_extension(strtolower($ext));
+	// ajouter l'extension au nom propose...
+	$row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'");
+
+	if ($row) {
+		$type_inclus_image = ($row['inclus'] == 'image');
+		// hum stocke dans IMG/$ext ?
+		$fichier = cfg_copier_document($ext, $nom_dest.'.'.$ext, $source, $dans);
+	} else {
+
+/* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .ZIP */
+		$type_inclus_image = false;
+
+		if (!sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) {
+			spip_log("Extension $ext interdite a l'upload");
+			return;
+		}
+
+		$ext = 'zip';
+		if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) return;
+		spip_unlink($tmp_dir); @mkdir($tmp_dir);
+		$tmp = $tmp_dir.'/'.translitteration($nom_envoye);
+		$nom_envoye .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
+		_COMPAT_CFG_192 ? cfg_deplacer_fichier_upload($source, $tmp) : deplacer_fichier_upload($source, $tmp);
+		include_spip('inc/pclzip');
+		$source = _DIR_TMP . 'archive.zip';
+		$archive = new PclZip($source);
+		$v_list = $archive->create($tmp,
+			PCLZIP_OPT_REMOVE_PATH, $tmp_dir,
+			PCLZIP_OPT_ADD_PATH, '');
+		effacer_repertoire_temporaire($tmp_dir);
+		if (!$v_list) {
+			spip_log("Echec creation du zip ");
+			return;
+		}
+		// hum too ?
+		$fichier = cfg_copier_document($ext, $nom_dest.'.zip', $source, $dans);
+		spip_unlink($source);
+	}
+
+	if ($ext == "svg") {
+		// supprimer les scripts
+		traite_svg($fichier);
+	} elseif ($ext != "mov") {// image ?
+		// Si c'est une image, recuperer sa taille et son type (detecte aussi swf)
+		$size_image = @getimagesize($fichier);
+		$type_image = decoder_type_image($size_image[2]);
+	}
+
+	// Quelques infos sur le fichier
+	if (!$fichier OR !@file_exists($fichier)
+	OR !$taille = @intval(filesize($fichier))) {
+		spip_log ("Echec copie du fichier $fichier");
+		return;
+	}
+
+	if (!$type_image) {
+		if (_DOC_MAX_SIZE > 0
+		AND $taille > _DOC_MAX_SIZE*1024) {
+			spip_unlink ($fichier);
+			check_upload_error(6,
+			_T('info_logo_max_poids',
+				array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024),
+				'actuel' => taille_en_octets($taille))));
+		}
+	}
+	else { // image
+		if (_IMG_MAX_SIZE > 0
+		AND $taille > _IMG_MAX_SIZE*1024) {
+			spip_unlink ($fichier);
+			check_upload_error(6,
+			_T('info_logo_max_poids',
+				array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024),
+				'actuel' => taille_en_octets($taille))));
+		}
+
+		if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT
+		AND ($size_image[0] > _IMG_MAX_WIDTH
+		OR $size_image[1] > _IMG_MAX_HEIGHT)) {
+			spip_unlink ($fichier);
+			check_upload_error(6, 
+			_T('info_logo_max_taille',
+				array(
+				'maxi' =>
+					_T('info_largeur_vignette',
+						array('largeur_vignette' => _IMG_MAX_WIDTH,
+						'hauteur_vignette' => _IMG_MAX_HEIGHT)),
+				'actuel' =>
+					_T('info_largeur_vignette',
+						array('largeur_vignette' => $size_image[0],
+						'hauteur_vignette' => $size_image[1]))
+			)));
+		}
+	}
+
+	return $fichier;
+}
+
+
+
+function cfg_copier_document($ext, $orig, $source, $dans='_cfg') {
+
+	$orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc
+	$dir = cfg_creer_repertoire_cfg($dans);
+	$dest = preg_replace("/[^._=-\w\d]+/", "_", 
+			translitteration(preg_replace("/\.([^.]+)$/", "", 
+						      preg_replace("/<[^>]*>/", '', basename($orig)))));
+
+	// ne pas accepter de noms de la forme -r90.jpg qui sont reserves
+	// pour les images transformees par rotation (action/documenter)
+	$dest = preg_replace(',-r(90|180|270)$,', '', $dest);
+	
+	$newFile = $dir . $dest .'.'.$ext;
+
+	return _COMPAT_CFG_192 ? cfg_deplacer_fichier_upload($source, $newFile) : deplacer_fichier_upload($source, $newFile);
+}
+
+
+// Creer IMG/config/vue
+// comme "creer_repertoire_documents" mais avec 2 profondeurs
+function cfg_creer_repertoire_cfg($ext) {
+	list($racine, $vue) = explode('/',$ext,2);
+	if ($rep = sous_repertoire(_DIR_IMG, $racine)){
+		$rep = sous_repertoire(_DIR_IMG.$racine, $vue);
+	}
+
+	if (!$ext OR !$rep) {
+		spip_log("creer_repertoire_cfg interdit");
+		exit;
+	}
+
+	// Cette variable de configuration peut etre posee par un plugin
+	// par exemple acces_restreint
+	if ($GLOBALS['meta']["creer_htaccess"] == 'oui') {
+		include_spip('inc/acces');
+		verifier_htaccess($rep);
+	}
+
+	return $rep;
+}
+
+
+
+// compat 1.9.2 :
+// il y a plein de fonctions qui ont change !!
+if (_COMPAT_CFG_192) {
+	
+	// pas de securite tuante sur .. comme en 1.9.3
+	// retourner la destination comme 1.9.3
+	function cfg_deplacer_fichier_upload($source, $dest, $move=false) {
+		// Securite
+		if (substr($dest,0,strlen(_DIR_RACINE))==_DIR_RACINE)
+			$dest = _DIR_RACINE.preg_replace(',\.\.+,', '.', substr($dest,strlen(_DIR_RACINE)));
+		else
+			$dest = preg_replace(',\.\.+,', '.', $dest);
+
+		if ($move)	$ok = @rename($source, $dest);
+		else				$ok = @copy($source, $dest);
+		if (!$ok) $ok = @move_uploaded_file($source, $dest);
+		if ($ok)
+			@chmod($dest, _SPIP_CHMOD & ~0111);
+		else {
+			$f = @fopen($dest,'w');
+			if ($f) {
+				fclose ($f);
+			} else {
+				include_spip('inc/headers');
+				redirige_par_entete(generer_url_action("test_dirs", "test_dir=". dirname($dest), true));
+			}
+			@unlink($dest);
+		}
+		return $ok ? $dest : false;
+	}
+	
+	
+	//
+	// Supprimer le fichier de maniere sympa (flock)
+	// renvoyer true comme 1.9.3 !!!
+	function cfg_supprimer_fichier($fichier) {
+		if (!@file_exists($fichier))
+			return true;
+
+		// verrouiller le fichier destination
+		if ($fp = @fopen($fichier, 'a'))
+			@flock($fp, LOCK_EX);
+		else
+			return false;
+
+		// liberer le verrou
+		@flock($fp, LOCK_UN);
+		@fclose($fp);
+
+		// supprimer
+		return @unlink($fichier);
+	}
+	
+	
+	// compat 1.9.2
+	// donne le chemin du fichier relatif a _DIR_IMG
+	// pour stockage 'tel quel' dans la base de donnees
+	if (!function_exists('set_spip_doc')){
+		function set_spip_doc($fichier) {
+			if (strpos($fichier, _DIR_IMG) === 0)
+				return substr($fichier, strlen(_DIR_IMG));
+			else
+				return $fichier; // ex: fichier distant
+		}
+	}
+
+
+	// compat 1.9.2
+	// donne le chemin complet du fichier
+	if (!function_exists('get_spip_doc')){
+		function get_spip_doc($fichier) {
+			// fichier distant
+			if (preg_match(',^\w+://,', $fichier))
+				return $fichier;
+
+			// gestion d'erreurs, fichier=''
+			if (!strlen($fichier))
+				return false;
+
+			// fichier normal
+			return (strpos($fichier, _DIR_IMG) === false)
+				? _DIR_IMG . $fichier
+				: $fichier;
+		}
+	}	
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_id.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_id.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/cfg_id.php	(revision 152)
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat 2007-2008, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+// apres que le parseur a trouve les champs
+function cfg_pre_charger_cfg_id($nom, &$cfg){
+
+	// id a renseigner
+	$cfg->champs[$nom]['id'] = count($cfg->champs_id);
+	$cfg->champs_id[] = $nom;	
+
+	// Cas des champs multi, si des champs (Y)
+	// sont declares id par la classe cfg_id,
+	// <input type='x' name='Yn' class='cfg_id'>
+	// on les ajoute dans le chemin pour retrouver les donnees
+	// #CONFIG{.../y1/y2/y3/...}
+	// 
+	if (_request('_cfg_affiche')) {
+		$cfg->param['cfg_id'] = implode('/', array_map('_request', $cfg->champs_id));
+	} 
+	    
+	return true;
+}
+
+
+function cfg_pre_traiter_cfg_id($nom, &$cfg){
+	
+	// lorsque c'est un champ de type multi que l'on modifie 
+	// et si l'identifiant a change,  il faut soit le copier, soit de deplacer
+	//
+	// pour ca, on compare le hidden name='cfg_id' aux champs editables 
+	// qui ont la classe css 'cfg_id'
+	if ($cfg->champs_id) {
+		$new_id = implode('/', array_map('_request', $cfg->champs_id));
+		if ($new_id != $cfg->param['cfg_id']){
+			// si c'est un deplacement, on efface
+			if (!_request('_cfg_copier')) {
+				// et ne pas perdre les valeurs suite a l'effacement dans ce cas precis
+				$vals = $cfg->val;
+				$cfg->effacer();
+				$cfg->val = $vals;
+			}
+			$cfg->param['cfg_id'] = $new_id;
+			// recreer un depot avec le nouvel identifiant 
+			// (sinon les requetes ne creent pas les bons 'where')
+			include_spip('inc/cfg_config');
+			$cfg->depot = new cfg_depot($cfg->param['depot'], $cfg->params);
+			// recharger le formulaire avec le nouvel identifiant (sinon les parametres 
+			// <!-- param=valeur --> de formulaires qui contienent 
+			// #ENV{cfg_id} ou #ENV{id} ne sont pas a jour)
+			$cfg->formulaire();
+		}
+	}	
+	
+	return true;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_id.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_id.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_id.php	(revision 152)
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat 2007-2008, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+function cfg_verifier_type_id($champ, &$cfg){
+	if (!preg_match('#^[a-z_]\w*$#', $cfg->val[$champ])){
+		$cfg->ajouter_erreur(_T('cfg:erreur_type_id', array('champ'=>$champ)));
+	}
+	return true;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_idnum.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_idnum.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_idnum.php	(revision 152)
@@ -0,0 +1,22 @@
+<?php
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat 2007-2008, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function cfg_verifier_type_idnum($champ, &$cfg){
+	if (!is_numeric($cfg->val[$champ])){
+		$cfg->ajouter_erreur(_T('cfg:erreur_type_idnum', array('champ'=>$champ)));
+	}
+	return true;
+}
+
+function cfg_pre_traiter_type_idnum($champ, &$cfg){
+	$cfg->val[$champ] = intval($cfg->val[$champ]);
+	return true;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_pwd.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_pwd.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/classes/type_pwd.php	(revision 152)
@@ -0,0 +1,18 @@
+<?php
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat 2007-2008, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function cfg_verifier_type_pwd($champ, &$cfg) {
+	if (strlen($cfg->val[$champ]) < 5){
+		$cfg->ajouter_erreur($champ, _T('cfg:erreur_type_pwd', array('champ'=>$champ)));
+	}
+	return true;
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/params/rediriger.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/params/rediriger.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/params/rediriger.php	(revision 152)
@@ -0,0 +1,42 @@
+<?php
+
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ */
+
+
+// restaure des messages serialises dans une meta 'cfg_message_{id_auteur}'
+//
+// si le formulaire cfg avait demande une redirection... 
+// (et provient de cette redirection), il est possible
+// qu'il y ait un message a afficher
+function cfg_pre_charger_param_rediriger($valeur, &$cfg){
+	if ($messages = $GLOBALS['meta']['cfg_message_'.$GLOBALS['auteur_session']['id_auteur']]){
+			include_spip('inc/meta');
+			effacer_meta('cfg_message_'.$GLOBALS['auteur_session']['id_auteur']);
+			if (defined('_COMPAT_CFG_192')) ecrire_metas();
+			$cfg->messages = array_merge($cfg->messages, unserialize($messages));
+	}	
+}
+
+
+// Si le fond du formulaire demande expressement une redirection
+// par <!-- rediriger=1 -->, on stocke le message dans une meta
+// et on redirige le client, de maniere a charger la page
+// avec la nouvelle config (ce qui permet par exemple a Autorite
+// de controler d'eventuels conflits generes par les nouvelles autorisations)
+function cfg_post_traiter_param_rediriger($valeur, &$cfg){
+	if ($cfg->messages) {
+		include_spip('inc/meta');
+		ecrire_meta('cfg_message_'.$GLOBALS['auteur_session']['id_auteur'], serialize($cfg->messages), 'non');
+		if (defined('_COMPAT_CFG_192')) ecrire_metas();
+		include_spip('inc/headers');
+		redirige_par_entete(parametre_url(self(),null,null,'&'));
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/params/selecteur_couleur.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/params/selecteur_couleur.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg/params/selecteur_couleur.php	(revision 152)
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat, dF 2008, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ * 
+ * Patch de compatibilitÃ© avec classe cfg_couleur, OBSOLETE (utilisez la classe palette) 
+ */
+
+
+function cfg_charger_param_selecteur_couleur($valeur, &$cfg){
+	// si provient d'un CVT, on met inline, sinon dans head
+	$ou = ($cfg->depuis_cvt) ? 'inline':'head';
+	// si le plugin Palette est installÃ©, on patche
+	if (is_dir(find_in_path(_DIR_PLUGIN_PALETTE))) {
+		$cfg->param[$ou] .= "
+<style>
+.colorpicker {position: relative;}
+</style>
+<script type='text/javascript'>
+//<![CDATA[
+jQuery(document).ready(function() {
+	jQuery('input.cfg_couleur').each(function() {
+		jQuery(this).addClass('palette');
+		jQuery(this).removeClass('cfg_couleur');
+	});
+	init_palette(); // relancer la palette pour prendre en compte les changements precedents (et pour les cas ajax)
+});
+//]]>
+</script>
+";
+	}
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_fonctions.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_fonctions.php	(revision 152)
@@ -0,0 +1,148 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+# CONFIG 
+
+
+// #CONFIG retourne lire_config()
+// 
+// Le 3eme argument permet de controler la serialisation du resultat
+// (mais ne sert que pour le depot 'meta') qui doit parfois deserialiser
+// ex: |in_array{#CONFIG{toto,#ARRAY,1}}.
+// Ceci n'affecte pas d'autres depots et |in_array{#CONFIG{toto/,#ARRAY}} sera equivalent
+// car du moment qu'il y a un /, c'est le depot 'metapack' qui est appelle.
+//
+function balise_CONFIG($p) {
+	if (!$arg = interprete_argument_balise(1,$p)) {
+		$arg = "''";
+	}
+	$sinon = interprete_argument_balise(2,$p);
+	$unserialize = sinon(interprete_argument_balise(3,$p),"false");
+
+	$p->code = 'lire_config(' . $arg . ',' . 
+		($sinon && $sinon != "''" ? $sinon : 'null') . ',' . $unserialize . ')';	
+
+	return $p;
+}
+
+
+
+# CFG_CHEMIN
+
+//
+// La balise CFG_CHEMIN retourne le chemin d'une image stockee
+// par cfg.
+//
+// cfg stocke : 'config/vue/champ.ext' (ce qu'affiche #CONFIG)
+// #cfg_chemin retourne l'adresse complete : 'IMG/config/vue/champ.ext'
+//
+function balise_CFG_CHEMIN_dist($p) {
+	if (!$arg = interprete_argument_balise(1,$p)) {
+		$arg = "''";
+	}
+	$sinon = interprete_argument_balise(2,$p);
+	
+	$p->code = '($l = lire_config(' . $arg . ',' . 
+		($sinon && $sinon != "''" ? $sinon : 'null') . ')) ? _DIR_IMG . $l : null';		
+	
+	return $p;
+}
+
+
+
+# CFG_ARBO
+
+
+/*
+ * Affiche une arborescence du contenu d'un #CONFIG
+ * 
+ * #CFG_ARBO, 
+ * #CFG_ARBO{ma_meta}, 
+ * #CFG_ARBO{~toto}, 
+ * #CFG_ARBO{ma_meta/mon_casier},
+ * #CFG_ARBO{ma_table:mon_id/mon_champ}
+ * 
+ */
+function balise_CFG_ARBO_dist($p) {
+	if (!$arg = interprete_argument_balise(1,$p)) {
+		$arg = "''";
+	}
+	$p->interdire_scripts = false;
+	$p->code = 'cfg_affiche_arborescence(' . $arg . ')';
+	return $p;
+}
+
+function cfg_affiche_arborescence($cfg='') {
+
+	$sortie = '';
+	$hash = substr(md5(rand()*rand()),0,6);
+	
+	// integration du css
+	// Suppression de cette inclusion des css arbo au profit d'une inclusion d'un fichier cfg.css dans le header prive
+// 	$sortie .= "<style type='text/css'>\n"
+// 			.  ".cfg_arbo{}\n"
+// 			.  ".cfg_arbo h5{padding:0.2em 0.2em; margin:0.2em 0; cursor:pointer;}\n"
+// 			.  ".cfg_arbo ul{border:1px solid #ccc; margin:0; padding:0.2em 0.5em; list-style-type:none;}\n"
+// 			.  "</style>\n";
+
+	// integration du js	
+	$sortie .= "<script type='text/javascript'><!--
+				
+				$(document).ready(function(){
+					function cfg_arbo(){
+						jQuery('#cfg_arbo_$hash ul').hide();
+						jQuery('#cfg_arbo_$hash h5')
+						.prepend('<strong>[+] <\/strong>')
+						.toggle(
+						  function () {
+							$(this).children('strong').text('[-] ');
+							$(this).next('ul').show();
+						  },
+						  function () {
+							$(this).children('strong').text('[+] ');
+							$(this).next('ul').hide();
+						  });						
+					}
+					setTimeout(cfg_arbo,100);
+
+				});
+				// --></script>\n";
+				
+	$tableau = lire_config($cfg);
+	if ($c = @unserialize($tableau)) $tableau = $c;
+	
+	if (empty($cfg)) $cfg = 'spip_meta';
+	// parcours des donnees
+	$sortie .= 
+		"<div class='cfg_arbo' id='cfg_arbo_$hash'>\n" .
+		cfg_affiche_sous_arborescence($cfg, $tableau) .
+		"\n</div>\n";
+
+
+	return $sortie;
+}
+
+function cfg_affiche_sous_arborescence($nom, $tableau){
+	$sortie = "\n<h5>$nom</h5>\n";
+	$sortie .= "\n<ul>";
+	if (is_array($tableau)){
+		ksort($tableau);
+		foreach ($tableau as $tab=>$val){
+			if (is_array($val)) 
+				$sortie .= cfg_affiche_sous_arborescence($tab, $val);
+			elseif (false !== $v = @unserialize($val))
+				$sortie .= cfg_affiche_sous_arborescence($tab, $v);
+			else
+				$sortie .= "<li>$tab = " . htmlentities($val) ."</li>\n";
+			
+		}
+	} else {
+		$sortie .= "<li>$nom = " . htmlentities($tableau) . "</li>";
+	}
+	$sortie .= "</ul>\n";
+	return $sortie;	
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_options.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_options.php	(revision 152)
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat 2007-2008, distribue sous licence GNU/GPL
+ * 
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+// Compatibilite 1.9.2
+if (version_compare($GLOBALS['spip_version_code'],'1.9300','<'))
+	include_spip('inc/compat_cfg');
+	
+// inclure les fonctions lire_config(), ecrire_config() et effacer_config()
+include_spip('inc/cfg_config');
+
+// signaler le pipeline de notification
+$GLOBALS['spip_pipeline']['cfg_post_edition'] = "";
+$GLOBALS['spip_pipeline']['editer_contenu_formulaire_cfg'] = "";
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_pipeline.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_pipeline.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/cfg_pipeline.php	(revision 152)
@@ -0,0 +1,179 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// Ajoute le bouton d'amin aux webmestres
+function cfg_ajouter_boutons($flux) {
+	// si on est admin
+	if (autoriser('configurer','cfg')) {
+	  // on voit le bouton dans la barre "configuration"
+		$flux['configuration']->sousmenu['cfg']= new Bouton(
+		"../"._DIR_PLUGIN_CFG."cfg-22.png",  // icone
+		_T('cfg:CFG'));
+	}
+	return $flux;
+}
+
+
+/*
+ * Gerer l'option <!-- head= xxx --> des fonds CFG
+ * uniquement dans le prive
+ */
+function cfg_header_prive($flux){
+	
+	if (!_request('cfg') || (!_request('exec') == 'cfg')) {
+		return $flux;
+	}
+
+	// Ajout des css de cfg (uniquement balise arbo pour l'instant) dans le header prive
+	$flux .= '<link rel="stylesheet" href="'._DIR_PLUGIN_CFG.'css/cfg.css" type="text/css" media="all" />';
+
+	include_spip('inc/filtres');
+	include_spip('inc/cfg_formulaire');
+	$config = &new cfg_formulaire(
+				sinon(_request('cfg'), ''),
+				sinon(_request('cfg_id'),''));
+	
+	if ($config->param['head']) 
+		$flux .= "\n".$config->param['head'];
+	
+	return $flux;
+}
+
+
+
+
+// teste si $form n'est pas un formulaire CVT deja existant
+// (et non un formulaire CFG nomme $form en CVT)
+// #FORMULAIRE_TOTO <> #FORMULAIRE_CFG{toto}
+function est_cvt($form){
+	$f = 'formulaires_' . $form;
+	return (function_exists($f . '_stat')
+		OR function_exists($f . '_charger_dist')
+		OR function_exists($f . '_charger')
+		OR function_exists($f . '_verifier_dist')
+		OR function_exists($f . '_verifier')
+		OR function_exists($f . '_traiter_dist')
+		OR function_exists($f . '_traiter')	
+		);
+}
+
+# Formulaires CFG CVT
+function cfg_formulaire_charger($flux){
+	// s'il n'y a pas de fonction charger, on utilise le parseur de CFG
+	$form = $flux['args']['form'];
+	if (!est_cvt($form)){
+
+		// ici, on a le nom du fond cfg... 
+		// on recupere donc les parametres du formulaire.	
+		include_spip('inc/cfg_formulaire');
+		#$config = &new cfg_formulaire($cfg, $cfg_id);
+		$cfg_id = isset($flux['args']['args'][0]) ? $flux['args']['args'][0] : '';
+		$config = &new cfg_formulaire($form, $cfg_id);
+
+		$valeurs = array(
+			'_cfg_fond' => 'formulaires/'.$form,
+			'_cfg_nom' => $form,
+			'id' => $cfg_id,
+			// passer aussi les arguments spÃ©cifiques a cfg
+			'_cfg_' => $config->creer_hash_cfg() // passer action=cfg pour avoir un hash formulaire correct
+		);
+
+		// il faut passer les noms des champs (input et consoeurs) de CFG dans l'environnement
+		// pour pouvoir faire #ENV{nom_du_champ}
+		if (is_array($config->val)){
+			foreach($config->val as $nom=>$val){
+				$valeurs[$nom] = $val;	
+			}
+		}
+
+		if (!$config->autoriser()) {
+			$valeurs['editable'] = false;
+		} else {
+			$valeurs['editable'] = true;
+		}
+		
+		$valeurs['_pipeline'] = array('editer_contenu_formulaire_cfg',
+			'args'=>array(
+				'nom'=>$form,
+				'contexte'=>$valeurs,
+				'ajouter'=>$config->param['inline'])
+			);
+		$flux['data'] = $valeurs;
+		// return $valeurs; // retourner simplement les valeurs
+		#return array(true,$valeurs); // forcer l'etat editable du formulaire et retourner les valeurs
+
+	}
+	return $flux;
+}
+
+function cfg_formulaire_verifier($flux){
+
+	$form = $flux['args']['form'];
+	if (!est_cvt($form)){
+		include_spip('inc/cfg_formulaire');
+		#$config = &new cfg_formulaire($cfg, $cfg_id);
+		$cfg_id = isset($flux['args']['args'][0]) ? $flux['args']['args'][0] : '';
+		$config = &new cfg_formulaire($form, $cfg_id);
+		
+		$err = array();
+
+		if (!$config->verifier() && $e = $config->messages){
+			if (isset($e['message_refus'])) {
+				$err['message_erreur'] = $e['message_refus'];
+			} else {
+				if (count($e['erreurs']))  $err = $e['erreurs'];
+				if (count($e['message_erreur']))  $err['message_erreur'] = join('<br />',$e['message_erreur']);
+				if (count($e['message_ok']))  $err['message_ok'] = join('<br />',$e['message_ok']);
+			}		
+		}
+
+		$flux['data'] = $err;
+		
+		// si c'est vide, modifier sera appele, sinon le formulaire sera resoumis
+		// a ce moment la, on transmet $config pour eviter de le recreer 
+		// juste ensuite (et de refaire les analyse et la validation)
+		if (!$err) cfg_instancier($config);
+	}
+	return $flux;
+}
+
+// sauve ou redonne une instance de la classe cfg.
+// sert a transmettre $config entre verifier() et traiter()
+// car $flux le perd en cours de route si on lui donne...
+function cfg_instancier($config=false){
+	static $cfg=false; 
+	if (!$config) return $cfg;
+	return $cfg = $config;
+}
+
+// traitement du formulaire
+function cfg_formulaire_traiter($flux){
+	$form = $flux['args']['form'];
+	if (!est_cvt($form)){
+		$config = cfg_instancier();
+
+		$config->traiter();	
+		$message = join('<br />',$config->messages['message_ok']);	
+
+		$flux['data'] = array(true,$message); // forcer l'etat editable du formulaire et retourner le message
+	}
+	return $flux;
+}
+
+// pipeline sur l'affichage du contenu 
+// pour supprimer les parametres CFG du formulaire
+function cfg_editer_contenu_formulaire_cfg($flux){
+	$flux['data'] = preg_replace('/(<!-- ([a-z0-9_]\w+)(\*)?=)(.*?)-->/sim', '', $flux['data']);
+	$flux['data'] .= $flux['args']['ajouter'];
+	return $flux;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/changelog.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/changelog.txt	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/changelog.txt	(revision 152)
@@ -0,0 +1,308 @@
+v1.10.5 (09 12 2008)
+  * ajout des filtres et, ou, xou, non, oui pour compat 1.9.2
+  * ajout du filtre push pour compat 1.9.2
+  
+v1.10.3 (14 09 2008)
+  * ne pas prendre le traiter() de CFG si c'est un formulaire CVT normal !
+
+v1.10.2 (02 09 2008)
+- petites simplifications :
+
+  * lire,ecrire,effacer_config() ne peuvent plus etre surchargees 
+    (suppression de inc_lire_config_dist et consoeurs)
+    
+  * les types de validation des champs de formulaires passes par css
+    recoivent le mÃªme argument que les autres classes css 
+    (nom du champ + instance de la classe cfg_formulaire) et introduction
+    d'une fonction ajouter_erreur($champ,$message) dans la classe cfg_formulaire
+    pour faciliter cela.
+    
+  * permettre des fonctions d'extension pour toutes les actions pour
+    un formulaire particulier, et pas uniquement verifier et post_traiter.
+    function cfg_{nom_fichier/vue}_{action}(&$cfg){... actions ...}
+    
+    Au passage, changement d'api pour le test de verifier, qui comme
+    les autres maintenant recoit l'instance de la classe cfg_formulaire :
+    function cfg_{nom_fichier/vue}_{action}(&$cfg), mais son retour
+    doit sauvegarder les valeurs d'erreurs dans cfg (et non les retourner)
+    en utilisant la fonction $cfg->ajouter_erreurs($erreurs); 
+    (compatibilitÃ© ascendente assurÃ©e cependant quelques temps)
+    
+  * CFG/CVT : transmission de l'instance de classe cfg_formulaire entre la
+    fonction verifier() et traiter() du CVT pour eviter les recalculs des 
+    parametres et une reverification dans traiter().
+
+v1.10.1
+- un echo de debug trainait
+
+v1.10.0
+- corrections pour palette, changement de version pour marquer le changement de compat (necessite Palette pour les couleurs)
+
+v1.9.8 (01 08 2008)
+- usage du plugin Palette pour permettre la mutualisation de la librairie farbtastic entre plugins
+
+v1.9.7 (30 07 2008)
+- si on ne trouve pas de fichier au nom du fond, on n'essaie pas de le compiler...
+
+v1.9.6 (23 07 2008)
+- Suivre la svn de SPIP : le formulaire CVT charger() change la signature de son retour.
+
+v1.9.5 (23 07 2008)
+- On introduit <!-- inline= --> (sert notamment au selecteur de couleur, pour l'avoir aussi en cvt.)
+- On introduit la possibilite de faire des actions 'post_traiter' simplement depuis un nom de formulaire :
+si un formulaire cfg possede une fonction 'cfg_{nom}_post_traiter(&$cfg)', elle sera appelee apres le traitement par CFG,
+en lui transmettant la classe php $cfg.
+- Ne pas utiliser le parseur CFG sur les formulaires dynamiques qui ont une fonction _stat() (et non une fonction _charger()
+
+v1.9.4 (17 07 2008)
+- ajout de compat 1.9.2 pour sql_allfetsel()
+
+v1.9.3 (16 07 2008)
+- Permettre d'ajouter des #FORMULAIRE_XX dans des fonds/cfg_yy.html
+- introduction d'un parametre interpreter. Si <!-- interpreter=non -->
+alors le fonds/cfg_yy.html ne cherche pas a recuperer les champs du formulaire
+en scannant le code compile. Ainsi, il est possible de creer des fonds de configuration
+cfg en appelant des #FORMULAIRE_XX. Le fond ne prendra pas Ã  tord des parametres
+du/des #FORMULAIRE inclus. Par contre, un tel fond ne peut pas avoir de formulaire
+CFG classique en mÃªme temps (on ne peut melanger) ;Mais un fond de ce type
+peut appeler plusieurs #FORMULAIRE differents.
+Les parametres <!-- param=valeurs --> continuent d'etre lus, ce qui permet d'indiquer
+des liens, des autorisations ou autre parametre comme le font normalement les fonds CFG.
+
+v1.9.2 (14 07 2008)
+- Corrections depots tablepack et table qui testaient leurs parametres un peu trop tot,
+ce qui effacait parfois les valeurs par defaut, apres coup.
+
+v1.9.1 (14 07 2008)
+- Correction depot tablepack qui oubliait de prendre en compte le nom du formulaire dans
+l'enregistrement depuis v1.8.2.
+
+v1.9.0 (14 07 2008)
+- Lorsqu'un formulaire SPIP 2 / CVT n'a pas de fonction charger(), ce sont les
+fonctions Charger, Verifier et Traiter de CFG qui sont utilisees pour ce formulaire.
+Cela permet des #FORMULAIRE_XX ou XX est un formulaire CFG/CVT formulaires/xx.html.
+Il peut ainsi y avoir des formulaires CFG public/prive, ajax ou non (et qui fonctionnent !).
+Differences entre un fonds/cfg_xx.html et formulaires/xx.html :
+	* les fonds/ s'affichent dans ?exec=cfg, pas les formulaires/
+	* les fonds/ ont [(#ENV{_cfg_}|form_hidden)], pas les formulaires/
+	* en revanche, les formulaires ont #ACTION_FORMULAIRE{#SELF}, pas les fonds/
+- Correction du preg_files() sur les fonds/ pour ne prendre reellement
+que des fichiers commencant par 'cfg_' (et non aussi le contenu d'un dossier
+commencant par cfg_)
+- Deplacements des exemples de fonds cfg dans le plugin cfg_exemples
+- la syntaxe #FORMULAIRE_CFG{xx} disparait au profit de #FORMULAIRE_XX
+- si le parametre <!-- autoriser=oui --> alors, on autorise.
+S'il est egal a non, alors on n'autorise pas. Permet d'ecrire :
+<!-- autoriser=[(#AUTORISER{modifier,auteur,#ID_AUTEUR}|?{oui,non})]-->
+les syntaxes <!-- autoriser=webmestre --> continuent de fonctionner.
+
+v1.8.2 (07 07 2008)
+- Corection d'un bug sur le depot tablepack avec effacer_config().
+- tests unitaires pour le depot tablepack
+
+v1.8.1 (06 07 2008)
+- Correction bug introduit en 1.8.0 d'erreur de lecture si aucune valeur
+n'etait encore enregistrees dans une depot metapack ou php.
+
+v1.8.0 (04 07 2008)
+- Simplifier *_config() en se passant de la classe cfg_params()
+- les fonctions des balises sont chargÃ©es au calcul et non en permanence et sont deplacees dans cfg_fonctions.php
+- suppression de cfg_charger_classe() : la surchage, c'est simplement le fichier, on se passe de _dist
+- dÃ©placemeent de la classe cfg_depot dans inc/cfg_config
+- tests unitaires pour les fonctions lire_config, ecrire_config et effacer_config pour les dÃ©pots meta, metapack et php
+- lire_config metapack et php ne renvoyaient pas NULL si la mÃ©ta ou le fichier php etait absent
+- CFG ne supporte plus l'Ã©criture (hack) #CONFIG{expression,'',''}, Ã  remplacer par #CONFIG{expression,#ARRAY}
+
+v1.7.6 (27 06 2008)
+- Correction bug avec ecrire_config(php::...)
+
+v1.7.5 (26 05 2008)
+- Corrections de la librairie sql_* pour 1.9.2
+
+v1.7.4 (08 05 2008)
+- Ne pas lister tous les formulaires cfg dans la page de gestion de plugin, mais seulement ceux avec l'onglet sur "oui"
+
+v1.7.3 (23 04 2008)
+- correction compat sql_showtable() sur 1.9.2 (fil)
+- suivi svn pour les formulaires dynamiques (necessitent 'action')
+(les formululaires #FORMULAIRE_CFG fonctionnent maintenant aussi dans le prive)
+
+v1.7.2 (16 04 2008)
+- mettre sql_count() et sql_selectdb() dans les fonctions de compatibilite
+ceci pour d'autres plugins souhaitant eventuellement les utiliser en 1.9.2
+
+v1.7.1 (07 04 2008)
+- correction bug sur effacer_config(metapack::xx)
+
+v1.7.0 (05 04 2008)
+- installation de librairies via la page ?exec=cfg_install_libs, presque automatique en 1.9.3
+- les librairies installables sont definies dans une globale $cfg_libs (cf. cfg_options.php)
+- internationalisation types et installation de libs
+
+v1.6.5 (05 04 2008)
+- effectivement passer dans l'environnement 'message_erreur', 'message_ok' et 'erreurs'
+- eviter que #ACTION_FORMULAIRE affiche son contenu en 1.9.2
+
+v1.6.4 (05 04 2008)
+- les classes css des champs sont toutes analysees. Elles doivent etre placees juste apres name="...".
+- si une classe css 'cfg_couleur' est presente et si la librairie 'farbtastic' est installee,
+une pipette sera proposee pour selectionner la couleur. exemple :
+<input type="text" name="liens" class="fondl cfg_couleur" value="[(#ENV{liens}|sinon{#467AA7})]" size="7" />
+
+v1.6.3 (04 04 2008)
+- utiliser les points d'entrees de cfg pour definir des actions sur les parametres
+et application avec le parametre 'rediriger'
+
+v1.6.2 (04 04 2008)
+- eviter double INSERT HEAD sous 1.9.2
+
+v1.6.1 (02 04 2008)
+- retrouver le fonctionnement d'avant v1.4.10 sur #CONFIG{meta} ET lire_config{meta}.
+Cette derniere deserialise une meta de spip par defaut, contrairement a la premiere.
+
+v1.6.0 (02 04 2008)
+- introduire la prise en compte des <input type='file'...
+qui met automatiquement un type 'cfg_fichier' sur le champ.
+Celui-ci va stocker le fichier dans IMG/config/{vue}/{champ}.ext,
+et son adresse peut etre appelee par #CFG_CHEMIN{nom/champ}
+
+v1.5.2 (31 03 2008)
+- sur les verifications des champs, en plus de verifier les champs de type 'cfg_xx' ou 'type_xx',
+chercher une fonction 'cfg_{vue}_verifier()' fonctionnant exactement pareil que la fonction homologue
+sur la nouvelle api des formulaires dynamiques de spip. Cette fonction peut etre placee dans un fichier
+fonds/cfg_{vue}_fonctions.php
+
+v1.5.1 (31 03 2008)
+- premiers jets d'api pour les verifications de types de champs
+- corrections bugs sur #ENV{cfg_id} dans les parametres <!-- param=valeur --> mal raffraichis
+
+v1.5.0 (30 03 2008)
+- nettoyages, suppression de la gestion de l'ancienne api des depots
+- retour du fonctionnement en php4 casse pendant la migration des depots
+- correction petit bug si $GLOBALS['meta']['nom'] est un array()
+
+v1.4.12 (30 03 2008)
+- depot 'table', c'etait le dernier...
+- corrections bugs sur #cfg_arbo, #config et sur la fonction $this->monter_arbre()
+
+v1.4.11 (30 03 2008)
+- corrections bugs sur 'cfg_id' modifie parfois a tord par new_id,
+- rangements dans les classes depots, et retour de messages depuis les depots possible
+- depot 'tablepack' en nouvelle api
+
+v1.4.10 (29 03 2008)
+- corrections bugs sur : #CONFIG et |in_array{#CONFIG{nom,'',''}} (preferer #CONFIG{nom/,#ARRAY})
+- ecrire_config() n'a plus le parametre 'serialize',
+par defaut : ecrire_config('nom',$valeur) ne serialise pas (comme une meta classique)
+alors que : ecrire_config('nom/',$valeur) ou ecrire_config('nom/champ',$valeur) va serialiser dans spip_meta
+- si l'on passe le nom du depot, c'est lui qui gere la serialisation ou non des donnees :
+ecrire_config('meta::nom',$valeur) ne serialise pas
+ecrire_config('metapack::nom',$valeur) serialise (pas besoin du /)
+
+
+v1.4.9 (28 03 2008)
+- depot 'metapack' en nouvelle api
+
+v1.4.8 (27 03 2008)
+- depot 'php' en nouvelle api (on commence par le plus simple !)
+- suivi svn pour api formulaires : charger/verifier/traiter
+
+v1.4.7 (26 03 2008)
+- corrections bugs sur les champs multiples et les tables
+- renommages de variables et doc
+- retour de 'cfg_id' dans #ENV
+
+v1.4.6 (26 03 2008)
+- deplacement des affichages dans l'exec plutot que dans la classe cfg (fin)
+- correction bug sur le chargement des depots dans les fonctions lire_config qui transformaient un array en "array"
+- API pour les fichiers de depots lire(), ecrire() et effacer() qui retournent array($ok, array("nom"=>"val"))
+(ancienne api toujours fonctionnelle [lire() et modifier($supprimer)], les depots autres que 'meta' seront portes vers la nouvelle api)
+
+v1.4.5 (25 03 2008)
+- deplacement des affichages dans l'exec plutot que dans la classe cfg
+- correction bug en 1.9.2 (il ne faut pas passer "editable" dans le contexte d'un recuperer_fond() !)
+
+v1.4.4 (24 03 2008)
+- naissance de l'indÃ©pendance du depot 'meta'
+- lire/ecrire/effacer_config utilisent le depot meta
+
+v1.4.3 (23 03 2008)
+- permettre la surcharge de lire_config, ecrire_config et effacer_config (a travers les fonctions inc_lire_config_dist())
+- permettre la surcharge des classes 'cfg','cfg_formulaire','cfg_params','cfg_depot'.
+- uniformiser un peu les messages d'erreur entre cfg et les formulaires dynamiques
+
+v1.4.2 (23 03 2008)
+- deplacement des storage cfg (maintenant appeles 'depot') dans inc/depot/nom.php
+- renommage du depot 'classic' en 'meta', suppression du depot 'extrapack' au profit de tablepack + colonne
+
+v1.4.1 (23 03 2008)
+- deplacement des parametres de cfg dans une seule entree $this->param
+
+v1.4.0 (22 03 2008)
+- #FORMULAIRE_CFG{nom_du_cfg} fonctionnant avec la nouvelle API des formulaires dynamiques (1.9.3dev)
+- quelques changements dans les noms de fonctions, suppression des anciens #formulaire_cfg
+- thÃ©oriquement pas de rupture de compatibilitÃ©
+- dÃ©placement de l'icone cfg dans le sous menu 'configuration' (et non dans l'onglet du meme nom)
+
+v1.3.8 (25.02.2008)
+- correction bug introduit en 1.3.7 (doublement des liens)
+
+v1.3.7 (24.02.2008)
+- nouvelle option <!-- head= --> qui permet d'ajouter du contenu dans le
+head de l'espace privÃ© lorsque le fond en question est actif.
+- bien supprimer les parametres CFG du code html rendu
+
+v1.3.6 (24.02.2008)
+- les onglets s'enrichissent d'une nouvelle syntaxe.
+Il existait <!-- onglet=non --> qui n'affichait pas l'onglet, il y a maintenant
+<!-- onglet=fond_cfg_parent --> qui n'affiche pas l'onglet, mais va "exposer"
+le fond choisi si le fond courant est actif. (Il faut que le fond choisi
+ait son onglet visible par contre - ie: onglet=oui ou non renseigne)
+- Dans un fond cfg, si un lien pointe sur le fond en cours, la balise <a> ne sera pas mise
+
+v1.3.5 (24.02.2008)
+- les liens s'enrichissent d'une nouvelle syntaxe <!-- liens*=prefixe_plugin:fond_cfg -->
+permettant de mettre des chaines de langue sur les liens directement avec celles du plugin
+dans /lang/prefixe_plugin_fr.php
+
+v1.3.4
+- oubli qui empechaient les liens de fonctionner
+
+v1.3.3 (07.02.2008) :
+- Si un lien est demande dans le fond <!-- liens*=toto -->
+mais que fonds/cfg_toto.html n'existe pas, le lien n'est pas propose
+
+v1.3.2 (02.02.2008) :
+- correction de bug sur storage table : l'insertions de nouvelles entrees
+Ã©tait impossible sous SQLite. Test Ok en mysql, pg, sqlite3
+
+v1.3.1 :
+- correction coquille
+- introduction d'un paramÃštres Ã  CFG pour lui dire de ne pas
+afficher les messages renvoyÃ©s par CFG habituellement <!-- afficher_messages=0 -->
+
+v1.3 :
+- introduction de liens_multi
+- correction d'un bug avec les liens multis qui ne sont plus
+dÃ©finis automatiquement par le parametre liens, mais par
+un parametre specifique : liens_multi
+
+v1.2 :
+- corrections bugs sur #FORMULAIRE_CFG
+- homogeneise le passage de paramÃštres Ã  CFG depuis un fond en
+utilisant uniquement <!-- param=valeur -->
+(l'autre Ã©criture [(#REM) param=valeur] est decpeciee.
+- fourni des fonctions pour Ã©crire et modifier les contenus arborescents
+generes par CFG (storage meta et extra uniquement) : ecrire_config() et effacer_config().
+- toutes les chaÃ®nes de langues sont maintenant
+regroupÃ©es dans le fichier lang/cfg_fr.php et attendent des traductions/traducteurs.
+
+v1.1 :
+- fourni une balise #FORMULAIRE_CFG pour lâaffichage dâun formulaire
+CFG dans un squelette (nÃ©cessite SPIP > 1.9.2)
+
+v1.0.10 :
+- ajout de #CFG_ARBO
+
+v1 :
+- storages meta, extra, table, classic, php
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/css/cfg.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/css/cfg.css	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/css/cfg.css	(revision 152)
@@ -0,0 +1,4 @@
+/*  Affichage de la balise CFG_ARBO  */
+.cfg_arbo{}
+.cfg_arbo h5{padding:0.2em 0.2em; margin:0.2em 0; cursor:pointer;}
+.cfg_arbo ul{border:1px solid #ccc; margin:0; padding:0.2em 0.5em; list-style-type:none;}
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/depots/meta.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/depots/meta.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/depots/meta.php	(revision 152)
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ * classe cfg_classic: storage a plat (classique) dans spip_meta
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// cfg_meta retrouve et met a jour les donnees a plat dans spip_meta
+class cfg_depot_meta
+{
+	var $champs = array();
+	var $champs_id = array();
+	var $val = array();
+	var $param = array();
+	var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array());
+	
+	// version du depot
+	var $version = 2;
+	
+	function cfg_depot_meta($params=array())
+	{
+		foreach ($params as $o=>$v) {
+			$this->$o = $v;
+		}	
+	}
+	
+	// recuperer les valeurs.
+	// unserialize : si la valeur est deserialisable, elle est retournee deserialisee
+	// permet a #CONFIG d'obtenir une valeur non deserialisee...
+	function lire($unserialize=true)
+	{
+    	$val = array();
+    	if ($this->champs) {
+			foreach ($this->champs as $name => $def) {
+				// pour compat cfg, si la meta est deserialisable, la retourner deserialisee
+				if ($unserialize && ($a = @unserialize($GLOBALS['meta'][$name])))
+					$val[$name] = $a;
+				else {
+					$val[$name] = $GLOBALS['meta'][$name];
+				}
+			}
+		// si pas d'argument, retourner comme le core serialize($GLOBALS['meta'])
+		} else {
+			$val = serialize($GLOBALS['meta']);
+		}
+	    return array(true, $val);
+	}
+
+
+	// ecrit chaque enregistrement de meta pour chaque champ
+	function ecrire()
+	{
+		foreach ($this->champs as $name => $def) {
+			ecrire_meta($name, $this->val[$name]);
+	    }
+	    if (defined('_COMPAT_CFG_192')) ecrire_metas();
+	    return array(true, $this->val);
+	}
+	
+	
+	// supprime chaque enregistrement de meta pour chaque champ
+	function effacer(){
+		foreach ($this->champs as $name => $def) {
+			if (!$this->val[$name]) {
+			    effacer_meta($name);
+			}
+	    }
+	    if (defined('_COMPAT_CFG_192')) ecrire_metas();
+	    return array(true, $this->val);			
+	}
+	
+	
+	// charger les arguments de lire_config(meta::nom)
+	// $args = 'nom'; ici 
+	function charger_args($args){
+		if ($args) $this->champs = array($args=>true);
+		return true;	
+	}
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/depots/metapack.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/depots/metapack.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/depots/metapack.php	(revision 152)
@@ -0,0 +1,184 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ * classe cfg_metapack: storage serialise dans spip_meta
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+
+// cfg_metapack retrouve et met a jour les donnees dans spip_meta
+class cfg_depot_metapack
+{
+	var $champs = array();
+	var $champs_id = array();
+	var $val = array();
+	var $param = array();
+	var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array());
+	
+	var $_arbre = array();
+	
+	// version du depot
+	var $version = 2;
+	
+	function cfg_depot_metapack($params=array())
+	{
+		foreach ($params as $o=>$v) {
+			$this->$o = $v;
+		}	
+	}
+	
+
+	// charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici)
+	function charger($lire = false){
+		if ($lire && !isset($GLOBALS['meta'][$this->param['nom']])) 
+			return false;
+		$this->_base = is_array($c = $GLOBALS['meta'][$this->param['nom']]) ? $c : @unserialize($c);
+		$this->_arbre = array();
+		$this->_ici = &$this->_base;
+    	$this->_ici = &$this->monte_arbre($this->_ici, $this->param['casier']);
+    	$this->_ici = &$this->monte_arbre($this->_ici, $this->param['cfg_id']);
+    	return true;	
+	}
+	
+	// recuperer les valeurs.
+	function lire()
+	{
+		if (!$this->charger(true)){
+			return array(true, null); // pas de chargement = pas de valeur encore enregistrees
+		}
+		$ici = &$this->_ici;
+    	
+        // utile ??
+    	if ($this->param['cfg_id']) {
+    		$cles = explode('/', $this->param['cfg_id']);
+			foreach ($this->champs_id as $i => $name) {
+				$ici[$name] = $cles[$i];
+		    }
+    	}
+    	
+    	// s'il y a des champs demandes, les retourner... sinon, retourner la base
+    	// (cas de lire_config('metapack::nom') tout court)
+    	if (count($this->champs)){
+    		$val = array();
+			foreach ($this->champs as $name => $def) {
+				$val[$name] = $ici[$name];
+			}
+			$ici = $val;
+    	}
+
+	    return array(true, $ici);
+	}
+
+
+	// ecrit une meta pour tous les champs
+	function ecrire()
+	{
+  		// si pas de champs : on ecrit directement (ecrire_meta(metapack::nom,$val))...
+  		if (!$this->champs){
+  			ecrire_meta($this->param['nom'], serialize($this->val));
+  			if (defined('_COMPAT_CFG_192')) ecrire_metas();
+  			return array(true, $this->val);
+  		}
+  		
+		if (!$this->charger()){
+			return array(false, $this->val);	
+		}
+		$ici = &$this->_ici;
+		
+		foreach ($this->champs as $name => $def) {
+			if (isset($def['id'])) continue;
+			$ici[$name] = $this->val[$name];
+		}
+
+		ecrire_meta($this->param['nom'], serialize($this->_base));
+		if (defined('_COMPAT_CFG_192')) ecrire_metas();
+		return array(true, $ici);
+	}
+	
+	
+	// supprime chaque enregistrement de meta pour chaque champ
+	function effacer(){
+  		// si pas de champs : on supprime directement (effacer_meta(metapack::nom))...
+  		if (!$this->champs){
+  			effacer_meta($this->param['nom']);
+  			if (defined('_COMPAT_CFG_192')) ecrire_metas();
+  			return array(true, array());
+  		}
+  		
+		if (!$this->charger()){
+			return array(false, $this->val);	
+		}
+		$ici = &$this->_ici;
+
+		// supprimer les champs
+		foreach ($this->champs as $name => $def) {
+			if (isset($def['id'])) continue;
+			unset($ici[$name]);
+		}
+
+		// supprimer les dossiers vides
+		for ($i = count($this->_arbre); $i--; ) {
+			if ($this->_arbre[$i][0][$this->_arbre[$i][1]]) {
+				break;
+			}
+			unset($this->_arbre[$i][0][$this->_arbre[$i][1]]);
+		}
+		
+		if (!$this->_base) {
+		    effacer_meta($this->param['nom']);
+		} else {
+		    ecrire_meta($this->param['nom'], serialize($this->_base));
+	    }		
+		if (defined('_COMPAT_CFG_192')) ecrire_metas();
+		
+		return array(true, array());
+	}
+	
+	
+	// charger les arguments de lire_config(metapack::nom/casier/champ)
+	// $args = 'nom'; ici
+	// il se peut qu'il n'y ait pas de champs si : lire_config(metapack::nom);
+	function charger_args($args){
+		$args = explode('/',$args);
+		$this->param['nom'] = array_shift($args);
+		if ($champ = array_pop($args)) {
+			$this->champs = array($champ=>true);
+		}
+		$this->param['casier'] = implode('/',$args);
+		return true;	
+	}
+	
+	
+	// se positionner dans le tableau arborescent
+	function & monte_arbre(&$base, $chemin){
+		if (!$chemin) {
+			return $base;
+		}
+		if (!is_array($chemin)) {
+			$chemin = explode('/', $chemin);
+		}
+		if (!is_array($base)) {
+			$base = array();
+		}
+		
+		foreach ($chemin as $dossier) {
+			if (!isset($base[$dossier])) {
+				$base[$dossier] = array();
+			}
+			$this->_arbre[] = array(&$base, $dossier);
+			$base = &$base[$dossier];
+		}
+		
+		return $base;
+	}
+}
+
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/depots/php.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/depots/php.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/depots/php.php	(revision 152)
@@ -0,0 +1,199 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ * classe cfg_php: storage dans un fichier php
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// cfg_php retrouve et met a jour les donnees d'un fichier php
+class cfg_depot_php
+{
+	var $champs = array();
+	var $champs_id = array();
+	var $val = array();
+	var $param = array();
+	var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array());
+	
+	var $_arbre = array();
+	
+	// version du depot
+	var $version = 2;
+	
+	
+	function cfg_depot_php($params=array()) {
+		foreach ($params as $o=>$v) {
+			$this->$o = $v;
+		}
+	}
+	
+	// calcule l'emplacement du fichier
+	function get_fichier(){
+		static $fichier = array();
+		$cle = $this->param['nom'] . ' - ' . $this->param['fichier'];
+		if (isset($fichier[$cle])) 
+			return $fichier[$cle];
+		
+		if (!$this->param['fichier']) 
+			$f = _DIR_VAR . 'cfg/' . $this->param['nom'] . '.php';	
+		else
+			$f = _DIR_RACINE . $this->param['fichier'];
+
+		include_spip('inc/flock');
+		return $fichier[$cle] = sous_repertoire(dirname($f)) . basename($f);
+	}
+	
+	
+	// charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici)
+	function charger($lire=false){
+		$fichier = $this->get_fichier();
+
+		// inclut une variable $cfg
+    	if (!@include $fichier) {
+    		if ($lire) return false;
+    		$this->_base = array();
+    	} elseif (!$cfg OR !is_array($cfg)) {
+    		$this->_base = array();
+    	} else {
+    		$this->_base = $cfg;	
+    	}
+
+    	$this->_ici = &$this->_base;
+    	$this->_ici = &$this->monte_arbre($this->_ici, $this->param['nom']);
+    	$this->_ici = &$this->monte_arbre($this->_ici, $this->param['casier']);
+    	$this->_ici = &$this->monte_arbre($this->_ici, $this->param['cfg_id']);	
+    	return true;
+	}
+	
+	// recuperer les valeurs.
+	function lire() {
+		if (!$this->charger(true)){
+			return array(true, null); // pas de chargement = pas de valeur encore enregistrees
+		}
+		
+    	// utile ??
+    	if ($this->param['cfg_id']) {
+    		$cles = explode('/', $this->param['cfg_id']);
+			foreach ($this->champs_id as $i => $name) {
+				$this->_ici[$name] = $cles[$i];
+		    }
+    	}
+	    return array(true, $this->_ici);
+	}
+
+
+	// ecrit chaque enregistrement pour chaque champ
+	function ecrire() {
+		if (!$this->charger()){
+			return array(false, $this->val);	
+		}
+
+		foreach ($this->champs as $name => $def) {
+			if (isset($def['id'])) continue;
+			$this->_ici[$name] = $this->val[$name];
+		}
+		
+		if (!$this->ecrire_fichier($this->_base)){
+			return array(false, $this->val);
+		}
+		
+		return array(true, $this->_ici);	
+	}
+	
+	
+	// supprime chaque enregistrement pour chaque champ
+	function effacer(){
+		if (!$this->charger()){
+			return array(false, $this->val);	
+		}
+
+		// pas de champ, on supprime tout
+		if (!$this->champs)
+			return array($this->ecrire_fichier(), array());
+			
+    	// effacer les champs
+    	foreach ($this->champs as $name => $def) {
+			if (isset($def['id'])) continue;
+			unset($this->_ici[$name]);
+		}
+		
+		// supprimer les dossiers vides
+		for ($i = count($this->_arbre); $i--; ) {
+			if ($this->_arbre[$i][0][$this->_arbre[$i][1]]) {
+				break;
+			}
+			unset($this->_arbre[$i][0][$this->_arbre[$i][1]]);
+		}
+
+		return array($this->ecrire_fichier($this->_base), $this->_ici);
+	}
+	
+	
+	function ecrire_fichier($contenu=array()){
+		$fichier = $this->get_fichier();
+
+		if (!$contenu) {
+			return supprimer_fichier($fichier);
+		}
+
+$contenu = '<?php
+/**************
+* Config ecrite par cfg le ' . date('r') . '
+* 
+* NE PAS EDITER MANUELLEMENT !
+***************/
+
+$cfg = ' . var_export($contenu, true) . ';
+?>
+';
+		return ecrire_fichier($fichier, $contenu);
+	}
+	
+	// charger les arguments de 
+	// - lire_config(php::nom/casier/champ)
+	// - lire_config(php::adresse/fichier.php:nom/casier/champ)
+	function charger_args($args){
+		list($fichier, $args) = explode(':',$args);
+		if (!$args) {
+			$args = $fichier;
+			$fichier = _DIR_VAR . 'cfg/' . $fichier . '.php';	
+		}
+
+		$arbre = explode('/',$args);
+		$this->param['nom'] = array_shift($arbre);
+		if ($champ = array_pop($arbre))
+			$this->champs = array($champ=>true);
+		$this->param['casier'] = implode('/',$arbre);
+		return true;	
+	}
+	
+	
+	// se positionner dans le tableau arborescent
+	function & monte_arbre(&$base, $chemin){
+		if (!$chemin) {
+			return $base;
+		}
+		if (!is_array($chemin)) {
+			$chemin = explode('/', $chemin);
+		}
+		if (!is_array($base)) {
+			$base = array();
+		}
+		
+		foreach ($chemin as $dossier) {
+			if (!isset($base[$dossier])) {
+				$base[$dossier] = array();
+			}
+			$this->_arbre[] = array(&$base, $dossier);
+			$base = &$base[$dossier];
+		}
+		
+		return $base;
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/depots/table.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/depots/table.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/depots/table.php	(revision 152)
@@ -0,0 +1,249 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ * classe cfg_table: storage naturel dans une table
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+
+// cfg_table retrouve et met a jour les colonnes d'une table
+// ici, cfg_id est obligatoire ... 
+class cfg_depot_table
+{
+	var $champs = array();
+	var $champs_id = array();
+	var $val = array();
+	var $param = array();
+	var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array());
+	
+	var $_arbre = array();
+	var $_id = array();
+	var $_base = null;
+	var $_ici = null;
+	
+	// version du depot
+	var $version = 2;
+	
+	function cfg_depot_table($params=array())
+	{
+		foreach ($params as $o=>$v) {
+			$this->$o = $v;
+		}
+	}
+	
+	// charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici)
+	function charger($creer = false){
+		
+		if (!$this->param['table']) {
+			$this->messages['message_erreur'][] = _T('cfg:nom_table_manquant');
+			return false;
+		}
+		
+		// colid : nom de la colonne primary key
+		list($this->param['table'], $colid) = $this->get_table_id($this->param['table']);
+		
+		// renseigner les liens id=valeur
+		$id = explode('/',$this->param['cfg_id']);
+		foreach ($colid as $n=>$c) {
+			if (isset($id[$n])) {
+				$this->_id[$c] = $id[$n];
+			}
+		}
+		
+		if (!$this->param['cfg_id'] AND !($this->param['autoriser_absence_id'] == 'oui')) {
+			$this->messages['message_erreur'][] = _T('cfg:id_manquant');
+			return false;
+		}
+
+		// select
+		$this->_select = array();
+		if ($this->champs){
+			foreach ($this->champs as $nom => $def) {
+				if (isset($def['id'])) {
+					continue;
+				}
+				$this->_select[] = $nom;
+			}
+		} else {
+			$this->_select[] = '*';	
+		}
+		
+		// where
+		$this->_where = array();
+		foreach ($this->_id as $nom => $id) {
+			$this->_where[] = $nom . '=' . sql_quote($id);
+		}
+			
+		$this->_base = ($d = sql_fetsel(
+			$this->_select, 
+			$this->param['table'], 
+			$this->_where)) ? $d : array();
+		
+		$this->_existe = count($this->_base);
+			
+		$this->_ici = &$this->_base;
+    	return true;	
+	}
+	
+	// recuperer les valeurs.
+	function lire()
+	{
+		// charger
+		if (!$this->charger()){
+			return array(false, $this->val, $this->messages);	
+		}
+
+        // utile ??
+    	if ($this->param['cfg_id']) {
+    		$cles = explode('/', $this->param['cfg_id']);
+			foreach ($this->champs_id as $i => $name) {
+				$this->_ici[$name] = $cles[$i];
+		    }
+    	}
+	
+    	// s'il y a des champs demandes, ne retourner que ceux-ci
+    	if (count($this->champs)){
+    		$val = array();
+			foreach ($this->champs as $name => $def) {
+				$val[$name] = $this->_ici[$name];
+			}
+			$this->_ici = $val;
+    	}
+	    return array(true, $this->_ici);
+	}
+
+
+	// ecrit une entree pour tous les champs
+	function ecrire()
+	{
+		// charger
+		if (!$this->charger()){
+			return array(false, $this->val, $this->messages);	
+		}
+
+		if ($this->champs){
+			foreach ($this->champs as $name => $def) {
+				if (isset($def['id'])) continue;
+				$this->_ici[$name] = $this->val[$name];
+			}
+		} else {
+			$this->_ici = $this->val;	
+		}	
+			
+		// update
+		if ($this->_existe) {	
+		    $ok = sql_updateq($this->param['table'], $this->_ici, $this->_where );
+	    } else {
+			$ok = $id = sql_insertq($this->param['table'], $this->_ici);
+	    }
+
+		// remettre l'id
+		if ($ok && (count($this->champs_id)==1)) {
+			$this->_ici[$nomid = $this->champs_id[0]] = $this->_existe ? $this->val[$nomid] : $ok;
+		}
+			
+		return array($ok, $this->_ici);
+	}
+	
+	
+	// supprime chaque enregistrement de meta pour chaque champ
+	function effacer(){
+		// charger
+		if (!$this->charger()){
+			return array(false, $this->val, $this->messages);	
+		}
+		
+		$ok = !$this->_existe || sql_delete($this->param['table'], $this->_where );	
+		return array($ok, array());
+	}
+	
+	
+	// charger les arguments
+	// lire_config(table::table@colonne:id
+	// lire_config(table::table:id
+	function charger_args($args){
+
+		list($table, $id) = explode(':',$args,2);
+		list($table, $colonne) = explode('@',$table);
+		list($table, $colid) = $this->get_table_id($table);
+		
+		$this->param['cfg_id'] = $id;
+		$this->param['champs'] = $colonne ? array($colonne=>true) : '';
+		$this->param['table'] = $table ? $table : 'spip_cfg';
+		
+		// renseigner les liens id=valeur
+		$id = explode(':',$id);
+		foreach ($colid as $n=>$c) {
+			if (isset($id[$n])) {
+				$this->_id[$c] = $id[$n];
+			}
+		}
+		
+		return true;	
+	}
+	
+	
+	// se positionner dans le tableau arborescent
+	function & monte_arbre(&$base, $chemin){
+		if (!$chemin) {
+			return $base;
+		}
+		if (!is_array($chemin)) {
+			$chemin = explode('/', $chemin);
+		}
+		if (!is_array($base)) {
+			$base = array();
+		}
+		
+		foreach ($chemin as $dossier) {
+			if (!isset($base[$dossier])) {
+				$base[$dossier] = array();
+			}
+			$this->_arbre[] = array(&$base, $dossier);
+			$base = &$base[$dossier];
+		}
+		
+		return $base;
+	}
+	
+
+	//
+	// Cherche le vrai nom d'une table
+	// ainsi que ses cles primaires
+	//
+	function get_table_id($table) {	
+		static $catab = array(
+			'tables_principales' => 'base/serial',
+			'tables_auxiliaires' => 'base/auxiliaires',
+		);
+		$try = array($table, 'spip_' . $table);
+		foreach ($catab as $categ => $catinc) {
+			include_spip($catinc);
+			foreach ($try as $nom) {
+				if (isset($GLOBALS[$categ][$nom])) {
+					return array($nom,
+						preg_split('/\s*,\s*/', $GLOBALS[$categ][$nom]['key']['PRIMARY KEY']));
+				}
+			}
+		}
+		if ($try = table_objet($table)) {
+			return array('spip_' . $try, array(id_table_objet($table)));
+		}
+		return array(false, false);
+	}
+
+}
+
+
+
+
+
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/depots/tablepack.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/depots/tablepack.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/depots/tablepack.php	(revision 152)
@@ -0,0 +1,293 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ * classe cfg_extrapack: storage serialise dans extra de spip_auteurs ou autre
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+
+// cfg_tablepack retrouve et met a jour les donnees serialisees dans une colonne d'une table
+// par dÃ©faut : colonne 'cfg' et table 'spip_auteurs'
+// ici, cfg_id est obligatoire ... peut-Ãªtre mappÃ© sur l'auteur courant (a voir)
+//
+//
+// pour #CONFIG{xxx} ou lire_config('xxx') si xxx demarre par
+// ~ on utilise la colonne 'cfg' de spip_auteurs 
+//   ~ tout court veut dire l'auteur connecte,
+//   ~123 celui de l'auteur 123
+
+// Pour utiliser une autre colonne, il faut renseigner @colonne
+//   ~@extra/champ ou 
+//   ~id_auteur@prefs/champ
+//
+// Pour recuperer des valeurs d'une table particuliere,
+// il faut utiliser 'table:id/champ' ou 'table@colonne:id/champ'
+//   table:123 contenu de la colonne 'cfg' de l'enregistrement id 123 de "table"
+//   rubriques@extra:3/qqc  rubrique 3, colonne extra, champ 'qqc'
+//
+// "table" est un nom de table ou un raccourci comme "article"
+// on peut croiser plusieurs id comme spip_auteurs_articles:6:123
+// (mais il n'y a pas d'extra dans spip_auteurs_articles ...)
+// Le 2eme argument de la balise est la valeur defaut comme pour la dist
+//
+
+class cfg_depot_tablepack
+{
+	var $champs = array();
+	var $champs_id = array();
+	var $val = array();
+	var $param = array();
+	var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array());
+	
+	var $_arbre = array();
+	var $_id = array();
+	var $_base = null;
+	var $_ici = null;
+	
+	// version du depot
+	var $version = 2;
+	
+	function cfg_depot_tablepack($params=array())
+	{
+		foreach ($params as $o=>$v) {
+			$this->$o = $v;
+		}	
+	}
+	
+	// charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici)
+	function charger($lire = false){
+		if (!$this->param['colonne'])	$this->param['colonne'] = 'cfg';
+
+		// colid : nom de la colonne primary key
+		if ($this->param['table']) {
+			list($this->param['table'], $colid) = $this->get_table_id($this->param['table']);
+
+			// renseigner les liens id=valeur
+			$id = explode('/',$this->param['cfg_id']);
+			foreach ($colid as $n=>$c) {
+				if (isset($id[$n])) {
+					$this->_id[$c] = $id[$n];
+				}
+			}
+		}
+		
+		if (!$this->param['cfg_id']) {
+			$this->messages['message_erreur'][] = _T('cfg:id_manquant');
+			return false;
+		}
+		
+		// verifier que la colonne existe
+		if (!$this->verifier_colonne()) {
+			return false;
+		} else {
+			// recuperer la valeur du champ de la table sql
+			$this->_where = array();
+			foreach ($this->_id as $nom => $id) {
+				$this->_where[] = $nom . '=' . sql_quote($id);
+			}
+			
+			$this->_base = ($d = sql_getfetsel($this->param['colonne'], $this->param['table'], $this->_where)) ? unserialize($d) : array();
+		}	
+		$this->_arbre = array();
+		$this->_ici = &$this->_base;
+    	$this->_ici = &$this->monte_arbre($this->_ici, $this->param['nom']);
+    	$this->_ici = &$this->monte_arbre($this->_ici, $this->param['casier']);
+    	return true;	
+	}
+	
+	// recuperer les valeurs.
+	function lire()
+	{
+		// charger
+		if (!$this->charger(true)){
+			return array(true, null);	
+		}
+		$ici = &$this->_ici;
+
+        // utile ??
+    	if ($this->param['cfg_id']) {
+    		$cles = explode('/', $this->param['cfg_id']);
+			foreach ($this->champs_id as $i => $name) {
+				$ici[$name] = $cles[$i];
+		    }
+    	}
+	
+    	// s'il y a des champs demandes, ne retourner que ceux-ci
+    	if (count($this->champs)){
+    		$val = array();
+			foreach ($this->champs as $name => $def) {
+				$val[$name] = $ici[$name];
+			}
+			$ici = $val;
+    	}
+	    return array(true, $ici);
+	}
+
+
+	// ecrit une entree pour tous les champs
+	function ecrire()
+	{
+		// charger
+		if (!$this->charger()){
+			return array(false, $this->val, $this->messages);	
+		}
+		$ici = &$this->_ici;
+		
+		if ($this->champs){
+			foreach ($this->champs as $name => $def) {
+				if (isset($def['id'])) continue;
+				$ici[$name] = $this->val[$name];
+			}
+		} else {
+			$ici = $this->val;	
+		}
+
+		$ok = sql_updateq($this->param['table'], array($this->param['colonne'] => serialize($this->_base)), $this->_where);	
+		return array($ok, $ici);
+	}
+	
+	
+	// supprime chaque enregistrement de meta pour chaque champ
+	function effacer(){
+		// charger
+		if (!$this->charger()){
+			return array(false, $this->val, $this->messages);	
+		}
+		$ici = &$this->_ici;
+		if ($this->champs){
+			foreach ($this->champs as $name => $def) {
+				if (isset($def['id'])) continue;
+				unset($ici[$name]);
+			}
+		}
+			
+		// supprimer les dossiers vides
+		for ($i = count($this->_arbre); $i--; ) {
+			if ($this->_arbre[$i][0][$this->_arbre[$i][1]]) {
+				break;
+			}
+			unset($this->_arbre[$i][0][$this->_arbre[$i][1]]);
+		}
+		$ok = sql_updateq($this->param['table'], array($this->param['colonne'] => serialize($this->_base)), $this->_where);	
+		return array($ok, array());
+	}
+	
+	
+	// charger les arguments
+	// lire_config(tablepack::table@colonne:id/nom/casier/champ
+	// lire_config(tablepack::~id_auteur@colonne/chemin/champ
+	// lire_config(tablepack::~@colonne/chemin/champ
+	function charger_args($args){
+		$args = explode('/',$args);
+		// cas ~id_auteur/
+		if ($args[0][0] == '~'){
+			$table = 'spip_auteurs';
+			$colid = array('id_auteur');
+			list($auteur, $colonne) = explode('@',array_shift($args));
+			if (count($auteur)>1){
+				$id = substr($auteur,1);
+			} else {
+				$id = $GLOBALS['auteur_session'] ? $GLOBALS['auteur_session']['id_auteur'] : '';
+			}
+		// cas table:id/
+		// peut etre table:id:id/ si la table a 2 cles
+		} else {
+			list($table, $id) = explode(':',array_shift($args),2);
+			list($table, $colonne) = explode('@',$table);
+			list($table, $colid) = $this->get_table_id($table);
+		}
+		$this->param['cfg_id'] = $id;
+		$this->param['colonne'] = $colonne ? $colonne : 'cfg';
+		$this->param['table'] = $table ? $table : 'spip_auteurs';
+		if ($champ = array_pop($args)) {
+			$this->champs = array($champ=>true);
+		}
+		$this->param['casier'] = implode('/',$args);
+		
+		// renseigner les liens id=valeur
+		$id = explode(':',$id);
+		foreach ($colid as $n=>$c) {
+			if (isset($id[$n])) {
+				$this->_id[$c] = $id[$n];
+			}
+		}
+
+		return true;	
+	}
+	
+	
+	// se positionner dans le tableau arborescent
+	function & monte_arbre(&$base, $chemin){
+		if (!$chemin) {
+			return $base;
+		}
+		if (!is_array($chemin)) {
+			$chemin = explode('/', $chemin);
+		}
+		if (!is_array($base)) {
+			$base = array();
+		}
+		
+		foreach ($chemin as $dossier) {
+			if (!isset($base[$dossier])) {
+				$base[$dossier] = array();
+			}
+			$this->_arbre[] = array(&$base, $dossier);
+			$base = &$base[$dossier];
+		}
+		
+		return $base;
+	}
+	
+	
+	function verifier_colonne($creer = false) {
+		if (!$this->param['table'])
+			return false;
+		$col = sql_showtable($table = $this->param['table']);
+		if (!is_array($col['field']) OR !array_key_exists($colonne = $this->param['colonne'], $col['field'])) {
+			if ($creer
+			&& $colonne
+			&& sql_alter('TABLE '.$this->param['table'] . ' ADD ' . $colonne . 'TEXT NOT NULL DEFAULT \'\'')) {
+				return true;
+			}
+			return false;
+		}
+		return true;
+	}
+
+	
+	//
+	// Cherche le vrai nom d'une table
+	// ainsi que ses cles primaires
+	//
+	function get_table_id($table) {	
+		static $catab = array(
+			'tables_principales' => 'base/serial',
+			'tables_auxiliaires' => 'base/auxiliaires',
+		);
+		$try = array($table, 'spip_' . $table);
+		foreach ($catab as $categ => $catinc) {
+			include_spip($catinc);
+			foreach ($try as $nom) {
+				if (isset($GLOBALS[$categ][$nom])) {
+					return array($nom,
+						preg_split('/\s*,\s*/', $GLOBALS[$categ][$nom]['key']['PRIMARY KEY']));
+				}
+			}
+		}
+		if ($try = table_objet($table)) {
+			return array('spip_' . $try, array(id_table_objet($table)));
+		}
+		return array(false, false);
+	}
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/exec/cfg.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/exec/cfg.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/exec/cfg.php	(revision 152)
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ * la fonction appelee par le core, une simple "factory" de la classe cfg
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function exec_cfg_dist($class = null)
+{
+	include_spip('inc/filtres');
+	include_spip('inc/cfg');
+	$config = &new cfg(
+		($nom = sinon(_request('cfg'), '')),
+		($cfg_id = sinon(_request('cfg_id'),''))
+		);
+	
+	// traitements du formulaire poste
+	// seulement s'il provient d'un formulaire CFG
+	// et non d'un formulaire CVT dans un fond CFG
+	if (_request('arg'))
+		$config->traiter();
+	
+	//
+	// affichages
+	//
+	include_spip("inc/presentation");
+
+	if (!$config->autoriser()) {
+		echo $config->acces_refuse();
+		exit;
+	}
+
+	pipeline('exec_init',array('args'=>array('exec'=>'cfg'),'data'=>''));
+
+	$commencer_page = charger_fonction('commencer_page', 'inc');
+	echo $commencer_page($config->get_boite(), 'cfg', $config->get_nom());
+	echo "<br /><br /><br />\n";
+
+	echo gros_titre(sinon($config->get_titre(), _T('cfg:configuration_modules')), '', false);	
+	echo $config->barre_onglets();
+	
+	// colonne gauche
+	echo debut_gauche('', true);
+
+	// si un formulaire cfg est demande
+	if ($s = $config->descriptif()) echo debut_boite_info(true) . $s . fin_boite_info(true);
+	
+	echo pipeline('affiche_gauche',array('args'=>array('exec'=>'cfg'),'data'=>''));
+	echo creer_colonne_droite('', true);
+	echo pipeline('affiche_droite',array('args'=>array('exec'=>'cfg'),'data'=>''));
+		
+	// affichage des messages envoyes par cfg
+	if ($s = $config->messages()) echo debut_boite_info(true) . $s . fin_boite_info(true);
+
+	// affichage des liens
+	if ($s = $config->liens()) echo debut_boite_info(true) . $s . fin_boite_info(true);
+	if ($s = $config->liens_multi()) echo debut_boite_info(true) . $s . fin_boite_info(true);
+	
+	echo debut_droite("", true);
+	
+	// centre de la page	
+	if ($config->get_presentation() == 'auto') {
+		echo debut_cadre_trait_couleur('', true, '', $config->get_boite());
+		echo $config->formulaire();
+		echo fin_cadre_trait_couleur(true);
+	} else {
+		echo $config->formulaire();
+	}
+
+	// pied
+	echo fin_gauche() . fin_page();
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg.php	(revision 152)
@@ -0,0 +1,328 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+
+// Renvoie la liste des configurations disponibles dans le path
+// ou dans le dossier donne en argument
+function liste_cfg($dir='') {
+	// Faire la liste des elements qui ont un cfg ; ca peut etre des plugins
+	// mais aussi des squelettes ou n'importe quoi
+	$liste = array();
+	// tous les repertoires
+	if (!$dir){
+		foreach (creer_chemin() as $dir) {
+			$liste = array_merge($liste, preg_files($d=$dir.'fonds/', $d.'cfg_[^/]*[.]html$'));
+		}
+	// ou seulement celui demande
+	} else {	
+		$dir = rtrim(rtrim($dir),'/').'/';
+		$liste = preg_files($d=$dir.'fonds/', $d.'cfg_[^/]*[.]html$');
+	}
+
+	if ($liste) {
+		$l = array();
+		foreach($liste as $cfg) {
+			$fonds = substr(basename($cfg,'.html'),4);
+			$l[$fonds] = $cfg;
+		}
+		ksort($l);
+		return $l;
+	}
+}
+
+// Renvoie une icone avec un lien vers la page de configuration d'un repertoire
+// donne
+function icone_lien_cfg($dir) {
+	$ret = '';
+	if ($onglets = lister_onglets_cfg($dir)){
+		foreach ($onglets as $fonds=>$ong){
+			if ($ong['afficher'])
+				$ret .= '<a href="'.$ong['url'].'">'
+					.'<img src="'._DIR_PLUGIN_CFG.'cfg-16.png"
+						width="16" height="16"
+						alt="'._T('icone_configuration_site').' '.$fonds.'"
+						title="'._T('icone_configuration_site').' '.$fonds.'"
+					/></a>';					
+		}
+	}
+
+	return $ret;
+}
+
+
+
+// retourne un tableau contenant une liste de fonds cfg et leurs parametres
+// d'onglet (oui/non/titre_parent), plus quelques autres parametres (url, titre, icone),
+// pour un repertoire donne (sinon tout le path)
+function lister_onglets_cfg($dir=''){
+	$onglets = array();
+	
+	// scruter les onglets affichables
+	if ($l = liste_cfg($dir)) {
+		foreach($l as $fonds => $cfg) {
+
+			if (!isset($onglets[$fonds])) 
+				$onglets[$fonds] = array();
+			$args = array();
+			$args['afficher'] = false;
+			
+			// On va chercher la config cible
+			// et on regarde ses donnees pour faire l'onglet
+			// seulement si l'onglet doit etre affiche
+			include_spip('inc/cfg');
+			$tmp = new cfg($fonds);
+
+			if ($tmp->autoriser()){
+				$args['onglet'] = $tmp->form->param['onglet'];
+				$args['url'] = generer_url_ecrire('cfg', 'cfg='.$fonds);
+				// titre
+				if (!$args['titre'] = $tmp->form->param['titre'])
+					$args['titre'] = $fonds;
+				// icone	
+				$path = dirname(dirname($cfg));	
+				$args['icone'] = '';
+				if ($tmp->form->param['icone'])
+					$args['icone'] = $path.'/'.$tmp->form->param['icone'];
+				else if (file_exists($path.'/plugin.xml'))
+					$args['icone'] = 'plugin-24.gif';
+				else
+					$args['icone'] = _DIR_PLUGIN_CFG.'cfg-doc-22.png';	
+				
+				// l'afficher ?
+				if ($tmp->form->param['onglet'] == 'oui')
+					$args['afficher'] = true;
+			}
+			
+			$onglets[$fonds] = array_merge($args, $onglets[$fonds]); // conserver les donnees deja presentes ('enfant_actif')
+		}
+	}
+	return $onglets;	
+}
+	
+
+
+
+// la classe cfg represente une page de configuration
+class cfg
+{
+	var $form; // la classe cfg_formulaire
+	
+	function cfg($nom, $cfg_id = '', $opt = array()) {
+		include_spip('inc/cfg_formulaire');
+		$this->form = &new cfg_formulaire($nom, $cfg_id, $opt);
+	}
+
+	function autoriser()  {return $this->form->autoriser(); }
+	function traiter()  {return $this->form->traiter();}
+	
+	function get_titre(){ return $this->form->param['titre'];}
+	function get_nom()  { return $this->form->param['nom'];}
+	function get_boite(){ 
+		if (!(($titre = $this->form->param['titre']) && ($boite = $this->form->param['boite']))){
+			$boite=($titre)?$titre: _T('icone_configuration_site') . ' ' . $this->form->param['nom'];
+		}
+		return $boite;
+	}
+	// pour pouvoir tester si la presentation des formulaires doit etre appliquee ou non
+	// m'est avis que ca devrait virer cette 'presentation=auto'...
+	// c'est comme 'rediriger', il n'y a que le plugin 'autorite' qui l'utilise
+	function get_presentation() { return $this->form->param['presentation'];	}
+	
+	//
+	// Affiche la boite d'info
+	// des liens vers les autres fonds CFG
+	// definis par la variable liens
+	// <!-- liens*=moncfg -->
+	// s'il y a une chaine de langue 'moncfg', le texte sera traduit
+	// 
+	// Ou
+	// <!-- liens*=prefixe_plugin:moncfg -->
+	// pour utiliser la chaine de langue de prefixe_plugin
+	// 
+	function liens()
+	{
+		$return = '';
+		// liens simples
+		foreach ($this->form->param['liens'] as $lien) {
+			$nom = _T($lien);
+			$lien =  array_pop(explode(':',$lien)); // ne garder que la derniere partie de la chaine de langue
+			$return .= ($l = $this->generer_lien($lien, $nom)) ? "<li>$l</li>\n" : "";
+		}
+		return ($return)?"<ul>$return</ul>":'';
+	}
+
+
+	//
+	// Affiche un lien vers le fond dont le nom ($lien)
+	// est passe en parametre
+	// a condition que le fichier fonds/cfg_$lien.html existe
+	//
+	function generer_lien($lien, $nom='')
+	{
+		// nom est une chaine, pas une cle de tableau.
+		if (empty($nom) OR !is_string($nom)) $nom = $lien;
+		if (!find_in_path('fonds/cfg_'.$lien.'.html')) return "";
+		
+		// si c'est le lien actif, pas de <a>
+		if (_request('cfg') == $lien) 
+			return "$nom\n";
+		else
+			return "<a href='" . generer_url_ecrire("cfg","cfg=$lien") . "'>$nom</a>\n"; // &cfg_id= <-- a ajouter ?
+	}
+	
+	
+	//
+	// Les liens multi sont appelles par 
+	// liens_multi*=nom_du_fond
+	// a condition que le fichier fonds/cfg_$lien.html existe
+	// 
+	function liens_multi(){
+		// liens multiples
+		foreach ($this->form->param['liens_multi'] as $lien) {
+			$nom = _T($lien);
+			$lien =  array_pop(explode(':',$lien)); // ne garder que la derniere partie de la chaine de langue
+			$return .= ($l = $this->generer_lien_multi($lien, $nom)) ? "<li>$l</li>\n" : "";
+		}
+		return ($return)?"<ul>$return</ul>":'';
+	}
+	
+	function generer_lien_multi($lien, $nom=''){
+		// nom est une chaine, pas une cle de tableau.
+		if (empty($nom) OR !is_string($nom)) $nom = $lien;
+		if (!find_in_path('fonds/cfg_'.$lien.'.html')) return "";
+		
+		$dedans = '';
+		if (($exi = lire_config($lien)) && is_array($exi)) {
+			foreach ($exi as $compte => $info) {
+				$lid = $lien . "_" . $compte;
+				$dedans .= "\n<p><label for='$lid'>$compte</label>\n"
+						.  "<input type='image' id='$lid' name='cfg_id' value='$compte' "
+						.  "src='../dist/images/triangle.gif' style='vertical-align: text-top;'/></p>\n";
+			}
+		}
+		// On ajoute un bouton 'nouveau'
+		return    "<form method='post' action='".generer_url_ecrire('')."'><div>\n"
+				. "<h4>$nom</h4>\n"
+				. "<input type='hidden' name='exec' value='cfg' />\n"
+				. "<input type='hidden' name='cfg' value='$lien' />\n"
+				. "<label for='$lien" . "_'>" . _T('cfg:nouveau') . "</label>\n"
+				. "<input type='image' id='$lien" . "_' name='nouveau' value='1' "
+				. "src='../dist/images/creer.gif' style='vertical-align: text-top;'/></p>\n" 
+				. $dedans
+				. "\n</div></form>\n";
+	
+	}
+		
+	//
+	// Affiche la liste des onglets de CFG
+	// 
+	// Recupere les fonds CFG et analyse ceux-ci
+	// - si onglet=oui : affiche l'onglet (valeur par defaut)
+	// - si onglet=non : n'affiche pas l'onglet
+	// - si onglet=fond_cfg_parent : n'affiche pas l'onglet, mais 'exposera' 
+	// l'element parent indique (sous entendu que
+	// le parent n'a pas 'onglet=non' sinon rien ne sera expose...
+	// 
+	function barre_onglets(){
+		
+		// determiner les onglets a cacher et a mettre en surbrillance
+		if ($onglets = lister_onglets_cfg()){
+			foreach ($onglets as $fonds=>$ong){
+				$o = $ong['onglet'];
+
+				// onglet actif
+				if ($o == 'oui')	
+					$onglets[$fonds]['actif'] = ($fonds == _request('cfg'));
+				// rendre actif un parent si l'enfant est actif (onglet=nom_du_parent
+				// (/!\ ne pas le desactiver s'il a deja ete mis actif)
+				if ($o && $o!='oui' && $o!='non'){
+					if (!isset($onglets[$o])) 
+						$onglets[$o]=array();
+					
+					if (!isset($onglets[$o]['enfant_actif'])) 
+						$onglets[$o]['enfant_actif']=false;
+						
+					$onglets[$o]['enfant_actif'] = ($onglets[$o]['enfant_actif'] OR $fonds == _request('cfg'));
+				}
+			}
+		}
+
+		// retourner le code des onglets selectionnes
+		$res = "";
+		if ($onglets) {
+			$res = debut_onglet();
+			$n = -1;
+			foreach ($onglets as $titre=>$args){
+				if ($args['afficher']){
+					// Faire des lignes s'il y en a effectivement plus de 6
+					if (!(++$n%6) && ($n>0))
+						$res .= fin_onglet().debut_onglet();
+						
+					$res .= onglet(
+							$args['titre'], 
+							$args['url'], 
+							'cfg', 
+							($args['actif'] || $args['enfant_actif']), 
+							$args['icone']);
+				}	
+			}
+			
+			$res .= fin_onglet();
+			
+		}
+		return $res;
+	}
+	
+
+	// affiche le descriptif du formulaire
+	function descriptif(){
+		if ($d = $this->form->param['descriptif'])
+			return propre($d);	
+	}
+	
+	// affiche le message en cas d'acces interdit
+	function acces_refuse(){
+		include_spip('inc/minipres');
+		return minipres(_T('info_acces_refuse'), 
+			$this->form->param['refus']
+				? $this->form->param['refus']
+				: " (cfg {$this->form->param[nom]} - {$this->form->vue} - {$this->form->param[cfg_id]})");
+	}
+	
+	// afficher les messages de cfg
+	function messages(){
+		$m = $this->form->messages; $messages = array();
+		if (count($m['message_ok'])) 		$messages[] = join('<br />', $m['message_ok']);
+		if (count($m['message_erreur'])) 	$messages[] = join('<br />', $m['message_erreur']);
+		if (count($m['erreurs'])) 			$messages[] = join('<br />', $m['erreurs']);
+		
+		if ($messages = trim(join('<br />', $messages))) {
+			return propre($messages);
+		}
+		return '';
+	}
+	
+	// affichage du formulaire (ou a defaut du texte 'choisir le module a configurer')
+	function formulaire() {
+		$retour = "";	
+		if (!$formulaire = $this->form->formulaire()) {
+			// Page appellee sans formulaire valable
+			$retour .= "<img src='"._DIR_PLUGIN_CFG.'cfg.png'."' style='float:right' alt='' />\n";
+			$retour .=  "<h3>" . _T("cfg:choisir_module_a_configurer") . "</h3>";
+		} else {
+			$retour .= $formulaire;
+		}
+		return $retour;
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg_config.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg_config.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg_config.php	(revision 152)
@@ -0,0 +1,220 @@
+<?php
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg, marcimat 2007-2008, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ * Definitions des fonctions lire_config, ecrire_config et effacer_config.
+ * 
+ */
+
+
+// charge le depot qui va bien en fonction de l'argument demande
+// exemples : 
+// meta::description
+// metapack::prefixe_plugin
+// metapack::prefixe/casier/champ
+// tablepack::auteur@extra:8/prefixe/casier/champ
+// tablepack::~id_auteur@extra/prefixe/casier/champ
+//
+// en l'absence du nom de depot (gauche des ::) cette fonction prendra comme suit :
+// ~ en premier caractere : tablepack
+// : present avant un / : tablepack
+// sinon metapack
+//
+
+function cfg_charger_depot($args){
+	list($depot,$args) = explode('::',$args,2);
+
+	// si un seul argument, il faut trouver le depot
+	if (!$args) {
+		$args = $depot;
+		if ($args[0] == '~'){
+			$depot = 'tablepack';	
+		} elseif (
+			(list($head, $body) = explode('/',$args,2)) &&
+			(strpos($head,':') !== false)) {
+				$depot = 'tablepack';
+		} else {
+			if (strpos($args,'/') !== false)
+				$depot = 'metapack';
+			else 
+				$depot = 'meta';
+		}
+	}
+
+	$depot = new cfg_depot($depot);
+	$depot->charger_args($args);
+	return $depot;
+}
+
+
+// cette classe charge les fonctions de lecture et ecriture d'un depot (dans depots/)
+//
+// Ces depots ont une version qui evoluera en fonction si des changements d'api apparaissent
+
+// version 2 (fonctions)
+// - charger_args
+// - lire, ecrire, effacer
+class cfg_depot{
+	
+	var $nom;
+	var $depot;
+	
+	//
+	// Constructeur de la classe
+	// 'depot' est le nom du fichier php stocke dans /depots/{depot}.php
+	// qui contient une classe 'cfg_depot_{depot}'
+	//
+	// $params est un tableau de parametres passes a la classe cfg_depot_{depot} qui peut contenir :
+	// 'champs' => array(
+	//		'nom'=>array(
+	//			'balise' => 'select|textarea|input', // nom de la balise
+	//			'type' => 'checkbox|hidden|text...', // type d'un input 
+	//			'tableau' => bool, // est-ce un champ tableau name="champ[]" ?
+	//			'cfg' => 'xx',   // classe css commencant par css_xx
+	//			'id' => y, // cle du tableau 'champs_id' (emplacement qui possede ce champ)
+	//		),
+	// 'champs_id' => array(
+	//		cle => 'nom' // nom d'un champ de type id
+	//		),
+	//	'param' => array(
+	//		'parametre_cfg' => 'valeur' // les parametres <!-- param=valeur --> passes dans les formulaires cfg
+	//		),
+	//	'val' => array(
+	//		'nom' => 'valeur' // les valeurs des champs sont stockes dedans
+	//		)
+	//	);
+	//
+	//
+	function cfg_depot($depot='metapack', $params=array()){
+		if (!isset($params['param'])) {
+			$params['param'] = array();
+		}
+		
+		include_spip('depots/'.$depot);
+		if (class_exists($class = 'cfg_depot_'.$depot)) {
+			$this->depot = &new $class($params);
+		} else {
+			die("CFG ne trouve pas le d&eacute;pot $depot");
+		}
+		
+		$this->version = $this->depot->version;
+		$this->nom = $depot;
+	}
+	
+	// ajoute les parametres transmis dans l'objet du depot
+	function add_params($params){
+		foreach ($params as $o=>$v) {
+			$this->depot->$o = $v;
+		}	
+	}
+	
+	function lire($params = array()){
+		$this->add_params($params);
+		return $this->depot->lire(); // array($ok, $val, $messages)
+	}
+		
+	function ecrire($params = array()){
+		$this->add_params($params);
+		return $this->depot->ecrire(); // array($ok, $val, $messages)
+	}
+	
+	function effacer($params = array()){
+		$this->add_params($params);
+		return $this->depot->effacer(); // array($ok, $val, $messages)
+	}	
+	
+	function lire_config($unserialize=true){
+		list($ok, $s) = $this->depot->lire($unserialize);
+		if ($ok && ($nom = $this->nom_champ())) {
+			return $s[$nom];
+		} elseif ($ok) {
+			return $s;	
+		} 
+	}
+	
+	function ecrire_config($valeur){
+		if ($nom = $this->nom_champ()) {
+			$this->depot->val = array($nom=>$valeur);
+		} else {
+			$this->depot->val = $valeur;
+		}
+		list($ok, $s) =  $this->depot->ecrire();
+		return $ok;	
+	}
+	
+	function effacer_config(){
+		if ($nom = $this->nom_champ()){
+			$this->depot->val[$nom] = false;
+		} else {
+			$this->depot->val = null;	
+		}
+		list($ok, $s) =  $this->depot->effacer();
+		return $ok;	
+
+	}	
+	
+	function nom_champ(){
+		if (count($this->depot->champs)==1){
+			foreach ($this->depot->champs as $nom=>$def){
+				return $nom;	
+			}
+		}
+		return false;			
+	}
+	
+	// charge les arguments d'un lire/ecrire/effacer_config
+	// dans le depot : lire_config($args = 'metapack::prefixe/casier/champ');
+	function charger_args($args){
+		if (method_exists($this->depot, 'charger_args')){
+			return $this->depot->charger_args($args);	
+		}
+		return false;
+	}
+}
+
+
+
+
+// lire_config() permet de recuperer une config depuis le php
+// memes arguments que la balise (forcement)
+// $cfg: la config, lire_config('montruc') est un tableau
+// lire_config('montruc/sub') est l'element "sub" de cette config
+// comme la balise pour ~, ~id_auteur ou table:id
+// $def: un defaut optionnel
+
+// $unserialize est mis par l'histoire, et affecte le depot 'meta' 
+function lire_config($cfg='', $def=null, $unserialize=true) {
+	$depot = cfg_charger_depot($cfg);
+	$r = $depot->lire_config($unserialize);
+	if (is_null($r)) return $def;
+	return $r;
+}
+
+
+
+//
+// 
+// ecrire_config($chemin, $valeur) 
+// permet d'enregistrer une configuration
+// 
+//
+function ecrire_config($cfg='', $valeur=null){
+	$depot = cfg_charger_depot($cfg);
+	return $depot->ecrire_config($valeur);
+}
+
+
+//
+// effacer_config($chemin) 
+// permet de supprimer une config 
+//
+function effacer_config($cfg=''){
+	$depot = cfg_charger_depot($cfg);
+	return $depot->effacer_config();	
+}
+
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg_formulaire.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg_formulaire.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/inc/cfg_formulaire.php	(revision 152)
@@ -0,0 +1,693 @@
+<?php
+
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+
+// la classe cfg represente une page de configuration
+class cfg_formulaire{
+
+// les parametres des formulaires cfg sont stockes dans cet objet
+	var $param;
+// l'objet de classe cfg_depot qui assure lecture/ecriture/effacement des config
+	var $depot = null;
+// le fond html utilise , en general pour config simple idem $nom
+	var $vue = '';
+// l'adresse du fond html (sans l'extension .html)
+	var $path_vue = '';
+// provient-on d'un formulaire de type CVT (charger/verifier/traiter) dans formulaires/ ?
+	var $depuis_cvt = false;
+// compte-rendu des mises a jour
+	var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array());
+// les champs trouve dans le fond
+	var $champs = array();
+// les champs index
+	var $champs_id = array();
+// leurs valeurs
+	var $val = array();
+// pour tracer les valeurs modifiees
+	var $log_modif = '';
+// contenu du fichier de formulaire
+	var $controldata ='';
+// stockage du fond compile par recuperer_fond()
+	var $fond_compile = '';
+// y a t-il des extensions (classes css 'type_{nom}' ou 'cfg_{nom}' sur champs) a traiter ?
+	var $extensions = array();
+
+// Alias pour passer facilement les parametres aux classes appelees
+	var $params = array();
+
+	//
+	// Constructeur de la classe
+	//
+	function cfg_formulaire($nom, $cfg_id = '', $opt = array())
+	{
+		$this->param = array(
+			'afficher_messages' => true, // afficher ce compte rendu ?
+			'autoriser' => 'configurer',	// le "faire" de autoriser($faire), par defaut, autoriser_configurer_dist()	
+			'autoriser_absence_id' => 'non', // autoriser l'insertion de nouveau contenu dans une table sans donner d'identifiant ?
+			'casier' => '', // sous tableau optionel du meta ou va etre stocke le fragment de config
+			'cfg_id' => '', // pour une config multiple , l'id courant
+			'descriptif' => '', // descriptif
+			'depot' => 'metapack', // (ancien 'storage') le depot utilise pour stocker les donnees, par defaut metapack: spip_meta serialise 
+			'fichier' => '', // pour storage php, c'est l'adresse du fichier (depuis la racine de spip), sinon ca prend /local/cfg/nom.php
+			'head' => '', // partie du fond cfg a inserer dans le head par le pipeline header_prive (todo insert_head?)
+			'icone' => '', // lien pour une icone
+			'inline' => '', // code qui sera insere apres le contenu du fond (peut servir pour inserer du js)
+			'interpreter' => 'oui', // si interpreter vaut 'non', le fond ne sera pas traite comme un fond cfg, mais comme une inclusion simple (pas de recherche des champs de formulaires). Cela permet d'utiliser des #FORMULAIRES_XX dans un fonds/ tout en utilisant la simplicite des parametres <!-- liens=.. --> par exemple.
+			'liens' => array(), // liens optionnels sur des sous-config <!-- liens*=xxx -->
+			'liens_multi' => array(), // liens optionnels sur des sous-config pour des fonds utilisant un champ multiple  <!-- liens_multi*=xxx -->
+			'nom' => '', // le nom du meta (ou autre) ou va etre stocke la config concernee
+			'onglet' => 'oui', // cfg doit-il afficher un lien vers le fond sous forme d'onglet dans la page ?exec=cfg
+			'presentation' => 'auto', // cfg doit-il encadrer le formulaire tout seul ?
+			'refus' => '', // en cas de refus d'autorisation, un message informatif [(#REM) refus=...]
+			'table' => '', // nom de la table sql pour storage extra ou table
+		);
+		$this->param['nom'] = $this->vue = $nom;
+		$this->param['cfg_id'] = $cfg_id;
+		
+		// definition de l'alias params
+		$this->params = array(
+			'champs' => &$this->champs, 
+			'champs_id' => &$this->champs_id,
+			'messages' => &$this->messages,
+			'val' => &$this->val,
+			'param' => &$this->param
+		);	
+		
+		foreach ($opt as $o=>$v) {
+			$this->$o = $v;
+		}    
+		// charger les donnees du fond demande
+		$this->charger();
+	}
+
+		
+	// retourne true en cas d'erreur...
+	function erreurs(){
+		return $this->messages['erreurs'] || $this->messages['message_erreur'];
+	}
+	
+	// ajoute une erreur sur un champ donne
+	function ajouter_erreur($champ, $message) {
+		$this->messages['erreurs'][$champs] = isset($this->messages['erreurs'][$champs]) 
+			? $this->messages['erreurs'][$champs] .= '<br />' . $message
+			: $message;
+	}
+	
+	// ajoute des erreurs sur les champs indiques dans le tableau
+	// (comme verifier de cvt)
+	function ajouter_erreurs($err) {
+		if (!is_array($err)) return false;
+		if (isset($err['message_erreur']) && $err['message_erreur']) 
+			$this->messages['message_erreur'][] = $err['message_erreur'];
+		if (isset($err['message_ok']) && $err['message_ok']) 	
+			$this->messages['message_ok'][] = $err['message_ok'];
+		unset($err['message_erreur'], $err['message_ok']);
+		if ($err) $this->messages['erreurs'] = $err;		// ou un merge ?? //
+		return true;
+	}
+	
+	
+	// pre-analyser le formulaire
+	// c'est a dire recuperer les parametres CFG 
+	// et les noms des champs du formulaire	
+	function charger(){
+		$ok = true;
+		
+		// si pas de fichier, rien a charger
+		if (!$this->vue) return false;
+
+		// lecture de la vue (fond cfg)
+		// il s'agit de recuperer le contenu du fichier
+ 		if (!$fichier = find_in_path($nom = 'fonds/cfg_' . $this->vue .'.html')){
+			if ($fichier = find_in_path($nom = 'formulaires/' . $this->vue .'.html'))
+				$this->depuis_cvt = true;
+		}
+		
+		// si pas de fichier, rien a charger
+		if (!$fichier) return false;
+		
+		if (!lire_fichier($fichier, $this->controldata)) {
+			$ok = false;
+			$this->messages['message_erreur'][] =  _T('cfg:erreur_lecture', array('nom' => $nom));
+		} else {
+			$this->path_vue = substr($fichier,0,-5);
+		}		
+
+		// recherche et stockage des parametres de cfg 
+		$this->recuperer_parametres();
+
+		// si le fond ne doit pas etre calcule comme un fond CFG,
+		// on s'arrete ici. De cette maniere, CFG ne prendra pas
+		// comme des champs a recuperer les champs issus d'un autre formulaire
+		// CFG inclu depuis un formulaire CVT via #FORMULAIRE_XX
+		if ($this->param['interpreter'] == 'non')
+			return true;
+			
+		// recherche et stockage des noms de champs de formulaire
+		if ($err = $this->recuperer_noms_champs()){
+			$ok = false;
+			$this->messages['message_erreur'][] = $err;
+		}
+	    
+		// charger les champs particuliers si existants
+		$this->actionner_extensions('pre_charger');	  
+		  
+		// creer le storage et lire les valeurs
+		$this->param['depot'] = strtolower(trim($this->param['depot']));
+		include_spip('inc/cfg_config');
+		$this->depot = new cfg_depot($this->param['depot'], $this->params);
+		$ok &= $this->lire();
+
+		// charger les champs particuliers si existants
+		$this->actionner_extensions('charger');
+		
+		return $ok;
+	}
+
+
+	//
+	// Doit controler la validite des valeurs transmises
+	// 
+	// Verifie les valeurs postees.
+	// - stocke les valeurs qui ont changees dans $this->val[$nom_champ] = 'nouvelle_valeur'
+	// - verifie que les types de valeurs attendus sont corrects ($this->verifier_champs_types)
+	// 
+	// retourne les messages d'erreur
+	//
+	function verifier() {
+
+		if ($this->erreurs() || !$this->autoriser()) 
+				return false;
+
+		// si on a pas poste de formulaire, pas la peine de controler
+		// ce qui mettrait de fausses valeurs dans l'environnement
+		if  (!_request('_cfg_ok') && !_request('_cfg_delete')) return true;
+
+		// les formulaires CVT ont deja leurs securites
+		if (!$this->depuis_cvt) {
+			$securiser_action = charger_fonction('securiser_action', 'inc');
+			$securiser_action();
+		}
+
+		// actions par champs speciaux, avant les tests des nouvelles valeurs
+		$this->actionner_extensions('pre_verifier');
+		
+		// stockage des nouvelles valeurs
+		foreach ($this->champs as $name => $def) {
+			// enregistrement des valeurs postees
+			$oldval = $this->val[$name];
+		    $this->val[$name] = _request($name);
+		    
+		    // tracer les modifications
+		    if ($oldval != $this->val[$name]) {
+		    	$this->log_modif .= $name . ':' . var_export($oldval, true) . '/' . var_export($this->val[$name], true) .', ';
+		    }
+		}
+	    
+		// si pas de changement, pas la peine de continuer
+		if (!$this->log_modif && !_request('_cfg_delete')) {
+			$this->messages['message_erreur'][] = _T('cfg:pas_de_changement', array('nom' => $this->nom_config()));
+			return false;
+		}
+		
+		// verifier la validite des champs speciaux (cfg_xx, type_xx)
+		$this->actionner_extensions('verifier');
+		
+		// stocker le fait que l'on a controle les valeurs
+		$this->verifier = true;
+	    return !$this->erreurs();
+	}
+	
+
+	
+	//
+	// Gere le traitement du formulaire.
+	// 
+	// Si le chargement ou le controle n'ont pas ete fait,
+	// la fonction s'en occupe.
+	// 
+	//
+	function traiter()
+	{
+		if (!$this->verifier) $this->verifier();
+		
+		if ($this->erreurs() || !$this->autoriser()) return false;
+	
+		if (!_request('_cfg_ok') && !_request('_cfg_delete')) return false;
+		
+		// les formulaires CVT ont deja leurs securites
+		if (!$this->depuis_cvt) {
+			$securiser_action = charger_fonction('securiser_action', 'inc');
+			$securiser_action();
+		}
+		
+		$this->actionner_extensions('pre_traiter');	
+		
+		if ($this->erreurs()) return false;		
+			
+		// suppression
+		if (_request('_cfg_delete')) {
+			$this->effacer();
+		
+		// sinon modification
+		} else {
+			$this->ecrire();
+		}
+
+		// pipeline 'cfg_post_edition' ? (quelqu'un utilise ??)
+		$this->messages = pipeline('cfg_post_edition',array('args'=>array('nom_config'=>$this->nom_config()),'data'=>$this->messages));
+
+		$this->actionner_extensions('post_traiter');
+	}
+
+
+
+
+	//
+	// Determine l'arborescence ou CFG doit chercher les valeurs deja enregistrees
+	// si nom=toto, casier=chose/truc, cfg_id=2, 
+	// cfg cherchera dans #CONFIG{toto/chose/truc/2}
+	// 
+	function nom_config()
+	{
+	    return $this->param['nom'] . 
+	    		($this->param['casier'] ? '/' . $this->param['casier'] : '') .
+	    		($this->param['cfg_id'] ? '/' . $this->param['cfg_id'] : '');
+	}
+
+
+
+	//
+	// Recherche et stockage
+	// des parametres #REM passes a CFG
+	// (DEPRECIE)
+	//
+	function recuperer_parametres_rem(){
+		// cas de #REM (deprecie)
+		preg_replace_callback('/(\[\(#REM\) ([a-z0-9_]\w+)(\*)?=)(.*?)\]/sim',
+					array(&$this, 'post_params'), $this->controldata);
+	}
+	
+	
+	// cette fonction recherche et stocke les parametres passes a cfg par <!-- param=valeur -->
+	// ces lignes sont alors effacees du code html. Ces proprietes sont lues apres recuperer_fond(),
+	// et interpretent donc les balises spip et les chaines de langues
+	//
+	// si la fonction est appelee 2 fois, les parametres identiques ne seront pas copies
+	// sauf si le parametre est un tableau (<!-- param*=valeur -->), les valeurs seront dupliquees
+	function recuperer_parametres(){
+
+		// pour compatibilite, recuperer l'ancien code #REM
+		$this->recuperer_parametres_rem();	
+		
+		$this->recuperer_fond();
+		$this->fond_compile = preg_replace_callback('/(<!-- ([a-z0-9_]\w+)(\*)?=)(.*?)-->/sim',
+							array(&$this, 'post_params'), $this->fond_compile);
+
+		// s'il en reste : il y a un probleme !
+		// est-ce utile de tester Ã§a ?
+		if (preg_match('/<!-- [a-z0-9_]\w+\*?=/', $this->fond_compile)) {
+			die('Un parametre CFG n\'a pas pu etre importe depuis '.$this->vue);
+		}
+
+		// pour compatibilite avec les anciennes versions (<1.4.1)
+		if (isset($this->param['storage'])) 
+			$this->param['depot'] = $this->param['storage'];
+		
+		if ($this->param['depot'] == 'classic')
+			$this->param['depot'] = 'meta';
+			
+		if ($this->param['depot'] == 'extrapack'){
+			$this->param['depot'] = 'tablepack';
+			$this->param['colonne'] = 'extra';
+			$this->param['table'] = 'spip_auteurs';
+		}
+		
+		// definir les parametres qui sont a traiter comme des extensions
+		// il faut que le parametre ne soit pas vide et qu'un fichier 
+		// /cfg/params/{param}.php existe
+		$this->extensions_parametres = array();
+		foreach ($this->param as $nom=>$val){
+			if ($val) $this->ajouter_extension_parametre($nom);		
+		}
+	}
+	
+	
+	// une fonction pour effacer les parametres du code html
+	// ce qui evite de dupliquer les tableaux 
+	// (si on utilisait recuperer_parametres() a la place)
+	function effacer_parametres(){
+		$this->fond_compile = preg_replace('/(<!-- ([a-z0-9_]\w+)(\*)?=)(.*?)-->/sim', '', $this->fond_compile);		
+	}
+	
+	
+	
+	// 
+	// Recherche  des noms des champs (y) du formulaire
+	// <input type="x" name="y"... />
+	// stockes dans le tableau $this->champs
+	// a l'exception des noms par _cfg_, reserves a ce plugin
+	// 
+	function recuperer_noms_champs(){	
+		if (!$this->vue) return;
+
+		// recherche d'au moins un champ de formulaire pour savoir si la vue est valide
+		$this->recuperer_fond();
+		if (!preg_match_all(
+		/*  '#<(?:(select|textarea)|input type="(text|password|checkbox|radio|hidden|file)") name="(\w+)(\[\])?"(?: class="[^"]*?(?:type_(\w+))?[^"]*?(?:cfg_(\w+))?[^"]*?")?( multiple=)?[^>]*?>#ims', */
+		  '#<(?:(select|textarea)|input type="(text|password|checkbox|radio|hidden|file)") name="(\w+)(\[\])?"(?: class="([^"]*)")?( multiple=)?[^>]*?>#ims',
+						$this->fond_compile, $matches, PREG_SET_ORDER)) {
+			return _T('cfg:pas_de_champs_dans', array('nom' => $this->vue));
+		}
+		
+		foreach ($matches as $regs) {
+			$name = $regs[3];
+			if (substr($name, 0, 5) == '_cfg_') continue;
+
+			$this->champs[$name] = array('balise' => $regs[1]); 
+			// input type
+		    if ($regs[2]) $this->champs[$name]['type'] = $regs[2];
+		    // champs tableau[]
+			if ($regs[4]) $this->champs[$name]['tableau'] = true;
+
+			//
+			// Extensions et validations des champs
+			// via les classes css
+			//
+			// attention : ordre important : <balise (type="xx")? name="xx" class="xx" multiple="xx" />
+			//
+			if ($regs[5]) {
+				$tcss = explode(' ',trim($regs[5]));
+				foreach($tcss as $css){
+					// classes css type_xx
+					if (substr($css,0,5)=='type_') {
+						$this->ajouter_extension($css, $name);
+					// classes css cfg_xx
+					} elseif (substr($css,0,4)=='cfg_') {
+						$this->champs[$name]['cfg'] = substr($css,4); // juste 'id' si classe = cfg_id
+						$this->ajouter_extension($css, $name);
+					}
+				}
+			}
+			
+			// cas particulier automatiques : 
+			// * input type file => type de verification : fichier
+			if (($regs[2] == 'file') AND (!$this->champs[$name]['cfg'])){
+				$this->champs[$name]['cfg'] = 'fichier';
+				$this->ajouter_extension('cfg_fichier', $name);	
+			}
+			
+	    }
+
+	    return '';
+	}	 
+	
+	// ajoute une extension (classe cfg_xx ou type_xx) 
+	// ce qui dit a cfg d'executer des fonctions particulieres
+	// si elles existent : ex: cfg_traiter_cfg_xx()
+	// lors de l'appel de 'actionner_extensions($faire)'
+	function ajouter_extension($ext, $nom){
+		if (!is_array($this->extensions[$ext])) $this->extensions[$ext] = array();
+		$this->extensions[$ext][] = $nom;	
+	}
+	
+	// ajoute une extension sur un parametre
+	// seulement si un fichier sur ce parametre existe
+	function ajouter_extension_parametre($param){
+		if (in_array($param, $this->extensions_parametres))
+			return true;
+		
+		if (find_in_path('cfg/params/'.$param.'.php')){
+			$this->extensions_parametres[] = $param;
+			return true;
+		}
+		return false;
+	}
+	
+	
+	// 
+	// Compiler le fond CFG si ce n'est pas fait
+	// 
+	function recuperer_fond($contexte = array(), $forcer = false){
+
+		if (!$this->fond_compile OR $forcer){
+			include_spip('inc/presentation'); // offrir les fonctions d'espace prive
+			include_spip('public/assembler');
+			
+			// rendre editable systematiquement
+			// sinon, ceux qui utilisent les fonds CFG avec l'API des formulaires dynamiques
+			// et mettent des [(#ENV**{editable}|oui) ... ] ne verraient pas leurs variables
+			// dans l'environnement vu que CFG ne pourrait pas lire les champs du formulaire
+			if ($this->depuis_cvt)
+				if (!isset($contexte['editable'])) $contexte['editable'] = true; // plante 1.9.2 !!
+			
+			// passer cfg_id...
+			if (!isset($contexte['cfg_id']) && $this->param['cfg_id']) {
+				$contexte['cfg_id'] = $this->param['cfg_id'];
+			}
+			// passer id aussi
+			if (!isset($contexte['id']) && $this->param['cfg_id']) {
+				$contexte['id'] = $this->param['cfg_id'];
+			}
+			// passer 'message_ok', 'message_erreur', 'erreurs'	
+			if (!isset($contexte['message_ok']) && $this->messages['message_ok']) {
+				$contexte['message_ok'] = join('<br />',$this->messages['message_ok']);
+			}
+			if (!isset($contexte['message_erreur']) && $this->messages['message_erreur']) {
+				$contexte['message_erreur'] = join('<br />',$this->messages['message_erreur']);
+			}
+			if (!isset($contexte['erreurs']) && $this->messages['erreurs']) {
+				$contexte['erreurs'] = $this->messages['erreurs'];
+			}
+			
+			$val = $this->val ? array_merge($contexte, $this->val) : $contexte;
+
+			// si on est dans l'espace prive, $this->path_vue est
+			// de la forme ../plugins/mon_plugin/fonds/toto, d'ou le replace
+			$this->fond_compile = recuperer_fond(
+				substr($this->path_vue, strlen(_DIR_RACINE)), $val);
+		}
+		return $this->fond_compile;
+	}
+	
+	
+	//
+	// Verifie les autorisations 
+	// d'affichage du formulaire
+	// (parametre autoriser=faire)
+	//
+	function autoriser()
+	{
+		static $autoriser=-1;
+		if ($autoriser !== -1) return $autoriser;
+
+		// on peut passer 'oui' ou 'non' directement au parametre autoriser
+		if ($this->param['autoriser'] == 'oui')
+			return $autoriser = 1;
+		if ($this->param['autoriser'] == 'non') {
+			$this->messages['message_refus'] = $this->param['refus'];
+			return $autoriser = 0;
+		}
+		// sinon, test de l'autorisation
+		// <!-- autoriser=webmestre -->
+		// <!-- autoriser=configurer -->
+		include_spip('inc/autoriser');
+		if (!$autoriser = autoriser($this->param['autoriser'])){
+			$this->messages['message_refus'] = $this->param['refus'];
+		}
+		return $autoriser;
+	}
+
+
+	//
+	// Log le message passe en parametre
+	// $this->log('message');
+	//
+	function log($message)
+	{
+		($GLOBALS['auteur_session'] && ($qui = $GLOBALS['auteur_session']['login']))
+		|| ($qui = $GLOBALS['ip']);
+		spip_log('cfg (' . $this->nom_config() . ') par ' . $qui . ': ' . $message);
+	}
+	
+	
+	// lit les donnees depuis le depot
+	function lire(){
+		list ($ok, $val, $messages) = $this->depot->lire($this->params);
+		if ($messages) $this->messages = $messages;
+		if ($ok) {
+			$this->val = $val;	
+		} else {
+			$this->messages['message_erreur'][] = _T('cfg:erreur_lecture', array('nom' => $this->nom_config()));
+		}
+		return $ok;
+	}
+	
+	
+	// Ecrit les donnees dans le depot
+	function ecrire() {
+		list ($ok, $val, $messages) = $this->depot->ecrire($this->params);
+		if ($messages) $this->messages = $messages;
+		if ($ok){
+			$this->val = $val;
+			$this->messages['message_ok'][] = $msg = _T('cfg:config_enregistree', array('nom' => $this->nom_config()));
+		} else {
+			$this->messages['message_erreur'][] = $msg =  _T('cfg:erreur_enregistrement', array('nom' => $this->nom_config()));
+		}
+		$this->log($msg . ' ' . $this->log_modif);
+		return $msg;
+	}
+
+
+	// Efface les donnees dans le depot
+	//
+	// dans le cas d'une suppression, il faut vider $this->val qui
+	// contient encore les valeurs du formulaire, sinon elles sont 
+	// passees dans le fond et le formulaire garde les informations
+	// d'avant la suppression	
+	function effacer(){
+		list ($ok, $val, $messages) = $this->depot->effacer($this->params);
+		if ($messages) $this->messages = $messages;
+		if ($ok) {
+			$this->val = $val;
+			$this->messages['message_ok'][] = $msg = _T('cfg:config_supprimee', array('nom' => $this->nom_config()));
+		} else {
+			$this->messages['message_erreur'][] = $msg = _T('cfg:erreur_suppression', array('nom' => $this->nom_config()));
+		}
+		$this->log($msg);	
+		return $msg;	
+	}
+	
+
+	//
+	// Fabriquer les balises des champs d'apres un modele fonds/cfg_<driver>.html
+	// $contexte est un tableau (nom=>valeur)
+	// qui sera enrichi puis passe a recuperer_fond
+	//
+	function formulaire($contexte = array())
+	{
+		if (!$this->path_vue)
+			return '';
+
+		if (!$this->depuis_cvt)
+			$contexte['_cfg_'] = $this->creer_hash_cfg();
+	
+		// recuperer le fond avec le contexte
+		// forcer le calcul.
+		$this->recuperer_fond($contexte, true);
+		$this->recuperer_parametres();
+		//$this->effacer_parametres(); // pour enlever les <!-- param=valeur --> ... sans dedoubler le contenu lorsque ce sont des tableau (param*=valeur)
+		return $this->fond_compile;
+	}
+	
+	
+	//
+	function creer_hash_cfg($action=''){
+		include_spip('inc/securiser_action');
+	    $arg = 'cfg0.0.0-' . $this->param['nom'] . '-' . $this->vue;
+		return 
+			'?cfg=' . $this->vue .
+			'&cfg_id=' . $this->param['cfg_id'] .
+		    '&arg=' . $arg .
+		    '&hash=' .  calculer_action_auteur($action . '-' . $arg);		
+	}
+	
+	
+	//
+	// teste et charge les points d'entrees de CFG a travers certaines actions
+	// 1 : fonctions generales cfg_{nom}_{action}
+	// 2 : actions sur les types de champs particuliers
+	//     notifies par 'type_XX' ou 'cfg_YY' sur les classes css
+	//     s'ils existent dans /cfg/classes/ par des fonctions
+	//     cfg_{action}_{classe}
+	// 3 : actions en fonctions des parametres du formulaire
+	//     s'ils existent dans /cfg/params/ par des fonctions
+	//     cfg_{action}_{parametre}
+	//
+	// les actions possibles sont :
+	// - pre_charger, charger, 
+	// - pre_verifier, verifier, 
+	// - pre_traiter, post_traiter
+	//
+	function actionner_extensions($action){
+		// 1 - general : on transmet l'instance de cfg_formulaire
+		if (function_exists($f = 'cfg_' . $this->vue . '_' . $action)) {
+			$res = $f($this);
+			// compat ascendante (1.7 a 1.10.2) : verifier retournait un array comme cvt
+			// il faut envoyer le resultat dans la fonction d'ajout des erreurs
+			if ($action == 'verifier' AND is_array($res))
+				$this->ajouter_erreurs($res);
+		} 
+		// 2 - type de champ : on transmet le nom du champ et l'instance de cfg_formulaire
+		if ($this->extensions) {
+			foreach ($this->extensions as $type => $champs){
+				// si un fichier de ce type existe, on lance la fonction 
+				// demandee pour chaque champs possedant la classe css en question
+				if (include_spip('cfg/classes/'.$type)) {
+					foreach ($champs as $champ){
+						if (function_exists($f = 'cfg_' . $action . '_' . $type)){ // absence possible normale
+							$f($champ, $this);
+						}
+					}
+				}	
+			}
+		}
+		// 3 - parametre : on transmet la valeur du parametre et l'instance de cfg_formulaire
+		if ($this->extensions_parametres){
+			foreach ($this->extensions_parametres as $param){
+				if (include_spip('cfg/params/'.$param)) {
+					if (function_exists($f = 'cfg_' . $action . '_param_' . $param)){ // absence possible normale
+						// artillerie lourde on passe
+						// la valeur et la classe
+						$f($this->param[$param], $this);						
+					}
+				}
+			}
+		}
+	}
+	
+
+	
+	// 
+	//callback pour interpreter les parametres objets du formulaire
+	// commun avec celui de set_vue()
+	// 
+	// Parametres : 
+	// - $regs[2] = 'parametre'
+	// - $regs[3] = '*' ou ''
+	// - $regs[4] = 'valeur'
+	// 
+	// Lorsque des parametres sont passes dans le formulaire 
+	// par <!-- param=valeur -->
+	// stocker $this->param['parametre']=valeur
+	// 
+	// Si <!-- param*=valeur -->
+	// Stocker $this->param['parametre'][]=valeur
+	// 
+	//
+	function post_params($regs) {
+
+		// $regs[3] peut valoir '*' pour signaler un tableau
+		$regs[4] = trim($regs[4]);
+		
+		if (empty($regs[3])) {
+		    $this->param[$regs[2]] = $regs[4];
+		} elseif (is_array($this->param[$regs[2]])) {
+		    $this->param[$regs[2]][] = $regs[4];
+		}
+		// plus besoin de garder ca
+		return '';
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/inc/compat_cfg.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/inc/compat_cfg.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/inc/compat_cfg.php	(revision 152)
@@ -0,0 +1,341 @@
+<?php
+
+/*
+ * Plugin CFG pour SPIP
+ * (c) toggg 2007, distribue sous licence GNU/GPL
+ * Documentation et contact: http://www.spip-contrib.net/
+ *
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+define('_COMPAT_CFG_192', true);
+
+
+if (version_compare($GLOBALS['spip_version_code'], '11216', '<')
+	&& !function_exists('balise_ACTION_FORMULAIRE_dist')) {
+		function balise_ACTION_FORMULAIRE_dist($p){
+			$p->code="''";
+			$p->interdire_scripts = false;
+			return $p;
+		}
+}
+
+/* fichier de compatibilite vers spip 1.9.2 */
+if (version_compare($GLOBALS['spip_version_code'], '1.9300', '<')
+	AND $f = charger_fonction('compat_cfg', 'inc'))
+		$f();
+
+
+## ceci n'est pas l'original du plugin compat mais la copie pour CFG
+
+// En termes de distribution ce fichier PEUT etre recopie dans chaque plugin
+// qui desire en avoir une version autonome (voire forkee), A CONDITION DE
+// RENOMMER le fichier et ses deux fonctions ; c'est un peu lourd a maintenir
+// mais c'est le prix a payer pour l'independance des plugins entre eux :-(
+
+// la version commune a tous est developpee sur
+// svn://zone.spip.org/spip-zone/_dev_/compat/
+
+
+function inc_compat_cfg_dist($quoi = NULL) {
+	if (!function_exists($f = 'compat_cfg_defs')) $f .= '_dist';
+	$defs = $f();
+
+	include_spip('base/abstract_sql');
+	
+	if (is_string($quoi))
+		$quoi = array($quoi);
+	else if (is_null($quoi))
+		$quoi = array_keys($defs);
+
+	foreach ($quoi as $d) {
+		if (!function_exists($d)
+		AND isset($defs[$d])) {
+			eval ("function $d".$defs[$d]);
+		}
+	}
+}
+
+function compat_cfg_defs_dist() {
+	$defs = array(
+		
+		'push' => 
+			'($array, $val) {
+				if($array == \'\' OR !array_push($array, $val)) return \'\';
+				return $array;
+			}',
+			
+		'et' => 
+			'($code, $arg) {
+				return ((($code) AND ($arg)) ?\' \' :\'\');
+			}',
+		
+		'ou' => 
+			'($code, $arg) {
+				return ((($code) OR ($arg)) ?\' \' :\'\');
+			}',
+		
+		'xou' => 
+			'($code, $arg) {
+				return ((($code) XOR ($arg)) ?\' \' :\'\');
+			}',
+		
+		'non' => 
+			'($code) {
+				return (($code) ?\'\' :\' \');
+			}',
+			
+		'oui' => 
+			'($code) {
+				return (($code) ?\' \' :\'\');
+			}',
+		
+		'sql_fetch' => 
+			'(
+				$res, 
+				$serveur=\'\'
+			) {
+				return spip_fetch_array($res);
+			}',
+		
+		'sql_query' => 
+			'($res, $serveur=\'\') {
+				return spip_query($res);
+			}',	
+		
+		// n'existe pas en 1.9.2
+		'sql_alter' => 
+			'($res, $serveur=\'\') {
+				return spip_query(\'ALTER \' . $res);
+			}',	
+				
+		// n'existe pas en 1.9.2
+		// on cree la requete directement
+		'sql_delete' => 
+			'($table, $where=\'\', $serveur=\'\') {
+				if (!is_array($table)) $table = array($table);
+				if (!is_array($where)) $where = array($where);
+				$query = \'DELETE FROM \'
+						. implode(\',\', $table)
+						. \' WHERE \'
+						. implode(\' AND \', $where);
+				return spip_query($query);
+			}',
+			
+		// sql_quote : _q directement
+		'sql_quote' => 
+			'(
+				$val, 
+				$serveur=\'\'
+			) {
+				return _q($val);
+			}',	
+						
+		'sql_select' => 
+			'(
+				$select = array(), 
+				$from = array(), 
+				$where = array(),
+				$groupby = array(), 
+				$orderby = array(), 
+				$limit = \'\', 
+				$having = array(),
+				$serveur=\'\'
+			) {
+				return spip_abstract_select(
+					$select, 
+					$from, 
+					$where, 
+					$groupby, 
+					$orderby, 
+					$limit, 
+					$sousrequete = \'\', 
+					$having,
+					$table = \'\', 
+					$id = \'\', 
+					$serveur);
+			}',
+		
+		'sql_fetsel' =>
+			'(
+				$select = array(), 
+				$from = array(), 
+				$where = array(),
+				$groupby = array(), 
+				$orderby = array(), 
+				$limit = \'\', 
+				$having = array(),
+				$serveur=\'\'
+			) {
+				return sql_fetch(sql_select(
+					$select, 
+					$from, 
+					$where,
+					$groupby, 
+					$orderby, 
+					$limit, 
+					$having,
+					$serveur				
+				));
+			}',	
+			
+		'sql_getfetsel' =>
+			'(
+				$select, 
+				$from = array(), 
+				$where = array(),
+				$groupby = array(), 
+				$orderby = array(), 
+				$limit = \'\', 
+				$having = array(),
+				$serveur=\'\'
+			) {
+				$r = sql_fetsel(
+					$select, 
+					$from, 
+					$where,
+					$groupby, 
+					$orderby, 
+					$limit, 
+					$having,
+					$serveur				
+				);
+				return $r ? $r[$select] : NULL;
+			}',
+					
+		'sql_allfetsel' =>
+			'(
+				$select, 
+				$from = array(), 
+				$where = array(),
+				$groupby = array(), 
+				$orderby = array(), 
+				$limit = \'\', 
+				$having = array(),
+				$serveur=\'\'
+			) {
+				$q = sql_select(
+					$select, 
+					$from, 
+					$where,
+					$groupby, 
+					$orderby, 
+					$limit, 
+					$having,
+					$serveur				
+				);
+				if (!$q) return array();
+				$res = array();
+				while ($r = sql_fetch($q)) $res[] = $r;
+				return $res;
+			}',				
+		
+		// n'existe pas en 1.9.2
+		// on cree la requete directement
+		'sql_update' => 
+			'(
+				$table, 
+				$champs, 
+				$where=\'\', 
+				$desc=array(), 
+				$serveur=\'\'
+			) {
+				if (!is_array($table)) 	$table = array($table);
+				if (!is_array($champs)) $champs = array($champs);
+				if (!is_array($where)) 	$where = array($where);
+
+				$query = $r = \'\';
+				foreach ($champs as $champ => $val)
+					$r .= \',\' . $champ . "=$val";
+				if ($r = substr($r, 1))
+					$query = \'UPDATE \'
+							. implode(\',\', $table)
+							. \' SET \' . $r
+							. (empty($where) ? \'\' :\' WHERE \' . implode(\' AND \', $where));
+				if ($query)
+					return spip_query($query);
+			}',
+
+		'sql_updateq' => 
+			'(
+				$table, 
+				$champs, 
+				$where=\'\', 
+				$desc=array(), 
+				$serveur=\'\'
+			) {
+				if (!is_array($champs)) $exp = array($champs);
+				
+				foreach ($champs as $k => $val) {
+					$champs[$k] = sql_quote($val);
+				}
+				
+				return sql_update(				
+					$table, 
+					$champs, 
+					$where, 
+					$desc, 
+					$serveur
+				);
+			}',	
+			
+		
+		// n'existe pas en 1.9.2
+		// on cree la requete directement
+		'sql_insertq' => 
+			'(
+				$table,
+				$champs
+			) {
+				if (!is_array($champs)) $exp = array($champs);
+				
+				foreach ($champs as $k => $val) {
+					$champs[$k] = sql_quote($val);
+				}
+				
+				$query = "INSERT INTO $table (".implode(",", array_keys($champs)).") VALUES (".implode(",", $champs).")";
+				return sql_query($query);
+			}',
+		
+		'sql_showtable' => '($table, $serveur=\'\') {
+			include_spip("base/abstract_sql");
+			return spip_abstract_showtable($table, \'mysql\', true);
+		}',
+		
+
+		'sql_count' => 
+			'(
+				$res, 
+				$serveur=\'\'
+			) {
+				return spip_mysql_count($res);
+			}',
+		
+
+		'sql_countsel' => 
+ 			'(
+				$from = array(), 
+				$where = array(),
+				$groupby = array(), 
+				$limit = \'\', 
+				$having = array(),
+				$serveur=\'\'
+ 			) {
+				return(sql_getfetsel(\'COUNT(*)\', $from, $where, $groupby, \'\', $limit, $having, $serveur));
+ 			}',
+ 					
+		'sql_selectdb' => 
+			'(
+				$res, 
+				$serveur=\'\'
+			) {
+				$GLOBALS[\'spip_mysql_db\'] = mysql_select_db($res);
+				return $GLOBALS[\'spip_mysql_db\'];
+			}'
+
+	);
+	return $defs;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ar.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ar.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ar.php	(revision 152)
@@ -0,0 +1,57 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => '&#1578;&#1581;&#1583;&#1610;&#1579;',
+
+	// C
+	'cfg' => '&#1605;&#1581;&#1585;&#1603; &#1575;&#1604;&#1575;&#1593;&#1583;&#1575;&#1583; (CFG)',
+	'choisir_module_a_configurer' => '&#1575;&#1582;&#1578;&#1585; &#1575;&#1604;&#1605;&#1604;&#1581;&#1602; &#1575;&#1604;&#1584;&#1610; &#1578;&#1585;&#1610;&#1583; &#1573;&#1593;&#1583;&#1575;&#1583;&#1607;',
+	'config_enregistree' => '&#1578;&#1605; &#1578;&#1587;&#1580;&#1610;&#1604; <b>@nom@</b>',
+	'config_supprimee' => '&#1578;&#1605; &#1581;&#1584;&#1601; <b>@nom@</b>',
+	'configuration_modules' => '&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1605;&#1604;&#1575;&#1581;&#1602;',
+
+	// E
+	'erreur_copie_fichier' => '&#1604;&#1575; &#1610;&#1605;&#1603;&#1606; &#1606;&#1587;&#1582; &#1575;&#1604;&#1605;&#1604;&#1601; @fichier@ &#1575;&#1604;&#1609; &#1605;&#1608;&#1602;&#1593;&#1607; &#1575;&#1604;&#1606;&#1607;&#1575;&#1574;&#1610;',
+	'erreur_enregistrement' => '&#1581;&#1589;&#1604; &#1582;&#1591;&#1571; &#1582;&#1604;&#1575;&#1604; &#1578;&#1587;&#1580;&#1610;&#1604; <b>@nom@</b>',
+	'erreur_lecture' => '&#1604;&#1575; &#1610;&#1605;&#1603;&#1606; &#1602;&#1585;&#1575;&#1569;&#1577; @nom@',
+	'erreur_open_w_fichier' => '&#1604;&#1575; &#1610;&#1605;&#1603;&#1606; &#1601;&#1578;&#1581; &#1575;&#1604;&#1605;&#1604;&#1601; @fichier@ &#1601;&#1610; &#1608;&#1590;&#1593;&#1610;&#1577; &#1575;&#1604;&#1603;&#1578;&#1575;&#1576;&#1577;',
+	'erreur_suppression' => '&#1581;&#1589;&#1604; &#1582;&#1591;&#1571; &#1604;&#1583;&#1609; &#1581;&#1584;&#1601; <b>@nom@</b>',
+	'erreur_suppression_fichier' => '&#1604;&#1575; &#1610;&#1605;&#1603;&#1606; &#1581;&#1584;&#1601; &#1575;&#1604;&#1605;&#1604;&#1601; @fichier@.',
+	'erreur_type_id' => '&#1610;&#1580;&#1576; &#1575;&#1606; &#1610;&#1576;&#1583;&#1571; &#1575;&#1604;&#1581;&#1602;&#1604; @champ@ &#1576;&#1581;&#1585;&#1601; &#1575;&#1608; &#1582;&#1591;',
+	'erreur_type_idnum' => '&#1610;&#1580;&#1576; &#1575;&#1606; &#1610;&#1603;&#1608;&#1606; &#1575;&#1604;&#1581;&#1602;&#1604; @champ@ &#1585;&#1602;&#1605;&#1610;',
+	'erreur_type_pwd' => '&#1610;&#1580;&#1576; &#1575;&#1606; &#1610;&#1581;&#1578;&#1608;&#1610; &#1575;&#1604;&#1581;&#1602;&#1604; @champ@ &#1593;&#1604;&#1609; &#1575;&#1603;&#1579;&#1585; &#1605;&#1606; &#1582;&#1605;&#1587;&#1577; &#1575;&#1581;&#1585;&#1601;',
+
+	// I
+	'id_manquant' => '&#1605;&#1593;&#1585;&#1617;&#1601; &#1594;&#1610;&#1585; &#1605;&#1608;&#1580;&#1608;&#1583;',
+	'installation_librairies' => '&#1578;&#1581;&#1605;&#1610;&#1604; &#1575;&#1604;&#1605;&#1603;&#1578;&#1576;&#1575;&#1578;',
+	'installation_liste_libs' => '&#1604;&#1575;&#1574;&#1581;&#1577; &#1575;&#1604;&#1605;&#1603;&#1578;&#1576;&#1575;&#1578;',
+	'installer_dossier_lib' => '&#1610;&#1580;&#1576; &#1575;&#1606;&#1588;&#1575;&#1569; &#1605;&#1580;&#1604;&#1583; @dir@ &#1601;&#1610; &#1575;&#1589;&#1604; &#1605;&#1608;&#1602;&#1593; SPIP &#1610;&#1605;&#1604;&#1603; &#1575;&#1605;&#1578;&#1610;&#1575;&#1586;&#1575;&#1578; &#1575;&#1604;&#1603;&#1578;&#1575;&#1576;&#1577;.',
+	'installer_lib_192' => '&#1604;&#1578;&#1579;&#1576;&#1610;&#1578; &#1605;&#1603;&#1578;&#1576;&#1577; &#1605;&#1575;&#1548; &#1610;&#1580;&#1576; &#1575;&#1586;&#1575;&#1604;&#1577; &#1590;&#1594;&#1603; &#1605;&#1604;&#1601; zip &#1610;&#1583;&#1608;&#1610;&#1575;&#1611; &#1608;&#1606;&#1587;&#1582; &#1605;&#1581;&#1578;&#1608;&#1575;&#1607; &#1601;&#1610; &#1605;&#1580;&#1604;&#1583; @dir@.',
+
+	// N
+	'nom_table_manquant' => '&#1575;&#1587;&#1605; &#1580;&#1583;&#1608;&#1604; SQL &#1594;&#1610;&#1585; &#1605;&#1608;&#1580;&#1608;&#1583;',
+	'nouveau' => '&#1580;&#1583;&#1610;&#1583;',
+
+	// O
+	'ok' => '&#1605;&#1608;&#1575;&#1601;&#1602;',
+
+	// P
+	'pas_de_champs_dans' => '&#1604;&#1605; &#1610;&#1578;&#1605; &#1575;&#1604;&#1593;&#1579;&#1608;&#1585; &#1593;&#1604;&#1609; &#1575;&#1610; &#1581;&#1602;&#1604; &#1601;&#1610; @nom@',
+	'pas_de_changement' => '&#1604;&#1575; &#1578;&#1594;&#1610;&#1610;&#1585;&#1575;&#1578; &#1601;&#1610; <b>@nom@</b>',
+
+	// R
+	'refus_configuration_webmestre' => '&#1604;&#1575; &#1610;&#1581;&#1602; &#1575;&#1604;&#1575; &#1604;&#1605;&#1587;&#1572;&#1608;&#1604;&#1610; &#1575;&#1604;&#1605;&#1608;&#1602;&#1593; &#1578;&#1593;&#1583;&#1610;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;',
+	'reset' => '&#1581;&#1584;&#1601;',
+
+	// S
+	'supprimer' => '&#1581;&#1584;&#1601;'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ast.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ast.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ast.php	(revision 152)
@@ -0,0 +1,57 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Actualizar',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Escoyer el m&oacute;dulu pa afitar.',
+	'config_enregistree' => 'Efeutuose la grabaci&oacute;n de <b>@nom@</b>',
+	'config_supprimee' => 'Efeutuose\'l desaniciu de <b>@nom@</b>',
+	'configuration_modules' => 'Afitamientu de los m&oacute;dulos',
+
+	// E
+	'erreur_copie_fichier' => 'Nun ye posible copiar el ficheru @fichier@ nel so asitiamientu definitivu',
+	'erreur_enregistrement' => 'Hubo un fallu demientres se grababa <b>@nom@</b>',
+	'erreur_lecture' => 'Nun ye posible lleer @nom@',
+	'erreur_open_w_fichier' => 'Nun ye posible abrir el ficheru @fichier@ pa escritura',
+	'erreur_suppression' => 'Hubo un fallu demientres se desaniciaba <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'Nun ye posible desaniciar el ficheru @fichier@.',
+	'erreur_type_id' => 'El campu @champ@ tien qu\'entamar por una lletra o un sorray&aacute;u',
+	'erreur_type_idnum' => 'El campu @champ@ tien que ser numb&eacute;ricu',
+	'erreur_type_pwd' => 'El campu @champ@ tien que tener m&aacute;s de 5 carauteres',
+
+	// I
+	'id_manquant' => 'Falta l\'identificaor',
+	'installation_librairies' => 'Descarga de biblioteques',
+	'installation_liste_libs' => 'Llista de les biblioteques',
+	'installer_dossier_lib' => 'Ties que crear un direutoriu @dir@ na raiz del to sitiu SPIP, que tenga permisu d\'escritura.',
+	'installer_lib_192' => 'Pa asitiar una biblioteca, hai que descomprimir el ficheru zip a mano y copiar el so conten&iacute;u nel direutoriu @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Falta\'l nome de la tabla SQL',
+	'nouveau' => 'Nuevu',
+
+	// O
+	'ok' => 'Val',
+
+	// P
+	'pas_de_champs_dans' => 'Nun s\'alcuentra deng&uacute;n campu en @nom@',
+	'pas_de_changement' => 'Ensin camb&eacute;os en <b>@nom@</b>',
+
+	// R
+	'refus_configuration_webmestre' => 'S&oacute;lo los webmasters d\'esti sitiu tienen autorizaci&oacute;n pa camudar estos par&aacute;metros.',
+	'reset' => 'Desaniciar',
+
+	// S
+	'supprimer' => 'Desaniciar'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ca.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ca.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ca.php	(revision 152)
@@ -0,0 +1,57 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Actualitzaci&oacute;',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Escolliu el m&ograve;dul a configurar.',
+	'config_enregistree' => 'Enregistrament de <b>@nom@</b> realitzat',
+	'config_supprimee' => 'Suppressi&oacute; de <b>@nom@</b> realitzat',
+	'configuration_modules' => 'Configuraci&oacute; dels m&ograve;duls',
+
+	// E
+	'erreur_copie_fichier' => 'Impossible copiar el fitxer @fichier@ al seu empla&ccedil;ament definitiu',
+	'erreur_enregistrement' => 'Hi ha hagut un error durant l\'enregistrament de <b>@nom@</b>',
+	'erreur_lecture' => 'Impossible llegir @nom@',
+	'erreur_open_w_fichier' => 'Impossible obrir el fitxer @fichier@ en escriptura',
+	'erreur_suppression' => 'Ha ocorregut un errror durant la supressi&oacute; de <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'Impossible suprimir el fitxer @fichier@.',
+	'erreur_type_id' => 'El camp @champ@ ha de comen&ccedil;ar per una lletra o un subratllat',
+	'erreur_type_idnum' => 'El camp @champ@ ha de ser num&egrave;ric',
+	'erreur_type_pwd' => 'El camp @champ@ ha de tenir m&eacute;s de 5 car&agrave;cters',
+
+	// I
+	'id_manquant' => 'Falta identificador ',
+	'installation_librairies' => 'Desc&agrave;rrega de llibreries',
+	'installation_liste_libs' => 'Llista de llibreries',
+	'installer_dossier_lib' => 'Heu de crear una carpeta @dir@ a l\'arrel del vostre SPIP que tingui permisos d\'escriptura.',
+	'installer_lib_192' => 'Per instal&middot;lar una llibreria, descomprimiu manualment el zip i copieu el seu contingut a dins de la carpeta @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Falta el nom de la taula SQL',
+	'nouveau' => 'Nou',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'No s\'ha trobat cap camp a @nom@',
+	'pas_de_changement' => 'Cap canvi a <b>@nom@</b>',
+
+	// R
+	'refus_configuration_webmestre' => 'Nom&eacute;s els webmestres del lloc estan autoritzats per modificar aquests par&agrave;metres. ',
+	'reset' => 'Esborrar',
+
+	// S
+	'supprimer' => 'Suprimir'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_de.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_de.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_de.php	(revision 152)
@@ -0,0 +1,57 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Auf den neuesten Stand bringen',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'W&auml;hlen Sie das zu konfigurierende Modul',
+	'config_enregistree' => 'Speicherung von <b>@nom@</b> erfolgreich',
+	'config_supprimee' => 'L&ouml;schen von <b>@nom@</b> erfolgreich',
+	'configuration_modules' => 'Konfiguration der Module',
+
+	// E
+	'erreur_copie_fichier' => 'Die Datei @fichier@ kann nicht an ihren Zielort kopiert werden.',
+	'erreur_enregistrement' => 'Ein Fehler ist aufgetreten beim Speichern von <b>@nom@</b>',
+	'erreur_lecture' => 'Fehler beim Lesen von @nom@',
+	'erreur_open_w_fichier' => 'Fehler beim &Ouml;ffnen der Datei @fichier@ zum Schreiben',
+	'erreur_suppression' => 'Ein Fehler ist aufgetreten beim L&ouml;schen von <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'Die Datei @fichier@ kann nicht gel&ouml;scht werden.',
+	'erreur_type_id' => 'Das Feld @champ@ muss mit einem Buchstaben oder einem Unterstrich beginnen.',
+	'erreur_type_idnum' => 'Das Feld @champ@ muss numerisch sein.',
+	'erreur_type_pwd' => 'Das Feld @champ@ ben&ouml;tigt mindestens 5 Zeichen.',
+
+	// I
+	'id_manquant' => 'Fehlende ID',
+	'installation_librairies' => 'Herunterladen der Bibliotheken',
+	'installation_liste_libs' => 'Liste der Bibliotheken',
+	'installer_dossier_lib' => 'Sie m&uuml;ssen ein beschreibbares Verzeichnis mit dem Namen @dir@ im Wurzelverzeichnis Ihrer SPIP-Website anlegen.',
+	'installer_lib_192' => 'Um eine Bibliothek zu installieren, entpacken Sie die ZIP-Datei manuell und kopieren Sie den Inhalt des Archivs in das Verzeichnis @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Fehlender Name der SQL Tabelle',
+	'nouveau' => 'Neu',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'Kein Feld in @nom@ gefunden',
+	'pas_de_changement' => 'Keine &Auml;nderung in <b>@nom@</b>',
+
+	// R
+	'refus_configuration_webmestre' => 'Nur ein Webmaster darf diese EInstellungen bearbeiten.',
+	'reset' => 'Reset',
+
+	// S
+	'supprimer' => 'L&ouml;schen'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_en.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_en.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_en.php	(revision 152)
@@ -0,0 +1,57 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Update',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Choose the module to configure.',
+	'config_enregistree' => '<b>@nom@</b> has been saved',
+	'config_supprimee' => '<b>@nom@</b> has been deleted',
+	'configuration_modules' => 'Module configuration',
+
+	// E
+	'erreur_copie_fichier' => 'It is impossible to copythe file @fichier@ to its final destination',
+	'erreur_enregistrement' => 'An error occurred while saving <b>@nom@</b>',
+	'erreur_lecture' => 'Impossible to read @nom@',
+	'erreur_open_w_fichier' => 'Impossible to open @fichier@ for modification',
+	'erreur_suppression' => 'An error occurred while deleting <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'The file @fichier@ cannot be deleted.',
+	'erreur_type_id' => 'The field @champ@ must begin with a letter or an underscore',
+	'erreur_type_idnum' => 'The field @champ@ must be numeric',
+	'erreur_type_pwd' => 'The field @champ@ must comprise more than 5 characters',
+
+	// I
+	'id_manquant' => 'Missing identifier',
+	'installation_librairies' => 'Download libraries',
+	'installation_liste_libs' => 'List of libraries',
+	'installer_dossier_lib' => 'You must create a directory named @dir@ with write permissions at the root of your SPIP site.',
+	'installer_lib_192' => 'To install a library, unzip the zip file manually and copy its contents to the @dir@ directory.',
+
+	// N
+	'nom_table_manquant' => 'Missing SQL table name',
+	'nouveau' => 'New',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'No field found in @nom@',
+	'pas_de_changement' => 'No change found in <b>@nom@</b>',
+
+	// R
+	'refus_configuration_webmestre' => 'Only the site webmasters are authorised to modify these parameters.',
+	'reset' => 'Delete',
+
+	// S
+	'supprimer' => 'Delete'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_es.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_es.php	(revision 152)
@@ -0,0 +1,56 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Actualizar',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Elige el m&oacute;dulo a configurar.',
+	'config_enregistree' => 'Efectuada la grabaci&oacute;n de <b>@nom@</b>',
+	'config_supprimee' => 'Efectuada la supresi&oacute;n de <b>@nom@</b>',
+	'configuration_modules' => 'Configuraci&oacute;n de los m&oacute;dulos',
+
+	// E
+	'erreur_copie_fichier' => 'No es posible copiar el fichero @fichier@ en su emplazamiento definitivo',
+	'erreur_enregistrement' => 'Se ha producido un error al grabar <b>@nom@</b>',
+	'erreur_lecture' => 'No es posible leer @nom@',
+	'erreur_open_w_fichier' => 'No se puede abrir el fichero @fichier@ en modo escritura',
+	'erreur_suppression' => 'Se ha producido un error al suprimir <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'No es posible suprimir el fichero @fichier@.',
+	'erreur_type_id' => 'El campo @champ@ debe comenzar por una letra o un subrayado',
+	'erreur_type_idnum' => 'El campo @champ@ debe ser num&eacute;rico',
+	'erreur_type_pwd' => 'El campo @champ@ debe tener m&aacute;s de 5 caracteres',
+
+	// I
+	'id_manquant' => 'Falta el identificador',
+	'installation_librairies' => 'Descarga de bibliotecas',
+	'installation_liste_libs' => 'Lista de bibliotecas',
+	'installer_dossier_lib' => 'Tienes que crear una carpeta @dir@ en tu carpeta ra&iacute;z de SPIP con permiso de escritura.',
+	'installer_lib_192' => 'Para instalar una biblioteca, descomprime manualmente el zip y copia su contenido en la carpeta @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Nombre de la tabla SQL que falta',
+	'nouveau' => 'Nuevo',
+
+	// O
+	'ok' => 'S&Iacute;',
+
+	// P
+	'pas_de_champs_dans' => 'No se encuentra ning&uacute;n campo en @nom@',
+	'pas_de_changement' => 'Sin cambios en <b>@nom@</b>',
+
+	// R
+	'reset' => 'Borrar',
+
+	// S
+	'supprimer' => 'Suprimir'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_fr.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_fr.php	(revision 152)
@@ -0,0 +1,56 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/_stable_/cfg/lang/
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Mettre &agrave; jour',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Choisissez le module &agrave; configurer.',
+	'config_enregistree' => 'Enregistrement de <b>@nom@</b> effectu&eacute;',
+	'config_supprimee' => 'Suppression de <b>@nom@</b> effectu&eacute;',
+	'configuration_modules' => 'Configuration des modules',
+
+	// E
+	'erreur_copie_fichier' => 'Impossible de copier le fichier @fichier@ &agrave; son emplacement d&eacute;finitif',
+	'erreur_enregistrement' => 'Une erreur est survenue lors de l\'enregistrement de <b>@nom@</b>',
+	'erreur_lecture' => 'Impossible de lire @nom@',
+	'erreur_open_w_fichier' => 'Impossible d\'ouvrir le fichier @fichier@ en &eacute;criture',
+	'erreur_suppression' => 'Une erreur est survenue lors de la suppression de <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'Impossible de supprimer le fichier @fichier@.',
+	'erreur_type_id' => 'Le champ @champ@ doit commencer par une lettre ou un soulign&eacute;',
+	'erreur_type_idnum' => 'Le champ @champ@ doit &ecirc;tre numerique',
+	'erreur_type_pwd' => 'Le champ @champ@ doit avoir plus de 5 caract&egrave;res',
+
+	// I
+	'id_manquant' => 'Identifiant manquant',
+	'installation_librairies' => 'T&eacute;l&eacute;chargement de librairies',
+	'installation_liste_libs' => 'Liste des librairies',
+	'installer_dossier_lib' => 'Vous devez creer un dossier @dir@ &agrave; la racine de votre SPIP ayant des permissions d\'ecriture.',
+	'installer_lib_192' => 'Pour installer une librairie, d&eacute;compressez manuellement le zip et copiez son contenu dans le dossier @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Nom de la table SQL manquant',
+	'nouveau' => 'Nouveau',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'Aucun champs trouv&eacute; dans @nom@',
+	'pas_de_changement' => 'Pas de changement dans <b>@nom@</b>',
+
+	// R
+	'refus_configuration_administrateur' => 'Seuls les administrateurs du site sont autoris&#233;s &#224; modifier ces param&#232;tres.',
+	'refus_configuration_webmestre' => 'Seuls les webmestres du site sont autoris&#233;s &#224; modifier ces param&#232;tres.',
+	'reset' => 'Effacer',
+
+	// S
+	'supprimer' => 'Supprimer'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_fr_tu.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_fr_tu.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_fr_tu.php	(revision 152)
@@ -0,0 +1,57 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Mettre &agrave; jour',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Choisis le module &agrave; configurer.',
+	'config_enregistree' => 'Enregistrement de <b>@nom@</b> effectu&eacute;',
+	'config_supprimee' => 'Suppression de <b>@nom@</b> effectu&eacute;',
+	'configuration_modules' => 'Configuration des modules',
+
+	// E
+	'erreur_copie_fichier' => 'Impossible de copier le fichier @fichier@ &agrave; son emplacement d&eacute;finitif',
+	'erreur_enregistrement' => 'Une erreur est survenue lors de l\'enregistrement de <b>@nom@</b>',
+	'erreur_lecture' => 'Impossible de lire @nom@',
+	'erreur_open_w_fichier' => 'Impossible d\'ouvrir le fichier @fichier@ en &eacute;criture',
+	'erreur_suppression' => 'Une erreur est survenue lors de la suppression de <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'Impossible de supprimer le fichier @fichier@.',
+	'erreur_type_id' => 'Le champ @champ@ doit commencer par une lettre ou un soulign&eacute;',
+	'erreur_type_idnum' => 'Le champ @champ@ doit &ecirc;tre numerique',
+	'erreur_type_pwd' => 'Le champ @champ@ doit avoir plus de 5 caract&egrave;res',
+
+	// I
+	'id_manquant' => 'Identifiant manquant',
+	'installation_librairies' => 'T&eacute;l&eacute;chargement de librairie',
+	'installation_liste_libs' => 'Liste des librairies',
+	'installer_dossier_lib' => 'Tu dois cr&eacute;er un dossier @dir@ &agrave; la racine de ton SPIP ayant des permissions d\'&eacute;criture.',
+	'installer_lib_192' => 'Pour installer une librairie, d&eacute;compresse manuellement le zip et copie son contenu dans le dossier @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Nom de la table SQL manquant',
+	'nouveau' => 'Nouveau',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'Aucun champs trouv&eacute; dans @nom@',
+	'pas_de_changement' => 'Pas de changement dans <b>@nom@</b>',
+
+	// R
+	'refus_configuration_webmestre' => 'Seuls les webmestres du site sont autoris&eacute;s &agrave; modifier ces param&egrave;tres.',
+	'reset' => 'Effacer',
+
+	// S
+	'supprimer' => 'Supprimer'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_gl.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_gl.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_gl.php	(revision 152)
@@ -0,0 +1,57 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Actualizar',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Escoller o m&oacute;dulo para configuraci&oacute;n.',
+	'config_enregistree' => 'Rexistro de <b>@nom@</b> realizado',
+	'config_supprimee' => 'Supresi&oacute;n de <b>@nom@</b> realizada',
+	'configuration_modules' => 'Configuraci&oacute;n de m&oacute;dulos',
+
+	// E
+	'erreur_copie_fichier' => 'Resultou imposible copiar o ficheiro @fichier@ ao seu emprazamento definitivo',
+	'erreur_enregistrement' => 'Un erro acaeu tras o rexistro de <b>@nom@</b>',
+	'erreur_lecture' => 'Imposible de ler @nom@',
+	'erreur_open_w_fichier' => 'Imposible de abrir o ficheiro @fichier@ en modo de escritura',
+	'erreur_suppression' => 'Un erro acaeu logo da supresi&oacute;n de <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'Resultou imposible suprimir o ficheiro @fichier@.',
+	'erreur_type_id' => 'O campo @champ@ debe comezar por unha letra ou un subli&ntilde;ado',
+	'erreur_type_idnum' => 'O campo @champ@ debe ser num&eacute;rico',
+	'erreur_type_pwd' => 'O campo @champ@ dbe ter m&aacute;is de 5 caracteres',
+
+	// I
+	'id_manquant' => 'Falta o identificador',
+	'installation_librairies' => 'Descarga de librer&iacute;as',
+	'installation_liste_libs' => 'Lista de librar&iacute;as',
+	'installer_dossier_lib' => 'Debe crear un dosier @dir@ na ra&iacute;z do seu web SPIP cos permisos de escritura.',
+	'installer_lib_192' => 'Para instalar unha librar&iacute;a, descomprima manualmente o zip e copie o seu contido no cartafol @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Nome da t&aacute;boa SQL que falta',
+	'nouveau' => 'Novo',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'Ning&uacute;n campo encontrado en @nom@',
+	'pas_de_changement' => 'Ning&uacute;n cambio en <b>@nom@</b>',
+
+	// R
+	'refus_configuration_webmestre' => 'S&oacute; os webmasters do web est&aacute;n autorizados para modificar estes par&aacute;metros.',
+	'reset' => 'Borrar',
+
+	// S
+	'supprimer' => 'Suprimir'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_nl.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_nl.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_nl.php	(revision 152)
@@ -0,0 +1,56 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Bijwerken',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Kiest de te configureren module.',
+	'config_enregistree' => 'Uitgevoerde registratie van <b>@nom@</b>',
+	'config_supprimee' => 'Afschaffing van <b>@nom@</b> uitgevoerd ',
+	'configuration_modules' => 'Configuratie van de modules',
+
+	// E
+	'erreur_copie_fichier' => 'Onmogelijk om het bestand @fichier@ aan zijn definitieve plaats tekopi&euml;ren',
+	'erreur_enregistrement' => 'Een fout is bij de registratie van voorgekomen <b>@nom@</b>',
+	'erreur_lecture' => 'Onmogelijk om te lezen @nom@',
+	'erreur_open_w_fichier' => 'Onmogelijk om het bestand @fichier@ in schrift te openen',
+	'erreur_suppression' => 'Een fout is bij de afschaffing van voorgekomen <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'Onmogelijk om het bestand af te schaffen @fichier@.',
+	'erreur_type_id' => 'Het veld @champ@ moet met een brief of een beginnen onderstreept',
+	'erreur_type_idnum' => 'Het veld @champ@ moet numeriek zijn',
+	'erreur_type_pwd' => 'Het veld @champ@ moet meer dan 5 karakters hebben',
+
+	// I
+	'id_manquant' => 'Ontbrekende identificatie',
+	'installation_librairies' => 'Download van boekhandels',
+	'installation_liste_libs' => 'Lijst van de boekhandels',
+	'installer_dossier_lib' => 'U moet een dossier @dir@ aan de wortel van uw SPIP cre&euml;ren dat toestemmingen van schrift heeft.',
+	'installer_lib_192' => 'Om een boekhandel te plaatsen, d&eacute;compressez manueel zip en kopi&euml;ert zijn inhoud in het dossier @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Ontbrekende naam van de tafel SQL',
+	'nouveau' => 'Nieuw',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'Geen enkele velden gevonden in @nom@',
+	'pas_de_changement' => 'Geen verandering in <b>@nom@</b>',
+
+	// R
+	'reset' => 'Uitwissen',
+
+	// S
+	'supprimer' => 'Afschaffen'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_pt_br.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_pt_br.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_pt_br.php	(revision 152)
@@ -0,0 +1,56 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Atualizar',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Escolha o m&oacute;dula para configurar',
+	'config_enregistree' => 'Inclus&atilde;o de <b>@nom@</b> efetuada',
+	'config_supprimee' => 'Exclus&atilde;o de <b>@nom@</b> efetuada',
+	'configuration_modules' => 'Configura&ccedil;&atilde;o dos m&oacute;dulos',
+
+	// E
+	'erreur_copie_fichier' => 'N&atilde;o foi poss&iacute;vel copiar o arquivo @fichier@ para o seu local definitivo',
+	'erreur_enregistrement' => 'Um erro ocorreu ao registrar <b>@nom@</b>',
+	'erreur_lecture' => 'N&atilde;o foi poss&iacute;vel ler @nom@',
+	'erreur_open_w_fichier' => 'N&atilde;o foi poss&iacute;vel abrir o arquivo  @fichier@ para escrita',
+	'erreur_suppression' => 'Ocorreu um erro ao excluir <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'N&atilde;o foi poss&iacute;vel excluir o arquivo @fichier@.',
+	'erreur_type_id' => 'O campo @champ@ precisa come&ccedil;ar por uma letra ou sublinhado',
+	'erreur_type_idnum' => 'O campo @champ@ precisa ser num&eacute;rico',
+	'erreur_type_pwd' => 'O campo @champ@ precisa ter mais de 5 caracteres',
+
+	// I
+	'id_manquant' => 'Faltando identificador',
+	'installation_librairies' => 'Transfer&ecirc;ncia de bibliotecas',
+	'installation_liste_libs' => 'Lista de bibliotecas',
+	'installer_dossier_lib' => 'Voc&ecirc; precisa criar um diret&oacute;rio @dir@ na raiz do seu SPIP, com permiss&atilde;o de escrita.',
+	'installer_lib_192' => 'Para instalar uma biblioteca, expanda manualmente o zip e copie o seu conte&uacute;do no diret&oacute;rio @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Nome da tabela faltando',
+	'nouveau' => 'Novo',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'Nenhum campo encontrado em @nom@',
+	'pas_de_changement' => 'Nenhuma altera&ccedil;&atilde;o em <b>@nom@</b>',
+
+	// R
+	'reset' => 'Apagar',
+
+	// S
+	'supprimer' => 'Excluir'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ro.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ro.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_ro.php	(revision 152)
@@ -0,0 +1,56 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Aduce&#355;i la zi',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Alege&#355;i modulul de configurat',
+	'config_enregistree' => '&Icirc;nregistrarea lui <b>@nom@</b> a fost f&#259;cut&#259;',
+	'config_supprimee' => '&#350;tergerea lui <b>@nom@</b> a fost f&#259;cut&#259;',
+	'configuration_modules' => 'Configurarea modulelor',
+
+	// E
+	'erreur_copie_fichier' => 'Imposibil de copiat fi&#351;ierul @fichier@ &icirc;n loca&#355;ia sa definitiv&#259;',
+	'erreur_enregistrement' => 'O eroare a intervenit &icirc;n timpul &icirc;nregistr&#259;rii lui <b>@nom@</b>',
+	'erreur_lecture' => 'Imposibil de citit @nom@',
+	'erreur_open_w_fichier' => 'Imposibil de deschis fi&#351;ierul @fichier@ &icirc;n mod scriere',
+	'erreur_suppression' => 'O eroare a intervenit &icirc;n timpul &#351;tergerii lui <b>@nom@</b>',
+	'erreur_suppression_fichier' => 'Imposibil de &#351;ters fi&#351;ierul @fichier@',
+	'erreur_type_id' => 'C&acirc;mpul @champ@ trebuie s&#259; &icirc;nceap&#259; cu o liter&#259; sau underscore (_)',
+	'erreur_type_idnum' => 'C&acirc;mpul @champ@ trebuie s&#259; fie numeric',
+	'erreur_type_pwd' => 'C&acirc;mpul @champ@ trebuie s&#259; aib&#259; mai mult de 5 caractere',
+
+	// I
+	'id_manquant' => 'Identificator care lipse&#351;te',
+	'installation_librairies' => 'Desc&#259;rcarea de libr&#259;rii',
+	'installation_liste_libs' => 'Lista de libr&#259;rii',
+	'installer_dossier_lib' => 'Trebuie s&#259; crea&#355;i un director @dir@ &icirc;n directorul r&#259;d&#259;cin&#259; al site-ului SPIP - cu drepturi de scriere.',
+	'installer_lib_192' => 'Pentru a instala o libr&#259;rie, decomprima&#355;i  zip-ul &#351;i copia&#355;i con&#355;inutul s&#259;u &icirc;n directorul @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Numele de tabel&#259; SQL lipse&#351;te',
+	'nouveau' => 'Nou',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'Nici un c&acirc;mp g&#259;sit &icirc;n @nom@',
+	'pas_de_changement' => 'Nici o schimbare &icirc;n <b>@nom@</b>',
+
+	// R
+	'reset' => '&#350;terge&#355;i',
+
+	// S
+	'supprimer' => '&#350;terge&#355;i'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_sv.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_sv.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_sv.php	(revision 152)
@@ -0,0 +1,56 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'Uppdatera',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'V&auml;lj en modul att konfigurera.',
+	'config_enregistree' => '<b>@nom@</b> har sparats',
+	'config_supprimee' => '<b>@nom@</b> har raderats',
+	'configuration_modules' => 'Konfigurering av moduler',
+
+	// E
+	'erreur_copie_fichier' => 'Det g&aring;r inte att kopiera filen @fichier@ till den r&auml;tta platsen',
+	'erreur_enregistrement' => 'Ett fel uppstod n&auml;r <b>@nom@</b>sparades',
+	'erreur_lecture' => 'Det gick inte att l&auml;sa @nom@',
+	'erreur_open_w_fichier' => 'Det gick inte att &ouml;ppna @fichier@ f&ouml;r &auml;ndringar',
+	'erreur_suppression' => 'Ett fel uppstod n&auml;r <b>@nom@</b>raderades',
+	'erreur_suppression_fichier' => 'Filen @fichier@ kan inte raderas.',
+	'erreur_type_id' => 'f&auml;ltet @champ@ m&aring;ste b&ouml;rja med en bokstav eller underscore',
+	'erreur_type_idnum' => 'F&auml;ltet @champ@ m&aring;ste vara numeriskt',
+	'erreur_type_pwd' => 'f&auml;ltet @champ@ m&aring;ste inneh&aring;lla mer &auml;n 5 tecken',
+
+	// I
+	'id_manquant' => 'identifierare saknas',
+	'installation_librairies' => 'ladda ned biblioteksfiler',
+	'installation_liste_libs' => 'lista &ouml;ver biblioteksfiler',
+	'installer_dossier_lib' => 'Du m&aring;ste skapa en katalog med namnet @dir@ med skrivr&auml;ttigheter i rotkatalogen i din SPIP-sajt.',
+	'installer_lib_192' => 'F&ouml;r att installera en biblioteksfil, dekomprimera den komprimerade filen och kopiera inneh&aring;llet till katalogen @dir@.',
+
+	// N
+	'nom_table_manquant' => 'Tabellnamnet saknas',
+	'nouveau' => 'Ny',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => 'Inget f&auml;lt hittades i @nom@',
+	'pas_de_changement' => 'Ingen f&ouml;r&auml;ndring hittades i <b>@nom@</b>',
+
+	// R
+	'reset' => 'Radera',
+
+	// S
+	'supprimer' => 'Radera'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_tr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_tr.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/lang/cfg_tr.php	(revision 152)
@@ -0,0 +1,56 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// B
+	'bouton_mettre_a_jour' => 'G&uuml;ncelle',
+
+	// C
+	'cfg' => 'CFG',
+	'choisir_module_a_configurer' => 'Konfig&uuml;re edilecek mod&uuml;l&uuml; se&ccedil;iniz.',
+	'config_enregistree' => '<b>@nom@</b> kayd&#305; ger&ccedil;ekle&#351;tirildi',
+	'config_supprimee' => '<b>@nom@</b> silinmesi ger&ccedil;ekle&#351;tirildi',
+	'configuration_modules' => 'Mod&uuml;llerin konfig&uuml;rasyonu',
+
+	// E
+	'erreur_copie_fichier' => '@fichier@ dosyas&#305; kal&#305;c&#305; yerine kopyalamak olanaks&#305;z',
+	'erreur_enregistrement' => '<b>@nom@</b> kayd&#305; esnas&#305;nda bir hata olu&#351;tu',
+	'erreur_lecture' => '@nom@ okumak olanaks&#305;z',
+	'erreur_open_w_fichier' => '@fichier@ dosyas&#305;n&#305; yazma ama&ccedil;l&#305; a&ccedil;mak olanaks&#305;z',
+	'erreur_suppression' => '<b>@nom@</b>\'nin silinmesi esnas&#305;nda hata olu&#351;tu',
+	'erreur_suppression_fichier' => '@fichier@ dosyas&#305;n&#305; silmek olanaks&#305;z.',
+	'erreur_type_id' => '@champ@ alan&#305; bir harfle veya alt&ccedil;izgiyle ba&#351;lamal&#305;',
+	'erreur_type_idnum' => '@champ@ alan&#305; say&#305;sal olmal&#305;',
+	'erreur_type_pwd' => '@champ@ alan&#305; 5 karakterden uzun olmal&#305;',
+
+	// I
+	'id_manquant' => 'Tan&#305;mlay&#305;c&#305; eksik',
+	'installation_librairies' => 'K&uuml;t&uuml;phaneler indiriliyor',
+	'installation_liste_libs' => 'K&uuml;t&uuml;phane listesi',
+	'installer_dossier_lib' => 'SPIP\'inizin k&ouml;k dizininde @dir@ isimli, yazma haklar&#305;na sahip bir dizin olu&#351;turmal&#305;s&#305;n&#305;z.',
+	'installer_lib_192' => 'Bir k&uuml;t&uuml;phane kurmak i&ccedil;in zip dosyas&#305;n&#305; el ile a&ccedil;&#305;n&#305;z ve i&ccedil;eri&#287;ini @dir@ dizinine kopyalay&#305;n&#305;z.',
+
+	// N
+	'nom_table_manquant' => 'SQL tablosunun ismi eksik',
+	'nouveau' => 'Yeni',
+
+	// O
+	'ok' => 'OK',
+
+	// P
+	'pas_de_champs_dans' => '@nom@\'de hi&ccedil;bir alan bulunamad&#305;',
+	'pas_de_changement' => '<b>@nom@</b>\'de de&#287;i&#351;iklik yok',
+
+	// R
+	'reset' => 'Sil',
+
+	// S
+	'supprimer' => 'Kald&#305;r'
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/plugin.xml	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/plugin.xml	(revision 152)
@@ -0,0 +1,67 @@
+<plugin>
+    <nom>
+    <multi>
+    [fr]cfg: moteur de configuration
+    [de]cfg: Konfigurationsmotor
+    </multi>
+    </nom>
+    <auteur>bertrand Gugger [->http://toggg.com/], Matthieu Marcillaud
+_ &#169; 2008 - <multi>[fr]Distribu&#233; sous licence[en]License[de]Vertrieb unter Lizenz</multi> GNU/LGPL
+    </auteur>
+    <version>
+    1.10.5
+    </version>
+    <etat>
+    stable
+    </etat>
+    <description>
+    <multi>
+[fr]Ce plugin permet de g&#233;rer tr&#232;s simplement des interfaces de configuration pour diff&#233;rents modules.
+
+Il est utilis&#233; par de nombreux plugins, mais il peut aussi avoir d'autres usages comme le param&#233;trage de squelettes.
+[en]This plugin manage some configuration graphic user interfaces for some modules.
+[de]Dieses Plugin erm&#246;glicht es, in sehr einfacher Weise die Konfigurationsschnittstellen verschiedener Module zu verwalten.
+
+Es wird von vielen Plugins verwendet, kann aber auch anderen Nutzen finden wie die Parametereinstellung von Skeletten.
+    </multi>
+    </description>
+    <lien>
+    [<multi>[fr]Documentation[de]Dokumentation</multi>->http://www.spip-contrib.net/?rubrique575]
+    </lien>
+    <prefix>
+    cfg
+    </prefix>
+    <icon>
+    cfg.png
+    </icon>
+    <chemin dir='' />
+    <options>cfg_options.php</options>
+    <fonctions>cfg_fonctions.php</fonctions>
+
+    <pipeline>
+        <nom>ajouter_boutons</nom>
+        <inclure>cfg_pipeline.php</inclure>
+    </pipeline>
+    <pipeline>
+        <nom>header_prive</nom>
+        <inclure>cfg_pipeline.php</inclure>
+    </pipeline>
+
+     <pipeline>
+        <nom>formulaire_charger</nom>
+        <inclure>cfg_pipeline.php</inclure>
+    </pipeline>
+     <pipeline>
+        <nom>formulaire_verifier</nom>
+        <inclure>cfg_pipeline.php</inclure>
+    </pipeline>
+    <pipeline>
+        <nom>formulaire_traiter</nom>
+        <inclure>cfg_pipeline.php</inclure>
+    </pipeline>
+    <pipeline>
+        <nom>editer_contenu_formulaire_cfg</nom>
+        <inclure>cfg_pipeline.php</inclure>
+    </pipeline>    
+	<necessite id="SPIP" version="[1.9.0;]" />
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/svn.revision
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/svn.revision	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/svn.revision	(revision 152)
@@ -0,0 +1,15 @@
+<svn_revision><text_version>
+Origine svn://zone.spip.org/spip-zone/_plugins_/_stable_/cfg le mercredi 4 mars 2009, 19:33:01 (UTC+0100)
+Revision: 27037
+Dernier commit 2009-03-04 08:58:12 +0100 (Wed, 04 Mar 2009)
+Voir http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/cfg
+Archive: http://files.spip.org/spip-zone/cfg.zip
+</text_version>
+<uri>http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/cfg</uri>
+<archive>http://files.spip.org/spip-zone/cfg.zip</archive>
+<origine>svn://zone.spip.org/spip-zone/_plugins_/_stable_/cfg</origine>
+<date_production>mercredi 4 mars 2009, 19:33:01 (UTC+0100)</date_production>
+<revision>27037</revision>
+<commit>2009-03-04 08:58:12 +0100 (Wed, 04 Mar 2009)</commit>
+</svn_revision>
+<archivelist>_plugins_/_stable_/cfg;cfg;cfg</archivelist>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/test_cfg.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/test_cfg.html	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/test_cfg.html	(revision 152)
@@ -0,0 +1,124 @@
+#CACHE{86400}
+<BOUCLE_article_principal(ARTICLES) {id_article=1}><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html dir="#LANG_DIR" lang="#LANG">
+<head>
+<title>test cfg</title>
+<meta name="description" content="test cfg" />
+<INCLURE{fond=inc-head}>
+</head>
+
+<body class="page_cfg">
+<div id="page">
+
+	[(#REM) Entete de la page + titre du site ]
+	<INCLURE{fond=inc-entete}{lang}>
+<a href="ecrire/?exec=cfg&cfg=testsimple" class="spip_in">changer test simple</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="?page=test_cfg&var_mode=recalcul&test=testsimple/testid" class="spip_in">avec param GET test:) </a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="?page=test_cfg&var_mode=recalcul&test=testsimple/testid&serie=a:3:{s:6:%22testid%22;s:7:%22wx123ff%22;s:7:%22testpwd%22;s:5:%2212345%22;s:9:%22testidnum%22;s:6:%22987654%22;}" class="spip_in">avec param GET test et serie:) </a>
+	<div id="conteneur">
+
+		[(#REM) Contenu principal: test de cfg ]
+
+		<div id="contenu" style="width: 100%; ">
+yellow_fade:
+[(#REM|sinon{#CONFIG{crayons}}|match{s:11:"yellow_fade";s:2:"on";}|?{' ',''})
+ON
+]
+<dl>
+<!--
+	<dt>[(&#035;ENV*{serie,'a:3:{s:6:"testid";s:7:"wx123ff";s:7:"testpwd";s:5:"12345";s:9:"testidnum";s:6:"987654";}'}|extrait{testpwd})]</dt>
+	<dd>[(# ENV*{serie,'a:3:{s:6:"testid";s:7:"wx123ff";s:7:"testpwd";s:5:"12345";s:9:"testidnum";s:6:"987654";}'}|extrait{testpwd})]</dd>
+-->
+
+	<dt>&#035;CONFIG{~}</dt>
+	<dd>#CONFIG{~}</dd>
+
+	<dt>&#035;CONFIG{~test}</dt>
+	<dd>#CONFIG{~test}</dd>
+
+	<dt>&#035;CONFIG{~test/testauteur}</dt>
+	<dd>#CONFIG{~test/testauteur}</dd>
+
+	<dt>&#035;CONFIG{~test/testauteur/chp2}</dt>
+	<dd>#CONFIG{~test/testauteur/chp2}</dd>
+
+	<dt>&#035;CONFIG{auteur:6/testauteur/chp2}</dt>
+	<dd>#CONFIG{auteur:6/testauteur/chp2}</dd>
+
+	<dt>&#035;CONFIG</dt>
+	<dd>#CONFIG</dd>
+
+	<dt>&#035;CONFIG{crayons}</dt>
+	<dd>#CONFIG{crayons}</dd>
+
+	<dt>&#035;CONFIG{descriptif_site}</dt>
+	<dd>#CONFIG{descriptif_site}</dd>
+
+	<dt>&#035;CONFIG{testsimple}</dt>
+	<dd>#CONFIG{testsimple}</dd>
+
+	<dt>&#035;CONFIG{testmulti}</dt>
+	<dd>#CONFIG{testmulti}</dd>
+
+	<dt>&#035;CONFIG{testsimple/testid}</dt>
+	<dd>#CONFIG{testsimple/testid}</dd>
+
+	<dt>&#035;CONFIG{&#035;ENV{test}} avec &#035;ENV{test}=#ENV{test}</dt>
+	<dd>#CONFIG{#ENV{test}}</dd>
+
+	<dt>&#035;CONFIG{&#035;ENV{testx,testsimple/testid}}</dt>
+	<dd>#CONFIG{#ENV{testx,testsimple/testid}}</dd>
+
+	<dt>&#035;CONFIG{testsimple/dudu/user}</dt>
+	<dd>[(#CONFIG{testsimple/dudu/user})]</dd>
+
+	<dt>&#035;CONFIG{testsimple,xxx}</dt>
+	<dd>#CONFIG{testsimple,xxx}</dd>
+
+	<dt>&#035;CONFIG{testsimple/dudu/user,yyy}</dt>
+	<dd>[(#CONFIG{testsimple/dudu/user,yyy})]</dd>
+
+	<dt>&#035;CONFIG{config_xxx,zzz}</dt>
+	<dd>#CONFIG{config_xxx,zzz}</dd>
+
+	<dt>&#035;CONFIG{testsimple/dudux/user,ttt}</dt>
+	<dd>[(#CONFIG{testsimple/dudux/user,ttt})]</dd>
+
+	<dt>[(&#035;REM|sinon{', '}|implode{&#035;CONFIG|unserialize|array_keys})]</dt>
+	<dd>[(#REM|sinon{', '}|implode{#CONFIG|unserialize|array_keys})]</dd>
+	
+	<dt>var_dump(lire_config('testsimple/testidnum'))</dt>
+	<dd><?php echo var_dump(lire_config('testsimple/testidnum')); ?></dd>
+	
+	<dt>var_dump(lire_config('testsimple'))</dt>
+	<dd><?php echo var_dump(lire_config('testsimple')); ?></dd>
+	
+	<dt>var_dump(lire_config('testsimple/testidnux', 'blah'))</dt>
+	<dd><?php echo var_dump(lire_config('testsimple/testidnux', 'blah')); ?></dd>
+	
+	<dt>var_dump(lire_config('testsimplex', 'blih'))</dt>
+	<dd><?php echo var_dump(lire_config('testsimplex', 'blih')); ?></dd>
+	
+	<dt>var_dump(lire_config('testsimplex/testidnum'))</dt>
+	<dd><?php echo var_dump(lire_config('testsimplex/testidnum')); ?></dd>
+	
+	<dt>var_dump(lire_config('testsimplex'))</dt>
+	<dd><?php echo var_dump(lire_config('testsimplex')); ?></dd>
+	
+	<dt>var_dump(lire_config())</dt>
+	<dd><?php echo var_dump(lire_config()); ?></dd>
+
+</dl>
+		</div><!-- fin contenu -->
+
+	</div><!-- fin conteneur -->
+
+	[(#REM) Pied de page ]
+	<INCLURE{fond=inc-pied}{lang}>
+
+</div><!-- fin page -->
+</body>
+</html>
+</BOUCLE_article_principal>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_meta.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_meta.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_meta.php	(revision 152)
@@ -0,0 +1,137 @@
+<?php
+
+	// nom du test
+	$test = 'cfg:depot_meta';
+
+	// recherche test.inc qui nous ouvre au monde spip
+	$deep = 2;
+	$include = '../../tests/test.inc';
+	while (!defined('_SPIP_TEST_INC') && $deep++ < 6) {
+		$include = '../' . $include;
+		@include $include;
+	}
+	if (!defined('_SPIP_TEST_INC')) {
+		die("Pas de $include");
+	}
+
+
+### lire_config meta ###
+
+	$meta = $GLOBALS['meta'];
+	
+	// les bases de test
+	$assoc = array('one' => 'element 1', 'two' => 'element 2');
+	$serassoc = serialize($assoc);
+	
+	// on flingue meta a juste nos donnees
+	$GLOBALS['meta'] = array(
+		'zero' => 0,
+		'zeroc' => '0',
+		'chaine' => 'une chaine',
+		'assoc' => $assoc,
+		'serie' => serialize($assoc)
+	);
+
+	$essais[] = array(0, 'zero');
+	$essais[] = array('0', 'zeroc');
+	$essais[] = array('une chaine', 'chaine');
+	$essais[] = array($assoc, 'assoc');
+	$essais[] = array($assoc, 'serie');
+	$essais[] = array(serialize($assoc), 'serie','',0);
+	$essais[] = array(null, 'rien');
+	$essais[] = array('defaut', 'rien','defaut');
+
+	$err = tester_fun('lire_config', $essais);
+
+	// retablissement des metas
+	$GLOBALS['meta']=$meta;
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>lire_config meta</b><dl>' . join('', $err) . '</dl>');
+	}
+
+### ecrire_config meta ###
+
+	/*
+	 * Notes sur l'ecriture :
+	 * - dans le tableau $GLOBALS['meta'], les valeurs transmises
+	 * conservent effectivement leur type
+	 * - si l'on applique un lire_metas() (reecriture du tableau $GLOBALS['meta']
+	 * depuis les informations de la table spip_meta, les types de valeurs
+	 * sont tous des types string (puisque la colonne 'valeur' de spip_meta est
+	 * varchar (ou text).
+	 * 	- 0 devient alors '0'
+	 *  - array(xxx) devient 'Array'
+	 *
+	 * Cela ne se produit pas avec le depot 'metapack' qui serialize systematiquement
+	 * tout ce qu'on lui donne (et peut donc restituer le type de donnee correctement).
+	 *
+	 */
+	$essais = array();
+	$essais[] = array(true, 'test_cfg_zero', 0);
+	$essais[] = array(true, 'test_cfg_zeroc', '0');
+	$essais[] = array(true, 'test_cfg_chaine', 'une chaine');		
+	$essais[] = array(true, 'test_cfg_assoc', $assoc);
+	$essais[] = array(true, 'test_cfg_serie', serialize($assoc));
+
+	$err = tester_fun('ecrire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>ecrire_config meta</b><dl>' . join('', $err) . '</dl>');
+	}
+	
+### re lire_config meta ###
+
+	$essais = array();
+	$essais[] = array(0, 'test_cfg_zero');
+	$essais[] = array('0', 'test_cfg_zeroc');
+	$essais[] = array('une chaine', 'test_cfg_chaine');		
+	$essais[] = array($assoc, 'test_cfg_assoc');
+	$essais[] = array(serialize($assoc), 'test_cfg_serie','',0);
+
+	$err = tester_fun('lire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>relecture ecrire_config meta</b><dl>' . join('', $err) . '</dl>');
+	}
+
+### re effacer_config meta ###
+
+	$essais = array();
+	$essais[] = array(true, 'test_cfg_zero');
+	$essais[] = array(true, 'test_cfg_zeroc');
+	$essais[] = array(true, 'test_cfg_chaine');		
+	$essais[] = array(true, 'test_cfg_assoc');
+	$essais[] = array(true, 'test_cfg_serie');
+
+	$err = tester_fun('effacer_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>effacer_config meta</b><dl>' . join('', $err) . '</dl>');
+	}
+
+	
+### re lire_config meta ###
+
+	$essais = array();
+	$essais[] = array(null, 'test_cfg_zero');
+	$essais[] = array(null, 'test_cfg_zeroc');
+	$essais[] = array(null, 'test_cfg_chaine');		
+	$essais[] = array(null, 'test_cfg_assoc');
+	$essais[] = array(null, 'test_cfg_serie');
+
+	$err = tester_fun('lire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>relecture effacer_config meta</b><dl>' . join('', $err) . '</dl>');
+	}
+
+	
+	echo "OK";
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_metapack.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_metapack.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_metapack.php	(revision 152)
@@ -0,0 +1,155 @@
+<?php
+
+	// nom du test
+	$test = 'cfg:depot_metapack';
+
+	// recherche test.inc qui nous ouvre au monde spip
+	$deep = 2;
+	$include = '../../tests/test.inc';
+	while (!defined('_SPIP_TEST_INC') && $deep++ < 6) {
+		$include = '../' . $include;
+		@include $include;
+	}
+	if (!defined('_SPIP_TEST_INC')) {
+		die("Pas de $include");
+	}
+
+
+### lire_config ###
+
+	$meta = $GLOBALS['meta'];
+	
+	// les bases de test
+	$assoc = array(
+		'one' => 'element 1',
+		'two' => 'element 2',
+		'three' => array('un'=>1, 'deux'=>2, 'troisc'=>"3")
+
+	);
+	$serassoc = serialize($assoc);
+	
+	// on flingue meta a juste nos donnees
+	$GLOBALS['meta'] = array(
+		'zero' => serialize(0),
+		'zeroc' => serialize('0'),
+		'chaine' => serialize('une chaine'),
+		'assoc' => serialize($assoc),
+		'serie' => serialize(serialize($assoc))
+	);
+
+	// racine
+	$essais[] = array(0, 'metapack::zero');
+	$essais[] = array('0', 'metapack::zeroc');
+	$essais[] = array('une chaine', 'metapack::chaine');
+	$essais[] = array($assoc, 'metapack::assoc');
+	$essais[] = array(serialize($assoc), 'metapack::serie');
+	$essais[] = array(null, 'metapack::rien');
+	$essais[] = array('defaut', 'metapack::rien','defaut');
+	// chemins
+	$essais[] = array($assoc, 'metapack::assoc/');
+	$essais[] = array('element 1', 'metapack::assoc/one');
+	$essais[] = array(array('un'=>1, 'deux'=>2, 'troisc'=>"3"), 'metapack::assoc/three');
+	$essais[] = array(1, 'metapack::assoc/three/un');
+	$essais[] = array('3', 'metapack::assoc/three/troisc');
+	// racourcis
+	$essais[] = array($assoc, 'assoc/');
+	$essais[] = array('element 1', 'assoc/one');
+	
+	$err = tester_fun('lire_config', $essais);
+
+	// retablissement des metas
+	$GLOBALS['meta']=$meta;
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>lire_config metapack</b><dl>' . join('', $err) . '</dl>');
+	}
+
+### ecrire_config ###
+
+	$essais = array();
+	$essais[] = array(true, 'metapack::test_cfg_zero', 0);
+	$essais[] = array(true, 'metapack::test_cfg_zeroc', '0');
+	$essais[] = array(true, 'metapack::test_cfg_chaine', 'une chaine');		
+	$essais[] = array(true, 'metapack::test_cfg_assoc', $assoc);
+	$essais[] = array(true, 'metapack::test_cfg_serie', serialize($assoc));
+	// chemins
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier', $assoc);
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier/truc', 'trac');
+	
+	$err = tester_fun('ecrire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>ecrire_config metapack</b><dl>' . join('', $err) . '</dl>');
+	}
+	
+### re lire_config ###
+
+	$essais = array();
+	$essais[] = array(0, 'metapack::test_cfg_zero');
+	$essais[] = array('0', 'metapack::test_cfg_zeroc');
+	$essais[] = array('une chaine', 'metapack::test_cfg_chaine');		
+	$essais[] = array($assoc, 'metapack::test_cfg_assoc');
+	$essais[] = array(serialize($assoc), 'metapack::test_cfg_serie');
+	// chemins
+	$essais[] = array($assoc + array('truc'=>'trac'), 'metapack::test_cfg_chemin/casier');
+	$essais[] = array('trac', 'metapack::test_cfg_chemin/casier/truc');
+	$essais[] = array(1, 'metapack::test_cfg_chemin/casier/three/un');
+	// chemin pas la
+	$essais[] = array(null, 'metapack::test_cfg_chemin/casier/three/huit');
+	
+	$err = tester_fun('lire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>relecture ecrire_config metapack</b><dl>' . join('', $err) . '</dl>');
+	}
+
+### re effacer_config ###
+
+	$essais = array();
+	$essais[] = array(true, 'metapack::test_cfg_zero');
+	$essais[] = array(true, 'metapack::test_cfg_zeroc');
+	$essais[] = array(true, 'metapack::test_cfg_chaine');		
+	$essais[] = array(true, 'metapack::test_cfg_assoc');
+	$essais[] = array(true, 'metapack::test_cfg_serie');
+	// chemins
+	// on enleve finement tout test_cfg_chemin : il ne doit rien rester
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier/three/huit'); // n'existe pas
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier/three/troisc');
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier/three/deux');
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier/three/un'); // supprime three
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier/one'); 
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier/two'); 
+	$essais[] = array(true, 'metapack::test_cfg_chemin/casier/truc'); // supprimer chemin/casier
+
+	$err = tester_fun('effacer_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>effacer_config metapack</b><dl>' . join('', $err) . '</dl>');
+	}
+
+	
+### re lire_config ###
+
+	$essais = array();
+	$essais[] = array(null, 'metapack::test_cfg_zero');
+	$essais[] = array(null, 'metapack::test_cfg_zeroc');
+	$essais[] = array(null, 'metapack::test_cfg_chaine');		
+	$essais[] = array(null, 'metapack::test_cfg_assoc');
+	$essais[] = array(null, 'metapack::test_cfg_serie');
+	$essais[] = array(null, 'metapack::test_cfg_chemin');
+
+	$err = tester_fun('lire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>relecture effacer_config metapack</b><dl>' . join('', $err) . '</dl>');
+	}
+
+	
+	echo "OK";
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_php.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_php.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_php.php	(revision 152)
@@ -0,0 +1,115 @@
+<?php
+
+	// nom du test
+	$test = 'cfg:depot_php';
+
+	// recherche test.inc qui nous ouvre au monde spip
+	$deep = 2;
+	$include = '../../tests/test.inc';
+	while (!defined('_SPIP_TEST_INC') && $deep++ < 6) {
+		$include = '../' . $include;
+		@include $include;
+	}
+	if (!defined('_SPIP_TEST_INC')) {
+		die("Pas de $include");
+	}
+
+
+### lire_config ###
+	
+	// les bases de test
+	$assoc = array(
+		'one' => 'element 1',
+		'two' => 'element 2',
+		'three' => array('un'=>1, 'deux'=>2, 'troisc'=>"3")
+
+	);
+
+### ecrire_config ###
+
+	$essais = array();
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_zero', 0);
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_zeroc', '0');
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chaine', 'une chaine');		
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_assoc', $assoc);
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_serie', serialize($assoc));
+	// chemins
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier', $assoc);
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/truc', 'trac');
+	
+	$err = tester_fun('ecrire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>ecrire_config php</b><dl>' . join('', $err) . '</dl>');
+	}
+	
+### re lire_config ###
+
+	$essais = array();
+	$essais[] = array(0, 'php::tests_cfg_php/test_cfg_zero');
+	$essais[] = array('0', 'php::tests_cfg_php/test_cfg_zeroc');
+	$essais[] = array('une chaine', 'php::tests_cfg_php/test_cfg_chaine');		
+	$essais[] = array($assoc, 'php::tests_cfg_php/test_cfg_assoc');
+	$essais[] = array(serialize($assoc), 'php::tests_cfg_php/test_cfg_serie');
+	// chemins
+	$essais[] = array($assoc + array('truc'=>'trac'), 'php::tests_cfg_php/test_cfg_chemin/casier');
+	$essais[] = array('trac', 'php::tests_cfg_php/test_cfg_chemin/casier/truc');
+	$essais[] = array(1, 'php::tests_cfg_php/test_cfg_chemin/casier/three/un');
+	// chemin pas la
+	$essais[] = array(null, 'php::tests_cfg_php/test_cfg_chemin/casier/three/huit');
+	
+	$err = tester_fun('lire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>relecture ecrire_config php</b><dl>' . join('', $err) . '</dl>');
+	}
+
+### re effacer_config ###
+
+	$essais = array();
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_zero');
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_zeroc');
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chaine');		
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_assoc');
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_serie');
+	// chemins
+	// on enleve finement tout test_cfg_chemin : il ne doit rien rester
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/three/huit'); // n'existe pas
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/three/troisc');
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/three/deux');
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/three/un'); // supprime three
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/one'); 
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/two'); 
+	$essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/truc'); // supprimer chemin/casier
+
+	$err = tester_fun('effacer_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>effacer_config php</b><dl>' . join('', $err) . '</dl>');
+	}
+
+	
+### re lire_config ###
+
+	$essais = array();
+	$essais[] = array(null, 'php::tests_cfg_php/test_cfg_zero');
+	$essais[] = array(null, 'php::tests_cfg_php/test_cfg_zeroc');
+	$essais[] = array(null, 'php::tests_cfg_php/test_cfg_chaine');		
+	$essais[] = array(null, 'php::tests_cfg_php/test_cfg_assoc');
+	$essais[] = array(null, 'php::tests_cfg_php/test_cfg_serie');
+	$essais[] = array(null, 'php::tests_cfg_php/test_cfg_chemin');
+	$essais[] = array(null, 'php::tests_cfg_php');
+	
+	$err = tester_fun('lire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>relecture effacer_config php</b><dl>' . join('', $err) . '</dl>');
+	}
+
+	echo "OK";
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_tablepack.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_tablepack.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/tests/depot_tablepack.php	(revision 152)
@@ -0,0 +1,136 @@
+<?php
+
+	// nom du test
+	$test = 'cfg:depot_tablepack';
+
+	// recherche test.inc qui nous ouvre au monde spip
+	$deep = 2;
+	$include = '../../tests/test.inc';
+	while (!defined('_SPIP_TEST_INC') && $deep++ < 6) {
+		$include = '../' . $include;
+		@include $include;
+	}
+	if (!defined('_SPIP_TEST_INC')) {
+		die("Pas de $include");
+	}
+
+
+### creation de la colonne cfg si absente ###
+
+	// creation de la colonne 'cfg' sur spip_auteurs si elle n'existe pas.
+	include_spip('base/abstract_sql');
+	$t = sql_showtable('spip_auteurs');
+	if (!isset($t['field']['cfg'])) {
+		sql_alter('TABLE spip_auteurs ADD COLUMN cfg TEXT DEFAULT \'\' NOT NULL');
+	}
+
+### ecrire_config ###
+	// les bases de test
+	$assoc = array(
+		'one' => 'element 1',
+		'two' => 'element 2',
+		'three' => array('un'=>1, 'deux'=>2, 'troisc'=>"3")
+
+	);
+	$serassoc = serialize($assoc);
+
+	
+	$essais = array();
+	$essais[] = array(true, 'tablepack::~/test_cfg_zero', 0);
+	$essais[] = array(true, 'tablepack::~/test_cfg_zeroc', '0');
+	$essais[] = array(true, 'tablepack::~/test_cfg_chaine', 'une chaine');		
+	$essais[] = array(true, 'tablepack::~/test_cfg_assoc', $assoc);
+	$essais[] = array(true, 'tablepack::~/test_cfg_serie', serialize($assoc));
+	// chemins
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier', $assoc);
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/truc', 'trac');
+	// dans rubriques
+	$essais[] = array(true, 'tablepack::rubriques@extra:1/test_cfg_chemin/casier/truc', 'trac');
+	$essais[] = array(true, 'tablepack::rubrique@extra:1/test_cfg_chemin/casier/chose', 'trac');
+	
+	$err = tester_fun('ecrire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>ecrire_config tablepack</b><dl>' . join('', $err) . '</dl>');
+	}
+	
+### re lire_config ###
+
+	$essais = array();
+	$essais[] = array(0, 'tablepack::~/test_cfg_zero');
+	$essais[] = array('0', 'tablepack::~/test_cfg_zeroc');
+	$essais[] = array('une chaine', 'tablepack::~/test_cfg_chaine');		
+	$essais[] = array($assoc, 'tablepack::~/test_cfg_assoc');
+	$essais[] = array(serialize($assoc), 'tablepack::~/test_cfg_serie');
+	// chemins
+	$essais[] = array($assoc + array('truc'=>'trac'), 'tablepack::~/test_cfg_chemin/casier');
+	$essais[] = array('trac', 'tablepack::~/test_cfg_chemin/casier/truc');
+	$essais[] = array(1, 'tablepack::~/test_cfg_chemin/casier/three/un');
+	// chemin pas la
+	$essais[] = array(null, 'tablepack::~/test_cfg_chemin/casier/three/huit');
+	// dans rubrique
+	$essais[] = array('trac', 'tablepack::rubriques@extra:1/test_cfg_chemin/casier/truc');
+	$essais[] = array('trac', 'tablepack::rubrique@extra:1/test_cfg_chemin/casier/chose');
+	
+	$err = tester_fun('lire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>relecture ecrire_config tablepack</b><dl>' . join('', $err) . '</dl>');
+	}
+
+### re effacer_config ###
+
+	$essais = array();
+	$essais[] = array(true, 'tablepack::~/test_cfg_zero');
+	$essais[] = array(true, 'tablepack::~/test_cfg_zeroc');
+	$essais[] = array(true, 'tablepack::~/test_cfg_chaine');		
+	$essais[] = array(true, 'tablepack::~/test_cfg_assoc');
+	$essais[] = array(true, 'tablepack::~/test_cfg_serie');
+	// chemins
+	// on enleve finement tout test_cfg_chemin : il ne doit rien rester
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/three/huit'); // n'existe pas
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/three/troisc');
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/three/deux');
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/three/un'); // supprime three
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/one'); 
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/two'); 
+	$essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/truc'); // supprimer chemin/casier
+	// dans rubrique
+	$essais[] = array(true, 'tablepack::rubriques@extra:1/test_cfg_chemin/casier/truc');
+	$essais[] = array(true, 'tablepack::rubrique@extra:1/test_cfg_chemin/casier/chose');
+	
+	$err = tester_fun('effacer_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>effacer_config tablepack</b><dl>' . join('', $err) . '</dl>');
+	}
+
+	
+### re lire_config ###
+
+	$essais = array();
+	$essais[] = array(null, 'tablepack::~/test_cfg_zero');
+	$essais[] = array(null, 'tablepack::~/test_cfg_zeroc');
+	$essais[] = array(null, 'tablepack::~/test_cfg_chaine');		
+	$essais[] = array(null, 'tablepack::~/test_cfg_assoc');
+	$essais[] = array(null, 'tablepack::~/test_cfg_serie');
+	$essais[] = array(null, 'tablepack::~/test_cfg_chemin');
+	// dans rubrique
+	$essais[] = array(null, 'tablepack::rubriques@extra:1/test_cfg_chemin/casier/truc');
+	$essais[] = array(null, 'tablepack::rubrique@extra:1/test_cfg_chemin/casier/chose');
+	$essais[] = array(null, 'tablepack::rubriques@extra:1/test_cfg_chemin');
+	
+	$err = tester_fun('lire_config', $essais);
+	
+	// si le tableau $err est pas vide ca va pas
+	if ($err) {
+		die ('<b>relecture effacer_config tablepack</b><dl>' . join('', $err) . '</dl>');
+	}
+
+
+	echo "OK";
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/cfg/todo.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/cfg/todo.txt	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/cfg/todo.txt	(revision 152)
@@ -0,0 +1,32 @@
+Todo ou idÃ©es :
+
+- rupture de compatibilitÃ© pour simplifier l'API de CFG et 
+  rÃ©duire son domaine d'action (essayer en mÃªme temps de faire un plugin 
+  'cfg_etendu' afin de limiter la casse)
+  
+- Supprimer (?) tout ce qui permet de crÃ©er/actionner des paramÃštres, 
+  ainsi que les actions en fonction de css particuliÃšres sur les champs.
+  Mettre cela (?) dans un plugin CFG_etendu.
+  Ca concerne :
+  * les paramÃštres 'rediriger' et 'selecteur_couleur' (ce dernier 
+  est rÃ©glÃ© avec le plugin palette)
+  * les classes 'cfg_couleur' (rÃ©glÃ©), 'cfg_fichier' (upload de fichier)
+  et 'cfg_id'
+  * les types pour mettre des erreurs standard 
+  
+  - 'redigiriger' n'est employÃ© que par autoritÃ©...
+  - 'cfg_fichier' et 'cfg_id' sont problÃ©matiques.
+  
+- ne plus utiliser 'head' qui pompe de la mÃ©moire Ã  cfg pour mettre un header :
+  demander Ã  utiliser les pipelines de SPIP pour cela, car Ã§a ne fonctionne
+  pas avec les formulaires CFG en CVT.
+  C'est un vaste problÃšme, plus gÃ©nÃ©ral dans SPIP d'ailleurs, de ne pouvoir ajouter
+  facilement depuis un squelette quelque chose dans le head
+  
+  La solution actuelle pour CFG fonctionne (sauf en CVT), mais compile 2
+  fois le formulaire (1 fois dans le pipeline insert_head, une fois lors de
+  l'execution...). C'est donc une fois de trop.
+  
+- les types d'erreurs type_xx : Ces type_xx sont utilisÃ©s dans certains plugins, 
+  mais est-ce nÃ©cessaire de faire un fichier par type ? avec des find_in_path qui echouent ?
+  
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/exec/svn_update.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/exec/svn_update.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/exec/svn_update.php	(revision 152)
@@ -0,0 +1,85 @@
+<?php
+
+include_spip('inc/vieilles_defs');
+include_spip('inc/svn_update');
+include_spip('inc/cfg_config');
+
+# securite
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function exec_svn_update() {
+	global $connect_statut, $connect_id_auteur, $connect_toutes_rubriques;
+	global $exec;
+	include_spip('inc/presentation');
+	include_spip('inc/config');
+
+	pipeline('exec_init',
+		array('args'=>array('exec'=>'configuration'),'data'=>''));
+
+	debut_page(_L('Update SVN'), "configuration", "configuration");
+	echo "<br><br><br>";
+	gros_titre(_L('Update SVN'));
+
+
+	if ($connect_statut != '0minirezo'
+	OR !in_array($connect_id_auteur, explode(';', _SVN_UPDATE_AUTEURS))) {
+		echo _T('avis_non_acces_page');
+		fin_page();
+		exit;
+	}
+
+	debut_gauche();
+	debut_droite();
+
+	$config = explode("\n",lire_config('svn_update/file'));
+
+	$dirs_ok = array();
+	foreach ($config as $l) {
+		$l = trim($l);
+		if ($l AND substr($l,0,1) != "#") {
+			list($src,$dest) = explode(' ', $l);
+			$dirs_ok[$dest] = $l;
+			$sources[$dest] = $src;
+		}
+	}
+
+	if ($dirs_ok) {
+
+		chdir(_DIR_RACINE);
+		// Appliquer la demande
+		if (_request('dir_svn') == -1) {
+			traiter_config_svn($config);
+		} else
+		if ($dir_svn = _request('dir_svn')
+		AND isset($dirs_ok[$dir_svn])) {
+			traiter_config_svn(array($dirs_ok[$dir_svn]));
+		}
+		chdir(_DIR_RESTREINT_ABS);
+
+
+		// Menu
+
+		echo _L("Choisir le r&eacute;pertoire &agrave; mettre &agrave; jour&nbsp;: ");
+		echo "<form action='./?exec=$exec' method='post'>
+		<input type='hidden' name='exec' value='$exec' />
+		<select name='dir_svn'>
+		<option value=''></option>";
+		foreach ($dirs_ok as $dir => $source) {
+			echo "<option value='$dir'>".$dir
+				." depuis ".$sources[$dir]."</option>\n";
+		}
+		echo "<option value='-1'>** "._L('Tous')."</option>\n";
+		echo "</select>
+		<input type='submit' value='Update' />
+		</form>
+		";
+
+	} else
+		echo _L("D&eacute;sol&eacute;, aucun r&eacute;pertoire n'est accessible en SVN.");
+
+
+	fin_page();
+
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/fonds/cfg_svn_update.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/fonds/cfg_svn_update.html	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/fonds/cfg_svn_update.html	(revision 152)
@@ -0,0 +1,54 @@
+<!-- titre=Configuration de svn update -->
+<!-- autoriser=webmestre -->
+<!-- boite=Informations -->
+<!-- descriptif=<p>
+    Un utilisateur (par defaut, lâadministrateur numero 1) est autorisÃ© Ã  faire une mise Ã  jour SVN du site ou de tout autre rÃ©pertoire.</p>
+    <p> Pour cela il doit se rendre sur la page [svn update->?exec=svn_update] et sÃ©lectionner les Ã©lÃ©ments Ã  mettre Ã  jour. </p>
+-->
+<!-- head= [(#INCLURE{fond=/fonds/svn_update.css})] -->
+<form id="svn_update" name="svn_update" method="post" action="#SELF">
+
+    [(#ENV{_cfg_}|form_hidden)]
+
+    <fieldset>
+        <legend> Administrateur SVN</legend>
+        <p>
+            #SET{selected,#CONFIG{svn_update/administrateurs,#ARRAY}}
+            <label for="administrateurs">Selectionnez parmi les comptes suivants ceux qui seront autorisÃ©s Ã  gÃ©rer les mises Ã  jour SVN</label>        
+
+            <p class="information"> Si aucun compte n'est selectionnÃ©, seul le compte d'identifiant 1 est autorisÃ©</p>
+            
+            <select name="administrateurs[]" id="administrateurs" multiple="multiple"/>
+                <BOUCLE_administrateurs(AUTEURS) {statut=0minirezo} {tout}>
+                    <option value="#ID_AUTEUR" [(#ID_AUTEUR|in_array{#GET{selected}}|?{' selected="selected"'})]>#NOM</option>
+                </BOUCLE_administrateurs>
+            </select>
+        </p>
+
+    </fieldset>
+
+    <fieldset>
+        <legend> RÃ©pertoires Ã  administrer</legend>
+        <p>
+            <label for="file">Saisissez les repertoires Ã  traiter</label>        
+	        <pre>
+                source destination [revision] [user]
+                Par exemple :
+                svn://zone.spip.org/spip-zone/_squelettes_/sedna squelettes/sedna
+                svn://zone.spip.org/spip-zone/_plugins_/_stable_/cfg plugins/cfg
+	        </pre>
+	        <ul>
+	            <li>Source : chemin du dÃ©pot (svn://zone.spip.org/spip-zone/_squelettes_/sedna) </li>
+	            <li>destination : chemin local par rapport Ã  la racine du site (squelettes/sedna) </li>
+	            <li>[revision] : version Ã  telecharger (optionnel)</li>
+	            <li>[user] : nom d'utilisateur (optionnel) depends si une authentification cotÃ© depot svn est requis</li>
+	        </ul>
+            <textarea name="file" id="file" class="formo">#ENV{file}</textarea>
+        </p>
+    </fieldset>
+
+    <p class="soumettre">
+    	<input type="submit" name="_cfg_ok" value="<:OK:>" />
+    	<input type="submit" name="_cfg_delete" value="<:Supprimer:>" />
+    </p>
+</form>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/fonds/svn_update.css.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/fonds/svn_update.css.html	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/fonds/svn_update.css.html	(revision 152)
@@ -0,0 +1,27 @@
+<style>
+
+#svn_update #file {
+    width : 100%;
+    min-height : 5em;
+}
+
+#svn_update select {
+    min-height : 10em;
+}
+
+#svn_update label {
+    display : block;
+}
+
+#svn_update .information {
+    float : right;
+    width : 50%;
+    margin-right : 2em;
+    font-style : italic;
+}
+
+#svn_update .soumettre {
+    text-align : right;
+}
+
+</style>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/inc/svn_update.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/inc/svn_update.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/inc/svn_update.php	(revision 152)
@@ -0,0 +1,118 @@
+<?php
+
+	define('_SVN_COMMAND', 'svn');
+
+	// la fonction qui fait le travail
+	function update_svn($l) {
+		$l = trim($l);
+
+		if (!$l OR substr($l,0,1) == '#') return NULL; // commentaires
+
+		$l = explode(' ',$l);
+		$src = array_shift($l);
+		$dest = array_shift($l);
+
+		// une revision est numerique ou parmi quelques valeurs connues
+		// sinon c'est une clause user
+		$rev = array_shift($l);
+		if (!is_numeric($rev) AND !in_array($rev,array('HEAD','BASE','COMMITED','PREV'))){
+			array_unshift($l,$rev);
+			$rev="";
+		}
+
+		// la clause user est le reste
+		$user = join(' ',$l);
+
+		if (!preg_match(',^(https?|svn)://,', $src))
+			return $src; // erreur
+
+		if (!is_dir($dest))
+			mkdir($dest, 0777, 'recursive');
+
+		if (!is_dir($dest)
+		OR !is_writable($dest))
+			return "Impossible d'ecrire dans ".$dest; // erreur
+
+		// Checkout ?
+		if (!file_exists($entries = "$dest/.svn/entries")) {
+		    $command[] = "export --force $src/ $dest/";
+			$command[] = "checkout $src/ $dest/";
+		}
+
+		else {
+			// nouveau format de .svn/entries
+			$info = _SVN_COMMAND." info --xml $dest/";
+			exec($info, $out);
+			if (preg_match(',<url>(.*?)</url>,', join('',$out), $r)) {
+				$old_src = $r[1];
+			} else {
+				// ancien format
+				$entries = join("\n", file($entries));
+				if (!preg_match(',\surl="([^"]+)",', $entries, $r))
+					return "fichier .svn/entries non conforme ou illisible";
+				$old_src = $r[1];
+			}
+
+			// Switch ?
+			if ($old_src != $src) {
+				$command[] = "switch --relocate $old_src/ $src/ $dest/";
+			}
+			
+			// Update
+			else {
+				if ($rev)
+					$command[] = "update --revision $rev $dest/";
+				else
+					$command[] = "update $dest/";
+			}
+		}
+
+        	//execute les commandes svn
+		if ($command) {
+			//tableaux de rÃ©sultat
+        		$out = array();   
+        		$out_local = array();
+			//parcours les commandes demandÃ©es
+    			foreach ($command as $cmd ) {
+    				//redÃ©fini la commande complÃ©tement    		 
+    				//$cmd_exec = _SVN_COMMAND." $user ".$cmd." 2>&1";
+    				$cmd_exec = _SVN_COMMAND." $user ".$cmd;
+    				//execute la commande et sauve le resultat dans local_out
+				exec($cmd_exec,$local_out);
+				//rappelle la commande executÃ©e
+    				//$cmd_aff = _SVN_COMMAND.$cmd." 2>&1";
+	                        $cmd_aff = _SVN_COMMAND.$cmd;
+				array_unshift($local_out, $cmd_aff);
+				//empile le resultat local Ã  la sortie finale
+				$out = $out + $local_out;
+        		}
+			return $out;
+		}
+
+	}
+
+	function traiter_config_svn($config = array()) {
+		foreach($config as $l) {
+			// ne pas afficher l'identification eventuelle
+			$aff = explode(' ',htmlspecialchars($l));
+			while (count($aff)>3) array_pop($aff);
+			$aff = implode(' ',$aff);
+			echo "<hr /><b>", $aff, "</b>";
+			$res = update_svn($l);
+			if (is_string($res)){
+				include_spip('inc/charsets');
+				$res = importer_charset($res);
+				echo "<br /><b>Erreur: ",
+					htmlspecialchars($res),
+					"</b>";
+			}
+			if (is_array($res)){
+				include_spip('inc/charsets');
+				$res = importer_charset(join("\n", $res),'iso-8859-1');
+				echo "<br />".nl2br(htmlspecialchars($res));
+			}
+			echo "<br />\n";
+		}
+	}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/plugin.xml	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/plugin.xml	(revision 152)
@@ -0,0 +1,36 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	SVN Update
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	Cedric &#38; Fil
+_ &#169; 2006 - Distribu&#233; sous licence GNU/GPL
+	</auteur>
+	<version>
+	0.32
+	</version>
+	<etat>
+	stable
+	</etat>
+	<description>
+	Un utilisateur (par defaut, l'administrateur numero 1) est autoris&#233; &#224; faire une mise &#224; jour SVN du site ou de tout autre r&#233;pertoire. Pour cela il doit se rendre sur la page [ecrire/?exec=svn_update->./?exec=svn_update] et s&#233;lectionner les &#233;l&#233;ments &#224; mettre &#224; jour.
+_ Seuls les administrateurs d&#233;clar&#233;s commes webmestres (<code>constante _ID_WEBMESTRES</code>) sont autoris&#233; &#224; g&#233;r&#233;r la configuration du plugin.
+
+La configuration se fait dans [le gestionnaire cfg->?exec=cfg&amp;cfg=svn_update] :
+- pour d&#233;finir la liste des administrateurs autoris&#233;s &#224; proc&#233;der aux mises &#224; jour (par d&#233;faut seul l'administrater d'id 1 est autoris&#233;).
+- pour d&#233;clarer la liste des r&#233;pertoires concern&#233;s, en donnant pour chacun une ligne :
+_ <code>source destination [revision] [user]</code>
+_ Par exemple :
+_ <code>svn://zone.spip.org/spip-zone/_squelettes_/sedna squelettes/sedna</code>
+_ <code>svn://zone.spip.org/spip-zone/_plugins_/_stable_/cfg plugins/cfg</code>
+	</description>
+	<lien>http://www.spip-contrib.net/SVN-Update-Notes</lien> <!-- URI de documentation -->
+	<prefix>
+	svn_update
+	</prefix>
+	<necessite id="SPIP" version="[1.9.0;]" />
+	<necessite id="cfg" version="[1.0;]"/>
+	<options>
+	    svn_update_options.php
+	</options>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/svn.revision
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/svn.revision	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/svn.revision	(revision 152)
@@ -0,0 +1,15 @@
+<svn_revision><text_version>
+Origine svn://zone.spip.org/spip-zone/_plugins_/_stable_/svn_update le lundi 2 mars 2009, 19:33:31 (UTC+0100)
+Revision: 27007
+Dernier commit 2009-03-02 16:54:39 +0100 (Mon, 02 Mar 2009)
+Voir http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/svn_update
+Archive: http://files.spip.org/spip-zone/svn_update.zip
+</text_version>
+<uri>http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/svn_update</uri>
+<archive>http://files.spip.org/spip-zone/svn_update.zip</archive>
+<origine>svn://zone.spip.org/spip-zone/_plugins_/_stable_/svn_update</origine>
+<date_production>lundi 2 mars 2009, 19:33:31 (UTC+0100)</date_production>
+<revision>27007</revision>
+<commit>2009-03-02 16:54:39 +0100 (Mon, 02 Mar 2009)</commit>
+</svn_revision>
+<archivelist>_plugins_/_stable_/svn_update;svn_update;svn_update</archivelist>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/svn_update_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/svn_update_options.php	(revision 152)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update-redcta-spip-2-0/svn_update_options.php	(revision 152)
@@ -0,0 +1,8 @@
+<?php
+
+    if (!defined("_ECRIRE_INC_VERSION")) return;    #securite
+
+    if (!defined(SVN_UPDATE_AUTEURS)) {
+        define('_SVN_UPDATE_AUTEURS', implode(";",lire_config('svn_update/administrateurs',array('1'))));
+    }
+?>
