Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda.php	(revision 30)
@@ -0,0 +1,82 @@
+<?php
+
+function Agenda_ajouter_onglets($flux) {
+  if($flux['args']=='calendrier')
+  {
+		$flux['data']['evenements']= new Bouton(
+																 '../'._DIR_PLUGIN_AGENDA.'/img_pack/agenda-24.png', _T('agenda:evenements'),
+																generer_url_ecrire("calendrier","type=semaine"));
+	
+		$flux['data']['editorial']= new Bouton(
+															 'cal-rv.png', _T('agenda:activite_editoriale'),
+																 generer_url_ecrire("calendrier","mode=editorial&type=semaine"));
+  }
+	return $flux;
+}
+function Agenda_header_prive($flux) {
+	$exec = _request('exec');
+	// les CSS
+	if ($exec == 'calendrier'){
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/calendrier.css" type="text/css" />'. "\n";
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/agenda.css" type="text/css" />'. "\n";
+	}
+	if ($exec == 'articles'){
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/agenda_articles.css" type="text/css" />'. "\n";
+	}
+
+
+	return $flux;
+}
+
+function Agenda_exec_init($flux) {
+	$exec =  $flux['args']['exec'];
+	if (($exec == 'calendrier')||($exec=='articles')){
+		include_spip('inc/calendar');
+		// Reserver les widgets agenda
+		WCalendar_ajoute_lies(_T('agenda:evenement_date_debut'),'_evenement_debut',_T('agenda:evenement_date_fin'),'_evenement_fin');
+		WCalendar_ajoute_statique(_T('agenda:evenement_repetitions'),'_repetitions');
+	}
+	return $flux;
+}
+
+function Agenda_affiche_milieu($flux) {
+	$exec =  $flux['args']['exec'];
+	if ($exec=='articles'){
+		include_spip('inc/calendar');
+		include_spip('inc/agenda_gestion');
+		$id_article = $flux['args']['id_article'];
+		$flux['data'] .= Agenda_formulaire_article($id_article, article_editable($id_article));
+	}
+	return $flux;
+}
+
+function Agenda_rendu_boite($titre,$descriptif,$lieu,$type='ics'){
+	$texte = "<span class='calendrier-verdana10'><span  style='font-weight: bold;'>";
+	$texte .= wordwrap($sum=typo($titre),15)."</span>";
+	$texte .= "<span class='survol'>";
+	$texte .= "<strong>$sum</strong><br />";
+	$texte .= $lieu ? propre($lieu).'<br />':'';
+	$texte .= propre($descriptif);
+	$texte .= "</span>";
+	if ($type=='ics'){	
+		$texte .= (strlen($lieu.$descriptif)?"<hr/>":"").$lieu.(strlen($lieu)?"<br/>":"");
+		$texte .= $descriptif;
+	}
+	$texte .= "</span>";
+
+	return $texte;
+}
+function Agenda_rendu_evenement($flux) {
+	global $couleur_claire;
+	$evenement = $flux['args']['evenement'];
+
+	
+	$url = $evenement['URL']; 
+	$texte = Agenda_rendu_boite($evenement['SUMMARY'],$evenement['DESCRIPTION'],$evenement['LOCATION'],$flux['args']['type']);
+	$texte = http_href(quote_amp($url), $texte, '', '', '', '');
+	
+	$flux['data'] = $texte;
+	return $flux;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_jour.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_jour.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_jour.html	(revision 30)
@@ -0,0 +1,52 @@
+<BOUCLE_jour(EVENEMENTS)
+	{agendafull date_debut, date_fin, jour, #ENV{annee}, #ENV{mois}, #ENV{jour}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 
+	calendrier-couleur[(#ENV{theme,0}|modulo{14,1})]})]</BOUCLE_jour>[(#DATE|Agenda_affiche_full{<:aucun_article:>, 'jour', 
+	calendrier-couleur[(#ENV{theme,0}|modulo{14,1})]})][(#TOTAL_BOUCLE|?{' ',''})
+<div style='position: fixed; top:50px; left: 20px'>
+<table style='width: 10px'><tr>
+<td class='calendrier-couleur1'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,0})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur2'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,1})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur3'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,2})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur4'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,3})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur5'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,4})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur6'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,5})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur7'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,6})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur8'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,7})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur9'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,8})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur10'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,9})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur11'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,10})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur12'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,11})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur13'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,12})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur14'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,13})]'>&nbsp;&nbsp;</a></td></tr>
+</table>
+</div>
+]<//B_jour>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mes_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mes_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mes_fonctions.php	(revision 30)
@@ -0,0 +1,7 @@
+<?php
+
+//include_spip('inc/agenda_filtres'); // declaration directe dans le xml pour eviter un find_in_path
+include_spip('public/criteres_agenda');
+include_spip('inc/agenda_filtres');
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mes_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mes_options.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mes_options.php	(revision 30)
@@ -0,0 +1,80 @@
+<?php
+if (!defined('_DIR_PLUGIN_AGENDA')){ // definie automatiquement en 1.9.2
+	$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
+	define('_DIR_PLUGIN_AGENDA',(_DIR_PLUGINS.end($p)));
+}
+include_spip('base/agenda_evenements');
+
+function cron_agenda_nettoyer_base($t){
+	# les evenements lies a un article inexistant
+	$res = spip_query("SELECT evenements.id_evenement,evenements.id_article
+		      FROM spip_evenements AS evenements
+		        LEFT JOIN spip_articles AS articles
+		          ON evenements.id_article=articles.id_article
+		       WHERE articles.id_article IS NULL");
+	while ($row = spip_fetch_array($res,SPIP_ASSOC))
+		spip_query("DELETE FROM spip_evenements
+		WHERE id_evenement=".$row['id_evenement']
+		." AND id_article=".$row['id_article']);
+
+	# les liens de mots affectes a des evenements effaces
+	$res = spip_query("SELECT mots_evenements.id_mot,mots_evenements.id_evenement 
+		        FROM spip_mots_evenements AS mots_evenements
+		        LEFT JOIN spip_evenements AS evenements
+		          ON mots_evenements.id_evenement=evenements.id_evenement
+		       WHERE evenements.id_evenement IS NULL");
+
+	while ($row = spip_fetch_array($res,SPIP_ASSOC))
+		spip_query("DELETE FROM spip_mots_evenements
+		WHERE id_mot=".$row['id_mot']
+		." AND id_evenement=".$row['id_evenement']);
+
+	return 1;
+}
+
+function Agenda_taches_generales_cron($taches_generales){
+	$taches_generales['agenda_nettoyer_base'] = 3600*48;
+	return $taches_generales;
+}
+
+function exec_calendrier()
+{
+	$mode = _request('mode');
+	if ($mode=='editorial'){
+		include_spip('exec/calendrier');
+	  global $type, $css;
+	// icones standards, fonction de la direction de la langue
+	
+	  global $bleu, $vert, $jaune, $spip_lang_rtl;
+	  $bleu = http_img_pack("m_envoi_bleu$spip_lang_rtl.gif", 'B', "class='calendrier-icone'");
+	  $vert = http_img_pack("m_envoi$spip_lang_rtl.gif", 'V', "class='calendrier-icone'");
+	  $jaune= http_img_pack("m_envoi_jaune$spip_lang_rtl.gif", 'J', "class='calendrier-icone'");
+	
+	  $date = date("Y-m-d", time()); 
+		if ($type == 'semaine') {
+		
+			$GLOBALS['afficher_bandeau_calendrier_semaine'] = true;
+			$titre = _T('titre_page_calendrier',
+				array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+		}
+	  elseif ($type == 'jour') {
+			$titre = nom_jour($date)." ". affdate_jourcourt($date);
+	  }
+		else {
+			$titre = _T('titre_page_calendrier',
+			    array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+		}
+		
+	  debut_page($titre, "redacteurs", "calendrier","",$css);
+		barre_onglets("calendrier", "editorial");
+		echo "<div>&nbsp;</div>" ;
+	  echo http_calendrier_init('', $type, '','',generer_url_ecrire('calendrier', 'mode=editorial'.($type ? "&type=$type" : '')));
+		
+	  fin_page();
+	}
+	else{
+		$var_f = charger_fonction('agenda_evenements');
+		$var_f();
+	}
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mois.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mois.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_mois.html	(revision 30)
@@ -0,0 +1,7 @@
+<BOUCLE_mois(EVENEMENTS)
+	{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE,
+		calendrier-couleur[(#ID_SECTEUR|
+			modulo{14,1})]})]</BOUCLE_mois>[(#DATE|
+	Agenda_affiche_full{<:aucun_article:>, 'mois'}
+)]<//B_mois>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_periode.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_periode.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_periode.html	(revision 30)
@@ -0,0 +1,8 @@
+<BOUCLE_periode(EVENEMENTS)
+	{agendafull date_debut, date_fin, periode,
+	#ENV{annee}, #ENV{mois}, #ENV{jour},
+	#ENV{annee_fin}, #ENV{mois_fin}, #ENV{jour_fin}}>[
+(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 'calendrier-couleur6'})
+]</BOUCLE_periode>[(#DATE|
+	Agenda_affiche_full{<:aucun_article:>, 'periode', 'calendrier-couleur6'}
+)]<//B_periode>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_semaine.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_semaine.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/agenda_semaine.html	(revision 30)
@@ -0,0 +1,7 @@
+<BOUCLE_semaine(EVENEMENTS)
+	{agendafull date_debut, date_fin, semaine, #ENV{annee}, #ENV{mois}, #ENV{jour}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE,
+	[(#COMPTEUR_BOUCLE|
+		alterner{'calendrier-couleur2', 'calendrier-couleur4'})]})]</BOUCLE_semaine>[(#DATE|
+		Agenda_affiche_full{<:aucun_article:>, 'semaine', 'calendrier-couleur2','calendrier-couleur4'}
+)]<//B_semaine>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/balise/calendrier_mini.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/balise/calendrier_mini.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/balise/calendrier_mini.php	(revision 30)
@@ -0,0 +1,113 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
+
+// Pas besoin de contexte de compilation
+global $balise_CALENDRIER_MINI_collecte;
+$balise_CALENDRIER_MINI_collecte = array('id_rubrique','id_article','id_mot');
+
+function balise_CALENDRIER_MINI ($p) {
+	return calculer_balise_dynamique($p,'CALENDRIER_MINI', array('id_rubrique','id_article', 'id_mot'));
+}
+
+function balise_CALENDRIER_MINI_stat($args, $filtres) {
+	return $args;
+}
+ 
+function balise_CALENDRIER_MINI_dyn($id_rubrique=0, $id_article = 0, $id_mot = 0,$date, $var_date = 'date', $url = '') {
+	if(!$url)
+		$url = self();
+	// nettoyer l'url qui est passee par htmlentities pour raison de securités
+	$url = str_replace("&amp;","&",$url);
+
+	return array('formulaires/calendrier_mini', 0, 
+		array(
+			'date' => $date,
+			'id_rubrique' => $id_rubrique,
+			'id_article' => $id_article,
+			'id_mot' => $id_mot,
+			'var_date' => $var_date,
+			'self' => $url,
+		));
+}
+
+function agenda_mini($i) {
+  $args = func_get_args();
+  $une_date = array_shift($args); // une date comme balise
+  $sinon = array_shift($args);
+  if (!$une_date) return $sinon;
+  $type = 'mini';
+  $agenda = Agenda_memo_full(0);
+  $evt = array();
+  foreach (($args ? $args : array_keys($agenda)) as $k) {  
+      if (is_array($agenda[$k]))
+		foreach($agenda[$k] as $d => $v) { 
+		  $evt[$d] = $evt[$d] ? (array_merge($evt[$d], $v)) : $v;
+		}
+    }
+	$la_date = mktime(0, 0, 0, mois($une_date), 1, annee($une_date));
+    include_spip('inc/agenda');
+    return http_calendrier_init($la_date, $type, '', '', '', array('', $evt));
+}
+
+function http_calendrier_mini($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt) {
+	list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+
+	if ($sansduree)
+		foreach($sansduree as $d => $r) {
+			$evenements[$d] = !$evenements[$d] ? $r : 
+				 array_merge($evenements[$d], $r);
+			 }
+
+	if (!$premier_jour) $premier_jour = '01';
+	if (!$dernier_jour) {
+		$dernier_jour = 31;
+		while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
+	}
+
+	// affichage du debut de semaine hors periode
+	$ligne = '';
+	$debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
+	for ($i=$debut ? $debut : 7;$i>1;$i--) {
+		$mois_precedent = mktime(1,1,1,$mois-1,1,$annee);
+		$jour_mois_precedent = date('t', $mois_precedent)+2-$i;
+		$ligne .= "\n\t<td class=\"horsperiode\">$jour_mois_precedent</td>";
+	}
+
+	$total = '';
+	for ($j=$premier_jour; $j<=$dernier_jour; $j++) {
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour = date("d",$nom);
+		$jour_semaine = date("w",$nom);
+		$mois_en_cours = date("m",$nom);
+		$annee_en_cours = date("Y",$nom);
+		$amj = date("Y",$nom) . $mois_en_cours . $jour;
+
+		if ($jour_semaine==1) { 
+			$total .= "\n<tr>$ligne\n</tr>";
+			$ligne = '';
+		}
+
+		$evts = $evenements[$amj];
+		$class="";
+		if ($evts) {
+			$evts = "<a href='".parametre_url($evts[0]['URL'],'date',"$annee_en_cours-$mois_en_cours-$jour")."' title='".$evts[0]['SUMMARY'].
+			"'>".intval($jour)."</a>";
+			$class='occupe';
+		}
+		else {
+			$evts = intval($jour);
+			$class='libre';
+		}
+		$ligne .= "\n\t<td  class='$class".($amj == date("Ymd")?' today':'')."'>" . $evts . "\n\t</td>";
+	}
+	$jour_mois_suivant=1;
+	// affichage de la fin de semaine hors periode
+	for($j=$jour_semaine ? $jour_semaine : 7; $j<7; $j++) {
+		$ligne .= "\n\t<td class=\"horsperiode\">".$jour_mois_suivant++."</td>";			
+	}
+
+	return $total . ($ligne ? "\n<tr>$ligne\n</tr>" : '');
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/balise/formulaire_edition_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/balise/formulaire_edition_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/balise/formulaire_edition_evenement.php	(revision 30)
@@ -0,0 +1,81 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
+
+// Pas besoin de contexte de compilation
+global $balise_FORMULAIRE_EDITION_EVENEMENT_collecte;
+$balise_FORMULAIRE_EDITION_EVENEMENT_collecte = array('id_evenement','id_article');
+
+function balise_FORMULAIRE_EDITION_EVENEMENT ($p) {
+	return calculer_balise_dynamique($p,'FORMULAIRE_EDITION_EVENEMENT', array('id_evenement', 'id_article'));
+}
+
+function balise_FORMULAIRE_EDITION_EVENEMENT_stat($args, $filtres) {
+	return $args;
+}
+ 
+function balise_FORMULAIRE_EDITION_EVENEMENT_dyn($id_evenement = 0, $id_article = 0) {
+	$url = parametre_url(self(),'ajout_evenement','');
+	// nettoyer l'url qui est passee par htmlentities pour raison de securités
+	$url = str_replace("&amp;","&",$url);
+	if ($retour=='') $retour = $url;
+
+	$res = spip_query("SELECT * FROM spip_articles WHERE id_article=".spip_abstract_quote($id_article));
+	if (!spip_num_rows($res)) return;
+
+	$flag_modif = (_request('evenement_modif') && _request('id_evenement') == $id_evenement);
+	$flag_ajout = _request('evenement_insert');
+	if ($flag_ajout || $flag_modif){
+		include_spip("inc/agenda_gestion");
+		Agenda_action_formulaire_article($id_article);
+	}
+
+	
+	$evenement_action='evenement_insert';
+	$valeurs=array('mots'=>array(),'dates'=>array(),'evenement_horaire'=>'oui');
+
+	$formulaire_actif = _request('ajout_evenement')!=NULL;
+	
+	// les champs
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement)." AND id_article=".spip_abstract_quote($id_article));
+	if ($row = spip_fetch_array($res,SPIP_ASSOC)){
+		$evenement_action='evenement_modif';
+		foreach($row as  $k=>$val){
+			$valeurs["evenement_$k"]=$val;
+		}
+		// les mots
+		$res = spip_query("SELECT * FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$valeurs['mots'][]=$row['id_mot'];
+		}
+		
+		$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$valeurs['repetitions'][] = date('m/d/Y',strtotime($row['date_debut']));
+		}
+		$formulaire_actif = true;
+	}
+	$t=time();
+	$valeurs["date_evenement_debut"]=isset($valeurs["evenement_date_debut"])?$valeurs["evenement_date_debut"]:date('Y-m-d H:i:00',$t);
+	$valeurs["date_evenement_fin"]=isset($valeurs["evenement_date_fin"])?$valeurs["evenement_date_fin"]:date('Y-m-d H:i:00',$t+3600);
+
+	if (!$formulaire_actif) return;
+
+	return array('formulaires/formulaire_edition_evenement', 0, 
+		array(
+			#'erreur_message'=>isset($erreur['@'])?$erreur['@']:'',
+			#'erreur'=>serialize($erreur),
+			#'reponse'=>filtrer_entites($reponse),
+			'id_article' => $id_article,
+			'id_evenement' => $id_evenement,
+			'evenement_action' => $evenement_action,
+			'self' => $url,
+			'valeurs' => serialize($valeurs),
+			'url_validation' => str_replace("&amp;","&",$url_validation),
+			#'affiche_sondage' => $affiche_sondage,
+			#'formok' => filtrer_entites($formok),
+			#'formactif' => $formactif,
+		));
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/base/agenda_evenements.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/base/agenda_evenements.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/base/agenda_evenements.php	(revision 30)
@@ -0,0 +1,107 @@
+<?php
+// -----------------------------------------------------------------------------
+// Declaration des tables evenements
+// creation 11/03/2006 pour SPIP 1.9
+
+include_spip('base/serial'); // pour eviter une reinit posterieure des tables modifiees
+
+global $tables_principales;
+global $tables_auxiliaires;
+
+//-- Table EVENEMENTS ------------------------------------------
+$evenements = array(
+		"id_evenement"	=> "bigint(21) NOT NULL",
+		"id_article"	=> "bigint(21) DEFAULT '0' NOT NULL",
+		"date_debut"	=> "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
+		"date_fin"	=> "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
+		"titre"	=> "text NOT NULL",
+		"descriptif"	=> "text NOT NULL",
+		"lieu"	=> "text NOT NULL",
+		"horaire" => "ENUM('oui','non') DEFAULT 'oui' NOT NULL",
+		"id_evenement_source"	=> "bigint(21) NOT NULL",
+		"idx"		=> "ENUM('', '1', 'non', 'oui', 'idx') DEFAULT '' NOT NULL",
+		"maj"	=> "TIMESTAMP"
+		);
+
+$evenements_key = array(
+		"PRIMARY KEY"	=> "id_evenement",
+		"KEY date_debut"	=> "date_debut",
+		"KEY date_fin"	=> "date_fin",
+		"KEY id_article"	=> "id_article"
+		);
+
+$tables_principales['spip_evenements'] =
+	array('field' => &$evenements, 'key' => &$evenements_key);
+
+
+//-- Table de relations MOTS_EVENEMENTS----------------------
+$spip_mots_evenements = array(
+		"id_mot"	=> "BIGINT (21) DEFAULT '0' NOT NULL",
+		"id_evenement"	=> "BIGINT (21) DEFAULT '0' NOT NULL");
+
+$spip_mots_evenements_key = array(
+		"PRIMARY KEY"	=> "id_mot, id_evenement",
+		"KEY id_evenement"	=> "id_evenement");
+
+$tables_auxiliaires['spip_mots_evenements'] = array(
+	'field' => &$spip_mots_evenements,
+	'key' => &$spip_mots_evenements_key);
+
+//-- Jointures ----------------------------------------------------
+global $tables_jointures;
+$tables_jointures['spip_evenements'][]= 'mots'; // a placer avant la jointure sur articles
+$tables_jointures['spip_articles'][]= 'evenements';
+$tables_jointures['spip_evenements'][] = 'articles';
+$tables_jointures['spip_mots'][]= 'mots_evenements';
+$tables_jointures['spip_evenements'][] = 'mots_evenements';
+
+global $exceptions_des_tables;
+$exceptions_des_tables['evenements']['id_rubrique']=array('spip_articles', 'id_rubrique');
+
+global $table_primary;
+$table_primary['evenements']="id_evenement";
+
+global $table_date;
+$table_date['evenements'] = 'date_debut';
+// si on declare les tables dans $table_des_tables, il faut mettre le prefixe
+
+// 'spip_' dans l'index de $tables_principales
+global $table_des_tables;
+$table_des_tables['evenements']='evenements';
+$table_des_tables['mots_evenements']='mots_evenements';
+
+
+
+// Extension de la table des groupes de mots cles
+$spip_groupes_mots = array(
+		"id_groupe"	=> "bigint(21) NOT NULL",
+		"titre"	=> "text NOT NULL",
+		"descriptif"	=> "text NOT NULL",
+		"texte"	=> "longblob NOT NULL",
+		"unseul"	=> "varchar(3) NOT NULL",
+		"obligatoire"	=> "varchar(3) NOT NULL",
+		"articles"	=> "varchar(3) NOT NULL",
+		"breves"	=> "varchar(3) NOT NULL",
+		"rubriques"	=> "varchar(3) NOT NULL",
+		"syndic"	=> "varchar(3) NOT NULL");
+if (isset($GLOBALS['meta']['agenda_base_version']))
+	$spip_groupes_mots = array_merge($spip_groupes_mots,array("evenements"	=> "varchar(3) NOT NULL"));
+if (isset($GLOBALS['meta']['pim_agenda_base_version']))
+	$spip_groupes_mots = array_merge($spip_groupes_mots,array("pim_agenda"	=> "varchar(3) NOT NULL"));
+$spip_groupes_mots = array_merge($spip_groupes_mots,array(
+		"minirezo"	=> "varchar(3) NOT NULL",
+		"comite"	=> "varchar(3) NOT NULL",
+		"forum"	=> "varchar(3) NOT NULL",
+		"maj"	=> "TIMESTAMP"));
+
+
+$spip_groupes_mots_key = array(
+		"PRIMARY KEY"	=> "id_groupe");
+
+$tables_principales['spip_groupes_mots'] =
+	array('field' => &$spip_groupes_mots, 'key' => &$spip_groupes_mots_key);
+
+global  $table_des_traitements;
+$table_des_traitements['LIEU'][]= 'propre(%s)';
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/demo_calendrier_mini.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/demo_calendrier_mini.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/demo_calendrier_mini.html	(revision 30)
@@ -0,0 +1,173 @@
+#CACHE{86400}
+<BOUCLE_article_principal(ARTICLES) {id_article}><!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>[(#TITRE|textebrut)][ - (#NOM_SITE_SPIP|textebrut)]</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+	[<meta name="description" content="(#INTRODUCTION|couper{150}|attribut_html)" />]
+	<meta name="generator" content="SPIP" />
+	[<link rel="shortcut icon" href="(#CHEMIN{favicon.ico})" />]
+
+	<!-- Lien vers le backend pour navigateurs eclaires -->
+	<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>" href="#URL_PAGE{backend}" />
+
+	<!-- Ceci est la feuille de style par defaut pour le code genere par SPIP -->
+	<link rel="stylesheet" href="[(#CHEMIN{spip_style.css}|direction_css)]" type="text/css" media="all" />
+	<!-- Feuille de styles CSS pour l'affichage du site sur ecran -->
+	<link rel="stylesheet" href="[(#CHEMIN{habillage.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
+	<!-- Feuille de styles CSS pour l'impression -->
+	<link rel="stylesheet" href="[(#CHEMIN{impression.css}|direction_css)]" type="text/css" media="print" />
+</head>
+
+<body class="page_article">
+<div id="page">
+
+	[(#REM) Entete de la page + titre du site ]
+	<INCLURE{fond=inc-entete}{lang}>
+
+	[(#REM) Fil d'Ariane ]
+	<div id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_article}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; (#TITRE|couper{80})]</div>
+
+
+	<div id="conteneur">
+
+
+		[(#REM) Contenu principal : contenu de l'article ]
+
+		<div id="contenu">
+<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+[(#REM) mini calendrier : 
+1er arg la date, 
+2eme le nom de la variable date (optionel : 'date' par defaut)
+3eme l'url sur laquelle boucler (optionel : url courante par defaut) ]
+#CALENDRIER_MINI{#ENV{date},'date',#SELF}
+
+		<div class="cartouche">
+				#DEBUT_SURLIGNE
+				[(#LOGO_ARTICLE||image_reduire{200,200})]
+				[<p class="surtitre">(#SURTITRE)</p>]
+				<h1 class="titre">#TITRE</h1>
+				[<p class="soustitre">(#SOUSTITRE)</p>]
+				#FIN_SURLIGNE
+
+				<p><small>[(#DATE|nom_jour) ][(#DATE|affdate)][, <:par_auteur:> (#LESAUTEURS)]</small></p>
+
+				[(#REM) Traductions de l'article ]
+				<B_traductions>
+				<div class="traductions">
+					<p><:trad_article_traduction:></p>
+					<ul>
+						<li[ class="(#EXPOSE)"]>[(#LANG|traduire_nom_langue)]</li>
+						<BOUCLE_traductions(ARTICLES){traduction}{exclus}>
+						<li><a[ href="(#URL_ARTICLE|url_absolue)"] rel="alternate" hreflang="#LANG"[ title="(#TITRE|couper{80}|texte_backend)"]><span lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR">[(#LANG|traduire_nom_langue)]</span></a></li>
+						</BOUCLE_traductions>
+					</ul>
+				</div>
+				</B_traductions>
+			</div>
+
+
+			#DEBUT_SURLIGNE
+			[<div class="chapo">(#CHAPO)</div>]
+			<br class="nettoyeur" />
+			[<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+			[<div class="texte">(#TEXTE|image_reduire{520,0})</div>]
+			#FIN_SURLIGNE
+
+			[(#REM) Portfolio : album d'images ]
+			<B_documents_portfolio>
+			<div id="documents_portfolio">
+				<h2><:info_portfolio:></h2>
+				<BOUCLE_documents_portfolio(DOCUMENTS) {id_article}
+				{mode=document} {extension IN png,jpg,gif} {par date}
+				{doublons}>
+				[<a href="#URL_DOCUMENT" type="#MIME_TYPE"
+				onclick="this.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return true;"[title="(#TITRE|couper{80}|texte_backend)"]>(#LOGO_DOCUMENT||image_reduire{0,60}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+				</BOUCLE_documents_portfolio>
+			</div>
+			</B_documents_portfolio>
+			<BOUCLE_afficher_document(DOCUMENTS) {id_document}
+			{mode=document}{extension IN png,jpg,gif}>
+			<div class="spip_documents spip_documents_center" id="document_actif">
+				#EMBED_DOCUMENT
+				[<div class="spip_doc_titre">(#TITRE)</div>]
+				[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+			</div>
+			</BOUCLE_afficher_document>
+
+			[<div class="ps"><h2><:info_ps:></h2>#DEBUT_SURLIGNE(#PS)#FIN_SURLIGNE</div>]
+
+			[(#REM) Autres documents joints a l'article ]
+			<B_documents_joints>
+			<div id="documents_joints">
+				<h2><:titre_documents_joints:></h2>
+				<ul>
+					<BOUCLE_documents_joints(DOCUMENTS) {id_article} {mode=document} {par date} {doublons}>
+					<li>
+					<div class="spip_doc_titre"><a href="#URL_DOCUMENT" title="<:bouton_telecharger:>" type="#MIME_TYPE">[(#TITRE|sinon{<:info_document:>})]</a> <small>(#TYPE_DOCUMENT[ - (#TAILLE|taille_en_octets)])</small></div>
+					[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]</li>
+					<br class="nettoyeur" />
+					</BOUCLE_documents_joints>
+				</ul>
+			</div>
+			</B_documents_joints>
+
+			[(#REM) Petition :
+			La petition ayant une PAGINATION il faut absolument lui passer SELF]
+			[ #REM Conserver cet invalideur invisible : (#PETITION|?{'',''}) ]
+			<INCLURE{fond=inc-petition}{id_article}{self=#SELF}>
+
+			[<div class="notes"><h2><:info_notes:></h2>#DEBUT_SURLIGNE(#NOTES)#FIN_SURLIGNE</div>]
+
+			[(#REM) Forum de l'article ]
+			[<h2 class="forum-repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_article:></a></h2>]
+			<INCLURE{fond=inc-forum}{id_article}>
+
+
+		</div><!-- fin contenu -->
+
+
+		[(#REM) Menu de navigation laterale ]
+		<div id="navigation">
+			<h1 class="invisible"><:navigation:></h1>
+
+			[(#REM) Menu de navigation par rubriques ]
+			<INCLURE{fond=inc-rubriques}{lang}{id_rubrique}>
+
+			[(#REM) Articles dans la meme rubrique ]
+			<B_articles_rubrique>
+			<div class="breves">
+				<h2 class="menu-titre"><a href="#URL_RUBRIQUE"><:meme_rubrique:></a></h2>
+				<ul>
+					<BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {par date}{inverse} {0,10}>
+					<li><a href="#URL_ARTICLE"[ class="(#EXPOSE)"]>#TITRE</a></li>
+					</BOUCLE_articles_rubrique>
+				</ul>
+			</div>
+			</B_articles_rubrique>
+
+			[(#REM) Menu de navigation mots-cles ]
+			<B_mots>
+			<div class="divers">
+				<h2 class="menu-titre"><:mots_clefs:></h2>
+			<ul>
+				<BOUCLE_mots(MOTS) {id_article} {par titre}>
+				<li><a href="#URL_MOT" rel="tag">#TITRE</a></li>
+				</BOUCLE_mots>
+			</ul>
+			</div>
+			</B_mots>
+		</div><!-- fin navigation -->
+
+	</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/agenda/1_9_0/exec/agenda_evenements.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/agenda_evenements.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/agenda_evenements.php	(revision 30)
@@ -0,0 +1,421 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/texte');
+include_spip('inc/presentation');
+include_spip('inc/agenda_filtres');
+include_spip('inc/agenda_gestion');
+
+function date_debut_fin($annee,$mois,$jour,$type){
+	if ($type=='jour'){
+		$ts_start=strtotime("$annee-$mois-01 00:00:00");
+		$ts_start+=($jour-1)*24*60*60;
+		$ts_fin=$ts_start+24*60*60;
+	} else
+	if ($type=="semaine"){
+		$ts_start=strtotime("$annee-$mois-01 01:00:00");
+		$ts_start+=($jour-1)*24*60*60;
+		while (date('w',$ts_start)!=1) $ts_start-=24*60*60;
+		$ts_fin=$ts_start+7*24*60*60+60*60;
+		$ts_start-=2*60*60;
+	} else
+	if ($type=='mois'){
+		$ts_start=strtotime("$annee-$mois-01 00:00:00");
+		if ($mois<'12')
+			$ts_fin=strtotime("$annee-".($mois+1)."-01 00:00:00");
+		else
+			$ts_fin=strtotime(($annee+1)."-$mois-01 00:00:00");
+	}
+	return array($ts_start,$ts_fin);	
+}
+function ajoute_creneaux_horaires($urlbase,$ts_start,$ts_fin,$type,$partie_cal,$echelle){
+	if ($echelle<=120)
+		$freq_creneaux=30*60;
+	else
+		$freq_creneaux=60*60;
+
+	$today=date('Y-m-d');
+	// creneaux pour ajout uniquement si ajouter_id_article present
+	if (($type!='mois')&&($partie_cal!='sansheure'))
+	{
+		$heuremin='08';$heuremax='20';
+		if ($partie_cal=='matin'){
+			$heuremin='04';$heuremax='15';
+		}
+		if ($partie_cal=='soir'){
+			$heuremin='12';$heuremax='23';
+		}
+		for ($j=$ts_start;$j<=$ts_fin;$j+=$freq_creneaux){
+			$heure=date('H',$j);
+			if (($heure>=$heuremin)&&($heure<=$heuremax)){
+				$url=parametre_url($urlbase,'ndate',urlencode(date('Y-m-d H:i',$j)));
+				$creneau=date('Y-m-d H:i:s',$j);
+				if (date('Y-m-d',$j)==$today)
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "", $url,'calendrier-creneau-today');
+				else if (date('w',$j)==0)
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "",$url,'calendrier-creneau-sunday');
+				else
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "",$url,'calendrier-creneau');
+			}
+		}
+	}
+	
+}
+
+function affiche_evenements_agenda($flag_editable){
+	global $visu_evenements;
+	$type = _request('type');
+	$partie_cal = _request('partie_cal');
+	if (!$type) $type='semaine';
+	$id_evenement = intval(_request('id_evenement'));
+	$ajouter_id_article = intval(_request('ajouter_id_article'));
+	global $annee,$mois,$jour;
+	$annee = intval(_request('annee'));
+	$mois = intval(_request('mois'));
+	$jour = intval(_request('jour'));
+
+	if ($flag_editable)
+		Agenda_action_formulaire_article($ajouter_id_article);
+
+	$visu_evenements=array();
+
+	if ((!$annee)||(!$mois)||(!$jour)){
+		if (!$id_evenement){ // pas d'id_evenement--> date du jour
+			$stamp=time();
+		}
+		else { // date de l'evenement
+			$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+			if ($row = spip_fetch_array($res))
+				$stamp=strtotime($row['date_debut']);
+			else 
+				$stamp=time();
+		}
+		$annee=date('Y',$stamp);
+		$mois=date('m',$stamp);
+		$jour=date('d',$stamp);
+ 	}
+
+
+ 	$urlbase=self();
+ 	$urlbase=parametre_url($urlbase,'edit','');
+ 	$urlbase=parametre_url($urlbase,'del','');
+ 	$urlbase=parametre_url($urlbase,'ndate','');
+ 	$urlbase=parametre_url($urlbase,'id_evenement','');
+ 	$urlbase=parametre_url($urlbase,'neweven','1');
+ 	
+	//$urlbase=str_replace("&amp;","&",$urlbase);
+
+	// creation des boites creneaux horaires pour ajout rapide
+	list($ts_start,$ts_fin) = date_debut_fin($annee,$mois,$jour,$type);
+	if ($flag_editable)
+		ajoute_creneaux_horaires($urlbase,$ts_start,$ts_fin,$type,$partie_cal,$echelle);
+
+
+	$categorie_concerne=array('plage'=>'calendrier-plage','evenement'=>'calendrier-evenement');
+	$categorie_info=array('plage'=>'calendrier-plage-info','evenement'=>'calendrier-evenement-info');
+
+	$datestart=date('Y-m-d H:i:s',$ts_start-24*60*60);
+	$datefin=date('Y-m-d H:i:s',$ts_fin+24*60*60);
+
+	// tous les evenements
+	$res = spip_query("SELECT * 
+							FROM spip_evenements AS evenements
+						 WHERE ((evenements.date_debut>='$datestart' AND evenements.date_debut<='$datefin') 
+						 		OR (evenements.date_fin>='$datestart' AND evenements.date_fin<='$datefin')
+						 		OR (evenements.date_debut<'$datestart' AND evenements.date_fin>'$datefin'))
+						 ORDER BY evenements.date_debut;");
+ 	$urlbase=parametre_url($urlbase,'neweven','');
+	$urlbase=parametre_url($urlbase,'annee',$annee);
+	$urlbase=parametre_url($urlbase,'mois',$mois);
+	$urlbase=parametre_url($urlbase,'jour',$jour);
+	while ($row = spip_fetch_array($res)){
+		$is_evt=($row['horaire']!='oui')
+						||($row['date_debut']<$datestart && $row['date_fin']>$datefin);
+		$concerne=(!$ajouter_id_article) || ($ajouter_id_article==$row['id_article']);
+
+		$url=parametre_url($urlbase,'id_evenement',$row['id_evenement']);
+		$url=parametre_url($url,'ajouter_id_article',$row['id_article']);
+		
+		$titre = typo($row['titre']);
+		$descriptif = typo($row['descriptif']);
+		$lieu = typo($row['lieu']);
+		$texte=wordwrap(entites_html($row['titre'],ENT_QUOTES),15,"<br />\n");
+		if (($type!='mois')&&(!$is_evt))
+			$texte.="<hr />" . wordwrap(entites_html($row['descriptif'],ENT_QUOTES),15, "<br />\n");
+		if (strlen($texte)==0) $texte=_L("(sans objet)");
+
+		if ($concerne)	$categorie = $categorie_concerne;
+		else						$categorie = $categorie_info;
+		if ($is_evt) 		$categorie = $categorie['evenement'];
+		else 						$categorie = $categorie['plage'];
+		if ($id_evenement==$row['id_evenement'])
+			$categorie.='-selection';
+
+		if (!$is_evt)
+			Agenda_memo_full($row['date_debut'], $row['date_fin'], $titre, $descriptif, $lieu, $url, $categorie);
+		else{
+			//if ($type!='mois')
+			//	Agenda_memo_evt_full($row['date_debut'], $row['date_debut'], Agenda_rendu_boite($titre,$descriptif,$lieu), "", "", $url, $categorie);
+			//else
+				Agenda_memo_evt_full($row['date_debut'], $row['date_fin'], $titre, $descriptif, $lieu, $url, $categorie);
+		}
+		$visu_evenements[$row['id_evenement']]=1;
+	}
+
+	$s = "<span class='agenda-calendrier'>\n";
+	// attention : bug car $type est modifie apres cet appel !
+	$s .= Agenda_affiche_full(1,'', $type, 'calendrier-creneau','calendrier-creneau-today','calendrier-creneau-sunday','calendrier-plage','calendrier-evenement','calendrier-plage-info','calendrier-evenement-info','calendrier-plage-selection','calendrier-evenement-selection');
+	$s .= "</span>";
+
+	return $s;
+}
+
+
+function visu_evenement_agenda($id_evenement,$flag_editable){
+	$out = "";
+	$ndate = _request('ndate');
+	$del = _request('del');
+
+	if ($id_evenement!=NULL){
+		$res = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement=".spip_abstract_quote($id_evenement));
+		if ($row = spip_fetch_array($res)){
+			if (!isset($neweven)){
+				$fid_evenement=$row['id_evenement'];
+				$ftitre=attribut_html(typo($row['titre']));
+				$flieu=attribut_html(typo($row['lieu']));
+
+				$fhoraire=attribut_html($row['horaire']);
+				$fdescriptif=attribut_html(typo($row['descriptif']));
+				$fstdatedeb=strtotime($row['date_debut']);
+				$fstdatefin=strtotime($row['date_fin']);
+				$fid_evenement_source=$row['id_evenement_source'];
+			}
+	 	}
+		$out .= "<div class='agenda-visu-evenement'>";
+		$res2 = spip_query("SELECT articles.* FROM spip_articles AS articles LEFT JOIN spip_evenements AS J ON J.id_article=articles.id_article WHERE J.id_evenement=".spip_abstract_quote($id_evenement));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div class='article-evenement'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html(typo($row2['titre']))."</a>";
+			$out .= "</div>\n";
+		}
+		
+		$out .= "<div class='agenda-visu-evenement-bouton-fermer'>";
+		$url=self();
+		$url=parametre_url($url,'edit','');
+		$url=parametre_url($url,'neweven','');
+		$url=parametre_url($url,'del','');
+		$url=parametre_url($url,'id_evenement','');
+
+		$out .= "<a href='$url'><img src='"._DIR_PLUGIN_AGENDA."/img_pack/croix.png' width='12' height='12' style='border:none;'></a>";
+		$out .= "</div>\n";
+
+		$fobjet = entites_html($fobjet,ENT_QUOTES);
+		$flieu = entites_html($flieu,ENT_QUOTES);
+		$fdescription = entites_html($fdescription,ENT_QUOTES);
+
+		$out .= "<div class='titre-titre'>Titre</div><div class='titre-visu'>$ftitre &nbsp;</div>\n";
+		$out .= "<div class='lieu-titre'>Lieu</div><div class='lieu-visu'>$flieu &nbsp;</div>\n";
+		$out .= "<div class='horaire-titre'>&nbsp;</div>";
+		$out .= "<div class='date-titre'>Date </div>";
+		$out .= "<div class='date-visu'>";
+		$out .= "Du ".affdate_jourcourt(date("Y-m-d H:i",$fstdatedeb));
+		if ($fhoraire=='oui')
+			$out .= " &agrave; ".date("H:i",$fstdatedeb);
+		$out .= " <br/>\n";
+		$out .= "Au ".affdate_jourcourt(date("Y-m-d H:i",$fstdatefin));
+		if ($fhoraire=='oui')
+			$out .= " &agrave; ".date("H:i",$fstdatefin);
+		$out .= " <br/>\n";
+		$out .= "</div>\n";
+		$out .= "<div class='descriptif-titre'>Description</div><div class='descriptif-visu'>$fdescriptif &nbsp;</div>\n";
+
+		$out .=  "<div class='agenda_mots_cles'>";
+		$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+		$sep = "";
+		while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+			$id_groupe = $row['id_groupe'];
+			$row2 = spip_fetch_array(
+						spip_query("SELECT mots.titre FROM spip_mots_evenements AS mots_evenements
+								LEFT JOIN spip_mots AS mots ON mots.id_mot=mots_evenements.id_mot 
+								WHERE mots.id_groupe=".spip_abstract_quote($id_groupe).
+								" AND mots_evenements.id_evenement=".spip_abstract_quote($id_evenement)));
+			if ($row2){
+				$out .= $sep . supprimer_numero($row['titre'])."&nbsp;:&nbsp;".supprimer_numero($row2['titre']);
+				$sep = "\n, ";
+			}
+		}
+		$out .= "</div>\n";
+		
+
+		$url = parametre_url(self(),'annee','');
+		$url = parametre_url($url,'mois','');
+		$url = parametre_url($url,'jour','');
+
+		$out .= "<div class='repetitions-calendrier'>";
+		$id_source = $fid_evenement_source?$fid_evenement_source:$id_evenement;
+		$res2 = spip_query("SELECT * FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_source)." OR id_evenement_source=".spip_abstract_quote($id_source)." ORDER BY date_debut");
+		if (spip_num_rows($res2)>1){
+			$out .= _T('agenda:evenement_autres_occurences');
+			while($row2 = spip_fetch_array($res2)){
+				if ($row2['id_evenement']!=$fid_evenement){
+					$url = parametre_url(self(),'id_evenement',$row2['id_evenement']);
+					$out .= " <a href='$url'>" . affdate_jourcourt($row2['date_debut']) ."</a>";
+				}
+			}
+		}
+		$out .= "</div>";
+	
+		if ($fid_evenement_source!=0){
+			$res2 = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement=".spip_abstract_quote($fid_evenement_source));
+			if ($row2 = spip_fetch_array($res2)){
+				$url = parametre_url($url,'id_evenement',$row2['id_evenement']);
+			  $out .= "<div class='edition-bouton'>";
+			  $out .= _T('agenda:repetition_de')." <a href='";
+			  $out .= $url;
+			  $out .= "'>".($row2['titre']?typo($row2['titre']):_T('agenda:sans_titre'))."</a>";
+			  $out .= "</div>";
+			}
+		}
+		else if ($flag_editable){
+			$url=self();
+			$url=parametre_url($url,'edit','');
+			$url=parametre_url($url,'neweven','');
+			$url=parametre_url($url,'del','');
+			$url=parametre_url($url,'id_evenement','');
+			if ($del==1)	{ //---------------Suppression RDV ------------------------------
+			  $out .= "<form name='edition_rdv' action='$url' method='post'>";
+			  //$out .= "<input type='hidden' name='redirect' value='$url' />\n";
+			  $out .= "<input type='hidden' name='id_evenement' value='$fid_evenement' />\n";
+			  $out .= "<input type='hidden' name='suppr' value='1' />\n";
+			  $out .= "<div class='edition-bouton'>";
+			  $out .= "<input type='submit' name='submit' value='Annuler' />";
+			  $out .= "<input type='submit' name='submit' value='Confirmer la suppression' />";
+			  $out .= "</div></form>";
+	  	}
+	  	else {
+				$url=parametre_url($url,'id_evenement',$id_evenement);
+			  $out .= "<form name='edition_rdv' action='$url' method='post'>";
+			  //$out .= "<input type='hidden' name='redirect' value='$url' />\n";
+			  $out .= "<input type='hidden' name='id_evenement' value='$fid_evenement' />\n";
+			  $out .= "<input type='hidden' name='edit' value='1' />\n";
+			  $out .= "<div class='edition-bouton'>";
+				$out .= "<div style='text-align:$spip_lang_right'><input type='submit' name='modifier' value='"._T('bouton_modifier')."' class='fondo'></div>";
+			  $out .= "</div></form>";
+	  	}
+		}
+		$out .= "</div>\n";
+	}
+	return $out;
+}
+
+function exec_agenda_evenements_dist(){
+	// s'assurer que les tables sont crees
+	Agenda_install();
+	include_spip('inc/calendar');
+	// Reserver les widgets agenda
+	WCalendar_ajoute_lies(_T('agenda:evenement_date_debut'),'_evenement_debut',_T('agenda:evenement_date_fin'),'_evenement_fin');
+	WCalendar_ajoute_statique(_T('agenda:evenement_repetitions'),'_repetitions');
+
+	$ajouter_id_article = intval(_request('ajouter_id_article'));
+	$flag_editable = article_editable($ajouter_id_article);
+
+	global $visu_evenements;
+	$type = _request('type');
+	if (!$type) $type='semaine';
+	$id_evenement = intval(_request('id_evenement'));
+	$edit = _request('edit');
+	$neweven = _request('neweven');
+
+	$annee = intval(_request('annee'));
+	$mois = intval(_request('mois'));
+	$jour = intval(_request('jour'));
+	$date = date("Y-m-d", time());
+	if ($annee&&$mois&&$jour)
+		$date = date("Y-m-d", strtotime("$annee-$mois-$jour"));
+
+
+		
+	if ($type == 'semaine') {
+	
+		//$GLOBALS['afficher_bandeau_calendrier_semaine'] = true;
+		$titre = _T('titre_page_calendrier',
+			array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+	}
+  elseif ($type == 'jour') {
+		$titre = nom_jour($date)." ". affdate_jourcourt($date);
+  }
+	else {
+		$titre = _T('titre_page_calendrier',
+		    array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+	}
+
+  debut_page($titre, "redacteurs", "calendrier","",$css);
+	barre_onglets("calendrier", "evenements");
+
+	$out = "<div>";
+	if ($ajouter_id_article){
+		$res2 = spip_query("SELECT * FROM spip_articles AS articles WHERE id_article=".spip_abstract_quote($ajouter_id_article));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div style=' width:750px; font-size: 18px; color: #9DBA00; font-weight: bold;text-align:left;'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html(typo($row2['titre']))."</a></div>";
+		}
+	}
+	echo $out ."&nbsp;</div>" ;
+
+	echo affiche_evenements_agenda($flag_editable);
+
+	if (($edit||$neweven)&&($flag_editable))	{ //---------------Edition RDV ------------------------------
+		$ndate = _request('ndate');
+		echo Agenda_formulaire_edition_evenement($id_evenement,$neweven,$ndate);
+	}
+	else
+		if ((isset($id_evenement))&&(isset($visu_evenements[$id_evenement]))){ //---------------Visualisation RDV ------------------------------
+			echo visu_evenement_agenda($id_evenement,$flag_editable);
+		}
+	fin_page();
+
+}
+
+function http_calendrier_ics_message($annee, $mois, $jour, $large)
+{
+	return "";
+}
+
+function http_calendrier_aide_mess()
+{
+	return "";
+}
+
+function http_calendrier_semainesh($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	$init = date("w",mktime(1,1,1,$mois,$jour,$annee));
+	$init = $jour+1-($init ? $init : 7);
+	$sd = '';
+
+	if (is_array($evt))
+	  {
+		  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+		  if ($sansduree)
+		    foreach($sansduree as $d => $r) 
+		      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+	    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+	    $evt =
+	      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+	      http_calendrier_mois_sept($annee, $mois, $init, $init+ 6, $evenements, $script);
+	  } else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  "</table>" .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/articles.php.sav
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/articles.php.sav	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/articles.php.sav	(revision 30)
@@ -0,0 +1,1568 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+include_spip('inc/presentation');
+include_spip('inc/texte');
+include_spip('inc/rubriques');
+include_spip('inc/logos');
+include_spip('inc/mots');
+include_spip('inc/date');
+include_spip('inc/documents');
+include_spip('inc/forum');
+include_spip('base/abstract_sql');
+include_spip('inc/agenda_gestion');
+
+  // 28 paremetres, qui dit mieux ?
+  // moi ! elle en avait 61 en premiere approche
+
+function exec_affiche_articles_dist($id_article, $ajout_auteur, $change_accepter_forum, $change_petition, $changer_virtuel, $cherche_auteur, $cherche_mot, $debut, $email_unique, $flag_auteur, $flag_editable, $langue_article, $message, $nom_select, $nouv_auteur, $nouv_mot, $rubrique_article, $site_obli, $site_unique, $supp_auteur, $supp_mot, $texte_petition, $titre_article, $lier_trad)
+{
+  global $options, $spip_display, $spip_lang_left, $spip_lang_right, $dir_lang;
+
+$result = spip_query("SELECT * FROM spip_articles WHERE id_article='$id_article'");
+
+if ($row = spip_fetch_array($result)) {
+	$id_article = $row["id_article"];
+	$surtitre = $row["surtitre"];
+	$titre = $row["titre"];
+	$soustitre = $row["soustitre"];
+	$id_rubrique = $row["id_rubrique"];
+	$descriptif = $row["descriptif"];
+	$nom_site = $row["nom_site"];
+	$url_site = $row["url_site"];
+	$chapo = $row["chapo"];
+	$texte = $row["texte"];
+	$ps = $row["ps"];
+	$date = $row["date"];
+	$statut_article = $row["statut"];
+	$maj = $row["maj"];
+	$date_redac = $row["date_redac"];
+	$visites = $row["visites"];
+	$referers = $row["referers"];
+	$extra = $row["extra"];
+	$id_trad = $row["id_trad"];
+	$id_version = $row["id_version"];
+
+	if (ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})", $date_redac, $regs)) {
+		$annee_redac = $regs[1];
+		$mois_redac = $regs[2];
+		$jour_redac = $regs[3];
+		$heure_redac = $regs[4];
+		$minute_redac = $regs[5];
+		if ($annee_redac > 4000) $annee_redac -= 9000;
+	}
+
+	if (ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})", $date, $regs)) {
+		$annee = $regs[1];
+		$mois = $regs[2];
+		$jour = $regs[3];
+		$heure = $regs[4];
+		$minute = $regs[5];
+	}
+ }
+
+debut_page("&laquo; $titre_article &raquo;", "documents", "articles", "", "", $id_rubrique);
+echo Agenda_date_insert_js_calendar_placeholder("_debut");
+echo Agenda_date_insert_js_calendar_placeholder("_fin");
+debut_grand_cadre();
+
+afficher_hierarchie($id_rubrique);
+
+fin_grand_cadre();
+
+if (!$row) {echo _T('public:aucun_article'); exit;}
+
+//
+// Affichage de la colonne de gauche
+//
+
+debut_gauche();
+
+boite_info_articles($id_article, $statut_article, $visites, $id_version);
+
+//
+// Logos de l'article et Boites de configuration avancee
+//
+
+
+// pour l'affichage du virtuel
+unset($virtuel);
+if (substr($chapo, 0, 1) == '=') {
+	$virtuel = substr($chapo, 1);
+}
+
+boites_de_config_articles($id_article, $id_rubrique, $flag_editable,
+			  $change_accepter_forum, $change_petition,
+			  $email_unique, $site_obli, $site_unique,
+			  $message, $texte_petition,
+			  $changer_virtuel, $virtuel);
+ 
+//
+// Affichage de la colonne de droite
+//
+
+debut_droite();
+
+changer_typo('','article'.$id_article);
+
+debut_cadre_relief();
+
+//
+// Titre, surtitre, sous-titre
+//
+
+ $modif = titres_articles($titre, $statut_article,$surtitre, $soustitre, $descriptif, $url_site, $nom_site, $flag_editable, $id_article, $id_rubrique);
+
+
+echo "<div class='serif' align='$spip_lang_left'>";
+
+ dates_articles($id_article, $id_rubrique, $flag_editable, $statut_article, $date,$annee, $mois, $jour, $heure, $minute, $date_redac, $annee_redac, $mois_redac, $jour_redac, $heure_redac, $minute_redac);
+//
+// Gestion de l'agenda
+//
+Agenda_formulaire_article($id_article, $id_rubrique, $flag_editable);
+ 
+//
+// Liste des auteurs de l'article
+//
+
+echo "<a name='auteurs'></a>";
+
+if ($flag_editable AND $options == 'avancees') {
+	$bouton = bouton_block_invisible("auteursarticle");
+}
+
+debut_cadre_enfonce("auteur-24.gif", false, "", $bouton._T('texte_auteurs').aide ("artauteurs"));
+
+//
+// Recherche d'auteur
+//
+
+ $supprimer_bouton_creer_auteur = rechercher_auteurs_articles($cherche_auteur, $id_article, $id_rubrique, $ajout_auteur, $flag_editable, $nouv_auteur, $supp_auteur);
+
+//
+// Afficher les auteurs
+//
+
+$les_auteurs = afficher_auteurs_articles($id_article, $flag_editable);
+
+//
+// Ajouter un auteur
+//
+
+if ($flag_editable AND $options == 'avancees') 
+	ajouter_auteurs_articles($id_article, $id_rubrique, $les_auteurs, $flag_editable, $rubrique_article, $supprimer_bouton_creer_auteur);
+
+fin_cadre_enfonce(false);
+
+//
+// Liste des mots-cles de l'article
+//
+
+if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
+  formulaire_mots('articles', $id_article, $nouv_mot, $supp_mot, $cherche_mot, $flag_editable, generer_url_ecrire("articles","id_article=$id_article"));
+}
+
+ langues_articles($id_article, $langue_article, $flag_editable, $id_rubrique, $id_trad, $dir_lang, $nom_select, $lier_trad);
+
+
+afficher_statut_articles($id_article, $rubrique_article, $statut_article);
+
+
+ afficher_corps_articles($virtuel, $chapo, $texte, $ps, $extra);
+
+if ($flag_editable) {
+	echo "\n\n<div align='$spip_lang_right'><br />";
+	bouton_modifier_articles($id_article, $id_rubrique, $modif,_T('texte_travail_article', $modif), "warning-24.gif", "");
+	echo "</div>";
+}
+
+//
+// Documents associes a l'article
+//
+
+ if ($spip_display != 4)
+ afficher_documents_non_inclus($id_article, "article", $flag_editable);
+
+//
+// "Demander la publication"
+//
+
+
+if ($flag_auteur AND $statut_article == 'prepa') {
+	echo "<P>";
+	debut_cadre_relief();
+	echo	"<center>",
+		"<B>"._T('texte_proposer_publication')."</B>",
+		aide ("artprop"),
+		"\n<form method='post' action='",
+		generer_action_auteur("instituer", "article $id_article prop", generer_url_ecrire('articles', "id_article=$id_article", true)),
+      "'>",
+		"<input type='submit' class='fondo' value=\"", 
+		_T('bouton_demande_publication'),
+		"\" />\n",
+		"</form>",
+		"</center>";
+	fin_cadre_relief();
+}
+
+echo "</div>";
+
+echo "</div>";
+fin_cadre_relief();
+
+ affiche_forums_article($id_article, $id_rubrique, $titre, $debut);
+
+fin_page();
+
+}
+
+function boite_info_articles($id_article, $statut_article, $visites, $id_version)
+{
+  global $connect_statut, $options, $flag_revisions;
+
+	debut_boite_info();
+ 
+	echo "<div align='center'>\n";
+
+	echo "<font face='Verdana,Arial,Sans,sans-serif' size='1'><b>"._T('info_numero_article')."</b></font>\n";
+	echo "<br><font face='Verdana,Arial,Sans,sans-serif' size='6'><b>$id_article</b></font>\n";
+
+	voir_en_ligne ('article', $id_article, $statut_article);
+
+
+	$activer_statistiques = $GLOBALS['meta']["activer_statistiques"];
+
+	if ($connect_statut == "0minirezo" AND $statut_article == 'publie' AND $visites > 0 AND $activer_statistiques != "non" AND $options == "avancees"){
+	icone_horizontale(_T('icone_evolution_visites', array('visites' => $visites)), generer_url_ecrire("statistiques_visites","id_article=$id_article"), "statistiques-24.gif","rien.gif");
+}
+
+	if ((($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions)
+		AND $id_version>1 AND $options == "avancees") {
+	icone_horizontale(_T('info_historique_lien'), generer_url_ecrire("articles_versions","id_article=$id_article"), "historique-24.gif", "rien.gif");
+}
+
+	// Correction orthographique
+	if ($GLOBALS['meta']['articles_ortho'] == 'oui') {
+		$js_ortho = "onclick=\"window.open(this.href, 'spip_ortho', 'scrollbars=yes, resizable=yes, width=740, height=580'); return false;\"";
+		icone_horizontale(_T('ortho_verifier'), generer_url_ecrire("articles_ortho", "id_article=$id_article"), "ortho-24.gif", "rien.gif", 'echo', $js_ortho);
+	}
+
+	echo "</div>\n";
+	
+	fin_boite_info();
+}
+
+function boites_de_config_articles($id_article, $id_rubrique, $flag_editable,
+				   $change_accepter_forum, $change_petition,
+				   $email_unique, $site_obli, $site_unique,
+				   $message, $texte_petition,
+				   $changer_virtuel, $virtuel)
+{
+  global $connect_statut, $options, $spip_lang_right;
+
+// Logos de l'article
+
+	if ($id_article AND $flag_editable)
+	  afficher_boite_logo('art', 'id_article', $id_article,
+			      _T('logo_article').aide ("logoart"), _T('logo_survol'), 'articles');
+
+
+//
+// Boites de configuration avancee
+//
+
+	if ($options == "avancees" && $connect_statut=='0minirezo' && $flag_editable) {
+	  echo "<p>";
+	  debut_cadre_relief("forum-interne-24.gif");
+
+
+	list($nb_forums) = spip_fetch_array(spip_query("SELECT count(*) AS count FROM spip_forum WHERE id_article=$id_article 	AND statut IN ('publie', 'off', 'prop')"));
+
+	list($nb_signatures) = spip_fetch_array(spip_query("SELECT COUNT(*) AS count FROM spip_signatures WHERE id_article=$id_article AND statut IN ('publie', 'poubelle')"));
+
+	$visible = $change_accepter_forum || $change_petition
+		|| $nb_forums || $nb_signatures;
+
+	echo "<div class='verdana1' style='text-align: center;'><b>";
+	if ($visible)
+		echo bouton_block_visible("forumpetition");
+	else
+		echo bouton_block_invisible("forumpetition");
+	echo _T('bouton_forum_petition') .aide('confforums');
+	echo "</b></div>";
+	if ($visible)
+		echo debut_block_visible("forumpetition");
+	else
+		echo debut_block_invisible("forumpetition");
+
+
+	echo "<font face='Verdana,Arial,Sans,sans-serif' size='1'>\n";
+
+
+	// Forums
+
+	if ($nb_forums) {
+		echo "<br />\n";
+		icone_horizontale(_T('icone_suivi_forum', array('nb_forums' => $nb_forums)), generer_url_ecrire("articles_forum","id_article=$id_article"), "suivi-forum-24.gif", "");
+	}
+
+	// Reglage existant
+	$forums_publics = get_forums_publics($id_article);
+
+	// Modification du reglage ?
+	if (isset($change_accepter_forum)
+	AND $change_accepter_forum <> $forums_publics) {
+		$forums_publics = $change_accepter_forum;
+		modifier_forums_publics($id_article, $forums_publics);
+	}
+
+	// Afficher le formulaire de modification du reglage
+	echo formulaire_modification_forums_publics($id_article, $forums_publics, generer_url_ecrire("articles","id_article=$id_article"));
+
+
+	// Petitions
+
+	if ($change_petition) {
+		if ($change_petition == "on") {
+			if (!$email_unique) $email_unique = "non";
+			if (!$site_obli) $site_obli = "non";
+			if (!$site_unique) $site_unique = "non";
+			if (!$message) $message = "non";
+
+			$texte_petition = addslashes($texte_petition);
+
+			$result_pet = spip_query("REPLACE spip_petitions (id_article, email_unique, site_obli, site_unique, message, texte) VALUES ($id_article, '$email_unique', '$site_obli', '$site_unique', '$message', '$texte_petition')");
+		}
+		else if ($change_petition == "off") {
+			$result_pet = spip_query("DELETE FROM spip_petitions WHERE id_article=$id_article");
+		}
+	}
+
+	$petition = spip_fetch_array(spip_query("SELECT * FROM spip_petitions WHERE id_article=$id_article"));
+
+	$email_unique=$petition["email_unique"];
+	$site_obli=$petition["site_obli"];
+	$site_unique=$petition["site_unique"];
+	$message=$petition["message"];
+	$texte_petition=$petition["texte"];
+
+	echo generer_url_post_ecrire("articles","id_article=$id_article");
+
+	echo "<select name='change_petition'
+		class='fondl' style='font-size:10px;'
+		onChange=\"setvisibility('valider_petition', 'visible');\"
+		>\n";
+
+	if ($petition) {
+		$menu = array(
+			'on' => _T('bouton_radio_petition_activee'),
+			'off'=> _T('bouton_radio_supprimer_petition')
+		);
+		$val_menu = 'on';
+	} else {
+		$menu = array(
+			'off'=> _T('bouton_radio_pas_petition'),
+			'on' => _T('bouton_radio_activer_petition')
+		);
+		$val_menu = 'off';
+	}
+
+
+	foreach ($menu as $val => $desc) {
+		echo "<option";
+		if ($val_menu == $val)
+			echo " selected";
+		echo " value='$val'>".$desc."</option>\n";
+	}
+	echo "</select>\n";
+
+	if ($petition) {
+		if ($nb_signatures) {
+			echo "<br />\n";
+			icone_horizontale($nb_signatures.'&nbsp;'. _T('info_signatures'), generer_url_ecrire("controle_petition","id_article=$id_article"), "suivi-petition-24.gif", "");
+		}
+
+		echo "<br />\n";
+
+		if ($email_unique=="oui")
+			echo "<input type='checkbox' name='email_unique' value='oui' id='emailunique' checked>";
+		else
+			echo "<input type='checkbox' name='email_unique' value='oui' id='emailunique'>";
+		echo " <label for='emailunique'>"._T('bouton_checkbox_signature_unique_email')."</label><BR>";
+		if ($site_obli=="oui")
+			echo "<input type='checkbox' name='site_obli' value='oui' id='siteobli' checked>";
+		else
+			echo "<input type='checkbox' name='site_obli' value='oui' id='siteobli'>";
+		echo " <label for='siteobli'>"._T('bouton_checkbox_indiquer_site')."</label><BR>";
+		if ($site_unique=="oui")
+			echo "<input type='checkbox' name='site_unique' value='oui' id='siteunique' checked>";
+		else
+			echo "<input type='checkbox' name='site_unique' value='oui' id='siteunique'>";
+		echo " <label for='siteunique'>"._T('bouton_checkbox_signature_unique_site')."</label><BR>";
+		if ($message=="oui")
+			echo "<input type='checkbox' name='message' value='oui' id='message' checked>";
+		else
+			echo "<input type='checkbox' name='message' value='oui' id='message'>";
+		echo " <label for='message'>"._T('bouton_checkbox_envoi_message')."</label>";
+
+		echo "<P>"._T('texte_descriptif_petition')."&nbsp;:<BR>";
+		echo "<TEXTAREA NAME='texte_petition' CLASS='forml' ROWS='4' COLS='10' wrap=soft>";
+		echo entites_html($texte_petition);
+		echo "</TEXTAREA><P>\n";
+
+		echo "<P align='$spip_lang_right'>";
+	}
+
+	if (!$petition) echo "<span class='visible_au_chargement' id='valider_petition'>";
+	echo "<INPUT TYPE='submit' NAME='Changer' CLASS='fondo' VALUE='"._T('bouton_changer')."' STYLE='font-size:10px'>";
+	if (!$petition)  echo "</span>";
+	echo "</FORM>";
+
+	echo "</font>";
+	echo fin_block();
+
+	fin_cadre_relief();
+
+	// Redirection (article virtuel)
+	debut_cadre_relief("site-24.gif");
+	$visible = ($changer_virtuel || $virtuel);
+
+	echo "<div class='verdana1' style='text-align: center;'><b>";
+	if ($visible)
+		echo bouton_block_visible("redirection");
+	else
+		echo bouton_block_invisible("redirection");
+	echo _T('bouton_redirection');
+	echo aide ("artvirt");
+	echo "</b></div>";
+	if ($visible)
+		echo debut_block_visible("redirection");
+	else
+		echo debut_block_invisible("redirection");
+
+	echo generer_url_post_ecrire("articles", "id_article=$id_article");
+	echo "\n<INPUT TYPE='hidden' NAME='changer_virtuel' VALUE='oui'>";
+	$virtuelhttp = ($virtuel ? "" : "http://");
+
+	echo "<INPUT TYPE='text' NAME='virtuel' CLASS='formo' style='font-size:9px;' VALUE=\"$virtuelhttp$virtuel\" SIZE='40'><br>";
+	echo "<font face='Verdana,Arial,Sans,sans-serif' size=2>";
+	echo "(<b>"._T('texte_article_virtuel')."&nbsp;:</b> "._T('texte_reference_mais_redirige').")";
+	echo "</font>";
+	echo "<div align='$spip_lang_right'><INPUT TYPE='submit' NAME='Changer' CLASS='fondo' VALUE='"._T('bouton_changer')."' STYLE='font-size:10px'></div>";
+	echo "</form>";
+	echo fin_block();
+
+	fin_cadre_relief();
+ }
+
+//
+// Articles dans la meme rubrique
+//
+
+meme_rubrique_articles($id_rubrique, $id_article, $options);
+
+}
+
+function meme_rubrique_articles($id_rubrique, $id_article, $options, $order='articles.date', $limit=30)
+{
+	global $spip_lang_right, $spip_lang_left;
+
+	$vos_articles = spip_query("SELECT articles.id_article, articles.titre, articles.statut FROM spip_articles AS articles WHERE articles.id_rubrique='$id_rubrique' AND (articles.statut = 'publie' OR articles.statut = 'prop') AND articles.id_article != '$id_article' ORDER BY $order DESC LIMIT $limit");
+	if (spip_num_rows($vos_articles) > 0) {
+			echo "<div>&nbsp;</div>";
+			echo "<div class='bandeau_rubriques' style='z-index: 1;'>";
+			bandeau_titre_boite2(_T('info_meme_rubrique'), "article-24.gif");
+			echo "<div class='plan-articles'>";
+			while($row = spip_fetch_array($vos_articles)) {
+				$ze_article = $row['id_article'];
+				$ze_titre = typo($row['titre']);
+				$ze_statut = $row['statut'];
+				
+				if ($options == "avancees") {
+					$numero = "<div class='arial1' style='float: $spip_lang_right; color: black; padding-$spip_lang_left: 4px;'><b>"._T('info_numero_abbreviation')."$ze_article</b></div>";
+				}
+				echo "<a class='$ze_statut' style='font-size: 10px;' href='" . generer_url_ecrire("articles","id_article=$ze_article") . "'>$numero$ze_titre</a>";
+			}
+			echo "</div>";
+			echo "</div>";
+		}
+}
+
+function bouton_modifier_articles($id_article, $id_rubrique, $flag_modif, $mode, $ip, $im)
+{
+	if ($flag_modif) {
+	  icone(_T('icone_modifier_article'), generer_url_ecrire("articles_edit","id_article=$id_article"), $ip, $im);
+		echo "<font face='arial,helvetica,sans-serif' size='2'>$mode</font>";
+		echo aide("artmodif");
+	}
+	else {
+		icone(_T('icone_modifier_article'), generer_url_ecrire("articles_edit","id_article=$id_article"), "article-24.gif", "edit.gif");
+	}
+
+}
+
+function titres_articles($titre, $statut_article,$surtitre, $soustitre, $descriptif, $url_site, $nom_site, $flag_editable, $id_article, $id_rubrique)
+{
+	global  $dir_lang, $spip_lang_left, $connect_id_auteur;
+
+	$logo_statut = "puce-".puce_statut($statut_article).".gif";
+	
+	echo "\n<table cellpadding=0 cellspacing=0 border=0 width='100%'>";
+	echo "<tr width='100%'><td width='100%' valign='top'>";
+	
+	if ($surtitre) {
+		echo "<span $dir_lang><font face='arial,helvetica' size=3><b>";
+		echo typo($surtitre);
+		echo "</b></font></span>\n";
+	 }
+	 
+	gros_titre($titre, $logo_statut);
+	
+	if ($soustitre) {
+		echo "<span $dir_lang><font face='arial,helvetica' size=3><b>";
+		echo typo($soustitre);
+		echo "</b></font></span>\n";
+	}
+	
+	
+	if ($descriptif OR $url_site OR $nom_site) {
+		echo "<p><div align='$spip_lang_left' style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #e4e4e4;' $dir_lang>";
+		echo "<font size=2 face='Verdana,Arial,Sans,sans-serif'>";
+		$texte_case = ($descriptif) ? "{{"._T('info_descriptif')."}} $descriptif\n\n" : '';
+		$texte_case .= ($nom_site.$url_site) ? "{{"._T('info_urlref')."}} [".$nom_site."->".$url_site."]" : '';
+		echo propre($texte_case);
+		echo "</font>";
+		echo "</div>";
+	}
+	
+	
+	if ($statut_article == 'prop') {
+		echo "<P><FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=2 COLOR='red'><B>"._T('text_article_propose_publication')."</B></FONT></P>";
+	}
+	
+	echo "</td>";
+	
+	$flag_modif = false;
+	
+	if ($flag_editable) {
+		echo "<td>". http_img_pack('rien.gif', " ", "width='5'") . "</td>\n";
+		echo "<td align='center'>";
+	
+		// Recuperer les donnees de l'article
+		if ($GLOBALS['meta']['articles_modif'] != 'non') {
+			$result = spip_query("SELECT auteur_modif, UNIX_TIMESTAMP(date_modif) AS modification, UNIX_TIMESTAMP(NOW()) AS maintenant FROM spip_articles WHERE id_article='$id_article'");
+
+	
+			if ($row = spip_fetch_array($result)) {
+				$auteur_modif = $row["auteur_modif"];
+				$modification = $row["modification"];
+				$maintenant = $row["maintenant"];
+	
+				$date_diff = floor(($maintenant - $modification)/60);
+	
+				if ($date_diff >= 0 AND $date_diff < 60 AND $auteur_modif > 0 AND $auteur_modif != $connect_id_auteur) {
+					$result_auteur = spip_query("SELECT nom FROM spip_auteurs WHERE id_auteur='$auteur_modif'");
+
+					if ($row_auteur = spip_fetch_array($result_auteur)) {
+						$nom_auteur_modif = typo($row_auteur["nom"]);
+					}
+					$modif = array('nom_auteur_modif' => $nom_auteur_modif, 'date_diff' => $date_diff);
+				}
+			}
+		}
+		bouton_modifier_articles($id_article, $id_rubrique, $modif, _T('avis_article_modifie', $modif), "article-24.gif", "edit.gif");
+	
+		echo "</td>";
+	 }
+	echo "</tr></table>\n";
+	echo "<div>&nbsp;</div>";
+	return $modif;
+}
+
+
+function dates_articles($id_article, $id_rubrique, $flag_editable, $statut_article, $date, $annee, $mois, $jour, $heure, $minute, $date_redac, $annee_redac, $mois_redac, $jour_redac, $heure_redac, $minute_redac)
+{
+
+  global $spip_lang_left, $spip_lang_right, $options;
+
+  if ($flag_editable AND $options == 'avancees') {
+	debut_cadre_couleur();
+
+	echo generer_url_post_ecrire("articles", "id_article=$id_article");
+
+	if ($statut_article == 'publie') {
+
+		echo "<div><b>";
+		echo bouton_block_invisible("datepub");
+		echo "<span class='verdana1'>"._T('texte_date_publication_article').'</span> ';
+		echo majuscules(affdate($date)),
+			"</b>".aide('artdate')."</div>";
+
+		echo debut_block_invisible("datepub"),
+		  "<div style='margin: 5px; margin-$spip_lang_left: 20px;'>",
+		  afficher_jour($jour, "name='jour' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\"", true),
+		  afficher_mois($mois, "name='mois' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\"", true),
+		  afficher_annee($annee, "name='annee' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\""),
+		  ' - ',
+		  afficher_heure($heure, "name='heure' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\""),
+		  afficher_minute($minute, "name='minute' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\""),
+		  "<span class='visible_au_chargement' id='valider_date'>",
+		  " &nbsp; <INPUT TYPE='submit' NAME='Changer' CLASS='fondo' VALUE='"._T('bouton_changer')."'>",
+		  "</span>",
+		  "</div>",
+		  fin_block();
+	}
+	else {
+		echo "<div><b> <span class='verdana1'>"._T('texte_date_creation_article').'</span> ';
+		echo majuscules(affdate($date))."</b>".aide('artdate')."</div>";
+	}
+
+	$possedeDateRedac=($annee_redac.'-'.$mois_redac.'-'.$jour_redac != '0000-00-00');
+	if (($options == 'avancees' AND $GLOBALS['meta']["articles_redac"] != 'non')
+	OR $possedeDateRedac) {
+		if ($possedeDateRedac)
+			$date_affichee = majuscules(affdate($date_redac))
+#			." " ._T('date_fmt_heures_minutes', array('h' =>$heure_redac, 'm'=>$minute_redac))
+			;
+		else
+			$date_affichee = majuscules(_T('jour_non_connu_nc'));
+
+		echo "<div><b>";
+		echo bouton_block_invisible('dateredac');
+		echo "<span class='verdana1'>"
+			. majuscules(_T('texte_date_publication_anterieure'))
+			.'</span> '. $date_affichee ." ".aide('artdate_redac')."</b></div>";
+
+		echo debut_block_invisible('dateredac');
+		echo "<div style='margin: 5px; margin-$spip_lang_left: 20px;'>";
+		echo '<table cellpadding="0" cellspacing="0" border="0" width="100%">';
+		echo '<tr><td align="$spip_lang_left">';
+		echo '<input type="radio" name="avec_redac" value="non" id="avec_redac_on"';
+		if (!$possedeDateRedac) echo ' checked="checked"';
+		echo " onClick=\"setvisibility('valider_date_prec', 'visible')\"";
+		echo ' /> <label for="avec_redac_on">'._T('texte_date_publication_anterieure_nonaffichee').'</label>';
+		echo '<br /><input type="radio" name="avec_redac" value="oui" id="avec_redac_off"';
+		if ($possedeDateRedac) echo ' checked="checked"';
+		echo " onClick=\"setvisibility('valider_date_prec', 'visible')\"";
+		echo ' /> <label for="avec_redac_off">'._T('bouton_radio_afficher').' :</label> ',
+		afficher_jour($jour_redac, "name='jour_redac' class='fondl' onChange=\"setvisibility('valider_date_prec', 'visible')\"", true),
+		afficher_mois($mois_redac, "name='mois_redac' class='fondl' onChange=\"setvisibility('valider_date_prec', 'visible')\"", true);
+		echo "<input type='text' name='annee_redac' class='fondl' value='".$annee_redac."' size='5' maxlength='4' onClick=\"setvisibility('valider_date_prec', 'visible')\"/>";
+
+		echo '<div align="center">',
+		afficher_heure($heure_redac, "name='heure_redac' class='fondl' onChange=\"setvisibility('valider_date_prec', 'visible')\"", true),
+		afficher_minute($minute_redac, "name='minute_redac' class='fondl' onChange=\"setvisibility('valider_date_prec', 'visible')\"", true),
+		"</div>\n";
+
+		echo '</td><td align="$spip_lang_right">';
+		echo "<span class='visible_au_chargement' id='valider_date_prec'>";
+		echo '<input type="submit" name="Changer" class="fondo" value="'._T('bouton_changer').'" />';
+		echo "</span>";
+		echo '</td></tr>';
+		echo '</table>';
+		echo "</div>";
+		echo fin_block();
+	}
+
+	echo "</FORM>";
+	fin_cadre_couleur();
+ }
+else {
+	if ($statut_article == 'publie') $texte_date = _T('texte_date_publication_article');
+	else $texte_date = _T('texte_date_creation_article');
+
+	debut_cadre_couleur();
+		echo "<div style='text-align:center;'><b> <span class='verdana1'>$texte_date</span> ";
+		echo majuscules(affdate($date))."</b>".aide('artdate')."</div>";
+
+
+		if ($annee_redac.'-'.$mois_redac.'-'.$jour_redac != '0000-00-00') {
+			$date_affichee = ' : '.majuscules(affdate($date_redac));		
+			echo "<div style='text-align:center;'><b> <span class='verdana1'>"._T(texte_date_publication_anterieure)."</span> ";
+			echo $date_affichee."</b>".aide('artdate_redac')."</div>";
+		}
+
+	fin_cadre_couleur();
+ }
+}
+
+
+function langues_articles($id_article, $langue_article, $flag_editable, $id_rubrique, $id_trad, $dir_lang, $nom_select, $lier_trad)
+{
+
+  global $connect_statut, $couleur_claire, $options, $connect_toutes_rubriques;
+
+  if (($GLOBALS['meta']['multi_articles'] == 'oui')
+	OR (($GLOBALS['meta']['multi_rubriques'] == 'oui') AND ($GLOBALS['meta']['gerer_trad'] == 'oui'))) {
+
+	list($langue_article) = spip_fetch_array(spip_query("SELECT lang FROM spip_articles WHERE id_article=$id_article"));
+
+	if ($GLOBALS['meta']['gerer_trad'] == 'oui')
+		$titre_barre = _T('titre_langue_trad_article');
+	else
+		$titre_barre = _T('titre_langue_article');
+
+	$titre_barre .= "&nbsp; (".traduire_nom_langue($langue_article).")";
+
+	debut_cadre_enfonce('langues-24.gif', false, "", bouton_block_invisible('languesarticle,ne_plus_lier,lier_traductions').$titre_barre);
+
+
+	// Choix langue article
+	if ($GLOBALS['meta']['multi_articles'] == 'oui' AND $flag_editable) {
+		echo debut_block_invisible('languesarticle');
+
+		$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
+		$langue_parent = $row['lang'];
+
+		debut_cadre_couleur();
+		echo "<div style='text-align: center;'>";
+		echo menu_langues('changer_lang', $langue_article, _T('info_multi_cet_article').' ', $langue_parent);
+		echo "</div>\n";
+		fin_cadre_couleur();
+
+		echo fin_block();
+	}
+
+
+	// Gerer les groupes de traductions
+	if ($GLOBALS['meta']['gerer_trad'] == 'oui') {
+		if ($flag_editable AND _request('supp_trad') == 'oui') { // Ne plus lier a un groupe de trad
+			spip_query("UPDATE spip_articles SET id_trad=0, date_modif=NOW() WHERE id_article = $id_article");
+
+			// Verifier si l'ancien groupe ne comporte plus qu'un seul article. Alors mettre a zero.
+			$result_autres_trad= spip_query("SELECT COUNT(id_article) AS total FROM spip_articles WHERE id_trad = $id_trad");
+			if ($row = spip_fetch_array($result_autres_trad))
+				$nombre_autres_trad = $row["total"];
+			if ($nombre_autres_trad == 1)
+				spip_query("UPDATE spip_articles SET id_trad = 0, date_modif=NOW() WHERE id_trad = $id_trad");
+
+			$id_trad = 0;
+		}
+
+		// Changer article de reference de la trad
+		if ($id_trad_new = intval($id_trad_new)
+		AND $id_trad_old = intval($id_trad_old)
+		AND $connect_statut=='0minirezo'
+		AND $connect_toutes_rubriques) { 
+			spip_query("UPDATE spip_articles SET id_trad = $id_trad_new, date_modif=NOW() WHERE id_trad = $id_trad_old");
+			$id_trad = $id_trad_new;
+		}
+
+		if ($flag_editable AND $lier_trad > 0) { // Lier a un groupe de trad
+			$result_lier = spip_query("SELECT id_trad FROM spip_articles WHERE id_article=$lier_trad");
+
+			if ($row = spip_fetch_array($result_lier)) {
+				$id_lier = $row['id_trad'];
+
+				if ($id_lier == 0) { // Si l'article vise n'a pas deja de traduction, creer nouveau id_trad
+					$nouveau_trad = $lier_trad;
+				}
+				else {
+					if ($id_lier == $id_trad) $err = "<div>"._T('trad_deja_traduit')."</div>";
+					$nouveau_trad = $id_lier;
+				}
+
+				spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad, date_modif=NOW() WHERE id_article = $lier_trad");
+				if ($id_lier > 0) spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad, date_modif=NOW() WHERE id_trad = $id_lier");
+				spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad, date_modif=NOW() WHERE id_article = $id_article");
+				if ($id_trad > 0) spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad, date_modif=NOW() WHERE id_trad = $id_trad");
+
+				$id_trad = $nouveau_trad;
+			}
+			else
+				$err .= "<div>"._T('trad_article_inexistant')."</div>";
+
+			if ($err) echo "<font color='red' size=2' face='verdana,arial,helvetica,sans-serif'>$err</font>";
+		}
+
+
+		// Afficher la liste des traductions
+		if ($id_trad != 0) {
+			$result_trad = spip_query("SELECT id_article, id_rubrique, titre, lang, statut FROM spip_articles WHERE id_trad = $id_trad");
+			
+			$table='';
+			while ($row = spip_fetch_array($result_trad)) {
+				$vals = '';
+				$id_article_trad = $row["id_article"];
+				$id_rubrique_trad = $row["id_rubrique"];
+				$titre_trad = $row["titre"];
+				$lang_trad = $row["lang"];
+				$statut_trad = $row["statut"];
+
+				changer_typo($lang_trad);
+				$titre_trad = "<span $dir_lang>$titre_trad</span>";
+
+				if ($ifond == 1) {
+					$ifond = 0;
+					$bgcolor = "white";
+				} else {
+					$ifond = 1;
+					$bgcolor = $couleur_claire;
+				}
+
+
+				$vals[] = http_img_pack("puce-".puce_statut($statut_trad).'.gif', "", "width='7' height='7' border='0' NAME='statut'");
+				
+				if ($id_article_trad == $id_trad) {
+				  $vals[] = http_img_pack('langues-12.gif', "", "width='12' height='12' border='0'");
+					$titre_trad = "<b>$titre_trad</b>";
+				} else {
+				  if ($connect_statut=='0minirezo'
+				  AND $connect_toutes_rubriques)
+				  	$vals[] = "<a href='" . generer_url_ecrire("articles","id_article=$id_article&id_trad_old=$id_trad&id_trad_new=$id_article_trad&id_rubrique=$id_rubrique_trad") . "'>". 
+				    http_img_pack('langues-off-12.gif', _T('trad_reference'), "width='12' height='12' border='0'", _T('trad_reference')) . "</a>";
+				  else $vals[] = http_img_pack('langues-off-12.gif', "", "width='12' height='12' border='0'");
+				}
+
+				$ret .= "</td>";
+
+				$s = typo($titre_trad);
+				if ($id_article_trad != $id_article) 
+					$s = "<a href='" . generer_url_ecrire("articles","id_article=$id_article_trad&id_rubrique=$id_rubrique_trad") . "'>$s</a>";
+				if ($id_article_trad == $id_trad)
+					$s .= " "._T('trad_reference');
+
+				$vals[] = $s;
+				$vals[] = traduire_nom_langue($lang_trad);
+				$table[] = $vals;
+			}
+
+			// changer_typo($spip_lang); (probleme d'affichage rtl?)
+
+			// bloc traductions
+			if (count($vals) > 0) {
+
+				echo "<div class='liste'>";
+				bandeau_titre_boite2(_T('trad_article_traduction'),'');
+				echo "<table width='100%' cellspacing='0' border='0' cellpadding='2'>";
+				//echo "<tr bgcolor='#eeeecc'><td colspan='4' class='serif2'><b>"._T('trad_article_traduction')."</b></td></tr>";
+
+				$largeurs = array(7, 12, '', 100);
+				$styles = array('', '', 'arial2', 'arial2');
+				afficher_liste($largeurs, $table, $styles);
+
+				echo "</table>";
+				echo "</div>";
+
+			}
+
+			changer_typo($langue_article);
+		}
+
+		echo debut_block_invisible('lier_traductions');
+
+		echo "<table width='100%'><tr>";
+		if ($flag_editable AND $options == "avancees" AND !$ret) {
+			// Formulaire pour lier a un article
+			echo "<td class='arial2' width='60%'>";
+
+			echo "<form action='" . generer_url_ecrire("articles","id_article=$id_article") . "' method='post' style='margin:0px; padding:0px;'>";
+			echo _T('trad_lier');
+			echo "<div align='$spip_lang_right'><input type='text' class='fondl' name='lier_trad' size='5'> <INPUT TYPE='submit' NAME='Valider' VALUE='"._T('bouton_valider')."' CLASS='fondl'></div>";
+			echo "</form>";
+			echo "</td>\n";
+			echo "<td background='' width='10'> &nbsp; </td>";
+			echo "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>";
+			echo "<td background='' width='10'> &nbsp; </td>";
+		}
+		echo "<td>";
+		icone_horizontale(_T('trad_new'), generer_url_ecrire("articles_edit","new=oui&lier_trad=$id_article&id_rubrique=$id_rubrique"), "traductions-24.gif", "creer.gif");
+		echo "</td>";
+		if ($flag_editable AND $options == "avancees" AND $ret) {
+			echo "<td background='' width='10'> &nbsp; </td>";
+			echo "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>";
+			echo "<td background='' width='10'> &nbsp; </td>";
+			echo "<td>";
+			icone_horizontale(_T('trad_delier'), generer_url_ecrire("articles","id_article=$id_article&supp_trad=oui"), "traductions-24.gif", "supprimer.gif");
+			echo "</td>\n";
+		}
+
+		echo "</tr></table>";
+
+		echo fin_block();
+	}
+
+	fin_cadre_enfonce();
+  }
+}
+
+function add_auteur_article($id_article, $nouv_auteur)
+{
+	$res = spip_query("SELECT id_article FROM spip_auteurs_articles WHERE id_auteur='$nouv_auteur' AND id_article='$id_article'");
+	if (!spip_num_rows($res))
+		spip_abstract_insert('spip_auteurs_articles', "(id_auteur,id_article)", "('$nouv_auteur','$id_article')");
+}
+
+function rechercher_auteurs_articles($cherche_auteur, $id_article, $id_rubrique, $ajout_auteur, $flag_editable, $nouv_auteur, $supp_auteur)
+{
+  global $spip_lang_left;
+
+  $supprimer_bouton_creer_auteur = false;
+
+  if ($cherche_auteur) {
+	echo "<P ALIGN='$spip_lang_left'>";
+	$result = spip_query("SELECT id_auteur, nom FROM spip_auteurs");
+	$table_auteurs = array();
+	$table_ids = array();
+	while ($row = spip_fetch_array($result)) {
+		$table_auteurs[] = $row["nom"];
+		$table_ids[] = $row["id_auteur"];
+	}
+	$resultat = mots_ressemblants($cherche_auteur, $table_auteurs, $table_ids);
+	debut_boite_info();
+	if (!$resultat) {
+		echo "<B>"._T('texte_aucun_resultat_auteur', array('cherche_auteur' => $cherche_auteur)).".</B><BR>";
+	}
+	else if (count($resultat) == 1) {
+		$ajout_auteur = 'oui';
+		list(, $nouv_auteur) = each($resultat);
+		echo "<B>"._T('texte_ajout_auteur')."</B><BR>";
+		$result = spip_query("SELECT * FROM spip_auteurs WHERE id_auteur=$nouv_auteur");
+		echo "<UL>";
+		while ($row = spip_fetch_array($result)) {
+			$id_auteur = $row['id_auteur'];
+			$nom_auteur = $row['nom'];
+			$email_auteur = $row['email'];
+			$bio_auteur = $row['bio'];
+
+			echo "<LI><FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=2><B><FONT SIZE=3>".typo($nom_auteur)."</FONT></B>";
+			echo "</FONT>\n";
+		}
+		echo "</UL>";
+	}
+	else if (count($resultat) < 16) {
+		reset($resultat);
+		$les_auteurs = array();
+		while (list(, $id_auteur) = each($resultat)) $les_auteurs[] = $id_auteur;
+		if ($les_auteurs) {
+			$les_auteurs = join(',', $les_auteurs);
+			echo "<B>"._T('texte_plusieurs_articles', array('cherche_auteur' => $cherche_auteur))."</B><BR>";
+			$result = spip_query("SELECT * FROM spip_auteurs WHERE id_auteur IN ($les_auteurs) ORDER BY nom");
+
+			echo "<UL class='verdana1'>";
+			while ($row = spip_fetch_array($result)) {
+				$id_auteur = $row['id_auteur'];
+				$nom_auteur = $row['nom'];
+				$email_auteur = $row['email'];
+				$bio_auteur = $row['bio'];
+
+				echo "<li><b>".typo($nom_auteur)."</b>";
+
+				if ($email_auteur) echo " ($email_auteur)";
+				echo " | <A href='", generer_url_ecrire('articles', "id_article=$id_article&ajout_auteur=oui&nouv_auteur=$id_auteur#auteurs"),
+				  "'>",_T('lien_ajouter_auteur'),"</A>";
+
+				if (trim($bio_auteur)) {
+					echo "<br />".couper(propre($bio_auteur), 100)."\n";
+				}
+				echo "</li>\n";
+			}
+			echo "</UL>";
+		}
+	}
+	else {
+		echo "<B>"._T('texte_trop_resultats_auteurs', array('cherche_auteur' => $cherche_auteur))."</B><BR>";
+	}
+
+	if ($GLOBALS['connect_statut'] == '0minirezo' 
+	AND $GLOBALS['connect_toutes_rubriques']) {
+
+		echo "<div style='width: 200px;'>";
+		$retour = rawurlencode(generer_url_ecrire("articles","id_article=$id_article"));
+		$titre = rawurlencode($cherche_auteur);
+		icone_horizontale(_T('icone_creer_auteur'), generer_url_ecrire("auteur_infos","ajouter_id_article=$id_article&nom=$titre&redirect=$retour"), "redacteurs-24.gif", "creer.gif");
+		echo "</div> ";
+
+		// message pour ne pas afficher le second bouton "creer un auteur"
+		$supprimer_bouton_creer_auteur = true;
+	}
+
+	fin_boite_info();
+	echo "<P>";
+
+  }
+
+//
+// Appliquer les modifications sur les auteurs
+//
+
+  if ($ajout_auteur && $flag_editable) {
+	if ($nouv_auteur > 0) {
+		add_auteur_article($id_article, $nouv_auteur);
+	}
+
+	if ($GLOBALS['meta']['activer_moteur'] == 'oui') {
+		include_spip("inc/indexation");
+		marquer_indexer('article', $id_article);
+	}
+  }
+
+
+  if ($supp_auteur && $flag_editable) {
+	spip_query("DELETE FROM spip_auteurs_articles WHERE id_auteur='$supp_auteur' AND id_article='$id_article'");
+
+	if ($GLOBALS['meta']['activer_moteur'] == 'oui') {
+		include_spip("inc/indexation");
+		marquer_indexer('article', $id_article);
+	}
+  }
+
+  return $supprimer_bouton_creer_auteur;
+}
+
+function afficher_auteurs_articles($id_article, $flag_editable)
+{
+	global $connect_statut, $options,$connect_id_auteur;
+
+	$les_auteurs = array();
+
+	$result = spip_query("SELECT * FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE auteurs.id_auteur=lien.id_auteur AND lien.id_article=$id_article GROUP BY auteurs.id_auteur ORDER BY auteurs.nom");
+
+	if (spip_num_rows($result)) {
+		echo "<div class='liste'>";
+		echo "<table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>";
+		$table = array();
+		while ($row = spip_fetch_array($result)) {
+			$vals = array();
+			$id_auteur = $row["id_auteur"];
+			$nom_auteur = $row["nom"];
+			$email_auteur = $row["email"];
+			if ($bio_auteur = attribut_html(propre(couper($row["bio"], 100))))
+			  $bio_auteur = " TITLE=\"$bio_auteur\"";
+			$url_site_auteur = $row["url_site"];
+			$statut_auteur = $row["statut"];
+			if ($row['messagerie'] == 'non' OR $row['login'] == '') $messagerie = 'non';
+			
+			$les_auteurs[] = $id_auteur;
+
+			if ($connect_statut == "0minirezo") $aff_articles = "('prepa', 'prop', 'publie', 'refuse')";
+			else $aff_articles = "('prop', 'publie')";
+
+			$result2 = spip_query("SELECT COUNT(articles.id_article) AS compteur FROM spip_auteurs_articles AS lien, spip_articles AS articles WHERE lien.id_auteur=$id_auteur AND articles.id_article=lien.id_article AND articles.statut IN $aff_articles GROUP BY lien.id_auteur");
+
+			if ($result2) list($nombre_articles) = spip_fetch_array($result2);
+			else $nombre_articles = 0;
+
+			$vals[] = bonhomme_statut($row);
+
+			$vals[] = "<A href='" . generer_url_ecrire('auteurs_edit', "id_auteur=$id_auteur") . "' $bio_auteur>".typo($nom_auteur)."</A>";
+
+			$vals[] = bouton_imessage($id_auteur);
+
+		
+		
+		if ($email_auteur) $vals[] =  "<A href='mailto:$email_auteur'>"._T('email')."</A>";
+		else $vals[] =  "&nbsp;";
+
+		if ($url_site_auteur) $vals[] =  "<A href='$url_site_auteur'>"._T('info_site_min')."</A>";
+		else $vals[] =  "&nbsp;";
+
+		if ($nombre_articles > 1) $vals[] =  $nombre_articles.' '._T('info_article_2');
+		else if ($nombre_articles == 1) $vals[] =  _T('info_1_article');
+		else $vals[] =  "&nbsp;";
+
+		if ($flag_editable AND ($connect_id_auteur != $id_auteur OR $connect_statut == '0minirezo') AND $options == 'avancees') {
+		  $vals[] =  "<A href='" . generer_url_ecrire("articles","id_article=$id_article&supp_auteur=$id_auteur#auteurs") . "'>"._T('lien_retirer_auteur')."&nbsp;". http_img_pack('croix-rouge.gif', "X", "width='7' height='7' border='0' align='middle'") . "</A>";
+		} else {
+			$vals[] = "";
+		}
+		
+		$table[] = $vals;
+		}
+	
+	
+	$largeurs = array('14', '', '', '', '', '', '');
+	$styles = array('arial11', 'arial2', 'arial11', 'arial11', 'arial11', 'arial11', 'arial1');
+	afficher_liste($largeurs, $table, $styles);
+
+	
+	echo "</table></div>\n";
+
+	$les_auteurs = join(',', $les_auteurs);
+	}
+	return $les_auteurs ;
+}
+
+
+function ajouter_auteurs_articles($id_article, $id_rubrique, $les_auteurs, $flag_editable, $rubrique_article, $supprimer_bouton_creer_auteur)
+{
+	global $connect_toutes_rubriques, $connect_statut, $couleur_claire ;
+
+	echo debut_block_invisible("auteursarticle");
+	echo "<table width='100%'><tr>";
+
+	if ($connect_statut == '0minirezo'
+	    AND $connect_toutes_rubriques
+	    AND !$supprimer_bouton_creer_auteur) {
+	echo "<td width='200'>";
+	$retour = rawurlencode(generer_url_ecrire("articles","id_article=$id_article"));
+	icone_horizontale(_T('icone_creer_auteur'), generer_url_ecrire("auteur_infos","ajouter_id_article=$id_article&redirect=$retour"), "redacteurs-24.gif", "creer.gif");
+	echo "</td>";
+	echo "<td width='20'>&nbsp;</td>";
+	}
+
+	echo "<td>";
+
+	$result = spip_query("SELECT * FROM spip_auteurs WHERE " .
+			(!$les_auteurs ? '' : "id_auteur NOT IN ($les_auteurs) AND ") .
+			"statut!='5poubelle' AND statut!='6forum' AND statut!='nouveau' ORDER BY statut, nom");
+
+	$num = spip_num_rows($result);
+	if ($num) {
+		echo generer_url_post_ecrire("articles", "id_article=$id_article");;
+		echo "<span class='verdana1'><B>"._T('titre_cadre_ajouter_auteur')."&nbsp; </B></span>\n";
+		echo "<DIV><INPUT TYPE='Hidden' NAME='id_article' VALUE=\"$id_article\">";
+
+		if ($num > 200) {
+			echo "<INPUT TYPE='text' NAME='cherche_auteur' onClick=\"setvisibility('valider_ajouter_auteur','visible');\" CLASS='fondl' VALUE='' SIZE='20'>";
+			echo "<span  class='visible_au_chargement' id='valider_ajouter_auteur'>";
+			echo " <INPUT TYPE='submit' NAME='Chercher' VALUE='"._T('bouton_chercher')."' CLASS='fondo'>";
+			echo "</span>";
+		} else {
+			echo "<INPUT TYPE='Hidden' NAME='ajout_auteur' VALUE='oui'>";
+			echo "<SELECT NAME='nouv_auteur' SIZE='1' STYLE='width:150px;' CLASS='fondl' onChange=\"setvisibility('valider_ajouter_auteur','visible');\">";
+			while ($row = spip_fetch_array($result)) {
+				$id_auteur = $row["id_auteur"];
+				$nom = $row["nom"];
+				$email = $row["email"];
+				$statut = $row["statut"];
+
+				$statut=str_replace("0minirezo", _T('info_administrateurs'), $statut);
+				$statut=str_replace("1comite", _T('info_redacteurs'), $statut);
+				$statut=str_replace("6visiteur", _T('info_visiteurs'), $statut);
+				
+				$premiere = strtoupper(substr(trim($nom), 0, 1));
+
+				if ($connect_statut != '0minirezo')
+					if ($p = strpos($email, '@'))
+					  $email = substr($email, 0, $p).'@...';
+				if ($email)
+					$email = " ($email)";
+
+				if ($statut != $statut_old) {
+					echo "\n<OPTION VALUE=\"x\">";
+					echo "\n<OPTION VALUE=\"x\" style='background-color: $couleur_claire;'> $statut";
+				}
+
+				if ($premiere != $premiere_old AND ($statut != _T('info_administrateurs') OR !$premiere_old)) {
+				  echo "\n<OPTION VALUE=\"x\">";
+				}
+
+				
+				echo "\n<OPTION VALUE=\"$id_auteur\">&nbsp;&nbsp;&nbsp;&nbsp;", supprimer_tags(couper(typo("$nom$email"), 40));
+				$statut_old = $statut;
+				$premiere_old = $premiere;
+			}
+			
+			echo "</SELECT>",
+				"<span  class='visible_au_chargement' id='valider_ajouter_auteur'>",
+				" <input type='submit' value="._T('bouton_ajouter')." CLASS='fondo'>",
+				"</span>";
+		}
+		echo "</div></FORM>";
+	}
+	
+	echo "</td></tr></table>";
+
+	echo fin_block();
+}
+
+function afficher_corps_articles($virtuel, $chapo, $texte, $ps,  $extra)
+{
+  global $revision_nbsp, $activer_revision_nbsp, $champs_extra, $les_notes, $dir_lang;
+
+	echo "\n\n<div align='justify' style='padding: 10px;'>";
+
+	if ($virtuel) {
+		debut_boite_info();
+		echo _T('info_renvoi_article')." ".propre("<center>[->$virtuel]</center>");
+		fin_boite_info();
+	} else {
+		$revision_nbsp = $activer_revision_nbsp;
+
+		if (strlen($chapo) > 0) {
+			echo "<div $dir_lang><b>";
+			echo propre($chapo);
+			echo "</b></div>\n\n";
+		}
+
+		echo "<div $dir_lang>";
+#	echo reduire_image(propre($texte), 500,10000);
+		echo propre($texte);
+		echo "<br clear='both' />";
+		echo "</div>";
+
+		if ($ps) {
+			echo debut_cadre_enfonce();
+			echo "<div $dir_lang><font style='font-family:Verdana,Arial,Sans,sans-serif; font-size: small;'>";
+			echo justifier("<b>"._T('info_ps')."</b> ".propre($ps));
+			echo "</font></div>";
+			echo fin_cadre_enfonce();
+		}
+		$revision_nbsp = false;
+
+		if ($les_notes) {
+			echo debut_cadre_relief();
+			echo "<div $dir_lang class='arial11'>";
+			echo justifier("<b>"._T('info_notes')."&nbsp;:</b> ".$les_notes);
+			echo "</div>";
+			echo fin_cadre_relief();
+		}
+		
+		if ($champs_extra AND $extra) {
+			include_spip('inc/extra');
+			extra_affichage($extra, "articles");
+		}
+	}
+}
+
+function affiche_forums_article($id_article, $id_rubrique, $titre, $debut, $mute=false)
+{
+  global $spip_lang_left;
+
+  echo "<BR><BR>";
+
+  $forum_retour = generer_url_ecrire("articles","id_article=$id_article", true);
+  
+  if (!$mute) {
+    $tm = rawurlencode($titre);
+    echo "\n<div align='center'>";
+    icone(_T('icone_poster_message'), generer_url_ecrire("forum_envoi","statut=prive&adresse_retour=" . rawurlencode($forum_retour) . "&id_article=$id_article&titre_message=$tm"), "forum-interne-24.gif", "creer.gif");
+    echo "</div>";
+  }
+
+  echo "<P align='$spip_lang_left'>";
+
+  $result_forum = spip_query("SELECT COUNT(*) AS cnt FROM spip_forum WHERE statut='prive' AND id_article='$id_article' AND id_parent=0");
+
+  $total = 0;
+  if ($row = spip_fetch_array($result_forum)) $total = $row["cnt"];
+
+  if (!$debut) $debut = 0;
+  $total_afficher = 8;
+  if ($total > $total_afficher) {
+	echo "<div class='serif2' align='center'>";
+	for ($i = 0; $i < $total; $i = $i + $total_afficher){
+		$y = $i + $total_afficher - 1;
+		if ($i == $debut)
+			echo "<FONT SIZE=3><B>[$i-$y]</B></FONT> ";
+		else
+			echo "[<A href='" . generer_url_ecrire("articles","id_article=$id_article&debut=$i") . "'>$i-$y</A>] ";
+	}
+	echo "</div>";
+}
+
+	$result_forum = spip_query("SELECT * FROM spip_forum WHERE statut='prive' AND id_article='$id_article' AND id_parent=0 ORDER BY date_heure DESC" .
+#				   " LIMIT $total_afficher OFFSET $debut" # PG
+				   " LIMIT $debut,$total_afficher"
+				   ); 
+
+	afficher_forum($result_forum, $forum_retour, $mute);
+
+	if (!$debut) $debut = 0;
+	$total_afficher = 8;
+	if ($total > $total_afficher) {
+	  echo "<div class='serif2' align='center'>";
+	  for ($i = 0; $i < $total; $i = $i + $total_afficher){
+		$y = $i + $total_afficher - 1;
+		if ($i == $debut)
+			echo "<FONT SIZE=3><B>[$i-$y]</B></FONT> ";
+		else
+			echo "[<A href='" . generer_url_ecrire("articles","id_article=$id_article&debut=$i") . "'>$i-$y</A>] ";
+	  }
+	  echo "</div>";
+	}
+
+	echo "</div>\n";
+}
+
+function afficher_statut_articles($id_article, $rubrique_article, $statut_article)
+{
+  global $connect_statut;
+
+  if ($connect_statut == '0minirezo' AND acces_rubrique($rubrique_article)) {
+  	
+    echo "\n<form method='post' action='",
+      generer_action_auteur("instituer", "article $id_article", generer_url_ecrire('articles', "id_article=$id_article", true)),
+      "'>",
+	  debut_cadre_relief("", true),
+      "\n<center>", "<B>",_T('texte_article_statut'),"</B>",
+	  "\n<SELECT NAME='statut_nouv' SIZE='1' CLASS='fondl'\n",
+	  "onChange=\"document.statut.src='",
+	  _DIR_IMG_PACK,
+	  "' + puce_statut(options[selectedIndex].value);",
+	  " setvisibility('valider_statut', 'visible');\">\n",
+	 "<OPTION" , mySel("prepa", $statut_article) ," style='background-color: white'>",_T('texte_statut_en_cours_redaction'),"</OPTION>\n",
+	 "<OPTION" , mySel("prop", $statut_article) , " style='background-color: #FFF1C6'>",_T('texte_statut_propose_evaluation'),"</OPTION>\n",
+	 "<OPTION" , mySel("publie", $statut_article) , " style='background-color: #B4E8C5'>",_T('texte_statut_publie'),"</OPTION>\n",
+	 "<OPTION" , mySel("poubelle", $statut_article),
+	   http_style_background('rayures-sup.gif') , '>' ,_T('texte_statut_poubelle'),"</OPTION>\n",
+	 "<OPTION" , mySel("refuse", $statut_article) , " style='background-color: #FFA4A4'>",_T('texte_statut_refuse'),"</OPTION>\n",
+	  "</SELECT>",
+	  " &nbsp; ",
+	  http_img_pack("puce-".puce_statut($statut_article).'.gif', "", "border='0' NAME='statut'"),
+	  "  &nbsp;\n";
+
+	echo "<span class='visible_au_chargement' id='valider_statut'>";
+	echo "<INPUT TYPE='submit' VALUE='"._T('bouton_valider')."' CLASS='fondo'>";
+	echo "</span>";
+	echo aide("artstatut");
+	echo "</center>";
+	fin_cadre_relief();
+	echo "\n</form>";
+ }
+}
+
+//
+// Reunit les textes decoupes parce que trop longs
+//
+
+function trop_longs_articles($texte_plus)
+{
+	$nb_texte = 0;
+	while ($nb_texte ++ < count($texte_plus)+1){
+		$texte_ajout .= ereg_replace("<!--SPIP-->[\n\r]*","",
+					     $texte_plus[$nb_texte]);
+	}
+	return $texte_ajout;
+}
+
+
+function modif_langue_articles($id_article, $id_rubrique, $changer_lang)
+{
+
+// Appliquer la modification de langue
+ if ($GLOBALS['meta']['multi_articles'] == 'oui') {
+	list($langue_parent) = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=" . $id_rubrique));
+
+	if ($changer_lang) {
+		if ($changer_lang != "herit")
+			spip_query("UPDATE spip_articles SET lang='".addslashes($changer_lang)."', langue_choisie='oui', date_modif=NOW() WHERE id_article=$id_article");
+		else
+			spip_query("UPDATE spip_articles SET lang='".addslashes($langue_parent)."', langue_choisie='non', date_modif=NOW() WHERE id_article=$id_article");
+	}
+ }
+}
+
+// Passer les images/docs en "inclus=non"
+
+function inclus_non_articles($id_article)
+{
+  $result = spip_query("SELECT docs.id_document FROM spip_documents AS docs, spip_documents_articles AS lien WHERE lien.id_article=$id_article AND lien.id_document=docs.id_document");
+
+while($row=spip_fetch_array($result)){
+	$ze_doc[]=$row['id_document'];
+}
+
+if (count($ze_doc)>0){
+	$ze_docs = join($ze_doc,",");
+	spip_query("UPDATE spip_documents SET inclus='non' WHERE id_document IN ($ze_docs)");
+}
+
+}
+
+function revisions_articles ($id_article, $id_secteur, $id_rubrique, $id_rubrique_old, $change_rubrique, $new, $champs) {
+{
+  global $connect_id_auteur, $flag_revisions, $champs_extra;
+
+	// Stockage des versions : creer une premier version si non-existante
+	if (($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions) {
+		include_spip('inc/revisions');
+		if  ($new != 'oui') {
+			$query = spip_query("SELECT id_article FROM spip_versions WHERE id_article=$id_article LIMIT 1");
+			if (!spip_num_rows($query)) {
+				$select = join(", ", array_keys($champs));
+				$query = spip_query("SELECT $select FROM spip_articles WHERE id_article=$id_article");
+				$champs_originaux = spip_fetch_array($query);
+				$id_version = ajouter_version($id_article, $champs_originaux, _T('version_initiale'), 0);
+
+				// Remettre une date un peu ancienne pour la version initiale 
+				if ($id_version == 1) // test inutile ?
+				spip_query("UPDATE spip_versions SET date=DATE_SUB(NOW(), INTERVAL 2 HOUR) WHERE id_article=$id_article AND id_version=1");
+			}
+		}
+	}
+
+	if ($champs_extra) {
+		include_spip('inc/extra');
+		$champs_extra = ", extra = '".addslashes(extra_recup_saisie("articles", $id_secteur))."'";
+	}
+
+	spip_query("UPDATE spip_articles SET surtitre='" .
+		   addslashes($champs['surtitre']) .
+		   "', titre='" .
+		   addslashes($champs['titre']) .
+		   "', soustitre='" .
+		   addslashes($champs['soustitre']) .
+		   "', id_rubrique=" .
+		   intval($id_rubrique) .
+		   ", descriptif='" .
+		   addslashes($champs['descriptif']) .
+		   "', chapo='" .
+		   addslashes($champs['chapo']) .
+		   "', texte='" .
+		   addslashes($champs['texte']) .
+		   "', ps='" .
+		   addslashes($champs['ps']) .
+		   "', url_site='" .
+		   addslashes($champs['url_site']) .
+		   "', nom_site='" .
+		   addslashes($champs['nom_site']) .
+		   "', date_modif=NOW() $champs_extra WHERE id_article=$id_article");
+
+	// Stockage des versions
+	if (($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions) {
+		ajouter_version($id_article, $champs, '', $connect_id_auteur);
+	}
+
+	// Changer la langue heritee
+	if ($id_rubrique != $id_rubrique_old) {
+		propager_les_secteurs();
+		$row = spip_fetch_array(spip_query("SELECT lang, langue_choisie FROM spip_articles WHERE id_article=$id_article"));
+		$langue_old = $row['lang'];
+		$langue_choisie_old = $row['langue_choisie'];
+
+		if ($langue_choisie_old != "oui") {
+			$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
+			$langue_new = $row['lang'];
+			if ($langue_new != $langue_old) spip_query("UPDATE spip_articles SET lang = '$langue_new', date_modif=NOW() WHERE id_article = $id_article");
+		}
+	}
+
+	// marquer l'article (important pour les articles nouvellement crees)
+	spip_query("UPDATE spip_articles SET date_modif=NOW(), auteur_modif=$connect_id_auteur WHERE id_article=$id_article");
+	calculer_rubriques();
+ }
+}
+
+function insert_article($id_parent, $new)
+{
+	if ($new!='oui')  redirige_par_entete("./");
+	// Avec l'Ajax parfois id_rubrique vaut 0... ne pas l'accepter
+	if (!$id_rubrique = intval($id_parent)) {
+		list($id_rubrique) = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 ORDER by 0+titre,titre LIMIT 1"));
+	}
+
+	$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
+
+	$id_article = spip_abstract_insert("spip_articles",
+			"(id_rubrique, statut, date, accepter_forum, lang, langue_choisie)", 
+			"($id_rubrique, 'prepa', NOW(), '" .
+				substr($GLOBALS['meta']['forums_publics'],0,3)
+				. "', '"
+				. ($row["lang"] ? $row["lang"] : $GLOBALS['meta']['langue_site'])
+				. "', 'non')");
+	return $id_article;
+}
+// Y a-t-il vraiment 56 variables determinant l'edition d'un article ?
+
+function exec_articles_dist()
+{
+global $ajout_auteur, $annee, $annee_redac, $avec_redac, $champs_extra, $change_accepter_forum, $change_petition, $changer_lang, $changer_virtuel, $chapo, $cherche_auteur, $cherche_mot, $connect_id_auteur, $date, $date_redac, $debut, $descriptif, $email_unique, $heure, $heure_redac, $id_article, $id_article_bloque, $id_parent, $id_rubrique_old, $id_secteur, $jour, $jour_redac, $langue_article, $lier_trad, $message, $minute, $minute_redac, $mois, $mois_redac, $new, $nom_select, $nom_site, $nouv_auteur, $nouv_mot, $ps, $row, $site_obli, $site_unique, $soustitre, $supp_auteur, $supp_mot, $surtitre, $texte, $texte_petition, $texte_plus, $titre, $titre_article, $url_site, $virtuel; 
+
+ $id_parent = intval($id_parent);
+ $nouv_auteur = intval($nouv_auteur);
+ if (!($id_article=intval($id_article))) {
+   $id_article = insert_article($id_parent, $new);
+   add_auteur_article($id_article, $connect_id_auteur);
+ }
+
+// aucun doc implicitement inclus au départ.
+
+inclus_non_articles($id_article);
+
+
+if ($row = spip_fetch_array(spip_query("SELECT statut, titre, id_rubrique FROM spip_articles WHERE id_article=$id_article"))) {
+	$statut_article = $row['statut'];
+	$titre_article = $row['titre'];
+	$id_rubrique = $row['id_rubrique'];
+	$statut_rubrique = acces_rubrique($id_rubrique);
+	if ($titre_article=='') $titre_article = _T('info_sans_titre');
+}
+else {
+	$statut_article = '';
+	$statut_rubrique = false;
+	$id_rubrique = '0';
+	if ($titre=='') $titre = _T('info_sans_titre');
+}
+
+$flag_auteur = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=$id_article AND id_auteur=$connect_id_auteur LIMIT 1"));
+
+ $flag_editable = ($statut_rubrique OR ($flag_auteur AND $flag_editable));
+
+if ($flag_editable) {
+
+if ($jour) {
+	$date = format_mysql_date($annee, $mois, $jour, $heure, $minute);
+	spip_query("UPDATE spip_articles SET date='$date', date_modif=NOW()
+		WHERE id_article=$id_article");
+	calculer_rubriques();
+}
+
+if ($jour_redac) {
+	if ($annee_redac<>'' AND $annee_redac < 1001) $annee_redac += 9000;
+
+	if ($avec_redac == 'non')
+		$date_redac = format_mysql_date();
+	else
+		$date_redac = format_mysql_date(
+			$annee_redac, $mois_redac, $jour_redac,
+			$heure_redac, $minute_redac);
+
+	spip_query("UPDATE spip_articles SET date_redac='$date_redac',  date_modif=NOW() WHERE id_article=$id_article");
+}
+
+
+modif_langue_articles($id_article, $id_rubrique, $changer_lang);
+
+maj_documents($id_article, 'article');
+
+if ($changer_virtuel) {
+	$virtuel = eregi_replace("^http://$", "", trim($virtuel));
+	if ($virtuel) $chapo = addslashes(corriger_caracteres("=$virtuel"));
+	else $chapo = "";
+	spip_query("UPDATE spip_articles SET chapo='$chapo', date_modif=NOW() WHERE id_article=$id_article");
+}
+
+if ($titre) {
+
+  // prendre en compte le changement eventuel, et seulement si autorise
+	if ($id_parent AND ($flag_auteur OR acces_rubrique($id_parent))) {
+		$id_rubrique = $id_parent;
+	}
+	$champs = array(
+			'surtitre' => corriger_caracteres($surtitre),
+			'titre' => ($titre_article=corriger_caracteres($titre)),
+			'soustitre' => corriger_caracteres($soustitre),
+			'descriptif' => corriger_caracteres($descriptif),
+			'nom_site' => corriger_caracteres($nom_site),
+			'url_site' => corriger_caracteres($url_site),
+			'chapo' => corriger_caracteres($chapo),
+			'texte' => corriger_caracteres(trop_longs_articles($texte_plus) . $texte),
+			'ps' => corriger_caracteres($ps))  ;
+
+	revisions_articles ($id_article, $id_secteur, $id_rubrique, $id_rubrique_old,
+			    ($flag_auteur||$statut_rubrique),
+			    $new, $champs);
+	$id_article_bloque = $id_article;   // message pour inc/presentation
+
+ }
+ }
+
+exec_affiche_articles_dist($id_article, $ajout_auteur, $change_accepter_forum, $change_petition, $changer_virtuel, $cherche_auteur, $cherche_mot, $debut, $email_unique, $flag_auteur, $flag_editable, $langue_article, $message, $nom_select, $nouv_auteur, $nouv_mot, $id_rubrique, $site_obli, $site_unique, $supp_auteur, $supp_mot, $texte_petition, $titre_article, $lier_trad);
+
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/mots_tous.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/mots_tous.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/mots_tous.php	(revision 30)
@@ -0,0 +1,259 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/mots');
+include_spip('base/abstract_sql');
+include_spip('inc/agenda_gestion');
+include_spip('inc/pim_agenda_gestion');
+
+function exec_mots_tous_dist()
+{
+  global $acces_comite, $acces_forum, $acces_minirezo, $new, $articles, $breves, $change_type, $conf_mot, $connect_statut, $connect_toutes_rubriques, $descriptif, $id_groupe, $modifier_groupe, $obligatoire, $rubriques, $spip_lang, $spip_lang_right, $supp_group, $syndic, $texte, $unseul;
+	global $evenements, $pim_agenda;
+	global $tables_principales;
+	
+  $id_groupe = intval($id_groupe);
+
+  if ($conf_mot = intval($conf_mot)) {
+	$result = spip_query("SELECT * FROM spip_mots WHERE id_mot=$conf_mot");
+	if ($row = spip_fetch_array($result)) {
+		$id_mot = $row['id_mot'];
+		$titre_mot = typo($row['titre']);
+		$type_mot = typo($row['type']);
+
+		if ($connect_statut=="0minirezo") $aff_articles="'prepa','prop','publie','refuse'";
+		else $aff_articles="'prop','publie'";
+
+		$nb_articles = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_mots_articles AS lien, spip_articles AS article WHERE lien.id_mot=$conf_mot AND article.id_article=lien.id_article AND (article.statut IN ($aff_articles))>0 AND article.statut!='refuse'"));
+		$nb_articles = $nb_articles['n'];
+
+		$nb_rubriques = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_mots_rubriques AS lien, spip_rubriques AS rubrique WHERE lien.id_mot=$conf_mot AND rubrique.id_rubrique=lien.id_rubrique"));
+		$nb_rubriques = $nb_rubriques['n'];
+
+		$nb_breves = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_mots_breves AS lien, spip_breves AS breve WHERE lien.id_mot=$conf_mot AND breve.id_breve=lien.id_breve AND (breve.statut IN ($aff_articles))>0 AND breve.statut!='refuse'"));
+		$nb_breves = $nb_breves['n'];
+
+		$nb_sites = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_mots_syndic AS lien, spip_syndic AS syndic WHERE lien.id_mot=$conf_mot AND syndic.id_syndic=lien.id_syndic	AND (syndic.statut IN ($aff_articles))>0 AND syndic.statut!='refuse'"));
+		$nb_sites = $nb_sites['n'];
+
+		$nb_forum = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_mots_forum AS lien, spip_forum AS forum WHERE lien.id_mot=$conf_mot AND forum.id_forum=lien.id_forum AND forum.statut='publie'"));
+		$nb_forum = $nb_forum['n'];
+
+		$nb_evenements = 0;
+		if (isset($tables_principales['spip_evenements'])){
+			$nb_evenements = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_mots_evenements AS lien, spip_evenements AS evenement WHERE lien.id_mot=$conf_mot AND evenement.id_evenement=lien.id_evenement"));
+			$nb_evenements = $nb_evenements['n'];
+		}
+		
+		$nb_agenda = 0;
+		if (isset($tables_principales['spip_pim_agenda'])){
+			$nb_agenda = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_mots_pim_agenda AS lien, spip_pim_agenda AS agenda WHERE lien.id_mot=$conf_mot AND agenda.id_agenda=lien.id_agenda"));
+			$nb_agenda = $nb_agenda['n'];
+		}
+		
+		// si le mot n'est pas lie, on demande sa suppression
+		if ($nb_articles + $nb_breves + $nb_sites + $nb_forum + $nb_evenements + $nb_agenda == 0) {
+		  redirige_par_entete(generer_url_ecrire("mots_edit","supp_mot=$id_mot&redirect_ok=oui&redirect=" . rawurlencode(generer_url_ecrire('mots_tous')), true));
+		} // else traite plus loin (confirmation de suppression)
+	}
+}
+
+if ($connect_statut == '0minirezo'  AND $connect_toutes_rubriques) {
+	if (function_exists('Agenda_install'))	Agenda_install();
+	if (function_exists('PIMAgenda_install'))	PIMAgenda_install();
+
+	if ($modifier_groupe == "oui") {
+		$change_type = (corriger_caracteres($change_type));
+		$texte = (corriger_caracteres($texte));
+		$descriptif = (corriger_caracteres($descriptif));
+
+		if (!$new) {	// modif groupe
+			spip_query("UPDATE spip_mots SET type=" . spip_abstract_quote($change_type) . " WHERE id_groupe=$id_groupe");
+
+
+			spip_query("UPDATE spip_groupes_mots SET titre=" . spip_abstract_quote($change_type) . ", texte=" . spip_abstract_quote($texte) . ", descriptif=" . spip_abstract_quote($descriptif) . ", unseul=" . spip_abstract_quote($unseul) . ", obligatoire=" . spip_abstract_quote($obligatoire) . ", articles=" . spip_abstract_quote($articles) . ", breves=" . spip_abstract_quote($breves) . ", rubriques=" . spip_abstract_quote($rubriques) . ", syndic=" . spip_abstract_quote($syndic) . ",	minirezo=" . spip_abstract_quote($acces_minirezo) . ", comite=" . spip_abstract_quote($acces_comite) . ", forum=" . spip_abstract_quote($acces_forum) . " WHERE id_groupe=$id_groupe");
+
+		} else {	// creation groupe
+		  $id_groupe = spip_abstract_insert('spip_groupes_mots', "(titre, texte, descriptif, unseul,  obligatoire, articles, breves, rubriques, syndic, minirezo, comite, forum)", "(" . spip_abstract_quote($change_type) . ", " . spip_abstract_quote($texte) . " , " . spip_abstract_quote($descriptif) . " , " . spip_abstract_quote($unseul) . " , " . spip_abstract_quote($obligatoire) . " , " . spip_abstract_quote($articles) . " ," . spip_abstract_quote($breves) . " , " . spip_abstract_quote($rubriques) . " , " . spip_abstract_quote($syndic) . " , " . spip_abstract_quote($acces_minirezo) . " ,  " . spip_abstract_quote($acces_comite) . " , " . spip_abstract_quote($acces_forum) . " )");
+		}
+		if ($id_groupe && isset($tables_principales['spip_evenements']))
+			spip_query("UPDATE spip_groupes_mots SET evenements=".spip_abstract_quote($evenements)." WHERE id_groupe=$id_groupe");
+		if ($id_groupe && isset($tables_principales['spip_pim_agenda']))
+			spip_query("UPDATE spip_groupes_mots SET pim_agenda=".spip_abstract_quote($pim_agenda)." WHERE id_groupe=$id_groupe");
+	}
+	if ($supp_group){
+		spip_query("DELETE FROM spip_groupes_mots WHERE id_groupe=" . intval($supp_group));
+	}
+ }
+
+
+debut_page(_T('titre_page_mots_tous'), "documents", "mots");
+debut_gauche();
+
+debut_droite();
+
+gros_titre(_T('titre_mots_tous'));
+if ($connect_statut == '0minirezo'  AND $connect_toutes_rubriques) {
+  echo typo(_T('info_creation_mots_cles')) . aide ("mots") ;
+  }
+echo "<br><br>";
+
+/////
+
+if ($conf_mot>0) {
+	if ($nb_articles == 1) {
+		$texte_lie = _T('info_un_article')." ";
+	} else if ($nb_articles > 1) {
+		$texte_lie = _T('info_nombre_articles', array('nb_articles' => $nb_articles)) ." ";
+	}
+	if ($nb_breves == 1) {
+		$texte_lie .= _T('info_une_breve')." ";
+	} else if ($nb_breves > 1) {
+		$texte_lie .= _T('info_nombre_breves', array('nb_breves' => $nb_breves))." ";
+	}
+	if ($nb_sites == 1) {
+		$texte_lie .= _T('info_un_site')." ";
+	} else if ($nb_sites > 1) {
+		$texte_lie .= _T('info_nombre_sites', array('nb_sites' => $nb_sites))." ";
+	}
+	if ($nb_rubriques == 1) {
+		$texte_lie .= _T('info_une_rubrique')." ";
+	} else if ($nb_rubriques > 1) {
+		$texte_lie .= _T('info_nombre_rubriques', array('nb_rubriques' => $nb_rubriques))." ";
+	}
+	if ($nb_evenements == 1) {
+		$texte_lie .= _T('agenda:info_un_evenement')." ";
+	} else if ($nb_evenements > 1) {
+		$texte_lie .= _T('agenda:info_nombre_evenements', array('$nb_evenements' => $nb_evenements))." ";
+	}
+
+	debut_boite_info();
+	echo "<div class='serif'>";
+	echo _T('info_delet_mots_cles', array('titre_mot' => $titre_mot, 'type_mot' => $type_mot, 'texte_lie' => $texte_lie));
+
+	echo "<UL>";
+	echo "<LI><B><A href='", generer_url_ecrire('mots_edit', "supp_mot=$id_mot&redirect_ok=oui&redirect=" . rawurlencode(generer_url_ecrire('mots_tous'))),
+	  "'>",
+	  _T('item_oui'),
+	  "</A>,</B> ",
+	  _T('info_oui_suppression_mot_cle');
+	echo "<LI><B><A href='" . generer_url_ecrire("mots_tous","") . "'>"._T('item_non')."</A>,</B> "._T('info_non_suppression_mot_cle');
+	echo "</UL>";
+	echo "</div>";
+	fin_boite_info();
+	echo "<P>";
+}
+
+//
+// On boucle d'abord sur les groupes de mots
+//
+
+ $result_groupes = spip_query("SELECT *, ".creer_objet_multi ("titre", "$spip_lang")." FROM spip_groupes_mots ORDER BY multi");
+
+
+while ($row_groupes = spip_fetch_array($result_groupes)) {
+	$id_groupe = $row_groupes['id_groupe'];
+	$titre_groupe = typo($row_groupes['titre']);
+	$descriptif = $row_groupes['descriptif'];
+	$texte = $row_groupes['texte'];
+	$unseul = $row_groupes['unseul'];
+	$obligatoire = $row_groupes['obligatoire'];
+	$articles = $row_groupes['articles'];
+	$breves = $row_groupes['breves'];
+	$rubriques = $row_groupes['rubriques'];
+	$syndic = $row_groupes['syndic'];
+	if (isset($tables_principales['spip_evenements']))	$evenements = $row_groupes['evenements'];
+	if (isset($tables_principales['spip_pim_agenda']))	$pim_agenda = $row_groupes['pim_agenda'];
+	$acces_minirezo = $row_groupes['minirezo'];
+	$acces_comite = $row_groupes['comite'];
+	$acces_forum = $row_groupes['forum'];
+
+	// Afficher le titre du groupe
+	debut_cadre_enfonce("groupe-mot-24.gif", false, '', $titre_groupe);
+	// Affichage des options du groupe (types d'elements, permissions...)
+	echo "<font face='Verdana,Arial,Sans,sans-serif' size=1>";
+	if ($articles == "oui") echo "> "._T('info_articles_2')." &nbsp;&nbsp;";
+	if ($breves == "oui") echo "> "._T('info_breves_02')." &nbsp;&nbsp;";
+	if ($rubriques == "oui") echo "> "._T('info_rubriques')." &nbsp;&nbsp;";
+	if ($syndic == "oui") echo "> "._T('icone_sites_references')." &nbsp;&nbsp;";
+	if (isset($tables_principales['spip_evenements']))
+		if ($evenements == "oui") echo "> "._T('agenda:info_evenements')." &nbsp;&nbsp;";
+	if (isset($tables_principales['spip_pim_agenda']))
+		if ($pim_agenda == "oui") echo "> "._T('pimagenda:info_evenements')." &nbsp;&nbsp;";
+
+	if ($unseul == "oui" OR $obligatoire == "oui") echo "<br>";
+	if ($unseul == "oui") echo "> "._T('info_un_mot')." &nbsp;&nbsp;";
+	if ($obligatoire == "oui") echo "> "._T('info_groupe_important')." &nbsp;&nbsp;";
+
+	echo "<br>";
+	if ($acces_minirezo == "oui") echo "> "._T('info_administrateurs')." &nbsp;&nbsp;";
+	if ($acces_comite == "oui") echo "> "._T('info_redacteurs')." &nbsp;&nbsp;";
+	if ($acces_forum == "oui") echo "> "._T('info_visiteurs_02')." &nbsp;&nbsp;";
+
+	echo "</font>";
+	if ($descriptif) {
+		echo "<p><div align='left' border: 1px dashed #aaaaaa;'>";
+		echo "<font size=2 face='Verdana,Arial,Sans,sans-serif'>";
+		echo "<b>"._T('info_descriptif')."</b> ";
+		echo propre($descriptif);
+		echo "&nbsp; ";
+		echo "</font>";
+		echo "</div>";
+	}
+
+	if (strlen($texte)>0){
+		echo "<FONT FACE='Verdana,Arial,Sans,sans-serif'>";
+		echo "<P>".propre($texte);
+		echo "</FONT>";
+	}
+
+	//
+	// Afficher les mots-cles du groupe
+	//
+	$supprimer_groupe = afficher_groupe_mots($id_groupe);
+
+	if ($connect_statut =="0minirezo" AND $connect_toutes_rubriques AND !$conf_mot){
+		echo "\n<table cellpadding=0 cellspacing=0 border=0 width=100%>";
+		echo "<tr>";
+		echo "<td>";
+		icone(_T('icone_modif_groupe_mots'), generer_url_ecrire("mots_type","id_groupe=$id_groupe"), "groupe-mot-24.gif", "edit.gif");
+		echo "</td>";
+		if ($supprimer_groupe) {
+			echo "<td>";
+			icone(_T('icone_supprimer_groupe_mots'), generer_url_ecrire("mots_tous","supp_group=$id_groupe"), "groupe-mot-24.gif", "supprimer.gif");
+			echo "</td>";
+			echo "<td> &nbsp; </td>"; // Histoire de forcer "supprimer" un peu plus vers la gauche
+		}
+		echo "<td>";
+		echo "<div align='$spip_lang_right'>";
+		icone(_T('icone_creation_mots_cles'), generer_url_ecrire("mots_edit","new=oui&id_groupe=$id_groupe&redirect=" . rawurlencode(generer_url_ecrire('mots_tous'))), "mot-cle-24.gif", "creer.gif");
+		echo "</div>";
+		echo "</td></tr></table>";
+	}	
+
+	fin_cadre_enfonce();
+
+}
+
+if ($connect_statut =="0minirezo"  AND $connect_toutes_rubriques  AND !$conf_mot){
+	echo "<p>&nbsp;</p><div align='right'>";
+	icone(_T('icone_creation_groupe_mots'), generer_url_ecrire("mots_type","new=oui"), "groupe-mot-24.gif", "creer.gif");
+	echo "</div>";
+}
+
+fin_page();
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/mots_type.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/mots_type.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/exec/mots_type.php	(revision 30)
@@ -0,0 +1,246 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('base/agenda_evenements'); // si le plugin existe
+include_spip('base/pim_agenda'); // si le plugin existe
+
+function exec_mots_type_dist()
+{
+  global $connect_statut, $descriptif, $id_groupe, $new, $options, $texte, $titre;
+  global $tables_principales;
+
+  $id_groupe= intval($id_groupe);
+
+if ($connect_statut == '0minirezo' AND $new == "oui") {
+	$id_groupe = '';
+	$type = filtrer_entites(_T('titre_nouveau_groupe'));
+	$onfocus = " onfocus=\"if(!antifocus){this.value='';antifocus=true;}\"";
+	$ancien_type = '';
+	$unseul = 'non';
+	$obligatoire = 'non';
+	$articles = 'oui';
+	$breves = 'oui';
+	$rubriques = 'non';
+	$syndic = 'oui';
+	$evenements = 'non';
+	$pim_agenda = 'non';
+	$acces_minirezo = 'oui';
+	$acces_comite = 'oui';
+	$acces_forum = 'non';
+} else {
+	$result_groupes = spip_query("SELECT * FROM spip_groupes_mots WHERE id_groupe=$id_groupe");
+
+	while($row = spip_fetch_array($result_groupes)) {
+		$id_groupe = $row['id_groupe'];
+		$type = $row['titre'];
+		$titre = typo($type);
+		$descriptif = $row['descriptif'];
+		$texte = $row['texte'];
+		$unseul = $row['unseul'];
+		$obligatoire = $row['obligatoire'];
+		$articles = $row['articles'];
+		$breves = $row['breves'];
+		$rubriques = $row['rubriques'];
+		$syndic = $row['syndic'];
+		if (isset($row['evenements']))
+			$evenements = $row['evenements'];
+		if (isset($row['pim_agenda']))
+			$pim_agenda = $row['pim_agenda'];
+		$acces_minirezo = $row['minirezo'];
+		$acces_comite = $row['comite'];
+		$acces_forum = $row['forum'];
+		$onfocus ="";
+		$new = '';
+	}
+}
+
+debut_page("&laquo; $titre &raquo;", "documents", "mots");
+
+debut_gauche();
+
+
+
+debut_droite();
+
+debut_cadre_relief("groupe-mot-24.gif");
+
+
+
+echo "\n<table cellpadding=0 cellspacing=0 border=0 width='100%'>";
+echo "<tr width='100%'>";
+
+	echo "<td  align='right' valign='top'>";
+	icone(_T('icone_retour'), generer_url_ecrire("mots_tous",""), "mot-cle-24.gif", "rien.gif");
+	echo "</td>";
+	echo "<td>". http_img_pack('rien.gif', " ", "width='5'") . "</td>\n";
+
+echo "<td width='100%' valign='top'>";
+echo "<font face='Verdana,Arial,Sans,sans-serif' size=1><b>"._T('titre_groupe_mots')."</b><br></font>";
+gros_titre($titre);
+echo aide("motsgroupes");
+
+if ($connect_statut =="0minirezo"){
+	$type=entites_html(rawurldecode($type));
+	echo "<p><font face='Verdana,Arial,Sans,sans-serif'>";
+	echo generer_url_post_ecrire("mots_tous", "id_groupe=$id_groupe");
+	echo "<input type='hidden' name='modifier_groupe' value='oui' />\n";
+	echo "<input type='hidden' name='new' value='$new' />\n";
+	debut_cadre_formulaire();
+	echo "<b>"._T('info_changer_nom_groupe')."</b><br />\n";
+	echo "<INPUT TYPE='Text' SIZE=40 CLASS='formo' NAME='change_type' VALUE=\"$type\" $onfocus />\n";
+
+	if ($options == 'avancees' OR $descriptif) {
+		echo "<B>"._T('texte_descriptif_rapide')."</B><BR>";
+		echo "<TEXTAREA NAME='descriptif' CLASS='forml' ROWS='4' COLS='40' wrap=soft>";
+		echo entites_html($descriptif);
+		echo "</TEXTAREA><P>\n";
+	}
+	else
+		echo "<INPUT TYPE='hidden' NAME='descriptif' VALUE=\"$descriptif\">";
+
+	if ($options == 'avancees' OR $texte) {
+		echo "<B>"._T('info_texte_explicatif')."</B><BR>";
+		echo "<TEXTAREA NAME='texte' ROWS='8' CLASS='forml' COLS='40' wrap=soft>";
+		echo entites_html($texte);
+		echo "</TEXTAREA><P>\n";
+	}
+	else
+		echo "<INPUT TYPE='hidden' NAME='texte' VALUE=\"$texte\">";
+
+
+	echo "<p><div align='right'><INPUT TYPE='submit' CLASS='fondo' NAME='Valider' VALUE='"._T('bouton_valider')."'></div>";
+	fin_cadre_formulaire();
+}
+
+
+echo "</td></tr></table>";
+
+
+
+fin_cadre_relief();
+
+if ($connect_statut =="0minirezo"){
+	echo "<p>";
+	debut_cadre_formulaire();
+	echo "<div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>";
+		echo "<b>"._T('info_mots_cles_association')."</b>";
+		echo "<ul>";
+		
+		if ($articles == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='articles' value='oui' $checked id='articles'> <label for='articles'>"._T('item_mots_cles_association_articles')."</label><br>";
+		$activer_breves = $GLOBALS['meta']["activer_breves"];
+		if ($activer_breves != "non"){
+			if ($breves == "oui") $checked = "checked";
+			else $checked = "";
+			echo "<input type='checkbox' name='breves' value='oui' $checked id='breves'> <label for='breves'>"._T('item_mots_cles_association_breves')."</label><br>";
+		} else {
+			echo "<input type='hidden' name='breves' value='non'>";
+		}
+		if ($rubriques == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='rubriques' value='oui' $checked id='rubriques'> <label for='rubriques'>"._T('item_mots_cles_association_rubriques')."</label><br>";
+		if ($syndic == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='syndic' value='oui' $checked id='syndic'> <label for='syndic'>"._T('item_mots_cles_association_sites')."</label>";
+		
+		if (isset($tables_principales['spip_evenements'])){
+			echo "<br>";
+			if ($evenements == "oui") $checked = "checked";
+			else $checked = "";
+			echo "<input type='checkbox' name='evenements' value='oui' $checked id='evenements'> <label for='evenements'>"._T('agenda:item_mots_cles_association_evenements')."</label>";
+		}
+		if (isset($tables_principales['spip_pim_agenda'])){
+			echo "<br>";
+			if ($pim_agenda == "oui") $checked = "checked";
+			else $checked = "";
+			echo "<input type='checkbox' name='pim_agenda' value='oui' $checked id='pim_agenda'> <label for='pim_agenda'>"._T('pimagenda:item_mots_cles_association_evenements')."</label>";
+		}
+	
+		echo "</ul>";
+	echo "</div>";
+
+
+	$config_precise_groupes = $GLOBALS['meta']["config_precise_groupes"];
+	if ($config_precise_groupes == "oui" OR $unseul == "oui" OR $obligatoire == "oui"){
+		echo "<p><div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>";
+
+		if ($unseul == "oui")
+			$checked = "checked";
+		else
+			$checked = "";
+		echo "<input type='checkbox' name='unseul' value='oui' $checked id='unseul'> <label for='unseul'>"._T('info_selection_un_seul_mot_cle')."</label>";
+		echo "<br>";
+
+		if ($obligatoire == "oui")
+			$checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='obligatoire' value='oui' $checked id='obligatoire'> <label for='obligatoire'>"._T('avis_conseil_selection_mot_cle')."</label>";
+
+		echo "</div>";
+	} else {
+		echo "<input type='hidden' name='unseul' value='non'>";
+		echo "<input type='hidden' name='obligatoire' value='non'>";
+	}
+
+
+	
+	echo "<p>";
+	echo "<div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>";
+		echo "<b>"._T('info_qui_attribue_mot_cle')."</b>";
+		echo "<ul>";
+		
+		if ($acces_minirezo == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='acces_minirezo' value='oui' $checked id='administrateurs'> <label for='administrateurs'>"._T('bouton_checkbox_qui_attribue_mot_cle_administrateurs')."</label><br>";
+		if ($acces_comite == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='acces_comite' value='oui' $checked id='comite'> <label for='comite'>"._T('bouton_checkbox_qui_attribue_mot_cle_redacteurs')."</label><br>";
+	
+		$mots_cles_forums = $GLOBALS['meta']["mots_cles_forums"];
+		$forums_publics=$GLOBALS['meta']["forums_publics"];
+		
+		if (($mots_cles_forums == "oui" OR $acces_forum == "oui") AND $forums_publics != "non"){
+			if ($acces_forum == "oui") $checked = "checked";
+			else $checked = "";
+			echo "<input type='checkbox' name='acces_forum' value='oui' $checked id='forum'> <label for='forum'>"._T('bouton_checkbox_qui_attribue_mot_cle_visiteurs')."</label>";
+		} 
+		else {
+			echo "<input type='hidden' name='acces_forum' value='non'>";
+		}
+			
+		echo "</ul>";
+	echo "</div>";
+	
+	
+	
+
+	echo "<p><div align='right'><INPUT TYPE='submit' CLASS='fondo' NAME='Valider' VALUE='"._T('bouton_valider')."'></div>";
+	echo "</FORM><P>";
+	fin_cadre_formulaire();	
+	echo "</font>";
+
+
+}else{
+
+	echo "<H3>"._T('avis_non_acces_page')."</H3>";
+
+}
+
+
+fin_page();
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/formulaires/calendrier_mini.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/formulaires/calendrier_mini.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/formulaires/calendrier_mini.html	(revision 30)
@@ -0,0 +1,35 @@
+<div id="calendar">
+	<h2><BOUCLE_titre(ARTICLES){id_article}>#TITRE</BOUCLE_titre><:icone_calendrier:><//B_titre></h2>
+	<table summary="<:icone_calendrier:>">
+		<caption>[
+			<a
+				href="(#ENV{self}|parametre_url{#ENV{var_date},[(#ENV{date}|Agenda_moisdecal{-1,'Y-m'})]})"
+				title="[(#ENV{date}|Agenda_moisdecal{-1,'Y-m'}|affdate_mois_annee)]">&#171;</a>][
+			(#ENV{date}|affdate_mois_annee)][
+			<a
+				href="(#ENV{self}|parametre_url{#ENV{var_date},[(#ENV{date}|Agenda_moisdecal{1,'Y-m'})]})"
+				title="[(#ENV{date}|Agenda_moisdecal{1,'Y-m'}|affdate_mois_annee)]">&#187;</a>]
+		</caption>
+		<thead>
+			<tr>
+				<th scope="col"><abbr title="<:date_jour_2:>"><:date_jour_2|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_3:>"><:date_jour_3|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_4:>"><:date_jour_4|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_5:>"><:date_jour_5|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_6:>"><:date_jour_6|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_7:>"><:date_jour_7|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_1:>"><:date_jour_1|spip_substr{0,1}|strtoupper:></abbr></th>
+			</tr>
+		</thead>
+		<tbody><BOUCLE_calendrier(EVENEMENTS)
+			{id_article}{id_mot?}
+			{agenda date_debut, mois, (#ENV{date}|annee), (#ENV{date}|mois)}>[
+			(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,[(#TITRE|addslashes)],
+				#DESCRIPTIF,#LIEU,
+				[(#ENV{self}|parametre_url{#ENV{var_date},[(#DATE_DEBUT|affdate{'Y-m-d'})]})]})
+			]</BOUCLE_calendrier>[
+			(#ENV{date}|agenda_mini)
+			]</tbody>
+	</table>
+	<span>&nbsp;</span>
+</div>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/formulaires/formulaire_edition_evenement.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/formulaires/formulaire_edition_evenement.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/formulaires/formulaire_edition_evenement.html	(revision 30)
@@ -0,0 +1,116 @@
+<a name='evenement#ID_EVENEMENT'></a>
+<form method='post' action='#ENV{self}#evenement#ID_EVENEMENT'>
+	<div>
+	[(#ENV{self}|form_hidden)]
+	[<input type='hidden' name='id_evenemnt' value='(#ENV{id_evenemnt})' />]
+	<input type='hidden' name='#ENV{evenement_action}' value='1' />
+	
+	</div>
+<fieldset class='agenda-visu-evenement' id='agenda-visu-evenement'>
+<div class='agenda-visu-evenement-bouton-fermer'>
+<a href='[(#ENV{self}|parametre_url{id_evenement,''})]'
+onclick="setvisibility('agenda-visu-evenement', 'hidden');
+setvisibility('afficher_horaire_debut_evenement', 'hidden');
+setvisibility('afficher_horaire_fin_evenement', 'hidden');
+cal_repetitions.hide();
+return false;"><img src='#CHEMIN{img_pack/croix.png}' width='12' height='12' style='border:none;'></a>
+</div>
+<legend>[(#ENV{id_evenement}|?{<:agenda:titre_cadre_modifier_evenement:>,<:agenda:titre_cadre_ajouter_evenement:>})]</legend>
+
+[(#REM) TITRE]
+<span class='titre-titre'>
+	<label for="evenement_titre"><:agenda:evenement_titre:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_titre}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_titre}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='titre-visu'>
+	<input type='text' name='evenement_titre' id='evenement_titre' value="[(#ENV**{valeurs}|table_valeur{evenement_titre,''}|entites_html)]" 
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_titre}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|=={oui}|?{forml,formo})]'" />
+</span>
+[(#REM) LIEU]
+<span class='lieu-titre'>
+	<label for="evenement_lieu"><:agenda:evenement_lieu:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_lieu}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_lieu}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='lieu-visu'>
+	<input type='text' name='evenement_lieu' id='evenement_lieu' value="[(#ENV**{valeurs}|table_valeur{evenement_lieu,''}|entites_html)]" 
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_lieu}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|=={oui}|?{forml,formo})]'" />
+</span>
+
+[(#REM) HORAIRE]
+<span class='horaire-titre'>
+	<label for="evenement_lieu"><:agenda:evenement_horaire:></label>
+	<input type='checkbox' name='evenement_horaire' value='oui' [(#ENV**{valeurs}|table_valeur{evenement_horaire,''}|=={oui}|?{' ',''})checked='checked']
+		onClick="var element =  findObj('evenement_horaire');var choix = element.checked;
+	if (choix==true){	setvisibility('afficher_horaire_debut_evenement', 'visible');setvisibility('afficher_horaire_fin_evenement', 'visible');}
+	else{setvisibility('afficher_horaire_debut_evenement', 'hidden');setvisibility('afficher_horaire_fin_evenement', 'hidden');}" />
+</span>
+
+[(#REM) DATES]
+<span class='date-titre'><:pimagenda:evenement_date:></span>
+<span class='date-visu'>
+<:pimagenda:evenement_date_de:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_debut}|WCalendar_controller{'_evenement_debut'})]
+<span class='agenda_visible_au_chargement' id='afficher_horaire_debut_evenement'>
+<:pimagenda:evenement_date_a:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_debut}|PIMAgenda_heure_selector{'_debut'})]
+</span>
+<br/>
+<:pimagenda:evenement_date_au:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_fin}|WCalendar_controller{'_evenement_fin'})]
+<span class='agenda_visible_au_chargement' id='afficher_horaire_fin_evenement'>
+<:pimagenda:evenement_date_a:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_fin}|PIMAgenda_heure_selector{'_fin'})]
+</span>
+</span>
+
+[(#REM) DESCRIPTIF]
+<span class='descriptif-titre'>
+	<label for="evenement_descriptif"><:agenda:evenement_descriptif:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_descriptif}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='descriptif-visu'>
+	<textarea name='evenement_descriptif' id='evenement_descriptif'  
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_descriptif}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|=={oui}|?{forml,formo})]'" 
+		rows='3' >[(#ENV**{valeurs}|table_valeur{evenement_descriptif,''}|entites_html)]</textarea>
+</span>
+
+[(#REM) MOTS CLES : chaque groupe de mot cle attribuable a un evenement agenda
+	donne un select ]
+<span class='agenda_mots_cles'>
+<BOUCLE_groupes(GROUPES_MOTS){evenements='oui'}>
+	<select name='evenement_groupe_mot_select_#ID_GROUPE[]' class='fondl verdana1 agenda_mot_cle_select'[
+	(#UNSEUL|=={'oui'}|?{'',' '}) multiple='multiple' size='4']>
+	[<option value='x' style='font-variant: small-caps;' [
+	(#UNSEUL|=={'oui'}|?{'',' '}) disabled='disabled']>(#TITRE|supprimer_numero)</option>]
+	<BOUCLE_mots(MOTS){id_groupe}>
+		<option value='#ID_MOT'
+		[(#ID_MOT|in_any([(#ENV**{valeurs}|table_valeur{mots})selected='selected']>#TITRE</option>
+	</BOUCLE_mots>
+	</select>
+</BOUCLE_groupes>
+</span>
+<script type='text/javascript' src='#CHEMIN{img_pack/multiselect.js}'></script>
+<span class='repetitions-calendrier' id='repetitions-calendrier'>
+[(#ENV**{valeurs}|table_valeur{repetitions}|WCalendar_statique_controller{'_repetitions'})]
+</span>
+
+<div class='edition-bouton' style='text-align:#LANG_RIGHT'>
+[(#ENV{evenement_action}|=={'evenement_modif'}|?{' ',''})
+<div style='float:#LANG_LEFT'>
+<input type='submit' name='supp_evenement' value='<:agenda:bouton_supprimer:>' class="fondl" />
+</div>
+]
+<input type='submit' name='cancel' value='<:agenda:bouton_annuler:>' class="fondl" />
+<input type='submit' name='ajouter' value='[(#ENV{evenement_action}|=={'evenement_modif'}|?{<:bouton_enregistrer:>,<:bouton_ajouter:>})]' class='fondo spip_boutons' onclick='javascript:getSelectedDate_repetitions()'>
+</div>
+</fieldset>
+</form>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/ical-agenda.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/ical-agenda.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/ical-agenda.html	(revision 30)
@@ -0,0 +1,20 @@
+#HTTP_HEADER{content-type:text/calendar}
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+X-WR-CALNAME;VALUE=TEXT:<BOUCLE_article (ARTICLES) {id_article}>[(#TITRE|filtrer_ical)] </BOUCLE_article>[[(#NOM_SITE_SPIP|filtrer_ical)]]
+X-WR-RELCALID:#URL_SITE_SPIP
+
+<BOUCLE_evemnt (EVENEMENTS) {id_article ?}>
+BEGIN:VEVENT
+SUMMARY:[(#TITRE|filtrer_ical)]
+UID:evenement#ID_EVENEMENT @ #URL_SITE_SPIP
+DTSTAMP:[(#DATE_DEBUT|date_ical)]
+DTSTART:[(#DATE_DEBUT|date_ical)]
+DTEND:[(#DATE_FIN|date_ical)]
+<B_article2>CATEGORIES:<BOUCLE_article2 (ARTICLES) {id_article=#ID_ARTICLE}>[(#TITRE|filtrer_ical)]</BOUCLE_article2>
+DESCRIPTION:[(#DESCRIPTIF|filtrer_ical)]\n[<:lieu:>(#LIEU|filtrer_ical)]
+STATUS:CONFIRMED
+END:VEVENT
+</BOUCLE_evemnt>
+
+END:VCALENDAR
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/agenda.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/agenda.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/agenda.css	(revision 30)
@@ -0,0 +1,262 @@
+.agenda_invisible_au_chargement {
+	visibility: hidden;
+}
+.agenda_visible_au_chargement {
+	visibility: visible;
+}
+#container_debut,#container_fin{
+	left:0px;
+	top:0px;
+	z-index:150;
+	filter:alpha(opacity=100);
+	opacity: 1.0;
+	-moz-opacity:1.0;
+}
+
+.agenda-calendrier {
+	width: 100%;
+	height: 60%;
+	font-weight: bold;
+	background-color: none;
+  }
+
+.agenda-visu-evenement {
+	position: absolute;
+	right :0px;
+	top :100px;
+	width: 400px;
+	height: 47em;
+	border-bottom: 1px solid #cccccc;
+	font-weight: bold;
+	z-index:100;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-family: Verdana, Arial, Sans, sans-serif;
+	font-size:small;
+  background-color: #F0FFC2;
+	filter:alpha(opacity=80);
+	opacity: 0.8;
+	-moz-opacity:0.8;
+	text-align:left;
+ }
+.agenda-visu-evenement-bouton-fermer{
+	position: absolute;
+	right:1em;
+	top:0px;
+	width:12px;
+	height:12px;
+}
+.agenda-visu-evenement-bouton-fermer a:hover{
+	border-color:#cccccc;
+	border-top:1px solid #cccccc;
+	border-left:1px solid #cccccc;
+	border-bottom:2px solid #cccccc;
+	border-right:2px solid #cccccc;
+}
+
+.article-evenement {
+	position: absolute;
+	top :0;
+	left :0px;
+	width : 100%;
+	height : 4em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-topright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-topright: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+
+.titre-titre {
+	position: absolute;
+	top :4em;
+	left :0px;
+	width : 20%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.titre-visu {
+	position: absolute;
+	top :4em;
+	left :20%;
+	width : 80%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+
+.lieu-titre {
+	position: absolute;
+	top :5.5em;
+	left :0px;
+	width : 20%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.lieu-visu {
+	position: absolute;
+	top :5.5em;
+	left :20%;
+	width : 80%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-bottomright: 8px;
+	border-radius-bottomright: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.horaire-titre {
+	position: absolute;
+	top :7.1em;
+	left :20%;
+	width : 80%;
+	height : 2em;
+	border-top: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-topright: 8px;
+	border-radius-topright: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.date-titre {
+	position: absolute;
+	top :7.1em;
+	left :0px;
+	width : 20%;
+	height : 2em;
+	border-top: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	-moz-border-radius-topleft: 8px;
+	border-radius-topleft: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.date-visu {
+	position: absolute;
+	top :9em;
+	left :0%;
+	width : 100%;
+	height : 5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-bottomright: 8px;
+	border-radius-bottomright: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.descriptif-titre {
+	visibility: hidden;
+ }
+.descriptif-visu {
+	position: absolute;
+	top :14em;
+	left :0px;
+	width : 100%;
+	height: 6em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.agenda_mot_cle_select{
+width:49%;
+}
+.agenda_mots_cles{
+	position: absolute;
+	left:0px;
+	top:20em;
+	height:8em;
+	width:100%;
+	font-weight: bold;
+	background-color: #ccff99;
+}
+.repetitions-calendrier{
+	position: absolute;
+	left:0px;
+	top:28em;
+	height:17em;
+	width:100%;
+}
+.edition-bouton {
+	position: absolute;
+	bottom :0em;
+	left :0%;
+	width : 98%;
+	height:2em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	text-align : right;
+	vertical-align : bottom;
+	padding-right:2%;
+	-moz-border-radius-topright: 8px;
+	-moz-border-radius-bottomright: 8px;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #99cc33;
+ }
+a span.survol {
+	display: none;
+}
+
+a:hover .calendrier-verdana10 > span.survol {
+	display: block;
+	position: fixed;
+	top: auto;
+	left: auto;
+	width: auto;
+	padding: 5px;
+	z-index: 100;
+	text-decoration: none;
+  color: #333;
+	background: #ccff99;
+	border: solid 1px #99cc33;
+	font: 10px Verdana, sans-serif;
+	text-align: left;
+	-moz-border-radius-topright: 8px;
+	-moz-border-radius-bottomright: 8px;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	filter:alpha(opacity=80);
+	opacity: 0.8;
+	-moz-opacity:0.8;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/agenda_articles.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/agenda_articles.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/agenda_articles.css	(revision 30)
@@ -0,0 +1,84 @@
+.agenda_invisible_au_chargement {
+	visibility: hidden;
+}
+.agenda_visible_au_chargement {
+	visibility: visible;
+}
+.agenda-visu-evenement-bouton-fermer{
+display:none;
+}
+#container_debut{
+left:0px;
+top:0px;
+z-index:120;
+}
+#container_fin{
+left:0px;
+top:0px;
+z-index:120;
+}
+.agenda_mot_cle_select{
+float:left;
+width:32%;
+margin-right:0.5em;
+}
+.titre-titre {
+float:left;
+	width : 13%;
+	height : 2em;
+	font-weight: bold;
+ }
+.titre-visu {
+float:left;
+	width : 85%;
+	height : 2em;
+	font-weight: bold;
+ }
+.lieu-titre {
+float:left;
+	width : 13%;
+	height : 2em;
+	font-weight: bold;
+ }
+.lieu-visu {
+float:left;
+	width : 85%;
+	height : 2em;
+	font-weight: bold;
+}
+.horaire-titre {
+float:right;
+	width : 40%;
+	height : 2em;
+	font-weight: bold;
+ }
+.date-titre {
+float:left;
+	width : 58%;
+	height : 2em;
+	font-weight: bold;
+ }
+.date-visu {
+float:left;
+	width : 98%;
+	height : 5em;
+	font-weight: bold;
+}
+.descriptif-titre {
+float:left;
+	left :0px;
+	width : 98%;
+	height : 2em;
+	font-weight: bold;
+ }
+.descriptif-visu {
+float:left;
+	left :0%;
+	width : 98%;
+	height : 6em;
+	font-weight: bold;
+}
+.edition-bouton{
+float:right;
+margin-top:0.5em;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/calendrier.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/calendrier.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/calendrier.css	(revision 30)
@@ -0,0 +1,511 @@
+/*
+ * Styles du calendrier
+ */
+
+.calendrier-arial9 {
+	font-family: Arial, Sans, sans-serif; font-size: 9px;
+}
+
+.calendrier-arial10 {
+	font-family: Arial, Sans, sans-serif; font-size: 10px;
+}
+
+.calendrier-arial11 {
+	font-family: Arial, Sans, sans-serif; font-size: 11px;
+}
+
+.calendrier-verdana10 {
+	font-family: Verdana, Arial, Sans, sans-serif; font-size: 10px;
+}
+
+.calendrier-helvetica16 {
+	font-family: arial,helvetica,sans-serif;
+	font-size: 16px;
+	color: black;
+}
+
+div.navigation-calendrier {
+	color: white;
+	background-color: #99cc33;
+	font-family: verdana, arial, sans,sans-serif;
+	font-weight: bold;
+	font-size: 14px;
+}
+
+div.navigation-calendrier img {
+	border: 0px;
+	vertical-align: middle;
+	margin: 1px;
+}
+
+a.calendrier-annee {
+	background-color: #aaaaaa;
+	padding: 3px;
+	margin: 1px;
+	font-family: verdana, arial, sans,sans-serif;
+	font-size: 10px;
+	font-weight: bold;
+	color: white;
+	-moz-border-radius: 5px;
+}
+
+a.calendrier-annee:hover {
+	color: black;
+	background-color: white;
+}
+
+.calendrier-table-large {
+	border: 0px;
+	width: 900px;
+ }
+
+.calendrier-table-etroit {
+	border: 0px;
+	width: 750px;
+ }
+
+.calendrier-td-centre {
+	width: 550px;
+	padding-left: 25px;
+	padding-right: 25px;
+  	vertical-align: top;
+ }
+
+.calendrier-td {
+	width: 14%;
+  	vertical-align: top;
+ }
+
+.calendrier-th {
+	width: 14%;
+	padding: 5px;
+	text-align: center;
+  	vertical-align: center;
+	font-size: 10px;
+	font-weight: bold;
+	font-family: Verdana, Arial, Sans, sans-serif;
+ }
+
+.calendrier-th a {
+  color: black;
+}
+
+.calendrier-table-etroit  .calendrier-td-gauche {
+	width: 0px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-large  .calendrier-td-gauche {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-etroit  .calendrier-td-droit {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-large  .calendrier-td-droit {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-jour {
+	position: relative;
+	color: #999999;
+	background-color: white;
+	border: 1px solid #aaaaaa;
+}
+
+.calendrier-agenda {
+	margin-left: 1px;
+	margin-top: 1px;
+	padding: 1px;
+	text-align: center;
+	background-color: white;
+	-moz-border-radius: 5px;
+ }
+
+.calendrier-demiagenda {
+	margin-left: 0px;
+	margin-top: 0px;
+	padding: 0px;
+	text-align: center;
+	background-color: white;
+	-moz-border-radius: 5px;
+ }
+
+
+.calendrier-tripleagenda {
+	vertical-align: top;
+	width: 33%;
+ }
+
+.calendrier-cadreagenda {
+	visibility: hidden;
+	width: 100%;
+	position: absolute;
+	padding-top: 5px;
+	padding-bottom: 5px;
+	border: 0px;
+	background-color: #ccff99;
+	-moz-border-radius-bottomleft: 8px;
+	-moz-border-radius-bottomright: 8px;
+ }
+
+.calendrier-titre {
+	padding: 5px;
+	text-align: center;
+	font-weight: bold;
+ }
+
+.calendrier-evenement {
+	padding: 2px;
+	margin-top: 2px;
+ }
+
+.calendrier-heurepile {
+	position: absolute;
+	margin-left: 2px;
+	margin-right: 2px;
+	border-top: 1px solid #cccccc;
+	font-weight: bold;
+	width: 100%;
+ }
+
+.calendrier-heurepile a {
+	color : #777777;
+	font-weight: bold;
+ }
+
+.calendrier-heurepile a:hover {
+	position: absolute;
+	border-bottom: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff99;
+	width: 100%;
+ }
+
+.calendrier-heureface {
+	position: absolute;
+	margin-left: 2px;
+	margin-right: 2px;
+	border-top: 1px solid #cccccc;
+ }
+
+.calendrier-mozleft {
+	-moz-border-radius-topleft: 10px;
+	-moz-border-radius-bottomleft: 10px;
+ }
+
+.calendrier-mozright {
+	-moz-border-radius-topright: 10px;
+	-moz-border-radius-bottomright: 10px;
+ }
+
+.calendrier-moztop8 {
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-topright: 8px;
+}
+
+.calendrier-mozbottom8 {
+	-moz-border-radius-bottomleft: 8px;
+	-moz-border-radius-bottomright: 8px;
+}
+
+.calendrier-moztop6 {
+	-moz-border-radius-topleft: 6px;
+	-moz-border-radius-topright: 6px;
+}
+
+.calendrier-mozbottom6 {
+	-moz-border-radius-bottomleft: 6px;
+	-moz-border-radius-bottomright: 6px;
+}
+
+.calendrier-opacity {
+	-moz-opacity: 0.3;
+	filter: alpha(opacity=30);
+}
+
+
+.calendrier-png {
+	width: 12px;
+	height: 12px;
+	behavior: url(win_png.htc);
+}
+
+.calendrier-icone {
+	width: 14px;
+	height: 7px;
+	border: 0px;
+}
+
+.calendrier-noir  { 		/*  style anar */
+	color: black;
+}
+
+.calendrier-nb  { 		/*  style cinemat(yp)ographe */
+	background-color: white;
+	border: 1px solid black;
+	color: black;
+}
+
+.calendrier-couleur1 { 		/* Fushia */
+		background-color: #FDE5F2;
+		border: 1px solid #CD006F;
+		color: #CD006F;
+}
+.calendrier-couleur1i { 		/* Fushia */
+		background-color: #CD006F;
+		border: 1px solid #FDE5F2;
+		color: #FDE5F2
+}
+.calendrier-couleur2 { 		/* Bleu */
+		background-color: #EDF3FE;
+		border: 1px solid #5da7c5;
+		color: #5da7c5;
+}
+.calendrier-couleur2i { 		/* Bleu */
+		background-color: #5da7c5;
+		border: 1px solid #EDF3FE;
+		color: #EDF3FE
+}
+.calendrier-couleur3 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.calendrier-couleur3i { 		/* Bleu pastel */
+		background-color: #766CF6;
+		border: 1px solid #EBE9FF;
+		color: #EBE9FF
+}
+.calendrier-couleur4 { 		/* Orange */
+		background-color: #ffeecc;
+		border: 1px solid #fa9a00;
+		color: #fa9a00;
+}
+.calendrier-couleur4i { 		/* Orange */
+		background-color: #fa9a00;
+		border: 1px solid #ffeecc;
+		color: #ffeecc
+}
+.calendrier-couleur5 { 		/* Rouge (Vermillon) */
+		background-color: #FFEDED;
+		border: 1px solid #FF0000;
+		color: #FF0000;
+}
+.calendrier-couleur5i { 		/* Rouge (Vermillon) */
+		background-color: #FF0000;
+		border: 1px solid #FFEDED;
+		color: #FFEDED
+}
+.calendrier-couleur6 { 		/* Orange */
+		background-color: #FFF2EB;
+		border: 1px solid #E95503;
+		color: #E95503;
+}
+.calendrier-couleur6i { 		/* Orange */
+		background-color: #E95503;
+		border: 1px solid #FFF2EB;
+		color: #FFF2EB
+}
+.calendrier-couleur7 { 		/* Jaune */
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+}
+.calendrier-couleur7i { 		/* Jaune */
+		background-color: #ccaa00;
+		border: 1px solid #ffffee;
+		color: #ffffee
+}
+.calendrier-couleur8 { 		/* Vert pastel */
+		background-color: #E2FDEC;
+		border: 1px solid #009F3C;
+		color: #009F3C;
+}
+.calendrier-couleur8i { 		/* Vert pastel */
+		background-color: #009F3C;
+		border: 1px solid #E2FDEC;
+		color: #E2FDEC
+}
+.calendrier-couleur9 { 		/* Vert */
+		background-color: #e5fd63;
+		border: 1px solid #9DBA00;
+		color: #9DBA00;
+}
+.calendrier-couleur9i { 		/* Vert */
+		background-color: #9DBA00;
+		border: 1px solid #e5fd63;
+		color: #e5fd63
+}
+.calendrier-couleur10 { 		/* Rouge (Bordeaux) */
+		background-color: #FFE0E0;
+		border: 1px solid #640707;
+		color: #640707;
+}
+.calendrier-couleur10i { 		/* Rouge (Bordeaux) */
+		background-color: #640707;
+		border: 1px solid #FFE0E0;
+		color: #FFE0E0
+}
+.calendrier-couleur11 { 		/* Gris */
+		background-color: #F2F2F2;
+		border: 1px solid #3F3F3F;
+		color: #3F3F3F;
+}
+.calendrier-couleur11i { 		/* Gris */
+		background-color: #3F3F3F;
+		border: 1px solid #F2F2F2;
+		color: #F2F2F2
+}
+.calendrier-couleur12 {
+		background-color: #aaaaaa;
+		border: 1px solid black;
+		color:black;
+
+}
+.calendrier-couleur12i {
+		background-color: black;
+		border: 1px solid #aaaaaa;
+		color: #aaaaaa}
+.calendrier-couleur13 { /* Caca d'oie */
+		background-color: #FFFFE0;
+		border: 1px solid #666500;
+		color: #666500; 
+}
+.calendrier-couleur13i { 		/* Caca d'oie */
+		background-color: #666500;
+		border: 1px solid #FFFFE0;
+		color: #FFFFE0
+}
+.calendrier-couleur14 { 		/* Marron */
+		background-color: #F5EEE5;
+		border: 1px solid #8C6635;
+		color: #8C6635;
+}
+.calendrier-couleur14i { 		/* Marron */
+		background-color: #8C6635;
+		border: 1px solid #F5EEE5;
+		color: #F5EEE5
+}
+
+.calendrier-creneau,
+.calendrier-creneau-today,
+.calendrier-creneau-sunday {
+	position: absolute;
+	margin-left: 0px;
+	margin-right: 0px;
+	border-top: 0px ;
+	border-right: 0px ;
+	border-bottom: 0px ;
+	border-left: 0px ;
+	font-weight: bold;
+	background-color: #dddddd;
+	color: #dddddd;
+	width: 100%;
+ }
+
+.calendrier-creneau a {
+	color : #dddddd;
+	font-weight: bold;
+}
+.calendrier-creneau a:hover {
+	background-color: #ccff99;
+}
+
+.calendrier-creneau-today {
+	background-color: #eeeeee;
+	color: #eeeeee;
+}
+.calendrier-creneau-today a {
+	color : #eeeeee;
+	font-weight: bold;
+}
+.calendrier-creneau-today a:hover {
+	background-color: #ccff99;
+}
+
+.calendrier-creneau-sunday {
+/*	background-color: #ccff99;
+	color: #ccff99;*/
+}
+
+.calendrier-creneau-sunday a {
+	/*color : #ccff99;*/
+	color : #dddddd;
+	font-weight: bold;
+ }
+
+.calendrier-creneau-sunday a:hover {
+	/*background-color: #dddddd;*/
+	background-color: #ccff99;
+}
+
+.calendrier-plage,.calendrier-plage-selection { 		/* Orange */
+		background-color: #FFF2EB;
+		border: 1px solid #E95503;
+		color: #E95503;
+}
+.calendrier-plage-selection{
+		border: 3px solid #E95503;
+}
+.calendrier-reunions { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+
+.calendrier-evenement,.calendrier-evenement-selection { 		/* Vert pastel */
+		background-color: #eeeeee;
+		border: 0px solid #009F3C;
+}
+.calendrier-evenement-selection{
+}
+
+.calendrier-anniversaire { 		/* Jaune */
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+}
+.calendrier-rappel { 		/* Rouge (Vermillon) */
+		background-color: #FFEDED;
+		border: 1px solid #FF0000;
+		color: #FF0000;
+}
+
+.calendrier-plage-info { 		/* Jaune transparent*/
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+		filter:alpha(opacity=50);
+		opacity: 0.5;
+		-moz-opacity:0.5;
+}
+.activite-couleur15 { 		/* Fushia */
+		background-color: #FDE5F2;
+		border: 1px solid #CD006F;
+		color: #CD006F;
+}
+.activite-couleur9 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.activite-couleur14 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.activite-couleur5 { 		/* Vert pastel */
+		background-color: #E2FDEC;
+		border: 1px solid #009F3C;
+		color: #009F3C;
+}
+.activite-couleur12 { 		/* Orange */
+		background-color: #ffeecc;
+		border: 1px solid #fa9a00;
+		color: #fa9a00;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/multiselect.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/multiselect.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/img_pack/multiselect.js	(revision 30)
@@ -0,0 +1,115 @@
+/*
+	coded by Kae - kae@verens.com
+	I'd appreciate any feedback.
+	You have the right to include this in your sites.
+	Please retain this notice.
+*/
+
+/* edit these variables to customise the multiselect */ {
+	var show_toplinks=false;
+}
+
+/* global variables - do not touch */ {
+	var isIE=window.attachEvent?true:false;
+	var selectDefaults=[];
+}
+function addEvent(el,ev,fn){
+	if(isIE)el.attachEvent('on'+ev,fn);
+	else if(el.addEventListener)el.addEventListener(ev,fn,false);
+}
+function buildMultiselects(){
+	do{
+		found=0;
+		a=document.getElementsByTagName('select');
+		for(b=0;b<a.length,!found;b++){
+			var ms=a[b];
+			if(ms==null)break;
+			var name=ms.name.replace(/\[\]$/, '');
+			if(ms.multiple){
+				/* common variables */ {
+					selectDefaults[name]=[];
+					var found=1,disabled=ms.disabled?1:0,width=ms.offsetWidth,height=ms.offsetHeight;
+					if(width<120)width=120;
+					if(height<60)height=60;
+				}
+				/* set up wrapper */ {
+					var wrapper=document.createElement('div');
+					wrapper.style.width=width+"px";
+					wrapper.style.height=height+"px";
+					wrapper.style.position='relative';
+					wrapper.style.border="2px solid #000";
+					wrapper.style.borderColor="#333 #ccc #ccc #333";
+					wrapper.style.font="10px sans-serif";
+					if(disabled)wrapper.style.background='#ddd';
+				}
+				if(show_toplinks){ /* reset, all, none */
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','checked');"),'all'));
+					wrapper.appendChild(document.createTextNode(', '));
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','');"),'none'));
+					wrapper.appendChild(document.createTextNode(', '));
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','reset');"),'reset'));
+				}
+				/* setup multiselect */ {
+					newmultiselect=document.createElement('div');
+					newmultiselect.style.position='absolute';
+					newmultiselect.style.top=show_toplinks?'15px':'0';
+					newmultiselect.style.left='0';
+					newmultiselect.style.overflow='auto';
+					newmultiselect.style.width=(isIE?width-4:width)+"px";
+					newmultiselect.style.height=show_toplinks?height-(isIE?19:15)+"px":height+'px';
+				}
+				c=ms.getElementsByTagName('option');
+				for(d=0;d<c.length;d++){
+					var label=document.createElement('label');
+					label.style.display="block";
+					label.style.border="1px solid #eee";
+					label.style.borderWidth="1px 0";
+					label.style.font="10px arial";
+					label.style.lineHeight="10px";
+					label.style.paddingLeft="20px";
+					checkbox=document.createElement('input');
+					checkbox.type="checkbox";
+					if(c[d].selected){
+						checkbox.checked="checked";
+						checkbox.defaultChecked=true;
+					}
+					if(c[d].disabled){
+						checkbox.disabled='disabled';
+						label.style.color='#666';
+					}
+					selectDefaults[name][d]=c[d].selected?'checked':'';
+					if(disabled)checkbox.disabled="disabled";
+					checkbox.value=c[d].value;
+					checkbox.style.marginLeft="-16px";
+					checkbox.style.marginTop="-2px";
+					checkbox.name=ms.name;
+
+					// escape the label
+					var text=c[d].innerHTML;
+					text=text.replace(/\&nbsp;?/g, ' ');
+					text=text.replace(/\&lt;?/g, '<');
+					text=text.replace(/\&gt;?/g, '>');
+
+					labelText=document.createTextNode(text);
+					label.appendChild(checkbox);
+					label.appendChild(labelText);
+					newmultiselect.appendChild(label);
+				}
+			wrapper.appendChild(newmultiselect);
+			ms.parentNode.insertBefore(wrapper,ms);
+			ms.parentNode.removeChild(ms);
+			}
+		}
+	}while(found);
+}
+function multiselect_selectall(name,val){
+	var els=document.getElementsByTagName('input'),found=0;
+	for(var i=0;i<els.length;++i){
+		if((els[i].name==name+'[]'||els[i].name==name)&&!els[i].disabled)els[i].checked=val=='reset'?selectDefaults[name][found++]:val;
+	}
+}
+function newLink(href,text){
+	var e=document.createElement('a');e.href=href;e.appendChild(document.createTextNode(text));return e;
+}
+
+addEvent(window,'load',buildMultiselects);
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda.php.sav
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda.php.sav	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda.php.sav	(revision 30)
@@ -0,0 +1,1424 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/minipres'); 
+include_spip('inc/layer');
+include_spip('inc/texte'); // inclut inc_filtre
+include_spip('inc/calendar'); // inclut widget calendar
+
+charger_generer_url();
+
+//  Typographie generale des calendriers de 3 type: jour/semaine/mois(ou plus)
+
+// Notes: pour toutes les fonctions ayant parmi leurs parametres
+// annee, mois, jour, echelle, partie_cal, script, ancre
+// ceux-ci apparaissent TOUJOURS dans cet ordre 
+
+define(DEFAUT_D_ECHELLE,120); # 1 pixel = 2 minutes
+
+// 
+// Utilitaires sans html ni sql
+//
+
+// utilitaire de separation script / ancre
+// et de retrait des arguments a remplacer
+// (a mon avis cette fonction ne sert a rien, puisque parametre_url()
+// sait remplacer les arguments au bon endroit -- Fil)
+// Pas si simple: certains param ne sont pas remplaces 
+// et doivent reprendre leur valeur par defaut -- esj.
+function calendrier_retire_args_ancre($script)
+{
+	$script = str_replace('&amp;', '&', $script);
+  $script = str_replace('?bonjour=oui&?','?',$script);
+  if (ereg('^(.*)(#[^=&]*)$',$script, $m)) {
+	  $script = $m[1];
+	  $ancre = $m[2];
+  } else { $ancre = ''; }
+  if ($script[strlen($script)-1] == '?')  $script = substr($script,0,-1);
+  foreach(array('echelle','jour','mois','annee', 'type', 'partie_cal') as $arg) {
+		$script = preg_replace("/([?&])$arg=[^&]*&/",'\1', $script);
+		$script = preg_replace("/([?&])$arg=[^&]*$/",'\1', $script);
+	}
+  if (ereg('[?&]$', $script)) $script =   substr($script,0,-1);
+  return array(quote_amp($script), $ancre);
+}
+
+// tous les liens de navigations sont issus de cette fonction
+// on peut definir generer_url_date et un htacces pour simplifier les URL
+
+function calendrier_args_date($script, $annee, $mois, $jour, $type, $finurl) {
+	if (function_exists('generer_url_date'))
+		return generer_url_date($script, $annee, $mois, $jour, $type, $finurl);
+
+	$script = parametre_url($script, 'annee', sprintf("%04d", $annee));
+	$script = parametre_url($script, 'mois',  sprintf("%02d", $mois));
+	$script = parametre_url($script, 'jour',  sprintf("%02d", $jour));
+	$script = parametre_url($script, 'type',  $type);
+	return $script . $finurl;
+}
+
+# prend une heure de debut et de fin, ainsi qu'une echelle (seconde/pixel)
+# et retourne un tableau compose
+# - taille d'une heure
+# - taille d'une journee
+# - taille de la fonte
+# - taille de la marge
+
+function calendrier_echelle($debut, $fin, $echelle)
+{
+  if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
+  if ($fin <= $debut) $fin = $debut +1;
+
+  $duree = $fin - $debut;
+  $dimheure = floor((3600 / $echelle));
+  return array($dimheure,
+	       (($duree+2) * $dimheure),
+	       floor (14 / (1+($echelle/240))),
+	       floor(240 / $echelle));
+}
+
+# Calcule le "top" d'une heure
+
+function calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize) {
+	
+	$h_heure = substr($heure, 0, strpos($heure, ":"));
+	$m_heure = substr($heure, strpos($heure,":") + 1, strlen($heure));
+	$heure100 = $h_heure + ($m_heure/60);
+
+	if ($heure100 < $debut) $heure100 = ($heure100 / $debut) + $debut - 1;
+	if ($heure100 > $fin) $heure100 = (($heure100-$fin) / (24 - $fin)) + $fin;
+
+	$top = floor(($heure100 - $debut + 1) * $dimheure);
+
+	return $top;	
+}
+
+# Calcule la hauteur entre deux heures
+function calendrier_height ($heure, $heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) {
+
+	$height = calendrier_top ($heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) 
+				- calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize);
+
+	$padding = floor(($dimheure / 3600) * 240);
+	$height = $height - (2* $padding + 2); // pour padding interieur
+	
+	if ($height < ($dimheure/4)) $height = floor($dimheure/4); // eviter paves totalement ecrases
+	
+	return $height;	
+}
+
+//
+// init: calcul generique des evenements a partir des tables SQL
+//
+
+function http_calendrier_init($time='', $ltype='', $lechelle='', $lpartie_cal='', $script='', $evt='')
+{
+	global $mois, $annee, $jour, $type, $echelle, $partie_cal;
+
+	if (!$time) 
+	  {
+	    if (!$mois)
+	      $time = time();
+	    else
+	      $time = mktime(0,0,0,$mois,$jour,$annee);
+	    $type= 'mois';
+	  }
+
+	$jour = date("d",$time);
+	$mois = date("m",$time);
+	$annee = date("Y",$time);
+	if (!$ltype) $ltype = $type ? $type : 'mois';
+	if (!$lechelle) $lechelle = $echelle;
+	if (!$lpartie_cal) $lpartie_cal = $partie_cal;
+	list($script, $ancre) = 
+	  calendrier_retire_args_ancre($script); 
+	if (!$evt) {
+	  $g = 'sql_calendrier_' . $ltype;
+	  $evt = sql_calendrier_interval($g($annee,$mois, $jour));
+	  sql_calendrier_interval_articles("'$annee-$mois-00'", "'$annee-$mois-1'", $evt[0]);
+	  // si on veut les forums, decommenter
+#	  sql_calendrier_interval_forums($g($annee,$mois,$jour), $evt[0]);
+	}
+	$f = 'http_calendrier_' . $ltype;
+	return $f($annee, $mois, $jour, $lechelle, $lpartie_cal, $script, $ancre, $evt);
+
+}
+
+# affichage d'un calendrier de plusieurs semaines
+# si la periode est inferieure a 31 jours, on considere que c'est un mois
+
+function http_calendrier_mois($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+	$premier_jour = '01';
+	$dernier_jour = '31';
+
+	if (is_array($evt)) {
+	  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+	  if (!$premier_jour) $premier_jour = '01';
+	  if (!$dernier_jour)
+	    {
+	      $dernier_jour = 31;
+	      while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
+	    }
+	  if ($sansduree)
+	    foreach($sansduree as $d => $r) 
+	      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+	  $evt = 
+	    http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre) .
+	    http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre") ;
+	} else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  '</table>' .
+	  http_calendrier_sans_date($annee, $mois, $evenements) .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
+
+// si la periore a plus de 31 jours, c'est du genre trimestre, semestre etc
+// pas de navigation suivant/precedent alors
+
+function http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre){
+	if ($dernier_jour > 31) {
+	  $prec = $suiv = '';
+	  $periode = affdate_mois_annee(date("Y-m-d", mktime(1,1,1,$mois,$premier_jour,$annee))) . ' - '. affdate_mois_annee(date("Y-m-d", mktime(1,1,1,$mois,$dernier_jour,$annee)));
+	} else {
+
+	$mois_suiv=$mois+1;
+	$annee_suiv=$annee;
+	$mois_prec=$mois-1;
+	$annee_prec=$annee;
+	if ($mois==1){
+	  $mois_prec=12;
+	  $annee_prec=$annee-1;
+	}
+	else if ($mois==12){$mois_suiv=1;	$annee_suiv=$annee+1;}
+	$prec = array($annee_prec, $mois_prec, 1, "mois");
+	$suiv = array($annee_suiv, $mois_suiv, 1, "mois");
+	$periode = affdate_mois_annee("$annee-$mois-1");
+	}
+	return
+	  "\n<tr><td colspan='7'>" .
+	  http_calendrier_navigation($annee,
+				   $mois,
+				   $jour,
+				   $echelle,
+				   $partie_cal,
+				   $periode,
+				   $script,
+				   $prec,
+				   $suiv,
+				   'mois',
+				   $ancre) .
+	  "</td></tr>";
+
+}
+
+function http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre){
+	global $couleur_claire;
+
+	$bandeau ="";
+	for ($j=1; $j<8;$j++){
+		$bandeau .= 
+		  "\n\t<th class='calendrier-th'>" .
+		  _T('date_jour_' . (($j%7)+1)) .
+		  "</th>";
+	}
+	return "\n<tr" .
+	  (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . 
+	  ">$bandeau\n</tr>";
+}
+
+# dispose les lignes d'un calendrier de 7 colonnes (les jours)
+# chaque case est garnie avec les evenements du jour figurant dans $evenements
+
+function http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, $ancre='')
+{
+	global $couleur_claire, $spip_lang_left, $spip_lang_right;
+
+	// affichage du debut de semaine hors periode
+	$init = '';
+	$debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
+	for ($i=$debut ? $debut : 7;$i>1;$i--)
+	  {$init .= "\n\t<td style=\"border-bottom: 1px solid $couleur_claire;\">&nbsp;</td>";}
+
+	$total = '';
+	$ligne = '';
+	$today=date("Ymd");
+	for ($j=$premier_jour; $j<=$dernier_jour; $j++){
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour = date("d",$nom);
+		$jour_semaine = date("w",$nom);
+		$mois_en_cours = date("m",$nom);
+		$annee_en_cours = date("Y",$nom);
+		$amj = date("Y",$nom) . $mois_en_cours . $jour;
+		$couleur_texte = "black";
+		$couleur_fond = "";
+
+		if ($jour_semaine == 0) $couleur_fond = $couleur_claire;
+		else if ($jour_semaine==1)
+			  { 
+			    if ($ligne||$init)
+			      $total .= "\n<tr>$init$ligne\n</tr>";
+			    $ligne = $init = '';
+			  }
+		
+		if ($amj == $today) {
+			$couleur_texte = "red";
+			$couleur_fond = "white";
+		}
+		$res = '';
+		if ($evts = $evenements[$amj]) {
+		  foreach ($evts as $evenement)
+		    {
+		      $res .= isset($evenement['DTSTART']) ?
+			http_calendrier_avec_heure($evenement, $amj) :
+			http_calendrier_sans_heure($evenement);
+		    }
+		}
+
+		$ligne .= "\n\t\t<td\tclass='calendrier-td'
+			style='height: 100px; border-bottom: 1px solid $couleur_claire; border-$spip_lang_right: 1px solid $couleur_claire;" .
+		  ($couleur_fond ? " background-color: $couleur_fond;" : "") .
+		  ($ligne ? "" :
+		   " border-$spip_lang_left: 1px solid $couleur_claire;") .
+		  "'>" .
+		  (!_DIR_RESTREINT ? 
+		   (http_href(calendrier_args_date($script,$annee_en_cours, $mois_en_cours, $jour, "jour", $ancre), 
+			      $jour,
+			      $jour, "color: $couleur_texte",'calendrier-helvetica16') . 
+		    http_calendrier_ics_message($annee_en_cours, $mois_en_cours, $jour, false)):
+		   http_calendrier_mois_clics($annee_en_cours, $mois_en_cours, $jour, $script, $ancre)) .
+		  $res .
+		  "\n\t</td>";
+	}
+	return  $total . ($ligne ? "\n<tr>$ligne\n</tr>" : '');
+}
+
+// typo pour l'espace public
+
+function http_calendrier_mois_clics($annee, $mois, $jour, $script, $ancre)
+{
+      $d = mktime(0,0,0,$mois, $jour, $annee);
+      $semaine = date("W", $d);
+      return 
+	"<table width='100%'>\n<tr><td style='text-align: left'>". 
+	http_href(calendrier_args_date($script,$annee, $mois, $jour, "jour", $ancre), 
+		  "$jour/$mois",
+		  _T('date_jour_'. (1+date('w',$d))) .
+		  " $jour " .
+		  _T('date_mois_'.(0+$mois)),
+		  '','calendrier-helvetica16') .
+	"</td><td style='text-align: right'>" .
+	http_href(calendrier_args_date($script,$annee, $mois, $jour, "semaine", $ancre),
+		  $semaine,
+		  _T('date_semaines') . ": $semaine",
+		  '',
+		  'calendrier-helvetica16') .
+	"</td></tr>\n</table>";
+}
+
+# dispose les evenements d'une semaine
+
+function http_calendrier_semaine($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	$init = date("w",mktime(1,1,1,$mois,$jour,$annee));
+	$init = $jour+1-($init ? $init : 7);
+	$sd = '';
+
+	if (is_array($evt))
+	  {
+	  	if($partie_cal!='sansheure'){
+	    $sd = http_calendrier_sans_date($annee, $mois,$evt[0]);
+	    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+	    $evt =
+	      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+	      http_calendrier_semaine_sept($annee, $mois, $init, $echelle, $partie_cal, $evt);
+	  	}
+	  	else {
+			  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+			  if ($sansduree)
+			    foreach($sansduree as $d => $r) 
+			      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+		    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+		    $evt =
+		      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+		      http_calendrier_mois_sept($annee, $mois, $init, $init+ 6, $evenements, $script);
+	  	}
+	  } else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  "</table>" .
+	  $sd .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
+
+function http_calendrier_semaine_navigation($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
+
+	$fin = mktime (1,1,1,$mois, $jour+6, $annee);
+	$fjour = date("d",$fin);
+	$fmois = date("m",$fin);
+	$fannee = date("Y",$fin);
+	$fin = date("Y-m-d", $fin);
+	$debut = mktime (1,1,1,$mois, $jour, $annee);
+	$djour = date("d",$debut)+0;
+	$dmois = date("m",$debut);
+	$dannee = date("Y",$debut);
+	$debut = date("Y-m-d", $debut);
+	$periode = (($dannee != $fannee) ?
+		    (affdate($debut)." - ".affdate($fin)) :
+		    (($dmois == $fmois) ?
+		     ($djour ." - ".affdate_jourcourt($fin)) :
+		     (affdate_jourcourt($debut)." - ".affdate_jourcourt($fin))));
+
+  return
+    "\n<tr><td colspan='7'>" .
+    http_calendrier_navigation($annee,
+			       $mois,
+			       $jour,
+			       $echelle,
+			       $partie_cal, 
+			       $periode,
+			       $script,
+			       array($dannee, $dmois, ($djour-7), "semaine"),
+			       array($fannee, $fmois, ($fjour+1), "semaine"),
+			       'semaine',
+			       $ancre) .
+    "</td></tr>\n";
+}
+
+function http_calendrier_semaine_noms($annee, $mois, $jour, $script, $ancre){
+	global $couleur_claire;
+
+	$bandeau = '';
+
+	for ($j=$jour; $j<$jour+7;$j++){
+		$nom = mktime(0,0,0,$mois,$j,$annee);
+		$num = intval(date("d", $nom)) ;
+		$numois = date("m",$nom);
+		$nomjour = _T('date_jour_'. (1+date('w',$nom)));
+		$clic = ($nomjour . " " . $num . (($num == 1) ? 'er' : '') .
+			 ($ancre  ? ('/' . $numois) : ''));
+		$bandeau .= 
+		  "\n\t<th class='calendrier-th'>" .
+		  http_href(calendrier_args_date($script, date("Y",$nom), $numois, $num, 'jour', $ancre), $clic, $clic) .
+		  "</th>";
+	}
+	return "\n<tr" .
+	  (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . 
+	  ">$bandeau\n</tr>";
+}
+
+function http_calendrier_semaine_sept($annee, $mois, $jour, $echelle, $partie_cal, $evt)
+{
+	global $couleur_claire, $spip_ecran, $spip_lang_left;
+
+	$largeur =  ($spip_ecran == "large") ? 90 : 60;
+
+	$today=date("Ymd");
+	$total = '';
+	$style = "border-$spip_lang_left: 1px solid $couleur_claire; border-bottom: 1px solid $couleur_claire; border-top: 0px; border-right: 0px;";
+	for ($j=$jour; $j<$jour+7;$j++){
+		$v = mktime(0,0,0,$mois, $j, $annee);
+		$total .= "\n<td class='calendrier-td'>" .
+		  http_calendrier_ics($annee,$mois,$j, $echelle, $partie_cal, $largeur, $evt, ($style . ( (date("w",$v)==0 && isset($couleur_claire)) ? 
+			  " background-color: $couleur_claire;" :
+			  ((date("Ymd", $v) == $today) ? 
+			   " background-color: white;" :
+			   " background-color: #eeeeee;")))) .
+		  "\n</td>";
+	}
+	return "\n<tr class='calendrier-verdana10'>$total</tr>";
+}
+
+
+function http_calendrier_jour($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	return 	
+	  "\n<table class='calendrier-table-$spip_ecran'>" .
+	  "\n<tr><td class='calendrier-td-gauche'></td>" .
+	  "<td colspan='5' class='calendrier-td-centre'>" .
+	  http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal,
+				     (nom_jour("$annee-$mois-$jour") . " " .
+				      affdate_jourcourt("$annee-$mois-$jour")),
+				     $script,
+				     array($annee, $mois, ($jour-1), "jour"),
+				     array($annee, $mois, ($jour+1), "jour"),
+				     'jour',
+				     $ancre) .
+	  "</td>" .
+	  "<td class='calendrier-td-droit calendrier-arial10'></td>" .
+	  "</tr>" .
+	  (!is_array($evt) ? ("<tr><td>$evt</td></tr>") :
+	   (http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre) .
+	    http_calendrier_jour_sept($annee, $mois, $jour, $echelle,  $partie_cal, $script, $ancre, $evt))) .
+	  "</table>";
+}
+
+function http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
+
+	global $spip_ecran;
+	$finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+
+	$gauche = (_DIR_RESTREINT  || ($spip_ecran != "large"));
+	return
+	  "\n<tr><td class='calendrier-td-gauche'>" .
+	  ($gauche ? '' :
+	   http_calendrier_ics_titre($annee,$mois,$jour-1,$script, $finurl)) .
+	  "</td><td colspan='5' class='calendrier-td-centre'>" .
+	  (_DIR_RESTREINT ? '' :
+		   ("\n\t<div class='calendrier-titre'>" .
+		    http_calendrier_ics_message($annee, $mois, $jour, true) .
+		    '</div>')) .
+	  "</td><td class='calendrier-td-droit calendrier-arial10'> " .
+	   (_DIR_RESTREINT ? '' : http_calendrier_ics_titre($annee,$mois,$jour+1,$script, $finurl)) .
+	  "</td></tr>";
+}
+
+function http_calendrier_jour_sept($annee, $mois, $jour, $echelle,  $partie_cal, $script, $ancre, $evt){
+	global $spip_ecran;
+
+	$gauche = (_DIR_RESTREINT  || ($spip_ecran != "large"));
+	if ($partie_cal!="sansheure")
+		return
+		  "<tr class='calendrier-verdana10'>" .
+			# afficher en reduction le tableau du jour precedent
+		  "\n<td class='calendrier-td-gauche'>" .
+		  ($gauche  ? '' :
+		   http_calendrier_ics($annee, $mois, $jour-1, $echelle, $partie_cal, 0, $evt)) .
+		  "</td><td colspan='5' class='calendrier-td-centre'>" .
+		   http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, 300, $evt) .
+		  '</td>' .
+			# afficher en reduction le tableau du jour suivant
+		  "\n<td class='calendrier-td-droit'>" .
+	
+		  (_DIR_RESTREINT ? '' :
+		   http_calendrier_ics($annee, $mois, $jour+1, $echelle, $partie_cal, 0, $evt)) .
+		  '</td>' .
+		  "\n</tr>";
+	else {
+	  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+	  if ($sansduree)
+	    foreach($sansduree as $d => $r) 
+	      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+		return
+		  "<tr class='calendrier-verdana10'>" .
+			# afficher en reduction le tableau du jour precedent
+		  "\n<td class='calendrier-td-gauche'>" .
+		  ($gauche  ? '' :
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour-1, $jour-1,$evenements, $script, $ancre)
+		   ."</table>"
+		   ) .
+		  "</td><td colspan='5' class='calendrier-td-centre'>" .
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour, $jour,$evenements, $script, $ancre) .
+		   "</table>" .
+		  '</td>' .
+			# afficher en reduction le tableau du jour suivant
+		  "\n<td class='calendrier-td-droit'>" .
+		  (_DIR_RESTREINT ? '' :
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour+1, $jour+1,$evenements, $script, $ancre)
+		   ."</table>"
+		   ) .
+		  '</td>' .
+		  "\n</tr>";
+		
+	}
+}
+
+
+// Conversion d'un tableau de champ ics en des balises div positionnees    
+// Le champ categories indique la Classe de CSS a prendre
+// $echelle est le nombre de secondes representees par 1 pixel
+
+function http_calendrier_ics($annee, $mois, $jour,$echelle, $partie_cal,  $largeur, $evt, $style='') {
+	global $spip_lang_left;
+
+	// tableau
+	if ($partie_cal == "soir") {
+		$debut = 12;
+		$fin = 23;
+	} else if ($partie_cal == "matin") {
+		$debut = 4;
+		$fin = 15;
+	} else {
+		$debut = 7;
+		$fin =21;
+	}
+	
+	if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
+
+	list($dimheure, $dimjour, $fontsize, $padding) =
+	  calendrier_echelle($debut, $fin, $echelle);
+	$modif_decalage = round($largeur/8);
+
+	$date = date("Ymd", mktime(0,0,0,$mois, $jour, $annee));
+	list($sansheure, $avecheure) = $evt;
+	$avecheure = $avecheure[$date];
+	$sansheure = $sansheure[$date];
+
+	$total = '';
+
+	if ($avecheure)
+    {
+		$tous = 1 + count($avecheure);
+		$i = 0;
+		foreach($avecheure as $evenement){
+
+			$d = $evenement['DTSTART'];
+			$e = $evenement['DTEND'];
+			$d_jour = substr($d,0,8);
+			$e_jour = $e ? substr($e,0,8) : $d_jour;
+			$debut_avant = false;
+			$fin_apres = false;
+			
+			/* disparues sauf erreur
+			 $radius_top = " radius-top";
+			$radius_bottom = " radius-bottom";
+			*/
+			if ($d_jour <= $date AND $e_jour >= $date)
+			{
+
+			$i++;
+
+			// Verifier si debut est jour precedent
+			if (substr($d,0,8) < $date)
+			{
+				$heure_debut = 0; $minutes_debut = 0;
+				$debut_avant = true;
+				$radius_top = "";
+			}
+			else
+			{
+				$heure_debut = substr($d,-6,2);
+				$minutes_debut = substr($d,-4,2);
+			}
+
+			if (!$e)
+			{ 
+				$heure_fin = $heure_debut ;
+				$minutes_fin = $minutes_debut ;
+				$bordure = "border-bottom: dashed 2px";
+			}
+			else
+			{
+				$bordure = "";
+				if (substr($e,0,8) > $date) 
+				{
+					$heure_fin = 23; $minutes_fin = 59;
+					$fin_apres = true;
+					$radius_bottom = "";
+				}
+				else
+				{
+					$heure_fin = substr($e,-6,2);
+					$minutes_fin = substr($e,-4,2);
+				}
+			}
+			
+			if ($debut_avant && $fin_apres)  $opacity = "-moz-opacity: 0.6; filter: alpha(opacity=60);";
+			else $opacity = "";
+						
+			$haut = calendrier_top ("$heure_debut:$minutes_debut", $debut, $fin, $dimheure, $dimjour, $fontsize);
+			$bas =  !$e ? $haut :calendrier_top ("$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize);
+			$hauteur = calendrier_height ("$heure_debut:$minutes_debut", "$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize);
+
+			if ($bas_prec >= $haut) $decale += $modif_decalage;
+			else $decale = (4 * $fontsize);
+			if ($bas > $bas_prec) $bas_prec = $bas;
+			
+			$url = $evenement['URL']; 
+			$desc = propre($evenement['DESCRIPTION']);
+			$perso = substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@'));
+			$lieu = $evenement['LOCATION'];
+			$sum = ereg_replace(' +','&nbsp;', typo($evenement['SUMMARY']));
+			if (!$sum) { $sum = $desc; $desc = '';}
+			if (!$sum) { $sum = $lieu; $lieu = '';}
+			if (!$sum) { $sum = $perso; $perso = '';}
+			if ($sum)
+			  $sum = "<span class='calendrier-verdana10'><span  style='font-weight: bold;'>$sum</span>$lieu $perso</span>";
+			if (($largeur > 90) && $desc)
+			  $sum .=  "\n<br /><span class='calendrier-noir'>$desc</span>";
+			$colors = $evenement['CATEGORIES'];
+		  $sum = ((!$url) ? $sum : http_href(quote_amp($url), $sum, $desc,"border: 0px",$colors));
+			$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'ics'),'data'=>$sum));
+
+			$total .= "\n<div class='calendrier-arial10 $colors' 
+	style='cursor: auto; position: absolute; overflow: hidden;$opacity z-index: " .
+				$i .
+				"; $spip_lang_left: " .
+				$decale .
+				"px; top: " .
+				$haut .
+				"px; height: " .
+				$hauteur .
+				"px; width: ".
+				($largeur - 2 * ($padding+1)) .
+				"px; font-size: ".
+				floor($fontsize * 1.3) .
+				"px; padding: " .
+				$padding . 
+				"px; $bordure'
+	onmouseover=\"this.style.zIndex=" . $tous . "\"
+	onmouseout=\"this.style.zIndex=" . $i . "\">" .
+			  $sum . 
+				"</div>";
+			}
+		}
+    }
+	return
+	   "\n<div class='calendrier-jour' style='height: ${dimjour}px; font-size: ${fontsize}px;$style'>\n" .
+	  http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize) .
+	  $total .
+	  "\n</div>" .
+	  (!$sansheure ? "" :
+	   http_calendrier_ics_trois($sansheure, $largeur, $dimjour, $fontsize, '')) ;
+
+}
+
+# Affiche une grille horaire 
+# Selon l'echelle demandee, on affiche heure, 1/2 heure 1/4 heure, 5minutes.
+
+function http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize)
+{
+	global $spip_lang_left, $spip_lang_right;
+	$slice = floor($dimheure/(2*$fontsize));
+	if ($slice%2) $slice --;
+	if (!$slice) $slice = 1;
+
+	$total = '';
+	for ($i = $debut; $i < $fin; $i++) {
+		for ($j=0; $j < $slice; $j++) 
+		{
+			$total .= "\n<div class='calendrier-heure" .
+				($j  ? "face" : "pile") .
+				"' style='$spip_lang_left: 0px; top: ".
+				calendrier_top ("$i:".sprintf("%02d",floor(($j*60)/$slice)), $debut, $fin, $dimheure, $dimjour, $fontsize) .
+				"px;'>$i:" .
+				sprintf("%02d",floor(($j*60)/$slice)) . 
+				"</div>";
+		}
+	}
+
+	return "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: 2px;'>0:00</div>" .
+		$total .
+		"\n<div class='calendrier-heurepile' style='$spip_lang_left: 0px; top: ".
+		calendrier_top ("$fin:00", $debut, $fin, $dimheure, $dimjour, $fontsize).
+		"px;'>$fin:00</div>" .
+		"\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: ".
+		($dimjour - $fontsize - 2) .
+		"px;'>23:59</div>";
+}
+
+# si la largeur le permet, les evenements sans duree, 
+# se placent a cote des autres, sinon en dessous
+
+function http_calendrier_ics_trois($evt, $largeur, $dimjour, $fontsize, $border)
+{
+	global $spip_lang_left; 
+
+	$types = array();
+	foreach($evt as $v)
+	  $types[isset($v['DESCRIPTION']) ? 'info_articles' :
+		 (isset($v['DTSTART']) ? 'info_liens_syndiques_3' :
+		  'info_breves_02')][] = $v;
+	$res = '';
+	foreach ($types as $k => $v) {
+	  $res2 = '';
+	  foreach ($v as $evenement) {
+	    $res2 .= http_calendrier_sans_heure($evenement);
+	  }
+	  $res .= "\n<div class='calendrier-verdana10 calendrier-titre'>".
+	    _T($k) .
+	    "</div>" .
+	    $res2;
+	}
+		
+	if ($largeur > 90) {
+		$largeur += (5*$fontsize);
+		$pos = "-$dimjour";
+	} else { $largeur = (3*$fontsize); $pos= 0; }
+	  
+	return "\n<div style='position: relative; z-index: 2; top: ${pos}px; margin-$spip_lang_left: " . $largeur . "px'>$res</div>";
+}
+
+function http_calendrier_ics_titre($annee, $mois, $jour,$script, $finurl='')
+{
+	$date = mktime(0,0,0,$mois, $jour, $annee);
+	$jour = date("d",$date);
+	$mois = date("m",$date);
+	$annee = date("Y",$date);
+	$nom = affdate_jourcourt("$annee-$mois-$jour");
+	return "<div class='calendrier-arial10 calendrier-titre'>" .
+	  http_href(calendrier_args_date($script, $annee, $mois, $jour, 'jour', $finurl), $nom, $nom, '', 'calendrier-noir') .
+	  "</div>";
+}
+
+
+function http_calendrier_sans_date($annee, $mois, $evenements)
+{
+  $r = $evenements[0+($annee . $mois . "00")];
+  if (!$r) return "";
+  $res = "\n<div class='calendrier-arial10 calendrier-titre'>".
+    _T('info_mois_courant').
+    "</div>";
+  foreach ($r as $evenement) $res .= http_calendrier_sans_heure($evenement);
+  return $res;
+}
+
+
+function http_calendrier_sans_heure($ev)
+{
+	$desc = propre($ev['DESCRIPTION']);
+	$sum = $ev['SUMMARY'];
+	if (!$sum) $sum = $desc;
+	$i = isset($ev['DESCRIPTION']) ? 11 : 9; // 11: article; 9:autre
+	if ($ev['URL'])
+	  $sum = http_href(quote_amp($ev['URL']), $sum, $desc);
+	$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$ev,'type'=>'sans_heure'),'data'=>$sum));
+	return "\n<div class='calendrier-arial$i calendrier-evenement'>" .
+	  "<span class='" . $ev['CATEGORIES'] . "'>&nbsp;</span>&nbsp;$sum</div>"; 
+}
+
+function http_calendrier_avec_heure($evenement, $amj)
+{
+	$jour_debut = substr($evenement['DTSTART'], 0,8);
+	$jour_fin = substr($evenement['DTEND'], 0, 8);
+	if ($jour_fin <= 0) $jour_fin = $jour_debut;
+	if (($jour_debut <= 0) OR ($jour_debut > $amj) OR ($jour_fin < $amj))
+	  return "";
+	
+	$desc = propre($evenement['DESCRIPTION']);
+	$sum = $evenement['SUMMARY'];
+	if (!$sum) $sum = $desc;
+	$sum = ereg_replace(' +','&nbsp;', typo($sum));
+	if ($lieu = $evenement['LOCATION'])
+	  $sum .= '<br />' . $lieu;
+	if ($perso = $evenement['ATTENDEE'])
+	  $sum .=  '<br />' . substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@'));
+	if ($evenement['URL'])
+	  $sum = http_href(quote_amp($evenement['URL']), $sum, $desc, 'border: 0px');
+
+	$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'avec_heure'),'data'=>$sum));
+	$opacity = "";
+	$deb_h = substr($evenement['DTSTART'],-6,2);
+	$deb_m = substr($evenement['DTSTART'],-4,2);
+	$fin_h = substr($evenement['DTEND'],-6,2);
+	$fin_m = substr($evenement['DTEND'],-4,2);
+	
+	if ($deb_h >0 OR $deb_m > 0) {
+	  if ((($deb_h > 0) OR ($deb_m > 0)) AND $amj == $jour_debut)
+	    { $deb = "<span  style='font-weight: bold;'>" . $deb_h . ':' . $deb_m . '</span>';}
+	  else { 
+	    $deb = '...'; 
+	  }
+	  
+	  if ((($fin_h > 0) OR ($fin_m > 0)) AND $amj == $jour_fin)
+	    { $fin = "<span  style='font-weight: bold;'>" . $fin_h . ':' . $fin_m . '</span> ';}
+	  else { 
+	    $fin = '...'; 
+	  }
+	  
+	  if ($amj == $jour_debut OR $amj == $jour_fin) {
+	    $sum = "<div>$deb-$fin</div>$sum";
+	  } else {
+	    $opacity =' calendrier-opacity';
+	  }
+	}
+	return "\n<div class='calendrier-arial10 calendrier-evenement " . $evenement['CATEGORIES'] ."$opacity'>$sum\n</div>\n"; 
+}
+
+# Bandeau superieur d'un calendrier selon son $type (jour/mois/annee):
+# 2 icones vers les 2 autres types, a la meme date $jour $mois $annee
+# 2 icones de loupes pour zoom sur la meme date et le meme type
+# 2 fleches appelant le $script sur les periodes $pred/$suiv avec une $ancre
+# et le $nom du calendrier
+
+function http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, $nom, $script, $args_pred, $args_suiv, $type, $ancre)
+{
+	global $spip_lang_right, $spip_lang_left, $couleur_foncee;
+
+	if (!$echelle) $echelle = DEFAUT_D_ECHELLE;
+
+	if ($args_pred) {
+	  list($a, $m, $j, $t) = $args_pred;
+	  $args_pred = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+				 http_img_pack("fleche-$spip_lang_left.png", '&lt;&lt;&lt;', "class='calendrier-png'"),
+				 _T('precedent'));
+	}
+
+	if ($args_suiv) {
+	  list($a, $m, $j, $t) = $args_suiv;
+	  $args_suiv = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+				 http_img_pack("fleche-$spip_lang_right.png",  '&gt;&gt;&gt;', "class='calendrier-png'"),
+				 _T('suivant'));
+	}
+
+	$today=getdate(time());
+	$jour_today = $today["mday"];
+	$mois_today = $today["mon"];
+	$annee_today = $today["year"];
+
+	$id = 'nav-agenda' .ereg_replace('[^A-Za-z0-9]', '', $ancre);
+
+	return 
+	  "<div class='navigation-calendrier calendrier-moztop8'" 
+	  . (!isset($couleur_foncee) ? "" : "\nstyle='background-color: $couleur_foncee;'")
+	  . "><div style='float: $spip_lang_right; padding-left: 5px; padding-right: 5px;'>"
+	  . (($type == "mois") ? '' :
+	     (
+		  http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=sansheure$ancre"),
+				 "sans-heure.gif",
+				 "class='calendrier-png" .
+				 (($partie_cal == "sansheure") ? " calendrier-opacity'" : "'"),
+				 _T('sans_heure'))
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=tout$ancre"),
+				 "heures-tout.png",
+				 "class='calendrier-png" .
+				 (($partie_cal == "tout") ? " calendrier-opacity'" : "'"),
+				 _T('cal_jour_entier'))
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=matin$ancre"),
+				 "heures-am.png",
+				 "class='calendrier-png" .
+				 (($partie_cal == "matin") ? " calendrier-opacity'" : "'"),
+				 _T('cal_matin'))
+
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=soir$ancre"),
+				 "heures-pm.png", 
+				 "class='calendrier-png" .
+				 (($partie_cal == "soir") ? " calendrier-opacity'" : "'"),
+				 _T('cal_apresmidi'))
+		  . "&nbsp;"
+		  . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;partie_cal=$partie_cal&amp;echelle=" .
+					  floor($echelle * 1.5)) . $ancre,
+					 "loupe-moins.gif",
+					 '',
+					 _T('info_zoom'). '-')
+		  . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;partie_cal=$partie_cal&amp;echelle=" .
+					  floor($echelle / 1.5)) . $ancre, 
+					 "loupe-plus.gif",
+					 '', 
+					 _T('info_zoom'). '+')
+		  ))
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "jour", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),"cal-jour.gif",
+			  (($type == 'jour') ? " class='calendrier-opacity'" : ''),
+			  _T('cal_par_jour'))
+
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "semaine", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"), "cal-semaine.gif", 
+			  (($type == 'semaine') ?  " class='calendrier-opacity'" : "" ),
+			  _T('cal_par_semaine'))
+
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "mois", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),"cal-mois.gif",
+			  (($type == 'mois') ? " class='calendrier-opacity'" : "" ),
+			  _T('cal_par_mois'))
+	  . "</div>"
+	  . "&nbsp;&nbsp;"
+	  . http_href_img(calendrier_args_date($script,$annee_today, $mois_today, $jour_today, $type, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+			  "cal-today.gif",
+			  (" onmouseover=\"montrer('$id');\"" .
+			   (($annee == $annee_today && $mois == $mois_today && (($type == 'mois')  || ($jour == $jour_today)))
+			    ? " class='calendrier-opacity'" : "")),
+			  _T("ecrire:info_aujourdhui"))
+	  . "&nbsp;"
+	  . $args_pred 
+	  . $args_suiv
+	  . "&nbsp;&nbsp;"
+	  . $nom
+	  . (_DIR_RESTREINT ? '' :  aide("messcalen"))
+	  . "</div>"
+	  . http_calendrier_invisible($annee, $mois, $jour, $script, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre", $id);
+}
+
+
+// fabrique un petit agenda accessible par survol
+
+function http_calendrier_invisible($annee, $mois, $jour, $script, $ancre, $id)
+{
+	global $spip_lang_right, $spip_lang_left, $couleur_claire;
+	$gadget = "<div style='position: relative;z-index: 1000;'
+			onmouseover=\"montrer('$id');\"
+			onmouseout=\"cacher('$id');\">"
+	  . "<table id='$id' class='calendrier-cadreagenda'"
+	  . (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'")
+	  . ">\n<tr><td colspan='3' style='text-align:$spip_lang_left;'>";
+
+	$annee_avant = $annee - 1;
+	$annee_apres = $annee + 1;
+
+	for ($i=$mois; $i < 13; $i++) {
+	  $nom = nom_mois("$annee_avant-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee_avant, $i, 1, "mois", $ancre),
+				     $nom,$nom . ' ' . $annee_avant,'', 'calendrier-annee') ;
+			}
+	for ($i=1; $i < $mois - 1; $i++) {
+	  $nom = nom_mois("$annee-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee,'', 'calendrier-annee');
+			}
+	$gadget .= "</td></tr>"
+		. "\n<tr><td class='calendrier-tripleagenda'>"
+		. http_calendrier_agenda($annee, $mois-1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>\n<td class='calendrier-tripleagenda'>"
+	  . http_calendrier_agenda($annee, $mois, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>\n<td class='calendrier-tripleagenda'>"
+	  . http_calendrier_agenda($annee, $mois+1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>"
+		. "</tr>"
+		. "\n<tr><td colspan='3' style='text-align:$spip_lang_right;'>";
+	for ($i=$mois+2; $i <= 12; $i++) {
+	  $nom = nom_mois("$annee-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee,'', 'calendrier-annee');
+			}
+	for ($i=1; $i < $mois+1; $i++) {
+	  $nom = nom_mois("$annee_apres-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script, $annee_apres, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee_apres,'', 'calendrier-annee');
+			}
+	return $gadget . "</td></tr></table></div>";
+}
+
+// agenda mensuel 
+
+function http_calendrier_agenda ($annee, $mois, $jour_ved, $mois_ved, $annee_ved, $semaine = false,  $script='', $ancre='', $evt='') {
+
+  if (!$script) $script =  $GLOBALS['PHP_SELF'] ;
+
+  if (!$mois) {$mois = 12; $annee--;}
+  elseif ($mois==13) {$mois = 1; $annee++;}
+  if (!$evt) $evt = sql_calendrier_agenda($annee, $mois);
+  $nom = affdate_mois_annee("$annee-$mois-1");
+  return 
+    "<div class='calendrier-titre calendrier-arial10'>" .
+    http_href(calendrier_args_date($script, $annee, $mois, 1, 'mois', $ancre),
+	      $nom, $nom,
+	      'color: black;') .
+    "<table width='100%' cellspacing='0' cellpadding='0'>" .
+    http_calendrier_agenda_rv ($annee, $mois, $evt,				
+			        'http_calendrier_clic', array($script, $ancre),
+			        $jour_ved, $mois_ved, $annee_ved, 
+				$semaine) . 
+    "</table>" .
+    "</div>";
+}
+
+function http_calendrier_clic($annee, $mois, $jour, $type, $couleur, $perso)
+{
+
+  list($script, $ancre) = $perso;
+
+  return http_href(calendrier_args_date($script, $annee, $mois, $jour,$type, $ancre), 
+		   $jour,
+		   "$jour-$mois-$annee",
+		   "color: $couleur; font-weight: bold");
+}
+
+// typographie un mois sous forme d'un tableau de 7 colonnes
+
+function http_calendrier_agenda_rv ($annee, $mois, $les_rv, $fclic, $perso='',
+				    $jour_ved='', $mois_ved='', $annee_ved='',
+				    $semaine='') {
+	global $couleur_foncee, $spip_lang_left, $spip_lang_right;
+
+	// Former une date correcte (par exemple: $mois=13; $annee=2003)
+	$date_test = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
+	$mois = mois($date_test);
+	$annee = annee($date_test);
+	if ($semaine) 
+	{
+		$jour_semaine_valide = date("w",mktime(1,1,1,$mois_ved,$jour_ved,$annee_ved));
+		if ($jour_semaine_valide==0) $jour_semaine_valide=7;
+		$debut = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+1,$annee_ved);
+		$fin = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+7,$annee_ved);
+	} else { $debut = $fin = '';}
+	
+	$today=getdate(time());
+	$jour_today = $today["mday"];
+	$cemois = ($mois == $today["mon"] AND $annee ==  $today["year"]);
+
+	$total = '';
+	$ligne = '';
+	$jour_semaine = date("w", mktime(1,1,1,$mois,1,$annee));
+	if ($jour_semaine==0) $jour_semaine=7;
+	for ($i=1;$i<$jour_semaine;$i++) $ligne .= "\n\t<td></td>";
+	$style0 = (!isset($couleur_foncee)) ? "" : " style='border: 1px solid $couleur_foncee;'";
+	for ($j=1; (checkdate($mois,$j,$annee)); $j++) {
+		$style = "";
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour_semaine = date("w",$nom);
+		if ($jour_semaine==0) $jour_semaine=7;
+
+		if ($j == $jour_ved AND $mois == $mois_ved AND $annee == $annee_ved) {
+		  $class= 'calendrier-arial11 calendrier-demiagenda';
+		  $type = 'jour';
+		  $couleur = "black";
+		  } else if ($semaine AND $nom >= $debut AND $nom <= $fin) {
+		  $class= 'calendrier-arial11 calendrier-demiagenda' . 
+ 		      (($jour_semaine==1) ? " calendrier-$spip_lang_left"  :
+		       (($jour_semaine==7) ? " calendrier-$spip_lang_right" :
+			''));
+		  $type = ($semaine ? 'semaine' : 'jour') ;
+		  $couleur = "black";
+		} else {
+		  if ($j == $jour_today AND $cemois) {
+			$style = $couleur_foncee;
+			if(!$style) $style = '#333333';
+			$couleur = "white";
+		    } else {
+			if ($jour_semaine == 7) {
+				$style = "#aaaaaa";
+				$couleur = 'white';
+			} else {
+				$style = "#ffffff";
+				$couleur = "#aaaaaa";
+			}
+			if ($les_rv[$j] > 0) {
+			  $style = "#ffffff";
+			  $couleur = "black";
+			}
+		  }
+		  $class= 'calendrier-arial11 calendrier-agenda';
+		  $type = ($semaine ? 'semaine' : 'jour') ;
+		}
+		if ($style)
+		  $style = " style='background-color: $style'";
+		else $style = $style0;
+		$ligne .= "\n\t<td><div class='$class'$style>" .
+		  $fclic($annee,$mois, $j, $type, $couleur, $perso) .
+		  "</div></td>";
+		if ($jour_semaine==7) 
+		    {
+		      if ($ligne) $total .= "\n<tr>$ligne\n</tr>";
+		      $ligne = '';
+		    }
+	}
+	return $total . (!$ligne ? '' : "\n<tr>$ligne\n</tr>");
+}
+
+
+function calendrier_categories($table, $num, $objet)
+{
+  if (function_exists('generer_calendrier_class'))
+    return generer_calendrier_class($table, $num, $objet);
+  else {
+    // cf calendrier.css
+    $result= spip_fetch_array(spip_query("SELECT " . (($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . "
+FROM	$table
+WHERE	$objet=$num
+"));
+    if ($result) $num = $result[0];
+    return 'calendrier-couleur' . (($num%14)+1);
+  }
+}
+
+//------- fonctions d'appel MySQL. 
+// au dela cette limite, pas de production HTML
+
+function sql_calendrier_mois($annee,$mois,$jour) {
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,1,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(0,0,0,$mois+1,1,$annee)) .
+	" 00:00:00'";
+	return array($avant, $apres);
+}
+
+function sql_calendrier_semaine($annee,$mois,$jour) {
+	$w_day = date("w", mktime(0,0,0,$mois, $jour, $annee));
+	if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero
+	$debut = $jour-$w_day;
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$debut,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$debut+7,$annee)) .
+	" 23:59:59'";
+	return array($avant, $apres);
+}
+
+// ici on prend en fait le jour, la veille et le lendemain
+
+function sql_calendrier_jour($annee,$mois,$jour) {
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$jour-1,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$jour+1,$annee)) .
+	" 23:59:59'";
+	return array($avant, $apres);
+}
+
+// retourne un tableau de 2 tableaux indexes par des dates
+// - le premier indique les evenements du jour, sans indication de duree
+// - le deuxime indique les evenements commencant ce jour, avec indication de duree
+
+function sql_calendrier_interval($limites) {
+	list($avant, $apres) = $limites;
+	$evt = array();
+	sql_calendrier_interval_articles($avant, $apres, $evt);
+	sql_calendrier_interval_breves($avant, $apres, $evt);
+	sql_calendrier_interval_rubriques($avant, $apres, $evt);
+	return array($evt, sql_calendrier_interval_rv($avant, $apres));
+}
+
+function  sql_calendrier_interval_forums($limites, &$evenements) {
+	list($avant, $apres) = $limites;
+	$result=spip_query("
+SELECT	DISTINCT titre, date_heure, id_forum
+FROM	spip_forum
+WHERE	date_heure >= $avant
+ AND	date_heure < $apres
+ORDER BY date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date_heure']);
+		$id = $row['id_forum'];
+		$evenements[$amj][]=
+		array(
+			'URL' => generer_url_forum($id),
+			'CATEGORIES' => 'calendrier-couleur7',
+			'SUMMARY' => $row['titre'],
+			'DTSTART' => date_ical($row['date_heure']));
+	}
+}
+
+# 3 fonctions retournant les evenements d'une periode
+# le tableau retourne est indexe par les balises du format ics
+# afin qu'il soit facile de produire de tels documents.
+
+function sql_calendrier_interval_articles($avant, $apres, &$evenements) {
+	
+	$result=spip_query("
+SELECT	id_article, titre, date, descriptif, chapo
+FROM	spip_articles
+WHERE	statut='publie'
+ AND	date >= $avant
+ AND	date < $apres
+ORDER BY date
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date']);
+		$id = $row['id_article'];
+		$evenements[$amj][]=
+		    array(
+			  'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
+			'DESCRIPTION' => $row['descriptif'],
+			'SUMMARY' => $row['titre'],
+			'URL' => generer_url_article($id, 'prop'));
+	}
+}
+
+function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) {
+	
+	$result=spip_query("
+SELECT	DISTINCT R.id_rubrique, titre, descriptif, date
+FROM	spip_rubriques AS R, spip_documents_rubriques AS L
+WHERE	statut='publie'
+ AND	date >= $avant
+ AND	date < $apres
+ AND	R.id_rubrique = L.id_rubrique
+ORDER BY date
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date']);
+		$id = $row['id_rubrique'];
+		$evenements[$amj][]=
+		    array(
+			  'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
+			'DESCRIPTION' => $row['descriptif'],
+			'SUMMARY' => $row['titre'],
+			'URL' => generer_url_rubrique($id, 'prop'));
+	}
+}
+
+function sql_calendrier_interval_breves($avant, $apres, &$evenements) {
+	$result=spip_query("
+SELECT	id_breve, titre, date_heure, id_rubrique
+FROM	spip_breves
+WHERE	statut='publie'
+ AND	date_heure >= $avant
+ AND	date_heure < $apres
+ORDER BY date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date_heure']);
+		$id = $row['id_breve'];
+		$ir = $row['id_rubrique'];
+		$evenements[$amj][]=
+		array(
+		      'URL' => generer_url_breve($id, 'prop'),
+		      'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
+		      'SUMMARY' => $row['titre']);
+	}
+}
+
+function sql_calendrier_interval_rv($avant, $apres) {
+	global $connect_id_auteur;
+	$evenements= array();
+	if (!$connect_id_auteur) return $evenements;
+	$result=spip_query("
+SELECT	messages.id_message, messages.titre, messages.texte,
+	messages.date_heure, messages.date_fin, messages.type
+FROM	spip_messages AS messages, 
+	spip_auteurs_messages AS lien
+WHERE	((lien.id_auteur='$connect_id_auteur'
+ AND	lien.id_message=messages.id_message) OR messages.type='affich')
+ AND	messages.rv='oui' 
+ AND	((messages.date_fin >= $avant OR messages.date_heure >= $avant) AND messages.date_heure <= $apres)
+ AND	messages.statut='publie'
+GROUP BY messages.id_message
+ORDER BY messages.date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$date_heure=$row["date_heure"];
+		$date_fin=$row["date_fin"];
+		$type=$row["type"];
+		$id_message=$row['id_message'];
+
+		if ($type=="pb")
+		  $cat = 'calendrier-couleur2';
+		else {
+		  if ($type=="affich")
+		  $cat = 'calendrier-couleur4';
+		  else {
+		    if ($type!="normal")
+		      $cat = 'calendrier-couleur12';
+		    else {
+		      $cat = 'calendrier-couleur9';
+		      $auteurs = array();
+		      $result_aut=spip_query("
+SELECT	auteurs.nom 
+FROM	spip_auteurs AS auteurs,
+	spip_auteurs_messages AS lien 
+WHERE	(lien.id_message='$id_message' 
+  AND	(auteurs.id_auteur!='$connect_id_auteur'
+  AND	lien.id_auteur=auteurs.id_auteur))");
+			while($row_auteur=spip_fetch_array($result_aut)){
+				$auteurs[] = $row_auteur['nom'];
+			}
+		    }
+		  }
+		}
+
+		$jour_avant = substr($avant, 9,2);
+		$mois_avant = substr($avant, 6,2);
+		$annee_avant = substr($avant, 1,4);
+		$jour_apres = substr($apres, 9,2);
+		$mois_apres = substr($apres, 6,2);
+		$annee_apres = substr($apres, 1,4);
+		$ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-".sprintf("%02d",$jour_apres));
+
+		// Calcul pour les semaines a cheval sur deux mois 
+ 		$j = 0;
+		$amj = date_anneemoisjour("$annee_avant-$mois_avant-".sprintf("%02d", $j+($jour_avant)));
+
+		while ($amj <= $ical_apres) {
+		if (!($amj == date_anneemoisjour($date_fin) AND ereg("00:00:00", $date_fin)))  // Ne pas prendre la fin a minuit sur jour precedent
+			$evenements[$amj][$id_message]=
+			  array(
+				'URL' => generer_url_ecrire("message","id_message=$id_message"),
+				'DTSTART' => date_ical($date_heure),
+				'DTEND' => date_ical($date_fin),
+				'DESCRIPTION' => $row['texte'],
+				'SUMMARY' => $row['titre'],
+				'CATEGORIES' => $cat,
+				'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs,", "));
+			
+			$j ++; 
+			$ladate = date("Y-m-d",mktime (1,1,1,$mois_avant, ($j + $jour_avant), $annee_avant));
+			
+			$amj = date_anneemoisjour($ladate);
+
+		}
+
+	}
+  return $evenements;
+}
+
+// fonction SQL, pour la messagerie
+
+function sql_calendrier_taches_annonces () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT * FROM spip_messages 
+WHERE type = 'affich' AND rv != 'oui' AND statut = 'publie' ORDER BY date_heure DESC");
+	if (spip_num_rows($result) > 0)
+		while ($x = spip_fetch_array($result)) $r[] = $x;
+	return $r;
+}
+
+function sql_calendrier_taches_pb () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT * FROM spip_messages AS messages 
+WHERE id_auteur=$connect_id_auteur AND statut='publie' AND type='pb' AND rv!='oui'");
+	if (spip_num_rows($result) > 0){
+	  $r = array();
+	  while ($x = spip_fetch_array($result)) $r[] = $x;
+	}
+	return $r;
+}
+
+function sql_calendrier_taches_rv () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT messages.* 
+FROM spip_messages AS messages, spip_auteurs_messages AS lien 
+WHERE ((lien.id_auteur='$connect_id_auteur' 
+	AND lien.id_message=messages.id_message) 
+	OR messages.type='affich') 
+AND messages.rv='oui'
+AND ( (messages.date_heure > DATE_SUB(NOW(), INTERVAL 1 DAY) 
+	AND messages.date_heure < DATE_ADD(NOW(), INTERVAL 1 MONTH))
+	OR (messages.date_heure < NOW() AND messages.date_fin > NOW() ))
+AND messages.statut='publie' 
+GROUP BY messages.id_message 
+ORDER BY messages.date_heure");
+	if (spip_num_rows($result) > 0){
+	  $r = array();
+	  while ($x = spip_fetch_array($result)) $r[] = $x;
+	}
+	return  $r;
+}
+
+function sql_calendrier_agenda ($annee, $mois) {
+	global $connect_id_auteur;
+
+	$rv = array();
+	if (!$connect_id_auteur) return $rv;
+	$date = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
+	$mois = mois($date);
+	$annee = annee($date);
+
+	// rendez-vous personnels dans le mois
+	$result_messages=spip_query("SELECT messages.date_heure FROM spip_messages AS messages, spip_auteurs_messages AS lien WHERE ((lien.id_auteur='$connect_id_auteur' AND lien.id_message=messages.id_message) OR messages.type='affich') AND messages.rv='oui' AND messages.date_heure >='$annee-$mois-1' AND date_heure < DATE_ADD('$annee-$mois-1', INTERVAL 1 MONTH) AND messages.statut='publie'");
+	while($row=spip_fetch_array($result_messages)){
+		$rv[journum($row['date_heure'])] = 1;
+	}
+	return $rv;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda_filtres.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda_filtres.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda_filtres.php	(revision 30)
@@ -0,0 +1,200 @@
+<?php
+/**
+ * Fichier de filtres communs au plugin Agenda et PIM_agenda
+ *
+ */
+
+function Agenda_memo_full($date_deb=0, $date_fin=0 , $titre='', $descriptif='', $lieu='', $url='', $cal='')
+{
+	static $agenda = array();
+	if (!$date_deb) {
+		$res = $agenda;
+		$agenda=array();
+		return $res;
+	}
+	$url=str_replace("&amp;","&",$url);
+	
+	$idatedeb = date_ical($date_deb);
+	$idatefin = date_ical($date_fin);
+	$cal = trim($cal); // func_get_args (filtre alterner) rajoute \n !!!!
+	$startday1=explode(' ',$date_deb);
+	$startday1=$startday1['0'].' 00:00:00';
+	$ts_startday1=strtotime($startday1);
+	$ts_date_fin=strtotime($date_fin);
+	$maxdays=365;
+	while (($ts_startday1<$ts_date_fin)&&($maxdays-->0))
+	{
+		$day=date('Y-m-d H:i:s',$ts_startday1);
+		$agenda[$cal][(date_anneemoisjour($day))][] =  array(
+			'CATEGORIES' => $cal,
+			'DTSTART' => $idatedeb,
+			'DTEND' => $idatefin,
+			'DESCRIPTION' => $descriptif,
+			'SUMMARY' => $titre,
+			'LOCATION' => $lieu,
+			'URL' => $url);
+		$ts_startday1 += 24*3600; // le jour suivant
+	}
+
+	// toujours retourner vide pour qu'il ne se passe rien
+	return "";
+}
+
+function Agenda_memo_evt_full($date_deb=0, $date_fin=0 , $titre='', $descriptif='', $lieu='', $url='', $cal='')
+{
+	static $evenements = array();
+	if (!$date_deb) return $evenements;
+	$url=str_replace("&amp;","&",$url);
+	
+	$idatedeb = date_ical(reset(explode(" ",$date_deb))." 00:00:00");
+	$idatefin = date_ical(reset(explode(" ",$date_fin))." 00:00:00");
+	$cal = trim($cal); // func_get_args (filtre alterner) rajoute \n !!!!
+	$startday1=explode(' ',$date_deb);
+	$startday1=$startday1['0'].' 00:00:00';
+	$ts_startday1=strtotime($startday1);
+	$ts_date_fin=strtotime($date_fin);
+	$maxdays=365;
+	while (($ts_startday1<$ts_date_fin)&&($maxdays-->0))
+	{
+		$day=date('Y-m-d H:i:s',$ts_startday1);
+		$evenements[$cal][(date_anneemoisjour($day))][] =  array(
+			'CATEGORIES' => $cal,
+			'DTSTART' => $idatedeb,
+			'DTEND' => $idatefin,
+			'DESCRIPTION' => $descriptif,
+			'SUMMARY' => $titre,
+			'LOCATION' => $lieu,
+			'URL' => $url);
+		$ts_startday1 += 24*3600; // le jour suivant
+	}
+
+	// toujours retourner vide pour qu'il ne se passe rien
+	return "";
+}
+
+function Agenda_affiche_full($i)
+{
+	$args = func_get_args();
+	$nb = array_shift($args); // nombre d'evenements (on pourrait l'afficher)
+	$sinon = array_shift($args);
+	if (!$nb) return $sinon;
+	$type = array_shift($args);
+	$agenda = Agenda_memo_full(0);
+	$evt_avec = array();
+	foreach (($args ? $args : array_keys($agenda)) as $k) {
+		if (isset($agenda[$k])&&is_array($agenda[$k]))
+			foreach($agenda[$k] as $d => $v) {
+				$evt_avec[$d] = isset($evt_avec[$d]) ? (array_merge($evt_avec[$d], $v)) : $v;
+			}
+	}
+
+	$evenements = Agenda_memo_evt_full(0);
+	$evt_sans = array();
+	foreach (($args ? $args : array_keys($evenements)) as $k) {
+		if (isset($evenements[$k])&&is_array($evenements[$k]))
+			foreach($evenements[$k] as $d => $v) {
+				$evt_sans[$d] = isset($evt_sans[$d]) ? (array_merge($evt_sans[$d], $v)) : $v;
+			}
+	}
+
+
+	if ($type != 'periode')
+		$evt = array($evt_sans, $evt_avec);
+	else
+	{
+		$d = array_keys($evt_avec);
+		$mindate = min($d);
+		$min = substr($mindate,6,2);
+		$max = $min + ((strtotime(max($d)) - strtotime($mindate)) / (3600 * 24));
+		if ($max < 31) $max = 0;
+			$evt = array($evt_sans, $evt_avec, $min, $max);
+		$type = 'mois';
+	}
+
+	include_spip('inc/agenda');
+	$texte=http_calendrier_init('', $type, '', '', self(), $evt);
+
+	return $texte;
+}
+
+function Agenda_affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui'){
+	static $trans_tbl=NULL;
+	if ($trans_tbl==NULL){
+		$trans_tbl = get_html_translation_table (HTML_ENTITIES);
+		$trans_tbl = array_flip ($trans_tbl);
+	}
+	
+	$date_debut = strtotime($date_debut);
+	$date_fin = strtotime($date_fin);
+	$s = "";
+	if (($d=date("Y-m-d",$date_debut))==date("Y-m-d",$date_fin))
+	{ // meme jour
+		$s = ucfirst(nom_jour($d))." ".affdate_jourcourt($d);
+		if ($horaire=='oui'){
+			$s .= " ".($hd=date("H:i",$date_debut));
+			if ($hd!=($hf=date("H:i",$date_fin)))
+				$s .= "-$hf";
+		}
+	}
+	else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin))
+	{ // meme annee et mois, jours differents
+		$d=date("Y-m-d",$date_debut);
+		if ($horaire=='oui'){
+			$s = _T('agenda:evenement_date_du') . " " . affdate_jourcourt($d);
+			$s .= " ".($hd=date("H:i",$date_debut));
+			$s .= " " . _T('agenda:evenement_date_au').date("d  H:i ",$date_fin);
+		}
+		else {
+			$s = _T('agenda:evenement_date_du') . " " . jour($d);
+			$s .= " " . _T('agenda:evenement_date_au').affdate_jourcourt(date("Y-m-d",$date_fin));
+		}
+	}
+	else if ((date("Y",$date_debut))==date("Y",$date_fin))
+	{ // meme annee, mois et jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = _T('agenda:evenement_date_du') . " " . affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= " "._T('agenda:evenement_date_au').affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_fin);
+	}
+	else
+	{ // tout different
+		$s = _T('agenda:evenement_date_du') . " " . affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= " "._T('agenda:evenement_date_au').affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_fin);
+	}
+	return unicode2charset(charset2unicode(strtr($s,$trans_tbl),''));	
+}
+
+function Agenda_dateplus($date,$secondes,$format){
+	$date = strtotime($date)+eval("return $secondes;"); // permet de passer une expression
+	return date($format,$date);
+}
+
+// decale les mois de la date.
+// cette fonction peut raboter le jour si le nouveau mois ne les contient pas
+// exemple 31/01/2007 + 1 mois => 28/02/2007
+function Agenda_moisdecal($date,$decalage,$format){
+	include_spip('inc/filtres');
+	$date_array = recup_date($date);
+	if ($date_array) list($annee, $mois, $jour) = $date_array;
+	if (!$jour) $jour=1;
+	if (!$mois) $mois=1;
+	$mois2 = $mois + $decalage;
+	$date2 = mktime(1, 1, 1, $mois2, $jour, $annee);
+	// mois normalement attendu
+	$mois3 = date('m', mktime(1, 1, 1, $mois2, 1, $annee));
+	// et si le mois de la nouvelle date a moins de jours...
+	$mois2 = date('m', $date2);
+	if ($mois2 - $mois3) $date2 = mktime(1, 1, 1, $mois2, 0, $annee);
+	return date($format, $date2);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda_gestion.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda_gestion.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/inc/agenda_gestion.php	(revision 30)
@@ -0,0 +1,753 @@
+<?php
+
+include_spip('inc/texte');
+include_spip('inc/date');
+
+function Agenda_install(){
+	Agenda_verifier_base();
+}
+
+function Agenda_uninstall(){
+	include_spip('base/agenda_evenements');
+	include_spip('base/abstract_sql');
+
+	// suppression du champ evenements a la table spip_groupe_mots
+	spip_query("ALTER TABLE `spip_groupes_mots` DROP `evenements`");
+	
+}
+
+function Agenda_verifier_base(){
+	$version_base = 0.12;
+	$current_version = 0.0;
+	if (   (!isset($GLOBALS['meta']['agenda_base_version']) )
+			|| (($current_version = $GLOBALS['meta']['agenda_base_version'])!=$version_base)){
+		include_spip('base/agenda_evenements');
+		if ($current_version==0.0){
+			include_spip('base/create');
+			include_spip('base/abstract_sql');
+			creer_base();
+			// ajout du champ evenements a la table spip_groupe_mots
+			// si pas deja existant
+			$desc = spip_abstract_showtable("spip_groupes_mots", '', true);
+			if (!isset($desc['field']['evenements'])){
+				spip_query("ALTER TABLE spip_groupes_mots ADD `evenements` VARCHAR(3) NOT NULL AFTER `syndic`");
+			}
+			ecrire_meta('agenda_base_version',$current_version=$version_base);
+		}
+		if ($current_version<0.11){
+			spip_query("ALTER TABLE spip_evenements ADD `horaire` ENUM('oui','non') DEFAULT 'oui' NOT NULL AFTER `lieu`");
+			ecrire_meta('agenda_base_version',$current_version=0.11);
+		}
+		if ($current_version<0.12){
+			spip_query("ALTER TABLE spip_evenements ADD `id_article` bigint(21) DEFAULT '0' NOT NULL AFTER `id_evenement`");
+			spip_query("ALTER TABLE spip_evenements ADD INDEX ( `id_article` )");
+			$res = spip_query ("SELECT * FROM spip_evenements_articles");
+			while ($row = spip_fetch_array($res)){
+				$id_article = $row['id_article'];
+				$id_evenement = $row['id_evenement'];
+				spip_query("UPDATE spip_evenements SET id_article=$id_article WHERE id_evenement=$id_evenement");
+			}
+			spip_query("DROP TABLE spip_evenements_articles");
+			ecrire_meta('agenda_base_version',$current_version=0.12);
+		}
+		
+		ecrire_metas();
+	}
+	
+	if (isset($GLOBALS['meta']['INDEX_elements_objet'])){
+		$INDEX_elements_objet = unserialize($GLOBALS['meta']['INDEX_elements_objet']);
+		if (!isset($INDEX_elements_objet['spip_evenements'])){
+			$INDEX_elements_objet['spip_evenements'] = array('titre'=>8,'descriptif'=>4,'lieu'=>3);
+			ecrire_meta('INDEX_elements_objet',serialize($INDEX_elements_objet));
+			ecrire_metas();
+		}
+	}
+	if (isset($GLOBALS['meta']['INDEX_objet_associes'])){
+		$INDEX_objet_associes = unserialize($GLOBALS['meta']['INDEX_objet_associes']);
+		if (!isset($INDEX_objet_associes['spip_articles']['spip_evenements'])){
+			$INDEX_objet_associes['spip_articles']['spip_evenements'] = 1;
+			ecrire_meta('INDEX_objet_associes',serialize($INDEX_objet_associes));
+			ecrire_metas();
+		}
+	}
+	if (isset($GLOBALS['meta']['INDEX_elements_associes'])){
+		$INDEX_elements_associes = unserialize($GLOBALS['meta']['INDEX_elements_associes']);
+		if (!isset($INDEX_elements_associes['spip_evenements'])){
+			$INDEX_elements_associes['spip_evenements'] = array('titre'=>2,'descriptif'=>1);
+			ecrire_meta('INDEX_elements_associes',serialize($INDEX_elements_associes));
+			ecrire_metas();
+		}
+	}
+}
+
+function article_editable($id_article){
+	$flag_editable = false;
+	global $connect_id_auteur, $id_secteur; 
+
+ 	$id_parent = intval($id_parent);
+ 	if (!($id_article=intval($id_article)))
+ 		return false;
+
+	if ($row = spip_fetch_array(spip_query("SELECT statut, titre, id_rubrique FROM spip_articles WHERE id_article=".spip_abstract_quote($id_article)))) {
+		$statut_article = $row['statut'];
+		$titre_article = $row['titre'];
+		$id_rubrique = $row['id_rubrique'];
+		$statut_rubrique = acces_rubrique($id_rubrique);
+		if ($titre_article=='') $titre_article = _T('info_sans_titre');
+	}
+	else {
+		$statut_article = '';
+		$statut_rubrique = false;
+		$id_rubrique = '0';
+		if ($titre=='') $titre = _T('info_sans_titre');
+	}
+
+	$flag_auteur = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=".spip_abstract_quote($id_article)." AND id_auteur=".spip_abstract_quote($connect_id_auteur)." LIMIT 1"));
+
+	$ok_nouveau_statut = false;
+	$flag_editable = ($statut_rubrique
+		OR ($flag_auteur
+			AND ($statut_article == 'prepa'
+				OR $statut_article == 'prop' 
+				OR $statut_article == 'poubelle')));
+	return $flag_editable;
+}
+
+function Agenda_afficher_date_evenement($date_debut, $date_fin, $horaire){
+	$s = "";
+	if (($d=date("Y-m-d",$date_debut))==date("Y-m-d",$date_fin))
+	{ // meme jour
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui'){
+			$s .= " ".($hd=date("H:i",$date_debut));
+			if ($hd!=($hf=date("H:i",$date_fin)))
+				$s .= "-$hf";
+		}
+	}
+	else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin))
+	{ // meme annee et mois, jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".($hd=date("H:i",$date_debut));
+		$s .= "<br/>"._T('agenda:evenement_date_au').date(($horaire=='oui')?"d  H:i ":"d ",$date_fin);
+	}
+	else if ((date("Y",$date_debut))==date("Y",$date_fin))
+	{ // meme annee, mois et jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= "<br/>"._T('agenda:evenement_date_au').affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_fin);
+	}
+	else
+	{ // tout different
+		$s = affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= "<br/>"._T('agenda:evenement_date_au').affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_fin);
+	}
+	return $s;	
+}
+
+function Agenda_formulaire_article_afficher_evenements($id_article, $flag_editable)
+{
+	global $connect_statut, $options,$connect_id_auteur;
+	$out = "";
+
+	$les_evenements = array();
+
+	$result = spip_query( "SELECT * FROM spip_evenements AS evenements "
+	. "WHERE evenements.id_article=".spip_abstract_quote($id_article)
+	. " AND evenements.id_evenement_source=0"
+	. " GROUP BY evenements.id_evenement ORDER BY evenements.date_debut");
+
+	if (spip_num_rows($result)) {
+		$out .= "<div class='liste liste-evenements'>";
+		$out .= "<table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>";
+		$table = array();
+		while ($row = spip_fetch_array($result,SPIP_ASSOC)) {
+			$vals = array();
+			$id_evenement = $row['id_evenement'];
+			$titre = typo($row['titre']);
+			$descriptif = typo($row['descriptif']);
+			$horaire = $row['horaire'];
+			$date_debut = strtotime($row['date_debut']);
+			$date_fin = strtotime($row['date_fin']);
+			$id_evenement_source = $row['id_evenement_source'];
+			$repetition = ($id_evenement_source!=0);
+			
+			$les_evenements[] = $id_evenement;
+
+			$s = "<a href='".generer_url_ecrire('calendrier',"id_evenement=$id_evenement&ajouter_id_article=$id_article")."'>";
+			$s .= http_img_pack("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-12.png",'', "border='0'", _T('agenda:titre_sur_l_agenda'));
+			$s .= "</a>";
+			$vals[] = $s;
+
+			$s = Agenda_afficher_date_evenement($date_debut,$date_fin, $horaire);
+			$s_rep = "";
+			$count_rep = 0;
+			$res2 = spip_query("SELECT * FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($id_evenement)." ORDER BY date_debut");
+			while ($row2 = spip_fetch_array($res2)){
+				$s_rep .= Agenda_afficher_date_evenement(strtotime($row2['date_debut']),strtotime($row2['date_fin']),$row2['horaire'])."<br/>";
+				$count_rep++;
+			}
+			if (strlen($s_rep)){
+				$s .= "<br/>".bouton_block_invisible("repetitions_evenement_$id_evenement");
+				$s .= "$count_rep ". _T('agenda:evenement_repetitions');
+				$s .= debut_block_invisible("repetitions_evenement_$id_evenement");
+				$s .= $s_rep;
+				$s .= fin_block();
+			}
+
+			$vals[] = $s;
+
+			
+			if ($flag_editable) {
+				$url = self();
+				$url = parametre_url($url,'id_article',$id_article);
+				$url = parametre_url($url,'id_evenement',$id_evenement);
+				$url = parametre_url($url,'edit',1);
+				$s = "<a href='$url'>".($titre ? $titre : '<em>('._T('info_sans_titre').')</em>')."</a>";
+				$vals[] = $s;
+			}
+			else{
+				$vals[] = $titre;
+			}
+			$vals[] = propre($descriptif);
+		
+			if ($flag_editable) {
+				$vals[] =  "<a href='" . generer_url_ecrire("articles","id_article=$id_article&supp_evenement=$id_evenement#agenda") . "'>"._T('agenda:lien_retirer_evenement')."&nbsp;". http_img_pack('croix-rouge.gif', "X", "width='7' height='7' border='0' align='middle'") . "</a>";
+			} else {
+				$vals[] = "";
+			}
+			
+			$table[] = $vals;
+		}
+	
+		$largeurs = array('', '', '', '', '');
+		$styles = array('arial11', 'arial11', 'arial2', 'arial11', 'arial11');
+		$out .= afficher_liste($largeurs, $table, $styles, false);
+	
+		$out .= "</table></div>\n";
+	
+		$les_evenements = join(',', $les_evenements);
+	}
+	return array($out,$les_evenements) ;
+}
+
+
+//
+// Liste des evenements agenda de l'article
+//
+
+function Agenda_formulaire_article_ajouter_evenement($id_article, $les_evenements, $flag_editable){
+  global $spip_lang_left, $spip_lang_right, $options;
+	global $connect_statut, $options,$connect_id_auteur, $couleur_claire ;
+	$id_evenement = intval(_request('id_evenement'));
+	$edit = _request('edit');
+
+	$out = "";
+	$out .= "<div style='clear: both;'></div>";
+	if ($flag_editable){
+		if ((in_array($id_evenement,explode(",",$les_evenements)) && $edit==1)||_request('neweven'))
+			$out .=  debut_block_visible("evenementsarticle");
+		else
+			$out .=  debut_block_invisible("evenementsarticle");
+		
+		$out .=  "<div style='width:100%;'>";
+		$out .=  "<table width='100%'>";
+		$out .=  "<tr>";
+		$out .=  "<td>";
+	
+		$out .=  generer_url_post_ecrire("articles", "id_article=$id_article");
+		if (in_array($id_evenement,explode(",",$les_evenements)) && $edit==1){
+			$out .=  "<span class='verdana1'><strong>"._T('agenda:titre_cadre_modifier_evenement')."&nbsp; </strong></span>\n";
+		} else {
+			$out .=  "<span class='verdana1'><strong>"._T('agenda:titre_cadre_ajouter_evenement')."&nbsp; </strong></span>\n";
+		}
+		$out .=  "<div><input type='hidden' name='id_article' value=\"$id_article\">";
+
+		if (in_array($id_evenement,explode(",",$les_evenements)) && $edit==1){
+			$out .= Agenda_formulaire_edition_evenement($id_evenement, false);
+			$out .= "</div>";
+			$out .=  "</td></tr></table>";
+			$out .= "<div style='clear: both;'></div>";
+			$url = parametre_url(self(),'edit','');
+			$url = parametre_url($url,'neweven','1');
+			$url = parametre_url($url,'id_evenement','');
+			$out .= icone_horizontale(_T("agenda:icone_creer_evenement"),$url , "../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", "creer.gif",false);
+		}
+		else{
+			// recuperer le titre de l'article pour le mettre par defaut sur l'evenement
+			$titre_defaut = "";
+			$res = spip_query("SELECT titre FROM spip_articles where id_article=".spip_abstract_quote($id_article));
+			if ($row = spip_fetch_array($res))
+				$titre_defaut = $row['titre'];
+			
+			$out .= Agenda_formulaire_edition_evenement(NULL, true, '', $titre_defaut);
+			$out .= "</div>";
+			$out .=  "</td></tr></table>";
+		}
+
+		$out .= "</div>";
+		$out .=  fin_block();
+	}
+	return $out;
+}
+
+function Agenda_formulaire_article($id_article, $flag_editable){
+
+  global $spip_lang_left, $spip_lang_right, $options;
+	global $connect_statut, $options,$connect_id_auteur, $couleur_claire ;
+	
+	$out = "";
+	$out .= "<a name='agenda'></a>";
+	if ($flag_editable) {
+		$out .= Agenda_action_formulaire_article($id_article);
+		if (_request('edit')||_request('neweven'))
+			$bouton = bouton_block_visible("evenementsarticle");
+		else
+			$bouton = bouton_block_invisible("evenementsarticle");
+	}
+
+	$out .= debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", true, "", $bouton._T('agenda:texte_agenda')
+	." <a href='".generer_url_ecrire('calendrier',"ajouter_id_article=$id_article")."'>"._T('icone_calendrier')."</a>");
+
+	//
+	// Afficher les evenements
+	//
+
+	list($s,$les_evenements) = Agenda_formulaire_article_afficher_evenements($id_article, $flag_editable);
+	$out .= $s;
+	//
+	// Ajouter un evenements
+	//
+
+	if ($flag_editable)
+		$out .= Agenda_formulaire_article_ajouter_evenement($id_article, $les_evenements, $flag_editable);
+
+
+	$out .= fin_cadre_enfonce(true);
+	return $out;
+}
+
+
+function Agenda_action_update_repetitions($id_evenement,$repetitions,$liste_mots){
+	// evenement source
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+	if ($row = spip_fetch_array(($res))){
+		$titre = $row['titre'];
+		$descriptif = $row['descriptif'];
+		$horaire = $row['horaire'];
+		$lieu = $row['lieu'];
+		$date_debut = strtotime($row['date_debut']);
+		$date_fin = strtotime($row['date_fin']);
+		$duree = $date_fin - $date_debut;
+		$id_evenement_source = $row['id_evenement_source'];
+		$id_article = $row['id_article'];
+		if ($id_evenement_source!=0)
+			return; // pas un evenement source donc rien a faire ici
+
+		$repetitions_updated = array();
+		// mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu
+		$res = spip_query("SELECT id_evenement FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($id_evenement));
+		while ($row = spip_fetch_array($res)){
+			$date = strtotime(date('Y-m-d',$row['date_debut']));
+			if (in_array($date,$repetitions)){
+				// il est maintenu, on l'update
+				$repetitions_updated[] = $date;
+				$update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
+				$update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
+				
+				// TODO : prendre en charge la mise a jour uniquement si conforme a l'original
+				$update_titre = $titre;
+				$update_descriptif = $descriptif;
+				$update_lieu = $lieu;
+				
+				// mettre a jour l'evenement
+				$res=spip_query("UPDATE spip_evenements SET `titre`=".spip_abstract_quote($update_titre)
+				. ",`descriptif`=".spip_abstract_quote($update_descriptif)
+				. ",`lieu`=".spip_abstract_quote($update_lieu)
+				. ",`horaire`=".spip_abstract_quote($horaire)
+				. ",`date_debut`=".spip_abstract_quote($update_date_debut)
+				. ",`date_fin`=".spip_abstract_quote($update_date_fin)
+				. ",`id_article`=".spip_abstract_quote($id_article)
+				. " WHERE `id_evenement` =".spip_abstract_quote($row['id_evenement']));
+				Agenda_action_update_liste_mots($row['id_evenement'],$liste_mots);
+			}
+			else {
+				// il est supprime
+				spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".$row['id_evenement']);
+				spip_query("DELETE FROM spip_evenements WHERE id_evenement=".$row['id_evenement']);
+			}
+			
+		}
+		// regarder les repetitions a ajouter
+		foreach($repetitions as $date){
+			if (!in_array($date,$repetitions_updated)){
+				$update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
+				$update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
+				$update_titre = $titre;
+				$update_descriptif = $descriptif;
+				$update_lieu = $lieu;
+
+				$id_evenement_new = spip_abstract_insert("spip_evenements",
+					"(id_evenement_source,maj)",
+					"(".spip_abstract_quote($id_evenement).",NOW())");
+				if ($id_evenement_new==0)
+					spip_log("agenda action formulaire article : impossible d'ajouter un evenement repete");
+				else {
+					// mettre a jour l'evenement
+					$res=spip_query("UPDATE spip_evenements SET `titre`=".spip_abstract_quote($update_titre)
+					. ",`descriptif`=".spip_abstract_quote($update_descriptif)
+					. ",`lieu`=".spip_abstract_quote($update_lieu)
+					. ",`horaire`=".spip_abstract_quote($horaire)
+					. ",`date_debut`=".spip_abstract_quote($update_date_debut)
+					. ",`date_fin`=".spip_abstract_quote($update_date_fin)
+					. ",`id_article`=".spip_abstract_quote($id_article)
+					. " WHERE `id_evenement` =".spip_abstract_quote($id_evenement_new));
+					
+					Agenda_action_update_liste_mots($id_evenement_new,$liste_mots);
+				}
+			}
+		}
+	}
+}
+function Agenda_action_supprime_repetitions($supp_evenement){
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($supp_evenement));
+	while ($row = spip_fetch_array($res)){
+		$id_evenement = $row['id_evenement'];
+		spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+		spip_query("DELETE FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+	}
+}
+
+function Agenda_action_update_liste_mots($id_evenement,$liste_mots){
+	// suppression des mots obsoletes
+	$cond_in = "";
+	if (count($liste_mots))
+		$cond_in = "AND " . calcul_mysql_in('id_mot', implode(",",$liste_mots), 'NOT');
+	spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement)." ".$cond_in);
+	// ajout/maj des nouveaux mots
+	foreach($liste_mots as $id_mot){
+		if (!spip_fetch_array(spip_query("SELECT * FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement)." AND id_mot=".spip_abstract_quote($id_mot))))
+			spip_query("INSERT INTO spip_mots_evenements (id_mot,id_evenement) VALUES (".spip_abstract_quote($id_mot).",".spip_abstract_quote($id_evenement).")");
+	}
+}
+
+
+function Agenda_action_formulaire_article($id_article){
+	include_spip('base/abstract_sql');
+	// s'assurer que les tables sont crees
+	Agenda_install();
+	// gestion des requetes de mises à jour dans la base
+	$id_evenement = intval(_request('id_evenement'));
+	$insert = _request('evenement_insert');
+	$modif = _request('evenement_modif');
+	$supp_evenement = intval(_request('supp_evenement'));
+	if ($insert || $modif){
+	
+		if ( ($insert) && (!$id_evenement) ){
+			$id_evenement = spip_abstract_insert("spip_evenements",
+				"(id_evenement_source,maj)",
+				"('0',NOW())");
+			if ($id_evenement==0){
+				spip_log("agenda action formulaire article : impossible d'ajouter un evenement");
+				return;
+			}
+	 	}
+	 	if ($id_article){
+			// mettre a jour le lien evenement-article
+			spip_query("UPDATE spip_evenements SET id_article=".spip_abstract_quote($id_article)." WHERE id_evenement=".spip_abstract_quote($id_evenement));
+	 	}
+		$titre = _request('evenement_titre');
+		$descriptif = _request('evenement_descriptif');
+		$lieu = _request('evenement_lieu');
+		$horaire = _request('evenement_horaire');
+		if ($horaire!='oui') $horaire='non';
+	
+		// pour les cas ou l'utilisateur a saisi 29-30-31 un mois ou ca n'existait pas
+		$maxiter=4;
+		$st_date_deb=FALSE;
+		$jour_debut=_request('jour_evenement_debut');
+		// test <= car retour strtotime retourne -1 ou FALSE en cas d'echec suivant les versions
+		while(($st_date_deb<=FALSE)&&($maxiter-->0)) {
+			$date_deb=_request('annee_evenement_debut')."-"._request('mois_evenement_debut')."-".($jour_debut--)." "._request('heure_evenement_debut').":"._request('minute_evenement_debut');
+			$st_date_deb=strtotime($date_deb);
+		}
+		$date_deb=format_mysql_date(date("Y",$st_date_deb),date("m",$st_date_deb),date("d",$st_date_deb),date("H",$st_date_deb),date("i",$st_date_deb), $s=0);
+	
+		// pour les cas ou l'utilisateur a saisi 29-30-31 un mois ou ca n'existait pas
+		$maxiter=4;
+		$st_date_fin=FALSE;
+		$jour_fin=_request('jour_evenement_fin');
+		// test <= car retour strtotime retourne -1 ou FALSE en cas d'echec suivant les versions
+		while(($st_date_fin<=FALSE)&&($maxiter-->0)) {
+			$st_date_fin=_request('annee_evenement_fin')."-"._request('mois_evenement_fin')."-".($jour_fin--)." "._request('heure_evenement_fin').":"._request('minute_evenement_fin');
+			$st_date_fin=strtotime($st_date_fin);
+		}
+		$st_date_fin = max($st_date_deb,$st_date_fin);
+		$date_fin=format_mysql_date(date("Y",$st_date_fin),date("m",$st_date_fin),date("d",$st_date_fin),date("H",$st_date_fin),date("i",$st_date_fin), $s=0);
+	
+		// mettre a jour l'evenement
+		$res=spip_query("UPDATE spip_evenements SET `titre`=".spip_abstract_quote($titre)
+		. ",`descriptif`=".spip_abstract_quote($descriptif)
+		. ",`lieu`=".spip_abstract_quote($lieu)
+		. ",`horaire`=".spip_abstract_quote($horaire)
+		. ",`date_debut`=".spip_abstract_quote($date_deb)
+		. ",`date_fin`=".spip_abstract_quote($date_fin)
+		. " WHERE `id_evenement` =".spip_abstract_quote($id_evenement));
+
+		// les mots cles : par groupes
+		$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+		$liste_mots = array();
+		while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+			$id_groupe = $row['id_groupe'];
+			$id_mot_a = _request("evenement_groupe_mot_select_$id_groupe"); // un array
+			if (is_array($id_mot_a) && count($id_mot_a)){
+				if ($row['unseul']=='oui')
+					$liste_mots[] = intval(reset($id_mot_a));
+				else 
+					foreach($id_mot_a as $id_mot)
+						$liste_mots[] = intval($id_mot);
+			}				
+		}
+
+		Agenda_action_update_liste_mots($id_evenement,$liste_mots);
+				
+		// gestion des repetitions
+		if (($repetitions = _request('selected_date_repetitions'))!=NULL){
+			$repetitions = explode(',',$repetitions);
+			$rep = array();
+			foreach($repetitions as $key=>$date){
+				if (preg_match(",[0-9][0-9]?/[0-9][0-9]?/[0-9][0-9][0-9][0-9],",$date)){
+					$date = explode('/',$date);
+					$date = $date[2]."/".$date[0]."/".$date[1];
+					$date = strtotime($date);
+				}
+				else {
+					$date = preg_replace(",[0-2][0-9]:[0-6][0-9]:[0-6][0-9]\s*(UTC|GMT)(\+|\-)[0-9]{4},","",$date);
+					$date = explode(' ',$date);
+					$date = strtotime($date[2]." ".$date[1]." ".$date[3]);
+				}
+				if (!in_array($date,$repetitions))
+					$rep[] = $date;
+			}
+			$repetitions = $rep;
+		}
+		else 
+			$repetitions = array();
+		Agenda_action_update_repetitions($id_evenement, $repetitions, $liste_mots);
+	}
+	else if ($supp_evenement){
+		$id_article = intval(_request('id_article'));
+		if (!$id_article)
+			$id_article = intval(_request('ajouter_id_article'));
+		$res = spip_query("SELECT * FROM spip_evenements WHERE id_article=".spip_abstract_quote($id_article)." AND id_evenement=".spip_abstract_quote($supp_evenement));
+		if ($row = spip_fetch_array($res)){
+			spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($supp_evenement));
+			spip_query("DELETE FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($supp_evenement));
+		}
+		Agenda_action_supprime_repetitions($supp_evenement);
+	}
+	return "";
+}
+
+
+function Agenda_formulaire_edition_evenement($id_evenement, $neweven, $ndate="", $titre_defaut=""){
+	global $spip_lang_right;
+	$out = "";
+
+	// inits
+	$ftitre=$titre_defaut;
+	$flieu='';
+	$fdescriptif='';
+	$fstdatedeb=time();
+	$fhoraire = 'oui';
+	if (($neweven)&&($ndate)){
+		$newdate=urldecode($ndate);
+		$test=strtotime($newdate);
+		if ($test>0)
+			$fstdatedeb=$test;
+	}
+	$fstdatefin=$fstdatedeb+60*60;
+
+	if ($id_evenement!=NULL){
+		$res = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement=".spip_abstract_quote($id_evenement));
+		if ($row = spip_fetch_array($res)){
+			if (!$neweven){
+				$fid_evenement=$row['id_evenement'];
+				$ftitre=attribut_html($row['titre']);
+				$flieu=attribut_html($row['lieu']);
+				$fhoraire=attribut_html($row['horaire']);
+				$fdescriptif=attribut_html($row['descriptif']);
+				$fstdatedeb=strtotime($row['date_debut']);
+				$fstdatefin=strtotime($row['date_fin']);
+			}
+	 	}
+	}
+
+	$url=self();
+	$url=parametre_url($url,'edit','');
+	$url=parametre_url($url,'neweven','');
+	$url=parametre_url($url,'ndate','');
+	$url=parametre_url($url,'id_evenement','');
+
+	$out .= "<div class='agenda-visu-evenement'>";
+
+	$ajouter_id_article = _request('ajouter_id_article');
+	if ($ajouter_id_article && !_request('id_article')){
+		$res2 = spip_query("SELECT * FROM spip_articles AS articles WHERE id_article=".spip_abstract_quote($ajouter_id_article));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div class='article-evenement'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html($row2['titre'])."</a>";
+			$out .= "</div>\n";
+		}
+	}
+	
+	$out .= "<div class='agenda-visu-evenement-bouton-fermer'>";
+  $out .=	"<a href='$url'><img src='"._DIR_PLUGIN_AGENDA."/img_pack/croix.png' width='12' height='12' style='border:none;'></a>";
+  $out .= "</div>\n";
+  $out .=  "<form name='edition_evenement' action='$url' method='post'>";
+  #$out .=  "<input type='hidden' name='redirect' value='$url' />\n";
+	if (!$neweven){
+	  $out .=  "<input type='hidden' name='id_evenement' value='$fid_evenement' />\n";
+	  $out .=  "<input type='hidden' name='evenement_modif' value='1' />\n";
+	}
+	else {
+	  $out .=  "<input type='hidden' name='evenement_insert' value='1' />\n";
+	}
+	
+	// TITRE
+	$out .=  "<div class='titre-titre'>"._T('agenda:evenement_titre')."</div>\n";
+	$out .=  "<div class='titre-visu'>";
+	$out .=  "<input type='text' name='evenement_titre' value=\"$ftitre\" style='width:100%;' />";
+	$out .=  "</div>\n";
+
+	// LIEU
+	$out .=  "<div class='lieu-titre'>"._T('agenda:evenement_lieu')."</div>";
+	$out .=  "<div class='lieu-visu'>";
+	$out .=  "<input type='text' name='evenement_lieu' value=\"$flieu\" style='width:100%;' />";
+	$out .=  "</div>\n";
+
+	// Horaire
+	$out .=  "<div class='horaire-titre'>";
+	$out .=  "<input type='checkbox' name='evenement_horaire' value='oui' ";
+	$out .= ($fhoraire=='oui'?"checked='checked' ":"");
+	$out .= " onClick=\"var element =  findObj('evenement_horaire');var choix = element.checked;
+	if (choix==true){	setvisibility('afficher_horaire_debut_evenement', 'visible');setvisibility('afficher_horaire_fin_evenement', 'visible');}
+	else{setvisibility('afficher_horaire_debut_evenement', 'hidden');setvisibility('afficher_horaire_fin_evenement', 'hidden');}\"";
+	$out .= "/>";
+	$out .= _T('agenda:evenement_horaire')."</div>";
+
+	// DATES
+	$out .=  "<div class='date-titre'>"._T('agenda:evenement_date')."</div>";
+	$out .=  "<div class='date-visu'>";
+	$out .=  _T('agenda:evenement_date_de');
+	$out .= WCalendar_controller(date('Y-m-d H:i:s',$fstdatedeb),"_evenement_debut");
+	$out .= "<span class='agenda_".($fhoraire=='oui'?"":"in")."visible_au_chargement' id='afficher_horaire_debut_evenement'>";
+	$out .=  _T('agenda:evenement_date_a');
+	$out .= Agenda_heure_selector(date('H',$fstdatedeb),date('i',$fstdatedeb),"_debut");
+	$out .=	"</span>";
+	$out .=  "<br/>";
+	$out .=  _T('agenda:evenement_date_au');
+	$out .= WCalendar_controller(date('Y-m-d H:i:s',$fstdatefin),"_evenement_fin");
+	$out .= "<span class='agenda_".($fhoraire=='oui'?"":"in")."visible_au_chargement' id='afficher_horaire_fin_evenement'>";
+	$out .=  _T('agenda:evenement_date_a');
+	$out .= Agenda_heure_selector(date('H',$fstdatefin),date('i',$fstdatefin),"_fin");
+	$out .=	"</span>";
+	$out .=  "</div>\n";
+	
+	// DESCRIPTIF
+	$out .=  "<div class='descriptif-titre'>"._T('agenda:evenement_descriptif')."</div>";
+	$out .=  "<div class='descriptif-visu'>";
+	$out .=  "<textarea name='evenement_descriptif' style='width:100%;' rows='3'>";
+	$out .=  $fdescriptif;
+	$out .=  "</textarea>\n";
+	$out .=  "</div>\n";
+
+	// MOTS CLES : chaque groupe de mot cle attribuable a un evenement agenda
+	// donne un select
+	$out .=  "<div class='agenda_mots_cles'>";
+	$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+	while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+		$id_groupe = $row['id_groupe'];
+		$multiple = ($row['unseul']=='oui')?"size='4'":"multiple='multiple' size='4'";
+		
+		$id_mot_select = array();
+		if ($id_evenement){
+			$res2 = spip_query("SELECT mots_evenements.id_mot FROM spip_mots_evenements AS mots_evenements
+								LEFT JOIN spip_mots AS mots ON mots.id_mot=mots_evenements.id_mot 
+								WHERE mots.id_groupe=".spip_abstract_quote($id_groupe)." AND mots_evenements.id_evenement=".spip_abstract_quote($id_evenement));
+			while ($row2 = spip_fetch_array($res2))
+				$id_mot_select[] = $row2['id_mot'];
+		}
+
+		$nb_mots = 0;
+		$select = "";	
+		$select .= "<select name='evenement_groupe_mot_select_{$id_groupe}[]' class='fondl verdana1 agenda_mot_cle_select' $multiple>\n";
+		$select .= "\n<option value='x' style='font-variant: small-caps;' >".supprimer_numero($row['titre'])."</option>";
+
+		$res2= spip_query("SELECT * FROM spip_mots WHERE id_groupe=".spip_abstract_quote($id_groupe)." ORDER BY titre");
+		while ($row2 = spip_fetch_array($res2,SPIP_ASSOC)){
+			$id_mot = $row2['id_mot'];
+			$titre = $row2['titre'];
+			$select .= my_sel($id_mot, "&nbsp;&nbsp;&nbsp;$titre", in_array($id_mot,$id_mot_select)?$id_mot:0);
+			$nb_mots++;
+		}
+		$select .= "</select>\n";
+		if ($nb_mots)
+			$out .= $select;
+	}
+	$out .=  "</div>";
+	
+	$dates = "";
+	if ($id_evenement!=NULL){
+		$dates = array();
+		$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$dates[] = date('m/d/Y',strtotime($row['date_debut']));
+		}
+		$dates = implode(",",$dates);
+	}
+	$out .= "<div class='repetitions-calendrier'>";
+	$out .= WCalendar_statique_point_entree('_repetitions',$dates);
+	$out .= "</div>";
+	
+  $out .=  "<div class='edition-bouton'>";
+  #echo "<input type='submit' name='submit' value='Annuler' />";
+	if ($neweven==1){
+		$out .=	"<div style='text-align:$spip_lang_right'><input type='submit' name='ajouter' value='"._T('bouton_ajouter')."' class='fondo' onclick='javascript:getSelectedDate_repetitions()'></div>";
+	}
+	else{
+		$out .=	"<div style='text-align:$spip_lang_right'><input type='submit' name='ajouter' value='"._T('bouton_enregistrer')."' class='fondo' onclick='javascript:getSelectedDate_repetitions()'></div>";
+	}
+	$out .=  "</div>\n";
+
+	// feature desactivee pour le moment
+	// $out .= "<script type='text/javascript' src='"._DIR_PLUGIN_AGENDA."/img_pack/multiselect.js'></script>";
+
+  $out .=  "</div>";
+
+	$out .=  "</form>";
+	$out .=  "</div>\n";
+	return $out;
+}
+
+// Pre traitements -----------------------------------------------------------------------
+
+function Agenda_heure_selector($heure,$minute,$suffixe){
+	return
+		afficher_heure($heure, "name='heure_evenement$suffixe' size='1' class='fondl'") .
+  	afficher_minute($minute, "name='minute_evenement$suffixe' size='1' class='fondl'");
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_es.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_es.php	(revision 30)
@@ -0,0 +1,39 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Anular',
+'activite_editoriale' => 'Actividad editorial',
+'ajouter_un_evenement' => 'Añadir un evento a éste artículo',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Añadir un evento',
+'titre_cadre_modifier_evenement' => 'Modificar un evento',
+'item_mots_cles_association_evenements' => 'a los eventos',
+'info_un_evenement' => 'un evento,',
+'info_nombre_evenements' => '@nb_evenements@ eventos,',
+'info_evenements' => 'Eventos',
+'evenements' => 'Eventos',
+'evenement_titre' => 'Titulo',
+'evenement_descriptif' => 'Descripción',
+'evenement_lieu' => 'Lugar',
+'evenement_date' => 'Fecha',
+'evenement_date_de' => 'De ',
+'evenement_date_du' => 'Del ',
+'evenement_date_a' => 'a las ',
+'evenement_date_au' => 'Hasta ',
+'evenement_date_debut' => 'Fecha de comienzo',
+'evenement_date_fin' => 'Fecha de fin',
+'lien_retirer_evenement' => 'Suprimir',
+'evenement_horaire' => 'Horario',
+'titre_sur_l_agenda' => "Sobre la agenda",
+'icone_creer_evenement' => 'Creación de un nuevo evento',
+'evenement_repetitions' => 'Repeticiones',
+'repetition_de' => "Repetición de",
+'sans_titre' => "(con título)",
+'evenement_autres_occurences' => "Otras ocurrencias :",
+'bouton_supprimer' => "Suprimir",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_fr.php	(revision 30)
@@ -0,0 +1,39 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Annuler',
+'activite_editoriale' => 'Activit&eacute; &Eacute;ditoriale',
+'ajouter_un_evenement' => 'ajouter un &eacute;v&eacute;nement &agrave; cet article',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Ajouter un &eacute;v&eacute;nement',
+'titre_cadre_modifier_evenement' => 'Modifier un &eacute;v&eacute;nement',
+'item_mots_cles_association_evenements' => 'aux &eacute;v&eacute;nements',
+'info_un_evenement' => 'un &eacute;v&eacute;nement,',
+'info_nombre_evenements' => '@nb_evenements@ &eacute;v&eacute;nements,',
+'info_evenements' => '&Eacute;v&eacute;nements',
+'evenements' => '&Eacute;v&eacute;nements',
+'evenement_titre' => 'Titre',
+'evenement_descriptif' => 'Descriptif',
+'evenement_lieu' => 'Lieu',
+'evenement_date' => 'Date',
+'evenement_date_de' => 'De ',
+'evenement_date_du' => 'Du ',
+'evenement_date_a' => '&agrave; ',
+'evenement_date_au' => 'Au ',
+'evenement_date_debut' => 'Date de d&eacute;but',
+'evenement_date_fin' => 'Date de fin',
+'lien_retirer_evenement' => 'Supprimer',
+'evenement_horaire' => 'Horaire',
+'titre_sur_l_agenda' => "Sur l'agenda",
+'icone_creer_evenement' => 'Cr&eacute;er un nouvel &eacute;v&eacute;nement',
+'evenement_repetitions' => 'R&eacute;p&eacute;titions',
+'repetition_de' => "R&eacute;p&eacute;tition de",
+'sans_titre' => "(sans titre)",
+'evenement_autres_occurences' => "Autres occurences :",
+'bouton_supprimer' => "Supprimer",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_nl.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_nl.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/lang/agenda_nl.php	(revision 30)
@@ -0,0 +1,39 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Annuleren',
+'activite_editoriale' => 'Hoofdactiviteit',
+'ajouter_un_evenement' => 'een gebeurtenis toevoegen aan dit artikel',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'een gebeurtenis toevoegen',
+'titre_cadre_modifier_evenement' => 'een gebeurtenis wijzigen',
+'item_mots_cles_association_evenements' => 'aan de gebeurtenissen',
+'info_un_evenement' => 'een gebeurtenis,',
+'info_nombre_evenements' => '@nb_gebeurtenis@ gebeurtenissen,',
+'info_evenements' => 'gebeurtenissen',
+'evenements' => 'gebeurtenissen',
+'evenement_titre' => 'titel',
+'evenement_descriptif' => 'beschrijvend',
+'evenement_lieu' => 'Plaats',
+'evenement_date' => 'Date',
+'evenement_date_de' => 'van ',
+'evenement_date_du' => 'van ',
+'evenement_date_a' => 'tot ',
+'evenement_date_au' => 'tot ',
+'evenement_date_debut' => 'aanvangsdatum',
+'evenement_date_fin' => 'Einddatum',
+'lien_retirer_evenement' => 'Afschaffen',
+'evenement_horaire' => 'Dienstregeling',
+'titre_sur_l_agenda' => "Op de agenda",
+'icone_creer_evenement' => 'Een nieuwe gebeurtenis creëren',
+'evenement_repetitions' => 'Herhalingen',
+'repetition_de' => "Herhaling van",
+'sans_titre' => "(zonder titel)",
+'evenement_autres_occurences' => "Andere omstandigheden :",
+'bouton_supprimer' => "Afschaffen",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/plugin.xml	(revision 30)
@@ -0,0 +1,62 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	Agenda pour SPIP 1.9.0
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	Cedric MORIN
+ 	[notre-ville.net->http://www.notre-ville.net]
+_ &copy; 2006 - Licence GPL
+	</auteur>
+	<version>
+	0.1
+	</version>
+	<etat>
+	stable
+	</etat>
+	<description>
+	Agenda Ev&#233;nementiel
+_ {{Ce plugin n&#233;cessite le plugin Widget Calendar}}
+	</description>
+	<lien>http://zone.spip.org/trac/spip-zone/wiki/AgenDa</lien> <!-- URI de documentation -->
+	<options> <!-- fichier charge a chaque hit -->
+	agenda_mes_options.php
+	</options>
+	<fonctions> <!-- fichier charge a chaque recalcul -->
+	agenda_mes_fonctions.php
+	</fonctions>
+	<!-- classe d'implementation : espace de nommage qui prefixera les appels de fonction
+	sur le mode Rien::
+	ainsi les fonctions hors espace de nommage ne peuvent etre appelees
+	ce parametre est obligatoire et doit etre non vide
+	-->
+	<prefix> 
+	Agenda
+	</prefix>
+	<!-- Definitions des fonctions qui s'inserent dans les pipelines -->
+	<pipeline>
+		<nom>ajouter_onglets</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>exec_init</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>header_prive</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>affiche_milieu</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>agenda_rendu_evenement</nom>
+		<action>rendu_evenement</action>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>taches_generales_cron</nom>
+	</pipeline>
+
+	<!-- Le parametre action est facultatif : en son absence la methode de la classe portant le nom du pipeline est appelee. Le parametre inclure est facultatif.	-->
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/public/criteres_agenda.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/public/criteres_agenda.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_0/public/criteres_agenda.php	(revision 30)
@@ -0,0 +1,117 @@
+<?php
+
+// {branche ?}
+// http://www.spip.net/@branche
+function critere_branche($idb, &$boucles, $crit) {
+	$not = $crit->not;
+	$boucle = &$boucles[$idb];
+  $type = $boucle->type_requete;
+  $nom = $table_des_tables[$type];
+  if ($boucle->id_table!='evenements' && $boucle->id_table!='pim_agenda')
+  	critere_branche_dist($idb, &$boucles, $crit);
+  else{
+		$arg = calculer_argument_precedent($idb, 'id_rubrique', $boucles);
+		$champ = 'id_rubrique';
+
+    $type = $boucle->type_requete;
+    $nom = $table_des_tables[$type];
+    list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
+
+    $cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle);
+    if ($cle) 
+      $cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle, false);
+    if ($cle) $t = "L$cle";
+		// faire la jointure sur id_rubrique
+		
+		$c = "calcul_mysql_in('" .
+		  $t .
+		  ".id_rubrique', calcul_branche($arg), '')";
+		if ($crit->cond) $c = "($arg ? $c : 1)";
+				
+		if ($not)
+			$boucle->where[]= array("'NOT'", $c);
+		else
+			$boucle->where[]= $c;
+  }
+}
+
+function critere_agendafull_dist($idb, &$boucles, $crit)
+{
+	$params = $crit->param;
+
+	if (count($params) < 1)
+	      erreur_squelette(_T('zbug_info_erreur_squelette'),
+			       "{agenda ?} BOUCLE$idb");
+
+	$parent = $boucles[$idb]->id_parent;
+
+	// les valeurs $date et $type doivent etre connus a la compilation
+	// autrement dit ne pas etre des champs
+
+	$date_deb = array_shift($params);
+	$date_deb = $date_deb[0]->texte;
+
+	$date_fin = array_shift($params);
+	$date_fin = $date_fin[0]->texte;
+
+	$type = array_shift($params);
+	$type = $type[0]->texte;
+
+	$annee = $params ? array_shift($params) : "";
+	$annee = "\n" . 'sprintf("%04d", ($x = ' .
+		calculer_liste($annee, array(), $boucles, $parent) .
+		') ? $x : date("Y"))';
+
+	$mois =  $params ? array_shift($params) : "";
+	$mois = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($mois, array(), $boucles, $parent) .
+		') ? $x : date("m"))';
+
+	$jour =  $params ? array_shift($params) : "";
+	$jour = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($jour, array(), $boucles, $parent) .
+		') ? $x : date("d"))';
+
+	$annee2 = $params ? array_shift($params) : "";
+	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
+		calculer_liste($annee2, array(), $boucles, $parent) .
+		') ? $x : date("Y"))';
+
+	$mois2 =  $params ? array_shift($params) : "";
+	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($mois2, array(), $boucles, $parent) .
+		') ? $x : date("m"))';
+
+	$jour2 =  $params ? array_shift($params) : "";
+	$jour2 = "\n" .  'sprintf("%02d", ($x = ' .
+		calculer_liste($jour2, array(), $boucles, $parent) .
+		') ? $x : date("d"))';
+
+	$boucle = &$boucles[$idb];
+	$date = $boucle->id_table . ".$date";
+
+	if ($type == 'jour')
+		$boucle->where[]= array("'AND'", 
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m%d\')'",("$annee . $mois . $jour")),
+					array("'>='", "'DATE_FORMAT($date_fin, \'%Y%m%d\')'",("$annee . $mois . $jour")));
+	elseif ($type == 'mois')
+		$boucle->where[]= array("'AND'", 
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m\')'",("$annee . $mois")),
+					array("'>='", "'DATE_FORMAT($date_fin, \'%Y%m\')'",("$annee . $mois")));
+	elseif ($type == 'semaine')
+		$boucle->where[]= array("'AND'", 
+					array("'>='",
+					     "'DATE_FORMAT($date_fin, \'%Y%m%d\')'", 
+					      ("date_debut_semaine($annee, $mois, $jour)")),
+					array("'<='",
+					      "'DATE_FORMAT($date_deb, \'%Y%m%d\')'",
+					      ("date_fin_semaine($annee, $mois, $jour)")));
+	elseif (count($crit->param) > 3)
+		$boucle->where[]= array("'AND'",
+					array("'>='",
+					      "'DATE_FORMAT($date_fin, \'%Y%m%d\')'",
+					      ("$annee . $mois . $jour")),
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m%d\')'", ("$annee2 . $mois2 . $jour2")));
+	// sinon on prend tout
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda.php	(revision 30)
@@ -0,0 +1,82 @@
+<?php
+
+function Agenda_ajouter_onglets($flux) {
+  if($flux['args']=='calendrier')
+  {
+		$flux['data']['evenements']= new Bouton(
+																 '../'._DIR_PLUGIN_AGENDA.'/img_pack/agenda-24.png', _T('agenda:evenements'),
+																generer_url_ecrire("calendrier","type=semaine"));
+	
+		$flux['data']['editorial']= new Bouton(
+															 'cal-rv.png', _T('agenda:activite_editoriale'),
+																 generer_url_ecrire("calendrier","mode=editorial&type=semaine"));
+  }
+	return $flux;
+}
+function Agenda_header_prive($flux) {
+	$exec = _request('exec');
+	// les CSS
+	if ($exec == 'calendrier'){
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/calendrier.css" type="text/css" />'. "\n";
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/agenda.css" type="text/css" />'. "\n";
+	}
+	if ($exec == 'articles'){
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/agenda_articles.css" type="text/css" />'. "\n";
+	}
+
+
+	return $flux;
+}
+
+function Agenda_exec_init($flux) {
+	$exec =  $flux['args']['exec'];
+	if (($exec == 'calendrier')||($exec=='articles')){
+		include_spip('inc/calendar');
+		// Reserver les widgets agenda
+		WCalendar_ajoute_lies(_T('agenda:evenement_date_debut'),'_evenement_debut',_T('agenda:evenement_date_fin'),'_evenement_fin');
+		WCalendar_ajoute_statique(_T('agenda:evenement_repetitions'),'_repetitions');
+	}
+	return $flux;
+}
+
+function Agenda_affiche_milieu($flux) {
+	$exec =  $flux['args']['exec'];
+	if ($exec=='articles'){
+		include_spip('inc/calendar');
+		include_spip('inc/agenda_gestion');
+		$id_article = $flux['args']['id_article'];
+		$flux['data'] .= Agenda_formulaire_article($id_article, article_editable($id_article));
+	}
+	return $flux;
+}
+
+function Agenda_rendu_boite($titre,$descriptif,$lieu,$type='ics'){
+	$texte = "<span class='calendrier-verdana10'><span  style='font-weight: bold;'>";
+	$texte .= wordwrap($sum=typo($titre),15)."</span>";
+	$texte .= "<span class='survol'>";
+	$texte .= "<strong>$sum</strong><br />";
+	$texte .= $lieu ? propre($lieu).'<br />':'';
+	$texte .= propre($descriptif);
+	$texte .= "</span>";
+	if ($type=='ics'){	
+		$texte .= (strlen($lieu.$descriptif)?"<hr/>":"").$lieu.(strlen($lieu)?"<br/>":"");
+		$texte .= $descriptif;
+	}
+	$texte .= "</span>";
+
+	return $texte;
+}
+function Agenda_rendu_evenement($flux) {
+	global $couleur_claire;
+	$evenement = $flux['args']['evenement'];
+
+	
+	$url = $evenement['URL']; 
+	$texte = Agenda_rendu_boite($evenement['SUMMARY'],$evenement['DESCRIPTION'],$evenement['LOCATION'],$flux['args']['type']);
+	$texte = http_href(quote_amp($url), $texte, '', '', '', '');
+	
+	$flux['data'] = $texte;
+	return $flux;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_jour.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_jour.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_jour.html	(revision 30)
@@ -0,0 +1,52 @@
+<BOUCLE_jour(EVENEMENTS)
+	{agendafull date_debut, date_fin, jour, #ENV{annee}, #ENV{mois}, #ENV{jour}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 
+	calendrier-couleur[(#ENV{theme,0}|modulo{14,1})]})]</BOUCLE_jour>[(#DATE|Agenda_affiche_full{<:aucun_article:>, 'jour', 
+	calendrier-couleur[(#ENV{theme,0}|modulo{14,1})]})][(#TOTAL_BOUCLE|?{' ',''})
+<div style='position: fixed; top:50px; left: 20px'>
+<table style='width: 10px'><tr>
+<td class='calendrier-couleur1'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,0})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur2'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,1})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur3'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,2})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur4'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,3})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur5'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,4})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur6'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,5})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur7'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,6})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur8'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,7})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur9'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,8})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur10'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,9})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur11'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,10})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur12'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,11})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur13'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,12})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur14'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,13})]'>&nbsp;&nbsp;</a></td></tr>
+</table>
+</div>
+]<//B_jour>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mes_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mes_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mes_fonctions.php	(revision 30)
@@ -0,0 +1,49 @@
+<?php
+
+//include_spip('inc/agenda_filtres'); // declaration directe dans le xml pour eviter un find_in_path
+include_spip('public/criteres_agenda');
+include_spip('inc/agenda_filtres');
+
+function Agenda_heure_selector($date,$suffixe){
+	$d = strtotime($date);
+	$heure = date('H',$d);
+	$minute = date('i',$d);
+	return
+		afficher_heure($heure, "name='heure_evenement$suffixe' size='1' class='fondl'") .
+  	afficher_minute($minute, "name='minute_evenement$suffixe' size='1' class='fondl'");
+}
+
+//
+// <BOUCLE(EVENEMENTS)>
+//
+function boucle_EVENEMENTS_dist($id_boucle, &$boucles) {
+	$boucle = &$boucles[$id_boucle];
+	$id_table = $boucle->id_table;
+	$boucle->from[$id_table] =  "spip_evenements";
+
+	// Restreindre aux elements publies
+/* Modif Patrice : Commit SPIP 8062
+$boucle->statut devient deprecie et est remplacé par
+$boucle->modificateur['criteres']['statut']
+Il vous faut donc mettre a jour le code des boucles qui utilisent ce critere
+Pour avoir une compatibilité trans version il faut ecrire le test sous la forme :
+if ($boucle->statut OR $boucle->modificateur['criteres']['statut'])
+*/	
+$temp_statut = $boucle->statut OR $boucle->modificateur['criteres']['statut'];
+	if (!$temp_statut) {
+		// Si pas de lien avec un article, selectionner
+		// uniquement les auteurs d'un article publie
+		if (!$GLOBALS['var_preview'])
+			if (!isset($boucle->modificateur['lien']) AND !isset($boucle->modificateur['tout'])
+			AND (!isset($boucle->lien) OR !$boucle->lien) AND (!isset($boucle->tout) OR !$boucle->tout)) {
+				$boucle->from["articles"] =  "spip_articles";
+				$boucle->where[]= array("'='", "'articles.id_article'", "'$id_table.id_article'");
+				$boucle->where[]= array("'='", "'articles.statut'", "'\"publie\"'");
+				$boucle->group[] = $boucle->id_table . '.' . $boucle->primary;  
+			}
+	}
+
+	return calculer_boucle($id_boucle, $boucles); 
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mes_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mes_options.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mes_options.php	(revision 30)
@@ -0,0 +1,80 @@
+<?php
+$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
+define('_DIR_PLUGIN_AGENDA',(_DIR_PLUGINS.end($p)));
+include_spip('base/agenda_evenements');
+
+function cron_agenda_nettoyer_base($t){
+	# les evenements lies a un article inexistant
+	$res = spip_query("SELECT evenements.id_evenement,evenements.id_article
+		      FROM spip_evenements AS evenements
+		        LEFT JOIN spip_articles AS articles
+		          ON evenements.id_article=articles.id_article
+		       WHERE articles.id_article IS NULL");
+	while ($row = spip_fetch_array($res,SPIP_ASSOC))
+		spip_query("DELETE FROM spip_evenements
+		WHERE id_evenement=".$row['id_evenement']
+		." AND id_article=".$row['id_article']);
+
+	# les liens de mots affectes a des evenements effaces
+	$res = spip_query("SELECT mots_evenements.id_mot,mots_evenements.id_evenement 
+		        FROM spip_mots_evenements AS mots_evenements
+		        LEFT JOIN spip_evenements AS evenements
+		          ON mots_evenements.id_evenement=evenements.id_evenement
+		       WHERE evenements.id_evenement IS NULL");
+
+	while ($row = spip_fetch_array($res,SPIP_ASSOC))
+		spip_query("DELETE FROM spip_mots_evenements
+		WHERE id_mot=".$row['id_mot']
+		." AND id_evenement=".$row['id_evenement']);
+
+	return 1;
+}
+
+function Agenda_taches_generales_cron($taches_generales){
+	$taches_generales['agenda_nettoyer_base'] = 3600*48;
+	return $taches_generales;
+}
+
+function exec_calendrier()
+{
+	$mode = _request('mode');
+	if ($mode=='editorial'){
+		include_spip('exec/calendrier');
+	  global $type, $css;
+	// icones standards, fonction de la direction de la langue
+	
+	  global $bleu, $vert, $jaune, $spip_lang_rtl;
+	  $bleu = http_img_pack("m_envoi_bleu$spip_lang_rtl.gif", 'B', "class='calendrier-icone'");
+	  $vert = http_img_pack("m_envoi$spip_lang_rtl.gif", 'V', "class='calendrier-icone'");
+	  $jaune= http_img_pack("m_envoi_jaune$spip_lang_rtl.gif", 'J', "class='calendrier-icone'");
+	
+	  $date = date("Y-m-d", time()); 
+		if ($type == 'semaine') {
+		
+			$GLOBALS['afficher_bandeau_calendrier_semaine'] = true;
+			$titre = _T('titre_page_calendrier',
+				array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+		}
+	  elseif ($type == 'jour') {
+			$titre = nom_jour($date)." ". affdate_jourcourt($date);
+	  }
+		else {
+			$titre = _T('titre_page_calendrier',
+			    array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+		}
+		
+	  debut_page($titre, "redacteurs", "calendrier","",$css);
+		barre_onglets("calendrier", "editorial");
+		echo "<div>&nbsp;</div>" ;
+	  echo http_calendrier_init('', $type, '','',generer_url_ecrire('calendrier', 'mode=editorial'.($type ? "&type=$type" : '')));
+		
+	  fin_page();
+	}
+	else{
+		$var_f = charger_fonction('agenda_evenements');
+		$var_f();
+	}
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mois.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mois.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_mois.html	(revision 30)
@@ -0,0 +1,7 @@
+<BOUCLE_mois(EVENEMENTS)
+	{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE,
+		calendrier-couleur[(#ID_SECTEUR|
+			modulo{14,1})]})]</BOUCLE_mois>[(#DATE|
+	Agenda_affiche_full{<:aucun_article:>, 'mois'}
+)]<//B_mois>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_periode.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_periode.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_periode.html	(revision 30)
@@ -0,0 +1,8 @@
+<BOUCLE_periode(EVENEMENTS)
+	{agendafull date_debut, date_fin, periode,
+	#ENV{annee}, #ENV{mois}, #ENV{jour},
+	#ENV{annee_fin}, #ENV{mois_fin}, #ENV{jour_fin}}>[
+(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 'calendrier-couleur6'})
+]</BOUCLE_periode>[(#DATE|
+	Agenda_affiche_full{<:aucun_article:>, 'periode', 'calendrier-couleur6'}
+)]<//B_periode>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_semaine.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_semaine.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/agenda_semaine.html	(revision 30)
@@ -0,0 +1,7 @@
+<BOUCLE_semaine(EVENEMENTS)
+	{agendafull date_debut, date_fin, semaine, #ENV{annee}, #ENV{mois}, #ENV{jour}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE,
+	[(#COMPTEUR_BOUCLE|
+		alterner{'calendrier-couleur2', 'calendrier-couleur4'})]})]</BOUCLE_semaine>[(#DATE|
+		Agenda_affiche_full{<:aucun_article:>, 'semaine', 'calendrier-couleur2','calendrier-couleur4'}
+)]<//B_semaine>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/balise/calendrier_mini.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/balise/calendrier_mini.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/balise/calendrier_mini.php	(revision 30)
@@ -0,0 +1,113 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
+
+// Pas besoin de contexte de compilation
+global $balise_CALENDRIER_MINI_collecte;
+$balise_CALENDRIER_MINI_collecte = array('id_rubrique','id_article','id_mot');
+
+function balise_CALENDRIER_MINI ($p) {
+	return calculer_balise_dynamique($p,'CALENDRIER_MINI', array('id_rubrique','id_article', 'id_mot'));
+}
+
+function balise_CALENDRIER_MINI_stat($args, $filtres) {
+	return $args;
+}
+ 
+function balise_CALENDRIER_MINI_dyn($id_rubrique=0, $id_article = 0, $id_mot = 0,$date, $var_date = 'date', $url = '') {
+	if(!$url)
+		$url = self();
+	// nettoyer l'url qui est passee par htmlentities pour raison de securités
+	$url = str_replace("&amp;","&",$url);
+
+	return array('formulaires/calendrier_mini', 0, 
+		array(
+			'date' => $date,
+			'id_rubrique' => $id_rubrique,
+			'id_article' => $id_article,
+			'id_mot' => $id_mot,
+			'var_date' => $var_date,
+			'self' => $url,
+		));
+}
+
+function agenda_mini($i) {
+  $args = func_get_args();
+  $une_date = array_shift($args); // une date comme balise
+  $sinon = array_shift($args);
+  if (!$une_date) return $sinon;
+  $type = 'mini';
+  $agenda = Agenda_memo_full(0);
+  $evt = array();
+  foreach (($args ? $args : array_keys($agenda)) as $k) {  
+      if (is_array($agenda[$k]))
+		foreach($agenda[$k] as $d => $v) { 
+		  $evt[$d] = $evt[$d] ? (array_merge($evt[$d], $v)) : $v;
+		}
+    }
+	$la_date = mktime(0, 0, 0, mois($une_date), 1, annee($une_date));
+    include_spip('inc/agenda');
+    return http_calendrier_init($la_date, $type, '', '', '', array('', $evt));
+}
+
+function http_calendrier_mini($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt) {
+	list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+
+	if ($sansduree)
+		foreach($sansduree as $d => $r) {
+			$evenements[$d] = !$evenements[$d] ? $r : 
+				 array_merge($evenements[$d], $r);
+			 }
+
+	if (!$premier_jour) $premier_jour = '01';
+	if (!$dernier_jour) {
+		$dernier_jour = 31;
+		while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
+	}
+
+	// affichage du debut de semaine hors periode
+	$ligne = '';
+	$debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
+	for ($i=$debut ? $debut : 7;$i>1;$i--) {
+		$mois_precedent = mktime(1,1,1,$mois-1,1,$annee);
+		$jour_mois_precedent = date('t', $mois_precedent)+2-$i;
+		$ligne .= "\n\t<td class=\"horsperiode\">$jour_mois_precedent</td>";
+	}
+
+	$total = '';
+	for ($j=$premier_jour; $j<=$dernier_jour; $j++) {
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour = date("d",$nom);
+		$jour_semaine = date("w",$nom);
+		$mois_en_cours = date("m",$nom);
+		$annee_en_cours = date("Y",$nom);
+		$amj = date("Y",$nom) . $mois_en_cours . $jour;
+
+		if ($jour_semaine==1) { 
+			$total .= "\n<tr>$ligne\n</tr>";
+			$ligne = '';
+		}
+
+		$evts = $evenements[$amj];
+		$class="";
+		if ($evts) {
+			$evts = "<a href='".parametre_url($evts[0]['URL'],'date',"$annee_en_cours-$mois_en_cours-$jour")."' title='".$evts[0]['SUMMARY'].
+			"'>".intval($jour)."</a>";
+			$class='occupe';
+		}
+		else {
+			$evts = intval($jour);
+			$class='libre';
+		}
+		$ligne .= "\n\t<td  class='$class".($amj == date("Ymd")?' today':'')."'>" . $evts . "\n\t</td>";
+	}
+	$jour_mois_suivant=1;
+	// affichage de la fin de semaine hors periode
+	for($j=$jour_semaine ? $jour_semaine : 7; $j<7; $j++) {
+		$ligne .= "\n\t<td class=\"horsperiode\">".$jour_mois_suivant++."</td>";			
+	}
+
+	return $total . ($ligne ? "\n<tr>$ligne\n</tr>" : '');
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/balise/formulaire_edition_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/balise/formulaire_edition_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/balise/formulaire_edition_evenement.php	(revision 30)
@@ -0,0 +1,87 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
+
+// Pas besoin de contexte de compilation
+global $balise_FORMULAIRE_EDITION_EVENEMENT_collecte;
+$balise_FORMULAIRE_EDITION_EVENEMENT_collecte = array('id_evenement','id_article');
+
+function balise_FORMULAIRE_EDITION_EVENEMENT ($p) {
+	return calculer_balise_dynamique($p,'FORMULAIRE_EDITION_EVENEMENT', array('id_evenement', 'id_article'));
+}
+
+function balise_FORMULAIRE_EDITION_EVENEMENT_stat($args, $filtres) {
+	return $args;
+}
+ 
+function balise_FORMULAIRE_EDITION_EVENEMENT_dyn($id_evenement = 0, $id_article = 0) {
+	$url = parametre_url(self(),'ajout_evenement','');
+	// nettoyer l'url qui est passee par htmlentities pour raison de securités
+	$url = str_replace("&amp;","&",$url);
+	if ($retour=='') $retour = $url;
+
+	$res = spip_query("SELECT * FROM spip_articles WHERE id_article=".spip_abstract_quote($id_article));
+	if (!spip_num_rows($res)) return;
+
+	$flag_modif = (_request('evenement_modif') && _request('id_evenement') == $id_evenement);
+	$flag_ajout = _request('evenement_insert');
+	$flag_supp = _request('supp_evenement')!==NULL;
+	if ($flag_supp) {
+		$_GET['supp_evenement']=$id_evenement;
+		$_GET['id_article']=$id_article;
+	}
+
+	if ($flag_ajout || $flag_modif || $flag_supp){
+		include_spip("inc/agenda_gestion");
+		Agenda_action_formulaire_article($id_article);
+	}
+
+	
+	$evenement_action='evenement_insert';
+	$valeurs=array('mots'=>array(),'dates'=>array(),'evenement_horaire'=>'oui');
+
+	$formulaire_actif = _request('ajout_evenement')!=NULL;
+	
+	// les champs
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement)." AND id_article=".spip_abstract_quote($id_article));
+	if ($row = spip_fetch_array($res,SPIP_ASSOC)){
+		$evenement_action='evenement_modif';
+		foreach($row as  $k=>$val){
+			$valeurs["evenement_$k"]=$val;
+		}
+		// les mots
+		$res = spip_query("SELECT * FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$valeurs['mots'][]=$row['id_mot'];
+		}
+		
+		$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$valeurs['repetitions'][] = date('m/d/Y',strtotime($row['date_debut']));
+		}
+		$formulaire_actif = true;
+	}
+	$t=time();
+	$valeurs["date_evenement_debut"]=isset($valeurs["evenement_date_debut"])?$valeurs["evenement_date_debut"]:date('Y-m-d H:i:00',$t);
+	$valeurs["date_evenement_fin"]=isset($valeurs["evenement_date_fin"])?$valeurs["evenement_date_fin"]:date('Y-m-d H:i:00',$t+3600);
+
+	if (!$formulaire_actif) return;
+
+	return array('formulaires/formulaire_edition_evenement', 0, 
+		array(
+			#'erreur_message'=>isset($erreur['@'])?$erreur['@']:'',
+			#'erreur'=>serialize($erreur),
+			#'reponse'=>filtrer_entites($reponse),
+			'id_article' => $id_article,
+			'id_evenement' => $id_evenement,
+			'evenement_action' => $evenement_action,
+			'self' => $url,
+			'valeurs' => serialize($valeurs),
+			'url_validation' => str_replace("&amp;","&",$url_validation),
+			#'affiche_sondage' => $affiche_sondage,
+			#'formok' => filtrer_entites($formok),
+			#'formactif' => $formactif,
+		));
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/base/agenda_evenements.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/base/agenda_evenements.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/base/agenda_evenements.php	(revision 30)
@@ -0,0 +1,107 @@
+<?php
+// -----------------------------------------------------------------------------
+// Declaration des tables evenements
+// creation 11/03/2006 pour SPIP 1.9
+
+include_spip('base/serial'); // pour eviter une reinit posterieure des tables modifiees
+
+global $tables_principales;
+global $tables_auxiliaires;
+
+//-- Table EVENEMENTS ------------------------------------------
+$evenements = array(
+		"id_evenement"	=> "bigint(21) NOT NULL",
+		"id_article"	=> "bigint(21) DEFAULT '0' NOT NULL",
+		"date_debut"	=> "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
+		"date_fin"	=> "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
+		"titre"	=> "text NOT NULL",
+		"descriptif"	=> "text NOT NULL",
+		"lieu"	=> "text NOT NULL",
+		"horaire" => "ENUM('oui','non') DEFAULT 'oui' NOT NULL",
+		"id_evenement_source"	=> "bigint(21) NOT NULL",
+		"idx"		=> "ENUM('', '1', 'non', 'oui', 'idx') DEFAULT '' NOT NULL",
+		"maj"	=> "TIMESTAMP"
+		);
+
+$evenements_key = array(
+		"PRIMARY KEY"	=> "id_evenement",
+		"KEY date_debut"	=> "date_debut",
+		"KEY date_fin"	=> "date_fin",
+		"KEY id_article"	=> "id_article"
+		);
+
+$tables_principales['spip_evenements'] =
+	array('field' => &$evenements, 'key' => &$evenements_key);
+
+
+//-- Table de relations MOTS_EVENEMENTS----------------------
+$spip_mots_evenements = array(
+		"id_mot"	=> "BIGINT (21) DEFAULT '0' NOT NULL",
+		"id_evenement"	=> "BIGINT (21) DEFAULT '0' NOT NULL");
+
+$spip_mots_evenements_key = array(
+		"PRIMARY KEY"	=> "id_mot, id_evenement",
+		"KEY id_evenement"	=> "id_evenement");
+
+$tables_auxiliaires['spip_mots_evenements'] = array(
+	'field' => &$spip_mots_evenements,
+	'key' => &$spip_mots_evenements_key);
+
+//-- Jointures ----------------------------------------------------
+global $tables_jointures;
+$tables_jointures['spip_evenements'][]= 'mots'; // a placer avant la jointure sur articles
+$tables_jointures['spip_articles'][]= 'evenements';
+$tables_jointures['spip_evenements'][] = 'articles';
+$tables_jointures['spip_mots'][]= 'mots_evenements';
+$tables_jointures['spip_evenements'][] = 'mots_evenements';
+
+global $exceptions_des_tables;
+$exceptions_des_tables['evenements']['id_rubrique']=array('spip_articles', 'id_rubrique');
+
+global $table_primary;
+$table_primary['evenements']="id_evenement";
+
+global $table_date;
+$table_date['evenements'] = 'date_debut';
+// si on declare les tables dans $table_des_tables, il faut mettre le prefixe
+
+// 'spip_' dans l'index de $tables_principales
+global $table_des_tables;
+$table_des_tables['evenements']='evenements';
+$table_des_tables['mots_evenements']='mots_evenements';
+
+
+
+// Extension de la table des groupes de mots cles
+$spip_groupes_mots = array(
+		"id_groupe"	=> "bigint(21) NOT NULL",
+		"titre"	=> "text NOT NULL",
+		"descriptif"	=> "text NOT NULL",
+		"texte"	=> "longblob NOT NULL",
+		"unseul"	=> "varchar(3) NOT NULL",
+		"obligatoire"	=> "varchar(3) NOT NULL",
+		"articles"	=> "varchar(3) NOT NULL",
+		"breves"	=> "varchar(3) NOT NULL",
+		"rubriques"	=> "varchar(3) NOT NULL",
+		"syndic"	=> "varchar(3) NOT NULL");
+if (isset($GLOBALS['meta']['agenda_base_version']))
+	$spip_groupes_mots = array_merge($spip_groupes_mots,array("evenements"	=> "varchar(3) NOT NULL"));
+if (isset($GLOBALS['meta']['pim_agenda_base_version']))
+	$spip_groupes_mots = array_merge($spip_groupes_mots,array("pim_agenda"	=> "varchar(3) NOT NULL"));
+$spip_groupes_mots = array_merge($spip_groupes_mots,array(
+		"minirezo"	=> "varchar(3) NOT NULL",
+		"comite"	=> "varchar(3) NOT NULL",
+		"forum"	=> "varchar(3) NOT NULL",
+		"maj"	=> "TIMESTAMP"));
+
+
+$spip_groupes_mots_key = array(
+		"PRIMARY KEY"	=> "id_groupe");
+
+$tables_principales['spip_groupes_mots'] =
+	array('field' => &$spip_groupes_mots, 'key' => &$spip_groupes_mots_key);
+
+global  $table_des_traitements;
+$table_des_traitements['LIEU'][]= 'propre(%s)';
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/demo_calendrier_mini.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/demo_calendrier_mini.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/demo_calendrier_mini.html	(revision 30)
@@ -0,0 +1,173 @@
+#CACHE{86400}
+<BOUCLE_article_principal(ARTICLES) {id_article}><!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>[(#TITRE|textebrut)][ - (#NOM_SITE_SPIP|textebrut)]</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+	[<meta name="description" content="(#INTRODUCTION|couper{150}|attribut_html)" />]
+	<meta name="generator" content="SPIP" />
+	[<link rel="shortcut icon" href="(#CHEMIN{favicon.ico})" />]
+
+	<!-- Lien vers le backend pour navigateurs eclaires -->
+	<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>" href="#URL_PAGE{backend}" />
+
+	<!-- Ceci est la feuille de style par defaut pour le code genere par SPIP -->
+	<link rel="stylesheet" href="[(#CHEMIN{spip_style.css}|direction_css)]" type="text/css" media="all" />
+	<!-- Feuille de styles CSS pour l'affichage du site sur ecran -->
+	<link rel="stylesheet" href="[(#CHEMIN{habillage.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
+	<!-- Feuille de styles CSS pour l'impression -->
+	<link rel="stylesheet" href="[(#CHEMIN{impression.css}|direction_css)]" type="text/css" media="print" />
+</head>
+
+<body class="page_article">
+<div id="page">
+
+	[(#REM) Entete de la page + titre du site ]
+	<INCLURE{fond=inc-entete}{lang}>
+
+	[(#REM) Fil d'Ariane ]
+	<div id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_article}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; (#TITRE|couper{80})]</div>
+
+
+	<div id="conteneur">
+
+
+		[(#REM) Contenu principal : contenu de l'article ]
+
+		<div id="contenu">
+<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+[(#REM) mini calendrier : 
+1er arg la date, 
+2eme le nom de la variable date (optionel : 'date' par defaut)
+3eme l'url sur laquelle boucler (optionel : url courante par defaut) ]
+#CALENDRIER_MINI{#ENV{date},'date',#SELF}
+
+		<div class="cartouche">
+				#DEBUT_SURLIGNE
+				[(#LOGO_ARTICLE||image_reduire{200,200})]
+				[<p class="surtitre">(#SURTITRE)</p>]
+				<h1 class="titre">#TITRE</h1>
+				[<p class="soustitre">(#SOUSTITRE)</p>]
+				#FIN_SURLIGNE
+
+				<p><small>[(#DATE|nom_jour) ][(#DATE|affdate)][, <:par_auteur:> (#LESAUTEURS)]</small></p>
+
+				[(#REM) Traductions de l'article ]
+				<B_traductions>
+				<div class="traductions">
+					<p><:trad_article_traduction:></p>
+					<ul>
+						<li[ class="(#EXPOSE)"]>[(#LANG|traduire_nom_langue)]</li>
+						<BOUCLE_traductions(ARTICLES){traduction}{exclus}>
+						<li><a[ href="(#URL_ARTICLE|url_absolue)"] rel="alternate" hreflang="#LANG"[ title="(#TITRE|couper{80}|texte_backend)"]><span lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR">[(#LANG|traduire_nom_langue)]</span></a></li>
+						</BOUCLE_traductions>
+					</ul>
+				</div>
+				</B_traductions>
+			</div>
+
+
+			#DEBUT_SURLIGNE
+			[<div class="chapo">(#CHAPO)</div>]
+			<br class="nettoyeur" />
+			[<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+			[<div class="texte">(#TEXTE|image_reduire{520,0})</div>]
+			#FIN_SURLIGNE
+
+			[(#REM) Portfolio : album d'images ]
+			<B_documents_portfolio>
+			<div id="documents_portfolio">
+				<h2><:info_portfolio:></h2>
+				<BOUCLE_documents_portfolio(DOCUMENTS) {id_article}
+				{mode=document} {extension IN png,jpg,gif} {par date}
+				{doublons}>
+				[<a href="#URL_DOCUMENT" type="#MIME_TYPE"
+				onclick="this.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return true;"[title="(#TITRE|couper{80}|texte_backend)"]>(#LOGO_DOCUMENT||image_reduire{0,60}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+				</BOUCLE_documents_portfolio>
+			</div>
+			</B_documents_portfolio>
+			<BOUCLE_afficher_document(DOCUMENTS) {id_document}
+			{mode=document}{extension IN png,jpg,gif}>
+			<div class="spip_documents spip_documents_center" id="document_actif">
+				#EMBED_DOCUMENT
+				[<div class="spip_doc_titre">(#TITRE)</div>]
+				[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+			</div>
+			</BOUCLE_afficher_document>
+
+			[<div class="ps"><h2><:info_ps:></h2>#DEBUT_SURLIGNE(#PS)#FIN_SURLIGNE</div>]
+
+			[(#REM) Autres documents joints a l'article ]
+			<B_documents_joints>
+			<div id="documents_joints">
+				<h2><:titre_documents_joints:></h2>
+				<ul>
+					<BOUCLE_documents_joints(DOCUMENTS) {id_article} {mode=document} {par date} {doublons}>
+					<li>
+					<div class="spip_doc_titre"><a href="#URL_DOCUMENT" title="<:bouton_telecharger:>" type="#MIME_TYPE">[(#TITRE|sinon{<:info_document:>})]</a> <small>(#TYPE_DOCUMENT[ - (#TAILLE|taille_en_octets)])</small></div>
+					[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]</li>
+					<br class="nettoyeur" />
+					</BOUCLE_documents_joints>
+				</ul>
+			</div>
+			</B_documents_joints>
+
+			[(#REM) Petition :
+			La petition ayant une PAGINATION il faut absolument lui passer SELF]
+			[ #REM Conserver cet invalideur invisible : (#PETITION|?{'',''}) ]
+			<INCLURE{fond=inc-petition}{id_article}{self=#SELF}>
+
+			[<div class="notes"><h2><:info_notes:></h2>#DEBUT_SURLIGNE(#NOTES)#FIN_SURLIGNE</div>]
+
+			[(#REM) Forum de l'article ]
+			[<h2 class="forum-repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_article:></a></h2>]
+			<INCLURE{fond=inc-forum}{id_article}>
+
+
+		</div><!-- fin contenu -->
+
+
+		[(#REM) Menu de navigation laterale ]
+		<div id="navigation">
+			<h1 class="invisible"><:navigation:></h1>
+
+			[(#REM) Menu de navigation par rubriques ]
+			<INCLURE{fond=inc-rubriques}{lang}{id_rubrique}>
+
+			[(#REM) Articles dans la meme rubrique ]
+			<B_articles_rubrique>
+			<div class="breves">
+				<h2 class="menu-titre"><a href="#URL_RUBRIQUE"><:meme_rubrique:></a></h2>
+				<ul>
+					<BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {par date}{inverse} {0,10}>
+					<li><a href="#URL_ARTICLE"[ class="(#EXPOSE)"]>#TITRE</a></li>
+					</BOUCLE_articles_rubrique>
+				</ul>
+			</div>
+			</B_articles_rubrique>
+
+			[(#REM) Menu de navigation mots-cles ]
+			<B_mots>
+			<div class="divers">
+				<h2 class="menu-titre"><:mots_clefs:></h2>
+			<ul>
+				<BOUCLE_mots(MOTS) {id_article} {par titre}>
+				<li><a href="#URL_MOT" rel="tag">#TITRE</a></li>
+				</BOUCLE_mots>
+			</ul>
+			</div>
+			</B_mots>
+		</div><!-- fin navigation -->
+
+	</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/agenda/1_9_1/exec/agenda_evenements.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/exec/agenda_evenements.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/exec/agenda_evenements.php	(revision 30)
@@ -0,0 +1,451 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/texte');
+include_spip('inc/presentation');
+include_spip('inc/agenda_filtres');
+include_spip('inc/agenda_gestion');
+
+function date_debut_fin($annee,$mois,$jour,$type){
+	if ($type=='jour'){
+		$ts_start=strtotime("$annee-$mois-01 00:00:00");
+		$ts_start+=($jour-1)*24*60*60;
+		$ts_fin=$ts_start+24*60*60;
+	} else
+	if ($type=="semaine"){
+		$ts_start=strtotime("$annee-$mois-01 01:00:00");
+		$ts_start+=($jour-1)*24*60*60;
+		while (date('w',$ts_start)!=1) $ts_start-=24*60*60;
+		$ts_fin=$ts_start+7*24*60*60+60*60;
+		$ts_start-=2*60*60;
+	} else
+	if ($type=='mois'){
+		$ts_start=strtotime("$annee-$mois-01 00:00:00");
+		if ($mois<'12')
+			$ts_fin=strtotime("$annee-".($mois+1)."-01 00:00:00");
+		else
+			$ts_fin=strtotime(($annee+1)."-$mois-01 00:00:00");
+	}
+	return array($ts_start,$ts_fin);	
+}
+function ajoute_creneaux_horaires($urlbase,$ts_start,$ts_fin,$type,$partie_cal,$echelle){
+	if ($echelle<=120)
+		$freq_creneaux=30*60;
+	else
+		$freq_creneaux=60*60;
+
+	$today=date('Y-m-d');
+	// creneaux pour ajout uniquement si ajouter_id_article present
+	if (($type!='mois')&&($partie_cal!='sansheure'))
+	{
+		$heuremin='08';$heuremax='20';
+		if ($partie_cal=='matin'){
+			$heuremin='04';$heuremax='15';
+		}
+		if ($partie_cal=='soir'){
+			$heuremin='12';$heuremax='23';
+		}
+		for ($j=$ts_start;$j<=$ts_fin;$j+=$freq_creneaux){
+			$heure=date('H',$j);
+			if (($heure>=$heuremin)&&($heure<=$heuremax)){
+				$url=parametre_url($urlbase,'ndate',urlencode(date('Y-m-d H:i',$j)));
+				$creneau=date('Y-m-d H:i:s',$j);
+				if (date('Y-m-d',$j)==$today)
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "", $url,'calendrier-creneau-today');
+				else if (date('w',$j)==0)
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "",$url,'calendrier-creneau-sunday');
+				else
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "",$url,'calendrier-creneau');
+			}
+		}
+	}
+	
+}
+
+function affiche_evenements_agenda($flag_editable){
+	global $visu_evenements;
+	$type = _request('type');
+	$partie_cal = _request('partie_cal');
+	if (!$type) $type='semaine';
+	$id_evenement = intval(_request('id_evenement'));
+	$ajouter_id_article = intval(_request('ajouter_id_article'));
+	global $annee,$mois,$jour;
+	$annee = intval(_request('annee'));
+	$mois = intval(_request('mois'));
+	$jour = intval(_request('jour'));
+
+	if ($flag_editable)
+		Agenda_action_formulaire_article($ajouter_id_article);
+
+	$visu_evenements=array();
+
+	if ((!$annee)||(!$mois)||(!$jour)){
+		if (!$id_evenement){ // pas d'id_evenement--> date du jour
+			$stamp=time();
+		}
+		else { // date de l'evenement
+			$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+			if ($row = spip_fetch_array($res))
+				$stamp=strtotime($row['date_debut']);
+			else 
+				$stamp=time();
+		}
+		$annee=date('Y',$stamp);
+		$mois=date('m',$stamp);
+		$jour=date('d',$stamp);
+ 	}
+
+
+ 	$urlbase=self();
+ 	$urlbase=parametre_url($urlbase,'edit','');
+ 	$urlbase=parametre_url($urlbase,'del','');
+ 	$urlbase=parametre_url($urlbase,'ndate','');
+ 	$urlbase=parametre_url($urlbase,'id_evenement','');
+ 	$urlbase=parametre_url($urlbase,'neweven','1');
+ 	
+	//$urlbase=str_replace("&amp;","&",$urlbase);
+
+	// creation des boites creneaux horaires pour ajout rapide
+	list($ts_start,$ts_fin) = date_debut_fin($annee,$mois,$jour,$type);
+	if ($flag_editable)
+		ajoute_creneaux_horaires($urlbase,$ts_start,$ts_fin,$type,$partie_cal,$echelle);
+
+
+	$categorie_concerne=array('plage'=>'calendrier-plage','evenement'=>'calendrier-evenement');
+	$categorie_info=array('plage'=>'calendrier-plage-info','evenement'=>'calendrier-evenement-info');
+
+	$datestart=date('Y-m-d H:i:s',$ts_start-24*60*60);
+	$datefin=date('Y-m-d H:i:s',$ts_fin+24*60*60);
+
+	// tous les evenements
+	$res = spip_query("SELECT * 
+							FROM spip_evenements AS evenements
+						 WHERE ((evenements.date_debut>='$datestart' AND evenements.date_debut<='$datefin') 
+						 		OR (evenements.date_fin>='$datestart' AND evenements.date_fin<='$datefin')
+						 		OR (evenements.date_debut<'$datestart' AND evenements.date_fin>'$datefin'))
+						 ORDER BY evenements.date_debut;");
+ 	$urlbase=parametre_url($urlbase,'neweven','');
+	$urlbase=parametre_url($urlbase,'annee',$annee);
+	$urlbase=parametre_url($urlbase,'mois',$mois);
+	$urlbase=parametre_url($urlbase,'jour',$jour);
+	while ($row = spip_fetch_array($res)){
+		$is_evt=($row['horaire']!='oui')
+						||($row['date_debut']<$datestart && $row['date_fin']>$datefin);
+		$concerne=(!$ajouter_id_article) || ($ajouter_id_article==$row['id_article']);
+
+		$url=parametre_url($urlbase,'id_evenement',$row['id_evenement']);
+		$url=parametre_url($url,'ajouter_id_article',$row['id_article']);
+		
+		$titre = typo($row['titre']);
+		$descriptif = typo($row['descriptif']);
+		$lieu = typo($row['lieu']);
+		$texte=wordwrap(entites_html($row['titre'],ENT_QUOTES),15,"<br />\n");
+		if (($type!='mois')&&(!$is_evt))
+			$texte.="<hr />" . wordwrap(entites_html($row['descriptif'],ENT_QUOTES),15, "<br />\n");
+		if (strlen($texte)==0) $texte=_L("(sans objet)");
+
+		if ($concerne)	$categorie = $categorie_concerne;
+		else						$categorie = $categorie_info;
+		if ($is_evt) 		$categorie = $categorie['evenement'];
+		else 						$categorie = $categorie['plage'];
+		if ($id_evenement==$row['id_evenement'])
+			$categorie.='-selection';
+
+		if (!$is_evt)
+			Agenda_memo_full($row['date_debut'], $row['date_fin'], $titre, $descriptif, $lieu, $url, $categorie);
+		else{
+			//if ($type!='mois')
+			//	Agenda_memo_evt_full($row['date_debut'], $row['date_debut'], Agenda_rendu_boite($titre,$descriptif,$lieu), "", "", $url, $categorie);
+			//else
+				Agenda_memo_evt_full($row['date_debut'], $row['date_fin'], $titre, $descriptif, $lieu, $url, $categorie);
+		}
+		$visu_evenements[$row['id_evenement']]=1;
+	}
+
+	$s = "<span class='agenda-calendrier'>\n";
+	// attention : bug car $type est modifie apres cet appel !
+	$s .= Agenda_affiche_full(1,'', $type, 'calendrier-creneau','calendrier-creneau-today','calendrier-creneau-sunday','calendrier-plage','calendrier-evenement','calendrier-plage-info','calendrier-evenement-info','calendrier-plage-selection','calendrier-evenement-selection');
+	$s .= "</span>";
+
+	return $s;
+}
+
+
+function visu_evenement_agenda($id_evenement,$flag_editable){
+	$out = "";
+	$ndate = _request('ndate');
+	$del = _request('del');
+
+	if ($id_evenement!=NULL){
+		$res = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement=".spip_abstract_quote($id_evenement));
+		if ($row = spip_fetch_array($res)){
+			if (!isset($neweven)){
+				$fid_evenement=$row['id_evenement'];
+				$ftitre=attribut_html(typo($row['titre']));
+				$flieu=attribut_html(typo($row['lieu']));
+
+				$fhoraire=attribut_html($row['horaire']);
+				$fdescriptif=attribut_html(typo($row['descriptif']));
+				$fstdatedeb=strtotime($row['date_debut']);
+				$fstdatefin=strtotime($row['date_fin']);
+				$fid_evenement_source=$row['id_evenement_source'];
+			}
+	 	}
+		$out .= "<div class='agenda-visu-evenement'>";
+		$res2 = spip_query("SELECT articles.* FROM spip_articles AS articles LEFT JOIN spip_evenements AS J ON J.id_article=articles.id_article WHERE J.id_evenement=".spip_abstract_quote($id_evenement));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div class='article-evenement'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html(typo($row2['titre']))."</a>";
+			$out .= "</div>\n";
+		}
+		
+		$out .= "<div class='agenda-visu-evenement-bouton-fermer'>";
+		$url=self();
+		$url=parametre_url($url,'edit','');
+		$url=parametre_url($url,'neweven','');
+		$url=parametre_url($url,'del','');
+		$url=parametre_url($url,'id_evenement','');
+
+		$out .= "<a href='$url'><img src='"._DIR_PLUGIN_AGENDA."/img_pack/croix.png' width='12' height='12' style='border:none;'></a>";
+		$out .= "</div>\n";
+
+		$fobjet = entites_html($fobjet,ENT_QUOTES);
+		$flieu = entites_html($flieu,ENT_QUOTES);
+		$fdescription = entites_html($fdescription,ENT_QUOTES);
+
+		$out .= "<div class='titre-titre'>";
+		$out .= _T('agenda:evenement_titre');
+		$out .= "</div><div class='titre-visu'>$ftitre &nbsp;</div>\n";
+
+		$out .= "<div class='lieu-titre'>";
+		$out .= _T('agenda:evenement_lieu');
+		$out .= "</div><div class='lieu-visu'>$flieu &nbsp;</div>\n";
+		$out .= "<div class='horaire-titre'>&nbsp;</div>";
+
+		$out .= "<div class='date-titre'>";
+		$out .= _T('agenda:evenement_date'); 
+		$out .= "</div>";
+		$out .= "<div class='date-visu'>";
+		$out .= _T('agenda:evenement_date_du'); 
+		$out .= " ".affdate_jourcourt(date("Y-m-d H:i",$fstdatedeb))." ";
+
+
+
+		if ($fhoraire=='oui')
+// M. Possoz Change: Date
+//			$out .= " &agrave; ".date("H:i",$fstdatedeb)." ";
+			$out .= _T('agenda:evenement_date_a_immediat'); 
+			$out .= " ".date("H:i",$fstdatedeb);
+
+		$out .= " <br/>\n";
+
+// M. Possoz Change: Date au
+//		$out .= "Au ".affdate_jourcourt(date("Y-m-d H:i",$fstdatefin));
+		$out .= _T('agenda:evenement_date_au'); 
+		$out .= " ".affdate_jourcourt(date("Y-m-d H:i",$fstdatefin))." ";
+
+		if ($fhoraire=='oui')
+// M. Possoz Change: Date
+//			$out .= " &agrave; ".date("H:i",$fstdatefin)." ";
+			$out .= _T('agenda:evenement_date_a_immediat'); 
+			$out .= " ".date("H:i",$fstdatefin);
+
+		$out .= " <br/>\n";
+		$out .= "</div>\n";
+
+// M. Possoz Change: Date
+//		$out .= "<div class='descriptif-titre'>Description</div><div class='descriptif-visu'>$fdescriptif &nbsp;</div>\n";
+		$out .= "<div class='descriptif-titre'>";
+		$out .= _T('agenda:evenement_descriptif'); 
+		$out .= "</div><div class='descriptif-visu'>$fdescriptif &nbsp;</div>\n";
+
+		$out .=  "<div class='agenda_mots_cles'>";
+		$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+		$sep = "";
+		while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+			$id_groupe = $row['id_groupe'];
+			$row2 = spip_fetch_array(
+						spip_query("SELECT mots.titre FROM spip_mots_evenements AS mots_evenements
+								LEFT JOIN spip_mots AS mots ON mots.id_mot=mots_evenements.id_mot 
+								WHERE mots.id_groupe=".spip_abstract_quote($id_groupe).
+								" AND mots_evenements.id_evenement=".spip_abstract_quote($id_evenement)));
+			if ($row2){
+				$out .= $sep . supprimer_numero($row['titre'])."&nbsp;:&nbsp;".supprimer_numero($row2['titre']);
+				$sep = "\n, ";
+			}
+		}
+		$out .= "</div>\n";
+		
+
+		$url = parametre_url(self(),'annee','');
+		$url = parametre_url($url,'mois','');
+		$url = parametre_url($url,'jour','');
+
+		$out .= "<div class='repetitions-calendrier'>";
+		$id_source = $fid_evenement_source?$fid_evenement_source:$id_evenement;
+		$res2 = spip_query("SELECT * FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_source)." OR id_evenement_source=".spip_abstract_quote($id_source)." ORDER BY date_debut");
+		if (spip_num_rows($res2)>1){
+			$out .= _T('agenda:evenement_autres_occurences');
+			while($row2 = spip_fetch_array($res2)){
+				if ($row2['id_evenement']!=$fid_evenement){
+					$url = parametre_url(self(),'id_evenement',$row2['id_evenement']);
+					$out .= " <a href='$url'>" . affdate_jourcourt($row2['date_debut']) ."</a>";
+				}
+			}
+		}
+		$out .= "</div>";
+	
+		if ($fid_evenement_source!=0){
+			$res2 = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement=".spip_abstract_quote($fid_evenement_source));
+			if ($row2 = spip_fetch_array($res2)){
+				$url = parametre_url($url,'id_evenement',$row2['id_evenement']);
+			  $out .= "<div class='edition-bouton'>";
+			  $out .= _T('agenda:repetition_de')." <a href='";
+			  $out .= $url;
+			  $out .= "'>".($row2['titre']?typo($row2['titre']):_T('agenda:sans_titre'))."</a>";
+			  $out .= "</div>";
+			}
+		}
+		else if ($flag_editable){
+			$url=self();
+			$url=parametre_url($url,'edit','');
+			$url=parametre_url($url,'neweven','');
+			$url=parametre_url($url,'del','');
+			$url=parametre_url($url,'id_evenement','');
+			if ($del==1)	{ //---------------Suppression RDV ------------------------------
+			  $out .= "<form name='edition_rdv' action='$url' method='post'>";
+			  //$out .= "<input type='hidden' name='redirect' value='$url' />\n";
+			  $out .= "<input type='hidden' name='id_evenement' value='$fid_evenement' />\n";
+			  $out .= "<input type='hidden' name='suppr' value='1' />\n";
+			  $out .= "<div class='edition-bouton'>";
+			  $out .= "<input type='submit' name='submit' value='Annuler' />";
+			  $out .= "<input type='submit' name='submit' value='Confirmer la suppression' />";
+			  $out .= "</div></form>";
+	  	}
+	  	else {
+				$url=parametre_url($url,'id_evenement',$id_evenement);
+			  $out .= "<form name='edition_rdv' action='$url' method='post'>";
+			  //$out .= "<input type='hidden' name='redirect' value='$url' />\n";
+			  $out .= "<input type='hidden' name='id_evenement' value='$fid_evenement' />\n";
+			  $out .= "<input type='hidden' name='edit' value='1' />\n";
+			  $out .= "<div class='edition-bouton'>";
+				$out .= "<div style='text-align:$spip_lang_right'><input type='submit' name='modifier' value='"._T('bouton_modifier')."' class='fondo'></div>";
+			  $out .= "</div></form>";
+	  	}
+		}
+		$out .= "</div>\n";
+	}
+	return $out;
+}
+
+function exec_agenda_evenements_dist(){
+	// s'assurer que les tables sont crees
+	Agenda_install();
+	include_spip('inc/calendar');
+	// Reserver les widgets agenda
+	WCalendar_ajoute_lies(_T('agenda:evenement_date_debut'),'_evenement_debut',_T('agenda:evenement_date_fin'),'_evenement_fin');
+	WCalendar_ajoute_statique(_T('agenda:evenement_repetitions'),'_repetitions');
+
+	$ajouter_id_article = intval(_request('ajouter_id_article'));
+	$flag_editable = article_editable($ajouter_id_article);
+
+	global $visu_evenements;
+	$type = _request('type');
+	if (!$type) $type='semaine';
+	$id_evenement = intval(_request('id_evenement'));
+	$edit = _request('edit');
+	$neweven = _request('neweven');
+
+	$annee = intval(_request('annee'));
+	$mois = intval(_request('mois'));
+	$jour = intval(_request('jour'));
+	$date = date("Y-m-d", time());
+	if ($annee&&$mois&&$jour)
+		$date = date("Y-m-d", strtotime("$annee-$mois-$jour"));
+
+
+		
+	if ($type == 'semaine') {
+	
+		//$GLOBALS['afficher_bandeau_calendrier_semaine'] = true;
+		$titre = _T('titre_page_calendrier',
+			array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+	}
+  elseif ($type == 'jour') {
+		$titre = nom_jour($date)." ". affdate_jourcourt($date);
+  }
+	else {
+		$titre = _T('titre_page_calendrier',
+		    array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+	}
+
+  debut_page($titre, "redacteurs", "calendrier","",$css);
+	barre_onglets("calendrier", "evenements");
+
+	$out = "<div>";
+	if ($ajouter_id_article){
+		$res2 = spip_query("SELECT * FROM spip_articles AS articles WHERE id_article=".spip_abstract_quote($ajouter_id_article));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div style=' width:750px; font-size: 18px; color: #9DBA00; font-weight: bold;text-align:left;'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html(typo($row2['titre']))."</a></div>";
+		}
+	}
+	echo $out ."&nbsp;</div>" ;
+
+	echo affiche_evenements_agenda($flag_editable);
+
+	if (($edit||$neweven)&&($flag_editable))	{ //---------------Edition RDV ------------------------------
+		$ndate = _request('ndate');
+		echo Agenda_formulaire_edition_evenement($id_evenement,$neweven,$ndate);
+	}
+	else
+		if ((isset($id_evenement))&&(isset($visu_evenements[$id_evenement]))){ //---------------Visualisation RDV ------------------------------
+			echo visu_evenement_agenda($id_evenement,$flag_editable);
+		}
+	fin_page();
+
+}
+
+function http_calendrier_ics_message($annee, $mois, $jour, $large)
+{
+	return "";
+}
+
+function http_calendrier_aide_mess()
+{
+	return "";
+}
+
+function http_calendrier_semainesh($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	$init = date("w",mktime(1,1,1,$mois,$jour,$annee));
+	$init = $jour+1-($init ? $init : 7);
+	$sd = '';
+
+	if (is_array($evt))
+	  {
+		  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+		  if ($sansduree)
+		    foreach($sansduree as $d => $r) 
+		      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+	    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+	    $evt =
+	      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+	      http_calendrier_mois_sept($annee, $mois, $init, $init+ 6, $evenements, $script);
+	  } else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  "</table>" .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/exec/mots_tous.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/exec/mots_tous.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/exec/mots_tous.php	(revision 30)
@@ -0,0 +1,231 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('exec/grouper_mots');
+include_spip('inc/agenda_gestion');
+include_spip('inc/pim_agenda_gestion');
+
+// http://doc.spip.org/@exec_mots_tous_dist
+function exec_mots_tous_dist()
+{
+  global $acces_comite, $acces_forum, $acces_minirezo, $new, $articles, $breves, $change_type, $conf_mot, $connect_statut, $connect_toutes_rubriques, $descriptif, $id_groupe, $modifier_groupe, $obligatoire, $rubriques, $spip_lang, $spip_lang_right, $supp_group, $son_groupe, $syndic, $texte, $unseul;
+	global $evenements, $pim_agenda;
+	global $tables_principales;
+	
+  $id_groupe = intval($id_groupe);
+  $conf_mot = intval($conf_mot);
+
+  if (acces_mots()) {
+	if (function_exists('Agenda_install'))	Agenda_install();
+	if (function_exists('PIMAgenda_install'))	PIMAgenda_install();
+	if ($modifier_groupe == "oui") {
+		$change_type = (corriger_caracteres($change_type));
+		$texte = (corriger_caracteres($texte));
+		$descriptif = (corriger_caracteres($descriptif));
+
+		if (!$new) {	// modif groupe
+			spip_query("UPDATE spip_mots SET type=" . spip_abstract_quote($change_type) . " WHERE id_groupe=$id_groupe");
+
+
+			spip_query("UPDATE spip_groupes_mots SET titre=" . spip_abstract_quote($change_type) . ", texte=" . spip_abstract_quote($texte) . ", descriptif=" . spip_abstract_quote($descriptif) . ", unseul=" . spip_abstract_quote($unseul) . ", obligatoire=" . spip_abstract_quote($obligatoire) . ", articles=" . spip_abstract_quote($articles) . ", breves=" . spip_abstract_quote($breves) . ", rubriques=" . spip_abstract_quote($rubriques) . ", syndic=" . spip_abstract_quote($syndic) . ",	minirezo=" . spip_abstract_quote($acces_minirezo) . ", comite=" . spip_abstract_quote($acces_comite) . ", forum=" . spip_abstract_quote($acces_forum) . " WHERE id_groupe=$id_groupe");
+
+		} else {	// creation groupe
+		  $id_groupe = spip_abstract_insert('spip_groupes_mots', "(titre, texte, descriptif, unseul,  obligatoire, articles, breves, rubriques, syndic, minirezo, comite, forum)", "(" . spip_abstract_quote($change_type) . ", " . spip_abstract_quote($texte) . " , " . spip_abstract_quote($descriptif) . " , " . spip_abstract_quote($unseul) . " , " . spip_abstract_quote($obligatoire) . " , " . spip_abstract_quote($articles) . " ," . spip_abstract_quote($breves) . " , " . spip_abstract_quote($rubriques) . " , " . spip_abstract_quote($syndic) . " , " . spip_abstract_quote($acces_minirezo) . " ,  " . spip_abstract_quote($acces_comite) . " , " . spip_abstract_quote($acces_forum) . " )");
+		}
+		if ($id_groupe && isset($tables_principales['spip_evenements']))
+			spip_query("UPDATE spip_groupes_mots SET evenements=".spip_abstract_quote($evenements)." WHERE id_groupe=$id_groupe");
+		if ($id_groupe && isset($tables_principales['spip_pim_agenda']))
+			spip_query("UPDATE spip_groupes_mots SET pim_agenda=".spip_abstract_quote($pim_agenda)." WHERE id_groupe=$id_groupe");
+	}
+	if ($supp_group){
+		spip_query("DELETE FROM spip_groupes_mots WHERE id_groupe=" . intval($supp_group));
+	}
+ }
+
+
+pipeline('exec_init',array('args'=>array('exec'=>'mots_tous'),'data'=>''));
+debut_page(_T('titre_page_mots_tous'), "naviguer", "mots");
+debut_gauche();
+
+echo pipeline('affiche_gauche',array('args'=>array('exec'=>'mots_tous'),'data'=>''));
+creer_colonne_droite();
+echo pipeline('affiche_droite',array('args'=>array('exec'=>'mots_tous'),'data'=>''));
+debut_droite();
+
+gros_titre(_T('titre_mots_tous'));
+ if (acces_mots()) {
+  echo typo(_T('info_creation_mots_cles')) . aide ("mots") ;
+  }
+ echo "<br><br>";
+
+
+//
+// On boucle d'abord sur les groupes de mots
+//
+
+ $result_groupes = spip_query("SELECT *, ".creer_objet_multi ("titre", "$spip_lang")." FROM spip_groupes_mots ORDER BY multi");
+
+
+while ($row_groupes = spip_fetch_array($result_groupes)) {
+	$id_groupe = $row_groupes['id_groupe'];
+	$titre_groupe = typo($row_groupes['titre']);
+	$descriptif = $row_groupes['descriptif'];
+	$texte = $row_groupes['texte'];
+	$unseul = $row_groupes['unseul'];
+	$obligatoire = $row_groupes['obligatoire'];
+	$articles = $row_groupes['articles'];
+	$breves = $row_groupes['breves'];
+	$rubriques = $row_groupes['rubriques'];
+	$syndic = $row_groupes['syndic'];
+	if (isset($tables_principales['spip_evenements']))	$evenements = $row_groupes['evenements'];
+	if (isset($tables_principales['spip_pim_agenda']))	$pim_agenda = $row_groupes['pim_agenda'];
+	$acces_minirezo = $row_groupes['minirezo'];
+	$acces_comite = $row_groupes['comite'];
+	$acces_forum = $row_groupes['forum'];
+
+	// Afficher le titre du groupe
+	debut_cadre_enfonce("groupe-mot-24.gif", false, '', $titre_groupe);
+	// Affichage des options du groupe (types d'elements, permissions...)
+	echo "<font face='Verdana,Arial,Sans,sans-serif' size=1>";
+	if ($articles == "oui") echo "> "._T('info_articles_2')." &nbsp;&nbsp;";
+	if ($breves == "oui") echo "> "._T('info_breves_02')." &nbsp;&nbsp;";
+	if ($rubriques == "oui") echo "> "._T('info_rubriques')." &nbsp;&nbsp;";
+	if ($syndic == "oui") echo "> "._T('icone_sites_references')." &nbsp;&nbsp;";
+	if (isset($tables_principales['spip_evenements']))
+		if ($evenements == "oui") echo "> "._T('agenda:info_evenements')." &nbsp;&nbsp;";
+	if (isset($tables_principales['spip_pim_agenda']))
+		if ($pim_agenda == "oui") echo "> "._T('pimagenda:info_evenements')." &nbsp;&nbsp;";
+
+	if ($unseul == "oui" OR $obligatoire == "oui") echo "<br>";
+	if ($unseul == "oui") echo "> "._T('info_un_mot')." &nbsp;&nbsp;";
+	if ($obligatoire == "oui") echo "> "._T('info_groupe_important')." &nbsp;&nbsp;";
+
+	echo "<br />";
+	if ($acces_minirezo == "oui") echo "> "._T('info_administrateurs')." &nbsp;&nbsp;";
+	if ($acces_comite == "oui") echo "> "._T('info_redacteurs')." &nbsp;&nbsp;";
+	if ($acces_forum == "oui") echo "> "._T('info_visiteurs_02')." &nbsp;&nbsp;";
+
+	echo "</font>";
+	if ($descriptif) {
+		echo "<div style='border: 1px dashed #aaaaaa;'>";
+		echo "<font size='2' face='Verdana,Arial,Sans,sans-serif'>";
+		echo "<b>",_T('info_descriptif'),"</b> ";
+		echo propre($descriptif);
+		echo "&nbsp; ";
+		echo "</font>";
+		echo "</div>";
+	}
+
+	if (strlen($texte)>0){
+		echo "<FONT FACE='Verdana,Arial,Sans,sans-serif'>";
+		echo propre($texte);
+		echo "</FONT>";
+	}
+
+	//
+	// Afficher les mots-cles du groupe
+	//
+	$supprimer_groupe = afficher_groupe_mots($id_groupe);
+
+	echo "<div id='editer_mot-$id_groupe' style='position: relative;'>";
+
+	// Preliminaire: confirmation de suppression d'un mot lie à qqch
+	// (cf fin de afficher_groupe_mots_boucle executee a l'appel precedent)
+	if ($conf_mot  AND $son_groupe==$id_groupe)
+		echo confirmer_mot($conf_mot, $id_groupe);
+
+	echo $supprimer_groupe;
+
+	echo "</div>";
+
+	if (acces_mots() AND !$conf_mot){
+		echo "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>";
+		echo "<tr>";
+		echo "<td>";
+		icone(_T('icone_modif_groupe_mots'), generer_url_ecrire("mots_type","id_groupe=$id_groupe"), "groupe-mot-24.gif", "edit.gif");
+		echo "</td>";
+		if (!$supprimer_groupe) {
+			echo "<td>";
+			icone(_T('icone_supprimer_groupe_mots'), generer_url_ecrire("mots_tous","supp_group=$id_groupe"), "groupe-mot-24.gif", "supprimer.gif");
+			echo "</td>";
+			echo "<td> &nbsp; </td>"; // Histoire de forcer "supprimer" un peu plus vers la gauche
+		}
+		echo "<td>";
+		echo "<div align='$spip_lang_right'>";
+		icone(_T('icone_creation_mots_cles'), generer_url_ecrire("mots_edit","new=oui&id_groupe=$id_groupe&redirect=" . generer_url_retour('mots_tous')), "mot-cle-24.gif", "creer.gif");
+		echo "</div>";
+		echo "</td></tr></table>";
+	}	
+
+	fin_cadre_enfonce();
+}
+
+ if (acces_mots()  AND !$conf_mot){
+	echo "<p>&nbsp;</p><div align='right'>";
+	icone(_T('icone_creation_groupe_mots'), generer_url_ecrire("mots_type","new=oui"), "groupe-mot-24.gif", "creer.gif");
+	echo "</div>";
+}
+
+fin_page();
+}
+
+function confirmer_mot ($conf_mot, $son_groupe)
+{
+	$row = spip_fetch_array(spip_query("SELECT * FROM spip_mots WHERE id_mot=$conf_mot"));
+	$id_mot = $row['id_mot'];
+	$titre_mot = typo($row['titre']);
+	$type_mot = typo($row['type']);
+
+	if (($na = intval($na)) == 1) {
+		$texte_lie = _T('info_un_article')." ";
+	} else if ($na > 1) {
+		$texte_lie = _T('info_nombre_articles', array('nb_articles' => $na)) ." ";
+	}
+	if (($nb = intval($nb)) == 1) {
+		$texte_lie .= _T('info_une_breve')." ";
+	} else if ($nb > 1) {
+		$texte_lie .= _T('info_nombre_breves', array('nb_breves' => $nb))." ";
+	}
+	if (($ns = intval($ns)) == 1) {
+		$texte_lie .= _T('info_un_site')." ";
+	} else if ($ns > 1) {
+		$texte_lie .= _T('info_nombre_sites', array('nb_sites' => $ns))." ";
+	}
+	if (($nr = intval($nr)) == 1) {
+		$texte_lie .= _T('info_une_rubrique')." ";
+	} else if ($nr > 1) {
+		$texte_lie .= _T('info_nombre_rubriques', array('nb_rubriques' => $nr))." ";
+	}
+
+	return debut_boite_info(true)
+	. "<div class='serif'>"
+	. _T('info_delet_mots_cles', array('titre_mot' => $titre_mot, 'type_mot' => $type_mot, 'texte_lie' => $texte_lie))
+	. "<p>"
+	  . ajax_action_auteur('editer_mot', "$son_groupe,$id_mot,,,",'grouper_mots', "&id_groupe=$son_groupe", array("<b>" . _T('item_oui') . "</b>", ''))
+	. '&nbsp;'
+	.  _T('info_oui_suppression_mot_cle')
+	  /* troublant. A refaire avec une visibility
+	 . "<LI><B><A href='" 
+	. generer_url_ecrire("mots_tous")
+	. "#editer_mot-$son_groupe"
+	. "'>"
+	. _T('item_non')
+	. "</A>,</B> "
+	. _T('info_non_suppression_mot_cle')
+	. "</UL>" */
+	. "</div>"
+	. fin_boite_info(true)
+	. "<br />";
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/exec/mots_type.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/exec/mots_type.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/exec/mots_type.php	(revision 30)
@@ -0,0 +1,251 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('base/agenda_evenements'); // si le plugin existe
+include_spip('base/pim_agenda'); // si le plugin existe
+
+// http://doc.spip.org/@exec_mots_type_dist
+function exec_mots_type_dist()
+{
+  global $connect_statut, $descriptif, $id_groupe, $new, $options, $texte, $titre;
+  global $tables_principales;
+
+  $id_groupe= intval($id_groupe);
+
+if ($connect_statut == '0minirezo' AND $new == "oui") {
+	$id_groupe = '';
+	$type = filtrer_entites(_T('titre_nouveau_groupe'));
+	$onfocus = " onfocus=\"if(!antifocus){this.value='';antifocus=true;}\"";
+	$ancien_type = '';
+	$unseul = 'non';
+	$obligatoire = 'non';
+	$articles = 'oui';
+	$breves = 'oui';
+	$rubriques = 'non';
+	$syndic = 'oui';
+	$evenements = 'non';
+	$pim_agenda = 'non';
+	$acces_minirezo = 'oui';
+	$acces_comite = 'oui';
+	$acces_forum = 'non';
+} else {
+	$result_groupes = spip_query("SELECT * FROM spip_groupes_mots WHERE id_groupe=$id_groupe");
+
+	while($row = spip_fetch_array($result_groupes)) {
+		$id_groupe = $row['id_groupe'];
+		$type = $row['titre'];
+		$titre = typo($type);
+		$descriptif = $row['descriptif'];
+		$texte = $row['texte'];
+		$unseul = $row['unseul'];
+		$obligatoire = $row['obligatoire'];
+		$articles = $row['articles'];
+		$breves = $row['breves'];
+		$rubriques = $row['rubriques'];
+		$syndic = $row['syndic'];
+		if (isset($row['evenements']))
+			$evenements = $row['evenements'];
+		if (isset($row['pim_agenda']))
+			$pim_agenda = $row['pim_agenda'];
+		$acces_minirezo = $row['minirezo'];
+		$acces_comite = $row['comite'];
+		$acces_forum = $row['forum'];
+		$onfocus ="";
+		$new = '';
+	}
+}
+
+pipeline('exec_init',array('args'=>array('exec'=>'mots_types','id_groupe'=>$id_groupe),'data'=>''));
+debut_page("&laquo; $titre &raquo;", "naviguer", "mots");
+
+debut_gauche();
+
+
+
+echo pipeline('affiche_gauche',array('args'=>array('exec'=>'mots_types','id_groupe'=>$id_groupe),'data'=>''));
+creer_colonne_droite();
+echo pipeline('affiche_droite',array('args'=>array('exec'=>'mots_types','id_groupe'=>$id_groupe),'data'=>''));
+debut_droite();
+
+debut_cadre_relief("groupe-mot-24.gif");
+
+
+
+echo "\n<table cellpadding=0 cellspacing=0 border=0 width='100%'>";
+echo "<tr width='100%'>";
+
+	echo "<td  align='right' valign='top'>";
+	icone(_T('icone_retour'), generer_url_ecrire("mots_tous",""), "mot-cle-24.gif", "rien.gif");
+	echo "</td>";
+	echo "<td>". http_img_pack('rien.gif', " ", "width='5'") . "</td>\n";
+
+echo "<td width='100%' valign='top'>";
+echo "<font face='Verdana,Arial,Sans,sans-serif' size=1><b>"._T('titre_groupe_mots')."</b><br></font>";
+gros_titre($titre);
+echo aide("motsgroupes");
+
+if ($connect_statut =="0minirezo"){
+	$type=entites_html(rawurldecode($type));
+	echo "<p><font face='Verdana,Arial,Sans,sans-serif'>";
+	echo generer_url_post_ecrire("mots_tous", "id_groupe=$id_groupe");
+	echo "<input type='hidden' name='modifier_groupe' value='oui' />\n";
+	echo "<input type='hidden' name='new' value='$new' />\n";
+	debut_cadre_formulaire();
+	echo "<b>"._T('info_changer_nom_groupe')."</b><br />\n";
+	echo "<INPUT TYPE='Text' SIZE=40 CLASS='formo' NAME='change_type' VALUE=\"$type\" $onfocus />\n";
+
+	if ($options == 'avancees' OR $descriptif) {
+		echo "<B>"._T('texte_descriptif_rapide')."</B><BR>";
+		echo "<TEXTAREA NAME='descriptif' CLASS='forml' ROWS='4' COLS='40' wrap=soft>";
+		echo entites_html($descriptif);
+		echo "</TEXTAREA><P>\n";
+	}
+	else
+		echo "<INPUT TYPE='hidden' NAME='descriptif' VALUE=\"$descriptif\">";
+
+	if ($options == 'avancees' OR $texte) {
+		echo "<B>"._T('info_texte_explicatif')."</B><BR>";
+		echo "<TEXTAREA NAME='texte' ROWS='8' CLASS='forml' COLS='40' wrap=soft>";
+		echo entites_html($texte);
+		echo "</TEXTAREA><P>\n";
+	}
+	else
+		echo "<INPUT TYPE='hidden' NAME='texte' VALUE=\"$texte\">";
+
+
+	echo "<p><div align='right'><INPUT TYPE='submit' CLASS='fondo' NAME='Valider' VALUE='"._T('bouton_valider')."'></div>";
+	fin_cadre_formulaire();
+}
+
+
+echo "</td></tr></table>";
+
+
+
+fin_cadre_relief();
+
+if ($connect_statut =="0minirezo"){
+	echo "<p>";
+	debut_cadre_formulaire();
+	echo "<div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>";
+		echo "<b>"._T('info_mots_cles_association')."</b>";
+		echo "<ul>";
+		
+		if ($articles == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='articles' value='oui' $checked id='articles'> <label for='articles'>"._T('item_mots_cles_association_articles')."</label><br>";
+		$activer_breves = $GLOBALS['meta']["activer_breves"];
+		if ($activer_breves != "non"){
+			if ($breves == "oui") $checked = "checked";
+			else $checked = "";
+			echo "<input type='checkbox' name='breves' value='oui' $checked id='breves'> <label for='breves'>"._T('item_mots_cles_association_breves')."</label><br>";
+		} else {
+			echo "<input type='hidden' name='breves' value='non'>";
+		}
+		if ($rubriques == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='rubriques' value='oui' $checked id='rubriques'> <label for='rubriques'>"._T('item_mots_cles_association_rubriques')."</label><br>";
+		if ($syndic == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='syndic' value='oui' $checked id='syndic'> <label for='syndic'>"._T('item_mots_cles_association_sites')."</label>";
+		
+		if (isset($tables_principales['spip_evenements'])){
+			echo "<br>";
+			if ($evenements == "oui") $checked = "checked";
+			else $checked = "";
+			echo "<input type='checkbox' name='evenements' value='oui' $checked id='evenements'> <label for='evenements'>"._T('agenda:item_mots_cles_association_evenements')."</label>";
+		}
+		if (isset($tables_principales['spip_pim_agenda'])){
+			echo "<br>";
+			if ($pim_agenda == "oui") $checked = "checked";
+			else $checked = "";
+			echo "<input type='checkbox' name='pim_agenda' value='oui' $checked id='pim_agenda'> <label for='pim_agenda'>"._T('pimagenda:item_mots_cles_association_evenements')."</label>";
+		}
+	
+		echo "</ul>";
+	echo "</div>";
+
+
+	$config_precise_groupes = $GLOBALS['meta']["config_precise_groupes"];
+	if ($config_precise_groupes == "oui" OR $unseul == "oui" OR $obligatoire == "oui"){
+		echo "<p><div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>";
+
+		if ($unseul == "oui")
+			$checked = "checked";
+		else
+			$checked = "";
+		echo "<input type='checkbox' name='unseul' value='oui' $checked id='unseul'> <label for='unseul'>"._T('info_selection_un_seul_mot_cle')."</label>";
+		echo "<br>";
+
+		if ($obligatoire == "oui")
+			$checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='obligatoire' value='oui' $checked id='obligatoire'> <label for='obligatoire'>"._T('avis_conseil_selection_mot_cle')."</label>";
+
+		echo "</div>";
+	} else {
+		echo "<input type='hidden' name='unseul' value='non'>";
+		echo "<input type='hidden' name='obligatoire' value='non'>";
+	}
+
+
+	
+	echo "<p>";
+	echo "<div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>";
+		echo "<b>"._T('info_qui_attribue_mot_cle')."</b>";
+		echo "<ul>";
+		
+		if ($acces_minirezo == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='acces_minirezo' value='oui' $checked id='administrateurs'> <label for='administrateurs'>"._T('bouton_checkbox_qui_attribue_mot_cle_administrateurs')."</label><br>";
+		if ($acces_comite == "oui") $checked = "checked";
+		else $checked = "";
+		echo "<input type='checkbox' name='acces_comite' value='oui' $checked id='comite'> <label for='comite'>"._T('bouton_checkbox_qui_attribue_mot_cle_redacteurs')."</label><br>";
+	
+		$mots_cles_forums = $GLOBALS['meta']["mots_cles_forums"];
+		$forums_publics=$GLOBALS['meta']["forums_publics"];
+		
+		if (($mots_cles_forums == "oui" OR $acces_forum == "oui") AND $forums_publics != "non"){
+			if ($acces_forum == "oui") $checked = "checked";
+			else $checked = "";
+			echo "<input type='checkbox' name='acces_forum' value='oui' $checked id='forum'> <label for='forum'>"._T('bouton_checkbox_qui_attribue_mot_cle_visiteurs')."</label>";
+		} 
+		else {
+			echo "<input type='hidden' name='acces_forum' value='non'>";
+		}
+			
+		echo "</ul>";
+	echo "</div>";
+	
+	
+	
+
+	echo "<p><div align='right'><INPUT TYPE='submit' CLASS='fondo' NAME='Valider' VALUE='"._T('bouton_valider')."'></div>";
+	echo "</FORM><P>";
+	fin_cadre_formulaire();	
+	echo "</font>";
+
+
+}else{
+
+	echo "<H3>"._T('avis_non_acces_page')."</H3>";
+
+}
+
+
+fin_page();
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/formulaires/calendrier_mini.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/formulaires/calendrier_mini.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/formulaires/calendrier_mini.html	(revision 30)
@@ -0,0 +1,35 @@
+<div id="calendar">
+	<h2><BOUCLE_titre(ARTICLES){id_article}>#TITRE</BOUCLE_titre><:icone_calendrier:><//B_titre></h2>
+	<table summary="<:icone_calendrier:>">
+		<caption>[
+			<a
+				href="(#ENV{self}|parametre_url{#ENV{var_date},[(#ENV{date}|Agenda_moisdecal{-1,'Y-m'})]})"
+				title="[(#ENV{date}|Agenda_moisdecal{-1,'Y-m'}|affdate_mois_annee)]">&#171;</a>][
+			(#ENV{date}|affdate_mois_annee)][
+			<a
+				href="(#ENV{self}|parametre_url{#ENV{var_date},[(#ENV{date}|Agenda_moisdecal{1,'Y-m'})]})"
+				title="[(#ENV{date}|Agenda_moisdecal{1,'Y-m'}|affdate_mois_annee)]">&#187;</a>]
+		</caption>
+		<thead>
+			<tr>
+				<th scope="col"><abbr title="<:date_jour_2:>"><:date_jour_2|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_3:>"><:date_jour_3|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_4:>"><:date_jour_4|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_5:>"><:date_jour_5|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_6:>"><:date_jour_6|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_7:>"><:date_jour_7|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_1:>"><:date_jour_1|spip_substr{0,1}|strtoupper:></abbr></th>
+			</tr>
+		</thead>
+		<tbody><BOUCLE_calendrier(EVENEMENTS)
+			{id_article}{id_mot?}
+			{agenda date_debut, mois, (#ENV{date}|annee), (#ENV{date}|mois)}>[
+			(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,[(#TITRE|addslashes)],
+				#DESCRIPTIF,#LIEU,
+				[(#ENV{self}|parametre_url{#ENV{var_date},[(#DATE_DEBUT|affdate{'Y-m-d'})]})]})
+			]</BOUCLE_calendrier>[
+			(#ENV{date}|agenda_mini)
+			]</tbody>
+	</table>
+	<span>&nbsp;</span>
+</div>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/formulaires/formulaire_edition_evenement.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/formulaires/formulaire_edition_evenement.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/formulaires/formulaire_edition_evenement.html	(revision 30)
@@ -0,0 +1,115 @@
+<a name='evenement#ID_EVENEMENT'></a>
+<form method='post' action='#ENV{self}#evenement#ID_EVENEMENT'>
+	<div>
+	[(#ENV{self}|form_hidden)]
+	[<input type='hidden' name='id_evenemnt' value='(#ENV{id_evenemnt})' />]
+	<input type='hidden' name='#ENV{evenement_action}' value='1' />
+	
+	</div>
+<fieldset class='agenda-visu-evenement' id='agenda-visu-evenement'>
+<div class='agenda-visu-evenement-bouton-fermer'>
+<a href='[(#ENV{self}|parametre_url{id_evenement,''})]'
+onclick="$('#agenda-visu-evenement').hide();
+$('#afficher_horaire_debut_evenement').hide();
+$('#afficher_horaire_fin_evenement').hide();
+cal_repetitions.hide();
+return false;"><img src='#CHEMIN{img_pack/croix.png}' width='12' height='12' style='border:none;'></a>
+</div>
+<legend>[(#ENV{id_evenement}|?{<:agenda:titre_cadre_modifier_evenement:>,<:agenda:titre_cadre_ajouter_evenement:>})]</legend>
+
+[(#REM) TITRE]
+<span class='titre-titre'>
+	<label for="evenement_titre"><:agenda:evenement_titre:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_titre}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_titre}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='titre-visu'>
+	<input type='text' name='evenement_titre' id='evenement_titre' value="[(#ENV**{valeurs}|table_valeur{evenement_titre,''}|entites_html)]" 
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_titre}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|=={oui}|?{forml,formo})]'" />
+</span>
+[(#REM) LIEU]
+<span class='lieu-titre'>
+	<label for="evenement_lieu"><:agenda:evenement_lieu:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_lieu}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_lieu}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='lieu-visu'>
+	<input type='text' name='evenement_lieu' id='evenement_lieu' value="[(#ENV**{valeurs}|table_valeur{evenement_lieu,''}|entites_html)]" 
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_lieu}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|=={oui}|?{forml,formo})]'" />
+</span>
+
+[(#REM) HORAIRE]
+<span class='horaire-titre'>
+	<label for="evenement_lieu"><:agenda:evenement_horaire:></label>
+	<input type='checkbox' name='evenement_horaire' id='evenement_horaire' value='oui' [(#ENV**{valeurs}|table_valeur{evenement_horaire,''}|=={oui}|?{' ',''})checked='checked']
+		onClick="if ($('#evenement_horaire')[0].checked==true) { $('#afficher_horaire_debut_evenement').show();
+$('#afficher_horaire_fin_evenement').show();} else{$('#afficher_horaire_debut_evenement').hide();$('#afficher_horaire_fin_evenement').hide();}" />
+</span>
+
+[(#REM) DATES]
+<span class='date-titre'><:agenda:evenement_date:></span>
+<span class='date-visu'>
+<:agenda:evenement_date_de:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_debut}|WCalendar_controller{'_evenement_debut'})]
+<span class='agenda_visible_au_chargement' id='afficher_horaire_debut_evenement'>
+<:agenda:evenement_date_a_immediat:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_debut}|Agenda_heure_selector{'_debut'})]
+</span>
+<br/>
+<:agenda:evenement_date_au:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_fin}|WCalendar_controller{'_evenement_fin'})]
+<span class='agenda_visible_au_chargement' id='afficher_horaire_fin_evenement'>
+<:agenda:evenement_date_a_immediat:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_fin}|Agenda_heure_selector{'_fin'})]
+</span>
+</span>
+
+[(#REM) DESCRIPTIF]
+<span class='descriptif-titre'>
+	<label for="evenement_descriptif"><:agenda:evenement_descriptif:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_descriptif}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='descriptif-visu'>
+	<textarea name='evenement_descriptif' id='evenement_descriptif'  
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_descriptif}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|=={oui}|?{forml,formo})]'" 
+		rows='3' >[(#ENV**{valeurs}|table_valeur{evenement_descriptif,''}|entites_html)]</textarea>
+</span>
+
+[(#REM) MOTS CLES : chaque groupe de mot cle attribuable a un evenement agenda
+	donne un select ]
+<span class='agenda_mots_cles'>
+<BOUCLE_groupes(GROUPES_MOTS){evenements='oui'}>
+	<select name='evenement_groupe_mot_select_#ID_GROUPE[]' class='fondl verdana1 agenda_mot_cle_select'[
+	(#UNSEUL|=={'oui'}|?{'',' '}) multiple='multiple' size='4']>
+	[<option value='x' style='font-variant: small-caps;' [
+	(#UNSEUL|=={'oui'}|?{'',' '}) disabled='disabled']>(#TITRE|supprimer_numero)</option>]
+	<BOUCLE_mots(MOTS){id_groupe}>
+		<option value='#ID_MOT'
+		[(#ID_MOT|in_any{[(#ENV**{valeurs}|table_valeur{mots})],''})selected='selected']>#TITRE</option>
+	</BOUCLE_mots>
+	</select>
+</BOUCLE_groupes>
+</span>
+<script type='text/javascript' src='#CHEMIN{img_pack/multiselect.js}'></script>
+<span class='repetitions-calendrier' id='repetitions-calendrier'>
+[(#ENV**{valeurs}|table_valeur{repetitions}|WCalendar_statique_controller{'_repetitions'})]
+</span>
+
+<div class='edition-bouton' style='text-align:#LANG_RIGHT'>
+[(#ENV{evenement_action}|=={'evenement_modif'}|?{' ',''})
+<div style='float:#LANG_LEFT'>
+<input type='submit' name='supp_evenement' value='<:agenda:bouton_supprimer:>' class="fondl" />
+</div>
+]
+<input type='submit' name='cancel' value='<:agenda:bouton_annuler:>' class="fondl" />
+<input type='submit' name='ajouter' value='[(#ENV{evenement_action}|=={'evenement_modif'}|?{<:bouton_enregistrer:>,<:bouton_ajouter:>})]' class='fondo spip_boutons' onclick='javascript:getSelectedDate_repetitions()'>
+</div>
+</fieldset>
+</form>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/ical-agenda.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/ical-agenda.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/ical-agenda.html	(revision 30)
@@ -0,0 +1,20 @@
+#HTTP_HEADER{content-type:text/calendar}
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+X-WR-CALNAME;VALUE=TEXT:<BOUCLE_article (ARTICLES) {id_article}>[(#TITRE|filtrer_ical)] </BOUCLE_article>[[(#NOM_SITE_SPIP|filtrer_ical)]]
+X-WR-RELCALID:#URL_SITE_SPIP
+
+<BOUCLE_evemnt (EVENEMENTS) {id_article ?}>
+BEGIN:VEVENT
+SUMMARY:[(#TITRE|filtrer_ical)]
+UID:evenement#ID_EVENEMENT @ #URL_SITE_SPIP
+DTSTAMP:[(#DATE_DEBUT|date_ical)]
+DTSTART:[(#DATE_DEBUT|date_ical)]
+DTEND:[(#DATE_FIN|date_ical)]
+<B_article2>CATEGORIES:<BOUCLE_article2 (ARTICLES) {id_article=#ID_ARTICLE}>[(#TITRE|filtrer_ical)]</BOUCLE_article2>
+DESCRIPTION:[(#DESCRIPTIF|filtrer_ical)]\n[<:lieu:>(#LIEU|filtrer_ical)]
+STATUS:CONFIRMED
+END:VEVENT
+</BOUCLE_evemnt>
+
+END:VCALENDAR
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/agenda.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/agenda.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/agenda.css	(revision 30)
@@ -0,0 +1,262 @@
+.agenda_invisible_au_chargement {
+	visibility: hidden;
+}
+.agenda_visible_au_chargement {
+	visibility: visible;
+}
+#container_debut,#container_fin{
+	left:0px;
+	top:0px;
+	z-index:150;
+	filter:alpha(opacity=100);
+	opacity: 1.0;
+	-moz-opacity:1.0;
+}
+
+.agenda-calendrier {
+	width: 100%;
+	height: 60%;
+	font-weight: bold;
+	background-color: none;
+  }
+
+.agenda-visu-evenement {
+	position: absolute;
+	right :0px;
+	top :100px;
+	width: 400px;
+	height: 47em;
+	border-bottom: 1px solid #cccccc;
+	font-weight: bold;
+	z-index:100;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-family: Verdana, Arial, Sans, sans-serif;
+	font-size:small;
+  background-color: #F0FFC2;
+	filter:alpha(opacity=80);
+	opacity: 0.8;
+	-moz-opacity:0.8;
+	text-align:left;
+ }
+.agenda-visu-evenement-bouton-fermer{
+	position: absolute;
+	right:1em;
+	top:0px;
+	width:12px;
+	height:12px;
+}
+.agenda-visu-evenement-bouton-fermer a:hover{
+	border-color:#cccccc;
+	border-top:1px solid #cccccc;
+	border-left:1px solid #cccccc;
+	border-bottom:2px solid #cccccc;
+	border-right:2px solid #cccccc;
+}
+
+.article-evenement {
+	position: absolute;
+	top :0;
+	left :0px;
+	width : 100%;
+	height : 4em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-topright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-topright: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+
+.titre-titre {
+	position: absolute;
+	top :4em;
+	left :0px;
+	width : 20%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.titre-visu {
+	position: absolute;
+	top :4em;
+	left :20%;
+	width : 80%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+
+.lieu-titre {
+	position: absolute;
+	top :5.5em;
+	left :0px;
+	width : 20%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.lieu-visu {
+	position: absolute;
+	top :5.5em;
+	left :20%;
+	width : 80%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-bottomright: 8px;
+	border-radius-bottomright: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.horaire-titre {
+	position: absolute;
+	top :7.1em;
+	left :20%;
+	width : 80%;
+	height : 2em;
+	border-top: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-topright: 8px;
+	border-radius-topright: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.date-titre {
+	position: absolute;
+	top :7.1em;
+	left :0px;
+	width : 20%;
+	height : 2em;
+	border-top: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	-moz-border-radius-topleft: 8px;
+	border-radius-topleft: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.date-visu {
+	position: absolute;
+	top :9em;
+	left :0%;
+	width : 100%;
+	height : 5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-bottomright: 8px;
+	border-radius-bottomright: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.descriptif-titre {
+	visibility: hidden;
+ }
+.descriptif-visu {
+	position: absolute;
+	top :14em;
+	left :0px;
+	width : 100%;
+	height: 6em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.agenda_mot_cle_select{
+width:49%;
+}
+.agenda_mots_cles{
+	position: absolute;
+	left:0px;
+	top:20em;
+	height:8em;
+	width:100%;
+	font-weight: bold;
+	background-color: #ccff99;
+}
+.repetitions-calendrier{
+	position: absolute;
+	left:0px;
+	top:28em;
+	height:17em;
+	width:100%;
+}
+.edition-bouton {
+	position: absolute;
+	bottom :0em;
+	left :0%;
+	width : 98%;
+	height:2em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	text-align : right;
+	vertical-align : bottom;
+	padding-right:2%;
+	-moz-border-radius-topright: 8px;
+	-moz-border-radius-bottomright: 8px;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #99cc33;
+ }
+a span.survol {
+	display: none;
+}
+
+a:hover .calendrier-verdana10 > span.survol {
+	display: block;
+	position: fixed;
+	top: auto;
+	left: auto;
+	width: auto;
+	padding: 5px;
+	z-index: 100;
+	text-decoration: none;
+  color: #333;
+	background: #ccff99;
+	border: solid 1px #99cc33;
+	font: 10px Verdana, sans-serif;
+	text-align: left;
+	-moz-border-radius-topright: 8px;
+	-moz-border-radius-bottomright: 8px;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	filter:alpha(opacity=80);
+	opacity: 0.8;
+	-moz-opacity:0.8;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/agenda_articles.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/agenda_articles.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/agenda_articles.css	(revision 30)
@@ -0,0 +1,84 @@
+.agenda_invisible_au_chargement {
+	visibility: hidden;
+}
+.agenda_visible_au_chargement {
+	visibility: visible;
+}
+.agenda-visu-evenement-bouton-fermer{
+display:none;
+}
+#container_debut{
+left:0px;
+top:0px;
+z-index:120;
+}
+#container_fin{
+left:0px;
+top:0px;
+z-index:120;
+}
+.agenda_mot_cle_select{
+float:left;
+width:32%;
+margin-right:0.5em;
+}
+.titre-titre {
+float:left;
+	width : 13%;
+	height : 2em;
+	font-weight: bold;
+ }
+.titre-visu {
+float:left;
+	width : 85%;
+	height : 2em;
+	font-weight: bold;
+ }
+.lieu-titre {
+float:left;
+	width : 13%;
+	height : 2em;
+	font-weight: bold;
+ }
+.lieu-visu {
+float:left;
+	width : 85%;
+	height : 2em;
+	font-weight: bold;
+}
+.horaire-titre {
+float:right;
+	width : 40%;
+	height : 2em;
+	font-weight: bold;
+ }
+.date-titre {
+float:left;
+	width : 58%;
+	height : 2em;
+	font-weight: bold;
+ }
+.date-visu {
+float:left;
+	width : 98%;
+	height : 5em;
+	font-weight: bold;
+}
+.descriptif-titre {
+float:left;
+	left :0px;
+	width : 98%;
+	height : 2em;
+	font-weight: bold;
+ }
+.descriptif-visu {
+float:left;
+	left :0%;
+	width : 98%;
+	height : 6em;
+	font-weight: bold;
+}
+.edition-bouton{
+float:right;
+margin-top:0.5em;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/calendrier.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/calendrier.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/calendrier.css	(revision 30)
@@ -0,0 +1,511 @@
+/*
+ * Styles du calendrier
+ */
+
+.calendrier-arial9 {
+	font-family: Arial, Sans, sans-serif; font-size: 9px;
+}
+
+.calendrier-arial10 {
+	font-family: Arial, Sans, sans-serif; font-size: 10px;
+}
+
+.calendrier-arial11 {
+	font-family: Arial, Sans, sans-serif; font-size: 11px;
+}
+
+.calendrier-verdana10 {
+	font-family: Verdana, Arial, Sans, sans-serif; font-size: 10px;
+}
+
+.calendrier-helvetica16 {
+	font-family: arial,helvetica,sans-serif;
+	font-size: 16px;
+	color: black;
+}
+
+div.navigation-calendrier {
+	color: white;
+	background-color: #99cc33;
+	font-family: verdana, arial, sans,sans-serif;
+	font-weight: bold;
+	font-size: 14px;
+}
+
+div.navigation-calendrier img {
+	border: 0px;
+	vertical-align: middle;
+	margin: 1px;
+}
+
+a.calendrier-annee {
+	background-color: #aaaaaa;
+	padding: 3px;
+	margin: 1px;
+	font-family: verdana, arial, sans,sans-serif;
+	font-size: 10px;
+	font-weight: bold;
+	color: white;
+	-moz-border-radius: 5px;
+}
+
+a.calendrier-annee:hover {
+	color: black;
+	background-color: white;
+}
+
+.calendrier-table-large {
+	border: 0px;
+	width: 900px;
+ }
+
+.calendrier-table-etroit {
+	border: 0px;
+	width: 750px;
+ }
+
+.calendrier-td-centre {
+	width: 550px;
+	padding-left: 25px;
+	padding-right: 25px;
+  	vertical-align: top;
+ }
+
+.calendrier-td {
+	width: 14%;
+  	vertical-align: top;
+ }
+
+.calendrier-th {
+	width: 14%;
+	padding: 5px;
+	text-align: center;
+  	vertical-align: center;
+	font-size: 10px;
+	font-weight: bold;
+	font-family: Verdana, Arial, Sans, sans-serif;
+ }
+
+.calendrier-th a {
+  color: black;
+}
+
+.calendrier-table-etroit  .calendrier-td-gauche {
+	width: 0px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-large  .calendrier-td-gauche {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-etroit  .calendrier-td-droit {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-large  .calendrier-td-droit {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-jour {
+	position: relative;
+	color: #999999;
+	background-color: white;
+	border: 1px solid #aaaaaa;
+}
+
+.calendrier-agenda {
+	margin-left: 1px;
+	margin-top: 1px;
+	padding: 1px;
+	text-align: center;
+	background-color: white;
+	-moz-border-radius: 5px;
+ }
+
+.calendrier-demiagenda {
+	margin-left: 0px;
+	margin-top: 0px;
+	padding: 0px;
+	text-align: center;
+	background-color: white;
+	-moz-border-radius: 5px;
+ }
+
+
+.calendrier-tripleagenda {
+	vertical-align: top;
+	width: 33%;
+ }
+
+.calendrier-cadreagenda {
+	visibility: hidden;
+	width: 100%;
+	position: absolute;
+	padding-top: 5px;
+	padding-bottom: 5px;
+	border: 0px;
+	background-color: #ccff99;
+	-moz-border-radius-bottomleft: 8px;
+	-moz-border-radius-bottomright: 8px;
+ }
+
+.calendrier-titre {
+	padding: 5px;
+	text-align: center;
+	font-weight: bold;
+ }
+
+.calendrier-evenement {
+	padding: 2px;
+	margin-top: 2px;
+ }
+
+.calendrier-heurepile {
+	position: absolute;
+	margin-left: 2px;
+	margin-right: 2px;
+	border-top: 1px solid #cccccc;
+	font-weight: bold;
+	width: 100%;
+ }
+
+.calendrier-heurepile a {
+	color : #777777;
+	font-weight: bold;
+ }
+
+.calendrier-heurepile a:hover {
+	position: absolute;
+	border-bottom: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff99;
+	width: 100%;
+ }
+
+.calendrier-heureface {
+	position: absolute;
+	margin-left: 2px;
+	margin-right: 2px;
+	border-top: 1px solid #cccccc;
+ }
+
+.calendrier-mozleft {
+	-moz-border-radius-topleft: 10px;
+	-moz-border-radius-bottomleft: 10px;
+ }
+
+.calendrier-mozright {
+	-moz-border-radius-topright: 10px;
+	-moz-border-radius-bottomright: 10px;
+ }
+
+.calendrier-moztop8 {
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-topright: 8px;
+}
+
+.calendrier-mozbottom8 {
+	-moz-border-radius-bottomleft: 8px;
+	-moz-border-radius-bottomright: 8px;
+}
+
+.calendrier-moztop6 {
+	-moz-border-radius-topleft: 6px;
+	-moz-border-radius-topright: 6px;
+}
+
+.calendrier-mozbottom6 {
+	-moz-border-radius-bottomleft: 6px;
+	-moz-border-radius-bottomright: 6px;
+}
+
+.calendrier-opacity {
+	-moz-opacity: 0.3;
+	filter: alpha(opacity=30);
+}
+
+
+.calendrier-png {
+	width: 12px;
+	height: 12px;
+	behavior: url(win_png.htc);
+}
+
+.calendrier-icone {
+	width: 14px;
+	height: 7px;
+	border: 0px;
+}
+
+.calendrier-noir  { 		/*  style anar */
+	color: black;
+}
+
+.calendrier-nb  { 		/*  style cinemat(yp)ographe */
+	background-color: white;
+	border: 1px solid black;
+	color: black;
+}
+
+.calendrier-couleur1 { 		/* Fushia */
+		background-color: #FDE5F2;
+		border: 1px solid #CD006F;
+		color: #CD006F;
+}
+.calendrier-couleur1i { 		/* Fushia */
+		background-color: #CD006F;
+		border: 1px solid #FDE5F2;
+		color: #FDE5F2
+}
+.calendrier-couleur2 { 		/* Bleu */
+		background-color: #EDF3FE;
+		border: 1px solid #5da7c5;
+		color: #5da7c5;
+}
+.calendrier-couleur2i { 		/* Bleu */
+		background-color: #5da7c5;
+		border: 1px solid #EDF3FE;
+		color: #EDF3FE
+}
+.calendrier-couleur3 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.calendrier-couleur3i { 		/* Bleu pastel */
+		background-color: #766CF6;
+		border: 1px solid #EBE9FF;
+		color: #EBE9FF
+}
+.calendrier-couleur4 { 		/* Orange */
+		background-color: #ffeecc;
+		border: 1px solid #fa9a00;
+		color: #fa9a00;
+}
+.calendrier-couleur4i { 		/* Orange */
+		background-color: #fa9a00;
+		border: 1px solid #ffeecc;
+		color: #ffeecc
+}
+.calendrier-couleur5 { 		/* Rouge (Vermillon) */
+		background-color: #FFEDED;
+		border: 1px solid #FF0000;
+		color: #FF0000;
+}
+.calendrier-couleur5i { 		/* Rouge (Vermillon) */
+		background-color: #FF0000;
+		border: 1px solid #FFEDED;
+		color: #FFEDED
+}
+.calendrier-couleur6 { 		/* Orange */
+		background-color: #FFF2EB;
+		border: 1px solid #E95503;
+		color: #E95503;
+}
+.calendrier-couleur6i { 		/* Orange */
+		background-color: #E95503;
+		border: 1px solid #FFF2EB;
+		color: #FFF2EB
+}
+.calendrier-couleur7 { 		/* Jaune */
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+}
+.calendrier-couleur7i { 		/* Jaune */
+		background-color: #ccaa00;
+		border: 1px solid #ffffee;
+		color: #ffffee
+}
+.calendrier-couleur8 { 		/* Vert pastel */
+		background-color: #E2FDEC;
+		border: 1px solid #009F3C;
+		color: #009F3C;
+}
+.calendrier-couleur8i { 		/* Vert pastel */
+		background-color: #009F3C;
+		border: 1px solid #E2FDEC;
+		color: #E2FDEC
+}
+.calendrier-couleur9 { 		/* Vert */
+		background-color: #e5fd63;
+		border: 1px solid #9DBA00;
+		color: #9DBA00;
+}
+.calendrier-couleur9i { 		/* Vert */
+		background-color: #9DBA00;
+		border: 1px solid #e5fd63;
+		color: #e5fd63
+}
+.calendrier-couleur10 { 		/* Rouge (Bordeaux) */
+		background-color: #FFE0E0;
+		border: 1px solid #640707;
+		color: #640707;
+}
+.calendrier-couleur10i { 		/* Rouge (Bordeaux) */
+		background-color: #640707;
+		border: 1px solid #FFE0E0;
+		color: #FFE0E0
+}
+.calendrier-couleur11 { 		/* Gris */
+		background-color: #F2F2F2;
+		border: 1px solid #3F3F3F;
+		color: #3F3F3F;
+}
+.calendrier-couleur11i { 		/* Gris */
+		background-color: #3F3F3F;
+		border: 1px solid #F2F2F2;
+		color: #F2F2F2
+}
+.calendrier-couleur12 {
+		background-color: #aaaaaa;
+		border: 1px solid black;
+		color:black;
+
+}
+.calendrier-couleur12i {
+		background-color: black;
+		border: 1px solid #aaaaaa;
+		color: #aaaaaa}
+.calendrier-couleur13 { /* Caca d'oie */
+		background-color: #FFFFE0;
+		border: 1px solid #666500;
+		color: #666500; 
+}
+.calendrier-couleur13i { 		/* Caca d'oie */
+		background-color: #666500;
+		border: 1px solid #FFFFE0;
+		color: #FFFFE0
+}
+.calendrier-couleur14 { 		/* Marron */
+		background-color: #F5EEE5;
+		border: 1px solid #8C6635;
+		color: #8C6635;
+}
+.calendrier-couleur14i { 		/* Marron */
+		background-color: #8C6635;
+		border: 1px solid #F5EEE5;
+		color: #F5EEE5
+}
+
+.calendrier-creneau,
+.calendrier-creneau-today,
+.calendrier-creneau-sunday {
+	position: absolute;
+	margin-left: 0px;
+	margin-right: 0px;
+	border-top: 0px ;
+	border-right: 0px ;
+	border-bottom: 0px ;
+	border-left: 0px ;
+	font-weight: bold;
+	background-color: #dddddd;
+	color: #dddddd;
+	width: 100%;
+ }
+
+.calendrier-creneau a {
+	color : #dddddd;
+	font-weight: bold;
+}
+.calendrier-creneau a:hover {
+	background-color: #ccff99;
+}
+
+.calendrier-creneau-today {
+	background-color: #eeeeee;
+	color: #eeeeee;
+}
+.calendrier-creneau-today a {
+	color : #eeeeee;
+	font-weight: bold;
+}
+.calendrier-creneau-today a:hover {
+	background-color: #ccff99;
+}
+
+.calendrier-creneau-sunday {
+/*	background-color: #ccff99;
+	color: #ccff99;*/
+}
+
+.calendrier-creneau-sunday a {
+	/*color : #ccff99;*/
+	color : #dddddd;
+	font-weight: bold;
+ }
+
+.calendrier-creneau-sunday a:hover {
+	/*background-color: #dddddd;*/
+	background-color: #ccff99;
+}
+
+.calendrier-plage,.calendrier-plage-selection { 		/* Orange */
+		background-color: #FFF2EB;
+		border: 1px solid #E95503;
+		color: #E95503;
+}
+.calendrier-plage-selection{
+		border: 3px solid #E95503;
+}
+.calendrier-reunions { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+
+.calendrier-evenement,.calendrier-evenement-selection { 		/* Vert pastel */
+		background-color: #eeeeee;
+		border: 0px solid #009F3C;
+}
+.calendrier-evenement-selection{
+}
+
+.calendrier-anniversaire { 		/* Jaune */
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+}
+.calendrier-rappel { 		/* Rouge (Vermillon) */
+		background-color: #FFEDED;
+		border: 1px solid #FF0000;
+		color: #FF0000;
+}
+
+.calendrier-plage-info { 		/* Jaune transparent*/
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+		filter:alpha(opacity=50);
+		opacity: 0.5;
+		-moz-opacity:0.5;
+}
+.activite-couleur15 { 		/* Fushia */
+		background-color: #FDE5F2;
+		border: 1px solid #CD006F;
+		color: #CD006F;
+}
+.activite-couleur9 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.activite-couleur14 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.activite-couleur5 { 		/* Vert pastel */
+		background-color: #E2FDEC;
+		border: 1px solid #009F3C;
+		color: #009F3C;
+}
+.activite-couleur12 { 		/* Orange */
+		background-color: #ffeecc;
+		border: 1px solid #fa9a00;
+		color: #fa9a00;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/multiselect.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/multiselect.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/img_pack/multiselect.js	(revision 30)
@@ -0,0 +1,115 @@
+/*
+	coded by Kae - kae@verens.com
+	I'd appreciate any feedback.
+	You have the right to include this in your sites.
+	Please retain this notice.
+*/
+
+/* edit these variables to customise the multiselect */ {
+	var show_toplinks=false;
+}
+
+/* global variables - do not touch */ {
+	var isIE=window.attachEvent?true:false;
+	var selectDefaults=[];
+}
+function addEvent(el,ev,fn){
+	if(isIE)el.attachEvent('on'+ev,fn);
+	else if(el.addEventListener)el.addEventListener(ev,fn,false);
+}
+function buildMultiselects(){
+	do{
+		found=0;
+		a=document.getElementsByTagName('select');
+		for(b=0;b<a.length,!found;b++){
+			var ms=a[b];
+			if(ms==null)break;
+			var name=ms.name.replace(/\[\]$/, '');
+			if(ms.multiple){
+				/* common variables */ {
+					selectDefaults[name]=[];
+					var found=1,disabled=ms.disabled?1:0,width=ms.offsetWidth,height=ms.offsetHeight;
+					if(width<120)width=120;
+					if(height<60)height=60;
+				}
+				/* set up wrapper */ {
+					var wrapper=document.createElement('div');
+					wrapper.style.width=width+"px";
+					wrapper.style.height=height+"px";
+					wrapper.style.position='relative';
+					wrapper.style.border="2px solid #000";
+					wrapper.style.borderColor="#333 #ccc #ccc #333";
+					wrapper.style.font="10px sans-serif";
+					if(disabled)wrapper.style.background='#ddd';
+				}
+				if(show_toplinks){ /* reset, all, none */
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','checked');"),'all'));
+					wrapper.appendChild(document.createTextNode(', '));
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','');"),'none'));
+					wrapper.appendChild(document.createTextNode(', '));
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','reset');"),'reset'));
+				}
+				/* setup multiselect */ {
+					newmultiselect=document.createElement('div');
+					newmultiselect.style.position='absolute';
+					newmultiselect.style.top=show_toplinks?'15px':'0';
+					newmultiselect.style.left='0';
+					newmultiselect.style.overflow='auto';
+					newmultiselect.style.width=(isIE?width-4:width)+"px";
+					newmultiselect.style.height=show_toplinks?height-(isIE?19:15)+"px":height+'px';
+				}
+				c=ms.getElementsByTagName('option');
+				for(d=0;d<c.length;d++){
+					var label=document.createElement('label');
+					label.style.display="block";
+					label.style.border="1px solid #eee";
+					label.style.borderWidth="1px 0";
+					label.style.font="10px arial";
+					label.style.lineHeight="10px";
+					label.style.paddingLeft="20px";
+					checkbox=document.createElement('input');
+					checkbox.type="checkbox";
+					if(c[d].selected){
+						checkbox.checked="checked";
+						checkbox.defaultChecked=true;
+					}
+					if(c[d].disabled){
+						checkbox.disabled='disabled';
+						label.style.color='#666';
+					}
+					selectDefaults[name][d]=c[d].selected?'checked':'';
+					if(disabled)checkbox.disabled="disabled";
+					checkbox.value=c[d].value;
+					checkbox.style.marginLeft="-16px";
+					checkbox.style.marginTop="-2px";
+					checkbox.name=ms.name;
+
+					// escape the label
+					var text=c[d].innerHTML;
+					text=text.replace(/\&nbsp;?/g, ' ');
+					text=text.replace(/\&lt;?/g, '<');
+					text=text.replace(/\&gt;?/g, '>');
+
+					labelText=document.createTextNode(text);
+					label.appendChild(checkbox);
+					label.appendChild(labelText);
+					newmultiselect.appendChild(label);
+				}
+			wrapper.appendChild(newmultiselect);
+			ms.parentNode.insertBefore(wrapper,ms);
+			ms.parentNode.removeChild(ms);
+			}
+		}
+	}while(found);
+}
+function multiselect_selectall(name,val){
+	var els=document.getElementsByTagName('input'),found=0;
+	for(var i=0;i<els.length;++i){
+		if((els[i].name==name+'[]'||els[i].name==name)&&!els[i].disabled)els[i].checked=val=='reset'?selectDefaults[name][found++]:val;
+	}
+}
+function newLink(href,text){
+	var e=document.createElement('a');e.href=href;e.appendChild(document.createTextNode(text));return e;
+}
+
+addEvent(window,'load',buildMultiselects);
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda.php.sav
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda.php.sav	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda.php.sav	(revision 30)
@@ -0,0 +1,1424 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/minipres'); 
+include_spip('inc/layer');
+include_spip('inc/texte'); // inclut inc_filtre
+include_spip('inc/calendar'); // inclut widget calendar
+
+charger_generer_url();
+
+//  Typographie generale des calendriers de 3 type: jour/semaine/mois(ou plus)
+
+// Notes: pour toutes les fonctions ayant parmi leurs parametres
+// annee, mois, jour, echelle, partie_cal, script, ancre
+// ceux-ci apparaissent TOUJOURS dans cet ordre 
+
+define(DEFAUT_D_ECHELLE,120); # 1 pixel = 2 minutes
+
+// 
+// Utilitaires sans html ni sql
+//
+
+// utilitaire de separation script / ancre
+// et de retrait des arguments a remplacer
+// (a mon avis cette fonction ne sert a rien, puisque parametre_url()
+// sait remplacer les arguments au bon endroit -- Fil)
+// Pas si simple: certains param ne sont pas remplaces 
+// et doivent reprendre leur valeur par defaut -- esj.
+function calendrier_retire_args_ancre($script)
+{
+	$script = str_replace('&amp;', '&', $script);
+  $script = str_replace('?bonjour=oui&?','?',$script);
+  if (ereg('^(.*)(#[^=&]*)$',$script, $m)) {
+	  $script = $m[1];
+	  $ancre = $m[2];
+  } else { $ancre = ''; }
+  if ($script[strlen($script)-1] == '?')  $script = substr($script,0,-1);
+  foreach(array('echelle','jour','mois','annee', 'type', 'partie_cal') as $arg) {
+		$script = preg_replace("/([?&])$arg=[^&]*&/",'\1', $script);
+		$script = preg_replace("/([?&])$arg=[^&]*$/",'\1', $script);
+	}
+  if (ereg('[?&]$', $script)) $script =   substr($script,0,-1);
+  return array(quote_amp($script), $ancre);
+}
+
+// tous les liens de navigations sont issus de cette fonction
+// on peut definir generer_url_date et un htacces pour simplifier les URL
+
+function calendrier_args_date($script, $annee, $mois, $jour, $type, $finurl) {
+	if (function_exists('generer_url_date'))
+		return generer_url_date($script, $annee, $mois, $jour, $type, $finurl);
+
+	$script = parametre_url($script, 'annee', sprintf("%04d", $annee));
+	$script = parametre_url($script, 'mois',  sprintf("%02d", $mois));
+	$script = parametre_url($script, 'jour',  sprintf("%02d", $jour));
+	$script = parametre_url($script, 'type',  $type);
+	return $script . $finurl;
+}
+
+# prend une heure de debut et de fin, ainsi qu'une echelle (seconde/pixel)
+# et retourne un tableau compose
+# - taille d'une heure
+# - taille d'une journee
+# - taille de la fonte
+# - taille de la marge
+
+function calendrier_echelle($debut, $fin, $echelle)
+{
+  if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
+  if ($fin <= $debut) $fin = $debut +1;
+
+  $duree = $fin - $debut;
+  $dimheure = floor((3600 / $echelle));
+  return array($dimheure,
+	       (($duree+2) * $dimheure),
+	       floor (14 / (1+($echelle/240))),
+	       floor(240 / $echelle));
+}
+
+# Calcule le "top" d'une heure
+
+function calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize) {
+	
+	$h_heure = substr($heure, 0, strpos($heure, ":"));
+	$m_heure = substr($heure, strpos($heure,":") + 1, strlen($heure));
+	$heure100 = $h_heure + ($m_heure/60);
+
+	if ($heure100 < $debut) $heure100 = ($heure100 / $debut) + $debut - 1;
+	if ($heure100 > $fin) $heure100 = (($heure100-$fin) / (24 - $fin)) + $fin;
+
+	$top = floor(($heure100 - $debut + 1) * $dimheure);
+
+	return $top;	
+}
+
+# Calcule la hauteur entre deux heures
+function calendrier_height ($heure, $heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) {
+
+	$height = calendrier_top ($heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) 
+				- calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize);
+
+	$padding = floor(($dimheure / 3600) * 240);
+	$height = $height - (2* $padding + 2); // pour padding interieur
+	
+	if ($height < ($dimheure/4)) $height = floor($dimheure/4); // eviter paves totalement ecrases
+	
+	return $height;	
+}
+
+//
+// init: calcul generique des evenements a partir des tables SQL
+//
+
+function http_calendrier_init($time='', $ltype='', $lechelle='', $lpartie_cal='', $script='', $evt='')
+{
+	global $mois, $annee, $jour, $type, $echelle, $partie_cal;
+
+	if (!$time) 
+	  {
+	    if (!$mois)
+	      $time = time();
+	    else
+	      $time = mktime(0,0,0,$mois,$jour,$annee);
+	    $type= 'mois';
+	  }
+
+	$jour = date("d",$time);
+	$mois = date("m",$time);
+	$annee = date("Y",$time);
+	if (!$ltype) $ltype = $type ? $type : 'mois';
+	if (!$lechelle) $lechelle = $echelle;
+	if (!$lpartie_cal) $lpartie_cal = $partie_cal;
+	list($script, $ancre) = 
+	  calendrier_retire_args_ancre($script); 
+	if (!$evt) {
+	  $g = 'sql_calendrier_' . $ltype;
+	  $evt = sql_calendrier_interval($g($annee,$mois, $jour));
+	  sql_calendrier_interval_articles("'$annee-$mois-00'", "'$annee-$mois-1'", $evt[0]);
+	  // si on veut les forums, decommenter
+#	  sql_calendrier_interval_forums($g($annee,$mois,$jour), $evt[0]);
+	}
+	$f = 'http_calendrier_' . $ltype;
+	return $f($annee, $mois, $jour, $lechelle, $lpartie_cal, $script, $ancre, $evt);
+
+}
+
+# affichage d'un calendrier de plusieurs semaines
+# si la periode est inferieure a 31 jours, on considere que c'est un mois
+
+function http_calendrier_mois($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+	$premier_jour = '01';
+	$dernier_jour = '31';
+
+	if (is_array($evt)) {
+	  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+	  if (!$premier_jour) $premier_jour = '01';
+	  if (!$dernier_jour)
+	    {
+	      $dernier_jour = 31;
+	      while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
+	    }
+	  if ($sansduree)
+	    foreach($sansduree as $d => $r) 
+	      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+	  $evt = 
+	    http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre) .
+	    http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre") ;
+	} else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  '</table>' .
+	  http_calendrier_sans_date($annee, $mois, $evenements) .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
+
+// si la periore a plus de 31 jours, c'est du genre trimestre, semestre etc
+// pas de navigation suivant/precedent alors
+
+function http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre){
+	if ($dernier_jour > 31) {
+	  $prec = $suiv = '';
+	  $periode = affdate_mois_annee(date("Y-m-d", mktime(1,1,1,$mois,$premier_jour,$annee))) . ' - '. affdate_mois_annee(date("Y-m-d", mktime(1,1,1,$mois,$dernier_jour,$annee)));
+	} else {
+
+	$mois_suiv=$mois+1;
+	$annee_suiv=$annee;
+	$mois_prec=$mois-1;
+	$annee_prec=$annee;
+	if ($mois==1){
+	  $mois_prec=12;
+	  $annee_prec=$annee-1;
+	}
+	else if ($mois==12){$mois_suiv=1;	$annee_suiv=$annee+1;}
+	$prec = array($annee_prec, $mois_prec, 1, "mois");
+	$suiv = array($annee_suiv, $mois_suiv, 1, "mois");
+	$periode = affdate_mois_annee("$annee-$mois-1");
+	}
+	return
+	  "\n<tr><td colspan='7'>" .
+	  http_calendrier_navigation($annee,
+				   $mois,
+				   $jour,
+				   $echelle,
+				   $partie_cal,
+				   $periode,
+				   $script,
+				   $prec,
+				   $suiv,
+				   'mois',
+				   $ancre) .
+	  "</td></tr>";
+
+}
+
+function http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre){
+	global $couleur_claire;
+
+	$bandeau ="";
+	for ($j=1; $j<8;$j++){
+		$bandeau .= 
+		  "\n\t<th class='calendrier-th'>" .
+		  _T('date_jour_' . (($j%7)+1)) .
+		  "</th>";
+	}
+	return "\n<tr" .
+	  (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . 
+	  ">$bandeau\n</tr>";
+}
+
+# dispose les lignes d'un calendrier de 7 colonnes (les jours)
+# chaque case est garnie avec les evenements du jour figurant dans $evenements
+
+function http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, $ancre='')
+{
+	global $couleur_claire, $spip_lang_left, $spip_lang_right;
+
+	// affichage du debut de semaine hors periode
+	$init = '';
+	$debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
+	for ($i=$debut ? $debut : 7;$i>1;$i--)
+	  {$init .= "\n\t<td style=\"border-bottom: 1px solid $couleur_claire;\">&nbsp;</td>";}
+
+	$total = '';
+	$ligne = '';
+	$today=date("Ymd");
+	for ($j=$premier_jour; $j<=$dernier_jour; $j++){
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour = date("d",$nom);
+		$jour_semaine = date("w",$nom);
+		$mois_en_cours = date("m",$nom);
+		$annee_en_cours = date("Y",$nom);
+		$amj = date("Y",$nom) . $mois_en_cours . $jour;
+		$couleur_texte = "black";
+		$couleur_fond = "";
+
+		if ($jour_semaine == 0) $couleur_fond = $couleur_claire;
+		else if ($jour_semaine==1)
+			  { 
+			    if ($ligne||$init)
+			      $total .= "\n<tr>$init$ligne\n</tr>";
+			    $ligne = $init = '';
+			  }
+		
+		if ($amj == $today) {
+			$couleur_texte = "red";
+			$couleur_fond = "white";
+		}
+		$res = '';
+		if ($evts = $evenements[$amj]) {
+		  foreach ($evts as $evenement)
+		    {
+		      $res .= isset($evenement['DTSTART']) ?
+			http_calendrier_avec_heure($evenement, $amj) :
+			http_calendrier_sans_heure($evenement);
+		    }
+		}
+
+		$ligne .= "\n\t\t<td\tclass='calendrier-td'
+			style='height: 100px; border-bottom: 1px solid $couleur_claire; border-$spip_lang_right: 1px solid $couleur_claire;" .
+		  ($couleur_fond ? " background-color: $couleur_fond;" : "") .
+		  ($ligne ? "" :
+		   " border-$spip_lang_left: 1px solid $couleur_claire;") .
+		  "'>" .
+		  (!_DIR_RESTREINT ? 
+		   (http_href(calendrier_args_date($script,$annee_en_cours, $mois_en_cours, $jour, "jour", $ancre), 
+			      $jour,
+			      $jour, "color: $couleur_texte",'calendrier-helvetica16') . 
+		    http_calendrier_ics_message($annee_en_cours, $mois_en_cours, $jour, false)):
+		   http_calendrier_mois_clics($annee_en_cours, $mois_en_cours, $jour, $script, $ancre)) .
+		  $res .
+		  "\n\t</td>";
+	}
+	return  $total . ($ligne ? "\n<tr>$ligne\n</tr>" : '');
+}
+
+// typo pour l'espace public
+
+function http_calendrier_mois_clics($annee, $mois, $jour, $script, $ancre)
+{
+      $d = mktime(0,0,0,$mois, $jour, $annee);
+      $semaine = date("W", $d);
+      return 
+	"<table width='100%'>\n<tr><td style='text-align: left'>". 
+	http_href(calendrier_args_date($script,$annee, $mois, $jour, "jour", $ancre), 
+		  "$jour/$mois",
+		  _T('date_jour_'. (1+date('w',$d))) .
+		  " $jour " .
+		  _T('date_mois_'.(0+$mois)),
+		  '','calendrier-helvetica16') .
+	"</td><td style='text-align: right'>" .
+	http_href(calendrier_args_date($script,$annee, $mois, $jour, "semaine", $ancre),
+		  $semaine,
+		  _T('date_semaines') . ": $semaine",
+		  '',
+		  'calendrier-helvetica16') .
+	"</td></tr>\n</table>";
+}
+
+# dispose les evenements d'une semaine
+
+function http_calendrier_semaine($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	$init = date("w",mktime(1,1,1,$mois,$jour,$annee));
+	$init = $jour+1-($init ? $init : 7);
+	$sd = '';
+
+	if (is_array($evt))
+	  {
+	  	if($partie_cal!='sansheure'){
+	    $sd = http_calendrier_sans_date($annee, $mois,$evt[0]);
+	    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+	    $evt =
+	      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+	      http_calendrier_semaine_sept($annee, $mois, $init, $echelle, $partie_cal, $evt);
+	  	}
+	  	else {
+			  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+			  if ($sansduree)
+			    foreach($sansduree as $d => $r) 
+			      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+		    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+		    $evt =
+		      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+		      http_calendrier_mois_sept($annee, $mois, $init, $init+ 6, $evenements, $script);
+	  	}
+	  } else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  "</table>" .
+	  $sd .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
+
+function http_calendrier_semaine_navigation($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
+
+	$fin = mktime (1,1,1,$mois, $jour+6, $annee);
+	$fjour = date("d",$fin);
+	$fmois = date("m",$fin);
+	$fannee = date("Y",$fin);
+	$fin = date("Y-m-d", $fin);
+	$debut = mktime (1,1,1,$mois, $jour, $annee);
+	$djour = date("d",$debut)+0;
+	$dmois = date("m",$debut);
+	$dannee = date("Y",$debut);
+	$debut = date("Y-m-d", $debut);
+	$periode = (($dannee != $fannee) ?
+		    (affdate($debut)." - ".affdate($fin)) :
+		    (($dmois == $fmois) ?
+		     ($djour ." - ".affdate_jourcourt($fin)) :
+		     (affdate_jourcourt($debut)." - ".affdate_jourcourt($fin))));
+
+  return
+    "\n<tr><td colspan='7'>" .
+    http_calendrier_navigation($annee,
+			       $mois,
+			       $jour,
+			       $echelle,
+			       $partie_cal, 
+			       $periode,
+			       $script,
+			       array($dannee, $dmois, ($djour-7), "semaine"),
+			       array($fannee, $fmois, ($fjour+1), "semaine"),
+			       'semaine',
+			       $ancre) .
+    "</td></tr>\n";
+}
+
+function http_calendrier_semaine_noms($annee, $mois, $jour, $script, $ancre){
+	global $couleur_claire;
+
+	$bandeau = '';
+
+	for ($j=$jour; $j<$jour+7;$j++){
+		$nom = mktime(0,0,0,$mois,$j,$annee);
+		$num = intval(date("d", $nom)) ;
+		$numois = date("m",$nom);
+		$nomjour = _T('date_jour_'. (1+date('w',$nom)));
+		$clic = ($nomjour . " " . $num . (($num == 1) ? 'er' : '') .
+			 ($ancre  ? ('/' . $numois) : ''));
+		$bandeau .= 
+		  "\n\t<th class='calendrier-th'>" .
+		  http_href(calendrier_args_date($script, date("Y",$nom), $numois, $num, 'jour', $ancre), $clic, $clic) .
+		  "</th>";
+	}
+	return "\n<tr" .
+	  (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . 
+	  ">$bandeau\n</tr>";
+}
+
+function http_calendrier_semaine_sept($annee, $mois, $jour, $echelle, $partie_cal, $evt)
+{
+	global $couleur_claire, $spip_ecran, $spip_lang_left;
+
+	$largeur =  ($spip_ecran == "large") ? 90 : 60;
+
+	$today=date("Ymd");
+	$total = '';
+	$style = "border-$spip_lang_left: 1px solid $couleur_claire; border-bottom: 1px solid $couleur_claire; border-top: 0px; border-right: 0px;";
+	for ($j=$jour; $j<$jour+7;$j++){
+		$v = mktime(0,0,0,$mois, $j, $annee);
+		$total .= "\n<td class='calendrier-td'>" .
+		  http_calendrier_ics($annee,$mois,$j, $echelle, $partie_cal, $largeur, $evt, ($style . ( (date("w",$v)==0 && isset($couleur_claire)) ? 
+			  " background-color: $couleur_claire;" :
+			  ((date("Ymd", $v) == $today) ? 
+			   " background-color: white;" :
+			   " background-color: #eeeeee;")))) .
+		  "\n</td>";
+	}
+	return "\n<tr class='calendrier-verdana10'>$total</tr>";
+}
+
+
+function http_calendrier_jour($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	return 	
+	  "\n<table class='calendrier-table-$spip_ecran'>" .
+	  "\n<tr><td class='calendrier-td-gauche'></td>" .
+	  "<td colspan='5' class='calendrier-td-centre'>" .
+	  http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal,
+				     (nom_jour("$annee-$mois-$jour") . " " .
+				      affdate_jourcourt("$annee-$mois-$jour")),
+				     $script,
+				     array($annee, $mois, ($jour-1), "jour"),
+				     array($annee, $mois, ($jour+1), "jour"),
+				     'jour',
+				     $ancre) .
+	  "</td>" .
+	  "<td class='calendrier-td-droit calendrier-arial10'></td>" .
+	  "</tr>" .
+	  (!is_array($evt) ? ("<tr><td>$evt</td></tr>") :
+	   (http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre) .
+	    http_calendrier_jour_sept($annee, $mois, $jour, $echelle,  $partie_cal, $script, $ancre, $evt))) .
+	  "</table>";
+}
+
+function http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
+
+	global $spip_ecran;
+	$finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+
+	$gauche = (_DIR_RESTREINT  || ($spip_ecran != "large"));
+	return
+	  "\n<tr><td class='calendrier-td-gauche'>" .
+	  ($gauche ? '' :
+	   http_calendrier_ics_titre($annee,$mois,$jour-1,$script, $finurl)) .
+	  "</td><td colspan='5' class='calendrier-td-centre'>" .
+	  (_DIR_RESTREINT ? '' :
+		   ("\n\t<div class='calendrier-titre'>" .
+		    http_calendrier_ics_message($annee, $mois, $jour, true) .
+		    '</div>')) .
+	  "</td><td class='calendrier-td-droit calendrier-arial10'> " .
+	   (_DIR_RESTREINT ? '' : http_calendrier_ics_titre($annee,$mois,$jour+1,$script, $finurl)) .
+	  "</td></tr>";
+}
+
+function http_calendrier_jour_sept($annee, $mois, $jour, $echelle,  $partie_cal, $script, $ancre, $evt){
+	global $spip_ecran;
+
+	$gauche = (_DIR_RESTREINT  || ($spip_ecran != "large"));
+	if ($partie_cal!="sansheure")
+		return
+		  "<tr class='calendrier-verdana10'>" .
+			# afficher en reduction le tableau du jour precedent
+		  "\n<td class='calendrier-td-gauche'>" .
+		  ($gauche  ? '' :
+		   http_calendrier_ics($annee, $mois, $jour-1, $echelle, $partie_cal, 0, $evt)) .
+		  "</td><td colspan='5' class='calendrier-td-centre'>" .
+		   http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, 300, $evt) .
+		  '</td>' .
+			# afficher en reduction le tableau du jour suivant
+		  "\n<td class='calendrier-td-droit'>" .
+	
+		  (_DIR_RESTREINT ? '' :
+		   http_calendrier_ics($annee, $mois, $jour+1, $echelle, $partie_cal, 0, $evt)) .
+		  '</td>' .
+		  "\n</tr>";
+	else {
+	  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+	  if ($sansduree)
+	    foreach($sansduree as $d => $r) 
+	      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+		return
+		  "<tr class='calendrier-verdana10'>" .
+			# afficher en reduction le tableau du jour precedent
+		  "\n<td class='calendrier-td-gauche'>" .
+		  ($gauche  ? '' :
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour-1, $jour-1,$evenements, $script, $ancre)
+		   ."</table>"
+		   ) .
+		  "</td><td colspan='5' class='calendrier-td-centre'>" .
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour, $jour,$evenements, $script, $ancre) .
+		   "</table>" .
+		  '</td>' .
+			# afficher en reduction le tableau du jour suivant
+		  "\n<td class='calendrier-td-droit'>" .
+		  (_DIR_RESTREINT ? '' :
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour+1, $jour+1,$evenements, $script, $ancre)
+		   ."</table>"
+		   ) .
+		  '</td>' .
+		  "\n</tr>";
+		
+	}
+}
+
+
+// Conversion d'un tableau de champ ics en des balises div positionnees    
+// Le champ categories indique la Classe de CSS a prendre
+// $echelle est le nombre de secondes representees par 1 pixel
+
+function http_calendrier_ics($annee, $mois, $jour,$echelle, $partie_cal,  $largeur, $evt, $style='') {
+	global $spip_lang_left;
+
+	// tableau
+	if ($partie_cal == "soir") {
+		$debut = 12;
+		$fin = 23;
+	} else if ($partie_cal == "matin") {
+		$debut = 4;
+		$fin = 15;
+	} else {
+		$debut = 7;
+		$fin =21;
+	}
+	
+	if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
+
+	list($dimheure, $dimjour, $fontsize, $padding) =
+	  calendrier_echelle($debut, $fin, $echelle);
+	$modif_decalage = round($largeur/8);
+
+	$date = date("Ymd", mktime(0,0,0,$mois, $jour, $annee));
+	list($sansheure, $avecheure) = $evt;
+	$avecheure = $avecheure[$date];
+	$sansheure = $sansheure[$date];
+
+	$total = '';
+
+	if ($avecheure)
+    {
+		$tous = 1 + count($avecheure);
+		$i = 0;
+		foreach($avecheure as $evenement){
+
+			$d = $evenement['DTSTART'];
+			$e = $evenement['DTEND'];
+			$d_jour = substr($d,0,8);
+			$e_jour = $e ? substr($e,0,8) : $d_jour;
+			$debut_avant = false;
+			$fin_apres = false;
+			
+			/* disparues sauf erreur
+			 $radius_top = " radius-top";
+			$radius_bottom = " radius-bottom";
+			*/
+			if ($d_jour <= $date AND $e_jour >= $date)
+			{
+
+			$i++;
+
+			// Verifier si debut est jour precedent
+			if (substr($d,0,8) < $date)
+			{
+				$heure_debut = 0; $minutes_debut = 0;
+				$debut_avant = true;
+				$radius_top = "";
+			}
+			else
+			{
+				$heure_debut = substr($d,-6,2);
+				$minutes_debut = substr($d,-4,2);
+			}
+
+			if (!$e)
+			{ 
+				$heure_fin = $heure_debut ;
+				$minutes_fin = $minutes_debut ;
+				$bordure = "border-bottom: dashed 2px";
+			}
+			else
+			{
+				$bordure = "";
+				if (substr($e,0,8) > $date) 
+				{
+					$heure_fin = 23; $minutes_fin = 59;
+					$fin_apres = true;
+					$radius_bottom = "";
+				}
+				else
+				{
+					$heure_fin = substr($e,-6,2);
+					$minutes_fin = substr($e,-4,2);
+				}
+			}
+			
+			if ($debut_avant && $fin_apres)  $opacity = "-moz-opacity: 0.6; filter: alpha(opacity=60);";
+			else $opacity = "";
+						
+			$haut = calendrier_top ("$heure_debut:$minutes_debut", $debut, $fin, $dimheure, $dimjour, $fontsize);
+			$bas =  !$e ? $haut :calendrier_top ("$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize);
+			$hauteur = calendrier_height ("$heure_debut:$minutes_debut", "$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize);
+
+			if ($bas_prec >= $haut) $decale += $modif_decalage;
+			else $decale = (4 * $fontsize);
+			if ($bas > $bas_prec) $bas_prec = $bas;
+			
+			$url = $evenement['URL']; 
+			$desc = propre($evenement['DESCRIPTION']);
+			$perso = substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@'));
+			$lieu = $evenement['LOCATION'];
+			$sum = ereg_replace(' +','&nbsp;', typo($evenement['SUMMARY']));
+			if (!$sum) { $sum = $desc; $desc = '';}
+			if (!$sum) { $sum = $lieu; $lieu = '';}
+			if (!$sum) { $sum = $perso; $perso = '';}
+			if ($sum)
+			  $sum = "<span class='calendrier-verdana10'><span  style='font-weight: bold;'>$sum</span>$lieu $perso</span>";
+			if (($largeur > 90) && $desc)
+			  $sum .=  "\n<br /><span class='calendrier-noir'>$desc</span>";
+			$colors = $evenement['CATEGORIES'];
+		  $sum = ((!$url) ? $sum : http_href(quote_amp($url), $sum, $desc,"border: 0px",$colors));
+			$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'ics'),'data'=>$sum));
+
+			$total .= "\n<div class='calendrier-arial10 $colors' 
+	style='cursor: auto; position: absolute; overflow: hidden;$opacity z-index: " .
+				$i .
+				"; $spip_lang_left: " .
+				$decale .
+				"px; top: " .
+				$haut .
+				"px; height: " .
+				$hauteur .
+				"px; width: ".
+				($largeur - 2 * ($padding+1)) .
+				"px; font-size: ".
+				floor($fontsize * 1.3) .
+				"px; padding: " .
+				$padding . 
+				"px; $bordure'
+	onmouseover=\"this.style.zIndex=" . $tous . "\"
+	onmouseout=\"this.style.zIndex=" . $i . "\">" .
+			  $sum . 
+				"</div>";
+			}
+		}
+    }
+	return
+	   "\n<div class='calendrier-jour' style='height: ${dimjour}px; font-size: ${fontsize}px;$style'>\n" .
+	  http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize) .
+	  $total .
+	  "\n</div>" .
+	  (!$sansheure ? "" :
+	   http_calendrier_ics_trois($sansheure, $largeur, $dimjour, $fontsize, '')) ;
+
+}
+
+# Affiche une grille horaire 
+# Selon l'echelle demandee, on affiche heure, 1/2 heure 1/4 heure, 5minutes.
+
+function http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize)
+{
+	global $spip_lang_left, $spip_lang_right;
+	$slice = floor($dimheure/(2*$fontsize));
+	if ($slice%2) $slice --;
+	if (!$slice) $slice = 1;
+
+	$total = '';
+	for ($i = $debut; $i < $fin; $i++) {
+		for ($j=0; $j < $slice; $j++) 
+		{
+			$total .= "\n<div class='calendrier-heure" .
+				($j  ? "face" : "pile") .
+				"' style='$spip_lang_left: 0px; top: ".
+				calendrier_top ("$i:".sprintf("%02d",floor(($j*60)/$slice)), $debut, $fin, $dimheure, $dimjour, $fontsize) .
+				"px;'>$i:" .
+				sprintf("%02d",floor(($j*60)/$slice)) . 
+				"</div>";
+		}
+	}
+
+	return "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: 2px;'>0:00</div>" .
+		$total .
+		"\n<div class='calendrier-heurepile' style='$spip_lang_left: 0px; top: ".
+		calendrier_top ("$fin:00", $debut, $fin, $dimheure, $dimjour, $fontsize).
+		"px;'>$fin:00</div>" .
+		"\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: ".
+		($dimjour - $fontsize - 2) .
+		"px;'>23:59</div>";
+}
+
+# si la largeur le permet, les evenements sans duree, 
+# se placent a cote des autres, sinon en dessous
+
+function http_calendrier_ics_trois($evt, $largeur, $dimjour, $fontsize, $border)
+{
+	global $spip_lang_left; 
+
+	$types = array();
+	foreach($evt as $v)
+	  $types[isset($v['DESCRIPTION']) ? 'info_articles' :
+		 (isset($v['DTSTART']) ? 'info_liens_syndiques_3' :
+		  'info_breves_02')][] = $v;
+	$res = '';
+	foreach ($types as $k => $v) {
+	  $res2 = '';
+	  foreach ($v as $evenement) {
+	    $res2 .= http_calendrier_sans_heure($evenement);
+	  }
+	  $res .= "\n<div class='calendrier-verdana10 calendrier-titre'>".
+	    _T($k) .
+	    "</div>" .
+	    $res2;
+	}
+		
+	if ($largeur > 90) {
+		$largeur += (5*$fontsize);
+		$pos = "-$dimjour";
+	} else { $largeur = (3*$fontsize); $pos= 0; }
+	  
+	return "\n<div style='position: relative; z-index: 2; top: ${pos}px; margin-$spip_lang_left: " . $largeur . "px'>$res</div>";
+}
+
+function http_calendrier_ics_titre($annee, $mois, $jour,$script, $finurl='')
+{
+	$date = mktime(0,0,0,$mois, $jour, $annee);
+	$jour = date("d",$date);
+	$mois = date("m",$date);
+	$annee = date("Y",$date);
+	$nom = affdate_jourcourt("$annee-$mois-$jour");
+	return "<div class='calendrier-arial10 calendrier-titre'>" .
+	  http_href(calendrier_args_date($script, $annee, $mois, $jour, 'jour', $finurl), $nom, $nom, '', 'calendrier-noir') .
+	  "</div>";
+}
+
+
+function http_calendrier_sans_date($annee, $mois, $evenements)
+{
+  $r = $evenements[0+($annee . $mois . "00")];
+  if (!$r) return "";
+  $res = "\n<div class='calendrier-arial10 calendrier-titre'>".
+    _T('info_mois_courant').
+    "</div>";
+  foreach ($r as $evenement) $res .= http_calendrier_sans_heure($evenement);
+  return $res;
+}
+
+
+function http_calendrier_sans_heure($ev)
+{
+	$desc = propre($ev['DESCRIPTION']);
+	$sum = $ev['SUMMARY'];
+	if (!$sum) $sum = $desc;
+	$i = isset($ev['DESCRIPTION']) ? 11 : 9; // 11: article; 9:autre
+	if ($ev['URL'])
+	  $sum = http_href(quote_amp($ev['URL']), $sum, $desc);
+	$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$ev,'type'=>'sans_heure'),'data'=>$sum));
+	return "\n<div class='calendrier-arial$i calendrier-evenement'>" .
+	  "<span class='" . $ev['CATEGORIES'] . "'>&nbsp;</span>&nbsp;$sum</div>"; 
+}
+
+function http_calendrier_avec_heure($evenement, $amj)
+{
+	$jour_debut = substr($evenement['DTSTART'], 0,8);
+	$jour_fin = substr($evenement['DTEND'], 0, 8);
+	if ($jour_fin <= 0) $jour_fin = $jour_debut;
+	if (($jour_debut <= 0) OR ($jour_debut > $amj) OR ($jour_fin < $amj))
+	  return "";
+	
+	$desc = propre($evenement['DESCRIPTION']);
+	$sum = $evenement['SUMMARY'];
+	if (!$sum) $sum = $desc;
+	$sum = ereg_replace(' +','&nbsp;', typo($sum));
+	if ($lieu = $evenement['LOCATION'])
+	  $sum .= '<br />' . $lieu;
+	if ($perso = $evenement['ATTENDEE'])
+	  $sum .=  '<br />' . substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@'));
+	if ($evenement['URL'])
+	  $sum = http_href(quote_amp($evenement['URL']), $sum, $desc, 'border: 0px');
+
+	$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'avec_heure'),'data'=>$sum));
+	$opacity = "";
+	$deb_h = substr($evenement['DTSTART'],-6,2);
+	$deb_m = substr($evenement['DTSTART'],-4,2);
+	$fin_h = substr($evenement['DTEND'],-6,2);
+	$fin_m = substr($evenement['DTEND'],-4,2);
+	
+	if ($deb_h >0 OR $deb_m > 0) {
+	  if ((($deb_h > 0) OR ($deb_m > 0)) AND $amj == $jour_debut)
+	    { $deb = "<span  style='font-weight: bold;'>" . $deb_h . ':' . $deb_m . '</span>';}
+	  else { 
+	    $deb = '...'; 
+	  }
+	  
+	  if ((($fin_h > 0) OR ($fin_m > 0)) AND $amj == $jour_fin)
+	    { $fin = "<span  style='font-weight: bold;'>" . $fin_h . ':' . $fin_m . '</span> ';}
+	  else { 
+	    $fin = '...'; 
+	  }
+	  
+	  if ($amj == $jour_debut OR $amj == $jour_fin) {
+	    $sum = "<div>$deb-$fin</div>$sum";
+	  } else {
+	    $opacity =' calendrier-opacity';
+	  }
+	}
+	return "\n<div class='calendrier-arial10 calendrier-evenement " . $evenement['CATEGORIES'] ."$opacity'>$sum\n</div>\n"; 
+}
+
+# Bandeau superieur d'un calendrier selon son $type (jour/mois/annee):
+# 2 icones vers les 2 autres types, a la meme date $jour $mois $annee
+# 2 icones de loupes pour zoom sur la meme date et le meme type
+# 2 fleches appelant le $script sur les periodes $pred/$suiv avec une $ancre
+# et le $nom du calendrier
+
+function http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, $nom, $script, $args_pred, $args_suiv, $type, $ancre)
+{
+	global $spip_lang_right, $spip_lang_left, $couleur_foncee;
+
+	if (!$echelle) $echelle = DEFAUT_D_ECHELLE;
+
+	if ($args_pred) {
+	  list($a, $m, $j, $t) = $args_pred;
+	  $args_pred = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+				 http_img_pack("fleche-$spip_lang_left.png", '&lt;&lt;&lt;', "class='calendrier-png'"),
+				 _T('precedent'));
+	}
+
+	if ($args_suiv) {
+	  list($a, $m, $j, $t) = $args_suiv;
+	  $args_suiv = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+				 http_img_pack("fleche-$spip_lang_right.png",  '&gt;&gt;&gt;', "class='calendrier-png'"),
+				 _T('suivant'));
+	}
+
+	$today=getdate(time());
+	$jour_today = $today["mday"];
+	$mois_today = $today["mon"];
+	$annee_today = $today["year"];
+
+	$id = 'nav-agenda' .ereg_replace('[^A-Za-z0-9]', '', $ancre);
+
+	return 
+	  "<div class='navigation-calendrier calendrier-moztop8'" 
+	  . (!isset($couleur_foncee) ? "" : "\nstyle='background-color: $couleur_foncee;'")
+	  . "><div style='float: $spip_lang_right; padding-left: 5px; padding-right: 5px;'>"
+	  . (($type == "mois") ? '' :
+	     (
+		  http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=sansheure$ancre"),
+				 "sans-heure.gif",
+				 "class='calendrier-png" .
+				 (($partie_cal == "sansheure") ? " calendrier-opacity'" : "'"),
+				 _T('sans_heure'))
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=tout$ancre"),
+				 "heures-tout.png",
+				 "class='calendrier-png" .
+				 (($partie_cal == "tout") ? " calendrier-opacity'" : "'"),
+				 _T('cal_jour_entier'))
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=matin$ancre"),
+				 "heures-am.png",
+				 "class='calendrier-png" .
+				 (($partie_cal == "matin") ? " calendrier-opacity'" : "'"),
+				 _T('cal_matin'))
+
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=soir$ancre"),
+				 "heures-pm.png", 
+				 "class='calendrier-png" .
+				 (($partie_cal == "soir") ? " calendrier-opacity'" : "'"),
+				 _T('cal_apresmidi'))
+		  . "&nbsp;"
+		  . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;partie_cal=$partie_cal&amp;echelle=" .
+					  floor($echelle * 1.5)) . $ancre,
+					 "loupe-moins.gif",
+					 '',
+					 _T('info_zoom'). '-')
+		  . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;partie_cal=$partie_cal&amp;echelle=" .
+					  floor($echelle / 1.5)) . $ancre, 
+					 "loupe-plus.gif",
+					 '', 
+					 _T('info_zoom'). '+')
+		  ))
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "jour", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),"cal-jour.gif",
+			  (($type == 'jour') ? " class='calendrier-opacity'" : ''),
+			  _T('cal_par_jour'))
+
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "semaine", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"), "cal-semaine.gif", 
+			  (($type == 'semaine') ?  " class='calendrier-opacity'" : "" ),
+			  _T('cal_par_semaine'))
+
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "mois", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),"cal-mois.gif",
+			  (($type == 'mois') ? " class='calendrier-opacity'" : "" ),
+			  _T('cal_par_mois'))
+	  . "</div>"
+	  . "&nbsp;&nbsp;"
+	  . http_href_img(calendrier_args_date($script,$annee_today, $mois_today, $jour_today, $type, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+			  "cal-today.gif",
+			  (" onmouseover=\"montrer('$id');\"" .
+			   (($annee == $annee_today && $mois == $mois_today && (($type == 'mois')  || ($jour == $jour_today)))
+			    ? " class='calendrier-opacity'" : "")),
+			  _T("ecrire:info_aujourdhui"))
+	  . "&nbsp;"
+	  . $args_pred 
+	  . $args_suiv
+	  . "&nbsp;&nbsp;"
+	  . $nom
+	  . (_DIR_RESTREINT ? '' :  aide("messcalen"))
+	  . "</div>"
+	  . http_calendrier_invisible($annee, $mois, $jour, $script, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre", $id);
+}
+
+
+// fabrique un petit agenda accessible par survol
+
+function http_calendrier_invisible($annee, $mois, $jour, $script, $ancre, $id)
+{
+	global $spip_lang_right, $spip_lang_left, $couleur_claire;
+	$gadget = "<div style='position: relative;z-index: 1000;'
+			onmouseover=\"montrer('$id');\"
+			onmouseout=\"cacher('$id');\">"
+	  . "<table id='$id' class='calendrier-cadreagenda'"
+	  . (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'")
+	  . ">\n<tr><td colspan='3' style='text-align:$spip_lang_left;'>";
+
+	$annee_avant = $annee - 1;
+	$annee_apres = $annee + 1;
+
+	for ($i=$mois; $i < 13; $i++) {
+	  $nom = nom_mois("$annee_avant-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee_avant, $i, 1, "mois", $ancre),
+				     $nom,$nom . ' ' . $annee_avant,'', 'calendrier-annee') ;
+			}
+	for ($i=1; $i < $mois - 1; $i++) {
+	  $nom = nom_mois("$annee-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee,'', 'calendrier-annee');
+			}
+	$gadget .= "</td></tr>"
+		. "\n<tr><td class='calendrier-tripleagenda'>"
+		. http_calendrier_agenda($annee, $mois-1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>\n<td class='calendrier-tripleagenda'>"
+	  . http_calendrier_agenda($annee, $mois, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>\n<td class='calendrier-tripleagenda'>"
+	  . http_calendrier_agenda($annee, $mois+1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>"
+		. "</tr>"
+		. "\n<tr><td colspan='3' style='text-align:$spip_lang_right;'>";
+	for ($i=$mois+2; $i <= 12; $i++) {
+	  $nom = nom_mois("$annee-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee,'', 'calendrier-annee');
+			}
+	for ($i=1; $i < $mois+1; $i++) {
+	  $nom = nom_mois("$annee_apres-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script, $annee_apres, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee_apres,'', 'calendrier-annee');
+			}
+	return $gadget . "</td></tr></table></div>";
+}
+
+// agenda mensuel 
+
+function http_calendrier_agenda ($annee, $mois, $jour_ved, $mois_ved, $annee_ved, $semaine = false,  $script='', $ancre='', $evt='') {
+
+  if (!$script) $script =  $GLOBALS['PHP_SELF'] ;
+
+  if (!$mois) {$mois = 12; $annee--;}
+  elseif ($mois==13) {$mois = 1; $annee++;}
+  if (!$evt) $evt = sql_calendrier_agenda($annee, $mois);
+  $nom = affdate_mois_annee("$annee-$mois-1");
+  return 
+    "<div class='calendrier-titre calendrier-arial10'>" .
+    http_href(calendrier_args_date($script, $annee, $mois, 1, 'mois', $ancre),
+	      $nom, $nom,
+	      'color: black;') .
+    "<table width='100%' cellspacing='0' cellpadding='0'>" .
+    http_calendrier_agenda_rv ($annee, $mois, $evt,				
+			        'http_calendrier_clic', array($script, $ancre),
+			        $jour_ved, $mois_ved, $annee_ved, 
+				$semaine) . 
+    "</table>" .
+    "</div>";
+}
+
+function http_calendrier_clic($annee, $mois, $jour, $type, $couleur, $perso)
+{
+
+  list($script, $ancre) = $perso;
+
+  return http_href(calendrier_args_date($script, $annee, $mois, $jour,$type, $ancre), 
+		   $jour,
+		   "$jour-$mois-$annee",
+		   "color: $couleur; font-weight: bold");
+}
+
+// typographie un mois sous forme d'un tableau de 7 colonnes
+
+function http_calendrier_agenda_rv ($annee, $mois, $les_rv, $fclic, $perso='',
+				    $jour_ved='', $mois_ved='', $annee_ved='',
+				    $semaine='') {
+	global $couleur_foncee, $spip_lang_left, $spip_lang_right;
+
+	// Former une date correcte (par exemple: $mois=13; $annee=2003)
+	$date_test = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
+	$mois = mois($date_test);
+	$annee = annee($date_test);
+	if ($semaine) 
+	{
+		$jour_semaine_valide = date("w",mktime(1,1,1,$mois_ved,$jour_ved,$annee_ved));
+		if ($jour_semaine_valide==0) $jour_semaine_valide=7;
+		$debut = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+1,$annee_ved);
+		$fin = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+7,$annee_ved);
+	} else { $debut = $fin = '';}
+	
+	$today=getdate(time());
+	$jour_today = $today["mday"];
+	$cemois = ($mois == $today["mon"] AND $annee ==  $today["year"]);
+
+	$total = '';
+	$ligne = '';
+	$jour_semaine = date("w", mktime(1,1,1,$mois,1,$annee));
+	if ($jour_semaine==0) $jour_semaine=7;
+	for ($i=1;$i<$jour_semaine;$i++) $ligne .= "\n\t<td></td>";
+	$style0 = (!isset($couleur_foncee)) ? "" : " style='border: 1px solid $couleur_foncee;'";
+	for ($j=1; (checkdate($mois,$j,$annee)); $j++) {
+		$style = "";
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour_semaine = date("w",$nom);
+		if ($jour_semaine==0) $jour_semaine=7;
+
+		if ($j == $jour_ved AND $mois == $mois_ved AND $annee == $annee_ved) {
+		  $class= 'calendrier-arial11 calendrier-demiagenda';
+		  $type = 'jour';
+		  $couleur = "black";
+		  } else if ($semaine AND $nom >= $debut AND $nom <= $fin) {
+		  $class= 'calendrier-arial11 calendrier-demiagenda' . 
+ 		      (($jour_semaine==1) ? " calendrier-$spip_lang_left"  :
+		       (($jour_semaine==7) ? " calendrier-$spip_lang_right" :
+			''));
+		  $type = ($semaine ? 'semaine' : 'jour') ;
+		  $couleur = "black";
+		} else {
+		  if ($j == $jour_today AND $cemois) {
+			$style = $couleur_foncee;
+			if(!$style) $style = '#333333';
+			$couleur = "white";
+		    } else {
+			if ($jour_semaine == 7) {
+				$style = "#aaaaaa";
+				$couleur = 'white';
+			} else {
+				$style = "#ffffff";
+				$couleur = "#aaaaaa";
+			}
+			if ($les_rv[$j] > 0) {
+			  $style = "#ffffff";
+			  $couleur = "black";
+			}
+		  }
+		  $class= 'calendrier-arial11 calendrier-agenda';
+		  $type = ($semaine ? 'semaine' : 'jour') ;
+		}
+		if ($style)
+		  $style = " style='background-color: $style'";
+		else $style = $style0;
+		$ligne .= "\n\t<td><div class='$class'$style>" .
+		  $fclic($annee,$mois, $j, $type, $couleur, $perso) .
+		  "</div></td>";
+		if ($jour_semaine==7) 
+		    {
+		      if ($ligne) $total .= "\n<tr>$ligne\n</tr>";
+		      $ligne = '';
+		    }
+	}
+	return $total . (!$ligne ? '' : "\n<tr>$ligne\n</tr>");
+}
+
+
+function calendrier_categories($table, $num, $objet)
+{
+  if (function_exists('generer_calendrier_class'))
+    return generer_calendrier_class($table, $num, $objet);
+  else {
+    // cf calendrier.css
+    $result= spip_fetch_array(spip_query("SELECT " . (($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . "
+FROM	$table
+WHERE	$objet=$num
+"));
+    if ($result) $num = $result[0];
+    return 'calendrier-couleur' . (($num%14)+1);
+  }
+}
+
+//------- fonctions d'appel MySQL. 
+// au dela cette limite, pas de production HTML
+
+function sql_calendrier_mois($annee,$mois,$jour) {
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,1,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(0,0,0,$mois+1,1,$annee)) .
+	" 00:00:00'";
+	return array($avant, $apres);
+}
+
+function sql_calendrier_semaine($annee,$mois,$jour) {
+	$w_day = date("w", mktime(0,0,0,$mois, $jour, $annee));
+	if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero
+	$debut = $jour-$w_day;
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$debut,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$debut+7,$annee)) .
+	" 23:59:59'";
+	return array($avant, $apres);
+}
+
+// ici on prend en fait le jour, la veille et le lendemain
+
+function sql_calendrier_jour($annee,$mois,$jour) {
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$jour-1,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$jour+1,$annee)) .
+	" 23:59:59'";
+	return array($avant, $apres);
+}
+
+// retourne un tableau de 2 tableaux indexes par des dates
+// - le premier indique les evenements du jour, sans indication de duree
+// - le deuxime indique les evenements commencant ce jour, avec indication de duree
+
+function sql_calendrier_interval($limites) {
+	list($avant, $apres) = $limites;
+	$evt = array();
+	sql_calendrier_interval_articles($avant, $apres, $evt);
+	sql_calendrier_interval_breves($avant, $apres, $evt);
+	sql_calendrier_interval_rubriques($avant, $apres, $evt);
+	return array($evt, sql_calendrier_interval_rv($avant, $apres));
+}
+
+function  sql_calendrier_interval_forums($limites, &$evenements) {
+	list($avant, $apres) = $limites;
+	$result=spip_query("
+SELECT	DISTINCT titre, date_heure, id_forum
+FROM	spip_forum
+WHERE	date_heure >= $avant
+ AND	date_heure < $apres
+ORDER BY date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date_heure']);
+		$id = $row['id_forum'];
+		$evenements[$amj][]=
+		array(
+			'URL' => generer_url_forum($id),
+			'CATEGORIES' => 'calendrier-couleur7',
+			'SUMMARY' => $row['titre'],
+			'DTSTART' => date_ical($row['date_heure']));
+	}
+}
+
+# 3 fonctions retournant les evenements d'une periode
+# le tableau retourne est indexe par les balises du format ics
+# afin qu'il soit facile de produire de tels documents.
+
+function sql_calendrier_interval_articles($avant, $apres, &$evenements) {
+	
+	$result=spip_query("
+SELECT	id_article, titre, date, descriptif, chapo
+FROM	spip_articles
+WHERE	statut='publie'
+ AND	date >= $avant
+ AND	date < $apres
+ORDER BY date
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date']);
+		$id = $row['id_article'];
+		$evenements[$amj][]=
+		    array(
+			  'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
+			'DESCRIPTION' => $row['descriptif'],
+			'SUMMARY' => $row['titre'],
+			'URL' => generer_url_article($id, 'prop'));
+	}
+}
+
+function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) {
+	
+	$result=spip_query("
+SELECT	DISTINCT R.id_rubrique, titre, descriptif, date
+FROM	spip_rubriques AS R, spip_documents_rubriques AS L
+WHERE	statut='publie'
+ AND	date >= $avant
+ AND	date < $apres
+ AND	R.id_rubrique = L.id_rubrique
+ORDER BY date
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date']);
+		$id = $row['id_rubrique'];
+		$evenements[$amj][]=
+		    array(
+			  'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
+			'DESCRIPTION' => $row['descriptif'],
+			'SUMMARY' => $row['titre'],
+			'URL' => generer_url_rubrique($id, 'prop'));
+	}
+}
+
+function sql_calendrier_interval_breves($avant, $apres, &$evenements) {
+	$result=spip_query("
+SELECT	id_breve, titre, date_heure, id_rubrique
+FROM	spip_breves
+WHERE	statut='publie'
+ AND	date_heure >= $avant
+ AND	date_heure < $apres
+ORDER BY date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date_heure']);
+		$id = $row['id_breve'];
+		$ir = $row['id_rubrique'];
+		$evenements[$amj][]=
+		array(
+		      'URL' => generer_url_breve($id, 'prop'),
+		      'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
+		      'SUMMARY' => $row['titre']);
+	}
+}
+
+function sql_calendrier_interval_rv($avant, $apres) {
+	global $connect_id_auteur;
+	$evenements= array();
+	if (!$connect_id_auteur) return $evenements;
+	$result=spip_query("
+SELECT	messages.id_message, messages.titre, messages.texte,
+	messages.date_heure, messages.date_fin, messages.type
+FROM	spip_messages AS messages, 
+	spip_auteurs_messages AS lien
+WHERE	((lien.id_auteur='$connect_id_auteur'
+ AND	lien.id_message=messages.id_message) OR messages.type='affich')
+ AND	messages.rv='oui' 
+ AND	((messages.date_fin >= $avant OR messages.date_heure >= $avant) AND messages.date_heure <= $apres)
+ AND	messages.statut='publie'
+GROUP BY messages.id_message
+ORDER BY messages.date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$date_heure=$row["date_heure"];
+		$date_fin=$row["date_fin"];
+		$type=$row["type"];
+		$id_message=$row['id_message'];
+
+		if ($type=="pb")
+		  $cat = 'calendrier-couleur2';
+		else {
+		  if ($type=="affich")
+		  $cat = 'calendrier-couleur4';
+		  else {
+		    if ($type!="normal")
+		      $cat = 'calendrier-couleur12';
+		    else {
+		      $cat = 'calendrier-couleur9';
+		      $auteurs = array();
+		      $result_aut=spip_query("
+SELECT	auteurs.nom 
+FROM	spip_auteurs AS auteurs,
+	spip_auteurs_messages AS lien 
+WHERE	(lien.id_message='$id_message' 
+  AND	(auteurs.id_auteur!='$connect_id_auteur'
+  AND	lien.id_auteur=auteurs.id_auteur))");
+			while($row_auteur=spip_fetch_array($result_aut)){
+				$auteurs[] = $row_auteur['nom'];
+			}
+		    }
+		  }
+		}
+
+		$jour_avant = substr($avant, 9,2);
+		$mois_avant = substr($avant, 6,2);
+		$annee_avant = substr($avant, 1,4);
+		$jour_apres = substr($apres, 9,2);
+		$mois_apres = substr($apres, 6,2);
+		$annee_apres = substr($apres, 1,4);
+		$ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-".sprintf("%02d",$jour_apres));
+
+		// Calcul pour les semaines a cheval sur deux mois 
+ 		$j = 0;
+		$amj = date_anneemoisjour("$annee_avant-$mois_avant-".sprintf("%02d", $j+($jour_avant)));
+
+		while ($amj <= $ical_apres) {
+		if (!($amj == date_anneemoisjour($date_fin) AND ereg("00:00:00", $date_fin)))  // Ne pas prendre la fin a minuit sur jour precedent
+			$evenements[$amj][$id_message]=
+			  array(
+				'URL' => generer_url_ecrire("message","id_message=$id_message"),
+				'DTSTART' => date_ical($date_heure),
+				'DTEND' => date_ical($date_fin),
+				'DESCRIPTION' => $row['texte'],
+				'SUMMARY' => $row['titre'],
+				'CATEGORIES' => $cat,
+				'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs,", "));
+			
+			$j ++; 
+			$ladate = date("Y-m-d",mktime (1,1,1,$mois_avant, ($j + $jour_avant), $annee_avant));
+			
+			$amj = date_anneemoisjour($ladate);
+
+		}
+
+	}
+  return $evenements;
+}
+
+// fonction SQL, pour la messagerie
+
+function sql_calendrier_taches_annonces () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT * FROM spip_messages 
+WHERE type = 'affich' AND rv != 'oui' AND statut = 'publie' ORDER BY date_heure DESC");
+	if (spip_num_rows($result) > 0)
+		while ($x = spip_fetch_array($result)) $r[] = $x;
+	return $r;
+}
+
+function sql_calendrier_taches_pb () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT * FROM spip_messages AS messages 
+WHERE id_auteur=$connect_id_auteur AND statut='publie' AND type='pb' AND rv!='oui'");
+	if (spip_num_rows($result) > 0){
+	  $r = array();
+	  while ($x = spip_fetch_array($result)) $r[] = $x;
+	}
+	return $r;
+}
+
+function sql_calendrier_taches_rv () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT messages.* 
+FROM spip_messages AS messages, spip_auteurs_messages AS lien 
+WHERE ((lien.id_auteur='$connect_id_auteur' 
+	AND lien.id_message=messages.id_message) 
+	OR messages.type='affich') 
+AND messages.rv='oui'
+AND ( (messages.date_heure > DATE_SUB(NOW(), INTERVAL 1 DAY) 
+	AND messages.date_heure < DATE_ADD(NOW(), INTERVAL 1 MONTH))
+	OR (messages.date_heure < NOW() AND messages.date_fin > NOW() ))
+AND messages.statut='publie' 
+GROUP BY messages.id_message 
+ORDER BY messages.date_heure");
+	if (spip_num_rows($result) > 0){
+	  $r = array();
+	  while ($x = spip_fetch_array($result)) $r[] = $x;
+	}
+	return  $r;
+}
+
+function sql_calendrier_agenda ($annee, $mois) {
+	global $connect_id_auteur;
+
+	$rv = array();
+	if (!$connect_id_auteur) return $rv;
+	$date = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
+	$mois = mois($date);
+	$annee = annee($date);
+
+	// rendez-vous personnels dans le mois
+	$result_messages=spip_query("SELECT messages.date_heure FROM spip_messages AS messages, spip_auteurs_messages AS lien WHERE ((lien.id_auteur='$connect_id_auteur' AND lien.id_message=messages.id_message) OR messages.type='affich') AND messages.rv='oui' AND messages.date_heure >='$annee-$mois-1' AND date_heure < DATE_ADD('$annee-$mois-1', INTERVAL 1 MONTH) AND messages.statut='publie'");
+	while($row=spip_fetch_array($result_messages)){
+		$rv[journum($row['date_heure'])] = 1;
+	}
+	return $rv;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda_filtres.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda_filtres.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda_filtres.php	(revision 30)
@@ -0,0 +1,204 @@
+<?php
+/**
+ * Fichier de filtres communs au plugin Agenda et PIM_agenda
+ *
+ */
+
+function Agenda_memo_full($date_deb=0, $date_fin=0 , $titre='', $descriptif='', $lieu='', $url='', $cal='')
+{
+	static $agenda = array();
+	if (!$date_deb) {
+		$res = $agenda;
+		$agenda=array();
+		return $res;
+	}
+	$url=str_replace("&amp;","&",$url);
+	
+	$idatedeb = date_ical($date_deb);
+	$idatefin = date_ical($date_fin);
+	$cal = trim($cal); // func_get_args (filtre alterner) rajoute \n !!!!
+	$startday1=explode(' ',$date_deb);
+	$startday1=$startday1['0'].' 00:00:00';
+	$ts_startday1=strtotime($startday1);
+	$ts_date_fin=strtotime($date_fin);
+	$maxdays=365;
+	while (($ts_startday1<$ts_date_fin)&&($maxdays-->0))
+	{
+		$day=date('Y-m-d H:i:s',$ts_startday1);
+		$agenda[$cal][(date_anneemoisjour($day))][] =  array(
+			'CATEGORIES' => $cal,
+			'DTSTART' => $idatedeb,
+			'DTEND' => $idatefin,
+			'DESCRIPTION' => $descriptif,
+			'SUMMARY' => $titre,
+			'LOCATION' => $lieu,
+			'URL' => $url);
+		$ts_startday1 += 26*3600; // le jour suivant : +26 h pour gerer les changements d'heure
+		$ts_startday1 = mktime(0, 0, 0, date("m",$ts_startday1), 
+		date("d",$ts_startday1), date("Y",$ts_startday1)); // et remise a zero de l'heure	
+	}
+
+	// toujours retourner vide pour qu'il ne se passe rien
+	return "";
+}
+
+function Agenda_memo_evt_full($date_deb=0, $date_fin=0 , $titre='', $descriptif='', $lieu='', $url='', $cal='')
+{
+	static $evenements = array();
+	if (!$date_deb) return $evenements;
+	$url=str_replace("&amp;","&",$url);
+	
+	$idatedeb = date_ical(reset(explode(" ",$date_deb))." 00:00:00");
+	$idatefin = date_ical(reset(explode(" ",$date_fin))." 00:00:00");
+	$cal = trim($cal); // func_get_args (filtre alterner) rajoute \n !!!!
+	$startday1=explode(' ',$date_deb);
+	$startday1=$startday1['0'].' 00:00:00';
+	$ts_startday1=strtotime($startday1);
+	$ts_date_fin=strtotime($date_fin);
+	$maxdays=365;
+	while (($ts_startday1<$ts_date_fin)&&($maxdays-->0))
+	{
+		$day=date('Y-m-d H:i:s',$ts_startday1);
+		$evenements[$cal][(date_anneemoisjour($day))][] =  array(
+			'CATEGORIES' => $cal,
+			'DTSTART' => $idatedeb,
+			'DTEND' => $idatefin,
+			'DESCRIPTION' => $descriptif,
+			'SUMMARY' => $titre,
+			'LOCATION' => $lieu,
+			'URL' => $url);
+		$ts_startday1 += 26*3600; // le jour suivant : +26 h pour gerer les changements d'heure
+		$ts_startday1 = mktime(0, 0, 0, date("m",$ts_startday1), 
+		date("d",$ts_startday1), date("Y",$ts_startday1)); // et remise a zero de l'heure	
+	}
+
+	// toujours retourner vide pour qu'il ne se passe rien
+	return "";
+}
+
+function Agenda_affiche_full($i)
+{
+	$args = func_get_args();
+	$nb = array_shift($args); // nombre d'evenements (on pourrait l'afficher)
+	$sinon = array_shift($args);
+	if (!$nb) return $sinon;
+	$type = array_shift($args);
+	$agenda = Agenda_memo_full(0);
+	$evt_avec = array();
+	foreach (($args ? $args : array_keys($agenda)) as $k) {
+		if (isset($agenda[$k])&&is_array($agenda[$k]))
+			foreach($agenda[$k] as $d => $v) {
+				$evt_avec[$d] = isset($evt_avec[$d]) ? (array_merge($evt_avec[$d], $v)) : $v;
+			}
+	}
+
+	$evenements = Agenda_memo_evt_full(0);
+	$evt_sans = array();
+	foreach (($args ? $args : array_keys($evenements)) as $k) {
+		if (isset($evenements[$k])&&is_array($evenements[$k]))
+			foreach($evenements[$k] as $d => $v) {
+				$evt_sans[$d] = isset($evt_sans[$d]) ? (array_merge($evt_sans[$d], $v)) : $v;
+			}
+	}
+
+
+	if ($type != 'periode')
+		$evt = array($evt_sans, $evt_avec);
+	else
+	{
+		$d = array_keys($evt_avec);
+		$mindate = min($d);
+		$min = substr($mindate,6,2);
+		$max = $min + ((strtotime(max($d)) - strtotime($mindate)) / (3600 * 24));
+		if ($max < 31) $max = 0;
+			$evt = array($evt_sans, $evt_avec, $min, $max);
+		$type = 'mois';
+	}
+
+	include_spip('inc/agenda');
+	$texte=http_calendrier_init('', $type, '', '', self(), $evt);
+
+	return $texte;
+}
+
+function Agenda_affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui'){
+	static $trans_tbl=NULL;
+	if ($trans_tbl==NULL){
+		$trans_tbl = get_html_translation_table (HTML_ENTITIES);
+		$trans_tbl = array_flip ($trans_tbl);
+	}
+	
+	$date_debut = strtotime($date_debut);
+	$date_fin = strtotime($date_fin);
+	$s = "";
+	if (($d=date("Y-m-d",$date_debut))==date("Y-m-d",$date_fin))
+	{ // meme jour
+		$s = ucfirst(nom_jour($d))." ".affdate_jourcourt($d);
+		if ($horaire=='oui'){
+			$s .= " ".($hd=date("H:i",$date_debut));
+			if ($hd!=($hf=date("H:i",$date_fin)))
+				$s .= "-$hf";
+		}
+	}
+	else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin))
+	{ // meme annee et mois, jours differents
+		$d=date("Y-m-d",$date_debut);
+		if ($horaire=='oui'){
+			$s = _T('agenda:evenement_date_du') . " " . affdate_jourcourt($d);
+			$s .= " ".($hd=date("H:i",$date_debut));
+			$s .= " " . _T('agenda:evenement_date_au').date("d  H:i ",$date_fin);
+		}
+		else {
+			$s = _T('agenda:evenement_date_du') . " " . jour($d);
+			$s .= " " . _T('agenda:evenement_date_au').affdate_jourcourt(date("Y-m-d",$date_fin));
+		}
+	}
+	else if ((date("Y",$date_debut))==date("Y",$date_fin))
+	{ // meme annee, mois et jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = _T('agenda:evenement_date_du') . " " . affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= " "._T('agenda:evenement_date_au').affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_fin);
+	}
+	else
+	{ // tout different
+		$s = _T('agenda:evenement_date_du') . " " . affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= " "._T('agenda:evenement_date_au').affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_fin);
+	}
+	return unicode2charset(charset2unicode(strtr($s,$trans_tbl),''));	
+}
+
+function Agenda_dateplus($date,$secondes,$format){
+	$date = strtotime($date)+eval("return $secondes;"); // permet de passer une expression
+	return date($format,$date);
+}
+
+// decale les mois de la date.
+// cette fonction peut raboter le jour si le nouveau mois ne les contient pas
+// exemple 31/01/2007 + 1 mois => 28/02/2007
+function Agenda_moisdecal($date,$decalage,$format){
+	include_spip('inc/filtres');
+	$date_array = recup_date($date);
+	if ($date_array) list($annee, $mois, $jour) = $date_array;
+	if (!$jour) $jour=1;
+	if (!$mois) $mois=1;
+	$mois2 = $mois + $decalage;
+	$date2 = mktime(1, 1, 1, $mois2, $jour, $annee);
+	// mois normalement attendu
+	$mois3 = date('m', mktime(1, 1, 1, $mois2, 1, $annee));
+	// et si le mois de la nouvelle date a moins de jours...
+	$mois2 = date('m', $date2);
+	if ($mois2 - $mois3) $date2 = mktime(1, 1, 1, $mois2, 0, $annee);
+	return date($format, $date2);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda_gestion.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda_gestion.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/inc/agenda_gestion.php	(revision 30)
@@ -0,0 +1,752 @@
+<?php
+
+include_spip('inc/texte');
+include_spip('inc/date');
+include_spip('agenda_mes_fonctions');
+
+function Agenda_install(){
+	Agenda_verifier_base();
+}
+
+function Agenda_uninstall(){
+	include_spip('base/agenda_evenements');
+	include_spip('base/abstract_sql');
+
+	// suppression du champ evenements a la table spip_groupe_mots
+	spip_query("ALTER TABLE `spip_groupes_mots` DROP `evenements`");
+	
+}
+
+function Agenda_verifier_base(){
+	$version_base = 0.12;
+	$current_version = 0.0;
+	if (   (!isset($GLOBALS['meta']['agenda_base_version']) )
+			|| (($current_version = $GLOBALS['meta']['agenda_base_version'])!=$version_base)){
+		include_spip('base/agenda_evenements');
+		if ($current_version==0.0){
+			include_spip('base/create');
+			include_spip('base/abstract_sql');
+			creer_base();
+			// ajout du champ evenements a la table spip_groupe_mots
+			// si pas deja existant
+			$desc = spip_abstract_showtable("spip_groupes_mots", '', true);
+			if (!isset($desc['field']['evenements'])){
+				spip_query("ALTER TABLE spip_groupes_mots ADD `evenements` VARCHAR(3) NOT NULL AFTER `syndic`");
+			}
+			ecrire_meta('agenda_base_version',$current_version=$version_base);
+		}
+		if ($current_version<0.11){
+			spip_query("ALTER TABLE spip_evenements ADD `horaire` ENUM('oui','non') DEFAULT 'oui' NOT NULL AFTER `lieu`");
+			ecrire_meta('agenda_base_version',$current_version=0.11);
+		}
+		if ($current_version<0.12){
+			spip_query("ALTER TABLE spip_evenements ADD `id_article` bigint(21) DEFAULT '0' NOT NULL AFTER `id_evenement`");
+			spip_query("ALTER TABLE spip_evenements ADD INDEX ( `id_article` )");
+			$res = spip_query ("SELECT * FROM spip_evenements_articles");
+			while ($row = spip_fetch_array($res)){
+				$id_article = $row['id_article'];
+				$id_evenement = $row['id_evenement'];
+				spip_query("UPDATE spip_evenements SET id_article=$id_article WHERE id_evenement=$id_evenement");
+			}
+			spip_query("DROP TABLE spip_evenements_articles");
+			ecrire_meta('agenda_base_version',$current_version=0.12);
+		}
+		
+		ecrire_metas();
+	}
+	
+	if (isset($GLOBALS['meta']['INDEX_elements_objet'])){
+		$INDEX_elements_objet = unserialize($GLOBALS['meta']['INDEX_elements_objet']);
+		if (!isset($INDEX_elements_objet['spip_evenements'])){
+			$INDEX_elements_objet['spip_evenements'] = array('titre'=>8,'descriptif'=>4,'lieu'=>3);
+			ecrire_meta('INDEX_elements_objet',serialize($INDEX_elements_objet));
+			ecrire_metas();
+		}
+	}
+	if (isset($GLOBALS['meta']['INDEX_objet_associes'])){
+		$INDEX_objet_associes = unserialize($GLOBALS['meta']['INDEX_objet_associes']);
+		if (!isset($INDEX_objet_associes['spip_articles']['spip_evenements'])){
+			$INDEX_objet_associes['spip_articles']['spip_evenements'] = 1;
+			ecrire_meta('INDEX_objet_associes',serialize($INDEX_objet_associes));
+			ecrire_metas();
+		}
+	}
+	if (isset($GLOBALS['meta']['INDEX_elements_associes'])){
+		$INDEX_elements_associes = unserialize($GLOBALS['meta']['INDEX_elements_associes']);
+		if (!isset($INDEX_elements_associes['spip_evenements'])){
+			$INDEX_elements_associes['spip_evenements'] = array('titre'=>2,'descriptif'=>1);
+			ecrire_meta('INDEX_elements_associes',serialize($INDEX_elements_associes));
+			ecrire_metas();
+		}
+	}
+}
+
+function article_editable($id_article){
+	$flag_editable = false;
+	global $connect_id_auteur, $id_secteur; 
+
+ 	$id_parent = intval($id_parent);
+ 	if (!($id_article=intval($id_article)))
+ 		return false;
+
+	if ($row = spip_fetch_array(spip_query("SELECT statut, titre, id_rubrique FROM spip_articles WHERE id_article=".spip_abstract_quote($id_article)))) {
+		$statut_article = $row['statut'];
+		$titre_article = $row['titre'];
+		$id_rubrique = $row['id_rubrique'];
+		$statut_rubrique = acces_rubrique($id_rubrique);
+		if ($titre_article=='') $titre_article = _T('info_sans_titre');
+	}
+	else {
+		$statut_article = '';
+		$statut_rubrique = false;
+		$id_rubrique = '0';
+		if ($titre=='') $titre = _T('info_sans_titre');
+	}
+
+	$flag_auteur = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=".spip_abstract_quote($id_article)." AND id_auteur=".spip_abstract_quote($connect_id_auteur)." LIMIT 1"));
+
+	$ok_nouveau_statut = false;
+	$flag_editable = ($statut_rubrique
+		OR ($flag_auteur
+			AND ($statut_article == 'prepa'
+				OR $statut_article == 'prop' 
+				OR $statut_article == 'poubelle')));
+	return $flag_editable;
+}
+
+function Agenda_afficher_date_evenement($date_debut, $date_fin, $horaire){
+	$s = "";
+	if (($d=date("Y-m-d",$date_debut))==date("Y-m-d",$date_fin))
+	{ // meme jour
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui'){
+			$s .= " ".($hd=date("H:i",$date_debut));
+			if ($hd!=($hf=date("H:i",$date_fin)))
+				$s .= "-$hf";
+		}
+	}
+	else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin))
+	{ // meme annee et mois, jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".($hd=date("H:i",$date_debut));
+		$s .= "<br/>"._T('agenda:evenement_date_au').date(($horaire=='oui')?"d  H:i ":"d ",$date_fin);
+	}
+	else if ((date("Y",$date_debut))==date("Y",$date_fin))
+	{ // meme annee, mois et jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= "<br/>"._T('agenda:evenement_date_au').affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_fin);
+	}
+	else
+	{ // tout different
+		$s = affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= "<br/>"._T('agenda:evenement_date_au').affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_fin);
+	}
+	return $s;	
+}
+
+function Agenda_formulaire_article_afficher_evenements($id_article, $flag_editable)
+{
+	global $connect_statut, $options,$connect_id_auteur;
+	$out = "";
+
+	$les_evenements = array();
+
+	$result = spip_query( "SELECT * FROM spip_evenements AS evenements "
+	. "WHERE evenements.id_article=".spip_abstract_quote($id_article)
+	. " AND evenements.id_evenement_source=0"
+	. " GROUP BY evenements.id_evenement ORDER BY evenements.date_debut");
+
+	if (spip_num_rows($result)) {
+		$out .= "<div class='liste liste-evenements'>";
+		$out .= "<table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>";
+		$table = array();
+		while ($row = spip_fetch_array($result,SPIP_ASSOC)) {
+			$vals = array();
+			$id_evenement = $row['id_evenement'];
+			$titre = typo($row['titre']);
+			$descriptif = typo($row['descriptif']);
+			$horaire = $row['horaire'];
+			$date_debut = strtotime($row['date_debut']);
+			$date_fin = strtotime($row['date_fin']);
+			$id_evenement_source = $row['id_evenement_source'];
+			$repetition = ($id_evenement_source!=0);
+			
+			$les_evenements[] = $id_evenement;
+
+			$s = "<a href='".generer_url_ecrire('calendrier',"id_evenement=$id_evenement&ajouter_id_article=$id_article")."'>";
+			$s .= http_img_pack("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-12.png",'', "border='0'", _T('agenda:titre_sur_l_agenda'));
+			$s .= "</a>";
+			$vals[] = $s;
+
+			$s = Agenda_afficher_date_evenement($date_debut,$date_fin, $horaire);
+			$s_rep = "";
+			$count_rep = 0;
+			$res2 = spip_query("SELECT * FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($id_evenement)." ORDER BY date_debut");
+			while ($row2 = spip_fetch_array($res2)){
+				$s_rep .= Agenda_afficher_date_evenement(strtotime($row2['date_debut']),strtotime($row2['date_fin']),$row2['horaire'])."<br/>";
+				$count_rep++;
+			}
+			if (strlen($s_rep)){
+				$s .= "<br/>".bouton_block_invisible("repetitions_evenement_$id_evenement");
+				$s .= "$count_rep ". _T('agenda:evenement_repetitions');
+				$s .= debut_block_invisible("repetitions_evenement_$id_evenement");
+				$s .= $s_rep;
+				$s .= fin_block();
+			}
+
+			$vals[] = $s;
+
+			
+			if ($flag_editable) {
+				$url = self();
+				$url = parametre_url($url,'id_article',$id_article);
+				$url = parametre_url($url,'id_evenement',$id_evenement);
+				$url = parametre_url($url,'edit',1);
+				$s = "<a href='$url'>".($titre ? $titre : '<em>('._T('info_sans_titre').')</em>')."</a>";
+				$vals[] = $s;
+			}
+			else{
+				$vals[] = $titre;
+			}
+			$vals[] = propre($descriptif);
+		
+			if ($flag_editable) {
+				$vals[] =  "<a href='" . generer_url_ecrire("articles","id_article=$id_article&supp_evenement=$id_evenement#agenda") . "'>"._T('agenda:lien_retirer_evenement')."&nbsp;". http_img_pack('croix-rouge.gif', "X", "width='7' height='7' border='0' align='middle'") . "</a>";
+			} else {
+				$vals[] = "";
+			}
+			
+			$table[] = $vals;
+		}
+	
+		$largeurs = array('', '', '', '', '');
+		$styles = array('arial11', 'arial11', 'arial2', 'arial11', 'arial11');
+		$out .= afficher_liste($largeurs, $table, $styles, false);
+	
+		$out .= "</table></div>\n";
+	
+		$les_evenements = join(',', $les_evenements);
+	}
+	return array($out,$les_evenements) ;
+}
+
+
+//
+// Liste des evenements agenda de l'article
+//
+
+function Agenda_formulaire_article_ajouter_evenement($id_article, $les_evenements, $flag_editable){
+  global $spip_lang_left, $spip_lang_right, $options;
+	global $connect_statut, $options,$connect_id_auteur, $couleur_claire ;
+	$id_evenement = intval(_request('id_evenement'));
+	$edit = _request('edit');
+
+	$out = "";
+	$out .= "<div style='clear: both;'></div>";
+	if ($flag_editable){
+		if ((in_array($id_evenement,explode(",",$les_evenements)) && $edit==1)||_request('neweven'))
+			$out .=  debut_block_visible("evenementsarticle");
+		else
+			$out .=  debut_block_invisible("evenementsarticle");
+		
+		$out .=  "<div style='width:100%;'>";
+		$out .=  "<table width='100%'>";
+		$out .=  "<tr>";
+		$out .=  "<td>";
+	
+		$out .=  generer_url_post_ecrire("articles", "id_article=$id_article");
+		if (in_array($id_evenement,explode(",",$les_evenements)) && $edit==1){
+			$out .=  "<span class='verdana1'><strong>"._T('agenda:titre_cadre_modifier_evenement')."&nbsp; </strong></span>\n";
+		} else {
+			$out .=  "<span class='verdana1'><strong>"._T('agenda:titre_cadre_ajouter_evenement')."&nbsp; </strong></span>\n";
+		}
+		$out .=  "<div><input type='hidden' name='id_article' value=\"$id_article\">";
+
+		if (in_array($id_evenement,explode(",",$les_evenements)) && $edit==1){
+			$out .= Agenda_formulaire_edition_evenement($id_evenement, false);
+			$out .= "</div>";
+			$out .=  "</td></tr></table>";
+			$out .= "<div style='clear: both;'></div>";
+			$url = parametre_url(self(),'edit','');
+			$url = parametre_url($url,'neweven','1');
+			$url = parametre_url($url,'id_evenement','');
+			$out .= icone_horizontale(_T("agenda:icone_creer_evenement"),$url , "../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", "creer.gif",false);
+		}
+		else{
+			// recuperer le titre de l'article pour le mettre par defaut sur l'evenement
+			$titre_defaut = "";
+			$res = spip_query("SELECT titre FROM spip_articles where id_article=".spip_abstract_quote($id_article));
+			if ($row = spip_fetch_array($res))
+				$titre_defaut = $row['titre'];
+			
+			$out .= Agenda_formulaire_edition_evenement(NULL, true, '', $titre_defaut);
+			$out .= "</div>";
+			$out .=  "</td></tr></table>";
+		}
+
+		$out .= "</div>";
+		$out .=  fin_block();
+	}
+	return $out;
+}
+
+function Agenda_formulaire_article($id_article, $flag_editable){
+
+  global $spip_lang_left, $spip_lang_right, $options;
+	global $connect_statut, $options,$connect_id_auteur, $couleur_claire ;
+	
+	$out = "";
+	$out .= "<a name='agenda'></a>";
+	if ($flag_editable) {
+		$out .= Agenda_action_formulaire_article($id_article);
+		if (_request('edit')||_request('neweven'))
+			$bouton = bouton_block_visible("evenementsarticle");
+		else
+			$bouton = bouton_block_invisible("evenementsarticle");
+	}
+
+	$out .= debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", true, "", $bouton._T('agenda:texte_agenda')
+	." <a href='".generer_url_ecrire('calendrier',"ajouter_id_article=$id_article")."'>"._T('icone_calendrier')."</a>");
+
+	//
+	// Afficher les evenements
+	//
+
+	list($s,$les_evenements) = Agenda_formulaire_article_afficher_evenements($id_article, $flag_editable);
+	$out .= $s;
+	//
+	// Ajouter un evenements
+	//
+
+	if ($flag_editable)
+		$out .= Agenda_formulaire_article_ajouter_evenement($id_article, $les_evenements, $flag_editable);
+
+
+	$out .= fin_cadre_enfonce(true);
+	return $out;
+}
+
+
+function Agenda_action_update_repetitions($id_evenement,$repetitions,$liste_mots){
+	// evenement source
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+	if ($row = spip_fetch_array(($res))){
+		$titre = $row['titre'];
+		$descriptif = $row['descriptif'];
+		$horaire = $row['horaire'];
+		$lieu = $row['lieu'];
+		$date_debut = strtotime($row['date_debut']);
+		$date_fin = strtotime($row['date_fin']);
+		$duree = $date_fin - $date_debut;
+		$id_evenement_source = $row['id_evenement_source'];
+		$id_article = $row['id_article'];
+		if ($id_evenement_source!=0)
+			return; // pas un evenement source donc rien a faire ici
+
+		$repetitions_updated = array();
+		// mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu
+		$res = spip_query("SELECT id_evenement FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($id_evenement));
+		while ($row = spip_fetch_array($res)){
+			$date = strtotime(date('Y-m-d',$row['date_debut']));
+			if (in_array($date,$repetitions)){
+				// il est maintenu, on l'update
+				$repetitions_updated[] = $date;
+				$update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
+				$update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
+				
+				// TODO : prendre en charge la mise a jour uniquement si conforme a l'original
+				$update_titre = $titre;
+				$update_descriptif = $descriptif;
+				$update_lieu = $lieu;
+				
+				// mettre a jour l'evenement
+				$res=spip_query("UPDATE spip_evenements SET `titre`=".spip_abstract_quote($update_titre)
+				. ",`descriptif`=".spip_abstract_quote($update_descriptif)
+				. ",`lieu`=".spip_abstract_quote($update_lieu)
+				. ",`horaire`=".spip_abstract_quote($horaire)
+				. ",`date_debut`=".spip_abstract_quote($update_date_debut)
+				. ",`date_fin`=".spip_abstract_quote($update_date_fin)
+				. ",`id_article`=".spip_abstract_quote($id_article)
+				. " WHERE `id_evenement` =".spip_abstract_quote($row['id_evenement']));
+				Agenda_action_update_liste_mots($row['id_evenement'],$liste_mots);
+			}
+			else {
+				// il est supprime
+				spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".$row['id_evenement']);
+				spip_query("DELETE FROM spip_evenements WHERE id_evenement=".$row['id_evenement']);
+			}
+			
+		}
+		// regarder les repetitions a ajouter
+		foreach($repetitions as $date){
+			if (!in_array($date,$repetitions_updated)){
+				$update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
+				$update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
+				$update_titre = $titre;
+				$update_descriptif = $descriptif;
+				$update_lieu = $lieu;
+
+				$id_evenement_new = spip_abstract_insert("spip_evenements",
+					"(id_evenement_source,maj)",
+					"(".spip_abstract_quote($id_evenement).",NOW())");
+				if ($id_evenement_new==0)
+					spip_log("agenda action formulaire article : impossible d'ajouter un evenement repete");
+				else {
+					// mettre a jour l'evenement
+					$res=spip_query("UPDATE spip_evenements SET `titre`=".spip_abstract_quote($update_titre)
+					. ",`descriptif`=".spip_abstract_quote($update_descriptif)
+					. ",`lieu`=".spip_abstract_quote($update_lieu)
+					. ",`horaire`=".spip_abstract_quote($horaire)
+					. ",`date_debut`=".spip_abstract_quote($update_date_debut)
+					. ",`date_fin`=".spip_abstract_quote($update_date_fin)
+					. ",`id_article`=".spip_abstract_quote($id_article)
+					. " WHERE `id_evenement` =".spip_abstract_quote($id_evenement_new));
+					
+					Agenda_action_update_liste_mots($id_evenement_new,$liste_mots);
+				}
+			}
+		}
+	}
+}
+function Agenda_action_supprime_repetitions($supp_evenement){
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($supp_evenement));
+	while ($row = spip_fetch_array($res)){
+		$id_evenement = $row['id_evenement'];
+		spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+		spip_query("DELETE FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement));
+	}
+}
+
+function Agenda_action_update_liste_mots($id_evenement,$liste_mots){
+	// suppression des mots obsoletes
+	$cond_in = "";
+	if (count($liste_mots))
+		$cond_in = "AND " . calcul_mysql_in('id_mot', implode(",",$liste_mots), 'NOT');
+	spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement)." ".$cond_in);
+	// ajout/maj des nouveaux mots
+	foreach($liste_mots as $id_mot){
+		if (!spip_fetch_array(spip_query("SELECT * FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($id_evenement)." AND id_mot=".spip_abstract_quote($id_mot))))
+			spip_query("INSERT INTO spip_mots_evenements (id_mot,id_evenement) VALUES (".spip_abstract_quote($id_mot).",".spip_abstract_quote($id_evenement).")");
+	}
+}
+
+
+function Agenda_action_formulaire_article($id_article){
+	include_spip('base/abstract_sql');
+	// s'assurer que les tables sont crees
+	Agenda_install();
+	// gestion des requetes de mises à jour dans la base
+	$id_evenement = intval(_request('id_evenement'));
+	$insert = _request('evenement_insert');
+	$modif = _request('evenement_modif');
+	$supp_evenement = intval(_request('supp_evenement'));
+
+	if (($insert || $modif)&&(!$supp_evenement)){
+	
+		if ( ($insert) && (!$id_evenement) ){
+			$id_evenement = spip_abstract_insert("spip_evenements",
+				"(id_evenement_source,maj)",
+				"('0',NOW())");
+			if ($id_evenement==0){
+				spip_log("agenda action formulaire article : impossible d'ajouter un evenement");
+				return;
+			}
+	 	}
+	 	if ($id_article){
+			// mettre a jour le lien evenement-article
+			spip_query("UPDATE spip_evenements SET id_article=".spip_abstract_quote($id_article)." WHERE id_evenement=".spip_abstract_quote($id_evenement));
+	 	}
+		$titre = _request('evenement_titre');
+		$descriptif = _request('evenement_descriptif');
+		$lieu = _request('evenement_lieu');
+		$horaire = _request('evenement_horaire');
+		if ($horaire!='oui') $horaire='non';
+	
+		// pour les cas ou l'utilisateur a saisi 29-30-31 un mois ou ca n'existait pas
+		$maxiter=4;
+		$st_date_deb=FALSE;
+		$jour_debut=_request('jour_evenement_debut');
+		// test <= car retour strtotime retourne -1 ou FALSE en cas d'echec suivant les versions
+		while(($st_date_deb<=FALSE)&&($maxiter-->0)) {
+			$date_deb=_request('annee_evenement_debut').'-'._request('mois_evenement_debut').'-'.($jour_debut--)
+				.' '._request('heure_evenement_debut').':'._request('minute_evenement_debut');
+			$st_date_deb=strtotime($date_deb);
+		}
+		$date_deb=format_mysql_date(date("Y",$st_date_deb),date("m",$st_date_deb),date("d",$st_date_deb),date("H",$st_date_deb),date("i",$st_date_deb), $s=0);
+	
+		// pour les cas ou l'utilisateur a saisi 29-30-31 un mois ou ca n'existait pas
+		$maxiter=4;
+		$st_date_fin=FALSE;
+		$jour_fin=_request('jour_evenement_fin');
+		// test <= car retour strtotime retourne -1 ou FALSE en cas d'echec suivant les versions
+		while(($st_date_fin<=FALSE)&&($maxiter-->0)) {
+			$st_date_fin=_request('annee_evenement_fin').'-'._request('mois_evenement_fin').'-'.($jour_fin--)
+				.' '._request('heure_evenement_fin').':'._request('minute_evenement_fin');
+			$st_date_fin=strtotime($st_date_fin);
+		}
+		$st_date_fin = max($st_date_deb,$st_date_fin);
+		$date_fin=format_mysql_date(date("Y",$st_date_fin),date("m",$st_date_fin),date("d",$st_date_fin),date("H",$st_date_fin),date("i",$st_date_fin), $s=0);
+	
+		// mettre a jour l'evenement
+		$res=spip_query("UPDATE spip_evenements SET `titre`=".spip_abstract_quote($titre)
+		. ",`descriptif`=".spip_abstract_quote($descriptif)
+		. ",`lieu`=".spip_abstract_quote($lieu)
+		. ",`horaire`=".spip_abstract_quote($horaire)
+		. ",`date_debut`=".spip_abstract_quote($date_deb)
+		. ",`date_fin`=".spip_abstract_quote($date_fin)
+		. " WHERE `id_evenement` =".spip_abstract_quote($id_evenement));
+
+		// les mots cles : par groupes
+		$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+		$liste_mots = array();
+		while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+			$id_groupe = $row['id_groupe'];
+			$id_mot_a = _request("evenement_groupe_mot_select_$id_groupe"); // un array
+			if (is_array($id_mot_a) && count($id_mot_a)){
+				if ($row['unseul']=='oui')
+					$liste_mots[] = intval(reset($id_mot_a));
+				else 
+					foreach($id_mot_a as $id_mot)
+						$liste_mots[] = intval($id_mot);
+			}				
+		}
+
+		Agenda_action_update_liste_mots($id_evenement,$liste_mots);
+				
+		// gestion des repetitions
+		if (($repetitions = _request('selected_date_repetitions'))!=NULL){
+			$repetitions = explode(',',$repetitions);
+			$rep = array();
+			foreach($repetitions as $key=>$date){
+				if (preg_match(",[0-9][0-9]?/[0-9][0-9]?/[0-9][0-9][0-9][0-9],",$date)){
+					$date = explode('/',$date);
+					$date = $date[2]."/".$date[0]."/".$date[1];
+					$date = strtotime($date);
+				}
+				else {
+					$date = preg_replace(",[0-2][0-9]:[0-6][0-9]:[0-6][0-9]\s*(UTC|GMT)(\+|\-)[0-9]{4},","",$date);
+					$date = explode(' ',$date);
+					$date = strtotime($date[2]." ".$date[1]." ".$date[3]);
+				}
+				if (!in_array($date,$repetitions))
+					$rep[] = $date;
+			}
+			$repetitions = $rep;
+		}
+		else 
+			$repetitions = array();
+		Agenda_action_update_repetitions($id_evenement, $repetitions, $liste_mots);
+	}
+	else if ($supp_evenement){
+		$id_article = intval(_request('id_article'));
+
+		if (!$id_article)
+			$id_article = intval(_request('ajouter_id_article'));
+		$res = spip_query("SELECT * FROM spip_evenements WHERE id_article=".spip_abstract_quote($id_article)." AND id_evenement=".spip_abstract_quote($supp_evenement));
+		if ($row = spip_fetch_array($res)){
+			spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".spip_abstract_quote($supp_evenement));
+			spip_query("DELETE FROM spip_evenements WHERE id_evenement=".spip_abstract_quote($supp_evenement));
+		}
+		Agenda_action_supprime_repetitions($supp_evenement);
+	}
+	return "";
+}
+
+
+function Agenda_formulaire_edition_evenement($id_evenement, $neweven, $ndate="", $titre_defaut=""){
+	global $spip_lang_right;
+	$out = "";
+
+	// inits
+	$ftitre=$titre_defaut;
+	$flieu='';
+	$fdescriptif='';
+	$fstdatedeb=time();
+	$fhoraire = 'oui';
+	if (($neweven)&&($ndate)){
+		$newdate=urldecode($ndate);
+		$test=strtotime($newdate);
+		if ($test>0)
+			$fstdatedeb=$test;
+	}
+	$fstdatefin=$fstdatedeb+60*60;
+
+	if ($id_evenement!=NULL){
+		$res = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement=".spip_abstract_quote($id_evenement));
+		if ($row = spip_fetch_array($res)){
+			if (!$neweven){
+				$fid_evenement=$row['id_evenement'];
+				$ftitre=entites_html($row['titre']);
+				$flieu=entites_html($row['lieu']);
+				$fhoraire=entites_html($row['horaire']);
+				$fdescriptif=entites_html($row['descriptif']);
+				$fstdatedeb=strtotime($row['date_debut']);
+				$fstdatefin=strtotime($row['date_fin']);
+			}
+	 	}
+	}
+
+	$url=self();
+	$url=parametre_url($url,'edit','');
+	$url=parametre_url($url,'neweven','');
+	$url=parametre_url($url,'ndate','');
+	$url=parametre_url($url,'id_evenement','');
+
+	$out .= "<div class='agenda-visu-evenement'>";
+
+	$ajouter_id_article = _request('ajouter_id_article');
+	if ($ajouter_id_article && !_request('id_article')){
+		$res2 = spip_query("SELECT * FROM spip_articles AS articles WHERE id_article=".spip_abstract_quote($ajouter_id_article));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div class='article-evenement'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html($row2['titre'])."</a>";
+			$out .= "</div>\n";
+		}
+	}
+	
+	$out .= "<div class='agenda-visu-evenement-bouton-fermer'>";
+  $out .=	"<a href='$url'><img src='"._DIR_PLUGIN_AGENDA."/img_pack/croix.png' width='12' height='12' style='border:none;'></a>";
+  $out .= "</div>\n";
+  $out .=  "<form name='edition_evenement' action='$url' method='post'>";
+  #$out .=  "<input type='hidden' name='redirect' value='$url' />\n";
+	if (!$neweven){
+	  $out .=  "<input type='hidden' name='id_evenement' value='$fid_evenement' />\n";
+	  $out .=  "<input type='hidden' name='evenement_modif' value='1' />\n";
+	}
+	else {
+	  $out .=  "<input type='hidden' name='evenement_insert' value='1' />\n";
+	}
+	
+	// TITRE
+	$out .=  "<div class='titre-titre'>"._T('agenda:evenement_titre')."</div>\n";
+	$out .=  "<div class='titre-visu'>";
+	$out .=  "<input type='text' name='evenement_titre' value=\"$ftitre\" style='width:100%;' />";
+	$out .=  "</div>\n";
+
+	// LIEU
+	$out .=  "<div class='lieu-titre'>"._T('agenda:evenement_lieu')."</div>";
+	$out .=  "<div class='lieu-visu'>";
+	$out .=  "<input type='text' name='evenement_lieu' value=\"$flieu\" style='width:100%;' />";
+	$out .=  "</div>\n";
+
+	// Horaire
+	$out .=  "<div class='horaire-titre'>";
+	$out .=  "<input type='checkbox' name='evenement_horaire' value='oui' ";
+	$out .= ($fhoraire=='oui'?"checked='checked' ":"");
+	$out .= " onClick=\"var element =  findObj('evenement_horaire');var choix = element.checked;
+	if (choix==true){	setvisibility('afficher_horaire_debut_evenement', 'visible');setvisibility('afficher_horaire_fin_evenement', 'visible');}
+	else{setvisibility('afficher_horaire_debut_evenement', 'hidden');setvisibility('afficher_horaire_fin_evenement', 'hidden');}\"";
+	$out .= "/>";
+	$out .= _T('agenda:evenement_horaire')."</div>";
+
+	// DATES
+	$out .=  "<div class='date-titre'>"._T('agenda:evenement_date')."</div>";
+	$out .=  "<div class='date-visu'>";
+	$out .=  _T('agenda:evenement_date_de');
+	$out .= WCalendar_controller($d=date('Y-m-d H:i:s',$fstdatedeb),"_evenement_debut");
+	$out .= "<span class='agenda_".($fhoraire=='oui'?"":"in")."visible_au_chargement' id='afficher_horaire_debut_evenement'>";
+	$out .=  _T('agenda:evenement_date_a_immediat');
+	$out .= Agenda_heure_selector($d,"_debut");
+	$out .=	"</span>";
+	$out .=  "<br/>";
+	$out .=  _T('agenda:evenement_date_au');
+	$out .= WCalendar_controller($d=date('Y-m-d H:i:s',$fstdatefin),"_evenement_fin");
+	$out .= "<span class='agenda_".($fhoraire=='oui'?"":"in")."visible_au_chargement' id='afficher_horaire_fin_evenement'>";
+	$out .=  _T('agenda:evenement_date_a_immediat');
+	$out .= Agenda_heure_selector($d,"_fin");
+	$out .=	"</span>";
+	$out .=  "</div>\n";
+	
+	// DESCRIPTIF
+	$out .=  "<div class='descriptif-titre'>"._T('agenda:evenement_descriptif')."</div>";
+	$out .=  "<div class='descriptif-visu'>";
+	$out .=  "<textarea name='evenement_descriptif' style='width:100%;' rows='3'>";
+	$out .=  $fdescriptif;
+	$out .=  "</textarea>\n";
+	$out .=  "</div>\n";
+
+	// MOTS CLES : chaque groupe de mot cle attribuable a un evenement agenda
+	// donne un select
+	$out .=  "<div class='agenda_mots_cles'>";
+	$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+	while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+		$id_groupe = $row['id_groupe'];
+		$multiple = ($row['unseul']=='oui')?"size='4'":"multiple='multiple' size='4'";
+		
+		$id_mot_select = array();
+		if ($id_evenement){
+			$res2 = spip_query("SELECT mots_evenements.id_mot FROM spip_mots_evenements AS mots_evenements
+								LEFT JOIN spip_mots AS mots ON mots.id_mot=mots_evenements.id_mot 
+								WHERE mots.id_groupe=".spip_abstract_quote($id_groupe)." AND mots_evenements.id_evenement=".spip_abstract_quote($id_evenement));
+			while ($row2 = spip_fetch_array($res2))
+				$id_mot_select[] = $row2['id_mot'];
+		}
+
+		$nb_mots = 0;
+		$select = "";	
+		$select .= "<select name='evenement_groupe_mot_select_{$id_groupe}[]' class='fondl verdana1 agenda_mot_cle_select' $multiple>\n";
+		$select .= "\n<option value='x' style='font-variant: small-caps;' >".supprimer_numero($row['titre'])."</option>";
+
+		$res2= spip_query("SELECT * FROM spip_mots WHERE id_groupe=".spip_abstract_quote($id_groupe)." ORDER BY titre");
+		while ($row2 = spip_fetch_array($res2,SPIP_ASSOC)){
+			$id_mot = $row2['id_mot'];
+			$titre = $row2['titre'];
+			$select .= my_sel($id_mot, "&nbsp;&nbsp;&nbsp;$titre", in_array($id_mot,$id_mot_select)?$id_mot:0);
+			$nb_mots++;
+		}
+		$select .= "</select>\n";
+		if ($nb_mots)
+			$out .= $select;
+	}
+	$out .=  "</div>";
+	
+	$dates = "";
+	if ($id_evenement!=NULL){
+		$dates = array();
+		$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement_source=".spip_abstract_quote($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$dates[] = date('m/d/Y',strtotime($row['date_debut']));
+		}
+		$dates = implode(",",$dates);
+	}
+	$out .= "<div class='repetitions-calendrier'>";
+	$out .= WCalendar_statique_point_entree('_repetitions',$dates);
+	$out .= "</div>";
+	
+  $out .=  "<div class='edition-bouton'>";
+  #echo "<input type='submit' name='submit' value='Annuler' />";
+	if ($neweven==1){
+		$out .=	"<div style='text-align:$spip_lang_right'><input type='submit' name='ajouter' value='"._T('bouton_ajouter')."' class='fondo' onclick='javascript:getSelectedDate_repetitions()'></div>";
+	}
+	else{
+		$out .=	"<div style='text-align:$spip_lang_right'><input type='submit' name='ajouter' value='"._T('bouton_enregistrer')."' class='fondo' onclick='javascript:getSelectedDate_repetitions()'></div>";
+	}
+	$out .=  "</div>\n";
+
+	// feature desactivee pour le moment
+	// $out .= "<script type='text/javascript' src='"._DIR_PLUGIN_AGENDA."/img_pack/multiselect.js'></script>";
+
+  $out .=  "</div>";
+
+	$out .=  "</form>";
+	$out .=  "</div>\n";
+	return $out;
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_en.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_en.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_en.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Escape',
+'activite_editoriale' => 'Editorial activity',
+'ajouter_un_evenement' => 'add one event to this article',
+'texte_agenda' => 'DIARY',
+'titre_cadre_ajouter_evenement' => 'Add one event',
+'titre_cadre_modifier_evenement' => 'Modify one event',
+'item_mots_cles_association_evenements' => 'to those events',
+'info_un_evenement' => 'one event',
+'info_nombre_evenements' => '@nb_evenements@ events',
+'info_evenements' => 'Events',
+'evenements' => 'Events',
+'evenement_titre' => 'Title',
+'evenement_descriptif' => 'Description',
+'evenement_lieu' => 'Location',
+'evenement_date' => 'Date',
+'evenement_date_de' => 'From ',
+'evenement_date_du' => 'From ',
+'evenement_date_a' => 'to ',
+'evenement_date_au' => 'To ',
+'evenement_date_a_immediat' => 'at ',
+'evenement_date_debut' => 'Starting date',
+'evenement_date_fin' => 'Ending date',
+'lien_retirer_evenement' => 'Deleted ',
+'evenement_horaire' => 'Schedule',
+'titre_sur_l_agenda' => "On diary",
+'icone_creer_evenement' => 'Generate a new event',
+'evenement_repetitions' => 'Repetition',
+'repetition_de' => "Repetition of",
+'sans_titre' => "(without title)",
+'evenement_autres_occurences' => "Other occurences :",
+'bouton_supprimer' => "Delete",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_es.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_es.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Anular',
+'activite_editoriale' => 'Actividad editorial',
+'ajouter_un_evenement' => 'Añadir un evento a éste artículo',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Añadir un evento',
+'titre_cadre_modifier_evenement' => 'Modificar un evento',
+'item_mots_cles_association_evenements' => 'a los eventos',
+'info_un_evenement' => 'un evento,',
+'info_nombre_evenements' => '@nb_evenements@ eventos,',
+'info_evenements' => 'Eventos',
+'evenements' => 'Eventos',
+'evenement_titre' => 'Titulo',
+'evenement_descriptif' => 'Descripción',
+'evenement_lieu' => 'Lugar',
+'evenement_date' => 'Fecha',
+'evenement_date_de' => 'De ',
+'evenement_date_du' => 'Del ',
+'evenement_date_a' => 'a las ',
+'evenement_date_au' => 'Hasta ',
+'evenement_date_a_immediat' => 'a las ',
+'evenement_date_debut' => 'Fecha de comienzo',
+'evenement_date_fin' => 'Fecha de fin',
+'lien_retirer_evenement' => 'Suprimir',
+'evenement_horaire' => 'Horario',
+'titre_sur_l_agenda' => "Sobre la agenda",
+'icone_creer_evenement' => 'Creación de un nuevo evento',
+'evenement_repetitions' => 'Repeticiones',
+'repetition_de' => "Repetición de",
+'sans_titre' => "(con título)",
+'evenement_autres_occurences' => "Otras ocurrencias :",
+'bouton_supprimer' => "Suprimir",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_fr.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Annuler',
+'activite_editoriale' => 'Activit&eacute; &Eacute;ditoriale',
+'ajouter_un_evenement' => 'ajouter un &eacute;v&eacute;nement &agrave; cet article',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Ajouter un &eacute;v&eacute;nement',
+'titre_cadre_modifier_evenement' => 'Modifier un &eacute;v&eacute;nement',
+'item_mots_cles_association_evenements' => 'aux &eacute;v&eacute;nements',
+'info_un_evenement' => 'un &eacute;v&eacute;nement,',
+'info_nombre_evenements' => '@nb_evenements@ &eacute;v&eacute;nements,',
+'info_evenements' => '&Eacute;v&eacute;nements',
+'evenements' => '&Eacute;v&eacute;nements',
+'evenement_titre' => 'Titre',
+'evenement_descriptif' => 'Descriptif',
+'evenement_lieu' => 'Lieu',
+'evenement_date' => 'Date',
+'evenement_date_de' => 'De ',
+'evenement_date_du' => 'Du ',
+'evenement_date_a' => '&agrave; ',
+'evenement_date_au' => 'Au ',
+'evenement_date_a_immediat' => '&agrave; ',
+'evenement_date_debut' => 'Date de d&eacute;but',
+'evenement_date_fin' => 'Date de fin',
+'lien_retirer_evenement' => 'Supprimer',
+'evenement_horaire' => 'Horaire',
+'titre_sur_l_agenda' => "Sur l'agenda",
+'icone_creer_evenement' => 'Cr&eacute;er un nouvel &eacute;v&eacute;nement',
+'evenement_repetitions' => 'R&eacute;p&eacute;titions',
+'repetition_de' => "R&eacute;p&eacute;tition de",
+'sans_titre' => "(sans titre)",
+'evenement_autres_occurences' => "Autres occurences :",
+'bouton_supprimer' => "Supprimer",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_nl.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_nl.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/lang/agenda_nl.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Annuleren',
+'activite_editoriale' => 'Hoofdactiviteit',
+'ajouter_un_evenement' => 'een gebeurtenis toevoegen aan dit artikel',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Een gebeurtenis toevoegen',
+'titre_cadre_modifier_evenement' => 'Een gebeurtenis wijzigen',
+'item_mots_cles_association_evenements' => 'aan de gebeurtenissen',
+'info_un_evenement' => 'een gebeurtenis,',
+'info_nombre_evenements' => '@nb_gebeurtenis@ gebeurtenissen,',
+'info_evenements' => 'Gebeurtenissen',
+'evenements' => 'Gebeurtenissen',
+'evenement_titre' => 'Titel',
+'evenement_descriptif' => 'Beschrijvend',
+'evenement_lieu' => 'Plaats',
+'evenement_date' => 'Date',
+'evenement_date_de' => 'Van ',
+'evenement_date_du' => 'Van ',
+'evenement_date_a' => 'tot ',
+'evenement_date_au' => 'Tot ',
+'evenement_date_a_immediat' => 'om ',
+'evenement_date_debut' => 'Aanvangsdatum',
+'evenement_date_fin' => 'Einddatum',
+'lien_retirer_evenement' => 'Afschaffen',
+'evenement_horaire' => 'Dienstregeling',
+'titre_sur_l_agenda' => "Op de agenda",
+'icone_creer_evenement' => 'Een nieuwe gebeurtenis creëren',
+'evenement_repetitions' => 'Herhalingen',
+'repetition_de' => "Herhaling van",
+'sans_titre' => "(zonder titel)",
+'evenement_autres_occurences' => "Andere omstandigheden :",
+'bouton_supprimer' => "Afschaffen",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/plugin.xml	(revision 30)
@@ -0,0 +1,67 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	<multi>Agenda pour SPIP 1.9.1 [en] Agenda for SPIP 1.9.1</multi>
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	Cedric MORIN
+ 	[notre-ville.net->http://www.notre-ville.net]
+_ &copy; 2006 - Licence GPL
+	</auteur>
+	<version>
+	0.12
+	</version>
+	<etat>
+	stable
+	</etat>
+	<description>
+<multi>
+	Agenda Ev&#233;nementiel
+_ {{Ce plugin n&#233;cessite le plugin Widget Calendar}}
+[en]
+Event Agenda
+_ {{This plugin needs the Widget Calendar plugin}}
+</multi>
+	</description>
+	<lien>http://www.spip-contrib.net/article1396.html</lien> <!-- URI de documentation -->
+	<options> <!-- fichier charge a chaque hit -->
+	agenda_mes_options.php
+	</options>
+	<fonctions> <!-- fichier charge a chaque recalcul -->
+	agenda_mes_fonctions.php
+	</fonctions>
+	<!-- classe d'implementation : espace de nommage qui prefixera les appels de fonction
+	sur le mode Rien::
+	ainsi les fonctions hors espace de nommage ne peuvent etre appelees
+	ce parametre est obligatoire et doit etre non vide
+	-->
+	<prefix> 
+	Agenda
+	</prefix>
+	<!-- Definitions des fonctions qui s'inserent dans les pipelines -->
+	<pipeline>
+		<nom>ajouter_onglets</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>exec_init</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>header_prive</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>affiche_milieu</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>agenda_rendu_evenement</nom>
+		<action>rendu_evenement</action>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>taches_generales_cron</nom>
+	</pipeline>
+
+	<!-- Le parametre action est facultatif : en son absence la methode de la classe portant le nom du pipeline est appelee. Le parametre inclure est facultatif.	-->
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/public/criteres_agenda.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/public/criteres_agenda.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_1/public/criteres_agenda.php	(revision 30)
@@ -0,0 +1,118 @@
+<?php
+
+// {branche ?}
+// http://www.spip.net/@branche
+function critere_branche($idb, &$boucles, $crit) {
+  global $table_des_tables;
+  $not = $crit->not;
+  $boucle = &$boucles[$idb];
+  $type = $boucle->type_requete;
+  $nom = $table_des_tables[$type];
+  if ($boucle->id_table!='evenements' && $boucle->id_table!='pim_agenda')
+  	critere_branche_dist($idb, $boucles, $crit);
+  else{
+		$arg = calculer_argument_precedent($idb, 'id_rubrique', $boucles);
+		$champ = 'id_rubrique';
+
+    $type = $boucle->type_requete;
+    $nom = $table_des_tables[$type];
+    list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
+
+    $cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle);
+    if ($cle) 
+      $cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle, false);
+    if ($cle) $t = "L$cle";
+		// faire la jointure sur id_rubrique
+		
+		$c = "calcul_mysql_in('" .
+		  $t .
+		  ".id_rubrique', calcul_branche($arg), '')";
+		if ($crit->cond) $c = "($arg ? $c : 1)";
+				
+		if ($not)
+			$boucle->where[]= array("'NOT'", $c);
+		else
+			$boucle->where[]= $c;
+  }
+}
+
+function critere_agendafull_dist($idb, &$boucles, $crit)
+{
+	$params = $crit->param;
+
+	if (count($params) < 1)
+	      erreur_squelette(_T('zbug_info_erreur_squelette'),
+			       "{agenda ?} BOUCLE$idb");
+
+	$parent = $boucles[$idb]->id_parent;
+
+	// les valeurs $date et $type doivent etre connus a la compilation
+	// autrement dit ne pas etre des champs
+
+	$date_deb = array_shift($params);
+	$date_deb = $date_deb[0]->texte;
+
+	$date_fin = array_shift($params);
+	$date_fin = $date_fin[0]->texte;
+
+	$type = array_shift($params);
+	$type = $type[0]->texte;
+
+	$annee = $params ? array_shift($params) : "";
+	$annee = "\n" . 'sprintf("%04d", ($x = ' .
+		calculer_liste($annee, array(), $boucles, $parent) .
+		') ? $x : date("Y"))';
+
+	$mois =  $params ? array_shift($params) : "";
+	$mois = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($mois, array(), $boucles, $parent) .
+		') ? $x : date("m"))';
+
+	$jour =  $params ? array_shift($params) : "";
+	$jour = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($jour, array(), $boucles, $parent) .
+		') ? $x : date("d"))';
+
+	$annee2 = $params ? array_shift($params) : "";
+	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
+		calculer_liste($annee2, array(), $boucles, $parent) .
+		') ? $x : date("Y"))';
+
+	$mois2 =  $params ? array_shift($params) : "";
+	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($mois2, array(), $boucles, $parent) .
+		') ? $x : date("m"))';
+
+	$jour2 =  $params ? array_shift($params) : "";
+	$jour2 = "\n" .  'sprintf("%02d", ($x = ' .
+		calculer_liste($jour2, array(), $boucles, $parent) .
+		') ? $x : date("d"))';
+
+	$boucle = &$boucles[$idb];
+	$date = $boucle->id_table . ".$date";
+
+	if ($type == 'jour')
+		$boucle->where[]= array("'AND'", 
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m%d\')'",("$annee . $mois . $jour")),
+					array("'>='", "'DATE_FORMAT($date_fin, \'%Y%m%d\')'",("$annee . $mois . $jour")));
+	elseif ($type == 'mois')
+		$boucle->where[]= array("'AND'", 
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m\')'",("$annee . $mois")),
+					array("'>='", "'DATE_FORMAT($date_fin, \'%Y%m\')'",("$annee . $mois")));
+	elseif ($type == 'semaine')
+		$boucle->where[]= array("'AND'", 
+					array("'>='",
+					     "'DATE_FORMAT($date_fin, \'%Y%m%d\')'", 
+					      ("date_debut_semaine($annee, $mois, $jour)")),
+					array("'<='",
+					      "'DATE_FORMAT($date_deb, \'%Y%m%d\')'",
+					      ("date_fin_semaine($annee, $mois, $jour)")));
+	elseif (count($crit->param) > 3)
+		$boucle->where[]= array("'AND'",
+					array("'>='",
+					      "'DATE_FORMAT($date_fin, \'%Y%m%d\')'",
+					      ("$annee . $mois . $jour")),
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m%d\')'", ("$annee2 . $mois2 . $jour2")));
+	// sinon on prend tout
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/editer_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/editer_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/editer_evenement.php	(revision 30)
@@ -0,0 +1,46 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip("inc/agenda_gestion");
+include_spip("inc/editer_evenement");
+
+function action_editer_evenement_dist()
+{
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$securiser_action();
+	
+	$arg = explode('-',_request('arg'));
+	$id_article = $arg[0];
+	$action = $arg[1];
+	$id_evenement = $arg[2];
+	$redirect = urldecode(_request('redirect'));
+	
+	if ($action=='modifier')
+		//if (autoriser())
+		$id_evenement = Agenda_action_formulaire_article($id_article,$id_evenement);
+	elseif ($action=='supprimer')
+		//if (autoriser())
+		$id_evenement = Agenda_action_supprime_evenement($id_article,$id_evenement);
+	elseif ($action=='saisierapidecompiler'){
+		$redirect = parametre_url($redirect,'evenements_saisie_rapide',_request('evenements_saisie_rapide'),'&');
+		$id_evenement = 0;
+	}
+	elseif ($action=='saisierapidecreer'){
+		include_spip('inc/agenda_saisie_rapide');
+		$evenements_saisie_rapide = _request('evenements_saisie_rapide');
+		$t = Agenda_compile_texte_saisie_rapide($evenements_saisie_rapide);
+		foreach($t as $e){
+			$e['evenement_insert']=1;
+			Agenda_action_formulaire_article($id_article,$id_evenement,$e);
+		}
+	}
+
+	if ($redirect){
+		if ($id_evenement)
+			$redirect = parametre_url($redirect,'id_evenement',$id_evenement,'&');
+		redirige_par_entete($redirect);
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/instituer_groupe_mots.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/instituer_groupe_mots.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/instituer_groupe_mots.php	(revision 30)
@@ -0,0 +1,56 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/filtres');
+include_spip('base/abstract_sql');
+
+// http://doc.spip.org/@action_instituer_groupe_mots_dist
+function action_instituer_groupe_mots_dist()
+{
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$securiser_action();
+
+	$arg = _request('arg');
+
+	if (!preg_match(",^(-?\d+)$,", $arg, $r)) {
+		 spip_log("action_instituer_groupe_mots_dist $arg pas compris");
+	} else action_instituer_groupe_mots_post($r);
+}
+
+
+// http://doc.spip.org/@action_instituer_groupe_mots_post
+function action_instituer_groupe_mots_post($r)
+{
+	global $acces_comite, $acces_forum, $acces_minirezo, $new, $articles, $breves, $change_type, $descriptif, $id_groupe, $obligatoire, $rubriques, $syndic, $evenements, $pim_agenda, $texte, $unseul;
+
+	$id_groupe = $r[1];
+
+	if ($id_groupe < 0){
+		spip_query("DELETE FROM spip_groupes_mots WHERE id_groupe=" . (0- $id_groupe));
+	} else {
+		$change_type = (corriger_caracteres($change_type));
+		$texte = (corriger_caracteres($texte));
+		$descriptif = (corriger_caracteres($descriptif));
+
+		if ($id_groupe) {	// modif groupe
+			spip_query("UPDATE spip_mots SET type=" . _q($change_type) . " WHERE id_groupe=$id_groupe");
+
+			spip_query("UPDATE spip_groupes_mots SET titre=" . _q($change_type) . ", texte=" . _q($texte) . ", descriptif=" . _q($descriptif) . ", unseul=" . _q($unseul) . ", obligatoire=" . _q($obligatoire) . ", articles=" . _q($articles) . ", breves=" . _q($breves) . ", rubriques=" . _q($rubriques) . ", syndic=" . _q($syndic) . ", evenements=" . _q($evenements) . ", minirezo=" . _q($acces_minirezo) . ", comite=" . _q($acces_comite) . ", forum=" . _q($acces_forum) . " WHERE id_groupe=$id_groupe");
+
+		} else {	// creation groupe
+		  spip_abstract_insert('spip_groupes_mots', "(titre, texte, descriptif, unseul,  obligatoire, articles, breves, rubriques, syndic, evenements, minirezo, comite, forum)", "(" . _q($change_type) . ", " . _q($texte) . " , " . _q($descriptif) . " , " . _q($unseul) . " , " . _q($obligatoire) . " , " . _q($articles) . " ," . _q($breves) . " , " . _q($rubriques) . " , " . _q($syndic) . " , " . _q($evenements) . " , " . _q($acces_minirezo) . " ,  " . _q($acces_comite) . " , " . _q($acces_forum) . " )");
+		}
+	}
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/voir_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/voir_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/action/voir_evenement.php	(revision 30)
@@ -0,0 +1,29 @@
+<?php
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip("inc/agenda_gestion");
+include_spip("inc/editer_evenement");
+
+function action_voir_evenement_dist()
+{
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$securiser_action();
+
+	$arg = explode('-',_request('arg'));
+	$action = $arg[1];
+	$id_article = $arg[2];
+	$id_evenement = $arg[3];
+	$redirect = urldecode(_request('redirect'));
+	if ($action=='modifier'){
+		//if (autoriser())
+		$id_evenement = Agenda_action_formulaire_article($id_article,$id_evenement);
+		if ($id_evenement)
+			$redirect = parametre_url($redirect,'id_evenement',$id_evenement,'&');
+	}
+	
+	if ($redirect){
+		redirige_par_entete($redirect);
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda.php	(revision 30)
@@ -0,0 +1,94 @@
+<?php
+
+function Agenda_ajouter_onglets($flux) {
+  if($flux['args']=='calendrier')
+  {
+		$flux['data']['evenements']= new Bouton(
+																 '../'._DIR_PLUGIN_AGENDA.'/img_pack/agenda-24.png', _T('agenda:evenements'),
+																generer_url_ecrire("calendrier","type=semaine"));
+	
+		$flux['data']['editorial']= new Bouton(
+															 'cal-rv.png', _T('agenda:activite_editoriale'),
+																 generer_url_ecrire("calendrier","mode=editorial&type=semaine"));
+  }
+	return $flux;
+}
+function Agenda_header_prive($flux) {
+	$exec = _request('exec');
+	// les CSS
+	if ($exec == 'calendrier'){
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/calendrier.css" type="text/css" />'. "\n";
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/agenda.css" type="text/css" />'. "\n";
+	}
+	if ($exec == 'articles'){
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_AGENDA . '/img_pack/agenda_articles.css" type="text/css" />'. "\n";
+	}
+
+
+	return $flux;
+}
+
+function Agenda_exec_init($flux) {
+	$exec =  $flux['args']['exec'];
+	if (($exec == 'calendrier')||($exec=='articles')){
+		include_spip('inc/calendar');
+		if (!function_exists('WCalendar_ajoute_lies')){
+			echo ('Erreur Wcalendar manquant');
+			return $flux;
+		}
+		// Reserver les widgets agenda
+		WCalendar_ajoute_lies(_T('agenda:evenement_date_debut'),'_evenement_debut',_T('agenda:evenement_date_fin'),'_evenement_fin');
+		WCalendar_ajoute_statique(_T('agenda:evenement_repetitions'),'_repetitions');
+	}
+	return $flux;
+}
+
+function Agenda_affiche_milieu($flux) {
+	$exec =  $flux['args']['exec'];
+	if ($exec=='articles'){
+		include_spip('inc/calendar');
+		include_spip('inc/agenda_gestion');
+		$id_article = $flux['args']['id_article'];
+		$flux['data'] .= Agenda_formulaire_article($id_article, article_editable($id_article),'articles');
+	}
+	return $flux;
+}
+
+function Agenda_rendu_boite($titre,$descriptif,$lieu,$type='ics'){
+	$texte = "<span class='calendrier-verdana10'><span  style='font-weight: bold;'>";
+	$texte .= wordwrap($sum=typo($titre),15)."</span>";
+	$texte .= "<span class='survol'>";
+	$texte .= "<strong>$sum</strong><br />";
+	$texte .= $lieu ? propre($lieu).'<br />':'';
+	$texte .= propre($descriptif);
+	$texte .= "</span>";
+	if ($type=='ics'){	
+		$texte .= (strlen($lieu.$descriptif)?"<hr/>":"").$lieu.(strlen($lieu)?"<br/>":"");
+		$texte .= $descriptif;
+	}
+	$texte .= "</span>";
+
+	return $texte;
+}
+function Agenda_rendu_evenement($flux) {
+	global $couleur_claire;
+	$evenement = $flux['args']['evenement'];
+
+	
+	$url = $evenement['URL']; 
+	$texte = Agenda_rendu_boite($evenement['SUMMARY'],$evenement['DESCRIPTION'],$evenement['LOCATION'],$flux['args']['type']);
+	if (is_string($url))
+		$texte = http_href(quote_amp($url), $texte, '', '', '', '');
+	else if (is_array($url))
+		$texte = ajax_action_auteur(
+			$url['action'], $url['id'], $url['script'], 
+			isset($url['args'])?$url['args']:'', 
+			array($texte,""),
+			isset($url['args_ajax'])?$url['args_ajax']:'', 
+			isset($url['fct_ajax'])?$url['fct_ajax']:'');
+	
+	$flux['data'] = $texte;
+	return $flux;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_jour.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_jour.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_jour.html	(revision 30)
@@ -0,0 +1,52 @@
+<BOUCLE_jour(EVENEMENTS)
+	{agendafull date_debut, date_fin, jour, #ENV{annee}, #ENV{mois}, #ENV{jour}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 
+	calendrier-couleur[(#ENV{theme,0}|modulo{14,1})]})]</BOUCLE_jour>[(#DATE|Agenda_affiche_full{<:aucun_article:>, 'jour', 
+	calendrier-couleur[(#ENV{theme,0}|modulo{14,1})]})][(#TOTAL_BOUCLE|?{' ',''})
+<div style='position: fixed; top:50px; left: 20px'>
+<table style='width: 10px'><tr>
+<td class='calendrier-couleur1'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,0})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur2'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,1})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur3'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,2})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur4'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,3})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur5'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,4})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur6'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,5})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur7'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,6})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur8'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,7})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur9'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,8})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur10'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,9})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur11'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,10})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur12'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,11})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur13'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,12})]'>&nbsp;&nbsp;</a></td></tr>
+<tr><td class='calendrier-couleur14'
+	><a style='text-decoration: none;'
+	href='[(#SELF|parametre_url{theme,13})]'>&nbsp;&nbsp;</a></td></tr>
+</table>
+</div>
+]<//B_jour>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mes_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mes_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mes_fonctions.php	(revision 30)
@@ -0,0 +1,50 @@
+<?php
+
+//include_spip('inc/agenda_filtres'); // declaration directe dans le xml pour eviter un find_in_path
+include_spip('public/criteres_agenda');
+include_spip('inc/agenda_filtres');
+
+function Agenda_heure_selector($date,$suffixe){
+	$d = strtotime($date);
+	$heure = date('H',$d);
+	$minute = date('i',$d);
+	return
+		afficher_heure($heure, "name='heure_evenement$suffixe' size='1' class='fondl'") .
+  	afficher_minute($minute, "name='minute_evenement$suffixe' size='1' class='fondl'");
+}
+
+//
+// <BOUCLE(EVENEMENTS)>
+//
+function boucle_EVENEMENTS_dist($id_boucle, &$boucles) {
+	$boucle = &$boucles[$id_boucle];
+	$id_table = $boucle->id_table;
+	$boucle->from[$id_table] =  "spip_evenements";
+
+/* Modif Patrice : Commit SPIP 8062
+$boucle->statut devient deprecie et est remplacé par
+$boucle->modificateur['criteres']['statut']
+Il vous faut donc mettre a jour le code des boucles qui utilisent ce critere
+Pour avoir une compatibilité trans version il faut ecrire le test sous la forme :
+if ($boucle->statut OR $boucle->modificateur['criteres']['statut'])
+*/
+	$temp_statut = $boucle->statut OR $boucle->modificateur['criteres']['statut'];
+	if (!$temp_statut) {
+//	if (!$boucle->statut) {
+	// Restreindre aux elements publies
+		// Si pas de lien avec un article, selectionner
+		// uniquement les auteurs d'un article publie
+		if (!$GLOBALS['var_preview'])
+			if (!isset($boucle->modificateur['lien']) AND !isset($boucle->modificateur['tout'])
+			AND (!isset($boucle->lien) OR !$boucle->lien) AND (!isset($boucle->tout) OR !$boucle->tout)) {
+				$boucle->from["articles"] =  "spip_articles";
+				$boucle->where[]= array("'='", "'articles.id_article'", "'$id_table.id_article'");
+				$boucle->where[]= array("'='", "'articles.statut'", "'\"publie\"'");
+				$boucle->group[] = $boucle->id_table . '.' . $boucle->primary;  
+			}
+	}
+
+	return calculer_boucle($id_boucle, $boucles); 
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mes_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mes_options.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mes_options.php	(revision 30)
@@ -0,0 +1,81 @@
+<?php
+$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
+define('_DIR_PLUGIN_AGENDA',(_DIR_PLUGINS.end($p)));
+include_spip('base/agenda_evenements');
+
+function cron_agenda_nettoyer_base($t){
+	# les evenements lies a un article inexistant
+	$res = spip_query("SELECT evenements.id_evenement,evenements.id_article
+		      FROM spip_evenements AS evenements
+		        LEFT JOIN spip_articles AS articles
+		          ON evenements.id_article=articles.id_article
+		       WHERE articles.id_article IS NULL");
+	while ($row = spip_fetch_array($res,SPIP_ASSOC))
+		spip_query("DELETE FROM spip_evenements
+		WHERE id_evenement=".$row['id_evenement']
+		." AND id_article=".$row['id_article']);
+
+	# les liens de mots affectes a des evenements effaces
+	$res = spip_query("SELECT mots_evenements.id_mot,mots_evenements.id_evenement 
+		        FROM spip_mots_evenements AS mots_evenements
+		        LEFT JOIN spip_evenements AS evenements
+		          ON mots_evenements.id_evenement=evenements.id_evenement
+		       WHERE evenements.id_evenement IS NULL");
+
+	while ($row = spip_fetch_array($res,SPIP_ASSOC))
+		spip_query("DELETE FROM spip_mots_evenements
+		WHERE id_mot=".$row['id_mot']
+		." AND id_evenement=".$row['id_evenement']);
+
+	return 1;
+}
+
+function Agenda_taches_generales_cron($taches_generales){
+	$taches_generales['agenda_nettoyer_base'] = 3600*48;
+	return $taches_generales;
+}
+
+function exec_calendrier()
+{
+	$mode = _request('mode');
+	if ($mode=='editorial'){
+		include_spip('exec/calendrier');
+	  global $type, $css;
+	// icones standards, fonction de la direction de la langue
+	
+	  global $bleu, $vert, $jaune, $spip_lang_rtl;
+	  $bleu = http_img_pack("m_envoi_bleu$spip_lang_rtl.gif", 'B', "class='calendrier-icone'");
+	  $vert = http_img_pack("m_envoi$spip_lang_rtl.gif", 'V', "class='calendrier-icone'");
+	  $jaune= http_img_pack("m_envoi_jaune$spip_lang_rtl.gif", 'J', "class='calendrier-icone'");
+	
+	  $date = date("Y-m-d", time()); 
+		if ($type == 'semaine') {
+		
+			$GLOBALS['afficher_bandeau_calendrier_semaine'] = true;
+			$titre = _T('titre_page_calendrier',
+				array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+		}
+	  elseif ($type == 'jour') {
+			$titre = nom_jour($date)." ". affdate_jourcourt($date);
+	  }
+		else {
+			$titre = _T('titre_page_calendrier',
+			    array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+		}
+		
+	  $res .= debut_page($titre, "redacteurs", "calendrier","",$css);
+		$res .= barre_onglets("calendrier", "editorial");
+		$res .= "<div>&nbsp;</div>" ;
+	  $res .= http_calendrier_init('', $type, '','',generer_url_ecrire('calendrier', 'mode=editorial'.($type ? "&type=$type" : '')));
+		
+	  $res .= fin_page();
+	  echo $res;
+	}
+	else{
+		$var_f = charger_fonction('agenda_evenements');
+		$var_f();
+	}
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mois.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mois.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_mois.html	(revision 30)
@@ -0,0 +1,7 @@
+<BOUCLE_mois(EVENEMENTS)
+	{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE,
+		calendrier-couleur[(#ID_SECTEUR|
+			modulo{14,1})]})]</BOUCLE_mois>[(#DATE|
+	Agenda_affiche_full{<:aucun_article:>, 'mois'}
+)]<//B_mois>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_periode.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_periode.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_periode.html	(revision 30)
@@ -0,0 +1,8 @@
+<BOUCLE_periode(EVENEMENTS)
+	{agendafull date_debut, date_fin, periode,
+	#ENV{annee}, #ENV{mois}, #ENV{jour},
+	#ENV{annee_fin}, #ENV{mois_fin}, #ENV{jour_fin}}>[
+(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 'calendrier-couleur6'})
+]</BOUCLE_periode>[(#DATE|
+	Agenda_affiche_full{<:aucun_article:>, 'periode', 'calendrier-couleur6'}
+)]<//B_periode>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_semaine.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_semaine.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/agenda_semaine.html	(revision 30)
@@ -0,0 +1,7 @@
+<BOUCLE_semaine(EVENEMENTS)
+	{agendafull date_debut, date_fin, semaine, #ENV{annee}, #ENV{mois}, #ENV{jour}}
+>[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE,
+	[(#COMPTEUR_BOUCLE|
+		alterner{'calendrier-couleur2', 'calendrier-couleur4'})]})]</BOUCLE_semaine>[(#DATE|
+		Agenda_affiche_full{<:aucun_article:>, 'semaine', 'calendrier-couleur2','calendrier-couleur4'}
+)]<//B_semaine>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/balise/calendrier_mini.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/balise/calendrier_mini.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/balise/calendrier_mini.php	(revision 30)
@@ -0,0 +1,113 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
+
+// Pas besoin de contexte de compilation
+global $balise_CALENDRIER_MINI_collecte;
+$balise_CALENDRIER_MINI_collecte = array('id_rubrique','id_article','id_mot');
+
+function balise_CALENDRIER_MINI ($p) {
+	return calculer_balise_dynamique($p,'CALENDRIER_MINI', array('id_rubrique','id_article', 'id_mot'));
+}
+
+function balise_CALENDRIER_MINI_stat($args, $filtres) {
+	return $args;
+}
+ 
+function balise_CALENDRIER_MINI_dyn($id_rubrique=0, $id_article = 0, $id_mot = 0,$date, $var_date = 'date', $url = '') {
+	if(!$url)
+		$url = self();
+	// nettoyer l'url qui est passee par htmlentities pour raison de securités
+	$url = str_replace("&amp;","&",$url);
+
+	return array('formulaires/calendrier_mini', 0, 
+		array(
+			'date' => $date,
+			'id_rubrique' => $id_rubrique,
+			'id_article' => $id_article,
+			'id_mot' => $id_mot,
+			'var_date' => $var_date,
+			'self' => $url,
+		));
+}
+
+function agenda_mini($i) {
+  $args = func_get_args();
+  $une_date = array_shift($args); // une date comme balise
+  $sinon = array_shift($args);
+  if (!$une_date) return $sinon;
+  $type = 'mini';
+  $agenda = Agenda_memo_full(0);
+  $evt = array();
+  foreach (($args ? $args : array_keys($agenda)) as $k) {  
+      if (is_array($agenda[$k]))
+		foreach($agenda[$k] as $d => $v) { 
+		  $evt[$d] = $evt[$d] ? (array_merge($evt[$d], $v)) : $v;
+		}
+    }
+	$la_date = mktime(0, 0, 0, mois($une_date), 1, annee($une_date));
+    include_spip('inc/agenda');
+    return http_calendrier_init($la_date, $type, '', '', '', array('', $evt));
+}
+
+function http_calendrier_mini($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt) {
+	list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+
+	if ($sansduree)
+		foreach($sansduree as $d => $r) {
+			$evenements[$d] = !$evenements[$d] ? $r : 
+				 array_merge($evenements[$d], $r);
+			 }
+
+	if (!$premier_jour) $premier_jour = '01';
+	if (!$dernier_jour) {
+		$dernier_jour = 31;
+		while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
+	}
+
+	// affichage du debut de semaine hors periode
+	$ligne = '';
+	$debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
+	for ($i=$debut ? $debut : 7;$i>1;$i--) {
+		$mois_precedent = mktime(1,1,1,$mois-1,1,$annee);
+		$jour_mois_precedent = date('t', $mois_precedent)+2-$i;
+		$ligne .= "\n\t<td class=\"horsperiode\">$jour_mois_precedent</td>";
+	}
+
+	$total = '';
+	for ($j=$premier_jour; $j<=$dernier_jour; $j++) {
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour = date("d",$nom);
+		$jour_semaine = date("w",$nom);
+		$mois_en_cours = date("m",$nom);
+		$annee_en_cours = date("Y",$nom);
+		$amj = date("Y",$nom) . $mois_en_cours . $jour;
+
+		if ($jour_semaine==1) { 
+			$total .= "\n<tr>$ligne\n</tr>";
+			$ligne = '';
+		}
+
+		$evts = $evenements[$amj];
+		$class="";
+		if ($evts) {
+			$evts = "<a href='".parametre_url($evts[0]['URL'],'date',"$annee_en_cours-$mois_en_cours-$jour")."' title='".$evts[0]['SUMMARY'].
+			"'>".intval($jour)."</a>";
+			$class='occupe';
+		}
+		else {
+			$evts = intval($jour);
+			$class='libre';
+		}
+		$ligne .= "\n\t<td  class='$class".($amj == date("Ymd")?' today':'')."'>" . $evts . "\n\t</td>";
+	}
+	$jour_mois_suivant=1;
+	// affichage de la fin de semaine hors periode
+	for($j=$jour_semaine ? $jour_semaine : 7; $j<7; $j++) {
+		$ligne .= "\n\t<td class=\"horsperiode\">".$jour_mois_suivant++."</td>";			
+	}
+
+	return $total . ($ligne ? "\n<tr>$ligne\n</tr>" : '');
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/balise/formulaire_edition_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/balise/formulaire_edition_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/balise/formulaire_edition_evenement.php	(revision 30)
@@ -0,0 +1,87 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
+
+// Pas besoin de contexte de compilation
+global $balise_FORMULAIRE_EDITION_EVENEMENT_collecte;
+$balise_FORMULAIRE_EDITION_EVENEMENT_collecte = array('id_evenement','id_article');
+
+function balise_FORMULAIRE_EDITION_EVENEMENT ($p) {
+	return calculer_balise_dynamique($p,'FORMULAIRE_EDITION_EVENEMENT', array('id_evenement', 'id_article'));
+}
+
+function balise_FORMULAIRE_EDITION_EVENEMENT_stat($args, $filtres) {
+	return $args;
+}
+ 
+function balise_FORMULAIRE_EDITION_EVENEMENT_dyn($id_evenement = 0, $id_article = 0) {
+	$url = parametre_url(self(),'ajout_evenement','');
+	// nettoyer l'url qui est passee par htmlentities pour raison de securités
+	$url = str_replace("&amp;","&",$url);
+	if ($retour=='') $retour = $url;
+
+	$res = spip_query("SELECT * FROM spip_articles WHERE id_article="._q($id_article));
+	if (!spip_num_rows($res)) return;
+
+	$flag_modif = (_request('evenement_modif') && _request('id_evenement') == $id_evenement);
+	$flag_ajout = _request('evenement_insert');
+	$flag_supp = _request('supp_evenement')!==NULL;
+	if ($flag_supp) {
+		$_GET['supp_evenement']=$id_evenement;
+		$_GET['id_article']=$id_article;
+	}
+
+	if ($flag_ajout || $flag_modif || $flag_supp){
+		include_spip("inc/agenda_gestion");
+		Agenda_action_formulaire_article($id_article);
+	}
+
+	
+	$evenement_action='evenement_insert';
+	$valeurs=array('mots'=>array(),'dates'=>array(),'evenement_horaire'=>'oui');
+
+	$formulaire_actif = _request('ajout_evenement')!=NULL;
+	
+	// les champs
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement="._q($id_evenement)." AND id_article="._q($id_article));
+	if ($row = spip_fetch_array($res,SPIP_ASSOC)){
+		$evenement_action='evenement_modif';
+		foreach($row as  $k=>$val){
+			$valeurs["evenement_$k"]=$val;
+		}
+		// les mots
+		$res = spip_query("SELECT * FROM spip_mots_evenements WHERE id_evenement="._q($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$valeurs['mots'][]=$row['id_mot'];
+		}
+		
+		$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement_source="._q($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$valeurs['repetitions'][] = date('m/d/Y',strtotime($row['date_debut']));
+		}
+		$formulaire_actif = true;
+	}
+	$t=time();
+	$valeurs["date_evenement_debut"]=isset($valeurs["evenement_date_debut"])?$valeurs["evenement_date_debut"]:date('Y-m-d H:i:00',$t);
+	$valeurs["date_evenement_fin"]=isset($valeurs["evenement_date_fin"])?$valeurs["evenement_date_fin"]:date('Y-m-d H:i:00',$t+3600);
+
+	if (!$formulaire_actif) return;
+
+	return array('formulaires/formulaire_edition_evenement', 0, 
+		array(
+			#'erreur_message'=>isset($erreur['@'])?$erreur['@']:'',
+			#'erreur'=>serialize($erreur),
+			#'reponse'=>filtrer_entites($reponse),
+			'id_article' => $id_article,
+			'id_evenement' => $id_evenement,
+			'evenement_action' => $evenement_action,
+			'self' => $url,
+			'valeurs' => serialize($valeurs),
+			'url_validation' => str_replace("&amp;","&",$url_validation),
+			#'affiche_sondage' => $affiche_sondage,
+			#'formok' => filtrer_entites($formok),
+			#'formactif' => $formactif,
+		));
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/base/agenda_evenements.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/base/agenda_evenements.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/base/agenda_evenements.php	(revision 30)
@@ -0,0 +1,107 @@
+<?php
+// -----------------------------------------------------------------------------
+// Declaration des tables evenements
+// creation 11/03/2006 pour SPIP 1.9
+
+include_spip('base/serial'); // pour eviter une reinit posterieure des tables modifiees
+
+global $tables_principales;
+global $tables_auxiliaires;
+
+//-- Table EVENEMENTS ------------------------------------------
+$evenements = array(
+		"id_evenement"	=> "bigint(21) NOT NULL",
+		"id_article"	=> "bigint(21) DEFAULT '0' NOT NULL",
+		"date_debut"	=> "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
+		"date_fin"	=> "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
+		"titre"	=> "text NOT NULL",
+		"descriptif"	=> "text NOT NULL",
+		"lieu"	=> "text NOT NULL",
+		"horaire" => "ENUM('oui','non') DEFAULT 'oui' NOT NULL",
+		"id_evenement_source"	=> "bigint(21) NOT NULL",
+		"idx"		=> "ENUM('', '1', 'non', 'oui', 'idx') DEFAULT '' NOT NULL",
+		"maj"	=> "TIMESTAMP"
+		);
+
+$evenements_key = array(
+		"PRIMARY KEY"	=> "id_evenement",
+		"KEY date_debut"	=> "date_debut",
+		"KEY date_fin"	=> "date_fin",
+		"KEY id_article"	=> "id_article"
+		);
+
+$tables_principales['spip_evenements'] =
+	array('field' => &$evenements, 'key' => &$evenements_key);
+
+
+//-- Table de relations MOTS_EVENEMENTS----------------------
+$spip_mots_evenements = array(
+		"id_mot"	=> "BIGINT (21) DEFAULT '0' NOT NULL",
+		"id_evenement"	=> "BIGINT (21) DEFAULT '0' NOT NULL");
+
+$spip_mots_evenements_key = array(
+		"PRIMARY KEY"	=> "id_mot, id_evenement",
+		"KEY id_evenement"	=> "id_evenement");
+
+$tables_auxiliaires['spip_mots_evenements'] = array(
+	'field' => &$spip_mots_evenements,
+	'key' => &$spip_mots_evenements_key);
+
+//-- Jointures ----------------------------------------------------
+global $tables_jointures;
+$tables_jointures['spip_evenements'][]= 'mots'; // a placer avant la jointure sur articles
+$tables_jointures['spip_articles'][]= 'evenements';
+$tables_jointures['spip_evenements'][] = 'articles';
+$tables_jointures['spip_mots'][]= 'mots_evenements';
+$tables_jointures['spip_evenements'][] = 'mots_evenements';
+
+global $exceptions_des_tables;
+$exceptions_des_tables['evenements']['id_rubrique']=array('spip_articles', 'id_rubrique');
+
+global $table_primary;
+$table_primary['evenements']="id_evenement";
+
+global $table_date;
+$table_date['evenements'] = 'date_debut';
+// si on declare les tables dans $table_des_tables, il faut mettre le prefixe
+
+// 'spip_' dans l'index de $tables_principales
+global $table_des_tables;
+$table_des_tables['evenements']='evenements';
+$table_des_tables['mots_evenements']='mots_evenements';
+
+
+
+// Extension de la table des groupes de mots cles
+$spip_groupes_mots = array(
+		"id_groupe"	=> "bigint(21) NOT NULL",
+		"titre"	=> "text NOT NULL",
+		"descriptif"	=> "text NOT NULL",
+		"texte"	=> "longblob NOT NULL",
+		"unseul"	=> "varchar(3) NOT NULL",
+		"obligatoire"	=> "varchar(3) NOT NULL",
+		"articles"	=> "varchar(3) NOT NULL",
+		"breves"	=> "varchar(3) NOT NULL",
+		"rubriques"	=> "varchar(3) NOT NULL",
+		"syndic"	=> "varchar(3) NOT NULL");
+if (isset($GLOBALS['meta']['agenda_base_version']))
+	$spip_groupes_mots = array_merge($spip_groupes_mots,array("evenements"	=> "varchar(3) NOT NULL"));
+if (isset($GLOBALS['meta']['pim_agenda_base_version']))
+	$spip_groupes_mots = array_merge($spip_groupes_mots,array("pim_agenda"	=> "varchar(3) NOT NULL"));
+$spip_groupes_mots = array_merge($spip_groupes_mots,array(
+		"minirezo"	=> "varchar(3) NOT NULL",
+		"comite"	=> "varchar(3) NOT NULL",
+		"forum"	=> "varchar(3) NOT NULL",
+		"maj"	=> "TIMESTAMP"));
+
+
+$spip_groupes_mots_key = array(
+		"PRIMARY KEY"	=> "id_groupe");
+
+$tables_principales['spip_groupes_mots'] =
+	array('field' => &$spip_groupes_mots, 'key' => &$spip_groupes_mots_key);
+
+global  $table_des_traitements;
+$table_des_traitements['LIEU'][]= 'propre(%s)';
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/base/agenda_upgrade.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/base/agenda_upgrade.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/base/agenda_upgrade.php	(revision 30)
@@ -0,0 +1,108 @@
+<?php
+	
+	$GLOBALS['agenda_base_version'] = 0.13;
+	function Agenda_verifier_base(){
+		$version_base = $GLOBALS['agenda_base_version'];
+		$current_version = 0.0;
+		if (   (!isset($GLOBALS['meta']['agenda_base_version']) )
+				|| (($current_version = $GLOBALS['meta']['agenda_base_version'])!=$version_base)){
+			include_spip('base/agenda_evenements');
+			if ($current_version==0.0){
+				include_spip('base/create');
+				include_spip('base/abstract_sql');
+				creer_base();
+				// ajout du champ evenements a la table spip_groupe_mots
+				// si pas deja existant
+				$desc = spip_abstract_showtable("spip_groupes_mots", '', true);
+				if (!isset($desc['field']['evenements'])){
+					spip_query("ALTER TABLE spip_groupes_mots ADD `evenements` VARCHAR(3) NOT NULL AFTER `syndic`");
+				}
+				ecrire_meta('agenda_base_version',$current_version=$version_base,'non');
+			}
+			if ($current_version<0.11){
+				spip_query("ALTER TABLE spip_evenements ADD `horaire` ENUM('oui','non') DEFAULT 'oui' NOT NULL AFTER `lieu`");
+				ecrire_meta('agenda_base_version',$current_version=0.11,'non');
+			}
+			if ($current_version<0.12){
+				spip_query("ALTER TABLE spip_evenements ADD `id_article` bigint(21) DEFAULT '0' NOT NULL AFTER `id_evenement`");
+				spip_query("ALTER TABLE spip_evenements ADD INDEX ( `id_article` )");
+				$res = spip_query ("SELECT * FROM spip_evenements_articles");
+				while ($row = spip_fetch_array($res)){
+					$id_article = $row['id_article'];
+					$id_evenement = $row['id_evenement'];
+					spip_query("UPDATE spip_evenements SET id_article=$id_article WHERE id_evenement=$id_evenement");
+				}
+				spip_query("DROP TABLE spip_evenements_articles");
+				ecrire_meta('agenda_base_version',$current_version=0.12,'non');
+			}
+			if ($current_version<0.13){
+				include_spip('base/create');
+				include_spip('base/abstract_sql');
+				creer_base();
+				ecrire_meta('agenda_base_version',$current_version=0.13,'non');
+			}
+	
+			ecrire_metas();
+		}
+		
+		if (isset($GLOBALS['meta']['INDEX_elements_objet'])){
+			$INDEX_elements_objet = unserialize($GLOBALS['meta']['INDEX_elements_objet']);
+			if (!isset($INDEX_elements_objet['spip_evenements'])){
+				$INDEX_elements_objet['spip_evenements'] = array('titre'=>8,'descriptif'=>4,'lieu'=>3);
+				ecrire_meta('INDEX_elements_objet',serialize($INDEX_elements_objet));
+				ecrire_metas();
+			}
+		}
+		if (isset($GLOBALS['meta']['INDEX_objet_associes'])){
+			$INDEX_objet_associes = unserialize($GLOBALS['meta']['INDEX_objet_associes']);
+			if (!isset($INDEX_objet_associes['spip_articles']['spip_evenements'])){
+				$INDEX_objet_associes['spip_articles']['spip_evenements'] = 1;
+				ecrire_meta('INDEX_objet_associes',serialize($INDEX_objet_associes));
+				ecrire_metas();
+			}
+		}
+		if (isset($GLOBALS['meta']['INDEX_elements_associes'])){
+			$INDEX_elements_associes = unserialize($GLOBALS['meta']['INDEX_elements_associes']);
+			if (!isset($INDEX_elements_associes['spip_evenements'])){
+				$INDEX_elements_associes['spip_evenements'] = array('titre'=>2,'descriptif'=>1);
+				ecrire_meta('INDEX_elements_associes',serialize($INDEX_elements_associes));
+				ecrire_metas();
+			}
+		}
+	}
+	
+	function Agenda_vider_tables() {
+		include_spip('base/agenda_evenements');
+		include_spip('base/abstract_sql');
+		// suppression du champ evenements a la table spip_groupe_mots
+		spip_query("ALTER TABLE spip_groupes_mots DROP evenements");
+		spip_query("DROP TABLE spip_evenements");
+		spip_query("DROP TABLE spip_mots_evenements");
+		effacer_meta('agenda_base_version');
+		ecrire_metas();
+	}
+	
+	function Agenda_install($action){
+		$version_base = $GLOBALS['agenda_base_version'];
+		switch ($action){
+			case 'test':
+				return (isset($GLOBALS['meta']['agenda_base_version']) AND ($GLOBALS['meta']['agenda_base_version']>=$version_base)
+				AND isset($GLOBALS['meta']['INDEX_elements_objet'])
+				AND $t = unserialize($GLOBALS['meta']['INDEX_elements_objet'])
+				AND isset($t['spip_evenements'])
+				AND isset($GLOBALS['meta']['INDEX_objet_associes'])
+				AND $t = unserialize($GLOBALS['meta']['INDEX_objet_associes'])
+				AND isset($t['spip_articles']['spip_evenements'])
+				AND isset($GLOBALS['meta']['INDEX_elements_associes'])
+				AND $t = unserialize($GLOBALS['meta']['INDEX_elements_associes'])
+				AND isset($t['spip_evenements']));
+				break;
+			case 'install':
+				Agenda_verifier_base();
+				break;
+			case 'uninstall':
+				Agenda_vider_tables();
+				break;
+		}
+	}	
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/demo_calendrier_mini.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/demo_calendrier_mini.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/demo_calendrier_mini.html	(revision 30)
@@ -0,0 +1,173 @@
+#CACHE{86400}
+<BOUCLE_article_principal(ARTICLES) {id_article}><!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>[(#TITRE|textebrut)][ - (#NOM_SITE_SPIP|textebrut)]</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+	[<meta name="description" content="(#INTRODUCTION|couper{150}|attribut_html)" />]
+	<meta name="generator" content="SPIP" />
+	[<link rel="shortcut icon" href="(#CHEMIN{favicon.ico})" />]
+
+	<!-- Lien vers le backend pour navigateurs eclaires -->
+	<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>" href="#URL_PAGE{backend}" />
+
+	<!-- Ceci est la feuille de style par defaut pour le code genere par SPIP -->
+	<link rel="stylesheet" href="[(#CHEMIN{spip_style.css}|direction_css)]" type="text/css" media="all" />
+	<!-- Feuille de styles CSS pour l'affichage du site sur ecran -->
+	<link rel="stylesheet" href="[(#CHEMIN{habillage.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
+	<!-- Feuille de styles CSS pour l'impression -->
+	<link rel="stylesheet" href="[(#CHEMIN{impression.css}|direction_css)]" type="text/css" media="print" />
+</head>
+
+<body class="page_article">
+<div id="page">
+
+	[(#REM) Entete de la page + titre du site ]
+	<INCLURE{fond=inc-entete}{lang}>
+
+	[(#REM) Fil d'Ariane ]
+	<div id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_article}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; (#TITRE|couper{80})]</div>
+
+
+	<div id="conteneur">
+
+
+		[(#REM) Contenu principal : contenu de l'article ]
+
+		<div id="contenu">
+<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+[(#REM) mini calendrier : 
+1er arg la date, 
+2eme le nom de la variable date (optionel : 'date' par defaut)
+3eme l'url sur laquelle boucler (optionel : url courante par defaut) ]
+#CALENDRIER_MINI{#ENV{date},'date',#SELF}
+
+		<div class="cartouche">
+				#DEBUT_SURLIGNE
+				[(#LOGO_ARTICLE||image_reduire{200,200})]
+				[<p class="surtitre">(#SURTITRE)</p>]
+				<h1 class="titre">#TITRE</h1>
+				[<p class="soustitre">(#SOUSTITRE)</p>]
+				#FIN_SURLIGNE
+
+				<p><small>[(#DATE|nom_jour) ][(#DATE|affdate)][, <:par_auteur:> (#LESAUTEURS)]</small></p>
+
+				[(#REM) Traductions de l'article ]
+				<B_traductions>
+				<div class="traductions">
+					<p><:trad_article_traduction:></p>
+					<ul>
+						<li[ class="(#EXPOSE)"]>[(#LANG|traduire_nom_langue)]</li>
+						<BOUCLE_traductions(ARTICLES){traduction}{exclus}>
+						<li><a[ href="(#URL_ARTICLE|url_absolue)"] rel="alternate" hreflang="#LANG"[ title="(#TITRE|couper{80}|texte_backend)"]><span lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR">[(#LANG|traduire_nom_langue)]</span></a></li>
+						</BOUCLE_traductions>
+					</ul>
+				</div>
+				</B_traductions>
+			</div>
+
+
+			#DEBUT_SURLIGNE
+			[<div class="chapo">(#CHAPO)</div>]
+			<br class="nettoyeur" />
+			[<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+			[<div class="texte">(#TEXTE|image_reduire{520,0})</div>]
+			#FIN_SURLIGNE
+
+			[(#REM) Portfolio : album d'images ]
+			<B_documents_portfolio>
+			<div id="documents_portfolio">
+				<h2><:info_portfolio:></h2>
+				<BOUCLE_documents_portfolio(DOCUMENTS) {id_article}
+				{mode=document} {extension IN png,jpg,gif} {par date}
+				{doublons}>
+				[<a href="#URL_DOCUMENT" type="#MIME_TYPE"
+				onclick="this.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return true;"[title="(#TITRE|couper{80}|texte_backend)"]>(#LOGO_DOCUMENT||image_reduire{0,60}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+				</BOUCLE_documents_portfolio>
+			</div>
+			</B_documents_portfolio>
+			<BOUCLE_afficher_document(DOCUMENTS) {id_document}
+			{mode=document}{extension IN png,jpg,gif}>
+			<div class="spip_documents spip_documents_center" id="document_actif">
+				#EMBED_DOCUMENT
+				[<div class="spip_doc_titre">(#TITRE)</div>]
+				[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+			</div>
+			</BOUCLE_afficher_document>
+
+			[<div class="ps"><h2><:info_ps:></h2>#DEBUT_SURLIGNE(#PS)#FIN_SURLIGNE</div>]
+
+			[(#REM) Autres documents joints a l'article ]
+			<B_documents_joints>
+			<div id="documents_joints">
+				<h2><:titre_documents_joints:></h2>
+				<ul>
+					<BOUCLE_documents_joints(DOCUMENTS) {id_article} {mode=document} {par date} {doublons}>
+					<li>
+					<div class="spip_doc_titre"><a href="#URL_DOCUMENT" title="<:bouton_telecharger:>" type="#MIME_TYPE">[(#TITRE|sinon{<:info_document:>})]</a> <small>(#TYPE_DOCUMENT[ - (#TAILLE|taille_en_octets)])</small></div>
+					[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]</li>
+					<br class="nettoyeur" />
+					</BOUCLE_documents_joints>
+				</ul>
+			</div>
+			</B_documents_joints>
+
+			[(#REM) Petition :
+			La petition ayant une PAGINATION il faut absolument lui passer SELF]
+			[ #REM Conserver cet invalideur invisible : (#PETITION|?{'',''}) ]
+			<INCLURE{fond=inc-petition}{id_article}{self=#SELF}>
+
+			[<div class="notes"><h2><:info_notes:></h2>#DEBUT_SURLIGNE(#NOTES)#FIN_SURLIGNE</div>]
+
+			[(#REM) Forum de l'article ]
+			[<h2 class="forum-repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_article:></a></h2>]
+			<INCLURE{fond=inc-forum}{id_article}>
+
+
+		</div><!-- fin contenu -->
+
+
+		[(#REM) Menu de navigation laterale ]
+		<div id="navigation">
+			<h1 class="invisible"><:navigation:></h1>
+
+			[(#REM) Menu de navigation par rubriques ]
+			<INCLURE{fond=inc-rubriques}{lang}{id_rubrique}>
+
+			[(#REM) Articles dans la meme rubrique ]
+			<B_articles_rubrique>
+			<div class="breves">
+				<h2 class="menu-titre"><a href="#URL_RUBRIQUE"><:meme_rubrique:></a></h2>
+				<ul>
+					<BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {par date}{inverse} {0,10}>
+					<li><a href="#URL_ARTICLE"[ class="(#EXPOSE)"]>#TITRE</a></li>
+					</BOUCLE_articles_rubrique>
+				</ul>
+			</div>
+			</B_articles_rubrique>
+
+			[(#REM) Menu de navigation mots-cles ]
+			<B_mots>
+			<div class="divers">
+				<h2 class="menu-titre"><:mots_clefs:></h2>
+			<ul>
+				<BOUCLE_mots(MOTS) {id_article} {par titre}>
+				<li><a href="#URL_MOT" rel="tag">#TITRE</a></li>
+				</BOUCLE_mots>
+			</ul>
+			</div>
+			</B_mots>
+		</div><!-- fin navigation -->
+
+	</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/agenda/1_9_2/exec/agenda_evenements.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/agenda_evenements.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/agenda_evenements.php	(revision 30)
@@ -0,0 +1,86 @@
+<?php
+
+include_spip('inc/presentation');
+include_spip('inc/voir_agenda');
+
+function exec_agenda_evenements_dist(){
+	include_spip('inc/calendar');
+	// Reserver les widgets agenda
+	WCalendar_ajoute_lies(_T('agenda:evenement_date_debut'),'_evenement_debut',_T('agenda:evenement_date_fin'),'_evenement_fin');
+	WCalendar_ajoute_statique(_T('agenda:evenement_repetitions'),'_repetitions');
+
+	$ajouter_id_article = intval(_request('ajouter_id_article'));
+	$flag_editable = article_editable($ajouter_id_article);
+
+	global $visu_evenements;
+	$type = _request('type');
+	if (!$type) $type='semaine';
+	$id_evenement = intval(_request('id_evenement'));
+	$edit = _request('edit');
+	$neweven = _request('neweven');
+
+	$annee = intval(_request('annee'));
+	$mois = intval(_request('mois'));
+	$jour = intval(_request('jour'));
+	$date = date("Y-m-d", time());
+	if ($annee&&$mois&&$jour)
+		$date = date("Y-m-d", strtotime("$annee-$mois-$jour"));
+
+
+		
+	if ($type == 'semaine') {
+	
+		//$GLOBALS['afficher_bandeau_calendrier_semaine'] = true;
+		$titre = _T('titre_page_calendrier',
+			array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+	}
+  elseif ($type == 'jour') {
+		$titre = nom_jour($date)." ". affdate_jourcourt($date);
+  }
+	else {
+		$titre = _T('titre_page_calendrier',
+		    array('nom_mois' => nom_mois($date), 'annee' => annee($date)));
+	}
+
+  $out = debut_page($titre, "redacteurs", "calendrier","",$css);
+	$out .= barre_onglets("calendrier", "evenements");
+
+	$out .= "<div>";
+	if ($ajouter_id_article){
+		$res2 = spip_query("SELECT * FROM spip_articles AS articles WHERE id_article="._q($ajouter_id_article));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div style=' width:750px; font-size: 18px; color: #9DBA00; font-weight: bold;text-align:left;'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html(typo($row2['titre']))."</a></div>";
+		}
+	}
+	$out .= "&nbsp;</div>" ;
+	
+	$voir_agenda = charger_fonction("voir_agenda","inc");
+	$out .= "<div id='voir_agenda'>".$voir_agenda($flag_editable)."</div>";
+
+	$out .= "<div id='voir_evenement-0'>";
+	if (($edit||$neweven)&&($flag_editable))	{ //---------------Edition RDV ------------------------------
+		$ndate = _request('ndate');
+		$form .= Agenda_formulaire_edition_evenement($id_evenement,$neweven,$ndate);
+		$args = explode('?',self());
+		$out .= ajax_action_auteur('voir_evenement',"0-modifier-$id_article-$id_evenement", 'calendrier', end($args), $form,'','reload_agenda');
+	}
+	elseif ((isset($id_evenement))&&(isset($visu_evenements[$id_evenement]))){ //---------------Visualisation RDV ------------------------------
+		$voir_evenement = charger_fonction('voir_evenement','inc');
+		$out .= $voir_evenement($id_evenement,$flag_editable);
+	}
+	$out .= "</div>";
+	
+	$out .= "<script type='text/javascript'>
+	function reload_agenda(){
+	var url=document.location.href;
+	url = url.replace(/exec=[^&]*/,'exec=voir_agenda')
+	\$('#voir_agenda').load(url);
+	}</script>";
+	$out .= fin_page();
+	echo $out;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/editer_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/editer_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/editer_evenement.php	(revision 30)
@@ -0,0 +1,17 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip("inc/agenda_gestion");
+include_spip("inc/autoriser");
+
+function exec_editer_evenement_dist()
+{
+	$id_article = intval(_request('id_article'));
+	//if (autoriser())
+	$res = Agenda_formulaire_article($id_article, autoriser('modifier','article',$id_article),'articles');
+
+	ajax_retour($res);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/mots_tous.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/mots_tous.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/mots_tous.php	(revision 30)
@@ -0,0 +1,218 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2007                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/actions');
+include_spip('inc/agenda_gestion');
+include_spip('inc/pim_agenda_gestion');
+
+// http://doc.spip.org/@exec_mots_tous_dist
+function exec_mots_tous_dist()
+{
+	global $conf_mot, $spip_lang, $spip_lang_right, $son_groupe;
+	global $evenements, $pim_agenda;
+
+	$conf_mot = intval($conf_mot);
+
+	pipeline('exec_init',array('args'=>array('exec'=>'mots_tous'),'data'=>''));
+	$commencer_page = charger_fonction('commencer_page', 'inc');
+	echo $commencer_page(_T('titre_page_mots_tous'), "naviguer", "mots");
+	debut_gauche();
+
+	if (autoriser('modifier','groupemots',$id_groupe)  AND !$conf_mot){
+		$res = icone_horizontale(_T('icone_creation_groupe_mots'), generer_url_ecrire("mots_type","new=oui"), "groupe-mot-24.gif", "creer.gif",false);
+
+		echo bloc_des_raccourcis($res);
+	}
+
+	echo pipeline('affiche_gauche',array('args'=>array('exec'=>'mots_tous'),'data'=>''));
+
+	creer_colonne_droite();
+	echo pipeline('affiche_droite',array('args'=>array('exec'=>'mots_tous'),'data'=>''));
+	debut_droite();
+
+	gros_titre(_T('titre_mots_tous'));
+	if (autoriser('modifier','groupemots',$id_groupe)) {
+	  echo typo(_T('info_creation_mots_cles')) . aide ("mots") ;
+	}
+	echo "<br /><br />";
+
+//
+// On boucle d'abord sur les groupes de mots
+//
+
+	$result_groupes = spip_query($q="SELECT *, ".creer_objet_multi ("titre", "$spip_lang")." FROM spip_groupes_mots ORDER BY multi");
+
+	while ($row_groupes = spip_fetch_array($result_groupes)) {
+		$id_groupe = $row_groupes['id_groupe'];
+		$titre_groupe = typo($row_groupes['titre']);
+		$descriptif = $row_groupes['descriptif'];
+		$texte = $row_groupes['texte'];
+		$unseul = $row_groupes['unseul'];
+		$obligatoire = $row_groupes['obligatoire'];
+		$articles = $row_groupes['articles'];
+		$breves = $row_groupes['breves'];
+		$rubriques = $row_groupes['rubriques'];
+		$syndic = $row_groupes['syndic'];
+		$evenements = 'non';
+		$pim_agenda = 'non';
+		if (isset($GLOBALS['tables_principales']['spip_evenements']))	$evenements = $row_groupes['evenements'];
+		if (isset($GLOBALS['tables_principales']['spip_pim_agenda']))	$pim_agenda = $row_groupes['pim_agenda'];
+		$acces_minirezo = $row_groupes['minirezo'];
+		$acces_comite = $row_groupes['comite'];
+		$acces_forum = $row_groupes['forum'];
+
+		// Afficher le titre du groupe
+		echo "<a id='mots_tous-$id_groupe'></a>";
+
+		debut_cadre_enfonce("groupe-mot-24.gif", false, '', $titre_groupe);
+		// Affichage des options du groupe (types d'elements, permissions...)
+		echo "<font face='Verdana,Arial,Sans,sans-serif' size='1'>";
+		if ($articles == "oui") echo "> "._T('info_articles_2')." &nbsp;&nbsp;";
+		if ($breves == "oui") echo "> "._T('info_breves_02')." &nbsp;&nbsp;";
+		if ($rubriques == "oui") echo "> "._T('info_rubriques')." &nbsp;&nbsp;";
+		if ($syndic == "oui") echo "> "._T('icone_sites_references')." &nbsp;&nbsp;";
+		if ($evenements == "oui") echo "> "._T('agenda:info_evenements')." &nbsp;&nbsp;";
+		if ($pim_agenda == "oui") echo "> "._T('pimagenda:info_evenements')." &nbsp;&nbsp;";
+
+		if ($unseul == "oui" OR $obligatoire == "oui") echo "<br />";
+		if ($unseul == "oui") echo "> "._T('info_un_mot')." &nbsp;&nbsp;";
+		if ($obligatoire == "oui") echo "> "._T('info_groupe_important')." &nbsp;&nbsp;";
+
+		echo "<br />";
+		if ($acces_minirezo == "oui") echo "> "._T('info_administrateurs')." &nbsp;&nbsp;";
+		if ($acces_comite == "oui") echo "> "._T('info_redacteurs')." &nbsp;&nbsp;";
+		if ($acces_forum == "oui") echo "> "._T('info_visiteurs_02')." &nbsp;&nbsp;";
+
+		echo "</font>";
+		if ($descriptif) {
+			echo "<div style='border: 1px dashed #aaaaaa;'>";
+			echo "<font size='2' face='Verdana,Arial,Sans,sans-serif'>";
+			echo "<b>",_T('info_descriptif'),"</b> ";
+			echo propre($descriptif);
+			echo "&nbsp; ";
+			echo "</font>";
+			echo "</div>";
+		}
+
+		if (strlen($texte)>0){
+			echo "<font face='Verdana,Arial,Sans,sans-serif'>";
+			echo propre($texte);
+			echo "</font>";
+		}
+
+		//
+		// Afficher les mots-cles du groupe
+		//
+
+		$groupe = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_mots WHERE id_groupe=$id_groupe"));
+		$groupe = $groupe['n'];
+
+		echo "<div\nid='editer_mot-$id_groupe' style='position: relative;'>";
+
+		// Preliminaire: confirmation de suppression d'un mot lie ï¿œqqch
+		// (cf fin de afficher_groupe_mots_boucle executee a l'appel precedent)
+		if ($conf_mot  AND $son_groupe==$id_groupe) {
+			include_spip('inc/grouper_mots');
+			echo confirmer_mot($conf_mot, $id_groupe, $groupe);
+		}
+		if ($groupe) {
+		  	$grouper_mots = charger_fonction('grouper_mots', 'inc');
+			echo $grouper_mots($id_groupe, $groupe);
+		}
+
+		echo "</div>";
+
+		if (autoriser('modifier','groupemots',$id_groupe)){
+			echo "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>";
+			echo "<tr>";
+			echo "<td>";
+			icone(_T('icone_modif_groupe_mots'), generer_url_ecrire("mots_type","id_groupe=$id_groupe"), "groupe-mot-24.gif", "edit.gif");
+			echo "</td>";
+			echo "\n<td id='editer_mot-$id_groupe-supprimer'",
+			  (!$groupe ? '' : " style='visibility: hidden'"),
+			  ">";
+			icone(_T('icone_supprimer_groupe_mots'), redirige_action_auteur('instituer_groupe_mots', "-$id_groupe", "mots_tous"), "groupe-mot-24.gif", "supprimer.gif");
+			echo "</td>";
+			echo "<td>";
+			echo "<div align='$spip_lang_right'>";
+			icone(_T('icone_creation_mots_cles'), generer_url_ecrire("mots_edit","new=oui&id_groupe=$id_groupe&redirect=" . generer_url_retour('mots_tous', "#mots_tous-$id_groupe")), "mot-cle-24.gif", "creer.gif");
+			echo "</div>";
+			echo "</td></tr></table>";
+		}	
+
+		fin_cadre_enfonce();
+	}
+
+
+	echo fin_gauche(), fin_page();
+}
+
+// http://doc.spip.org/@confirmer_mot
+function confirmer_mot ($conf_mot, $son_groupe, $total)
+{
+	$row = spip_fetch_array(spip_query("SELECT * FROM spip_mots WHERE id_mot=$conf_mot"));
+	if (!$row) return ""; // deja detruit (acces concurrent etc)
+
+	$id_mot = $row['id_mot'];
+	$titre_mot = typo($row['titre']);
+	$type_mot = typo($row['type']);
+
+	if (($na = intval(_request('na'))) == 1) {
+		$texte_lie = _T('info_un_article')." ";
+	} else if ($na > 1) {
+		$texte_lie = _T('info_nombre_articles', array('nb_articles' => $na)) ." ";
+	}
+	if (($nb = intval(_request('nb'))) == 1) {
+		$texte_lie .= _T('info_une_breve')." ";
+	} else if ($nb > 1) {
+		$texte_lie .= _T('info_nombre_breves', array('nb_breves' => $nb))." ";
+	}
+	if (($ns = intval(_request('ns'))) == 1) {
+		$texte_lie .= _T('info_un_site')." ";
+	} else if ($ns > 1) {
+		$texte_lie .= _T('info_nombre_sites', array('nb_sites' => $ns))." ";
+	}
+	if (($nr = intval(_request('nr'))) == 1) {
+		$texte_lie .= _T('info_une_rubrique')." ";
+	} else if ($nr > 1) {
+		$texte_lie .= _T('info_nombre_rubriques', array('nb_rubriques' => $nr))." ";
+	}
+	if (($ne = intval(_request('ne'))) == 1) {
+		$texte_lie .= _T('agenda:info_un_evenement')." ";
+	} else if ($ne > 1) {
+		$texte_lie .= _T('agenda:info_nombre_evenements', array('nb_evenements' => $ne))." ";
+	}
+
+	return debut_boite_info(true)
+	. "<div class='serif'>"
+	. _T('info_delet_mots_cles', array('titre_mot' => $titre_mot, 'type_mot' => $type_mot, 'texte_lie' => $texte_lie))
+	. "<p style='text-align: right'>"
+	. generer_supprimer_mot($id_mot, $son_groupe, ("<b>" . _T('item_oui') . "</b>"), $total)
+	. "<br />\n"
+	.  _T('info_oui_suppression_mot_cle')
+	. '</p>'
+	  /* troublant. A refaire avec une visibility
+	 . "<li><b><a href='" 
+	. generer_url_ecrire("mots_tous")
+	. "#editer_mot-$son_groupe"
+	. "'>"
+	. _T('item_non')
+	. "</a>,</b> "
+	. _T('info_non_suppression_mot_cle')
+	. "</ul>" */
+	. "</div>"
+	. fin_boite_info(true);
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/mots_type.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/mots_type.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/mots_type.php	(revision 30)
@@ -0,0 +1,212 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2007                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+
+// http://doc.spip.org/@exec_mots_type_dist
+function exec_mots_type_dist()
+{
+	global $connect_statut, $descriptif, $id_groupe, $new, $options, $texte, $titre;
+
+	if ($new == "oui") {
+	  $id_groupe = 0;
+	  $type = filtrer_entites(_T('titre_nouveau_groupe'));
+	  $onfocus = " onfocus=\"if(!antifocus){this.value='';antifocus=true;}\"";
+	  $ancien_type = '';
+	  $unseul = 'non';
+	  $obligatoire = 'non';
+	  $articles = 'oui';
+	  $breves = 'oui';
+	  $rubriques = 'non';
+	  $syndic = 'oui';
+	  $acces_minirezo = 'oui';
+	  $acces_comite = 'oui';
+	  $acces_forum = 'non';
+	} else {
+		$id_groupe= intval($id_groupe);
+		$result_groupes = spip_query("SELECT * FROM spip_groupes_mots WHERE id_groupe=$id_groupe");
+
+		while($row = spip_fetch_array($result_groupes)) {
+			$id_groupe = $row['id_groupe'];
+			$type = $row['titre'];
+			$titre = typo($type);
+			$descriptif = $row['descriptif'];
+			$texte = $row['texte'];
+			$unseul = $row['unseul'];
+			$obligatoire = $row['obligatoire'];
+			$articles = $row['articles'];
+			$breves = $row['breves'];
+			$rubriques = $row['rubriques'];
+			$syndic = $row['syndic'];
+			if (isset($row['evenements']))
+				$evenements = $row['evenements'];
+			if (isset($row['pim_agenda']))
+				$pim_agenda = $row['pim_agenda'];
+			$acces_minirezo = $row['minirezo'];
+			$acces_comite = $row['comite'];
+			$acces_forum = $row['forum'];
+			$onfocus ="";
+		}
+	}
+
+	pipeline('exec_init',array('args'=>array('exec'=>'mots_types','id_groupe'=>$id_groupe),'data'=>''));
+	$commencer_page = charger_fonction('commencer_page', 'inc');
+	echo $commencer_page("&laquo; $titre &raquo;", "naviguer", "mots");
+	
+	debut_gauche();
+
+	echo pipeline('affiche_gauche',array('args'=>array('exec'=>'mots_types','id_groupe'=>$id_groupe),'data'=>''));
+	creer_colonne_droite();
+	echo pipeline('affiche_droite',array('args'=>array('exec'=>'mots_types','id_groupe'=>$id_groupe),'data'=>''));
+	debut_droite();
+
+	if ($connect_statut != "0minirezo") {
+		echo "<h3>"._T('avis_non_acces_page')."</h3>";
+		exit;
+	}
+
+
+	$type = entites_html(rawurldecode($type));
+
+	$res = debut_cadre_relief("groupe-mot-24.gif", true)
+	. "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>"
+	. "<tr>"
+	. "<td  align='right' valign='top'>"
+	. icone(_T('icone_retour'), generer_url_ecrire("mots_tous",""), "mot-cle-24.gif", "rien.gif",'', false)
+	. "</td>"
+	. "<td>". http_img_pack('rien.gif', " ", "width='5'") . "</td>\n"
+	. "<td style='width: 100%' valign='top'>"
+	  . "<span class='verdana1 spip_x-small'><b>". _T('titre_groupe_mots') . "</b></span><br />"
+	  . gros_titre($titre,'',false)
+	. aide("motsgroupes")
+	. "<div class='verdana1'>"
+	. debut_cadre_formulaire('',true)
+	. "<b>"._T('info_changer_nom_groupe')."</b><br />\n"
+	. "<input type='text' size='40' class='formo' name='change_type' value=\"$type\" $onfocus />\n";
+		
+	if ($options == 'avancees' OR $descriptif) {
+			$res .= "<br /><b>"._T('texte_descriptif_rapide')
+			. "</b><br />"
+			. "<textarea name='descriptif' class='forml' rows='4' cols='40'>"
+			. entites_html($descriptif)
+			. "</textarea>\n";
+	} else
+			$res .= "<input type='hidden' name='descriptif' value=\"$descriptif\" />";
+
+	if ($options == 'avancees' OR $texte) {
+			$res .= "<br /><b>"._T('info_texte_explicatif')."</b><br />";
+			$res .= "<textarea name='texte' rows='8' class='forml' cols='40'>";
+			$res .= entites_html($texte);
+			$res .= "</textarea>\n";
+	} else
+		  $res .= "<input type='hidden' name='texte' value=\"$texte\" />";
+
+	$res .= "<div align='right'><input type='submit' class='fondo' value='"
+	. _T('bouton_valider')
+	. "' /></div>"
+	. fin_cadre_formulaire(true)
+	. "</div>"
+	. "</td></tr></table>"
+	. fin_cadre_relief(true)
+	. "<br />\n<div class='verdana1'>"
+	. debut_cadre_formulaire('',true)
+	. "<div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>"
+	. "<b>"._T('info_mots_cles_association')."</b>"
+	. "<br />";
+		
+	$checked =  ($articles == "oui") ? "checked='checked'" : ''; 
+	$res .= "<input type='checkbox' name='articles' value='oui' $checked id='articles' /> <label for='articles'>"._T('item_mots_cles_association_articles')."</label><br />";
+	$activer_breves = $GLOBALS['meta']["activer_breves"];
+
+	if ($activer_breves != "non"){
+		$checked =  ($breves == "oui") ? "checked='checked'" : '';
+			
+		$res .= "<input type='checkbox' name='breves' value='oui' $checked id='breves' /> <label for='breves'>"._T('item_mots_cles_association_breves')."</label><br />";
+	} else {
+		$res .= "<input type='hidden' name='breves' value='non' />";
+	}
+	$checked = ($rubriques == "oui") ? "checked='checked'" : '';	
+
+	$res .= "<input type='checkbox' name='rubriques' value='oui' $checked id='rubriques' /> <label for='rubriques'>"._T('item_mots_cles_association_rubriques')."</label><br />";
+
+	$checked = ($syndic == "oui") ? "checked='checked'" : ''; 
+	$res .= "<input type='checkbox' name='syndic' value='oui' $checked id='syndic' /> <label for='syndic'>"._T('item_mots_cles_association_sites')."</label>";
+	
+	if (isset($GLOBALS['tables_principales']['spip_evenements'])){
+		$res .= "<br />";
+		if ($evenements == "oui") $checked = "checked";
+		else $checked = "";
+		$res .= "<input type='checkbox' name='evenements' value='oui' $checked id='evenements'> <label for='evenements'>"._T('agenda:item_mots_cles_association_evenements')."</label>";
+	}
+	if (isset($GLOBALS['tables_principales']['spip_pim_agenda'])){
+		$res .= "<br />";
+		if ($pim_agenda == "oui") $checked = "checked";
+		else $checked = "";
+		$res.= "<input type='checkbox' name='pim_agenda' value='oui' $checked id='pim_agenda'> <label for='pim_agenda'>"._T('pimagenda:item_mots_cles_association_evenements')."</label>";
+	}
+	$res .= "</div>";
+
+	if ($GLOBALS['meta']["config_precise_groupes"] == "oui" OR $unseul == "oui" OR $obligatoire == "oui"){
+		$res .= "<div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>";
+
+		$checked =  ($unseul == "oui") ? "checked='checked'" : ''; 
+		$res .= "<input type='checkbox' name='unseul' value='oui' $checked id='unseul' /> <label for='unseul'>"._T('info_selection_un_seul_mot_cle')."</label>";
+		$res .= "<br />";
+
+		$checked = ($obligatoire == "oui") ? "checked='checked'" : '';
+		$res .= "<input type='checkbox' name='obligatoire' value='oui' $checked id='obligatoire' /> <label for='obligatoire'>"._T('avis_conseil_selection_mot_cle')."</label>";
+		$res .= "</div>";
+	} else {
+		  $res .= "<input type='hidden' name='unseul' value='non' />";
+		  $res .= "<input type='hidden' name='obligatoire' value='non' />";
+	}
+
+	$res .= "<div style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #dddddd;'>"
+	.  "<b>"._T('info_qui_attribue_mot_cle')."</b>"
+	.  "<br />";
+		
+	$checked = ($acces_minirezo == "oui") ? "checked='checked'" : ''; 
+	$res .= "<input type='checkbox' name='acces_minirezo' value='oui' $checked id='administrateurs' /> <label for='administrateurs'>"
+	 . _T('bouton_checkbox_qui_attribue_mot_cle_administrateurs')
+	. "</label><br />";
+
+	$checked =  ($acces_comite == "oui") ? "checked='checked'" : ''; 
+	$res .= "<input type='checkbox' name='acces_comite' value='oui' $checked id='comite' /> <label for='comite'>"._T('bouton_checkbox_qui_attribue_mot_cle_redacteurs')."</label><br />";
+	
+	$mots_cles_forums = $GLOBALS['meta']["mots_cles_forums"];
+	$forums_publics=$GLOBALS['meta']["forums_publics"];
+		
+	if (($mots_cles_forums == "oui" OR $acces_forum == "oui") AND $forums_publics != "non"){
+		$checked = ($acces_forum == "oui") ? "checked='checked'" : ''; 
+		$res .= "<input type='checkbox' name='acces_forum' value='oui' $checked id='forum' /> <label for='forum'>"._T('bouton_checkbox_qui_attribue_mot_cle_visiteurs')."</label>";
+	} 
+	else {
+		$res .= "<input type='hidden' name='acces_forum' value='non' />";
+	}
+			
+	$res .= "<br /></div><div align='right'><input type='submit' class='fondo' value='"
+	. _T('bouton_valider')
+	. "' /></div>"
+	.  fin_cadre_formulaire(true)
+	. "</div>";
+
+	$res .= pipeline('affiche_milieu',array('args'=>array('exec'=>'mots_types','id_groupe'=>$id_groupe),'data'=>''));
+
+
+	echo redirige_action_auteur('instituer_groupe_mots', $id_groupe, "mots_tous", "id_groupe=$id_groupe", $res),
+		fin_gauche(),
+		fin_page();
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/voir_agenda.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/voir_agenda.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/voir_agenda.php	(revision 30)
@@ -0,0 +1,22 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip("inc/agenda_gestion");
+
+function exec_voir_agenda_dist()
+{
+	$id_article = intval(_request('ajouter_id_article'));
+	$id_evenement = intval(_request('id_evenement'));	
+	$flag_editable = true; // autoriser()
+	
+	// hack pour faire marcher le calendrier
+	$GLOBALS['REQUEST_URI'] = preg_replace(',exec=[^&]*,','exec=calendrier',$GLOBALS['REQUEST_URI']);
+	
+	$voir_agenda = charger_fonction("voir_agenda","inc");
+	$res = $voir_agenda($flag_editable);
+
+	ajax_retour($res);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/voir_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/voir_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/exec/voir_evenement.php	(revision 30)
@@ -0,0 +1,33 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip("inc/agenda_gestion");
+include_spip("inc/autoriser");
+
+function exec_voir_evenement_dist()
+{
+	$id_article = intval(_request('ajouter_id_article'));
+	$id_evenement = intval(_request('id_evenement'));	
+	//if (autoriser())
+	$flag_editable = true; // autoriser()
+
+	$res = "";
+	if ((_request('edit')||($neweven=_request('neweven')))&&($flag_editable))	{ //---------------Edition RDV ------------------------------
+		$ndate = _request('ndate');
+		$form .= Agenda_formulaire_edition_evenement($id_evenement,$neweven,$ndate);
+		$url = parametre_url(self(),'exec','','&');
+		$url = parametre_url($url,'edit','','&');
+		$url = parametre_url($url,'neweven','','&');
+		$args = explode('?',$url);
+		$res .= ajax_action_auteur('voir_evenement',"0-modifier-$id_article-$id_evenement", 'calendrier', end($args), $form,'','reload_agenda');
+	}
+	else {
+		$voir_evenement = charger_fonction('voir_evenement','inc');
+		$res .= $voir_evenement($id_evenement,$flag_editable);
+	}
+
+	ajax_retour($res);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/formulaires/calendrier_mini.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/formulaires/calendrier_mini.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/formulaires/calendrier_mini.html	(revision 30)
@@ -0,0 +1,35 @@
+<div id="calendar">
+	<h2><BOUCLE_titre(ARTICLES){id_article}>#TITRE</BOUCLE_titre><:icone_calendrier:><//B_titre></h2>
+	<table summary="<:icone_calendrier:>">
+		<caption>[
+			<a
+				href="(#ENV{self}|parametre_url{#ENV{var_date},[(#ENV{date}|Agenda_moisdecal{-1,'Y-m'})]})"
+				title="[(#ENV{date}|Agenda_moisdecal{-1,'Y-m'}|affdate_mois_annee)]">&#171;</a>][
+			(#ENV{date}|affdate_mois_annee)][
+			<a
+				href="(#ENV{self}|parametre_url{#ENV{var_date},[(#ENV{date}|Agenda_moisdecal{1,'Y-m'})]})"
+				title="[(#ENV{date}|Agenda_moisdecal{1,'Y-m'}|affdate_mois_annee)]">&#187;</a>]
+		</caption>
+		<thead>
+			<tr>
+				<th scope="col"><abbr title="<:date_jour_2:>"><:date_jour_2|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_3:>"><:date_jour_3|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_4:>"><:date_jour_4|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_5:>"><:date_jour_5|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_6:>"><:date_jour_6|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_7:>"><:date_jour_7|spip_substr{0,1}|strtoupper:></abbr></th>
+				<th scope="col"><abbr title="<:date_jour_1:>"><:date_jour_1|spip_substr{0,1}|strtoupper:></abbr></th>
+			</tr>
+		</thead>
+		<tbody><BOUCLE_calendrier(EVENEMENTS)
+			{id_article}{id_mot?}
+			{agenda date_debut, mois, (#ENV{date}|annee), (#ENV{date}|mois)}>[
+			(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,[(#TITRE|addslashes)],
+				#DESCRIPTIF,#LIEU,
+				[(#ENV{self}|parametre_url{#ENV{var_date},[(#DATE_DEBUT|affdate{'Y-m-d'})]})]})
+			]</BOUCLE_calendrier>[
+			(#ENV{date}|agenda_mini)
+			]</tbody>
+	</table>
+	<span>&nbsp;</span>
+</div>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/formulaires/formulaire_edition_evenement.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/formulaires/formulaire_edition_evenement.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/formulaires/formulaire_edition_evenement.html	(revision 30)
@@ -0,0 +1,115 @@
+<a name='evenement#ID_EVENEMENT'></a>
+<form method='post' action='#ENV{self}#evenement#ID_EVENEMENT'>
+	<div>
+	[(#ENV{self}|form_hidden)]
+	[<input type='hidden' name='id_evenemnt' value='(#ENV{id_evenemnt})' />]
+	<input type='hidden' name='#ENV{evenement_action}' value='1' />
+	
+	</div>
+<fieldset class='agenda-visu-evenement' id='agenda-visu-evenement'>
+<div class='agenda-visu-evenement-bouton-fermer'>
+<a href='[(#ENV{self}|parametre_url{id_evenement,''})]'
+onclick="$('#agenda-visu-evenement').hide();
+$('#afficher_horaire_debut_evenement').hide();
+$('#afficher_horaire_fin_evenement').hide();
+cal_repetitions.hide();
+return false;"><img src='#CHEMIN{img_pack/croix.png}' width='12' height='12' style='border:none;'></a>
+</div>
+<legend>[(#ENV{id_evenement}|?{<:agenda:titre_cadre_modifier_evenement:>,<:agenda:titre_cadre_ajouter_evenement:>})]</legend>
+
+[(#REM) TITRE]
+<span class='titre-titre'>
+	<label for="evenement_titre"><:agenda:evenement_titre:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_titre}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_titre}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='titre-visu'>
+	<input type='text' name='evenement_titre' id='evenement_titre' value="[(#ENV**{valeurs}|table_valeur{evenement_titre,''}|entites_html)]" 
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_titre}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_titre}|=={oui}|?{forml,formo})]'" />
+</span>
+[(#REM) LIEU]
+<span class='lieu-titre'>
+	<label for="evenement_lieu"><:agenda:evenement_lieu:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_lieu}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_lieu}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='lieu-visu'>
+	<input type='text' name='evenement_lieu' id='evenement_lieu' value="[(#ENV**{valeurs}|table_valeur{evenement_lieu,''}|entites_html)]" 
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_lieu}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_lieu}|=={oui}|?{forml,formo})]'" />
+</span>
+
+[(#REM) HORAIRE]
+<span class='horaire-titre'>
+	<label for="evenement_lieu"><:agenda:evenement_horaire:></label>
+	<input type='checkbox' name='evenement_horaire' id='evenement_horaire' value='oui' [(#ENV**{valeurs}|table_valeur{evenement_horaire,''}|=={oui}|?{' ',''})checked='checked']
+		onClick="if ($('#evenement_horaire')[0].checked==true) { $('#afficher_horaire_debut_evenement').show();
+$('#afficher_horaire_fin_evenement').show();} else{$('#afficher_horaire_debut_evenement').hide();$('#afficher_horaire_fin_evenement').hide();}" />
+</span>
+
+[(#REM) DATES]
+<span class='date-titre'><:agenda:evenement_date:></span>
+<span class='date-visu'>
+<:agenda:evenement_date_de:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_debut}|WCalendar_controller{'_evenement_debut'})]
+<span class='agenda_visible_au_chargement' id='afficher_horaire_debut_evenement'>
+<:agenda:evenement_date_a_immediat:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_debut}|Agenda_heure_selector{'_debut'})]
+</span>
+<br/>
+<:agenda:evenement_date_au:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_fin}|WCalendar_controller{'_evenement_fin'})]
+<span class='agenda_visible_au_chargement' id='afficher_horaire_fin_evenement'>
+<:agenda:evenement_date_a_immediat:>
+[(#ENV**{valeurs}|table_valeur{date_evenement_fin}|Agenda_heure_selector{'_fin'})]
+</span>
+</span>
+
+[(#REM) DESCRIPTIF]
+<span class='descriptif-titre'>
+	<label for="evenement_descriptif"><:agenda:evenement_descriptif:></label>
+	[<span class='spip_form_label_obligatoire[(#ENV**{erreur}|table_valeur{evenement_descriptif}|?{' ',''})obligatoire_oublie]'>
+		(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|?{<:agenda:info_obligatoire:>,''})</span>]
+</span>
+<span class='descriptif-visu'>
+	<textarea name='evenement_descriptif' id='evenement_descriptif'  
+		class='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|?{forml,formo})][(#ENV**{erreur}|table_valeur{evenement_descriptif}|?{' ',''}) champ_obli_oubli]' 
+		onfocus="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|=={oui}|?{forml,formo})]-focus'" 
+		onblur="this.className='[(#ENV**{obligatoire}|table_valeur{evenement_descriptif}|=={oui}|?{forml,formo})]'" 
+		rows='3' >[(#ENV**{valeurs}|table_valeur{evenement_descriptif,''}|entites_html)]</textarea>
+</span>
+
+[(#REM) MOTS CLES : chaque groupe de mot cle attribuable a un evenement agenda
+	donne un select ]
+<span class='agenda_mots_cles'>
+<BOUCLE_groupes(GROUPES_MOTS){evenements='oui'}>
+	<select name='evenement_groupe_mot_select_#ID_GROUPE[]' class='fondl verdana1 agenda_mot_cle_select'[
+	(#UNSEUL|=={'oui'}|?{'',' '}) multiple='multiple' size='4']>
+	[<option value='x' style='font-variant: small-caps;' [
+	(#UNSEUL|=={'oui'}|?{'',' '}) disabled='disabled']>(#TITRE|supprimer_numero)</option>]
+	<BOUCLE_mots(MOTS){id_groupe}>
+		<option value='#ID_MOT'
+		[(#ID_MOT|in_any{[(#ENV**{valeurs}|table_valeur{mots})],''})selected='selected']>#TITRE</option>
+	</BOUCLE_mots>
+	</select>
+</BOUCLE_groupes>
+</span>
+<script type='text/javascript' src='#CHEMIN{img_pack/multiselect.js}'></script>
+<span class='repetitions-calendrier' id='repetitions-calendrier'>
+[(#ENV**{valeurs}|table_valeur{repetitions}|WCalendar_statique_controller{'_repetitions'})]
+</span>
+
+<div class='edition-bouton' style='text-align:#LANG_RIGHT'>
+[(#ENV{evenement_action}|=={'evenement_modif'}|?{' ',''})
+<div style='float:#LANG_LEFT'>
+<input type='submit' name='supp_evenement' value='<:agenda:bouton_supprimer:>' class="fondl" />
+</div>
+]
+<input type='submit' name='cancel' value='<:agenda:bouton_annuler:>' class="fondl" />
+<input type='submit' name='ajouter' value='[(#ENV{evenement_action}|=={'evenement_modif'}|?{<:bouton_enregistrer:>,<:bouton_ajouter:>})]' class='fondo spip_boutons' onclick='javascript:getSelectedDate_repetitions()'>
+</div>
+</fieldset>
+</form>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/ical-agenda.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/ical-agenda.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/ical-agenda.html	(revision 30)
@@ -0,0 +1,20 @@
+#HTTP_HEADER{content-type:text/calendar}
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+X-WR-CALNAME;VALUE=TEXT:<BOUCLE_article (ARTICLES) {id_article}>[(#TITRE|filtrer_ical)] </BOUCLE_article>[[(#NOM_SITE_SPIP|filtrer_ical)]]
+X-WR-RELCALID:#URL_SITE_SPIP
+
+<BOUCLE_evemnt (EVENEMENTS) {id_article ?}>
+BEGIN:VEVENT
+SUMMARY:[(#TITRE|filtrer_ical)]
+UID:evenement#ID_EVENEMENT @ #URL_SITE_SPIP
+DTSTAMP:[(#DATE_DEBUT|date_ical)]
+DTSTART:[(#DATE_DEBUT|date_ical)]
+DTEND:[(#DATE_FIN|date_ical)]
+<B_article2>CATEGORIES:<BOUCLE_article2 (ARTICLES) {id_article=#ID_ARTICLE}>[(#TITRE|filtrer_ical)]</BOUCLE_article2>
+DESCRIPTION:[(#DESCRIPTIF|filtrer_ical)]\n[<:lieu:>(#LIEU|filtrer_ical)]
+STATUS:CONFIRMED
+END:VEVENT
+</BOUCLE_evemnt>
+
+END:VCALENDAR
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/agenda.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/agenda.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/agenda.css	(revision 30)
@@ -0,0 +1,262 @@
+.agenda_invisible_au_chargement {
+	visibility: hidden;
+}
+.agenda_visible_au_chargement {
+	visibility: visible;
+}
+#container_debut,#container_fin{
+	left:0px;
+	top:0px;
+	z-index:150;
+	filter:alpha(opacity=100);
+	opacity: 1.0;
+	-moz-opacity:1.0;
+}
+
+.agenda-calendrier {
+	width: 100%;
+	height: 60%;
+	font-weight: bold;
+	background-color: none;
+  }
+
+.agenda-visu-evenement {
+	position: absolute;
+	right :0px;
+	top :100px;
+	width: 400px;
+	height: 47em;
+	border-bottom: 1px solid #cccccc;
+	font-weight: bold;
+	z-index:100;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-family: Verdana, Arial, Sans, sans-serif;
+	font-size:small;
+  background-color: #F0FFC2;
+	filter:alpha(opacity=80);
+	opacity: 0.8;
+	-moz-opacity:0.8;
+	text-align:left;
+ }
+.agenda-visu-evenement-bouton-fermer{
+	position: absolute;
+	right:1em;
+	top:0px;
+	width:12px;
+	height:12px;
+}
+.agenda-visu-evenement-bouton-fermer a:hover{
+	border-color:#cccccc;
+	border-top:1px solid #cccccc;
+	border-left:1px solid #cccccc;
+	border-bottom:2px solid #cccccc;
+	border-right:2px solid #cccccc;
+}
+
+.article-evenement {
+	position: absolute;
+	top :0;
+	left :0px;
+	width : 100%;
+	height : 4em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-topright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-topright: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+
+.titre-titre {
+	position: absolute;
+	top :4em;
+	left :0px;
+	width : 20%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.titre-visu {
+	position: absolute;
+	top :4em;
+	left :20%;
+	width : 80%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+
+.lieu-titre {
+	position: absolute;
+	top :5.5em;
+	left :0px;
+	width : 20%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.lieu-visu {
+	position: absolute;
+	top :5.5em;
+	left :20%;
+	width : 80%;
+	height : 1.5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-bottomright: 8px;
+	border-radius-bottomright: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.horaire-titre {
+	position: absolute;
+	top :7.1em;
+	left :20%;
+	width : 80%;
+	height : 2em;
+	border-top: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-topright: 8px;
+	border-radius-topright: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.date-titre {
+	position: absolute;
+	top :7.1em;
+	left :0px;
+	width : 20%;
+	height : 2em;
+	border-top: 1px solid #cccccc;
+	border-left: 1px solid #cccccc;
+	-moz-border-radius-topleft: 8px;
+	border-radius-topleft: 8px;
+	font-weight: bold;
+	background-color: #ccff66;
+ }
+.date-visu {
+	position: absolute;
+	top :9em;
+	left :0%;
+	width : 100%;
+	height : 5em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	-moz-border-radius-bottomright: 8px;
+	border-radius-bottomright: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.descriptif-titre {
+	visibility: hidden;
+ }
+.descriptif-visu {
+	position: absolute;
+	top :14em;
+	left :0px;
+	width : 100%;
+	height: 6em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #ccff99;
+ }
+.agenda_mot_cle_select{
+width:49%;
+}
+.agenda_mots_cles{
+	position: absolute;
+	left:0px;
+	top:20em;
+	height:8em;
+	width:100%;
+	font-weight: bold;
+	background-color: #ccff99;
+}
+.repetitions-calendrier{
+	position: absolute;
+	left:0px;
+	top:28em;
+	height:17em;
+	width:100%;
+}
+.edition-bouton {
+	position: absolute;
+	bottom :0em;
+	left :0%;
+	width : 98%;
+	height:2em;
+	border-top: 1px solid #cccccc;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+	text-align : right;
+	vertical-align : bottom;
+	padding-right:2%;
+	-moz-border-radius-topright: 8px;
+	-moz-border-radius-bottomright: 8px;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	font-weight: bold;
+	background-color: #99cc33;
+ }
+a span.survol {
+	display: none;
+}
+
+a:hover .calendrier-verdana10 > span.survol {
+	display: block;
+	position: fixed;
+	top: auto;
+	left: auto;
+	width: auto;
+	padding: 5px;
+	z-index: 100;
+	text-decoration: none;
+  color: #333;
+	background: #ccff99;
+	border: solid 1px #99cc33;
+	font: 10px Verdana, sans-serif;
+	text-align: left;
+	-moz-border-radius-topright: 8px;
+	-moz-border-radius-bottomright: 8px;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	border-radius-topright: 8px;
+	border-radius-bottomright: 8px;
+	border-radius-topleft: 8px;
+	border-radius-bottomleft: 8px;
+	filter:alpha(opacity=80);
+	opacity: 0.8;
+	-moz-opacity:0.8;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/agenda_articles.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/agenda_articles.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/agenda_articles.css	(revision 30)
@@ -0,0 +1,84 @@
+.agenda_invisible_au_chargement {
+	visibility: hidden;
+}
+.agenda_visible_au_chargement {
+	visibility: visible;
+}
+.agenda-visu-evenement-bouton-fermer{
+display:none;
+}
+#container_debut{
+left:0px;
+top:0px;
+z-index:120;
+}
+#container_fin{
+left:0px;
+top:0px;
+z-index:120;
+}
+.agenda_mot_cle_select{
+float:left;
+width:32%;
+margin-right:0.5em;
+}
+.titre-titre {
+float:left;
+	width : 13%;
+	height : 2em;
+	font-weight: bold;
+ }
+.titre-visu {
+float:left;
+	width : 85%;
+	height : 2em;
+	font-weight: bold;
+ }
+.lieu-titre {
+float:left;
+	width : 13%;
+	height : 2em;
+	font-weight: bold;
+ }
+.lieu-visu {
+float:left;
+	width : 85%;
+	height : 2em;
+	font-weight: bold;
+}
+.horaire-titre {
+float:right;
+	width : 40%;
+	height : 2em;
+	font-weight: bold;
+ }
+.date-titre {
+float:left;
+	width : 58%;
+	height : 2em;
+	font-weight: bold;
+ }
+.date-visu {
+float:left;
+	width : 98%;
+	height : 5em;
+	font-weight: bold;
+}
+.descriptif-titre {
+float:left;
+	left :0px;
+	width : 98%;
+	height : 2em;
+	font-weight: bold;
+ }
+.descriptif-visu {
+float:left;
+	left :0%;
+	width : 98%;
+	height : 6em;
+	font-weight: bold;
+}
+.edition-bouton{
+float:right;
+margin-top:0.5em;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/calendrier.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/calendrier.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/calendrier.css	(revision 30)
@@ -0,0 +1,511 @@
+/*
+ * Styles du calendrier
+ */
+
+.calendrier-arial9 {
+	font-family: Arial, Sans, sans-serif; font-size: 9px;
+}
+
+.calendrier-arial10 {
+	font-family: Arial, Sans, sans-serif; font-size: 10px;
+}
+
+.calendrier-arial11 {
+	font-family: Arial, Sans, sans-serif; font-size: 11px;
+}
+
+.calendrier-verdana10 {
+	font-family: Verdana, Arial, Sans, sans-serif; font-size: 10px;
+}
+
+.calendrier-helvetica16 {
+	font-family: arial,helvetica,sans-serif;
+	font-size: 16px;
+	color: black;
+}
+
+div.navigation-calendrier {
+	color: white;
+	background-color: #99cc33;
+	font-family: verdana, arial, sans,sans-serif;
+	font-weight: bold;
+	font-size: 14px;
+}
+
+div.navigation-calendrier img {
+	border: 0px;
+	vertical-align: middle;
+	margin: 1px;
+}
+
+a.calendrier-annee {
+	background-color: #aaaaaa;
+	padding: 3px;
+	margin: 1px;
+	font-family: verdana, arial, sans,sans-serif;
+	font-size: 10px;
+	font-weight: bold;
+	color: white;
+	-moz-border-radius: 5px;
+}
+
+a.calendrier-annee:hover {
+	color: black;
+	background-color: white;
+}
+
+.calendrier-table-large {
+	border: 0px;
+	width: 900px;
+ }
+
+.calendrier-table-etroit {
+	border: 0px;
+	width: 750px;
+ }
+
+.calendrier-td-centre {
+	width: 550px;
+	padding-left: 25px;
+	padding-right: 25px;
+  	vertical-align: top;
+ }
+
+.calendrier-td {
+	width: 14%;
+  	vertical-align: top;
+ }
+
+.calendrier-th {
+	width: 14%;
+	padding: 5px;
+	text-align: center;
+  	vertical-align: center;
+	font-size: 10px;
+	font-weight: bold;
+	font-family: Verdana, Arial, Sans, sans-serif;
+ }
+
+.calendrier-th a {
+  color: black;
+}
+
+.calendrier-table-etroit  .calendrier-td-gauche {
+	width: 0px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-large  .calendrier-td-gauche {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-etroit  .calendrier-td-droit {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-table-large  .calendrier-td-droit {
+	width: 150px;
+  	vertical-align: top;
+ }
+
+.calendrier-jour {
+	position: relative;
+	color: #999999;
+	background-color: white;
+	border: 1px solid #aaaaaa;
+}
+
+.calendrier-agenda {
+	margin-left: 1px;
+	margin-top: 1px;
+	padding: 1px;
+	text-align: center;
+	background-color: white;
+	-moz-border-radius: 5px;
+ }
+
+.calendrier-demiagenda {
+	margin-left: 0px;
+	margin-top: 0px;
+	padding: 0px;
+	text-align: center;
+	background-color: white;
+	-moz-border-radius: 5px;
+ }
+
+
+.calendrier-tripleagenda {
+	vertical-align: top;
+	width: 33%;
+ }
+
+.calendrier-cadreagenda {
+	visibility: hidden;
+	width: 100%;
+	position: absolute;
+	padding-top: 5px;
+	padding-bottom: 5px;
+	border: 0px;
+	background-color: #ccff99;
+	-moz-border-radius-bottomleft: 8px;
+	-moz-border-radius-bottomright: 8px;
+ }
+
+.calendrier-titre {
+	padding: 5px;
+	text-align: center;
+	font-weight: bold;
+ }
+
+.calendrier-evenement {
+	padding: 2px;
+	margin-top: 2px;
+ }
+
+.calendrier-heurepile {
+	position: absolute;
+	margin-left: 2px;
+	margin-right: 2px;
+	border-top: 1px solid #cccccc;
+	font-weight: bold;
+	width: 100%;
+ }
+
+.calendrier-heurepile a {
+	color : #777777;
+	font-weight: bold;
+ }
+
+.calendrier-heurepile a:hover {
+	position: absolute;
+	border-bottom: 1px solid #cccccc;
+	font-weight: bold;
+	background-color: #ccff99;
+	width: 100%;
+ }
+
+.calendrier-heureface {
+	position: absolute;
+	margin-left: 2px;
+	margin-right: 2px;
+	border-top: 1px solid #cccccc;
+ }
+
+.calendrier-mozleft {
+	-moz-border-radius-topleft: 10px;
+	-moz-border-radius-bottomleft: 10px;
+ }
+
+.calendrier-mozright {
+	-moz-border-radius-topright: 10px;
+	-moz-border-radius-bottomright: 10px;
+ }
+
+.calendrier-moztop8 {
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-topright: 8px;
+}
+
+.calendrier-mozbottom8 {
+	-moz-border-radius-bottomleft: 8px;
+	-moz-border-radius-bottomright: 8px;
+}
+
+.calendrier-moztop6 {
+	-moz-border-radius-topleft: 6px;
+	-moz-border-radius-topright: 6px;
+}
+
+.calendrier-mozbottom6 {
+	-moz-border-radius-bottomleft: 6px;
+	-moz-border-radius-bottomright: 6px;
+}
+
+.calendrier-opacity {
+	-moz-opacity: 0.3;
+	filter: alpha(opacity=30);
+}
+
+
+.calendrier-png {
+	width: 12px;
+	height: 12px;
+	behavior: url(win_png.htc);
+}
+
+.calendrier-icone {
+	width: 14px;
+	height: 7px;
+	border: 0px;
+}
+
+.calendrier-noir  { 		/*  style anar */
+	color: black;
+}
+
+.calendrier-nb  { 		/*  style cinemat(yp)ographe */
+	background-color: white;
+	border: 1px solid black;
+	color: black;
+}
+
+.calendrier-couleur1 { 		/* Fushia */
+		background-color: #FDE5F2;
+		border: 1px solid #CD006F;
+		color: #CD006F;
+}
+.calendrier-couleur1i { 		/* Fushia */
+		background-color: #CD006F;
+		border: 1px solid #FDE5F2;
+		color: #FDE5F2
+}
+.calendrier-couleur2 { 		/* Bleu */
+		background-color: #EDF3FE;
+		border: 1px solid #5da7c5;
+		color: #5da7c5;
+}
+.calendrier-couleur2i { 		/* Bleu */
+		background-color: #5da7c5;
+		border: 1px solid #EDF3FE;
+		color: #EDF3FE
+}
+.calendrier-couleur3 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.calendrier-couleur3i { 		/* Bleu pastel */
+		background-color: #766CF6;
+		border: 1px solid #EBE9FF;
+		color: #EBE9FF
+}
+.calendrier-couleur4 { 		/* Orange */
+		background-color: #ffeecc;
+		border: 1px solid #fa9a00;
+		color: #fa9a00;
+}
+.calendrier-couleur4i { 		/* Orange */
+		background-color: #fa9a00;
+		border: 1px solid #ffeecc;
+		color: #ffeecc
+}
+.calendrier-couleur5 { 		/* Rouge (Vermillon) */
+		background-color: #FFEDED;
+		border: 1px solid #FF0000;
+		color: #FF0000;
+}
+.calendrier-couleur5i { 		/* Rouge (Vermillon) */
+		background-color: #FF0000;
+		border: 1px solid #FFEDED;
+		color: #FFEDED
+}
+.calendrier-couleur6 { 		/* Orange */
+		background-color: #FFF2EB;
+		border: 1px solid #E95503;
+		color: #E95503;
+}
+.calendrier-couleur6i { 		/* Orange */
+		background-color: #E95503;
+		border: 1px solid #FFF2EB;
+		color: #FFF2EB
+}
+.calendrier-couleur7 { 		/* Jaune */
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+}
+.calendrier-couleur7i { 		/* Jaune */
+		background-color: #ccaa00;
+		border: 1px solid #ffffee;
+		color: #ffffee
+}
+.calendrier-couleur8 { 		/* Vert pastel */
+		background-color: #E2FDEC;
+		border: 1px solid #009F3C;
+		color: #009F3C;
+}
+.calendrier-couleur8i { 		/* Vert pastel */
+		background-color: #009F3C;
+		border: 1px solid #E2FDEC;
+		color: #E2FDEC
+}
+.calendrier-couleur9 { 		/* Vert */
+		background-color: #e5fd63;
+		border: 1px solid #9DBA00;
+		color: #9DBA00;
+}
+.calendrier-couleur9i { 		/* Vert */
+		background-color: #9DBA00;
+		border: 1px solid #e5fd63;
+		color: #e5fd63
+}
+.calendrier-couleur10 { 		/* Rouge (Bordeaux) */
+		background-color: #FFE0E0;
+		border: 1px solid #640707;
+		color: #640707;
+}
+.calendrier-couleur10i { 		/* Rouge (Bordeaux) */
+		background-color: #640707;
+		border: 1px solid #FFE0E0;
+		color: #FFE0E0
+}
+.calendrier-couleur11 { 		/* Gris */
+		background-color: #F2F2F2;
+		border: 1px solid #3F3F3F;
+		color: #3F3F3F;
+}
+.calendrier-couleur11i { 		/* Gris */
+		background-color: #3F3F3F;
+		border: 1px solid #F2F2F2;
+		color: #F2F2F2
+}
+.calendrier-couleur12 {
+		background-color: #aaaaaa;
+		border: 1px solid black;
+		color:black;
+
+}
+.calendrier-couleur12i {
+		background-color: black;
+		border: 1px solid #aaaaaa;
+		color: #aaaaaa}
+.calendrier-couleur13 { /* Caca d'oie */
+		background-color: #FFFFE0;
+		border: 1px solid #666500;
+		color: #666500; 
+}
+.calendrier-couleur13i { 		/* Caca d'oie */
+		background-color: #666500;
+		border: 1px solid #FFFFE0;
+		color: #FFFFE0
+}
+.calendrier-couleur14 { 		/* Marron */
+		background-color: #F5EEE5;
+		border: 1px solid #8C6635;
+		color: #8C6635;
+}
+.calendrier-couleur14i { 		/* Marron */
+		background-color: #8C6635;
+		border: 1px solid #F5EEE5;
+		color: #F5EEE5
+}
+
+.calendrier-creneau,
+.calendrier-creneau-today,
+.calendrier-creneau-sunday {
+	position: absolute;
+	margin-left: 0px;
+	margin-right: 0px;
+	border-top: 0px ;
+	border-right: 0px ;
+	border-bottom: 0px ;
+	border-left: 0px ;
+	font-weight: bold;
+	background-color: #dddddd;
+	color: #dddddd;
+	width: 100%;
+ }
+
+.calendrier-creneau a {
+	color : #dddddd;
+	font-weight: bold;
+}
+.calendrier-creneau a:hover {
+	background-color: #ccff99;
+}
+
+.calendrier-creneau-today {
+	background-color: #eeeeee;
+	color: #eeeeee;
+}
+.calendrier-creneau-today a {
+	color : #eeeeee;
+	font-weight: bold;
+}
+.calendrier-creneau-today a:hover {
+	background-color: #ccff99;
+}
+
+.calendrier-creneau-sunday {
+/*	background-color: #ccff99;
+	color: #ccff99;*/
+}
+
+.calendrier-creneau-sunday a {
+	/*color : #ccff99;*/
+	color : #dddddd;
+	font-weight: bold;
+ }
+
+.calendrier-creneau-sunday a:hover {
+	/*background-color: #dddddd;*/
+	background-color: #ccff99;
+}
+
+.calendrier-plage,.calendrier-plage-selection { 		/* Orange */
+		background-color: #FFF2EB;
+		border: 1px solid #E95503;
+		color: #E95503;
+}
+.calendrier-plage-selection{
+		border: 3px solid #E95503;
+}
+.calendrier-reunions { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+
+.calendrier-evenement,.calendrier-evenement-selection { 		/* Vert pastel */
+		background-color: #eeeeee;
+		border: 0px solid #009F3C;
+}
+.calendrier-evenement-selection{
+}
+
+.calendrier-anniversaire { 		/* Jaune */
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+}
+.calendrier-rappel { 		/* Rouge (Vermillon) */
+		background-color: #FFEDED;
+		border: 1px solid #FF0000;
+		color: #FF0000;
+}
+
+.calendrier-plage-info { 		/* Jaune transparent*/
+		background-color: #ffffee;
+		border: 1px solid #ccaa00;
+		color: #ccaa00;
+		filter:alpha(opacity=50);
+		opacity: 0.5;
+		-moz-opacity:0.5;
+}
+.activite-couleur15 { 		/* Fushia */
+		background-color: #FDE5F2;
+		border: 1px solid #CD006F;
+		color: #CD006F;
+}
+.activite-couleur9 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.activite-couleur14 { 		/* Bleu pastel */
+		background-color: #EBE9FF;
+		border: 1px solid #766CF6;
+		color: #766CF6;
+}
+.activite-couleur5 { 		/* Vert pastel */
+		background-color: #E2FDEC;
+		border: 1px solid #009F3C;
+		color: #009F3C;
+}
+.activite-couleur12 { 		/* Orange */
+		background-color: #ffeecc;
+		border: 1px solid #fa9a00;
+		color: #fa9a00;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/multiselect.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/multiselect.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/img_pack/multiselect.js	(revision 30)
@@ -0,0 +1,115 @@
+/*
+	coded by Kae - kae@verens.com
+	I'd appreciate any feedback.
+	You have the right to include this in your sites.
+	Please retain this notice.
+*/
+
+/* edit these variables to customise the multiselect */ {
+	var show_toplinks=false;
+}
+
+/* global variables - do not touch */ {
+	var isIE=window.attachEvent?true:false;
+	var selectDefaults=[];
+}
+function addEvent(el,ev,fn){
+	if(isIE)el.attachEvent('on'+ev,fn);
+	else if(el.addEventListener)el.addEventListener(ev,fn,false);
+}
+function buildMultiselects(){
+	do{
+		found=0;
+		a=document.getElementsByTagName('select');
+		for(b=0;b<a.length,!found;b++){
+			var ms=a[b];
+			if(ms==null)break;
+			var name=ms.name.replace(/\[\]$/, '');
+			if(ms.multiple){
+				/* common variables */ {
+					selectDefaults[name]=[];
+					var found=1,disabled=ms.disabled?1:0,width=ms.offsetWidth,height=ms.offsetHeight;
+					if(width<120)width=120;
+					if(height<60)height=60;
+				}
+				/* set up wrapper */ {
+					var wrapper=document.createElement('div');
+					wrapper.style.width=width+"px";
+					wrapper.style.height=height+"px";
+					wrapper.style.position='relative';
+					wrapper.style.border="2px solid #000";
+					wrapper.style.borderColor="#333 #ccc #ccc #333";
+					wrapper.style.font="10px sans-serif";
+					if(disabled)wrapper.style.background='#ddd';
+				}
+				if(show_toplinks){ /* reset, all, none */
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','checked');"),'all'));
+					wrapper.appendChild(document.createTextNode(', '));
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','');"),'none'));
+					wrapper.appendChild(document.createTextNode(', '));
+					wrapper.appendChild(newLink("javascript:"+(disabled?"alert('selection disabled')":"multiselect_selectall('"+name+"','reset');"),'reset'));
+				}
+				/* setup multiselect */ {
+					newmultiselect=document.createElement('div');
+					newmultiselect.style.position='absolute';
+					newmultiselect.style.top=show_toplinks?'15px':'0';
+					newmultiselect.style.left='0';
+					newmultiselect.style.overflow='auto';
+					newmultiselect.style.width=(isIE?width-4:width)+"px";
+					newmultiselect.style.height=show_toplinks?height-(isIE?19:15)+"px":height+'px';
+				}
+				c=ms.getElementsByTagName('option');
+				for(d=0;d<c.length;d++){
+					var label=document.createElement('label');
+					label.style.display="block";
+					label.style.border="1px solid #eee";
+					label.style.borderWidth="1px 0";
+					label.style.font="10px arial";
+					label.style.lineHeight="10px";
+					label.style.paddingLeft="20px";
+					checkbox=document.createElement('input');
+					checkbox.type="checkbox";
+					if(c[d].selected){
+						checkbox.checked="checked";
+						checkbox.defaultChecked=true;
+					}
+					if(c[d].disabled){
+						checkbox.disabled='disabled';
+						label.style.color='#666';
+					}
+					selectDefaults[name][d]=c[d].selected?'checked':'';
+					if(disabled)checkbox.disabled="disabled";
+					checkbox.value=c[d].value;
+					checkbox.style.marginLeft="-16px";
+					checkbox.style.marginTop="-2px";
+					checkbox.name=ms.name;
+
+					// escape the label
+					var text=c[d].innerHTML;
+					text=text.replace(/\&nbsp;?/g, ' ');
+					text=text.replace(/\&lt;?/g, '<');
+					text=text.replace(/\&gt;?/g, '>');
+
+					labelText=document.createTextNode(text);
+					label.appendChild(checkbox);
+					label.appendChild(labelText);
+					newmultiselect.appendChild(label);
+				}
+			wrapper.appendChild(newmultiselect);
+			ms.parentNode.insertBefore(wrapper,ms);
+			ms.parentNode.removeChild(ms);
+			}
+		}
+	}while(found);
+}
+function multiselect_selectall(name,val){
+	var els=document.getElementsByTagName('input'),found=0;
+	for(var i=0;i<els.length;++i){
+		if((els[i].name==name+'[]'||els[i].name==name)&&!els[i].disabled)els[i].checked=val=='reset'?selectDefaults[name][found++]:val;
+	}
+}
+function newLink(href,text){
+	var e=document.createElement('a');e.href=href;e.appendChild(document.createTextNode(text));return e;
+}
+
+addEvent(window,'load',buildMultiselects);
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda.php.sav
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda.php.sav	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda.php.sav	(revision 30)
@@ -0,0 +1,1424 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/minipres'); 
+include_spip('inc/layer');
+include_spip('inc/texte'); // inclut inc_filtre
+include_spip('inc/calendar'); // inclut widget calendar
+
+charger_generer_url();
+
+//  Typographie generale des calendriers de 3 type: jour/semaine/mois(ou plus)
+
+// Notes: pour toutes les fonctions ayant parmi leurs parametres
+// annee, mois, jour, echelle, partie_cal, script, ancre
+// ceux-ci apparaissent TOUJOURS dans cet ordre 
+
+define(DEFAUT_D_ECHELLE,120); # 1 pixel = 2 minutes
+
+// 
+// Utilitaires sans html ni sql
+//
+
+// utilitaire de separation script / ancre
+// et de retrait des arguments a remplacer
+// (a mon avis cette fonction ne sert a rien, puisque parametre_url()
+// sait remplacer les arguments au bon endroit -- Fil)
+// Pas si simple: certains param ne sont pas remplaces 
+// et doivent reprendre leur valeur par defaut -- esj.
+function calendrier_retire_args_ancre($script)
+{
+	$script = str_replace('&amp;', '&', $script);
+  $script = str_replace('?bonjour=oui&?','?',$script);
+  if (ereg('^(.*)(#[^=&]*)$',$script, $m)) {
+	  $script = $m[1];
+	  $ancre = $m[2];
+  } else { $ancre = ''; }
+  if ($script[strlen($script)-1] == '?')  $script = substr($script,0,-1);
+  foreach(array('echelle','jour','mois','annee', 'type', 'partie_cal') as $arg) {
+		$script = preg_replace("/([?&])$arg=[^&]*&/",'\1', $script);
+		$script = preg_replace("/([?&])$arg=[^&]*$/",'\1', $script);
+	}
+  if (ereg('[?&]$', $script)) $script =   substr($script,0,-1);
+  return array(quote_amp($script), $ancre);
+}
+
+// tous les liens de navigations sont issus de cette fonction
+// on peut definir generer_url_date et un htacces pour simplifier les URL
+
+function calendrier_args_date($script, $annee, $mois, $jour, $type, $finurl) {
+	if (function_exists('generer_url_date'))
+		return generer_url_date($script, $annee, $mois, $jour, $type, $finurl);
+
+	$script = parametre_url($script, 'annee', sprintf("%04d", $annee));
+	$script = parametre_url($script, 'mois',  sprintf("%02d", $mois));
+	$script = parametre_url($script, 'jour',  sprintf("%02d", $jour));
+	$script = parametre_url($script, 'type',  $type);
+	return $script . $finurl;
+}
+
+# prend une heure de debut et de fin, ainsi qu'une echelle (seconde/pixel)
+# et retourne un tableau compose
+# - taille d'une heure
+# - taille d'une journee
+# - taille de la fonte
+# - taille de la marge
+
+function calendrier_echelle($debut, $fin, $echelle)
+{
+  if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
+  if ($fin <= $debut) $fin = $debut +1;
+
+  $duree = $fin - $debut;
+  $dimheure = floor((3600 / $echelle));
+  return array($dimheure,
+	       (($duree+2) * $dimheure),
+	       floor (14 / (1+($echelle/240))),
+	       floor(240 / $echelle));
+}
+
+# Calcule le "top" d'une heure
+
+function calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize) {
+	
+	$h_heure = substr($heure, 0, strpos($heure, ":"));
+	$m_heure = substr($heure, strpos($heure,":") + 1, strlen($heure));
+	$heure100 = $h_heure + ($m_heure/60);
+
+	if ($heure100 < $debut) $heure100 = ($heure100 / $debut) + $debut - 1;
+	if ($heure100 > $fin) $heure100 = (($heure100-$fin) / (24 - $fin)) + $fin;
+
+	$top = floor(($heure100 - $debut + 1) * $dimheure);
+
+	return $top;	
+}
+
+# Calcule la hauteur entre deux heures
+function calendrier_height ($heure, $heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) {
+
+	$height = calendrier_top ($heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) 
+				- calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize);
+
+	$padding = floor(($dimheure / 3600) * 240);
+	$height = $height - (2* $padding + 2); // pour padding interieur
+	
+	if ($height < ($dimheure/4)) $height = floor($dimheure/4); // eviter paves totalement ecrases
+	
+	return $height;	
+}
+
+//
+// init: calcul generique des evenements a partir des tables SQL
+//
+
+function http_calendrier_init($time='', $ltype='', $lechelle='', $lpartie_cal='', $script='', $evt='')
+{
+	global $mois, $annee, $jour, $type, $echelle, $partie_cal;
+
+	if (!$time) 
+	  {
+	    if (!$mois)
+	      $time = time();
+	    else
+	      $time = mktime(0,0,0,$mois,$jour,$annee);
+	    $type= 'mois';
+	  }
+
+	$jour = date("d",$time);
+	$mois = date("m",$time);
+	$annee = date("Y",$time);
+	if (!$ltype) $ltype = $type ? $type : 'mois';
+	if (!$lechelle) $lechelle = $echelle;
+	if (!$lpartie_cal) $lpartie_cal = $partie_cal;
+	list($script, $ancre) = 
+	  calendrier_retire_args_ancre($script); 
+	if (!$evt) {
+	  $g = 'sql_calendrier_' . $ltype;
+	  $evt = sql_calendrier_interval($g($annee,$mois, $jour));
+	  sql_calendrier_interval_articles("'$annee-$mois-00'", "'$annee-$mois-1'", $evt[0]);
+	  // si on veut les forums, decommenter
+#	  sql_calendrier_interval_forums($g($annee,$mois,$jour), $evt[0]);
+	}
+	$f = 'http_calendrier_' . $ltype;
+	return $f($annee, $mois, $jour, $lechelle, $lpartie_cal, $script, $ancre, $evt);
+
+}
+
+# affichage d'un calendrier de plusieurs semaines
+# si la periode est inferieure a 31 jours, on considere que c'est un mois
+
+function http_calendrier_mois($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+	$premier_jour = '01';
+	$dernier_jour = '31';
+
+	if (is_array($evt)) {
+	  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+	  if (!$premier_jour) $premier_jour = '01';
+	  if (!$dernier_jour)
+	    {
+	      $dernier_jour = 31;
+	      while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
+	    }
+	  if ($sansduree)
+	    foreach($sansduree as $d => $r) 
+	      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+	  $evt = 
+	    http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre) .
+	    http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre") ;
+	} else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  '</table>' .
+	  http_calendrier_sans_date($annee, $mois, $evenements) .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
+
+// si la periore a plus de 31 jours, c'est du genre trimestre, semestre etc
+// pas de navigation suivant/precedent alors
+
+function http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre){
+	if ($dernier_jour > 31) {
+	  $prec = $suiv = '';
+	  $periode = affdate_mois_annee(date("Y-m-d", mktime(1,1,1,$mois,$premier_jour,$annee))) . ' - '. affdate_mois_annee(date("Y-m-d", mktime(1,1,1,$mois,$dernier_jour,$annee)));
+	} else {
+
+	$mois_suiv=$mois+1;
+	$annee_suiv=$annee;
+	$mois_prec=$mois-1;
+	$annee_prec=$annee;
+	if ($mois==1){
+	  $mois_prec=12;
+	  $annee_prec=$annee-1;
+	}
+	else if ($mois==12){$mois_suiv=1;	$annee_suiv=$annee+1;}
+	$prec = array($annee_prec, $mois_prec, 1, "mois");
+	$suiv = array($annee_suiv, $mois_suiv, 1, "mois");
+	$periode = affdate_mois_annee("$annee-$mois-1");
+	}
+	return
+	  "\n<tr><td colspan='7'>" .
+	  http_calendrier_navigation($annee,
+				   $mois,
+				   $jour,
+				   $echelle,
+				   $partie_cal,
+				   $periode,
+				   $script,
+				   $prec,
+				   $suiv,
+				   'mois',
+				   $ancre) .
+	  "</td></tr>";
+
+}
+
+function http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre){
+	global $couleur_claire;
+
+	$bandeau ="";
+	for ($j=1; $j<8;$j++){
+		$bandeau .= 
+		  "\n\t<th class='calendrier-th'>" .
+		  _T('date_jour_' . (($j%7)+1)) .
+		  "</th>";
+	}
+	return "\n<tr" .
+	  (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . 
+	  ">$bandeau\n</tr>";
+}
+
+# dispose les lignes d'un calendrier de 7 colonnes (les jours)
+# chaque case est garnie avec les evenements du jour figurant dans $evenements
+
+function http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, $ancre='')
+{
+	global $couleur_claire, $spip_lang_left, $spip_lang_right;
+
+	// affichage du debut de semaine hors periode
+	$init = '';
+	$debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
+	for ($i=$debut ? $debut : 7;$i>1;$i--)
+	  {$init .= "\n\t<td style=\"border-bottom: 1px solid $couleur_claire;\">&nbsp;</td>";}
+
+	$total = '';
+	$ligne = '';
+	$today=date("Ymd");
+	for ($j=$premier_jour; $j<=$dernier_jour; $j++){
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour = date("d",$nom);
+		$jour_semaine = date("w",$nom);
+		$mois_en_cours = date("m",$nom);
+		$annee_en_cours = date("Y",$nom);
+		$amj = date("Y",$nom) . $mois_en_cours . $jour;
+		$couleur_texte = "black";
+		$couleur_fond = "";
+
+		if ($jour_semaine == 0) $couleur_fond = $couleur_claire;
+		else if ($jour_semaine==1)
+			  { 
+			    if ($ligne||$init)
+			      $total .= "\n<tr>$init$ligne\n</tr>";
+			    $ligne = $init = '';
+			  }
+		
+		if ($amj == $today) {
+			$couleur_texte = "red";
+			$couleur_fond = "white";
+		}
+		$res = '';
+		if ($evts = $evenements[$amj]) {
+		  foreach ($evts as $evenement)
+		    {
+		      $res .= isset($evenement['DTSTART']) ?
+			http_calendrier_avec_heure($evenement, $amj) :
+			http_calendrier_sans_heure($evenement);
+		    }
+		}
+
+		$ligne .= "\n\t\t<td\tclass='calendrier-td'
+			style='height: 100px; border-bottom: 1px solid $couleur_claire; border-$spip_lang_right: 1px solid $couleur_claire;" .
+		  ($couleur_fond ? " background-color: $couleur_fond;" : "") .
+		  ($ligne ? "" :
+		   " border-$spip_lang_left: 1px solid $couleur_claire;") .
+		  "'>" .
+		  (!_DIR_RESTREINT ? 
+		   (http_href(calendrier_args_date($script,$annee_en_cours, $mois_en_cours, $jour, "jour", $ancre), 
+			      $jour,
+			      $jour, "color: $couleur_texte",'calendrier-helvetica16') . 
+		    http_calendrier_ics_message($annee_en_cours, $mois_en_cours, $jour, false)):
+		   http_calendrier_mois_clics($annee_en_cours, $mois_en_cours, $jour, $script, $ancre)) .
+		  $res .
+		  "\n\t</td>";
+	}
+	return  $total . ($ligne ? "\n<tr>$ligne\n</tr>" : '');
+}
+
+// typo pour l'espace public
+
+function http_calendrier_mois_clics($annee, $mois, $jour, $script, $ancre)
+{
+      $d = mktime(0,0,0,$mois, $jour, $annee);
+      $semaine = date("W", $d);
+      return 
+	"<table width='100%'>\n<tr><td style='text-align: left'>". 
+	http_href(calendrier_args_date($script,$annee, $mois, $jour, "jour", $ancre), 
+		  "$jour/$mois",
+		  _T('date_jour_'. (1+date('w',$d))) .
+		  " $jour " .
+		  _T('date_mois_'.(0+$mois)),
+		  '','calendrier-helvetica16') .
+	"</td><td style='text-align: right'>" .
+	http_href(calendrier_args_date($script,$annee, $mois, $jour, "semaine", $ancre),
+		  $semaine,
+		  _T('date_semaines') . ": $semaine",
+		  '',
+		  'calendrier-helvetica16') .
+	"</td></tr>\n</table>";
+}
+
+# dispose les evenements d'une semaine
+
+function http_calendrier_semaine($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	$init = date("w",mktime(1,1,1,$mois,$jour,$annee));
+	$init = $jour+1-($init ? $init : 7);
+	$sd = '';
+
+	if (is_array($evt))
+	  {
+	  	if($partie_cal!='sansheure'){
+	    $sd = http_calendrier_sans_date($annee, $mois,$evt[0]);
+	    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+	    $evt =
+	      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+	      http_calendrier_semaine_sept($annee, $mois, $init, $echelle, $partie_cal, $evt);
+	  	}
+	  	else {
+			  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+			  if ($sansduree)
+			    foreach($sansduree as $d => $r) 
+			      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+		    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+		    $evt =
+		      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+		      http_calendrier_mois_sept($annee, $mois, $init, $init+ 6, $evenements, $script);
+	  	}
+	  } else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  "</table>" .
+	  $sd .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
+
+function http_calendrier_semaine_navigation($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
+
+	$fin = mktime (1,1,1,$mois, $jour+6, $annee);
+	$fjour = date("d",$fin);
+	$fmois = date("m",$fin);
+	$fannee = date("Y",$fin);
+	$fin = date("Y-m-d", $fin);
+	$debut = mktime (1,1,1,$mois, $jour, $annee);
+	$djour = date("d",$debut)+0;
+	$dmois = date("m",$debut);
+	$dannee = date("Y",$debut);
+	$debut = date("Y-m-d", $debut);
+	$periode = (($dannee != $fannee) ?
+		    (affdate($debut)." - ".affdate($fin)) :
+		    (($dmois == $fmois) ?
+		     ($djour ." - ".affdate_jourcourt($fin)) :
+		     (affdate_jourcourt($debut)." - ".affdate_jourcourt($fin))));
+
+  return
+    "\n<tr><td colspan='7'>" .
+    http_calendrier_navigation($annee,
+			       $mois,
+			       $jour,
+			       $echelle,
+			       $partie_cal, 
+			       $periode,
+			       $script,
+			       array($dannee, $dmois, ($djour-7), "semaine"),
+			       array($fannee, $fmois, ($fjour+1), "semaine"),
+			       'semaine',
+			       $ancre) .
+    "</td></tr>\n";
+}
+
+function http_calendrier_semaine_noms($annee, $mois, $jour, $script, $ancre){
+	global $couleur_claire;
+
+	$bandeau = '';
+
+	for ($j=$jour; $j<$jour+7;$j++){
+		$nom = mktime(0,0,0,$mois,$j,$annee);
+		$num = intval(date("d", $nom)) ;
+		$numois = date("m",$nom);
+		$nomjour = _T('date_jour_'. (1+date('w',$nom)));
+		$clic = ($nomjour . " " . $num . (($num == 1) ? 'er' : '') .
+			 ($ancre  ? ('/' . $numois) : ''));
+		$bandeau .= 
+		  "\n\t<th class='calendrier-th'>" .
+		  http_href(calendrier_args_date($script, date("Y",$nom), $numois, $num, 'jour', $ancre), $clic, $clic) .
+		  "</th>";
+	}
+	return "\n<tr" .
+	  (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . 
+	  ">$bandeau\n</tr>";
+}
+
+function http_calendrier_semaine_sept($annee, $mois, $jour, $echelle, $partie_cal, $evt)
+{
+	global $couleur_claire, $spip_ecran, $spip_lang_left;
+
+	$largeur =  ($spip_ecran == "large") ? 90 : 60;
+
+	$today=date("Ymd");
+	$total = '';
+	$style = "border-$spip_lang_left: 1px solid $couleur_claire; border-bottom: 1px solid $couleur_claire; border-top: 0px; border-right: 0px;";
+	for ($j=$jour; $j<$jour+7;$j++){
+		$v = mktime(0,0,0,$mois, $j, $annee);
+		$total .= "\n<td class='calendrier-td'>" .
+		  http_calendrier_ics($annee,$mois,$j, $echelle, $partie_cal, $largeur, $evt, ($style . ( (date("w",$v)==0 && isset($couleur_claire)) ? 
+			  " background-color: $couleur_claire;" :
+			  ((date("Ymd", $v) == $today) ? 
+			   " background-color: white;" :
+			   " background-color: #eeeeee;")))) .
+		  "\n</td>";
+	}
+	return "\n<tr class='calendrier-verdana10'>$total</tr>";
+}
+
+
+function http_calendrier_jour($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	return 	
+	  "\n<table class='calendrier-table-$spip_ecran'>" .
+	  "\n<tr><td class='calendrier-td-gauche'></td>" .
+	  "<td colspan='5' class='calendrier-td-centre'>" .
+	  http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal,
+				     (nom_jour("$annee-$mois-$jour") . " " .
+				      affdate_jourcourt("$annee-$mois-$jour")),
+				     $script,
+				     array($annee, $mois, ($jour-1), "jour"),
+				     array($annee, $mois, ($jour+1), "jour"),
+				     'jour',
+				     $ancre) .
+	  "</td>" .
+	  "<td class='calendrier-td-droit calendrier-arial10'></td>" .
+	  "</tr>" .
+	  (!is_array($evt) ? ("<tr><td>$evt</td></tr>") :
+	   (http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre) .
+	    http_calendrier_jour_sept($annee, $mois, $jour, $echelle,  $partie_cal, $script, $ancre, $evt))) .
+	  "</table>";
+}
+
+function http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
+
+	global $spip_ecran;
+	$finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+
+	$gauche = (_DIR_RESTREINT  || ($spip_ecran != "large"));
+	return
+	  "\n<tr><td class='calendrier-td-gauche'>" .
+	  ($gauche ? '' :
+	   http_calendrier_ics_titre($annee,$mois,$jour-1,$script, $finurl)) .
+	  "</td><td colspan='5' class='calendrier-td-centre'>" .
+	  (_DIR_RESTREINT ? '' :
+		   ("\n\t<div class='calendrier-titre'>" .
+		    http_calendrier_ics_message($annee, $mois, $jour, true) .
+		    '</div>')) .
+	  "</td><td class='calendrier-td-droit calendrier-arial10'> " .
+	   (_DIR_RESTREINT ? '' : http_calendrier_ics_titre($annee,$mois,$jour+1,$script, $finurl)) .
+	  "</td></tr>";
+}
+
+function http_calendrier_jour_sept($annee, $mois, $jour, $echelle,  $partie_cal, $script, $ancre, $evt){
+	global $spip_ecran;
+
+	$gauche = (_DIR_RESTREINT  || ($spip_ecran != "large"));
+	if ($partie_cal!="sansheure")
+		return
+		  "<tr class='calendrier-verdana10'>" .
+			# afficher en reduction le tableau du jour precedent
+		  "\n<td class='calendrier-td-gauche'>" .
+		  ($gauche  ? '' :
+		   http_calendrier_ics($annee, $mois, $jour-1, $echelle, $partie_cal, 0, $evt)) .
+		  "</td><td colspan='5' class='calendrier-td-centre'>" .
+		   http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, 300, $evt) .
+		  '</td>' .
+			# afficher en reduction le tableau du jour suivant
+		  "\n<td class='calendrier-td-droit'>" .
+	
+		  (_DIR_RESTREINT ? '' :
+		   http_calendrier_ics($annee, $mois, $jour+1, $echelle, $partie_cal, 0, $evt)) .
+		  '</td>' .
+		  "\n</tr>";
+	else {
+	  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+	  if ($sansduree)
+	    foreach($sansduree as $d => $r) 
+	      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+		return
+		  "<tr class='calendrier-verdana10'>" .
+			# afficher en reduction le tableau du jour precedent
+		  "\n<td class='calendrier-td-gauche'>" .
+		  ($gauche  ? '' :
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour-1, $jour-1,$evenements, $script, $ancre)
+		   ."</table>"
+		   ) .
+		  "</td><td colspan='5' class='calendrier-td-centre'>" .
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour, $jour,$evenements, $script, $ancre) .
+		   "</table>" .
+		  '</td>' .
+			# afficher en reduction le tableau du jour suivant
+		  "\n<td class='calendrier-td-droit'>" .
+		  (_DIR_RESTREINT ? '' :
+		  "<table width='100%'>".
+		   http_calendrier_mois_sept($annee, $mois, $jour+1, $jour+1,$evenements, $script, $ancre)
+		   ."</table>"
+		   ) .
+		  '</td>' .
+		  "\n</tr>";
+		
+	}
+}
+
+
+// Conversion d'un tableau de champ ics en des balises div positionnees    
+// Le champ categories indique la Classe de CSS a prendre
+// $echelle est le nombre de secondes representees par 1 pixel
+
+function http_calendrier_ics($annee, $mois, $jour,$echelle, $partie_cal,  $largeur, $evt, $style='') {
+	global $spip_lang_left;
+
+	// tableau
+	if ($partie_cal == "soir") {
+		$debut = 12;
+		$fin = 23;
+	} else if ($partie_cal == "matin") {
+		$debut = 4;
+		$fin = 15;
+	} else {
+		$debut = 7;
+		$fin =21;
+	}
+	
+	if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
+
+	list($dimheure, $dimjour, $fontsize, $padding) =
+	  calendrier_echelle($debut, $fin, $echelle);
+	$modif_decalage = round($largeur/8);
+
+	$date = date("Ymd", mktime(0,0,0,$mois, $jour, $annee));
+	list($sansheure, $avecheure) = $evt;
+	$avecheure = $avecheure[$date];
+	$sansheure = $sansheure[$date];
+
+	$total = '';
+
+	if ($avecheure)
+    {
+		$tous = 1 + count($avecheure);
+		$i = 0;
+		foreach($avecheure as $evenement){
+
+			$d = $evenement['DTSTART'];
+			$e = $evenement['DTEND'];
+			$d_jour = substr($d,0,8);
+			$e_jour = $e ? substr($e,0,8) : $d_jour;
+			$debut_avant = false;
+			$fin_apres = false;
+			
+			/* disparues sauf erreur
+			 $radius_top = " radius-top";
+			$radius_bottom = " radius-bottom";
+			*/
+			if ($d_jour <= $date AND $e_jour >= $date)
+			{
+
+			$i++;
+
+			// Verifier si debut est jour precedent
+			if (substr($d,0,8) < $date)
+			{
+				$heure_debut = 0; $minutes_debut = 0;
+				$debut_avant = true;
+				$radius_top = "";
+			}
+			else
+			{
+				$heure_debut = substr($d,-6,2);
+				$minutes_debut = substr($d,-4,2);
+			}
+
+			if (!$e)
+			{ 
+				$heure_fin = $heure_debut ;
+				$minutes_fin = $minutes_debut ;
+				$bordure = "border-bottom: dashed 2px";
+			}
+			else
+			{
+				$bordure = "";
+				if (substr($e,0,8) > $date) 
+				{
+					$heure_fin = 23; $minutes_fin = 59;
+					$fin_apres = true;
+					$radius_bottom = "";
+				}
+				else
+				{
+					$heure_fin = substr($e,-6,2);
+					$minutes_fin = substr($e,-4,2);
+				}
+			}
+			
+			if ($debut_avant && $fin_apres)  $opacity = "-moz-opacity: 0.6; filter: alpha(opacity=60);";
+			else $opacity = "";
+						
+			$haut = calendrier_top ("$heure_debut:$minutes_debut", $debut, $fin, $dimheure, $dimjour, $fontsize);
+			$bas =  !$e ? $haut :calendrier_top ("$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize);
+			$hauteur = calendrier_height ("$heure_debut:$minutes_debut", "$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize);
+
+			if ($bas_prec >= $haut) $decale += $modif_decalage;
+			else $decale = (4 * $fontsize);
+			if ($bas > $bas_prec) $bas_prec = $bas;
+			
+			$url = $evenement['URL']; 
+			$desc = propre($evenement['DESCRIPTION']);
+			$perso = substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@'));
+			$lieu = $evenement['LOCATION'];
+			$sum = ereg_replace(' +','&nbsp;', typo($evenement['SUMMARY']));
+			if (!$sum) { $sum = $desc; $desc = '';}
+			if (!$sum) { $sum = $lieu; $lieu = '';}
+			if (!$sum) { $sum = $perso; $perso = '';}
+			if ($sum)
+			  $sum = "<span class='calendrier-verdana10'><span  style='font-weight: bold;'>$sum</span>$lieu $perso</span>";
+			if (($largeur > 90) && $desc)
+			  $sum .=  "\n<br /><span class='calendrier-noir'>$desc</span>";
+			$colors = $evenement['CATEGORIES'];
+		  $sum = ((!$url) ? $sum : http_href(quote_amp($url), $sum, $desc,"border: 0px",$colors));
+			$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'ics'),'data'=>$sum));
+
+			$total .= "\n<div class='calendrier-arial10 $colors' 
+	style='cursor: auto; position: absolute; overflow: hidden;$opacity z-index: " .
+				$i .
+				"; $spip_lang_left: " .
+				$decale .
+				"px; top: " .
+				$haut .
+				"px; height: " .
+				$hauteur .
+				"px; width: ".
+				($largeur - 2 * ($padding+1)) .
+				"px; font-size: ".
+				floor($fontsize * 1.3) .
+				"px; padding: " .
+				$padding . 
+				"px; $bordure'
+	onmouseover=\"this.style.zIndex=" . $tous . "\"
+	onmouseout=\"this.style.zIndex=" . $i . "\">" .
+			  $sum . 
+				"</div>";
+			}
+		}
+    }
+	return
+	   "\n<div class='calendrier-jour' style='height: ${dimjour}px; font-size: ${fontsize}px;$style'>\n" .
+	  http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize) .
+	  $total .
+	  "\n</div>" .
+	  (!$sansheure ? "" :
+	   http_calendrier_ics_trois($sansheure, $largeur, $dimjour, $fontsize, '')) ;
+
+}
+
+# Affiche une grille horaire 
+# Selon l'echelle demandee, on affiche heure, 1/2 heure 1/4 heure, 5minutes.
+
+function http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize)
+{
+	global $spip_lang_left, $spip_lang_right;
+	$slice = floor($dimheure/(2*$fontsize));
+	if ($slice%2) $slice --;
+	if (!$slice) $slice = 1;
+
+	$total = '';
+	for ($i = $debut; $i < $fin; $i++) {
+		for ($j=0; $j < $slice; $j++) 
+		{
+			$total .= "\n<div class='calendrier-heure" .
+				($j  ? "face" : "pile") .
+				"' style='$spip_lang_left: 0px; top: ".
+				calendrier_top ("$i:".sprintf("%02d",floor(($j*60)/$slice)), $debut, $fin, $dimheure, $dimjour, $fontsize) .
+				"px;'>$i:" .
+				sprintf("%02d",floor(($j*60)/$slice)) . 
+				"</div>";
+		}
+	}
+
+	return "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: 2px;'>0:00</div>" .
+		$total .
+		"\n<div class='calendrier-heurepile' style='$spip_lang_left: 0px; top: ".
+		calendrier_top ("$fin:00", $debut, $fin, $dimheure, $dimjour, $fontsize).
+		"px;'>$fin:00</div>" .
+		"\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: ".
+		($dimjour - $fontsize - 2) .
+		"px;'>23:59</div>";
+}
+
+# si la largeur le permet, les evenements sans duree, 
+# se placent a cote des autres, sinon en dessous
+
+function http_calendrier_ics_trois($evt, $largeur, $dimjour, $fontsize, $border)
+{
+	global $spip_lang_left; 
+
+	$types = array();
+	foreach($evt as $v)
+	  $types[isset($v['DESCRIPTION']) ? 'info_articles' :
+		 (isset($v['DTSTART']) ? 'info_liens_syndiques_3' :
+		  'info_breves_02')][] = $v;
+	$res = '';
+	foreach ($types as $k => $v) {
+	  $res2 = '';
+	  foreach ($v as $evenement) {
+	    $res2 .= http_calendrier_sans_heure($evenement);
+	  }
+	  $res .= "\n<div class='calendrier-verdana10 calendrier-titre'>".
+	    _T($k) .
+	    "</div>" .
+	    $res2;
+	}
+		
+	if ($largeur > 90) {
+		$largeur += (5*$fontsize);
+		$pos = "-$dimjour";
+	} else { $largeur = (3*$fontsize); $pos= 0; }
+	  
+	return "\n<div style='position: relative; z-index: 2; top: ${pos}px; margin-$spip_lang_left: " . $largeur . "px'>$res</div>";
+}
+
+function http_calendrier_ics_titre($annee, $mois, $jour,$script, $finurl='')
+{
+	$date = mktime(0,0,0,$mois, $jour, $annee);
+	$jour = date("d",$date);
+	$mois = date("m",$date);
+	$annee = date("Y",$date);
+	$nom = affdate_jourcourt("$annee-$mois-$jour");
+	return "<div class='calendrier-arial10 calendrier-titre'>" .
+	  http_href(calendrier_args_date($script, $annee, $mois, $jour, 'jour', $finurl), $nom, $nom, '', 'calendrier-noir') .
+	  "</div>";
+}
+
+
+function http_calendrier_sans_date($annee, $mois, $evenements)
+{
+  $r = $evenements[0+($annee . $mois . "00")];
+  if (!$r) return "";
+  $res = "\n<div class='calendrier-arial10 calendrier-titre'>".
+    _T('info_mois_courant').
+    "</div>";
+  foreach ($r as $evenement) $res .= http_calendrier_sans_heure($evenement);
+  return $res;
+}
+
+
+function http_calendrier_sans_heure($ev)
+{
+	$desc = propre($ev['DESCRIPTION']);
+	$sum = $ev['SUMMARY'];
+	if (!$sum) $sum = $desc;
+	$i = isset($ev['DESCRIPTION']) ? 11 : 9; // 11: article; 9:autre
+	if ($ev['URL'])
+	  $sum = http_href(quote_amp($ev['URL']), $sum, $desc);
+	$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$ev,'type'=>'sans_heure'),'data'=>$sum));
+	return "\n<div class='calendrier-arial$i calendrier-evenement'>" .
+	  "<span class='" . $ev['CATEGORIES'] . "'>&nbsp;</span>&nbsp;$sum</div>"; 
+}
+
+function http_calendrier_avec_heure($evenement, $amj)
+{
+	$jour_debut = substr($evenement['DTSTART'], 0,8);
+	$jour_fin = substr($evenement['DTEND'], 0, 8);
+	if ($jour_fin <= 0) $jour_fin = $jour_debut;
+	if (($jour_debut <= 0) OR ($jour_debut > $amj) OR ($jour_fin < $amj))
+	  return "";
+	
+	$desc = propre($evenement['DESCRIPTION']);
+	$sum = $evenement['SUMMARY'];
+	if (!$sum) $sum = $desc;
+	$sum = ereg_replace(' +','&nbsp;', typo($sum));
+	if ($lieu = $evenement['LOCATION'])
+	  $sum .= '<br />' . $lieu;
+	if ($perso = $evenement['ATTENDEE'])
+	  $sum .=  '<br />' . substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@'));
+	if ($evenement['URL'])
+	  $sum = http_href(quote_amp($evenement['URL']), $sum, $desc, 'border: 0px');
+
+	$sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'avec_heure'),'data'=>$sum));
+	$opacity = "";
+	$deb_h = substr($evenement['DTSTART'],-6,2);
+	$deb_m = substr($evenement['DTSTART'],-4,2);
+	$fin_h = substr($evenement['DTEND'],-6,2);
+	$fin_m = substr($evenement['DTEND'],-4,2);
+	
+	if ($deb_h >0 OR $deb_m > 0) {
+	  if ((($deb_h > 0) OR ($deb_m > 0)) AND $amj == $jour_debut)
+	    { $deb = "<span  style='font-weight: bold;'>" . $deb_h . ':' . $deb_m . '</span>';}
+	  else { 
+	    $deb = '...'; 
+	  }
+	  
+	  if ((($fin_h > 0) OR ($fin_m > 0)) AND $amj == $jour_fin)
+	    { $fin = "<span  style='font-weight: bold;'>" . $fin_h . ':' . $fin_m . '</span> ';}
+	  else { 
+	    $fin = '...'; 
+	  }
+	  
+	  if ($amj == $jour_debut OR $amj == $jour_fin) {
+	    $sum = "<div>$deb-$fin</div>$sum";
+	  } else {
+	    $opacity =' calendrier-opacity';
+	  }
+	}
+	return "\n<div class='calendrier-arial10 calendrier-evenement " . $evenement['CATEGORIES'] ."$opacity'>$sum\n</div>\n"; 
+}
+
+# Bandeau superieur d'un calendrier selon son $type (jour/mois/annee):
+# 2 icones vers les 2 autres types, a la meme date $jour $mois $annee
+# 2 icones de loupes pour zoom sur la meme date et le meme type
+# 2 fleches appelant le $script sur les periodes $pred/$suiv avec une $ancre
+# et le $nom du calendrier
+
+function http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, $nom, $script, $args_pred, $args_suiv, $type, $ancre)
+{
+	global $spip_lang_right, $spip_lang_left, $couleur_foncee;
+
+	if (!$echelle) $echelle = DEFAUT_D_ECHELLE;
+
+	if ($args_pred) {
+	  list($a, $m, $j, $t) = $args_pred;
+	  $args_pred = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+				 http_img_pack("fleche-$spip_lang_left.png", '&lt;&lt;&lt;', "class='calendrier-png'"),
+				 _T('precedent'));
+	}
+
+	if ($args_suiv) {
+	  list($a, $m, $j, $t) = $args_suiv;
+	  $args_suiv = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+				 http_img_pack("fleche-$spip_lang_right.png",  '&gt;&gt;&gt;', "class='calendrier-png'"),
+				 _T('suivant'));
+	}
+
+	$today=getdate(time());
+	$jour_today = $today["mday"];
+	$mois_today = $today["mon"];
+	$annee_today = $today["year"];
+
+	$id = 'nav-agenda' .ereg_replace('[^A-Za-z0-9]', '', $ancre);
+
+	return 
+	  "<div class='navigation-calendrier calendrier-moztop8'" 
+	  . (!isset($couleur_foncee) ? "" : "\nstyle='background-color: $couleur_foncee;'")
+	  . "><div style='float: $spip_lang_right; padding-left: 5px; padding-right: 5px;'>"
+	  . (($type == "mois") ? '' :
+	     (
+		  http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=sansheure$ancre"),
+				 "sans-heure.gif",
+				 "class='calendrier-png" .
+				 (($partie_cal == "sansheure") ? " calendrier-opacity'" : "'"),
+				 _T('sans_heure'))
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=tout$ancre"),
+				 "heures-tout.png",
+				 "class='calendrier-png" .
+				 (($partie_cal == "tout") ? " calendrier-opacity'" : "'"),
+				 _T('cal_jour_entier'))
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=matin$ancre"),
+				 "heures-am.png",
+				 "class='calendrier-png" .
+				 (($partie_cal == "matin") ? " calendrier-opacity'" : "'"),
+				 _T('cal_matin'))
+
+		  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=soir$ancre"),
+				 "heures-pm.png", 
+				 "class='calendrier-png" .
+				 (($partie_cal == "soir") ? " calendrier-opacity'" : "'"),
+				 _T('cal_apresmidi'))
+		  . "&nbsp;"
+		  . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;partie_cal=$partie_cal&amp;echelle=" .
+					  floor($echelle * 1.5)) . $ancre,
+					 "loupe-moins.gif",
+					 '',
+					 _T('info_zoom'). '-')
+		  . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;partie_cal=$partie_cal&amp;echelle=" .
+					  floor($echelle / 1.5)) . $ancre, 
+					 "loupe-plus.gif",
+					 '', 
+					 _T('info_zoom'). '+')
+		  ))
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "jour", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),"cal-jour.gif",
+			  (($type == 'jour') ? " class='calendrier-opacity'" : ''),
+			  _T('cal_par_jour'))
+
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "semaine", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"), "cal-semaine.gif", 
+			  (($type == 'semaine') ?  " class='calendrier-opacity'" : "" ),
+			  _T('cal_par_semaine'))
+
+	  . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "mois", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),"cal-mois.gif",
+			  (($type == 'mois') ? " class='calendrier-opacity'" : "" ),
+			  _T('cal_par_mois'))
+	  . "</div>"
+	  . "&nbsp;&nbsp;"
+	  . http_href_img(calendrier_args_date($script,$annee_today, $mois_today, $jour_today, $type, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
+			  "cal-today.gif",
+			  (" onmouseover=\"montrer('$id');\"" .
+			   (($annee == $annee_today && $mois == $mois_today && (($type == 'mois')  || ($jour == $jour_today)))
+			    ? " class='calendrier-opacity'" : "")),
+			  _T("ecrire:info_aujourdhui"))
+	  . "&nbsp;"
+	  . $args_pred 
+	  . $args_suiv
+	  . "&nbsp;&nbsp;"
+	  . $nom
+	  . (_DIR_RESTREINT ? '' :  aide("messcalen"))
+	  . "</div>"
+	  . http_calendrier_invisible($annee, $mois, $jour, $script, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre", $id);
+}
+
+
+// fabrique un petit agenda accessible par survol
+
+function http_calendrier_invisible($annee, $mois, $jour, $script, $ancre, $id)
+{
+	global $spip_lang_right, $spip_lang_left, $couleur_claire;
+	$gadget = "<div style='position: relative;z-index: 1000;'
+			onmouseover=\"montrer('$id');\"
+			onmouseout=\"cacher('$id');\">"
+	  . "<table id='$id' class='calendrier-cadreagenda'"
+	  . (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'")
+	  . ">\n<tr><td colspan='3' style='text-align:$spip_lang_left;'>";
+
+	$annee_avant = $annee - 1;
+	$annee_apres = $annee + 1;
+
+	for ($i=$mois; $i < 13; $i++) {
+	  $nom = nom_mois("$annee_avant-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee_avant, $i, 1, "mois", $ancre),
+				     $nom,$nom . ' ' . $annee_avant,'', 'calendrier-annee') ;
+			}
+	for ($i=1; $i < $mois - 1; $i++) {
+	  $nom = nom_mois("$annee-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee,'', 'calendrier-annee');
+			}
+	$gadget .= "</td></tr>"
+		. "\n<tr><td class='calendrier-tripleagenda'>"
+		. http_calendrier_agenda($annee, $mois-1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>\n<td class='calendrier-tripleagenda'>"
+	  . http_calendrier_agenda($annee, $mois, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>\n<td class='calendrier-tripleagenda'>"
+	  . http_calendrier_agenda($annee, $mois+1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) 
+		. "</td>"
+		. "</tr>"
+		. "\n<tr><td colspan='3' style='text-align:$spip_lang_right;'>";
+	for ($i=$mois+2; $i <= 12; $i++) {
+	  $nom = nom_mois("$annee-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee,'', 'calendrier-annee');
+			}
+	for ($i=1; $i < $mois+1; $i++) {
+	  $nom = nom_mois("$annee_apres-$i-1");
+	  $gadget .= http_href(calendrier_args_date($script, $annee_apres, $i, 1, "mois", $ancre),
+					$nom,$nom . ' ' . $annee_apres,'', 'calendrier-annee');
+			}
+	return $gadget . "</td></tr></table></div>";
+}
+
+// agenda mensuel 
+
+function http_calendrier_agenda ($annee, $mois, $jour_ved, $mois_ved, $annee_ved, $semaine = false,  $script='', $ancre='', $evt='') {
+
+  if (!$script) $script =  $GLOBALS['PHP_SELF'] ;
+
+  if (!$mois) {$mois = 12; $annee--;}
+  elseif ($mois==13) {$mois = 1; $annee++;}
+  if (!$evt) $evt = sql_calendrier_agenda($annee, $mois);
+  $nom = affdate_mois_annee("$annee-$mois-1");
+  return 
+    "<div class='calendrier-titre calendrier-arial10'>" .
+    http_href(calendrier_args_date($script, $annee, $mois, 1, 'mois', $ancre),
+	      $nom, $nom,
+	      'color: black;') .
+    "<table width='100%' cellspacing='0' cellpadding='0'>" .
+    http_calendrier_agenda_rv ($annee, $mois, $evt,				
+			        'http_calendrier_clic', array($script, $ancre),
+			        $jour_ved, $mois_ved, $annee_ved, 
+				$semaine) . 
+    "</table>" .
+    "</div>";
+}
+
+function http_calendrier_clic($annee, $mois, $jour, $type, $couleur, $perso)
+{
+
+  list($script, $ancre) = $perso;
+
+  return http_href(calendrier_args_date($script, $annee, $mois, $jour,$type, $ancre), 
+		   $jour,
+		   "$jour-$mois-$annee",
+		   "color: $couleur; font-weight: bold");
+}
+
+// typographie un mois sous forme d'un tableau de 7 colonnes
+
+function http_calendrier_agenda_rv ($annee, $mois, $les_rv, $fclic, $perso='',
+				    $jour_ved='', $mois_ved='', $annee_ved='',
+				    $semaine='') {
+	global $couleur_foncee, $spip_lang_left, $spip_lang_right;
+
+	// Former une date correcte (par exemple: $mois=13; $annee=2003)
+	$date_test = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
+	$mois = mois($date_test);
+	$annee = annee($date_test);
+	if ($semaine) 
+	{
+		$jour_semaine_valide = date("w",mktime(1,1,1,$mois_ved,$jour_ved,$annee_ved));
+		if ($jour_semaine_valide==0) $jour_semaine_valide=7;
+		$debut = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+1,$annee_ved);
+		$fin = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+7,$annee_ved);
+	} else { $debut = $fin = '';}
+	
+	$today=getdate(time());
+	$jour_today = $today["mday"];
+	$cemois = ($mois == $today["mon"] AND $annee ==  $today["year"]);
+
+	$total = '';
+	$ligne = '';
+	$jour_semaine = date("w", mktime(1,1,1,$mois,1,$annee));
+	if ($jour_semaine==0) $jour_semaine=7;
+	for ($i=1;$i<$jour_semaine;$i++) $ligne .= "\n\t<td></td>";
+	$style0 = (!isset($couleur_foncee)) ? "" : " style='border: 1px solid $couleur_foncee;'";
+	for ($j=1; (checkdate($mois,$j,$annee)); $j++) {
+		$style = "";
+		$nom = mktime(1,1,1,$mois,$j,$annee);
+		$jour_semaine = date("w",$nom);
+		if ($jour_semaine==0) $jour_semaine=7;
+
+		if ($j == $jour_ved AND $mois == $mois_ved AND $annee == $annee_ved) {
+		  $class= 'calendrier-arial11 calendrier-demiagenda';
+		  $type = 'jour';
+		  $couleur = "black";
+		  } else if ($semaine AND $nom >= $debut AND $nom <= $fin) {
+		  $class= 'calendrier-arial11 calendrier-demiagenda' . 
+ 		      (($jour_semaine==1) ? " calendrier-$spip_lang_left"  :
+		       (($jour_semaine==7) ? " calendrier-$spip_lang_right" :
+			''));
+		  $type = ($semaine ? 'semaine' : 'jour') ;
+		  $couleur = "black";
+		} else {
+		  if ($j == $jour_today AND $cemois) {
+			$style = $couleur_foncee;
+			if(!$style) $style = '#333333';
+			$couleur = "white";
+		    } else {
+			if ($jour_semaine == 7) {
+				$style = "#aaaaaa";
+				$couleur = 'white';
+			} else {
+				$style = "#ffffff";
+				$couleur = "#aaaaaa";
+			}
+			if ($les_rv[$j] > 0) {
+			  $style = "#ffffff";
+			  $couleur = "black";
+			}
+		  }
+		  $class= 'calendrier-arial11 calendrier-agenda';
+		  $type = ($semaine ? 'semaine' : 'jour') ;
+		}
+		if ($style)
+		  $style = " style='background-color: $style'";
+		else $style = $style0;
+		$ligne .= "\n\t<td><div class='$class'$style>" .
+		  $fclic($annee,$mois, $j, $type, $couleur, $perso) .
+		  "</div></td>";
+		if ($jour_semaine==7) 
+		    {
+		      if ($ligne) $total .= "\n<tr>$ligne\n</tr>";
+		      $ligne = '';
+		    }
+	}
+	return $total . (!$ligne ? '' : "\n<tr>$ligne\n</tr>");
+}
+
+
+function calendrier_categories($table, $num, $objet)
+{
+  if (function_exists('generer_calendrier_class'))
+    return generer_calendrier_class($table, $num, $objet);
+  else {
+    // cf calendrier.css
+    $result= spip_fetch_array(spip_query("SELECT " . (($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . "
+FROM	$table
+WHERE	$objet=$num
+"));
+    if ($result) $num = $result[0];
+    return 'calendrier-couleur' . (($num%14)+1);
+  }
+}
+
+//------- fonctions d'appel MySQL. 
+// au dela cette limite, pas de production HTML
+
+function sql_calendrier_mois($annee,$mois,$jour) {
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,1,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(0,0,0,$mois+1,1,$annee)) .
+	" 00:00:00'";
+	return array($avant, $apres);
+}
+
+function sql_calendrier_semaine($annee,$mois,$jour) {
+	$w_day = date("w", mktime(0,0,0,$mois, $jour, $annee));
+	if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero
+	$debut = $jour-$w_day;
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$debut,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$debut+7,$annee)) .
+	" 23:59:59'";
+	return array($avant, $apres);
+}
+
+// ici on prend en fait le jour, la veille et le lendemain
+
+function sql_calendrier_jour($annee,$mois,$jour) {
+	$avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$jour-1,$annee)) . "'";
+	$apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$jour+1,$annee)) .
+	" 23:59:59'";
+	return array($avant, $apres);
+}
+
+// retourne un tableau de 2 tableaux indexes par des dates
+// - le premier indique les evenements du jour, sans indication de duree
+// - le deuxime indique les evenements commencant ce jour, avec indication de duree
+
+function sql_calendrier_interval($limites) {
+	list($avant, $apres) = $limites;
+	$evt = array();
+	sql_calendrier_interval_articles($avant, $apres, $evt);
+	sql_calendrier_interval_breves($avant, $apres, $evt);
+	sql_calendrier_interval_rubriques($avant, $apres, $evt);
+	return array($evt, sql_calendrier_interval_rv($avant, $apres));
+}
+
+function  sql_calendrier_interval_forums($limites, &$evenements) {
+	list($avant, $apres) = $limites;
+	$result=spip_query("
+SELECT	DISTINCT titre, date_heure, id_forum
+FROM	spip_forum
+WHERE	date_heure >= $avant
+ AND	date_heure < $apres
+ORDER BY date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date_heure']);
+		$id = $row['id_forum'];
+		$evenements[$amj][]=
+		array(
+			'URL' => generer_url_forum($id),
+			'CATEGORIES' => 'calendrier-couleur7',
+			'SUMMARY' => $row['titre'],
+			'DTSTART' => date_ical($row['date_heure']));
+	}
+}
+
+# 3 fonctions retournant les evenements d'une periode
+# le tableau retourne est indexe par les balises du format ics
+# afin qu'il soit facile de produire de tels documents.
+
+function sql_calendrier_interval_articles($avant, $apres, &$evenements) {
+	
+	$result=spip_query("
+SELECT	id_article, titre, date, descriptif, chapo
+FROM	spip_articles
+WHERE	statut='publie'
+ AND	date >= $avant
+ AND	date < $apres
+ORDER BY date
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date']);
+		$id = $row['id_article'];
+		$evenements[$amj][]=
+		    array(
+			  'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
+			'DESCRIPTION' => $row['descriptif'],
+			'SUMMARY' => $row['titre'],
+			'URL' => generer_url_article($id, 'prop'));
+	}
+}
+
+function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) {
+	
+	$result=spip_query("
+SELECT	DISTINCT R.id_rubrique, titre, descriptif, date
+FROM	spip_rubriques AS R, spip_documents_rubriques AS L
+WHERE	statut='publie'
+ AND	date >= $avant
+ AND	date < $apres
+ AND	R.id_rubrique = L.id_rubrique
+ORDER BY date
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date']);
+		$id = $row['id_rubrique'];
+		$evenements[$amj][]=
+		    array(
+			  'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
+			'DESCRIPTION' => $row['descriptif'],
+			'SUMMARY' => $row['titre'],
+			'URL' => generer_url_rubrique($id, 'prop'));
+	}
+}
+
+function sql_calendrier_interval_breves($avant, $apres, &$evenements) {
+	$result=spip_query("
+SELECT	id_breve, titre, date_heure, id_rubrique
+FROM	spip_breves
+WHERE	statut='publie'
+ AND	date_heure >= $avant
+ AND	date_heure < $apres
+ORDER BY date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$amj = date_anneemoisjour($row['date_heure']);
+		$id = $row['id_breve'];
+		$ir = $row['id_rubrique'];
+		$evenements[$amj][]=
+		array(
+		      'URL' => generer_url_breve($id, 'prop'),
+		      'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
+		      'SUMMARY' => $row['titre']);
+	}
+}
+
+function sql_calendrier_interval_rv($avant, $apres) {
+	global $connect_id_auteur;
+	$evenements= array();
+	if (!$connect_id_auteur) return $evenements;
+	$result=spip_query("
+SELECT	messages.id_message, messages.titre, messages.texte,
+	messages.date_heure, messages.date_fin, messages.type
+FROM	spip_messages AS messages, 
+	spip_auteurs_messages AS lien
+WHERE	((lien.id_auteur='$connect_id_auteur'
+ AND	lien.id_message=messages.id_message) OR messages.type='affich')
+ AND	messages.rv='oui' 
+ AND	((messages.date_fin >= $avant OR messages.date_heure >= $avant) AND messages.date_heure <= $apres)
+ AND	messages.statut='publie'
+GROUP BY messages.id_message
+ORDER BY messages.date_heure
+");
+	while($row=spip_fetch_array($result)){
+		$date_heure=$row["date_heure"];
+		$date_fin=$row["date_fin"];
+		$type=$row["type"];
+		$id_message=$row['id_message'];
+
+		if ($type=="pb")
+		  $cat = 'calendrier-couleur2';
+		else {
+		  if ($type=="affich")
+		  $cat = 'calendrier-couleur4';
+		  else {
+		    if ($type!="normal")
+		      $cat = 'calendrier-couleur12';
+		    else {
+		      $cat = 'calendrier-couleur9';
+		      $auteurs = array();
+		      $result_aut=spip_query("
+SELECT	auteurs.nom 
+FROM	spip_auteurs AS auteurs,
+	spip_auteurs_messages AS lien 
+WHERE	(lien.id_message='$id_message' 
+  AND	(auteurs.id_auteur!='$connect_id_auteur'
+  AND	lien.id_auteur=auteurs.id_auteur))");
+			while($row_auteur=spip_fetch_array($result_aut)){
+				$auteurs[] = $row_auteur['nom'];
+			}
+		    }
+		  }
+		}
+
+		$jour_avant = substr($avant, 9,2);
+		$mois_avant = substr($avant, 6,2);
+		$annee_avant = substr($avant, 1,4);
+		$jour_apres = substr($apres, 9,2);
+		$mois_apres = substr($apres, 6,2);
+		$annee_apres = substr($apres, 1,4);
+		$ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-".sprintf("%02d",$jour_apres));
+
+		// Calcul pour les semaines a cheval sur deux mois 
+ 		$j = 0;
+		$amj = date_anneemoisjour("$annee_avant-$mois_avant-".sprintf("%02d", $j+($jour_avant)));
+
+		while ($amj <= $ical_apres) {
+		if (!($amj == date_anneemoisjour($date_fin) AND ereg("00:00:00", $date_fin)))  // Ne pas prendre la fin a minuit sur jour precedent
+			$evenements[$amj][$id_message]=
+			  array(
+				'URL' => generer_url_ecrire("message","id_message=$id_message"),
+				'DTSTART' => date_ical($date_heure),
+				'DTEND' => date_ical($date_fin),
+				'DESCRIPTION' => $row['texte'],
+				'SUMMARY' => $row['titre'],
+				'CATEGORIES' => $cat,
+				'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs,", "));
+			
+			$j ++; 
+			$ladate = date("Y-m-d",mktime (1,1,1,$mois_avant, ($j + $jour_avant), $annee_avant));
+			
+			$amj = date_anneemoisjour($ladate);
+
+		}
+
+	}
+  return $evenements;
+}
+
+// fonction SQL, pour la messagerie
+
+function sql_calendrier_taches_annonces () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT * FROM spip_messages 
+WHERE type = 'affich' AND rv != 'oui' AND statut = 'publie' ORDER BY date_heure DESC");
+	if (spip_num_rows($result) > 0)
+		while ($x = spip_fetch_array($result)) $r[] = $x;
+	return $r;
+}
+
+function sql_calendrier_taches_pb () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT * FROM spip_messages AS messages 
+WHERE id_auteur=$connect_id_auteur AND statut='publie' AND type='pb' AND rv!='oui'");
+	if (spip_num_rows($result) > 0){
+	  $r = array();
+	  while ($x = spip_fetch_array($result)) $r[] = $x;
+	}
+	return $r;
+}
+
+function sql_calendrier_taches_rv () {
+	global $connect_id_auteur;
+	$r = array();
+	if (!$connect_id_auteur) return $r;
+	$result = spip_query("
+SELECT messages.* 
+FROM spip_messages AS messages, spip_auteurs_messages AS lien 
+WHERE ((lien.id_auteur='$connect_id_auteur' 
+	AND lien.id_message=messages.id_message) 
+	OR messages.type='affich') 
+AND messages.rv='oui'
+AND ( (messages.date_heure > DATE_SUB(NOW(), INTERVAL 1 DAY) 
+	AND messages.date_heure < DATE_ADD(NOW(), INTERVAL 1 MONTH))
+	OR (messages.date_heure < NOW() AND messages.date_fin > NOW() ))
+AND messages.statut='publie' 
+GROUP BY messages.id_message 
+ORDER BY messages.date_heure");
+	if (spip_num_rows($result) > 0){
+	  $r = array();
+	  while ($x = spip_fetch_array($result)) $r[] = $x;
+	}
+	return  $r;
+}
+
+function sql_calendrier_agenda ($annee, $mois) {
+	global $connect_id_auteur;
+
+	$rv = array();
+	if (!$connect_id_auteur) return $rv;
+	$date = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
+	$mois = mois($date);
+	$annee = annee($date);
+
+	// rendez-vous personnels dans le mois
+	$result_messages=spip_query("SELECT messages.date_heure FROM spip_messages AS messages, spip_auteurs_messages AS lien WHERE ((lien.id_auteur='$connect_id_auteur' AND lien.id_message=messages.id_message) OR messages.type='affich') AND messages.rv='oui' AND messages.date_heure >='$annee-$mois-1' AND date_heure < DATE_ADD('$annee-$mois-1', INTERVAL 1 MONTH) AND messages.statut='publie'");
+	while($row=spip_fetch_array($result_messages)){
+		$rv[journum($row['date_heure'])] = 1;
+	}
+	return $rv;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_filtres.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_filtres.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_filtres.php	(revision 30)
@@ -0,0 +1,204 @@
+<?php
+/**
+ * Fichier de filtres communs au plugin Agenda et PIM_agenda
+ *
+ */
+
+function Agenda_memo_full($date_deb=0, $date_fin=0 , $titre='', $descriptif='', $lieu='', $url='', $cal='')
+{
+	static $agenda = array();
+	if (!$date_deb) {
+		$res = $agenda;
+		$agenda=array();
+		return $res;
+	}
+	$url=str_replace("&amp;","&",$url);
+	
+	$idatedeb = date_ical($date_deb);
+	$idatefin = date_ical($date_fin);
+	$cal = trim($cal); // func_get_args (filtre alterner) rajoute \n !!!!
+	$startday1=explode(' ',$date_deb);
+	$startday1=$startday1['0'].' 00:00:00';
+	$ts_startday1=strtotime($startday1);
+	$ts_date_fin=strtotime($date_fin);
+	$maxdays=365;
+	while (($ts_startday1<$ts_date_fin)&&($maxdays-->0))
+	{
+		$day=date('Y-m-d H:i:s',$ts_startday1);
+		$agenda[$cal][(date_anneemoisjour($day))][] =  array(
+			'CATEGORIES' => $cal,
+			'DTSTART' => $idatedeb,
+			'DTEND' => $idatefin,
+			'DESCRIPTION' => $descriptif,
+			'SUMMARY' => $titre,
+			'LOCATION' => $lieu,
+			'URL' => $url);
+		$ts_startday1 += 26*3600; // le jour suivant : +26 h pour gerer les changements d'heure
+		$ts_startday1 = mktime(0, 0, 0, date("m",$ts_startday1), 
+		date("d",$ts_startday1), date("Y",$ts_startday1)); // et remise a zero de l'heure	
+	}
+
+	// toujours retourner vide pour qu'il ne se passe rien
+	return "";
+}
+
+function Agenda_memo_evt_full($date_deb=0, $date_fin=0 , $titre='', $descriptif='', $lieu='', $url='', $cal='')
+{
+	static $evenements = array();
+	if (!$date_deb) return $evenements;
+	$url=str_replace("&amp;","&",$url);
+	
+	$idatedeb = date_ical(reset(explode(" ",$date_deb))." 00:00:00");
+	$idatefin = date_ical(reset(explode(" ",$date_fin))." 00:00:00");
+	$cal = trim($cal); // func_get_args (filtre alterner) rajoute \n !!!!
+	$startday1=explode(' ',$date_deb);
+	$startday1=$startday1['0'].' 00:00:00';
+	$ts_startday1=strtotime($startday1);
+	$ts_date_fin=strtotime($date_fin);
+	$maxdays=365;
+	while (($ts_startday1<$ts_date_fin)&&($maxdays-->0))
+	{
+		$day=date('Y-m-d H:i:s',$ts_startday1);
+		$evenements[$cal][(date_anneemoisjour($day))][] =  array(
+			'CATEGORIES' => $cal,
+			'DTSTART' => $idatedeb,
+			'DTEND' => $idatefin,
+			'DESCRIPTION' => $descriptif,
+			'SUMMARY' => $titre,
+			'LOCATION' => $lieu,
+			'URL' => $url);
+		$ts_startday1 += 26*3600; // le jour suivant : +26 h pour gerer les changements d'heure
+		$ts_startday1 = mktime(0, 0, 0, date("m",$ts_startday1), 
+		date("d",$ts_startday1), date("Y",$ts_startday1)); // et remise a zero de l'heure	
+	}
+
+	// toujours retourner vide pour qu'il ne se passe rien
+	return "";
+}
+
+function Agenda_affiche_full($i)
+{
+	$args = func_get_args();
+	$nb = array_shift($args); // nombre d'evenements (on pourrait l'afficher)
+	$sinon = array_shift($args);
+	if (!$nb) return $sinon;
+	$type = array_shift($args);
+	$agenda = Agenda_memo_full(0);
+	$evt_avec = array();
+	foreach (($args ? $args : array_keys($agenda)) as $k) {
+		if (isset($agenda[$k])&&is_array($agenda[$k]))
+			foreach($agenda[$k] as $d => $v) {
+				$evt_avec[$d] = isset($evt_avec[$d]) ? (array_merge($evt_avec[$d], $v)) : $v;
+			}
+	}
+
+	$evenements = Agenda_memo_evt_full(0);
+	$evt_sans = array();
+	foreach (($args ? $args : array_keys($evenements)) as $k) {
+		if (isset($evenements[$k])&&is_array($evenements[$k]))
+			foreach($evenements[$k] as $d => $v) {
+				$evt_sans[$d] = isset($evt_sans[$d]) ? (array_merge($evt_sans[$d], $v)) : $v;
+			}
+	}
+
+
+	if ($type != 'periode')
+		$evt = array($evt_sans, $evt_avec);
+	else
+	{
+		$d = array_keys($evt_avec);
+		$mindate = min($d);
+		$min = substr($mindate,6,2);
+		$max = $min + ((strtotime(max($d)) - strtotime($mindate)) / (3600 * 24));
+		if ($max < 31) $max = 0;
+			$evt = array($evt_sans, $evt_avec, $min, $max);
+		$type = 'mois';
+	}
+
+	include_spip('inc/agenda');
+	$texte=http_calendrier_init('', $type, '', '', self(), $evt);
+
+	return $texte;
+}
+
+function Agenda_affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui'){
+	static $trans_tbl=NULL;
+	if ($trans_tbl==NULL){
+		$trans_tbl = get_html_translation_table (HTML_ENTITIES);
+		$trans_tbl = array_flip ($trans_tbl);
+	}
+	
+	$date_debut = strtotime($date_debut);
+	$date_fin = strtotime($date_fin);
+	$s = "";
+	if (($d=date("Y-m-d",$date_debut))==date("Y-m-d",$date_fin))
+	{ // meme jour
+		$s = ucfirst(nom_jour($d))." ".affdate_jourcourt($d);
+		if ($horaire=='oui'){
+			$s .= " ".($hd=date("H:i",$date_debut));
+			if ($hd!=($hf=date("H:i",$date_fin)))
+				$s .= "-$hf";
+		}
+	}
+	else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin))
+	{ // meme annee et mois, jours differents
+		$d=date("Y-m-d",$date_debut);
+		if ($horaire=='oui'){
+			$s = _T('agenda:evenement_date_du') . " " . affdate_jourcourt($d);
+			$s .= " ".($hd=date("H:i",$date_debut));
+			$s .= " " . _T('agenda:evenement_date_au').date("d  H:i ",$date_fin);
+		}
+		else {
+			$s = _T('agenda:evenement_date_du') . " " . jour($d);
+			$s .= " " . _T('agenda:evenement_date_au').affdate_jourcourt(date("Y-m-d",$date_fin));
+		}
+	}
+	else if ((date("Y",$date_debut))==date("Y",$date_fin))
+	{ // meme annee, mois et jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = _T('agenda:evenement_date_du') . " " . affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= " "._T('agenda:evenement_date_au').affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_fin);
+	}
+	else
+	{ // tout different
+		$s = _T('agenda:evenement_date_du') . " " . affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= " "._T('agenda:evenement_date_au').affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_fin);
+	}
+	return unicode2charset(charset2unicode(strtr($s,$trans_tbl),''));	
+}
+
+function Agenda_dateplus($date,$secondes,$format){
+	$date = strtotime($date)+eval("return $secondes;"); // permet de passer une expression
+	return date($format,$date);
+}
+
+// decale les mois de la date.
+// cette fonction peut raboter le jour si le nouveau mois ne les contient pas
+// exemple 31/01/2007 + 1 mois => 28/02/2007
+function Agenda_moisdecal($date,$decalage,$format){
+	include_spip('inc/filtres');
+	$date_array = recup_date($date);
+	if ($date_array) list($annee, $mois, $jour) = $date_array;
+	if (!$jour) $jour=1;
+	if (!$mois) $mois=1;
+	$mois2 = $mois + $decalage;
+	$date2 = mktime(1, 1, 1, $mois2, $jour, $annee);
+	// mois normalement attendu
+	$mois3 = date('m', mktime(1, 1, 1, $mois2, 1, $annee));
+	// et si le mois de la nouvelle date a moins de jours...
+	$mois2 = date('m', $date2);
+	if ($mois2 - $mois3) $date2 = mktime(1, 1, 1, $mois2, 0, $annee);
+	return date($format, $date2);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_gestion.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_gestion.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_gestion.php	(revision 30)
@@ -0,0 +1,441 @@
+<?php
+
+include_spip('inc/texte');
+include_spip('inc/date');
+include_spip('inc/layer');
+include_spip('inc/presentation');
+include_spip('inc/minipres');
+include_spip('inc/calendar');
+include_spip('agenda_mes_fonctions');
+
+function article_editable($id_article){
+	return autoriser('modifier','article',$id_article);
+}
+
+function Agenda_afficher_date_evenement($date_debut, $date_fin, $horaire){
+	$s = "";
+	if (($d=date("Y-m-d",$date_debut))==date("Y-m-d",$date_fin))
+	{ // meme jour
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui'){
+			$s .= " ".($hd=date("H:i",$date_debut));
+			if ($hd!=($hf=date("H:i",$date_fin)))
+				$s .= "-$hf";
+		}
+	}
+	else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin))
+	{ // meme annee et mois, jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".($hd=date("H:i",$date_debut));
+		$s .= "<br/>"._T('agenda:evenement_date_au').date(($horaire=='oui')?"d  H:i ":"d ",$date_fin);
+	}
+	else if ((date("Y",$date_debut))==date("Y",$date_fin))
+	{ // meme annee, mois et jours differents
+		$d=date("Y-m-d",$date_debut);
+		$s = affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= "<br/>"._T('agenda:evenement_date_au').affdate_jourcourt($d);
+		if ($horaire=='oui')
+			$s .= " ".date("H:i",$date_fin);
+	}
+	else
+	{ // tout different
+		$s = affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_debut);
+		$d = date("Y-m-d",$date_fin);
+		$s .= "<br/>"._T('agenda:evenement_date_au').affdate($d);
+		if ($horaire=='oui')
+			$s .= " ".date("(H:i)",$date_fin);
+	}
+	return $s;	
+}
+
+function Agenda_formulaire_article_afficher_evenements($id_article, $flag_editable, $script)
+{
+	global $connect_statut, $options,$connect_id_auteur;
+	$out = "";
+
+	$les_evenements = array();
+
+	$result = spip_query( "SELECT * FROM spip_evenements AS evenements "
+	. "WHERE evenements.id_article="._q($id_article)
+	. " AND evenements.id_evenement_source=0"
+	. " GROUP BY evenements.id_evenement ORDER BY evenements.date_debut");
+
+	if (spip_num_rows($result)) {
+		$out .= "<div class='liste liste-evenements'>";
+		$out .= "<table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>";
+		$table = array();
+		while ($row = spip_fetch_array($result,SPIP_ASSOC)) {
+			$vals = array();
+			$id_evenement = $row['id_evenement'];
+			$titre = typo($row['titre']);
+			$descriptif = typo($row['descriptif']);
+			$horaire = $row['horaire'];
+			$date_debut = strtotime($row['date_debut']);
+			$date_fin = strtotime($row['date_fin']);
+			$id_evenement_source = $row['id_evenement_source'];
+			$repetition = ($id_evenement_source!=0);
+			
+			$les_evenements[] = $id_evenement;
+
+			$s = "<a href='".generer_url_ecrire('calendrier',"id_evenement=$id_evenement&ajouter_id_article=$id_article")."'>";
+			$s .= http_img_pack("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-12.png",'', "border='0'", _T('agenda:titre_sur_l_agenda'));
+			$s .= "</a>";
+			$vals[] = $s;
+
+			$s = Agenda_afficher_date_evenement($date_debut,$date_fin, $horaire);
+			$s_rep = "";
+			$count_rep = 0;
+			$res2 = spip_query("SELECT * FROM spip_evenements WHERE id_evenement_source="._q($id_evenement)." ORDER BY date_debut");
+			while ($row2 = spip_fetch_array($res2)){
+				$s_rep .= Agenda_afficher_date_evenement(strtotime($row2['date_debut']),strtotime($row2['date_fin']),$row2['horaire'])."<br/>";
+				$count_rep++;
+			}
+			if (strlen($s_rep)){
+				$s .= "<br/>".bouton_block_invisible("repetitions_evenement_$id_evenement");
+				$s .= "$count_rep ". _T('agenda:evenement_repetitions');
+				$s .= debut_block_invisible("repetitions_evenement_$id_evenement");
+				$s .= $s_rep;
+				$s .= fin_block();
+			}
+
+			$vals[] = $s;
+
+			
+			if ($flag_editable) {
+				$s = ajax_action_auteur('editer_evenement', "$id_article-editer-$id_evenement", $script, "id_article=$id_article&id_evenement=$id_evenement&edit=oui", array($titre ? $titre : '<em>('._T('info_sans_titre').')</em>',''),'','wc_init');
+				$vals[] = $s;
+			}
+			else{
+				$vals[] = $titre;
+			}
+			$vals[] = propre($descriptif);
+		
+			if ($flag_editable) {
+				$vals[] = ajax_action_auteur('editer_evenement', "$id_article-supprimer-$id_evenement", $script, "id_article=$id_article", array(_T('agenda:lien_retirer_evenement')."&nbsp;". http_img_pack('croix-rouge.gif', "X", "width='7' height='7' border='0' align='middle'"),''),"&id_article=$id_article&supp_evenement=$id_evenement",'wc_init');
+			} else {
+				$vals[] = "";
+			}
+			
+			$table[] = $vals;
+		}
+	
+		$largeurs = array('', '', '', '', '');
+		$styles = array('arial11', 'arial11', 'arial2', 'arial11', 'arial11');
+		$out .= afficher_liste($largeurs, $table, $styles, false);
+	
+		$out .= "</table></div>\n";
+	
+		$les_evenements = join(',', $les_evenements);
+	}
+	return array($out,$les_evenements) ;
+}
+
+
+//
+// Liste des evenements agenda de l'article
+//
+
+function Agenda_formulaire_article_ajouter_evenement($id_article, $les_evenements, $flag_editable, $script){
+  global $spip_lang_left, $spip_lang_right, $options;
+	global $connect_statut, $options,$connect_id_auteur, $couleur_claire ;
+	$id_evenement = intval(_request('id_evenement'));
+	$edit = _request('edit') && in_array($id_evenement,explode(",",$les_evenements));
+	$saisie_rapide = _request('saisie_rapide')!==NULL;
+	$deplie = $saisie_rapide || $edit || _request('neweven');
+
+	$out = "";
+	$out .= "<div style='clear: both;'></div>";
+	if ($flag_editable){
+		if ($deplie)
+			$out .=  debut_block_visible("evenementsarticle");
+		else
+			$out .=  debut_block_invisible("evenementsarticle");
+		
+		$out .=  "<div style='width:100%;'>";
+		$out .=  "<table width='100%'>";
+		$out .=  "<tr>";
+		$out .=  "<td>";
+	
+		if ($edit){
+		} else {
+		}
+
+		$bouton_ajout = false;
+		if ($edit){
+			$out .=  "<span class='verdana1'><strong>"._T('agenda:titre_cadre_modifier_evenement')."&nbsp; </strong></span>\n";
+			$form =  "<input type='hidden' name='id_article' value='$id_article' />";
+			$form .= Agenda_formulaire_edition_evenement($id_evenement, false);
+			$bouton_ajout = true;
+			$out .= ajax_action_auteur('editer_evenement',"$id_article-modifier-$id_evenement", $script, "id_article=$id_article&edit=1", $form,'','wc_init');
+		}
+		else{
+			if ($saisie_rapide){
+				$out .=  "<span class='verdana1'><strong>"._T('saisierapide:titre_cadre_ajouter_liste_evenement')."&nbsp; </strong></span>\n";
+				include_spip('inc/agenda_saisie_rapide');
+				$form .= Agenda_formulaire_saisie_rapide_previsu();
+				if (strlen($form)){
+					$form .=  "<input type='hidden' name='id_article' value='$id_article' />";
+					$out .= ajax_action_auteur('editer_evenement',"$id_article-saisierapidecreer-0", $script, "id_article=$id_article&saisie_rapide=1", $form);
+				}
+				$form =  "<input type='hidden' name='id_article' value='$id_article' />";
+				$form .= Agenda_formulaire_saisie_rapide();
+				$out .= ajax_action_auteur('editer_evenement',"$id_article-saisierapidecompiler-0", $script, "id_article=$id_article&saisie_rapide=1", $form);
+				$bouton_ajout = true;
+			}
+			else {
+				$out .=  "<span class='verdana1'><strong>"._T('agenda:titre_cadre_ajouter_evenement')."&nbsp; </strong></span>\n";
+				// recuperer le titre de l'article pour le mettre par defaut sur l'evenement
+				$titre_defaut = "";
+				$res = spip_query("SELECT titre FROM spip_articles where id_article="._q($id_article));
+				if ($row = spip_fetch_array($res))
+					$titre_defaut = $row['titre'];
+				
+				$form = "<input type='hidden' name='id_article' value='$id_article' />";
+				$form .= Agenda_formulaire_edition_evenement(NULL, true, '', $titre_defaut);
+				$id_evenement = 0;
+				$out .= ajax_action_auteur('editer_evenement',"$id_article-modifier-$id_evenement", $script, "id_article=$id_article&edit=1", $form,'','wc_init');
+			}
+		}
+			
+		$out .= "</div>";
+		$out .=  "</td></tr></table>";
+		$out .= "<div style='clear: both;'></div>";
+
+		if ($bouton_ajout)
+			$out .= ajax_action_auteur('editer_evenement',"$id_article-creer-0", $script, "id_article=$id_article&neweven=1", array(http_img_pack(_DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", _T("agenda:icone_creer_evenement"), "width='24' height='24' border='0' align='middle'")."&nbsp;"._T("agenda:icone_creer_evenement"),''),'','wc_init')
+				. "&nbsp;";
+		if (!$saisie_rapide)
+			$out .= ajax_action_auteur('editer_evenement',"$id_article-creer-0", $script, "id_article=$id_article&saisie_rapide=1", array(http_img_pack(_DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", _T("saisierapide:icone_saisie_rapide"), "width='24' height='24' border='0' align='middle'")."&nbsp;"._T("saisierapide:icone_saisie_rapide"),''));
+
+		$out .= "</div>";
+		$out .=  fin_block();
+	}
+	return $out;
+}
+
+function Agenda_formulaire_article($id_article, $flag_editable, $script){
+
+  global $spip_lang_left, $spip_lang_right, $options;
+	global $connect_statut, $options,$connect_id_auteur, $couleur_claire ;
+	
+	$out = "<div id='editer_evenement-$id_article'>";
+	$out .= "<a name='agenda'></a>";
+	if ($flag_editable) {
+		//$out .= Agenda_action_formulaire_article($id_article);
+		if (_request('edit')||_request('neweven'))
+			$bouton = bouton_block_visible("evenementsarticle");
+		else
+			$bouton = bouton_block_invisible("evenementsarticle");
+	}
+
+	$out .= debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", true, "", $bouton._T('agenda:texte_agenda')
+	." <a href='".generer_url_ecrire('calendrier',"ajouter_id_article=$id_article")."'>"._T('icone_calendrier')."</a>");
+
+	//
+	// Afficher les evenements
+	//
+
+	list($s,$les_evenements) = Agenda_formulaire_article_afficher_evenements($id_article, $flag_editable, $script);
+	$out .= $s;
+	//
+	// Ajouter un evenements
+	//
+
+	if ($flag_editable)
+		$out .= Agenda_formulaire_article_ajouter_evenement($id_article, $les_evenements, $flag_editable, $script);
+
+
+	$out .= fin_cadre_enfonce(true);
+	$out .= "</div>";
+	return $out;
+}
+
+function Agenda_formulaire_edition_evenement($id_evenement, $neweven, $ndate="", $titre_defaut=""){
+	global $spip_lang_right;
+	$out = "";
+
+	// inits
+	$ftitre=$titre_defaut;
+	$flieu='';
+	$fdescriptif='';
+	$fstdatedeb=time();
+	$fhoraire = 'oui';
+	if (($neweven)&&($ndate)){
+		$newdate=urldecode($ndate);
+		$test=strtotime($newdate);
+		if ($test>0)
+			$fstdatedeb=$test;
+	}
+	$fstdatefin=$fstdatedeb+60*60;
+
+	if ($id_evenement!=NULL){
+		$res = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement="._q($id_evenement));
+		if ($row = spip_fetch_array($res)){
+			if (!$neweven){
+				$fid_evenement=$row['id_evenement'];
+				$ftitre=entites_html($row['titre']);
+				$flieu=entites_html($row['lieu']);
+				$fhoraire=entites_html($row['horaire']);
+				$fdescriptif=entites_html($row['descriptif']);
+				$fstdatedeb=strtotime($row['date_debut']);
+				$fstdatefin=strtotime($row['date_fin']);
+			}
+	 	}
+	}
+
+	$url=self();
+	$url=parametre_url($url,'edit','');
+	$url=parametre_url($url,'neweven','');
+	$url=parametre_url($url,'ndate','');
+	$url=parametre_url($url,'id_evenement','');
+
+	$out .= "<div class='agenda-visu-evenement'>";
+
+	$ajouter_id_article = _request('ajouter_id_article');
+	if ($ajouter_id_article && !_request('id_article')){
+		$res2 = spip_query("SELECT * FROM spip_articles AS articles WHERE id_article="._q($ajouter_id_article));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div class='article-evenement'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html($row2['titre'])."</a>";
+			$out .= "</div>\n";
+		}
+	}
+	
+	$out .= "<div class='agenda-visu-evenement-bouton-fermer'>";
+	$out .= "<a href='$url' onclick=\"$('#voir_evenement-0').html('');return false;\">";
+	$out .= "<img src='"._DIR_PLUGIN_AGENDA."/img_pack/croix.png' width='12' height='12' style='border:none;'></a>";
+	$out .= "</div>\n";
+
+	if (!$neweven){
+	  $out .=  "<input type='hidden' name='id_evenement' value='$fid_evenement' />\n";
+	  $out .=  "<input type='hidden' name='evenement_modif' value='1' />\n";
+	}
+	else {
+	  $out .=  "<input type='hidden' name='evenement_insert' value='1' />\n";
+	}
+	
+	// TITRE
+	$out .=  "<div class='titre-titre'>"._T('agenda:evenement_titre')."</div>\n";
+	$out .=  "<div class='titre-visu'>";
+	$out .=  "<input type='text' name='evenement_titre' value=\"$ftitre\" style='width:100%;' />";
+	$out .=  "</div>\n";
+
+	// LIEU
+	$out .=  "<div class='lieu-titre'>"._T('agenda:evenement_lieu')."</div>";
+	$out .=  "<div class='lieu-visu'>";
+	$out .=  "<input type='text' name='evenement_lieu' value=\"$flieu\" style='width:100%;' />";
+	$out .=  "</div>\n";
+
+	// Horaire
+	$out .=  "<div class='horaire-titre'>";
+	$out .=  "<input type='checkbox' name='evenement_horaire' value='oui' ";
+	$out .= ($fhoraire=='oui'?"checked='checked' ":"");
+	$out .= " onClick=\"var element =  findObj('evenement_horaire');var choix = element.checked;
+	if (choix==true){	setvisibility('afficher_horaire_debut_evenement', 'visible');setvisibility('afficher_horaire_fin_evenement', 'visible');}
+	else{setvisibility('afficher_horaire_debut_evenement', 'hidden');setvisibility('afficher_horaire_fin_evenement', 'hidden');}\"";
+	$out .= "/>";
+	$out .= _T('agenda:evenement_horaire')."</div>";
+
+	// DATES
+	$out .=  "<div class='date-titre'>"._T('agenda:evenement_date')."</div>";
+	$out .=  "<div class='date-visu'>";
+	$out .=  _T('agenda:evenement_date_de');
+	$out .= WCalendar_controller($d=date('Y-m-d H:i:s',$fstdatedeb),"_evenement_debut");
+	$out .= "<span class='agenda_".($fhoraire=='oui'?"":"in")."visible_au_chargement' id='afficher_horaire_debut_evenement'>";
+	$out .=  _T('agenda:evenement_date_a_immediat');
+	$out .= Agenda_heure_selector($d,"_debut");
+	$out .=	"</span>";
+	$out .=  "<br/>";
+	$out .=  _T('agenda:evenement_date_au');
+	$out .= WCalendar_controller($d=date('Y-m-d H:i:s',$fstdatefin),"_evenement_fin");
+	$out .= "<span class='agenda_".($fhoraire=='oui'?"":"in")."visible_au_chargement' id='afficher_horaire_fin_evenement'>";
+	$out .=  _T('agenda:evenement_date_a_immediat');
+	$out .= Agenda_heure_selector($d,"_fin");
+	$out .=	"</span>";
+	$out .=  "</div>\n";
+	
+	// DESCRIPTIF
+	$out .=  "<div class='descriptif-titre'>"._T('agenda:evenement_descriptif')."</div>";
+	$out .=  "<div class='descriptif-visu'>";
+	$out .=  "<textarea name='evenement_descriptif' style='width:100%;' rows='3'>";
+	$out .=  $fdescriptif;
+	$out .=  "</textarea>\n";
+	$out .=  "</div>\n";
+
+	// MOTS CLES : chaque groupe de mot cle attribuable a un evenement agenda
+	// donne un select
+	$out .=  "<div class='agenda_mots_cles'>";
+	$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+	while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+		$id_groupe = $row['id_groupe'];
+		$multiple = ($row['unseul']=='oui')?"size='4'":"multiple='multiple' size='4'";
+		
+		$id_mot_select = array();
+		if ($id_evenement){
+			$res2 = spip_query("SELECT mots_evenements.id_mot FROM spip_mots_evenements AS mots_evenements
+								LEFT JOIN spip_mots AS mots ON mots.id_mot=mots_evenements.id_mot 
+								WHERE mots.id_groupe="._q($id_groupe)." AND mots_evenements.id_evenement="._q($id_evenement));
+			while ($row2 = spip_fetch_array($res2))
+				$id_mot_select[] = $row2['id_mot'];
+		}
+
+		$nb_mots = 0;
+		$select = "";	
+		$select .= "<select name='evenement_groupe_mot_select_{$id_groupe}[]' class='fondl verdana1 agenda_mot_cle_select' $multiple>\n";
+		$select .= "\n<option value='x' style='font-variant: small-caps;' >".supprimer_numero($row['titre'])."</option>";
+
+		$res2= spip_query("SELECT * FROM spip_mots WHERE id_groupe="._q($id_groupe)." ORDER BY titre");
+		while ($row2 = spip_fetch_array($res2,SPIP_ASSOC)){
+			$id_mot = $row2['id_mot'];
+			$titre = $row2['titre'];
+			$select .= my_sel($id_mot, "&nbsp;&nbsp;&nbsp;$titre", in_array($id_mot,$id_mot_select)?$id_mot:0);
+			$nb_mots++;
+		}
+		$select .= "</select>\n";
+		if ($nb_mots)
+			$out .= $select;
+	}
+	$out .=  "</div>";
+	
+	$dates = "";
+	if ($id_evenement!=NULL){
+		$dates = array();
+		$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement_source="._q($id_evenement));
+		while ($row=spip_fetch_array($res)){
+			$dates[] = date('m/d/Y',strtotime($row['date_debut']));
+		}
+		$dates = implode(",",$dates);
+	}
+	$out .= "<div class='repetitions-calendrier'>";
+	$out .= WCalendar_statique_point_entree('_repetitions',$dates);
+	$out .= "</div>";
+	
+  $out .=  "<div class='edition-bouton'>";
+  #echo "<input type='submit' name='submit' value='Annuler' />";
+	if ($neweven==1){
+		$out .=	"<div style='text-align:$spip_lang_right'><input type='submit' name='ajouter' value='"._T('bouton_ajouter')."' class='fondo' onclick='javascript:getSelectedDate_repetitions()'></div>";
+	}
+	else{
+		$out .=	"<div style='text-align:$spip_lang_right'><input type='submit' name='ajouter' value='"._T('bouton_enregistrer')."' class='fondo' onclick='javascript:getSelectedDate_repetitions()'></div>";
+	}
+	$out .=  "</div>\n";
+
+	// feature desactivee pour le moment
+	// $out .= "<script type='text/javascript' src='"._DIR_PLUGIN_AGENDA."/img_pack/multiselect.js'></script>";
+
+  $out .=  "</div>";
+	$out .=  "</div>\n";
+	return $out;
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_saisie_rapide.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_saisie_rapide.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda_saisie_rapide.php	(revision 30)
@@ -0,0 +1,210 @@
+<?php
+
+if ($GLOBALS['spip_version_code']<1.92){
+ function set_request($var, $val = NULL) {
+	unset($_GET[$var]);
+	unset($_POST[$var]);
+	if ($val !== NULL) $_GET[$var] = $val;
+ }
+}
+
+// retourne un tableau de mots ou d'expressions a partir d'un texte
+function Agenda_retourne_liste_mots($texte) {
+	$texte = filtrer_entites(trim($texte));
+	$texte = preg_replace("/[\|\s\t\n\r]+/", " ", $texte);
+	$split = split('"', $texte);
+	$c = count($split);
+	for($i=0; $i<$c; $i++) if ($i & 1) $split[$i] = preg_replace('/[ ,]+/', '+', trim($split[$i]));
+	$texte = join('', $split);
+	$texte = preg_replace("/ *,+ */","\t", $texte);
+	$texte = preg_replace("/\++/"," ", $texte);
+	return array_unique(split("\t", trim($texte)));
+}
+
+
+function Agenda_compile_texte_saisie_rapide($texte) {
+	$t=split("\n",html_entity_decode($texte));	
+	foreach($t as $e=>$v) {
+		$t[$e]=trim(str_replace("\t", " ", $t[$e]));
+		if (ereg ("([0-9]{1,2})/([0-9]{1,2})/?([0-9]{4})?-?([0-9]{1,2})?/?([0-9]{1,2})?/?([0-9]{4})? +".
+		"([0-9]{1,2})?:?([0-9]{1,2})?-?([0-9]{1,2})?:?([0-9]{1,2})? *".
+		'" *([^ ^"][^"]*) *" *("([^"]*)")? *("([^"]*)")? *'.
+		'((MOTS|REP) *=.*)?', $t[$e]=trim($t[$e]), $regs)) {
+			$evenement_horaire = true;
+			// annee_debut omise
+			if($regs[3]=='') $regs[3]=date('Y', time());
+			// annee_fin omise
+			if($regs[6]=='') $regs[6]=$regs[3]; ;
+			// heure_fin omise
+			if($regs[9].$regs[10]=='') { $regs[9]=$regs[7]; $regs[10]=$regs[8]; }   
+			if ($reg[7].$reg[8].$reg[9].$reg[10]=='') $evenement_horaire=false;
+			// date_fin omise
+			if($regs[4].$regs[5]=='') { $regs[4]=$regs[1]; $regs[5]=$regs[2]; }   
+			// format complet
+			for ($i=0;$i<=10;$i++) $regs[$i]=sprintf("%02d", intval($regs[$i]));
+			// cas des REP= et MOTS=
+			$listes = preg_split('/(MOTS|REP) *= */', $regs[16], -1, PREG_SPLIT_DELIM_CAPTURE);
+			$rep = $mots = array();
+			foreach($listes as $i => $valeur) 
+				if ($i & 1) 
+					foreach($listes as $i => $valeur) 
+					if ($i & 1) {
+						if ($valeur=='REP' && ereg('([0-9 /,]*)', $listes[$i+1], $regs2)) 
+							$rep = array_merge($rep, Agenda_retourne_liste_mots($regs2[1]));
+						elseif ($valeur=='MOTS') 
+							$mots = array_merge($mots, Agenda_retourne_liste_mots($listes[$i+1]));
+					}
+			// todo : mettre les mots au format des select du formulaire normal
+			$mots_compiles = Agenda_verifie_les_mots_clefs($mots);
+			// mettre les repetitions au format du textarea du formulaire normal
+			$selected_rep = "";
+			foreach($rep as $k=>$r){
+				$r =explode("/",$r);
+				$selected_rep .= ",".sprintf('%02d',$r[1])."/".sprintf('%02d',$r[0])."/".sprintf('%04d',$r[2]);
+				$rep[$k] = mktime($reg[7],$regs[8],null,$r[1],$r[0],$r[2]);
+			}
+			$selected_rep = substr($selected_rep,1);
+			// remise en forme en doubon : idem a un post ou idem a un spip_query
+			$t[$e]=array_merge(array(
+			'jour_evenement_debut' =>$regs[1],
+			'mois_evenement_debut' =>$regs[2],
+			'annee_evenement_debut' =>$regs[3],
+			'heure_evenement_debut' =>$regs[7],
+			'minute_evenement_debut' =>$regs[8],
+			'jour_evenement_fin' =>$regs[4],
+			'mois_evenement_fin' =>$regs[5],
+			'annee_evenement_fin' =>$regs[6],
+			'heure_evenement_fin' =>$regs[9],
+			'minute_evenement_fin' =>$regs[10],
+			'evenement_horaire' => $evenement_horaire,
+			'evenement_titre' =>$regs[11],
+			'evenement_lieu' =>$regs[13],
+			'evenement_descriptif' =>$regs[15],
+			'evenement_groupe_mot_select' => $mots_compiles['echo'],
+			'evenement_repetitions' => $rep,
+			'selected_date_repetitions' => $selected_rep
+			),$mots_compiles['post']);
+		} 
+		else {
+			if ($t[$e]!="") $t[$e]=array(); else unset($t[$e]);
+		}
+	}
+	return $t;
+}
+
+// retourne le tableau des mots acceptes par groupe
+function Agenda_verifie_les_mots_clefs($mots_envoyes) {
+ 	$les_mots_ok = $mots_compiles = array();
+	// on recupere tous les mots cles sur les evenements
+	$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui'");
+	while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+		$id_groupe = $row['id_groupe'];
+		$titre = supprimer_numero($row['titre']);
+		$res2= spip_query("SELECT * FROM spip_mots WHERE id_groupe=".spip_abstract_quote($id_groupe));
+		while ($row2 = spip_fetch_array($res2,SPIP_ASSOC)){
+			$les_mots_ok[]=array(	'nb'=>0, 'id_mot'=>$row2['id_mot'], 'titre_mot'=> $row2['titre'], 
+											'id_groupe'=>$id_groupe, 'titre_groupe'=> $titre, 
+											'echo' => $titre.':'.$row2['titre']);
+		}
+	}
+	$mots_compiles = array('echo'=>array(),'post'=>array());
+	// on voit quels mots cles on retient...
+	foreach($mots_envoyes as $mot) {
+		if (preg_match('/((([^:]+):)?(.*))/', $mot, $regs))
+			foreach($les_mots_ok as $mot_ok=>$tab){
+				$test_mot_ok = ($tab['titre_mot']==$regs[4]) || ($tab['id_mot']==$regs[4]);
+				$test_groupe_ok = (''==$regs[3]) || ($tab['titre_groupe']==$regs[3]) || ($tab['id_groupe']==$regs[3]);
+				if ($test_mot_ok && $test_groupe_ok) {
+					$mots_compiles['echo'][$tab['id_mot']] = $tab['echo'];
+					$mots_compiles['post']["evenement_groupe_mot_select_".$tab['id_groupe']][$tab['id_mot']] = $tab['id_mot'];
+					break;
+				}
+			}
+	}
+	return $mots_compiles;
+}
+
+function Agenda_formulaire_saisie_rapide_previsu() {
+	global $spip_lang_right;
+	$out = "";
+	if ($evenements_saisie_rapide = _request('evenements_saisie_rapide')){
+		$t = Agenda_compile_texte_saisie_rapide($evenements_saisie_rapide);
+		$out .= "<div class='liste liste-evenements'>";
+		$out .= "<table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>";
+		$table = array();
+		foreach($t as $eve) {
+			$vals = array();
+			$titre = typo($eve['evenement_titre']);
+			$lieu = typo($eve['evenement_lieu']);
+			$descriptif = typo($eve['evenement_descriptif']);
+			$horaire = $eve['evenement_horaire'];
+			$date_debut = strtotime($eve['jour_evenement_debut']."-".$eve['mois_evenement_debut']."-".$eve['annee_evenement_debut']." ".$eve['heure_evenement_debut'].":".$eve['minute_evenement_debut']);
+			$date_fin = strtotime($eve['jour_evenement_fin']."-".$eve['mois_evenement_fin']."-".$eve['annee_evenement_fin']." ".$eve['heure_evenement_fin'].":".$eve['minute_evenement_fin']);
+			
+			$s = Agenda_afficher_date_evenement($date_debut,$date_fin, $horaire);
+			$s_rep = "";
+			$count_rep = 0;
+			foreach($eve['evenement_repetitions'] as $rep){
+				$rep_date_debut = $rep;
+				$rep_date_fin = $rep_date_debut+$date_fin-$date_debut;
+				$s_rep .= Agenda_afficher_date_evenement($rep_date_debut,$rep_date_fin,$horaire)."<br/>";
+				//$s_rep .= $rep."<br/>";
+				$count_rep++;
+			}
+			if (strlen($s_rep)){
+				$s .= "<br/>".bouton_block_invisible("repetitions_evenement_$id_evenement");
+				$s .= "$count_rep ". _T('agenda:evenement_repetitions');
+				$s .= debut_block_invisible("repetitions_evenement_$id_evenement");
+				$s .= $s_rep;
+				$s .= fin_block();
+			}
+			$vals[] = $s;
+
+			$vals[] = $titre;
+
+			$vals[] = $lieu;
+			
+			$vals[] = propre($descriptif);
+			
+			$vals[] = implode(", ",$eve['evenement_groupe_mot_select']);
+		
+			$table[] = $vals;
+			
+		}
+	
+		$largeurs = array('', '', '', '', '');
+		$styles = array('arial11', 'arial11', 'arial2', 'arial11', 'arial11');
+		$out .= afficher_liste($largeurs, $table, $styles, false);
+	
+		$out .= "</table></div>\n";
+	  $out .= "<span style='display:none'>";
+	  $out .= "<textarea name='evenements_saisie_rapide' rows='10' class='forml' >";
+	  $out .= _request('evenements_saisie_rapide');
+	  $out .= "</textarea>";
+	  $out .= "</span>";
+		$out .= "<div style='text-align:$spip_lang_right;'><input class='fondo' type='submit' value='"._T('bouton_enregistrer')."'></div>";
+ 	}
+ 	return $out;
+}
+
+function Agenda_formulaire_saisie_rapide() {
+	global $spip_lang_right;
+	$out = "";
+	//$out .= debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png",true, "", _T('saisierapide:saisie_rapide_votre_liste')); 
+	$out .= _T('saisierapide:saisie_rapide_votre_liste_infos');
+	$out .= "<input type='hidden' name='saisie_rapide' value='1' />";
+  $out .= "<textarea name='evenements_saisie_rapide' rows='10' class='forml' >";
+  $out .= _request('evenements_saisie_rapide');
+  $out .= "</textarea>";
+  $out .= "<a href='".generer_url_ecrire("saisie_rapide", "id_article=$id_article")."'>"._T('saisierapide:saisie_rapide_reset')."</a>";
+  $out .= "<div style='text-align:$spip_lang_right;'><input class='fondo' type='submit' value='"._T('previsualiser')."'></div>";
+  $out .= "<p>";
+  //$out .= fin_cadre_enfonce(true);
+
+  $out .= debut_cadre_formulaire('',true);
+  $out .= _T('saisierapide:saisie_rapide_explications');
+  $out .= fin_cadre_formulaire(true);
+  return $out;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/editer_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/editer_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/editer_evenement.php	(revision 30)
@@ -0,0 +1,222 @@
+<?php
+
+function Agenda_action_update_repetitions($id_evenement,$repetitions,$liste_mots){
+	// evenement source
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement="._q($id_evenement));
+	if ($row = spip_fetch_array(($res))){
+		$titre = $row['titre'];
+		$descriptif = $row['descriptif'];
+		$horaire = $row['horaire'];
+		$lieu = $row['lieu'];
+		$date_debut = strtotime($row['date_debut']);
+		$date_fin = strtotime($row['date_fin']);
+		$duree = $date_fin - $date_debut;
+		$id_evenement_source = $row['id_evenement_source'];
+		$id_article = $row['id_article'];
+		if ($id_evenement_source!=0)
+			return; // pas un evenement source donc rien a faire ici
+
+		$repetitions_updated = array();
+		// mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu
+		$res = spip_query("SELECT id_evenement FROM spip_evenements WHERE id_evenement_source="._q($id_evenement));
+		while ($row = spip_fetch_array($res)){
+			$date = strtotime(date('Y-m-d',$row['date_debut']));
+			if (in_array($date,$repetitions)){
+				// il est maintenu, on l'update
+				$repetitions_updated[] = $date;
+				$update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
+				$update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
+				
+				// TODO : prendre en charge la mise a jour uniquement si conforme a l'original
+				$update_titre = $titre;
+				$update_descriptif = $descriptif;
+				$update_lieu = $lieu;
+				
+				// mettre a jour l'evenement
+				$res=spip_query("UPDATE spip_evenements SET `titre`="._q($update_titre)
+				. ",`descriptif`="._q($update_descriptif)
+				. ",`lieu`="._q($update_lieu)
+				. ",`horaire`="._q($horaire)
+				. ",`date_debut`="._q($update_date_debut)
+				. ",`date_fin`="._q($update_date_fin)
+				. ",`id_article`="._q($id_article)
+				. " WHERE `id_evenement` ="._q($row['id_evenement']));
+				Agenda_action_update_liste_mots($row['id_evenement'],$liste_mots);
+			}
+			else {
+				// il est supprime
+				spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement=".$row['id_evenement']);
+				spip_query("DELETE FROM spip_evenements WHERE id_evenement=".$row['id_evenement']);
+			}
+			
+		}
+		// regarder les repetitions a ajouter
+		foreach($repetitions as $date){
+			if (!in_array($date,$repetitions_updated)){
+				$update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
+				$update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
+				$update_titre = $titre;
+				$update_descriptif = $descriptif;
+				$update_lieu = $lieu;
+
+				$id_evenement_new = spip_abstract_insert("spip_evenements",
+					"(id_evenement_source,maj)",
+					"("._q($id_evenement).",NOW())");
+				if ($id_evenement_new==0)
+					spip_log("agenda action formulaire article : impossible d'ajouter un evenement repete");
+				else {
+					// mettre a jour l'evenement
+					$res=spip_query("UPDATE spip_evenements SET `titre`="._q($update_titre)
+					. ",`descriptif`="._q($update_descriptif)
+					. ",`lieu`="._q($update_lieu)
+					. ",`horaire`="._q($horaire)
+					. ",`date_debut`="._q($update_date_debut)
+					. ",`date_fin`="._q($update_date_fin)
+					. ",`id_article`="._q($id_article)
+					. " WHERE `id_evenement` ="._q($id_evenement_new));
+					
+					Agenda_action_update_liste_mots($id_evenement_new,$liste_mots);
+				}
+			}
+		}
+	}
+}
+function Agenda_action_supprime_repetitions($supp_evenement){
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_evenement_source="._q($supp_evenement));
+	while ($row = spip_fetch_array($res)){
+		$id_evenement = $row['id_evenement'];
+		spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement="._q($id_evenement));
+		spip_query("DELETE FROM spip_evenements WHERE id_evenement="._q($id_evenement));
+	}
+}
+
+function Agenda_action_update_liste_mots($id_evenement,$liste_mots){
+	// suppression des mots obsoletes
+	$cond_in = "";
+	if (count($liste_mots))
+		$cond_in = "AND " . calcul_mysql_in('id_mot', implode(",",$liste_mots), 'NOT');
+	spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement="._q($id_evenement)." ".$cond_in);
+	// ajout/maj des nouveaux mots
+	foreach($liste_mots as $id_mot){
+		if (!spip_fetch_array(spip_query("SELECT * FROM spip_mots_evenements WHERE id_evenement="._q($id_evenement)." AND id_mot="._q($id_mot))))
+			spip_query("INSERT INTO spip_mots_evenements (id_mot,id_evenement) VALUES ("._q($id_mot).","._q($id_evenement).")");
+	}
+}
+
+
+function Agenda_action_formulaire_article($id_article,$id_evenement, $c=NULL){
+	include_spip('base/abstract_sql');
+	// gestion des requetes de mises a jour dans la base
+	$insert = _request('evenement_insert',$c);
+	$modif = _request('evenement_modif',$c);
+	if (($insert || $modif)){
+	
+		if ( ($insert) && (!$id_evenement) ){
+			$id_evenement = spip_abstract_insert("spip_evenements",
+				"(id_evenement_source,maj)",
+				"('0',NOW())");
+			if ($id_evenement==0){
+				spip_log("agenda action formulaire article : impossible d'ajouter un evenement");
+				return 0;
+			}
+	 	}
+		if ($id_article){
+			// mettre a jour le lien evenement-article
+			spip_query("UPDATE spip_evenements SET id_article="._q($id_article)." WHERE id_evenement="._q($id_evenement));
+	 	}
+		$titre = _request('evenement_titre',$c);
+		$descriptif = _request('evenement_descriptif',$c);
+		$lieu = _request('evenement_lieu',$c);
+		$horaire = _request('evenement_horaire',$c);
+		if ($horaire!='oui') $horaire='non';
+	
+		// pour les cas ou l'utilisateur a saisi 29-30-31 un mois ou ca n'existait pas
+		$maxiter=4;
+		$st_date_deb=FALSE;
+		$jour_debut=_request('jour_evenement_debut',$c);
+		// test <= car retour strtotime retourne -1 ou FALSE en cas d'echec suivant les versions
+		while(($st_date_deb<=FALSE)&&($maxiter-->0)) {
+			$date_deb=_request('annee_evenement_debut',$c).'-'._request('mois_evenement_debut',$c).'-'.($jour_debut--)
+				.' '._request('heure_evenement_debut',$c).':'._request('minute_evenement_debut',$c);
+			$st_date_deb=strtotime($date_deb);
+		}
+		$date_deb=format_mysql_date(date("Y",$st_date_deb),date("m",$st_date_deb),date("d",$st_date_deb),date("H",$st_date_deb),date("i",$st_date_deb), $s=0);
+	
+		// pour les cas ou l'utilisateur a saisi 29-30-31 un mois ou ca n'existait pas
+		$maxiter=4;
+		$st_date_fin=FALSE;
+		$jour_fin=_request('jour_evenement_fin',$c);
+		// test <= car retour strtotime retourne -1 ou FALSE en cas d'echec suivant les versions
+		while(($st_date_fin<=FALSE)&&($maxiter-->0)) {
+			$st_date_fin=_request('annee_evenement_fin',$c).'-'._request('mois_evenement_fin',$c).'-'.($jour_fin--)
+				.' '._request('heure_evenement_fin',$c).':'._request('minute_evenement_fin',$c);
+			$st_date_fin=strtotime($st_date_fin);
+		}
+		$st_date_fin = max($st_date_deb,$st_date_fin);
+		$date_fin=format_mysql_date(date("Y",$st_date_fin),date("m",$st_date_fin),date("d",$st_date_fin),date("H",$st_date_fin),date("i",$st_date_fin), $s=0);
+	
+		// mettre a jour l'evenement
+		$res=spip_query("UPDATE spip_evenements SET `titre`="._q($titre)
+		. ",`descriptif`="._q($descriptif)
+		. ",`lieu`="._q($lieu)
+		. ",`horaire`="._q($horaire)
+		. ",`date_debut`="._q($date_deb)
+		. ",`date_fin`="._q($date_fin)
+		. " WHERE `id_evenement` ="._q($id_evenement));
+
+		// les mots cles : par groupes
+		$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+		$liste_mots = array();
+		while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+			$id_groupe = $row['id_groupe'];
+			$id_mot_a = _request("evenement_groupe_mot_select_$id_groupe",$c); // un array
+			if (is_array($id_mot_a) && count($id_mot_a)){
+				if ($row['unseul']=='oui')
+					$liste_mots[] = intval(reset($id_mot_a));
+				else 
+					foreach($id_mot_a as $id_mot)
+						$liste_mots[] = intval($id_mot);
+			}				
+		}
+
+		Agenda_action_update_liste_mots($id_evenement,$liste_mots);
+				
+		// gestion des repetitions
+		if (($repetitions = _request('selected_date_repetitions',$c))!=NULL){
+			$repetitions = explode(',',$repetitions);
+			$rep = array();
+			foreach($repetitions as $key=>$date){
+				if (preg_match(",[0-9][0-9]?/[0-9][0-9]?/[0-9][0-9][0-9][0-9],",$date)){
+					$date = explode('/',$date);
+					$date = $date[2]."/".$date[0]."/".$date[1];
+					$date = strtotime($date);
+				}
+				else {
+					$date = preg_replace(",[0-2][0-9]:[0-6][0-9]:[0-6][0-9]\s*(UTC|GMT)(\+|\-)[0-9]{4},","",$date);
+					$date = explode(' ',$date);
+					$date = strtotime($date[2]." ".$date[1]." ".$date[3]);
+				}
+				if (!in_array($date,$repetitions))
+					$rep[] = $date;
+			}
+			$repetitions = $rep;
+		}
+		else 
+			$repetitions = array();
+		Agenda_action_update_repetitions($id_evenement, $repetitions, $liste_mots);
+	}
+	return $id_evenement;
+}
+
+function Agenda_action_supprime_evenement($id_article,$supp_evenement){
+	$res = spip_query("SELECT * FROM spip_evenements WHERE id_article="._q($id_article)." AND id_evenement="._q($supp_evenement));
+	if ($row = spip_fetch_array($res)){
+		spip_query("DELETE FROM spip_mots_evenements WHERE id_evenement="._q($supp_evenement));
+		spip_query("DELETE FROM spip_evenements WHERE id_evenement="._q($supp_evenement));
+	}
+	Agenda_action_supprime_repetitions($supp_evenement);
+	$id_evenement = 0;
+	return $id_evenement;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/voir_agenda.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/voir_agenda.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/voir_agenda.php	(revision 30)
@@ -0,0 +1,215 @@
+<?php
+
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/texte');
+include_spip('inc/presentation');
+include_spip('inc/agenda_filtres');
+include_spip('inc/agenda_gestion');
+
+function inc_voir_agenda($flag_editable){
+	global $visu_evenements;
+	$type = _request('type');
+	$partie_cal = _request('partie_cal');
+	if (!$type) $type='semaine';
+	$id_evenement = intval(_request('id_evenement'));
+	$ajouter_id_article = intval(_request('ajouter_id_article'));
+	global $annee,$mois,$jour;
+	$annee = intval(_request('annee'));
+	$mois = intval(_request('mois'));
+	$jour = intval(_request('jour'));
+
+	$visu_evenements=array();
+
+	if ((!$annee)||(!$mois)||(!$jour)){
+		if (!$id_evenement){ // pas d'id_evenement--> date du jour
+			$stamp=time();
+		}
+		else { // date de l'evenement
+			$res = spip_query("SELECT date_debut FROM spip_evenements WHERE id_evenement="._q($id_evenement));
+			if ($row = spip_fetch_array($res))
+				$stamp=strtotime($row['date_debut']);
+			else 
+				$stamp=time();
+		}
+		$annee=date('Y',$stamp);
+		$mois=date('m',$stamp);
+		$jour=date('d',$stamp);
+ 	}
+
+
+ 	$urlbase=self();
+ 	$urlbase=parametre_url($urlbase,'edit','');
+ 	$urlbase=parametre_url($urlbase,'del','');
+ 	$urlbase=parametre_url($urlbase,'ndate','');
+ 	$urlbase=parametre_url($urlbase,'id_evenement','');
+ 	$urlbase=parametre_url($urlbase,'neweven','1');
+ 	
+	//$urlbase=str_replace("&amp;","&",$urlbase);
+
+	// creation des boites creneaux horaires pour ajout rapide
+	list($ts_start,$ts_fin) = date_debut_fin($annee,$mois,$jour,$type);
+	if ($flag_editable)
+		ajoute_creneaux_horaires($urlbase,$ts_start,$ts_fin,$type,$partie_cal,$echelle);
+
+
+	$categorie_concerne=array('plage'=>'calendrier-plage','evenement'=>'calendrier-evenement');
+	$categorie_info=array('plage'=>'calendrier-plage-info','evenement'=>'calendrier-evenement-info');
+
+	$datestart=date('Y-m-d H:i:s',$ts_start-24*60*60);
+	$datefin=date('Y-m-d H:i:s',$ts_fin+24*60*60);
+
+	// tous les evenements
+	$res = spip_query("SELECT * 
+							FROM spip_evenements AS evenements
+						 WHERE ((evenements.date_debut>='$datestart' AND evenements.date_debut<='$datefin') 
+						 		OR (evenements.date_fin>='$datestart' AND evenements.date_fin<='$datefin')
+						 		OR (evenements.date_debut<'$datestart' AND evenements.date_fin>'$datefin'))
+						 ORDER BY evenements.date_debut;");
+ 	$urlbase=parametre_url($urlbase,'neweven','');
+	$urlbase=parametre_url($urlbase,'annee',$annee);
+	$urlbase=parametre_url($urlbase,'mois',$mois);
+	$urlbase=parametre_url($urlbase,'jour',$jour);
+	while ($row = spip_fetch_array($res)){
+		$is_evt=($row['horaire']!='oui')
+						||($row['date_debut']<$datestart && $row['date_fin']>$datefin);
+		$concerne=(!$ajouter_id_article) || ($ajouter_id_article==$row['id_article']);
+
+		$url=parametre_url($urlbase,'id_evenement',$row['id_evenement']);
+		$url=parametre_url($url,'ajouter_id_article',$row['id_article']);
+		$args = explode('?',parametre_url($url,'exec',''));
+		// $url sous forme d'array pour appeler ajax_action_auteur
+		$url = array('action'=>'voir_evenement','id'=>"0-voir",'script'=>'calendrier','args'=>end($args));
+		
+		$titre = typo($row['titre']);
+		$descriptif = typo($row['descriptif']);
+		$lieu = typo($row['lieu']);
+		$texte=wordwrap(entites_html($row['titre'],ENT_QUOTES),15,"<br />\n");
+		if (($type!='mois')&&(!$is_evt))
+			$texte.="<hr />" . wordwrap(entites_html($row['descriptif'],ENT_QUOTES),15, "<br />\n");
+		if (strlen($texte)==0) $texte=_L("(sans objet)");
+
+		if ($concerne)	$categorie = $categorie_concerne;
+		else						$categorie = $categorie_info;
+		if ($is_evt) 		$categorie = $categorie['evenement'];
+		else 						$categorie = $categorie['plage'];
+		if ($id_evenement==$row['id_evenement'])
+			$categorie.='-selection';
+
+		if (!$is_evt)
+			Agenda_memo_full($row['date_debut'], $row['date_fin'], $titre, $descriptif, $lieu, $url, $categorie);
+		else{
+			//if ($type!='mois')
+			//	Agenda_memo_evt_full($row['date_debut'], $row['date_debut'], Agenda_rendu_boite($titre,$descriptif,$lieu), "", "", $url, $categorie);
+			//else
+				Agenda_memo_evt_full($row['date_debut'], $row['date_fin'], $titre, $descriptif, $lieu, $url, $categorie);
+		}
+		$visu_evenements[$row['id_evenement']]=1;
+	}
+
+	$s = "<span class='agenda-calendrier'>\n";
+	// attention : bug car $type est modifie apres cet appel !
+	$s .= Agenda_affiche_full(1,'', $type, 'calendrier-creneau','calendrier-creneau-today','calendrier-creneau-sunday','calendrier-plage','calendrier-evenement','calendrier-plage-info','calendrier-evenement-info','calendrier-plage-selection','calendrier-evenement-selection');
+	$s .= "</span>";
+
+	return $s;
+}
+
+function date_debut_fin($annee,$mois,$jour,$type){
+	if ($type=='jour'){
+		$ts_start=strtotime("$annee-$mois-01 00:00:00");
+		$ts_start+=($jour-1)*24*60*60;
+		$ts_fin=$ts_start+24*60*60;
+	} else
+	if ($type=="semaine"){
+		$ts_start=strtotime("$annee-$mois-01 01:00:00");
+		$ts_start+=($jour-1)*24*60*60;
+		while (date('w',$ts_start)!=1) $ts_start-=24*60*60;
+		$ts_fin=$ts_start+7*24*60*60+60*60;
+		$ts_start-=2*60*60;
+	} else
+	if ($type=='mois'){
+		$ts_start=strtotime("$annee-$mois-01 00:00:00");
+		if ($mois<'12')
+			$ts_fin=strtotime("$annee-".($mois+1)."-01 00:00:00");
+		else
+			$ts_fin=strtotime(($annee+1)."-$mois-01 00:00:00");
+	}
+	return array($ts_start,$ts_fin);	
+}
+function ajoute_creneaux_horaires($urlbase,$ts_start,$ts_fin,$type,$partie_cal,$echelle){
+	// creneaux pour ajout uniquement si ajouter_id_article present
+	if (($type!='mois')&&($partie_cal!='sansheure')&&($partie_cal!=NULL))
+	{
+		if ($echelle<=120)
+			$freq_creneaux=30*60;
+		else
+			$freq_creneaux=60*60;
+	
+		$today=date('Y-m-d');
+		$heuremin='08';$heuremax='20';
+		if ($partie_cal=='matin'){
+			$heuremin='04';$heuremax='15';
+		}
+		if ($partie_cal=='soir'){
+			$heuremin='12';$heuremax='23';
+		}
+		for ($j=$ts_start;$j<=$ts_fin;$j+=$freq_creneaux){
+			$heure=date('H',$j);
+			if (($heure>=$heuremin)&&($heure<=$heuremax)){
+				$url=parametre_url($urlbase,'ndate',urlencode(date('Y-m-d H:i',$j)));
+				$args = explode('?',parametre_url($url,'exec',''));
+				// $url sous forme d'array pour appeler ajax_action_auteur
+				$url = array('action'=>'voir_evenement','id'=>"0-editer",'script'=>'calendrier','args'=>end($args),'fct_ajax'=>'wc_init');
+				$creneau=date('Y-m-d H:i:s',$j);
+				if (date('Y-m-d',$j)==$today)
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "", $url,'calendrier-creneau-today');
+				else if (date('w',$j)==0)
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "",$url,'calendrier-creneau-sunday');
+				else
+					Agenda_memo_full($creneau,$creneau,preg_replace(",\s+,","&nbsp;",date('H:i',$j)." "._T('agenda:ajouter_un_evenement')), " ", "",$url,'calendrier-creneau');
+			}
+		}
+	}
+}
+
+function http_calendrier_ics_message($annee, $mois, $jour, $large)
+{
+	return "";
+}
+
+function http_calendrier_aide_mess()
+{
+	return "";
+}
+
+function http_calendrier_semainesh($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
+{
+	global $spip_ecran;
+	if (!isset($spip_ecran)) $spip_ecran = 'large';
+
+	$init = date("w",mktime(1,1,1,$mois,$jour,$annee));
+	$init = $jour+1-($init ? $init : 7);
+	$sd = '';
+
+	if (is_array($evt))
+	  {
+		  list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
+		  if ($sansduree)
+		    foreach($sansduree as $d => $r) 
+		      $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
+	    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
+	    $evt =
+	      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
+	      http_calendrier_mois_sept($annee, $mois, $init, $init+ 6, $evenements, $script);
+	  } else $evt = "<tr><td>$evt</td></tr>";
+
+	return 
+	  "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
+	  http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) .
+	  $evt .
+	  "</table>" .
+	  (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/voir_evenement.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/voir_evenement.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/voir_evenement.php	(revision 30)
@@ -0,0 +1,168 @@
+<?php
+include_spip("inc/agenda_gestion");
+
+function inc_voir_evenement_dist($id_evenement, $flag_editable){
+	$out = "";
+	$del = _request('del');
+	
+	$out .= "<div class='agenda-visu-evenement'>";
+
+	if ($id_evenement!=NULL){
+		$res = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement="._q($id_evenement));
+		if ($row = spip_fetch_array($res)){
+			if (!isset($neweven)){
+				$fid_evenement=$row['id_evenement'];
+				$ftitre=attribut_html(typo($row['titre']));
+				$flieu=attribut_html(typo($row['lieu']));
+
+				$fhoraire=attribut_html($row['horaire']);
+				$fdescriptif=attribut_html(typo($row['descriptif']));
+				$fstdatedeb=strtotime($row['date_debut']);
+				$fstdatefin=strtotime($row['date_fin']);
+				$fid_evenement_source=$row['id_evenement_source'];
+			}
+	 	}
+		$res2 = spip_query("SELECT articles.* FROM spip_articles AS articles LEFT JOIN spip_evenements AS J ON J.id_article=articles.id_article WHERE J.id_evenement="._q($id_evenement));
+		if ($row2 = spip_fetch_array($res2)){
+			$out .= "<div class='article-evenement'>";
+			$out .= "<a href='".generer_url_ecrire('articles',"id_article=".$row2['id_article'])."'>";
+			$out .= http_img_pack("article-24.gif", "", "width='24' height='24' border='0'");
+			$out .= entites_html(typo($row2['titre']))."</a>";
+			$out .= "</div>\n";
+		}
+		
+		$out .= "<div class='agenda-visu-evenement-bouton-fermer'>";
+		$url=self();
+		$url=parametre_url($url,'edit','');
+		$url=parametre_url($url,'neweven','');
+		$url=parametre_url($url,'del','');
+		$url=parametre_url($url,'id_evenement','');
+
+		$out .= "<a href='$url' onclick=\"$('#voir_evenement-0').html('');return false;\">";
+		$out .= "<img src='"._DIR_PLUGIN_AGENDA."/img_pack/croix.png' width='12' height='12' style='border:none;'></a>";
+		$out .= "</div>\n";
+
+		$fobjet = entites_html($fobjet,ENT_QUOTES);
+		$flieu = entites_html($flieu,ENT_QUOTES);
+		$fdescription = entites_html($fdescription,ENT_QUOTES);
+
+		$out .= "<div class='titre-titre'>";
+		$out .= _T('agenda:evenement_titre');
+		$out .= "</div><div class='titre-visu'>$ftitre &nbsp;</div>\n";
+
+		$out .= "<div class='lieu-titre'>";
+		$out .= _T('agenda:evenement_lieu');
+		$out .= "</div><div class='lieu-visu'>$flieu &nbsp;</div>\n";
+		$out .= "<div class='horaire-titre'>&nbsp;</div>";
+
+		$out .= "<div class='date-titre'>";
+		$out .= _T('agenda:evenement_date'); 
+		$out .= "</div>";
+		$out .= "<div class='date-visu'>";
+		$out .= _T('agenda:evenement_date_du'); 
+		$out .= " ".affdate_jourcourt(date("Y-m-d H:i",$fstdatedeb))." ";
+
+
+
+		if ($fhoraire=='oui')
+			$out .= _T('agenda:evenement_date_a_immediat'); 
+			$out .= " ".date("H:i",$fstdatedeb);
+
+		$out .= " <br/>\n";
+
+		$out .= _T('agenda:evenement_date_au'); 
+		$out .= " ".affdate_jourcourt(date("Y-m-d H:i",$fstdatefin))." ";
+
+		if ($fhoraire=='oui')
+			$out .= _T('agenda:evenement_date_a_immediat'); 
+			$out .= " ".date("H:i",$fstdatefin);
+
+		$out .= " <br/>\n";
+		$out .= "</div>\n";
+
+		$out .= "<div class='descriptif-titre'>";
+		$out .= _T('agenda:evenement_descriptif'); 
+		$out .= "</div><div class='descriptif-visu'>$fdescriptif &nbsp;</div>\n";
+
+		$out .=  "<div class='agenda_mots_cles'>";
+		$res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui' ORDER BY titre");
+		$sep = "";
+		while ($row = spip_fetch_array($res,SPIP_ASSOC)){
+			$id_groupe = $row['id_groupe'];
+			$row2 = spip_fetch_array(
+						spip_query("SELECT mots.titre FROM spip_mots_evenements AS mots_evenements
+								LEFT JOIN spip_mots AS mots ON mots.id_mot=mots_evenements.id_mot 
+								WHERE mots.id_groupe="._q($id_groupe).
+								" AND mots_evenements.id_evenement="._q($id_evenement)));
+			if ($row2){
+				$out .= $sep . supprimer_numero($row['titre'])."&nbsp;:&nbsp;".supprimer_numero($row2['titre']);
+				$sep = "\n, ";
+			}
+		}
+		$out .= "</div>\n";
+		
+
+		$url = parametre_url(self(),'annee','');
+		$url = parametre_url($url,'mois','');
+		$url = parametre_url($url,'jour','');
+
+		$out .= "<div class='repetitions-calendrier'>";
+		$id_source = $fid_evenement_source?$fid_evenement_source:$id_evenement;
+		$res2 = spip_query("SELECT * FROM spip_evenements WHERE id_evenement="._q($id_source)." OR id_evenement_source="._q($id_source)." ORDER BY date_debut");
+		if (spip_num_rows($res2)>1){
+			$out .= _T('agenda:evenement_autres_occurences');
+			while($row2 = spip_fetch_array($res2)){
+				if ($row2['id_evenement']!=$fid_evenement){
+					$url = parametre_url(self(),'id_evenement',$row2['id_evenement']);
+					$out .= " <a href='$url'>" . affdate_jourcourt($row2['date_debut']) ."</a>";
+				}
+			}
+		}
+		$out .= "</div>";
+	
+		if ($fid_evenement_source!=0){
+			$res2 = spip_query("SELECT evenements.* FROM spip_evenements AS evenements WHERE evenements.id_evenement="._q($fid_evenement_source));
+			if ($row2 = spip_fetch_array($res2)){
+				$url = parametre_url($url,'id_evenement',$row2['id_evenement']);
+			  $out .= "<div class='edition-bouton'>";
+			  $out .= _T('agenda:repetition_de')." <a href='";
+			  $out .= $url;
+			  $out .= "'>".($row2['titre']?typo($row2['titre']):_T('agenda:sans_titre'))."</a>";
+			  $out .= "</div>";
+			}
+		}
+		else if ($flag_editable){
+			$url=self();
+			$url=parametre_url($url,'edit','');
+			$url=parametre_url($url,'neweven','');
+			$url=parametre_url($url,'del','');
+			$url=parametre_url($url,'id_evenement','');
+			$form = "";
+			if ($del==1)	{ //---------------Suppression RDV ------------------------------
+			  //$out .= "<form name='edition_rdv' action='$url' method='post'>";
+			  $form .= "<input type='hidden' name='id_evenement' value='$fid_evenement' />\n";
+			  $form .= "<input type='hidden' name='suppr' value='1' />\n";
+			  $form .= "<div class='edition-bouton'>";
+			  $form .= "<input type='submit' name='submit' value='Annuler' />";
+			  $form .= "<input type='submit' name='submit' value='Confirmer la suppression' />";
+			  $form .= "</div>";
+			  //$out .= "</form>";
+	  	}
+	  	else {
+				$url=parametre_url($url,'id_evenement',$id_evenement);
+				$url=parametre_url($url,'edit',1);
+			  //$out .= "<form name='edition_rdv' action='$url' method='post'>";
+			  $form .= "<div class='edition-bouton'>";
+				$form .= "<div style='text-align:$spip_lang_right'><input type='submit' name='modifier' value='"._T('bouton_modifier')."' class='fondo'></div>";
+			  $form .= "</div>";
+			  //$out .= "</form>";
+	  	}
+			$args = explode('?',parametre_url($url,'exec','','&'));
+	  	$out .= ajax_action_auteur('voir_evenement',"0-voir","calendrier",end($args),$form,'','wc_init');
+		}
+	}
+	$out .= "</div>";
+	return $out;	
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_de.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_de.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_de.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Storno',
+'activite_editoriale' => 'ActivitÃ© Ãditoriale',  'editoriale AktivitÃ€t',
+'ajouter_un_evenement' => 'ajouter un Ã©vÃ©nement Ã  cet article', 'diesem Artikel ein event hinzufÃŒgen',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Event hinzufÃŒgen',
+'titre_cadre_modifier_evenement' => 'Event umÃ€ndern',
+'item_mots_cles_association_evenements' => 'zu den events',
+'info_un_evenement' => 'ein event',
+'info_nombre_evenements' => '@nb_evenements@ event',
+'info_evenements' => 'Event',
+'evenements' => 'Event',
+'evenement_titre' => 'Titel',
+'evenement_descriptif' => 'Beschreibung',
+'evenement_lieu' => 'Ort',
+'evenement_date' => 'Datum',
+'evenement_date_de' => 'Von',
+'evenement_date_du' => 'Vom',
+'evenement_date_a' => 'im',
+'evenement_date_au' => 'bei',
+'evenement_date_a_immediat' => 'zu',
+'evenement_date_debut' => 'Anfangsdatum',
+'evenement_date_fin' => 'Enddatum',
+'lien_retirer_evenement' => 'LÃ¶schen',
+'evenement_horaire' => 'Zeitplan',
+'titre_sur_l_agenda' => 'Im Agenda',
+'icone_creer_evenement' => 'Neue Veranstaltung anlegen',
+'evenement_repetitions' => 'Wiederholungen',
+ 'repetition_de' => 'Wiederholung von',
+'sans_titre' => 'ohne Titel',
+'evenement_autres_occurences' => 'Autres occurences :',
+'bouton_supprimer' => 'LÃ¶schen',
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_en.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_en.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_en.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Escape',
+'activite_editoriale' => 'Editorial activity',
+'ajouter_un_evenement' => 'add one event to this article',
+'texte_agenda' => 'DIARY',
+'titre_cadre_ajouter_evenement' => 'Add one event',
+'titre_cadre_modifier_evenement' => 'Modify one event',
+'item_mots_cles_association_evenements' => 'to those events',
+'info_un_evenement' => 'one event',
+'info_nombre_evenements' => '@nb_evenements@ events',
+'info_evenements' => 'Events',
+'evenements' => 'Events',
+'evenement_titre' => 'Title',
+'evenement_descriptif' => 'Description',
+'evenement_lieu' => 'Location',
+'evenement_date' => 'Date',
+'evenement_date_de' => 'From ',
+'evenement_date_du' => 'From ',
+'evenement_date_a' => 'to ',
+'evenement_date_au' => 'To ',
+'evenement_date_a_immediat' => 'at ',
+'evenement_date_debut' => 'Starting date',
+'evenement_date_fin' => 'Ending date',
+'lien_retirer_evenement' => 'Deleted ',
+'evenement_horaire' => 'Schedule',
+'titre_sur_l_agenda' => "On diary",
+'icone_creer_evenement' => 'Generate a new event',
+'evenement_repetitions' => 'Repetition',
+'repetition_de' => "Repetition of",
+'sans_titre' => "(without title)",
+'evenement_autres_occurences' => "Other occurences :",
+'bouton_supprimer' => "Delete",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_es.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_es.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Anular',
+'activite_editoriale' => 'Actividad editorial',
+'ajouter_un_evenement' => 'Añadir un evento a éste artículo',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Añadir un evento',
+'titre_cadre_modifier_evenement' => 'Modificar un evento',
+'item_mots_cles_association_evenements' => 'a los eventos',
+'info_un_evenement' => 'un evento,',
+'info_nombre_evenements' => '@nb_evenements@ eventos,',
+'info_evenements' => 'Eventos',
+'evenements' => 'Eventos',
+'evenement_titre' => 'Titulo',
+'evenement_descriptif' => 'Descripción',
+'evenement_lieu' => 'Lugar',
+'evenement_date' => 'Fecha',
+'evenement_date_de' => 'De ',
+'evenement_date_du' => 'Del ',
+'evenement_date_a' => 'a las ',
+'evenement_date_au' => 'Hasta ',
+'evenement_date_a_immediat' => 'a las ',
+'evenement_date_debut' => 'Fecha de comienzo',
+'evenement_date_fin' => 'Fecha de fin',
+'lien_retirer_evenement' => 'Suprimir',
+'evenement_horaire' => 'Horario',
+'titre_sur_l_agenda' => "Sobre la agenda",
+'icone_creer_evenement' => 'Creación de un nuevo evento',
+'evenement_repetitions' => 'Repeticiones',
+'repetition_de' => "Repetición de",
+'sans_titre' => "(con título)",
+'evenement_autres_occurences' => "Otras ocurrencias :",
+'bouton_supprimer' => "Suprimir",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_fr.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Annuler',
+'activite_editoriale' => 'Activit&eacute; &Eacute;ditoriale',
+'ajouter_un_evenement' => 'ajouter un &eacute;v&eacute;nement &agrave; cet article',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Ajouter un &eacute;v&eacute;nement',
+'titre_cadre_modifier_evenement' => 'Modifier un &eacute;v&eacute;nement',
+'item_mots_cles_association_evenements' => 'aux &eacute;v&eacute;nements',
+'info_un_evenement' => 'un &eacute;v&eacute;nement,',
+'info_nombre_evenements' => '@nb_evenements@ &eacute;v&eacute;nements,',
+'info_evenements' => '&Eacute;v&eacute;nements',
+'evenements' => '&Eacute;v&eacute;nements',
+'evenement_titre' => 'Titre',
+'evenement_descriptif' => 'Descriptif',
+'evenement_lieu' => 'Lieu',
+'evenement_date' => 'Date',
+'evenement_date_de' => 'De ',
+'evenement_date_du' => 'Du ',
+'evenement_date_a' => '&agrave; ',
+'evenement_date_au' => 'Au ',
+'evenement_date_a_immediat' => '&agrave; ',
+'evenement_date_debut' => 'Date de d&eacute;but',
+'evenement_date_fin' => 'Date de fin',
+'lien_retirer_evenement' => 'Supprimer',
+'evenement_horaire' => 'Horaire',
+'titre_sur_l_agenda' => "Sur l'agenda",
+'icone_creer_evenement' => 'Cr&eacute;er un nouvel &eacute;v&eacute;nement',
+'evenement_repetitions' => 'R&eacute;p&eacute;titions',
+'repetition_de' => "R&eacute;p&eacute;tition de",
+'sans_titre' => "(sans titre)",
+'evenement_autres_occurences' => "Autres occurences :",
+'bouton_supprimer' => "Supprimer",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_nl.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_nl.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/agenda_nl.php	(revision 30)
@@ -0,0 +1,40 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'bouton_annuler' => 'Annuleren',
+'activite_editoriale' => 'Hoofdactiviteit',
+'ajouter_un_evenement' => 'een gebeurtenis toevoegen aan dit artikel',
+'texte_agenda' => 'AGENDA',
+'titre_cadre_ajouter_evenement' => 'Een gebeurtenis toevoegen',
+'titre_cadre_modifier_evenement' => 'Een gebeurtenis wijzigen',
+'item_mots_cles_association_evenements' => 'aan de gebeurtenissen',
+'info_un_evenement' => 'een gebeurtenis,',
+'info_nombre_evenements' => '@nb_gebeurtenis@ gebeurtenissen,',
+'info_evenements' => 'Gebeurtenissen',
+'evenements' => 'Gebeurtenissen',
+'evenement_titre' => 'Titel',
+'evenement_descriptif' => 'Beschrijvend',
+'evenement_lieu' => 'Plaats',
+'evenement_date' => 'Date',
+'evenement_date_de' => 'Van ',
+'evenement_date_du' => 'Van ',
+'evenement_date_a' => 'tot ',
+'evenement_date_au' => 'Tot ',
+'evenement_date_a_immediat' => 'om ',
+'evenement_date_debut' => 'Aanvangsdatum',
+'evenement_date_fin' => 'Einddatum',
+'lien_retirer_evenement' => 'Afschaffen',
+'evenement_horaire' => 'Dienstregeling',
+'titre_sur_l_agenda' => "Op de agenda",
+'icone_creer_evenement' => 'Een nieuwe gebeurtenis creëren',
+'evenement_repetitions' => 'Herhalingen',
+'repetition_de' => "Herhaling van",
+'sans_titre' => "(zonder titel)",
+'evenement_autres_occurences' => "Andere omstandigheden :",
+'bouton_supprimer' => "Afschaffen",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/saisierapide_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/saisierapide_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/lang/saisierapide_fr.php	(revision 30)
@@ -0,0 +1,36 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+ 'icone_saisie_rapide' => "Saisie rapide d'une liste",
+ 'titre_cadre_ajouter_liste_evenement' => "Ajouter une liste d'&eacute;v&egrave;nements",
+ 'saisie_rapide_votre_liste_infos' => "Indiquer un seul &eacute;v&egrave;nement (&eacute;ventuellement ses r&eacute;p&eacute;titions) par ligne :",
+ 'saisie_rapide_reset' => "Reset",
+ 'saisie_rapide_explications' => "
+<strong>Syntaxe</strong> : &quot;jj/mm[/aaaa][-jj/mm[/aaaa]] [hh:mm[-hh:mm]]
+    &quot;Le titre&quot;
+[&quot;Le lieu&quot; [&quot;La description&quot;]] [REP=jj/mm/aaaa[,jj/mm/aaaa,etc.]] [MOTS=[groupe1:]mot1[,[groupe2:]mot2,etc.]]<br />
+<br />
+<strong>Notes</strong> : Les crochets indiquent les &eacute;l&eacute;ments facultatifs. <br />
+Les r&eacute;p&eacute;titions de l'&eacute;v&egrave;nement sont indiqu&eacute;es par  'REP=' suivi d'une liste de dates s&eacute;par&eacute;es par des virgules.<br />
+Les mots-cl&eacute;s de l'&eacute;v&egrave;nement sont indiqu&eacute;s par  'MOTS=' suivi d'une liste de mots (&eacute;ventuellement pr&eacute;c&eacute;d&eacute;s de leur groupe) s&eacute;par&eacute;s par des virgules. Attention aux majuscules/minuscules. <br />
+Respectez bien les espaces (ou tabulations) entre les &eacute;l&eacute;ments et ne mettez pas de guillemets &agrave; l'int&eacute;rieur des textes. <br />
+    <br />
+
+    <em>Exemple 1</em> : 
+20/09/2006 19:30-22:00 &quot;R&eacute;p&eacute;tition de rentr&eacute;e&quot; &quot;Temple des Gobelins&quot; &quot;Reprise de contact, Durufl&eacute;, et mise au point des calendriers&quot;<br />
+<em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ajoute un &eacute;v&egrave;nement pr&eacute;cis &agrave; une date pr&eacute;cise, et d'une dur&eacute;e  pr&eacute;cise)</em><br />
+    <em>Exemple 2</em> : 
+  17/08-23/08 &quot;Stage d'&eacute;t&eacute; 
+  <?=date('Y', time())?>
+&quot; &quot;Les Salines&quot; MOTS=photos, Agenda:priv&eacute;<br />
+  <em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ajoute un &eacute;v&egrave;nement cette ann&eacute;e, sans description et sur plusieurs jours en ajoutant deux mots-cl&eacute;s)<br />
+  Exemple 3</em> : 
+  01/01/2007 &quot;Bonne ann&eacute;e &agrave; tous !&quot; REP=01/01/2008,01/01/2009,01/01/2010<br />
+  <em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ajoute un &eacute;v&egrave;nement sans horaire, sans lieu, &agrave; une date pr&eacute;cise et r&eacute;p&eacute;t&eacute; sur 3 autres dates)</em><br />
+  <em></em> </p>"
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/plugin.xml	(revision 30)
@@ -0,0 +1,62 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	Agenda pour SPIP 1.9.2
+	</nom>
+	<icon>img_pack/agenda-48.png</icon>
+	<auteur>	<!-- Auteur du plugin -->
+	Cedric MORIN 	[notre-ville.net->http://www.notre-ville.net]
+_ patrice.vanneufville@laposte.net pour la saisie rapide
+_ &copy; 2006 - Licence GPL
+	</auteur>
+	<version>
+	0.13
+	</version>
+	<etat>stable</etat>
+	<description>
+	Agenda Ev&#233;nementiel
+_ {{Ce plugin n&#233;cessite le plugin Widget Calendar version 0.11 ou plus}}
+	</description>
+	<lien>http://www.spip-contrib.net/article1396.html</lien> <!-- URI de documentation -->
+	<options> <!-- fichier charge a chaque hit -->
+	agenda_mes_options.php
+	</options>
+	<fonctions> <!-- fichier charge a chaque recalcul -->
+	agenda_mes_fonctions.php
+	</fonctions>
+	<!-- classe d'implementation : espace de nommage qui prefixera les appels de fonction
+	sur le mode Rien::
+	ainsi les fonctions hors espace de nommage ne peuvent etre appelees
+	ce parametre est obligatoire et doit etre non vide
+	-->
+	<prefix> 
+	Agenda
+	</prefix>
+	<install>base/agenda_upgrade.php</install>	
+	<!-- Definitions des fonctions qui s'inserent dans les pipelines -->
+	<pipeline>
+		<nom>ajouter_onglets</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>exec_init</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>header_prive</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>affiche_milieu</nom>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>agenda_rendu_evenement</nom>
+		<action>rendu_evenement</action>
+		<inclure>agenda.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>taches_generales_cron</nom>
+	</pipeline>
+
+	<!-- Le parametre action est facultatif : en son absence la methode de la classe portant le nom du pipeline est appelee. Le parametre inclure est facultatif.	-->
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/public/criteres_agenda.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/public/criteres_agenda.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/public/criteres_agenda.php	(revision 30)
@@ -0,0 +1,118 @@
+<?php
+
+// {branche ?}
+// http://www.spip.net/@branche
+function critere_branche($idb, &$boucles, $crit) {
+  global $table_des_tables;
+  $not = $crit->not;
+  $boucle = &$boucles[$idb];
+  $type = $boucle->type_requete;
+  $nom = $table_des_tables[$type];
+  if ($boucle->id_table!='evenements' && $boucle->id_table!='pim_agenda')
+  	critere_branche_dist($idb, $boucles, $crit);
+  else{
+		$arg = calculer_argument_precedent($idb, 'id_rubrique', $boucles);
+		$champ = 'id_rubrique';
+
+    $type = $boucle->type_requete;
+    $nom = $table_des_tables[$type];
+    list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
+
+    $cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle);
+    if ($cle) 
+      $cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle, false);
+    if ($cle) $t = "L$cle";
+		// faire la jointure sur id_rubrique
+		
+		$c = "calcul_mysql_in('" .
+		  $t .
+		  ".id_rubrique', calcul_branche($arg), '')";
+		if ($crit->cond) $c = "($arg ? $c : 1)";
+				
+		if ($not)
+			$boucle->where[]= array("'NOT'", $c);
+		else
+			$boucle->where[]= $c;
+  }
+}
+
+function critere_agendafull_dist($idb, &$boucles, $crit)
+{
+	$params = $crit->param;
+
+	if (count($params) < 1)
+	      erreur_squelette(_T('zbug_info_erreur_squelette'),
+			       "{agenda ?} BOUCLE$idb");
+
+	$parent = $boucles[$idb]->id_parent;
+
+	// les valeurs $date et $type doivent etre connus a la compilation
+	// autrement dit ne pas etre des champs
+
+	$date_deb = array_shift($params);
+	$date_deb = $date_deb[0]->texte;
+
+	$date_fin = array_shift($params);
+	$date_fin = $date_fin[0]->texte;
+
+	$type = array_shift($params);
+	$type = $type[0]->texte;
+
+	$annee = $params ? array_shift($params) : "";
+	$annee = "\n" . 'sprintf("%04d", ($x = ' .
+		calculer_liste($annee, array(), $boucles, $parent) .
+		') ? $x : date("Y"))';
+
+	$mois =  $params ? array_shift($params) : "";
+	$mois = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($mois, array(), $boucles, $parent) .
+		') ? $x : date("m"))';
+
+	$jour =  $params ? array_shift($params) : "";
+	$jour = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($jour, array(), $boucles, $parent) .
+		') ? $x : date("d"))';
+
+	$annee2 = $params ? array_shift($params) : "";
+	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
+		calculer_liste($annee2, array(), $boucles, $parent) .
+		') ? $x : date("Y"))';
+
+	$mois2 =  $params ? array_shift($params) : "";
+	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
+		calculer_liste($mois2, array(), $boucles, $parent) .
+		') ? $x : date("m"))';
+
+	$jour2 =  $params ? array_shift($params) : "";
+	$jour2 = "\n" .  'sprintf("%02d", ($x = ' .
+		calculer_liste($jour2, array(), $boucles, $parent) .
+		') ? $x : date("d"))';
+
+	$boucle = &$boucles[$idb];
+	$date = $boucle->id_table . ".$date";
+
+	if ($type == 'jour')
+		$boucle->where[]= array("'AND'", 
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m%d\')'",("$annee . $mois . $jour")),
+					array("'>='", "'DATE_FORMAT($date_fin, \'%Y%m%d\')'",("$annee . $mois . $jour")));
+	elseif ($type == 'mois')
+		$boucle->where[]= array("'AND'", 
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m\')'",("$annee . $mois")),
+					array("'>='", "'DATE_FORMAT($date_fin, \'%Y%m\')'",("$annee . $mois")));
+	elseif ($type == 'semaine')
+		$boucle->where[]= array("'AND'", 
+					array("'>='",
+					     "'DATE_FORMAT($date_fin, \'%Y%m%d\')'", 
+					      ("date_debut_semaine($annee, $mois, $jour)")),
+					array("'<='",
+					      "'DATE_FORMAT($date_deb, \'%Y%m%d\')'",
+					      ("date_fin_semaine($annee, $mois, $jour)")));
+	elseif (count($crit->param) > 3)
+		$boucle->where[]= array("'AND'",
+					array("'>='",
+					      "'DATE_FORMAT($date_fin, \'%Y%m%d\')'",
+					      ("$annee . $mois . $jour")),
+					array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m%d\')'", ("$annee2 . $mois2 . $jour2")));
+	// sinon on prend tout
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/Code SPIP Demo/Code.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/Code SPIP Demo/Code.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/Code SPIP Demo/Code.txt	(revision 30)
@@ -0,0 +1,155 @@
+Sur-titre :
+Résumé
+
+Titre :
+Titre avec des caractères accentués - êèàç
+
+Descriptif rapide :
+Article de test pour la génération de PDF
+
+Chapeau :
+Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, 
+
+Texte :
+{{{titre1}}}
+
+[Lien interne->1]
+
+
+{{{titre2}}}
+
+{italique}
+
+{{gras}}
+
+
+<HTML><u>souligné en forçant le code html</u></HTML>
+
+<HTML><i>italique avec la balise i en forçant le code html</i></HTML>
+
+<HTML><b>gras avec la balise b en forçant le code html</b></HTML>
+
+
+<img7|left>
+
+Image déportée à gauche
+
+----
+<HTML><br /><br /><br /></HTML>
+Image centrée <img11|center>
+
+----
+<HTML><br /><br /><br /></HTML>
+
+Image déportée à droite
+<img10|right>
+
+
+----
+<HTML><br /><br /><br /></HTML>
+
+
+{{{titre3}}}
+
+Exemple de [lien interne->2]. Exemple de note [[note 1]]
+
+
+Exemple d'ancre [Ancre<-]
+
+
+Exemple de tableau
+
+| {{Nom}} | {{Prénom}} | {{Age}} |
+| Marso | Ben | 23 ans |
+| [Lien interne vers Capitaine->5] | Toto | non connu |
+| Philant | [Lien interne vers Philippe->2] | 46 ans |
+| [Lien externe vers SPIP->http://www.spip.net/]| Bébé | <img10|right> |
+
+Exemple de note [[note 2]]
+
+Exemple de puces :
+
+- Qu'est-ce que cela peut faire que je lutte pour la mauvaise cause 
+puisque je suis de bonne foi?
+- Et qu'est-ce que ça peut faire que je sois de mauvaise foi 
+puisque c'est pour la bonne cause. (Jacques 
+Prévert)
+
+
+Exemple de note [[note 3]]
+
+
+[Exemple de lien vers Rubrique->rub1] 
+
+[Exemple de lien vers Brève->br1] 
+
+Auteurs, mots-clés, sites, images, documents :
+
+lien vers [un auteur->aut13] ou [le même auteur->auteur13]
+
+lien vers [un mot->mot32]
+
+lien vers [un site syndiqué->site1]
+
+lien vers [un document joint->doc17] ou [le même document->document17]
+
+lien vers [une image->img13] ou [la même image->image13] 
+
+
+Exemple de lien vers une ancre [->art5#Ancre]
+
+
+<quote>Exemple de citation</quote>
+
+
+Exemple de note «forcée» [[<20> Note forçée]]
+
+
+Exemple de lien externe vers le site de [SPIP->http://www.spip.net/].
+
+
+Exemple de puces imbriquées :
+
+-* Ton cheval est:
+-** alezan;
+-** bai;
+-** noir;
+-* mais mon lapin est:
+-** blanc;
+-*** angora; 
+-*** ou à poil ras.
+
+
+Exemple de liste numérotée : 
+
+-# premier
+-# deuxieme
+-# troisieme
+
+Exemple de retour à la ligne_ 
+Exemple de retour à la ligne_ 
+
+Exemple de code informatique :
+
+<code>
+<?php     // ceci est du langage php
+      echo "bonjour";
+?>
+</code>
+
+Exemple de lien vers un glossaire externe :
+
+{À la recherche du temps perdu} est l'uvre majeure de [?Marcel Proust]
+
+
+{{{Titre paragraphe 1}}}
+Pellentesque consequat tristique arcu. Nulla at lectus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Mauris hendrerit iaculis mauris. Vestibulum odio. Vestibulum tristique eleifend lorem. Integer quis justo. Nunc nunc. Etiam non felis.
+
+
+{{{Titre paragraphe 2}}}
+Aliquam iaculis feugiat quam. Nunc purus diam, ornare ut, porttitor eu, mollis nec, tellus. Nulla dapibus aliquet magna. Cras vestibulum ligula a velit. Integer quam. Proin et nibh vitae enim ultrices dapibus. Duis feugiat. Vivamus neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi cursus eleifend purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque nec velit. Nulla lacus ante, tempor in, aliquam et, semper ut, sapien. Etiam varius. Nunc vel magna. Morbi vel felis ut metus molestie lacinia. Phasellus ut quam. Curabitur arcu. Integer augue. Donec non mauris.
+
+{{{Titre paragraphe 3}}}
+-  Aliquam erat volutpat. Sed venenatis mattis massa. Nulla facilisi. Donec vel sem. Praesent quis tortor. Vivamus ut diam nec leo facilisis venenatis. Suspendisse interdum facilisis pede. Etiam id nunc a metus sodales vulputate. In ultricies interdum velit. In sem. Mauris fringilla quam ut nibh. Mauris tellus augue, porta ac, condimentum eu, vulputate a, arcu. Curabitur a velit. Aenean imperdiet, nisl id dignissim euismod, elit tellus semper massa, ac accumsan ipsum nunc ornare dolor. Sed varius convallis tortor. In interdum consectetuer nisl.
+
+-  Phasellus quis nunc et pede elementum tincidunt. Nunc vitae nisl. Vestibulum tristique iaculis enim. Suspendisse sollicitudin, ligula quis commodo faucibus, enim quam semper lacus, vel fermentum tellus ipsum nec elit. Quisque neque orci, viverra sed, venenatis sed, malesuada at, enim. Cras tempor lorem in justo. Pellentesque varius accumsan purus. Aenean vel felis. Duis tincidunt elit in justo. Quisque lacus elit, congue vel, vehicula sed, commodo non, odio. 
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf.html	(revision 30)
@@ -0,0 +1,134 @@
+#CACHE{0}
+<?php
+
+	//au choix, selon le cas (voir les avantages et les inconvéniants de chaque selon le site):
+  $path_pdf = sous_repertoire(_DIR_CACHE, "article_PDF"); // stockage dans le cache SPIP
+	$path_pdf = sous_repertoire(_DIR_IMG, "article_PDF"); //stockage sous le dossier IMG
+	
+	// Mode release => $debug=0
+	// Mode debug => $debug=1 (ne fonctionne pas sous Internet Explorer)=> ??? si, ça fonctionne !
+	$debug=1;
+	
+	<B_principale>
+	<BOUCLE_principale(ARTICLES){id_article}>
+	
+	$conf_url_site = '[(#URL_SITE_SPIP|texte_script)]' ;
+	$conf_nom_site = '[(#NOM_SITE_SPIP|pdf_first_clean|texte_script)]' ;
+	
+	// Recuperation et definition des differents elements
+	
+	$site='[(#NOM_SITE_SPIP|pdf_first_clean|texte_script)]';
+	$rubrique='<B_rubrique_mere><BOUCLE_rubrique_mere(RUBRIQUES){id_rubrique}>[(#TITRE|supprimer_numero|pdf_first_clean|texte_script)]</BOUCLE_rubrique_mere></B_rubrique_mere>[(#NOM_SITE_SPIP|pdf_first_clean|texte_script)]<//B_rubrique_mere>';
+	$DateParution='[(#DATE_REDAC|affdate|pdf_first_clean|texte_script)]';
+	$DateMiseEnLigne='[(#DATE|nom_jour|texte_script)] [(#DATE|affdate|pdf_first_clean|texte_script)]';
+	
+	/*$auteur='<BOUCLE_auteurs(AUTEURS){id_article}{", "}>[(#NOM|pdf_first_clean|texte_script)]</BOUCLE_auteurs>';*/
+	$motsclef='<BOUCLE_keywords(MOTS){id_article}{", "}>[(#TITRE|pdf_first_clean|texte_script)]</BOUCLE_keywords>';
+	$yahoo='-<BOUCLE_yahoo(HIERARCHIE){id_article}> [(#TITRE|supprimer_numero|pdf_first_clean|texte_script)] - </BOUCLE_yahoo>';
+
+	$logo_site='[(#LOGO_SITE_SPIP|extraire_attribut{src}|texte_script)]';
+	// attention à l'ordre des filtres SPIP
+//	[$logo_fichier='(#LOGO_ARTICLE_RUBRIQUE|extraire_attribut{src}|texte_script)';] ne fonctionne pas
+  [$logo_fichier='(#LOGO_ARTICLE_RUBRIQUE|texte_script|extraire_attribut{src})';] //fonctionne correctement
+//  [$logo_lien="(#URL_ARTICLE)";]
+		
+	[$surtitre='(#SURTITRE|pdf_first_clean|texte_script)';]
+	[$titre='(#TITRE|SUPPRIMER_NUMERO|pdf_first_clean|texte_script)';]
+	[$soustitre='(#SOUSTITRE|pdf_first_clean|texte_script)';]
+	[$chapo='(#CHAPO|pdf_first_clean|texte_script)';]
+	[$descriptif='(#DESCRIPTIF|pdf_first_clean|texte_script)';]
+	[$texte= '(#TEXTE|pdf_first_clean|texte_script)';]
+	[$ps='(#PS|pdf_first_clean|texte_script)';]
+	[$notes='(#NOTES|pdf_first_clean|texte_script)';]
+	
+	$copyright = '[(#REM|texte{'Copyright (c) '}|pdf_first_clean|texte_script)][(#NOM_SITE_SPIP|pdf_first_clean|texte_script)][(#REM|texte{'\nTous droits réservés'}|pdf_first_clean|texte_script)]';
+	
+	$id_article = "#ID_ARTICLE";
+	
+	
+	$url_article = generer_url_article($id_article);
+	if (strpos($url_article,'?')===FALSE){
+		$p = strrpos($url_article,'.');
+		if ($p!==FALSE)
+			$url_article = substr($url_article,0,$p);
+		$files_pdf = $url_article.".pdf";
+	}
+	else
+		$files_pdf = "article_".$id_article.".pdf" ;
+	$file_out = $path_pdf . $files_pdf ;
+	
+	if (file_exists($file_out)) 
+	{
+		clearstatcache;
+		$damo = date(YmdHi , strtotime("#DATE_MODIF")) ;
+		$dage = date(YmdHi , filemtime($file_out)) ;
+		if ($damo > $dage)
+		{
+			unlink($file_out);
+		}
+	}
+	
+	</BOUCLE_principale>
+	</B_principale>
+	header("Location: index.php");
+	exit; 
+	<//B_principale>
+	
+	if ($debug == 1 && file_exists($file_out)) 
+	{
+		unlink($file_out);
+	}
+	
+	if (!file_exists($file_out)) 
+	{
+	
+		//define('FPDF_FONTPATH',_DIR_PLUGIN_ARTICLE_PDF.'/font/');
+		include_spip('pdf/fpdf');
+		include_spip('pdf/lib_pdf_global');
+		include_spip('pdf/lib_pdf_spip');
+	
+		//--------------------------------
+		// Debut génération du PDF
+		//--------------------------------
+		$pdf->debug=$debug;
+		$pdf=new PDF_SPIP();
+		
+		$pdf->SetCompression(false);
+		$pdf->SetDisplayMode(fullpage, single );	
+		
+		// haut, gauche,  bas, droite
+		$pdf->SetAllMargins(12,15,12,10);
+	
+		$pdf->SetTitle($titre);
+		$pdf->SetCreator($site);
+		$pdf->SetCopyright($copyright);
+		$pdf->SetSubject($rubrique);
+		$pdf->SetKeywords($motsclef);
+	
+		$pdf->Build($file_out);
+		
+	}
+
+		// Vous voulez afficher un pdf
+		header("Content-type: application/pdf");
+	if ($debug==1)
+	{
+		// Affiche le PDF directement dans l'onglet de Firefox
+		// Ne fonctionne pas sous IE 6 SP2 : le pdf n'est pas reconnu (pris pour un fichier texte)
+		header("location: ". url_de_base() . $file_out);
+	}
+	else
+	{
+		// Il sera nommé $files_pdf
+		// ATTENTION : pour "filename", mettre un nom de fichier court (<nom>.<extension>)
+		// sinon IE 6 SP2 ne reconnaîtra pas le type de fichier
+		// Semble poser problème sous IE6 SP1
+		// Ah,  Microsoft, je vous jure !
+		header('Content-Disposition: attachment; filename=' . $files_pdf);
+
+		// Le source du PDF original.pdf
+		readfile($file_out);
+	}
+
+	exit; 
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf_mes_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf_mes_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf_mes_fonctions.php	(revision 30)
@@ -0,0 +1,34 @@
+<?php
+	$p = explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
+	define('_DIR_PLUGIN_ARTICLE_PDF',(_DIR_PLUGINS.end($p)));
+
+	function pdf_first_clean($texte)
+	{
+			// $texte = ereg_replace("<p class[^>]*>", "<P>", $texte);
+			//Translation des codes iso
+			// PB avec l'utilisation de <code>
+			$trans = get_html_translation_table(HTML_ENTITIES);
+			$trans = array_flip($trans);
+			$trans["<br />\n"] = "<BR>";        // Pour éviter que le \n ne se tranforme en espace dans les <DIV class=spip_code> (TT, tag SPIP : code)
+			$trans['&#176;'] = "°";
+			$trans["&#339;"] = "oe";
+			$trans["&#8211;"] = "-";
+			$trans["&#8216;"] = "'";
+			$trans["&#8217;"] = "'";		
+			$trans["&#8220;"] = "\"";
+			$trans["&#8221;"] = "\"";
+			$trans["&#8230;"] = "...";
+			$trans["&#8364;"] = "Euros";
+			$trans["&ucirc;"] = "û";
+			$trans['->'] = '-»';
+			$trans['<-'] = '«-';
+			$trans['&nbsp;'] = ' ';
+			$texte = strtr($texte, $trans);
+			
+			$texte = unicode2charset(charset2unicode($texte), 'iso-8859-1'); // repasser tout dans un charset acceptable par export PDF
+	
+			return $texte;
+	}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf_mes_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf_mes_options.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/article_pdf_mes_options.php	(revision 30)
@@ -0,0 +1,32 @@
+<?php
+function balise_ARTICLE_PDF_dist($p) {
+		if (!is_array($p->param))
+			$p->param=array();
+		
+		// Produire le premier argument {article_pdf}
+		$texte = new Texte;
+		$texte->type='texte';
+		$texte->texte='article_pdf';
+		$param = array(0=>NULL, 1=>array(0=>$texte));
+		array_unshift($p->param, $param);
+		
+		// Transformer les filtres en arguments
+		for ($i=1; $i<count($p->param); $i++) {
+			if ($p->param[$i][0]) {
+				if (!strstr($p->param[$i][0], '='))
+					break;# on a rencontre un vrai filtre, c'est fini
+				$texte = new Texte;
+				$texte->type='texte';
+				$texte->texte=$p->param[$i][0];
+				$param = array(0=>$texte);
+				$p->param[$i][1] = $param;
+				$p->param[$i][0] = NULL;
+			}
+		}
+		
+		// Appeler la balise #MODELE{article_pdf}{arguments}
+		if (!function_exists($f = 'balise_modele'))
+			$f = 'balise_modele_dist';
+		return $f($p);
+	}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/lang/articlepdf_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/lang/articlepdf_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/lang/articlepdf_fr.php	(revision 30)
@@ -0,0 +1,10 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+'enregistrer_pdf'=>"Enregistrer au format PDF",
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/modeles/article_pdf.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/modeles/article_pdf.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/modeles/article_pdf.html	(revision 30)
@@ -0,0 +1,3 @@
+<a href='#URL_PAGE{article_pdf,id_article=#ENV{id_article}}' title='<:articlepdf:enregistrer_pdf:>'>
+<img src='#CHEMIN{img_pack/article_pdf.gif}' width='24' height='24' alt='<:articlepdf:enregistrer_pdf:>' />
+</a>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/GifSplit.class.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/GifSplit.class.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/GifSplit.class.php	(revision 30)
@@ -0,0 +1,602 @@
+<?php
+class GifSplit
+{
+/*===========================================*/
+/*== V A R I A B L E S ==*/
+/*===========================================*/
+var $gs_image_count = 0;
+var $gs_buffer = array();
+var $gs_global_data = array();
+var $gs_fileframe = array();
+var $gs_gif = array(0x47, 0x49, 0x46);
+var $gs_header = "\x47\x49\x46\x38\x39\x61"; //GIF89a
+var $gs_logical_screen_size;
+var $gs_logical_screen_descriptor;
+var $gs_global_color_table_size;
+var $gs_global_color_table_code;
+var $gs_global_color_table_flag;
+var $gs_global_image_data;
+var $gs_extension_lenght;
+var $gs_extension_type;
+var $gs_image_descriptor;
+var $gs_global_sorted;
+var $gs_fin;
+var $gs_fou;
+var $gs_sp;
+var $gs_fm;
+var $gs_es;
+var $gs_imnbr;
+var $gs_rsz;
+
+function GifSplit($image, $format, $name, $max_im_index='0', $resize='1')
+{
+error_reporting(0);
+$this->gs_fm = $format;
+$this->gs_sp = $name;
+$this->gs_imnbr = ($max_im_index=='')? '-1' : $max_im_index ; // maximal image index (from 0 to n)
+$this->gs_rsz = ($resize=='')? '0' : $resize ; //0: no change, 1: resize logical screen size to image size
+if ($this->gs_fm != 'GIF') $this->gs_rsz =1;
+
+if($this->gs_fin = fopen($image, "rb"))
+{
+$this->getbytes(6);
+if(!$this->arrcmp($this->gs_buffer, $this->gs_gif, 3))
+{
+$this->gs_es = "error #1";
+return(0);
+}
+/*étude du Logical Screen Descriptor
+      7 6 5 4 3 2 1 0        Field Name                    Type
+     +---------------+
+  0  |               |       Logical Screen Width          Unsigned
+     +-             -+
+  1  |               |
+     +---------------+
+  2  |               |       Logical Screen Height         Unsigned
+     +-             -+
+  3  |               |
+     +---------------+
+  4  | |     | |     |       <Packed Fields>               See below
+     +---------------+
+  5  |               |       Background Color Index        Byte
+     +---------------+
+  6  |               |       Pixel Aspect Ratio            Byte
+     +---------------+
+     <Packed Fields>  =      Global Color Table Flag       1 Bit
+                             Color Resolution              3 Bits
+                             Sort Flag                     1 Bit
+                             Size of Global Color Table    3 Bits
+*/
+//echo "début </br>" ;
+$this->getbytes(4);
+$this->gs_logical_screen_size = $this->gs_buffer;
+
+//$this->gs_buffer = array();
+$this->getbytes(3);
+$this->gs_logical_screen_descriptor = $this->gs_buffer;
+
+$this->gs_global_color_table_flag = ($this->gs_buffer[0] & 0x80) ? TRUE : FALSE;
+$this->gs_global_color_table_code = ($this->gs_buffer[0] & 0x07);
+$this->gs_global_color_table_size = pow(2,($this->gs_global_color_table_code+1));
+//$this->gs_global_color_table_size = 2 << $this->gs_global_color_table_code;
+$this->gs_global_sorted = ($this->gs_buffer[4] & 0x08) ? TRUE : FALSE;
+if($this->gs_global_color_table_flag)
+{
+$this->getbytes(3 * $this->gs_global_color_table_size);
+for($i = 0; $i < ((3 * $this->gs_global_color_table_size)); $i++)
+$this->gs_global_data[$i] = $this->gs_buffer[$i];
+}
+
+
+$this->gs_fou = '';
+
+for($loop = true; $loop; )
+{
+$this->getbytes(1);
+switch($this->gs_buffer[0])
+{
+case 0x21:
+$this->read_extension();
+break;
+case 0x2C:
+$this->read_image_descriptor();
+break;
+case 0x3B:
+$loop = false;
+break;
+default:
+$this->gs_es = sprintf("Unrecognized byte code %u\n<br>", $this->gs_buffer[0]); 
+}
+if (($this->gs_image_count > $this->gs_imnbr)and($this->gs_imnbr > -1))
+{
+$loop = false;
+}
+
+}
+fclose($this->gs_fin);
+}
+else
+{
+$this->gs_es = "error #2";
+return(0);
+}
+$this->gs_es = "ok";
+
+}
+/*///////////////////////////////////////////////*/
+/*// Function :: read_extension() //*/
+/*///////////////////////////////////////////////*/
+function read_extension()
+{
+/* Reset global variables */
+/* 0x21 puis 4 bytes discriminants: 
+  0xF9 : Graphic Control Extension puis 3ème byte Block Size
+  0xFE : Comment Extension
+  0x01 : Plain Text Extension puis 3ème byte Block Size
+  0xFF : Application Extension puis 3ème byte Block Size
+      7 6 5 4 3 2 1 0        Field Name                    Type
+     +---------------+
+  0  |     0x21      |       
+     +-             -+
+  1  |     ????      |    |  0xF9  | 0xFE  |  0x01  |
+     +---------------+
+  2  |               |    | Taille | data  | Taille |
+     +-             -+
+  3  |               |    |  Data  | Data  |  Data  |
+     |               |      
+     |               |       
+     +---------------+
+     |     0x00      |     Block Terminator  
+     +---------------+
+
+      7 6 5 4 3 2 1 0        Field Name                  
+     +---------------+
+  0  |     0x21      |       
+     +-             -+
+  1  |     0xFF      |      
+     +---------------+
+  2  |     Taille    |      Taille 1ère extension
+     +-             -+
+  3  |               |        
+     |               |        Data
+     |               |        
+     +-             -+
+     |     Taille    |       Taille 2ème extension (structure à confirmer)
+     +-             -+
+     |               |        
+     |               |        Data
+     |               |      
+     +---------------+
+     |     0x00      |       Block Terminator
+     +---------------+
+
+*/  
+$this->gs_fou .="\x21";
+$this->gs_buffer = array();
+$this->getbytes(2);
+$this->putbytes($this->gs_buffer, 2);
+$this->gs_extension_type = $this->gs_buffer[0];
+$this->gs_extension_lenght=$this->gs_buffer[1]; 
+if (array_search($this->gs_extension_type, array (1=>0xF9,2=>0x01,3=>0xFF)))
+{
+$this->getbytes($this->gs_extension_lenght);
+$this->putbytes($this->gs_buffer, $this->gs_extension_lenght);
+if ($this->gs_extension_type == 0xFF)
+  {
+ 	$this->getbytes(1);
+ 	$this->putbytes($this->gs_buffer, 1);
+  $this->gs_extension_lenght=$this->gs_buffer[0]; 
+ 	$this->getbytes($this->gs_extension_lenght);
+  $this->putbytes($this->gs_buffer, $this->gs_extension_lenght);
+  }
+}
+ for(;;)
+  {
+ 	$this->getbytes(1);
+  $this->putbytes($this->gs_buffer, 1);
+// byte == 0 : fin du data de l'extension
+  if ($this->gs_buffer[0] == 0)
+  {
+  break ;
+  }
+ }
+ 
+
+}
+
+/*///////////////////////////////////////////////*/
+/*// Function :: read_image_descriptor() //*/
+/*///////////////////////////////////////////////*/
+function read_image_descriptor()
+{
+/* Reset global variables */
+$this->gs_buffer = array();
+
+//Lecture du descripteur de l'image: Image Descriptor
+/*
+      7 6 5 4 3 2 1 0        Field Name                    Type
+     +---------------+
+  0  |     0x2C      |       Image Separator               Byte
+     +---------------+
+  1  |               |       Image Left Position           Unsigned
+     +-             -+
+  2  |               |
+     +---------------+
+  3  |               |       Image Top Position            Unsigned
+     +-             -+
+  4  |               |
+     +---------------+
+  5  |               |       Image Width                   Unsigned
+     +-             -+
+  6  |               |
+     +---------------+
+  7  |               |       Image Height                  Unsigned
+     +-             -+
+  8  |               |
+     +---------------+
+  9  | | | |0 0|     |       <Packed Fields>               See below
+     +---------------+
+     <Packed Fields>  =      Local Color Table Flag        1 Bit
+                             Interlace Flag                1 Bit
+                             Sort Flag                     1 Bit
+                             Reserved                      2 Bits
+                             Size of Local Color Table     3 Bits
+*/
+
+$this->gs_fou .="\x2C";
+
+$this->getbytes(9);
+for($i = 0; $i < 9; $i++)
+{
+$this->gs_image_descriptor[$i] = $this->gs_buffer[$i];
+}
+
+if ($this->gs_rsz==1) // new screen sizes and image edges
+{
+// new logical screen size
+$this->gs_logical_screen_size[0] = $this->gs_image_descriptor[4];
+$this->gs_logical_screen_size[1] = $this->gs_image_descriptor[5];
+$this->gs_logical_screen_size[2] = $this->gs_image_descriptor[6];
+$this->gs_logical_screen_size[3] = $this->gs_image_descriptor[7];
+// reset position
+$this->gs_image_descriptor[0] = $this->gs_image_descriptor[1] = $this->gs_image_descriptor[2] = $this->gs_image_descriptor[3] = 0;
+}
+$this->putbytes($this->gs_image_descriptor, 9);
+
+$local_color_table_flag = ($this->gs_buffer[8] & 0x80) ? TRUE : FALSE;
+
+if($local_color_table_flag)
+{
+//il y a une table locale des couleurs
+$code = ($this->gs_buffer[8] & 0x07);
+$sorted = ($this->gs_buffer[8] & 0x20) ? TRUE : FALSE;
+$size = pow(2,($code+1));
+}
+
+if($local_color_table_flag)
+{
+$this->getbytes(3 * $size);
+$this->putbytes($this->gs_buffer, 3 * $size);
+}
+/* LZW minimum code size */
+$this->getbytes(1);
+$this->putbytes($this->gs_buffer, 1);
+
+/* Image Data */
+for(;;)
+{
+$this->getbytes(1);
+$this->putbytes($this->gs_buffer, 1);
+if(($u = $this->gs_buffer[0]) == 0)
+break;
+$this->getbytes($u);
+$this->putbytes($this->gs_buffer, $u);
+}
+
+$this->gs_global_image_data = $this->gs_fou;
+
+//Construction de la structure de tête du fichier
+
+// Header -> GIF89a //
+$this->gs_fou = $this->gs_header;
+
+//logical_screen_descriptor//
+$this->putbytes($this->gs_logical_screen_size,4);
+$this->putbytes($this->gs_logical_screen_descriptor,3);
+
+//Global Color Table//
+$this->putbytes($this->gs_global_data, $this->gs_global_color_table_size*3);
+
+//Global_image_data
+
+$this->gs_fou .= $this->gs_global_image_data;
+
+/* trailer */
+$this->gs_fou .= "\x3B";
+
+
+
+
+/* Write to file */
+switch($this->gs_fm)
+{
+case "GIF":
+//Enregistrement du fichier gif
+$framename = $this->gs_sp . $this->gs_image_count . ".gif";
+ if (!$handle = fopen($framename, 'w')) {
+         echo "Impossible d'ouvrir le fichier ($framename)";
+         exit;
+    }
+
+if(!fwrite($handle,$this->gs_fou))
+{
+$this->gs_es = "error #3";
+return(0);
+}
+
+$this->gs_fileframe[]=$framename;
+break;
+/* Write as BMP */
+case "BMP":
+$im = imageCreateFromString($this->gs_fou);
+$framename = $this->gs_sp . $this->gs_image_count . ".bmp";
+if(!$this->imageBmp($im, $framename))
+{
+$this->gs_es = "error #3";
+return(0);
+}
+imageDestroy($im);
+break;
+/* Write as PNG */
+case "PNG":
+$im = imageCreateFromString($this->gs_fou);
+$framename = $this->gs_sp . $this->gs_image_count . ".png";
+if(!imagePng($im, $framename))
+{
+$this->gs_es = "error #3";
+return(0);
+}
+imageDestroy($im);
+break;
+/* Write as JPG */
+case "JPG":
+$im = imageCreateFromString($this->gs_fou);
+$framename = $this->gs_sp . $this->gs_image_count . ".jpg";
+if(!imageJpeg($im, $framename))
+{
+$this->gs_es = "error #3";
+return(0);
+}
+imageDestroy($im);
+break;
+/* Write as GIF */
+case "GIF":
+$im = imageCreateFromString($this->gs_fou);
+
+imageDestroy($im);
+
+break;
+}
+$this->gs_image_count++;
+$this->gs_fou = '';
+}
+/*///////////////////////////////////////////////*/
+/*// BMP creation group //*/
+/*///////////////////////////////////////////////*/
+/* ImageBMP */
+function imageBmp($img, $file, $RLE=0)
+{
+$ColorCount = imagecolorstotal($img);
+$Transparent = imagecolortransparent($img);
+$IsTransparent = $Transparent != -1;
+if($IsTransparent)
+$ColorCount--;
+if($ColorCount == 0)
+{
+$ColorCount = 0;
+$BitCount = 24;
+}
+if(($ColorCount > 0) && ($ColorCount <= 2))
+{
+$ColorCount = 2;
+$BitCount = 1;
+}
+if(($ColorCount > 2) && ($ColorCount <= 16))
+{
+$ColorCount = 16;
+$BitCount = 4;
+}
+if(($ColorCount > 16) && ($ColorCount <= 256))
+{
+$ColorCount = 0;
+$BitCount = 8;
+}
+$Width = imageSX($img);
+$Height = imageSY($img);
+$Zbytek = (4 - ($Width / (8 / $BitCount)) % 4) % 4;
+if($BitCount < 24)
+$palsize = pow(2, $BitCount) * 4;
+$size = (floor($Width / (8 / $BitCount)) + $Zbytek) * $Height + 54;
+$size += $palsize;
+$offset = 54 + $palsize;
+// Bitmap File Header
+$ret = 'BM';
+$ret .= $this->int_to_dword($size);
+$ret .= $this->int_to_dword(0);
+$ret .= $this->int_to_dword($offset);
+// Bitmap Info Header
+$ret .= $this->int_to_dword(40);
+$ret .= $this->int_to_dword($Width);
+$ret .= $this->int_to_dword($Height);
+$ret .= $this->int_to_word(1);
+$ret .= $this->int_to_word($BitCount);
+$ret .= $this->int_to_dword($RLE);
+$ret .= $this->int_to_dword(0);
+$ret .= $this->int_to_dword(0);
+$ret .= $this->int_to_dword(0);
+$ret .= $this->int_to_dword(0);
+$ret .= $this->int_to_dword(0);
+// image data
+$CC = $ColorCount;
+$sl1 = strlen($ret);
+if($CC == 0)
+$CC = 256;
+if($BitCount < 24)
+{
+$ColorTotal = imagecolorstotal($img);
+if($IsTransparent)
+$ColorTotal--;
+for($p = 0; $p < $ColorTotal; $p++)
+{
+$color = imagecolorsforindex($img, $p);
+$ret .= $this->inttobyte($color["blue"]);
+$ret .= $this->inttobyte($color["green"]);
+$ret .= $this->inttobyte($color["red"]);
+$ret .= $this->inttobyte(0);
+}
+$CT = $ColorTotal;
+for($p = $ColorTotal; $p < $CC; $p++)
+{
+$ret .= $this->inttobyte(0);
+$ret .= $this->inttobyte(0);
+$ret .= $this->inttobyte(0);
+$ret .= $this->inttobyte(0);
+}
+}
+if($BitCount <= 8)
+{
+for($y = $Height - 1; $y >= 0; $y--)
+{
+$bWrite = "";
+for($x = 0; $x < $Width; $x++)
+{
+$color = imagecolorat($img, $x, $y);
+$bWrite .= $this->decbinx($color, $BitCount);
+if(strlen($bWrite) == 8)
+{
+$retd .= $this->inttobyte(bindec($bWrite));
+$bWrite = "";
+}
+}
+if((strlen($bWrite) < 8) and (strlen($bWrite) != 0))
+{
+$sl = strlen($bWrite);
+for($t = 0; $t < 8 - $sl; $t++)
+$sl .= "0";
+$retd .= $this->inttobyte(bindec($bWrite));
+}
+for($z = 0; $z < $Zbytek; $z++)
+$retd .= $this->inttobyte(0);
+}
+}
+if(($RLE == 1) and ($BitCount == 8))
+{
+for($t = 0; $t < strlen($retd); $t += 4)
+{
+if($t != 0)
+if(($t) % $Width == 0)
+$ret .= chr(0).chr(0);
+if(($t + 5) % $Width == 0)
+{
+$ret .= chr(0).chr(5).substr($retd, $t, 5).chr(0);
+$t += 1;
+}
+if(($t + 6) % $Width == 0)
+{
+$ret .= chr(0).chr(6).substr($retd, $t, 6);
+$t += 2;
+}
+else
+$ret .= chr(0).chr(4).substr($retd, $t, 4);
+}
+$ret .= chr(0).chr(1);
+}
+else
+$ret .= $retd;
+if($BitCount == 24)
+{
+for($z = 0; $z < $Zbytek; $z++)
+$Dopl .= chr(0);
+for($y = $Height - 1; $y >= 0; $y--)
+{
+for($x = 0; $x < $Width; $x++)
+{
+$color = imagecolorsforindex($img, ImageColorAt($img, $x, $y));
+$ret .= chr($color["blue"]).chr($color["green"]).chr($color["red"]);
+}
+$ret .= $Dopl;
+}
+}
+if(fwrite(fopen($file, "wb"), $ret))
+return true;
+else
+return false;
+}
+/* INT 2 WORD */
+function int_to_word($n)
+{
+return chr($n & 255).chr(($n >> 8) & 255);
+}
+/* INT 2 DWORD */
+function int_to_dword($n)
+{
+return chr($n & 255).chr(($n >> 8) & 255).chr(($n >> 16) & 255).chr(($n >> 24)
+& 255); }
+/* INT 2 BYTE */
+function inttobyte($n)
+{
+return chr($n);
+}
+/* DECIMAL 2 BIN */
+function decbinx($d,$n)
+{
+$bin = decbin($d);
+$sbin = strlen($bin);
+for($j = 0; $j < $n - $sbin; $j++)
+$bin = "0$bin";
+return $bin;
+}
+/*///////////////////////////////////////////////*/
+/*// Function :: arrcmp() //*/
+/*///////////////////////////////////////////////*/
+function arrcmp($b, $s, $l)
+{
+for($i = 0; $i < $l; $i++)
+{
+if($s{$i} != $b{$i}) return false;
+}
+return true;
+}
+/*///////////////////////////////////////////////*/
+/*// Function :: getbytes() //*/
+/*///////////////////////////////////////////////*/
+function getbytes($l)
+{
+for($i = 0; $i < $l; $i++)
+{
+$bin = unpack('C*', fread($this->gs_fin, 1));
+$this->gs_buffer[$i] = $bin[1];
+}
+return $this->gs_buffer;
+}
+/*///////////////////////////////////////////////*/
+/*//           Function :: putbytes()          //*/
+/*///////////////////////////////////////////////*/
+function putbytes($s, $l)
+{
+for($i = 0; $i < $l; $i++)
+{
+$this->gs_fou .= pack('C*', $s[$i]);
+}
+}
+function getFilelist()
+{
+return $this->gs_fileframe;
+}
+
+function getReport()
+{
+return $this->gs_es;
+}
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/courier.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/courier.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/courier.php	(revision 30)
@@ -0,0 +1,7 @@
+<?php
+for($i=0;$i<=255;$i++)
+	$fpdf_charwidths['courier'][chr($i)]=600;
+$fpdf_charwidths['courierB']=$fpdf_charwidths['courier'];
+$fpdf_charwidths['courierI']=$fpdf_charwidths['courier'];
+$fpdf_charwidths['courierBI']=$fpdf_charwidths['courier'];
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helvetica.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helvetica.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helvetica.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['helvetica']=array(
+	chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
+	chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
+	','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
+	'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
+	'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
+	'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
+	chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
+	chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
+	chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticab.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticab.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticab.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['helveticaB']=array(
+	chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
+	chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
+	','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
+	'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
+	'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
+	'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
+	chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
+	chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
+	chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticabi.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticabi.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticabi.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['helveticaBI']=array(
+	chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
+	chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
+	','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
+	'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
+	'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
+	'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
+	chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
+	chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
+	chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticai.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticai.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/helveticai.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['helveticaI']=array(
+	chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
+	chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
+	','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
+	'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
+	'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
+	'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
+	chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
+	chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
+	chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1250.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1250.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1250.map	(revision 30)
@@ -0,0 +1,251 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+015A Sacute
+!8D U+0164 Tcaron
+!8E U+017D Zcaron
+!8F U+0179 Zacute
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+015B sacute
+!9D U+0165 tcaron
+!9E U+017E zcaron
+!9F U+017A zacute
+!A0 U+00A0 space
+!A1 U+02C7 caron
+!A2 U+02D8 breve
+!A3 U+0141 Lslash
+!A4 U+00A4 currency
+!A5 U+0104 Aogonek
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+015E Scedilla
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+02DB ogonek
+!B3 U+0142 lslash
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+0105 aogonek
+!BA U+015F scedilla
+!BB U+00BB guillemotright
+!BC U+013D Lcaron
+!BD U+02DD hungarumlaut
+!BE U+013E lcaron
+!BF U+017C zdotaccent
+!C0 U+0154 Racute
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0139 Lacute
+!C6 U+0106 Cacute
+!C7 U+00C7 Ccedilla
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+011A Ecaron
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+010E Dcaron
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+0147 Ncaron
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0158 Rcaron
+!D9 U+016E Uring
+!DA U+00DA Uacute
+!DB U+0170 Uhungarumlaut
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+0162 Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+0155 racute
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+013A lacute
+!E6 U+0107 cacute
+!E7 U+00E7 ccedilla
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+011B ecaron
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+010F dcaron
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+0148 ncaron
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0159 rcaron
+!F9 U+016F uring
+!FA U+00FA uacute
+!FB U+0171 uhungarumlaut
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+0163 tcommaaccent
+!FF U+02D9 dotaccent
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1251.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1251.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1251.map	(revision 30)
@@ -0,0 +1,255 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0402 afii10051
+!81 U+0403 afii10052
+!82 U+201A quotesinglbase
+!83 U+0453 afii10100
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+20AC Euro
+!89 U+2030 perthousand
+!8A U+0409 afii10058
+!8B U+2039 guilsinglleft
+!8C U+040A afii10059
+!8D U+040C afii10061
+!8E U+040B afii10060
+!8F U+040F afii10145
+!90 U+0452 afii10099
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9A U+0459 afii10106
+!9B U+203A guilsinglright
+!9C U+045A afii10107
+!9D U+045C afii10109
+!9E U+045B afii10108
+!9F U+045F afii10193
+!A0 U+00A0 space
+!A1 U+040E afii10062
+!A2 U+045E afii10110
+!A3 U+0408 afii10057
+!A4 U+00A4 currency
+!A5 U+0490 afii10050
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+0401 afii10023
+!A9 U+00A9 copyright
+!AA U+0404 afii10053
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+0407 afii10056
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+0406 afii10055
+!B3 U+0456 afii10103
+!B4 U+0491 afii10098
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+0451 afii10071
+!B9 U+2116 afii61352
+!BA U+0454 afii10101
+!BB U+00BB guillemotright
+!BC U+0458 afii10105
+!BD U+0405 afii10054
+!BE U+0455 afii10102
+!BF U+0457 afii10104
+!C0 U+0410 afii10017
+!C1 U+0411 afii10018
+!C2 U+0412 afii10019
+!C3 U+0413 afii10020
+!C4 U+0414 afii10021
+!C5 U+0415 afii10022
+!C6 U+0416 afii10024
+!C7 U+0417 afii10025
+!C8 U+0418 afii10026
+!C9 U+0419 afii10027
+!CA U+041A afii10028
+!CB U+041B afii10029
+!CC U+041C afii10030
+!CD U+041D afii10031
+!CE U+041E afii10032
+!CF U+041F afii10033
+!D0 U+0420 afii10034
+!D1 U+0421 afii10035
+!D2 U+0422 afii10036
+!D3 U+0423 afii10037
+!D4 U+0424 afii10038
+!D5 U+0425 afii10039
+!D6 U+0426 afii10040
+!D7 U+0427 afii10041
+!D8 U+0428 afii10042
+!D9 U+0429 afii10043
+!DA U+042A afii10044
+!DB U+042B afii10045
+!DC U+042C afii10046
+!DD U+042D afii10047
+!DE U+042E afii10048
+!DF U+042F afii10049
+!E0 U+0430 afii10065
+!E1 U+0431 afii10066
+!E2 U+0432 afii10067
+!E3 U+0433 afii10068
+!E4 U+0434 afii10069
+!E5 U+0435 afii10070
+!E6 U+0436 afii10072
+!E7 U+0437 afii10073
+!E8 U+0438 afii10074
+!E9 U+0439 afii10075
+!EA U+043A afii10076
+!EB U+043B afii10077
+!EC U+043C afii10078
+!ED U+043D afii10079
+!EE U+043E afii10080
+!EF U+043F afii10081
+!F0 U+0440 afii10082
+!F1 U+0441 afii10083
+!F2 U+0442 afii10084
+!F3 U+0443 afii10085
+!F4 U+0444 afii10086
+!F5 U+0445 afii10087
+!F6 U+0446 afii10088
+!F7 U+0447 afii10089
+!F8 U+0448 afii10090
+!F9 U+0449 afii10091
+!FA U+044A afii10092
+!FB U+044B afii10093
+!FC U+044C afii10094
+!FD U+044D afii10095
+!FE U+044E afii10096
+!FF U+044F afii10097
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1252.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1252.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1252.map	(revision 30)
@@ -0,0 +1,251 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!8E U+017D Zcaron
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9E U+017E zcaron
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1253.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1253.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1253.map	(revision 30)
@@ -0,0 +1,239 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!A0 U+00A0 space
+!A1 U+0385 dieresistonos
+!A2 U+0386 Alphatonos
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+2015 afii00208
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+0384 tonos
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+0388 Epsilontonos
+!B9 U+0389 Etatonos
+!BA U+038A Iotatonos
+!BB U+00BB guillemotright
+!BC U+038C Omicrontonos
+!BD U+00BD onehalf
+!BE U+038E Upsilontonos
+!BF U+038F Omegatonos
+!C0 U+0390 iotadieresistonos
+!C1 U+0391 Alpha
+!C2 U+0392 Beta
+!C3 U+0393 Gamma
+!C4 U+0394 Delta
+!C5 U+0395 Epsilon
+!C6 U+0396 Zeta
+!C7 U+0397 Eta
+!C8 U+0398 Theta
+!C9 U+0399 Iota
+!CA U+039A Kappa
+!CB U+039B Lambda
+!CC U+039C Mu
+!CD U+039D Nu
+!CE U+039E Xi
+!CF U+039F Omicron
+!D0 U+03A0 Pi
+!D1 U+03A1 Rho
+!D3 U+03A3 Sigma
+!D4 U+03A4 Tau
+!D5 U+03A5 Upsilon
+!D6 U+03A6 Phi
+!D7 U+03A7 Chi
+!D8 U+03A8 Psi
+!D9 U+03A9 Omega
+!DA U+03AA Iotadieresis
+!DB U+03AB Upsilondieresis
+!DC U+03AC alphatonos
+!DD U+03AD epsilontonos
+!DE U+03AE etatonos
+!DF U+03AF iotatonos
+!E0 U+03B0 upsilondieresistonos
+!E1 U+03B1 alpha
+!E2 U+03B2 beta
+!E3 U+03B3 gamma
+!E4 U+03B4 delta
+!E5 U+03B5 epsilon
+!E6 U+03B6 zeta
+!E7 U+03B7 eta
+!E8 U+03B8 theta
+!E9 U+03B9 iota
+!EA U+03BA kappa
+!EB U+03BB lambda
+!EC U+03BC mu
+!ED U+03BD nu
+!EE U+03BE xi
+!EF U+03BF omicron
+!F0 U+03C0 pi
+!F1 U+03C1 rho
+!F2 U+03C2 sigma1
+!F3 U+03C3 sigma
+!F4 U+03C4 tau
+!F5 U+03C5 upsilon
+!F6 U+03C6 phi
+!F7 U+03C7 chi
+!F8 U+03C8 psi
+!F9 U+03C9 omega
+!FA U+03CA iotadieresis
+!FB U+03CB upsilondieresis
+!FC U+03CC omicrontonos
+!FD U+03CD upsilontonos
+!FE U+03CE omegatonos
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1254.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1254.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1254.map	(revision 30)
@@ -0,0 +1,249 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8A U+0160 Scaron
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9A U+0161 scaron
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+011E Gbreve
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0130 Idotaccent
+!DE U+015E Scedilla
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+011F gbreve
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0131 dotlessi
+!FE U+015F scedilla
+!FF U+00FF ydieresis
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1255.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1255.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1255.map	(revision 30)
@@ -0,0 +1,233 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+20AA afii57636
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00D7 multiply
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD sfthyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 middot
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00F7 divide
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+05B0 afii57799
+!C1 U+05B1 afii57801
+!C2 U+05B2 afii57800
+!C3 U+05B3 afii57802
+!C4 U+05B4 afii57793
+!C5 U+05B5 afii57794
+!C6 U+05B6 afii57795
+!C7 U+05B7 afii57798
+!C8 U+05B8 afii57797
+!C9 U+05B9 afii57806
+!CB U+05BB afii57796
+!CC U+05BC afii57807
+!CD U+05BD afii57839
+!CE U+05BE afii57645
+!CF U+05BF afii57841
+!D0 U+05C0 afii57842
+!D1 U+05C1 afii57804
+!D2 U+05C2 afii57803
+!D3 U+05C3 afii57658
+!D4 U+05F0 afii57716
+!D5 U+05F1 afii57717
+!D6 U+05F2 afii57718
+!D7 U+05F3 gereshhebrew
+!D8 U+05F4 gershayimhebrew
+!E0 U+05D0 afii57664
+!E1 U+05D1 afii57665
+!E2 U+05D2 afii57666
+!E3 U+05D3 afii57667
+!E4 U+05D4 afii57668
+!E5 U+05D5 afii57669
+!E6 U+05D6 afii57670
+!E7 U+05D7 afii57671
+!E8 U+05D8 afii57672
+!E9 U+05D9 afii57673
+!EA U+05DA afii57674
+!EB U+05DB afii57675
+!EC U+05DC afii57676
+!ED U+05DD afii57677
+!EE U+05DE afii57678
+!EF U+05DF afii57679
+!F0 U+05E0 afii57680
+!F1 U+05E1 afii57681
+!F2 U+05E2 afii57682
+!F3 U+05E3 afii57683
+!F4 U+05E4 afii57684
+!F5 U+05E5 afii57685
+!F6 U+05E6 afii57686
+!F7 U+05E7 afii57687
+!F8 U+05E8 afii57688
+!F9 U+05E9 afii57689
+!FA U+05EA afii57690
+!FD U+200E afii299
+!FE U+200F afii300
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1257.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1257.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1257.map	(revision 30)
@@ -0,0 +1,244 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!8D U+00A8 dieresis
+!8E U+02C7 caron
+!8F U+00B8 cedilla
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!9D U+00AF macron
+!9E U+02DB ogonek
+!A0 U+00A0 space
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00D8 Oslash
+!A9 U+00A9 copyright
+!AA U+0156 Rcommaaccent
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00C6 AE
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00F8 oslash
+!B9 U+00B9 onesuperior
+!BA U+0157 rcommaaccent
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00E6 ae
+!C0 U+0104 Aogonek
+!C1 U+012E Iogonek
+!C2 U+0100 Amacron
+!C3 U+0106 Cacute
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+0118 Eogonek
+!C7 U+0112 Emacron
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0179 Zacute
+!CB U+0116 Edotaccent
+!CC U+0122 Gcommaaccent
+!CD U+0136 Kcommaaccent
+!CE U+012A Imacron
+!CF U+013B Lcommaaccent
+!D0 U+0160 Scaron
+!D1 U+0143 Nacute
+!D2 U+0145 Ncommaaccent
+!D3 U+00D3 Oacute
+!D4 U+014C Omacron
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0172 Uogonek
+!D9 U+0141 Lslash
+!DA U+015A Sacute
+!DB U+016A Umacron
+!DC U+00DC Udieresis
+!DD U+017B Zdotaccent
+!DE U+017D Zcaron
+!DF U+00DF germandbls
+!E0 U+0105 aogonek
+!E1 U+012F iogonek
+!E2 U+0101 amacron
+!E3 U+0107 cacute
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+0119 eogonek
+!E7 U+0113 emacron
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+017A zacute
+!EB U+0117 edotaccent
+!EC U+0123 gcommaaccent
+!ED U+0137 kcommaaccent
+!EE U+012B imacron
+!EF U+013C lcommaaccent
+!F0 U+0161 scaron
+!F1 U+0144 nacute
+!F2 U+0146 ncommaaccent
+!F3 U+00F3 oacute
+!F4 U+014D omacron
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0173 uogonek
+!F9 U+0142 lslash
+!FA U+015B sacute
+!FB U+016B umacron
+!FC U+00FC udieresis
+!FD U+017C zdotaccent
+!FE U+017E zcaron
+!FF U+02D9 dotaccent
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1258.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1258.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp1258.map	(revision 30)
@@ -0,0 +1,247 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!82 U+201A quotesinglbase
+!83 U+0192 florin
+!84 U+201E quotedblbase
+!85 U+2026 ellipsis
+!86 U+2020 dagger
+!87 U+2021 daggerdbl
+!88 U+02C6 circumflex
+!89 U+2030 perthousand
+!8B U+2039 guilsinglleft
+!8C U+0152 OE
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!98 U+02DC tilde
+!99 U+2122 trademark
+!9B U+203A guilsinglright
+!9C U+0153 oe
+!9F U+0178 Ydieresis
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+0300 gravecomb
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+0110 Dcroat
+!D1 U+00D1 Ntilde
+!D2 U+0309 hookabovecomb
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+01A0 Ohorn
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+01AF Uhorn
+!DE U+0303 tildecomb
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+0301 acutecomb
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+0111 dcroat
+!F1 U+00F1 ntilde
+!F2 U+0323 dotbelowcomb
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+01A1 ohorn
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+01B0 uhorn
+!FE U+20AB dong
+!FF U+00FF ydieresis
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp874.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp874.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/cp874.map	(revision 30)
@@ -0,0 +1,225 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+20AC Euro
+!85 U+2026 ellipsis
+!91 U+2018 quoteleft
+!92 U+2019 quoteright
+!93 U+201C quotedblleft
+!94 U+201D quotedblright
+!95 U+2022 bullet
+!96 U+2013 endash
+!97 U+2014 emdash
+!A0 U+00A0 space
+!A1 U+0E01 kokaithai
+!A2 U+0E02 khokhaithai
+!A3 U+0E03 khokhuatthai
+!A4 U+0E04 khokhwaithai
+!A5 U+0E05 khokhonthai
+!A6 U+0E06 khorakhangthai
+!A7 U+0E07 ngonguthai
+!A8 U+0E08 chochanthai
+!A9 U+0E09 chochingthai
+!AA U+0E0A chochangthai
+!AB U+0E0B sosothai
+!AC U+0E0C chochoethai
+!AD U+0E0D yoyingthai
+!AE U+0E0E dochadathai
+!AF U+0E0F topatakthai
+!B0 U+0E10 thothanthai
+!B1 U+0E11 thonangmonthothai
+!B2 U+0E12 thophuthaothai
+!B3 U+0E13 nonenthai
+!B4 U+0E14 dodekthai
+!B5 U+0E15 totaothai
+!B6 U+0E16 thothungthai
+!B7 U+0E17 thothahanthai
+!B8 U+0E18 thothongthai
+!B9 U+0E19 nonuthai
+!BA U+0E1A bobaimaithai
+!BB U+0E1B poplathai
+!BC U+0E1C phophungthai
+!BD U+0E1D fofathai
+!BE U+0E1E phophanthai
+!BF U+0E1F fofanthai
+!C0 U+0E20 phosamphaothai
+!C1 U+0E21 momathai
+!C2 U+0E22 yoyakthai
+!C3 U+0E23 roruathai
+!C4 U+0E24 ruthai
+!C5 U+0E25 lolingthai
+!C6 U+0E26 luthai
+!C7 U+0E27 wowaenthai
+!C8 U+0E28 sosalathai
+!C9 U+0E29 sorusithai
+!CA U+0E2A sosuathai
+!CB U+0E2B hohipthai
+!CC U+0E2C lochulathai
+!CD U+0E2D oangthai
+!CE U+0E2E honokhukthai
+!CF U+0E2F paiyannoithai
+!D0 U+0E30 saraathai
+!D1 U+0E31 maihanakatthai
+!D2 U+0E32 saraaathai
+!D3 U+0E33 saraamthai
+!D4 U+0E34 saraithai
+!D5 U+0E35 saraiithai
+!D6 U+0E36 sarauethai
+!D7 U+0E37 saraueethai
+!D8 U+0E38 sarauthai
+!D9 U+0E39 sarauuthai
+!DA U+0E3A phinthuthai
+!DF U+0E3F bahtthai
+!E0 U+0E40 saraethai
+!E1 U+0E41 saraaethai
+!E2 U+0E42 saraothai
+!E3 U+0E43 saraaimaimuanthai
+!E4 U+0E44 saraaimaimalaithai
+!E5 U+0E45 lakkhangyaothai
+!E6 U+0E46 maiyamokthai
+!E7 U+0E47 maitaikhuthai
+!E8 U+0E48 maiekthai
+!E9 U+0E49 maithothai
+!EA U+0E4A maitrithai
+!EB U+0E4B maichattawathai
+!EC U+0E4C thanthakhatthai
+!ED U+0E4D nikhahitthai
+!EE U+0E4E yamakkanthai
+!EF U+0E4F fongmanthai
+!F0 U+0E50 zerothai
+!F1 U+0E51 onethai
+!F2 U+0E52 twothai
+!F3 U+0E53 threethai
+!F4 U+0E54 fourthai
+!F5 U+0E55 fivethai
+!F6 U+0E56 sixthai
+!F7 U+0E57 seventhai
+!F8 U+0E58 eightthai
+!F9 U+0E59 ninethai
+!FA U+0E5A angkhankhuthai
+!FB U+0E5B khomutthai
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-1.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-1.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-1.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-11.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-11.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-11.map	(revision 30)
@@ -0,0 +1,248 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0E01 kokaithai
+!A2 U+0E02 khokhaithai
+!A3 U+0E03 khokhuatthai
+!A4 U+0E04 khokhwaithai
+!A5 U+0E05 khokhonthai
+!A6 U+0E06 khorakhangthai
+!A7 U+0E07 ngonguthai
+!A8 U+0E08 chochanthai
+!A9 U+0E09 chochingthai
+!AA U+0E0A chochangthai
+!AB U+0E0B sosothai
+!AC U+0E0C chochoethai
+!AD U+0E0D yoyingthai
+!AE U+0E0E dochadathai
+!AF U+0E0F topatakthai
+!B0 U+0E10 thothanthai
+!B1 U+0E11 thonangmonthothai
+!B2 U+0E12 thophuthaothai
+!B3 U+0E13 nonenthai
+!B4 U+0E14 dodekthai
+!B5 U+0E15 totaothai
+!B6 U+0E16 thothungthai
+!B7 U+0E17 thothahanthai
+!B8 U+0E18 thothongthai
+!B9 U+0E19 nonuthai
+!BA U+0E1A bobaimaithai
+!BB U+0E1B poplathai
+!BC U+0E1C phophungthai
+!BD U+0E1D fofathai
+!BE U+0E1E phophanthai
+!BF U+0E1F fofanthai
+!C0 U+0E20 phosamphaothai
+!C1 U+0E21 momathai
+!C2 U+0E22 yoyakthai
+!C3 U+0E23 roruathai
+!C4 U+0E24 ruthai
+!C5 U+0E25 lolingthai
+!C6 U+0E26 luthai
+!C7 U+0E27 wowaenthai
+!C8 U+0E28 sosalathai
+!C9 U+0E29 sorusithai
+!CA U+0E2A sosuathai
+!CB U+0E2B hohipthai
+!CC U+0E2C lochulathai
+!CD U+0E2D oangthai
+!CE U+0E2E honokhukthai
+!CF U+0E2F paiyannoithai
+!D0 U+0E30 saraathai
+!D1 U+0E31 maihanakatthai
+!D2 U+0E32 saraaathai
+!D3 U+0E33 saraamthai
+!D4 U+0E34 saraithai
+!D5 U+0E35 saraiithai
+!D6 U+0E36 sarauethai
+!D7 U+0E37 saraueethai
+!D8 U+0E38 sarauthai
+!D9 U+0E39 sarauuthai
+!DA U+0E3A phinthuthai
+!DF U+0E3F bahtthai
+!E0 U+0E40 saraethai
+!E1 U+0E41 saraaethai
+!E2 U+0E42 saraothai
+!E3 U+0E43 saraaimaimuanthai
+!E4 U+0E44 saraaimaimalaithai
+!E5 U+0E45 lakkhangyaothai
+!E6 U+0E46 maiyamokthai
+!E7 U+0E47 maitaikhuthai
+!E8 U+0E48 maiekthai
+!E9 U+0E49 maithothai
+!EA U+0E4A maitrithai
+!EB U+0E4B maichattawathai
+!EC U+0E4C thanthakhatthai
+!ED U+0E4D nikhahitthai
+!EE U+0E4E yamakkanthai
+!EF U+0E4F fongmanthai
+!F0 U+0E50 zerothai
+!F1 U+0E51 onethai
+!F2 U+0E52 twothai
+!F3 U+0E53 threethai
+!F4 U+0E54 fourthai
+!F5 U+0E55 fivethai
+!F6 U+0E56 sixthai
+!F7 U+0E57 seventhai
+!F8 U+0E58 eightthai
+!F9 U+0E59 ninethai
+!FA U+0E5A angkhankhuthai
+!FB U+0E5B khomutthai
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-15.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-15.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-15.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+20AC Euro
+!A5 U+00A5 yen
+!A6 U+0160 Scaron
+!A7 U+00A7 section
+!A8 U+0161 scaron
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+017D Zcaron
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+017E zcaron
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+0152 OE
+!BD U+0153 oe
+!BE U+0178 Ydieresis
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+00D0 Eth
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+00DE Thorn
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+00F0 eth
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+00FE thorn
+!FF U+00FF ydieresis
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-16.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-16.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-16.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+0105 aogonek
+!A3 U+0141 Lslash
+!A4 U+20AC Euro
+!A5 U+201E quotedblbase
+!A6 U+0160 Scaron
+!A7 U+00A7 section
+!A8 U+0161 scaron
+!A9 U+00A9 copyright
+!AA U+0218 Scommaaccent
+!AB U+00AB guillemotleft
+!AC U+0179 Zacute
+!AD U+00AD hyphen
+!AE U+017A zacute
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+010C Ccaron
+!B3 U+0142 lslash
+!B4 U+017D Zcaron
+!B5 U+201D quotedblright
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+017E zcaron
+!B9 U+010D ccaron
+!BA U+0219 scommaaccent
+!BB U+00BB guillemotright
+!BC U+0152 OE
+!BD U+0153 oe
+!BE U+0178 Ydieresis
+!BF U+017C zdotaccent
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0106 Cacute
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+015A Sacute
+!D8 U+0170 Uhungarumlaut
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0118 Eogonek
+!DE U+021A Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+0107 cacute
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+015B sacute
+!F8 U+0171 uhungarumlaut
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0119 eogonek
+!FE U+021B tcommaaccent
+!FF U+00FF ydieresis
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-2.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-2.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-2.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+02D8 breve
+!A3 U+0141 Lslash
+!A4 U+00A4 currency
+!A5 U+013D Lcaron
+!A6 U+015A Sacute
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+0160 Scaron
+!AA U+015E Scedilla
+!AB U+0164 Tcaron
+!AC U+0179 Zacute
+!AD U+00AD hyphen
+!AE U+017D Zcaron
+!AF U+017B Zdotaccent
+!B0 U+00B0 degree
+!B1 U+0105 aogonek
+!B2 U+02DB ogonek
+!B3 U+0142 lslash
+!B4 U+00B4 acute
+!B5 U+013E lcaron
+!B6 U+015B sacute
+!B7 U+02C7 caron
+!B8 U+00B8 cedilla
+!B9 U+0161 scaron
+!BA U+015F scedilla
+!BB U+0165 tcaron
+!BC U+017A zacute
+!BD U+02DD hungarumlaut
+!BE U+017E zcaron
+!BF U+017C zdotaccent
+!C0 U+0154 Racute
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+0102 Abreve
+!C4 U+00C4 Adieresis
+!C5 U+0139 Lacute
+!C6 U+0106 Cacute
+!C7 U+00C7 Ccedilla
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+011A Ecaron
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+010E Dcaron
+!D0 U+0110 Dcroat
+!D1 U+0143 Nacute
+!D2 U+0147 Ncaron
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+0150 Ohungarumlaut
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+0158 Rcaron
+!D9 U+016E Uring
+!DA U+00DA Uacute
+!DB U+0170 Uhungarumlaut
+!DC U+00DC Udieresis
+!DD U+00DD Yacute
+!DE U+0162 Tcommaaccent
+!DF U+00DF germandbls
+!E0 U+0155 racute
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+0103 abreve
+!E4 U+00E4 adieresis
+!E5 U+013A lacute
+!E6 U+0107 cacute
+!E7 U+00E7 ccedilla
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+011B ecaron
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+010F dcaron
+!F0 U+0111 dcroat
+!F1 U+0144 nacute
+!F2 U+0148 ncaron
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+0151 ohungarumlaut
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+0159 rcaron
+!F9 U+016F uring
+!FA U+00FA uacute
+!FB U+0171 uhungarumlaut
+!FC U+00FC udieresis
+!FD U+00FD yacute
+!FE U+0163 tcommaaccent
+!FF U+02D9 dotaccent
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-4.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-4.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-4.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0104 Aogonek
+!A2 U+0138 kgreenlandic
+!A3 U+0156 Rcommaaccent
+!A4 U+00A4 currency
+!A5 U+0128 Itilde
+!A6 U+013B Lcommaaccent
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+0160 Scaron
+!AA U+0112 Emacron
+!AB U+0122 Gcommaaccent
+!AC U+0166 Tbar
+!AD U+00AD hyphen
+!AE U+017D Zcaron
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+0105 aogonek
+!B2 U+02DB ogonek
+!B3 U+0157 rcommaaccent
+!B4 U+00B4 acute
+!B5 U+0129 itilde
+!B6 U+013C lcommaaccent
+!B7 U+02C7 caron
+!B8 U+00B8 cedilla
+!B9 U+0161 scaron
+!BA U+0113 emacron
+!BB U+0123 gcommaaccent
+!BC U+0167 tbar
+!BD U+014A Eng
+!BE U+017E zcaron
+!BF U+014B eng
+!C0 U+0100 Amacron
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+012E Iogonek
+!C8 U+010C Ccaron
+!C9 U+00C9 Eacute
+!CA U+0118 Eogonek
+!CB U+00CB Edieresis
+!CC U+0116 Edotaccent
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+012A Imacron
+!D0 U+0110 Dcroat
+!D1 U+0145 Ncommaaccent
+!D2 U+014C Omacron
+!D3 U+0136 Kcommaaccent
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+0172 Uogonek
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0168 Utilde
+!DE U+016A Umacron
+!DF U+00DF germandbls
+!E0 U+0101 amacron
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+012F iogonek
+!E8 U+010D ccaron
+!E9 U+00E9 eacute
+!EA U+0119 eogonek
+!EB U+00EB edieresis
+!EC U+0117 edotaccent
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+012B imacron
+!F0 U+0111 dcroat
+!F1 U+0146 ncommaaccent
+!F2 U+014D omacron
+!F3 U+0137 kcommaaccent
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+0173 uogonek
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0169 utilde
+!FE U+016B umacron
+!FF U+02D9 dotaccent
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-5.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-5.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-5.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+0401 afii10023
+!A2 U+0402 afii10051
+!A3 U+0403 afii10052
+!A4 U+0404 afii10053
+!A5 U+0405 afii10054
+!A6 U+0406 afii10055
+!A7 U+0407 afii10056
+!A8 U+0408 afii10057
+!A9 U+0409 afii10058
+!AA U+040A afii10059
+!AB U+040B afii10060
+!AC U+040C afii10061
+!AD U+00AD hyphen
+!AE U+040E afii10062
+!AF U+040F afii10145
+!B0 U+0410 afii10017
+!B1 U+0411 afii10018
+!B2 U+0412 afii10019
+!B3 U+0413 afii10020
+!B4 U+0414 afii10021
+!B5 U+0415 afii10022
+!B6 U+0416 afii10024
+!B7 U+0417 afii10025
+!B8 U+0418 afii10026
+!B9 U+0419 afii10027
+!BA U+041A afii10028
+!BB U+041B afii10029
+!BC U+041C afii10030
+!BD U+041D afii10031
+!BE U+041E afii10032
+!BF U+041F afii10033
+!C0 U+0420 afii10034
+!C1 U+0421 afii10035
+!C2 U+0422 afii10036
+!C3 U+0423 afii10037
+!C4 U+0424 afii10038
+!C5 U+0425 afii10039
+!C6 U+0426 afii10040
+!C7 U+0427 afii10041
+!C8 U+0428 afii10042
+!C9 U+0429 afii10043
+!CA U+042A afii10044
+!CB U+042B afii10045
+!CC U+042C afii10046
+!CD U+042D afii10047
+!CE U+042E afii10048
+!CF U+042F afii10049
+!D0 U+0430 afii10065
+!D1 U+0431 afii10066
+!D2 U+0432 afii10067
+!D3 U+0433 afii10068
+!D4 U+0434 afii10069
+!D5 U+0435 afii10070
+!D6 U+0436 afii10072
+!D7 U+0437 afii10073
+!D8 U+0438 afii10074
+!D9 U+0439 afii10075
+!DA U+043A afii10076
+!DB U+043B afii10077
+!DC U+043C afii10078
+!DD U+043D afii10079
+!DE U+043E afii10080
+!DF U+043F afii10081
+!E0 U+0440 afii10082
+!E1 U+0441 afii10083
+!E2 U+0442 afii10084
+!E3 U+0443 afii10085
+!E4 U+0444 afii10086
+!E5 U+0445 afii10087
+!E6 U+0446 afii10088
+!E7 U+0447 afii10089
+!E8 U+0448 afii10090
+!E9 U+0449 afii10091
+!EA U+044A afii10092
+!EB U+044B afii10093
+!EC U+044C afii10094
+!ED U+044D afii10095
+!EE U+044E afii10096
+!EF U+044F afii10097
+!F0 U+2116 afii61352
+!F1 U+0451 afii10071
+!F2 U+0452 afii10099
+!F3 U+0453 afii10100
+!F4 U+0454 afii10101
+!F5 U+0455 afii10102
+!F6 U+0456 afii10103
+!F7 U+0457 afii10104
+!F8 U+0458 afii10105
+!F9 U+0459 afii10106
+!FA U+045A afii10107
+!FB U+045B afii10108
+!FC U+045C afii10109
+!FD U+00A7 section
+!FE U+045E afii10110
+!FF U+045F afii10193
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-7.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-7.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-7.map	(revision 30)
@@ -0,0 +1,250 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+2018 quoteleft
+!A2 U+2019 quoteright
+!A3 U+00A3 sterling
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AF U+2015 afii00208
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+0384 tonos
+!B5 U+0385 dieresistonos
+!B6 U+0386 Alphatonos
+!B7 U+00B7 periodcentered
+!B8 U+0388 Epsilontonos
+!B9 U+0389 Etatonos
+!BA U+038A Iotatonos
+!BB U+00BB guillemotright
+!BC U+038C Omicrontonos
+!BD U+00BD onehalf
+!BE U+038E Upsilontonos
+!BF U+038F Omegatonos
+!C0 U+0390 iotadieresistonos
+!C1 U+0391 Alpha
+!C2 U+0392 Beta
+!C3 U+0393 Gamma
+!C4 U+0394 Delta
+!C5 U+0395 Epsilon
+!C6 U+0396 Zeta
+!C7 U+0397 Eta
+!C8 U+0398 Theta
+!C9 U+0399 Iota
+!CA U+039A Kappa
+!CB U+039B Lambda
+!CC U+039C Mu
+!CD U+039D Nu
+!CE U+039E Xi
+!CF U+039F Omicron
+!D0 U+03A0 Pi
+!D1 U+03A1 Rho
+!D3 U+03A3 Sigma
+!D4 U+03A4 Tau
+!D5 U+03A5 Upsilon
+!D6 U+03A6 Phi
+!D7 U+03A7 Chi
+!D8 U+03A8 Psi
+!D9 U+03A9 Omega
+!DA U+03AA Iotadieresis
+!DB U+03AB Upsilondieresis
+!DC U+03AC alphatonos
+!DD U+03AD epsilontonos
+!DE U+03AE etatonos
+!DF U+03AF iotatonos
+!E0 U+03B0 upsilondieresistonos
+!E1 U+03B1 alpha
+!E2 U+03B2 beta
+!E3 U+03B3 gamma
+!E4 U+03B4 delta
+!E5 U+03B5 epsilon
+!E6 U+03B6 zeta
+!E7 U+03B7 eta
+!E8 U+03B8 theta
+!E9 U+03B9 iota
+!EA U+03BA kappa
+!EB U+03BB lambda
+!EC U+03BC mu
+!ED U+03BD nu
+!EE U+03BE xi
+!EF U+03BF omicron
+!F0 U+03C0 pi
+!F1 U+03C1 rho
+!F2 U+03C2 sigma1
+!F3 U+03C3 sigma
+!F4 U+03C4 tau
+!F5 U+03C5 upsilon
+!F6 U+03C6 phi
+!F7 U+03C7 chi
+!F8 U+03C8 psi
+!F9 U+03C9 omega
+!FA U+03CA iotadieresis
+!FB U+03CB upsilondieresis
+!FC U+03CC omicrontonos
+!FD U+03CD upsilontonos
+!FE U+03CE omegatonos
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-9.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-9.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/iso-8859-9.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+0080 .notdef
+!81 U+0081 .notdef
+!82 U+0082 .notdef
+!83 U+0083 .notdef
+!84 U+0084 .notdef
+!85 U+0085 .notdef
+!86 U+0086 .notdef
+!87 U+0087 .notdef
+!88 U+0088 .notdef
+!89 U+0089 .notdef
+!8A U+008A .notdef
+!8B U+008B .notdef
+!8C U+008C .notdef
+!8D U+008D .notdef
+!8E U+008E .notdef
+!8F U+008F .notdef
+!90 U+0090 .notdef
+!91 U+0091 .notdef
+!92 U+0092 .notdef
+!93 U+0093 .notdef
+!94 U+0094 .notdef
+!95 U+0095 .notdef
+!96 U+0096 .notdef
+!97 U+0097 .notdef
+!98 U+0098 .notdef
+!99 U+0099 .notdef
+!9A U+009A .notdef
+!9B U+009B .notdef
+!9C U+009C .notdef
+!9D U+009D .notdef
+!9E U+009E .notdef
+!9F U+009F .notdef
+!A0 U+00A0 space
+!A1 U+00A1 exclamdown
+!A2 U+00A2 cent
+!A3 U+00A3 sterling
+!A4 U+00A4 currency
+!A5 U+00A5 yen
+!A6 U+00A6 brokenbar
+!A7 U+00A7 section
+!A8 U+00A8 dieresis
+!A9 U+00A9 copyright
+!AA U+00AA ordfeminine
+!AB U+00AB guillemotleft
+!AC U+00AC logicalnot
+!AD U+00AD hyphen
+!AE U+00AE registered
+!AF U+00AF macron
+!B0 U+00B0 degree
+!B1 U+00B1 plusminus
+!B2 U+00B2 twosuperior
+!B3 U+00B3 threesuperior
+!B4 U+00B4 acute
+!B5 U+00B5 mu
+!B6 U+00B6 paragraph
+!B7 U+00B7 periodcentered
+!B8 U+00B8 cedilla
+!B9 U+00B9 onesuperior
+!BA U+00BA ordmasculine
+!BB U+00BB guillemotright
+!BC U+00BC onequarter
+!BD U+00BD onehalf
+!BE U+00BE threequarters
+!BF U+00BF questiondown
+!C0 U+00C0 Agrave
+!C1 U+00C1 Aacute
+!C2 U+00C2 Acircumflex
+!C3 U+00C3 Atilde
+!C4 U+00C4 Adieresis
+!C5 U+00C5 Aring
+!C6 U+00C6 AE
+!C7 U+00C7 Ccedilla
+!C8 U+00C8 Egrave
+!C9 U+00C9 Eacute
+!CA U+00CA Ecircumflex
+!CB U+00CB Edieresis
+!CC U+00CC Igrave
+!CD U+00CD Iacute
+!CE U+00CE Icircumflex
+!CF U+00CF Idieresis
+!D0 U+011E Gbreve
+!D1 U+00D1 Ntilde
+!D2 U+00D2 Ograve
+!D3 U+00D3 Oacute
+!D4 U+00D4 Ocircumflex
+!D5 U+00D5 Otilde
+!D6 U+00D6 Odieresis
+!D7 U+00D7 multiply
+!D8 U+00D8 Oslash
+!D9 U+00D9 Ugrave
+!DA U+00DA Uacute
+!DB U+00DB Ucircumflex
+!DC U+00DC Udieresis
+!DD U+0130 Idotaccent
+!DE U+015E Scedilla
+!DF U+00DF germandbls
+!E0 U+00E0 agrave
+!E1 U+00E1 aacute
+!E2 U+00E2 acircumflex
+!E3 U+00E3 atilde
+!E4 U+00E4 adieresis
+!E5 U+00E5 aring
+!E6 U+00E6 ae
+!E7 U+00E7 ccedilla
+!E8 U+00E8 egrave
+!E9 U+00E9 eacute
+!EA U+00EA ecircumflex
+!EB U+00EB edieresis
+!EC U+00EC igrave
+!ED U+00ED iacute
+!EE U+00EE icircumflex
+!EF U+00EF idieresis
+!F0 U+011F gbreve
+!F1 U+00F1 ntilde
+!F2 U+00F2 ograve
+!F3 U+00F3 oacute
+!F4 U+00F4 ocircumflex
+!F5 U+00F5 otilde
+!F6 U+00F6 odieresis
+!F7 U+00F7 divide
+!F8 U+00F8 oslash
+!F9 U+00F9 ugrave
+!FA U+00FA uacute
+!FB U+00FB ucircumflex
+!FC U+00FC udieresis
+!FD U+0131 dotlessi
+!FE U+015F scedilla
+!FF U+00FF ydieresis
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/koi8-r.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/koi8-r.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/koi8-r.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+2500 SF100000
+!81 U+2502 SF110000
+!82 U+250C SF010000
+!83 U+2510 SF030000
+!84 U+2514 SF020000
+!85 U+2518 SF040000
+!86 U+251C SF080000
+!87 U+2524 SF090000
+!88 U+252C SF060000
+!89 U+2534 SF070000
+!8A U+253C SF050000
+!8B U+2580 upblock
+!8C U+2584 dnblock
+!8D U+2588 block
+!8E U+258C lfblock
+!8F U+2590 rtblock
+!90 U+2591 ltshade
+!91 U+2592 shade
+!92 U+2593 dkshade
+!93 U+2320 integraltp
+!94 U+25A0 filledbox
+!95 U+2219 periodcentered
+!96 U+221A radical
+!97 U+2248 approxequal
+!98 U+2264 lessequal
+!99 U+2265 greaterequal
+!9A U+00A0 space
+!9B U+2321 integralbt
+!9C U+00B0 degree
+!9D U+00B2 twosuperior
+!9E U+00B7 periodcentered
+!9F U+00F7 divide
+!A0 U+2550 SF430000
+!A1 U+2551 SF240000
+!A2 U+2552 SF510000
+!A3 U+0451 afii10071
+!A4 U+2553 SF520000
+!A5 U+2554 SF390000
+!A6 U+2555 SF220000
+!A7 U+2556 SF210000
+!A8 U+2557 SF250000
+!A9 U+2558 SF500000
+!AA U+2559 SF490000
+!AB U+255A SF380000
+!AC U+255B SF280000
+!AD U+255C SF270000
+!AE U+255D SF260000
+!AF U+255E SF360000
+!B0 U+255F SF370000
+!B1 U+2560 SF420000
+!B2 U+2561 SF190000
+!B3 U+0401 afii10023
+!B4 U+2562 SF200000
+!B5 U+2563 SF230000
+!B6 U+2564 SF470000
+!B7 U+2565 SF480000
+!B8 U+2566 SF410000
+!B9 U+2567 SF450000
+!BA U+2568 SF460000
+!BB U+2569 SF400000
+!BC U+256A SF540000
+!BD U+256B SF530000
+!BE U+256C SF440000
+!BF U+00A9 copyright
+!C0 U+044E afii10096
+!C1 U+0430 afii10065
+!C2 U+0431 afii10066
+!C3 U+0446 afii10088
+!C4 U+0434 afii10069
+!C5 U+0435 afii10070
+!C6 U+0444 afii10086
+!C7 U+0433 afii10068
+!C8 U+0445 afii10087
+!C9 U+0438 afii10074
+!CA U+0439 afii10075
+!CB U+043A afii10076
+!CC U+043B afii10077
+!CD U+043C afii10078
+!CE U+043D afii10079
+!CF U+043E afii10080
+!D0 U+043F afii10081
+!D1 U+044F afii10097
+!D2 U+0440 afii10082
+!D3 U+0441 afii10083
+!D4 U+0442 afii10084
+!D5 U+0443 afii10085
+!D6 U+0436 afii10072
+!D7 U+0432 afii10067
+!D8 U+044C afii10094
+!D9 U+044B afii10093
+!DA U+0437 afii10073
+!DB U+0448 afii10090
+!DC U+044D afii10095
+!DD U+0449 afii10091
+!DE U+0447 afii10089
+!DF U+044A afii10092
+!E0 U+042E afii10048
+!E1 U+0410 afii10017
+!E2 U+0411 afii10018
+!E3 U+0426 afii10040
+!E4 U+0414 afii10021
+!E5 U+0415 afii10022
+!E6 U+0424 afii10038
+!E7 U+0413 afii10020
+!E8 U+0425 afii10039
+!E9 U+0418 afii10026
+!EA U+0419 afii10027
+!EB U+041A afii10028
+!EC U+041B afii10029
+!ED U+041C afii10030
+!EE U+041D afii10031
+!EF U+041E afii10032
+!F0 U+041F afii10033
+!F1 U+042F afii10049
+!F2 U+0420 afii10034
+!F3 U+0421 afii10035
+!F4 U+0422 afii10036
+!F5 U+0423 afii10037
+!F6 U+0416 afii10024
+!F7 U+0412 afii10019
+!F8 U+042C afii10046
+!F9 U+042B afii10045
+!FA U+0417 afii10025
+!FB U+0428 afii10042
+!FC U+042D afii10047
+!FD U+0429 afii10043
+!FE U+0427 afii10041
+!FF U+042A afii10044
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/koi8-u.map
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/koi8-u.map	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/koi8-u.map	(revision 30)
@@ -0,0 +1,256 @@
+!00 U+0000 .notdef
+!01 U+0001 .notdef
+!02 U+0002 .notdef
+!03 U+0003 .notdef
+!04 U+0004 .notdef
+!05 U+0005 .notdef
+!06 U+0006 .notdef
+!07 U+0007 .notdef
+!08 U+0008 .notdef
+!09 U+0009 .notdef
+!0A U+000A .notdef
+!0B U+000B .notdef
+!0C U+000C .notdef
+!0D U+000D .notdef
+!0E U+000E .notdef
+!0F U+000F .notdef
+!10 U+0010 .notdef
+!11 U+0011 .notdef
+!12 U+0012 .notdef
+!13 U+0013 .notdef
+!14 U+0014 .notdef
+!15 U+0015 .notdef
+!16 U+0016 .notdef
+!17 U+0017 .notdef
+!18 U+0018 .notdef
+!19 U+0019 .notdef
+!1A U+001A .notdef
+!1B U+001B .notdef
+!1C U+001C .notdef
+!1D U+001D .notdef
+!1E U+001E .notdef
+!1F U+001F .notdef
+!20 U+0020 space
+!21 U+0021 exclam
+!22 U+0022 quotedbl
+!23 U+0023 numbersign
+!24 U+0024 dollar
+!25 U+0025 percent
+!26 U+0026 ampersand
+!27 U+0027 quotesingle
+!28 U+0028 parenleft
+!29 U+0029 parenright
+!2A U+002A asterisk
+!2B U+002B plus
+!2C U+002C comma
+!2D U+002D hyphen
+!2E U+002E period
+!2F U+002F slash
+!30 U+0030 zero
+!31 U+0031 one
+!32 U+0032 two
+!33 U+0033 three
+!34 U+0034 four
+!35 U+0035 five
+!36 U+0036 six
+!37 U+0037 seven
+!38 U+0038 eight
+!39 U+0039 nine
+!3A U+003A colon
+!3B U+003B semicolon
+!3C U+003C less
+!3D U+003D equal
+!3E U+003E greater
+!3F U+003F question
+!40 U+0040 at
+!41 U+0041 A
+!42 U+0042 B
+!43 U+0043 C
+!44 U+0044 D
+!45 U+0045 E
+!46 U+0046 F
+!47 U+0047 G
+!48 U+0048 H
+!49 U+0049 I
+!4A U+004A J
+!4B U+004B K
+!4C U+004C L
+!4D U+004D M
+!4E U+004E N
+!4F U+004F O
+!50 U+0050 P
+!51 U+0051 Q
+!52 U+0052 R
+!53 U+0053 S
+!54 U+0054 T
+!55 U+0055 U
+!56 U+0056 V
+!57 U+0057 W
+!58 U+0058 X
+!59 U+0059 Y
+!5A U+005A Z
+!5B U+005B bracketleft
+!5C U+005C backslash
+!5D U+005D bracketright
+!5E U+005E asciicircum
+!5F U+005F underscore
+!60 U+0060 grave
+!61 U+0061 a
+!62 U+0062 b
+!63 U+0063 c
+!64 U+0064 d
+!65 U+0065 e
+!66 U+0066 f
+!67 U+0067 g
+!68 U+0068 h
+!69 U+0069 i
+!6A U+006A j
+!6B U+006B k
+!6C U+006C l
+!6D U+006D m
+!6E U+006E n
+!6F U+006F o
+!70 U+0070 p
+!71 U+0071 q
+!72 U+0072 r
+!73 U+0073 s
+!74 U+0074 t
+!75 U+0075 u
+!76 U+0076 v
+!77 U+0077 w
+!78 U+0078 x
+!79 U+0079 y
+!7A U+007A z
+!7B U+007B braceleft
+!7C U+007C bar
+!7D U+007D braceright
+!7E U+007E asciitilde
+!7F U+007F .notdef
+!80 U+2500 SF100000
+!81 U+2502 SF110000
+!82 U+250C SF010000
+!83 U+2510 SF030000
+!84 U+2514 SF020000
+!85 U+2518 SF040000
+!86 U+251C SF080000
+!87 U+2524 SF090000
+!88 U+252C SF060000
+!89 U+2534 SF070000
+!8A U+253C SF050000
+!8B U+2580 upblock
+!8C U+2584 dnblock
+!8D U+2588 block
+!8E U+258C lfblock
+!8F U+2590 rtblock
+!90 U+2591 ltshade
+!91 U+2592 shade
+!92 U+2593 dkshade
+!93 U+2320 integraltp
+!94 U+25A0 filledbox
+!95 U+2022 bullet
+!96 U+221A radical
+!97 U+2248 approxequal
+!98 U+2264 lessequal
+!99 U+2265 greaterequal
+!9A U+00A0 space
+!9B U+2321 integralbt
+!9C U+00B0 degree
+!9D U+00B2 twosuperior
+!9E U+00B7 periodcentered
+!9F U+00F7 divide
+!A0 U+2550 SF430000
+!A1 U+2551 SF240000
+!A2 U+2552 SF510000
+!A3 U+0451 afii10071
+!A4 U+0454 afii10101
+!A5 U+2554 SF390000
+!A6 U+0456 afii10103
+!A7 U+0457 afii10104
+!A8 U+2557 SF250000
+!A9 U+2558 SF500000
+!AA U+2559 SF490000
+!AB U+255A SF380000
+!AC U+255B SF280000
+!AD U+0491 afii10098
+!AE U+255D SF260000
+!AF U+255E SF360000
+!B0 U+255F SF370000
+!B1 U+2560 SF420000
+!B2 U+2561 SF190000
+!B3 U+0401 afii10023
+!B4 U+0404 afii10053
+!B5 U+2563 SF230000
+!B6 U+0406 afii10055
+!B7 U+0407 afii10056
+!B8 U+2566 SF410000
+!B9 U+2567 SF450000
+!BA U+2568 SF460000
+!BB U+2569 SF400000
+!BC U+256A SF540000
+!BD U+0490 afii10050
+!BE U+256C SF440000
+!BF U+00A9 copyright
+!C0 U+044E afii10096
+!C1 U+0430 afii10065
+!C2 U+0431 afii10066
+!C3 U+0446 afii10088
+!C4 U+0434 afii10069
+!C5 U+0435 afii10070
+!C6 U+0444 afii10086
+!C7 U+0433 afii10068
+!C8 U+0445 afii10087
+!C9 U+0438 afii10074
+!CA U+0439 afii10075
+!CB U+043A afii10076
+!CC U+043B afii10077
+!CD U+043C afii10078
+!CE U+043D afii10079
+!CF U+043E afii10080
+!D0 U+043F afii10081
+!D1 U+044F afii10097
+!D2 U+0440 afii10082
+!D3 U+0441 afii10083
+!D4 U+0442 afii10084
+!D5 U+0443 afii10085
+!D6 U+0436 afii10072
+!D7 U+0432 afii10067
+!D8 U+044C afii10094
+!D9 U+044B afii10093
+!DA U+0437 afii10073
+!DB U+0448 afii10090
+!DC U+044D afii10095
+!DD U+0449 afii10091
+!DE U+0447 afii10089
+!DF U+044A afii10092
+!E0 U+042E afii10048
+!E1 U+0410 afii10017
+!E2 U+0411 afii10018
+!E3 U+0426 afii10040
+!E4 U+0414 afii10021
+!E5 U+0415 afii10022
+!E6 U+0424 afii10038
+!E7 U+0413 afii10020
+!E8 U+0425 afii10039
+!E9 U+0418 afii10026
+!EA U+0419 afii10027
+!EB U+041A afii10028
+!EC U+041B afii10029
+!ED U+041C afii10030
+!EE U+041D afii10031
+!EF U+041E afii10032
+!F0 U+041F afii10033
+!F1 U+042F afii10049
+!F2 U+0420 afii10034
+!F3 U+0421 afii10035
+!F4 U+0422 afii10036
+!F5 U+0423 afii10037
+!F6 U+0416 afii10024
+!F7 U+0412 afii10019
+!F8 U+042C afii10046
+!F9 U+042B afii10045
+!FA U+0417 afii10025
+!FB U+0428 afii10042
+!FC U+042D afii10047
+!FD U+0429 afii10043
+!FE U+0427 afii10041
+!FF U+042A afii10044
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/makefont.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/makefont.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/makefont/makefont.php	(revision 30)
@@ -0,0 +1,416 @@
+<?php
+/*******************************************************************************
+* Utilitaire de génération de fichier de définition de police                  *
+* Version : 1.13                                                               *
+* Date :    31/12/2004                                                         *
+*******************************************************************************/
+
+function ReadMap($enc)
+{
+	//Read a map file
+	$file=dirname(__FILE__).'/'.strtolower($enc).'.map';
+	$a=file($file);
+	if(empty($a))
+		die('<B>Error:</B> encoding not found: '.$enc);
+	$cc2gn=array();
+	foreach($a as $l)
+	{
+		if($l{0}=='!')
+		{
+			$e=preg_split('/[ \\t]+/',rtrim($l));
+			$cc=hexdec(substr($e[0],1));
+			$gn=$e[2];
+			$cc2gn[$cc]=$gn;
+		}
+	}
+	for($i=0;$i<=255;$i++)
+	{
+		if(!isset($cc2gn[$i]))
+			$cc2gn[$i]='.notdef';
+	}
+	return $cc2gn;
+}
+
+function ReadAFM($file,&$map)
+{
+	//Read a font metric file
+	$a=file($file);
+	if(empty($a))
+		die('File not found');
+	$widths=array();
+	$fm=array();
+	$fix=array('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent',
+		'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut',
+		'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent',
+		'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent',
+		'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent',
+		'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat',
+		'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb',
+		'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong');
+	foreach($a as $l)
+	{
+		$e=explode(' ',rtrim($l));
+		if(count($e)<2)
+			continue;
+		$code=$e[0];
+		$param=$e[1];
+		if($code=='C')
+		{
+			//Character metrics
+			$cc=(int)$e[1];
+			$w=$e[4];
+			$gn=$e[7];
+			if(substr($gn,-4)=='20AC')
+				$gn='Euro';
+			if(isset($fix[$gn]))
+			{
+				//Fix incorrect glyph name
+				foreach($map as $c=>$n)
+				{
+					if($n==$fix[$gn])
+						$map[$c]=$gn;
+				}
+			}
+			if(empty($map))
+			{
+				//Symbolic font: use built-in encoding
+				$widths[$cc]=$w;
+			}
+			else
+			{
+				$widths[$gn]=$w;
+				if($gn=='X')
+					$fm['CapXHeight']=$e[13];
+			}
+			if($gn=='.notdef')
+				$fm['MissingWidth']=$w;
+		}
+		elseif($code=='FontName')
+			$fm['FontName']=$param;
+		elseif($code=='Weight')
+			$fm['Weight']=$param;
+		elseif($code=='ItalicAngle')
+			$fm['ItalicAngle']=(double)$param;
+		elseif($code=='Ascender')
+			$fm['Ascender']=(int)$param;
+		elseif($code=='Descender')
+			$fm['Descender']=(int)$param;
+		elseif($code=='UnderlineThickness')
+			$fm['UnderlineThickness']=(int)$param;
+		elseif($code=='UnderlinePosition')
+			$fm['UnderlinePosition']=(int)$param;
+		elseif($code=='IsFixedPitch')
+			$fm['IsFixedPitch']=($param=='true');
+		elseif($code=='FontBBox')
+			$fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]);
+		elseif($code=='CapHeight')
+			$fm['CapHeight']=(int)$param;
+		elseif($code=='StdVW')
+			$fm['StdVW']=(int)$param;
+	}
+	if(!isset($fm['FontName']))
+		die('FontName not found');
+	if(!empty($map))
+	{
+		if(!isset($widths['.notdef']))
+			$widths['.notdef']=600;
+		if(!isset($widths['Delta']) and isset($widths['increment']))
+			$widths['Delta']=$widths['increment'];
+		//Order widths according to map
+		for($i=0;$i<=255;$i++)
+		{
+			if(!isset($widths[$map[$i]]))
+			{
+				echo '<B>Warning:</B> character '.$map[$i].' is missing<BR>';
+				$widths[$i]=$widths['.notdef'];
+			}
+			else
+				$widths[$i]=$widths[$map[$i]];
+		}
+	}
+	$fm['Widths']=$widths;
+	return $fm;
+}
+
+function MakeFontDescriptor($fm,$symbolic)
+{
+	//Ascent
+	$asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000);
+	$fd="array('Ascent'=>".$asc;
+	//Descent
+	$desc=(isset($fm['Descender']) ? $fm['Descender'] : -200);
+	$fd.=",'Descent'=>".$desc;
+	//CapHeight
+	if(isset($fm['CapHeight']))
+		$ch=$fm['CapHeight'];
+	elseif(isset($fm['CapXHeight']))
+		$ch=$fm['CapXHeight'];
+	else
+		$ch=$asc;
+	$fd.=",'CapHeight'=>".$ch;
+	//Flags
+	$flags=0;
+	if(isset($fm['IsFixedPitch']) and $fm['IsFixedPitch'])
+		$flags+=1<<0;
+	if($symbolic)
+		$flags+=1<<2;
+	if(!$symbolic)
+		$flags+=1<<5;
+	if(isset($fm['ItalicAngle']) and $fm['ItalicAngle']!=0)
+		$flags+=1<<6;
+	$fd.=",'Flags'=>".$flags;
+	//FontBBox
+	if(isset($fm['FontBBox']))
+		$fbb=$fm['FontBBox'];
+	else
+		$fbb=array(0,$des-100,1000,$asc+100);
+	$fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'";
+	//ItalicAngle
+	$ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0);
+	$fd.=",'ItalicAngle'=>".$ia;
+	//StemV
+	if(isset($fm['StdVW']))
+		$stemv=$fm['StdVW'];
+	elseif(isset($fm['Weight']) and eregi('(bold|black)',$fm['Weight']))
+		$stemv=120;
+	else
+		$stemv=70;
+	$fd.=",'StemV'=>".$stemv;
+	//MissingWidth
+	if(isset($fm['MissingWidth']))
+		$fd.=",'MissingWidth'=>".$fm['MissingWidth'];
+	$fd.=')';
+	return $fd;
+}
+
+function MakeWidthArray($fm)
+{
+	//Make character width array
+	$s="array(\n\t";
+	$cw=$fm['Widths'];
+	for($i=0;$i<=255;$i++)
+	{
+		if(chr($i)=="'")
+			$s.="'\\''";
+		elseif(chr($i)=="\\")
+			$s.="'\\\\'";
+		elseif($i>=32 and $i<=126)
+			$s.="'".chr($i)."'";
+		else
+			$s.="chr($i)";
+		$s.='=>'.$fm['Widths'][$i];
+		if($i<255)
+			$s.=',';
+		if(($i+1)%22==0)
+			$s.="\n\t";
+	}
+	$s.=')';
+	return $s;
+}
+
+function MakeFontEncoding($map)
+{
+	//Build differences from reference encoding
+	$ref=ReadMap('cp1252');
+	$s='';
+	$last=0;
+	for($i=32;$i<=255;$i++)
+	{
+		if($map[$i]!=$ref[$i])
+		{
+			if($i!=$last+1)
+				$s.=$i.' ';
+			$last=$i;
+			$s.='/'.$map[$i].' ';
+		}
+	}
+	return rtrim($s);
+}
+
+function SaveToFile($file,$s,$mode='t')
+{
+	$f=fopen($file,'w'.$mode);
+	if(!$f)
+		die('Can\'t write to file '.$file);
+	fwrite($f,$s,strlen($s));
+	fclose($f);
+}
+
+function ReadShort($f)
+{
+	$a=unpack('n1n',fread($f,2));
+	return $a['n'];
+}
+
+function ReadLong($f)
+{
+	$a=unpack('N1N',fread($f,4));
+	return $a['N'];
+}
+
+function CheckTTF($file)
+{
+	//Check if font license allows embedding
+	$f=fopen($file,'rb');
+	if(!$f)
+		die('<B>Error:</B> Can\'t open '.$file);
+	//Extract number of tables
+	fseek($f,4,SEEK_CUR);
+	$nb=ReadShort($f);
+	fseek($f,6,SEEK_CUR);
+	//Seek OS/2 table
+	$found=false;
+	for($i=0;$i<$nb;$i++)
+	{
+		if(fread($f,4)=='OS/2')
+		{
+			$found=true;
+			break;
+		}
+		fseek($f,12,SEEK_CUR);
+	}
+	if(!$found)
+	{
+		fclose($f);
+		return;
+	}
+	fseek($f,4,SEEK_CUR);
+	$offset=ReadLong($f);
+	fseek($f,$offset,SEEK_SET);
+	//Extract fsType flags
+	fseek($f,8,SEEK_CUR);
+	$fsType=ReadShort($f);
+	$rl=($fsType & 0x02)!=0;
+	$pp=($fsType & 0x04)!=0;
+	$e=($fsType & 0x08)!=0;
+	fclose($f);
+	if($rl and !$pp and !$e)
+		echo '<B>Warning:</B> font license does not allow embedding';
+}
+
+/*******************************************************************************
+* $fontfile : chemin du fichier TTF (ou chaîne vide si pas d'incorporation)    *
+* $afmfile :  chemin du fichier AFM                                            *
+* $enc :      encodage (ou chaîne vide si la police est symbolique)            *
+* $patch :    patch optionnel pour l'encodage                                  *
+* $type :     type de la police si $fontfile est vide                          *
+*******************************************************************************/
+function MakeFont($fontfile,$afmfile,$enc='cp1252',$patch=array(),$type='TrueType')
+{
+	//Generate a font definition file
+	set_magic_quotes_runtime(0);
+	ini_set('auto_detect_line_endings','1');
+	if($enc)
+	{
+		$map=ReadMap($enc);
+		foreach($patch as $cc=>$gn)
+			$map[$cc]=$gn;
+	}
+	else
+		$map=array();
+	if(!file_exists($afmfile))
+		die('<B>Error:</B> AFM file not found: '.$afmfile);
+	$fm=ReadAFM($afmfile,$map);
+	if($enc)
+		$diff=MakeFontEncoding($map);
+	else
+		$diff='';
+	$fd=MakeFontDescriptor($fm,empty($map));
+	//Find font type
+	if($fontfile)
+	{
+		$ext=strtolower(substr($fontfile,-3));
+		if($ext=='ttf')
+			$type='TrueType';
+		elseif($ext=='pfb')
+			$type='Type1';
+		else
+			die('<B>Error:</B> unrecognized font file extension: '.$ext);
+	}
+	else
+	{
+		if($type!='TrueType' and $type!='Type1')
+			die('<B>Error:</B> incorrect font type: '.$type);
+	}
+	//Start generation
+	$s='<?php'."\n";
+	$s.='$type=\''.$type."';\n";
+	$s.='$name=\''.$fm['FontName']."';\n";
+	$s.='$desc='.$fd.";\n";
+	if(!isset($fm['UnderlinePosition']))
+		$fm['UnderlinePosition']=-100;
+	if(!isset($fm['UnderlineThickness']))
+		$fm['UnderlineThickness']=50;
+	$s.='$up='.$fm['UnderlinePosition'].";\n";
+	$s.='$ut='.$fm['UnderlineThickness'].";\n";
+	$w=MakeWidthArray($fm);
+	$s.='$cw='.$w.";\n";
+	$s.='$enc=\''.$enc."';\n";
+	$s.='$diff=\''.$diff."';\n";
+	$basename=substr(basename($afmfile),0,-4);
+	if($fontfile)
+	{
+		//Embedded font
+		if(!file_exists($fontfile))
+			die('<B>Error:</B> font file not found: '.$fontfile);
+		if($type=='TrueType')
+			CheckTTF($fontfile);
+		$f=fopen($fontfile,'rb');
+		if(!$f)
+			die('<B>Error:</B> Can\'t open '.$fontfile);
+		$file=fread($f,filesize($fontfile));
+		fclose($f);
+		if($type=='Type1')
+		{
+			//Find first two sections and discard third one
+			$header=(ord($file{0})==128);
+			if($header)
+			{
+				//Strip first binary header
+				$file=substr($file,6);
+			}
+			$pos=strpos($file,'eexec');
+			if(!$pos)
+				die('<B>Error:</B> font file does not seem to be valid Type1');
+			$size1=$pos+6;
+			if($header and ord($file{$size1})==128)
+			{
+				//Strip second binary header
+				$file=substr($file,0,$size1).substr($file,$size1+6);
+			}
+			$pos=strpos($file,'00000000');
+			if(!$pos)
+				die('<B>Error:</B> font file does not seem to be valid Type1');
+			$size2=$pos-$size1;
+			$file=substr($file,0,$size1+$size2);
+		}
+		if(function_exists('gzcompress'))
+		{
+			$cmp=$basename.'.z';
+			SaveToFile($cmp,gzcompress($file),'b');
+			$s.='$file=\''.$cmp."';\n";
+			echo 'Font file compressed ('.$cmp.')<BR>';
+		}
+		else
+		{
+			$s.='$file=\''.basename($fontfile)."';\n";
+			echo '<B>Notice:</B> font file could not be compressed (zlib extension not available)<BR>';
+		}
+		if($type=='Type1')
+		{
+			$s.='$size1='.$size1.";\n";
+			$s.='$size2='.$size2.";\n";
+		}
+		else
+			$s.='$originalsize='.filesize($fontfile).";\n";
+	}
+	else
+	{
+		//Not embedded font
+		$s.='$file='."'';\n";
+	}
+	$s.="?>\n";
+	SaveToFile($basename.'.php',$s);
+	echo 'Font definition file generated ('.$basename.'.php'.')<BR>';
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/symbol.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/symbol.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/symbol.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['symbol']=array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549,
+	','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722,
+	'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768,
+	'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576,
+	'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0,
+	chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
+	chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603,
+	chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768,
+	chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042,
+	chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329,
+	chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/times.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/times.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/times.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['times']=array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564,
+	','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722,
+	'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944,
+	'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
+	'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
+	chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980,
+	chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333,
+	chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
+	chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
+	chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesb.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesb.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesb.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['timesB']=array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
+	','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722,
+	'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000,
+	'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833,
+	'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
+	chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333,
+	chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
+	chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
+	chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesbi.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesbi.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesbi.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['timesBI']=array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
+	','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667,
+	'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889,
+	'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
+	'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
+	chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
+	chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333,
+	chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
+	chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
+	chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesi.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesi.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/timesi.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['timesI']=array(
+	chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
+	chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675,
+	','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611,
+	'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833,
+	'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722,
+	'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
+	chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980,
+	chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333,
+	chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611,
+	chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
+	chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
+	chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/zapfdingbats.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/zapfdingbats.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/font/zapfdingbats.php	(revision 30)
@@ -0,0 +1,15 @@
+<?php
+$fpdf_charwidths['zapfdingbats']=array(
+	chr(0)=>0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0,
+	chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939,
+	','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692,
+	'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776,
+	'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873,
+	'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317,
+	chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
+	chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788,
+	chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788,
+	chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918,
+	chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874,
+	chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0);
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/fpdf.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/fpdf.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/fpdf.php	(revision 30)
@@ -0,0 +1,1816 @@
+<?php
+/*******************************************************************************
+* Logiciel : FPDF                                                              *
+* Version :  1.53                                                              *
+* Date :     31/12/2004                                                        *
+* Auteur :   Olivier PLATHEY                                                   *
+* Licence :  Freeware                                                          *
+*                                                                              *
+* Vous pouvez utiliser et modifier ce logiciel comme vous le souhaitez.        *
+*******************************************************************************/
+
+if(!class_exists('FPDF'))
+{
+define('FPDF_VERSION','1.53');
+
+class FPDF
+{
+//Private properties
+var $page;               //current page number
+var $n;                  //current object number
+var $offsets;            //array of object offsets
+var $buffer;             //buffer holding in-memory PDF
+var $pages;              //array containing pages
+var $state;              //current document state
+var $compress;           //compression flag
+var $DefOrientation;     //default orientation
+var $CurOrientation;     //current orientation
+var $OrientationChanges; //array indicating orientation changes
+var $k;                  //scale factor (number of points in user unit)
+var $fwPt,$fhPt;         //dimensions of page format in points
+var $fw,$fh;             //dimensions of page format in user unit
+var $wPt,$hPt;           //current dimensions of page in points
+var $w,$h;               //current dimensions of page in user unit
+var $lMargin;            //left margin
+var $tMargin;            //top margin
+var $rMargin;            //right margin
+var $bMargin;            //page break margin
+var $cMargin;            //cell margin
+var $x,$y;               //current position in user unit for cell positioning
+var $lasth;              //height of last cell printed
+var $LineWidth;          //line width in user unit
+var $CoreFonts;          //array of standard font names
+var $fonts;              //array of used fonts
+var $FontFiles;          //array of font files
+var $diffs;              //array of encoding differences
+var $images;             //array of used images
+var $PageLinks;          //array of links in pages
+var $links;              //array of internal links
+var $FontFamily;         //current font family
+var $FontStyle;          //current font style
+var $underline;          //underlining flag
+var $CurrentFont;        //current font info
+var $FontSizePt;         //current font size in points
+var $FontSize;           //current font size in user unit
+var $DrawColor;          //commands for drawing color
+var $FillColor;          //commands for filling color
+var $TextColor;          //commands for text color
+var $ColorFlag;          //indicates whether fill and text colors are different
+var $ws;                 //word spacing
+var $AutoPageBreak;      //automatic page breaking
+var $PageBreakTrigger;   //threshold used to trigger page breaks
+var $InFooter;           //flag set when processing footer
+var $ZoomMode;           //zoom display mode
+var $LayoutMode;         //layout display mode
+var $title;              //title
+var $subject;            //subject
+var $author;             //author
+var $copyright;			 //copyright
+var $keywords;           //keywords
+var $creator;            //creator
+var $AliasNbPages;       //alias for total number of pages
+var $PDFVersion;         //PDF version number
+
+var $maxLineWidth;				// ajout CM 24/09/2006
+var $îmages = array();
+/*******************************************************************************
+*                                                                              *
+*                               Public methods                                 *
+*                                                                              *
+*******************************************************************************/
+function FPDF($orientation='P',$unit='mm',$format='A4')
+{
+	//Some checks
+	$this->_dochecks();
+	//Initialization of properties
+	$this->page=0;
+	$this->n=2;
+	$this->buffer='';
+	$this->pages=array();
+	$this->OrientationChanges=array();
+	$this->state=0;
+	$this->fonts=array();
+	$this->FontFiles=array();
+	$this->diffs=array();
+	$this->images=array();
+	$this->links=array();
+	$this->InFooter=false;
+	$this->lasth=0;
+	$this->FontFamily='';
+	$this->FontStyle='';
+	$this->FontSizePt=12;
+	$this->underline=false;
+	$this->DrawColor='0 G';
+	$this->FillColor='0 g';
+	$this->TextColor='0 g';
+	$this->ColorFlag=false;
+	$this->ws=0;
+	//Standard fonts
+	$this->CoreFonts=array('courier'=>'Courier','courierB'=>'Courier-Bold','courierI'=>'Courier-Oblique','courierBI'=>'Courier-BoldOblique',
+		'helvetica'=>'Helvetica','helveticaB'=>'Helvetica-Bold','helveticaI'=>'Helvetica-Oblique','helveticaBI'=>'Helvetica-BoldOblique',
+		'times'=>'Times-Roman','timesB'=>'Times-Bold','timesI'=>'Times-Italic','timesBI'=>'Times-BoldItalic',
+		'symbol'=>'Symbol','zapfdingbats'=>'ZapfDingbats');
+	//Scale factor
+	if($unit=='pt')
+		$this->k=1;
+	elseif($unit=='mm')
+		$this->k=72/25.4;
+	elseif($unit=='cm')
+		$this->k=72/2.54;
+	elseif($unit=='in')
+		$this->k=72;
+	else
+		$this->Error('Incorrect unit: '.$unit);
+	//Page format
+	if(is_string($format))
+	{
+		$format=strtolower($format);
+		if($format=='a3')
+			$format=array(841.89,1190.55);
+		elseif($format=='a4')
+			$format=array(595.28,841.89);
+		elseif($format=='a5')
+			$format=array(420.94,595.28);
+		elseif($format=='letter')
+			$format=array(612,792);
+		elseif($format=='legal')
+			$format=array(612,1008);
+		else
+			$this->Error('Unknown page format: '.$format);
+		$this->fwPt=$format[0];
+		$this->fhPt=$format[1];
+	}
+	else
+	{
+		$this->fwPt=$format[0]*$this->k;
+		$this->fhPt=$format[1]*$this->k;
+	}
+	$this->fw=$this->fwPt/$this->k;
+	$this->fh=$this->fhPt/$this->k;
+	//Page orientation
+	$orientation=strtolower($orientation);
+	if($orientation=='p' || $orientation=='portrait')
+	{
+		$this->DefOrientation='P';
+		$this->wPt=$this->fwPt;
+		$this->hPt=$this->fhPt;
+	}
+	elseif($orientation=='l' || $orientation=='landscape')
+	{
+		$this->DefOrientation='L';
+		$this->wPt=$this->fhPt;
+		$this->hPt=$this->fwPt;
+	}
+	else
+		$this->Error('Incorrect orientation: '.$orientation);
+	$this->CurOrientation=$this->DefOrientation;
+	$this->w=$this->wPt/$this->k;
+	$this->h=$this->hPt/$this->k;
+	//Page margins (1 cm)
+	$margin=28.35/$this->k;
+	$this->SetMargins($margin,$margin);
+	//Interior cell margin (1 mm)
+	$this->cMargin=$margin/10;
+	//Line width (0.2 mm)
+	$this->LineWidth=.567/$this->k;
+	//Automatic page break
+	$this->SetAutoPageBreak(true,2*$margin);
+	//Full width display mode
+	$this->SetDisplayMode('fullwidth');
+	//Enable compression
+	$this->SetCompression(true);
+	//Set default PDF version number
+	$this->PDFVersion='1.3';
+	$this->maxLineWidth=0;
+}
+
+function SetMargins($left,$top,$right=-1)
+{
+	//Set left, top and right margins
+	$this->lMargin=$left;
+	$this->tMargin=$top;
+	if($right==-1)
+		$right=$left;
+	$this->rMargin=$right;
+}
+
+function SetLeftMargin($margin)
+{
+	//Set left margin
+	$this->lMargin=$margin;
+	if($this->page>0 && $this->x<$margin)
+		$this->x=$margin;
+}
+
+function SetTopMargin($margin)
+{
+	//Set top margin
+	$this->tMargin=$margin;
+}
+
+function SetRightMargin($margin)
+{
+	//Set right margin
+	$this->rMargin=$margin;
+}
+
+function SetAutoPageBreak($auto,$margin=0)
+{
+	//Set auto page break mode and triggering margin
+	$this->AutoPageBreak=$auto;
+	$this->bMargin=$margin;
+	$this->PageBreakTrigger=$this->h-$margin;
+}
+
+function SetDisplayMode($zoom,$layout='continuous')
+{
+	//Set display mode in viewer
+	if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom))
+		$this->ZoomMode=$zoom;
+	else
+		$this->Error('Incorrect zoom display mode: '.$zoom);
+	if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default')
+		$this->LayoutMode=$layout;
+	else
+		$this->Error('Incorrect layout display mode: '.$layout);
+}
+
+function SetCompression($compress)
+{
+	//Set page compression
+	if(function_exists('gzcompress'))
+		$this->compress=$compress;
+	else
+		$this->compress=false;
+}
+
+function SetTitle($title)
+{
+	//Title of document
+	$this->title=$title;
+}
+
+function SetSubject($subject)
+{
+	//Subject of document
+	$this->subject=$subject;
+}
+
+function SetAuthor($author)
+{
+	//Author of document
+	$this->author=$author;
+}
+
+function SetCopyright($copyright)
+{
+	$this->copyright=$copyright;
+}
+
+function SetKeywords($keywords)
+{
+	//Keywords of document
+	$this->keywords=$keywords;
+}
+
+function SetCreator($creator)
+{
+	//Creator of document
+	$this->creator=$creator;
+}
+
+function AliasNbPages($alias='{nb}')
+{
+	//Define an alias for total number of pages
+	$this->AliasNbPages=$alias;
+}
+
+function Error($msg)
+{
+	//Fatal error
+	die('<B>FPDF error: </B>'.$msg);
+}
+
+function Open()
+{
+	//Begin document
+	$this->state=1;
+}
+
+function Close()
+{
+	//Terminate document
+	if($this->state==3)
+		return;
+	if($this->page==0)
+		$this->AddPage();
+	//Page footer
+	$this->InFooter=true;
+	$this->Footer();
+	$this->InFooter=false;
+	//Close page
+	$this->_endpage();
+	//Close document
+	$this->_enddoc();
+}
+
+function ResetBuffer()
+{
+	$this->n=2;
+	$this->buffer='';
+	$this->state==0;
+	$this->page=0;
+	$this->FontFamily='';
+	$this->FontStyle='';
+	$this->FontSizePt=12;
+	$this->underline=false;
+}
+
+function AddPage($orientation='')
+{
+	//Start a new page
+	if($this->state==0)
+	{
+		$this->Open();
+	}
+		
+	$family=$this->FontFamily;
+	$style=$this->FontStyle.($this->underline ? 'U' : '');
+	$size=$this->FontSizePt;
+	$lw=$this->LineWidth;
+	$dc=$this->DrawColor;
+	$fc=$this->FillColor;
+	$tc=$this->TextColor;
+	$cf=$this->ColorFlag;
+	if($this->page>0)
+	{
+		//Page footer
+		$this->InFooter=true;
+		$this->Footer();
+		$this->InFooter=false;
+		//Close page
+		$this->_endpage();
+	}
+	//Start new page
+	$this->_beginpage($orientation);
+	//Set line cap style to square
+	$this->_out('2 J');
+	//Set line width
+	$this->LineWidth=$lw;
+	$this->_out(sprintf('%.2f w',$lw*$this->k));
+	//Set font
+	if($family)
+		$this->SetFont($family,$style,$size);
+	//Set colors
+	$this->DrawColor=$dc;
+	if($dc!='0 G')
+		$this->_out($dc);
+	$this->FillColor=$fc;
+	if($fc!='0 g')
+		$this->_out($fc);
+	$this->TextColor=$tc;
+	$this->ColorFlag=$cf;
+	//Page header
+	$this->Header();
+	//Restore line width
+	if($this->LineWidth!=$lw)
+	{
+		$this->LineWidth=$lw;
+		$this->_out(sprintf('%.2f w',$lw*$this->k));
+	}
+	//Restore font
+	if($family)
+		$this->SetFont($family,$style,$size);
+	//Restore colors
+	if($this->DrawColor!=$dc)
+	{
+		$this->DrawColor=$dc;
+		$this->_out($dc);
+	}
+	if($this->FillColor!=$fc)
+	{
+		$this->FillColor=$fc;
+		$this->_out($fc);
+	}
+	$this->TextColor=$tc;
+	$this->ColorFlag=$cf;
+}
+
+function Header()
+{
+	//To be implemented in your own inherited class
+}
+
+function Footer()
+{
+	//To be implemented in your own inherited class
+}
+
+function PageNo()
+{
+	//Get current page number
+	return $this->page;
+}
+
+function SetDrawColor($r,$g=-1,$b=-1)
+{
+	//Set color for all stroking operations
+	if(($r==0 && $g==0 && $b==0) || $g==-1)
+		$this->DrawColor=sprintf('%.3f G',$r/255);
+	else
+		$this->DrawColor=sprintf('%.3f %.3f %.3f RG',$r/255,$g/255,$b/255);
+	if($this->page>0)
+		$this->_out($this->DrawColor);
+}
+
+function SetFillColor($r,$g=-1,$b=-1)
+{
+	//Set color for all filling operations
+	if(($r==0 && $g==0 && $b==0) || $g==-1)
+		$this->FillColor=sprintf('%.3f g',$r/255);
+	else
+		$this->FillColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255);
+	$this->ColorFlag=($this->FillColor!=$this->TextColor);
+	if($this->page>0)
+		$this->_out($this->FillColor);
+}
+
+function SetTextColor($r,$g=-1,$b=-1)
+{
+	//Set color for text
+	if(($r==0 && $g==0 && $b==0) || $g==-1)
+		$this->TextColor=sprintf('%.3f g',$r/255);
+	else
+		$this->TextColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255);
+	$this->ColorFlag=($this->FillColor!=$this->TextColor);
+}
+
+function GetStringWidth($s)
+{
+	//Get width of a string in the current font
+	$s=(string)$s;
+	$cw=&$this->CurrentFont['cw'];
+	$w=0;
+	$l=strlen($s);
+	for($i=0;$i<$l;$i++)
+		$w+=$cw[$s{$i}];
+	return $w*$this->FontSize/1000;
+}
+
+function SetLineWidth($width)
+{
+	//Set line width
+	$this->LineWidth=$width;
+	if($this->page>0)
+		$this->_out(sprintf('%.2f w',$width*$this->k));
+}
+
+function Line($x1,$y1,$x2,$y2)
+{
+	//Draw a line
+	$this->_out(sprintf('%.2f %.2f m %.2f %.2f l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k));
+}
+
+function Rect($x,$y,$w,$h,$style='')
+{
+	//Draw a rectangle
+	if($style=='F')
+		$op='f';
+	elseif($style=='FD' || $style=='DF')
+		$op='B';
+	else
+		$op='S';
+	$this->_out(sprintf('%.2f %.2f %.2f %.2f re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op));
+}
+
+function AddFont($family,$style='',$file='')
+{
+	//Add a TrueType or Type1 font
+	$family=strtolower($family);
+	if($file=='')
+		$file=str_replace(' ','',$family).strtolower($style).'.php';
+	if($family=='arial')
+		$family='helvetica';
+	$style=strtoupper($style);
+	if($style=='IB')
+		$style='BI';
+	$fontkey=$family.$style;
+	if(isset($this->fonts[$fontkey]))
+		$this->Error('Font already added: '.$family.' '.$style);
+	include($this->_getfontpath().$file);
+	if(!isset($name))
+		$this->Error('Could not include font definition file');
+	$i=count($this->fonts)+1;
+	$this->fonts[$fontkey]=array('i'=>$i,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'enc'=>$enc,'file'=>$file);
+	if($diff)
+	{
+		//Search existing encodings
+		$d=0;
+		$nb=count($this->diffs);
+		for($i=1;$i<=$nb;$i++)
+		{
+			if($this->diffs[$i]==$diff)
+			{
+				$d=$i;
+				break;
+			}
+		}
+		if($d==0)
+		{
+			$d=$nb+1;
+			$this->diffs[$d]=$diff;
+		}
+		$this->fonts[$fontkey]['diff']=$d;
+	}
+	if($file)
+	{
+		if($type=='TrueType')
+			$this->FontFiles[$file]=array('length1'=>$originalsize);
+		else
+			$this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2);
+	}
+}
+
+function SetFont($family,$style='',$size=0)
+{
+	//Select a font; size given in points
+	global $fpdf_charwidths;
+
+	$family=strtolower($family);
+	if($family=='')
+		$family=$this->FontFamily;
+	if($family=='arial')
+		$family='helvetica';
+	elseif($family=='symbol' || $family=='zapfdingbats')
+		$style='';
+	$style=strtoupper($style);
+	if(strpos($style,'U')!==false)
+	{
+		$this->underline=true;
+		$style=str_replace('U','',$style);
+	}
+	else
+		$this->underline=false;
+	if($style=='IB')
+		$style='BI';
+	if($size==0)
+		$size=$this->FontSizePt;
+	//Test if font is already selected
+	if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size)
+		return;
+	//Test if used for the first time
+	$fontkey=$family.$style;
+	if(!isset($this->fonts[$fontkey]))
+	{
+		//Check if one of the standard fonts
+		if(isset($this->CoreFonts[$fontkey]))
+		{
+			if(!isset($fpdf_charwidths[$fontkey]))
+			{
+				//Load metric file
+				$file=$family;
+				if($family=='times' || $family=='helvetica')
+					$file.=strtolower($style);
+				include($this->_getfontpath().$file.'.php');
+				if(!isset($fpdf_charwidths[$fontkey]))
+					$this->Error('Could not include font metric file');
+			}
+			$i=count($this->fonts)+1;
+			$this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'up'=>-100,'ut'=>50,'cw'=>$fpdf_charwidths[$fontkey]);
+		}
+		else
+			$this->Error('Undefined font: '.$family.' '.$style);
+	}
+	//Select it
+	$this->FontFamily=$family;
+	$this->FontStyle=$style;
+	$this->FontSizePt=$size;
+	$this->FontSize=$size/$this->k;
+	$this->CurrentFont=&$this->fonts[$fontkey];
+	if($this->page>0)
+		$this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
+}
+
+function SetFontSize($size)
+{
+	//Set font size in points
+	if($this->FontSizePt==$size)
+		return;
+	$this->FontSizePt=$size;
+	$this->FontSize=$size/$this->k;
+	if($this->page>0)
+		$this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
+}
+
+function AddLink()
+{
+	//Create a new internal link
+	$n=count($this->links)+1;
+	$this->links[$n]=array(0,0);
+	return $n;
+}
+
+function SetLink($link,$y=0,$page=-1)
+{
+	//Set destination of internal link
+	if($y==-1)
+		$y=$this->y;
+	if($page==-1)
+		$page=$this->page;
+	$this->links[$link]=array($page,$y);
+}
+
+function Link($x,$y,$w,$h,$link)
+{
+	//Put a link on the page
+	$this->PageLinks[$this->page][]=array($x*$this->k,$this->hPt-$y*$this->k,$w*$this->k,$h*$this->k,$link);
+}
+
+function Text($x,$y,$txt)
+{
+	//Output a string
+	$s=sprintf('BT %.2f %.2f Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt));
+	if($this->underline && $txt!='')
+		$s.=' '.$this->_dounderline($x,$y,$txt);
+	if($this->ColorFlag)
+		$s='q '.$this->TextColor.' '.$s.' Q';
+	$this->_out($s);
+}
+
+function AcceptPageBreak()
+{
+	//Accept automatic page break or not
+	return $this->AutoPageBreak;
+}
+
+function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='')
+{
+	//Output a cell
+	$k=$this->k;
+	if($this->y+$h>$this->PageBreakTrigger && !$this->InFooter && $this->AcceptPageBreak())
+	{
+		//Automatic page break
+		$x=$this->x;
+		$ws=$this->ws;
+		if($ws>0)
+		{
+			$this->ws=0;
+			$this->_out('0 Tw');
+		}
+		$this->AddPage($this->CurOrientation);
+		$this->x=$x;
+		if($ws>0)
+		{
+			$this->ws=$ws;
+			$this->_out(sprintf('%.3f Tw',$ws*$k));
+		}
+	}
+	if($w==0)
+		$w=$this->w-$this->rMargin-$this->x;
+	$s='';
+	if($fill==1 || $border==1)
+	{
+		if($fill==1)
+			$op=($border==1) ? 'B' : 'f';
+		else
+			$op='S';
+		$s=sprintf('%.2f %.2f %.2f %.2f re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
+	}
+	if(is_string($border))
+	{
+		$x=$this->x;
+		$y=$this->y;
+		if(strpos($border,'L')!==false)
+			$s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
+		if(strpos($border,'T')!==false)
+			$s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
+		if(strpos($border,'R')!==false)
+			$s.=sprintf('%.2f %.2f m %.2f %.2f l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
+		if(strpos($border,'B')!==false)
+			$s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
+	}
+	if($txt!=='')
+	{
+		if($align=='R')
+			$dx=$w-$this->cMargin-$this->GetStringWidth($txt);
+		elseif($align=='C')
+			$dx=($w-$this->GetStringWidth($txt))/2;
+		else
+			$dx=$this->cMargin;
+		if($this->ColorFlag)
+			$s.='q '.$this->TextColor.' ';
+		$txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt)));
+		$s.=sprintf('BT %.2f %.2f Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2);
+		if($this->underline)
+			$s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
+		if($this->ColorFlag)
+			$s.=' Q';
+		if($link)
+			$this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link);
+	}
+	if($s)
+		$this->_out($s);
+	$this->lasth=$h;
+	if($ln>0)
+	{
+		$this->maxLineWidth=max($this->maxLineWidth,$this->x+$w);
+		//Go to next line
+		$this->y+=$h;
+		if($ln==1)
+			$this->x=$this->lMargin;
+	}
+	else
+		$this->x+=$w;
+}
+
+function MultiCell($w,$h,$txt,$border=0,$align='J',$fill=0)
+{
+	//Output text with automatic or explicit line breaks
+	$cw=&$this->CurrentFont['cw'];
+	if($w==0)
+		$w=$this->w-$this->rMargin-$this->x;
+	$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
+	$s=str_replace("\r",'',$txt);
+	$nb=strlen($s);
+	if($nb>0 && $s[$nb-1]=="\n")
+		$nb--;
+	$b=0;
+	if($border)
+	{
+		if($border==1)
+		{
+			$border='LTRB';
+			$b='LRT';
+			$b2='LR';
+		}
+		else
+		{
+			$b2='';
+			if(strpos($border,'L')!==false)
+				$b2.='L';
+			if(strpos($border,'R')!==false)
+				$b2.='R';
+			$b=(strpos($border,'T')!==false) ? $b2.'T' : $b2;
+		}
+	}
+	$sep=-1;
+	$i=0;
+	$j=0;
+	$l=0;
+	$ns=0;
+	$nl=1;
+	while($i<$nb)
+	{
+		//Get next character
+		$c=$s{$i};
+		if($c=="\n")
+		{
+			//Explicit line break
+			if($this->ws>0)
+			{
+				$this->ws=0;
+				$this->_out('0 Tw');
+			}
+			$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
+			$i++;
+			$sep=-1;
+			$j=$i;
+			$l=0;
+			$ns=0;
+			$nl++;
+			if($border && $nl==2)
+				$b=$b2;
+			continue;
+		}
+		if($c==' ')
+		{
+			$sep=$i;
+			$ls=$l;
+			$ns++;
+		}
+		$l+=$cw[$c];
+		if($l>$wmax)
+		{
+			//Automatic line break
+			if($sep==-1)
+			{
+				if($i==$j)
+					$i++;
+				if($this->ws>0)
+				{
+					$this->ws=0;
+					$this->_out('0 Tw');
+				}
+				$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
+			}
+			else
+			{
+				if($align=='J')
+				{
+					$this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
+					$this->_out(sprintf('%.3f Tw',$this->ws*$this->k));
+				}
+				$this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
+				$i=$sep+1;
+			}
+			$sep=-1;
+			$j=$i;
+			$l=0;
+			$ns=0;
+			$nl++;
+			if($border && $nl==2)
+				$b=$b2;
+		}
+		else
+			$i++;
+	}
+	//Last chunk
+	if($this->ws>0)
+	{
+		$this->ws=0;
+		$this->_out('0 Tw');
+	}
+	if($border && strpos($border,'B')!==false)
+		$b.='B';
+	$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
+	$this->x=$this->lMargin;
+}
+
+function Write($h,$txt,$link='')
+{
+	//Output text in flowing mode
+	$cw=&$this->CurrentFont['cw'];
+	$w=$this->w-$this->rMargin-$this->x;
+	$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
+	$s=str_replace("\r",'',$txt);
+	$nb=strlen($s);
+	$sep=-1;
+	$i=0;
+	$j=0;
+	$l=0;
+	$nl=1;
+	while($i<$nb)
+	{
+		//Get next character
+		$c=$s{$i};
+		if($c=="\n")
+		{
+			//Explicit line break
+			$this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
+			$this->maxLineWidth=max($this->maxLineWidth,$this->x);
+			$i++;
+			$sep=-1;
+			$j=$i;
+			$l=0;
+			if($nl==1)
+			{
+				$this->x=$this->lMargin;
+				$w=$this->w-$this->rMargin-$this->x;
+				$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
+			}
+			$nl++;
+			continue;
+		}
+		if($c==' ')
+			$sep=$i;
+		$l+=$cw[$c];
+		if($l>$wmax)
+		{
+			//Automatic line break
+			if($sep==-1)
+			{
+				if($this->x>$this->lMargin)
+				{
+					//Move to next line
+					$this->maxLineWidth=max($this->maxLineWidth,$this->x);
+					$this->x=$this->lMargin;
+					$this->y+=$h;
+					$w=$this->w-$this->rMargin-$this->x;
+					$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
+					$i++;
+					$nl++;
+					continue;
+				}
+				if($i==$j)
+					$i++;
+				$this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
+				$this->maxLineWidth=max($this->maxLineWidth,$this->x);
+			}
+			else
+			{
+				$this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
+				$this->maxLineWidth=max($this->maxLineWidth,$this->x);
+				$i=$sep+1;
+			}
+			$sep=-1;
+			$j=$i;
+			$l=0;
+			if($nl==1)
+			{
+				$this->maxLineWidth=max($this->maxLineWidth,$this->x);
+				$this->x=$this->lMargin;
+				$w=$this->w-$this->rMargin-$this->x;
+				$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
+			}
+			$nl++;
+		}
+		else
+			$i++;
+	}
+	//Last chunk
+	if($i!=$j)
+		$this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link);
+	$this->maxLineWidth=max($this->maxLineWidth,$this->x);
+}
+
+function Image($file,$x,$y,$w=0,$h=0,$type='',$link='',$maxframe='0')
+{
+  //Put an image on the page
+	if(!isset($this->images[$file]))
+	{
+		//First use of image, get info
+		if($type=='')
+		{
+			$pos=strrpos($file,'.');
+			if(!$pos)
+				$this->Error('Image file has no extension and no type was specified: '.$file);
+			$type=substr($file,$pos+1);
+			$name=substr($file,0,$pos);
+			$pos=strrpos($name,'/');
+			$name=substr($name,$pos+1);
+		}
+		$type=strtolower($type);
+		$mqr=get_magic_quotes_runtime();
+		set_magic_quotes_runtime(0);
+
+		if($type=='jpg' || $type=='jpeg')
+		{
+			$info=$this->_parsejpg($file);
+		}
+		elseif ($type=='png') 
+		{
+			Header( "Content-type: image/png");
+			$image = @imagecreatefromPNG("$file");
+			$im_X = ImageSX($image);
+			$im_Y = ImageSY($image);
+			$backgroundimage = imagecreatetruecolor($im_X, $im_Y);
+			$backgroundcolor = ImageColorAllocate($backgroundimage, 255, 255, 255);
+			ImageFilledRectangle($backgroundimage, 0, 0, $im_X, $im_Y, $backgroundcolor);
+			ImageAlphaBlending($backgroundimage, true);
+			imagecopy($backgroundimage, $image, 0, 0, 0, 0, $im_X, $im_Y);
+			ImagePNG($backgroundimage,"./IMG/tempo.png");
+			ImageDestroy($image);
+			ImageDestroy($backgroundimage);
+			$info=$this->_parsepng("./IMG/tempo.png");
+			unlink ("./IMG/tempo.png");
+		}
+		//$info=$this->_parsepng($file);
+
+		elseif($type=='gif') 
+		{
+		/*
+			$readgif= gd_info();
+			if ($readgif[3]) {
+				Header( "Content-type: image/png");
+				$image = @imagecreatefromGIF("$file");
+				imageinterlace($image,0);
+				ImagePNG($image,"./IMG/tempo.png");
+				ImageDestroy($image);
+				$info=$this->_parsepng("./IMG/tempo.png");
+				unlink ("./IMG/tempo.png");
+			} else {
+				$info=$this->_parsegif($file);
+			}
+		*/
+			$ImagesGif = $this->_parsegif2($file,'GIF','./IMG/'.$name.'_frame',0);
+
+			foreach($ImagesGif as $i=>$gs_frame){
+      	Header( "Content-type: image/png");
+				$image = @imagecreatefromGIF($gs_frame);
+				imageinterlace($image,0);
+				ImagePNG($image,"./IMG/tempo.png");
+				$info=$this->_parsepng("./IMG/tempo.png");
+				ImageDestroy($image);
+				unlink ("./IMG/tempo.png");
+				unlink ($gs_frame);
+			}
+			
+    }
+		else
+		{
+			//Allow for additional formats
+			$mtd='_parse'.$type;
+			if(!method_exists($this,$mtd))
+			{
+				$this->Error('Unsupported image type: '.$type);
+			}
+			$info=$this->$mtd($file);
+		}
+		
+		set_magic_quotes_runtime($mqr);
+		$info['i']=count($this->images)+1;
+		$this->images[$file]=$info;
+	}
+	else
+	{
+		$info=$this->images[$file];
+	}
+	//Automatic width and height calculation if needed
+	if($w==0 && $h==0)
+	{
+		//Put image at 72 dpi
+		$w=$info['w']/$this->k;
+		$h=$info['h']/$this->k;
+	}
+	if($w==0)
+		$w=$h*$info['w']/$info['h'];
+	if($h==0)
+		$h=$w*$info['h']/$info['w'];
+	$this->_out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i']));
+	if($link)
+		$this->Link($x,$y,$w,$h,$link);
+}
+
+function Ln($h='')
+{
+	$this->maxLineWidth=max($this->maxLineWidth,$this->x);
+	//Line feed; default value is last cell height
+	$this->x=$this->lMargin;
+	if(is_string($h))
+		$this->y+=$this->lasth;
+	else
+		$this->y+=$h;
+}
+
+function GetX()
+{
+	//Get x position
+	return $this->x;
+}
+
+function SetX($x)
+{
+	//Set x position
+	if($x>=0)
+		$this->x=$x;
+	else
+		$this->x=$this->w+$x;
+}
+
+function GetY()
+{
+	//Get y position
+	return $this->y;
+}
+
+function SetY($y)
+{
+	//Set y position and reset x
+	$this->x=$this->lMargin;
+	if($y>=0)
+		$this->y=$y;
+	else
+		$this->y=$this->h+$y;
+}
+
+function SetXY($x,$y)
+{
+	//Set x and y positions
+	$this->SetY($y);
+	$this->SetX($x);
+}
+
+function Output($name='',$dest='')
+{
+	//Output PDF to some destination
+	//Finish document if necessary
+	if($this->state<3)
+		$this->Close();
+	//Normalize parameters
+	if(is_bool($dest))
+		$dest=$dest ? 'D' : 'F';
+	$dest=strtoupper($dest);
+	if($dest=='')
+	{
+		if($name=='')
+		{
+			$name='doc.pdf';
+			$dest='I';
+		}
+		else
+			$dest='F';
+	}
+	switch($dest)
+	{
+		case 'I':
+			//Send to standard output
+			if(ob_get_contents())
+				$this->Error('Some data has already been output, can\'t send PDF file');
+			if(php_sapi_name()!='cli')
+			{
+				//We send to a browser
+				header('Content-Type: application/pdf');
+				if(headers_sent())
+					$this->Error('Some data has already been output to browser, can\'t send PDF file');
+				header('Content-Length: '.strlen($this->buffer));
+				header('Content-disposition: inline; filename="'.$name.'"');
+			}
+			echo $this->buffer;
+			break;
+		case 'D':
+			//Download file
+			if(ob_get_contents())
+				$this->Error('Some data has already been output, can\'t send PDF file');
+			if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
+				header('Content-Type: application/force-download');
+			else
+				header('Content-Type: application/octet-stream');
+			if(headers_sent())
+				$this->Error('Some data has already been output to browser, can\'t send PDF file');
+			header('Content-Length: '.strlen($this->buffer));
+			header('Content-disposition: attachment; filename="'.$name.'"');
+			echo $this->buffer;
+			break;
+		case 'F':
+			//Save to local file
+			$f=fopen($name,'wb');
+			if(!$f)
+				$this->Error('Unable to create output file: '.$name);
+			fwrite($f,$this->buffer,strlen($this->buffer));
+			fclose($f);
+			break;
+		case 'S':
+			//Return as a string
+			return $this->buffer;
+		default:
+			$this->Error('Incorrect output destination: '.$dest);
+	}
+	return '';
+}
+
+/*******************************************************************************
+*                                                                              *
+*                              Protected methods                               *
+*                                                                              *
+*******************************************************************************/
+function _dochecks()
+{
+	//Check for locale-related bug
+	if(1.1==1)
+		$this->Error('Don\'t alter the locale before including class file');
+	//Check for decimal separator
+	if(sprintf('%.1f',1.0)!='1.0')
+		setlocale(LC_NUMERIC,'C');
+}
+
+function _getfontpath()
+{
+	if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font'))
+		define('FPDF_FONTPATH',dirname(__FILE__).'/font/');
+	return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : '';
+}
+
+function _putpages()
+{
+	$nb=$this->page;
+	if(!empty($this->AliasNbPages))
+	{
+		//Replace number of pages
+		for($n=1;$n<=$nb;$n++)
+			$this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]);
+	}
+	if($this->DefOrientation=='P')
+	{
+		$wPt=$this->fwPt;
+		$hPt=$this->fhPt;
+	}
+	else
+	{
+		$wPt=$this->fhPt;
+		$hPt=$this->fwPt;
+	}
+	$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	for($n=1;$n<=$nb;$n++)
+	{
+		//Page
+		$this->_newobj();
+		$this->_out('<</Type /Page');
+		$this->_out('/Parent 1 0 R');
+		if(isset($this->OrientationChanges[$n]))
+			$this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$hPt,$wPt));
+		$this->_out('/Resources 2 0 R');
+		if(isset($this->PageLinks[$n]))
+		{
+			//Links
+			$annots='/Annots [';
+			foreach($this->PageLinks[$n] as $pl)
+			{
+				$rect=sprintf('%.2f %.2f %.2f %.2f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
+				$annots.='<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
+				if(is_string($pl[4]))
+					$annots.='/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
+				else
+				{
+					$l=$this->links[$pl[4]];
+					$h=isset($this->OrientationChanges[$l[0]]) ? $wPt : $hPt;
+					$annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]>>',1+2*$l[0],$h-$l[1]*$this->k);
+				}
+			}
+			$this->_out($annots.']');
+		}
+		$this->_out('/Contents '.($this->n+1).' 0 R>>');
+		$this->_out('endobj');
+		//Page content
+		$p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n];
+		$this->_newobj();
+		$this->_out('<<'.$filter.'/Length '.strlen($p).'>>');
+		$this->_putstream($p);
+		$this->_out('endobj');
+	}
+	//Pages root
+	$this->offsets[1]=strlen($this->buffer);
+	$this->_out('1 0 obj');
+	$this->_out('<</Type /Pages');
+	$kids='/Kids [';
+	for($i=0;$i<$nb;$i++)
+		$kids.=(3+2*$i).' 0 R ';
+	$this->_out($kids.']');
+	$this->_out('/Count '.$nb);
+	$this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$wPt,$hPt));
+	$this->_out('>>');
+	$this->_out('endobj');
+}
+
+function _putfonts()
+{
+	$nf=$this->n;
+	foreach($this->diffs as $diff)
+	{
+		//Encodings
+		$this->_newobj();
+		$this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
+		$this->_out('endobj');
+	}
+	$mqr=get_magic_quotes_runtime();
+	set_magic_quotes_runtime(0);
+	foreach($this->FontFiles as $file=>$info)
+	{
+		//Font file embedding
+		$this->_newobj();
+		$this->FontFiles[$file]['n']=$this->n;
+		$font='';
+		$f=fopen($this->_getfontpath().$file,'rb',1);
+		if(!$f)
+			$this->Error('Font file not found');
+		while(!feof($f))
+			$font.=fread($f,8192);
+		fclose($f);
+		$compressed=(substr($file,-2)=='.z');
+		if(!$compressed && isset($info['length2']))
+		{
+			$header=(ord($font{0})==128);
+			if($header)
+			{
+				//Strip first binary header
+				$font=substr($font,6);
+			}
+			if($header && ord($font{$info['length1']})==128)
+			{
+				//Strip second binary header
+				$font=substr($font,0,$info['length1']).substr($font,$info['length1']+6);
+			}
+		}
+		$this->_out('<</Length '.strlen($font));
+		if($compressed)
+			$this->_out('/Filter /FlateDecode');
+		$this->_out('/Length1 '.$info['length1']);
+		if(isset($info['length2']))
+			$this->_out('/Length2 '.$info['length2'].' /Length3 0');
+		$this->_out('>>');
+		$this->_putstream($font);
+		$this->_out('endobj');
+	}
+	set_magic_quotes_runtime($mqr);
+	foreach($this->fonts as $k=>$font)
+	{
+		//Font objects
+		$this->fonts[$k]['n']=$this->n+1;
+		$type=$font['type'];
+		$name=$font['name'];
+		if($type=='core')
+		{
+			//Standard font
+			$this->_newobj();
+			$this->_out('<</Type /Font');
+			$this->_out('/BaseFont /'.$name);
+			$this->_out('/Subtype /Type1');
+			if($name!='Symbol' && $name!='ZapfDingbats')
+				$this->_out('/Encoding /WinAnsiEncoding');
+			$this->_out('>>');
+			$this->_out('endobj');
+		}
+		elseif($type=='Type1' || $type=='TrueType')
+		{
+			//Additional Type1 or TrueType font
+			$this->_newobj();
+			$this->_out('<</Type /Font');
+			$this->_out('/BaseFont /'.$name);
+			$this->_out('/Subtype /'.$type);
+			$this->_out('/FirstChar 32 /LastChar 255');
+			$this->_out('/Widths '.($this->n+1).' 0 R');
+			$this->_out('/FontDescriptor '.($this->n+2).' 0 R');
+			if($font['enc'])
+			{
+				if(isset($font['diff']))
+					$this->_out('/Encoding '.($nf+$font['diff']).' 0 R');
+				else
+					$this->_out('/Encoding /WinAnsiEncoding');
+			}
+			$this->_out('>>');
+			$this->_out('endobj');
+			//Widths
+			$this->_newobj();
+			$cw=&$font['cw'];
+			$s='[';
+			for($i=32;$i<=255;$i++)
+				$s.=$cw[chr($i)].' ';
+			$this->_out($s.']');
+			$this->_out('endobj');
+			//Descriptor
+			$this->_newobj();
+			$s='<</Type /FontDescriptor /FontName /'.$name;
+			foreach($font['desc'] as $k=>$v)
+				$s.=' /'.$k.' '.$v;
+			$file=$font['file'];
+			if($file)
+				$s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R';
+			$this->_out($s.'>>');
+			$this->_out('endobj');
+		}
+		else
+		{
+			//Allow for additional types
+			$mtd='_put'.strtolower($type);
+			if(!method_exists($this,$mtd))
+				$this->Error('Unsupported font type: '.$type);
+			$this->$mtd($font);
+		}
+	}
+}
+
+function _putimages()
+{
+	$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	reset($this->images);
+	while(list($file,$info)=each($this->images))
+	{
+		$this->_newobj();
+		$this->images[$file]['n']=$this->n;
+		$this->_out('<</Type /XObject');
+		$this->_out('/Subtype /Image');
+		$this->_out('/Width '.$info['w']);
+		$this->_out('/Height '.$info['h']);
+		if($info['cs']=='Indexed')
+			$this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
+		else
+		{
+			$this->_out('/ColorSpace /'.$info['cs']);
+			if($info['cs']=='DeviceCMYK')
+				$this->_out('/Decode [1 0 1 0 1 0 1 0]');
+		}
+		$this->_out('/BitsPerComponent '.$info['bpc']);
+		if(isset($info['f']))
+			$this->_out('/Filter /'.$info['f']);
+		if(isset($info['parms']))
+			$this->_out($info['parms']);
+		if(isset($info['trns']) && is_array($info['trns']))
+		{
+			$trns='';
+			for($i=0;$i<count($info['trns']);$i++)
+				$trns.=$info['trns'][$i].' '.$info['trns'][$i].' ';
+			$this->_out('/Mask ['.$trns.']');
+		}
+		$this->_out('/Length '.strlen($info['data']).'>>');
+		$this->_putstream($info['data']);
+		unset($this->images[$file]['data']);
+		$this->_out('endobj');
+		//Palette
+		if($info['cs']=='Indexed')
+		{
+			$this->_newobj();
+			$pal=($this->compress) ? gzcompress($info['pal']) : $info['pal'];
+			$this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
+			$this->_putstream($pal);
+			$this->_out('endobj');
+		}
+	}
+}
+
+function _putxobjectdict()
+{
+	foreach($this->images as $image)
+		$this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
+}
+
+function _putresourcedict()
+{
+	$this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+	$this->_out('/Font <<');
+	foreach($this->fonts as $font)
+		$this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
+	$this->_out('>>');
+	$this->_out('/XObject <<');
+	$this->_putxobjectdict();
+	$this->_out('>>');
+}
+
+function _putresources()
+{
+	$this->_putfonts();
+	$this->_putimages();
+	//Resource dictionary
+	$this->offsets[2]=strlen($this->buffer);
+	$this->_out('2 0 obj');
+	$this->_out('<<');
+	$this->_putresourcedict();
+	$this->_out('>>');
+	$this->_out('endobj');
+}
+
+function _putinfo()
+{
+	$this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION));
+	if(!empty($this->title))
+		$this->_out('/Title '.$this->_textstring($this->title));
+	if(!empty($this->subject))
+		$this->_out('/Subject '.$this->_textstring($this->subject));
+	if(!empty($this->author))
+		$this->_out('/Author '.$this->_textstring($this->author));
+	if(!empty($this->keywords))
+		$this->_out('/Keywords '.$this->_textstring($this->keywords));
+	if(!empty($this->creator))
+		$this->_out('/Creator '.$this->_textstring($this->creator));
+	$this->_out('/CreationDate '.$this->_textstring('D:'.date('YmdHis')));
+}
+
+function _putcatalog()
+{
+	$this->_out('/Type /Catalog');
+	$this->_out('/Pages 1 0 R');
+	if($this->ZoomMode=='fullpage')
+		$this->_out('/OpenAction [3 0 R /Fit]');
+	elseif($this->ZoomMode=='fullwidth')
+		$this->_out('/OpenAction [3 0 R /FitH null]');
+	elseif($this->ZoomMode=='real')
+		$this->_out('/OpenAction [3 0 R /XYZ null null 1]');
+	elseif(!is_string($this->ZoomMode))
+		$this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']');
+	if($this->LayoutMode=='single')
+		$this->_out('/PageLayout /SinglePage');
+	elseif($this->LayoutMode=='continuous')
+		$this->_out('/PageLayout /OneColumn');
+	elseif($this->LayoutMode=='two')
+		$this->_out('/PageLayout /TwoColumnLeft');
+}
+
+function _putheader()
+{
+	$this->_out('%PDF-'.$this->PDFVersion);
+}
+
+function _puttrailer()
+{
+	$this->_out('/Size '.($this->n+1));
+	$this->_out('/Root '.$this->n.' 0 R');
+	$this->_out('/Info '.($this->n-1).' 0 R');
+}
+
+function _enddoc()
+{
+	$this->_putheader();
+	$this->_putpages();
+	$this->_putresources();
+	//Info
+	$this->_newobj();
+	$this->_out('<<');
+	$this->_putinfo();
+	$this->_out('>>');
+	$this->_out('endobj');
+	//Catalog
+	$this->_newobj();
+	$this->_out('<<');
+	$this->_putcatalog();
+	$this->_out('>>');
+	$this->_out('endobj');
+	//Cross-ref
+	$o=strlen($this->buffer);
+	$this->_out('xref');
+	$this->_out('0 '.($this->n+1));
+	$this->_out('0000000000 65535 f ');
+	for($i=1;$i<=$this->n;$i++)
+		$this->_out(sprintf('%010d 00000 n ',$this->offsets[$i]));
+	//Trailer
+	$this->_out('trailer');
+	$this->_out('<<');
+	$this->_puttrailer();
+	$this->_out('>>');
+	$this->_out('startxref');
+	$this->_out($o);
+	$this->_out('%%EOF');
+	$this->state=3;
+}
+
+function _beginpage($orientation)
+{
+	$this->page++;
+	$this->pages[$this->page]='';
+	$this->state=2;
+	$this->x=$this->lMargin;
+	$this->y=$this->tMargin;
+	$this->FontFamily='';
+	//Page orientation
+	if(!$orientation)
+		$orientation=$this->DefOrientation;
+	else
+	{
+		$orientation=strtoupper($orientation{0});
+		if($orientation!=$this->DefOrientation)
+			$this->OrientationChanges[$this->page]=true;
+	}
+	if($orientation!=$this->CurOrientation)
+	{
+		//Change orientation
+		if($orientation=='P')
+		{
+			$this->wPt=$this->fwPt;
+			$this->hPt=$this->fhPt;
+			$this->w=$this->fw;
+			$this->h=$this->fh;
+		}
+		else
+		{
+			$this->wPt=$this->fhPt;
+			$this->hPt=$this->fwPt;
+			$this->w=$this->fh;
+			$this->h=$this->fw;
+		}
+		$this->PageBreakTrigger=$this->h-$this->bMargin;
+		$this->CurOrientation=$orientation;
+	}
+}
+
+function _endpage()
+{
+	//End of page contents
+	$this->state=1;
+}
+
+function _newobj()
+{
+	//Begin a new object
+	$this->n++;
+	$this->offsets[$this->n]=strlen($this->buffer);
+	$this->_out($this->n.' 0 obj');
+}
+
+function _dounderline($x,$y,$txt)
+{
+	//Underline text
+	$up=$this->CurrentFont['up'];
+	$ut=$this->CurrentFont['ut'];
+	$w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' ');
+	return sprintf('%.2f %.2f %.2f %.2f re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt);
+}
+
+function _parsejpg($file)
+{
+	//Extract info from a JPEG file
+	$a=GetImageSize($file);
+	if(!$a)
+		$this->Error('Missing or incorrect image file: '.$file);
+	if($a[2]!=2)
+		$this->Error('Not a JPEG file: '.$file);
+	if(!isset($a['channels']) || $a['channels']==3)
+		$colspace='DeviceRGB';
+	elseif($a['channels']==4)
+		$colspace='DeviceCMYK';
+	else
+		$colspace='DeviceGray';
+	$bpc=isset($a['bits']) ? $a['bits'] : 8;
+	//Read whole file
+	$f=fopen($file,'rb');
+	$data='';
+	while(!feof($f))
+		$data.=fread($f,4096);
+	fclose($f);
+	return array('w'=>$a[0],'h'=>$a[1],'cs'=>$colspace,'bpc'=>$bpc,'f'=>'DCTDecode','data'=>$data);
+}
+
+function _parsepng($file)
+{
+	//Extract info from a PNG file
+	$f=fopen($file,'rb');
+	if(!$f)
+		$this->Error('Can\'t open image file: '.$file);
+	//Check signature
+	if(fread($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
+		$this->Error('Not a PNG file: '.$file);
+	//Read header chunk
+	fread($f,4);
+	if(fread($f,4)!='IHDR')
+		$this->Error('Incorrect PNG file: '.$file);
+	$w=$this->_freadint($f);
+	$h=$this->_freadint($f);
+	$bpc=ord(fread($f,1));
+	if($bpc>8)
+		$this->Error('16-bit depth not supported: '.$file);
+	$ct=ord(fread($f,1));
+	if($ct==0)
+		$colspace='DeviceGray';
+	elseif($ct==2)
+		$colspace='DeviceRGB';
+	elseif($ct==3)
+		$colspace='Indexed';
+	else
+		$this->Error('Alpha channel not supported: '.$file);
+	if(ord(fread($f,1))!=0)
+		$this->Error('Unknown compression method: '.$file);
+	if(ord(fread($f,1))!=0)
+		$this->Error('Unknown filter method: '.$file);
+	if(ord(fread($f,1))!=0)
+		$this->Error('Interlacing not supported: '.$file);
+	fread($f,4);
+	$parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>';
+	//Scan chunks looking for palette, transparency and image data
+	$pal='';
+	$trns='';
+	$data='';
+	do
+	{
+		$n=$this->_freadint($f);
+		$type=fread($f,4);
+		if($type=='PLTE')
+		{
+			//Read palette
+			$pal=fread($f,$n);
+			fread($f,4);
+		}
+		elseif($type=='tRNS')
+		{
+			//Read transparency info
+			$t=fread($f,$n);
+			if($ct==0)
+				$trns=array(ord(substr($t,1,1)));
+			elseif($ct==2)
+				$trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1)));
+			else
+			{
+				$pos=strpos($t,chr(0));
+				if($pos!==false)
+					$trns=array($pos);
+			}
+			fread($f,4);
+		}
+		elseif($type=='IDAT')
+		{
+			//Read image data block
+			$data.=fread($f,$n);
+			fread($f,4);
+		}
+		elseif($type=='IEND')
+			break;
+		else
+			fread($f,$n+4);
+	}
+	while($n);
+	if($colspace=='Indexed' && empty($pal))
+		$this->Error('Missing palette in '.$file);
+	fclose($f);
+	return array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$data);
+}
+
+function _parsegif2($gs_file,$gs_type,$gs_path,$gs_maxframe)
+{
+	include_once('GifSplit.class.php');
+	$sg = new GifSplit($gs_file, $gs_type, $gs_path,$gs_maxframe,1);
+	return ($sg->getfilelist());
+}
+
+function _parsegif($file)
+{
+	require_once "gif.php";	// Classes GIF en pur PHP de Yamasoft (http://www.yamasoft.com/)
+
+	$h=0;
+	$w=0;
+
+	$gif= new CGIF();
+
+	if (!$gif->loadFile($file, 0)) {
+		$this->Error("GIF parser : unable to open file $file");
+	}
+
+	if($gif->m_img->m_gih->m_bLocalClr) {
+		$nColors = $gif->m_img->m_gih->m_nTableSize;
+		$pal     = $gif->m_img->m_gih->m_colorTable->toString();
+		if($bgColor != -1) {
+			$bgColor = $this->m_img->m_gih->m_colorTable->colorIndex($bgColor);
+		}
+		$colspace='Indexed';
+	} elseif($gif->m_gfh->m_bGlobalClr) {
+		$nColors = $gif->m_gfh->m_nTableSize;
+		$pal     = $gif->m_gfh->m_colorTable->toString();
+		if($bgColor != -1) {
+			$bgColor = $gif->m_gfh->m_colorTable->colorIndex($bgColor);
+		}
+		$colspace='Indexed';
+	} else {
+		$nColors =  0;
+		$bgColor = -1;
+		$colspace='DeviceGray';
+		$pal='';
+	}
+
+	$trns='';
+	if($gif->m_img->m_bTrans && ($nColors > 0)) {
+		$trns=array($gif->m_img->m_nTrans);
+	}
+
+	$data=$gif->m_img->m_data;
+	$w=$gif->m_gfh->m_nWidth;
+	$h=$gif->m_gfh->m_nHeight;
+	
+	if($colspace=='Indexed' and empty($pal))
+		$this->Error('Missing palette in '.$file);
+
+	$gif='';
+
+	if ($this->compress) {
+		$data=gzcompress($data);
+		// Attention :
+		// - on vient de recompresser de façon globale les données de l'image
+		//   GIF, il n'y a donc plus lieu d'utiliser une quelconque prediction
+		//   au décodage Flate du PDF -> Predictor=1 et non plus 15
+		// - bpc=8 dans tous les cas car décodage du GIF à raison de 1 pixel par octet
+		// - Colors=1 car GIF toujours sur 8 bits maxi (en couleur et niveaux de gris)
+		$parms='/DecodeParms <</Predictor 1 /Colors 1 /BitsPerComponent 8>>';
+		return array(	'w'=>$w,			'h'=>$h,			'cs'=>$colspace,
+						'bpc'=>8,			'f'=>'FlateDecode', 'parms'=>$parms,
+						'pal'=>$pal,		'trns'=>$trns,		'data'=>$data);
+	} else {
+		return array(	'w'=>$w,			'h'=>$h,			'cs'=>$colspace,
+						'bpc'=>8,			'pal'=>$pal,		'trns'=>$trns,
+						'data'=>$data);
+	}
+}
+
+
+
+function _freadint($f)
+{
+	//Read a 4-byte integer from file
+	$a=unpack('Ni',fread($f,4));
+	return $a['i'];
+}
+
+function _textstring($s)
+{
+	//Format a text string
+	return '('.$this->_escape($s).')';
+}
+
+function _escape($s)
+{
+	//Add \ before \, ( and )
+	return str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$s)));
+}
+
+function _putstream($s)
+{
+	$this->_out('stream');
+	$this->_out($s);
+	$this->_out('endstream');
+}
+
+function _out($s)
+{
+	//Add a line to the document
+	if($this->state==2)
+		$this->pages[$this->page].=$s."\n";
+	else
+		$this->buffer.=$s."\n";
+}
+
+
+//End of class
+}
+
+//Handle special IE contype request
+if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype')
+{
+	header('Content-Type: application/pdf');
+	exit;
+}
+
+
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/gif.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/gif.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/gif.php	(revision 30)
@@ -0,0 +1,1072 @@
+<?php
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// GIF Util - (C) 2003 Yamasoft (S/C)
+// http://www.yamasoft.com
+// All Rights Reserved
+// This file can be frelly copied, distributed, modified, updated by anyone under the only
+// condition to leave the original address (Yamasoft, http://www.yamasoft.com) and this header.
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// <gif>  = gif_loadFile(filename, [index])
+// <bool> = gif_getSize(<gif> or filename, &width, &height)
+// <bool> = gif_outputAsPng(<gif>, filename, [bgColor])
+// <bool> = gif_outputAsBmp(<gif>, filename, [bgcolor])
+// <bool> = gif_outputAsJpeg(<gif>, filename, [bgcolor]) - Requires cjpeg
+///////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+function gif_loadFile($lpszFileName, $iIndex = 0)
+{
+	$gif = new CGIF();
+
+	if(!$gif->loadFile($lpszFileName, $iIndex)) {
+		return false;
+	}
+
+	return $gif;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+function gif_outputAsBmp($gif, $lpszFileName, $bgColor = -1)
+{
+	if(!isSet($gif) || (@get_class($gif) <> "cgif") || !$gif->loaded() || ($lpszFileName == "")) {
+		return false;
+	}
+
+	$fd = $gif->getBmp($bgColor);
+	if(strlen($fd) <= 0) {
+		return false;
+	}
+
+	if(!($fh = @fOpen($lpszFileName, "wb"))) {
+		return false;
+	}
+	@fWrite($fh, $fd, strlen($fd));
+	@fFlush($fh);
+	@fClose($fh);
+	return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+function gif_outputAsPng($gif, $lpszFileName, $bgColor = -1)
+{
+	if(!isSet($gif) || (@get_class($gif) <> "cgif") || !$gif->loaded() || ($lpszFileName == "")) {
+		return false;
+	}
+
+	$fd = $gif->getPng($bgColor);
+	if(strlen($fd) <= 0) {
+		return false;
+	}
+
+	if(!($fh = @fOpen($lpszFileName, "wb"))) {
+		return false;
+	}
+	@fWrite($fh, $fd, strlen($fd));
+	@fFlush($fh);
+	@fClose($fh);
+	return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+function gif_outputAsJpeg($gif, $lpszFileName, $bgColor = -1)
+{
+	if(gif_outputAsBmp($gif, "$lpszFileName.bmp", $gbColor)) {
+		exec("cjpeg $lpszFileName.bmp >$lpszFileName 2>/dev/null");
+		@unLink("$lpszFileName.bmp");
+
+		if(@file_exists($lpszFileName)) {
+			if(@fileSize($lpszFileName) > 0) {
+				return true;
+			}
+
+			@unLink($lpszFileName);
+		}
+	}
+
+	return false;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+function gif_getSize($gif, &$width, &$height)
+{
+	if(isSet($gif) && (@get_class($gif) == "cgif") && $gif->loaded()) {
+		$width  = $gif->width();
+		$height = $gif->height();
+	}
+	else if(@file_exists($gif)) {
+		$myGIF = new CGIF();
+		if(!$myGIF->getSize($gif, $width, $height)) {
+			return false;
+		}
+	}
+	else {
+		return false;
+	}
+
+	return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class CGIFLZW
+{
+	var $MAX_LZW_BITS;
+	var $Fresh, $CodeSize, $SetCodeSize, $MaxCode, $MaxCodeSize, $FirstCode, $OldCode;
+	var $ClearCode, $EndCode, $Next, $Vals, $Stack, $sp, $Buf, $CurBit, $LastBit, $Done, $LastByte;
+
+	///////////////////////////////////////////////////////////////////////////
+
+	// CONSTRUCTOR
+	function CGIFLZW()
+	{
+		$this->MAX_LZW_BITS = 12;
+		unSet($this->Next);
+		unSet($this->Vals);
+		unSet($this->Stack);
+		unSet($this->Buf);
+
+		$this->Next  = range(0, (1 << $this->MAX_LZW_BITS)       - 1);
+		$this->Vals  = range(0, (1 << $this->MAX_LZW_BITS)       - 1);
+		$this->Stack = range(0, (1 << ($this->MAX_LZW_BITS + 1)) - 1);
+		$this->Buf   = range(0, 279);
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function deCompress($data, &$datLen)
+	{
+		$stLen  = strlen($data);
+		$datLen = 0;
+		$ret    = "";
+
+		// INITIALIZATION
+		$this->LZWCommand($data, true);
+
+		while(($iIndex = $this->LZWCommand($data, false)) >= 0) {
+			$ret .= chr($iIndex);
+		}
+
+		$datLen = $stLen - strlen($data);
+
+		if($iIndex != -2) {
+			return false;
+		}
+
+		return $ret;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function LZWCommand(&$data, $bInit)
+	{
+		if($bInit) {
+			$this->SetCodeSize = ord($data{0});
+			$data = substr($data, 1);
+
+			$this->CodeSize    = $this->SetCodeSize + 1;
+			$this->ClearCode   = 1 << $this->SetCodeSize;
+			$this->EndCode     = $this->ClearCode + 1;
+			$this->MaxCode     = $this->ClearCode + 2;
+			$this->MaxCodeSize = $this->ClearCode << 1;
+
+			$this->GetCode($data, $bInit);
+
+			$this->Fresh = 1;
+			for($i = 0; $i < $this->ClearCode; $i++) {
+				$this->Next[$i] = 0;
+				$this->Vals[$i] = $i;
+			}
+
+			for(; $i < (1 << $this->MAX_LZW_BITS); $i++) {
+				$this->Next[$i] = 0;
+				$this->Vals[$i] = 0;
+			}
+
+			$this->sp = 0;
+			return 1;
+		}
+
+		if($this->Fresh) {
+			$this->Fresh = 0;
+			do {
+				$this->FirstCode = $this->GetCode($data, $bInit);
+				$this->OldCode   = $this->FirstCode;
+			}
+			while($this->FirstCode == $this->ClearCode);
+
+			return $this->FirstCode;
+		}
+
+		if($this->sp > 0) {
+			$this->sp--;
+			return $this->Stack[$this->sp];
+		}
+
+		while(($Code = $this->GetCode($data, $bInit)) >= 0) {
+			if($Code == $this->ClearCode) {
+				for($i = 0; $i < $this->ClearCode; $i++) {
+					$this->Next[$i] = 0;
+					$this->Vals[$i] = $i;
+				}
+
+				for(; $i < (1 << $this->MAX_LZW_BITS); $i++) {
+					$this->Next[$i] = 0;
+					$this->Vals[$i] = 0;
+				}
+
+				$this->CodeSize    = $this->SetCodeSize + 1;
+				$this->MaxCodeSize = $this->ClearCode << 1;
+				$this->MaxCode     = $this->ClearCode + 2;
+				$this->sp          = 0;
+				$this->FirstCode   = $this->GetCode($data, $bInit);
+				$this->OldCode     = $this->FirstCode;
+
+				return $this->FirstCode;
+			}
+
+			if($Code == $this->EndCode) {
+				return -2;
+			}
+
+			$InCode = $Code;
+			if($Code >= $this->MaxCode) {
+				$this->Stack[$this->sp] = $this->FirstCode;
+				$this->sp++;
+				$Code = $this->OldCode;
+			}
+
+			while($Code >= $this->ClearCode) {
+				$this->Stack[$this->sp] = $this->Vals[$Code];
+				$this->sp++;
+
+				if($Code == $this->Next[$Code]) // Circular table entry, big GIF Error!
+					return -1;
+
+				$Code = $this->Next[$Code];
+			}
+
+			$this->FirstCode = $this->Vals[$Code];
+			$this->Stack[$this->sp] = $this->FirstCode;
+			$this->sp++;
+
+			if(($Code = $this->MaxCode) < (1 << $this->MAX_LZW_BITS)) {
+				$this->Next[$Code] = $this->OldCode;
+				$this->Vals[$Code] = $this->FirstCode;
+				$this->MaxCode++;
+
+				if(($this->MaxCode >= $this->MaxCodeSize) && ($this->MaxCodeSize < (1 << $this->MAX_LZW_BITS))) {
+					$this->MaxCodeSize *= 2;
+					$this->CodeSize++;
+				}
+			}
+
+			$this->OldCode = $InCode;
+			if($this->sp > 0) {
+				$this->sp--;
+				return $this->Stack[$this->sp];
+			}
+		}
+
+		return $Code;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function GetCode(&$data, $bInit)
+	{
+		if($bInit) {
+			$this->CurBit   = 0;
+			$this->LastBit  = 0;
+			$this->Done     = 0;
+			$this->LastByte = 2;
+			return 1;
+		}
+
+		if(($this->CurBit + $this->CodeSize) >= $this->LastBit) {
+			if($this->Done) {
+				if($this->CurBit >= $this->LastBit) {
+					// Ran off the end of my bits
+					return 0;
+				}
+				return -1;
+			}
+
+			$this->Buf[0] = $this->Buf[$this->LastByte - 2];
+			$this->Buf[1] = $this->Buf[$this->LastByte - 1];
+
+			$Count = ord($data{0});
+			$data  = substr($data, 1);
+
+			if($Count) {
+				for($i = 0; $i < $Count; $i++) {
+					$this->Buf[2 + $i] = ord($data{$i});
+				}
+				$data = substr($data, $Count);
+			}
+			else {
+				$this->Done = 1;
+			}
+
+			$this->LastByte = 2 + $Count;
+			$this->CurBit   = ($this->CurBit - $this->LastBit) + 16;
+			$this->LastBit  = (2 + $Count) << 3;
+		}
+
+		$iRet = 0;
+		for($i = $this->CurBit, $j = 0; $j < $this->CodeSize; $i++, $j++) {
+			$iRet |= (($this->Buf[intval($i / 8)] & (1 << ($i % 8))) != 0) << $j;
+		}
+
+		$this->CurBit += $this->CodeSize;
+		return $iRet;
+	}
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class CGIFCOLORTABLE
+{
+	var $m_nColors;
+	var $m_arColors;
+
+	///////////////////////////////////////////////////////////////////////////
+
+	// CONSTRUCTOR
+	function CGIFCOLORTABLE()
+	{
+		unSet($this->m_nColors);
+		unSet($this->m_arColors);
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function load($lpData, $num)
+	{
+		$this->m_nColors  = 0;
+		$this->m_arColors = array();
+
+		for($i = 0; $i < $num; $i++) {
+			$rgb = substr($lpData, $i * 3, 3);
+			if(strlen($rgb) < 3) {
+				return false;
+			}
+
+			$this->m_arColors[] = (ord($rgb{2}) << 16) + (ord($rgb{1}) << 8) + ord($rgb{0});
+			$this->m_nColors++;
+		}
+
+		return true;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function toString()
+	{
+		$ret = "";
+
+		for($i = 0; $i < $this->m_nColors; $i++) {
+			$ret .=
+				chr(($this->m_arColors[$i] & 0x000000FF))       . // R
+				chr(($this->m_arColors[$i] & 0x0000FF00) >>  8) . // G
+				chr(($this->m_arColors[$i] & 0x00FF0000) >> 16);  // B
+		}
+
+		return $ret;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function toRGBQuad()
+	{
+		$ret = "";
+
+		for($i = 0; $i < $this->m_nColors; $i++) {
+			$ret .=
+				chr(($this->m_arColors[$i] & 0x00FF0000) >> 16) . // B
+				chr(($this->m_arColors[$i] & 0x0000FF00) >>  8) . // G
+				chr(($this->m_arColors[$i] & 0x000000FF))       . // R
+				"\x00";
+		}
+
+		return $ret;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function colorIndex($rgb)
+	{
+		$rgb  = intval($rgb) & 0xFFFFFF;
+		$r1   = ($rgb & 0x0000FF);
+		$g1   = ($rgb & 0x00FF00) >>  8;
+		$b1   = ($rgb & 0xFF0000) >> 16;
+		$idx  = -1;
+
+		for($i = 0; $i < $this->m_nColors; $i++) {
+			$r2 = ($this->m_arColors[$i] & 0x000000FF);
+			$g2 = ($this->m_arColors[$i] & 0x0000FF00) >>  8;
+			$b2 = ($this->m_arColors[$i] & 0x00FF0000) >> 16;
+			$d  = abs($r2 - $r1) + abs($g2 - $g1) + abs($b2 - $b1);
+
+			if(($idx == -1) || ($d < $dif)) {
+				$idx = $i;
+				$dif = $d;
+			}
+		}
+
+		return $idx;
+	}
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class CGIFFILEHEADER
+{
+	var $m_lpVer;
+	var $m_nWidth;
+	var $m_nHeight;
+	var $m_bGlobalClr;
+	var $m_nColorRes;
+	var $m_bSorted;
+	var $m_nTableSize;
+	var $m_nBgColor;
+	var $m_nPixelRatio;
+	var $m_colorTable;
+
+	///////////////////////////////////////////////////////////////////////////
+
+	// CONSTRUCTOR
+	function CGIFFILEHEADER()
+	{
+		unSet($this->m_lpVer);
+		unSet($this->m_nWidth);
+		unSet($this->m_nHeight);
+		unSet($this->m_bGlobalClr);
+		unSet($this->m_nColorRes);
+		unSet($this->m_bSorted);
+		unSet($this->m_nTableSize);
+		unSet($this->m_nBgColor);
+		unSet($this->m_nPixelRatio);
+		unSet($this->m_colorTable);
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function load($lpData, &$hdrLen)
+	{
+		$hdrLen = 0;
+
+		$this->m_lpVer = substr($lpData, 0, 6);
+		if(($this->m_lpVer <> "GIF87a") && ($this->m_lpVer <> "GIF89a")) {
+			return false;
+		}
+
+		$this->m_nWidth  = $this->w2i(substr($lpData, 6, 2));
+		$this->m_nHeight = $this->w2i(substr($lpData, 8, 2));
+		if(!$this->m_nWidth || !$this->m_nHeight) {
+			return false;
+		}
+
+		$b = ord(substr($lpData, 10, 1));
+		$this->m_bGlobalClr  = ($b & 0x80) ? true : false;
+		$this->m_nColorRes   = ($b & 0x70) >> 4;
+		$this->m_bSorted     = ($b & 0x08) ? true : false;
+		$this->m_nTableSize  = 2 << ($b & 0x07);
+		$this->m_nBgColor    = ord(substr($lpData, 11, 1));
+		$this->m_nPixelRatio = ord(substr($lpData, 12, 1));
+		$hdrLen = 13;
+
+		if($this->m_bGlobalClr) {
+			$this->m_colorTable = new CGIFCOLORTABLE();
+			if(!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) {
+				return false;
+			}
+			$hdrLen += 3 * $this->m_nTableSize;
+		}
+
+		return true;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function w2i($str)
+	{
+		return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8);
+	}
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class CGIFIMAGEHEADER
+{
+	var $m_nLeft;
+	var $m_nTop;
+	var $m_nWidth;
+	var $m_nHeight;
+	var $m_bLocalClr;
+	var $m_bInterlace;
+	var $m_bSorted;
+	var $m_nTableSize;
+	var $m_colorTable;
+
+	///////////////////////////////////////////////////////////////////////////
+
+	// CONSTRUCTOR
+	function CGIFIMAGEHEADER()
+	{
+		unSet($this->m_nLeft);
+		unSet($this->m_nTop);
+		unSet($this->m_nWidth);
+		unSet($this->m_nHeight);
+		unSet($this->m_bLocalClr);
+		unSet($this->m_bInterlace);
+		unSet($this->m_bSorted);
+		unSet($this->m_nTableSize);
+		unSet($this->m_colorTable);
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function load($lpData, &$hdrLen)
+	{
+		$hdrLen = 0;
+
+		$this->m_nLeft   = $this->w2i(substr($lpData, 0, 2));
+		$this->m_nTop    = $this->w2i(substr($lpData, 2, 2));
+		$this->m_nWidth  = $this->w2i(substr($lpData, 4, 2));
+		$this->m_nHeight = $this->w2i(substr($lpData, 6, 2));
+
+		if(!$this->m_nWidth || !$this->m_nHeight) {
+			return false;
+		}
+
+		$b = ord($lpData{8});
+		$this->m_bLocalClr  = ($b & 0x80) ? true : false;
+		$this->m_bInterlace = ($b & 0x40) ? true : false;
+		$this->m_bSorted    = ($b & 0x20) ? true : false;
+		$this->m_nTableSize = 2 << ($b & 0x07);
+		$hdrLen = 9;
+
+		if($this->m_bLocalClr) {
+			$this->m_colorTable = new CGIFCOLORTABLE();
+			if(!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) {
+				return false;
+			}
+			$hdrLen += 3 * $this->m_nTableSize;
+		}
+
+		return true;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function w2i($str)
+	{
+		return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8);
+	}
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class CGIFIMAGE
+{
+	var $m_disp;
+	var $m_bUser;
+	var $m_bTrans;
+	var $m_nDelay;
+	var $m_nTrans;
+	var $m_lpComm;
+	var $m_gih;
+	var $m_data;
+	var $m_lzw;
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function CGIFIMAGE()
+	{
+		unSet($this->m_disp);
+		unSet($this->m_bUser);
+		unSet($this->m_bTrans);
+		unSet($this->m_nDelay);
+		unSet($this->m_nTrans);
+		unSet($this->m_lpComm);
+		unSet($this->m_data);
+		$this->m_gih = new CGIFIMAGEHEADER();
+		$this->m_lzw = new CGIFLZW();
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function load($data, &$datLen)
+	{
+		$datLen = 0;
+
+		while(true) {
+			$b = ord($data{0});
+			$data = substr($data, 1);
+			$datLen++;
+
+			switch($b) {
+			case 0x21: // Extension
+				if(!$this->skipExt($data, $len = 0)) {
+					return false;
+				}
+				$datLen += $len;
+				break;
+
+			case 0x2C: // Image
+				// LOAD HEADER & COLOR TABLE
+				if(!$this->m_gih->load($data, $len = 0)) {
+					return false;
+				}
+				$data = substr($data, $len);
+				$datLen += $len;
+
+				// ALLOC BUFFER
+				if(!($this->m_data = $this->m_lzw->deCompress($data, $len = 0))) {
+					return false;
+				}
+				$data = substr($data, $len);
+				$datLen += $len;
+
+				if($this->m_gih->m_bInterlace) {
+					$this->deInterlace();
+				}
+				return true;
+
+			case 0x3B: // EOF
+			default:
+				return false;
+			}
+		}
+		return false;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function skipExt(&$data, &$extLen)
+	{
+		$extLen = 0;
+
+		$b = ord($data{0});
+		$data = substr($data, 1);
+		$extLen++;
+
+		switch($b) {
+		case 0xF9: // Graphic Control
+			$b = ord($data{1});
+			$this->m_disp   = ($b & 0x1C) >> 2;
+			$this->m_bUser  = ($b & 0x02) ? true : false;
+			$this->m_bTrans = ($b & 0x01) ? true : false;
+			$this->m_nDelay = $this->w2i(substr($data, 2, 2));
+			$this->m_nTrans = ord($data{4});
+			break;
+
+		case 0xFE: // Comment
+			$this->m_lpComm = substr($data, 1, ord($data{0}));
+			break;
+
+		case 0x01: // Plain text
+			break;
+
+		case 0xFF: // Application
+			break;
+		}
+
+		// SKIP DEFAULT AS DEFS MAY CHANGE
+		$b = ord($data{0});
+		$data = substr($data, 1);
+		$extLen++;
+		while($b > 0) {
+			$data = substr($data, $b);
+			$extLen += $b;
+			$b    = ord($data{0});
+			$data = substr($data, 1);
+			$extLen++;
+		}
+		return true;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function w2i($str)
+	{
+		return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8);
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function deInterlace()
+	{
+		$data = $this->m_data;
+
+		for($i = 0; $i < 4; $i++) {
+			switch($i) {
+			case 0:
+				$s = 8;
+				$y = 0;
+				break;
+
+			case 1:
+				$s = 8;
+				$y = 4;
+				break;
+
+			case 2:
+				$s = 4;
+				$y = 2;
+				break;
+
+			case 3:
+				$s = 2;
+				$y = 1;
+				break;
+			}
+
+			for(; $y < $this->m_gih->m_nHeight; $y += $s) {
+				$lne = substr($this->m_data, 0, $this->m_gih->m_nWidth);
+				$this->m_data = substr($this->m_data, $this->m_gih->m_nWidth);
+
+				$data =
+					substr($data, 0, $y * $this->m_gih->m_nWidth) .
+					$lne .
+					substr($data, ($y + 1) * $this->m_gih->m_nWidth);
+			}
+		}
+
+		$this->m_data = $data;
+	}
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class CGIF
+{
+	var $m_gfh;
+	var $m_lpData;
+	var $m_img;
+	var $m_bLoaded;
+
+	///////////////////////////////////////////////////////////////////////////
+
+	// CONSTRUCTOR
+	function CGIF()
+	{
+		$this->m_gfh     = new CGIFFILEHEADER();
+		$this->m_img     = new CGIFIMAGE();
+		$this->m_lpData  = "";
+		$this->m_bLoaded = false;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function loadFile($lpszFileName, $iIndex)
+	{
+		if($iIndex < 0) {
+			return false;
+		}
+
+		// READ FILE
+		if(!($fh = @fOpen($lpszFileName, "rb"))) {
+			return false;
+		}
+		$this->m_lpData = @fRead($fh, @fileSize($lpszFileName));
+		fClose($fh);
+
+		// GET FILE HEADER
+		if(!$this->m_gfh->load($this->m_lpData, $len = 0)) {
+			return false;
+		}
+		$this->m_lpData = substr($this->m_lpData, $len);
+
+		do {
+			if(!$this->m_img->load($this->m_lpData, $imgLen = 0)) {
+				return false;
+			}
+			$this->m_lpData = substr($this->m_lpData, $imgLen);
+		}
+		while($iIndex-- > 0);
+
+		$this->m_bLoaded = true;
+		return true;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function getSize($lpszFileName, &$width, &$height)
+	{
+		if(!($fh = @fOpen($lpszFileName, "rb"))) {
+			return false;
+		}
+		$data = @fRead($fh, @fileSize($lpszFileName));
+		@fClose($fh);
+
+		$gfh = new CGIFFILEHEADER();
+		if(!$gfh->load($data, $len = 0)) {
+			return false;
+		}
+
+		$width  = $gfh->m_nWidth;
+		$height = $gfh->m_nHeight;
+		return true;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function getBmp($bgColor)
+	{
+		$out = "";
+
+		if(!$this->m_bLoaded) {
+			return false;
+		}
+
+		// PREPARE COLOR TABLE (RGBQUADs)
+		if($this->m_img->m_gih->m_bLocalClr) {
+			$nColors = $this->m_img->m_gih->m_nTableSize;
+			$rgbq    = $this->m_img->m_gih->m_colorTable->toRGBQuad();
+			if($bgColor != -1) {
+				$bgColor = $this->m_img->m_gih->m_colorTable->colorIndex($bgColor);
+			}
+		}
+		else if($this->m_gfh->m_bGlobalClr) {
+			$nColors = $this->m_gfh->m_nTableSize;
+			$rgbq    = $this->m_gfh->m_colorTable->toRGBQuad();
+			if($bgColor != -1) {
+				$bgColor = $this->m_gfh->m_colorTable->colorIndex($bgColor);
+			}
+		}
+		else {
+			$nColors =  0;
+			$bgColor = -1;
+		}
+
+		// PREPARE BITMAP BITS
+		$data = $this->m_img->m_data;
+		$nPxl = ($this->m_gfh->m_nHeight - 1) * $this->m_gfh->m_nWidth;
+		$bmp  = "";
+		$nPad = ($this->m_gfh->m_nWidth % 4) ? 4 - ($this->m_gfh->m_nWidth % 4) : 0;
+		for($y = 0; $y < $this->m_gfh->m_nHeight; $y++) {
+			for($x = 0; $x < $this->m_gfh->m_nWidth; $x++, $nPxl++) {
+				if(
+					($x >= $this->m_img->m_gih->m_nLeft) &&
+					($y >= $this->m_img->m_gih->m_nTop) &&
+					($x <  ($this->m_img->m_gih->m_nLeft + $this->m_img->m_gih->m_nWidth)) &&
+					($y <  ($this->m_img->m_gih->m_nTop  + $this->m_img->m_gih->m_nHeight))) {
+					// PART OF IMAGE
+					if($this->m_img->m_bTrans && (ord($data{$nPxl}) == $this->m_img->m_nTrans)) {
+						// TRANSPARENT -> BACKGROUND
+						if($bgColor == -1) {
+							$bmp .= chr($this->m_gfh->m_nBgColor);
+						}
+						else {
+							$bmp .= chr($bgColor);
+						}
+					}
+					else {
+						$bmp .= $data{$nPxl};
+					}
+				}
+				else {
+					// BACKGROUND
+					if($bgColor == -1) {
+						$bmp .= chr($this->m_gfh->m_nBgColor);
+					}
+					else {
+						$bmp .= chr($bgColor);
+					}
+				}
+			}
+			$nPxl -= $this->m_gfh->m_nWidth << 1;
+
+			// ADD PADDING
+			for($x = 0; $x < $nPad; $x++) {
+				$bmp .= "\x00";
+			}
+		}
+
+		// BITMAPFILEHEADER
+		$out .= "BM";
+		$out .= $this->dword(14 + 40 + ($nColors << 2) + strlen($bmp));
+		$out .= "\x00\x00";
+		$out .= "\x00\x00";
+		$out .= $this->dword(14 + 40 + ($nColors << 2));
+
+		// BITMAPINFOHEADER
+		$out .= $this->dword(40);
+		$out .= $this->dword($this->m_gfh->m_nWidth);
+		$out .= $this->dword($this->m_gfh->m_nHeight);
+		$out .= "\x01\x00";
+		$out .= "\x08\x00";
+		$out .= "\x00\x00\x00\x00";
+		$out .= "\x00\x00\x00\x00";
+		$out .= "\x12\x0B\x00\x00";
+		$out .= "\x12\x0B\x00\x00";
+		$out .= $this->dword($nColors % 256);
+		$out .= "\x00\x00\x00\x00";
+
+		// COLOR TABLE
+		if($nColors > 0) {
+			$out .= $rgbq;
+		}
+
+		// DATA
+		$out .= $bmp;
+
+		return $out;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function getPng($bgColor)
+	{
+		$out = "";
+
+		if(!$this->m_bLoaded) {
+			return false;
+		}
+
+		// PREPARE COLOR TABLE (RGBQUADs)
+		if($this->m_img->m_gih->m_bLocalClr) {
+			$nColors = $this->m_img->m_gih->m_nTableSize;
+			$pal     = $this->m_img->m_gih->m_colorTable->toString();
+			if($bgColor != -1) {
+				$bgColor = $this->m_img->m_gih->m_colorTable->colorIndex($bgColor);
+			}
+		}
+		else if($this->m_gfh->m_bGlobalClr) {
+			$nColors = $this->m_gfh->m_nTableSize;
+			$pal     = $this->m_gfh->m_colorTable->toString();
+			if($bgColor != -1) {
+				$bgColor = $this->m_gfh->m_colorTable->colorIndex($bgColor);
+			}
+		}
+		else {
+			$nColors =  0;
+			$bgColor = -1;
+		}
+
+		// PREPARE BITMAP BITS
+		$data = $this->m_img->m_data;
+		$nPxl = 0;
+		$bmp  = "";
+		for($y = 0; $y < $this->m_gfh->m_nHeight; $y++) {
+			$bmp .= "\x00";
+			for($x = 0; $x < $this->m_gfh->m_nWidth; $x++, $nPxl++) {
+				if(
+					($x >= $this->m_img->m_gih->m_nLeft) &&
+					($y >= $this->m_img->m_gih->m_nTop) &&
+					($x <  ($this->m_img->m_gih->m_nLeft + $this->m_img->m_gih->m_nWidth)) &&
+					($y <  ($this->m_img->m_gih->m_nTop  + $this->m_img->m_gih->m_nHeight))) {
+					// PART OF IMAGE
+					$bmp .= $data{$nPxl};
+				}
+				else {
+					// BACKGROUND
+					if($bgColor == -1) {
+						$bmp .= chr($this->m_gfh->m_nBgColor);
+					}
+					else {
+						$bmp .= chr($bgColor);
+					}
+				}
+			}
+		}
+		$bmp = gzcompress($bmp, 9);
+
+		///////////////////////////////////////////////////////////////////////
+		// SIGNATURE
+		$out .= "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A";
+		///////////////////////////////////////////////////////////////////////
+		// HEADER
+		$out .= "\x00\x00\x00\x0D";
+		$tmp  = "IHDR";
+		$tmp .= $this->ndword($this->m_gfh->m_nWidth);
+		$tmp .= $this->ndword($this->m_gfh->m_nHeight);
+		$tmp .= "\x08\x03\x00\x00\x00";
+		$out .= $tmp;
+		$out .= $this->ndword(crc32($tmp));
+		///////////////////////////////////////////////////////////////////////
+		// PALETTE
+		if($nColors > 0) {
+			$out .= $this->ndword($nColors * 3);
+			$tmp  = "PLTE";
+			$tmp .= $pal;
+			$out .= $tmp;
+			$out .= $this->ndword(crc32($tmp));
+		}
+		///////////////////////////////////////////////////////////////////////
+		// TRANSPARENCY
+		if($this->m_img->m_bTrans && ($nColors > 0)) {
+			$out .= $this->ndword($nColors);
+			$tmp  = "tRNS";
+			for($i = 0; $i < $nColors; $i++) {
+				$tmp .= ($i == $this->m_img->m_nTrans) ? "\x00" : "\xFF";
+			}
+			$out .= $tmp;
+			$out .= $this->ndword(crc32($tmp));
+		}
+		///////////////////////////////////////////////////////////////////////
+		// DATA BITS
+		$out .= $this->ndword(strlen($bmp));
+		$tmp  = "IDAT";
+		$tmp .= $bmp;
+		$out .= $tmp;
+		$out .= $this->ndword(crc32($tmp));
+		///////////////////////////////////////////////////////////////////////
+		// END OF FILE
+		$out .= "\x00\x00\x00\x00IEND\xAE\x42\x60\x82";
+
+		return $out;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function dword($val)
+	{
+		$val = intval($val);
+		return chr($val & 0xFF).chr(($val & 0xFF00) >> 8).chr(($val & 0xFF0000) >> 16).chr(($val & 0xFF000000) >> 24);
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function ndword($val)
+	{
+		$val = intval($val);
+		return chr(($val & 0xFF000000) >> 24).chr(($val & 0xFF0000) >> 16).chr(($val & 0xFF00) >> 8).chr($val & 0xFF);
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function width()
+	{
+		return $this->m_gfh->m_nWidth;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function height()
+	{
+		return $this->m_gfh->m_nHeight;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function comment()
+	{
+		return $this->m_img->m_lpComm;
+	}
+
+	///////////////////////////////////////////////////////////////////////////
+
+	function loaded()
+	{
+		return $this->m_bLoaded;
+	}
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/lib_pdf_global.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/lib_pdf_global.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/lib_pdf_global.php	(revision 30)
@@ -0,0 +1,841 @@
+<?php
+/**
+ * class PDF extends FPDF : FPDF/tutoriel/tuto6.htm
+ * 
+ * Février-Août 2003 : Jérôme Fenal (jerome.fenal@logicacmg.com)
+ * Ajout de la prise en compte des tableaux, tag <code>, et diverses autres choses de SPIP
+ */ 
+
+ //  Fichier de dump pour debug
+define (DUMP_FILE_FULL_PATH_NAME,"Dump.txt");
+
+ 
+class PDF extends FPDF
+{
+var $HREF;
+var $texteAddSpace;
+var $SRC;
+var $columnProp=array();		# propriétés de la ligne
+var $lineProp=array();		# propriétés de la ligne
+var $inFirstRow;		# flag si première ligne en cours
+var $TableX;			# abscisse du tableau
+var $HeaderColor;
+var $RowColors;
+var $tableProp=array();
+
+var $ProcessingBloc=0;
+var $BlocContent=array();
+var $BlocTags=array();
+
+var $ProcessingTable=false;	# =1 : en cours lecture table
+var $ProcessingCadre=false;	# =1 : en cours lecture contenu d'un cadre SPIP (TEXTAREA HTML)
+var $tableCurrentCol;	# numéro de cellule courante
+var $tableCurrentRow;	# Numero de ligne courante pendant la lecture d'un tableau
+var $tableContent=array();		# Contenu de la table courante pendant son absorption. Non réentrant car SPIP ne permet pas de faire
+						# de table dans une autre table.
+var $listDepth=0;		# profondeur courante de liste à puce
+var $listParm = array();	# paramètres des listes à puces en fonction du niveau
+
+var $TopLinkIDArray = array(); #Sauve les IDs des liens internes (notes dans le texte)
+var $TopLinkIDArrayIt = 0; #Itérateur dans le tableau des IDs des liens internes
+
+var $BottomLinkIDArray = array(); #Sauve les IDs des liens internes (notes en fin de document)
+var $BottomLinkIDArrayIt = 0; #Itérateur dans le tableau des IDs des liens internes
+
+var $FirstIteration = TRUE;  # booleen pour la génération des liens
+var $CurrentTag=array();
+
+
+function Build($OutputFileFullPathName)
+{
+	$this->Open();
+	
+	$this->FirstIteration=TRUE;
+	$this->BuildDocument() ;
+	
+	$this->ResetBuffer();
+	$this->tag=0;
+	$this->SetFont('','');
+	
+	$this->FirstIteration=FALSE;
+	$this->BuildDocument() ;
+
+	$this->Output($OutputFileFullPathName);
+	
+	$this->Close();
+}
+
+
+function AddCol($field=-1,$width=-1,$align='L')
+{
+	//Ajoute une colonne au tableau
+	if($field==-1)
+	{
+		$field=count($this->columnProp);
+	}
+	
+	$this->columnProp[$field]=array('f'=>$field,'w'=>$width,'a'=>$align);
+	#$this->Write(5, "Ajout de colonne : ".$field."/".$width."/".$align); $this->Ln();
+}
+
+
+function PDF($orientation='P', $unit='mm', $format='A4')
+{
+	//Appel au constructeur parent
+	$this->FPDF($orientation, $unit, $format);
+	$this->SetCompression(1);
+	
+	//$this->InitDumpFile();
+	
+	$this->HREF='';
+}
+
+function unhtmlentities($string)
+{
+	$trans_tbl = get_html_translation_table (HTML_ENTITIES);
+	$trans_tbl = array_flip ($trans_tbl);
+	$ret = strtr ($string, $trans_tbl);
+	return preg_replace('/&#(\d+);/me', "chr('\\1')",$ret);
+}
+
+function WriteHTML($html,$LineFeedHeight)
+{
+	$this->texteAddSpace=false;
+	//Parseur HTML, enlevé pour une meilleure récupération des tag.
+  //Il faut détecter les vraies balises "<" HTML et pas les < de texte "&lt;" HTML 
+  //Parseur remis + loin pour l'édition du texte
+	//$html=$this->unhtmlentities($html);
+	
+	$a=preg_split(',(<[/a-zA-Z].*>),Ums', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+	// $a = le tableau de tags
+	// $i = index de l'élément courant
+	// $e = valeur de l'élément courant
+	foreach($a as $i=>$e) 
+  {
+		//Balise 
+	$Balise= preg_match(',<(?=[/a-zA-Z0-9])(/)?([/a-zA-Z0-9]+)((\s.*|/)?)>,',$e,$match);
+	if ($Balise){
+      $tag=strtoupper($match[2]);
+			$closing = $match[1]=="/";
+			
+			if (($this->ProcessingBloc) AND (!in_array($tag,$this->BlocTags[$this->ProcessingBloc-1])))
+				$this->BlocContent[$this->ProcessingBloc-1] .= $e;
+			else {
+				if ($closing)
+				// C'est une balise fermante
+					$this->CloseTag($tag,$LineFeedHeight);
+				else
+					$this->OpenTag($tag,$e,$LineFeedHeight);
+			}
+		}
+		// Contenu
+		else {
+			if (!in_array('TEXTAREA',$this->CurrentTag))
+				$e=str_replace("\n",' ',$e);
+			if (strlen($e)){
+				$te = trim($e);
+				if (!$this->texteAddSpace)
+					$this->texteAddSpace = (strlen($te)==0) | ($e{0}!=$te{0});
+				$next_add_space = (strlen($te)==0) | (substr($e,-1)!=substr($te,-1));
+				$e = $te;
+			}
+			if(strlen($e)){
+				$e = $this->texteAddSpace?" $e":$e;
+				$this->texteAddSpace = $next_add_space;
+				# Attention, ce mécanisme ne permet pas de traiter les liens dans les tableaux...
+				# ni les tableaux dans les tableaux, d'ailleurs...
+				if (($this->ProcessingBloc))
+					$this->BlocContent[$this->ProcessingBloc-1] .= $e;
+				else 
+				{
+					// C'est un lien. Il faut faire la distinction entre lien externe, lien interne et note de bas de page (couples ancre + lien interne)
+					if($this->HREF) 
+					{
+						$Link=$this->HREF;
+						$Text=$e;
+						if ( strstr($Link,"http:") || strstr($Link,"mailto:") || strstr($Link,"ftp:") )
+						{
+							// C'est un lien  externe
+							$this->PutLink($Link, $Text);
+						}
+						else
+						{
+							// C'est une note (référence dans le texte)
+							if ( strstr($Link,"#nb") )
+							{
+								if ($this->FirstIteration)
+								{
+									$LinkID=$this->AddLink();
+									$this->SetLink($LinkID,-1,-1);
+									$this->TopLinkIDArray[]=$LinkID;
+									$this->PutLink($Link,$Text);  // Lien bidon (première itération)
+								}
+								else
+								{
+									$LinkID=$this->BottomLinkIDArray[$this->BottomLinkIDArrayIt++];
+									$this->PutLink($LinkID,$Text);   // Bon lien  (deuxième itération)
+								}
+							}
+							// C'est une note (détail de bas de texte)
+							else if ( strstr($Link,"#nh") )
+							{
+							
+								// C'est le lien "#nh1" (le premier) : on met un trait séparateur
+								if ( strlen($Link)==4 && $Link[3]=="1" )
+								{
+									$this->SetLineWidth(0.3);
+									$this->Line($this->lMargin, $this->GetY()-5, $this->w - $this->rMargin, $this->GetY()-5);
+								}
+								
+								if ($this->FirstIteration)
+								{
+									$LinkID=$this->AddLink();
+									$this->SetLink($LinkID,-1,-1);
+									$this->BottomLinkIDArray[]=$LinkID;
+									$this->PutLink($Link,$Text);  // Lien bidon (première itération)
+								}
+								else
+								{
+									$LinkID=$this->TopLinkIDArray[$this->TopLinkIDArrayIt++];
+									$this->PutLink($LinkID,$Text);		// Bon lien  (deuxième itération)
+								}
+								
+							}
+							// C'est un lien interne
+							else
+							{
+								$WebSiteURL=entites_html(lire_meta("adresse_site"));
+								// Bug d'interprétation du point d'interrogation remplacé par 3 points. Correctif ici
+								$Link=str_replace("...","?",$Link);
+								
+								$this->PutLink($WebSiteURL . "/" . $Link, $Text);
+							}
+						}
+					} else 
+					{
+					//Parseur remis ici
+						$e=$this->unhtmlentities($e);
+            $this->Write(5,$e);
+					}
+				}
+			}
+		}
+	}
+  
+}
+
+function OpenTag($tag,$e,$LineFeedHeight)
+{
+	$needclosing = true;	
+	//Balise ouvrante
+	if ($tag=='B' || $tag=='U' || $tag=='I')
+	{
+		$this->SetStyle($tag,true);
+	}
+	
+	if ($tag=='STRONG')
+	{
+		$this->SetStyle('B',true);
+	}
+	
+	if ($tag=='EM')
+	{
+		$this->SetStyle('I',true);
+	}
+
+	if($tag=='A')
+	{
+		$this->HREF=extraire_attribut($e,'href');
+		$this->texteHREF="";
+		if ($this->texteAddSpace) {
+			$this->Write(5," ");
+			$this->texteAddSpace = false;
+		}
+	}
+	if($tag=='BR') {
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($LineFeedHeight);
+		$needclosing = false;
+		$this->texteAddSpace = false;
+	}
+
+	if($tag=='P') {
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln(1.5*$LineFeedHeight);
+		$this->texteAddSpace = false;
+	}
+	if($tag=='DIV') {
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln(1*$LineFeedHeight);
+		$this->texteAddSpace = false;
+	}
+
+	if($tag=='CODE') {
+//		$this->Write(5,"<code>\n");
+		$this->SetFont('courier','', 8);
+		$this->SetTextColor(0, 0, 255);
+		$this->ProcessingCadre=true;
+		$this->ProcessingBloc++;
+		$this->BlocTags[$this->ProcessingBloc-1]=array("CODE");
+		$this->BlocContent[$this->ProcessingBloc-1]="";
+	}
+	
+	if($tag=='H2')
+	{
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($LineFeedHeight*3);
+		$this->SetStyle($tag='B',true,24);
+		$this->texteAddSpace = false;
+	}
+
+	if($tag=='H3')
+	{
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($LineFeedHeight*3);
+		$this->SetStyle($tag='B',true,20);
+		$this->texteAddSpace = false;
+	}
+
+	if($tag=='H4')
+	{
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($LineFeedHeight*3);
+		$this->SetStyle($tag='B',true,18);
+		$this->texteAddSpace = false;
+	}
+
+	if($tag=='H5')
+	{
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($LineFeedHeight*3);
+		$this->SetStyle($tag='B',true,14);
+		$this->texteAddSpace = false;
+	}
+
+	if($tag=='H6')
+	{
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($LineFeedHeight*3);
+		$this->SetStyle($tag='B',true,12);
+		$this->texteAddSpace = false;
+	}
+
+	if($tag=='UL' or $tag=='OL') {
+		$this->SetLeftMargin($this->lMargin+7);
+		$this->listDepth++;
+		$this->listParm[$this->listDepth]['type']=$tag;
+		$this->listParm[$this->listDepth]['curr']=0;		# numéro si OL
+	}
+
+	if($tag=='LI'){ 
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln();
+		$this->listParm[$this->listDepth]['curr']++;
+		$this->SetX($this->GetX()-7);
+		if ($this->listParm[$this->listDepth]['type']=='OL')
+			$this->Cell(7,5,$this->listParm[$this->listDepth]['curr'].'.',0,0,'C'); 
+		else
+			$this->Cell(7,5,chr(149),0,0,'C'); 
+	}
+
+	if ($tag=='IMG') {
+    $this->SRC=extraire_attribut($e,'src');
+
+		// si l'image est manquante mettre un lien avec le texte alt
+		if (!@is_readable($this->SRC)){
+			$alt = extraire_attribut($e,'alt');
+			if ($alt==NULL) $alt = $this->SRC;
+			//var_dump("img:href=".$this->HREF.':');
+			if ($this->HREF=="")
+				$this->Write(5,"[$alt]");
+			else 
+				$this->PutLink($this->HREF,"[$alt]");
+		}
+		else
+		{
+			$size=getimagesize($this->SRC);		# Attention, utilisation de GD !!! FPDF ne sait pas lire les images à moitié... et je n'ai pas envie de surcharger la méthode Image...
+			if ($size[0] < 30 && $size[1] < 30) {
+				# pixel / 3 pour avoir des cm. Petite cuisine...
+				$imgX=$size[0]/3;
+				$imgY=$size[1]/3;
+				$yoffset=$imgY/4;
+				if ($this->GetY() + $imgY > $this->h - $this->bMargin)
+					$this->AddPage();
+				$this->Image($this->SRC, $this->GetX(), $this->GetY()-$yoffset, $imgX, $imgY,'',$this->HREF);
+				$this->SetX($this->GetX()+$size[0]/2);
+			} else if ($size[0] < 600 && $size[1] < 600) {
+				$pwidth=$this->w-$this->lMargin-$this->rMargin;
+				$ratio = 0.24;	# ce qui fait environ 600 pixels sur 16cm d'espace utile (160/600) - 2 pouillièmes
+				$imgX=$size[0]*$ratio;
+				$imgY=$size[1]*$ratio;
+				if ($this->GetY() + $imgY > $this->h - $this->bMargin) {
+					if ($this->GetY() + $imgY*0.8 > $this->h - $this->bMargin) {
+						$this->AddPage();
+					} else {
+						$imgX=$imgX*0.8;
+						$imgY=$imgY*0.8;
+					}
+				}
+				$this->Image($this->SRC, $this->GetX()+($pwidth-$imgX)/2, $this->GetY(), $imgX, $imgY,'',$this->HREF);
+				$this->SetY($this->GetY()+$imgY);
+			} else {
+				// les deux dimensions sont supérieurs à 600 pixels
+				$pwidth=$this->w-$this->lMargin-$this->rMargin;
+				$ratioX = $pwidth / $size[0];
+				$plen=$this->h-$this->GetY()-$this->bMargin-20;		// on retire 20mm pour placer le cartouche de l'image
+				$ratioY = $plen / $size[1];
+				$ratio = 0.24;	# ce qui fait environ 600 pixels sur 16cm d'espace utile (160/600) - 2 pouillièmes
+				$imgX=$size[0]*$ratio;
+				$imgY=$size[1]*$ratio;
+	
+				if ($size[1] > 900 || ($plen - ($size[1]*$ratio)  < 0)) {
+					if ($plen - ($size[1]*$ratio*0.8)  < 0) {
+						$this->AddPage();
+						$plen=$this->h-$this->GetY()-$this->bMargin-20;	// toujours la marge du cartouche
+						$ratioY = $plen / $size[1];
+					} else {
+						$ratioX *= 0.8;
+						$ratioY *= 0.8;
+					}
+				}
+	
+				$ratio=min(0.24, $ratioX, $ratioY);
+	
+				$imgX=$size[0]*$ratio;
+				$imgY=$size[1]*$ratio;
+	
+				$this->Image($this->SRC, $this->GetX()+($pwidth-$imgX)/2, $this->GetY(), $imgX, $imgY,'',$this->HREF);
+				$this->SetY($this->GetY()+$imgY);
+			}
+		}
+	}
+
+	if($tag=='TT' or $tag=='TEXTAREA') {
+		$this->SetFont('courier','', 8);
+		$this->SetTextColor(255, 0, 0);
+		if ($tag=='TEXTAREA'){
+			$this->ProcessingCadre=true;
+			}
+	}
+
+	if($tag=='TABLE') {
+		$this->ProcessingTable=true;
+		$this->inFirstRow=1;
+		# on commence une table
+		if(!isset($this->tableProp['width']))
+			$this->tableProp['width']=0;
+
+		if($this->tableProp['width']==0)
+			$this->tableProp['width']=$this->w-$this->lMargin-$this->rMargin;
+		if(!isset($this->tableProp['align']))
+			$this->tableProp['align']='C';
+		if(!isset($this->tableProp['padding']))
+			$this->tableProp['padding']=$this->cMargin;
+		$cMargin=$this->cMargin;
+		$this->cMargin=$this->tableProp['padding'];
+		if(!isset($this->tableProp['HeaderColor']))
+			$this->tableProp['HeaderColor']=array(200, 200, 200);
+		$this->HeaderColor=$this->tableProp['HeaderColor'];
+		if(!isset($this->tableProp['color1']))
+			$this->tableProp['color1']=array();
+		if(!isset($this->tableProp['color2']))
+			$this->tableProp['color2']=array(230, 230, 230);
+		$this->RowColors=array($this->tableProp['color1'], $this->tableProp['color2']);
+		$this->tableCurrentRow=0;
+	}
+
+	if($tag=='TR') {
+		# on commence une ligne
+		$this->tableCurrentCol=0;
+		$this->tableCurrentRow++;
+		if (extraire_attribut($e,'class') == 'row_first') {
+			$this->ProcessingTH=true;
+		}
+	}
+
+	if($tag=='TH' or $tag=='TD') {
+		# Cellule (pas titre)
+		$this->tableCurrentCol += 1;
+		$colspan = extraire_attribut($e,'colspan');
+		if ($this->inFirstRow) {
+			if ($colspan)
+				for($i=0;$i<$colspan;$i++){
+					$this->nCols=$this->tableCurrentCol;
+					$this->AddCol();
+				}
+			else {
+				$this->nCols=$this->tableCurrentCol;
+				$this->AddCol();
+			}
+		}
+		$this->ProcessingBloc++;
+		$this->BlocTags[$this->ProcessingBloc-1]=array("TH","TD");
+		$this->BlocContent[$this->ProcessingBloc-1]="";
+	}
+	if($tag=='BLOCKQUOTE') {
+		$this->ProcessingBloc++;
+		$this->BlocTags[$this->ProcessingBloc-1]=array("BLOCKQUOTE");
+		$this->BlocContent[$this->ProcessingBloc-1]='';
+	}
+	if($tag=='TEXTAREA') {
+		$this->ProcessingBloc++;
+		$this->BlocTags[$this->ProcessingBloc-1]=array("TEXTAREA");
+		$this->BlocContent[$this->ProcessingBloc-1]="";
+	}
+	if($tag=='HR') 
+	{
+		# Ligne horizontale
+		$this->SetLineWidth(0.3);
+		$this->Line($this->lMargin, $this->GetY(), $this->w - $this->rMargin, $this->GetY());
+		$needclosing = false;
+		$this->texteAddSpace = false;
+	}
+	if ((substr($e,-2)!="/>") && $needclosing)
+		$this->CurrentTag[]=$tag;	
+}
+
+function CloseTag($tag,$LineFeedHeight)
+{
+	if($tag=='B' || $tag=='U' || $tag=='I')
+		$this->SetStyle($tag,false);
+	
+	if($tag=='STRONG')
+		$this->SetStyle('B',false);
+	
+	if($tag=='EM')
+		$this->SetStyle('I',false);
+		
+	if($tag=='A'){
+		$this->HREF='';
+	}
+		
+	if($tag=='P'){
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($LineFeedHeight);
+	}
+
+	if($tag=='CODE') {
+    $this->ProcessingCadre=false;
+		if (strlen($content=$this->BlocContent[$this->ProcessingBloc-1])){
+			$this->ProcessingBloc--;
+			$this->BlocShow(0,$content,1,$LineFeedHeight);
+      }
+		$this->SetTextColor(0);
+		$this->SetFont('helvetica','',10);
+//    $this->Write(5,"\n<\code>");
+	}
+
+	if(($tag=='H2') OR ($tag=='H3') OR ($tag=='H4') OR ($tag=='H5') OR ($tag=='H6')){		
+		$this->SetStyle($tag='B',false,10);
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($LineFeedHeight);
+	}
+	
+	if($tag=='UL' or $tag=='OL') { 
+		$this->SetLeftMargin($this->lMargin-7); 
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln();
+		$this->listParm[$this->listDepth]=array();
+		$this->listDepth--;
+	} 
+	if($tag=='TT') { 
+		$this->SetFont('helvetica','',10);
+		$this->SetTextColor(0);
+	}
+	if($tag=='TD' or $tag=='TH') {
+		if (!strlen($this->BlocContent[$this->ProcessingBloc-1]))
+			$this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['content']=" ";
+		else 
+			$this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['content']=$this->BlocContent[$this->ProcessingBloc-1];
+		if ($tag=='TH')
+			$this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['TH']=1;
+		else
+			$this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['TH']=0;
+		$this->ProcessingBloc--;
+	}
+	if($tag=='TR') {
+		$this->inFirstRow=0;	# on a fini une ligne donc la première aussi
+	}
+	if($tag=='TABLE') {
+		$this->TableShow('C',$LineFeedHeight);
+		$this->inFirstRow=0;
+		$this->ProcessingTable=false;
+		$this->cMargin=$cMargin;
+		$this->columnProp=array();
+		$this->tableContent=array();
+	}
+	if($tag=='BLOCKQUOTE') {
+		if (strlen($content=$this->BlocContent[$this->ProcessingBloc-1])){
+			$this->ProcessingBloc--;
+			$this->BlocShow(10,$content,1,$LineFeedHeight);
+		}
+	}
+	if($tag=='TEXTAREA') {
+			$this->ProcessingCadre=false;
+		if (strlen($content=$this->BlocContent[$this->ProcessingBloc-1])){
+			$this->ProcessingBloc--;
+			$this->BlocShow(0,$content,1,$LineFeedHeight);
+		}
+		$this->SetFont('helvetica','',10);
+		$this->SetTextColor(0);
+	}
+	if ($tag==end($this->CurrentTag))
+		array_pop($this->CurrentTag);
+}
+
+function SetStyle($tag,$enable,$size=0)
+{
+	static $currentStyle=array();
+	if (in_array($tag,array('B','I','U'))){
+		if ($enable)
+			$currentStyle = array_merge($currentStyle,array($tag=>true));
+		else 
+			$currentStyle = array_diff($currentStyle,array($tag=>true));
+		$family = $this->FontFamily?$this->FontFamily:'helvetica';
+		$this->SetFont($family,implode("",array_keys($currentStyle)), $size);
+	}
+}
+
+// $Link peut être un entier (ID de lien interne)  ou une chaîne (URL)
+function PutLink($Link,$Text)
+{
+	//Place un hyperlien
+	$this->SetTextColor(0,0,255);
+	$this->SetStyle('U',true);
+	$this->Write(5,$Text,$Link);
+	$this->SetStyle('U',false);
+	$this->SetTextColor(0);
+}
+
+
+function Header()
+{
+}
+
+/*
+Pas utilisé pour l'instant
+function Header()
+{
+    //Imprime l'en-tête du tableau si nécessaire
+    if($this->ProcessingTable)
+        $this->TableHeader();
+}
+
+function TableHeader()
+{
+    $this->SetFont('helvetica','B',8);
+    $this->SetX($this->TableX);
+    $fill=!empty($this->HeaderColor);
+    if($fill)
+        $this->SetFillColor($this->HeaderColor[0],$this->HeaderColor[1],$this->HeaderColor[2]);
+    foreach($this->columnProp as $col)
+        $this->Cell($column['w'],6,1,0,'C',$fill);
+    $this->Ln();
+}
+*/
+
+function CellSize($htmlContent,$fontFamily,$fontSize,$LineFeedHeight,$cellmargin=3,$max_width=0){
+	$cell_pdf=new PDF_SPIP();
+	$cell_pdf->Open();
+	$cell_pdf->FirstIteration=TRUE;
+	$cell_pdf->SetFont($fontFamily, '', $fontSize);
+	
+	$cell_pdf->ResetBuffer();
+	$cell_pdf->maxLineWidth = 0;
+	$cell_pdf->x=$cell_pdf->lMargin;
+	$cell_pdf->y=0;
+	$cell_pdf->CurrentTag = $this->CurrentTag;
+	
+	if ($max_width){
+		$cell_pdf->rMargin=$cell_pdf->w-$cell_pdf->x-$max_width-$cellmargin;
+	}
+	$cell_pdf -> WriteHTML($htmlContent,$LineFeedHeight);
+	if($cell_pdf->x>$cell_pdf->lMargin)
+		$cell_pdf->Ln($LineFeedHeight);
+	
+	$width = $cell_pdf->maxLineWidth-$cell_pdf->lMargin;
+	$height = $cell_pdf->y;
+	
+	$width += $cellmargin;
+	$height += $cellmargin;
+	return array($width,$height);
+}
+
+function OutputCell($width,$height,$htmlContent,$border=0,$LineFeedHeight=0,$align='',$fill=0,$cellmargin=3){
+		// dessiner la cellule vide
+		$this->Cell($width, $height, '', $border, 0, $align, $fill);
+		// on note la position apres la cellule
+		$x = $this->x; $y = $this->y;
+		$lmargin = $this->lMargin;
+		$rmargin = $this->rMargin;
+		
+		// on se remet en debut de cellule
+		$this->x-=$width;
+		$this->x = $this->x+$cellmargin/2;
+		$this->lMargin = $this->x; // pour que les retour ligne se fassent correctement dans la cellule
+		$this->rMargin = $this->w-$this->x-$width+$cellmargin/2; 
+		
+		$this -> WriteHTML($htmlContent,$LineFeedHeight);
+		// on se remet a la fin de la cellule
+		$this->x = $x; $this->y = $y;
+		$this->lMargin = $lmargin;
+		$this->rMargin = $rmargin;
+}
+
+function BlocShow($left_margin,$htmlContent,$border=0,$LineFeedHeight){
+	$this->Ln($LineFeedHeight);
+	$this->x=$this->lMargin+$left_margin;
+	$y = $this->y;
+	$width = $this->w-$this->rMargin-$this->x;
+	list($width2,$height) = $this->CellSize($htmlContent,$this->FontFamily,$this->FontSizePt,$LineFeedHeight,3,$width);
+	$this->OutputCell($width,$height,$htmlContent,$border,$LineFeedHeight);
+	$this->y = $y+$height;
+	$this->Ln($LineFeedHeight);
+}
+
+function TableShow($align,$LineFeedHeight)
+{
+	// Calcul de la taille de police optimale
+	// Le calcul ne l'est pas, lui ;-)
+	$oldFontSizePt=$this->FontSizePt;
+	$oldFontFamily=$this->FontFamily;
+
+	$tableFontFamily='helvetica';
+	$cellmargin=3.0;		// pifomètre : un peu de marge sur la largeur de cellule
+	$wrwi=$this->w - $this->lMargin - $this->rMargin;
+//-----------
+	$tableFontSize=10;
+	$TableWidth = 1.01*$wrwi;
+	$max_width=0;
+	$min_font_size=6.0; // mis à 6, 5 était vraiment petit
+	$maxiter = 10;
+	do {
+		$tableFontSize = $tableFontSize *min(1.0,$wrwi/$TableWidth)*0.99; // 0.99 pour converger plus vite
+		
+		$fixed_width= ($tableFontSize<$min_font_size) || ($maxiter==1) || ($TableWidth<=$wrwi);
+		if ($fixed_width)
+			$coeff=min(1.0,$wrwi/$TableWidth);
+				
+		$tableFontSize = max($min_font_size,$tableFontSize);
+		// on boucle sur la taille de police tant que la largeur du tableau ne rentre pas dans la page
+		
+		// remise à zéro des largeurs de colonnes
+		foreach ($this->columnProp as $i=>$cprop)
+			if ($fixed_width)	$this->columnProp[$i]['w']=$this->columnProp[$i]['w']*$coeff;// redimenssioner la largeur de la colonne
+			else	$this->columnProp[$i]['w']=0.0;
+		foreach($this->tableContent as $j=>$row)
+			$this->lineProp[$j]['h']=0.0;
+		
+		// on passe toutes les cellules du tableau en revue
+		// de façon à calculer la largeur max de chaque colonne pour la taille de police courante
+		foreach($this->tableContent as $j=>$row) {
+			foreach($row as $i=>$cell) {
+				$htmlContent = $cell['content']."<br />";
+				if ($this->tableContent[$j][$i]['TH']) {
+					$htmlContent="<B>$htmlContent</B>";
+				}
+				list($width,$height)=$this->CellSize($htmlContent,$tableFontFamily,$tableFontSize,$LineFeedHeight,$cellmargin,$fixed_width?$this->columnProp[$i]['w']:0);
+				
+				if (!$fixed_width)
+					$this->columnProp[$i]['w'] = max($this->columnProp[$i]['w'],$width);
+				$this->lineProp[$j]['h'] = max($this->lineProp[$j]['h'],$height)+0.3;
+			}
+		}
+		// Repris de CalcWidth : calcul de la largeur de la table
+		$TableWidth=0.0;
+		foreach($this->columnProp as $col) {
+			$TableWidth += $col['w'];
+		}
+	} while (!$fixed_width && $maxiter--);
+
+	//-----------
+	//	Envoi du tableau dans le flux PDF
+	//-----------
+
+	$this->SetFont($tableFontFamily, '', $tableFontSize);
+	//Calcule l'abscisse du tableau
+	if($align=='C') 
+		$this->TableX=max(($this->w-$TableWidth)/2, 0);
+	elseif($align=='R')
+		$this->TableX=max($this->w-$this->rMargin-$TableWidth, 0);
+	else
+		$this->TableX=$this->lMargin;
+
+	$ci=0;	# flip-flop pour couleur de fond de ligne
+	foreach($this->tableContent as $j=>$row) {
+		$this->SetX($this->TableX);
+		$fill = !empty($this->RowColors[$ci]);
+		if ($fill) {
+			$this->SetFillColor($this->RowColors[$ci][0],
+								$this->RowColors[$ci][1],
+								$this->RowColors[$ci][2]);
+		}
+		
+		foreach($this->tableContent[$j] as $i=>$cell) {
+			if ($this->tableContent[$j][$i]['TH'] == true) {
+				$this->SetFont($tableFontFamily, 'B', $tableFontSize);
+				$this->SetFillColor(255, 255, 0);	// jaune
+				$fill=1;
+			}
+			$this->OutputCell(
+				$this->columnProp[$i]['w'],
+				$this->lineProp[$j]['h'],
+				$cell['content'],
+				1,
+				$LineFeedHeight,
+				$this->columnProp[$i]['a'],
+				$fill,0);
+			
+			if ($this->tableContent[$j][$i]['TH']) {
+				$this->SetFont('', '', $tableFontSize);
+				$this->SetFillColor(255);	// blanc
+			}
+		}
+		$ci=1-$ci;
+		$this->maxLineWidth = max($this->maxLineWidth,$this->x);
+		$this->Ln($this->lineProp[$j]['h']);
+	}
+
+	$this->SetFont($oldFontFamily, '', $oldFontSizePt);
+	$this->Ln($LineFeedHeight);
+}
+	
+// Efface le fichier de dump
+function InitDumpFile()
+{
+	@unlink(DUMP_FILE_FULL_PATH_NAME);
+}
+
+
+// trace une chaîne dans un fichier 
+function Dump($String)
+{
+	if ($f = @fopen(DUMP_FILE_FULL_PATH_NAME,"a"))
+    {
+		@fwrite($f,$String);
+        @fwrite($f,"\n");
+		@fclose($f);
+    }
+}
+
+// trace un tableau dans un fichier 
+function DumpArray($String,$Array)
+{
+	$Result=print_r($Array,true);
+	
+	if ($f = @fopen(DUMP_FILE_FULL_PATH_NAME,"a"))
+    {
+		@fwrite($f,$String);
+		@fwrite($f,"\n\n");
+        if(@fwrite($f,$Result))
+        {
+            @fclose($f);
+        }
+    }
+	$Array.reset();
+}
+
+}	// class PDF extends FPDF
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/lib_pdf_spip.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/lib_pdf_spip.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/pdf/lib_pdf_spip.php	(revision 30)
@@ -0,0 +1,207 @@
+<?php
+
+/**
+ * class PDF_SPIP extends PDF : 
+ */
+ 
+ 
+class PDF_SPIP extends PDF
+{
+
+
+// haut, gauche,  bas, droite
+function SetAllMargins($TopMargin, $LeftMargin, $BottomMargin, $RightMargin)
+{
+	// gauche, haut, droite
+	$this->SetMargins($LeftMargin,$TopMargin,$RightMargin);
+	
+	// bas
+	$this->SetAutoPageBreak(auto, $BottomMargin*3/2);
+}
+
+
+function Header()
+{
+	global $titre ;
+	
+	$this->SetY($this->tMargin/2);
+	$this->SetLineWidth(0.3);
+	$this->Line($this->lMargin - 3, $this->tMargin, $this->w - $this->rMargin + 3, $this->tMargin);
+	
+	//Police helvetica gras 8
+	$this->SetFont('helvetica','B',12);
+	$this->SetTextColor(0,0,0);
+
+	$this->Cell(0,$this->tMargin/2, $titre ,0,0,'C');
+	
+	// $this->tMargin = marge du haut, définie dans FPDF
+	$this->Ln(9);
+}
+
+
+/* /// Pied de page du document) 
+/* ///////////////////////////// */
+function Footer()
+{
+	global $conf_nom_site , $conf_url_site  ;
+	
+	$this->SetY(-$this->bMargin/2);	
+	$this->SetLineWidth(0.3);
+	$this->Line($this->lMargin - 3, $this->GetY(), $this->w - $this->rMargin + 3, $this->GetY());
+	
+	
+	//Police helvetica 8	
+	$this->SetFont('helvetica','I',8);
+	$this->SetTextColor(0,0,0);
+
+	// Copyright
+	$this->Cell(0,6,"Copyright © ".$conf_nom_site ,0,0,'L',0,$conf_url_site );
+	
+	//Numéro de page
+	$this->SetX($this->w-$this->rMargin*2-5);
+	$this ->Cell(0,6,'Page '.$this->PageNo().'/{nb}', 0, 1, 'C');
+}
+
+function GenerateTitlePage()
+{
+	global $site, $rubrique, $yahoo, $surtitre, $titre, $soustitre;
+	global $logo_site,  $logo_fichier, $logo_lien;
+  global $auteur, $descriptif;
+	global $copyright;
+	global $conf_url_site;
+	global $DateParution,$DateMiseEnLigne;
+	
+	
+	// En-tête
+	if (file_exists($logo_site))
+	{
+		$this->Image($logo_site,$this->rMargin+3,$this->tMargin+2,20,20);
+	}
+	
+	$this->SetFont('times','',12);
+	$this->SetXY($this->rMargin+25,$this->tMargin+6);
+	$this->MultiCell(0,5,"Extrait du " . $site);
+	
+	$this->SetXY($this->rMargin+25,$this->tMargin+14);
+	$this->PutLink($conf_url_site,$conf_url_site);
+	
+	
+	//Surtitre (type du document)
+	$this->unhtmlentities($surtitre);
+	$this->SetXY(20,92);
+	$this->SetFont('courier','B',14);
+	$this->MultiCell(170,6,$surtitre,0,'C',0);
+	
+	
+	//Titre centré
+	$this->SetXY(20,100);
+	$this->SetFont('helvetica','B',32);
+	$this->unhtmlentities($titre);
+	$this->MultiCell(170,20,$titre,0,'C',0);
+	
+	
+	// Rubriques
+	$this->Ln(2);
+	$this->SetFont('helvetica','',8);
+	$this->MultiCell(0,5,$yahoo,0,'C',0);
+	
+	// Logo
+
+	if ($logo_fichier!="") {
+	$x = $this->GetX();
+	$y = $this->GetY();
+		$this->SetLink($link);
+//		$this->Image($logo_fichier,50,170,'','','','','0');
+//		$this->Image($logo_fichier,50-($w/2),170,50,50,'','','0');
+		$this->Image($logo_fichier,50-($w/2),170,'','','',$logo_lien,'0');
+		$this->SetXY($xi, $yi);
+    	}
+
+
+	//Dates
+	$this->SetFont('times','',10);
+	
+	if ($DateMiseEnLigne) 
+	{
+		$this->SetXY(110,184);
+		$DateMiseEnLigne = $this->unhtmlentities($DateMiseEnLigne);
+		$this->MultiCell(0,6,"Date de mise en ligne : $DateMiseEnLigne",0,'L',0);
+	}
+	
+	if ($DateParution) 
+	{
+		$this->SetXY(110,190);
+		$DateParution = $this->unhtmlentities($DateParution);
+		$this->MultiCell(0,6,"Date de parution : $DateParution",0,'L',0);
+	}
+	
+
+	// Descriptif 	
+	if ($descriptif)
+	{
+		
+		$this->SetFont('helvetica','B',10) ;
+		$this->SetXY($this->rMargin+5,220);
+		$this->SetFont('helvetica', 'BU', 10);
+		$this->Write(5, 'Description :');
+		$this->Ln();
+		$this->SetFont('times', '', 8);
+		$this->WriteHTML($descriptif,5) ;
+	}
+	
+	if ($copyright)
+	{
+		$this->SetXY(45,250);
+		$this->SetFont('times', 'B', 10);
+		$this->MultiCell(120,8,$copyright,'TB','C',0);
+	}
+}
+
+function GenerateText()
+{
+ 	global $texte, $chapo, $ps, $notes ;
+		
+	$this->SetFont('helvetica');
+	if ($chapo)
+	{
+		// Chapeau
+		$this->SetFont('times','B',13);
+		$this->WriteHTML($chapo,5);
+		$this->Ln(12);
+	}
+	
+	//Texte - justifie
+	$this->SetFont('helvetica','',10);
+	$this->WriteHTML($texte,5);
+	$this->Ln(12);
+	if ($ps) 
+	{
+		//ps
+		$this->SetFont('','I',8);
+		$this->WriteHTML("Post-scriptum : ",4);
+		$this->WriteHTML($ps,4);
+		$this->Ln(8);
+	}
+	if ($notes) {
+		//notes
+		$this->SetFont('','',8);
+		$this->WriteHTML($notes,3);
+		$this->Ln();
+	}
+}
+
+function BuildDocument()
+{
+	$this->AddPage();
+	$this->GenerateTitlePage();
+	$this->AddPage();
+	$this->GenerateText();
+	
+	// On repasse en police à la bonne taille pour le nombre de pages.
+	$this->SetFont('helvetica','I',8);
+	$this->AliasNbPages();
+}
+//
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/article_pdf/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/article_pdf/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/article_pdf/plugin.xml	(revision 30)
@@ -0,0 +1,33 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	Article PDF
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+[chag->http://www.spip-contrib.net/_chag_]
+_ [Paul Sanches->http://www.spip-contrib.net/_Paul-Sanches_]
+_ [Aquinatus->http://www.spip-contrib.net/_Aquinatus_]
+_ [C&#233;dric Morin->http://www.notre-ville.net]
+	</auteur>
+	<version>
+	0.1
+	</version>
+	<etat>
+	stable
+	</etat>
+	<description>
+	Conversion d'un article au format pdf pour t&#233;l&#233;chargement
+_ N&#233;cessite GD2 sur votre serveur
+_ Inserez la balise #ARTICLE_PDF dans votre squelette pour avoir un lien de t&#233;l&#233;chargement de l'article au format PDF
+	</description>
+	<lien></lien> <!-- URI de documentation -->
+	<options> <!-- fichier charge a chaque hit -->
+	article_pdf_mes_options.php
+	</options>
+	<fonctions> <!-- fichier charge a chaque recalcul -->
+	article_pdf_mes_fonctions.php
+	</fonctions>
+	<prefix> 
+	article_pdf
+	</prefix>
+
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/README.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/README.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/README.txt	(revision 30)
@@ -0,0 +1,29 @@
+PLUGIN ENVIAR EMAIL PARA SPIP 1.9
+
+El plugin "Enviar email" para SPIP 1.9 crea un enlace que permite enviar la referencia del artculo o breve por email a una o varias direcciones.
+
+Al cliquear en el enlace aparece una ventana pop-up para recoger los datos necesarios y realizar el envo.
+
+Utiliza la clase phpmailer 1.73 lo que permite realizar el envo por SMTP evitando los problemas que surgen al utilizar la funcin mail de PHP.
+
+INSTALACIîN
+
+- Descomprime el archivo "plugin_enviar_email_spip_1_9.zip".
+- Pon la carpeta enviar_email dentro de la carpeta plugins de tu instalacin de SPIP. Si no existe crea una y llmala "plugins".
+- En el espacio privado cliquea en Configuracin del sitio > Gestin de los plugins.
+- Marca la casilla de Enviar email para activarlo.
+- Donde quieras que aparezca (en los esqueletos article.html o breve.html) escribe #ENVIAR_EMAIL** (con los dos asteriscos)
+- Hecho
+
+PERSONALIZAR
+
+Para personalizar la tipografa del enlace puedes colocar la baliza #ENVIAR_EMAIL** entre <span style="font-size:65%">...</span>, por ejemplo, y en style puedes poner tipo de letra, tamao, color,... o puedes crear una clase en tu hoja de estilos y ponrsela,...
+
+Para modificar el icono del sobre pon el que tu quieras (a poder ser en formato gif) en la carpeta enviar_email y llmalo "sobre.gif"
+
+Para otras modificaciones abre el archivo baliza_enviar_email.php y retoca lo que quieras. Por ejemplo, el '400' y el '430' son el ancho y el alto de la ventana que se abre.
+
+Para modificar el esqueleto que se enva modifica enviar_email_articulo.html o enviar_email_breve.html
+
+=========================================================================
+CopyLeft 2006 joseluis@digital77.com
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/baliza_enviar_email.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/baliza_enviar_email.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/baliza_enviar_email.php	(revision 30)
@@ -0,0 +1,51 @@
+<?php
+
+function preparar_enlace_enviar($arg){
+
+// funcion para ventana pop-up centrada en la pantalla
+$javascript_centrar_enviar = "<script language=\"JavaScript1.2\">
+	/*
+	Open Centered Popup Window Script-
+	© DHTMLShock (www.dhtmlshock.com)
+	To add more shock to your site, visit www.DHTMLShock.com
+	*/
+	function centrarVentana(theURL,winName,features, myWidth, myHeight, isCenter) { //v3.0
+		if(window.screen)if(isCenter)if(isCenter==\"true\"){
+		var myLeft = (screen.width-myWidth)/2;
+		var myTop = (screen.height-myHeight)/2;
+		features+=(features!='')?',':'';
+		features+=',left='+myLeft+',top='+myTop;
+	}
+	window.open(theURL,winName,features+((features!='')?',':'')+'width='+myWidth+',height='+myHeight);
+	}
+</script>";
+
+// prepara logo
+		$logo = find_in_path('sobre.gif');
+		$url = generer_url_public('',$arg);
+		
+// prepara el enlace completo
+		$enlace = $javascript_centrar_enviar."<a href=\"javascript:;\" onClick=\"centrarVentana('$url','Enviar_documento','scrollbars=yes,resizable=yes','440','460','true')\" title=\"Enviar la referencia de este documento por email\" border=\"0\"><img src=\"$logo\" border=\"0\" /> Enviar por email</a>";
+		return $enlace;
+
+}
+
+// la baliza a llamar como #ENVIAR_EMAIL** (importante los dos asteriscos para que funcione el javascript anterior de centrar la ventan por-up)
+
+function balise_ENVIAR_EMAIL($p) {
+
+// numero y enlace al artículo o breve
+  	$_id_article = champ_sql('id_article', $p);
+	$arg = "'page=enviar_email_articulo&amp;id_article='.".$_id_article;
+	$url = generer_url_public('',$arg);
+	if (!$_id_article){
+		$_id_breve = champ_sql('id_breve', $p);
+		$arg = "'page=enviar_email_breve&amp;id_breve='.".$_id_breve;
+		$url = generer_url_public('',$arg);
+	}
+   $p->code ="preparar_enlace_enviar($arg)";
+   $p->statut = 'html';
+   return $p;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/enviar_email_articulo.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/enviar_email_articulo.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/enviar_email_articulo.html	(revision 30)
@@ -0,0 +1,257 @@
+#CACHE{0}
+<BOUCLE_enviar_articulo(ARTICLES){id_article}>
+<!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" style="background-color:#ffffff">
+
+<head>
+
+	<title>[Enviar artículo: (#TITRE|textebrut)]</title>
+	[<meta name="description" content="(#INTRODUCTION|couper{150}|textebrut)" />]
+	<INCLURE{fond=inc-head}>
+
+<style type="text/css">
+<!--
+
+h2 {
+	font-size:130%;
+	font-weight:bold;
+}
+
+.formulario {
+	background-color:#ffffff;
+	border: 0px solid silver;
+	font-size:90%;
+	margin-top:.9em;
+}
+	
+.campos {
+	width: 95%;
+	font-size:90%;
+	padding-left: 2px;
+	padding-right: 2px;
+	padding-top:2px;
+	padding-bottom:2px;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	color:#666666;
+	margin-bottom:.3em;
+	border:1px solid silver;
+}
+	
+.boton {
+	padding: 0px;
+	border: 1px solid silver;
+	color: #666666;
+}
+-->
+</style>
+
+</head>
+
+<body style="border:0px; padding:0px; font-size:90%;text-align:center;background-color:#ffffff;color: #727860;">
+
+<?php
+
+if (!$HTTP_POST_VARS){
+
+// MUESTRA EL FORMULARIO
+?>
+
+<div style="width:90%; margin:auto;padding-top:.6em">
+  <form action="<?php $phpself; ?>" method="POST" enctype="multipart/form-data" class="formulario">
+
+<h2 style="text-align:center;"><span style="text-decoration:underline;color:#f28000">#NOM_SITE_SPIP</span><div style="font-weight:normal; font-size:80%; margin-top:.9em;margin-bottom:.9em">Enviar [referencia de <span style="font-weight:bold;font-style:italic">'(#TITRE)'</span> ]por correo electrónico</div></h2>
+
+    <fieldset style="text-align:left; margin-bottom:.6em">
+   <b>Enviar a la dirección:</b><div style="font-size:95%;color:#999999">(separa con comas si escribes más de una)</div><input name="destino" class="campos" value="" size="40"></fieldset>
+       <fieldset style="text-align:left">
+       <legend style="font-weight:bold">Datos opcionales</legend>
+    Asunto <span style="font-size:95%;color:#999999">(título que quieres darle al mensaje)</span><br /><input name="asunto" class="campos" size="40" value=""><br/>
+Tu nombre<br /><input name="nombre" class="campos" size="40" value=""><br/>
+     Tu dirección de correo electrónico<br /><input name="email" class="campos" size="40" value=""><br />
+     Puedes añadir un texto en el mensaje<br /><textarea name="coment" class="campos" style="font-size:100%; font-family:verdana, arial, helvetica, sans-serif;" cols="40" rows="3"></textarea>
+     <div style="text-align:center">
+      <input type="submit" name="enviar" class="boton" style="margin-top:.3em" value="Enviar">&nbsp;&nbsp;&nbsp;<input type="button"  class="boton" style="margin-top:.3em" value="Cancelar" onclick="window.close();"> 
+      </div>
+      <input type="hidden" name="message" value="1">
+      </fieldset>
+  </form> 
+</div>
+
+<?php
+}else{
+
+// REVISA QUE HAYA UN EMAIL PARA ENVIAR EL MENSAJE
+if (!$destino) { echo "<p style='color:red; font-size:90%'>Lo sentimos :-( pero sin dirección de correo electrónico válida<br />no podemos enviar el mensaje</p>";
+
+?>
+
+<div style="width:90%; margin:auto;">
+  <form action="<?php $phpself; ?>" method="POST" enctype="multipart/form-data" class="formulario">
+        <h2 style="text-align:center; margin-bottom:.1em"><span style="text-decoration:underline">#NOM_SITE_SPIP</span><div style="font-weight:normal; font-size:80%; margin-top:1.2em">Enviar [referencia de <span style="font-weight:bold; font-style: italic">'(#TITRE)'</span> ]por correo electrónico</div></h2>
+    <fieldset style="text-align:left; margin-bottom:.6em">
+   <b>Enviar a la dirección:</b><div style="font-size:95%;color:#999999">(separa con comas si escribes más de una)</div><input name="destino" class="campos" value="" size="40"></fieldset>
+       <fieldset style="text-align:left">
+       <legend style="font-weight:bold">Datos opcionales</legend>
+    Asunto <span style="font-size:95%;color:#999999">(título que quieres darle al mensaje)</span><br /><input name="asunto" class="campos" size="40" value=""><br/>
+Tu nombre<br /><input name="nombre" class="campos" size="40" value=""><br/>
+     Tu dirección de correo electrónico<br /><input name="email" class="campos" size="40" value=""><br />
+     Puedes añadir un texto en el mensaje<br /><textarea name="coment" class="campos" style="font-size:100%; font-family:verdana, arial, helvetica, sans-serif;" cols="40" rows="3"></textarea>
+     <div style="text-align:center">
+      <input type="submit" name="enviar" class="boton" style="margin-top:.3em" value="Enviar">&nbsp;&nbsp;&nbsp;<input type="button"  class="boton" style="margin-top:.3em" value="Cancelar" onclick="window.close();"> 
+      </div>
+      
+      <input type="hidden" name="message" value="1">
+      
+      </fieldset>
+  </form> 
+</div>
+
+<?php
+}
+
+// ENVIO DEL MENSAJE CON PHPMAILER
+
+include_spip("phpmailer/class.phpmailer");
+include_spip("phpmailer/class.smtp");	
+include_spip('inc/meta'); // para coger datos automáticamente del servidor, usuario,...
+$mail = new PHPMailer();
+
+$mail->IsSMTP();
+$mail->Mailer = "smtp"; 
+
+
+/*
+// SI EL SERVIDOR DE SMTP REQUIERE AUTENTICACION RELLENA ESTOS DATOS CON LOS TUYOS Y ACTIVALO
+
+//Asignamos a Host el nombre de nuestro servidor smtp
+  $mail->Host = "smtp.hotpop.com";
+
+  //Le indicamos que el servidor smtp requiere autenticación
+  $mail->SMTPAuth = true;
+
+  //Le decimos cual es nuestro nombre de usuario y password
+  $mail->Username = "micuenta@HotPOP.com"; 
+  $mail->Password = "mipassword";
+*/
+ 
+$mail->Host = "localhost"; // Servidor de SMTP 
+
+$mail->SetLanguage("es", "phpmailer/language/");
+$mail->CharSet	= lire_meta('charset');  // Juego de caracteres
+$mail->Timeout="20";
+
+// $mail->WordWrap = "50";                                 // set word wrap to 50 characters
+// $mail->AddAttachment("/var/tmp/file.tar.gz");         // añadir archivos
+// $mail->AddAttachment("#DOSSIER_SQUELETTE/imagenes/logo_64.jpg", "logo_64.jpg");    // añadir archivos con nombre
+
+// PARTE COMÚN
+
+  //Asignamos asunto y cuerpo del mensaje
+  
+      //Estoy recibiendo los campos, compongo el cuerpo
+
+    if (!$HTTP_POST_VARS["nombre"]) { $remite= "No ha escrito su nombre"; } else { $remite= $HTTP_POST_VARS["nombre"]; }
+    $mail->FromName = $remite; // el nombre que queremos que vea
+    $mail->From = $HTTP_POST_VARS["email"]; // el email del nombre que se ve
+    
+if (!$HTTP_POST_VARS["email"]) { $replica = '[(#EMAIL_WEBMASTER)]'; } else { $replica = $HTTP_POST_VARS["email"]; }
+	$mail->AddReplyTo($replica); // reply
+    
+    $separar = explode(',',$destino);
+	foreach($separar as $email_destino) {
+		$mail->AddAddress($email_destino); // para
+		};
+        
+    if (!$HTTP_POST_VARS["asunto"]) { $asunto='[(#TITRE|texte_script)]'; } else { $asunto=$HTTP_POST_VARS["asunto"]; }
+    $mail->Subject = $asunto; // Asunto
+
+// COMIENZO PARTE HTML
+
+$sitio='[(#NOM_SITE_SPIP)]';
+$url_sitio='[(#URL_SITE_SPIP)]';
+$url_art='[(#URL_ARTICLE)]';
+
+$texto_html ="<div style='margin:1.2em;font-family:tahoma,verdana,arial,helvetica,sans-serif;background-color:#ffffff;color:#727860;border:1px solid #f28000'>";
+
+$texto_html.="<p style='padding:0px;margin:0px;text-align:left;font-size:120%;font-weight:bold;background-color:#f28000'><a href='$url_sitio' style='display:block;text-decoration:none;color:#edef9f;padding:.3em'><img src='logo_64.jpg' border='0' /> ".$sitio."</a></p>";
+
+$texto_html.="<div style='padding:.9em;padding-top:0px'>";
+
+if (!$HTTP_POST_VARS["coment"]) { $comentario="Hola. Quizás esta información te pueda interesar."; } else { $comentario=$HTTP_POST_VARS["coment"]; }
+$texto_html.="<p style='text-align:left'>".$comentario."</p>";
+
+$texto_html.="<div style='border: 1px solid silver;background-color:whitesmoke'>";
+$texto_html.="<div style='font-size:120%;padding:.3em;text-align:center;border-bottom:1px dotted silver'>".'[(#TITRE)]'."</div>";
+$texto_html.="<div style='padding:.9em;padding-bottom:.3em;font-size:95%;'>".'[(#TEXTE|couper{1200})]'."</div>";
+$texto_html.="<div style='font-size:90%;text-align:right;padding-bottom:.6em;padding-right:.9em'><a href='$url_sitio/$url_art'>leer más &rsaquo;&rsaquo;&rsaquo;</a></div>";
+$texto_html.="</div>";
+
+if (!$HTTP_POST_VARS["email"]) { $email_aut=""; } else { $email_aut=" (".$HTTP_POST_VARS["email"].")"; }
+$texto_html.="<div style='font-size:80%;color:#999999;text-align:left'>Envíado por: ".$remite.$email_aut."</div>";
+
+$texto_html.="</div></div>";
+
+$mail->Body = $texto_html;
+  
+// COMIENZO PARTE TEXTO PLANO 
+
+if (!$HTTP_POST_VARS["coment"]) { $comentario="Hola. Quizás esta información te pueda interesar."; } else { $comentario=$HTTP_POST_VARS["coment"]; }
+$texto_plano=$comentario."\n\n";
+$texto_plano.="-------------------------- \n";
+$texto_plano.='[(#NOM_SITE_SPIP)]'."\n".'[(#URL_SITE_SPIP)]'."\n\n";
+$texto_plano.='[(#TITRE)]'."\n\n";
+$texto_plano.='[(#TEXTE|couper{1200})]'."\n\n";
+$texto_plano.="leer más: ".$url_sitio."/".$url_art."\n\n";
+$texto_plano.="-------------------------- \n";
+$texto_plano.="Envíado por: ".$remite.$email_aut;
+
+
+  $mail->AltBody = $texto_plano;
+  
+// SE ENVÍA EL MENSAJE
+
+// Envío (5 intentos)
+$enviado = $mail->Send();
+$intentos=1; 
+   	while((!$enviado)&&($intentos<5)&&($mail->ErrorInfo!="SMTP Error: Data not accepted")){
+	   sleep(5);
+     	   //echo $mail->ErrorInfo;
+     	   $enviado = $mail->Send();
+     	   $intentos=$intentos+1;				
+   	}
+
+if ($mail->ErrorInfo=="SMTP Error: Data not accepted") { // soluciona un bug con attachements
+	   $enviado=true;
+}
+
+//información final sobre el envío
+
+if($enviado)
+{
+echo "<div style='margin-left:15px;margin-right:15px'><center><br /><br /><h2 style='text-align:center; font-weight:bold; margin-bottom:.6em'><span style='text-decoration:underline;color:#f28000'>".'[(#NOM_SITE_SPIP)]'."</span></h2><br /><h1 style='text-align:center;font-size:95%'>La referencia de<i><b><div style='padding-top:.9em;padding-bottom:.9em;font-size:115%'>\"".'[(#TITRE|texte_script)]'."\"</div></b></i><div style='padding-bottom:.6em'>ya se ha enviado a:</div>";
+foreach($separar as $email_destino) { echo $email_destino."<br />"; }
+echo "</h1 />";
+}
+else{
+echo "<div style='margin-left:15px;margin-right:15px'><center><font color='red'><br /><br /><h2 style='text-align:center; font-weight:bold; margin-bottom:.3em'><span style='text-decoration:underline;color:#f28000'>".'[(#NOM_SITE_SPIP)]'."</span></h2><br /><h1 style='text-align:center;font-size:90%'>Lo sentimos<br />Ha habido un problema y no se ha podido enviar el correo :-(</h1></font></center></div>";
+}
+
+?>
+
+<div style="text-align:center">
+<br />
+<input type="button"  class="boton" value="Cerrar" onclick="window.close();">
+</div>
+
+<?php
+
+}
+?> 
+
+<div style="display:none">
+[(#FORMULAIRE_ADMIN)]
+</div>
+
+</body>
+</html>
+</BOUCLE_enviar_articulo>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/enviar_email_breve.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/enviar_email_breve.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/enviar_email_breve.html	(revision 30)
@@ -0,0 +1,296 @@
+#CACHE{0}
+<BOUCLE_enviar_breve(BREVES){id_breve}>
+<!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>[Enviar breve: (#TITRE|textebrut)]</title>
+	
+	<!-- Para los buscadores -->
+	<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+	<meta name="robot" content="follow, index, all">
+	<meta name="revisit-after" content="1 days">
+	<meta name="generator" content="SPIP" />
+	[<meta name="description" content="(#INTRODUCTION|couper{150}|attribut_html)" />]
+	<meta name="keywords" content="">
+
+
+<style type="text/css">
+<!--
+
+h2 {
+	font-size:130%;
+	font-weight:bold;
+}
+
+.formulario {
+	background-color: white;
+	border: 0px solid silver;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size:75%;
+	margin-top:.9em;
+}
+	
+.campos {
+	width: 95%;
+	padding-left: 2px;
+	padding-right: 2px;
+	padding-top:1px;
+	padding-bottom:1px;
+	font-size: 110%;
+	color:#333333;
+	margin-bottom:.3em;
+	border:1px solid #B2BFCF;
+}
+	
+.spip_bouton {
+	padding: 0px;
+	border: 1px solid gray;
+	background-color: whitesmoke;
+	font-family: verdana,helvetica,arial,sans-serif;
+	color: #666666;
+	font-size: 100%;
+}
+-->
+</style>
+
+</head>
+
+<body style="border:0px; padding:0px; text-align:center">
+#NOM_SITE
+<?php
+if (!$HTTP_POST_VARS){
+
+// MUESTRA EL FORMULARIO
+?>
+
+<div style="width:95%; margin:auto;">
+  <form action="<?php $phpself; ?>" method="POST" enctype="multipart/form-data" class="formulario">
+        <h2 style="text-align:center; margin-bottom:.2em"><span style="text-decoration:underline">#NOM_SITE_SPIP</span><div style="font-weight:normal; font-size:80%; margin-top:.6em;">Enviar [la referencia de "<span style="font-weight:bold; font-style: italic">(#TITRE)</span>" ]por correo electrónico</div></h2>
+    <fieldset style="text-align:left; margin-bottom:.6em">
+   <b>Enviar a la dirección:</b><div style="font-size:95%;color:#999999">(separa con comas si escribes más de una)</div><input name="destino" class="campos" value="" size="40"></fieldset>
+       <fieldset style="text-align:left">
+       <legend style="font-weight:bold">Datos opcionales</legend>
+    Asunto <span style="font-size:95%;color:#999999">(título que quieres darle al mensaje)</span><br /><input name="asunto" class="campos" size="40" value=""><br/>
+      Tu nombre<br /><input name="nombre" class="campos" size="40" value=""><br/>
+     Tu dirección de correo electrónico<br /><input name="email" class="campos" size="40" value=""><br />
+     Puedes añadir un texto en el mensaje<br /><textarea name="coment" class="campos" style="font-size:100%; font-family:verdana, arial, helvetica, sans-serif;" cols="40" rows="3"></textarea>
+     <div style="text-align:center">
+      <input type="submit" name="enviar" class="spip_bouton" style="margin-top:.3em" value="Enviar">&nbsp;&nbsp;&nbsp;<input type="button"  class="spip_bouton" style="margin-top:.3em" value="Cancelar" onclick="window.close();"> 
+      </div>
+      <input type="hidden" name="message" value="1">
+      </fieldset>
+  </form> 
+</div>
+
+<?php
+}else{
+
+// REVISA QUE HAYA UN EMAIL PARA ENVIAR EL MENSAJE
+if (!$destino) { echo "<p style='color:red; font-size:90%'>Lo sentimos :-(, pero sin dirección de correo electrónico válida no podemos enviar el mensaje</p>";
+
+?>
+
+<div style="width:90%; margin:auto;">
+  <form action="<?php $phpself; ?>" method="POST" enctype="multipart/form-data" class="formulario">
+        <h2 style="text-align:center; margin-bottom:.2em"><span style="text-decoration:underline">#NOM_SITE_SPIP</span><div style="font-weight:normal; font-size:80%; margin-top:.6em;">Enviar [la referencia de "<span style="font-weight:bold; font-style: italic">(#TITRE)</span>" ]por correo electrónico</div></h2>
+    <fieldset style="text-align:left; margin-bottom:.6em">
+   <b>Enviar a la dirección:</b><div style="font-size:95%;color:#999999">(separa con comas si escribes más de una)</div><input name="destino" class="campos" value="" size="40"></fieldset>
+       <fieldset style="text-align:left">
+       <legend style="font-weight:bold">Datos opcionales</legend>
+    Asunto <span style="font-size:95%;color:#999999">(título que quieres darle al mensaje)</span><br /><input name="asunto" class="campos" size="40" value=""><br/>
+      Tu nombre<br /><input name="nombre" class="campos" size="40" value=""><br/>
+     Tu dirección de correo electrónico<br /><input name="email" class="campos" size="40" value=""><br />
+     Puedes añadir un texto en el mensaje<br /><textarea name="coment" class="campos" style="font-size:100%; font-family:verdana, arial, helvetica, sans-serif;" cols="40" rows="3"></textarea>
+     <div style="text-align:center">
+      <input type="submit" name="enviar" class="spip_bouton" style="margin-top:.3em" value="Enviar">&nbsp;&nbsp;&nbsp;<input type="button"  class="spip_bouton" style="margin-top:.3em" value="Cancelar" onclick="window.close();"> 
+      </div>
+      
+      <input type="hidden" name="message" value="1">
+      
+      </fieldset>
+  </form> 
+</div>
+      <input type="hidden" name="message" value="1">
+      </fieldset>
+  </form> 
+</div>
+
+<?php
+}else {
+
+// ENVÍO DEL MENSAJE CON PHPMAILER
+
+include_spip("phpmailer/class.phpmailer");
+include_spip("phpmailer/class.smtp");	
+include_spip('inc/meta'); // para coger datos automáticamente del servidor, usuario,...
+$mail = new PHPMailer();
+
+$mail->IsSMTP();
+$mail->Mailer = "smtp"; 
+$mail->Host 	= "localhost"; // Servidor de SMTP 
+
+$mail->SetLanguage("es", "phpmailer/language/");
+$mail->CharSet	= lire_meta('charset');  // Juego de caracteres
+$mail->Timeout="20";
+
+$mail->WordWrap = "75";                                 // set word wrap to 50 characters
+//$mail->AddAttachment("/var/tmp/file.tar.gz");         // añadir archivos
+//$mail->AddAttachment("/tmp/image.jpg", "new.jpg");    // añadir archivos con nombre
+
+// VARIABLES
+
+$un_salto="\r\n";
+$dos_saltos="\r\n\r\n";
+
+// PARTE COMÚN
+
+    //Estoy recibiendo los campos, compongo el cuerpo
+    
+    if (!$HTTP_POST_VARS["nombre"]) { $remite= "Olvidó escribir su nombre"; } else { $remite= $HTTP_POST_VARS["nombre"]; }
+    $mail->FromName = $remite; // de nombre
+    $mail->From = $HTTP_POST_VARS["nombre"]; // de email
+    
+    	if (!$HTTP_POST_VARS["email"]) { $replica = "[(#EMAIL_WEBMASTER)]"; } else { $replica = $HTTP_POST_VARS["email"]; }
+	$mail->AddReplyTo($replica); // reply
+    
+    $separar = explode(',',$destino);
+	foreach($separar as $email_destino) {
+		$mail->AddAddress($email_destino); // para
+		};
+        
+    if (!$HTTP_POST_VARS["asunto"]) { $asunto='[(#TITRE|texte_script)]'; } else { $asunto=$HTTP_POST_VARS["asunto"]; }
+    $mail->Subject = $asunto; // Asunto
+
+// COMIENZO PARTE TEXTO PLANO
+
+//Referencia al artículo para el texto plano
+?>
+
+<B_autores>
+<BOUCLE_autores(AUTEURS){id_breve}{", "}>
+<?php $autores='#NOM'; ?>
+</BOUCLE_autores>
+<?php $autores="|de ".$autores; ?>
+</B_autores>
+
+<?php
+	$articulo= "::: [(#TITRE|attribut_html)] :::".$un_salto;
+	$articulo.= "[(#SURTITRE|attribut_html)|][(#SOUSTITRE|attribut_html)|][(#DATE|affdate)]".$autores.$dos_saltos;
+	$articulo.= "[(#INTRODUCTION|attribut_html|textebrut|couper{360})]".$dos_saltos;
+
+	if (!$HTTP_POST_VARS["coment"]) { $comentario="Hola. Quizás este documento de #NOM_SITE_SPIP (#URL_SITE_SPIP) te pueda interesar."; } else { $comentario=$HTTP_POST_VARS["coment"]; }
+    $texto_plano .= $dos_saltos.$comentario.$dos_saltos."-------------------------------".$dos_saltos;
+    $texto_plano .= $articulo;
+    ?>
+<B_documents_plano>
+<?php 
+$texto_plano .="Si visitas la web podrás descargarte los siguientes documentos:".$un_salto;
+?>
+<BOUCLE_documents_plano(DOCUMENTS) {id_breve} {mode=document} {doublons}>
+<?php
+$texto_plano .="[- #TITRE, (#TYPE_DOCUMENT - (#TAILLE|taille_en_octets))]".$dos_saltos;
+?>
+</BOUCLE_documents_plano>
+</B_documents_plano>
+
+<?php
+	$texto_plano.= "* leerlo completo: #URL_SITE_SPIP/#URL_BREVE".$un_salto;
+    $texto_plano .= $un_salto."-------------------------------".$un_salto."Mensaje enviado por: ".$remite." <".$replica.">".$un_salto;
+    $texto_plano .= "Fuente: #NOM_SITE_SPIP (#URL_SITE_SPIP)";
+    $texto_plano .= $un_salto."-------------------------------".$un_salto;
+    
+    $mail->AltBody = $texto_plano; //Cuerpo en TEXTO PLANO
+    
+// FIN PARTE TEXTO PLANO
+
+// COMIENZO PARTE HTML
+
+$texto_html .="<div style='margin:1.2em;background: #fff;font-family:\'Trebuchet MS\', Tahoma, Arial, Verdana,sans-serif;font-size: 0.9em;text-align: left;'>";
+	if (!$HTTP_POST_VARS["coment"]) { $comentario="Hola. Quizás este documento de <a href='#URL_SITE_SPIP' style='text-decoration: none'>#NOM_SITE_SPIP</a> te pueda interesar."; } else { $comentario=$HTTP_POST_VARS["coment"]; }
+$texto_html .="<p>".$comentario."</p>";
+$texto_html .="<div style='border: 1px solid #ccc;padding: .5em;'>";
+$texto_html .="[<div style='font-size:1.1em;'><a href='#URL_SITE_SPIP/#URL_BREVE' style='text-decoration: none'>(#TITRE|supprimer_numero)</a></div>]";
+?>
+
+<B_autores_html>
+<BOUCLE_autores_html(AUTEURS){id_breve}{", "}>
+<?php $autores='[<a href="#URL_SITE_SPIP/#URL_AUTEUR" style="text-decoration:none">(#NOM)</a>]'; ?>
+</BOUCLE_autores_html>
+<?php $autores=" / de ".$autores; ?>
+</B_autores_html>
+
+<?php
+$texto_html .="<div style='color:#666666; font-size:90%;padding-bottom:.3em'>[(#SURTITRE|attribut_html) / ][(#SOUSTITRE|attribut_html) / ][(#DATE|affdate)]".$autores."</div>";
+$texto_html .="<div style='font-size:96%'>[(#INTRODUCTION|attribut_html|textebrut)]</div>";
+$texto_html .=" <div style='color:#999999; font-size:90%;'>[<a href='#URL_SITE_SPIP/#URL_BREVE' style='text-decoration: none'>... leer m&aacute;s &rsaquo;&rsaquo;&rsaquo;</a>]</div>";
+?>
+<B_documents>
+<?php 
+$texto_html .="<div style='margin-top:.6em;padding:.3em; padding-bottom:0px;border-top:1px solid #cccccc;color:#666666; font-size:85%;'>Si visitas la web podrás descargarte los siguientes documentos:<br />";
+?>
+<BOUCLE_documents(DOCUMENTS) {id_breve} {mode=document} {doublons}>
+<?php
+$texto_html .="[&bull; #TITRE, (#TYPE_DOCUMENT - (#TAILLE|taille_en_octets))]";
+?>
+</BOUCLE_documents>
+<?php 
+$texto_html .="</div>"; 
+?>
+</B_documents>
+<?php
+$texto_html .="</div>";
+$texto_html .= "<div style='margin-top:.2em;margin-bottom:.9em;color:#666666; font-size:80%;text-align:right'>Mensaje enviado por: ".$remite." <".$replica.">";
+$texto_html .= " /// Fuente: <a href='#URL_SITE_SPIP' style='text-decoration: none'>#NOM_SITE_SPIP</a><br /></div>";
+$texto_html .="</div>";
+
+$mail->Body    = $texto_html; //Cuerpo en HTML
+
+// FIN PARTE HTML
+
+// Envío (5 intentos)
+$enviado = $mail->Send();
+$intentos=1; 
+   	while((!$enviado)&&($intentos<5)&&($mail->ErrorInfo!="SMTP Error: Data not accepted")){
+	   sleep(5);
+     	   //echo $mail->ErrorInfo;
+     	   $enviado = $mail->Send();
+     	   $intentos=$intentos+1;				
+   	}
+
+if ($mail->ErrorInfo=="SMTP Error: Data not accepted") { // soluciona un bug con attachements
+	   $enviado=true;
+}
+
+//información final sobre el envío
+
+if($enviado)
+{
+echo "<div style='margin-left:15px;margin-right:15px'><center><font color='#333366'><br /><br /><h2 style='text-align:center; font-weight:bold; margin-bottom:.3em'><span style='text-decoration:underline'>#NOM_SITE_SPIP</span></h2><br /><h1 style='text-align:center; font-size:90%'>La referencia de<i><b><div style='padding-top:.6em;padding-bottom:.6em'>\"[(#TITRE|texte_script)]\"</div></b></i>ya se ha enviado a ". $HTTP_POST_VARS["destino"] ."</h1></font></center></div>";
+}
+else{
+echo "<div style='margin-left:15px;margin-right:15px'><center><font color='red'><br /><br /><h2 style='text-align:center; font-weight:bold; margin-bottom:.3em'><span style='text-decoration:underline'>#NOM_SITE_SPIP</span></h2><br /><h1 style='text-align:center; font-size:90%'>Lo sentimos<br />Ha habido un problema y no se ha podido enviar el correo :-(</h1></font></center></div>";
+}
+
+// Borro las direcciones de destino establecidas anteriormente
+    	$mail->ClearAddresses();
+
+?>
+
+<div style="text-align:center; font-size:90%">
+<br />
+<input type="button"  class="spip_bouton" value="Cerrar" onclick="window.close();">
+</div>
+
+<?php
+}
+}
+?> 
+
+<div style="display:none">
+[(#FORMULAIRE_ADMIN)]
+</div>
+
+</body>
+</html>
+</BOUCLE_enviar_breve>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/class.phpmailer.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/class.phpmailer.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/class.phpmailer.php	(revision 30)
@@ -0,0 +1,1499 @@
+<?php
+////////////////////////////////////////////////////
+// PHPMailer - PHP email class
+//
+// Class for sending email using either
+// sendmail, PHP mail(), or SMTP.  Methods are
+// based upon the standard AspEmail(tm) classes.
+//
+// Copyright (C) 2001 - 2003  Brent R. Matzelle
+//
+// License: LGPL, see LICENSE
+////////////////////////////////////////////////////
+
+/**
+ * PHPMailer - PHP email transport class
+ * @package PHPMailer
+ * @author Brent R. Matzelle
+ * @copyright 2001 - 2003 Brent R. Matzelle
+ */
+class PHPMailer
+{
+    /////////////////////////////////////////////////
+    // PUBLIC VARIABLES
+    /////////////////////////////////////////////////
+
+    /**
+     * Email priority (1 = High, 3 = Normal, 5 = low).
+     * @var int
+     */
+    var $Priority          = 3;
+
+    /**
+     * Sets the CharSet of the message.
+     * @var string
+     */
+    var $CharSet           = "iso-8859-1";
+
+    /**
+     * Sets the Content-type of the message.
+     * @var string
+     */
+    var $ContentType        = "text/plain";
+
+    /**
+     * Sets the Encoding of the message. Options for this are "8bit",
+     * "7bit", "binary", "base64", and "quoted-printable".
+     * @var string
+     */
+    var $Encoding          = "8bit";
+
+    /**
+     * Holds the most recent mailer error message.
+     * @var string
+     */
+    var $ErrorInfo         = "";
+
+    /**
+     * Sets the From email address for the message.
+     * @var string
+     */
+    var $From               = "root@localhost";
+
+    /**
+     * Sets the From name of the message.
+     * @var string
+     */
+    var $FromName           = "Root User";
+
+    /**
+     * Sets the Sender email (Return-Path) of the message.  If not empty,
+     * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
+     * @var string
+     */
+    var $Sender            = "";
+
+    /**
+     * Sets the Subject of the message.
+     * @var string
+     */
+    var $Subject           = "";
+
+    /**
+     * Sets the Body of the message.  This can be either an HTML or text body.
+     * If HTML then run IsHTML(true).
+     * @var string
+     */
+    var $Body               = "";
+
+    /**
+     * Sets the text-only body of the message.  This automatically sets the
+     * email to multipart/alternative.  This body can be read by mail
+     * clients that do not have HTML email capability such as mutt. Clients
+     * that can read HTML will view the normal Body.
+     * @var string
+     */
+    var $AltBody           = "";
+
+    /**
+     * Sets word wrapping on the body of the message to a given number of 
+     * characters.
+     * @var int
+     */
+    var $WordWrap          = 0;
+
+    /**
+     * Method to send mail: ("mail", "sendmail", or "smtp").
+     * @var string
+     */
+    var $Mailer            = "mail";
+
+    /**
+     * Sets the path of the sendmail program.
+     * @var string
+     */
+    var $Sendmail          = "/usr/sbin/sendmail";
+    
+    /**
+     * Path to PHPMailer plugins.  This is now only useful if the SMTP class 
+     * is in a different directory than the PHP include path.  
+     * @var string
+     */
+    var $PluginDir         = "";
+
+    /**
+     *  Holds PHPMailer version.
+     *  @var string
+     */
+    var $Version           = "1.73";
+
+    /**
+     * Sets the email address that a reading confirmation will be sent.
+     * @var string
+     */
+    var $ConfirmReadingTo  = "";
+
+    /**
+     *  Sets the hostname to use in Message-Id and Received headers
+     *  and as default HELO string. If empty, the value returned
+     *  by SERVER_NAME is used or 'localhost.localdomain'.
+     *  @var string
+     */
+    var $Hostname          = "";
+
+    /////////////////////////////////////////////////
+    // SMTP VARIABLES
+    /////////////////////////////////////////////////
+
+    /**
+     *  Sets the SMTP hosts.  All hosts must be separated by a
+     *  semicolon.  You can also specify a different port
+     *  for each host by using this format: [hostname:port]
+     *  (e.g. "smtp1.example.com:25;smtp2.example.com").
+     *  Hosts will be tried in order.
+     *  @var string
+     */
+    var $Host        = "localhost";
+
+    /**
+     *  Sets the default SMTP server port.
+     *  @var int
+     */
+    var $Port        = 25;
+
+    /**
+     *  Sets the SMTP HELO of the message (Default is $Hostname).
+     *  @var string
+     */
+    var $Helo        = "";
+
+    /**
+     *  Sets SMTP authentication. Utilizes the Username and Password variables.
+     *  @var bool
+     */
+    var $SMTPAuth     = false;
+
+    /**
+     *  Sets SMTP username.
+     *  @var string
+     */
+    var $Username     = "";
+
+    /**
+     *  Sets SMTP password.
+     *  @var string
+     */
+    var $Password     = "";
+
+    /**
+     *  Sets the SMTP server timeout in seconds. This function will not 
+     *  work with the win32 version.
+     *  @var int
+     */
+    var $Timeout      = 10;
+
+    /**
+     *  Sets SMTP class debugging on or off.
+     *  @var bool
+     */
+    var $SMTPDebug    = false;
+
+    /**
+     * Prevents the SMTP connection from being closed after each mail 
+     * sending.  If this is set to true then to close the connection 
+     * requires an explicit call to SmtpClose(). 
+     * @var bool
+     */
+    var $SMTPKeepAlive = false;
+
+    /**#@+
+     * @access private
+     */
+    var $smtp            = NULL;
+    var $to              = array();
+    var $cc              = array();
+    var $bcc             = array();
+    var $ReplyTo         = array();
+    var $attachment      = array();
+    var $CustomHeader    = array();
+    var $message_type    = "";
+    var $boundary        = array();
+    var $language        = array();
+    var $error_count     = 0;
+    var $LE              = "\n";
+    /**#@-*/
+    
+    /////////////////////////////////////////////////
+    // VARIABLE METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Sets message type to HTML.  
+     * @param bool $bool
+     * @return void
+     */
+    function IsHTML($bool) {
+        if($bool == true)
+            $this->ContentType = "text/html";
+        else
+            $this->ContentType = "text/plain";
+    }
+
+    /**
+     * Sets Mailer to send message using SMTP.
+     * @return void
+     */
+    function IsSMTP() {
+        $this->Mailer = "smtp";
+    }
+
+    /**
+     * Sets Mailer to send message using PHP mail() function.
+     * @return void
+     */
+    function IsMail() {
+        $this->Mailer = "mail";
+    }
+
+    /**
+     * Sets Mailer to send message using the $Sendmail program.
+     * @return void
+     */
+    function IsSendmail() {
+        $this->Mailer = "sendmail";
+    }
+
+    /**
+     * Sets Mailer to send message using the qmail MTA. 
+     * @return void
+     */
+    function IsQmail() {
+        $this->Sendmail = "/var/qmail/bin/sendmail";
+        $this->Mailer = "sendmail";
+    }
+
+
+    /////////////////////////////////////////////////
+    // RECIPIENT METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Adds a "To" address.  
+     * @param string $address
+     * @param string $name
+     * @return void
+     */
+    function AddAddress($address, $name = "") {
+        $cur = count($this->to);
+        $this->to[$cur][0] = trim($address);
+        $this->to[$cur][1] = $name;
+    }
+
+    /**
+     * Adds a "Cc" address. Note: this function works
+     * with the SMTP mailer on win32, not with the "mail"
+     * mailer.  
+     * @param string $address
+     * @param string $name
+     * @return void
+    */
+    function AddCC($address, $name = "") {
+        $cur = count($this->cc);
+        $this->cc[$cur][0] = trim($address);
+        $this->cc[$cur][1] = $name;
+    }
+
+    /**
+     * Adds a "Bcc" address. Note: this function works
+     * with the SMTP mailer on win32, not with the "mail"
+     * mailer.  
+     * @param string $address
+     * @param string $name
+     * @return void
+     */
+    function AddBCC($address, $name = "") {
+        $cur = count($this->bcc);
+        $this->bcc[$cur][0] = trim($address);
+        $this->bcc[$cur][1] = $name;
+    }
+
+    /**
+     * Adds a "Reply-to" address.  
+     * @param string $address
+     * @param string $name
+     * @return void
+     */
+    function AddReplyTo($address, $name = "") {
+        $cur = count($this->ReplyTo);
+        $this->ReplyTo[$cur][0] = trim($address);
+        $this->ReplyTo[$cur][1] = $name;
+    }
+
+
+    /////////////////////////////////////////////////
+    // MAIL SENDING METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Creates message and assigns Mailer. If the message is
+     * not sent successfully then it returns false.  Use the ErrorInfo
+     * variable to view description of the error.  
+     * @return bool
+     */
+    function Send() {
+        $header = "";
+        $body = "";
+        $result = true;
+
+        if((count($this->to) + count($this->cc) + count($this->bcc)) < 1)
+        {
+            $this->SetError($this->Lang("provide_address"));
+            return false;
+        }
+
+        // Set whether the message is multipart/alternative
+        if(!empty($this->AltBody))
+            $this->ContentType = "multipart/alternative";
+
+        $this->error_count = 0; // reset errors
+        $this->SetMessageType();
+        $header .= $this->CreateHeader();
+        $body = $this->CreateBody();
+
+        if($body == "") { return false; }
+
+        // Choose the mailer
+        switch($this->Mailer)
+        {
+            case "sendmail":
+                $result = $this->SendmailSend($header, $body);
+                break;
+            case "mail":
+                $result = $this->MailSend($header, $body);
+                break;
+            case "smtp":
+                $result = $this->SmtpSend($header, $body);
+                break;
+            default:
+            $this->SetError($this->Mailer . $this->Lang("mailer_not_supported"));
+                $result = false;
+                break;
+        }
+
+        return $result;
+    }
+    
+    /**
+     * Sends mail using the $Sendmail program.  
+     * @access private
+     * @return bool
+     */
+    function SendmailSend($header, $body) {
+        if ($this->Sender != "")
+            $sendmail = sprintf("%s -oi -f %s -t", $this->Sendmail, $this->Sender);
+        else
+            $sendmail = sprintf("%s -oi -t", $this->Sendmail);
+
+        if(!@$mail = popen($sendmail, "w"))
+        {
+            $this->SetError($this->Lang("execute") . $this->Sendmail);
+            return false;
+        }
+
+        fputs($mail, $header);
+        fputs($mail, $body);
+        
+        $result = pclose($mail) >> 8 & 0xFF;
+        if($result != 0)
+        {
+            $this->SetError($this->Lang("execute") . $this->Sendmail);
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Sends mail using the PHP mail() function.  
+     * @access private
+     * @return bool
+     */
+    function MailSend($header, $body) {
+        $to = "";
+        for($i = 0; $i < count($this->to); $i++)
+        {
+            if($i != 0) { $to .= ", "; }
+            $to .= $this->to[$i][0];
+        }
+
+        if ($this->Sender != "" && strlen(ini_get("safe_mode"))< 1)
+        {
+            $old_from = ini_get("sendmail_from");
+            ini_set("sendmail_from", $this->Sender);
+            $params = sprintf("-oi -f %s", $this->Sender);
+            $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, 
+                        $header, $params);
+        }
+        else
+            $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, $header);
+
+        if (isset($old_from))
+            ini_set("sendmail_from", $old_from);
+
+        if(!$rt)
+        {
+            $this->SetError($this->Lang("instantiate"));
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Sends mail via SMTP using PhpSMTP (Author:
+     * Chris Ryan).  Returns bool.  Returns false if there is a
+     * bad MAIL FROM, RCPT, or DATA input.
+     * @access private
+     * @return bool
+     */
+    function SmtpSend($header, $body) {
+        include_once($this->PluginDir . "class.smtp.php");
+        $error = "";
+        $bad_rcpt = array();
+
+        if(!$this->SmtpConnect())
+            return false;
+
+        $smtp_from = ($this->Sender == "") ? $this->From : $this->Sender;
+        if(!$this->smtp->Mail($smtp_from))
+        {
+            $error = $this->Lang("from_failed") . $smtp_from;
+            $this->SetError($error);
+            $this->smtp->Reset();
+            return false;
+        }
+
+        // Attempt to send attach all recipients
+        for($i = 0; $i < count($this->to); $i++)
+        {
+            if(!$this->smtp->Recipient($this->to[$i][0]))
+                $bad_rcpt[] = $this->to[$i][0];
+        }
+        for($i = 0; $i < count($this->cc); $i++)
+        {
+            if(!$this->smtp->Recipient($this->cc[$i][0]))
+                $bad_rcpt[] = $this->cc[$i][0];
+        }
+        for($i = 0; $i < count($this->bcc); $i++)
+        {
+            if(!$this->smtp->Recipient($this->bcc[$i][0]))
+                $bad_rcpt[] = $this->bcc[$i][0];
+        }
+
+        if(count($bad_rcpt) > 0) // Create error message
+        {
+            for($i = 0; $i < count($bad_rcpt); $i++)
+            {
+                if($i != 0) { $error .= ", "; }
+                $error .= $bad_rcpt[$i];
+            }
+            $error = $this->Lang("recipients_failed") . $error;
+            $this->SetError($error);
+            $this->smtp->Reset();
+            return false;
+        }
+
+        if(!$this->smtp->Data($header . $body))
+        {
+            $this->SetError($this->Lang("data_not_accepted"));
+            $this->smtp->Reset();
+            return false;
+        }
+        if($this->SMTPKeepAlive == true)
+            $this->smtp->Reset();
+        else
+            $this->SmtpClose();
+
+        return true;
+    }
+
+    /**
+     * Initiates a connection to an SMTP server.  Returns false if the 
+     * operation failed.
+     * @access private
+     * @return bool
+     */
+    function SmtpConnect() {
+        if($this->smtp == NULL) { $this->smtp = new SMTP(); }
+
+        $this->smtp->do_debug = $this->SMTPDebug;
+        $hosts = explode(";", $this->Host);
+        $index = 0;
+        $connection = ($this->smtp->Connected()); 
+
+        // Retry while there is no connection
+        while($index < count($hosts) && $connection == false)
+        {
+            if(strstr($hosts[$index], ":"))
+                list($host, $port) = explode(":", $hosts[$index]);
+            else
+            {
+                $host = $hosts[$index];
+                $port = $this->Port;
+            }
+
+            if($this->smtp->Connect($host, $port, $this->Timeout))
+            {
+                if ($this->Helo != '')
+                    $this->smtp->Hello($this->Helo);
+                else
+                    $this->smtp->Hello($this->ServerHostname());
+        
+                if($this->SMTPAuth)
+                {
+                    if(!$this->smtp->Authenticate($this->Username, 
+                                                  $this->Password))
+                    {
+                        $this->SetError($this->Lang("authenticate"));
+                        $this->smtp->Reset();
+                        $connection = false;
+                    }
+                }
+                $connection = true;
+            }
+            $index++;
+        }
+        if(!$connection)
+            $this->SetError($this->Lang("connect_host"));
+
+        return $connection;
+    }
+
+    /**
+     * Closes the active SMTP session if one exists.
+     * @return void
+     */
+    function SmtpClose() {
+        if($this->smtp != NULL)
+        {
+            if($this->smtp->Connected())
+            {
+                $this->smtp->Quit();
+                $this->smtp->Close();
+            }
+        }
+    }
+
+    /**
+     * Sets the language for all class error messages.  Returns false 
+     * if it cannot load the language file.  The default language type
+     * is English.
+     * @param string $lang_type Type of language (e.g. Portuguese: "br")
+     * @param string $lang_path Path to the language file directory
+     * @access public
+     * @return bool
+     */
+    function SetLanguage($lang_type, $lang_path = "language/") {
+        if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php'))
+            include($lang_path.'phpmailer.lang-'.$lang_type.'.php');
+        else if(file_exists($lang_path.'phpmailer.lang-en.php'))
+            include($lang_path.'phpmailer.lang-en.php');
+        else
+        {
+            $this->SetError("Could not load language file");
+            return false;
+        }
+        $this->language = $PHPMAILER_LANG;
+    
+        return true;
+    }
+
+    /////////////////////////////////////////////////
+    // MESSAGE CREATION METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Creates recipient headers.  
+     * @access private
+     * @return string
+     */
+    function AddrAppend($type, $addr) {
+        $addr_str = $type . ": ";
+        $addr_str .= $this->AddrFormat($addr[0]);
+        if(count($addr) > 1)
+        {
+            for($i = 1; $i < count($addr); $i++)
+                $addr_str .= ", " . $this->AddrFormat($addr[$i]);
+        }
+        $addr_str .= $this->LE;
+
+        return $addr_str;
+    }
+    
+    /**
+     * Formats an address correctly. 
+     * @access private
+     * @return string
+     */
+    function AddrFormat($addr) {
+        if(empty($addr[1]))
+            $formatted = $addr[0];
+        else
+        {
+            $formatted = $this->EncodeHeader($addr[1], 'phrase') . " <" . 
+                         $addr[0] . ">";
+        }
+
+        return $formatted;
+    }
+
+    /**
+     * Wraps message for use with mailers that do not
+     * automatically perform wrapping and for quoted-printable.
+     * Original written by philippe.  
+     * @access private
+     * @return string
+     */
+    function WrapText($message, $length, $qp_mode = false) {
+        $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
+
+        $message = $this->FixEOL($message);
+        if (substr($message, -1) == $this->LE)
+            $message = substr($message, 0, -1);
+
+        $line = explode($this->LE, $message);
+        $message = "";
+        for ($i=0 ;$i < count($line); $i++)
+        {
+          $line_part = explode(" ", $line[$i]);
+          $buf = "";
+          for ($e = 0; $e<count($line_part); $e++)
+          {
+              $word = $line_part[$e];
+              if ($qp_mode and (strlen($word) > $length))
+              {
+                $space_left = $length - strlen($buf) - 1;
+                if ($e != 0)
+                {
+                    if ($space_left > 20)
+                    {
+                        $len = $space_left;
+                        if (substr($word, $len - 1, 1) == "=")
+                          $len--;
+                        elseif (substr($word, $len - 2, 1) == "=")
+                          $len -= 2;
+                        $part = substr($word, 0, $len);
+                        $word = substr($word, $len);
+                        $buf .= " " . $part;
+                        $message .= $buf . sprintf("=%s", $this->LE);
+                    }
+                    else
+                    {
+                        $message .= $buf . $soft_break;
+                    }
+                    $buf = "";
+                }
+                while (strlen($word) > 0)
+                {
+                    $len = $length;
+                    if (substr($word, $len - 1, 1) == "=")
+                        $len--;
+                    elseif (substr($word, $len - 2, 1) == "=")
+                        $len -= 2;
+                    $part = substr($word, 0, $len);
+                    $word = substr($word, $len);
+
+                    if (strlen($word) > 0)
+                        $message .= $part . sprintf("=%s", $this->LE);
+                    else
+                        $buf = $part;
+                }
+              }
+              else
+              {
+                $buf_o = $buf;
+                $buf .= ($e == 0) ? $word : (" " . $word); 
+
+                if (strlen($buf) > $length and $buf_o != "")
+                {
+                    $message .= $buf_o . $soft_break;
+                    $buf = $word;
+                }
+              }
+          }
+          $message .= $buf . $this->LE;
+        }
+
+        return $message;
+    }
+    
+    /**
+     * Set the body wrapping.
+     * @access private
+     * @return void
+     */
+    function SetWordWrap() {
+        if($this->WordWrap < 1)
+            return;
+            
+        switch($this->message_type)
+        {
+           case "alt":
+              // fall through
+           case "alt_attachments":
+              $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
+              break;
+           default:
+              $this->Body = $this->WrapText($this->Body, $this->WordWrap);
+              break;
+        }
+    }
+
+    /**
+     * Assembles message header.  
+     * @access private
+     * @return string
+     */
+    function CreateHeader() {
+        $result = "";
+        
+        // Set the boundaries
+        $uniq_id = md5(uniqid(time()));
+        $this->boundary[1] = "b1_" . $uniq_id;
+        $this->boundary[2] = "b2_" . $uniq_id;
+
+        $result .= $this->HeaderLine("Date", $this->RFCDate());
+        if($this->Sender == "")
+            $result .= $this->HeaderLine("Return-Path", trim($this->From));
+        else
+            $result .= $this->HeaderLine("Return-Path", trim($this->Sender));
+        
+        // To be created automatically by mail()
+        if($this->Mailer != "mail")
+        {
+            if(count($this->to) > 0)
+                $result .= $this->AddrAppend("To", $this->to);
+            else if (count($this->cc) == 0)
+                $result .= $this->HeaderLine("To", "undisclosed-recipients:;");
+            if(count($this->cc) > 0)
+                $result .= $this->AddrAppend("Cc", $this->cc);
+        }
+
+        $from = array();
+        $from[0][0] = trim($this->From);
+        $from[0][1] = $this->FromName;
+        $result .= $this->AddrAppend("From", $from); 
+
+        // sendmail and mail() extract Bcc from the header before sending
+        if((($this->Mailer == "sendmail") || ($this->Mailer == "mail")) && (count($this->bcc) > 0))
+            $result .= $this->AddrAppend("Bcc", $this->bcc);
+
+        if(count($this->ReplyTo) > 0)
+            $result .= $this->AddrAppend("Reply-to", $this->ReplyTo);
+
+        // mail() sets the subject itself
+        if($this->Mailer != "mail")
+            $result .= $this->HeaderLine("Subject", $this->EncodeHeader(trim($this->Subject)));
+
+        $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
+        $result .= $this->HeaderLine("X-Priority", $this->Priority);
+        $result .= $this->HeaderLine("X-Mailer", "PHPMailer [version " . $this->Version . "]");
+        
+        if($this->ConfirmReadingTo != "")
+        {
+            $result .= $this->HeaderLine("Disposition-Notification-To", 
+                       "<" . trim($this->ConfirmReadingTo) . ">");
+        }
+
+        // Add custom headers
+        for($index = 0; $index < count($this->CustomHeader); $index++)
+        {
+            $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), 
+                       $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
+        }
+        $result .= $this->HeaderLine("MIME-Version", "1.0");
+
+        switch($this->message_type)
+        {
+            case "plain":
+                $result .= $this->HeaderLine("Content-Transfer-Encoding", $this->Encoding);
+                $result .= sprintf("Content-Type: %s; charset=\"%s\"",
+                                    $this->ContentType, $this->CharSet);
+                break;
+            case "attachments":
+                // fall through
+            case "alt_attachments":
+                if($this->InlineImageExists())
+                {
+                    $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 
+                                    "multipart/related", $this->LE, $this->LE, 
+                                    $this->boundary[1], $this->LE);
+                }
+                else
+                {
+                    $result .= $this->HeaderLine("Content-Type", "multipart/mixed;");
+                    $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
+                }
+                break;
+            case "alt":
+                $result .= $this->HeaderLine("Content-Type", "multipart/alternative;");
+                $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
+                break;
+        }
+
+        if($this->Mailer != "mail")
+            $result .= $this->LE.$this->LE;
+
+        return $result;
+    }
+
+    /**
+     * Assembles the message body.  Returns an empty string on failure.
+     * @access private
+     * @return string
+     */
+    function CreateBody() {
+        $result = "";
+
+        $this->SetWordWrap();
+
+        switch($this->message_type)
+        {
+            case "alt":
+                $result .= $this->GetBoundary($this->boundary[1], "", 
+                                              "text/plain", "");
+                $result .= $this->EncodeString($this->AltBody, $this->Encoding);
+                $result .= $this->LE.$this->LE;
+                $result .= $this->GetBoundary($this->boundary[1], "", 
+                                              "text/html", "");
+                
+                $result .= $this->EncodeString($this->Body, $this->Encoding);
+                $result .= $this->LE.$this->LE;
+    
+                $result .= $this->EndBoundary($this->boundary[1]);
+                break;
+            case "plain":
+                $result .= $this->EncodeString($this->Body, $this->Encoding);
+                break;
+            case "attachments":
+                $result .= $this->GetBoundary($this->boundary[1], "", "", "");
+                $result .= $this->EncodeString($this->Body, $this->Encoding);
+                $result .= $this->LE;
+     
+                $result .= $this->AttachAll();
+                break;
+            case "alt_attachments":
+                $result .= sprintf("--%s%s", $this->boundary[1], $this->LE);
+                $result .= sprintf("Content-Type: %s;%s" .
+                                   "\tboundary=\"%s\"%s",
+                                   "multipart/alternative", $this->LE, 
+                                   $this->boundary[2], $this->LE.$this->LE);
+    
+                // Create text body
+                $result .= $this->GetBoundary($this->boundary[2], "", 
+                                              "text/plain", "") . $this->LE;
+
+                $result .= $this->EncodeString($this->AltBody, $this->Encoding);
+                $result .= $this->LE.$this->LE;
+    
+                // Create the HTML body
+                $result .= $this->GetBoundary($this->boundary[2], "", 
+                                              "text/html", "") . $this->LE;
+    
+                $result .= $this->EncodeString($this->Body, $this->Encoding);
+                $result .= $this->LE.$this->LE;
+
+                $result .= $this->EndBoundary($this->boundary[2]);
+                
+                $result .= $this->AttachAll();
+                break;
+        }
+        if($this->IsError())
+            $result = "";
+
+        return $result;
+    }
+
+    /**
+     * Returns the start of a message boundary.
+     * @access private
+     */
+    function GetBoundary($boundary, $charSet, $contentType, $encoding) {
+        $result = "";
+        if($charSet == "") { $charSet = $this->CharSet; }
+        if($contentType == "") { $contentType = $this->ContentType; }
+        if($encoding == "") { $encoding = $this->Encoding; }
+
+        $result .= $this->TextLine("--" . $boundary);
+        $result .= sprintf("Content-Type: %s; charset = \"%s\"", 
+                            $contentType, $charSet);
+        $result .= $this->LE;
+        $result .= $this->HeaderLine("Content-Transfer-Encoding", $encoding);
+        $result .= $this->LE;
+       
+        return $result;
+    }
+    
+    /**
+     * Returns the end of a message boundary.
+     * @access private
+     */
+    function EndBoundary($boundary) {
+        return $this->LE . "--" . $boundary . "--" . $this->LE; 
+    }
+    
+    /**
+     * Sets the message type.
+     * @access private
+     * @return void
+     */
+    function SetMessageType() {
+        if(count($this->attachment) < 1 && strlen($this->AltBody) < 1)
+            $this->message_type = "plain";
+        else
+        {
+            if(count($this->attachment) > 0)
+                $this->message_type = "attachments";
+            if(strlen($this->AltBody) > 0 && count($this->attachment) < 1)
+                $this->message_type = "alt";
+            if(strlen($this->AltBody) > 0 && count($this->attachment) > 0)
+                $this->message_type = "alt_attachments";
+        }
+    }
+
+    /**
+     * Returns a formatted header line.
+     * @access private
+     * @return string
+     */
+    function HeaderLine($name, $value) {
+        return $name . ": " . $value . $this->LE;
+    }
+
+    /**
+     * Returns a formatted mail line.
+     * @access private
+     * @return string
+     */
+    function TextLine($value) {
+        return $value . $this->LE;
+    }
+
+    /////////////////////////////////////////////////
+    // ATTACHMENT METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Adds an attachment from a path on the filesystem.
+     * Returns false if the file could not be found
+     * or accessed.
+     * @param string $path Path to the attachment.
+     * @param string $name Overrides the attachment name.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File extension (MIME) type.
+     * @return bool
+     */
+    function AddAttachment($path, $name = "", $encoding = "base64", 
+                           $type = "application/octet-stream") {
+        if(!@is_file($path))
+        {
+            $this->SetError($this->Lang("file_access") . $path);
+            return false;
+        }
+
+        $filename = basename($path);
+        if($name == "")
+            $name = $filename;
+
+        $cur = count($this->attachment);
+        $this->attachment[$cur][0] = $path;
+        $this->attachment[$cur][1] = $filename;
+        $this->attachment[$cur][2] = $name;
+        $this->attachment[$cur][3] = $encoding;
+        $this->attachment[$cur][4] = $type;
+        $this->attachment[$cur][5] = false; // isStringAttachment
+        $this->attachment[$cur][6] = "attachment";
+        $this->attachment[$cur][7] = 0;
+
+        return true;
+    }
+
+    /**
+     * Attaches all fs, string, and binary attachments to the message.
+     * Returns an empty string on failure.
+     * @access private
+     * @return string
+     */
+    function AttachAll() {
+        // Return text of body
+        $mime = array();
+
+        // Add all attachments
+        for($i = 0; $i < count($this->attachment); $i++)
+        {
+            // Check for string attachment
+            $bString = $this->attachment[$i][5];
+            if ($bString)
+                $string = $this->attachment[$i][0];
+            else
+                $path = $this->attachment[$i][0];
+
+            $filename    = $this->attachment[$i][1];
+            $name        = $this->attachment[$i][2];
+            $encoding    = $this->attachment[$i][3];
+            $type        = $this->attachment[$i][4];
+            $disposition = $this->attachment[$i][6];
+            $cid         = $this->attachment[$i][7];
+            
+            $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
+            $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $this->LE);
+            $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
+
+            if($disposition == "inline")
+                $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
+
+            $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", 
+                              $disposition, $name, $this->LE.$this->LE);
+
+            // Encode as string attachment
+            if($bString)
+            {
+                $mime[] = $this->EncodeString($string, $encoding);
+                if($this->IsError()) { return ""; }
+                $mime[] = $this->LE.$this->LE;
+            }
+            else
+            {
+                $mime[] = $this->EncodeFile($path, $encoding);                
+                if($this->IsError()) { return ""; }
+                $mime[] = $this->LE.$this->LE;
+            }
+        }
+
+        $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE);
+
+        return join("", $mime);
+    }
+    
+    /**
+     * Encodes attachment in requested format.  Returns an
+     * empty string on failure.
+     * @access private
+     * @return string
+     */
+    function EncodeFile ($path, $encoding = "base64") {
+        if(!@$fd = fopen($path, "rb"))
+        {
+            $this->SetError($this->Lang("file_open") . $path);
+            return "";
+        }
+        $magic_quotes = get_magic_quotes_runtime();
+        set_magic_quotes_runtime(0);
+        $file_buffer = fread($fd, filesize($path));
+        $file_buffer = $this->EncodeString($file_buffer, $encoding);
+        fclose($fd);
+        set_magic_quotes_runtime($magic_quotes);
+
+        return $file_buffer;
+    }
+
+    /**
+     * Encodes string to requested format. Returns an
+     * empty string on failure.
+     * @access private
+     * @return string
+     */
+    function EncodeString ($str, $encoding = "base64") {
+        $encoded = "";
+        switch(strtolower($encoding)) {
+          case "base64":
+              // chunk_split is found in PHP >= 3.0.6
+              $encoded = chunk_split(base64_encode($str), 76, $this->LE);
+              break;
+          case "7bit":
+          case "8bit":
+              $encoded = $this->FixEOL($str);
+              if (substr($encoded, -(strlen($this->LE))) != $this->LE)
+                $encoded .= $this->LE;
+              break;
+          case "binary":
+              $encoded = $str;
+              break;
+          case "quoted-printable":
+              $encoded = $this->EncodeQP($str);
+              break;
+          default:
+              $this->SetError($this->Lang("encoding") . $encoding);
+              break;
+        }
+        return $encoded;
+    }
+
+    /**
+     * Encode a header string to best of Q, B, quoted or none.  
+     * @access private
+     * @return string
+     */
+    function EncodeHeader ($str, $position = 'text') {
+      $x = 0;
+      
+      switch (strtolower($position)) {
+        case 'phrase':
+          if (!preg_match('/[\200-\377]/', $str)) {
+            // Can't use addslashes as we don't know what value has magic_quotes_sybase.
+            $encoded = addcslashes($str, "\0..\37\177\\\"");
+
+            if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str))
+              return ($encoded);
+            else
+              return ("\"$encoded\"");
+          }
+          $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
+          break;
+        case 'comment':
+          $x = preg_match_all('/[()"]/', $str, $matches);
+          // Fall-through
+        case 'text':
+        default:
+          $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
+          break;
+      }
+
+      if ($x == 0)
+        return ($str);
+
+      $maxlen = 75 - 7 - strlen($this->CharSet);
+      // Try to select the encoding which should produce the shortest output
+      if (strlen($str)/3 < $x) {
+        $encoding = 'B';
+        $encoded = base64_encode($str);
+        $maxlen -= $maxlen % 4;
+        $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
+      } else {
+        $encoding = 'Q';
+        $encoded = $this->EncodeQ($str, $position);
+        $encoded = $this->WrapText($encoded, $maxlen, true);
+        $encoded = str_replace("=".$this->LE, "\n", trim($encoded));
+      }
+
+      $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);
+      $encoded = trim(str_replace("\n", $this->LE, $encoded));
+      
+      return $encoded;
+    }
+    
+    /**
+     * Encode string to quoted-printable.  
+     * @access private
+     * @return string
+     */
+    function EncodeQP ($str) {
+        $encoded = $this->FixEOL($str);
+        if (substr($encoded, -(strlen($this->LE))) != $this->LE)
+            $encoded .= $this->LE;
+
+        // Replace every high ascii, control and = characters
+        $encoded = preg_replace('/([\000-\010\013\014\016-\037\075\177-\377])/e',
+                  "'='.sprintf('%02X', ord('\\1'))", $encoded);
+        // Replace every spaces and tabs when it's the last character on a line
+        $encoded = preg_replace("/([\011\040])".$this->LE."/e",
+                  "'='.sprintf('%02X', ord('\\1')).'".$this->LE."'", $encoded);
+
+        // Maximum line length of 76 characters before CRLF (74 + space + '=')
+        $encoded = $this->WrapText($encoded, 74, true);
+
+        return $encoded;
+    }
+
+    /**
+     * Encode string to q encoding.  
+     * @access private
+     * @return string
+     */
+    function EncodeQ ($str, $position = "text") {
+        // There should not be any EOL in the string
+        $encoded = preg_replace("[\r\n]", "", $str);
+
+        switch (strtolower($position)) {
+          case "phrase":
+            $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
+            break;
+          case "comment":
+            $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
+          case "text":
+          default:
+            // Replace every high ascii, control =, ? and _ characters
+            $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',
+                  "'='.sprintf('%02X', ord('\\1'))", $encoded);
+            break;
+        }
+        
+        // Replace every spaces to _ (more readable than =20)
+        $encoded = str_replace(" ", "_", $encoded);
+
+        return $encoded;
+    }
+
+    /**
+     * Adds a string or binary attachment (non-filesystem) to the list.
+     * This method can be used to attach ascii or binary data,
+     * such as a BLOB record from a database.
+     * @param string $string String attachment data.
+     * @param string $filename Name of the attachment.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File extension (MIME) type.
+     * @return void
+     */
+    function AddStringAttachment($string, $filename, $encoding = "base64", 
+                                 $type = "application/octet-stream") {
+        // Append to $attachment array
+        $cur = count($this->attachment);
+        $this->attachment[$cur][0] = $string;
+        $this->attachment[$cur][1] = $filename;
+        $this->attachment[$cur][2] = $filename;
+        $this->attachment[$cur][3] = $encoding;
+        $this->attachment[$cur][4] = $type;
+        $this->attachment[$cur][5] = true; // isString
+        $this->attachment[$cur][6] = "attachment";
+        $this->attachment[$cur][7] = 0;
+    }
+    
+    /**
+     * Adds an embedded attachment.  This can include images, sounds, and 
+     * just about any other document.  Make sure to set the $type to an 
+     * image type.  For JPEG images use "image/jpeg" and for GIF images 
+     * use "image/gif".
+     * @param string $path Path to the attachment.
+     * @param string $cid Content ID of the attachment.  Use this to identify 
+     *        the Id for accessing the image in an HTML form.
+     * @param string $name Overrides the attachment name.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File extension (MIME) type.  
+     * @return bool
+     */
+    function AddEmbeddedImage($path, $cid, $name = "", $encoding = "base64", 
+                              $type = "application/octet-stream") {
+    
+        if(!@is_file($path))
+        {
+            $this->SetError($this->Lang("file_access") . $path);
+            return false;
+        }
+
+        $filename = basename($path);
+        if($name == "")
+            $name = $filename;
+
+        // Append to $attachment array
+        $cur = count($this->attachment);
+        $this->attachment[$cur][0] = $path;
+        $this->attachment[$cur][1] = $filename;
+        $this->attachment[$cur][2] = $name;
+        $this->attachment[$cur][3] = $encoding;
+        $this->attachment[$cur][4] = $type;
+        $this->attachment[$cur][5] = false; // isStringAttachment
+        $this->attachment[$cur][6] = "inline";
+        $this->attachment[$cur][7] = $cid;
+    
+        return true;
+    }
+    
+    /**
+     * Returns true if an inline attachment is present.
+     * @access private
+     * @return bool
+     */
+    function InlineImageExists() {
+        $result = false;
+        for($i = 0; $i < count($this->attachment); $i++)
+        {
+            if($this->attachment[$i][6] == "inline")
+            {
+                $result = true;
+                break;
+            }
+        }
+        
+        return $result;
+    }
+
+    /////////////////////////////////////////////////
+    // MESSAGE RESET METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Clears all recipients assigned in the TO array.  Returns void.
+     * @return void
+     */
+    function ClearAddresses() {
+        $this->to = array();
+    }
+
+    /**
+     * Clears all recipients assigned in the CC array.  Returns void.
+     * @return void
+     */
+    function ClearCCs() {
+        $this->cc = array();
+    }
+
+    /**
+     * Clears all recipients assigned in the BCC array.  Returns void.
+     * @return void
+     */
+    function ClearBCCs() {
+        $this->bcc = array();
+    }
+
+    /**
+     * Clears all recipients assigned in the ReplyTo array.  Returns void.
+     * @return void
+     */
+    function ClearReplyTos() {
+        $this->ReplyTo = array();
+    }
+
+    /**
+     * Clears all recipients assigned in the TO, CC and BCC
+     * array.  Returns void.
+     * @return void
+     */
+    function ClearAllRecipients() {
+        $this->to = array();
+        $this->cc = array();
+        $this->bcc = array();
+    }
+
+    /**
+     * Clears all previously set filesystem, string, and binary
+     * attachments.  Returns void.
+     * @return void
+     */
+    function ClearAttachments() {
+        $this->attachment = array();
+    }
+
+    /**
+     * Clears all custom headers.  Returns void.
+     * @return void
+     */
+    function ClearCustomHeaders() {
+        $this->CustomHeader = array();
+    }
+
+
+    /////////////////////////////////////////////////
+    // MISCELLANEOUS METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Adds the error message to the error container.
+     * Returns void.
+     * @access private
+     * @return void
+     */
+    function SetError($msg) {
+        $this->error_count++;
+        $this->ErrorInfo = $msg;
+    }
+
+    /**
+     * Returns the proper RFC 822 formatted date. 
+     * @access private
+     * @return string
+     */
+    function RFCDate() {
+        $tz = date("Z");
+        $tzs = ($tz < 0) ? "-" : "+";
+        $tz = abs($tz);
+        $tz = ($tz/3600)*100 + ($tz%3600)/60;
+        $result = sprintf("%s %s%04d", date("D, j M Y H:i:s"), $tzs, $tz);
+
+        return $result;
+    }
+    
+    /**
+     * Returns the appropriate server variable.  Should work with both 
+     * PHP 4.1.0+ as well as older versions.  Returns an empty string 
+     * if nothing is found.
+     * @access private
+     * @return mixed
+     */
+    function ServerVar($varName) {
+        global $HTTP_SERVER_VARS;
+        global $HTTP_ENV_VARS;
+
+        if(!isset($_SERVER))
+        {
+            $_SERVER = $HTTP_SERVER_VARS;
+            if(!isset($_SERVER["REMOTE_ADDR"]))
+                $_SERVER = $HTTP_ENV_VARS; // must be Apache
+        }
+        
+        if(isset($_SERVER[$varName]))
+            return $_SERVER[$varName];
+        else
+            return "";
+    }
+
+    /**
+     * Returns the server hostname or 'localhost.localdomain' if unknown.
+     * @access private
+     * @return string
+     */
+    function ServerHostname() {
+        if ($this->Hostname != "")
+            $result = $this->Hostname;
+        elseif ($this->ServerVar('SERVER_NAME') != "")
+            $result = $this->ServerVar('SERVER_NAME');
+        else
+            $result = "localhost.localdomain";
+
+        return $result;
+    }
+
+    /**
+     * Returns a message in the appropriate language.
+     * @access private
+     * @return string
+     */
+    function Lang($key) {
+        if(count($this->language) < 1)
+            $this->SetLanguage("en"); // set the default language
+    
+        if(isset($this->language[$key]))
+            return $this->language[$key];
+        else
+            return "Language string failed to load: " . $key;
+    }
+    
+    /**
+     * Returns true if an error occurred.
+     * @return bool
+     */
+    function IsError() {
+        return ($this->error_count > 0);
+    }
+
+    /**
+     * Changes every end of line from CR or LF to CRLF.  
+     * @access private
+     * @return string
+     */
+    function FixEOL($str) {
+        $str = str_replace("\r\n", "\n", $str);
+        $str = str_replace("\r", "\n", $str);
+        $str = str_replace("\n", $this->LE, $str);
+        return $str;
+    }
+
+    /**
+     * Adds a custom header. 
+     * @return void
+     */
+    function AddCustomHeader($custom_header) {
+        $this->CustomHeader[] = explode(":", $custom_header, 2);
+    }
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/class.smtp.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/class.smtp.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/class.smtp.php	(revision 30)
@@ -0,0 +1,1045 @@
+<?php
+////////////////////////////////////////////////////
+// SMTP - PHP SMTP class
+//
+// Version 1.02
+//
+// Define an SMTP class that can be used to connect
+// and communicate with any SMTP server. It implements
+// all the SMTP functions defined in RFC821 except TURN.
+//
+// Author: Chris Ryan
+//
+// License: LGPL, see LICENSE
+////////////////////////////////////////////////////
+
+/**
+ * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP
+ * commands except TURN which will always return a not implemented
+ * error. SMTP also provides some utility methods for sending mail
+ * to an SMTP server.
+ * @package PHPMailer
+ * @author Chris Ryan
+ */
+class SMTP
+{
+    /**
+     *  SMTP server port
+     *  @var int
+     */
+    var $SMTP_PORT = 25;
+    
+    /**
+     *  SMTP reply line ending
+     *  @var string
+     */
+    var $CRLF = "\r\n";
+    
+    /**
+     *  Sets whether debugging is turned on
+     *  @var bool
+     */
+    var $do_debug;       # the level of debug to perform
+
+    /**#@+
+     * @access private
+     */
+    var $smtp_conn;      # the socket to the server
+    var $error;          # error if any on the last call
+    var $helo_rply;      # the reply the server sent to us for HELO
+    /**#@-*/
+
+    /**
+     * Initialize the class so that the data is in a known state.
+     * @access public
+     * @return void
+     */
+    function SMTP() {
+        $this->smtp_conn = 0;
+        $this->error = null;
+        $this->helo_rply = null;
+
+        $this->do_debug = 0;
+    }
+
+    /*************************************************************
+     *                    CONNECTION FUNCTIONS                  *
+     ***********************************************************/
+
+    /**
+     * Connect to the server specified on the port specified.
+     * If the port is not specified use the default SMTP_PORT.
+     * If tval is specified then a connection will try and be
+     * established with the server for that number of seconds.
+     * If tval is not specified the default is 30 seconds to
+     * try on the connection.
+     *
+     * SMTP CODE SUCCESS: 220
+     * SMTP CODE FAILURE: 421
+     * @access public
+     * @return bool
+     */
+    function Connect($host,$port=0,$tval=30) {
+        # set the error val to null so there is no confusion
+        $this->error = null;
+
+        # make sure we are __not__ connected
+        if($this->connected()) {
+            # ok we are connected! what should we do?
+            # for now we will just give an error saying we
+            # are already connected
+            $this->error =
+                array("error" => "Already connected to a server");
+            return false;
+        }
+
+        if(empty($port)) {
+            $port = $this->SMTP_PORT;
+        }
+
+        #connect to the smtp server
+        $this->smtp_conn = fsockopen($host,    # the host of the server
+                                     $port,    # the port to use
+                                     $errno,   # error number if any
+                                     $errstr,  # error message if any
+                                     $tval);   # give up after ? secs
+        # verify we connected properly
+        if(empty($this->smtp_conn)) {
+            $this->error = array("error" => "Failed to connect to server",
+                                 "errno" => $errno,
+                                 "errstr" => $errstr);
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": $errstr ($errno)" . $this->CRLF;
+            }
+            return false;
+        }
+
+        # sometimes the SMTP server takes a little longer to respond
+        # so we will give it a longer timeout for the first read
+        // Windows still does not have support for this timeout function
+        if(substr(PHP_OS, 0, 3) != "WIN")
+           socket_set_timeout($this->smtp_conn, $tval, 0);
+
+        # get any announcement stuff
+        $announce = $this->get_lines();
+
+        # set the timeout  of any socket functions at 1/10 of a second
+        //if(function_exists("socket_set_timeout"))
+        //   socket_set_timeout($this->smtp_conn, 0, 100000);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce;
+        }
+
+        return true;
+    }
+
+    /**
+     * Performs SMTP authentication.  Must be run after running the
+     * Hello() method.  Returns true if successfully authenticated.
+     * @access public
+     * @return bool
+     */
+    function Authenticate($username, $password) {
+        // Start authentication
+        fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($code != 334) {
+            $this->error =
+                array("error" => "AUTH not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        // Send encoded username
+        fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($code != 334) {
+            $this->error =
+                array("error" => "Username not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        // Send encoded password
+        fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($code != 235) {
+            $this->error =
+                array("error" => "Password not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Returns true if connected to a server otherwise false
+     * @access private
+     * @return bool
+     */
+    function Connected() {
+        if(!empty($this->smtp_conn)) {
+            $sock_status = socket_get_status($this->smtp_conn);
+            if($sock_status["eof"]) {
+                # hmm this is an odd situation... the socket is
+                # valid but we aren't connected anymore
+                if($this->do_debug >= 1) {
+                    echo "SMTP -> NOTICE:" . $this->CRLF .
+                         "EOF caught while checking if connected";
+                }
+                $this->Close();
+                return false;
+            }
+            return true; # everything looks good
+        }
+        return false;
+    }
+
+    /**
+     * Closes the socket and cleans up the state of the class.
+     * It is not considered good to use this function without
+     * first trying to use QUIT.
+     * @access public
+     * @return void
+     */
+    function Close() {
+        $this->error = null; # so there is no confusion
+        $this->helo_rply = null;
+        if(!empty($this->smtp_conn)) {
+            # close the connection and cleanup
+            fclose($this->smtp_conn);
+            $this->smtp_conn = 0;
+        }
+    }
+
+
+    /***************************************************************
+     *                        SMTP COMMANDS                       *
+     *************************************************************/
+
+    /**
+     * Issues a data command and sends the msg_data to the server
+     * finializing the mail transaction. $msg_data is the message
+     * that is to be send with the headers. Each header needs to be
+     * on a single line followed by a <CRLF> with the message headers
+     * and the message body being seperated by and additional <CRLF>.
+     *
+     * Implements rfc 821: DATA <CRLF>
+     *
+     * SMTP CODE INTERMEDIATE: 354
+     *     [data]
+     *     <CRLF>.<CRLF>
+     *     SMTP CODE SUCCESS: 250
+     *     SMTP CODE FAILURE: 552,554,451,452
+     * SMTP CODE FAILURE: 451,554
+     * SMTP CODE ERROR  : 500,501,503,421
+     * @access public
+     * @return bool
+     */
+    function Data($msg_data) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Data() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"DATA" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 354) {
+            $this->error =
+                array("error" => "DATA command not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        # the server is ready to accept data!
+        # according to rfc 821 we should not send more than 1000
+        # including the CRLF
+        # characters on a single line so we will break the data up
+        # into lines by \r and/or \n then if needed we will break
+        # each of those into smaller lines to fit within the limit.
+        # in addition we will be looking for lines that start with
+        # a period '.' and append and additional period '.' to that
+        # line. NOTE: this does not count towards are limit.
+
+        # normalize the line breaks so we know the explode works
+        $msg_data = str_replace("\r\n","\n",$msg_data);
+        $msg_data = str_replace("\r","\n",$msg_data);
+        $lines = explode("\n",$msg_data);
+
+        # we need to find a good way to determine is headers are
+        # in the msg_data or if it is a straight msg body
+        # currently I'm assuming rfc 822 definitions of msg headers
+        # and if the first field of the first line (':' sperated)
+        # does not contain a space then it _should_ be a header
+        # and we can process all lines before a blank "" line as
+        # headers.
+        $field = substr($lines[0],0,strpos($lines[0],":"));
+        $in_headers = false;
+        if(!empty($field) && !strstr($field," ")) {
+            $in_headers = true;
+        }
+
+        $max_line_length = 998; # used below; set here for ease in change
+
+        while(list(,$line) = @each($lines)) {
+            $lines_out = null;
+            if($line == "" && $in_headers) {
+                $in_headers = false;
+            }
+            # ok we need to break this line up into several
+            # smaller lines
+            while(strlen($line) > $max_line_length) {
+                $pos = strrpos(substr($line,0,$max_line_length)," ");
+
+                # Patch to fix DOS attack
+                if(!$pos) {
+                    $pos = $max_line_length - 1;
+                }
+
+                $lines_out[] = substr($line,0,$pos);
+                $line = substr($line,$pos + 1);
+                # if we are processing headers we need to
+                # add a LWSP-char to the front of the new line
+                # rfc 822 on long msg headers
+                if($in_headers) {
+                    $line = "\t" . $line;
+                }
+            }
+            $lines_out[] = $line;
+
+            # now send the lines to the server
+            while(list(,$line_out) = @each($lines_out)) {
+                if(strlen($line_out) > 0)
+                {
+                    if(substr($line_out, 0, 1) == ".") {
+                        $line_out = "." . $line_out;
+                    }
+                }
+                fputs($this->smtp_conn,$line_out . $this->CRLF);
+            }
+        }
+
+        # ok all the message data has been sent so lets get this
+        # over with aleady
+        fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "DATA not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Expand takes the name and asks the server to list all the
+     * people who are members of the _list_. Expand will return
+     * back and array of the result or false if an error occurs.
+     * Each value in the array returned has the format of:
+     *     [ <full-name> <sp> ] <path>
+     * The definition of <path> is defined in rfc 821
+     *
+     * Implements rfc 821: EXPN <SP> <string> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE FAILURE: 550
+     * SMTP CODE ERROR  : 500,501,502,504,421
+     * @access public
+     * @return string array
+     */
+    function Expand($name) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Expand() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "EXPN not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        # parse the reply and place in our array to return to user
+        $entries = explode($this->CRLF,$rply);
+        while(list(,$l) = @each($entries)) {
+            $list[] = substr($l,4);
+        }
+
+        return $list;
+    }
+
+    /**
+     * Sends the HELO command to the smtp server.
+     * This makes sure that we and the server are in
+     * the same known state.
+     *
+     * Implements from rfc 821: HELO <SP> <domain> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE ERROR  : 500, 501, 504, 421
+     * @access public
+     * @return bool
+     */
+    function Hello($host="") {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Hello() without being connected");
+            return false;
+        }
+
+        # if a hostname for the HELO wasn't specified determine
+        # a suitable one to send
+        if(empty($host)) {
+            # we need to determine some sort of appopiate default
+            # to send to the server
+            $host = "localhost";
+        }
+
+        // Send extended hello first (RFC 2821)
+        if(!$this->SendHello("EHLO", $host))
+        {
+            if(!$this->SendHello("HELO", $host))
+                return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Sends a HELO/EHLO command.
+     * @access private
+     * @return bool
+     */
+    function SendHello($hello, $host) {
+        fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => $hello . " not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        $this->helo_rply = $rply;
+        
+        return true;
+    }
+
+    /**
+     * Gets help information on the keyword specified. If the keyword
+     * is not specified then returns generic help, ussually contianing
+     * A list of keywords that help is available on. This function
+     * returns the results back to the user. It is up to the user to
+     * handle the returned data. If an error occurs then false is
+     * returned with $this->error set appropiately.
+     *
+     * Implements rfc 821: HELP [ <SP> <string> ] <CRLF>
+     *
+     * SMTP CODE SUCCESS: 211,214
+     * SMTP CODE ERROR  : 500,501,502,504,421
+     * @access public
+     * @return string
+     */
+    function Help($keyword="") {
+        $this->error = null; # to avoid confusion
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Help() without being connected");
+            return false;
+        }
+
+        $extra = "";
+        if(!empty($keyword)) {
+            $extra = " " . $keyword;
+        }
+
+        fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 211 && $code != 214) {
+            $this->error =
+                array("error" => "HELP not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        return $rply;
+    }
+
+    /**
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more Recipient
+     * commands may be called followed by a Data command.
+     *
+     * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE SUCCESS: 552,451,452
+     * SMTP CODE SUCCESS: 500,501,421
+     * @access public
+     * @return bool
+     */
+    function Mail($from) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Mail() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "MAIL not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Sends the command NOOP to the SMTP server.
+     *
+     * Implements from rfc 821: NOOP <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE ERROR  : 500, 421
+     * @access public
+     * @return bool
+     */
+    function Noop() {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Noop() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"NOOP" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "NOOP not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Sends the quit command to the server and then closes the socket
+     * if there is no error or the $close_on_error argument is true.
+     *
+     * Implements from rfc 821: QUIT <CRLF>
+     *
+     * SMTP CODE SUCCESS: 221
+     * SMTP CODE ERROR  : 500
+     * @access public
+     * @return bool
+     */
+    function Quit($close_on_error=true) {
+        $this->error = null; # so there is no confusion
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Quit() without being connected");
+            return false;
+        }
+
+        # send the quit command to the server
+        fputs($this->smtp_conn,"quit" . $this->CRLF);
+
+        # get any good-bye messages
+        $byemsg = $this->get_lines();
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg;
+        }
+
+        $rval = true;
+        $e = null;
+
+        $code = substr($byemsg,0,3);
+        if($code != 221) {
+            # use e as a tmp var cause Close will overwrite $this->error
+            $e = array("error" => "SMTP server rejected quit command",
+                       "smtp_code" => $code,
+                       "smtp_rply" => substr($byemsg,4));
+            $rval = false;
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $e["error"] . ": " .
+                         $byemsg . $this->CRLF;
+            }
+        }
+
+        if(empty($e) || $close_on_error) {
+            $this->Close();
+        }
+
+        return $rval;
+    }
+
+    /**
+     * Sends the command RCPT to the SMTP server with the TO: argument of $to.
+     * Returns true if the recipient was accepted false if it was rejected.
+     *
+     * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250,251
+     * SMTP CODE FAILURE: 550,551,552,553,450,451,452
+     * SMTP CODE ERROR  : 500,501,503,421
+     * @access public
+     * @return bool
+     */
+    function Recipient($to) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Recipient() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250 && $code != 251) {
+            $this->error =
+                array("error" => "RCPT not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Sends the RSET command to abort and transaction that is
+     * currently in progress. Returns true if successful false
+     * otherwise.
+     *
+     * Implements rfc 821: RSET <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE ERROR  : 500,501,504,421
+     * @access public
+     * @return bool
+     */
+    function Reset() {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Reset() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"RSET" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "RSET failed",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more Recipient
+     * commands may be called followed by a Data command. This command
+     * will send the message to the users terminal if they are logged
+     * in.
+     *
+     * Implements rfc 821: SEND <SP> FROM:<reverse-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE SUCCESS: 552,451,452
+     * SMTP CODE SUCCESS: 500,501,502,421
+     * @access public
+     * @return bool
+     */
+    function Send($from) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Send() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "SEND not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more Recipient
+     * commands may be called followed by a Data command. This command
+     * will send the message to the users terminal if they are logged
+     * in and send them an email.
+     *
+     * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE SUCCESS: 552,451,452
+     * SMTP CODE SUCCESS: 500,501,502,421
+     * @access public
+     * @return bool
+     */
+    function SendAndMail($from) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                "error" => "Called SendAndMail() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "SAML not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more Recipient
+     * commands may be called followed by a Data command. This command
+     * will send the message to the users terminal if they are logged
+     * in or mail it to them if they are not.
+     *
+     * Implements rfc 821: SOML <SP> FROM:<reverse-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE SUCCESS: 552,451,452
+     * SMTP CODE SUCCESS: 500,501,502,421
+     * @access public
+     * @return bool
+     */
+    function SendOrMail($from) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                "error" => "Called SendOrMail() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "SOML not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * This is an optional command for SMTP that this class does not
+     * support. This method is here to make the RFC821 Definition
+     * complete for this class and __may__ be implimented in the future
+     *
+     * Implements from rfc 821: TURN <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE FAILURE: 502
+     * SMTP CODE ERROR  : 500, 503
+     * @access public
+     * @return bool
+     */
+    function Turn() {
+        $this->error = array("error" => "This method, TURN, of the SMTP ".
+                                        "is not implemented");
+        if($this->do_debug >= 1) {
+            echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF;
+        }
+        return false;
+    }
+
+    /**
+     * Verifies that the name is recognized by the server.
+     * Returns false if the name could not be verified otherwise
+     * the response from the server is returned.
+     *
+     * Implements rfc 821: VRFY <SP> <string> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250,251
+     * SMTP CODE FAILURE: 550,551,553
+     * SMTP CODE ERROR  : 500,501,502,421
+     * @access public
+     * @return int
+     */
+    function Verify($name) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Verify() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250 && $code != 251) {
+            $this->error =
+                array("error" => "VRFY failed on name '$name'",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return $rply;
+    }
+
+    /*******************************************************************
+     *                       INTERNAL FUNCTIONS                       *
+     ******************************************************************/
+
+    /**
+     * Read in as many lines as possible
+     * either before eof or socket timeout occurs on the operation.
+     * With SMTP we can tell if we have more lines to read if the
+     * 4th character is '-' symbol. If it is a space then we don't
+     * need to read anything else.
+     * @access private
+     * @return string
+     */
+    function get_lines() {
+        $data = "";
+        while($str = fgets($this->smtp_conn,515)) {
+            if($this->do_debug >= 4) {
+                echo "SMTP -> get_lines(): \$data was \"$data\"" .
+                         $this->CRLF;
+                echo "SMTP -> get_lines(): \$str is \"$str\"" .
+                         $this->CRLF;
+            }
+            $data .= $str;
+            if($this->do_debug >= 4) {
+                echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF;
+            }
+            # if the 4th character is a space then we are done reading
+            # so just break the loop
+            if(substr($str,3,1) == " ") { break; }
+        }
+        return $data;
+    }
+
+}
+
+
+ ?>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-ca.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-ca.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-ca.php	(revision 30)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Catalan Version
+ * By Ivan: web AT microstudi DOT com
+ */
+
+$PHPMAILER_LANG = array(); 
+
+$PHPMAILER_LANG["provide_address"] = 'S\'ha de proveir almenys una adreça d\'email com a destinatari.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer no està suportat';
+$PHPMAILER_LANG["execute"] = 'No es pot executar: ';
+$PHPMAILER_LANG["instantiate"] = 'No s\'ha pogut crear una instància de la funció Mail.';
+$PHPMAILER_LANG["authenticate"] = 'Error SMTP: No s\'hapogut autenticar.';
+$PHPMAILER_LANG["from_failed"] = 'La(s) següent(s) adreces de remitent han fallat: ';
+$PHPMAILER_LANG["recipients_failed"] = 'Error SMTP: Els següents destinataris han fallat: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'Error SMTP: Dades no acceptades.';
+$PHPMAILER_LANG["connect_host"] = 'Error SMTP: No es pot connectar al servidor SMTP.';
+$PHPMAILER_LANG["file_access"] = 'No es pot accedir a l\'arxiu: ';
+$PHPMAILER_LANG["file_open"] = 'Error d\'Arxiu: No es pot obrir l\'arxiu: ';
+$PHPMAILER_LANG["encoding"] = 'Codificació desconeguda: ';
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-en.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-en.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-en.php	(revision 30)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * English Version
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'You must provide at least one ' .
+                                     'recipient email address.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer is not supported.';
+$PHPMAILER_LANG["execute"] = 'Could not execute: ';
+$PHPMAILER_LANG["instantiate"] = 'Could not instantiate mail function.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Could not authenticate.';
+$PHPMAILER_LANG["from_failed"] = 'The following From address failed: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: The following ' .
+                                       'recipients failed: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data not accepted.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Could not connect to SMTP host.';
+$PHPMAILER_LANG["file_access"] = 'Could not access file: ';
+$PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: ';
+$PHPMAILER_LANG["encoding"] = 'Unknown encoding: ';
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-es.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-es.php	(revision 30)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Versión en español
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Debe proveer al menos una ' .
+                                     'dirección de email como destinatario.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer no está soportado.';
+$PHPMAILER_LANG["execute"] = 'No puedo ejecutar: ';
+$PHPMAILER_LANG["instantiate"] = 'No pude crear una instancia de la función Mail.';
+$PHPMAILER_LANG["authenticate"] = 'Error SMTP: No se pudo autentificar.';
+$PHPMAILER_LANG["from_failed"] = 'La(s) siguiente(s) direcciones de remitente fallaron: ';
+$PHPMAILER_LANG["recipients_failed"] = 'Error SMTP: Los siguientes ' .
+                                       'destinatarios fallaron: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'Error SMTP: Datos no aceptados.';
+$PHPMAILER_LANG["connect_host"] = 'Error SMTP: No puedo conectar al servidor SMTP.';
+$PHPMAILER_LANG["file_access"] = 'No puedo acceder al archivo: ';
+$PHPMAILER_LANG["file_open"] = 'Error de Archivo: No puede abrir el archivo: ';
+$PHPMAILER_LANG["encoding"] = 'Codificación desconocida: ';
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/phpmailer/language/phpmailer.lang-fr.php	(revision 30)
@@ -0,0 +1,24 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * French Version
+ * bruno@ioda-net.ch 09.08.2003
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Vous devez fournir au moins ' .
+                                     'une adresse de destinataire.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer non supporté.';
+$PHPMAILER_LANG["execute"] = 'Ne peut pas lancer l\'exécution: ';
+$PHPMAILER_LANG["instantiate"] = 'Impossible d\'instancier la fonction mail.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Erreur: Echec de l\'authentification.';
+$PHPMAILER_LANG["from_failed"] = 'L\'adresse From suivante a échoué : ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Erreur: Les destinataires ' .
+                                       'suivants sont en erreur : ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Erreur: Data non acceptée.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Erreur: Impossible de connecter le serveur SMTP .';
+$PHPMAILER_LANG["file_access"] = 'N\'arrive pas à accéder au fichier: ';
+$PHPMAILER_LANG["file_open"] = 'Erreur Fichier: ouverture impossible: ';
+$PHPMAILER_LANG["encoding"] = 'Encodage inconnu: ';
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/enviar_email/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/enviar_email/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/enviar_email/plugin.xml	(revision 30)
@@ -0,0 +1,27 @@
+<plugin>
+	<nom>
+	Enviar email
+	</nom>
+	<auteur>
+joseluis@digital77.com
+_ CopyLeft - 2006
+	</auteur>
+	<version>
+	0.1
+	</version>
+	<etat>
+	test
+	</etat>
+	<description>
+Enviar la referencia al artículo o a la breve por email
+_ Para utilizarla coloca la baliza #ENVIAR_EMAIL** donde quieras que aparezca el enlace (artículos o breves)
+_ Los dos ** asteriscos son importantes, no los olvides.
+	</description>
+	<lien></lien> <!-- URI de documentation -->
+	<fonctions>
+	baliza_enviar_email.php
+	</fonctions>
+	<prefix> 
+	enviar_email
+	</prefix>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/README.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/README.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/README.txt	(revision 30)
@@ -0,0 +1,33 @@
+PLUGIN IMPRIMIR DOCUMENTO PARA SPIP 1.9
+
+A veces una persona que visita nuestra web quiere una copia del contenido de uno de nuestros documentos, artculo o breve, sin cabeceras ni elementos de navegacin de la web. Es lo que se suele conocer como "versin imprimir".
+
+Con este plugin puedes instalar en tu sitio Spip un enlace que cumpla esa funcin.
+
+El plugin "Imprimir documento" para SPIP 1.9 y siguientes crea un enlace que permite imprimir el contenido del artculo o breve sin las cabeceras, mens y dems elementos de la web.
+
+Al cliquear en el enlace aparece una ventana pop-up que visualiza la versin para imprimir y lanza el dilogo de impresin.
+
+INSTALACIîN
+
+- Descomprime el archivo "plugin_imprimir_documento_spip_1_9.zip".
+- Pon la carpeta "imprimir_documento" dentro de la carpeta plugins de tu instalacin de SPIP. Si no existe crea una y llmala "plugins".
+- En el espacio privado cliquea en Configuracin del sitio > Gestin de los plugins.
+- Marca la casilla de Imprimir documento para activarlo.
+- Donde quieras que aparezca (en los esqueletos article.html o breve.html) escribe #IMPRIMIR_DOCUMENTO** (con los dos asteriscos)
+- Hecho
+
+PERSONALIZAR
+
+Para personalizar la tipografa del enlace puedes colocar la baliza #IMPRIMIR_DOCUMENTO** entre <span style="font-size:65%">...</span>, por ejemplo, y en style puedes poner tipo de letra, tamao, color,... o puedes crear una clase en tu hoja de estilos y ponrsela,...
+
+Para modificar el icono del sobre pon el que tu quieras (a poder ser en formato gif) en la carpeta del plugin imprimir_documento, y llmalo "impresora.gif"
+
+Para otras modificaciones abre el archivo baliza_imprimir_documento.php y retoca lo que quieras. Por ejemplo, el Õ700Õ y el Õ470Õ son el ancho y el alto de la ventana que se abre.
+
+Para modificar el esqueleto que se enva modifica imprimir_articulo.html o imprimir_breve.html
+
+==========================================================================
+NOTA: Los esqueletos empleados (imprimir_articulo.html e imprimir_breve.html) son bastante viejos y estara bien reformarlos quitando las tablas y respetando las normas de estilo, pero de momento pueden servir ya que funcinan aceptablemente. T mism@.
+
+CopyLeft 2006 joseluis@digital77.com
Index: /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/baliza_imprimir_documento.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/baliza_imprimir_documento.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/baliza_imprimir_documento.php	(revision 30)
@@ -0,0 +1,51 @@
+<?php
+
+function preparar_enlace_imprimir($arg){
+
+// funcion para ventana pop-up centrada en la pantalla
+$javascript_centrar_imprimir = "<script type=\"text/javascript\">
+	/*
+	Open Centered Popup Window Script-
+	 DHTMLShock (www.dhtmlshock.com)
+	To add more shock to your site, visit www.DHTMLShock.com
+	*/
+	function centrarVentana(theURL,winName,features, myWidth, myHeight, isCenter) { //v3.0
+		if(window.screen)if(isCenter)if(isCenter==\"true\"){
+		var myLeft = (screen.width-myWidth)/2;
+		var myTop = (screen.height-myHeight)/2;
+		features+=(features!='')?',':'';
+		features+=',left='+myLeft+',top='+myTop;
+	}
+	window.open(theURL,winName,features+((features!='')?',':'')+'width='+myWidth+',height='+myHeight);
+	}
+</script>";
+
+// prepara logo
+		$logo = find_in_path('impresora.gif');
+		$url = generer_url_public('',$arg);
+		
+// prepara el enlace completo
+		$enlace = $javascript_centrar_imprimir."<a href=\"javascript:;\" onclick=\"centrarVentana('$url','Imprimir_documento','scrollbars=yes,resizable=yes','700','470','true')\" title=\""._T('imprimirdocumento:version_doc_imprimir')."\" style=\"border:none\"><img src=\"$logo\" style=\"border:none\" alt=\""._T('imprimirdocumento:version_doc_imprimir')."\" /> "._T('imprimirdocumento:version_imprimir')."</a>";
+		return $enlace;
+
+}
+
+// la baliza a llamar como #ENVIAR_EMAIL** (importante los dos asteriscos para que funcione el javascript anterior de centrar la ventan por-up)
+
+function balise_IMPRIMIR_DOCUMENTO($p) {
+
+// numero y enlace al artï¿œulo o breve
+  	$_id_article = champ_sql('id_article', $p);
+	$arg = "'page=imprimir_articulo&amp;id_article='.".$_id_article;
+	$url = generer_url_public('',$arg);
+	if (!$_id_article){
+		$_id_breve = champ_sql('id_breve', $p);
+		$arg = "'page=imprimir_breve&amp;id_breve='.".$_id_breve;
+		$url = generer_url_public('',$arg);
+	}
+   $p->code ="preparar_enlace_imprimir($arg)";
+   $p->statut = 'html';
+   return $p;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/imprimir_articulo.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/imprimir_articulo.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/imprimir_articulo.html	(revision 30)
@@ -0,0 +1,143 @@
+#CACHE{0}
+<BOUCLE_article_principal(ARTICLES) {id_article}>
+<!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>[<:imprimirdocumento:imprimir:> : (#TITRE|supprimer_numero|textebrut)]</title>
+<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+</head>
+
+<body dir="#LANG_DIR" style="background-color:#ffffff; color:black; border:0px; font-family: verdana, arial, helvetica, sans-serif">
+
+<div style="width:600px; margin:auto;">
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-bottom: 2px solid gray; margin-bottom:36px;">
+<tr valign="bottom">
+<td valign="bottom">
+<div style="color:navy; font-size:90%;">#NOM_SITE_SPIP</div>
+</td>
+<td valign="bottom">
+<div style="font-size:68%; color: #999999; text-align:right">#URL_SITE_SPIP/#URL_ARTICLE</div>
+</td></tr></table>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<tr valign="bottom">
+[<td style="padding-right:7px;">(#LOGO_ARTICLE||reduire_image{96,96})</td>]
+
+<td width="100%">
+<div style="border-bottom: 1px solid #999999;">  
+<div style="font-size:120%;">[(#TITRE|supprimer_numero)]</div>
+<i><div style="color:#333333; font-size:85%;">[<b>(#SURTITRE)</b> / ][(#SOUSTITRE)]</div>
+[<span style="color:#666666; font-size:75%;">(#DATE|nom_jour), ][(#DATE|affdate)</span>]</i>
+<span style="color:#666666; font-size:80%;">
+<BOUCLE_auteurs_un(AUTEURS) {id_article} {", "}>
+	[ / <b>(#NOM)</b>][ / (#BIO)]
+</BOUCLE_auteurs_un>
+</span>
+</div>
+</td>
+</tr>
+</table>
+
+<div style="margin-top:18px; margin-bottom:18px; font-size:75%">
+            	[(#CHAPO)]
+            	[(#TEXTE||reduire_image{600,0})]
+                [(#PS)]
+                [(#NOTES)]
+</div>
+<B_galeria>
+<hr />
+<font size="1" face="Verdana, Arial, Helvetica, sans-serif"><b><:imprimirdocumento:otras_imagenes:></b></font>
+
+                <table cellpadding="4">
+                  <tr>
+                    <BOUCLE_galeria(DOCUMENTS){id_article}{mode=image}{doublons} {par titre} {0,5}>
+                    <td align="center" valign="bottom" width="20%"> <font size="1" face="Arial, Helvetica, sans-serif" align="center"><img src="#URL_DOCUMENT" width="20%">[<br>
+            (#TITRE)][<br>
+            (#TYPE_DOCUMENT)][ - (#TAILLE|taille_en_octets)][<br>
+            (#LARGEUR)] x [(#HAUTEUR) p&iacute;xels]</font></td>
+                    </BOUCLE_galeria> 
+                  </tr>
+                  <tr>
+                    <td height="14"></td>
+                  </tr>
+                </table>
+                </B_galeria>
+
+                  <B_galeria3>
+                  <table width="20%" cellpadding="4">
+                  <tr>
+                    <BOUCLE_galeria3(DOCUMENTS){id_article}{mode=image}{doublons} {par titre} {0,5}>
+                    <td align="center" valign="bottom"> <font size="1" face="Arial, Helvetica, sans-serif" align="center"> <img src="#URL_DOCUMENT" width="20%">[<br>
+            (#TITRE)][<br>
+            (#TYPE_DOCUMENT)][ - (#TAILLE|taille_en_octets)][<br>
+            (#LARGEUR)] x [(#HAUTEUR) p&iacute;xels]</font></td>
+                    </BOUCLE_galeria3>
+                  </tr>
+                  <tr>
+                    <td height="14"></td>
+                  </tr>
+                  <BOUCLE_galeria2(BOUCLE_galeria3)>
+                  </BOUCLE_galeria2>
+                  </table>
+                  </B_galeria3>
+
+                <B_documents>
+                <hr />
+                <table width="100%" style="font-size: 70%; color:#333333;">
+				<tr>
+				<td valign="top">
+				<:imprimirdocumento:documentos_descargar:>
+                        </td>
+                     </tr>
+                    <BOUCLE_documents(DOCUMENTS) {id_article} {mode=document} {doublons}>
+                      <tr>
+                        	<td>[&bull; #TITRE, (#TYPE_DOCUMENT - (#TAILLE|taille_en_octets))] </td>
+                       </tr>
+                    </BOUCLE_documents>
+                </table>
+                </B_documents>
+
+              <B_forums>
+<div>
+              <font size="5"><b><:imprimirdocumento:commentaires:></b></font>
+              <ul class="forum-total">
+                <BOUCLE_forums(FORUMS){id_article}{par date}>
+                <li>
+                  <div class="forum-fil"  style="font-size:10pt;"> <b> <br>
+                    </b> <font size="1" face="Arial, Helvetica, sans-serif"> <u> #TITRE, #NOM, <i> [(#DATE|affdate)] </i></u></font>
+                    <div class="forum-item"> #TEXTE
+                        <div class='forum-titre'>#NOM_SITE</div>
+                    </div>
+                    <B_forums_fils>
+                    <ul>
+                      <BOUCLE_forums_fils(FORUMS){id_parent}{par date}>
+                      <br>
+                      <li> <font size="2" face="Arial, Helvetica, sans-serif"> <u>#TITRE, #NOM, <i> [(#DATE|affdate)] </i> </u></font>
+                          <div class="forum-item"> #TEXTE
+                              <div class='forum-titre'>#NOM_SITE</div>
+                          </div>
+                          <BOUCLE_Forums_Boucle(boucle_forums_fils)>
+                          </BOUCLE_Forums_Boucle>
+                      </li>
+                      </BOUCLE_forums_fils>
+                    </ul>
+                    </B_forums_fils>
+                  </div>
+                </li>
+                </BOUCLE_forums>
+              </ul>
+   </div>
+              </B_forums>
+<hr />
+</div>
+
+[<div style="display:none">(#FORMULAIRE_ADMIN)</div>]
+        <script type="text/javascript">
+		window.print();
+	</script>
+
+</body>
+</html>
+</BOUCLE_article_principal>
Index: /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/imprimir_breve.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/imprimir_breve.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/imprimir_breve.html	(revision 30)
@@ -0,0 +1,145 @@
+#CACHE{0}
+<BOUCLE_breve_principal(BREVES) {id_breve}>
+<!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>[<:imprimirdocumento:imprimir:> : (#TITRE|supprimer_numero|textebrut)]</title>
+<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+</head>
+
+<body dir="#LANG_DIR" style="background-color:#ffffff; color:black; border:0px; font-family: verdana, arial, helvetica, sans-serif">
+
+<div style="width:600px; margin:auto;">
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-bottom: 2px solid gray; margin-bottom:36px;">
+<tr valign="bottom">
+<td valign="bottom">
+<div style="color:navy; font-size:90%;">#NOM_SITE_SPIP</div>
+</td>
+<td valign="bottom">
+<div style="font-size:68%; color: #999999; text-align:right">#URL_SITE_SPIP/#URL_BREVE</div>
+</td></tr></table>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<tr valign="bottom">
+[<td style="padding-right:7px;">(#LOGO_BREVE||reduire_image{96,96})</td>]
+
+<td width="100%">
+<div style="border-bottom: 1px solid #999999;">  
+<div style="font-size:120%;">#TITRE</div>
+<i><div style="color:#333333; font-size:85%;">[<b>(#SURTITRE)</b> / ][(#SOUSTITRE)]</div>
+[<span style="color:#666666; font-size:75%;">(#DATE|nom_jour), ][(#DATE|affdate)</span>]</i>
+<span style="color:#666666; font-size:80%;">
+<BOUCLE_auteurs_un(AUTEURS) {id_breve} {", "}>
+	[ / <b>(#NOM)</b>][ / (#BIO)]
+</BOUCLE_auteurs_un>
+</span>
+</div>
+</td>
+</tr>
+</table>
+
+<div style="margin-top:18px; margin-bottom:18px; font-size:75%">
+            	[(#CHAPO)]
+            	[(#TEXTE||reduire_image{600,0})]
+                [(#PS)]
+                [(#NOTES)]
+</div>
+<B_galeria>
+<hr />
+<font size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>OTRAS IM&Aacute;GENES</b></font>
+
+                <table cellpadding="4">
+                  <tr>
+                    <BOUCLE_galeria(DOCUMENTS){id_breve}{mode=image}{doublons} {par titre} {0,5}>
+                    <td align="center" valign="bottom" width="20%"> <font size="1" face="Arial, Helvetica, sans-serif" align="center"><img src="#URL_DOCUMENT" width="20%">[<br>
+            (#TITRE)][<br>
+            (#TYPE_DOCUMENT)][ - (#TAILLE|taille_en_octets)][<br>
+            (#LARGEUR)] x [(#HAUTEUR) p&iacute;xels]</font></td>
+                    </BOUCLE_galeria> 
+                  </tr>
+                  <tr>
+                    <td height="14"></td>
+                  </tr>
+                </table>
+                </B_galeria>
+
+                  <B_galeria3>
+                  <table width="20%" cellpadding="4">
+                  <tr>
+                    <BOUCLE_galeria3(DOCUMENTS){id_breve}{mode=image}{doublons} {par titre} {0,5}>
+                    <td align="center" valign="bottom"> <font size="1" face="Arial, Helvetica, sans-serif" align="center"> <img src="#URL_DOCUMENT" width="20%">[<br>
+            (#TITRE)][<br>
+            (#TYPE_DOCUMENT)][ - (#TAILLE|taille_en_octets)][<br>
+            (#LARGEUR)] x [(#HAUTEUR) p&iacute;xels]</font></td>
+                    </BOUCLE_galeria3>
+                  </tr>
+                  <tr>
+                    <td height="14"></td>
+                  </tr>
+                  <BOUCLE_galeria2(BOUCLE_galeria3)>
+                  </BOUCLE_galeria2>
+                  </table>
+                  </B_galeria3>
+
+                <B_documents>
+                <hr />
+                <table width="100%" style="font-size: 70%; color:#333333;">   
+			<tr>
+			<td valign="top">
+				<:imprimirdocumento:documentos_descargar:>
+			</td>
+			</tr>
+                    <BOUCLE_documents(DOCUMENTS) {id_breve} {mode=document} {doublons}>
+                      <tr>
+                        	<td>[&bull; #TITRE, (#TYPE_DOCUMENT - (#TAILLE|taille_en_octets))] </td>
+                       </tr>
+                    </BOUCLE_documents>
+                </table>
+                </B_documents>
+
+              <B_forums>
+<div>
+              <font size="5"><B>Comentarios:</B></font>
+              <ul class="forum-total">
+                <BOUCLE_forums(FORUMS){id_breve}{par date}>
+                <li>
+                  <div class="forum-fil"  style="font-size:10pt;"> <b> <br>
+                    </b> <font size="1" face="Arial, Helvetica, sans-serif"> <u> #TITRE, #NOM, <i> [(#DATE|affdate)] </i></u></font>
+                    <div class="forum-item"> #TEXTE
+                        <div class='forum-titre'>#NOM_SITE</div>
+                    </div>
+                    <B_forums_fils>
+                    <ul>
+                      <BOUCLE_forums_fils(FORUMS){id_parent}{par date}>
+                      <br>
+                      <li> <font size="2" face="Arial, Helvetica, sans-serif"> <u>#TITRE, #NOM, <i> [(#DATE|affdate)] </i> </u></font>
+                          <div class="forum-item"> #TEXTE
+                              <div class='forum-titre'>#NOM_SITE</div>
+                          </div>
+                          <BOUCLE_Forums_Boucle(boucle_forums_fils)>
+                          </BOUCLE_Forums_Boucle>
+                      </li>
+                      </BOUCLE_forums_fils>
+                    </ul>
+                    </B_forums_fils>
+                  </div>
+                </li>
+                </BOUCLE_forums>
+              </ul>
+   </div>
+              </B_forums>
+<hr />
+</div>
+
+        <script type="text/javascript">
+		window.print();
+</script>
+		
+[<div style="display:none">(#FORMULAIRE_ADMIN)</div>]
+
+
+</body>
+</html>
+</BOUCLE_breve_principal>
Index: /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/lang/imprimirdocumento_es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/lang/imprimirdocumento_es.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/lang/imprimirdocumento_es.php	(revision 30)
@@ -0,0 +1,13 @@
+<?php
+
+	$GLOBALS[$GLOBALS['idx_lang']] = array(
+		'imprimir' => 'Imprimir',
+		'documentos_descargar' => 'Si visitas nuestra web, en este art&iacute;culo encontrar&aacute;s los siguientes documentos para descargar:',
+		'version_doc_imprimir' => 'Versi&oacute;n para imprimir de este documento',
+		'version_imprimir' => 'Versi&oacute;n imprimir',
+		'otras_imagenes' => 'OTRAS IM&Aacute;GENES',
+		'commentaires' => 'Comentarios:',
+		'Z' => 'ZZzZZzzz'
+	);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/lang/imprimirdocumento_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/lang/imprimirdocumento_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/lang/imprimirdocumento_fr.php	(revision 30)
@@ -0,0 +1,13 @@
+<?php
+
+	$GLOBALS[$GLOBALS['idx_lang']] = array(
+		'imprimir' => 'Imprimer',
+		'documentos_descargar' => 'En visitant notre site Internet, vous pourrez tÃ©lÃ©charger ces documents :',
+		'version_doc_imprimir' => 'Version imprimable de cet article',
+		'version_imprimir' => 'Version imprimable',
+		'otras_imagenes' => 'AUTRES IMAGES',
+		'commentaires' => 'Commentaires :',
+		'Z' => 'ZZzZZzzz'
+	);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/imprimir_documento/plugin.xml	(revision 30)
@@ -0,0 +1,31 @@
+<plugin>
+	<nom>
+	<multi>[es]Imprimir documento[fr]Imprimer document</multi>
+	</nom>
+	<auteur>
+joseluis@digital77.com
+_ CopyLeft - 2006
+	</auteur>
+	<version>
+	0.1
+	</version>
+	<etat>
+	test
+	</etat>
+	<description>
+<multi>
+[es]Versi&oacute;n para imprimir art&iacute;culos y breves sin cabeceras, ni mens,...
+_ Para utilizarla coloca la baliza #IMPRIMIR_DOCUMENTO** donde quieras que aparezca el enlace (art&iacute;ulos o breves)
+_ Los dos ** asteriscos son importantes, no los olvides.
+[fr]Plugin pour obtenir une version imprimable des articles et des br&#232;ves...
+_ Pour l'utiliser, il suffit d'ajouter la balise #IMPRIMIR_DOCUMENTO** dans les squelettes sans oublier les deux ast&#233;risques (dans les aricles et br&#232;ves)
+</multi>
+	</description>
+	<lien></lien> <!-- URI de documentation -->
+	<fonctions>
+	baliza_imprimir_documento.php
+	</fonctions>
+	<prefix> 
+	imprimir_documento
+	</prefix>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/action/decompresser_mes_fichiers.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/action/decompresser_mes_fichiers.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/action/decompresser_mes_fichiers.php	(revision 30)
@@ -0,0 +1,42 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function action_decompresser_mes_fichiers($nom_zip=NULL) {
+
+	if (!isset($nom_zip)) {
+		$liste_zip = preg_files('tmp/mes_fichiers_');
+		$fichier_zip = '';
+		$mtime_zip = 0;
+		foreach ($liste_zip as $_fichier) {
+			if (($_mtime = filemtime($_fichier)) > $mtime_zip) {
+				$fichier_zip = $_fichier;
+				$mtime_zip = $_mtime;
+			}
+		}
+		$nom_zip = substr($fichier_zip, strpos($fichier_zip, '/')+1, strlen($fichier_zip)-strpos($fichier_zip, '/'));
+	}
+	
+	define(
+		'_NOM_PAQUET_ZIP',
+		$nom_zip
+	);
+	define(
+		'_URL_PAQUET_ZIP',
+		'./'.$nom_zip
+	);
+	
+	define(
+		'_SPIP_LOADER_SCRIPT',
+		'spip.php?action=decompresser_mes_fichiers'
+	);
+	define(
+		'_SPIP_LOADER_URL_RETOUR',
+		'ecrire/?exec=admin_tech&mes_fichiers=restauration_ok'
+	);
+
+	include_once('spip_loader.php');
+	exit;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/action/mes_fichiers.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/action/mes_fichiers.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/action/mes_fichiers.php	(revision 30)
@@ -0,0 +1,64 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function action_mes_fichiers() {
+
+	//securite
+	if(@function_exists('autoriser')) {
+		if(!autoriser('sauvegarder')) {
+			$paspermis = true;
+		}
+	}
+	//vieille methode pour compatiblite ascendante
+	else {	
+		global $connect_statut;
+		global $connect_toutes_rubriques;
+		if (!($connect_statut == '0minirezo' AND $connect_toutes_rubriques)) {
+			$paspermis = true;
+		}
+	}
+
+	if($paspermis) {
+		include_spip('inc/minipres');
+		echo minipres();
+		exit;
+	}
+	
+	include_spip('inc/pclzip');
+	$mes_options = defined('_FILE_OPTIONS') ? _FILE_OPTIONS : 'ecrire/mes_options.php';
+	$IMG = defined('_DIR_IMG') ? _DIR_IMG: 'IMG/';
+	$tmp_dump = defined('_DIR_DUMP') ? _DIR_DUMP: 'tmp/dump/';
+	$liste = array();
+	if (@is_dir($IMG)) {
+		$liste[] = $IMG;
+	}
+	if (@is_dir('squelettes/')) {
+		$liste[] = 'squelettes/';
+	}
+	if (@is_readable($mes_options)) {
+		$liste[] = $mes_options;
+	}
+	$dump = preg_files($tmp_dump);
+	$fichier_dump = '';
+	$mtime = 0;
+	foreach ($dump as $_fichier_dump) {
+		if (($_mtime = filemtime($_fichier_dump)) > $mtime) {
+			$fichier_dump = $_fichier_dump;
+			$mtime = $_mtime;
+		}
+	}
+	if ($fichier_dump) {
+		$liste[] = $fichier_dump;
+	}
+	spip_log('*** mes_fichiers ***');
+	spip_log($liste);
+	$mes_fichiers = new PclZip(_DIR_TMP . 'mes_fichiers_'.date("Ymd_Hi").'.zip');
+	$erreur = $mes_fichiers->create($liste, PCLZIP_OPT_ADD_PATH, "spip");
+	if ($erreur == 0) {
+		die("Erreur : ".$mes_fichiers->errorInfo(true));
+	}
+	redirige_par_entete(generer_url_ecrire('admin_tech', 'mes_fichier=sauve_ok', true));
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/plugin.xml	(revision 30)
@@ -0,0 +1,21 @@
+<plugin>
+	<nom>mes_fichiers.zip</nom>
+	<version>0.2</version>
+	<etat>stable</etat>
+	<prefix>mes_fichiers</prefix>
+	<description>
+Ce plugin fabrique un fichier d'archives contenant le dernier dump de sauvegarde de la base, le dossier <code>squelettes/</code>, le dossier <code>IMG/</code> et le fichier <code>mes_options.php</code>
+<br />
+Le fichier d'archives est cr&eacute;&eacute; dans <code>tmp/</code> et se nomme <code>mes_fichiers_aaaammjj_hhmm.zip</code>.
+<br /><br />
+Pour cr&eacute;er ou restaurer une copie compl&egrave;te de votre spip:
+<br />
+[Sauvegarder->../spip.php?action=mes_fichiers]<br />
+[Restaurer->../spip.php?action=decompresser_mes_fichiers]
+<br /><br />
+Remarque: La restauration fonctionne par d&eacute;faut sur le fichier d'archives le plus r&eacute;cent.
+	</description>
+	<chemin dir='' />
+	<lien>http://www.spip-contrib.net/Mes-fichiers</lien>
+	<auteur>James &copy; 2007 - Distribu&eacute; sous licence GNU/GPL</auteur>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/svn.revision
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/svn.revision	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/mes_fichiers/svn.revision	(revision 30)
@@ -0,0 +1,15 @@
+<svn_revision><text_version>
+Origine svn://zone.spip.org/spip-zone/_plugins_/_stable_/mes_fichiers le dimanche 12 aoÃ»t 2007, 20:01:42 (UTC+0200)
+Revision: 14223
+Dernier commit 2007-08-04 14:30:47 +0200 (Sat, 04 Aug 2007)
+Voir http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/mes_fichiers
+Archive: http://files.spip.org/spip-zone/mes_fichiers.zip
+</text_version>
+<uri>http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/mes_fichiers</uri>
+<archive>http://files.spip.org/spip-zone/mes_fichiers.zip</archive>
+<origine>svn://zone.spip.org/spip-zone/_plugins_/_stable_/mes_fichiers</origine>
+<date_production>dimanche 12 aoÃ»t 2007, 20:01:42 (UTC+0200)</date_production>
+<revision>14223</revision>
+<commit>2007-08-04 14:30:47 +0200 (Sat, 04 Aug 2007)</commit>
+</svn_revision>
+<archivelist>_plugins_/_stable_/mes_fichiers --revision 14223;mes_fichiers;mes_fichiers</archivelist>
Index: /trunk/spip/esqueleto-redcta/plugins/mis_archivos/action/decompresser_mis_archivos.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/mis_archivos/action/decompresser_mis_archivos.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/mis_archivos/action/decompresser_mis_archivos.php	(revision 30)
@@ -0,0 +1,42 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function action_decompresser_mis_archivos($nom_zip=NULL) {
+
+	if (!isset($nom_zip)) {
+		$liste_zip = preg_files('tmp/mis_archivos_');
+		$fichier_zip = '';
+		$mtime_zip = 0;
+		foreach ($liste_zip as $_fichier) {
+			if (($_mtime = filemtime($_fichier)) > $mtime_zip) {
+				$fichier_zip = $_fichier;
+				$mtime_zip = $_mtime;
+			}
+		}
+		$nom_zip = substr($fichier_zip, strpos($fichier_zip, '/')+1, strlen($fichier_zip)-strpos($fichier_zip, '/'));
+	}
+	
+	define(
+		'_NOM_PAQUET_ZIP',
+		$nom_zip
+	);
+	define(
+		'_URL_PAQUET_ZIP',
+		'./'.$nom_zip
+	);
+	
+	define(
+		'_SPIP_LOADER_SCRIPT',
+		'spip.php?action=decompresser_mis_archivos'
+	);
+	define(
+		'_SPIP_LOADER_URL_RETOUR',
+		'ecrire/?exec=admin_tech&mis_archivos=restauration_ok'
+	);
+
+	include_once('spip_loader.php');
+	exit;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/mis_archivos/action/mis_archivos.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/mis_archivos/action/mis_archivos.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/mis_archivos/action/mis_archivos.php	(revision 30)
@@ -0,0 +1,67 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function action_mis_archivos() {
+
+	//securite
+	if(@function_exists('autoriser')) {
+		if(!autoriser('sauvegarder')) {
+			$paspermis = true;
+		}
+	}
+	//vieille methode pour compatiblite ascendante
+	else {	
+		global $connect_statut;
+		global $connect_toutes_rubriques;
+		if (!($connect_statut == '0minirezo' AND $connect_toutes_rubriques)) {
+			$paspermis = true;
+		}
+	}
+
+	if($paspermis) {
+		include_spip('inc/minipres');
+		echo minipres();
+		exit;
+	}
+	
+	include_spip('inc/pclzip');
+	$mes_options = defined('_FILE_OPTIONS') ? _FILE_OPTIONS : 'ecrire/mes_options.php';
+	$IMG = defined('_DIR_IMG') ? _DIR_IMG: 'IMG/';
+	$tmp_dump = defined('_DIR_DUMP') ? _DIR_DUMP: 'tmp/dump/';
+	$liste = array();
+	if (@is_dir($IMG)) {
+		$liste[] = $IMG;
+	}
+	if (@is_dir('themes/')) {
+		$liste[] = 'themes/';
+	}
+        if (@is_dir('plugins/')) {
+                $liste[] = 'plugins/';
+        }
+	if (@is_readable($mes_options)) {
+		$liste[] = $mes_options;
+	}
+	$dump = preg_files($tmp_dump);
+	$fichier_dump = '';
+	$mtime = 0;
+	foreach ($dump as $_fichier_dump) {
+		if (($_mtime = filemtime($_fichier_dump)) > $mtime) {
+			$fichier_dump = $_fichier_dump;
+			$mtime = $_mtime;
+		}
+	}
+	if ($fichier_dump) {
+		$liste[] = $fichier_dump;
+	}
+	spip_log('*** mis_archivos ***');
+	spip_log($liste);
+	$mis_archivos = new PclZip(_DIR_TMP . 'mis_archivos'.date("Ymd_Hi").'.zip');
+	$erreur = $mis_archivos->create($liste, PCLZIP_OPT_ADD_PATH, "spip");
+	if ($erreur == 0) {
+		die("Erreur : ".$mis_archivos->errorInfo(true));
+	}
+	redirige_par_entete(generer_url_ecrire('admin_tech', 'mis_archivos=sauve_ok', true));
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/mis_archivos/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/mis_archivos/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/mis_archivos/plugin.xml	(revision 30)
@@ -0,0 +1,21 @@
+<plugin>
+	<nom>mis_archivos.zip</nom>
+	<version>0.1</version>
+	<etat>stable</etat>
+	<prefix>mis_archivos</prefix>
+	<description>
+Este plugin arma un archivo que contiene un dump de la base de datos, la carpeta <code>themes</code>, la carpeta <code>IMG/</code> et el archivo <code>mes_options.php</code>
+<br />
+El archivo esta creado en la carpeta <code>tmp/</code> y se llama <code>mis_arch.zip</code>.
+<br /><br />
+Utile para crear una copia de respado o restaurar una copia completa de su spip:
+<br />
+[Sauvegarder->../spip.php?action=mis_archivos]<br />
+[Restaurer->../spip.php?action=decompresser_mis_archivos]
+<br /><br />
+Nota: Lar restauracion funciona sobre el archivo mas recient.
+	</description>
+	<chemin dir='' />
+	<lien>https://svn.redcta.org.ar/proyectos/redcta/trunk/spip/</lien>
+	<auteur>James &copy; 2007 - Distribu&eacute; sous licence GNU/GPL y modificado por Sebastien Grenier</auteur>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/mis_archivos/svn.revision-mes-fichiers
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/mis_archivos/svn.revision-mes-fichiers	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/mis_archivos/svn.revision-mes-fichiers	(revision 30)
@@ -0,0 +1,15 @@
+<svn_revision><text_version>
+Origine svn://zone.spip.org/spip-zone/_plugins_/_stable_/mes_fichiers le dimanche 12 aoÃ»t 2007, 20:01:42 (UTC+0200)
+Revision: 14223
+Dernier commit 2007-08-04 14:30:47 +0200 (Sat, 04 Aug 2007)
+Voir http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/mes_fichiers
+Archive: http://files.spip.org/spip-zone/mes_fichiers.zip
+</text_version>
+<uri>http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/mes_fichiers</uri>
+<archive>http://files.spip.org/spip-zone/mes_fichiers.zip</archive>
+<origine>svn://zone.spip.org/spip-zone/_plugins_/_stable_/mes_fichiers</origine>
+<date_production>dimanche 12 aoÃ»t 2007, 20:01:42 (UTC+0200)</date_production>
+<revision>14223</revision>
+<commit>2007-08-04 14:30:47 +0200 (Sat, 04 Aug 2007)</commit>
+</svn_revision>
+<archivelist>_plugins_/_stable_/mes_fichiers --revision 14223;mes_fichiers;mes_fichiers</archivelist>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/COPYING.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/COPYING.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/COPYING.txt	(revision 30)
@@ -0,0 +1,344 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/DOCUMENTATION.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/DOCUMENTATION.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/DOCUMENTATION.txt	(revision 30)
@@ -0,0 +1,76 @@
+// ----------------------------------------------------------------------------
+// STRUCTURE DOCUMENTATION
+//     
+// The Theme directory structure need to be like this
+// This is only for the public theme
+// 
+// themes/ 
+//      <squelette_dir1>
+//         theme.xml
+//        <files ... >
+//      <squelette_dir2>
+//         theme.xml
+//        <files ... >
+//      <...>
+//      <habillage_dir1>
+//         theme.xml
+//        <files ...>
+//      <habillage_dir2>
+//         theme.xml
+//        <files ...>
+//
+// Theme = Squelette [+ Habillage]
+// Habillage is optional, because default 'habillage' could be in the
+// 'squelette' directory itself (such 'dist').
+//
+// Available 'squelettes' or 'habillage' can be now stored in the same
+// directory but you still have the possibility to have 2 differents 
+// directories
+//
+// ---------------------------------------------------------------------------
+// Habillage
+// theme.xml (use to give a description in the interface and to select it
+//                with <squelettes> name)
+//    <theme>
+// 	<nom>name_of_the_habillage</nom>
+// 	<auteur>
+// 	author of the habillage
+// 	</auteur>
+// 	<version>
+// 	1.0
+// 	</version>
+// 	<etat>
+// 	stable
+// 	</etat>
+// 	<description>
+// 	...
+// 	</description>
+//      <type>themes</type>
+// 	<squelettes>dist</squelettes>
+// 	<squelettes>SarkaSpip</squelettes>
+//    </theme>
+//
+// You can define several dependances <squelettes></squelettes>
+// 
+// ---------------------------------------------------------------------------
+// Squelette
+// theme.xml (use to give description in the interface)
+//
+//    <theme>
+// 	<nom>name_of_the_squelette</nom>
+// 	<auteur>
+// 	author of the squelette
+// 	</auteur>
+// 	<version>
+// 	1.0
+// 	</version>
+// 	<etat>
+// 	stable
+// 	</etat>
+//      <type>squelettes</type>
+// 	<description>
+// 	...
+// 	</description>
+//    </theme>
+//
+// ---------------------------------------------------------------------------
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/TODO.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/TODO.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/TODO.txt	(revision 30)
@@ -0,0 +1,10 @@
+// <b>VOUS POUVEZ AJOUTER DES ELEMENTS A CETTE LISTE</b>
+// <b>TODO</b>: Probablement ajouter des tests pour detecter l'usage de 'dossier_squelettes'.
+// <b>TODO</b>: Telecharger un squelette ou un theme distribue par internet et l'installer.
+// <b>TODO</b>: Afficher les fichiers capture.png si ils existent
+//
+// <b>YOU CAN ADD ITEM TO THIS LIST AS YOU WISH</b>
+// <b>TODO</b>: Probably add some tests to detect the usage of 'dossier_squelettes'.
+// <b>TODO</b>: Download a whole squelette or theme zip distribution trough the net and install it.
+// <b>TODO</b>: Display capture.png files if exist
+
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_config.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_config.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_config.php	(revision 30)
@@ -0,0 +1,161 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/sktheme_util');
+
+function exec_sktheme_config() {
+  
+  global $sktheme_action;
+  global $squelettes_public_dir;
+  global $habillages_public_dir;
+  global $habillage_switcher_style;
+  global $theme_switcher_style;
+  global $switcher_activated;
+  global $switcher_admin_only;
+  
+  debut_page(_T('sktheme:title_config'),'configuration','sktheme_config');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:main_config_title'));
+  echo "<small><a href='?exec=sktheme_public_choice'>Habillages</a> | <a href='?exec=sktheme_doc'>Documentation</a></small><br />";
+  
+  // Include 'onglets'
+  sktheme_config_onglets();
+  
+  debut_gauche();
+  
+  // Include Doc box
+  sktheme_config_doc_box();
+  
+  debut_droite();
+  
+  //
+  // PUBLIC THEMES DIRECTORIES CONFIG
+  //
+  debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:public_themes_config'));
+  
+  // if submit : then save values
+  if ($sktheme_action=="set_dir") {
+    ecrire_meta('sktheme_squelettes_public_dir',$squelettes_public_dir);
+    ecrire_meta('sktheme_habillages_public_dir',$habillages_public_dir);
+    ecrire_metas();
+  }
+  
+  // Set directories
+  echo '<form action="'.generer_url_ecrire("sktheme_config", "sktheme_action=set_dir").'" method="post">';
+  
+  // Set squelettes_public_dir
+  debut_cadre('gris_clair');
+  echo '<strong>'._T('sktheme:squelettes_public_dir').' : </strong><input type="text" name="squelettes_public_dir" size="25" value="'.
+    $GLOBALS['meta']['sktheme_squelettes_public_dir'].'">';
+  fin_cadre('gris_clair');
+  
+  // Set habillages_public_dir
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:habillages_public_dir').' : </strong><input type="text" name="habillages_public_dir" size="25" value="'.
+    $GLOBALS['meta']['sktheme_habillages_public_dir'].'">';
+  fin_cadre_couleur(); 
+  
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_public_directories').'" /></div></div>';
+  echo '</form>';
+ 
+  fin_cadre_trait_couleur();  
+  
+  //
+  // PRIVATE THEMES DIRECTORIES CONFIG
+  //
+  //   debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:private_themes_config'));
+  //   echo '<br />';
+  //   echo _T('sktheme:to_be_done');
+  //   echo '<br />';
+  //   fin_cadre_trait_couleur();  
+  //
+  // SWITCHER OPTIONS
+  //
+  // if submit : save switcher options
+  if ($sktheme_action=="set_switcher") {
+    ecrire_meta('sktheme_theme_switcher_style',$theme_switcher_style);
+    ecrire_meta('sktheme_habillage_switcher_style',$habillage_switcher_style);
+    ecrire_meta('sktheme_switcher_activated',$switcher_activated);
+    ecrire_meta('sktheme_switcher_admin_only',$switcher_admin_only);
+    ecrire_metas();
+  }
+  debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:themes_switcher'));
+  
+  echo '<form action="'.generer_url_ecrire("sktheme_config", "sktheme_action=set_switcher").'" method="post">';
+  
+  // Set sktheme_switcher_activated
+  debut_cadre('gris_clair');
+  echo '<strong>'._T('sktheme:switcher_activated').' : </strong>';
+  echo '<input type="radio" name="switcher_activated"  value="yes" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) AND ($GLOBALS['meta']['sktheme_switcher_activated']=="yes")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:yes');
+  echo '<input type="radio" name="switcher_activated" value="no" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) AND ($GLOBALS['meta']['sktheme_switcher_activated']=="no")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:no');
+  fin_cadre('gris_clair');
+  
+  // Set sktheme_switcher_admin_only
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:switcher_admin_only').' : </strong>';
+  echo '<input type="radio" name="switcher_admin_only"  value="yes" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="yes")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:yes');
+  echo '<input type="radio" name="switcher_admin_only"  value="no" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="no")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:no');
+  fin_cadre_couleur(); 
+  
+  // Set theme_switcher_style
+  debut_cadre('gris_clair');
+  echo '<strong>'._T('sktheme:theme_switcher_style').' : </strong>';
+  echo "<br />";
+  echo '<textarea  cols="50" rows="8" name="theme_switcher_style">';
+  echo $GLOBALS['meta']['sktheme_theme_switcher_style'].'</textarea>';  
+  fin_cadre('gris_clair');
+  
+  // Set habillage_switcher_style
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:habillage_switcher_style').' : </strong>';
+  echo "<br />";
+  echo '<textarea  cols="50" rows="8" name="habillage_switcher_style">';
+  echo $GLOBALS['meta']['sktheme_habillage_switcher_style'].'</textarea>';  
+  fin_cadre_couleur(); 
+  
+    
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_switcher_options').'" /></div></div>';
+  echo '</form>';
+  
+  fin_cadre_trait_couleur();  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_doc.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_doc.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_doc.php	(revision 30)
@@ -0,0 +1,79 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/flock');
+include_spip('inc/sktheme_util');
+
+//
+// Private Area Page definition 
+//
+function exec_sktheme_doc() {
+
+  debut_page(_T('sktheme:extra_documentation'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:extra_documentation'));
+  echo "<small><a href='?exec=sktheme_public_choice'>Habillages</a> | <a href='?exec=sktheme_config'>Configuration</a></small><br />";
+  
+  // Include 'onglets'
+  sktheme_doc_onglets();
+  
+  debut_gauche();
+
+  
+  debut_droite();
+  echo "<br />";
+  // debut_cadre_trait_couleur($icone='', $return = false, $fonction='', $titre=''){
+  debut_cadre_trait_couleur('', false, "sktheme_documentation", _T('sktheme:extra_documentation'));
+  
+  $doc = _DIR_PLUGIN_SKTHEME."/DOCUMENTATION.txt";
+  if (is_file($doc)) {
+    lire_fichier ($doc,$contenu);
+    $contenu = str_replace("<", "&lt;", $contenu);
+    $contenu = str_replace(">", "&gt;", $contenu);
+    $contenu = str_replace(" ", "&nbsp;", $contenu);
+    $contenu = str_replace("//", "<br />", $contenu);
+    echo $contenu;
+  } else {
+    echo _T('sktheme:to_be_done');
+  }
+  fin_cadre_trait_couleur();
+  debut_cadre_trait_couleur('', false, "sktheme_documentation", _T('sktheme:to_be_done'));
+  $todo = _DIR_PLUGIN_SKTHEME."/TODO.txt";
+  if (is_file($todo)) {
+    lire_fichier ($todo,$contenu);
+    $list = split('\/\/',$contenu);
+    foreach ($list as $lign) {
+      echo "$lign<br />";
+    }
+    echo "<br />";
+  } else {
+    echo _T('sktheme:to_be_done');
+  }
+   
+  fin_cadre_trait_couleur();
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_private_choice.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_private_choice.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_private_choice.php	(revision 30)
@@ -0,0 +1,67 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/sktheme_util');
+
+//
+// Private Area Page definition 
+//
+function exec_sktheme_private_choice() {
+
+  debut_page(_T('sktheme:private_theme_choice'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:private_theme_choice'));
+  
+  // Include 'onglets'
+  sktheme_private_choice_onglets();
+  
+  debut_gauche();
+  // Include 'raccourcis'
+  sktheme_raccourcis();
+
+  
+  debut_droite();
+  echo "<br />";
+  // debut_cadre_trait_couleur($icone='', $return = false, $fonction='', $titre=''){
+  debut_cadre_trait_couleur('', false, "sktheme_private_squelette_list", _T('sktheme:available_squelette_list'));
+  
+  echo '<br />';
+  echo _T('sktheme:to_be_done');
+  echo '<br />';
+   
+  fin_cadre_trait_couleur();
+  
+  debut_cadre_trait_couleur('', false, "sktheme_squelette_list", _T('sktheme:available_habillage_list'));
+
+  echo '<br />';
+  echo _T('sktheme:to_be_done');
+  echo '<br />';   
+  
+  fin_cadre_trait_couleur();
+ 
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_public_choice.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_public_choice.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/exec/sktheme_public_choice.php	(revision 30)
@@ -0,0 +1,260 @@
+<?php
+
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');   // for spip presentation functions
+include_spip('inc/layer');          // for spip layer functions
+include_spip('inc/utils');          // for _request function
+include_spip('inc/plugin');         // xml function
+include_spip('inc/sktheme_util');   // for sktheme_* functions
+include_spip('inc/sktheme_xml');    // for sktheme_* functions
+
+
+//
+// Public page choice definition
+//
+function exec_sktheme_public_choice() {
+
+  global $squelette_public_name; // parameter
+  global $habillage_public_name; // parameter
+  
+  // Get the specific action to do if some
+  $sktheme_action = _request('sktheme_action');
+  $original = _T('sktheme:original');
+
+  debut_page(_T('sktheme:public_theme_choice'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:public_theme_choice'));
+  echo "<small><a href='?exec=sktheme_config'>Configuration</a> | <a href='?exec=sktheme_doc'>Documentation</a></small><br />";
+
+  // Include 'onglets'
+  sktheme_public_choice_onglets();
+  
+  debut_gauche();
+
+  // download a squelette distribution
+//  debut_cadre_gris_clair();
+//  echo '<form action="' . generer_url_action("sktheme_install") .'" method="post">';
+//  echo       '<strong>'._T('sktheme:zip_squelette_url').' : </strong>';
+//  echo       '<input type="text" name="zip_url" size="25" value="http://">';
+//  echo       '<input type="hidden" name="zip_type" value="squelette" />';
+//  echo	     '<input type="submit" value="Download" />';
+//  echo	'</form>';
+//  fin_cadre_gris_clair();
+
+  // download a habillage distribution
+// debut_cadre_gris_clair();
+// echo '<form action="' . generer_url_action("sktheme_install") .'" method="post">';
+// echo       '<strong>'._T('sktheme:zip_habillage_url').' : </strong>';
+// echo       '<input type="text" name="zip_url" size="25" value="http://">';
+// echo       '<input type="hidden" name="zip_type" value="habillage" />';
+// echo	     '<input type="submit" value="Download" />';
+// echo	'</form>';
+// fin_cadre_gris_clair();
+
+  // Include 'raccourcis'
+  sktheme_public_theme_doc_box();
+  
+  debut_droite();
+  
+  //
+  // Choose Squelette
+  $s_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_squelettes_public_dir'];
+  debut_cadre_trait_couleur('', false, "sktheme_public_squelette_list",
+			    _T('sktheme:available_squelette_list')." : ".$GLOBALS['meta']['sktheme_squelettes_public_dir']);
+  
+  $squelettes_list = array('dist' => '' );
+  if (is_dir($s_dir)) {
+    if ($dh = opendir($s_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($s_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is squelettes
+	  if (is_file($s_dir."/".$dir."/theme.xml")) {
+	    $s_info = sktheme_xml_get_infos($s_dir."/".$dir,"theme");
+	    $type = (isset($s_info['type'])) ? propre($s_info['type']) : "";
+	    if ($type == 'squelettes') {
+	      $squelettes_list[$dir]=$s_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    }
+  } else {
+      echo _T('sktheme:no_available_squelette');
+  }
+  
+  // Save if needed
+  if ($sktheme_action=="set_squelette") {
+    echo _T('sktheme:update_squelette_to') . $squelette_public_name. "<br />";
+    ecrire_meta('sktheme_squelette_public_name',$squelette_public_name);
+    // Set habillage to the original one when squelette is changed
+    ecrire_meta('sktheme_habillage_public_name',$original);
+    ecrire_metas();
+  } else {
+    $squelette_public_name = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+  	
+  echo '<br />';
+  echo '<form action="'.generer_url_ecrire("sktheme_public_choice", "sktheme_action=set_squelette").'" method="post">';
+  foreach( $squelettes_list as $key => $value) {
+    $s_info = sktheme_xml_get_infos($value,"theme");
+    echo debut_cadre('gris_clair');
+    echo $s_info['extra_img_puce'];
+    if ($squelette_public_name==$key) {
+      echo '<input type="radio" name="squelette_public_name" value="'.$key.'" checked="checked" />';
+      $o_info = $s_info;
+    } else {
+      echo '<input type="radio" name="squelette_public_name" value="'.$key.'" />';
+    }
+    echo bouton_block_invisible("$key");
+    echo "<strong>$key</strong>";
+    echo debut_block_invisible("$key");
+    echo _T('version') .' '.  $s_info['version'] . " | <strong>".$s_info['extra_titre_etat']."</strong><br />";
+    if (isset($s_info['description']))
+      echo "<hr />" . propre($s_info['description']) . "<br />";
+    if (isset($s_info['auteur']))
+      echo "<hr />" . _T('auteur') .' '. propre($s_info['auteur']) . "<br />";
+    if (isset($s_info['lien']))
+      echo "<hr />" . _T('info_url') .' '. propre($s_info['lien']) . "<br />";
+    echo fin_block();
+    echo fin_cadre('gris_clair');
+  }
+  echo '<br />';
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_squelette').'"></div></div>';
+  echo '</form>';
+  
+  
+  fin_cadre_trait_couleur();
+  
+  //
+  // Choose Habillage
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  debut_cadre_trait_couleur('', false, "sktheme_public_habillage_list", 
+			    _T('sktheme:available_habillage_list')." : ".$GLOBALS['meta']['sktheme_habillages_public_dir']);
+  
+  
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is themes
+	  if (is_file($h_dir."/".$dir."/theme.xml")) {
+	    $h_info = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    $type = (isset($h_info['type'])) ? propre($h_info['type']) : "";
+	    if ($type == 'themes') {
+	      $habillages_list[$dir]=$h_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    echo _T('sktheme:no_available_habillage');
+  }
+  
+  // Save habillage if needed
+  if ($sktheme_action=="set_habillage") {
+    echo _T('sktheme:update_habillage_to') . $habillage_public_name . "<br />";
+    ecrire_meta('sktheme_habillage_public_name',$habillage_public_name);
+    ecrire_metas();
+  } else {
+    $habillage_public_name = $GLOBALS['meta']['sktheme_habillage_public_name'];
+  }
+    
+  echo '<br />';
+  echo '<form action="'.generer_url_ecrire("sktheme_public_choice", "sktheme_action=set_habillage").'" method="post">';
+  foreach( $habillages_list as $key => $value) {
+    $h_info = sktheme_xml_get_infos($value,"theme");
+
+    // Check if habillage is available for this squelette selection
+    // probably better way to do it in php (such grep perl function ? but its
+    // works anyway)
+    $squelette_ok = false;
+    if (is_array($h_info['squelettes'])) {
+      foreach ($h_info['squelettes'] as $sq){
+	$sq = trim($sq);
+	if ($sq == $squelette_public_name) {
+	  $squelette_ok = true;
+	}
+      }
+    } else {
+      if ($h_info['squelettes'] == $squelette_public_name) {
+	$squelette_ok = true;
+      }
+    }
+    
+    if (($key == $original)||($squelette_ok)) {
+      echo debut_cadre('gris_clair');
+      if ($key == $original) {
+	echo $o_info['extra_img_puce'];
+      } else {
+	echo $h_info['extra_img_puce'];
+      }
+      if ($habillage_public_name==$key) {
+	echo '<input type=radio  name="habillage_public_name" value="'.$key.'" checked="checked" />';
+      } else {
+	echo '<input type=radio  name="habillage_public_name" value="'.$key.'" />';
+      }
+      echo bouton_block_invisible("$key");
+      if ($key == $original) {
+	echo "<strong><i>$key (".$o_info['nom'].")</i></strong>";
+	echo debut_block_invisible("$key");
+	echo _T('version') .' '.  $o_info['version'] . " | <strong>".$o_info['extra_titre_etat']."</strong><br />";
+	if (isset($o_info['description']))
+	  echo "<hr />" . propre($o_info['description']) . "<br />";
+	if (isset($o_info['auteur']))
+	  echo "<hr />" . _T('auteur') .' '. propre($o_info['auteur']) . "<br />";
+	if (isset($o_info['lien']))
+	  echo "<hr />" . _T('info_url') .' '. propre($o_info['lien']) . "<br />";
+
+      } else {
+	echo "<strong>$key</strong>";
+	echo debut_block_invisible("$key");
+	echo _T('version') .' '.  $h_info['version'] . " | <strong>".$h_info['extra_titre_etat']."</strong><br />";
+	if (isset($h_info['description']))
+	  echo "<hr />" . propre($h_info['description']) . "<br />";
+	if (isset($h_info['auteur']))
+	  echo "<hr />" . _T('auteur') .' '. propre($h_info['auteur']) . "<br />";
+	if (isset($h_info['lien']))
+	  echo "<hr />" . _T('info_url') .' '. propre($h_info['lien']) . "<br />";
+      }
+      echo fin_block();
+      echo fin_cadre('gris_clair');
+    }
+  }
+    
+  echo '<br />';
+  echo '<div><div align="right"><input type="submit" value="'._t('sktheme:save_habillage').'"></div></div>';
+  echo '</form>';
+  
+  fin_cadre_trait_couleur();
+  
+  
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_balises.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_balises.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_balises.php	(revision 30)
@@ -0,0 +1,51 @@
+<?php
+
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+
+include_spip('inc/sktheme_list');
+
+// @param p est un objet SPIP
+function balise_SKTHEME_THEMES_SWITCHER ($p) {
+  $sktheme_list = sktheme_list();
+  $code.='<form action="" method="post">';
+  $code.='<select name="selecteurTheme" style="'.$GLOBALS['meta']['sktheme_theme_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+  $code.='<option selected="selected" value="">'._T('themes').'</option>';
+  foreach( $sktheme_list as $value )	$code.='<option value="'.parametre_url(self(),'var_sktheme',$value).'">&nbsp;-> '.$value.'</option>';
+  $code.='</select>';
+  $code.='</form>';  
+  
+  $p->code = "'$code'";
+  return ($p);
+}
+
+// @param p est un objet SPIP
+function balise_SKTHEME_HABILLAGES_SWITCHER ($p) {
+  $sktheme_habillage_list = sktheme_habillage_list();
+  $code.='<form action="" method="post">';
+  $code.='<select name="selecteurHabillage" style="'.$GLOBALS['meta']['sktheme_habillage_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+  $code.='<option selected="selected" value="">'._T('habillages').'</option>';
+  foreach( $sktheme_habillage_list as $value )	{
+    $code.='<option value="'.parametre_url(self(),'var_sktheme',"__current::".$value).'">&nbsp;-> '.$value.'</option>';
+  }
+  $code.='</select>';
+  $code.='</form>';  
+  $p->code = "'$code'";
+  return ($p);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_list.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_list.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_list.php	(revision 30)
@@ -0,0 +1,159 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+  
+  // Create theme list
+function sktheme_list() {
+    
+  include_spip('inc/sktheme_xml');
+
+  $original = _T('sktheme:original');
+  $sktheme_list = array();
+  
+  $s_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_squelettes_public_dir'];
+  $squelettes_list = array('dist' => '' );
+  if (is_dir($s_dir)) {
+    if ($dh = opendir($s_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($s_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is squelettes
+	  if (is_file($s_dir."/".$dir."/theme.xml")) {
+	    $s_info = sktheme_xml_get_infos($s_dir."/".$dir,"theme");
+	    $type = (isset($s_info['type'])) ? propre($s_info['type']) : "";
+	    if ($type == 'squelettes') {
+	      $squelettes_list[$dir]=$s_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    }
+  } else {
+    // no extra directory for squelette
+    array_push($sktheme_list,"dist::".$original);
+    return $sktheme_list;
+  }
+
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is themes
+	  if (is_file($h_dir."/".$dir."/theme.xml")) {
+	    $h_info = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    $type = (isset($h_info['type'])) ? propre($h_info['type']) : "";
+	    if ($type == 'themes') {
+	      $habillages_list[$dir] = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    // no habillage directory
+    foreach( $squelettes_list as $s_key => $s_value) {
+      array_push($sktheme_list,$s_key."::".$original);
+      return $sktheme_list;
+    }
+  }
+
+  // Look for matching theme
+  foreach( $squelettes_list as $s_key => $s_value) {
+    
+    foreach( $habillages_list as $h_key => $h_info) {
+      if ($h_key == $original) {
+	array_push($sktheme_list,$s_key."::".$h_key);
+      } else {
+	$squelette_ok = false;
+	if (is_array($h_info['squelettes'])) {
+	  foreach ($h_info['squelettes'] as $sq){
+	    $sq = trim($sq);
+	    if ($sq == $s_key) {
+	      $squelette_ok = true;
+	    }
+	  }
+	} else {
+	  if ($h_info['squelettes'] == $s_key) {
+	    $squelette_ok = true;
+	  }
+	}
+	if ($squelette_ok) {
+	  array_push($sktheme_list,$s_key."::".$h_key);
+	}
+      }
+    }
+  }
+  return $sktheme_list;
+}
+
+
+
+function sktheme_habillage_list() {
+    
+  include_spip('inc/sktheme_xml');
+
+  $original = _T('sktheme:original');
+  $sktheme_habillage_list = array();
+  
+  $squelette_name = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($file = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$file)) AND ($file[0]!=".") ) {
+	  $habillages_list[$file] = sktheme_xml_get_infos($h_dir."/".$file,"theme");
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    // no habillage directory
+    array_push($sktheme_habillage_list,$original);
+    return $sktheme_habillage_list;
+  }
+
+  // Look for matching theme
+    
+  foreach( $habillages_list as $h_key => $h_info) {
+    if ($h_key == $original) {
+      array_push($sktheme_habillage_list,$h_key);
+    } else {
+      $squelette_ok = false;
+      if (is_array($h_info['squelettes'])) {
+	foreach ($h_info['squelettes'] as $sq){
+	  $sq = trim($sq);
+	  if ($sq == $squelette_name) {
+	    $squelette_ok = true;
+	  }
+	}
+      } else {
+	if ($h_info['squelettes'] == $squelette_name) {
+	  $squelette_ok = true;
+	}
+      }
+      if ($squelette_ok) {
+	array_push($sktheme_habillage_list,$h_key);
+      }
+    }
+  }
+  return $sktheme_habillage_list;
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_util.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_util.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_util.php	(revision 30)
@@ -0,0 +1,99 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+include_spip('inc/presentation');
+
+// Build 'onglets' for all pages
+function sktheme_public_choice_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_public_choice", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_public_choice", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_public_choice", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_public_choice", "sktheme_doc", "");
+   fin_onglet();
+
+}
+function sktheme_private_choice_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_private_choice", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_private_choice", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_private_choice", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_private_choice", "sktheme_doc", "");
+  fin_onglet();
+
+}
+function sktheme_config_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_config", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_config", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_config", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_config", "sktheme_doc", "");
+  fin_onglet();
+
+}
+function sktheme_doc_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_doc", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_config", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_doc", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_doc", "sktheme_doc", "");
+  fin_onglet();
+
+}
+
+// Build 'raccourcis' for all pages
+function sktheme_raccourcis() {
+
+  debut_raccourcis();
+  
+  
+  fin_raccourcis();
+
+}
+
+// Build documentation
+function sktheme_config_doc_box() {
+  
+  debut_cadre_relief();
+  echo _T('sktheme:config_doc_directories');
+  fin_cadre_relief();
+  debut_cadre_relief();
+  echo _T('sktheme:config_doc_switcher');
+  fin_cadre_relief();
+  
+}
+
+// Build documentation
+function  sktheme_public_theme_doc_box() {
+  debut_cadre_relief();
+  echo _T('sktheme:public_theme_doc_squelette');
+  fin_cadre_relief();
+  debut_cadre_relief();
+  echo _T('sktheme:public_theme_doc_habillage');
+  fin_cadre_relief();
+ 
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_xml.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_xml.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/inc/sktheme_xml.php	(revision 30)
@@ -0,0 +1,173 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function sktheme_xml_get_infos($xml_dir,$xml_type){
+
+  include_spip('inc/plugin'); 
+
+  $ret = array();
+  if ((@file_exists($xml_dir))&&(is_dir($xml_dir))){
+    if (@file_exists($xml_dir."/$xml_type.xml")) {
+      lire_fichier($xml_dir."/$xml_type.xml", $texte);
+      $arbre = parse_plugin_xml($texte);
+      if (!isset($arbre[$xml_type])&&is_array($arbre[$xml_type]))
+	$arbre = array('erreur' => array(_T('erreur_plugin_fichier_def_incorrect')." : $xml_dir/$xml_type.xml"));
+    }
+    else {
+      // pour arriver ici on l'a vraiment cherche...
+      //debug echo "error: erreur_plugin_fichier_def_absent $xml_dir/$xml_type.xml<br>";
+      $arbre = array('erreur' => array(_T('erreur_plugin_fichier_def_absent')." : $xml_dir/$xml_type.xml"));
+    }
+
+    sktheme_xml_verifie_conformite($xml_dir,$xml_type,$arbre);
+		
+    $ret['nom'] = applatit_arbre($arbre['nom']);
+    $ret['version'] = trim(end($arbre['version']));
+    if (isset($arbre['auteur']))
+      $ret['auteur'] = applatit_arbre($arbre['auteur']);
+    if (isset($arbre['description']))
+      $ret['description'] = applatit_arbre($arbre['description']);
+    if (isset($arbre['lien']))
+      $ret['lien'] = join(' ',$arbre['lien']);
+    if (isset($arbre['etat']))
+      $ret['etat'] = trim(end($arbre['etat']));
+    if (isset($arbre['options']))
+      $ret['options'] = $arbre['options'];
+    if (isset($arbre['fonctions']))
+      $ret['fonctions'] = $arbre['fonctions'];
+    $ret['prefix'] = $arbre['prefix'];
+    if (isset($arbre['pipeline']))
+      $ret['pipeline'] = $arbre['pipeline'];
+    if (isset($arbre['erreur']))
+      $ret['erreur'] = $arbre['erreur'];
+    if (isset($arbre['squelettes'])) {
+      $ret['squelettes'] = $arbre['squelettes'];
+    }
+    if (isset($arbre['type'])) {
+      $ret['type'] =  trim(applatit_arbre($arbre['type']));
+    }
+
+    // Compute extra values
+    $etat = 'dev';
+    if (isset($ret['etat']))
+      $etat = $ret['etat'];
+    switch ($etat) {
+    case 'experimental':
+      $puce = 'puce-rouge.gif';
+      $titre_etat = _T('plugin_etat_experimental');
+      break;
+    case 'test':
+      $puce = 'puce-orange.gif';
+      $titre_etat = _T('plugin_etat_test');
+      break;
+    case 'stable':
+      $puce = 'puce-verte.gif';
+      $titre_etat = _T('plugin_etat_stable');
+      break;
+    default:
+      $puce = 'puce-poubelle.gif';
+      $titre_etat = _T('plugin_etat_developpement');
+      break;
+    }
+    $ret['extra_puce']       = $puce;
+    $ret['extra_img_puce']   = "<img src='"._DIR_IMG_PACK."$puce' width='9' height='9' style='border:0;' alt=\"$titre_etat\" title=\"$titre_etat\" />&nbsp;";
+    $ret['extra_titre_etat'] = $titre_etat;
+  }
+  return $ret;
+}
+
+function sktheme_xml_verifie_conformite($xml_dir,$xml_type="plugin",&$arbre){
+	$silence = false;
+	if (isset($arbre[$xml_type])&&is_array($arbre[$xml_type]))
+		$arbre = end($arbre[$xml_type]); // derniere def xml_type
+	else{
+		$arbre = array('erreur' => array(_T('erreur_plugin_tag_plugin_absent')." : $xml_dir/plugin.xml"));
+		$silence = true;
+	}
+  // verification de la conformite du plugin avec quelques
+  // precautions elementaires
+  if (!isset($arbre['nom'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_nom_manquant');
+		$arbre['nom'] = array("");
+	}
+  if (!isset($arbre['version'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_version_manquant');
+		$arbre['version'] = array("");
+	}
+  if (!isset($arbre['prefix'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_prefix_manquant');
+		$arbre['prefix'] = array("");
+	}
+	else{
+		$prefix = "";
+		$prefix = trim(end($arbre['prefix']));
+		if (isset($arbre['etat'])){
+			$etat = trim(end($arbre['etat']));
+			if (!preg_match(',^(dev|experimental|test|stable)$,',$etat))
+				$arbre['erreur'][] = _T('erreur_plugin_etat_inconnu')." : $etat";
+		}
+		if (isset($arbre['options'])){
+			foreach($arbre['options'] as $optfile){
+				$optfile = trim($optfile);
+				if (!@is_readable(_DIR_PLUGINS."$xml_dir/$optfile"))
+  				if (!$silence)
+						$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile";
+			}
+		}
+		if (isset($arbre['fonctions'])){
+			foreach($arbre['fonctions'] as $optfile){
+				$optfile = trim($optfile);
+				if (!@is_readable(_DIR_PLUGINS."$xml_dir/$optfile"))
+  				if (!$silence)
+						$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile";
+			}
+		}
+		$fonctions = array();
+		if (isset($arbre['fonctions']))
+			$fonctions = $arbres['fonctions'];
+	  $liste_methodes_reservees = array('__construct','__destruct','plugin','install','uninstall',strtolower($prefix));
+		if (is_array($arbre['pipeline'])){
+			foreach($arbre['pipeline'] as $pipe){
+				$nom = trim(end($pipe['nom']));
+				if (isset($pipe['action']))
+					$action = trim(end($pipe['action']));
+				else
+					$action = $nom;
+				// verif que la methode a un nom autorise
+				if (in_array(strtolower($action),$liste_methodes_reservees)){
+					if (!$silence)
+						$arbre['erreur'][] = _T("erreur_plugin_nom_fonction_interdit")." : $action";
+				}
+				else{
+					// verif que le fichier de def est bien present
+					if (isset($pipe['inclure'])){
+						$inclure = _DIR_PLUGINS."$xml_dir/".end($pipe['inclure']);
+						if (!@is_readable($inclure))
+		  				if (!$silence)
+								$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $inclure";
+					}
+				}
+			}
+		}
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_en.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_en.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_en.php	(revision 30)
@@ -0,0 +1,138 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Available habillages",
+	  "available_squelette_list" => "Available squelettes",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Advanced configuration",
+	  "config_doc_directories" => "<b>R&eacute;pertoires</b>:<br>
+	  It is possible to re-defined default directories locations of yours
+	  <i>squelettes/habillages</i> distributions.Default is  the <i>'themes'</i>
+	   directory, directories are always relatives to
+	  your SPIP root site.
+	  ",
+	  "config_doc_switcher" => "<b>Switcher</b>:<br>
+	  The theme switcher can be activated to include a selection list in the
+	  public area, and then easily test themes. It is possible to limit this
+	  functionnality to the administrator only.<br>
+	  Moreover you can modify the style of this theme selector.<br>
+	  <br>
+	  A new 'balise' <b>#SKTHEME_HABILLAGES_SWITCHER</b> is available to
+	  include an 'habillage' selector list in your squelette. This list is
+	  composed of all available 'habillage' corresponding to the squelette
+	  distribution you have choosen. You can as well modify this
+	  list selector style here.
+	  
+	  
+	  ",
+	  
+	  // D
+	  "documentation" => "Documentation",
+	  "extra_documentation" => "Extra Documentation",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "Public habillages directory",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuration",
+	  "manage_theme" => "Manage themes",
+
+	  // N
+	  "no" => "No",
+	  "no_available_habillage" => "No available habillage",
+	  "no_available_squelette" => "No available squelette",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Private theme choice",
+	  "private_themes_config" => "Private themes configuration",
+	  "private_theme_choice" => "Private theme choice",
+	  "public_choice" => "Public theme choice",
+	  "public_theme_choice" => "Public theme choice",
+	  "public_themes_config" => "Public themes configuration",
+	  "public_theme_doc_squelette" => "<b>Squelette choice:</b><br>
+	  Each time you will choose a 'squelette' (more exactly a squelettes distribution)
+	  the 'habillage' list will be updated with the available ones.
+	  The small square represent the state of the distribution, stable,
+	  test, experimental, ...<br>
+	  Clic on the small black triangle to get more details about the distribution.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Habillage choice:</b><br>
+	  An Habillage is modifing colors and graphical aspect of your squelettes.
+	  It is composed of CSS, pictures, ...<br>
+	  A squelette distribution always contain a default 'habillage' which is
+	  called <b>Original</b>.  
+	  ",
+	  
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Save habillage",
+	  "save_public_directories" => "Save directories",
+	  "save_squelette" => "Save squelette",
+	  "save_switcher_options" => "Save switcher options",
+	  "squelettes_public_dir" => "Public squelettes directory",
+	  "switcher_activated" => "Theme switcher activated",
+	  "switcher_admin_only" => "Only for administrators",
+	  "switcher_style" => "Switcher style",
+
+	  // T
+	  "to_be_done" => "To be done !",
+	  "themes_switcher" => "Theme switch",
+
+	  // U
+	  "update_habillage_to" => "Update habillage to : ",
+	  "update_squelette_to" => "Update squelette to : ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "Yes",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_es.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_es.php	(revision 30)
@@ -0,0 +1,131 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Lista de pieles disponibles",
+	  "available_squelette_list" => "Lista de esqueletos disponibles",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Configuraci&oacute;n avanzada",
+	  "config_doc_directories" => "<b>Carpetas</b>:<br /> 
+	  Es posible redefinir las carpetas de almacenaje de tus <i>'esqueletos'</i> 
+	  y de tus <i>'pieles'</i>, por omisi&oacute;n est&aacute;n en la carpeta 
+	  <i>'themes'</i>. Estas carpetas siempre son relativas a la ra&iacute;z detu sitio SPIP.
+	  ",
+	  "config_doc_switcher" => "<b>Alternador</b>:<br />
+	  Le 'alternador' (o 'switcher' de temas permite hacer aparecer una lista de selecci&oacute;n
+	  de temas en el espacio p&uacute;blico y as&iacute; probar los diferentes temas m&aacute;s 
+	  r&aacute;pidamente. Es posible limitar esta posibilidad s&oacute;lo a los administradores.<br />
+	  Adicionalmente, puedes cambiar aqu&iacute; el estilo de tiuselector de temas. 
+	  <br />
+	  <br />
+	  TambiÃ©n existe una baliza<br /> <b><small>#SKTHEME_HABILLAGES_SWITCHER</small></b><br />
+	  que es posible integrar a los esqueletos para disponer, esta vez, de un selector que corresponda a 
+      tu elecci&oacute;n de esqueletos. Igualmente, se puede modificar el estilo de este selector.
+	  ",
+	  // D
+	  "documentation" => "Documentaci&oacute;n",
+	  "extra_documentation" => "Documentaci&oacute;n extra",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "Carpetas para las pieles p&uacute;blicas",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuraci&oacute;n",
+	  "manage_theme" => "Gesti&oacute;n des temas",
+
+	  // N
+	  "no" => "No",
+	  "no_available_habillage" => "Ninguna piel disponible",
+	  "no_available_squelette" => "Aucun squelette disponible",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Elecci&oacute;n tema privado",
+	  "private_themes_config" => "Configuraci&oacute;n para los temas privados",
+	  "private_theme_choice" => "Elecci&oacute;n del tema del espacio privado",
+	  "public_choice" => "Elecci&oacute;n tema p&uacute;blico",
+	  "public_theme_choice" => "Elecci&oacute;n del tema del espacio p&uacute;blico",
+	  "public_themes_config" => "Configuraci&oacute;n para los temas p&uacute;blicos",
+	  "public_theme_doc_squelette" => "<b>Elecci&oacute;n del esqueleto:</b><br />
+	  Cada vez que seleccionar&aacute;s un esqueleto (m&aacute;s exactamente una distribuci&oacute;n de 
+	  esqueletos) la lista de ropas disponibles se actualiza. El cuadradito indica el estado de la
+	  distribuci&oacute;n de esqueletos: estable, test, experimental ...<br />
+	  Para mayores detalles acerca de una distribuci&oacute;n pincha en la flecha negra.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Elecci&oacute;n de la piel:</b><br />
+	  Las 'pieles' permiten modificar los colores y el aspecto gr&aacute;fico de una distribuci&oacute;n 
+	  de esqueletos. Se trata de CSS y/o de im&aacute;genes, ect. <br /> 
+	  Una distribuci&oacute;n de esqueletos siempre contiene una presentaci&oacute;n gr&aacute;fica
+      por omisi&oacute;n, que corresponde a la piel denominada <b>Original</b>.
+	  ",
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Guardar la piel",
+	  "save_public_directories" => "Guardar las carpetas ",
+	  "save_squelette" => "Guardar es esqueleto",
+	  "save_switcher_options" => "Guardar las opciones del alternador",
+	  "squelettes_public_dir" => "Carpetas para los esqueletos p&uacute;blicos",
+	  "switcher_activated" => "Activar el alternador de temas",
+	  "switcher_admin_only" => "S&oacute;lo para los administratdores",
+	  "switcher_style" => "Style du switcher",
+
+	  // T
+	  "to_be_done" => "&iexcl;a&uacute;n por hacer!",
+	  "themes_switcher" => "Alternador de temas",
+
+	  // U
+	  "update_habillage_to" => "Actualizaci&oacute;n de la piel por: ",
+	  "update_squelette_to" => "Actualizaci&oacute;n del esqueleto por: ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "S&iacute;",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/lang/sktheme_fr.php	(revision 30)
@@ -0,0 +1,140 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Liste des habillages disponibles",
+	  "available_squelette_list" => "Liste des squelettes disponibles",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Configuration avanc&eacute;e",
+	  "config_doc_directories" => "<b>R&eacute;pertoires</b>:<br /> 
+	  Il est possible de red&eacute;finir les r&eacute;pertoires de stockage 
+	  de vos <i>'squelettes'</i> et de vos <i>'habillages'</i>, par 
+	  d&eacute;faut il s'agit du r&eacute;pertoire <i>'themes'</i>, les r&eacute;pertoires sont toujours 
+	  relatifs &agrave; la racine de votre site SPIP 
+	  ",
+	  "config_doc_switcher" => "<b>Switcher</b>:<br />
+	  Le 'switcher' de th&egrave;mes permet de faire appara&icirc;tre une liste de
+	  s&eacute;lection de th&egrave;mes dans l'espace public et ainsi tester
+	  les diff&eacute;rents th&egrave;mes plus rapidement. Il est possible
+	  de ne donner cette possibilit&eacute; qu'aux administrateurs<br />
+	  De plus vous pouvez changer le style de votre s&eacute;lecteur de
+	  th&egrave;mes ici.
+	  <br>
+	  <br>
+	  Il existe &eacute;galement une balise <br />
+	  <b><small>#SKTHEME_HABILLAGES_SWITCHER</small></b><br />
+	  qu'il est possible d'int&eacute;grer &agrave; vos squelettes pour disposer
+	  cette fois d'un s&eacute;lecteur d'habillage correspondant &agrave; votre
+	  choix de squelette. Une fois encore vous pouvez en modifier le style si besoin.
+	  ",
+	  // D
+	  "documentation" => "Documentation",
+	  "extra_documentation" => "Extra Documentation",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "R&eacute;pertoires pour les habillages publics",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuration",
+	  "manage_theme" => "Gestion des th&egrave;mes",
+
+	  // N
+	  "no" => "Non",
+	  "no_available_habillage" => "Aucun habillage disponible",
+	  "no_available_squelette" => "Aucun squelette disponible",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Choix th&egrave;me priv&eacute;",
+	  "private_themes_config" => "Configuration pour les th&egrave;mes priv&eacute;s",
+	  "private_theme_choice" => "Choix du th&egrave;me de l'espace priv&eacute;",
+	  "public_choice" => "Choix th&egrave;me public",
+	  "public_theme_choice" => "Choix du th&egrave;me de l'espace public",
+	  "public_themes_config" => "Configuration pour les th&egrave;mes publics",
+	  "public_theme_doc_squelette" => "<b>Choix du squelette :</b><br />
+	  Chaque fois que vous s&eacute;lectionnez un squelette (plus exactement une
+	  distribution de squelettes) la liste des habillages disponibles est mise &agrave; 
+	  jour. Le petit carr&eacute;s indique l'&eacute;tat de
+	  la distribution de squelette, stable, test, experimental ...<br />
+	  Pour plus de d&eacute;tail sur une distribution cliquez sur la
+	  fl&egrave;che noire.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Choix de l'habillage :</b><br />
+	  Les habillages permettent de modifier les couleurs et l'aspect
+	  graphique d'une distribution de squelettes. Il s'agit de CSS et/ou d'images
+	  etc ...<br /> 
+	  Une distribution de squelette contient toujours une
+	  pr&eacute;sentation graphique par d&eacute;faut, ceci correspond
+	  &agrave; l'habillage nomm&eacute; <b>Original</b>.
+	  ",
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Enregister l'habillage",
+	  "save_public_directories" => "Enregistrer les r&eacute;pertoires",
+	  "save_squelette" => "Enregister le squelette",
+	  "save_switcher_options" => "Enregistrer les options du switcher",
+	  "squelettes_public_dir" => "R&eacute;pertoires pour les squelettes publics",
+	  "switcher_activated" => "Activer le switcher de th&egrave;me",
+	  "switcher_admin_only" => "Seulement pour les administrateurs",
+	  "switcher_style" => "Style du switcher",
+
+	  // T
+	  "to_be_done" => "&agrave; faire !",
+	  "themes_switcher" => "Switcher de th&egrave;me",
+
+	  // U
+	  "update_habillage_to" => "Mise &agrave; jour de l'habillage par : ",
+	  "update_squelette_to" => "Mise &agrave; jour du squelette par : ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "Oui",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/plugin.xml	(revision 30)
@@ -0,0 +1,38 @@
+<plugin>
+ <nom>SkTheme (SPIP 1.9.2)</nom>
+ <version>0.6</version>
+ <etat>stable</etat>
+ <auteur>Skedus
+<multi>
+_ &copy; September 2006 - distributed under GNU/GPL licence.
+[fr]_ &copy; Septembre 2006 - distribu&#233; sous license GNU/GPL.
+</multi>
+</auteur>
+<description>
+<multi>
+Manage theme for SPIP
+_ WATCH OUT: You need to desactivate switcher plugin (quite incompatible because using same process - this means i copied it inside this plugin and i would like to thank  its authors Philippe Drouot and Fil for this nice switcher plugin)
+_ Activate this plugin and manage themes in the {{Configuration}} menu.
+[fr]
+Gestion des th&#232;mes de SPIP
+_ ATTENTION: D&#233;sactivez le plugin switcher (ils sont quelque peu incompatibles, car il est monstreusement copi&#233; dans ce plugin, merci aux auteurs Philippe Drouot et Fil)
+_ Activez ce plugin et g&#233;rez les th&#232;mes dans le menu {{Configuration}}.
+</multi>
+</description>
+	<lien>http://skedus.free.fr/spip/spip.php?article8</lien> <!-- URI de documentation -->
+ <prefix>sktheme</prefix>
+ <options>sktheme_options.php</options>
+ <pipeline>
+    <nom>ajouter_boutons</nom>
+    <inclure>sktheme_fonctions.php</inclure>
+ </pipeline>
+ <pipeline>
+    <nom>affichage_final</nom>
+    <action>affichage_final</action>
+    <inclure>sktheme_fonctions.php</inclure>
+ </pipeline>
+ <pipeline>
+   <nom>insert_head</nom>
+      <inclure>sktheme_head.php</inclure>
+ </pipeline>
+ </plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_fonctions.php	(revision 30)
@@ -0,0 +1,89 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
+define('_DIR_PLUGIN_SKTHEME',(_DIR_PLUGINS.end($p)));
+
+include_spip('inc/sktheme_list');
+
+// Add private area button
+function sktheme_ajouter_boutons($boutons_admin) {
+  // administrator only
+  if ($GLOBALS['connect_statut'] == "0minirezo" && $GLOBALS["connect_toutes_rubriques"]) {
+    
+    // See button in the 'configuration' 
+    $boutons_admin['configuration']->sousmenu["sktheme_public_choice"]= 
+       new Bouton("../"._DIR_PLUGIN_SKTHEME."/img_pack/sktheme_icon.png",  // icon
+		  _L("sktheme:manage_theme"));                                     // title
+  }
+  return $boutons_admin;
+}
+
+
+//
+// Include Philippe Drouot switcher functionnality
+// Based on Fil contrib
+function sktheme_affichage_final($texte){
+	
+  global $html;
+  
+  $sktheme_list = sktheme_list();
+   
+  // Insertion du Javascript de rechargement de page
+  // Always include this script used for #SKTHEME_HABILLAGES_SWITCHER and #SKTHEME_THEMES_SWITCHER
+  $code = '<script type="text/javascript">
+		//<![CDATA[
+		function sktheme_gotof(url) {
+		window.location=url;
+		}//]]>
+		</script>';	  
+  
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) 
+      AND ($GLOBALS['meta']['sktheme_switcher_activated']=="yes")) {
+    if ($html) {
+		
+      // Doit-on afficher le selecteur de squelette ? (Fonctionnalite restreinte aux seuls administrateurs ?)
+      $afficherSelecteur=TRUE;
+      if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) 
+	  AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="yes") 
+	  AND (!isset($_COOKIE['spip_admin']))) $afficherSelecteur=FALSE;
+		
+      if ($afficherSelecteur) {
+			
+			
+	// Insertion du selecteur de squelettes			
+	$code.='<div id="sktheme_switcher" style="top: 0;left: 20px; position: absolute; background-color: transparent;z-index: 100;">';
+	$code.='<form action="" method="post">';
+	$code.='<fieldset style="margin:0;padding:0;border:0">';
+	$code.='<select name="selecteurTheme" style="'.$GLOBALS['meta']['sktheme_theme_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+	$code.='<option selected="selected" value="">Themes</option>';
+	foreach( $sktheme_list as $value )	$code.='<option value="'.parametre_url(self(),'var_sktheme',$value).'">&nbsp;-> '.$value.'</option>';
+	$code.='</select>';
+	$code.='</fieldset>';
+	$code.='</form>';
+	$code.='</div>';
+      }
+
+			
+    }
+  } 
+	// On rajoute le code du selecteur de squelettes avant la balise </body>  
+	$texte=eregi_replace("</body>","$code</body>",$texte);
+	return($texte);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_head.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_head.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_head.php	(revision 30)
@@ -0,0 +1,23 @@
+<?php
+
+
+
+function sktheme_insert_head($flux){
+  
+  if ($GLOBALS['meta']['sktheme_switcher_activated']) {
+
+    $flux .='
+	<style type="text/css" media="print">
+/* <![CDATA[ */
+	#sktheme_switcher { display: none; }
+/* ]]> */
+	</style>
+';
+
+    return $flux;
+  
+  }  
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_options.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/sktheme_options.php	(revision 30)
@@ -0,0 +1,90 @@
+<?php
+// ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+  // cache desactivation
+  $_SERVER['REQUEST_METHOD']='POST';
+
+include_spip("inc/meta");
+include_spip('inc/sktheme_balises');
+
+// Set a default configuration - each values can be modify 
+// in the private area
+if (!isset($GLOBALS['meta']['sktheme_squelettes_public_dir'])){
+  ecrire_meta('sktheme_squelettes_public_dir',"themes");
+  ecrire_meta('sktheme_habillages_public_dir',"themes");
+  ecrire_meta('sktheme_squelette_public_name',"dist");
+  ecrire_meta('sktheme_habillage_public_name',"");
+  ecrire_meta('sktheme_theme_switcher_style',"font-size: 10px;background-color: #FFF;color: #0C479D;border-top: 1px solid #CECECE; border-bottom: 2px solid #4A4A4A; border-left: 1px solid #CECECE; border-right: 1px solid #CECECE;margin:2px .5em;");
+  ecrire_meta('sktheme_habillage_switcher_style',"font-size: 10px;background-color: #FFF;color: #0C479D;border-top: 1px solid #CECECE; border-bottom: 2px solid #4A4A4A; border-left: 1px solid #CECECE; border-right: 1px solid #CECECE;margin:2px .5em;");
+  ecrire_meta('sktheme_switcher_activated',"no");
+  ecrire_meta('sktheme_switcher_admin_only',"yes");
+  ecrire_metas();
+} 
+
+// Set default user choice
+$s_dir = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$GLOBALS['meta']['sktheme_squelette_public_name'];
+$h_dir = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$GLOBALS['meta']['sktheme_habillage_public_name'];
+
+//
+// SWITCHER THEME
+//
+// Contrib de Fil : voir http://trac.rezo.net/trac/spip-zone/browser/_contribs_/switcher/switcher.php
+// --------------------------------------------------------------------------------------------------
+// Ask sktheme 
+if (isset($_GET['var_sktheme'])) {
+  
+  // sktheme format : 
+  // for theme           = squelette_name::habillage_name
+  // for habillage only  = __current::habillage_name
+  // 
+  list($squelette,$habillage)= split ("::", $_GET['sktheme']);
+    
+  // For habillage only
+  if ($squelette == "__current") {
+    $squelette = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+    
+  $s_dir = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$squelette;
+  $h_dir = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$habillage;
+  if (is_dir(_DIR_RACINE.$s_dir)) {
+    // theme exist put a cookie
+    setcookie('spip_sktheme', $_COOKIE['spip_sktheme'] = $_GET['var_sktheme'], NULL, '/');
+  } else {
+    // not valid remove cookie
+    setcookie('spip_sktheme', $_COOKIE['spip_sktheme'] = '', -24*3600, '/');
+  }
+}
+
+if (isset($_COOKIE['spip_sktheme'])) {
+  list($squelette,$habillage)= split ("::", $_COOKIE['spip_sktheme']);
+  // For habillage only
+  if ($squelette == "__current") {
+    $squelette = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+  $s_dir_new = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$squelette;
+  $h_dir_new = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$habillage;
+  
+  if (is_dir(_DIR_RACINE.$s_dir_new)) {
+    $s_dir = $s_dir_new;
+  }
+  if (is_dir(_DIR_RACINE.$h_dir_new)) {
+    $h_dir = $h_dir_new;
+  }
+} 
+
+// So set only the 'dossier_squelettes' to the corresponding user choice
+$dossier_squelettes = $h_dir.':'.$s_dir;
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/svn.revision
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/svn.revision	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/sktheme/1_9_2/svn.revision	(revision 30)
@@ -0,0 +1,12 @@
+<svn_revision><text_version>
+Origine svn://zone.spip.org/spip-zone/_plugins_/_stable_/sktheme le vendredi 19 janvier 2007, 11:05:40 (UTC+0100)
+Revision: 8642
+Dernier commit 2007-01-07 23:35:16 +0100 (Sun, 07 Jan 2007)
+Voir http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/sktheme
+</text_version>
+<origine>svn://zone.spip.org/spip-zone/_plugins_/_stable_/sktheme</origine>
+<date_production>vendredi 19 janvier 2007, 11:05:40 (UTC+0100)</date_production>
+<revision>8642</revision>
+<commit>2007-01-07 23:35:16 +0100 (Sun, 07 Jan 2007)</commit>
+</svn_revision>
+<archivelist>_plugins_/_stable_/sktheme;sktheme;sktheme</archivelist>
Index: /trunk/spip/esqueleto-redcta/plugins/splickrbox/Splickr_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/splickrbox/Splickr_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/splickrbox/Splickr_fonctions.php	(revision 30)
@@ -0,0 +1,8 @@
+<?php
+
+function Splickr_juste_a_x($compteur,$x,$return) {
+	if($compteur%$x == 0) return $return;
+	return '';
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/splickrbox/head.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/splickrbox/head.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/splickrbox/head.php	(revision 30)
@@ -0,0 +1,10 @@
+<?php
+
+	function Splickr_insert_head($flux){
+	$flux .= 	'<script type="text/javascript" src="'.find_in_path('splickrbox.js').'"></script>';
+
+	return $flux;
+
+	}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/splickrbox/modeles/splickrbox.html
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/splickrbox/modeles/splickrbox.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/splickrbox/modeles/splickrbox.html	(revision 30)
@@ -0,0 +1,27 @@
+[(#REM) Parametres du modele:
+            - align : alignement
+            - colonne : nombre de colonnes de la box, defaut 3
+            - taille : nombre de vignettes de la box (un multiple de colonne, degaut 12)
+            - masque : fichier .png definissant le masque de la grande vignette, defaut carre-100.png (2x la taille des petites vignettes). Ce parametre permet de jouer sur la taille de la box
+            - tri : critre de classement comme date, hasard..., defaut date
+            - senstri : 0 ou 1 pour inverser le sens de classement, defaut inverse
+]
+
+<B_flickr>
+    <div style="position:relative;[float:(#ENV{align}|match{left|right});]" class="splickrbox [splickrbox_(#ENV{align})]">
+        <table cellpadding="0" cellspacing="0" ><tr>
+<BOUCLE_flickr(DOCUMENTS){par #ENV{tri, date}}{inverse #ENV{senstri, 1}}{extension==jpg|png|gif}{0,#ENV{taille,12}}{id_article?}{id_rubrique?}>
+            <td> <a href="#FICHIER" class="thickbox" [title="(#TITRE)"]>[(#FICHIER|copie_locale|image_masque{#ENV{masque,carre-100.png}}|image_aplatir{jpg})]</a></td>
+            [(#COMPTEUR_BOUCLE|Splickr_juste_a_x{#ENV{colonnes,3},</tr><tr>})] 
+</BOUCLE_flickr>
+            <td></td>
+	</tr></table>
+    </div>
+</B_flickr>
+
+<!--
+<div id="statusContainer" class="statusContainer">
+  <span class="statusMsg" id="statusMsg">x</span>
+</div>
+//-->
+
Index: /trunk/spip/esqueleto-redcta/plugins/splickrbox/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/splickrbox/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/splickrbox/plugin.xml	(revision 30)
@@ -0,0 +1,39 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	Splickrbox
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	  BoOz (booz@rezo.net)
+	  Pierre Andrews (mortimer)
+	</auteur>
+	<version>
+	0.3
+	</version>
+	<etat>
+	stable
+	</etat>
+	<description>
+	Noisette pour afficher les dernieres photos &#224; la Flickr (le "badge") , tout &#231;a en javascript via <code>#INSERT_HEAD</code> et le plugin JQuery.
+
+-* On peut l'utiliser en modele avec {&lt;splickrbox&gt;}. en lui passant en option un parametre d'id pour limiter la boucle document,
+-* On peut l'utiliser dans les squelettes avec la balise <code>#MODELE{splickrbox}</code>
+-* On peut l'utiliser avec diff&#233;rent param&#232;tres (qu'on peut aussi combiner):
+-** {&lt;splickrbox|right&gt;} et {&lt;splickrbox|left&gt;} pour les alignements
+-** {&lt;splickrbox|taille=24&gt;} permet de specifier le nombre de vignettes &#224; afficher. Ce nombre devrait &#234;tre un multiple du nombre de colonnes.
+-** {&lt;splickrbox|colonnes=10&gt;} permet de specifier le nombre de colonnes &#224; afficher.
+-** {&lt;splickrbox|masque=carre-100.png&gt;} permet de d&eacute;finir la taille des vignettes (le masque correspond &agrave; la grande vignette).
+-** {&lt;splickrbox|tri=date&gt;} permet de specifier le classement (date, hasard...).
+-** {&lt;splickrbox|senstri=1&gt;} permet d'inverser le sens de classement choisi ci-dessus.
+	</description>
+	<lien>http://trac.rezo.net/trac/spip-zone/wiki/SplickrBox</lien> <!-- URI de documentation -->
+	<prefix>
+	Splickr
+	</prefix>
+	<fonctions>
+	Splickr_fonctions.php
+	</fonctions>
+	<pipeline>
+		<nom>insert_head</nom>
+		<inclure>head.php</inclure>
+	</pipeline>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/splickrbox/splickrbox.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/splickrbox/splickrbox.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/splickrbox/splickrbox.js	(revision 30)
@@ -0,0 +1,133 @@
+/* Splickerbox - Code javascript
+ *
+ * Badge à la flickr, par BoOz booz AT rezo.net
+ *
+ * Fonctionne avec jQuery.
+ **/
+
+//fonction gadget pour avoir le this du contexte au bon objet 
+//quand on fait des appels depuis des callbacks (setTimeout et autres events)
+function getObjectMethodClosure(object, method) {
+	return function(arg) {
+		return object[method](arg); 
+	}
+}	
+
+//Quand le document est pret, on lance le plugin sur chaque
+//div de class splickrbox
+$(document).ready(function(){
+		$(".splickrbox").splicker();
+	});
+
+//le plugin splicker, pour chaque image du div
+//on lui cree un objet SplickerBox
+jQuery.fn.splicker = function() {
+	return this.each(function() {
+			var img_cnt = $(this).find('img').size();
+			if(img_cnt > 0) {
+				var size = $(this).find('img').css('width').replace('px',"");
+				var box = new jQuery.SplickerBox(this,img_cnt,size);
+			}
+		});
+}
+
+//Constructeur de l'objet
+jQuery.SplickerBox = function(e,m,s) {
+	this.elt = e;
+	this.max = m;
+	$(this.elt).append('<div class="changeMe" style="position:absolute;left:0px;top:0px;"></div>');
+	this.c = $(this.elt).find('.changeMe');
+	this.rows = $('table',this.elt).get(0).rows.length-1;
+	this.cols = this.max/this.rows;
+	this.cptj = 0;
+	this.last = 0;
+	this.left = this.top=0;
+	if(s == 0 || s == 'auto')
+		this.cote = 100;
+	else
+		this.cote = s;
+	this.init()
+}
+
+//les methodes
+jQuery.SplickerBox.prototype = {
+	//on choisit la prochaine image
+	itere: function() {
+		this.cptj = Math.round(Math.random()*this.max) % this.max;
+		if(this.cptj == this.last) this.cptj = (this.last+this.cols)%this.max;
+		this.last = this.cptj;
+		$("#statusMsg").html("it"+this.cptj+"=?"+this.max);
+	},
+	//fixer la taille des images à la moitiée de la taille réelle
+	//l'image doit être carree
+	init: function() {
+		$(this.elt).find('img').css({display: 'block', width:(this.cote/2) + "px",height:(this.cote/2) + "px", height: (this.cote/2) + "px",border:0});
+		$(this.c).css({width: this.cote + "px",height: this.cote + "px"});
+		this.start();
+	},
+	
+	//on lance la premiere vignette apres un temps random entre 0 et 2s
+	start: function() {
+		setTimeout(getObjectMethodClosure(this,'doyourstuff'),(Math.random()*2)*1000);
+	},
+
+	//iteration apres le timeout
+	postpone: function() {
+		$(this.c).css('background-color','transparent');
+		this.itere();		
+		$(this.c).empty();
+		this.start();
+	},
+
+	//toute les bidouilles sur la taille etc
+	//pour l'animation
+	doyourstuff: function() {
+		var or = $(this.elt).find('img').get(this.cptj);
+		var image = or.cloneNode(true);
+		image.style.width="100%";
+		image.style.height="100%";
+
+		var href = or.parentNode.href;
+
+		$(image).css("cursor","pointer").click(function(){
+				//thickbox
+				if(typeof imageArray != 'undefined' && href.match(/\.(jpeg|jpg|png|gif)$/i)){
+					TB_show('',href,'image');
+				}else{
+					window.document.location = href ;
+				}
+			});
+
+		$(this.c).append(image);
+		$(this.c).css({width:this.cote+'px',height:this.cote+'px'});
+
+		var colonne = this.cptj%this.cols;
+		this.left = colonne*this.cote/2;
+		l = (colonne-(colonne%2));
+		if((colonne == this.cols-1) && this.cols%2 > 0) l = l-1;
+		l = l*this.cote/2;
+		$(this.c).css("left",l+"px");
+		
+		var ligne = (this.cptj-(this.cptj%this.cols))/this.cols;
+		this.top = ligne*this.cote/2;
+		t = (ligne - (ligne%2));
+		if((ligne == this.rows-1) && (this.rows%2 > 0)) t = t-1;
+		t= t* this.cote/2
+		$(this.c).css("top",t + "px");
+
+
+		var back = $(this.elt.parentNode).css('background-color');
+		//if(!back || back=='transparent') back = 'white';
+		//$(this.c).css('background-color',back);		
+		$(this.c).fadeIn(2000);		
+		setTimeout(getObjectMethodClosure(this,'resize'),4000); 
+		setTimeout(getObjectMethodClosure(this,'postpone'),7000);
+
+	},
+	//on anime la grosse vignette
+	resize: function() {
+		var t = new Number(this.top);
+		var l = new Number(this.left);
+		jQuery(this.c).animate({top:t,left:l,width:this.cote/2,height:this.cote/2},1500);
+	}
+}
Index: /trunk/spip/esqueleto-redcta/plugins/splickrbox/svn.revision
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/splickrbox/svn.revision	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/splickrbox/svn.revision	(revision 30)
@@ -0,0 +1,15 @@
+<svn_revision><text_version>
+Origine svn://zone.spip.org/spip-zone/_plugins_/_stable_/splickrbox le jeudi 5 juillet 2007, 21:01:32 (UTC+0200)
+Revision: 13321
+Dernier commit 2007-07-05 20:50:03 +0200 (Thu, 05 Jul 2007)
+Voir http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/splickrbox
+Archive: http://files.spip.org/spip-zone/splickrbox.zip
+</text_version>
+<uri>http://trac.rezo.net/trac/spip-zone/browser/_plugins_/_stable_/splickrbox</uri>
+<archive>http://files.spip.org/spip-zone/splickrbox.zip</archive>
+<origine>svn://zone.spip.org/spip-zone/_plugins_/_stable_/splickrbox</origine>
+<date_production>jeudi 5 juillet 2007, 21:01:32 (UTC+0200)</date_production>
+<revision>13321</revision>
+<commit>2007-07-05 20:50:03 +0200 (Thu, 05 Jul 2007)</commit>
+</svn_revision>
+<archivelist>_plugins_/_stable_/splickrbox;splickrbox;splickrbox</archivelist>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update/exec/svn_update.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update/exec/svn_update.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update/exec/svn_update.php	(revision 30)
@@ -0,0 +1,95 @@
+<?php
+
+include_spip('inc/svn_update');
+
+# redefinissables dans ecrire/mes_options ; si on veut en mettre
+# plusieurs separer par des deux-points
+define('_SVN_UPDATE_AUTEURS', '2');
+# fichier source
+define('_SVN_UPDATE_FILE', find_in_path('svn_update_list.txt'));
+
+# 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');
+// debug		echo ($connect_statut);
+// debug		echo ($connect_id_auteur);
+		fin_page();
+		exit;
+	}
+
+	debut_gauche();
+	debut_droite();
+
+	if (!defined('_SVN_UPDATE_FILE')
+	OR !file_exists(_SVN_UPDATE_FILE)) {
+		die ("Fichier de configuration "._SVN_UPDATE_FILE." absent");
+	}
+	$config = file(_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/inc/svn_update.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update/inc/svn_update.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update/inc/svn_update.php	(revision 30)
@@ -0,0 +1,72 @@
+<?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
+
+		@list($src, $dest, $rev, $user) = explode(' ',$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 = "checkout $src/ $dest/";
+		}
+
+		else {
+			$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/";
+			}
+		}
+
+		if ($command) {
+			$command = _SVN_COMMAND." $user ".$command;
+			$out = array();
+			exec($command,$out);
+			array_unshift($out, $command);
+			return $out;
+		}
+
+	}
+
+	function traiter_config_svn($config = array()) {
+		foreach($config as $l) {
+			echo "<hr /><b>", htmlspecialchars($l), "</b>";
+			$res = update_svn($l);
+			if (is_string($res))
+				echo "<br /><b>Erreur: ",
+					htmlspecialchars($res),
+					"</b>";
+			if (is_array($res))
+				echo "<br />".nl2br(htmlspecialchars(join("\n", $res)));
+			echo "<br />\n";
+		}
+	}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update/plugin.xml	(revision 30)
@@ -0,0 +1,30 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	SVN Update
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	Cedric &amp; Fil
+_ &copy; 2006 - Distribu&#233; sous licence GNU/GPL
+	</auteur>
+	<version>
+	0.2
+	</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.
+
+La configuration se fait &#224; deux emplacements :
+- dans <code>ecrire/mes_options.php</code>, on indique la liste des administrateurs autoris&#233;s &#224; proc&#233;der aux mises &#224; jour, par exemple avec :
+_ <code>define('_SVN_UPDATE_AUTEURS', '1:3');</code>
+- Dans le fichier <code>svn_update_list.txt</code> (&#224; recopier dans son r&#233;pertoire personnel de squelettes), on indique 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 sedna</code>
+	</description>
+	<lien></lien> <!-- URI de documentation -->
+	<prefix>
+	svn_update
+	</prefix>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/plugins/svn_update/svn_update_list.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/svn_update/svn_update_list.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/svn_update/svn_update_list.txt	(revision 30)
@@ -0,0 +1,44 @@
+## Fichier d'exemple ##
+##
+## On note ici la source SVN de chaque paquet qui nous interesse
+## et sa destination sur le disque (a partir de la racine du site)
+##
+##
+## la plupart des sources sont commentees :
+## recopiez ce fichier dans votre repertoire personnel, et
+## ajoutez/configurez ce qu'il vous faut
+##
+######################################################################
+
+
+##### SPIP
+# la branche 1.9, a la racine
+# svn://trac.rezo.net/spip/branches/spip-1.9 .
+
+
+
+##### PLUGINS
+# auto-installation de ce plugin svn_update
+# svn://zone.spip.org/spip-zone/_plugins_/_stable_/svn_update plugins/svn_update
+
+# Forms en version 1.9.1
+#svn://zone.spip.org/spip-zone/_plugins_/_stable_/forms/1_9_1 plugins/Forms
+
+# jQuery et Thickbox
+#svn://zone.spip.org/spip-zone/_plugins_/_dev_/-jQuery plugins/jquery
+#svn://zone.spip.org/spip-zone/_plugins_/_dev_/thickbox plugins/thickbox
+
+
+##### SQUELETTES
+# sedna
+#svn://zone.spip.org/spip-zone/_squelettes_/sedna sedna
+
+# et enfin mes squelettes, pris dans mon svn perso
+# svn://mon.svn.perso/chemin/vers/mes/squelettes squelettes
+
+# ou dans spip-party
+# svn://zone.spip.org/spip-zone/_squelettes_/spip-party squelettes
+
+# test svn redcta
+https://svn.redcta.org.ar/proyectos/redcta/trunk/spip test-svn
+
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/exec/demo_articles.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/exec/demo_articles.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/exec/demo_articles.php	(revision 30)
@@ -0,0 +1,1568 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+include_spip('inc/presentation');
+include_spip('inc/texte');
+include_spip('inc/rubriques');
+include_spip('inc/logos');
+include_spip('inc/mots');
+include_spip('inc/date');
+include_spip('inc/documents');
+include_spip('inc/forum');
+include_spip('base/abstract_sql');
+include_spip('inc/calendar');
+
+  // 28 paremetres, qui dit mieux ?
+  // moi ! elle en avait 61 en premiere approche
+
+function exec_affiche_articles_dist($id_article, $ajout_auteur, $change_accepter_forum, $change_petition, $changer_virtuel, $cherche_auteur, $cherche_mot, $debut, $email_unique, $flag_auteur, $flag_editable, $langue_article, $message, $nom_select, $nouv_auteur, $nouv_mot, $rubrique_article, $site_obli, $site_unique, $supp_auteur, $supp_mot, $texte_petition, $titre_article, $lier_trad)
+{
+  global $options, $spip_display, $spip_lang_left, $spip_lang_right, $dir_lang;
+
+$result = spip_query("SELECT * FROM spip_articles WHERE id_article='$id_article'");
+
+if ($row = spip_fetch_array($result)) {
+	$id_article = $row["id_article"];
+	$surtitre = $row["surtitre"];
+	$titre = $row["titre"];
+	$soustitre = $row["soustitre"];
+	$id_rubrique = $row["id_rubrique"];
+	$descriptif = $row["descriptif"];
+	$nom_site = $row["nom_site"];
+	$url_site = $row["url_site"];
+	$chapo = $row["chapo"];
+	$texte = $row["texte"];
+	$ps = $row["ps"];
+	$date = $row["date"];
+	$statut_article = $row["statut"];
+	$maj = $row["maj"];
+	$date_redac = $row["date_redac"];
+	$visites = $row["visites"];
+	$referers = $row["referers"];
+	$extra = $row["extra"];
+	$id_trad = $row["id_trad"];
+	$id_version = $row["id_version"];
+
+	if (ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})", $date_redac, $regs)) {
+		$annee_redac = $regs[1];
+		$mois_redac = $regs[2];
+		$jour_redac = $regs[3];
+		$heure_redac = $regs[4];
+		$minute_redac = $regs[5];
+		if ($annee_redac > 4000) $annee_redac -= 9000;
+	}
+
+	if (ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})", $date, $regs)) {
+		$annee = $regs[1];
+		$mois = $regs[2];
+		$jour = $regs[3];
+		$heure = $regs[4];
+		$minute = $regs[5];
+	}
+ }
+// reserver les Widget Calendar avant de commencer l'affichage
+WCalendar_ajoute(_T('texte_date_publication_article'),'');
+WCalendar_ajoute(_T('texte_date_publication_anterieure'),'_redac');
+
+debut_page("&laquo; $titre_article &raquo;", "documents", "articles", "", "", $id_rubrique);
+
+debut_grand_cadre();
+
+afficher_hierarchie($id_rubrique);
+
+fin_grand_cadre();
+
+if (!$row) {echo _T('public:aucun_article'); exit;}
+
+//
+// Affichage de la colonne de gauche
+//
+
+debut_gauche();
+
+boite_info_articles($id_article, $statut_article, $visites, $id_version);
+
+//
+// Logos de l'article et Boites de configuration avancee
+//
+
+
+// pour l'affichage du virtuel
+unset($virtuel);
+if (substr($chapo, 0, 1) == '=') {
+	$virtuel = substr($chapo, 1);
+}
+
+boites_de_config_articles($id_article, $id_rubrique, $flag_editable,
+			  $change_accepter_forum, $change_petition,
+			  $email_unique, $site_obli, $site_unique,
+			  $message, $texte_petition,
+			  $changer_virtuel, $virtuel);
+ 
+//
+// Affichage de la colonne de droite
+//
+
+debut_droite();
+
+changer_typo('','article'.$id_article);
+
+debut_cadre_relief();
+
+//
+// Titre, surtitre, sous-titre
+//
+
+ $modif = titres_articles($titre, $statut_article,$surtitre, $soustitre, $descriptif, $url_site, $nom_site, $flag_editable, $id_article, $id_rubrique);
+
+
+echo "<div class='serif' align='$spip_lang_left'>";
+
+ dates_articles($id_article, $id_rubrique, $flag_editable, $statut_article, $date,$annee, $mois, $jour, $heure, $minute, $date_redac, $annee_redac, $mois_redac, $jour_redac, $heure_redac, $minute_redac);
+
+//
+// Liste des auteurs de l'article
+//
+
+echo "<a name='auteurs'></a>";
+
+if ($flag_editable AND $options == 'avancees') {
+	$bouton = bouton_block_invisible("auteursarticle");
+}
+
+debut_cadre_enfonce("auteur-24.gif", false, "", $bouton._T('texte_auteurs').aide ("artauteurs"));
+
+//
+// Recherche d'auteur
+//
+
+ $supprimer_bouton_creer_auteur = rechercher_auteurs_articles($cherche_auteur, $id_article, $id_rubrique, $ajout_auteur, $flag_editable, $nouv_auteur, $supp_auteur);
+
+//
+// Afficher les auteurs
+//
+
+$les_auteurs = afficher_auteurs_articles($id_article, $flag_editable);
+
+//
+// Ajouter un auteur
+//
+
+if ($flag_editable AND $options == 'avancees') 
+	ajouter_auteurs_articles($id_article, $id_rubrique, $les_auteurs, $flag_editable, $rubrique_article, $supprimer_bouton_creer_auteur);
+
+fin_cadre_enfonce(false);
+
+//
+// Liste des mots-cles de l'article
+//
+
+if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
+  formulaire_mots('articles', $id_article, $nouv_mot, $supp_mot, $cherche_mot, $flag_editable, generer_url_ecrire("articles","id_article=$id_article"));
+}
+
+ langues_articles($id_article, $langue_article, $flag_editable, $id_rubrique, $id_trad, $dir_lang, $nom_select, $lier_trad);
+
+
+afficher_statut_articles($id_article, $rubrique_article, $statut_article);
+
+
+ afficher_corps_articles($virtuel, $chapo, $texte, $ps, $extra);
+
+if ($flag_editable) {
+	echo "\n\n<div align='$spip_lang_right'><br />";
+	bouton_modifier_articles($id_article, $id_rubrique, $modif,_T('texte_travail_article', $modif), "warning-24.gif", "");
+	echo "</div>";
+}
+
+//
+// Documents associes a l'article
+//
+
+ if ($spip_display != 4)
+ afficher_documents_non_inclus($id_article, "article", $flag_editable);
+
+//
+// "Demander la publication"
+//
+
+
+if ($flag_auteur AND $statut_article == 'prepa') {
+	echo "<P>";
+	debut_cadre_relief();
+	echo	"<center>",
+		"<B>"._T('texte_proposer_publication')."</B>",
+		aide ("artprop"),
+		"\n<form method='post' action='",
+		generer_action_auteur("instituer", "article $id_article prop", generer_url_ecrire('articles', "id_article=$id_article", true)),
+      "'>",
+		"<input type='submit' class='fondo' value=\"", 
+		_T('bouton_demande_publication'),
+		"\" />\n",
+		"</form>",
+		"</center>";
+	fin_cadre_relief();
+}
+
+echo "</div>";
+
+echo "</div>";
+fin_cadre_relief();
+
+ affiche_forums_article($id_article, $id_rubrique, $titre, $debut);
+
+fin_page();
+
+}
+
+function boite_info_articles($id_article, $statut_article, $visites, $id_version)
+{
+  global $connect_statut, $options, $flag_revisions;
+
+	debut_boite_info();
+ 
+	echo "<div align='center'>\n";
+
+	echo "<font face='Verdana,Arial,Sans,sans-serif' size='1'><b>"._T('info_numero_article')."</b></font>\n";
+	echo "<br><font face='Verdana,Arial,Sans,sans-serif' size='6'><b>$id_article</b></font>\n";
+
+	voir_en_ligne ('article', $id_article, $statut_article);
+
+
+	$activer_statistiques = $GLOBALS['meta']["activer_statistiques"];
+
+	if ($connect_statut == "0minirezo" AND $statut_article == 'publie' AND $visites > 0 AND $activer_statistiques != "non" AND $options == "avancees"){
+	icone_horizontale(_T('icone_evolution_visites', array('visites' => $visites)), generer_url_ecrire("statistiques_visites","id_article=$id_article"), "statistiques-24.gif","rien.gif");
+}
+
+	if ((($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions)
+		AND $id_version>1 AND $options == "avancees") {
+	icone_horizontale(_T('info_historique_lien'), generer_url_ecrire("articles_versions","id_article=$id_article"), "historique-24.gif", "rien.gif");
+}
+
+	// Correction orthographique
+	if ($GLOBALS['meta']['articles_ortho'] == 'oui') {
+		$js_ortho = "onclick=\"window.open(this.href, 'spip_ortho', 'scrollbars=yes, resizable=yes, width=740, height=580'); return false;\"";
+		icone_horizontale(_T('ortho_verifier'), generer_url_ecrire("articles_ortho", "id_article=$id_article"), "ortho-24.gif", "rien.gif", 'echo', $js_ortho);
+	}
+
+	echo "</div>\n";
+	
+	fin_boite_info();
+}
+
+function boites_de_config_articles($id_article, $id_rubrique, $flag_editable,
+				   $change_accepter_forum, $change_petition,
+				   $email_unique, $site_obli, $site_unique,
+				   $message, $texte_petition,
+				   $changer_virtuel, $virtuel)
+{
+  global $connect_statut, $options, $spip_lang_right;
+
+// Logos de l'article
+
+	if ($id_article AND $flag_editable)
+	  afficher_boite_logo('art', 'id_article', $id_article,
+			      _T('logo_article').aide ("logoart"), _T('logo_survol'), 'articles');
+
+
+//
+// Boites de configuration avancee
+//
+
+	if ($options == "avancees" && $connect_statut=='0minirezo' && $flag_editable) {
+	  echo "<p>";
+	  debut_cadre_relief("forum-interne-24.gif");
+
+
+	list($nb_forums) = spip_fetch_array(spip_query("SELECT count(*) AS count FROM spip_forum WHERE id_article=$id_article 	AND statut IN ('publie', 'off', 'prop')"),SPIP_NUM);
+
+	list($nb_signatures) = spip_fetch_array(spip_query("SELECT COUNT(*) AS count FROM spip_signatures WHERE id_article=$id_article AND statut IN ('publie', 'poubelle')"),SPIP_NUM);
+
+	$visible = $change_accepter_forum || $change_petition
+		|| $nb_forums || $nb_signatures;
+
+	echo "<div class='verdana1' style='text-align: center;'><b>";
+	if ($visible)
+		echo bouton_block_visible("forumpetition");
+	else
+		echo bouton_block_invisible("forumpetition");
+	echo _T('bouton_forum_petition') .aide('confforums');
+	echo "</b></div>";
+	if ($visible)
+		echo debut_block_visible("forumpetition");
+	else
+		echo debut_block_invisible("forumpetition");
+
+
+	echo "<font face='Verdana,Arial,Sans,sans-serif' size='1'>\n";
+
+
+	// Forums
+
+	if ($nb_forums) {
+		echo "<br />\n";
+		icone_horizontale(_T('icone_suivi_forum', array('nb_forums' => $nb_forums)), generer_url_ecrire("articles_forum","id_article=$id_article"), "suivi-forum-24.gif", "");
+	}
+
+	// Reglage existant
+	$forums_publics = get_forums_publics($id_article);
+
+	// Modification du reglage ?
+	if (isset($change_accepter_forum)
+	AND $change_accepter_forum <> $forums_publics) {
+		$forums_publics = $change_accepter_forum;
+		modifier_forums_publics($id_article, $forums_publics);
+	}
+
+	// Afficher le formulaire de modification du reglage
+	echo formulaire_modification_forums_publics($id_article, $forums_publics, generer_url_ecrire("articles","id_article=$id_article"));
+
+
+	// Petitions
+
+	if ($change_petition) {
+		if ($change_petition == "on") {
+			if (!$email_unique) $email_unique = "non";
+			if (!$site_obli) $site_obli = "non";
+			if (!$site_unique) $site_unique = "non";
+			if (!$message) $message = "non";
+
+			$texte_petition = addslashes($texte_petition);
+
+			$result_pet = spip_query("REPLACE spip_petitions (id_article, email_unique, site_obli, site_unique, message, texte) VALUES ($id_article, '$email_unique', '$site_obli', '$site_unique', '$message', '$texte_petition')");
+		}
+		else if ($change_petition == "off") {
+			$result_pet = spip_query("DELETE FROM spip_petitions WHERE id_article=$id_article");
+		}
+	}
+
+	$petition = spip_fetch_array(spip_query("SELECT * FROM spip_petitions WHERE id_article=$id_article"));
+
+	$email_unique=$petition["email_unique"];
+	$site_obli=$petition["site_obli"];
+	$site_unique=$petition["site_unique"];
+	$message=$petition["message"];
+	$texte_petition=$petition["texte"];
+
+	echo generer_url_post_ecrire("articles","id_article=$id_article");
+
+	echo "<select name='change_petition'
+		class='fondl' style='font-size:10px;'
+		onChange=\"setvisibility('valider_petition', 'visible');\"
+		>\n";
+
+	if ($petition) {
+		$menu = array(
+			'on' => _T('bouton_radio_petition_activee'),
+			'off'=> _T('bouton_radio_supprimer_petition')
+		);
+		$val_menu = 'on';
+	} else {
+		$menu = array(
+			'off'=> _T('bouton_radio_pas_petition'),
+			'on' => _T('bouton_radio_activer_petition')
+		);
+		$val_menu = 'off';
+	}
+
+
+	foreach ($menu as $val => $desc) {
+		echo "<option";
+		if ($val_menu == $val)
+			echo " selected";
+		echo " value='$val'>".$desc."</option>\n";
+	}
+	echo "</select>\n";
+
+	if ($petition) {
+		if ($nb_signatures) {
+			echo "<br />\n";
+			icone_horizontale($nb_signatures.'&nbsp;'. _T('info_signatures'), generer_url_ecrire("controle_petition","id_article=$id_article"), "suivi-petition-24.gif", "");
+		}
+
+		echo "<br />\n";
+
+		if ($email_unique=="oui")
+			echo "<input type='checkbox' name='email_unique' value='oui' id='emailunique' checked>";
+		else
+			echo "<input type='checkbox' name='email_unique' value='oui' id='emailunique'>";
+		echo " <label for='emailunique'>"._T('bouton_checkbox_signature_unique_email')."</label><BR>";
+		if ($site_obli=="oui")
+			echo "<input type='checkbox' name='site_obli' value='oui' id='siteobli' checked>";
+		else
+			echo "<input type='checkbox' name='site_obli' value='oui' id='siteobli'>";
+		echo " <label for='siteobli'>"._T('bouton_checkbox_indiquer_site')."</label><BR>";
+		if ($site_unique=="oui")
+			echo "<input type='checkbox' name='site_unique' value='oui' id='siteunique' checked>";
+		else
+			echo "<input type='checkbox' name='site_unique' value='oui' id='siteunique'>";
+		echo " <label for='siteunique'>"._T('bouton_checkbox_signature_unique_site')."</label><BR>";
+		if ($message=="oui")
+			echo "<input type='checkbox' name='message' value='oui' id='message' checked>";
+		else
+			echo "<input type='checkbox' name='message' value='oui' id='message'>";
+		echo " <label for='message'>"._T('bouton_checkbox_envoi_message')."</label>";
+
+		echo "<P>"._T('texte_descriptif_petition')."&nbsp;:<BR>";
+		echo "<TEXTAREA NAME='texte_petition' CLASS='forml' ROWS='4' COLS='10' wrap=soft>";
+		echo entites_html($texte_petition);
+		echo "</TEXTAREA><P>\n";
+
+		echo "<P align='$spip_lang_right'>";
+	}
+
+	if (!$petition) echo "<span class='visible_au_chargement' id='valider_petition'>";
+	echo "<INPUT TYPE='submit' NAME='Changer' CLASS='fondo' VALUE='"._T('bouton_changer')."' STYLE='font-size:10px'>";
+	if (!$petition)  echo "</span>";
+	echo "</FORM>";
+
+	echo "</font>";
+	echo fin_block();
+
+	fin_cadre_relief();
+
+	// Redirection (article virtuel)
+	debut_cadre_relief("site-24.gif");
+	$visible = ($changer_virtuel || $virtuel);
+
+	echo "<div class='verdana1' style='text-align: center;'><b>";
+	if ($visible)
+		echo bouton_block_visible("redirection");
+	else
+		echo bouton_block_invisible("redirection");
+	echo _T('bouton_redirection');
+	echo aide ("artvirt");
+	echo "</b></div>";
+	if ($visible)
+		echo debut_block_visible("redirection");
+	else
+		echo debut_block_invisible("redirection");
+
+	echo generer_url_post_ecrire("articles", "id_article=$id_article");
+	echo "\n<INPUT TYPE='hidden' NAME='changer_virtuel' VALUE='oui'>";
+	$virtuelhttp = ($virtuel ? "" : "http://");
+
+	echo "<INPUT TYPE='text' NAME='virtuel' CLASS='formo' style='font-size:9px;' VALUE=\"$virtuelhttp$virtuel\" SIZE='40'><br>";
+	echo "<font face='Verdana,Arial,Sans,sans-serif' size=2>";
+	echo "(<b>"._T('texte_article_virtuel')."&nbsp;:</b> "._T('texte_reference_mais_redirige').")";
+	echo "</font>";
+	echo "<div align='$spip_lang_right'><INPUT TYPE='submit' NAME='Changer' CLASS='fondo' VALUE='"._T('bouton_changer')."' STYLE='font-size:10px'></div>";
+	echo "</form>";
+	echo fin_block();
+
+	fin_cadre_relief();
+ }
+
+//
+// Articles dans la meme rubrique
+//
+
+meme_rubrique_articles($id_rubrique, $id_article, $options);
+
+}
+
+function meme_rubrique_articles($id_rubrique, $id_article, $options, $order='articles.date', $limit=30)
+{
+	global $spip_lang_right, $spip_lang_left;
+
+	$vos_articles = spip_query("SELECT articles.id_article, articles.titre, articles.statut FROM spip_articles AS articles WHERE articles.id_rubrique='$id_rubrique' AND (articles.statut = 'publie' OR articles.statut = 'prop') AND articles.id_article != '$id_article' ORDER BY $order DESC LIMIT $limit");
+	if (spip_num_rows($vos_articles) > 0) {
+			echo "<div>&nbsp;</div>";
+			echo "<div class='bandeau_rubriques' style='z-index: 1;'>";
+			bandeau_titre_boite2(_T('info_meme_rubrique'), "article-24.gif");
+			echo "<div class='plan-articles'>";
+			while($row = spip_fetch_array($vos_articles)) {
+				$ze_article = $row['id_article'];
+				$ze_titre = typo($row['titre']);
+				$ze_statut = $row['statut'];
+				
+				if ($options == "avancees") {
+					$numero = "<div class='arial1' style='float: $spip_lang_right; color: black; padding-$spip_lang_left: 4px;'><b>"._T('info_numero_abbreviation')."$ze_article</b></div>";
+				}
+				echo "<a class='$ze_statut' style='font-size: 10px;' href='" . generer_url_ecrire("articles","id_article=$ze_article") . "'>$numero$ze_titre</a>";
+			}
+			echo "</div>";
+			echo "</div>";
+		}
+}
+
+function bouton_modifier_articles($id_article, $id_rubrique, $flag_modif, $mode, $ip, $im)
+{
+	if ($flag_modif) {
+	  icone(_T('icone_modifier_article'), generer_url_ecrire("articles_edit","id_article=$id_article"), $ip, $im);
+		echo "<font face='arial,helvetica,sans-serif' size='2'>$mode</font>";
+		echo aide("artmodif");
+	}
+	else {
+		icone(_T('icone_modifier_article'), generer_url_ecrire("articles_edit","id_article=$id_article"), "article-24.gif", "edit.gif");
+	}
+
+}
+
+function titres_articles($titre, $statut_article,$surtitre, $soustitre, $descriptif, $url_site, $nom_site, $flag_editable, $id_article, $id_rubrique)
+{
+	global  $dir_lang, $spip_lang_left, $connect_id_auteur;
+
+	$logo_statut = "puce-".puce_statut($statut_article).".gif";
+	
+	echo "\n<table cellpadding=0 cellspacing=0 border=0 width='100%'>";
+	echo "<tr width='100%'><td width='100%' valign='top'>";
+	
+	if ($surtitre) {
+		echo "<span $dir_lang><font face='arial,helvetica' size=3><b>";
+		echo typo($surtitre);
+		echo "</b></font></span>\n";
+	 }
+	 
+	gros_titre($titre, $logo_statut);
+	
+	if ($soustitre) {
+		echo "<span $dir_lang><font face='arial,helvetica' size=3><b>";
+		echo typo($soustitre);
+		echo "</b></font></span>\n";
+	}
+	
+	
+	if ($descriptif OR $url_site OR $nom_site) {
+		echo "<p><div align='$spip_lang_left' style='padding: 5px; border: 1px dashed #aaaaaa; background-color: #e4e4e4;' $dir_lang>";
+		echo "<font size=2 face='Verdana,Arial,Sans,sans-serif'>";
+		$texte_case = ($descriptif) ? "{{"._T('info_descriptif')."}} $descriptif\n\n" : '';
+		$texte_case .= ($nom_site.$url_site) ? "{{"._T('info_urlref')."}} [".$nom_site."->".$url_site."]" : '';
+		echo propre($texte_case);
+		echo "</font>";
+		echo "</div>";
+	}
+	
+	
+	if ($statut_article == 'prop') {
+		echo "<P><FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=2 COLOR='red'><B>"._T('text_article_propose_publication')."</B></FONT></P>";
+	}
+	
+	echo "</td>";
+	
+	$flag_modif = false;
+	
+	if ($flag_editable) {
+		echo "<td>". http_img_pack('rien.gif', " ", "width='5'") . "</td>\n";
+		echo "<td align='center'>";
+	
+		// Recuperer les donnees de l'article
+		if ($GLOBALS['meta']['articles_modif'] != 'non') {
+			$result = spip_query("SELECT auteur_modif, UNIX_TIMESTAMP(date_modif) AS modification, UNIX_TIMESTAMP(NOW()) AS maintenant FROM spip_articles WHERE id_article='$id_article'");
+
+	
+			if ($row = spip_fetch_array($result)) {
+				$auteur_modif = $row["auteur_modif"];
+				$modification = $row["modification"];
+				$maintenant = $row["maintenant"];
+	
+				$date_diff = floor(($maintenant - $modification)/60);
+	
+				if ($date_diff >= 0 AND $date_diff < 60 AND $auteur_modif > 0 AND $auteur_modif != $connect_id_auteur) {
+					$result_auteur = spip_query("SELECT nom FROM spip_auteurs WHERE id_auteur='$auteur_modif'");
+
+					if ($row_auteur = spip_fetch_array($result_auteur)) {
+						$nom_auteur_modif = typo($row_auteur["nom"]);
+					}
+					$modif = array('nom_auteur_modif' => $nom_auteur_modif, 'date_diff' => $date_diff);
+				}
+			}
+		}
+		bouton_modifier_articles($id_article, $id_rubrique, $modif, _T('avis_article_modifie', $modif), "article-24.gif", "edit.gif");
+	
+		echo "</td>";
+	 }
+	echo "</tr></table>\n";
+	echo "<div>&nbsp;</div>";
+	return $modif;
+}
+
+
+function dates_articles($id_article, $id_rubrique, $flag_editable, $statut_article, $date, $annee, $mois, $jour, $heure, $minute, $date_redac, $annee_redac, $mois_redac, $jour_redac, $heure_redac, $minute_redac)
+{
+
+  global $spip_lang_left, $spip_lang_right, $options;
+
+  if ($flag_editable AND $options == 'avancees') {
+	debut_cadre_couleur();
+
+	echo generer_url_post_ecrire("articles", "id_article=$id_article");
+
+	if ($statut_article == 'publie') {
+
+		echo "<div><b>";
+		echo bouton_block_invisible("datepub");
+		echo "<span class='verdana1'>"._T('texte_date_publication_article').'</span> ';
+		echo majuscules(affdate($date)),
+			"</b>".aide('artdate')."</div>";
+
+		echo debut_block_invisible("datepub"),
+		  "<div style='margin: 5px; margin-$spip_lang_left: 20px;'>",
+			WCalendar_controller($date,''),
+		  /*afficher_jour($jour, "name='jour' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\"", true),
+		  afficher_mois($mois, "name='mois' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\"", true),
+		  afficher_annee($annee, "name='annee' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\""),*/
+		  ' - ',
+		  afficher_heure($heure, "name='heure' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\""),
+		  afficher_minute($minute, "name='minute' size='1' class='fondl' onChange=\"setvisibility('valider_date', 'visible')\""),
+		  "<span class='visible_au_chargement' id='valider_date'>",
+		  " &nbsp; <INPUT TYPE='submit' NAME='Changer' CLASS='fondo' VALUE='"._T('bouton_changer')."'>",
+		  "</span>",
+		  "</div>",
+		  fin_block();
+	}
+	else {
+		echo "<div><b> <span class='verdana1'>"._T('texte_date_creation_article').'</span> ';
+		echo majuscules(affdate($date))."</b>".aide('artdate')."</div>";
+	}
+
+	$possedeDateRedac=($annee_redac.'-'.$mois_redac.'-'.$jour_redac != '0000-00-00');
+	if (($options == 'avancees' AND $GLOBALS['meta']["articles_redac"] != 'non')
+	OR $possedeDateRedac) {
+		if ($possedeDateRedac)
+			$date_affichee = majuscules(affdate($date_redac))
+#			." " ._T('date_fmt_heures_minutes', array('h' =>$heure_redac, 'm'=>$minute_redac))
+			;
+		else
+			$date_affichee = majuscules(_T('jour_non_connu_nc'));
+
+		echo "<div><b>";
+		echo bouton_block_invisible('dateredac');
+		echo "<span class='verdana1'>"
+			. majuscules(_T('texte_date_publication_anterieure'))
+			.'</span> '. $date_affichee ." ".aide('artdate_redac')."</b></div>";
+
+		echo debut_block_invisible('dateredac');
+		echo "<div style='margin: 5px; margin-$spip_lang_left: 20px;'>";
+		echo '<table cellpadding="0" cellspacing="0" border="0" width="100%">';
+		echo '<tr><td align="$spip_lang_left">';
+		echo '<input type="radio" name="avec_redac" value="non" id="avec_redac_on"';
+		if (!$possedeDateRedac) echo ' checked="checked"';
+		echo " onClick=\"setvisibility('valider_date_prec', 'visible')\"";
+		echo ' /> <label for="avec_redac_on">'._T('texte_date_publication_anterieure_nonaffichee').'</label>';
+		echo '<br /><input type="radio" name="avec_redac" value="oui" id="avec_redac_off"';
+		if ($possedeDateRedac) echo ' checked="checked"';
+		echo " onClick=\"setvisibility('valider_date_prec', 'visible')\"";
+		echo ' /> <label for="avec_redac_off">'._T('bouton_radio_afficher').' :</label> ',
+		WCalendar_controller($date_redac,'_redac');
+		/*afficher_jour($jour_redac, "name='jour_redac' class='fondl' onChange=\"setvisibility('valider_date_prec', 'visible')\"", true),
+		afficher_mois($mois_redac, "name='mois_redac' class='fondl' onChange=\"setvisibility('valider_date_prec', 'visible')\"", true);
+		echo "<input type='text' name='annee_redac' class='fondl' value='".$annee_redac."' size='5' maxlength='4' onClick=\"setvisibility('valider_date_prec', 'visible')\"/>";*/
+
+		echo '<div align="center">',
+		afficher_heure($heure_redac, "name='heure_redac' class='fondl' onChange=\"setvisibility('valider_date_prec', 'visible')\"", true),
+		afficher_minute($minute_redac, "name='minute_redac' class='fondl' onChange=\"setvisibility('valider_date_prec', 'visible')\"", true),
+		"</div>\n";
+
+		echo '</td><td align="$spip_lang_right">';
+		echo "<span class='visible_au_chargement' id='valider_date_prec'>";
+		echo '<input type="submit" name="Changer" class="fondo" value="'._T('bouton_changer').'" />';
+		echo "</span>";
+		echo '</td></tr>';
+		echo '</table>';
+		echo "</div>";
+		echo fin_block();
+	}
+
+	echo "</FORM>";
+	fin_cadre_couleur();
+ }
+else {
+	if ($statut_article == 'publie') $texte_date = _T('texte_date_publication_article');
+	else $texte_date = _T('texte_date_creation_article');
+
+	debut_cadre_couleur();
+		echo "<div style='text-align:center;'><b> <span class='verdana1'>$texte_date</span> ";
+		echo majuscules(affdate($date))."</b>".aide('artdate')."</div>";
+
+
+		if ($annee_redac.'-'.$mois_redac.'-'.$jour_redac != '0000-00-00') {
+			$date_affichee = ' : '.majuscules(affdate($date_redac));		
+			echo "<div style='text-align:center;'><b> <span class='verdana1'>"._T(texte_date_publication_anterieure)."</span> ";
+			echo $date_affichee."</b>".aide('artdate_redac')."</div>";
+		}
+
+	fin_cadre_couleur();
+ }
+}
+
+
+function langues_articles($id_article, $langue_article, $flag_editable, $id_rubrique, $id_trad, $dir_lang, $nom_select, $lier_trad)
+{
+
+  global $connect_statut, $couleur_claire, $options, $connect_toutes_rubriques;
+
+  if (($GLOBALS['meta']['multi_articles'] == 'oui')
+	OR (($GLOBALS['meta']['multi_rubriques'] == 'oui') AND ($GLOBALS['meta']['gerer_trad'] == 'oui'))) {
+
+	list($langue_article) = spip_fetch_array(spip_query("SELECT lang FROM spip_articles WHERE id_article=$id_article"),SPIP_NUM);
+
+	if ($GLOBALS['meta']['gerer_trad'] == 'oui')
+		$titre_barre = _T('titre_langue_trad_article');
+	else
+		$titre_barre = _T('titre_langue_article');
+
+	$titre_barre .= "&nbsp; (".traduire_nom_langue($langue_article).")";
+
+	debut_cadre_enfonce('langues-24.gif', false, "", bouton_block_invisible('languesarticle,ne_plus_lier,lier_traductions').$titre_barre);
+
+
+	// Choix langue article
+	if ($GLOBALS['meta']['multi_articles'] == 'oui' AND $flag_editable) {
+		echo debut_block_invisible('languesarticle');
+
+		$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
+		$langue_parent = $row['lang'];
+
+		debut_cadre_couleur();
+		echo "<div style='text-align: center;'>";
+		echo menu_langues('changer_lang', $langue_article, _T('info_multi_cet_article').' ', $langue_parent);
+		echo "</div>\n";
+		fin_cadre_couleur();
+
+		echo fin_block();
+	}
+
+
+	// Gerer les groupes de traductions
+	if ($GLOBALS['meta']['gerer_trad'] == 'oui') {
+		if ($flag_editable AND _request('supp_trad') == 'oui') { // Ne plus lier a un groupe de trad
+			spip_query("UPDATE spip_articles SET id_trad=0, date_modif=NOW() WHERE id_article = $id_article");
+
+			// Verifier si l'ancien groupe ne comporte plus qu'un seul article. Alors mettre a zero.
+			$result_autres_trad= spip_query("SELECT COUNT(id_article) AS total FROM spip_articles WHERE id_trad = $id_trad");
+			if ($row = spip_fetch_array($result_autres_trad))
+				$nombre_autres_trad = $row["total"];
+			if ($nombre_autres_trad == 1)
+				spip_query("UPDATE spip_articles SET id_trad = 0, date_modif=NOW() WHERE id_trad = $id_trad");
+
+			$id_trad = 0;
+		}
+
+		// Changer article de reference de la trad
+		if ($id_trad_new = intval($id_trad_new)
+		AND $id_trad_old = intval($id_trad_old)
+		AND $connect_statut=='0minirezo'
+		AND $connect_toutes_rubriques) { 
+			spip_query("UPDATE spip_articles SET id_trad = $id_trad_new, date_modif=NOW() WHERE id_trad = $id_trad_old");
+			$id_trad = $id_trad_new;
+		}
+
+		if ($flag_editable AND $lier_trad > 0) { // Lier a un groupe de trad
+			$result_lier = spip_query("SELECT id_trad FROM spip_articles WHERE id_article=$lier_trad");
+
+			if ($row = spip_fetch_array($result_lier)) {
+				$id_lier = $row['id_trad'];
+
+				if ($id_lier == 0) { // Si l'article vise n'a pas deja de traduction, creer nouveau id_trad
+					$nouveau_trad = $lier_trad;
+				}
+				else {
+					if ($id_lier == $id_trad) $err = "<div>"._T('trad_deja_traduit')."</div>";
+					$nouveau_trad = $id_lier;
+				}
+
+				spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad, date_modif=NOW() WHERE id_article = $lier_trad");
+				if ($id_lier > 0) spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad, date_modif=NOW() WHERE id_trad = $id_lier");
+				spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad, date_modif=NOW() WHERE id_article = $id_article");
+				if ($id_trad > 0) spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad, date_modif=NOW() WHERE id_trad = $id_trad");
+
+				$id_trad = $nouveau_trad;
+			}
+			else
+				$err .= "<div>"._T('trad_article_inexistant')."</div>";
+
+			if ($err) echo "<font color='red' size=2' face='verdana,arial,helvetica,sans-serif'>$err</font>";
+		}
+
+
+		// Afficher la liste des traductions
+		if ($id_trad != 0) {
+			$result_trad = spip_query("SELECT id_article, id_rubrique, titre, lang, statut FROM spip_articles WHERE id_trad = $id_trad");
+			
+			$table='';
+			while ($row = spip_fetch_array($result_trad)) {
+				$vals = '';
+				$id_article_trad = $row["id_article"];
+				$id_rubrique_trad = $row["id_rubrique"];
+				$titre_trad = $row["titre"];
+				$lang_trad = $row["lang"];
+				$statut_trad = $row["statut"];
+
+				changer_typo($lang_trad);
+				$titre_trad = "<span $dir_lang>$titre_trad</span>";
+
+				if ($ifond == 1) {
+					$ifond = 0;
+					$bgcolor = "white";
+				} else {
+					$ifond = 1;
+					$bgcolor = $couleur_claire;
+				}
+
+
+				$vals[] = http_img_pack("puce-".puce_statut($statut_trad).'.gif', "", "width='7' height='7' border='0' NAME='statut'");
+				
+				if ($id_article_trad == $id_trad) {
+				  $vals[] = http_img_pack('langues-12.gif', "", "width='12' height='12' border='0'");
+					$titre_trad = "<b>$titre_trad</b>";
+				} else {
+				  if ($connect_statut=='0minirezo'
+				  AND $connect_toutes_rubriques)
+				  	$vals[] = "<a href='" . generer_url_ecrire("articles","id_article=$id_article&id_trad_old=$id_trad&id_trad_new=$id_article_trad&id_rubrique=$id_rubrique_trad") . "'>". 
+				    http_img_pack('langues-off-12.gif', _T('trad_reference'), "width='12' height='12' border='0'", _T('trad_reference')) . "</a>";
+				  else $vals[] = http_img_pack('langues-off-12.gif', "", "width='12' height='12' border='0'");
+				}
+
+				$ret .= "</td>";
+
+				$s = typo($titre_trad);
+				if ($id_article_trad != $id_article) 
+					$s = "<a href='" . generer_url_ecrire("articles","id_article=$id_article_trad&id_rubrique=$id_rubrique_trad") . "'>$s</a>";
+				if ($id_article_trad == $id_trad)
+					$s .= " "._T('trad_reference');
+
+				$vals[] = $s;
+				$vals[] = traduire_nom_langue($lang_trad);
+				$table[] = $vals;
+			}
+
+			// changer_typo($spip_lang); (probleme d'affichage rtl?)
+
+			// bloc traductions
+			if (count($vals) > 0) {
+
+				echo "<div class='liste'>";
+				bandeau_titre_boite2(_T('trad_article_traduction'),'');
+				echo "<table width='100%' cellspacing='0' border='0' cellpadding='2'>";
+				//echo "<tr bgcolor='#eeeecc'><td colspan='4' class='serif2'><b>"._T('trad_article_traduction')."</b></td></tr>";
+
+				$largeurs = array(7, 12, '', 100);
+				$styles = array('', '', 'arial2', 'arial2');
+				echo afficher_liste($largeurs, $table, $styles);
+
+				echo "</table>";
+				echo "</div>";
+
+			}
+
+			changer_typo($langue_article);
+		}
+
+		echo debut_block_invisible('lier_traductions');
+
+		echo "<table width='100%'><tr>";
+		if ($flag_editable AND $options == "avancees" AND !$ret) {
+			// Formulaire pour lier a un article
+			echo "<td class='arial2' width='60%'>";
+
+			echo "<form action='" . generer_url_ecrire("articles","id_article=$id_article") . "' method='post' style='margin:0px; padding:0px;'>";
+			echo _T('trad_lier');
+			echo "<div align='$spip_lang_right'><input type='text' class='fondl' name='lier_trad' size='5'> <INPUT TYPE='submit' NAME='Valider' VALUE='"._T('bouton_valider')."' CLASS='fondl'></div>";
+			echo "</form>";
+			echo "</td>\n";
+			echo "<td background='' width='10'> &nbsp; </td>";
+			echo "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>";
+			echo "<td background='' width='10'> &nbsp; </td>";
+		}
+		echo "<td>";
+		icone_horizontale(_T('trad_new'), generer_url_ecrire("articles_edit","new=oui&lier_trad=$id_article&id_rubrique=$id_rubrique"), "traductions-24.gif", "creer.gif");
+		echo "</td>";
+		if ($flag_editable AND $options == "avancees" AND $ret) {
+			echo "<td background='' width='10'> &nbsp; </td>";
+			echo "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>";
+			echo "<td background='' width='10'> &nbsp; </td>";
+			echo "<td>";
+			icone_horizontale(_T('trad_delier'), generer_url_ecrire("articles","id_article=$id_article&supp_trad=oui"), "traductions-24.gif", "supprimer.gif");
+			echo "</td>\n";
+		}
+
+		echo "</tr></table>";
+
+		echo fin_block();
+	}
+
+	fin_cadre_enfonce();
+  }
+}
+
+function add_auteur_article($id_article, $nouv_auteur)
+{
+	$res = spip_query("SELECT id_article FROM spip_auteurs_articles WHERE id_auteur='$nouv_auteur' AND id_article='$id_article'");
+	if (!spip_num_rows($res))
+		spip_abstract_insert('spip_auteurs_articles', "(id_auteur,id_article)", "('$nouv_auteur','$id_article')");
+}
+
+function rechercher_auteurs_articles($cherche_auteur, $id_article, $id_rubrique, $ajout_auteur, $flag_editable, $nouv_auteur, $supp_auteur)
+{
+  global $spip_lang_left;
+
+  $supprimer_bouton_creer_auteur = false;
+
+  if ($cherche_auteur) {
+	echo "<P ALIGN='$spip_lang_left'>";
+	$result = spip_query("SELECT id_auteur, nom FROM spip_auteurs");
+	$table_auteurs = array();
+	$table_ids = array();
+	while ($row = spip_fetch_array($result)) {
+		$table_auteurs[] = $row["nom"];
+		$table_ids[] = $row["id_auteur"];
+	}
+	$resultat = mots_ressemblants($cherche_auteur, $table_auteurs, $table_ids);
+	debut_boite_info();
+	if (!$resultat) {
+		echo "<B>"._T('texte_aucun_resultat_auteur', array('cherche_auteur' => $cherche_auteur)).".</B><BR>";
+	}
+	else if (count($resultat) == 1) {
+		$ajout_auteur = 'oui';
+		list(, $nouv_auteur) = each($resultat);
+		echo "<B>"._T('texte_ajout_auteur')."</B><BR>";
+		$result = spip_query("SELECT * FROM spip_auteurs WHERE id_auteur=$nouv_auteur");
+		echo "<UL>";
+		while ($row = spip_fetch_array($result)) {
+			$id_auteur = $row['id_auteur'];
+			$nom_auteur = $row['nom'];
+			$email_auteur = $row['email'];
+			$bio_auteur = $row['bio'];
+
+			echo "<LI><FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=2><B><FONT SIZE=3>".typo($nom_auteur)."</FONT></B>";
+			echo "</FONT>\n";
+		}
+		echo "</UL>";
+	}
+	else if (count($resultat) < 16) {
+		reset($resultat);
+		$les_auteurs = array();
+		while (list(, $id_auteur) = each($resultat)) $les_auteurs[] = $id_auteur;
+		if ($les_auteurs) {
+			$les_auteurs = join(',', $les_auteurs);
+			echo "<B>"._T('texte_plusieurs_articles', array('cherche_auteur' => $cherche_auteur))."</B><BR>";
+			$result = spip_query("SELECT * FROM spip_auteurs WHERE id_auteur IN ($les_auteurs) ORDER BY nom");
+
+			echo "<UL class='verdana1'>";
+			while ($row = spip_fetch_array($result)) {
+				$id_auteur = $row['id_auteur'];
+				$nom_auteur = $row['nom'];
+				$email_auteur = $row['email'];
+				$bio_auteur = $row['bio'];
+
+				echo "<li><b>".typo($nom_auteur)."</b>";
+
+				if ($email_auteur) echo " ($email_auteur)";
+				echo " | <A href='", generer_url_ecrire('articles', "id_article=$id_article&ajout_auteur=oui&nouv_auteur=$id_auteur#auteurs"),
+				  "'>",_T('lien_ajouter_auteur'),"</A>";
+
+				if (trim($bio_auteur)) {
+					echo "<br />".couper(propre($bio_auteur), 100)."\n";
+				}
+				echo "</li>\n";
+			}
+			echo "</UL>";
+		}
+	}
+	else {
+		echo "<B>"._T('texte_trop_resultats_auteurs', array('cherche_auteur' => $cherche_auteur))."</B><BR>";
+	}
+
+	if ($GLOBALS['connect_statut'] == '0minirezo' 
+	AND $GLOBALS['connect_toutes_rubriques']) {
+
+		echo "<div style='width: 200px;'>";
+		$retour = rawurlencode(generer_url_ecrire("articles","id_article=$id_article"));
+		$titre = rawurlencode($cherche_auteur);
+		icone_horizontale(_T('icone_creer_auteur'), generer_url_ecrire("auteur_infos","ajouter_id_article=$id_article&nom=$titre&redirect=$retour"), "redacteurs-24.gif", "creer.gif");
+		echo "</div> ";
+
+		// message pour ne pas afficher le second bouton "creer un auteur"
+		$supprimer_bouton_creer_auteur = true;
+	}
+
+	fin_boite_info();
+	echo "<P>";
+
+  }
+
+//
+// Appliquer les modifications sur les auteurs
+//
+
+  if ($ajout_auteur && $flag_editable) {
+	if ($nouv_auteur > 0) {
+		add_auteur_article($id_article, $nouv_auteur);
+	}
+
+	if ($GLOBALS['meta']['activer_moteur'] == 'oui') {
+		include_spip("inc/indexation");
+		marquer_indexer('article', $id_article);
+	}
+  }
+
+
+  if ($supp_auteur && $flag_editable) {
+	spip_query("DELETE FROM spip_auteurs_articles WHERE id_auteur='$supp_auteur' AND id_article='$id_article'");
+
+	if ($GLOBALS['meta']['activer_moteur'] == 'oui') {
+		include_spip("inc/indexation");
+		marquer_indexer('article', $id_article);
+	}
+  }
+
+  return $supprimer_bouton_creer_auteur;
+}
+
+function afficher_auteurs_articles($id_article, $flag_editable)
+{
+	global $connect_statut, $options,$connect_id_auteur;
+
+	$les_auteurs = array();
+
+	$result = spip_query("SELECT * FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE auteurs.id_auteur=lien.id_auteur AND lien.id_article=$id_article GROUP BY auteurs.id_auteur ORDER BY auteurs.nom");
+
+	if (spip_num_rows($result)) {
+		echo "<div class='liste'>";
+		echo "<table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>";
+		$table = array();
+		while ($row = spip_fetch_array($result)) {
+			$vals = array();
+			$id_auteur = $row["id_auteur"];
+			$nom_auteur = $row["nom"];
+			$email_auteur = $row["email"];
+			if ($bio_auteur = attribut_html(propre(couper($row["bio"], 100))))
+			  $bio_auteur = " TITLE=\"$bio_auteur\"";
+			$url_site_auteur = $row["url_site"];
+			$statut_auteur = $row["statut"];
+			if ($row['messagerie'] == 'non' OR $row['login'] == '') $messagerie = 'non';
+			
+			$les_auteurs[] = $id_auteur;
+
+			if ($connect_statut == "0minirezo") $aff_articles = "('prepa', 'prop', 'publie', 'refuse')";
+			else $aff_articles = "('prop', 'publie')";
+
+			$result2 = spip_query("SELECT COUNT(articles.id_article) AS compteur FROM spip_auteurs_articles AS lien, spip_articles AS articles WHERE lien.id_auteur=$id_auteur AND articles.id_article=lien.id_article AND articles.statut IN $aff_articles GROUP BY lien.id_auteur");
+
+			if ($result2) list($nombre_articles) = spip_fetch_array($result2,SPIP_NUM);
+			else $nombre_articles = 0;
+
+			$vals[] = bonhomme_statut($row);
+
+			$vals[] = "<A href='" . generer_url_ecrire('auteurs_edit', "id_auteur=$id_auteur") . "' $bio_auteur>".typo($nom_auteur)."</A>";
+
+			$vals[] = bouton_imessage($id_auteur);
+
+		
+		
+		if ($email_auteur) $vals[] =  "<A href='mailto:$email_auteur'>"._T('email')."</A>";
+		else $vals[] =  "&nbsp;";
+
+		if ($url_site_auteur) $vals[] =  "<A href='$url_site_auteur'>"._T('info_site_min')."</A>";
+		else $vals[] =  "&nbsp;";
+
+		if ($nombre_articles > 1) $vals[] =  $nombre_articles.' '._T('info_article_2');
+		else if ($nombre_articles == 1) $vals[] =  _T('info_1_article');
+		else $vals[] =  "&nbsp;";
+
+		if ($flag_editable AND ($connect_id_auteur != $id_auteur OR $connect_statut == '0minirezo') AND $options == 'avancees') {
+		  $vals[] =  "<A href='" . generer_url_ecrire("articles","id_article=$id_article&supp_auteur=$id_auteur#auteurs") . "'>"._T('lien_retirer_auteur')."&nbsp;". http_img_pack('croix-rouge.gif', "X", "width='7' height='7' border='0' align='middle'") . "</A>";
+		} else {
+			$vals[] = "";
+		}
+		
+		$table[] = $vals;
+		}
+	
+	
+	$largeurs = array('14', '', '', '', '', '', '');
+	$styles = array('arial11', 'arial2', 'arial11', 'arial11', 'arial11', 'arial11', 'arial1');
+	echo afficher_liste($largeurs, $table, $styles);
+
+	
+	echo "</table></div>\n";
+
+	$les_auteurs = join(',', $les_auteurs);
+	}
+	return $les_auteurs ;
+}
+
+
+function ajouter_auteurs_articles($id_article, $id_rubrique, $les_auteurs, $flag_editable, $rubrique_article, $supprimer_bouton_creer_auteur)
+{
+	global $connect_toutes_rubriques, $connect_statut, $couleur_claire ;
+
+	echo debut_block_invisible("auteursarticle");
+	echo "<table width='100%'><tr>";
+
+	if ($connect_statut == '0minirezo'
+	    AND $connect_toutes_rubriques
+	    AND !$supprimer_bouton_creer_auteur) {
+	echo "<td width='200'>";
+	$retour = rawurlencode(generer_url_ecrire("articles","id_article=$id_article"));
+	icone_horizontale(_T('icone_creer_auteur'), generer_url_ecrire("auteur_infos","ajouter_id_article=$id_article&redirect=$retour"), "redacteurs-24.gif", "creer.gif");
+	echo "</td>";
+	echo "<td width='20'>&nbsp;</td>";
+	}
+
+	echo "<td>";
+
+	$result = spip_query("SELECT * FROM spip_auteurs WHERE " .
+			(!$les_auteurs ? '' : "id_auteur NOT IN ($les_auteurs) AND ") .
+			"statut!='5poubelle' AND statut!='6forum' AND statut!='nouveau' ORDER BY statut, nom");
+
+	$num = spip_num_rows($result);
+	if ($num) {
+		echo generer_url_post_ecrire("articles", "id_article=$id_article");;
+		echo "<span class='verdana1'><B>"._T('titre_cadre_ajouter_auteur')."&nbsp; </B></span>\n";
+		echo "<DIV><INPUT TYPE='Hidden' NAME='id_article' VALUE=\"$id_article\">";
+
+		if ($num > 200) {
+			echo "<INPUT TYPE='text' NAME='cherche_auteur' onClick=\"setvisibility('valider_ajouter_auteur','visible');\" CLASS='fondl' VALUE='' SIZE='20'>";
+			echo "<span  class='visible_au_chargement' id='valider_ajouter_auteur'>";
+			echo " <INPUT TYPE='submit' NAME='Chercher' VALUE='"._T('bouton_chercher')."' CLASS='fondo'>";
+			echo "</span>";
+		} else {
+			echo "<INPUT TYPE='Hidden' NAME='ajout_auteur' VALUE='oui'>";
+			echo "<SELECT NAME='nouv_auteur' SIZE='1' STYLE='width:150px;' CLASS='fondl' onChange=\"setvisibility('valider_ajouter_auteur','visible');\">";
+			while ($row = spip_fetch_array($result)) {
+				$id_auteur = $row["id_auteur"];
+				$nom = $row["nom"];
+				$email = $row["email"];
+				$statut = $row["statut"];
+
+				$statut=str_replace("0minirezo", _T('info_administrateurs'), $statut);
+				$statut=str_replace("1comite", _T('info_redacteurs'), $statut);
+				$statut=str_replace("6visiteur", _T('info_visiteurs'), $statut);
+				
+				$premiere = strtoupper(substr(trim($nom), 0, 1));
+
+				if ($connect_statut != '0minirezo')
+					if ($p = strpos($email, '@'))
+					  $email = substr($email, 0, $p).'@...';
+				if ($email)
+					$email = " ($email)";
+
+				if ($statut != $statut_old) {
+					echo "\n<OPTION VALUE=\"x\">";
+					echo "\n<OPTION VALUE=\"x\" style='background-color: $couleur_claire;'> $statut";
+				}
+
+				if ($premiere != $premiere_old AND ($statut != _T('info_administrateurs') OR !$premiere_old)) {
+				  echo "\n<OPTION VALUE=\"x\">";
+				}
+
+				
+				echo "\n<OPTION VALUE=\"$id_auteur\">&nbsp;&nbsp;&nbsp;&nbsp;", supprimer_tags(couper(typo("$nom$email"), 40));
+				$statut_old = $statut;
+				$premiere_old = $premiere;
+			}
+			
+			echo "</SELECT>",
+				"<span  class='visible_au_chargement' id='valider_ajouter_auteur'>",
+				" <input type='submit' value="._T('bouton_ajouter')." CLASS='fondo'>",
+				"</span>";
+		}
+		echo "</div></FORM>";
+	}
+	
+	echo "</td></tr></table>";
+
+	echo fin_block();
+}
+
+function afficher_corps_articles($virtuel, $chapo, $texte, $ps,  $extra)
+{
+  global $revision_nbsp, $activer_revision_nbsp, $champs_extra, $les_notes, $dir_lang;
+
+	echo "\n\n<div align='justify' style='padding: 10px;'>";
+
+	if ($virtuel) {
+		debut_boite_info();
+		echo _T('info_renvoi_article')." ".propre("<center>[->$virtuel]</center>");
+		fin_boite_info();
+	} else {
+		$revision_nbsp = $activer_revision_nbsp;
+
+		if (strlen($chapo) > 0) {
+			echo "<div $dir_lang><b>";
+			echo propre($chapo);
+			echo "</b></div>\n\n";
+		}
+
+		echo "<div $dir_lang>";
+#	echo reduire_image(propre($texte), 500,10000);
+		echo propre($texte);
+		echo "<br clear='both' />";
+		echo "</div>";
+
+		if ($ps) {
+			echo debut_cadre_enfonce();
+			echo "<div $dir_lang><font style='font-family:Verdana,Arial,Sans,sans-serif; font-size: small;'>";
+			echo justifier("<b>"._T('info_ps')."</b> ".propre($ps));
+			echo "</font></div>";
+			echo fin_cadre_enfonce();
+		}
+		$revision_nbsp = false;
+
+		if ($les_notes) {
+			echo debut_cadre_relief();
+			echo "<div $dir_lang class='arial11'>";
+			echo justifier("<b>"._T('info_notes')."&nbsp;:</b> ".$les_notes);
+			echo "</div>";
+			echo fin_cadre_relief();
+		}
+		
+		if ($champs_extra AND $extra) {
+			include_spip('inc/extra');
+			extra_affichage($extra, "articles");
+		}
+	}
+}
+
+function affiche_forums_article($id_article, $id_rubrique, $titre, $debut, $mute=false)
+{
+  global $spip_lang_left;
+
+  echo "<BR><BR>";
+
+  $forum_retour = generer_url_ecrire("articles","id_article=$id_article", true);
+  
+  if (!$mute) {
+    $tm = rawurlencode($titre);
+    echo "\n<div align='center'>";
+    icone(_T('icone_poster_message'), generer_url_ecrire("forum_envoi","statut=prive&adresse_retour=" . rawurlencode($forum_retour) . "&id_article=$id_article&titre_message=$tm"), "forum-interne-24.gif", "creer.gif");
+    echo "</div>";
+  }
+
+  echo "<P align='$spip_lang_left'>";
+
+  $result_forum = spip_query("SELECT COUNT(*) AS cnt FROM spip_forum WHERE statut='prive' AND id_article='$id_article' AND id_parent=0");
+
+  $total = 0;
+  if ($row = spip_fetch_array($result_forum)) $total = $row["cnt"];
+
+  if (!$debut) $debut = 0;
+  $total_afficher = 8;
+  if ($total > $total_afficher) {
+	echo "<div class='serif2' align='center'>";
+	for ($i = 0; $i < $total; $i = $i + $total_afficher){
+		$y = $i + $total_afficher - 1;
+		if ($i == $debut)
+			echo "<FONT SIZE=3><B>[$i-$y]</B></FONT> ";
+		else
+			echo "[<A href='" . generer_url_ecrire("articles","id_article=$id_article&debut=$i") . "'>$i-$y</A>] ";
+	}
+	echo "</div>";
+}
+
+	$result_forum = spip_query("SELECT * FROM spip_forum WHERE statut='prive' AND id_article='$id_article' AND id_parent=0 ORDER BY date_heure DESC" .
+#				   " LIMIT $total_afficher OFFSET $debut" # PG
+				   " LIMIT $debut,$total_afficher"
+				   ); 
+
+	afficher_forum($result_forum, $forum_retour, $mute);
+
+	if (!$debut) $debut = 0;
+	$total_afficher = 8;
+	if ($total > $total_afficher) {
+	  echo "<div class='serif2' align='center'>";
+	  for ($i = 0; $i < $total; $i = $i + $total_afficher){
+		$y = $i + $total_afficher - 1;
+		if ($i == $debut)
+			echo "<FONT SIZE=3><B>[$i-$y]</B></FONT> ";
+		else
+			echo "[<A href='" . generer_url_ecrire("articles","id_article=$id_article&debut=$i") . "'>$i-$y</A>] ";
+	  }
+	  echo "</div>";
+	}
+
+	echo "</div>\n";
+}
+
+function afficher_statut_articles($id_article, $rubrique_article, $statut_article)
+{
+  global $connect_statut;
+
+  if ($connect_statut == '0minirezo' AND acces_rubrique($rubrique_article)) {
+  	
+    echo "\n<form method='post' action='",
+      generer_action_auteur("instituer", "article $id_article", generer_url_ecrire('articles', "id_article=$id_article", true)),
+      "'>",
+	  debut_cadre_relief("", true),
+      "\n<center>", "<B>",_T('texte_article_statut'),"</B>",
+	  "\n<SELECT NAME='statut_nouv' SIZE='1' CLASS='fondl'\n",
+	  "onChange=\"document.statut.src='",
+	  _DIR_IMG_PACK,
+	  "' + puce_statut(options[selectedIndex].value);",
+	  " setvisibility('valider_statut', 'visible');\">\n",
+	 "<OPTION" , mySel("prepa", $statut_article) ," style='background-color: white'>",_T('texte_statut_en_cours_redaction'),"</OPTION>\n",
+	 "<OPTION" , mySel("prop", $statut_article) , " style='background-color: #FFF1C6'>",_T('texte_statut_propose_evaluation'),"</OPTION>\n",
+	 "<OPTION" , mySel("publie", $statut_article) , " style='background-color: #B4E8C5'>",_T('texte_statut_publie'),"</OPTION>\n",
+	 "<OPTION" , mySel("poubelle", $statut_article),
+	   http_style_background('rayures-sup.gif') , '>' ,_T('texte_statut_poubelle'),"</OPTION>\n",
+	 "<OPTION" , mySel("refuse", $statut_article) , " style='background-color: #FFA4A4'>",_T('texte_statut_refuse'),"</OPTION>\n",
+	  "</SELECT>",
+	  " &nbsp; ",
+	  http_img_pack("puce-".puce_statut($statut_article).'.gif', "", "border='0' NAME='statut'"),
+	  "  &nbsp;\n";
+
+	echo "<span class='visible_au_chargement' id='valider_statut'>";
+	echo "<INPUT TYPE='submit' VALUE='"._T('bouton_valider')."' CLASS='fondo'>";
+	echo "</span>";
+	echo aide("artstatut");
+	echo "</center>";
+	fin_cadre_relief();
+	echo "\n</form>";
+ }
+}
+
+//
+// Reunit les textes decoupes parce que trop longs
+//
+
+function trop_longs_articles($texte_plus)
+{
+	$nb_texte = 0;
+	while ($nb_texte ++ < count($texte_plus)+1){
+		$texte_ajout .= ereg_replace("<!--SPIP-->[\n\r]*","",
+					     $texte_plus[$nb_texte]);
+	}
+	return $texte_ajout;
+}
+
+
+function modif_langue_articles($id_article, $id_rubrique, $changer_lang)
+{
+
+// Appliquer la modification de langue
+ if ($GLOBALS['meta']['multi_articles'] == 'oui') {
+	list($langue_parent) = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=" . $id_rubrique),SPIP_NUM);
+
+	if ($changer_lang) {
+		if ($changer_lang != "herit")
+			spip_query("UPDATE spip_articles SET lang='".addslashes($changer_lang)."', langue_choisie='oui', date_modif=NOW() WHERE id_article=$id_article");
+		else
+			spip_query("UPDATE spip_articles SET lang='".addslashes($langue_parent)."', langue_choisie='non', date_modif=NOW() WHERE id_article=$id_article");
+	}
+ }
+}
+
+// Passer les images/docs en "inclus=non"
+
+function inclus_non_articles($id_article)
+{
+  $result = spip_query("SELECT docs.id_document FROM spip_documents AS docs, spip_documents_articles AS lien WHERE lien.id_article=$id_article AND lien.id_document=docs.id_document");
+
+while($row=spip_fetch_array($result)){
+	$ze_doc[]=$row['id_document'];
+}
+
+if (count($ze_doc)>0){
+	$ze_docs = join($ze_doc,",");
+	spip_query("UPDATE spip_documents SET inclus='non' WHERE id_document IN ($ze_docs)");
+}
+
+}
+
+function revisions_articles ($id_article, $id_secteur, $id_rubrique, $id_rubrique_old, $change_rubrique, $new, $champs) {
+{
+  global $connect_id_auteur, $flag_revisions, $champs_extra;
+
+	// Stockage des versions : creer une premier version si non-existante
+	if (($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions) {
+		include_spip('inc/revisions');
+		if  ($new != 'oui') {
+			$query = spip_query("SELECT id_article FROM spip_versions WHERE id_article=$id_article LIMIT 1");
+			if (!spip_num_rows($query)) {
+				$select = join(", ", array_keys($champs));
+				$query = spip_query("SELECT $select FROM spip_articles WHERE id_article=$id_article");
+				$champs_originaux = spip_fetch_array($query);
+				$id_version = ajouter_version($id_article, $champs_originaux, _T('version_initiale'), 0);
+
+				// Remettre une date un peu ancienne pour la version initiale 
+				if ($id_version == 1) // test inutile ?
+				spip_query("UPDATE spip_versions SET date=DATE_SUB(NOW(), INTERVAL 2 HOUR) WHERE id_article=$id_article AND id_version=1");
+			}
+		}
+	}
+
+	if ($champs_extra) {
+		include_spip('inc/extra');
+		$champs_extra = ", extra = '".addslashes(extra_recup_saisie("articles", $id_secteur))."'";
+	}
+
+	spip_query("UPDATE spip_articles SET surtitre='" .
+		   addslashes($champs['surtitre']) .
+		   "', titre='" .
+		   addslashes($champs['titre']) .
+		   "', soustitre='" .
+		   addslashes($champs['soustitre']) .
+		   "', id_rubrique=" .
+		   intval($id_rubrique) .
+		   ", descriptif='" .
+		   addslashes($champs['descriptif']) .
+		   "', chapo='" .
+		   addslashes($champs['chapo']) .
+		   "', texte='" .
+		   addslashes($champs['texte']) .
+		   "', ps='" .
+		   addslashes($champs['ps']) .
+		   "', url_site='" .
+		   addslashes($champs['url_site']) .
+		   "', nom_site='" .
+		   addslashes($champs['nom_site']) .
+		   "', date_modif=NOW() $champs_extra WHERE id_article=$id_article");
+
+	// Stockage des versions
+	if (($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions) {
+		ajouter_version($id_article, $champs, '', $connect_id_auteur);
+	}
+
+	// Changer la langue heritee
+	if ($id_rubrique != $id_rubrique_old) {
+		propager_les_secteurs();
+		$row = spip_fetch_array(spip_query("SELECT lang, langue_choisie FROM spip_articles WHERE id_article=$id_article"));
+		$langue_old = $row['lang'];
+		$langue_choisie_old = $row['langue_choisie'];
+
+		if ($langue_choisie_old != "oui") {
+			$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
+			$langue_new = $row['lang'];
+			if ($langue_new != $langue_old) spip_query("UPDATE spip_articles SET lang = '$langue_new', date_modif=NOW() WHERE id_article = $id_article");
+		}
+	}
+
+	// marquer l'article (important pour les articles nouvellement crees)
+	spip_query("UPDATE spip_articles SET date_modif=NOW(), auteur_modif=$connect_id_auteur WHERE id_article=$id_article");
+	calculer_rubriques();
+ }
+}
+
+function insert_article($id_parent, $new)
+{
+	if ($new!='oui')  redirige_par_entete("./");
+	// Avec l'Ajax parfois id_rubrique vaut 0... ne pas l'accepter
+	if (!$id_rubrique = intval($id_parent)) {
+		list($id_rubrique) = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 ORDER by 0+titre,titre LIMIT 1"),SPIP_NUM);
+	}
+
+	$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
+
+	$id_article = spip_abstract_insert("spip_articles",
+			"(id_rubrique, statut, date, accepter_forum, lang, langue_choisie)", 
+			"($id_rubrique, 'prepa', NOW(), '" .
+				substr($GLOBALS['meta']['forums_publics'],0,3)
+				. "', '"
+				. ($row["lang"] ? $row["lang"] : $GLOBALS['meta']['langue_site'])
+				. "', 'non')");
+	return $id_article;
+}
+// Y a-t-il vraiment 56 variables determinant l'edition d'un article ?
+
+function exec_articles_dist()
+{
+global $ajout_auteur, $annee, $annee_redac, $avec_redac, $champs_extra, $change_accepter_forum, $change_petition, $changer_lang, $changer_virtuel, $chapo, $cherche_auteur, $cherche_mot, $connect_id_auteur, $date, $date_redac, $debut, $descriptif, $email_unique, $heure, $heure_redac, $id_article, $id_article_bloque, $id_parent, $id_rubrique_old, $id_secteur, $jour, $jour_redac, $langue_article, $lier_trad, $message, $minute, $minute_redac, $mois, $mois_redac, $new, $nom_select, $nom_site, $nouv_auteur, $nouv_mot, $ps, $row, $site_obli, $site_unique, $soustitre, $supp_auteur, $supp_mot, $surtitre, $texte, $texte_petition, $texte_plus, $titre, $titre_article, $url_site, $virtuel; 
+
+ $id_parent = intval($id_parent);
+ $nouv_auteur = intval($nouv_auteur);
+ if (!($id_article=intval($id_article))) {
+   $id_article = insert_article($id_parent, $new);
+   add_auteur_article($id_article, $connect_id_auteur);
+ }
+
+// aucun doc implicitement inclus au départ.
+
+inclus_non_articles($id_article);
+
+
+if ($row = spip_fetch_array(spip_query("SELECT statut, titre, id_rubrique FROM spip_articles WHERE id_article=$id_article"))) {
+	$statut_article = $row['statut'];
+	$titre_article = $row['titre'];
+	$id_rubrique = $row['id_rubrique'];
+	$statut_rubrique = acces_rubrique($id_rubrique);
+	if ($titre_article=='') $titre_article = _T('info_sans_titre');
+}
+else {
+	$statut_article = '';
+	$statut_rubrique = false;
+	$id_rubrique = '0';
+	if ($titre=='') $titre = _T('info_sans_titre');
+}
+
+$flag_auteur = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=$id_article AND id_auteur=$connect_id_auteur LIMIT 1"));
+
+ $flag_editable = ($statut_rubrique OR ($flag_auteur AND $flag_editable));
+
+if ($flag_editable) {
+
+if ($jour) {
+	$date = format_mysql_date($annee, $mois, $jour, $heure, $minute);
+	spip_query("UPDATE spip_articles SET date='$date', date_modif=NOW()
+		WHERE id_article=$id_article");
+	calculer_rubriques();
+}
+
+if ($jour_redac) {
+	if ($annee_redac<>'' AND $annee_redac < 1001) $annee_redac += 9000;
+
+	if ($avec_redac == 'non')
+		$date_redac = format_mysql_date();
+	else
+		$date_redac = format_mysql_date(
+			$annee_redac, $mois_redac, $jour_redac,
+			$heure_redac, $minute_redac);
+
+	spip_query("UPDATE spip_articles SET date_redac='$date_redac',  date_modif=NOW() WHERE id_article=$id_article");
+}
+
+
+modif_langue_articles($id_article, $id_rubrique, $changer_lang);
+
+maj_documents($id_article, 'article');
+
+if ($changer_virtuel) {
+	$virtuel = eregi_replace("^http://$", "", trim($virtuel));
+	if ($virtuel) $chapo = addslashes(corriger_caracteres("=$virtuel"));
+	else $chapo = "";
+	spip_query("UPDATE spip_articles SET chapo='$chapo', date_modif=NOW() WHERE id_article=$id_article");
+}
+
+if ($titre) {
+
+  // prendre en compte le changement eventuel, et seulement si autorise
+	if ($id_parent AND ($flag_auteur OR acces_rubrique($id_parent))) {
+		$id_rubrique = $id_parent;
+	}
+	$champs = array(
+			'surtitre' => corriger_caracteres($surtitre),
+			'titre' => ($titre_article=corriger_caracteres($titre)),
+			'soustitre' => corriger_caracteres($soustitre),
+			'descriptif' => corriger_caracteres($descriptif),
+			'nom_site' => corriger_caracteres($nom_site),
+			'url_site' => corriger_caracteres($url_site),
+			'chapo' => corriger_caracteres($chapo),
+			'texte' => corriger_caracteres(trop_longs_articles($texte_plus) . $texte),
+			'ps' => corriger_caracteres($ps))  ;
+
+	revisions_articles ($id_article, $id_secteur, $id_rubrique, $id_rubrique_old,
+			    ($flag_auteur||$statut_rubrique),
+			    $new, $champs);
+	$id_article_bloque = $id_article;   // message pour inc/presentation
+
+ }
+ }
+
+exec_affiche_articles_dist($id_article, $ajout_auteur, $change_accepter_forum, $change_petition, $changer_virtuel, $cherche_auteur, $cherche_mot, $debut, $email_unique, $flag_auteur, $flag_editable, $langue_article, $message, $nom_select, $nouv_auteur, $nouv_mot, $id_rubrique, $site_obli, $site_unique, $supp_auteur, $supp_mot, $texte_petition, $titre_article, $lier_trad);
+
+}
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/SPIP.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/SPIP.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/SPIP.js	(revision 30)
@@ -0,0 +1,68 @@
+/*
+Copyright (c) 2006 Yahoo! Inc. All rights reserved.
+version 0.9.0
+*/
+
+/**
+ * @class The Spip global namespace
+ */
+var SPIP = function() {
+
+    return {
+
+        /**
+         * Spip presentation platform utils namespace
+         */
+        util: {},
+
+        /**
+         * Spip presentation platform widgets namespace
+         */
+        widget: {},
+
+        /**
+         * Spip presentation platform examples namespace
+         */
+        example: {},
+
+        /**
+         * Returns the namespace specified and creates it if it doesn't exist
+         *
+         * SPIP.namespace("property.package");
+         * SPIP.namespace("SPIP.property.package");
+         *
+         * Either of the above would create SPIP.property, then
+         * SPIP.property.package
+         *
+         * @param  {String} sNameSpace String representation of the desired
+         *                             namespace
+         * @return {Object}            A reference to the namespace object
+         */
+        namespace: function( sNameSpace ) {
+
+            if (!sNameSpace || !sNameSpace.length) {
+                return null;
+            }
+
+            var levels = sNameSpace.split(".");
+
+            var currentNS = SPIP;
+
+            // SPIP is implied, so it is ignored if it is included
+            for (var i=(levels[0] == "SPIP") ? 1 : 0; i<levels.length; ++i) {
+                currentNS[levels[i]] = currentNS[levels[i]] || {};
+                currentNS = currentNS[levels[i]];
+            }
+
+            return currentNS;
+
+        }
+    };
+
+} ();
+
+// Spip presentation platform packages.  Hard-coding them into the object
+// uses fewer chars than the namespace function does
+// SPIP.namespace("util");
+// SPIP.namespace("widget");
+// SPIP.namespace("example");
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar.css
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar.css	(revision 30)
@@ -0,0 +1,181 @@
+/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */
+/* Container Styles */
+
+.calcontainer {*height:1%;} /* IE */
+.calcontainer:after {content:'.';clear:both;display:block;visibility:hidden;height:0;} /* others */
+
+.calbordered {
+	font-family: Verdana, Arial, Sans, sans-serif;
+	font-size:small;
+	float:left;
+	padding:5px;
+	background-color:#F7F9FB;
+	border:1px solid #7B9EBD;
+min-width:28em;
+-height:14em;
+}
+
+.califrame{
+margin:1px;
+	padding:5px;
+	font-family: Verdana, Arial, Sans, sans-serif;
+	font-size:small;
+width:28em;
+height:14em;
+}
+.calbordered .title{
+	font:small Arial,Helvetica,sans-serif;
+	color:#000;
+	font-weight:bold;
+	margin-bottom:5px;
+	height:auto;
+-width:28em;
+	position:relative;
+}
+
+.close-icon-right, .close-icon-left {
+	position:absolute;
+	top:0;
+	border:none;
+}
+.close-icon-right {
+right:0;
+}
+.close-icon-left {
+left:0;
+}
+.cal2up {
+	/*float:left;*/
+	-position:absolute;
+left:0.5em;
+}
+.calbordered > .cal2up{
+	float:left;
+}
+
+.cal2up2 {
+	/*float:left;*/
+	-position:absolute;
+-left:14em;
+}
+.calbordered > .cal2up2{
+	float:left;
+}
+
+.calnavleft {
+	position:absolute;
+	top:0;
+	bottom:0;
+	height:12px;   
+	left:2px;
+}
+
+.calnavright {
+	position:absolute;
+	top:0;
+	bottom:0;
+	height:12px;  
+	right:2px;
+}
+
+/* Calendar element styles */
+
+.calendar {
+	font:small Arial,Helvetica,sans-serif;
+	text-align:center;
+	border-spacing:0;
+}
+
+.calcell{
+	width:1.5em;
+	height:1em;
+	border:1px solid #E0E0E0;
+	background-color:#FFF;
+text-align:center;
+}
+
+.calcell a {
+	color:#003DB8;
+	text-decoration:none;
+}
+
+.calcell.today {
+	border:1px solid #000;
+}
+
+.calcell.oom, .calcell.oom:hover {
+	cursor:default;
+	color:#999;
+	background-color:#EEE;
+	border:1px solid #E0E0E0;
+}
+
+.selected, .calcell.selected {
+	color:#003DB8;
+	background-color:#FFF19F;
+	border:1px solid #FF9900;
+font-weight:bold;
+}
+
+.calcell:hover, .calcell.calcellhover, .calcell a:hover{
+	cursor:pointer;
+	color:#FFF;
+	background-color:#FF9900;
+	border:1px solid #FF9900;
+}
+
+.calcell.calcellhover a, .calcell:hover a {
+	color:#FFF;
+	background-color:#FF9900;
+	border:1px solid #FF9900;
+}
+
+.calcell.restricted {
+	text-decoration:line-through;
+}
+
+.calcell.previous {
+	color:#CCC;
+}
+
+.calcell.highlight1 { background-color:#CCFF99; }
+.calcell.highlight2 { background-color:#99CCFF; }
+.calcell.highlight3 { background-color:#FFCCCC; }
+.calcell.highlight4 { background-color:#CCFF99; }
+
+
+.calhead {
+	border:1px solid #E0E0E0;
+	vertical-align:middle;
+	background-color:#FFF;
+}
+
+.calheader {
+	position:relative;
+	width:100%;
+}
+
+.calheader img {
+	border:none;
+}
+
+.calweekdaycell {
+	color:#666;
+	font-weight:normal;
+}
+
+.calfoot {
+	background-color:#EEE;
+}
+
+.calrowhead, .calrowfoot {
+	color:#666;
+	font-size:9px;
+	font-style:italic;
+	font-weight:normal;
+	width:15px;
+}
+
+.calrowhead {
+	border-right-width:2px;
+}
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar.js	(revision 30)
@@ -0,0 +1,2841 @@
+/*
+Copyright (c) 2006 Spip! Inc. All rights reserved.
+version 0.9.0
+*/
+
+SPIP.namespace("SPIP.widget");
+
+/**
+* @class
+* <p>SPIP.widget.DateMath is used for simple date manipulation. The class is a static utility
+* used for adding, subtracting, and comparing dates.</p>
+*/
+SPIP.widget.DateMath = new function() {
+
+	/**
+	* Constant field representing Day
+	* @type String
+	*/
+	this.DAY = "D";
+
+	/**
+	* Constant field representing Week
+	* @type String
+	*/
+	this.WEEK = "W";
+
+	/**
+	* Constant field representing Year
+	* @type String
+	*/
+	this.YEAR = "Y";
+
+	/**
+	* Constant field representing Month
+	* @type String
+	*/
+	this.MONTH = "M";
+
+	/**
+	* Constant field representing one day, in milliseconds
+	* @type Integer
+	*/
+	this.ONE_DAY_MS = 1000*60*60*24;
+
+	/**
+	* Adds the specified amount of time to the this instance.
+	* @param {Date} date	The JavaScript Date object to perform addition on
+	* @param {string} field	The this field constant to be used for performing addition.
+	* @param {Integer} amount	The number of units (measured in the field constant) to add to the date.
+	*/
+	this.add = function(date, field, amount) {
+		var d = new Date(date.getTime());
+		switch (field)
+		{
+			case this.MONTH:
+				var newMonth = date.getMonth() + amount;
+				var years = 0;
+
+
+				if (newMonth < 0) {
+					while (newMonth < 0)
+					{
+						newMonth += 12;
+						years -= 1;
+					}
+				} else if (newMonth > 11) {
+					while (newMonth > 11)
+					{
+						newMonth -= 12;
+						years += 1;
+					}
+				}
+
+				d.setMonth(newMonth);
+				d.setFullYear(date.getFullYear() + years);
+				break;
+			case this.DAY:
+				d.setDate(date.getDate() + amount);
+				break;
+			case this.YEAR:
+				d.setFullYear(date.getFullYear() + amount);
+				break;
+			case this.WEEK:
+				d.setDate(date.getDate() + 7);
+				break;
+		}
+		return d;
+	};
+
+	/**
+	* Subtracts the specified amount of time from the this instance.
+	* @param {Date} date	The JavaScript Date object to perform subtraction on
+	* @param {Integer} field	The this field constant to be used for performing subtraction.
+	* @param {Integer} amount	The number of units (measured in the field constant) to subtract from the date.
+	*/
+	this.subtract = function(date, field, amount) {
+		return this.add(date, field, (amount*-1));
+	};
+
+	/**
+	* Determines whether a given date is before another date on the calendar.
+	* @param {Date} date		The Date object to compare with the compare argument
+	* @param {Date} compareTo	The Date object to use for the comparison
+	* @return {Boolean} true if the date occurs before the compared date; false if not.
+	*/
+	this.before = function(date, compareTo) {
+		var ms = compareTo.getTime();
+		if (date.getTime() < ms) {
+			return true;
+		} else {
+			return false;
+		}
+	};
+
+	/**
+	* Determines whether a given date is after another date on the calendar.
+	* @param {Date} date		The Date object to compare with the compare argument
+	* @param {Date} compareTo	The Date object to use for the comparison
+	* @return {Boolean} true if the date occurs after the compared date; false if not.
+	*/
+	this.after = function(date, compareTo) {
+		var ms = compareTo.getTime();
+		if (date.getTime() > ms) {
+			return true;
+		} else {
+			return false;
+		}
+	};
+
+	/**
+	* Retrieves a JavaScript Date object representing January 1 of any given year.
+	* @param {Integer} calendarYear		The calendar year for which to retrieve January 1
+	* @return {Date}	January 1 of the calendar year specified.
+	*/
+	this.getJan1 = function(calendarYear) {
+		return new Date(calendarYear,0,1);
+	};
+
+	/**
+	* Calculates the number of days the specified date is from January 1 of the specified calendar year.
+	* Passing January 1 to this function would return an offset value of zero.
+	* @param {Date}	date	The JavaScript date for which to find the offset
+	* @param {Integer} calendarYear	The calendar year to use for determining the offset
+	* @return {Integer}	The number of days since January 1 of the given year
+	*/
+	this.getDayOffset = function(date, calendarYear) {
+		var beginYear = this.getJan1(calendarYear); // Find the start of the year. This will be in week 1.
+
+		// Find the number of days the passed in date is away from the calendar year start
+		var dayOffset = Math.ceil((date.getTime()-beginYear.getTime()) / this.ONE_DAY_MS);
+		return dayOffset;
+	};
+
+	/**
+	* Calculates the week number for the given date. This function assumes that week 1 is the
+	* week in which January 1 appears, regardless of whether the week consists of a full 7 days.
+	* The calendar year can be specified to help find what a the week number would be for a given
+	* date if the date overlaps years. For instance, a week may be considered week 1 of 2005, or
+	* week 53 of 2004. Specifying the optional calendarYear allows one to make this distinction
+	* easily.
+	* @param {Date}	date	The JavaScript date for which to find the week number
+	* @param {Integer} calendarYear	OPTIONAL - The calendar year to use for determining the week number. Default is
+	*											the calendar year of parameter "date".
+	* @param {Integer} weekStartsOn	OPTIONAL - The integer (0-6) representing which day a week begins on. Default is 0 (for Sunday).
+	* @return {Integer}	The week number of the given date.
+	*/
+	this.getWeekNumber = function(date, calendarYear, weekStartsOn) {
+		if (! weekStartsOn) {
+			weekStartsOn = 0;
+		}
+		if (! calendarYear) {
+			calendarYear = date.getFullYear();
+		}
+		var weekNum = -1;
+
+		var jan1 = this.getJan1(calendarYear);
+		var jan1DayOfWeek = jan1.getDay();
+
+		var month = date.getMonth();
+		var day = date.getDate();
+		var year = date.getFullYear();
+
+		var dayOffset = this.getDayOffset(date, calendarYear); // Days since Jan 1, Calendar Year
+
+		if (dayOffset < 0 && dayOffset >= (-1 * jan1DayOfWeek)) {
+			weekNum = 1;
+		} else {
+			weekNum = 1;
+			var testDate = this.getJan1(calendarYear);
+
+			while (testDate.getTime() < date.getTime() && testDate.getFullYear() == calendarYear) {
+				weekNum += 1;
+				testDate = this.add(testDate, this.WEEK, 1);
+			}
+		}
+
+		return weekNum;
+	};
+
+	/**
+	* Determines if a given week overlaps two different years.
+	* @param {Date}	weekBeginDate	The JavaScript Date representing the first day of the week.
+	* @return {Boolean}	true if the date overlaps two different years.
+	*/
+	this.isYearOverlapWeek = function(weekBeginDate) {
+		var overlaps = false;
+		var nextWeek = this.add(weekBeginDate, this.DAY, 6);
+		if (nextWeek.getFullYear() != weekBeginDate.getFullYear()) {
+			overlaps = true;
+		}
+		return overlaps;
+	};
+
+	/**
+	* Determines if a given week overlaps two different months.
+	* @param {Date}	weekBeginDate	The JavaScript Date representing the first day of the week.
+	* @return {Boolean}	true if the date overlaps two different months.
+	*/
+	this.isMonthOverlapWeek = function(weekBeginDate) {
+		var overlaps = false;
+		var nextWeek = this.add(weekBeginDate, this.DAY, 6);
+		if (nextWeek.getMonth() != weekBeginDate.getMonth()) {
+			overlaps = true;
+		}
+		return overlaps;
+	};
+
+	/**
+	* Gets the first day of a month containing a given date.
+	* @param {Date}	date	The JavaScript Date used to calculate the month start
+	* @return {Date}		The JavaScript Date representing the first day of the month
+	*/
+	this.findMonthStart = function(date) {
+		var start = new Date(date.getFullYear(), date.getMonth(), 1);
+		return start;
+	};
+
+	/**
+	* Gets the last day of a month containing a given date.
+	* @param {Date}	date	The JavaScript Date used to calculate the month end
+	* @return {Date}		The JavaScript Date representing the last day of the month
+	*/
+	this.findMonthEnd = function(date) {
+		var start = this.findMonthStart(date);
+		var nextMonth = this.add(start, this.MONTH, 1);
+		var end = this.subtract(nextMonth, this.DAY, 1);
+		return end;
+	};
+
+	/**
+	* Clears the time fields from a given date, effectively setting the time to midnight.
+	* @param {Date}	date	The JavaScript Date for which the time fields will be cleared
+	* @return {Date}		The JavaScript Date cleared of all time fields
+	*/
+	this.clearTime = function(date) {
+		date.setHours(0,0,0,0);
+		return date;
+	};
+}
+
+SPIP.namespace("SPIP.widget");
+
+/**
+* @class
+* <p>Calendar_Core is the base class for the Calendar widget. In its most basic
+* implementation, it has the ability to render a calendar widget on the page
+* that can be manipulated to select a single date, move back and forth between
+* months and years.</p>
+* <p>To construct the placeholder for the calendar widget, the code is as
+* follows:
+*	<xmp>
+*		<div id="cal1Container"></div>
+*	</xmp>
+* Note that the table can be replaced with any kind of element.
+* </p>
+* @constructor
+* @param {String}	id			The id of the table element that will represent the calendar widget
+* @param {String}	containerId	The id of the container element that will contain the calendar table
+* @param {String}	monthyear	The month/year string used to set the current calendar page
+* @param {String}	selected	A string of date values formatted using the date parser. The built-in
+								default date format is MM/DD/YYYY. Ranges are defined using
+								MM/DD/YYYY-MM/DD/YYYY. Month/day combinations are defined using MM/DD.
+								Any combination of these can be combined by delimiting the string with
+								commas. Example: "12/24/2005,12/25,1/18/2006-1/21/2006"
+*/
+SPIP.widget.Calendar_Core = function(id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{
+		this.init(id, containerId, monthyear, selected);
+	}
+}
+
+/**
+* Type constant used for renderers to represent an individual date (M/D/Y)
+* @final
+* @type String
+*/
+SPIP.widget.Calendar_Core.DATE = "D";
+
+/**
+* Type constant used for renderers to represent an individual date across any year (M/D)
+* @final
+* @type String
+*/
+SPIP.widget.Calendar_Core.MONTH_DAY = "MD";
+
+/**
+* Type constant used for renderers to represent a weekday
+* @final
+* @type String
+*/
+SPIP.widget.Calendar_Core.WEEKDAY = "WD";
+
+/**
+* Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y)
+* @final
+* @type String
+*/
+SPIP.widget.Calendar_Core.RANGE = "R";
+
+/**
+* Type constant used for renderers to represent a month across any year
+* @final
+* @type String
+*/
+SPIP.widget.Calendar_Core.MONTH = "M";
+
+/**
+* Constant that represents the total number of date cells that are displayed in a given month
+* including
+* @final
+* @type Integer
+*/
+SPIP.widget.Calendar_Core.DISPLAY_DAYS = 42;
+
+/**
+* Constant used for halting the execution of the remainder of the render stack
+* @final
+* @type String
+*/
+SPIP.widget.Calendar_Core.STOP_RENDER = "S";
+
+SPIP.widget.Calendar_Core.prototype = {
+
+	/**
+	* The configuration object used to set up the calendars various locale and style options.
+	* @type Object
+	*/
+	Config : null,
+
+	/**
+	* The parent CalendarGroup, only to be set explicitly by the parent group
+	* @type CalendarGroup
+	*/
+	parent : null,
+
+	/**
+	* The index of this item in the parent group
+	* @type Integer
+	*/
+	index : -1,
+
+	/**
+	* The collection of calendar table cells
+	* @type HTMLTableCellElement[]
+	*/
+	cells : null,
+
+	/**
+	* The collection of calendar week header cells
+	* @type HTMLTableCellElement[]
+	*/
+	weekHeaderCells : null,
+
+	/**
+	* The collection of calendar week footer cells
+	* @type HTMLTableCellElement[]
+	*/
+	weekFooterCells : null,
+
+	/**
+	* The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D].
+	* @type Array[](Integer[])
+	*/
+	cellDates : null,
+
+	/**
+	* The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
+	* @type String
+	*/
+	id : null,
+
+	/**
+	* The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered.
+	* @type HTMLElement
+	*/
+	oDomContainer : null,
+
+	/**
+	* A Date object representing today's date.
+	* @type Date
+	*/
+	today : null,
+
+	/**
+	* The list of render functions, along with required parameters, used to render cells.
+	* @type Array[]
+	*/
+	renderStack : null,
+
+	/**
+	* A copy of the initial render functions created before rendering.
+	* @type Array
+	* @private
+	*/
+	_renderStack : null,
+
+	/**
+	* A Date object representing the month/year that the calendar is currently set to
+	* @type Date
+	*/
+	pageDate : null,
+
+	/**
+	* A Date object representing the month/year that the calendar is initially set to
+	* @type Date
+	* @private
+	*/
+	_pageDate : null,
+
+	/**
+	* A Date object representing the minimum selectable date
+	* @type Date
+	*/
+	minDate : null,
+
+	/**
+	* A Date object representing the maximum selectable date
+	* @type Date
+	*/
+	maxDate : null,
+
+	/**
+	* The list of currently selected dates. The data format for this local collection is
+	* an array of date field arrays, e.g:
+	* [
+	*	[2004,5,25],
+	*	[2004,5,26]
+	* ]
+	* @type Array[](Integer[])
+	*/
+	selectedDates : null,
+
+	/**
+	* The private list of initially selected dates.
+	* @type Array
+	* @private
+	*/
+	_selectedDates : null,
+
+	/**
+	* A boolean indicating whether the shell of the calendar has already been rendered to the page
+	* @type Boolean
+	*/
+	shellRendered : false,
+
+	/**
+	* The HTML table element that represents this calendar
+	* @type HTMLTableElement
+	*/
+	table : null,
+
+	/**
+	* The HTML cell element that represents the main header cell TH used in the calendar table
+	* @type HTMLTableCellElement
+	*/
+	headerCell : null
+
+
+};
+
+
+
+/**
+* Initializes the calendar widget. This method must be called by all subclass constructors.
+* @param {String}	id			The id of the table element that will represent the calendar widget
+* @param {String}	containerId	The id of the container element that will contain the calendar table
+* @param {String}	monthyear	The month/year string used to set the current calendar page
+* @param {String}	selected	A string of date values formatted using the date parser. The built-in
+								default date format is MM/DD/YYYY. Ranges are defined using
+								MM/DD/YYYY-MM/DD/YYYY. Month/day combinations are defined using MM/DD.
+								Any combination of these can be combined by delimiting the string with
+								commas. Example: "12/24/2005,12/25,1/18/2006-1/21/2006"
+*/
+SPIP.widget.Calendar_Core.prototype.init = function(id, containerId, monthyear, selected) {
+	this.setupConfig();
+
+	this.id = id;
+
+	this.cellDates = new Array();
+
+	this.cells = new Array();
+
+	this.renderStack = new Array();
+	this._renderStack = new Array();
+
+	this.oDomContainer = document.getElementById(containerId);
+
+	this.today = new Date();
+	SPIP.widget.DateMath.clearTime(this.today);
+
+	var month;
+	var year;
+
+	if (monthyear)
+	{
+		var aMonthYear = monthyear.split(this.Locale.DATE_FIELD_DELIMITER);
+		month = parseInt(aMonthYear[this.Locale.MY_MONTH_POSITION-1]);
+		year = parseInt(aMonthYear[this.Locale.MY_YEAR_POSITION-1]);
+	} else {
+		month = this.today.getMonth()+1;
+		year = this.today.getFullYear();
+	}
+
+	this.pageDate = new Date(year, month-1, 1);
+	this._pageDate = new Date(this.pageDate.getTime());
+
+	if (selected)
+	{
+		this.selectedDates = this._parseDates(selected);
+		this._selectedDates = this.selectedDates.concat();
+	} else {
+		this.selectedDates = new Array();
+		this._selectedDates = new Array();
+	}
+
+	this.wireDefaultEvents();
+	this.wireCustomEvents();
+};
+
+
+/**
+* Wires the local DOM events for the Calendar, including cell selection, hover, and
+* default navigation that is used for moving back and forth between calendar pages.
+*/
+SPIP.widget.Calendar_Core.prototype.wireDefaultEvents = function() {
+
+	/**
+	* The default event function that is attached to a date link within a calendar cell
+	* when the calendar is rendered.
+	* @param	e		The event
+	* @param	cal		A reference to the calendar passed by the Event utility
+	*/
+	this.doSelectCell = function(e, cal) {
+		var cell = this;
+		var index = cell.index;
+
+		if (cal.Options.MULTI_SELECT) {
+			var link = cell.getElementsByTagName("A")[0];
+			link.blur();
+
+			var cellDate = cal.cellDates[index];
+			var cellDateIndex = cal._indexOfSelectedFieldArray(cellDate);
+
+			if (cellDateIndex > -1)
+			{
+				cal.deselectCell(index);
+			} else {
+				cal.selectCell(index);
+			}
+
+		} else {
+			var link = cell.getElementsByTagName("A")[0];
+			link.blur()
+
+			cal.selectCell(index);
+		}
+	}
+
+	/**
+	* The event that is executed when the user hovers over a cell
+	* @param	e		The event
+	* @param	cal		A reference to the calendar passed by the Event utility
+	* @private
+	*/
+	this.doCellMouseOver = function(e, cal) {
+		SPIP.widget.Calendar_Core.prependCssClass(this, cal.Style.CSS_CELL_HOVER);
+	}
+
+	/**
+	* The event that is executed when the user moves the mouse out of a cell
+	* @param	e		The event
+	* @param	cal		A reference to the calendar passed by the Event utility
+	* @private
+	*/
+	this.doCellMouseOut = function(e, cal) {
+		SPIP.widget.Calendar_Core.removeCssClass(this, cal.Style.CSS_CELL_HOVER);
+	}
+
+	/**
+	* A wrapper event that executes the nextMonth method through a DOM event
+	* @param	e		The event
+	* @param	cal		A reference to the calendar passed by the Event utility
+	* @private
+	*/
+	this.doNextMonth = function(e, cal) {
+		cal.nextMonth();
+	}
+
+	/**
+	* A wrapper event that executes the previousMonth method through a DOM event
+	* @param	e		The event
+	* @param	cal		A reference to the calendar passed by the Event utility
+	* @private
+	*/
+	this.doPreviousMonth = function(e, cal) {
+		cal.previousMonth();
+	}
+}
+
+/**
+* This function can be extended by subclasses to attach additional DOM events to
+* the calendar. By default, this method is unimplemented.
+*/
+SPIP.widget.Calendar_Core.prototype.wireCustomEvents = function() { }
+
+/**
+This method is called to initialize the widget configuration variables, including
+style, localization, and other display and behavioral options.
+<p>Config: Container for the CSS style configuration variables.</p>
+<p><strong>Config.Style</strong> - Defines the CSS classes used for different calendar elements</p>
+<blockquote>
+	<div><em>CSS_CALENDAR</em> : Container table</div>
+	<div><em>CSS_HEADER</em> : </div>
+	<div><em>CSS_HEADER_TEXT</em> : Calendar header</div>
+	<div><em>CSS_FOOTER</em> : Calendar footer</div>
+	<div><em>CSS_CELL</em> : Calendar day cell</div>
+	<div><em>CSS_CELL_OOM</em> : Calendar OOM (out of month) cell</div>
+	<div><em>CSS_CELL_SELECTED</em> : Calendar selected cell</div>
+	<div><em>CSS_CELL_RESTRICTED</em> : Calendar restricted cell</div>
+	<div><em>CSS_CELL_TODAY</em> : Calendar cell for today's date</div>
+	<div><em>CSS_ROW_HEADER</em> : The cell preceding a row (used for week number by default)</div>
+	<div><em>CSS_ROW_FOOTER</em> : The cell following a row (not implemented by default)</div>
+	<div><em>CSS_WEEKDAY_CELL</em> : The cells used for labeling weekdays</div>
+	<div><em>CSS_WEEKDAY_ROW</em> : The row containing the weekday label cells</div>
+	<div><em>CSS_BORDER</em> : The border style used for the default UED rendering</div>
+	<div><em>CSS_CONTAINER</em> : Special container class used to properly adjust the sizing and float</div>
+	<div><em>CSS_NAV_LEFT</em> : Left navigation arrow</div>
+	<div><em>CSS_NAV_RIGHT</em> : Right navigation arrow</div>
+	<div><em>CSS_CELL_TOP</em> : Outlying cell along the top row</div>
+	<div><em>CSS_CELL_LEFT</em> : Outlying cell along the left row</div>
+	<div><em>CSS_CELL_RIGHT</em> : Outlying cell along the right row</div>
+	<div><em>CSS_CELL_BOTTOM</em> : Outlying cell along the bottom row</div>
+	<div><em>CSS_CELL_HOVER</em> : Cell hover style</div>
+	<div><em>CSS_CELL_HIGHLIGHT1</em> : Highlight color 1 for styling cells</div>
+	<div><em>CSS_CELL_HIGHLIGHT2</em> : Highlight color 2 for styling cells</div>
+	<div><em>CSS_CELL_HIGHLIGHT3</em> : Highlight color 3 for styling cells</div>
+	<div><em>CSS_CELL_HIGHLIGHT4</em> : Highlight color 4 for styling cells</div>
+
+</blockquote>
+<p><strong>Config.Locale</strong> - Defines the locale string arrays used for localization</p>
+<blockquote>
+	<div><em>MONTHS_SHORT</em> : Array of 12 months in short format ("Jan", "Feb", etc.)</div>
+	<div><em>MONTHS_LONG</em> : Array of 12 months in short format ("Jan", "Feb", etc.)</div>
+	<div><em>WEEKDAYS_1CHAR</em> : Array of 7 days in 1-character format ("S", "M", etc.)</div>
+	<div><em>WEEKDAYS_SHORT</em> : Array of 7 days in short format ("Su", "Mo", etc.)</div>
+	<div><em>WEEKDAYS_MEDIUM</em> : Array of 7 days in medium format ("Sun", "Mon", etc.)</div>
+	<div><em>WEEKDAYS_LONG</em> : Array of 7 days in long format ("Sunday", "Monday", etc.)</div>
+	<div><em>DATE_DELIMITER</em> : The value used to delimit series of multiple dates (Default: ",")</div>
+	<div><em>DATE_FIELD_DELIMITER</em> : The value used to delimit date fields (Default: "/")</div>
+	<div><em>DATE_RANGE_DELIMITER</em> : The value used to delimit date fields (Default: "-")</div>
+	<div><em>MY_MONTH_POSITION</em> : The value used to determine the position of the month in a month/year combo (e.g. 12/2005) (Default: 1)</div>
+	<div><em>MY_YEAR_POSITION</em> : The value used to determine the position of the year in a month/year combo (e.g. 12/2005) (Default: 2)</div>
+	<div><em>MD_MONTH_POSITION</em> : The value used to determine the position of the month in a month/day combo (e.g. 12/25) (Default: 1)</div>
+	<div><em>MD_DAY_POSITION</em> : The value used to determine the position of the day in a month/day combo (e.g. 12/25) (Default: 2)</div>
+	<div><em>MDY_MONTH_POSITION</em> : The value used to determine the position of the month in a month/day/year combo (e.g. 12/25/2005) (Default: 1)</div>
+	<div><em>MDY_DAY_POSITION</em> : The value used to determine the position of the day in a month/day/year combo (e.g. 12/25/2005) (Default: 2)</div>
+	<div><em>MDY_YEAR_POSITION</em> : The value used to determine the position of the year in a month/day/year combo (e.g. 12/25/2005) (Default: 3)</div>
+</blockquote>
+<p><strong>Config.Options</strong> - Defines other configurable calendar widget options</p>
+<blockquote>
+	<div><em>SHOW_WEEKDAYS</em> : Boolean, determines whether to display the weekday headers (defaults to true)</div>
+	<div><em>LOCALE_MONTHS</em> : Array, points to the desired Config.Locale array (defaults to Config.Locale.MONTHS_LONG)</div>
+	<div><em>LOCALE_WEEKDAYS</em> : Array, points to the desired Config.Locale array (defaults to Config.Locale.WEEKDAYS_SHORT)</div>
+	<div><em>START_WEEKDAY</em> : Integer, 0-6, representing the day that a week begins on</div>
+	<div><em>SHOW_WEEK_HEADER</em> : Boolean, determines whether to display row headers</div>
+	<div><em>SHOW_WEEK_FOOTER</em> : Boolean, determines whether to display row footers</div>
+	<div><em>HIDE_BLANK_WEEKS</em> : Boolean, determines whether to hide extra weeks that are completely OOM</div>
+	<div><em>NAV_ARROW_LEFT</em> : String, the image path used for the left navigation arrow</div>
+	<div><em>NAV_ARROW_RIGHT</em> : String, the image path used for the right navigation arrow</div>
+</blockquote>
+*/
+SPIP.widget.Calendar_Core.prototype.setupConfig = function() {
+	/**
+	* Container for the CSS style configuration variables.
+	*/
+	this.Config = new Object();
+
+	this.Config.Style = {
+		// Style variables
+		CSS_ROW_HEADER: "calrowhead",
+		CSS_ROW_FOOTER: "calrowfoot",
+		CSS_CELL : "calcell",
+		CSS_CELL_SELECTED : "selected",
+		CSS_CELL_RESTRICTED : "restricted",
+		CSS_CELL_TODAY : "today",
+		CSS_CELL_OOM : "oom",
+		CSS_HEADER : "calheader",
+		CSS_HEADER_TEXT : "calhead",
+		CSS_WEEKDAY_CELL : "calweekdaycell",
+		CSS_WEEKDAY_ROW : "calweekdayrow",
+		CSS_FOOTER : "calfoot",
+		CSS_CALENDAR : "calendar",
+		CSS_BORDER : "calbordered",
+		CSS_CONTAINER : "calcontainer",
+		CSS_NAV_LEFT : "calnavleft",
+		CSS_NAV_RIGHT : "calnavright",
+		CSS_CELL_TOP : "calcelltop",
+		CSS_CELL_LEFT : "calcellleft",
+		CSS_CELL_RIGHT : "calcellright",
+		CSS_CELL_BOTTOM : "calcellbottom",
+		CSS_CELL_HOVER : "calcellhover",
+		CSS_CELL_HIGHLIGHT1 : "highlight1",
+		CSS_CELL_HIGHLIGHT2 : "highlight2",
+		CSS_CELL_HIGHLIGHT3 : "highlight3",
+		CSS_CELL_HIGHLIGHT4 : "highlight4"
+	};
+
+	this.Style = this.Config.Style;
+
+	this.Config.Locale = {
+		// Locale definition
+		MONTHS_SHORT : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+		MONTHS_LONG : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+		WEEKDAYS_1CHAR : ["S", "M", "T", "W", "T", "F", "S"],
+		WEEKDAYS_SHORT : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
+		WEEKDAYS_MEDIUM : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
+		WEEKDAYS_LONG : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+		DATE_DELIMITER : ",",
+		DATE_FIELD_DELIMITER : "/",
+		DATE_RANGE_DELIMITER : "-",
+		MY_MONTH_POSITION : 1,
+		MY_YEAR_POSITION : 2,
+		MD_MONTH_POSITION : 1,
+		MD_DAY_POSITION : 2,
+		MDY_MONTH_POSITION : 1,
+		MDY_DAY_POSITION : 2,
+		MDY_YEAR_POSITION : 3
+	};
+
+	this.Locale = this.Config.Locale;
+
+	this.Config.Options = {
+		// Configuration variables
+		MULTI_SELECT : false,
+		SHOW_WEEKDAYS : true,
+		START_WEEKDAY : 0,
+		SHOW_WEEK_HEADER : false,
+		SHOW_WEEK_FOOTER : false,
+		HIDE_BLANK_WEEKS : false,
+		NAV_ARROW_LEFT : "img/callt.gif",
+		NAV_ARROW_RIGHT : "img/calrt.gif",
+		IMG_CLOSE : "img/calx.gif",
+		IMG_CLOSE_CLASS : "close-icon"
+	};
+
+	this.Options = this.Config.Options;
+
+	this.customConfig();
+
+	if (! this.Options.LOCALE_MONTHS) {
+		this.Options.LOCALE_MONTHS=this.Locale.MONTHS_LONG;
+	}
+	if (! this.Options.LOCALE_WEEKDAYS) {
+		this.Options.LOCALE_WEEKDAYS=this.Locale.WEEKDAYS_SHORT;
+	}
+
+	// If true, reconfigure weekday arrays to place Mondays first
+	if (this.Options.START_WEEKDAY > 0)
+	{
+		for (var w=0;w<this.Options.START_WEEKDAY;++w) {
+			this.Locale.WEEKDAYS_SHORT.push(this.Locale.WEEKDAYS_SHORT.shift());
+			this.Locale.WEEKDAYS_MEDIUM.push(this.Locale.WEEKDAYS_MEDIUM.shift());
+			this.Locale.WEEKDAYS_LONG.push(this.Locale.WEEKDAYS_LONG.shift());
+		}
+	}
+};
+
+/**
+* This method is called when subclasses need to override configuration variables
+* or create new ones. Values can be explicitly set as follows:
+* <blockquote><code>
+*	this.Config.Style.CSS_CELL = "newcalcell";
+*	this.Config.Locale.MONTHS_SHORT = ["Jan", "Fév", "Mars", "Avr", "Mai", "Juin", "Juil", "Août", "Sept", "Oct", "Nov", "Déc"];
+* </code></blockquote>
+*/
+SPIP.widget.Calendar_Core.prototype.customConfig = function() { };
+
+/**
+* Builds the date label that will be displayed in the calendar header or
+* footer, depending on configuration.
+* @return	The formatted calendar month label
+* @type String
+*/
+SPIP.widget.Calendar_Core.prototype.buildMonthLabel = function() {
+	var text = this.Options.LOCALE_MONTHS[this.pageDate.getMonth()] + " " + this.pageDate.getFullYear();
+	return text;
+};
+
+/**
+* Builds the date digit that will be displayed in calendar cells
+* @return	The formatted day label
+* @type	String
+*/
+SPIP.widget.Calendar_Core.prototype.buildDayLabel = function(workingDate) {
+	var day = workingDate.getDate();
+	return day;
+};
+
+
+
+/**
+* Builds the calendar table shell that will be filled in with dates and formatting.
+* This method calls buildShellHeader, buildShellBody, and buildShellFooter (in that order)
+* to construct the pieces of the calendar table. The construction of the shell should
+* only happen one time when the calendar is initialized.
+*/
+SPIP.widget.Calendar_Core.prototype.buildShell = function() {
+
+	this.table = document.createElement("TABLE");
+	this.table.cellSpacing = 0;
+	SPIP.widget.Calendar_Core.setCssClasses(this.table, [this.Style.CSS_CALENDAR]);
+
+	this.table.id = this.id;
+
+	this.buildShellHeader();
+	this.buildShellBody();
+	this.buildShellFooter();
+
+	SPIP.util.Event.addListener(window, "unload", this._unload, this);
+};
+
+/**
+* Builds the calendar shell header by inserting a THEAD into the local calendar table.
+*/
+SPIP.widget.Calendar_Core.prototype.buildShellHeader = function() {
+	var head = document.createElement("THEAD");
+	var headRow = document.createElement("TR");
+
+	var headerCell = document.createElement("TH");
+
+	var colSpan = 7;
+	if (this.Config.Options.SHOW_WEEK_HEADER) {
+		this.weekHeaderCells = new Array();
+		colSpan += 1;
+	}
+	if (this.Config.Options.SHOW_WEEK_FOOTER) {
+		this.weekFooterCells = new Array();
+		colSpan += 1;
+	}
+
+	headerCell.colSpan = colSpan;
+
+	SPIP.widget.Calendar_Core.setCssClasses(headerCell,[this.Style.CSS_HEADER_TEXT]);
+
+	this.headerCell = headerCell;
+
+	headRow.appendChild(headerCell);
+	head.appendChild(headRow);
+
+	// Append day labels, if needed
+	if (this.Options.SHOW_WEEKDAYS)
+	{
+		var row = document.createElement("TR");
+		var fillerCell;
+
+		SPIP.widget.Calendar_Core.setCssClasses(row,[this.Style.CSS_WEEKDAY_ROW]);
+
+		if (this.Config.Options.SHOW_WEEK_HEADER) {
+			fillerCell = document.createElement("TH");
+			SPIP.widget.Calendar_Core.setCssClasses(fillerCell,[this.Style.CSS_WEEKDAY_CELL]);
+			row.appendChild(fillerCell);
+		}
+
+		for(var i=0;i<this.Options.LOCALE_WEEKDAYS.length;++i)
+		{
+			var cell = document.createElement("TH");
+			SPIP.widget.Calendar_Core.setCssClasses(cell,[this.Style.CSS_WEEKDAY_CELL]);
+			cell.innerHTML=this.Options.LOCALE_WEEKDAYS[i];
+			row.appendChild(cell);
+		}
+
+		if (this.Config.Options.SHOW_WEEK_FOOTER) {
+			fillerCell = document.createElement("TH");
+			SPIP.widget.Calendar_Core.setCssClasses(fillerCell,[this.Style.CSS_WEEKDAY_CELL]);
+			row.appendChild(fillerCell);
+		}
+
+		head.appendChild(row);
+	}
+
+	this.table.appendChild(head);
+};
+
+/**
+* Builds the calendar shell body (6 weeks by 7 days)
+*/
+SPIP.widget.Calendar_Core.prototype.buildShellBody = function() {
+	// This should only get executed once
+	this.tbody = document.createElement("TBODY");
+
+	for (var r=0;r<6;++r)
+	{
+		var row = document.createElement("TR");
+
+		for (var c=0;c<this.headerCell.colSpan;++c)
+		{
+			var cell;
+			if (this.Config.Options.SHOW_WEEK_HEADER && c===0) { // Row header
+				cell = document.createElement("TH");
+				this.weekHeaderCells[this.weekHeaderCells.length] = cell;
+			} else if (this.Config.Options.SHOW_WEEK_FOOTER && c==(this.headerCell.colSpan-1)){ // Row footer
+				cell = document.createElement("TH");
+				this.weekFooterCells[this.weekFooterCells.length] = cell;
+			} else {
+				cell = document.createElement("TD");
+				this.cells[this.cells.length] = cell;
+				SPIP.widget.Calendar_Core.setCssClasses(cell, [this.Style.CSS_CELL]);
+			}
+
+			row.appendChild(cell);
+		}
+		this.tbody.appendChild(row);
+	}
+
+	this.table.appendChild(this.tbody);
+};
+
+/**
+* Builds the calendar shell footer. In the default implementation, there is
+* no footer.
+*/
+SPIP.widget.Calendar_Core.prototype.buildShellFooter = function() { };
+
+/**
+* Outputs the calendar shell to the DOM, inserting it into the placeholder element.
+*/
+SPIP.widget.Calendar_Core.prototype.renderShell = function() {
+	this.oDomContainer.appendChild(this.table);
+	this.shellRendered = true;
+};
+
+/**
+* Renders the calendar after it has been configured. The render() method has a specific call chain that will execute
+* when the method is called: renderHeader, renderBody, renderFooter.
+* Refer to the documentation for those methods for information on
+* individual render tasks.
+*/
+SPIP.widget.Calendar_Core.prototype.render = function() {
+	if (! this.shellRendered)
+	{
+		this.buildShell();
+		this.renderShell();
+	}
+
+	this.resetRenderers();
+
+	this.cellDates.length = 0;
+
+	// Find starting day of the current month
+	var workingDate = SPIP.widget.DateMath.findMonthStart(this.pageDate);
+
+	this.renderHeader();
+	this.renderBody(workingDate);
+	this.renderFooter();
+
+	this.onRender();
+};
+
+
+
+/**
+* Appends the header contents into the widget header.
+*/
+SPIP.widget.Calendar_Core.prototype.renderHeader = function() {
+	this.headerCell.innerHTML = "";
+
+	var headerContainer = document.createElement("DIV");
+	headerContainer.className = this.Style.CSS_HEADER;
+
+	var labelMonth = document.createElement("span");
+	labelMonth.innerHTML = this.buildMonthLabel();
+	/*headerContainer.appendChild(document.createTextNode(this.buildMonthLabel()));*/
+	headerContainer.appendChild(labelMonth);
+	this.headerCell.appendChild(headerContainer);
+};
+
+/**
+* Appends the calendar body. The default implementation calculates the number of
+* OOM (out of month) cells that need to be rendered at the start of the month, renders those,
+* and renders all the day cells using the built-in cell rendering methods.
+*
+* While iterating through all of the cells, the calendar checks for renderers in the
+* local render stack that match the date of the current cell, and then applies styles
+* as necessary.
+*
+* @param {Date}	workingDate	The current working Date object being used to generate the calendar
+*/
+SPIP.widget.Calendar_Core.prototype.renderBody = function(workingDate) {
+
+	this.preMonthDays = workingDate.getDay();
+	if (this.Options.START_WEEKDAY > 0) {
+		this.preMonthDays -= this.Options.START_WEEKDAY;
+	}
+	if (this.preMonthDays < 0) {
+		this.preMonthDays += 7;
+	}
+
+	this.monthDays = SPIP.widget.DateMath.findMonthEnd(workingDate).getDate();
+	this.postMonthDays = SPIP.widget.Calendar_Core.DISPLAY_DAYS-this.preMonthDays-this.monthDays;
+
+	workingDate = SPIP.widget.DateMath.subtract(workingDate, SPIP.widget.DateMath.DAY, this.preMonthDays);
+
+	this.table.style.visibility = "hidden"; // Hide while we render
+
+	var weekRowIndex = 0;
+
+	for (var c=0;c<this.cells.length;++c)
+	{
+		var cellRenderers = new Array();
+
+		var cell = this.cells[c];
+
+		this.clearElement(cell);
+
+		SPIP.util.Event.removeListener(cell, "click", this.doSelectCell);
+		if (SPIP.widget.Calendar_Core._getBrowser() == "ie") {
+			SPIP.util.Event.removeListener(cell, "mouseover", this.doCellMouseOver);
+			SPIP.util.Event.removeListener(cell, "mouseout", this.doCellMouseOut);
+		}
+
+		cell.index = c;
+		cell.id = this.id + "_cell" + c;
+
+		this.cellDates[this.cellDates.length]=[workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; // Add this date to cellDates
+
+		if (workingDate.getDay() == this.Options.START_WEEKDAY) {
+			var rowHeaderCell = null;
+			var rowFooterCell = null;
+
+			if (this.Options.SHOW_WEEK_HEADER) {
+				rowHeaderCell = this.weekHeaderCells[weekRowIndex];
+				this.clearElement(rowHeaderCell);
+			}
+
+			if (this.Options.SHOW_WEEK_FOOTER) {
+				rowFooterCell = this.weekFooterCells[weekRowIndex];
+				this.clearElement(rowFooterCell);
+			}
+
+			if (this.Options.HIDE_BLANK_WEEKS && this.isDateOOM(workingDate) && ! SPIP.widget.DateMath.isMonthOverlapWeek(workingDate)) {
+				// The first day of the week is not in this month, and it's not an overlap week
+				continue;
+			} else {
+				if (rowHeaderCell) {
+					this.renderRowHeader(workingDate, rowHeaderCell);
+				}
+				if (rowFooterCell) {
+					this.renderRowFooter(workingDate, rowFooterCell);
+				}
+			}
+		}
+
+
+
+		var renderer = null;
+
+		if (workingDate.getFullYear()	== this.today.getFullYear() &&
+			workingDate.getMonth()		== this.today.getMonth() &&
+			workingDate.getDate()		== this.today.getDate())
+		{
+			cellRenderers[cellRenderers.length]=this.renderCellStyleToday;
+		}
+
+		if (this.isDateOOM(workingDate))
+		{
+			cellRenderers[cellRenderers.length]=this.renderCellNotThisMonth;
+		} else {
+			for (var r=0;r<this.renderStack.length;++r)
+			{
+				var rArray = this.renderStack[r];
+				var type = rArray[0];
+
+				var month;
+				var day;
+				var year;
+
+				switch (type) {
+					case SPIP.widget.Calendar_Core.DATE:
+						month = rArray[1][1];
+						day = rArray[1][2];
+						year = rArray[1][0];
+
+						if (workingDate.getMonth()+1 == month && workingDate.getDate() == day && workingDate.getFullYear() == year)
+						{
+							renderer = rArray[2];
+							this.renderStack.splice(r,1);
+						}
+						break;
+					case SPIP.widget.Calendar_Core.MONTH_DAY:
+						month = rArray[1][0];
+						day = rArray[1][1];
+
+						if (workingDate.getMonth()+1 == month && workingDate.getDate() == day)
+						{
+							renderer = rArray[2];
+							this.renderStack.splice(r,1);
+						}
+						break;
+					case SPIP.widget.Calendar_Core.RANGE:
+						var date1 = rArray[1][0];
+						var date2 = rArray[1][1];
+
+						var d1month = date1[1];
+						var d1day = date1[2];
+						var d1year = date1[0];
+
+						var d1 = new Date(d1year, d1month-1, d1day);
+
+						var d2month = date2[1];
+						var d2day = date2[2];
+						var d2year = date2[0];
+
+						var d2 = new Date(d2year, d2month-1, d2day);
+
+						if (workingDate.getTime() >= d1.getTime() && workingDate.getTime() <= d2.getTime())
+						{
+							renderer = rArray[2];
+
+							if (workingDate.getTime()==d2.getTime()) {
+								this.renderStack.splice(r,1);
+							}
+						}
+						break;
+					case SPIP.widget.Calendar_Core.WEEKDAY:
+
+						var weekday = rArray[1][0];
+						if (workingDate.getDay()+1 == weekday)
+						{
+							renderer = rArray[2];
+						}
+						break;
+					case SPIP.widget.Calendar_Core.MONTH:
+
+						month = rArray[1][0];
+						if (workingDate.getMonth()+1 == month)
+						{
+							renderer = rArray[2];
+						}
+						break;
+				}
+
+				if (renderer) {
+					cellRenderers[cellRenderers.length]=renderer;
+				}
+			}
+
+		}
+
+		if (this._indexOfSelectedFieldArray([workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]) > -1)
+		{
+			cellRenderers[cellRenderers.length]=this.renderCellStyleSelected;
+		}
+
+		if (this.minDate)
+		{
+			this.minDate = SPIP.widget.DateMath.clearTime(this.minDate);
+		}
+		if (this.maxDate)
+		{
+			this.maxDate = SPIP.widget.DateMath.clearTime(this.maxDate);
+		}
+
+		if (
+			(this.minDate && (workingDate.getTime() < this.minDate.getTime())) ||
+			(this.maxDate && (workingDate.getTime() > this.maxDate.getTime()))
+		) {
+			cellRenderers[cellRenderers.length]=this.renderOutOfBoundsDate;
+		} else {
+			cellRenderers[cellRenderers.length]=this.renderCellDefault;
+		}
+
+		for (var x=0;x<cellRenderers.length;++x)
+		{
+			var ren = cellRenderers[x];
+			if (ren.call(this,workingDate,cell) == SPIP.widget.Calendar_Core.STOP_RENDER) {
+				break;
+			}
+		}
+
+		workingDate = SPIP.widget.DateMath.add(workingDate, SPIP.widget.DateMath.DAY, 1); // Go to the next day
+		if (workingDate.getDay() == this.Options.START_WEEKDAY) {
+			weekRowIndex += 1;
+		}
+
+		SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL);
+		if (c >= 0 && c <= 6) {
+			SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_TOP);
+		}
+		if ((c % 7) == 0) {
+			SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_LEFT);
+		}
+		if (((c+1) % 7) == 0) {
+			SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_RIGHT);
+		}
+
+		var postDays = this.postMonthDays;
+		if (postDays >= 7 && this.Options.HIDE_BLANK_WEEKS) {
+			var blankWeeks = Math.floor(postDays/7);
+			for (var p=0;p<blankWeeks;++p) {
+				postDays -= 7;
+			}
+		}
+
+		if (c >= ((this.preMonthDays+postDays+this.monthDays)-7)) {
+			SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_BOTTOM);
+		}
+	}
+
+	this.table.style.visibility = "visible"; // Show table, now that it's rendered
+
+};
+
+/**
+* Appends the contents of the calendar widget footer into the shell. By default,
+* the calendar does not contain a footer, and this method must be implemented by
+* subclassing the widget.
+*/
+SPIP.widget.Calendar_Core.prototype.renderFooter = function() { };
+
+/**
+* @private
+*/
+SPIP.widget.Calendar_Core.prototype._unload = function(e, cal) {
+	for (var c in cal.cells) {
+		c = null;
+	}
+
+	cal.cells = null;
+
+	cal.tbody = null;
+	cal.oDomContainer = null;
+	cal.table = null;
+	cal.headerCell = null;
+
+	cal = null;
+};
+
+
+/****************** BEGIN BUILT-IN TABLE CELL RENDERERS ************************************/
+
+SPIP.widget.Calendar_Core.prototype.renderOutOfBoundsDate = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, "previous");
+	cell.innerHTML = workingDate.getDate();
+	return SPIP.widget.Calendar_Core.STOP_RENDER;
+}
+
+/**
+* Renders the row header for a week. The date passed in should be
+* the first date of the given week.
+* @param {Date}					workingDate		The current working Date object (beginning of the week) being used to generate the calendar
+* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
+*/
+SPIP.widget.Calendar_Core.prototype.renderRowHeader = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_ROW_HEADER);
+
+	var useYear = this.pageDate.getFullYear();
+
+	if (! SPIP.widget.DateMath.isYearOverlapWeek(workingDate)) {
+		useYear = workingDate.getFullYear();
+	}
+
+	var weekNum = SPIP.widget.DateMath.getWeekNumber(workingDate, useYear, this.Options.START_WEEKDAY);
+	cell.innerHTML = weekNum;
+
+	if (this.isDateOOM(workingDate) && ! SPIP.widget.DateMath.isMonthOverlapWeek(workingDate)) {
+		SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_OOM);
+	}
+};
+
+/**
+* Renders the row footer for a week. The date passed in should be
+* the first date of the given week.
+* @param {Date}					workingDate		The current working Date object (beginning of the week) being used to generate the calendar
+* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
+*/
+SPIP.widget.Calendar_Core.prototype.renderRowFooter = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_ROW_FOOTER);
+
+	if (this.isDateOOM(workingDate) && ! SPIP.widget.DateMath.isMonthOverlapWeek(workingDate)) {
+		SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_OOM);
+	}
+};
+
+/**
+* Renders a single standard calendar cell in the calendar widget table.
+* All logic for determining how a standard default cell will be rendered is
+* encapsulated in this method, and must be accounted for when extending the
+* widget class.
+* @param {Date}					workingDate		The current working Date object being used to generate the calendar
+* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
+* @return SPIP.widget.Calendar_Core.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
+*			should not be terminated
+* @type String
+*/
+SPIP.widget.Calendar_Core.prototype.renderCellDefault = function(workingDate, cell) {
+	cell.innerHTML = "";
+	var link = document.createElement("a");
+
+	link.href="javascript:void(null);";
+	link.name=this.id+"__"+workingDate.getFullYear()+"_"+(workingDate.getMonth()+1)+"_"+workingDate.getDate();
+
+	//link.onclick = this._selectEventLink;
+	//cell.onclick = this.doSelectCell;
+
+	SPIP.util.Event.addListener(cell, "click", this.doSelectCell, this);
+	if (SPIP.widget.Calendar_Core._getBrowser() == "ie") {
+		SPIP.util.Event.addListener(cell, "mouseover", this.doCellMouseOver, this);
+		SPIP.util.Event.addListener(cell, "mouseout", this.doCellMouseOut, this);
+	}
+	link.appendChild(document.createTextNode(this.buildDayLabel(workingDate)));
+	cell.appendChild(link);
+
+	//cell.onmouseover = this.doCellMouseOver;
+	//cell.onmouseout = this.doCellMouseOut;
+};
+
+SPIP.widget.Calendar_Core.prototype.renderCellStyleHighlight1 = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_HIGHLIGHT1);
+};
+SPIP.widget.Calendar_Core.prototype.renderCellStyleHighlight2 = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_HIGHLIGHT2);
+};
+SPIP.widget.Calendar_Core.prototype.renderCellStyleHighlight3 = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_HIGHLIGHT3);
+};
+SPIP.widget.Calendar_Core.prototype.renderCellStyleHighlight4 = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_HIGHLIGHT4);
+};
+
+/**
+* Applies the default style used for rendering today's date to the current calendar cell
+* @param {Date}					workingDate		The current working Date object being used to generate the calendar
+* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
+* @return	SPIP.widget.Calendar_Core.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
+*			should not be terminated
+* @type String
+*/
+SPIP.widget.Calendar_Core.prototype.renderCellStyleToday = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_TODAY);
+};
+
+/**
+* Applies the default style used for rendering selected dates to the current calendar cell
+* @param {Date}					workingDate		The current working Date object being used to generate the calendar
+* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
+* @return	SPIP.widget.Calendar_Core.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
+*			should not be terminated
+* @type String
+*/
+SPIP.widget.Calendar_Core.prototype.renderCellStyleSelected = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_SELECTED);
+};
+
+/**
+* Applies the default style used for rendering dates that are not a part of the current
+* month (preceding or trailing the cells for the current month)
+* @param {Date}					workingDate		The current working Date object being used to generate the calendar
+* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
+* @return	SPIP.widget.Calendar_Core.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
+*			should not be terminated
+* @type String
+*/
+SPIP.widget.Calendar_Core.prototype.renderCellNotThisMonth = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.addCssClass(cell, this.Style.CSS_CELL_OOM);
+	cell.innerHTML=workingDate.getDate();
+	return SPIP.widget.Calendar_Core.STOP_RENDER;
+};
+
+/**
+* Renders the current calendar cell as a non-selectable "black-out" date using the default
+* restricted style.
+* @param {Date}					workingDate		The current working Date object being used to generate the calendar
+* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
+* @return	SPIP.widget.Calendar_Core.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
+*			should not be terminated
+* @type String
+*/
+SPIP.widget.Calendar_Core.prototype.renderBodyCellRestricted = function(workingDate, cell) {
+	SPIP.widget.Calendar_Core.setCssClasses(cell, [this.Style.CSS_CELL,this.Style.CSS_CELL_RESTRICTED]);
+	cell.innerHTML=workingDate.getDate();
+	return SPIP.widget.Calendar_Core.STOP_RENDER;
+};
+/******************** END BUILT-IN TABLE CELL RENDERERS ************************************/
+
+/******************** BEGIN MONTH NAVIGATION METHODS ************************************/
+/**
+* Adds the designated number of months to the current calendar month, and sets the current
+* calendar page date to the new month.
+* @param {Integer}	count	The number of months to add to the current calendar
+*/
+SPIP.widget.Calendar_Core.prototype.addMonths = function(count) {
+	this.pageDate = SPIP.widget.DateMath.add(this.pageDate, SPIP.widget.DateMath.MONTH, count);
+	this.resetRenderers();
+	this.onChangePage();
+};
+
+/**
+* Subtracts the designated number of months from the current calendar month, and sets the current
+* calendar page date to the new month.
+* @param {Integer}	count	The number of months to subtract from the current calendar
+*/
+SPIP.widget.Calendar_Core.prototype.subtractMonths = function(count) {
+	this.pageDate = SPIP.widget.DateMath.subtract(this.pageDate, SPIP.widget.DateMath.MONTH, count);
+	this.resetRenderers();
+	this.onChangePage();
+};
+
+/**
+* Adds the designated number of years to the current calendar, and sets the current
+* calendar page date to the new month.
+* @param {Integer}	count	The number of years to add to the current calendar
+*/
+SPIP.widget.Calendar_Core.prototype.addYears = function(count) {
+	this.pageDate = SPIP.widget.DateMath.add(this.pageDate, SPIP.widget.DateMath.YEAR, count);
+	this.resetRenderers();
+	this.onChangePage();
+};
+
+/**
+* Subtcats the designated number of years from the current calendar, and sets the current
+* calendar page date to the new month.
+* @param {Integer}	count	The number of years to subtract from the current calendar
+*/
+SPIP.widget.Calendar_Core.prototype.subtractYears = function(count) {
+	this.pageDate = SPIP.widget.DateMath.subtract(this.pageDate, SPIP.widget.DateMath.YEAR, count);
+	this.resetRenderers();
+	this.onChangePage();
+};
+
+/**
+* Navigates to the next month page in the calendar widget.
+*/
+SPIP.widget.Calendar_Core.prototype.nextMonth = function() {
+	this.addMonths(1);
+};
+
+/**
+* Navigates to the previous month page in the calendar widget.
+*/
+SPIP.widget.Calendar_Core.prototype.previousMonth = function() {
+	this.subtractMonths(1);
+};
+
+/**
+* Navigates to the next year in the currently selected month in the calendar widget.
+*/
+SPIP.widget.Calendar_Core.prototype.nextYear = function() {
+	this.addYears(1);
+};
+
+/**
+* Navigates to the previous year in the currently selected month in the calendar widget.
+*/
+SPIP.widget.Calendar_Core.prototype.previousYear = function() {
+	this.subtractYears(1);
+};
+
+/****************** END MONTH NAVIGATION METHODS ************************************/
+
+/************* BEGIN SELECTION METHODS *************************************************************/
+
+/**
+* Resets the calendar widget to the originally selected month and year, and
+* sets the calendar to the initial selection(s).
+*/
+SPIP.widget.Calendar_Core.prototype.reset = function() {
+	this.selectedDates.length = 0;
+	this.selectedDates = this._selectedDates.concat();
+	this.deselectAll();
+	/*this.pageDate = new Date(this._pageDate.getTime());*/
+	this.onReset();
+};
+
+/**
+* Clears the selected dates in the current calendar widget and sets the calendar
+* to the current month and year.
+*/
+SPIP.widget.Calendar_Core.prototype.clear = function() {
+	this.selectedDates.length = 0;
+	/*this.pageDate = new Date(this.today.getTime());*/
+	this.onClear();
+};
+
+/**
+* Selects a date or a collection of dates on the current calendar. This method, by default,
+* does not call the render method explicitly. Once selection has completed, render must be
+* called for the changes to be reflected visually.
+* @param	{String/Date/Date[]}	date	The date string of dates to select in the current calendar. Valid formats are
+*								individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006).
+*								Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005).
+*								This method can also take a JavaScript Date object or an array of Date objects.
+* @return						Array of JavaScript Date objects representing all individual dates that are currently selected.
+* @type Date[]
+*/
+SPIP.widget.Calendar_Core.prototype.select = function(date) {
+	this.onBeforeSelect();
+
+	var aToBeSelected = this._toFieldArray(date);
+
+	for (var a=0;a<aToBeSelected.length;++a)
+	{
+		var toSelect = aToBeSelected[a]; // For each date item in the list of dates we're trying to select
+		if (this._indexOfSelectedFieldArray(toSelect) == -1) // not already selected?
+		{
+			this.selectedDates[this.selectedDates.length]=toSelect;
+		}
+	}
+
+	if (this.parent) {
+		this.parent.sync(this);
+	}
+
+	this.onSelect();
+
+	return this.getSelectedDates();
+};
+
+/**
+* Selects a date on the current calendar by referencing the index of the cell that should be selected.
+* This method is used to easily select a single cell (usually with a mouse click) without having to do
+* a full render. The selected style is applied to the cell directly.
+* @param	{Integer}	cellIndex	The index of the cell to select in the current calendar.
+* @return							Array of JavaScript Date objects representing all individual dates that are currently selected.
+* @type Date[]
+*/
+SPIP.widget.Calendar_Core.prototype.selectCell = function(cellIndex) {
+	this.onBeforeSelect();
+
+	this.cells = this.tbody.getElementsByTagName("TD");
+
+	var cell = this.cells[cellIndex];
+	var cellDate = this.cellDates[cellIndex];
+
+	var dCellDate = this._toDate(cellDate);
+
+	var selectDate = cellDate.concat();
+
+	this.selectedDates.push(selectDate);
+
+	if (this.parent) {
+		this.parent.sync(this);
+	}
+
+	this.renderCellStyleSelected(dCellDate,cell);
+
+	this.onSelect();
+	this.doCellMouseOut.call(cell, null, this);
+
+	return this.getSelectedDates();
+};
+
+/**
+* Deselects a date or a collection of dates on the current calendar. This method, by default,
+* does not call the render method explicitly. Once deselection has completed, render must be
+* called for the changes to be reflected visually.
+* @param	{String/Date/Date[]}	date	The date string of dates to deselect in the current calendar. Valid formats are
+*								individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006).
+*								Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005).
+*								This method can also take a JavaScript Date object or an array of Date objects.
+* @return						Array of JavaScript Date objects representing all individual dates that are currently selected.
+* @type Date[]
+*/
+SPIP.widget.Calendar_Core.prototype.deselect = function(date) {
+	this.onBeforeDeselect();
+
+	var aToBeSelected = this._toFieldArray(date);
+
+	for (var a=0;a<aToBeSelected.length;++a)
+	{
+		var toSelect = aToBeSelected[a]; // For each date item in the list of dates we're trying to select
+		var index = this._indexOfSelectedFieldArray(toSelect);
+
+		if (index != -1)
+		{
+			this.selectedDates.splice(index,1);
+		}
+	}
+
+	if (this.parent) {
+		this.parent.sync(this);
+	}
+
+	this.onDeselect();
+	return this.getSelectedDates();
+};
+
+/**
+* Deselects a date on the current calendar by referencing the index of the cell that should be deselected.
+* This method is used to easily deselect a single cell (usually with a mouse click) without having to do
+* a full render. The selected style is removed from the cell directly.
+* @param	{Integer}	cellIndex	The index of the cell to deselect in the current calendar.
+* @return							Array of JavaScript Date objects representing all individual dates that are currently selected.
+* @type Date[]
+*/
+SPIP.widget.Calendar_Core.prototype.deselectCell = function(i) {
+	this.onBeforeDeselect();
+	this.cells = this.tbody.getElementsByTagName("TD");
+
+	var cell = this.cells[i];
+	var cellDate = this.cellDates[i];
+	var cellDateIndex = this._indexOfSelectedFieldArray(cellDate);
+
+	var dCellDate = this._toDate(cellDate);
+
+	var selectDate = cellDate.concat();
+
+	if (cellDateIndex > -1)
+	{
+		if (this.pageDate.getMonth() == dCellDate.getMonth() &&
+			this.pageDate.getFullYear() == dCellDate.getFullYear())
+		{
+			SPIP.widget.Calendar_Core.removeCssClass(cell, this.Style.CSS_CELL_SELECTED);
+		}
+
+		this.selectedDates.splice(cellDateIndex, 1);
+	}
+
+
+	if (this.parent) {
+		this.parent.sync(this);
+	}
+
+	this.onDeselect();
+	return this.getSelectedDates();
+};
+
+/**
+* Deselects all dates on the current calendar.
+* @return				Array of JavaScript Date objects representing all individual dates that are currently selected.
+*						Assuming that this function executes properly, the return value should be an empty array.
+*						However, the empty array is returned for the sake of being able to check the selection status
+*						of the calendar.
+* @type Date[]
+*/
+SPIP.widget.Calendar_Core.prototype.deselectAll = function() {
+	this.onBeforeDeselect();
+	var count = this.selectedDates.length;
+	this.selectedDates.length = 0;
+
+	if (this.parent) {
+		this.parent.sync(this);
+	}
+
+	if (count > 0) {
+		this.onDeselect();
+	}
+
+	return this.getSelectedDates();
+};
+/************* END SELECTION METHODS *************************************************************/
+
+
+/************* BEGIN TYPE CONVERSION METHODS ****************************************************/
+
+/**
+* Converts a date (either a JavaScript Date object, or a date string) to the internal data structure
+* used to represent dates: [[yyyy,mm,dd],[yyyy,mm,dd]].
+* @private
+* @param	{String/Date/Date[]}	date	The date string of dates to deselect in the current calendar. Valid formats are
+*								individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006).
+*								Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005).
+*								This method can also take a JavaScript Date object or an array of Date objects.
+* @return						Array of date field arrays
+* @type Array[](Integer[])
+*/
+SPIP.widget.Calendar_Core.prototype._toFieldArray = function(date) {
+	var returnDate = new Array();
+
+	if (date instanceof Date)
+	{
+		returnDate = [[date.getFullYear(), date.getMonth()+1, date.getDate()]];
+	}
+	else if (typeof date == 'string')
+	{
+		returnDate = this._parseDates(date);
+	}
+	else if (date instanceof Array)
+	{
+		for (var i=0;i<date.length;++i)
+		{
+			var d = date[i];
+			returnDate[returnDate.length] = [d.getFullYear(),d.getMonth()+1,d.getDate()];
+		}
+	}
+
+	return returnDate;
+};
+
+/**
+* Converts a date field array [yyyy,mm,dd] to a JavaScript Date object.
+* @private
+* @param	{Integer[]}		dateFieldArray	The date field array to convert to a JavaScript Date.
+* @return					JavaScript Date object representing the date field array
+* @type Date
+*/
+SPIP.widget.Calendar_Core.prototype._toDate = function(dateFieldArray) {
+	if (dateFieldArray instanceof Date)
+	{
+		return dateFieldArray;
+	} else
+	{
+		return new Date(dateFieldArray[0],dateFieldArray[1]-1,dateFieldArray[2]);
+	}
+};
+/************* END TYPE CONVERSION METHODS ******************************************************/
+
+
+/************* BEGIN UTILITY METHODS ****************************************************/
+/**
+* Converts a date field array [yyyy,mm,dd] to a JavaScript Date object.
+* @private
+* @param	{Integer[]}	array1	The first date field array to compare
+* @param	{Integer[]}	array2	The first date field array to compare
+* @return						The boolean that represents the equality of the two arrays
+* @type Boolean
+*/
+SPIP.widget.Calendar_Core.prototype._fieldArraysAreEqual = function(array1, array2) {
+	var match = false;
+
+	if (array1[0]==array2[0]&&array1[1]==array2[1]&&array1[2]==array2[2])
+	{
+		match=true;
+	}
+
+	return match;
+};
+
+/**
+* Gets the index of a date field array [yyyy,mm,dd] in the current list of selected dates.
+* @private
+* @param	{Integer[]}		find	The date field array to search for
+* @return					The index of the date field array within the collection of selected dates.
+*								-1 will be returned if the date is not found.
+* @type Integer
+*/
+SPIP.widget.Calendar_Core.prototype._indexOfSelectedFieldArray = function(find) {
+	var selected = -1;
+
+	for (var s=0;s<this.selectedDates.length;++s)
+	{
+		var sArray = this.selectedDates[s];
+		if (find[0]==sArray[0]&&find[1]==sArray[1]&&find[2]==sArray[2])
+		{
+			selected = s;
+			break;
+		}
+	}
+
+	return selected;
+};
+
+/**
+* Determines whether a given date is OOM (out of month).
+* @param	{Date}	date	The JavaScript Date object for which to check the OOM status
+* @return	{Boolean}	true if the date is OOM
+*/
+SPIP.widget.Calendar_Core.prototype.isDateOOM = function(date) {
+	var isOOM = false;
+	if (date.getMonth() != this.pageDate.getMonth()) {
+		isOOM = true;
+	}
+	return isOOM;
+};
+
+/************* END UTILITY METHODS *******************************************************/
+
+/************* BEGIN EVENT HANDLERS ******************************************************/
+
+/**
+* Event executed before a date is selected in the calendar widget.
+*/
+SPIP.widget.Calendar_Core.prototype.onBeforeSelect = function() {
+	if (! this.Options.MULTI_SELECT) {
+		this.clearAllBodyCellStyles(this.Style.CSS_CELL_SELECTED);
+		this.deselectAll();
+	}
+};
+
+/**
+* Event executed when a date is selected in the calendar widget.
+*/
+SPIP.widget.Calendar_Core.prototype.onSelect = function() { };
+
+/**
+* Event executed before a date is deselected in the calendar widget.
+*/
+SPIP.widget.Calendar_Core.prototype.onBeforeDeselect = function() { };
+
+/**
+* Event executed when a date is deselected in the calendar widget.
+*/
+SPIP.widget.Calendar_Core.prototype.onDeselect = function() { };
+
+/**
+* Event executed when the user navigates to a different calendar page.
+*/
+SPIP.widget.Calendar_Core.prototype.onChangePage = function() { this.render(); };
+
+/**
+* Event executed when the calendar widget is rendered.
+*/
+SPIP.widget.Calendar_Core.prototype.onRender = function() { };
+
+/**
+* Event executed when the calendar widget is reset to its original state.
+*/
+SPIP.widget.Calendar_Core.prototype.onReset = function() { this.render(); };
+
+/**
+* Event executed when the calendar widget is completely cleared to the current month with no selections.
+*/
+SPIP.widget.Calendar_Core.prototype.onClear = function() { this.render(); };
+
+/**
+* Validates the calendar widget. This method has no default implementation
+* and must be extended by subclassing the widget.
+* @return	Should return true if the widget validates, and false if
+* it doesn't.
+* @type Boolean
+*/
+SPIP.widget.Calendar_Core.prototype.validate = function() { return true; };
+
+/************* END EVENT HANDLERS *********************************************************/
+
+
+/************* BEGIN DATE PARSE METHODS ***************************************************/
+
+
+/**
+* Converts a date string to a date field array
+* @private
+* @param	{String}	sDate			Date string. Valid formats are mm/dd and mm/dd/yyyy.
+* @return				A date field array representing the string passed to the method
+* @type Array[](Integer[])
+*/
+SPIP.widget.Calendar_Core.prototype._parseDate = function(sDate) {
+	var aDate = sDate.split(this.Locale.DATE_FIELD_DELIMITER);
+	var rArray;
+
+	if (aDate.length == 2)
+	{
+		rArray = [aDate[this.Locale.MD_MONTH_POSITION-1],aDate[this.Locale.MD_DAY_POSITION-1]];
+		rArray.type = SPIP.widget.Calendar_Core.MONTH_DAY;
+	} else {
+		rArray = [aDate[this.Locale.MDY_YEAR_POSITION-1],aDate[this.Locale.MDY_MONTH_POSITION-1],aDate[this.Locale.MDY_DAY_POSITION-1]];
+		rArray.type = SPIP.widget.Calendar_Core.DATE;
+	}
+	return rArray;
+};
+
+/**
+* Converts a multi or single-date string to an array of date field arrays
+* @private
+* @param	{String}	sDates		Date string with one or more comma-delimited dates. Valid formats are mm/dd, mm/dd/yyyy, mm/dd/yyyy-mm/dd/yyyy
+* @return							An array of date field arrays
+* @type Array[](Integer[])
+*/
+SPIP.widget.Calendar_Core.prototype._parseDates = function(sDates) {
+	var aReturn = new Array();
+
+	var aDates = sDates.split(this.Locale.DATE_DELIMITER);
+
+	for (var d=0;d<aDates.length;++d)
+	{
+		var sDate = aDates[d];
+
+		if (sDate.indexOf(this.Locale.DATE_RANGE_DELIMITER) != -1) {
+			// This is a range
+			var aRange = sDate.split(this.Locale.DATE_RANGE_DELIMITER);
+
+			var dateStart = this._parseDate(aRange[0]);
+			var dateEnd = this._parseDate(aRange[1]);
+
+			var fullRange = this._parseRange(dateStart, dateEnd);
+			aReturn = aReturn.concat(fullRange);
+		} else {
+			// This is not a range
+			var aDate = this._parseDate(sDate);
+			aReturn.push(aDate);
+		}
+	}
+	return aReturn;
+};
+
+/**
+* Converts a date range to the full list of included dates
+* @private
+* @param	{Integer[]}	startDate	Date field array representing the first date in the range
+* @param	{Integer[]}	endDate		Date field array representing the last date in the range
+* @return							An array of date field arrays
+* @type Array[](Integer[])
+*/
+SPIP.widget.Calendar_Core.prototype._parseRange = function(startDate, endDate) {
+	var dStart   = new Date(startDate[0],startDate[1]-1,startDate[2]);
+	var dCurrent = SPIP.widget.DateMath.add(new Date(startDate[0],startDate[1]-1,startDate[2]),SPIP.widget.DateMath.DAY,1);
+	var dEnd     = new Date(endDate[0],  endDate[1]-1,  endDate[2]);
+
+	var results = new Array();
+	results.push(startDate);
+	while (dCurrent.getTime() <= dEnd.getTime())
+	{
+		results.push([dCurrent.getFullYear(),dCurrent.getMonth()+1,dCurrent.getDate()]);
+		dCurrent = SPIP.widget.DateMath.add(dCurrent,SPIP.widget.DateMath.DAY,1);
+	}
+	return results;
+};
+
+/************* END DATE PARSE METHODS *****************************************************/
+
+/************* BEGIN RENDERER METHODS *****************************************************/
+
+/**
+* Resets the render stack of the current calendar to its original pre-render value.
+*/
+SPIP.widget.Calendar_Core.prototype.resetRenderers = function() {
+	this.renderStack = this._renderStack.concat();
+};
+
+/**
+* Clears the inner HTML, CSS class and style information from the specified cell.
+* @param	{HTMLTableCellElement}	The cell to clear
+*/
+SPIP.widget.Calendar_Core.prototype.clearElement = function(cell) {
+	cell.innerHTML = "&nbsp;";
+	cell.className="";
+};
+
+/**
+* Adds a renderer to the render stack. The function reference passed to this method will be executed
+* when a date cell matches the conditions specified in the date string for this renderer.
+* @param	{String}	sDates		A date string to associate with the specified renderer. Valid formats
+*									include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
+* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
+*/
+SPIP.widget.Calendar_Core.prototype.addRenderer = function(sDates, fnRender) {
+	var aDates = this._parseDates(sDates);
+	for (var i=0;i<aDates.length;++i)
+	{
+		var aDate = aDates[i];
+
+		if (aDate.length == 2) // this is either a range or a month/day combo
+		{
+			if (aDate[0] instanceof Array) // this is a range
+			{
+				this._addRenderer(SPIP.widget.Calendar_Core.RANGE,aDate,fnRender);
+			} else { // this is a month/day combo
+				this._addRenderer(SPIP.widget.Calendar_Core.MONTH_DAY,aDate,fnRender);
+			}
+		} else if (aDate.length == 3)
+		{
+			this._addRenderer(SPIP.widget.Calendar_Core.DATE,aDate,fnRender);
+		}
+	}
+};
+
+/**
+* The private method used for adding cell renderers to the local render stack.
+* This method is called by other methods that set the renderer type prior to the method call.
+* @private
+* @param	{String}	type		The type string that indicates the type of date renderer being added.
+*									Values are SPIP.widget.Calendar_Core.DATE, SPIP.widget.Calendar_Core.MONTH_DAY, SPIP.widget.Calendar_Core.WEEKDAY,
+*									SPIP.widget.Calendar_Core.RANGE, SPIP.widget.Calendar_Core.MONTH
+* @param	{Array}		aDates		An array of dates used to construct the renderer. The format varies based
+*									on the renderer type
+* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
+*/
+SPIP.widget.Calendar_Core.prototype._addRenderer = function(type, aDates, fnRender) {
+	var add = [type,aDates,fnRender];
+	this.renderStack.unshift(add);
+
+	this._renderStack = this.renderStack.concat();
+};
+
+/**
+* Adds a month to the render stack. The function reference passed to this method will be executed
+* when a date cell matches the month passed to this method.
+* @param	{Integer}	month		The month (1-12) to associate with this renderer
+* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
+*/
+SPIP.widget.Calendar_Core.prototype.addMonthRenderer = function(month, fnRender) {
+	this._addRenderer(SPIP.widget.Calendar_Core.MONTH,[month],fnRender);
+};
+
+/**
+* Adds a weekday to the render stack. The function reference passed to this method will be executed
+* when a date cell matches the weekday passed to this method.
+* @param	{Integer}	weekay		The weekday (1-7) to associate with this renderer
+* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
+*/
+SPIP.widget.Calendar_Core.prototype.addWeekdayRenderer = function(weekday, fnRender) {
+	this._addRenderer(SPIP.widget.Calendar_Core.WEEKDAY,[weekday],fnRender);
+};
+/************* END RENDERER METHODS *******************************************************/
+
+/***************** BEGIN CSS METHODS *******************************************/
+/**
+* Adds the specified CSS class to the element passed to this method.
+* @param	{HTMLElement}	element		The element to which the CSS class should be applied
+* @param	{String}	style		The CSS class name to add to the referenced element
+*/
+SPIP.widget.Calendar_Core.addCssClass = function(element, style) {
+	if (element.className.length === 0)
+	{
+		element.className += style;
+	} else {
+		element.className += " " + style;
+	}
+};
+
+SPIP.widget.Calendar_Core.prependCssClass = function(element, style) {
+	element.className = style + " " + element.className;
+}
+
+/**
+* Removed the specified CSS class from the element passed to this method.
+* @param	{HTMLElement}	element		The element from which the CSS class should be removed
+* @param	{String}	style		The CSS class name to remove from the referenced element
+*/
+SPIP.widget.Calendar_Core.removeCssClass = function(element, style) {
+	var aStyles = element.className.split(" ");
+	for (var s=0;s<aStyles.length;++s)
+	{
+		if (aStyles[s] == style)
+		{
+			aStyles.splice(s,1);
+			break;
+		}
+	}
+	SPIP.widget.Calendar_Core.setCssClasses(element, aStyles);
+};
+
+/**
+* Sets the specified array of CSS classes into the referenced element
+* @param	{HTMLElement}	element		The element to set the CSS classes into
+* @param	{String[]}		aStyles		An array of CSS class names
+*/
+SPIP.widget.Calendar_Core.setCssClasses = function(element, aStyles) {
+	element.className = "";
+	var className = aStyles.join(" ");
+	element.className = className;
+};
+
+/**
+* Removes all styles from all body cells in the current calendar table.
+* @param	{style}		The CSS class name to remove from all calendar body cells
+*/
+SPIP.widget.Calendar_Core.prototype.clearAllBodyCellStyles = function(style) {
+	for (var c=0;c<this.cells.length;++c)
+	{
+		SPIP.widget.Calendar_Core.removeCssClass(this.cells[c],style);
+	}
+};
+
+/***************** END CSS METHODS *********************************************/
+
+/***************** BEGIN GETTER/SETTER METHODS *********************************/
+/**
+* Sets the calendar's month explicitly.
+* @param {Integer}	month		The numeric month, from 1 (January) to 12 (December)
+*/
+SPIP.widget.Calendar_Core.prototype.setMonth = function(month) {
+	this.pageDate.setMonth(month);
+};
+
+/**
+* Sets the calendar's year explicitly.
+* @param {Integer}	year		The numeric 4-digit year
+*/
+SPIP.widget.Calendar_Core.prototype.setYear = function(year) {
+	this.pageDate.setFullYear(year);
+};
+
+/**
+* Gets the list of currently selected dates from the calendar.
+* @return	An array of currently selected JavaScript Date objects.
+* @type Date[]
+*/
+SPIP.widget.Calendar_Core.prototype.getSelectedDates = function() {
+	var returnDates = new Array();
+
+	for (var d=0;d<this.selectedDates.length;++d)
+	{
+		var dateArray = this.selectedDates[d];
+
+		var date = new Date(dateArray[0],dateArray[1]-1,dateArray[2]);
+		returnDates.push(date);
+	}
+
+	returnDates.sort();
+	return returnDates;
+};
+
+/***************** END GETTER/SETTER METHODS *********************************/
+
+SPIP.widget.Calendar_Core._getBrowser = function()
+{
+  /**
+   * UserAgent
+   * @private
+   * @type String
+   */
+  var ua = navigator.userAgent.toLowerCase();
+
+  if (ua.indexOf('opera')!=-1) // Opera (check first in case of spoof)
+	 return 'opera';
+  else if (ua.indexOf('msie')!=-1) // IE
+	 return 'ie';
+  else if (ua.indexOf('safari')!=-1) // Safari (check before Gecko because it includes "like Gecko")
+	 return 'safari';
+  else if (ua.indexOf('gecko') != -1) // Gecko
+	 return 'gecko';
+ else
+  return false;
+}
+
+
+SPIP.widget.Cal_Core = SPIP.widget.Calendar_Core;
+
+SPIP.namespace("SPIP.widget");
+
+/**
+* @class
+* <p>SPIP.widget.CalendarGroup is a special container class for SPIP.widget.Calendar_Core. This class facilitates
+* the ability to have multi-page calendar views that share a single dataset and are
+* dependent on each other.</p>
+*
+* <p>The calendar group instance will refer to each of its elements using a 0-based index.
+* For example, to construct the placeholder for a calendar group widget with id "cal1" and
+* containerId of "cal1Container", the markup would be as follows:
+*	<xmp>
+*		<div id="cal1Container_0"></div>
+*		<div id="cal1Container_1"></div>
+*	</xmp>
+* The tables for the calendars ("cal1_0" and "cal1_1") will be inserted into those containers.
+* </p>
+* @constructor
+* @param {Integer}		pageCount	The number of pages that this calendar should display.
+* @param {String}		id			The id of the element that will be inserted into the DOM.
+* @param {String}	containerId	The id of the container element that the calendar will be inserted into.
+* @param {String}		monthyear	The month/year string used to set the current calendar page
+* @param {String}		selected	A string of date values formatted using the date parser. The built-in
+									default date format is MM/DD/YYYY. Ranges are defined using
+									MM/DD/YYYY-MM/DD/YYYY. Month/day combinations are defined using MM/DD.
+									Any combination of these can be combined by delimiting the string with
+									commas. Example: "12/24/2005,12/25,1/18/2006-1/21/2006"
+*/
+SPIP.widget.CalendarGroup = function(pageCount, id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{
+		this.init(pageCount, id, containerId, monthyear, selected);
+	}
+}
+
+/**
+* Initializes the calendar group. All subclasses must call this method in order for the
+* group to be initialized properly.
+* @param {Integer}		pageCount	The number of pages that this calendar should display.
+* @param {String}		id			The id of the element that will be inserted into the DOM.
+* @param {String}		containerId	The id of the container element that the calendar will be inserted into.
+* @param {String}		monthyear	The month/year string used to set the current calendar page
+* @param {String}		selected	A string of date values formatted using the date parser. The built-in
+									default date format is MM/DD/YYYY. Ranges are defined using
+									MM/DD/YYYY-MM/DD/YYYY. Month/day combinations are defined using MM/DD.
+									Any combination of these can be combined by delimiting the string with
+									commas. Example: "12/24/2005,12/25,1/18/2006-1/21/2006"
+*/
+SPIP.widget.CalendarGroup.prototype.init = function(pageCount, id, containerId, monthyear, selected) {
+	//var self=this;
+
+	this.id = id;
+	this.selectedDates = new Array();
+	this.containerId = containerId;
+
+	this.pageCount = pageCount;
+
+	this.pages = new Array();
+
+	for (var p=0;p<pageCount;++p)
+	{
+		var cal = this.constructChild(id + "_" + p, this.containerId + "_" + p , monthyear, selected);
+
+		cal.parent = this;
+
+		cal.index = p;
+
+		cal.pageDate.setMonth(cal.pageDate.getMonth()+p);
+		cal._pageDateOrig = new Date(cal.pageDate.getFullYear(),cal.pageDate.getMonth(),cal.pageDate.getDate());
+		this.pages.push(cal);
+	}
+
+	this.doNextMonth = function(e, calGroup) {
+		calGroup.nextMonth();
+	}
+
+	this.doPreviousMonth = function(e, calGroup) {
+		calGroup.previousMonth();
+	}
+};
+
+SPIP.widget.CalendarGroup.prototype.setChildFunction = function(fnName, fn) {
+	for (var p=0;p<this.pageCount;++p) {
+		this.pages[p][fnName] = fn;
+	}
+}
+
+SPIP.widget.CalendarGroup.prototype.callChildFunction = function(fnName, args) {
+	for (var p=0;p<this.pageCount;++p) {
+		var page = this.pages[p];
+		if (page[fnName]) {
+			var fn = page[fnName];
+			fn.call(page, args);
+		}
+	}
+}
+
+/**
+* Constructs a child calendar. This method can be overridden if a subclassed version of the default
+* calendar is to be used.
+* @param {String}		id			The id of the element that will be inserted into the DOM.
+* @param {String}		containerId	The id of the container element that the calendar will be inserted into.
+* @param {String}		monthyear	The month/year string used to set the current calendar page
+* @param {String}		selected	A string of date values formatted using the date parser. The built-in
+									default date format is MM/DD/YYYY. Ranges are defined using
+									MM/DD/YYYY-MM/DD/YYYY. Month/day combinations are defined using MM/DD.
+									Any combination of these can be combined by delimiting the string with
+									commas. Example: "12/24/2005,12/25,1/18/2006-1/21/2006"
+* @return							The SPIP.widget.Calendar_Core instance that is constructed
+* @type SPIP.widget.Calendar_Core
+*/
+SPIP.widget.CalendarGroup.prototype.constructChild = function(id,containerId,monthyear,selected) {
+	return new SPIP.widget.Calendar_Core(id,containerId,monthyear,selected);
+};
+
+
+/**
+* Sets the calendar group's month explicitly. This month will be set into the first
+* page of the multi-page calendar, and all other months will be iterated appropriately.
+* @param {Integer}	month		The numeric month, from 1 (January) to 12 (December)
+*/
+SPIP.widget.CalendarGroup.prototype.setMonth = function(month) {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.setMonth(month+p);
+	}
+};
+
+/**
+* Sets the calendar group's year explicitly. This year will be set into the first
+* page of the multi-page calendar, and all other months will be iterated appropriately.
+* @param {Integer}	year		The numeric 4-digit year
+*/
+SPIP.widget.CalendarGroup.prototype.setYear = function(year) {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		if ((cal.pageDate.getMonth()+1) == 1 && p>0)
+		{
+			year+=1;
+		}
+		cal.setYear(year);
+	}
+};
+
+/**
+* Calls the render function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.render = function() {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.render();
+	}
+};
+
+/**
+* Calls the select function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.select = function(date) {
+	var ret;
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		ret = cal.select(date);
+	}
+	return ret;
+};
+
+/**
+* Calls the selectCell function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.selectCell = function(cellIndex) {
+	var ret;
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		ret = cal.selectCell(cellIndex);
+	}
+	return ret;
+};
+
+/**
+* Calls the deselect function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.deselect = function(date) {
+	var ret;
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		ret = cal.deselect(date);
+	}
+	return ret;
+};
+
+/**
+* Calls the deselectAll function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.deselectAll = function() {
+	var ret;
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		ret = cal.deselectAll();
+	}
+	return ret;
+};
+
+/**
+* Calls the deselectAll function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.deselectCell = function(cellIndex) {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.deselectCell(cellIndex);
+	}
+	return this.getSelectedDates();
+};
+
+/**
+* Calls the reset function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.reset = function() {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.reset();
+	}
+};
+
+/**
+* Calls the clear function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.clear = function() {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.clear();
+	}
+};
+
+/**
+* Calls the nextMonth function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.nextMonth = function() {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.nextMonth();
+	}
+};
+
+/**
+* Calls the previousMonth function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.previousMonth = function() {
+	for (var p=this.pages.length-1;p>=0;--p)
+	{
+		var cal = this.pages[p];
+		cal.previousMonth();
+	}
+};
+
+/**
+* Calls the nextYear function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.nextYear = function() {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.nextYear();
+	}
+};
+
+/**
+* Calls the previousYear function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.previousYear = function() {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.previousYear();
+	}
+};
+
+/**
+* Synchronizes the data values for all child calendars within the group. If the sync
+* method is called passing in the caller object, the values of all children will be set
+* to the values of the caller. If the argument is ommitted, the values from all children
+* will be combined into one distinct list and set into each child.
+* @param	{SPIP.widget.Calendar_Core}	caller		The SPIP.widget.Calendar_Core that is initiating the call to sync().
+* @return								Array of selected dates, in JavaScript Date object form.
+* @type Date[]
+*/
+SPIP.widget.CalendarGroup.prototype.sync = function(caller) {
+	var calendar;
+
+	if (caller)
+	{
+		this.selectedDates = caller.selectedDates.concat();
+	} else {
+		var hash = new Object();
+		var combinedDates = new Array();
+
+		for (var p=0;p<this.pages.length;++p)
+		{
+			calendar = this.pages[p];
+
+			var values = calendar.selectedDates;
+
+			for (var v=0;v<values.length;++v)
+			{
+				var valueArray = values[v];
+				hash[valueArray.toString()] = valueArray;
+			}
+		}
+
+		for (var val in hash)
+		{
+			combinedDates[combinedDates.length]=hash[val];
+		}
+
+		this.selectedDates = combinedDates.concat();
+	}
+
+	// Set all the values into the children
+	for (p=0;p<this.pages.length;++p)
+	{
+		calendar = this.pages[p];
+		if (! calendar.Options.MULTI_SELECT) {
+			calendar.clearAllBodyCellStyles(calendar.Config.Style.CSS_CELL_SELECTED);
+		}
+		calendar.selectedDates = this.selectedDates.concat();
+
+	}
+
+	return this.getSelectedDates();
+};
+
+/**
+* Gets the list of currently selected dates from the calendar.
+* @return			An array of currently selected JavaScript Date objects.
+* @type Date[]
+*/
+SPIP.widget.CalendarGroup.prototype.getSelectedDates = function() {
+	var returnDates = new Array();
+
+	for (var d=0;d<this.selectedDates.length;++d)
+	{
+		var dateArray = this.selectedDates[d];
+
+		var date = new Date(dateArray[0],dateArray[1]-1,dateArray[2]);
+		returnDates.push(date);
+	}
+
+	returnDates.sort();
+	return returnDates;
+};
+
+/**
+* Calls the addRenderer function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.addRenderer = function(sDates, fnRender) {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.addRenderer(sDates, fnRender);
+	}
+};
+
+/**
+* Calls the addMonthRenderer function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.addMonthRenderer = function(month, fnRender) {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.addMonthRenderer(month, fnRender);
+	}
+};
+
+/**
+* Calls the addWeekdayRenderer function of all child calendars within the group.
+*/
+SPIP.widget.CalendarGroup.prototype.addWeekdayRenderer = function(weekday, fnRender) {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal.addWeekdayRenderer(weekday, fnRender);
+	}
+};
+
+/**
+* Sets an event handler universally across all child calendars within the group. For instance,
+* to set the onSelect handler for all child calendars to a function called fnSelect, the call would be:
+* <code>
+* calGroup.wireEvent("onSelect", fnSelect);
+* </code>
+* @param	{String}	eventName	The name of the event to handler to set within all child calendars.
+* @param	{Function}	fn			The function to set into the specified event handler.
+*/
+SPIP.widget.CalendarGroup.prototype.wireEvent = function(eventName, fn) {
+	for (var p=0;p<this.pages.length;++p)
+	{
+		var cal = this.pages[p];
+		cal[eventName] = fn;
+	}
+};
+
+SPIP.widget.CalGrp = SPIP.widget.CalendarGroup;
+
+SPIP.namespace("SPIP.widget");
+
+/**
+* @class
+* Calendar is the default implementation of the SPIP.widget.Calendar_Core base class.
+* This class is the UED-approved version of the calendar selector widget. For all documentation
+* on the implemented methods listed here, see the documentation for SPIP.widget.Calendar_Core.
+* @constructor
+* @param {String}	id			The id of the table element that will represent the calendar widget
+* @param {String}	containerId	The id of the container element that will contain the calendar table
+* @param {String}	monthyear	The month/year string used to set the current calendar page
+* @param {String}	selected	A string of date values formatted using the date parser. The built-in
+								default date format is MM/DD/YYYY. Ranges are defined using
+								MM/DD/YYYY-MM/DD/YYYY. Month/day combinations are defined using MM/DD.
+								Any combination of these can be combined by delimiting the string with
+								commas. Example: "12/24/2005,12/25,1/18/2006-1/21/2006"
+*/
+SPIP.widget.Calendar = function(id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{
+		this.init(id, containerId, monthyear, selected);
+	}
+}
+
+SPIP.widget.Calendar.prototype = new SPIP.widget.Calendar_Core();
+
+SPIP.widget.Calendar.prototype.buildShell = function() {
+	this.border = document.createElement("DIV");
+	this.border.className =  this.Style.CSS_BORDER;
+
+	this.table = document.createElement("TABLE");
+	this.table.cellSpacing = 0;
+
+	SPIP.widget.Calendar_Core.setCssClasses(this.table, [this.Style.CSS_CALENDAR]);
+
+	this.border.id = this.id;
+
+	this.buildShellHeader();
+	this.buildShellBody();
+	this.buildShellFooter();
+};
+
+SPIP.widget.Calendar.prototype.renderShell = function() {
+	this.border.appendChild(this.table);
+	this.oDomContainer.appendChild(this.border);
+	this.shellRendered = true;
+};
+
+SPIP.widget.Calendar.prototype.renderHeader = function() {
+	this.headerCell.innerHTML = "";
+
+	var headerContainer = document.createElement("DIV");
+	headerContainer.className = this.Style.CSS_HEADER;
+
+	var linkLeft = document.createElement("A");
+	linkLeft.href = "javascript:" + this.id + ".previousMonth()";
+	var imgLeft = document.createElement("IMG");
+	imgLeft.src = this.Options.NAV_ARROW_LEFT;
+	imgLeft.className = this.Style.CSS_NAV_LEFT;
+	linkLeft.appendChild(imgLeft);
+
+	var linkRight = document.createElement("A");
+	linkRight.href = "javascript:" + this.id + ".nextMonth()";
+	var imgRight = document.createElement("IMG");
+	imgRight.src = this.Options.NAV_ARROW_RIGHT;
+	imgRight.className = this.Style.CSS_NAV_RIGHT;
+	linkRight.appendChild(imgRight);
+
+	headerContainer.appendChild(linkLeft);
+	var labelMonth = document.createElement("span");
+	labelMonth.innerHTML = this.buildMonthLabel();
+	headerContainer.appendChild(labelMonth);
+	headerContainer.appendChild(linkRight);
+
+	this.headerCell.appendChild(headerContainer);
+};
+
+SPIP.widget.Cal = SPIP.widget.Calendar;
+
+SPIP.namespace("SPIP.widget");
+
+/**
+* @class
+* Calendar2up_Cal is the default implementation of the Calendar_Core base class, when used
+* in a 2-up view. This class is the UED-approved version of the calendar selector widget. For all documentation
+* on the implemented methods listed here, see the documentation for Calendar_Core. This class
+* has some special attributes that only apply to calendars rendered within the calendar group implementation.
+* There should be no reason to instantiate this class directly.
+* @constructor
+* @param {String}	id			The id of the table element that will represent the calendar widget
+* @param {String}	containerId	The id of the container element that will contain the calendar table
+* @param {String}	monthyear	The month/year string used to set the current calendar page
+* @param {String}	selected	A string of date values formatted using the date parser. The built-in
+								default date format is MM/DD/YYYY. Ranges are defined using
+								MM/DD/YYYY-MM/DD/YYYY. Month/day combinations are defined using MM/DD.
+								Any combination of these can be combined by delimiting the string with
+								commas. Example: "12/24/2005,12/25,1/18/2006-1/21/2006"
+*/
+SPIP.widget.Calendar2up_Cal = function(id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{
+		this.init(id, containerId, monthyear, selected);
+	}
+}
+
+SPIP.widget.Calendar2up_Cal.prototype = new SPIP.widget.Calendar_Core();
+
+/**
+* Renders the header for each individual calendar in the 2-up view. More
+* specifically, this method handles the placement of left and right arrows for
+* navigating between calendar pages.
+*/
+SPIP.widget.Calendar2up_Cal.prototype.renderHeader = function() {
+	this.headerCell.innerHTML = "";
+
+	var headerContainer = document.createElement("DIV");
+	headerContainer.className = this.Style.CSS_HEADER;
+
+	if (this.index == 0) {
+		var linkLeft = document.createElement("A");
+		linkLeft.href = "javascript:void(null)";
+		SPIP.util.Event.addListener(linkLeft, "click", this.parent.doPreviousMonth, this.parent);
+		var imgLeft = document.createElement("IMG");
+		imgLeft.src = this.Options.NAV_ARROW_LEFT;
+		imgLeft.className = this.Style.CSS_NAV_LEFT;
+		linkLeft.appendChild(imgLeft);
+		headerContainer.appendChild(linkLeft);
+	}
+
+	var labelMonth = document.createElement("span");
+	labelMonth.innerHTML = this.buildMonthLabel();
+	/*headerContainer.appendChild(document.createTextNode(this.buildMonthLabel()));*/
+	headerContainer.appendChild(labelMonth);
+
+	if (this.index == 1) {
+		var linkRight = document.createElement("A");
+		linkRight.href = "javascript:void(null)";
+		SPIP.util.Event.addListener(linkRight, "click", this.parent.doNextMonth, this.parent);
+		var imgRight = document.createElement("IMG");
+		imgRight.src = this.Options.NAV_ARROW_RIGHT;
+		imgRight.className = this.Style.CSS_NAV_RIGHT;
+		linkRight.appendChild(imgRight);
+		headerContainer.appendChild(linkRight);
+	}
+
+	this.headerCell.appendChild(headerContainer);
+};
+
+
+
+
+/**
+* @class
+* Calendar2up is the default implementation of the Calendar2up_Core base class, when used
+* in a 2-up view. This class is the UED-approved version of the 2-up calendar selector widget. For all documentation
+* on the implemented methods listed here, see the documentation for Calendar2up_Core.
+* @constructor
+* @param {String}	id			The id of the table element that will represent the calendar widget
+* @param {String}	containerId	The id of the container element that will contain the calendar table
+* @param {String}	monthyear	The month/year string used to set the current calendar page
+* @param {String}	selected	A string of date values formatted using the date parser. The built-in
+								default date format is MM/DD/YYYY. Ranges are defined using
+								MM/DD/YYYY-MM/DD/YYYY. Month/day combinations are defined using MM/DD.
+								Any combination of these can be combined by delimiting the string with
+								commas. Example: "12/24/2005,12/25,1/18/2006-1/21/2006"
+*/
+SPIP.widget.Calendar2up = function(id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{
+		this.buildWrapper(containerId);
+		this.init(2, id, containerId, monthyear, selected);
+	}
+}
+
+SPIP.widget.Calendar2up.prototype = new SPIP.widget.CalendarGroup();
+
+/**
+* Implementation of CalendarGroup.constructChild that ensures that child calendars of
+* Calendar2up will be of type Calendar2up_Cal.
+*/
+SPIP.widget.Calendar2up.prototype.constructChild = function(id,containerId,monthyear,selected) {
+	var cal = new SPIP.widget.Calendar2up_Cal(id,containerId,monthyear,selected);
+	return cal;
+};
+
+/**
+* Builds the wrapper container for the 2-up calendar.
+* @param {String} containerId	The id of the outer container element.
+*/
+SPIP.widget.Calendar2up.prototype.buildWrapper = function(containerId) {
+	var outerContainer = document.getElementById(containerId);
+
+	outerContainer.className = "calcontainer";
+	/*outerContainer.innerHTML="";
+	if (SPIP.widget.Calendar_Core._getBrowser() == "ie") {
+		outerContainer.innerHTML="<iframe src='about:blank' scrolling='no' frameborder='0' style='position:absolute;left:0px;top:0px;z-index:0;' class='califrame'></iframe>";
+	}*/
+
+	var innerContainer = document.createElement("DIV");
+	innerContainer.className = "calbordered";
+	innerContainer.id = containerId + "_inner";
+
+	var cal1Container = document.createElement("DIV");
+	cal1Container.id = containerId + "_0";
+	cal1Container.className = "cal2up";
+	cal1Container.style.marginRight = "10px";
+	cal1Container.style.zIndex="99";
+	//cal1Container.style.cssFloat="left";
+
+	var cal2Container = document.createElement("DIV");
+	cal2Container.id = containerId + "_1";
+	cal2Container.className = "cal2up2";
+	cal1Container.style.zIndex="99";
+	//cal2Container.style.cssFloat="left";
+
+	outerContainer.appendChild(innerContainer);
+	innerContainer.appendChild(cal1Container);
+	innerContainer.appendChild(cal2Container);
+
+	this.innerContainer = innerContainer;
+	this.outerContainer = outerContainer;
+}
+
+/**
+* Renders the 2-up calendar.
+*/
+SPIP.widget.Calendar2up.prototype.render = function() {
+	this.renderHeader();
+	SPIP.widget.CalendarGroup.prototype.render.call(this);
+	this.renderFooter();
+};
+
+/**
+* Renders the header located at the top of the container for the 2-up calendar.
+*/
+SPIP.widget.Calendar2up.prototype.renderHeader = function() {
+	if (! this.title) {
+		this.title = "";
+	}
+	if (! this.titleDiv)
+	{
+		this.titleDiv = document.createElement("DIV");
+		if (this.title == "")
+		{
+			this.titleDiv.style.display="none";
+		}
+	}
+
+	this.titleDiv.className = "title";
+	this.titleDiv.innerHTML = this.title;
+
+	if (this.outerContainer.style.position == "absolute")
+	{
+		var linkClose = document.createElement("A");
+		linkClose.href = "javascript:void(null)";
+		SPIP.util.Event.addListener(linkClose, "click", this.hide, this);
+
+		var imgClose = document.createElement("IMG");
+		imgClose.src = this.pages[0].Options.IMG_CLOSE;
+		imgClose.className = this.pages[0].Options.IMG_CLOSE_CLASS;
+
+		linkClose.appendChild(imgClose);
+
+		this.linkClose = linkClose;
+
+		this.titleDiv.appendChild(linkClose);
+	}
+
+	this.innerContainer.insertBefore(this.titleDiv, this.innerContainer.firstChild);
+}
+
+/**
+* Hides the 2-up calendar's outer container from view.
+*/
+SPIP.widget.Calendar2up.prototype.hide = function(e, cal) {
+	if (! cal)
+	{
+		cal = this;
+	}
+	cal.outerContainer.style.display = "none";
+}
+
+/**
+* Renders a footer for the 2-up calendar container. By default, this method is
+* unimplemented.
+*/
+SPIP.widget.Calendar2up.prototype.renderFooter = function() {}
+
+SPIP.widget.Cal2up = SPIP.widget.Calendar2up;
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar_custom.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar_custom.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/calendar_custom.js	(revision 30)
@@ -0,0 +1,93 @@
+function findPosX(obj)
+{
+	var curleft = 0;
+	curleft += obj.offsetLeft;
+	if (obj.offsetParent)
+	{
+		while (obj.offsetParent)
+		{
+			obj = obj.offsetParent;
+			curleft += obj.offsetLeft;
+		}
+	}
+	else if (obj.x)
+		curleft += obj.x;
+	return curleft;
+}
+
+function findPosY(obj)
+{
+	var curtop = 0;
+	curtop += obj.offsetTop;
+	if (obj.offsetParent)
+	{
+		while (obj.offsetParent)
+		{
+			obj = obj.offsetParent;
+			curtop += obj.offsetTop;
+		}
+	}
+	else if (obj.y)
+		curtop += obj.y;
+	return curtop;
+}
+
+
+// Calendrier popup 2 pages International ------
+
+SPIP.widget.Calendar2up_INT_Cal = function(id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{
+		this.init(id, containerId, monthyear, selected);
+	}
+}
+
+SPIP.widget.Calendar2up_INT_Cal.prototype = new SPIP.widget.Calendar2up_Cal();
+
+SPIP.widget.Calendar2up_INT = function(id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{	
+		var outerContainer = document.getElementById(containerId);
+	
+		outerContainer.innerHTML="";
+		if (SPIP.widget.Calendar_Core._getBrowser() == "ie") {
+			outerContainer.innerHTML="<iframe src='about:blank' scrolling='no' frameborder='0' style='position:absolute;left:0px;top:0px;z-index:0;' class='califrame'></iframe>";
+		}
+		this.buildWrapper(containerId);
+		this.init(2, id, containerId, monthyear, selected);
+	}
+}
+
+SPIP.widget.Calendar2up_INT.prototype = new SPIP.widget.Calendar2up();
+
+SPIP.widget.Calendar2up_INT.prototype.constructChild = function(id,containerId,monthyear,selected) {
+	var cal = new SPIP.widget.Calendar2up_INT_Cal(id,containerId,monthyear,selected);
+	return cal;
+};
+	
+
+
+
+// Calendrier popup 2 pages International MultiSelect ------
+SPIP.widget.Calendar2up_INT_Cal_multi = function(id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{
+		this.init(id, containerId, monthyear, selected);
+	}
+}
+
+SPIP.widget.Calendar2up_INT_Cal_multi.prototype = new SPIP.widget.Calendar2up_Cal();
+SPIP.widget.Calendar2up_INT_multi = function(id, containerId, monthyear, selected) {
+	if (arguments.length > 0)
+	{	
+		this.buildWrapper(containerId);
+		this.init(2, id, containerId, monthyear, selected);
+	}
+}
+
+SPIP.widget.Calendar2up_INT_multi.prototype = new SPIP.widget.Calendar2up();
+
+SPIP.widget.Calendar2up_INT_multi.prototype.constructChild = function(id,containerId,monthyear,selected) {
+	var cal = new SPIP.widget.Calendar2up_INT_Cal_multi(id,containerId,monthyear,selected);
+	return cal;
+};
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/dom.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/dom.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/dom.js	(revision 30)
@@ -0,0 +1,433 @@
+/*
+Copyright (c) 2006 Spip! Inc. All rights reserved.
+version 0.9.0
+*/
+
+/**
+ * @class Provides helper methods for DOM elements.
+ */
+SPIP.util.Dom = new function() {
+
+   /**
+    * Returns an HTMLElement reference
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    * @return {HTMLElement} A DOM reference to an HTML element.
+    */
+   this.get = function(el) {
+      if (typeof el == 'string') { // accept object or id
+         el = document.getElementById(el);
+      }
+
+      return el;
+   };
+
+   /**
+    * Normalizes currentStyle and ComputedStyle.
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    * @param {String} property The style property whose value is returned.
+    * @return {String} The current value of the style property.
+    */
+   this.getStyle = function(el, property) {
+      var value = null;
+      var dv = document.defaultView;
+
+      el = this.get(el);
+
+      if (property == 'opacity' && el.filters) {// IE opacity
+         value = 1;
+         try {
+            value = el.filters.item('DXImageTransform.Microsoft.Alpha').opacity / 100;
+         } catch(e) {
+            try {
+               value = el.filters.item('alpha').opacity / 100;
+            } catch(e) {}
+         }
+      }
+      else if (el.style[property]) {
+         value = el.style[property];
+      }
+      else if (el.currentStyle && el.currentStyle[property]) {
+         value = el.currentStyle[property];
+      }
+      else if ( dv && dv.getComputedStyle )
+      {  // convert camelCase to hyphen-case
+
+         var converted = '';
+         for(i = 0, len = property.length;i < len; ++i) {
+            if (property.charAt(i) == property.charAt(i).toUpperCase()) {
+               converted = converted + '-' + property.charAt(i).toLowerCase();
+            } else {
+               converted = converted + property.charAt(i);
+            }
+         }
+
+         if (dv.getComputedStyle(el, '').getPropertyValue(converted)) {
+            value = dv.getComputedStyle(el, '').getPropertyValue(converted);
+         }
+      }
+
+      return value;
+   };
+
+   /**
+    * Wrapper for setting style properties of HTMLElements.  Normalizes "opacity" across modern browsers.
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    * @param {String} property The style property to be set.
+    * @param {String} val The value to apply to the given property.
+    */
+   this.setStyle = function(el, property, val) {
+      el = this.get(el);
+      switch(property) {
+         case 'opacity' :
+            if (el.filters) {
+               el.style.filter = 'alpha(opacity=' + val * 100 + ')';
+
+               if (!el.currentStyle.hasLayout) {
+                  el.style.zoom = 1;
+               }
+            } else {
+               el.style.opacity = val;
+               el.style['-moz-opacity'] = val;
+               el.style['-khtml-opacity'] = val;
+            }
+            break;
+         default :
+            el.style[property] = val;
+      }
+   };
+
+   /**
+    * Gets the current position of an element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    */
+   this.getXY = function(el) {
+      el = this.get(el);
+
+      // has to be part of document to have pageXY
+      if (el.parentNode === null || this.getStyle(el, 'display') == 'none') {
+         return false;
+      }
+
+      /**
+       * Position of the html element (x, y)
+       * @private
+       * @type Array
+       */
+      var parent = null;
+      var pos = [];
+      var box;
+
+      if (el.getBoundingClientRect) { // IE
+         box = el.getBoundingClientRect();
+         var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
+         var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
+
+         return [box.left + scrollLeft, box.top + scrollTop];
+      }
+      else if (document.getBoxObjectFor) { // gecko
+         box = document.getBoxObjectFor(el);
+         pos = [box.x, box.y];
+      }
+      else { // safari/opera
+         pos = [el.offsetLeft, el.offsetTop];
+         parent = el.offsetParent;
+         if (parent != el) {
+            while (parent) {
+               pos[0] += parent.offsetLeft;
+               pos[1] += parent.offsetTop;
+               parent = parent.offsetParent;
+            }
+         }
+
+         // opera & (safari absolute) incorrectly account for body offsetTop
+         var ua = navigator.userAgent.toLowerCase();
+         if (
+            ua.indexOf('opera') != -1
+            || ( ua.indexOf('safari') != -1 && this.getStyle(el, 'position') == 'absolute' )
+         ) {
+            pos[1] -= document.body.offsetTop;
+         }
+      }
+
+      if (el.parentNode) { parent = el.parentNode; }
+      else { parent = null; }
+
+      while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') {
+         pos[0] -= parent.scrollLeft;
+         pos[1] -= parent.scrollTop;
+
+         if (parent.parentNode) { parent = parent.parentNode; }
+         else { parent = null; }
+      }
+
+      return pos;
+   };
+
+   /**
+    * Gets the current X position of an element based on page coordinates.  The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    */
+   this.getX = function(el) {
+      return this.getXY(el)[0];
+   };
+
+   /**
+    * Gets the current Y position of an element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    */
+   this.getY = function(el) {
+      return this.getXY(el)[1];
+   };
+
+   /**
+    * Set the position of an html element in page coordinates, regardless of how the element is positioned.
+    * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    * @param {array} pos Contains X & Y values for new position (coordinates are page-based)
+    */
+   this.setXY = function(el, pos, noRetry) {
+      el = this.get(el);
+      var pageXY = SPIP.util.Dom.getXY(el);
+      if (pageXY === false) { return false; } // has to be part of doc to have pageXY
+
+      if (this.getStyle(el, 'position') == 'static') { // default to relative
+         this.setStyle(el, 'position', 'relative');
+      }
+
+      var delta = [
+         parseInt( SPIP.util.Dom.getStyle(el, 'left'), 10 ),
+         parseInt( SPIP.util.Dom.getStyle(el, 'top'), 10 )
+      ];
+
+      if ( isNaN(delta[0]) ) { delta[0] = 0; } // defalts to 'auto'
+      if ( isNaN(delta[1]) ) { delta[1] = 0; }
+
+      if (pos[0] !== null) { el.style.left = pos[0] - pageXY[0] + delta[0] + 'px'; }
+      if (pos[1] !== null) { el.style.top = pos[1] - pageXY[1] + delta[1] + 'px'; }
+
+      var newXY = this.getXY(el);
+
+      // if retry is true, try one more time if we miss
+      if (!noRetry && (newXY[0] != pos[0] || newXY[1] != pos[1]) ) {
+         this.setXY(el, pos, true);
+      }
+
+      return true;
+   };
+
+   /**
+    * Set the X position of an html element in page coordinates, regardless of how the element is positioned.
+    * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    * @param {Int} x to use as the X coordinate.
+    */
+   this.setX = function(el, x) {
+      return this.setXY(el, [x, null]);
+   };
+
+   /**
+    * Set the Y position of an html element in page coordinates, regardless of how the element is positioned.
+    * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    * @param {Int} Value to use as the Y coordinate.
+    */
+   this.setY = function(el, y) {
+      return this.setXY(el, [null, y]);
+   };
+
+   /**
+    * Returns the region position of the given element.
+    * The element must be part of the DOM tree to have a region (display:none or elements not appended return false).
+    * @param {String | HTMLElement} Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
+    * @return {Region} A Region instance containing "top, left, bottom, right" member data.
+    */
+   this.getRegion = function(el) {
+      el = this.get(el);
+      return new SPIP.util.Region.getRegion(el);
+   };
+
+   /**
+    * Returns the width of the client (viewport).
+    * @return {Int} The width of the viewable area of the page.
+    */
+   this.getClientWidth = function() {
+      return (
+         document.documentElement.offsetWidth
+         || document.body.offsetWidth
+      );
+   };
+
+   /**
+    * Returns the height of the client (viewport).
+    * @return {Int} The height of the viewable area of the page.
+    */
+   this.getClientHeight = function() {
+      return (
+         self.innerHeight
+         || document.documentElement.clientHeight
+         || document.body.clientHeight
+      );
+   };
+};
+
+/**
+ * @class A region is a representation of an object on a grid.  It is defined
+ * by the top, right, bottom, left extents, so is rectangular by default.  If
+ * other shapes are required, this class could be extended to support it.
+ *
+ * @param {int} t the top extent
+ * @param {int} r the right extent
+ * @param {int} b the bottom extent
+ * @param {int} l the left extent
+ * @constructor
+ */
+SPIP.util.Region = function(t, r, b, l) {
+
+    /**
+     * The region's top extent
+     * @type int
+     */
+    this.top = t;
+
+    /**
+     * The region's right extent
+     * @type int
+     */
+    this.right = r;
+
+    /**
+     * The region's bottom extent
+     * @type int
+     */
+    this.bottom = b;
+
+    /**
+     * The region's left extent
+     * @type int
+     */
+    this.left = l;
+};
+
+/**
+ * Returns true if this region contains the region passed in
+ *
+ * @param  {Region}  region The region to evaluate
+ * @return {boolean}        True if the region is contained with this region,
+ *                          else false
+ */
+SPIP.util.Region.prototype.contains = function(region) {
+    return ( region.left   >= this.left   &&
+             region.right  <= this.right  &&
+             region.top    >= this.top    &&
+             region.bottom <= this.bottom    );
+};
+
+/**
+ * Returns the area of the region
+ *
+ * @return {int} the region's area
+ */
+SPIP.util.Region.prototype.getArea = function() {
+    return ( (this.bottom - this.top) * (this.right - this.left) );
+};
+
+/**
+ * Returns the region where the passed in region overlaps with this one
+ *
+ * @param  {Region} region The region that intersects
+ * @return {Region}        The overlap region, or null if there is no overlap
+ */
+SPIP.util.Region.prototype.intersect = function(region) {
+    var t = Math.max( this.top,    region.top    );
+    var r = Math.min( this.right,  region.right  );
+    var b = Math.min( this.bottom, region.bottom );
+    var l = Math.max( this.left,   region.left   );
+
+    if (b >= t && r >= l) {
+        return new SPIP.util.Region(t, r, b, l);
+    } else {
+        return null;
+    }
+};
+
+/**
+ * Returns the region representing the smallest region that can contain both
+ * the passed in region and this region.
+ *
+ * @param  {Region} region The region that to create the union with
+ * @return {Region}        The union region
+ */
+SPIP.util.Region.prototype.union = function(region) {
+    var t = Math.min( this.top,    region.top    );
+    var r = Math.max( this.right,  region.right  );
+    var b = Math.max( this.bottom, region.bottom );
+    var l = Math.min( this.left,   region.left   );
+
+    return new SPIP.util.Region(t, r, b, l);
+};
+
+/**
+ * toString
+ * @return string the region properties
+ */
+SPIP.util.Region.prototype.toString = function() {
+    return ( "Region {" +
+             "  t: "    + this.top    +
+             ", r: "    + this.right  +
+             ", b: "    + this.bottom +
+             ", l: "    + this.left   +
+             "}" );
+}
+
+/**
+ * Returns a region that is occupied by the DOM element
+ *
+ * @param  {HTMLElement} el The element
+ * @return {Region}         The region that the element occupies
+ * @static
+ */
+SPIP.util.Region.getRegion = function(el) {
+    var p = SPIP.util.Dom.getXY(el);
+
+    var t = p[1];
+    var r = p[0] + el.offsetWidth;
+    var b = p[1] + el.offsetHeight;
+    var l = p[0];
+
+    return new SPIP.util.Region(t, r, b, l);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * @class
+ *
+ * A point is a region that is special in that it represents a single point on
+ * the grid.
+ *
+ * @param {int} x The X position of the point
+ * @param {int} y The Y position of the point
+ * @constructor
+ * @extends Region
+ */
+SPIP.util.Point = function(x, y) {
+    /**
+     * The X position of the point
+     * @type int
+     */
+    this.x      = x;
+
+    /**
+     * The Y position of the point
+     * @type int
+     */
+    this.y      = y;
+
+    this.top    = y;
+    this.right  = x;
+    this.bottom = y;
+    this.left   = x;
+};
+
+SPIP.util.Point.prototype = new SPIP.util.Region();
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/event.js
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/event.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/img_pack/event.js	(revision 30)
@@ -0,0 +1,901 @@
+/*
+Copyright (c) 2006 Spip! Inc. All rights reserved.
+version 0.9.0
+*/
+
+/**
+ * @class The CustomEvent class lets you define events for your application
+ * that can be subscribed to by one or more independent component.
+ * @param {String} type The type of event, which is passed to the callback
+ *                 when the event fires
+ * @param {Object} oScope The context the event will fire from.  "this" will
+ *                 refer to this object in the callback.  Default value:
+ *                 the window object.  The listener can override this.
+ * @constructor
+ */
+SPIP.util.CustomEvent = function(type, oScope) {
+    /**
+     * The type of event, returned to subscribers when the event fires
+     * @type string
+     */
+    this.type = type;
+
+    /**
+     * The scope the the event will fire from.  Defaults to the window obj
+     * @type object
+     */
+    this.scope = oScope || window;
+
+    /**
+     * The subscribers to this event
+     * @type array
+     */
+    this.subscribers = [];
+
+    // Register with the event utility for automatic cleanup.  Made optional
+    // so that CustomEvent can be used independently of pe.event
+    if (SPIP.util["Event"]) {
+        SPIP.util.Event.regCE(this);
+    }
+};
+
+SPIP.util.CustomEvent.prototype = {
+    /**
+     * Subscribes the caller to this event
+     * @param {Function} fn       The function to execute
+     * @param {Object}   obj      An object to be passed along when the event fires
+     * @param {boolean}  bOverride If true, the obj passed in becomes the execution
+     *                            scope of the listener
+     */
+    subscribe: function(fn, obj, bOverride) {
+        this.subscribers.push( new SPIP.util.Subscriber(fn, obj, bOverride) );
+    },
+
+    /**
+     * Unsubscribes the caller from this event
+     * @param {Function} fn  The function to execute
+     * @param {Object}   obj An object to be passed along when the event fires
+     * @return {boolean} True if the subscriber was found and detached.
+     */
+    unsubscribe: function(fn, obj) {
+        var found = false;
+        for (var i=0; i<this.subscribers.length; ++i) {
+            var s = this.subscribers[i];
+            if (s && s.contains(fn, obj)) {
+                this._delete(i);
+                found = true;
+            }
+        }
+
+        return found;
+    },
+
+    /**
+     * Notifies the subscribers.  The callback functions will be executed
+     * from the scope specified when the event was created, and with the following
+     * parameters:
+     *   <pre>
+     *   - The type of event
+     *   - All of the arguments fire() was executed with as an array
+     *   - The custom object (if any) that was passed into the subscribe() method
+     *   </pre>
+     *
+     * @param {Array} an arbitrary set of parameters to pass to the handler
+     */
+    fire: function() {
+        for (var i=0; i<this.subscribers.length; ++i) {
+            var s = this.subscribers[i];
+            if (s) {
+                var scope = (s.override) ? s.obj : this.scope;
+                s.fn.call(scope, this.type, arguments, s.obj);
+            }
+        }
+    },
+
+    /**
+     * Removes all listeners
+     */
+    unsubscribeAll: function() {
+        for (var i=0; i<this.subscribers.length; ++i) {
+            this._delete(i);
+        }
+    },
+
+    /**
+     * @private
+     */
+    _delete: function(index) {
+        var s = this.subscribers[index];
+        if (s) {
+            delete s.fn;
+            delete s.obj;
+        }
+
+        delete this.subscribers[index];
+    }
+};
+
+/////////////////////////////////////////////////////////////////////
+
+/**
+ * @class
+ * @param {Function} fn       The function to execute
+ * @param {Object}   obj      An object to be passed along when the event fires
+ * @param {boolean}  bOverride If true, the obj passed in becomes the execution
+ *                            scope of the listener
+ * @constructor
+ */
+SPIP.util.Subscriber = function(fn, obj, bOverride) {
+    /**
+     * The callback that will be execute when the event fires
+     * @type function
+     */
+    this.fn = fn;
+
+    /**
+     * An optional custom object that will passed to the callback when
+     * the event fires
+     * @type object
+     */
+    this.obj = obj || null;
+
+    /**
+     * The default execution scope for the event listener is defined when the
+     * event is created (usually the object which contains the event).
+     * By setting override to true, the execution scope becomes the custom
+     * object passed in by the subscriber
+     * @type boolean
+     */
+    this.override = (bOverride);
+};
+
+/**
+ * Returns true if the fn and obj match this objects properties.
+ * Used by the unsubscribe method to match the right subscriber.
+ *
+ * @param {Function} fn the function to execute
+ * @param {Object} obj an object to be passed along when the event fires
+ * @return {boolean} true if the supplied arguments match this
+ *                   subscriber's signature.
+ */
+SPIP.util.Subscriber.prototype.contains = function(fn, obj) {
+    return (this.fn == fn && this.obj == obj);
+};
+
+/* Copyright (c) 2006 Spip! Inc. All rights reserved. */
+
+// Only load this library once.  If it is loaded a second time, existing
+// events cannot be detached.
+if (!SPIP.util.Event) {
+
+/**
+ * The event utility provides functions to add and remove event listeners,
+ * event cleansing.  It also tries to automatically remove listeners it
+ * registers during the unload event.
+ * @class
+ * @constructor
+ */
+    SPIP.util.Event = function() {
+
+        /**
+         * True after the onload event has fired
+         * @type boolean
+         * @private
+         */
+        var loadComplete =  false;
+
+        /**
+         * Cache of wrapped listeners
+         * @type array
+         * @private
+         */
+        var listeners = [];
+
+        /**
+         * Listeners that will be attached during the onload event
+         * @type array
+         * @private
+         */
+        var delayedListeners = [];
+
+        /**
+         * User-defined unload function that will be fired before all events
+         * are detached
+         * @type array
+         * @private
+         */
+        var unloadListeners = [];
+
+        /**
+         * Cache of the custom events that have been defined.  Used for
+         * automatic cleanup
+         * @type array
+         * @private
+         */
+        var customEvents = [];
+
+        /**
+         * Cache of DOM0 event handlers to work around issues with DOM2 events
+         * in Safari
+         * @private
+         */
+        var legacyEvents = [];
+
+        /**
+         * Listener stack for DOM0 events
+         * @private
+         */
+        var legacyHandlers = [];
+
+        return { // PREPROCESS
+
+            /**
+             * Element to bind, int constant
+             * @type int
+             */
+            EL: 0,
+
+            /**
+             * Type of event, int constant
+             * @type int
+             */
+            TYPE: 1,
+
+            /**
+             * Function to execute, int constant
+             * @type int
+             */
+            FN: 2,
+
+            /**
+             * Function wrapped for scope correction and cleanup, int constant
+             * @type int
+             */
+            WFN: 3,
+
+            /**
+             * Object passed in by the user that will be returned as a
+             * parameter to the callback, int constant
+             * @type int
+             */
+            SCOPE: 3,
+
+            /**
+             * Adjusted scope, either the element we are registering the event
+             * on or the custom object passed in by the listener, int constant
+             * @type int
+             */
+            ADJ_SCOPE: 4,
+
+            /**
+             * Safari detection is necessary to work around the preventDefault
+             * bug that makes it so you can't cancel a href click from the
+             * handler.  There is not a capabilities check we can use here.
+             * @private
+             */
+            isSafari: (navigator.userAgent.match(/safari/gi)),
+
+            /**
+             * @private
+             * IE detection needed to properly calculate pageX and pageY.
+             * capabilities checking didn't seem to work because another
+             * browser that does not provide the properties have the values
+             * calculated in a different manner than IE.
+             */
+            isIE: (!this.isSafari && navigator.userAgent.match(/msie/gi)),
+
+            /**
+             * Appends an event handler
+             *
+             * @param {Object}   el        The html element to assign the
+             *                             event to
+             * @param {String}   sType     The type of event to append
+             * @param {Function} fn        The method the event invokes
+             * @param {Object}   oScope    An arbitrary object that will be
+             *                             passed as a parameter to the handler
+             * @param {boolean}  bOverride If true, the obj passed in becomes
+             *                             the execution scope of the listener
+             * @return {boolean} True if the action was successful or defered,
+             *                        false if one or more of the elements
+             *                        could not have the event bound to it.
+             */
+            addListener: function(el, sType, fn, oScope, bOverride) {
+
+                // The el argument can be an array of elements or element ids.
+                if ( this._isValidCollection(el)) {
+                    var ok = true;
+                    for (var i=0; i< el.length; ++i) {
+                        ok = ( this.on(el[i],
+                                       sType,
+                                       fn,
+                                       oScope,
+                                       bOverride) && ok );
+                    }
+                    return ok;
+
+                } else if (typeof el == "string") {
+                    // If the el argument is a string, we assume it is
+                    // actually the id of the element.  If the page is loaded
+                    // we convert el to the actual element, otherwise we
+                    // defer attaching the event until onload event fires
+
+                    // check to see if we need to delay hooking up the event
+                    // until after the page loads.
+                    if (loadComplete) {
+                        el = this.getEl(el);
+                    } else {
+                        // defer adding the event until onload fires
+                        delayedListeners[delayedListeners.length] =
+                            [el, sType, fn, oScope, bOverride];
+
+                        return true;
+                    }
+                }
+
+                // Element should be an html element or an array if we get
+                // here.
+                if (!el) {
+                    return false;
+                }
+
+                // we need to make sure we fire registered unload events
+                // prior to automatically unhooking them.  So we hang on to
+                // these instead of attaching them to the window and fire the
+                // handles explicitly during our one unload event.
+                if ("unload" == sType && oScope !== this) {
+                    unloadListeners[unloadListeners.length] =
+                            [el, sType, fn, oScope, bOverride];
+                    return true;
+                }
+
+
+                // if the user chooses to override the scope, we use the custom
+                // object passed in, otherwise the executing scope will be the
+                // HTML element that the event is registered on
+                var scope = (bOverride) ? oScope : el;
+
+                // wrap the function so we can return the oScope object when
+                // the event fires;
+                var wrappedFn = function(e) {
+                        return fn.call(scope, SPIP.util.Event.getEvent(e),
+                                oScope);
+                    };
+
+                var li = [el, sType, fn, wrappedFn, scope];
+                var index = listeners.length;
+                // cache the listener so we can try to automatically unload
+                listeners[index] = li;
+
+                if (this.useLegacyEvent(el, sType)) {
+                    var legacyIndex = this.getLegacyIndex(el, sType);
+                    if (legacyIndex == -1) {
+
+                        legacyIndex = legacyEvents.length;
+                        // cache the signature for the DOM0 event, and
+                        // include the existing handler for the event, if any
+                        legacyEvents[legacyIndex] =
+                            [el, sType, el["on" + sType]];
+                        legacyHandlers[legacyIndex] = [];
+
+                        el["on" + sType] =
+                            function(e) {
+                                SPIP.util.Event.fireLegacyEvent(
+                                    SPIP.util.Event.getEvent(e), legacyIndex);
+                            };
+                    }
+
+                    // add a reference to the wrapped listener to our custom
+                    // stack of events
+                    legacyHandlers[legacyIndex].push(index);
+
+                // DOM2 Event model
+                } else if (el.addEventListener) {
+                    el.addEventListener(sType, wrappedFn, false);
+                // Internet Explorer abstraction
+                } else if (el.attachEvent) {
+                    el.attachEvent("on" + sType, wrappedFn);
+                }
+
+                return true;
+
+            },
+
+            /**
+             * Shorthand for SPIP.util.Event.addListener
+             * @type function
+             */
+            // on: this.addListener,
+
+            /**
+             * When using legacy events, the handler is routed to this object
+             * so we can fire our custom listener stack.
+             * @private
+             */
+            fireLegacyEvent: function(e, legacyIndex) {
+                // alert("fireLegacyEvent " + legacyIndex);
+                var ok = true;
+
+                // var el = legacyEvents[SPIP.util.Event.EL];
+
+                /* this is not working because the property may get populated
+                // fire the event we replaced, if it exists
+                var origHandler = legacyEvents[2];
+                alert(origHandler);
+                if (origHandler && origHandler.call) {
+                    var ret = origHandler.call(el, e);
+                    ok = (ret);
+                }
+                */
+
+                var le = legacyHandlers[legacyIndex];
+                for (i=0; i < le.length; ++i) {
+                    var index = le[i];
+                    // alert(index);
+                    if (index) {
+                        var li = listeners[index];
+                        var scope = li[this.ADJ_SCOPE];
+                        var ret = li[this.WFN].call(scope, e);
+                        ok = (ok && ret);
+                        // alert(ok);
+                    }
+                }
+
+                return ok;
+            },
+
+            /**
+             * Returns the legacy event index that matches the supplied
+             * signature
+             * @private
+             */
+            getLegacyIndex: function(el, sType) {
+                for (var i=0; i < legacyEvents.length; ++i) {
+                    var le = legacyEvents[i];
+                    if (le && le[0] == el && le[1] == sType) {
+                        return i;
+                    }
+                }
+
+                return -1;
+            },
+
+            /**
+             * Logic that determines when we should automatically use legacy
+             * events instead of DOM2 events.
+             * @private
+             */
+            useLegacyEvent: function(el, sType) {
+
+                return ( (!el.addEventListener && !el.attachEvent) ||
+                                (sType == "click" && this.isSafari) );
+            },
+
+            /**
+             * Removes an event handler
+             *
+             * @param {Object} el the html element or the id of the element to
+             * assign the event to.
+             * @param {String} sType the type of event to remove
+             * @param {Function} fn the method the event invokes
+             * @return {boolean} true if the unbind was successful, false
+             * otherwise
+             */
+            removeListener: function(el, sType, fn) {
+
+                // The el argument can be a string
+                if (typeof el == "string") {
+                    el = this.getEl(el);
+                // The el argument can be an array of elements or element ids.
+                } else if ( this._isValidCollection(el)) {
+                    var ok = true;
+                    for (var i=0; i< el.length; ++i) {
+                        ok = ( this.removeListener(el[i], sType, fn) && ok );
+                    }
+                    return ok;
+                }
+
+                var cacheItem = null;
+                var index = this._getCacheIndex(el, sType, fn);
+
+                if (index >= 0) {
+                    cacheItem = listeners[index];
+                }
+
+                if (!el || !cacheItem) {
+                    return false;
+                }
+
+
+                if (el.removeEventListener) {
+                    el.removeEventListener(sType, cacheItem[this.WFN], false);
+                    // alert("adsf");
+                } else if (el.detachEvent) {
+                    el.detachEvent("on" + sType, cacheItem[this.WFN]);
+                }
+
+                // removed the wrapped handler
+                delete listeners[index][this.WFN];
+                delete listeners[index][this.FN];
+                delete listeners[index];
+
+                return true;
+
+            },
+
+            /**
+             * Returns the event's target element
+             * @param {Event} ev the event
+             * @param {boolean} resolveTextNode when set to true the target's
+             *                  parent will be returned if the target is a
+             *                  text node
+             * @return {HTMLElement} the event's target
+             */
+            getTarget: function(ev, resolveTextNode) {
+                var t = ev.target || ev.srcElement;
+
+                if (resolveTextNode && t && "#text" == t.nodeName) {
+                    return t.parentNode;
+                } else {
+                    return t;
+                }
+            },
+
+            /**
+             * Returns the event's pageX
+             * @param {Event} ev the event
+             * @return {int} the event's pageX
+             */
+            getPageX: function(ev) {
+                var x = ev.pageX;
+                if (!x && 0 !== x) {
+                    x = ev.clientX || 0;
+
+                    if ( this.isIE ) {
+                        x += this._getScrollLeft();
+                    }
+                }
+
+                return x;
+            },
+
+            /**
+             * Returns the event's pageY
+             * @param {Event} ev the event
+             * @return {int} the event's pageY
+             */
+            getPageY: function(ev) {
+                var y = ev.pageY;
+                if (!y && 0 !== y) {
+                    y = ev.clientY || 0;
+
+                    if ( this.isIE ) {
+                        y += this._getScrollTop();
+                    }
+                }
+
+                return y;
+            },
+
+            /**
+             * Returns the event's related target
+             * @param {Event} ev the event
+             * @return {HTMLElement} the event's relatedTarget
+             */
+            getRelatedTarget: function(ev) {
+                var t = ev.relatedTarget;
+                if (!t) {
+                    if (ev.type == "mouseout") {
+                        t = ev.toElement;
+                    } else if (ev.type == "mouseover") {
+                        t = ev.fromElement;
+                    }
+                }
+
+                return t;
+            },
+
+            /**
+             * Returns the time of the event.  If the time is not included, the
+             * event is modified using the current time.
+             * @param {Event} ev the event
+             * @return {Date} the time of the event
+             */
+            getTime: function(ev) {
+                if (!ev.time) {
+                    var t = new Date().getTime();
+                    try {
+                        ev.time = t;
+                    } catch(e) {
+                        // can't set the time property
+                        return t;
+                    }
+                }
+
+                return ev.time;
+            },
+
+            /**
+             * Convenience method for stopPropagation + preventDefault
+             * @param {Event} ev the event
+             */
+            stopEvent: function(ev) {
+                this.stopPropagation(ev);
+                this.preventDefault(ev);
+            },
+
+            /**
+             * Stops event propagation
+             * @param {Event} ev the event
+             */
+            stopPropagation: function(ev) {
+                if (ev.stopPropagation) {
+                    ev.stopPropagation();
+                } else {
+                    ev.cancelBubble = true;
+                }
+            },
+
+            /**
+             * Prevents the default behavior of the event
+             * @param {Event} ev the event
+             */
+            preventDefault: function(ev) {
+                if (ev.preventDefault) {
+                    ev.preventDefault();
+                } else {
+                    ev.returnValue = false;
+                }
+            },
+
+            /**
+             * Returns the event, should not be necessary for user to call
+             * @param {Event} the event parameter from the handler
+             * @return {Event} the event
+             */
+            getEvent: function(e) {
+                var ev = e || window.event;
+
+                if (!ev) {
+                    var c = this.getEvent.caller;
+                    while (c) {
+                        ev = c.arguments[0];
+                        if (ev && Event == ev.constructor) {
+                            break;
+                        }
+                        c = c.caller;
+                    }
+                }
+
+                return ev;
+            },
+
+            /**
+             * Returns the charcode for an event
+             * @param {Event} ev the event
+             * @return {int} the event's charCode
+             */
+            getCharCode: function(ev) {
+                return ev.charCode || (ev.type == "keypress") ? ev.keyCode : 0;
+            },
+
+            /**
+             * @private
+             * Locating the saved event handler data by function ref
+             */
+            _getCacheIndex: function(el, sType, fn) {
+                for (var i=0; i< listeners.length; ++i) {
+                    var li = listeners[i];
+                    if ( li                 &&
+                         li[this.FN] == fn  &&
+                         li[this.EL] == el  &&
+                         li[this.TYPE] == sType ) {
+                        return i;
+                    }
+                }
+
+                return -1;
+            },
+
+            /**
+             * We want to be able to use getElementsByTagName as a collection
+             * to attach a group of events to.  Unfortunately, different
+             * browsers return different types of collections.  This function
+             * tests to determine if the object is array-like.  It will also
+             * fail if the object is an array, but is empty.
+             * @param o the object to test
+             * @return {boolean} true if the object is array-like and populated
+             */
+            _isValidCollection: function(o) {
+                // alert(o.constructor.toString())
+                // alert(typeof o)
+
+                return ( o                    && // o is something
+                         o.length             && // o is indexed
+                         typeof o != "string" && // o is not a string
+                         !o.tagName           && // o is not an HTML element
+                         !o.alert             && // o is not a window
+                         typeof o[0] != "undefined" );
+
+            },
+
+            /**
+             * @private
+             * DOM element cache
+             */
+            elCache: {},
+
+            /**
+             * We cache elements bound by id because when the unload event
+             * fires, we can no longer use document.getElementById
+             * @private
+             */
+            getEl: function(id) {
+                /*
+                // this is a problem when replaced via document.getElementById
+                if (! this.elCache[id]) {
+                    try {
+                        var el = document.getElementById(id);
+                        if (el) {
+                            this.elCache[id] = el;
+                        }
+                    } catch (er) {
+                    }
+                }
+                return this.elCache[id];
+                */
+
+                return document.getElementById(id);
+            },
+
+            /**
+             * Clears the element cache
+             */
+            clearCache: function() {
+                for (i in this.elCache) {
+                    delete this.elCache[i];
+                }
+            },
+
+            /**
+             * Called by CustomEvent instances to provide a handle to the
+             * event * that can be removed later on.  Should be package
+             * protected.
+             * @private
+             */
+            regCE: function(ce) {
+                customEvents.push(ce);
+            },
+
+            /**
+             * @private
+             * hook up any deferred listeners
+             */
+            _load: function(e) {
+                loadComplete = true;
+            },
+
+            /**
+             * Polling function that runs before the onload event fires,
+             * attempting * to attach to DOM Nodes as soon as they are
+             * available
+             * @private
+             */
+            _tryPreloadAttach: function() {
+
+                // keep trying until after the page is loaded.  We need to
+                // check the page load state prior to trying to bind the
+                // elements so that we can be certain all elements have been
+                // tested appropriately
+                var tryAgain = !loadComplete;
+
+                for (var i=0; i < delayedListeners.length; ++i) {
+                    var d = delayedListeners[i];
+                    // There may be a race condition here, so we need to
+                    // verify the array element is usable.
+                    if (d) {
+
+                        // el will be null if document.getElementById did not
+                        // work
+                        var el = this.getEl(d[this.EL]);
+
+                        if (el) {
+                            this.on(el, d[this.TYPE], d[this.FN],
+                                    d[this.SCOPE], d[this.ADJ_SCOPE]);
+                            delete delayedListeners[i];
+                        }
+                    }
+                }
+
+                if (tryAgain) {
+                    setTimeout("SPIP.util.Event._tryPreloadAttach()", 50);
+                }
+            },
+
+            /**
+             * Removes all listeners registered by pe.event.  Called
+             * automatically during the unload event.
+             */
+            _unload: function(e, me) {
+                for (var i=0; i < unloadListeners.length; ++i) {
+                    var l = unloadListeners[i];
+                    if (l) {
+                        var scope = (l[this.ADJ_SCOPE]) ? l[this.SCOPE]: window;
+                        l[this.FN].call(scope, this.getEvent(e), l[this.SCOPE] );
+                    }
+                }
+
+                if (listeners && listeners.length > 0) {
+                    for (i = 0; i < listeners.length; ++i) {
+                        l = listeners[i];
+                        if (l) {
+                            this.removeListener(l[this.EL], l[this.TYPE],
+                                    l[this.FN]);
+                        }
+                    }
+
+                    this.clearCache();
+                }
+
+                for (i = 0; i < customEvents.length; ++i) {
+                    customEvents[i].unsubscribeAll();
+                    delete customEvents[i];
+                }
+
+                for (i = 0; i < legacyEvents.length; ++i) {
+                    // dereference the element
+                    delete legacyEvents[i][0];
+                    // delete the array item
+                    delete legacyEvents[i];
+                }
+            },
+
+            /**
+             * Returns scrollLeft
+             * @private
+             */
+            _getScrollLeft: function() {
+                return this._getScroll()[1];
+            },
+
+            /**
+             * Returns scrollTop
+             * @private
+             */
+            _getScrollTop: function() {
+                return this._getScroll()[0];
+            },
+
+            /**
+             * Returns the scrollTop and scrollLeft.  Used to calculate the
+             * pageX and pageY in Internet Explorer
+             * @private
+             */
+            _getScroll: function() {
+                var dd = document.documentElement; db = document.body;
+                if (dd && dd.scrollTop) {
+                    return [dd.scrollTop, dd.scrollLeft];
+                } else if (db) {
+                    return [db.scrollTop, db.scrollLeft];
+                } else {
+                    return [0, 0];
+                }
+            }
+        };
+    } ();
+
+    SPIP.util.Event.on = SPIP.util.Event.addListener;
+
+    if (document && document.body) {
+        SPIP.util.Event._load();
+    } else {
+        SPIP.util.Event.on(window, "load", SPIP.util.Event._load,
+                SPIP.util.Event, true);
+    }
+
+    SPIP.util.Event.on(window, "unload", SPIP.util.Event._unload,
+                SPIP.util.Event, true);
+
+    SPIP.util.Event._tryPreloadAttach();
+
+}
+
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/inc/calendar.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/inc/calendar.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/inc/calendar.php	(revision 30)
@@ -0,0 +1,65 @@
+<?php
+
+$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(dirname(__FILE__)))));
+define('_DIR_PLUGIN_WIDGET_CALENDAR',(_DIR_PLUGINS.end($p)));
+define('_WIDGET_CALENDAR_BACK_IN_TIME',4);
+
+global $WCalendar_independants,$WCalendar_lies,$WCalendar_statiques;
+$WCalendar_independants=array();
+$WCalendar_lies=array();
+$WCalendar_statiques=array();
+
+function WCalendar_ajoute($titre,$suffixe){
+	global $WCalendar_independants;	
+	$WCalendar_independants[] = array('titre'=>$titre,'suffixe'=>$suffixe);
+}
+function WCalendar_ajoute_lies($titre_debut,$suffixe_debut,$titre_fin,$suffixe_fin){
+	global $WCalendar_lies;	
+	$WCalendar_lies[] = array('titre1'=>$titre_debut,'suffixe1'=>$suffixe_debut,
+														'titre2'=>$titre_fin,'suffixe2'=>$suffixe_fin);
+}
+function WCalendar_ajoute_statique($titre,$suffixe){
+	global $WCalendar_statiques;	
+	$WCalendar_statiques[] = array('titre'=>$titre,'suffixe'=>$suffixe);
+}
+function WCalendar_statique_point_entree($suffixe, $dates = ""){
+	return "<div><div id='container$suffixe' style='z-index:5000;'></div>
+	<div style='display:none;'><textarea id='selected_date$suffixe' name='selected_date$suffixe'>$dates</textarea></div>
+	<a href='javascript:cal$suffixe.reset()'>Reset</a>"
+	//. "<a href='javascript:alert(cal$suffixe.getSelectedDates())'>what's selected?</a>"
+	. "</div>
+	";
+}
+
+
+function WCalendar_header($flux,$onload=""){
+	global $init_functions;
+	$init_functions = $onload;
+	include_spip('inc/calendar_init');
+	return WCalendar_header_prive($flux);
+}
+function WCalendar_body($flux){
+	include_spip('inc/calendar_init');
+	return WCalendar_body_prive($flux);
+}
+
+function WCalendar_controller($date,$suffixe){
+	if (strcmp($date,format_mysql_date())==0)
+		$date=date("Y-m-d H:i:s");
+	$s = "<a href='javascript:void(null)' onclick='showCalendar$suffixe()'>
+	<img id='dateLink$suffixe' src='"._DIR_IMG_PACK."/cal-jour.gif' border='0' style='vertical-align:middle;margin:5px'/></a>
+	";
+	$s .=
+	  afficher_jour(jour($date), "id='jour$suffixe' name='jour$suffixe' size='1' class='fondl verdana1' onchange='changeDate$suffixe()'") .
+    afficher_mois(mois($date), "id='mois$suffixe' name='mois$suffixe' size='1' class='fondl verdana1' onchange='changeDate$suffixe()'") .
+    afficher_annee(annee($date), "id='annee$suffixe' name='annee$suffixe' size='1' class='fondl verdana1' onchange='changeDate$suffixe()'", date('Y')-_WIDGET_CALENDAR_BACK_IN_TIME);
+  return $s;
+}
+
+function WCalendar_statique_controller($dates,$suffixe){
+	if (is_array($dates))
+		$dates = implode(',',$dates);
+  return WCalendar_statique_point_entree($suffixe, $dates);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/inc/calendar_init.php
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/inc/calendar_init.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/inc/calendar_init.php	(revision 30)
@@ -0,0 +1,295 @@
+<?php
+
+$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(dirname(__FILE__)))));
+define('_DIR_PLUGIN_WIDGET_CALENDAR',(_DIR_PLUGINS.end($p)));
+
+function WCalendar_point_entree($suffixe){
+	return "<div id='container$suffixe' style='position:absolute;display:none;z-index:5000;'></div>
+	";
+}
+
+function WCalendar_body_prive($flux){
+	global $WCalendar_independants,$WCalendar_lies;
+	if (count($WCalendar_independants)+count($WCalendar_lies)){
+		$flux.= "<script type='text/javascript'>";
+		$flux .= "window.onload = wc_init;";
+		$flux .= "</script>";
+		foreach($WCalendar_independants as $infos)
+			$flux .= WCalendar_point_entree($infos['suffixe']);
+		foreach($WCalendar_lies as $infos){
+			$flux .= WCalendar_point_entree($infos['suffixe1']);
+			$flux .= WCalendar_point_entree($infos['suffixe2']);
+		}
+	}
+	return $flux;
+}
+
+function WCalendar_statique_jsinit($t, $s){
+	$vars = "
+			cal$s = undefined;";
+	$js_a = "";
+	$js_b = "
+			var selected$s = '';
+			this.content$s = document.getElementById('selected_date$s');
+			if (this.content$s){
+				selected$s=this.content$s.innerHTML;
+			}
+			if (cal$s != undefined) delete cal$s;
+			$('#container$s').html('');
+			cal$s = new SPIP.widget.Calendar2up_INT_multi('cal$s','container$s','',selected$s);
+			cal$s.title = '$t';
+			cal$s.sync();
+			cal$s.render();
+			";
+	$js_c = "
+		function getSelectedDate$s() {
+			var res = document.getElementById('selected_date$s');
+			res.innerHTML = cal$s.getSelectedDates();
+		}
+	";
+	return array($vars,$js_a,$js_b,$js_c);
+}
+
+function WCalendar_jsinit($t, $s){
+	$vars = "
+			var cal$s;";
+	$js_a = "
+			if (cal$s)
+				cal$s.hide();";
+	$js_b = "
+			this.link$s = document.getElementById('dateLink$s');
+			if (this.link$s){
+				this.selYear$s = document.getElementById('annee$s');
+				this.selMonth$s = document.getElementById('mois$s');
+				this.selDay$s = document.getElementById('jour$s');
+				thisYear$s = this.selYear$s.selectedIndex+parseInt(this.selYear$s.options[0].value);
+				thisMonth$s = this.selMonth$s.selectedIndex;
+				thisDay$s = this.selDay$s.selectedIndex +1;
+				cal$s = new SPIP.widget.Calendar2up_INT('cal$s','container$s',(thisMonth$s+1)+'/'+thisYear$s,(thisMonth$s+1)+'/'+thisDay$s+'/'+thisYear$s);
+				cal$s.title = '$t';
+				cal$s.setChildFunction('onSelect',setDate$s);
+				cal$s.render();
+			}
+			";
+	$js_c = "
+		function showCalendar$s() {
+			wc_hideall();
+			cal$s.outerContainer.style.top = (link$s.height-1+findPosY(link$s)) + 'px';
+			cal$s.outerContainer.style.left = (findPosX(link$s)) + 'px';
+			cal$s.outerContainer.style.display='block';
+		}
+		";
+	return array($vars,$js_a,$js_b,$js_c);
+}
+function WCalendar_js_verifie_lies($sd,$sf){
+	return "
+		function verifie_date$sd$sf(modif){
+			var Date$sd = new Date;
+			Date$sd.setFullYear(this.selYear$sd.selectedIndex+parseInt(selYear$sd.options[0].value));
+			Date$sd.setMonth(this.selMonth$sd.selectedIndex);
+			Date$sd.setDate( this.selDay$sd.selectedIndex + 1);
+			var Date$sf = new Date;
+			Date$sf.setFullYear(this.selYear$sf.selectedIndex+parseInt(selYear$sf.options[0].value));
+			Date$sf.setMonth(this.selMonth$sf.selectedIndex);
+			Date$sf.setDate( this.selDay$sf.selectedIndex + 1);
+			if (Date$sf<Date$sd){
+				if (modif==1){
+					selYear$sf.selectedIndex=selYear$sd.selectedIndex;
+					selMonth$sf.selectedIndex=selMonth$sd.selectedIndex;
+					selDay$sf.selectedIndex=selDay$sd.selectedIndex;
+					cal$sf.select((Date$sd.getMonth()+1) + '/' + (Date$sd.getDate()) + '/' + (Date$sd.getFullYear()));
+					cal$sf.setMonth(Date$sd.getMonth());
+					cal$sf.setYear(Date$sd.getFullYear());
+					cal$sf.render();
+				}
+				else{
+					selYear$sd.selectedIndex=selYear$sf.selectedIndex;
+					selMonth$sd.selectedIndex=selMonth$sf.selectedIndex;
+					selDay$sd.selectedIndex=selDay$sf.selectedIndex;
+					cal$sd.select((Date$sf.getMonth()+1) + '/' + (Date$sf.getDate()) + '/' + (Date$sf.getFullYear()));
+					cal$sd.setMonth(Date$sf.getMonth());
+					cal$sd.setYear(Date$sf.getFullYear());
+					cal$sd.render();
+				}
+			}
+		}
+		";
+}
+function Wcalendar_js_set_change_date($s,$sdverif=NULL,$sfverif=NULL,$modif=""){
+	return "
+		function setDate$s() {
+			var date$s = cal$s.getSelectedDates()[0];
+			selYear$s.selectedIndex=date$s.getFullYear()-parseInt(selYear$s.options[0].value);
+			selMonth$s.selectedIndex=date$s.getMonth();
+			selDay$s.selectedIndex=date$s.getDate()-1;
+			cal$s.hide();
+			" .
+			($sdverif!=NULL?"verifie_date$sdverif$sfverif($modif);":"") ."
+		}
+
+		function changeDate$s() {
+			var month = this.selMonth$s.selectedIndex;
+			var day = this.selDay$s.selectedIndex + 1;
+			var year = this.selYear$s.selectedIndex+parseInt(selYear$s.options[0].value);
+			cal$s.reset();
+			cal$s.clear();
+			cal$s.select((month+1) + '/' + day + '/' + year);
+			cal$s.setMonth(month);
+			cal$s.setYear(year);
+			cal$s.render();
+			" .
+			($sdverif!=NULL?"verifie_date$sdverif$sfverif($modif);":"") ."
+		}
+		";
+}
+function WCalendar_header_prive($flux) {
+	global $WCalendar_independants,$WCalendar_lies,$WCalendar_statiques;
+	global $spip_lang_right;
+	if (count($WCalendar_independants)+count($WCalendar_lies)){
+		// Remplace les entités litérales
+		$trans_tbl = get_html_translation_table (HTML_ENTITIES);
+		$trans_tbl = array_flip ($trans_tbl);
+		
+		// les includes JS statiques
+		$flux .= "<script src = '"._DIR_PLUGIN_WIDGET_CALENDAR."/img_pack/SPIP.js' ></script>\n";
+		$flux .= "<script src = '"._DIR_PLUGIN_WIDGET_CALENDAR."/img_pack/dom.js' ></script>\n";
+		$flux .= "<script src = '"._DIR_PLUGIN_WIDGET_CALENDAR."/img_pack/event.js' ></script>\n";
+		$flux .= "<script src = '"._DIR_PLUGIN_WIDGET_CALENDAR."/img_pack/calendar.js' ></script>\n";
+		$flux .= "<script src = '"._DIR_PLUGIN_WIDGET_CALENDAR."/img_pack/calendar_custom.js' ></script>\n";
+		$flux .= '<link rel="stylesheet" href="' ._DIR_PLUGIN_WIDGET_CALENDAR . '/img_pack/calendar.css" type="text/css" />'. "\n";
+
+		// les noms de mois et de jour selon les fichiers de langue :
+		$months_long = "";
+		$months_short = "";
+		for ($j=1;$j<=12;$j++){
+			$nom = entites_html(ucfirst(strtr(_T("spip:date_mois_$j"),$trans_tbl)));
+			$months_long .= ",'".unicode2charset(charset2unicode($nom,''))."'";
+			$months_short .= ",'".unicode2charset(charset2unicode(preg_replace("/^((&#x?[0-9]{2,5};|.){0,3}).*$/i","\\1",$nom),''))."'";
+		}
+		$months_long = substr($months_long,1);
+		$months_short = substr($months_short,1);
+
+		$days_long = "";
+		$days_medium = "";
+		$days_short = "";
+		$days_1char = "";
+		for ($j=1;$j<=7;$j++){
+			$nom = entites_html(ucfirst(strtr(_T("spip:date_jour_$j"),$trans_tbl)));
+			$days_long .= ",'".$nom."'";
+			$days_medium .= ",'".preg_replace("/^((&#x?[0-9]{2,5};|.){0,3}).*$/i","\\1",$nom)."'";
+			$days_short .= ",'".preg_replace("/^((&#x?[0-9]{2,5};|.){0,2}).*$/i","\\1",$nom)."'";
+			$days_1char .= ",'".preg_replace("/^((&#x?[0-9]{2,5};|.){0,1}).*$/i","\\1",$nom)."'";
+		}
+		$days_long = substr($days_long,1);
+		$days_medium = substr($days_medium,1);
+		$days_short = substr($days_short,1);
+		$days_1char = substr($days_1char,1);
+		$start_weekday = 1;
+		$img_arrow_left = _DIR_PLUGIN_WIDGET_CALENDAR."/img_pack/callt.gif";
+		$img_arrow_right = _DIR_PLUGIN_WIDGET_CALENDAR."/img_pack/calrt.gif";
+		$img_close = _DIR_PLUGIN_WIDGET_CALENDAR."/img_pack/calx.gif";
+
+
+	// le JS dynamique d'init
+	$flux .= "<script language='javascript'>";
+
+	// partie fonction de la langue
+	$js = "";
+
+	$js .= "	
+		SPIP.widget.Calendar2up_INT_Cal.prototype.customConfig = function() {
+			this.Config.Locale.MONTHS_SHORT = [$months_short];
+			this.Config.Locale.MONTHS_LONG = [$months_long];
+			this.Config.Locale.WEEKDAYS_1CHAR = [$days_1char];
+			this.Config.Locale.WEEKDAYS_SHORT = [$days_short];
+			this.Config.Locale.WEEKDAYS_MEDIUM = [$days_medium];
+			this.Config.Locale.WEEKDAYS_LONG = [$days_long];
+		
+			this.Config.Options.START_WEEKDAY = $start_weekday;
+			this.Config.Options.NAV_ARROW_LEFT = '$img_arrow_left';
+			this.Config.Options.NAV_ARROW_RIGHT = '$img_arrow_right';
+			this.Config.Options.IMG_CLOSE = '$img_close';
+			this.Config.Options.IMG_CLOSE_CLASS = 'close-icon-$spip_lang_right';
+		}
+		";
+
+	$js .= "	
+		SPIP.widget.Calendar2up_INT_Cal_multi.prototype.customConfig = function() {
+			this.Config.Locale.MONTHS_SHORT = [$months_short];
+			this.Config.Locale.MONTHS_LONG = [$months_long];
+			this.Config.Locale.WEEKDAYS_1CHAR = [$days_1char];
+			this.Config.Locale.WEEKDAYS_SHORT = [$days_short];
+			this.Config.Locale.WEEKDAYS_MEDIUM = [$days_medium];
+			this.Config.Locale.WEEKDAYS_LONG = [$days_long];
+		
+			this.Config.Options.START_WEEKDAY = $start_weekday;
+			this.Config.Options.NAV_ARROW_LEFT = '$img_arrow_left';
+			this.Config.Options.NAV_ARROW_RIGHT = '$img_arrow_right';
+			this.Config.Options.MULTI_SELECT = true;
+		}
+		";
+	
+		// construire les variables et fonctions de mise a jour
+
+		$vars = "";
+		$js_a= "";	
+		$js_b= "";	
+		$js_c= "";	
+		$liste_suffixes = array();
+		foreach ($WCalendar_statiques as  $infos){
+			$s = $infos['suffixe'];
+			$t = $infos['titre'];
+			list($v,$a,$b,$c) = WCalendar_statique_jsinit($t, $s);
+			$vars .= $v; $js_a .= $a; $js_b .= $b;$js_c .= $c;
+		}
+		foreach ($WCalendar_independants as  $infos){
+			$s = $infos['suffixe'];
+			$t = $infos['titre'];
+			list($v,$a,$b,$c) = WCalendar_jsinit($t, $s);
+			$vars .= $v; $js_a .= $a; $js_b .= $b;$js_c .= $c;
+		}
+		foreach ($WCalendar_lies as  $infos){
+			$s = $infos['suffixe1'];
+			$t = $infos['titre1'];
+			list($v,$a,$b,$c) = WCalendar_jsinit($t, $s);
+			$vars .= $v; $js_a .= $a; $js_b .= $b;$js_c .= $c;
+
+			$s = $infos['suffixe2'];
+			$t = $infos['titre2'];
+			list($v,$a,$b,$c) = WCalendar_jsinit($t, $s);
+			$vars .= $v; $js_a .= $a; $js_b .= $b;$js_c .= $c;
+		}
+		global $init_functions;
+		$js .= "
+		$vars
+		function wc_hideall(){
+			$js_a
+		}
+		function wc_init() {
+			$init_functions
+			$js_b
+		}
+		
+		$js_c
+		";
+		foreach ($WCalendar_independants as  $infos){
+			$s = $infos['suffixe'];
+			$js .= Wcalendar_js_set_change_date($s);
+		}
+
+		foreach ($WCalendar_lies as  $infos){
+			$sd = $infos['suffixe1'];
+			$sf = $infos['suffixe2'];
+			$js .= WCalendar_js_verifie_lies($sd,$sf);
+			$js .= Wcalendar_js_set_change_date($sd,$sd,$sf,1);
+			$js .= Wcalendar_js_set_change_date($sf,$sd,$sf,2);
+		}
+		
+		$js .= "
+	</script>";
+		$flux .= $js;
+	}
+	return $flux;
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/license.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/license.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/license.txt	(revision 30)
@@ -0,0 +1,35 @@
+Software License Agreement (BSD License)
+
+Copyright (c) 2006, Yahoo! Inc.
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms, with 
+or without modification, are permitted provided that the following 
+conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the
+  following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+* Neither the name of Yahoo! Inc. nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Yahoo! Inc.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
Index: /trunk/spip/esqueleto-redcta/plugins/widget_calendar/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/plugins/widget_calendar/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/plugins/widget_calendar/plugin.xml	(revision 30)
@@ -0,0 +1,46 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+<multi>	Widget Calendrier
+[en]
+Calendar Widget
+</multi>
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	Cedric MORIN - [notre-ville.net->http://www.notre-ville.net]
+_ 2006 - Distribu&#233; sous licence GPL
+	</auteur>
+	<version>
+	0.11
+	</version>
+	<etat>
+	stable
+	</etat>
+	<description>
+	<multi>Un Widget Calendrier pr&#234;t &#224; l'emploi pour saisir vos dates
+[en] A Calendar Widget to specify dates.
+</multi>
+	</description>
+	<lien></lien> <!-- URI de documentation -->
+	<fonctions>
+	inc/calendar.php
+	</fonctions>
+	<!-- classe d'implementation : espace de nommage qui prefixera les appels de fonction
+	sur le mode Rien::
+	ainsi les fonctions hors espace de nommage ne peuvent etre appelees
+	ce parametre est obligatoire et doit etre non vide
+	-->
+	<prefix> 
+	WCalendar
+	</prefix>
+	<!-- Definitions des fonctions qui s'inserent dans les pipelines -->
+	<pipeline>
+		<nom>header_prive</nom>
+		<inclure>inc/calendar_init.php</inclure>
+	</pipeline>
+	<pipeline>
+		<nom>body_prive</nom>
+		<inclure>inc/calendar_init.php</inclure>
+	</pipeline>
+
+	<!-- Le parametre action est facultatif : en son absence la methode de la classe portant le nom du pipeline est appelee. Le parametre inclure est facultatif.	-->
+</plugin>
Index: /trunk/spip/esqueleto-redcta/themes/En-rondeur/habillage.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/En-rondeur/habillage.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/En-rondeur/habillage.css	(revision 30)
@@ -0,0 +1,532 @@
+/*  ----------------------------------------------------------- */
+/*  Feuilles de styles des squelettes par defaut pour SPIP 1.9  */
+/*  ----------------------------------------------------------- */
+
+/* taille typo
+ * Base				100%
+ * -------------------------------------
+ * 20px				1.27em
+ * 19px				1.21em
+ * 18px				1.15em
+ * 17px				1.09em
+ * 16px				1.03em
+ * 15px				0.96em
+ * 14px				0.88em
+ * 13px				0.82em
+ * 12px				0.77em
+ * 11px				0.71em
+ * 10px				0.65em
+ *  9px				0.59em
+ * Attention : en dessous de 0.71em le texte devient illisible en text smallest sur MSIE
+ */
+
+/*  ------------------------------------------
+/*  Correction des styles HTML par defaut
+/*  ------------------------------------------ */
+body {
+	margin: 0;
+	padding: 0;
+	background-color: silver;
+	text-align: center;
+	font-size: 96%;
+	background-color: #757D88;
+}
+
+img, table { margin: 0; padding: 0; border: none; }
+ul, ol, li { margin: 0; padding: 0; }
+ul { list-style: none; }
+h1, h2, h3, h4, h5, h6 { margin: 0; padding: 0; font-size: 1em; font-weight: normal; }
+
+/*  ------------------------------------------
+/*  Disposition a l'ecran des blocs principaux
+/*  ------------------------------------------ */
+#page {
+	width: 51em;
+	text-align: left;
+	margin: 1.5em auto;
+	padding-top: .5em;
+	background-color: white;
+}
+#page_agenda {	text-align: left;}
+
+#conteneur { width: 50em; margin: 0 .5em;}
+
+#conteneur #contenu {
+	float: right;
+	width: 38em;
+	display:inline;
+	margin: 0 0 0 0;
+}
+
+#conteneur #navigation {
+	float: left;
+	width: 11em;
+	display: inline;
+	margin: 0;
+	background-color: #F3CF00;
+}
+
+/* Blocs du contenu (c-a-d. la colonne principale) */
+#contenu .contre-encart {
+	float: left;
+	width: 59%; 
+}
+
+#contenu .encart {
+	float: right;
+	width: 35%;
+	margin: 0;
+	/* 
+	position: absolute;
+	top: 0;
+	right: 0;
+	width: 9em;
+	margin: 0 0 1em;
+	padding:0;
+	background-color: silver;
+	overflow:hidden;
+ 	*/
+ }
+
+
+/* Entete */
+#entete {
+	position: relative;
+	left: 0;
+	width: auto;
+	margin: 0 .5em;
+	padding: 0 0;
+	background-color: #595D66;
+	border: 0;
+}
+#entete a {
+	display: block;
+	font-weight: normal;
+	color: white;
+	font-size: 2.5em;
+	margin: 0 ;
+	background-repeat: repeat;
+}
+#entete a { text-decoration: none; }
+#entete .formulaire_recherche { position:absolute; bottom:-2em; right:.3em;}
+#entete .formulaire_recherche .forml { width: 8em;}
+
+/* Fil d'Ariane */
+#hierarchie {
+	clear: both;
+	font-size: 0.77em;
+	margin: .7em 9.66em 0 .66em;
+	padding-bottom: .66em;
+	/* border-bottom: 1px dotted #757D88 */
+	/* background-color: silver; */
+}
+
+/* Pied de page */
+#pied {
+	clear: both;
+	margin: .5em;
+	padding: .5em 0;
+	text-align: center;
+	background-color: navy;
+	color: white;
+}
+#pied small a { font-size: 0.9em; color: white }
+#pied img { vertical-align: bottom; }
+
+/* Espaceur de blocs */
+.nettoyeur { clear: both; margin: 0; padding: 0; border: none; height: 0; line-height: 1px; font-size: 1px; }
+
+/* Non visible a l'ecran */
+.invisible { position: absolute; top: -3000em; height: 1%; }
+
+/*  ------------------------------------------
+/*  Typographie generale du site
+/*  ------------------------------------------ */
+
+/* Typo pour le titre du site */
+#entete #nom_site_spip {
+	font-family: Impact, "Trebuchet MS",Tahoma, "Arial Narrow", "Futura Condensed",  Helvetica, sans-serif; }
+
+/* Typo pour les menus et la navigation */
+body, #navigation, .encart,.formulaire_spip {
+	font-family: Verdana, "Bitstream Vera Sans", Tahoma, Arial, sans-serif; }
+
+/* Typo pour le contenu */
+#contenu {
+	font-family: "Trebuchet MS", Helvetica, sans-serif; }
+
+/* Typo pour les citations et extraits introductifs */
+q, blockquote, .liste-articles li .texte, h3.spip {
+	font-family: "Bitstream Vera Serif", Georgia, Times, serif; }
+
+
+/*  ------------------------------------------
+/*  Habillage des menus et de la navigation
+/*  ------------------------------------------ */
+
+/*  Habillage general des menus de navigation
+---------------------------------------------- */
+.rubriques, .breves, .syndic, .forums, .divers {
+	min-width: 9em;
+	/* border: 1px solid #CCC; */
+	margin-bottom: 1em;
+	font-size: 0.77em;
+	font-family: "Trebuchet MS", Arial, sans-serfi;
+}
+
+.menu-titre {
+	padding: 0.4em 0;
+	/* border-bottom: 1px dotted #CCC; */
+	text-align: center;
+	font-weight: normal;
+	font-size: 1.2em;
+	text-transform: uppercase;
+	color:white;  
+}
+.menu-titre a, .menu-titre a:link, .menu-titre a:visited, .menu-titre a:hover { color: white; }
+
+
+.rubriques p, .breves p, .syndic p, .forums p, .divers p { margin: 0; padding: 0.2em 0.7em;  }
+.rubriques ul, .breves ul, .syndic ul, .forums ul, .divers ul { padding: 0.2em 0; }
+.rubriques li, .breves li, .syndic li, .forums li, .divers li { padding: 0 0.7em; }
+
+/*  Des couleurs specifiques selon les types de menus
+---------------------------------------------- */
+.rubriques { background: transparent;}
+.rubriques .menu-titre {background: transparent; }
+
+#navigation .breves { background: transparent; }
+#navigation .breves .menu-titre { background: transparent; }
+.encart .breves { background: #E65714; }
+.encart .breves .menu-titre { background: #E65714; }
+
+.syndic { background: #369A3D; }
+.syndic .menu-titre { background: #369A3D; }
+
+.forums { background: #42B4AC; }
+.forums .menu-titre { background-color: #42B4AC; }
+
+.divers { background: transparent; }
+.divers .menu-titre { background: transparent; }
+
+/*  Habillage spécifique des blocs d'encart
+---------------------------------------------- */
+
+/*
+#contenu .encart div {
+	width: 30%;
+	margin: 0;
+	text-align: left;
+}
+#contenu .encart div.breves { float: left; }
+#contenu .encart div.forums { float: right; }
+#contenu .encart div.syndic { margin: 0 auto; }
+#contenu .encart div.formulaire_spip {width:auto; }
+*/
+
+/*  ------------------------------------------
+/*  Habillage du contenu
+/*  ------------------------------------------ */
+
+/*  Cartouche et titraille
+---------------------------------------------- */
+.cartouche { margin-bottom: 2em; }
+
+.cartouche .titre {
+	font-size: 1.27em;
+	font-weight: bold;
+	color: #000; }
+#contenu .surtitre, #contenu .soustitre { font-size: 0.82em; }
+
+.cartouche .spip_logos {
+	float: right;
+	margin-left: 16px;
+	margin-bottom: 16px; }
+
+.cartouche p { margin: 0; padding: 0; clear: left; }
+.cartouche small { font-size: 0.71em; }
+
+.cartouche .traductions { font-size: 0.71em; }
+.cartouche .traductions * { display: inline; }
+.cartouche .traductions li { padding-left: 1em; }
+
+
+/*  Mise en forme des textes du contenu
+---------------------------------------------- */
+.chapo {
+	margin-bottom: 1.5em;
+	font-weight: bold;
+	line-height: 1.4em;
+	background-color: #42B4AC;
+	padding: 1em;
+}
+
+.lien {
+	background: #EEE;
+	margin: 1em;
+	margin-bottom: 1.5em;
+	padding: 0.82em;
+	border: 1px solid #CCC;
+	font-size: 0.82em;
+	font-weight: bold; }
+
+.texte { color: #000; font-size: 0.96em; }
+
+.ps, .notes {
+	margin-top: 1.4em;
+	padding-top: 2px;
+	border-top: 2px solid #CCC; }
+.ps { font-size: 0.82em; }
+.notes { clear: both; font-size: 0.77em; }
+.ps h2, .notes h2 { font-size: 1.19em; font-weight: bold; }
+
+/*  Portfolio
+---------------------------------------------- */
+#documents_portfolio {
+	clear: both;
+	margin-top: 1.4em;
+	padding-top: 2px;
+	border-top: 2px solid #CCC; }
+#documents_portfolio h2 { margin-bottom: 0.4em; font-size: 0.88em; font-weight: bold; }
+
+#document_actif { margin-top: 1em; }
+
+/*  Listes de documents joints (a un article ou une rubrique)
+---------------------------------------------- */
+#documents_joints {
+	margin-top: 1.4em;
+	padding-top: 2px;
+	border-top: 2px solid #CCC; }
+#documents_joints h2 { margin-bottom: 0.4em; font-size: 0.88em; font-weight: bold; }
+#documents_joints li { margin-bottom: 0.4em; }
+#documents_joints li .spip_doc_titre {}
+#documents_joints li .spip_doc_titre small { font-weight: normal; }
+#documents_joints li .spip_doc_descriptif {}
+
+/* Listes d'articles et extraits introductifs
+----------------------------------------------- */
+.liste-articles li { margin-bottom: 1em; clear: both; }
+
+.liste-articles li .titre {
+	font-size: 1.03em;
+	font-weight: bold; }
+
+.liste-articles li .spip_logos {
+	float: right;
+	margin-left: 16px;
+	margin-bottom: 16px;
+	clear: right; }
+
+.liste-articles li p { margin: 0; padding: 0; }
+
+.liste-articles li .enclosures {
+	float: right;
+	text-align: right;
+	max-width: 60%;
+	margin: 0; }
+
+.liste-articles li small {
+	display: block;
+	font-size: 0.71em; }
+
+.liste-articles li .texte {
+	margin-top: 5px;
+	margin-bottom: 2em;
+	/*border: 1px solid #CCC; */
+	padding: 0.9em;
+	font-size: 0.82em;
+	line-height: 1.4em;
+	background-color: #EEE;
+}
+
+.contre-encart .liste-articles li {
+	border-bottom: 1px solid white;
+	margin-bottom: 0;
+	padding: .5em;
+}
+.contre-encart {
+	background-color: #F3CF00;
+}
+
+.pagination { font-size: 0.90em; text-align: center; background: #F3CF00; margin-top:1em;  }
+
+/*  ------------------------------------------
+/*  Habillage specifique du plan du site
+/*  ------------------------------------------ */
+
+.page_plan #contenu h2 {
+	clear: both;
+	background: #EEE;
+	border: 1px solid #CCC;
+	padding: 0.5em;
+	margin-bottom: 1em;
+	font-weight: bold;
+	text-align: center; }
+
+.page_plan #contenu .contre-encart ul {
+	display: block;
+	clear: left;
+	margin-left: 1em;
+	margin-bottom: 1em;
+	list-style: square; }
+.page_plan #contenu .contre-encart li { list-style: inherit; }
+
+/*  ------------------------------------------
+/*  Habillage des formulaires
+/*  ------------------------------------------ */
+
+/* Correction des styles HTML par defaut */
+.formulaire_spip form, .formulaire_spip fieldset, .formulaire_spip legend, .formulaire_spip label, .formulaire_spip input, .formulaire_spip textarea, .formulaire_spip select, .formulaire_spip option { margin: 0; padding: 0; border: none; background: none; }
+
+/* Styles des formulaires de Spip */
+.formulaire_spip {
+	text-align: left;
+	font-size: 0.77em;
+}
+
+.formulaire_spip p {
+	margin: 0.5em 0;
+	padding: 0; }
+
+.formulaire_spip fieldset {
+	display: block;
+	margin: 0.77em 0;
+	padding: 0.77em;
+	border: 1px dotted;
+}
+.formulaire_spip legend {
+	font-weight: bold;
+	padding: 3px;
+	background: #FFF;
+	/* Sinon, superposition dans MSIE */
+}
+
+.formulaire_spip label {}
+.formulaire_spip .forml {
+	width: 99%;
+	padding: 1px;
+	border: 1px solid;
+	font-family: inherit;
+	font-size: inherit; }
+
+.spip_bouton { text-align: right; }
+.spip_bouton input {
+	margin: 3px 0;
+	padding: 1px 2px;
+	border: 2px outset;
+	font-weight: bold;
+	float: right; }
+
+/* Reponse du formulaire */
+.reponse_formulaire { font-weight: bold; color: #F00; }
+fieldset.reponse_formulaire { border: 1px dotted; font-weight: normal; }
+
+/* Previsualisation du message */
+fieldset.previsu {
+	padding: 1em;
+	border: 1px solid; }
+
+/* Formulaire de login au forum */
+.formulaire_login_forum .forml { width: 12em; }
+.formulaire_login_forum .spip_logos { float: right; padding-left: 10px; }
+
+/* Choix des mots-clefs */
+.choix_mots { width: 47%; float: left; } 
+.choix_mots label { display: inline; }
+
+/* Formulaire de recherche */
+.formulaire_recherche { text-align: left; }
+.formulaire_recherche label { display: none; }
+
+/* Formulaire d'inscription */
+.formulaire_inscription fieldset {
+	font-family: Tahoma;
+	margin: 0.77em 0;
+	padding: 0.77em;
+	border: none;
+	display:block;
+}
+
+.formulaire_inscription legend {
+	padding: 0;
+	color: #757D88;
+	background-color: transparent;
+	white-space: normal;
+	text-align:center;
+	margin: 0 auto;
+}
+
+
+/*  ------------------------------------------
+/*  Habillage des forums
+/*  ------------------------------------------ */
+
+.forum-repondre, .forum-decompte {
+	clear: both;
+	margin-top: 2.5em;
+	padding-top: 2px;
+	border-top: 2px solid #CCC;
+	font-size: 0.88em;
+	font-weight: bold; }
+
+/* * Habillage des forums */
+ul.forum { display: block; clear: both; margin: 0; padding: 0; }
+.forum-fil { margin-top: 1.5em; }
+.forum-fil ul { display: block; margin: 0; padding: 0; margin-left: 1em; }
+.forum-chapo .forum-titre, .forum-chapo .forum-titre a { display: block; margin: 0; padding: 0; font-weight: bold; text-decoration: none; color: #333; }
+.forum-chapo small {}
+.forum-texte { margin: 0; padding: 0.5em 1em 0 1em; color: #333; font-size: 0.82em; }
+.forum-texte .forum-lien {}
+.forum-texte .forum-repondre-message { margin: 0; padding: 1px 0; text-align: right; }
+
+/* Boite d'un forum : eclaircissement progressif des bords */
+ul .forum-message { border: 1px solid #666; margin: 0; padding: 0; margin-bottom: 1em; }
+ul ul .forum-message { border: 1px solid #A4A4A4; }
+ul ul ul .forum-message { border: 1px solid #B8B8B8; }
+ul ul ul ul .forum-message { border: 1px solid #CCC; }
+ul ul ul ul ul .forum-message { border: 1px solid #E0E0E0; }
+ul ul ul ul ul ul .forum-message { border: 1px dotted #E0E0E0; }
+
+/* Boite de titre d'un forum : mise en couleur selon la profondeur du forum */
+ul .forum-chapo { border: none; border-bottom: 1px dotted #B8B8B8; margin: 0; padding: 3px 6px 2px 6px; font-size: 0.88em; background: #C4E0E0; }
+ul ul .forum-chapo { background: #D4E8E8; }
+ul ul ul .forum-chapo { background: #E4F0F0; }
+ul ul ul ul .forum-chapo { background: #F4F8F8; border-bottom: 1px dotted #E0E0E0; }
+ul ul ul ul ul .forum-chapo { background: #FFF; }
+
+/*  ------------------------------------------
+/*  Habillage des petitions
+/*  ------------------------------------------ */
+
+#signatures { clear: both; font-size: 0.77em; }
+
+#signatures h2 {
+	padding: 0.5em;
+	text-align: center;
+	font-size: 1.2em;
+	font-weight: bold; }
+
+#signatures table { width: 100%; margin: 1em 0; }
+#signatures thead { display: none; } /* On n'affiche pas les titres du tableau */
+
+#signatures td.signature-date {
+	background: #E4F0F0;
+	padding: 0.5em;
+	white-space: nowrap; }
+
+#signatures td.signature-nom {
+	background: #ECF4F4;
+	padding: 0.2em;
+	text-align: center;
+	font-weight: bold; }
+
+#signatures td.signature-message {
+	background: #F4F8F8;
+	padding: 0.4em;
+	font-size: 0.96em; }
+
+/*  ------------------------------------------
+/*  Couleurs des liens
+/*  ------------------------------------------ */
+a { text-decoration: none; color: #333; }
+a:hover { text-decoration: underline; }
Index: /trunk/spip/esqueleto-redcta/themes/En-rondeur/inc-entete.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/En-rondeur/inc-entete.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/En-rondeur/inc-entete.html	(revision 30)
@@ -0,0 +1,19 @@
+<div id="entete">
+
+[(#REM) Afficher le logo ou le titre du site ]
+
+<a  rel="start" 
+	href="#URL_SITE_SPIP/"
+	style="background-image: url([(#CHEMIN{images/backgrnd.jpg})]);">
+		<span id="nom_site_spip" 
+			  style="display:block;
+					 padding:.2em 0 .6em .3em;
+			">
+			#NOM_SITE_SPIP
+		</span>
+
+</a>
+
+#FORMULAIRE_RECHERCHE
+
+</div>
Index: /trunk/spip/esqueleto-redcta/themes/En-rondeur/inc-head.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/En-rondeur/inc-head.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/En-rondeur/inc-head.html	(revision 30)
@@ -0,0 +1,35 @@
+#CACHE{86400}
+
+[(#REM)
+	Entete standard de toutes les pages ; les elements specifiques
+	(title, description) figurent dans le squelette article.html
+]
+
+[(#REM) Preciser le charset ]
+<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+
+[(#REM) Fierement fabrique avec SPIP ]
+<meta name="generator" content="SPIP" />
+
+[(#REM) Lien vers l'icone destinee a la barre de bookmarks ]
+[<link rel="shortcut icon" href="(#CHEMIN{favicon.ico})" />]
+
+[(#REM) Lien vers le flux RSS du site ]
+<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>" href="#URL_PAGE{backend}" />
+
+[(#REM) Feuille de style par defaut pour le code genere par SPIP ]
+<link rel="stylesheet" href="[(#CHEMIN{spip_style.css}|direction_css)]" type="text/css" media="all" />
+
+[(#REM) Feuille de style CSS pour l'affichage du site a l'ecran ]
+<link rel="stylesheet" href="[(#CHEMIN{habillage.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
+
+[(#REM) Pour arrondir les coins - voir: http://www.html.it/articoli/niftycube/ ]
+<script type="text/javascript" src="[(#CHEMIN{javascript/niftycube.js})]"></script>
+<script type="text/javascript" src="[(#CHEMIN{javascript/nifty-spip.js})]"></script>
+<link rel="stylesheet" href="[(#CHEMIN{javascript/niftyCorners.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
+
+[(#REM) Feuille de style CSS pour l'impression ]
+<link rel="stylesheet" href="[(#CHEMIN{impression.css}|direction_css)]" type="text/css" media="print" />
+
+[(#REM) Balise permettant aux plugins d'inserer des appels javascript ou css ]
+#INSERT_HEAD
Index: /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/nifty-spip.js
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/nifty-spip.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/nifty-spip.js	(revision 30)
@@ -0,0 +1,15 @@
+/*
+Nifty Corners Cubes - Layout
+Documentation - Instruction (in English - en anglais) :
+	http://www.html.it/articoli/niftycube/
+*/
+
+window.onload=function(){
+Nifty("div#navigation,div#contenu","same-height");
+Nifty("div#entete","transparent");
+Nifty("div#page","big transparent");
+Nifty("div.encart div.breves", "transparent");
+Nifty("div#pied,div.chapo");
+Nifty("div.liste-articles div.texte","transparent");
+Nifty("div.contre-encart");
+}
Index: /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/niftyCorners.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/niftyCorners.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/niftyCorners.css	(revision 30)
@@ -0,0 +1,35 @@
+/*Nifty Corners Cube CSS by Alessandro Fulciniti
+The following classes are added dinamically by javascript,
+and their use should be avoided in the markup */
+
+b.niftycorners,b.niftyfill{display:block}
+b.niftycorners *{display:block;height: 1px;line-height:1px;font-size: 1px;
+    overflow:hidden;border-style:solid;border-width: 0 1px}
+/*normal*/
+b.r1{margin: 0 3px;border-width: 0 2px}
+b.r2{margin: 0 2px}
+b.r3{margin: 0 1px}
+b.r4{height: 2px}
+b.rb1{margin: 0 8px;border-width:0 2px}
+b.rb2{margin: 0 6px;border-width:0 2px}
+b.rb3{margin: 0 5px}
+b.rb4{margin: 0 4px}
+b.rb5{margin: 0 3px}
+b.rb6{margin: 0 2px}
+b.rb7{margin: 0 1px;height:2px}
+b.rb8{margin: 0;height:2px}
+b.rs1{margin: 0 1px}
+/*transparent inside*/
+b.t1{border-width: 0 5px}
+b.t2{border-width: 0 3px}
+b.t3{border-width: 0 2px}
+b.t4{height: 2px}
+b.tb1{border-width: 0 10px}
+b.tb2{border-width: 0 8px}
+b.tb3{border-width: 0 6px}
+b.tb4{border-width: 0 5px}
+b.tb5{border-width: 0 4px}
+b.tb6{border-width: 0 3px}
+b.tb7{border-width: 0 2px;height:2px}
+b.tb8{border-width: 0 1px;height:2px}
+b.ts1{border-width: 0 2px}
Index: /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/niftycube.js
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/niftycube.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/En-rondeur/javascript/niftycube.js	(revision 30)
@@ -0,0 +1,300 @@
+/* Nifty Corners Cube - rounded corners with CSS and Javascript
+Copyright 2006 Alessandro Fulciniti (a.fulciniti@html.it)
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+var niftyOk=(document.getElementById && document.createElement && Array.prototype.push);
+var niftyCss=true;
+
+String.prototype.find=function(what){
+return(this.indexOf(what)>=0 ? true : false);
+}
+
+var oldonload=window.onload;
+if(typeof(NiftyLoad)!='function') NiftyLoad=function(){};
+if(typeof(oldonload)=='function')
+    window.onload=function(){oldonload();AddCss();NiftyLoad()};
+else window.onload=function(){AddCss();NiftyLoad()};
+
+/*
+function AddCss(){
+niftyCss=true;
+var l=CreateEl("link");
+l.setAttribute("type","text/css");
+l.setAttribute("rel","stylesheet");
+l.setAttribute("href","niftyCorners.css");
+l.setAttribute("media","screen");
+document.getElementsByTagName("head")[0].appendChild(l);
+}
+*/
+
+function Nifty(selector,options){
+if(niftyOk==false) return;
+if(niftyCss==false) AddCss();
+var i,v=selector.split(","),h=0;
+if(options==null) options="";
+if(options.find("fixed-height"))
+    h=getElementsBySelector(v[0])[0].offsetHeight;
+for(i=0;i<v.length;i++)
+    Rounded(v[i],options);
+if(options.find("height")) SameHeight(selector,h);
+}
+
+function Rounded(selector,options){
+var i,top="",bottom="",v=new Array();
+if(options!=""){
+    options=options.replace("left","tl bl");
+    options=options.replace("right","tr br");
+    options=options.replace("top","tr tl");
+    options=options.replace("bottom","br bl");
+    options=options.replace("transparent","alias");
+    if(options.find("tl")){
+        top="both";
+        if(!options.find("tr")) top="left";
+        }
+    else if(options.find("tr")) top="right";
+    if(options.find("bl")){
+        bottom="both";
+        if(!options.find("br")) bottom="left";
+        }
+    else if(options.find("br")) bottom="right";
+    }
+if(top=="" && bottom=="" && !options.find("none")){top="both";bottom="both";}
+v=getElementsBySelector(selector);
+for(i=0;i<v.length;i++){
+    FixIE(v[i]);
+    if(top!="") AddTop(v[i],top,options);
+    if(bottom!="") AddBottom(v[i],bottom,options);
+    }
+}
+
+function AddTop(el,side,options){
+var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;
+d.style.marginLeft="-"+getPadding(el,"Left")+"px";
+d.style.marginRight="-"+getPadding(el,"Right")+"px";
+if(options.find("alias") || (color=getBk(el))=="transparent"){
+    color="transparent";bk="transparent"; border=getParentBk(el);btype="t";
+    }
+else{
+    bk=getParentBk(el); border=Mix(color,bk);
+    }
+d.style.background=bk;
+d.className="niftycorners";
+p=getPadding(el,"Top");
+if(options.find("small")){
+    d.style.marginBottom=(p-2)+"px";
+    btype+="s"; lim=2;
+    }
+else if(options.find("big")){
+    d.style.marginBottom=(p-10)+"px";
+    btype+="b"; lim=8;
+    }
+else d.style.marginBottom=(p-5)+"px";
+for(i=1;i<=lim;i++)
+    d.appendChild(CreateStrip(i,side,color,border,btype));
+el.style.paddingTop="0";
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,side,options){
+var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;
+d.style.marginLeft="-"+getPadding(el,"Left")+"px";
+d.style.marginRight="-"+getPadding(el,"Right")+"px";
+if(options.find("alias") || (color=getBk(el))=="transparent"){
+    color="transparent";bk="transparent"; border=getParentBk(el);btype="t";
+    }
+else{
+    bk=getParentBk(el); border=Mix(color,bk);
+    }
+d.style.background=bk;
+d.className="niftycorners";
+p=getPadding(el,"Bottom");
+if(options.find("small")){
+    d.style.marginTop=(p-2)+"px";
+    btype+="s"; lim=2;
+    }
+else if(options.find("big")){
+    d.style.marginTop=(p-10)+"px";
+    btype+="b"; lim=8;
+    }
+else d.style.marginTop=(p-5)+"px";
+for(i=lim;i>0;i--)
+    d.appendChild(CreateStrip(i,side,color,border,btype));
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateStrip(index,side,color,border,btype){
+var x=CreateEl("b");
+x.className=btype+index;
+x.style.backgroundColor=color;
+x.style.borderColor=border;
+if(side=="left"){
+    x.style.borderRightWidth="0";
+    x.style.marginRight="0";
+    }
+else if(side=="right"){
+    x.style.borderLeftWidth="0";
+    x.style.marginLeft="0";
+    }
+return(x);
+}
+
+function CreateEl(x){
+return(document.createElement(x));
+}
+
+function FixIE(el){
+if(el.currentStyle!=null && el.currentStyle.hasLayout!=null && el.currentStyle.hasLayout==false)
+    el.style.display="inline-block";
+}
+
+function SameHeight(selector,maxh){
+var i,v=selector.split(","),t,j,els=[],gap;
+for(i=0;i<v.length;i++){
+    t=getElementsBySelector(v[i]);
+    els=els.concat(t);
+    }
+for(i=0;i<els.length;i++){
+    if(els[i].offsetHeight>maxh) maxh=els[i].offsetHeight;
+    els[i].style.height="auto";
+    }
+for(i=0;i<els.length;i++){
+    gap=maxh-els[i].offsetHeight;
+    if(gap>0){
+        t=CreateEl("b");t.className="niftyfill";t.style.height=gap+"px";
+        nc=els[i].lastChild;
+        if(nc.className=="niftycorners")
+            els[i].insertBefore(t,nc);
+        else els[i].appendChild(t);
+        }
+    }
+}
+
+function getElementsBySelector(selector){
+var i,j,selid="",selclass="",tag=selector,tag2="",v2,k,f,a,s=[],objlist=[],c;
+if(selector.find("#")){ //id selector like "tag#id"
+    if(selector.find(" ")){  //descendant selector like "tag#id tag"
+        s=selector.split(" ");
+        var fs=s[0].split("#");
+        if(fs.length==1) return(objlist);
+        f=document.getElementById(fs[1]);
+        if(f){
+            v=f.getElementsByTagName(s[1]);
+            for(i=0;i<v.length;i++) objlist.push(v[i]);
+            }
+        return(objlist);
+        }
+    else{
+        s=selector.split("#");
+        tag=s[0];
+        selid=s[1];
+        if(selid!=""){
+            f=document.getElementById(selid);
+            if(f) objlist.push(f);
+            return(objlist);
+            }
+        }
+    }
+if(selector.find(".")){      //class selector like "tag.class"
+    s=selector.split(".");
+    tag=s[0];
+    selclass=s[1];
+    if(selclass.find(" ")){   //descendant selector like tag1.classname tag2
+        s=selclass.split(" ");
+        selclass=s[0];
+        tag2=s[1];
+        }
+    }
+var v=document.getElementsByTagName(tag);  // tag selector like "tag"
+if(selclass==""){
+    for(i=0;i<v.length;i++) objlist.push(v[i]);
+    return(objlist);
+    }
+for(i=0;i<v.length;i++){
+    c=v[i].className.split(" ");
+    for(j=0;j<c.length;j++){
+        if(c[j]==selclass){
+            if(tag2=="") objlist.push(v[i]);
+            else{
+                v2=v[i].getElementsByTagName(tag2);
+                for(k=0;k<v2.length;k++) objlist.push(v2[k]);
+                }
+            }
+        }
+    }
+return(objlist);
+}
+
+function getParentBk(x){
+var el=x.parentNode,c;
+while(el.tagName.toUpperCase()!="HTML" && (c=getBk(el))=="transparent")
+    el=el.parentNode;
+if(c=="transparent") c="#FFFFFF";
+return(c);
+}
+
+function getBk(x){
+var c=getStyleProp(x,"backgroundColor");
+if(c==null || c=="transparent" || c.find("rgba(0, 0, 0, 0)"))
+    return("transparent");
+if(c.find("rgb")) c=rgb2hex(c);
+return(c);
+}
+
+function getPadding(x,side){
+var p=getStyleProp(x,"padding"+side);
+if(p==null || !p.find("px")) return(0);
+return(parseInt(p));
+}
+
+function getStyleProp(x,prop){
+if(x.currentStyle)
+    return(x.currentStyle[prop]);
+if(document.defaultView.getComputedStyle)
+    return(document.defaultView.getComputedStyle(x,'')[prop]);
+return(null);
+}
+
+function rgb2hex(value){
+var hex="",v,h,i;
+var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;
+var h=regexp.exec(value);
+for(i=1;i<4;i++){
+    v=parseInt(h[i]).toString(16);
+    if(v.length==1) hex+="0"+v;
+    else hex+=v;
+    }
+return("#"+hex);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+    x=parseInt(c1.substr(1+step1*i,step1),16);
+    if(step1==1) x=16*x+x;
+    y=parseInt(c2.substr(1+step2*i,step2),16);
+    if(step2==1) y=16*y+y;
+    r[i]=Math.floor((x*50+y*50)/100);
+    r[i]=r[i].toString(16);
+    if(r[i].length==1) r[i]="0"+r[i];
+    }
+return("#"+r[0]+r[1]+r[2]);
+}
Index: /trunk/spip/esqueleto-redcta/themes/En-rondeur/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/En-rondeur/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/En-rondeur/plugin.xml	(revision 30)
@@ -0,0 +1,24 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+		En rondeur
+	</nom>
+
+	<auteur><!-- Auteur du plugin -->
+		[Andr&#233; Vincent->http://andre-vincent.info] - &#169; 2006 - Licence GNU/GPL
+	</auteur>
+
+	<version>0.2</version>
+
+	<etat>test</etat>
+
+	<description>
+		<multi>
+			Activate this 'habillage' to modify the look and feel of the official distribution (in /dist/)
+		[fr]
+			Activez cet habillage pour varier l'apparence du squelette de la distribution officielle de SPIP (dans /dist/).
+		</multi>
+	</description>
+
+	 <prefix>theme</prefix>
+
+</plugin>
Index: /trunk/spip/esqueleto-redcta/themes/En-rondeur/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/En-rondeur/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/En-rondeur/theme.xml	(revision 30)
@@ -0,0 +1,17 @@
+<theme>
+  <nom>En rondeur</nom>
+  <auteur>
+    [Andr&#233; Vincent->http://andre-vincent.info] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>0.2</version>
+  <etat>test</etat>
+  <type>themes</type>
+  <squelettes>dist</squelettes>
+  <description>
+    <multi>
+      Activate this 'habillage' to modify the look and feel of the official distribution (in /dist/)
+      [fr]
+      Activez cet habillage pour varier l'apparence du squelette de la distribution officielle de SPIP (dans /dist/).
+    </multi>
+  </description>
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/habillage.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/habillage.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/habillage.css	(revision 30)
@@ -0,0 +1,942 @@
+/*****************************************************/
+/*   Design:  GoFlexiblePro                          */
+/*            Stylesheet for screen rendering        */
+/*---------------------------------------------------*/
+/*   Author:  G. Wolfgang                            */
+/*   Email:   gw@actamail.com                        */
+/*   Date:    April 14, 2006                         */
+/*---------------------------------------------------*/
+/*   You can use this stylesheet freely under the    */
+/*   condition of giving proper author credits.      */
+/*---------------------------------------------------*/
+/*   Check out my favorite website: www.sda.org      */
+/*****************************************************/
+
+/*-----------------------------------------------------------------------*/
+/* REMARK: FONT-SIZE DEFINITIONS                                         */
+/*-----------------------------------------------------------------------*/
+/* Relative font-sizes in "em" are used where necessary. To make the     */
+/* "em"-units normed, the incoming font sizes are set to 1.0 em. The     */
+/* font-size variations throughout the webpage are then expressed in     */
+/* percentage values respective to the incoming font-size. To make       */
+/* calculations easier, the font definition in "body" is such that       */
+/* 1.0em = 10px. This makes life a real breeze!                          */
+/*-----------------------------------------------------------------------*/
+
+/*************************/
+/* SECTION 1 - MAIN BODY */
+/*************************/
+
+/*-------------------------------*/
+/* Section 1.1 - Page definition */
+/*-------------------------------*/
+
+body {
+	font-size: 62.5%; margin: 0 auto; padding: 0; background: white url(background.gif) top center repeat-y; font-family: "trebuchet ms", verdana, arial, sans-serif;
+}
+
+#page {
+	width: 780px; margin: 0 auto; padding: 0; border-left: solid 1px rgb(150,150,150); border-right: solid 1px rgb(150,150,150); background-color: rgb(237,237,237);
+}
+
+#conteneur { clear: both; width: 100%; }
+
+/**********************/
+/* SECTION 2 - HEADER */
+/**********************/
+
+/*--------------------------------------*/
+/* Section 2.1 - Global navigation menu */
+/*--------------------------------------*/
+
+#entete {
+	/*float: left; position: absolute;*/ z-index: 3; width: 780px; top: 5px; background: transparent url(header.jpg) left bottom no-repeat; min-height: 110px;
+}
+
+#entete .formulaire_recherche {	
+	float: right; margin: 0; padding: 0; list-style: none;
+}
+#entete .formulaire_recherche label {
+	white-space: nowrap; text-transform: uppercase; margin: 0; padding: 0 5px 0 5px; color: rgb(150,150,150); text-decoration: none; font-size: 100%;
+}
+
+#entete a:hover {
+	background-color: rgb(255,255,255); color: rgb(0,0,0); text-decoration: underline;
+}
+
+/*-----------------------------------*/
+/* Section 2.2 - Sitename and Banner */
+/*-----------------------------------*/
+
+#entete #nom_site_spip, #entete a .spip_logos  {
+	clear: both; float: left; position: absolute; z-index: 1; width: 700px; top: 20px; margin: 0; padding-left: 14px; background-color: transparent; color: rgb(225,225,225); font-weight: bold; font-size: 24px;
+}
+
+.site-slogan  {
+	float: left; position: absolute; z-index: 2; width: 11.7em; top: 1.9em; left: 16px; margin: 0; padding: 0 3px 1px 3px; background-color: rgb(150,150,150);	color: rgb(225,225,225); font-weight: bold; font-size: 14px;
+}
+
+.img-header {
+	clear: both; float: left; width: 780px; height: 110px; margin: 0; padding: 0;
+}
+
+/*------------------------------------*/
+/* Section 2.3 - Main navigation menu */
+/*------------------------------------*/
+
+#hierarchie {
+	clear: both; width: 770px; margin: 0; padding-left: 10px; border-top: solid 1px rgb(125,125,125); border-bottom: solid 1px rgb(125,125,125); background-color: rgb(190,190,190); font-weight: bold;font-size: 1.2em; 
+}
+
+#hierarchie a {
+	color: rgb(255,255,255); margin: 0; padding: 0; text-decoration: none;
+}
+
+#hierarchie, #hierarchie a:hover, #hierarchie a.selected {
+	color: rgb(110,110,110); text-decoration: none;
+}
+
+/*************************************/
+/* SECTION 3 - FRONT-PAGE SIDEBANNER */
+/*************************************/
+
+.sidebanner-frontpage {
+	clear: both; float: left; width: 160px; margin: 0; padding: 0;
+}
+
+.img-sidebanner {
+	width: 160px; margin: 0; padding: 0; border: none;
+}
+
+/******************************/
+/* SECTION 4 - SUB-NAVIGATION */
+/******************************/
+
+/*--------------------*/
+/* Section 4.1 - Size */
+/*--------------------*/
+
+.forum-fil {
+	clear: both; margin: 0; padding: 0; color: rgb(110,110,110); list-style: none; border-bottom: solid 1px rgb(200,200,200);
+}
+
+.forum-fil ul {	
+	list-style: none; margin: 0; padding: 0;
+}
+
+.forum-fil li {
+	margin: 0; padding: 0; /*border-left: solid 5px rgb(235,235,235);*/
+}
+
+.forum-fil .forum-titre {
+	vertical-align: top; margin: 0; padding: 10px 7px 10px 14px; color: rgb(175,175,175); font-weight: bold; font-size: 140%;
+}
+
+.forum-fil a {
+	color: rgb(110,110,110);
+}
+
+
+/*******************************************************************/
+/* SECTION 5 -  Extend left column height to footer                */
+/*-----------------------------------------------------------------*/
+
+.container-content-sidebar {
+   float: left; width: 620px; min-height: 400px; margin: 0; padding: 0; background-color: rgb(255,255,255);
+}
+
+/* IE6-hack for min-height. Also works for IE7-Beta2 */
+* html .container-content-sidebar {
+	height: 400px;
+} 
+/* End IE-Hack */
+
+/* Put a buffer between sub-navigation column and      */
+/* main-navigation so that the global page background  */
+/* color does not come through in this place           */
+
+.buffer {
+ 	float: left; width: 160px; height: 20px; margin: 0; padding: 0; background-color: rgb(255,255,255);	
+}
+
+/***********************/
+/* SECTION 6 - CONTENT */
+/***********************/
+
+/*--------------------*/
+/* Section 6.1 - Size */
+/*--------------------*/
+
+#contenu {
+	float: left; width: 425px; margin: 0; margin-left: 144px; padding: 30px 20px 0 20px; background-color: rgb(255,255,255);	display: inline;
+}
+
+/*-------------------------*/
+/* Section 6.2 - Pagetitle */
+/*-------------------------*/
+
+#contenu .cartouche {
+	width: 390px; margin: 0 0 10px 0; padding: 0;
+}
+
+#contenu .cartouche p {
+	padding: 0; margin: 0; font-weight: bold; font-size: 140%;
+}
+
+/*----------------------------------*/
+/* Section 6.3 - Extra container    */
+/*----------------------------------*/
+/* To ensure that no problems arise */
+/* with right and left floatings    */
+/* and make the implementation      */
+/* robuster.                        */
+/*----------------------------------*/
+
+/*#contenu box-container-full {
+	 float: left; width: 425px; margin: 0 0 1.5em 0; padding: 0;
+}*/
+
+#contenu .contre-encart {
+	float: left; width: 205px; margin: 0 0 1.5em 0; padding: 0;
+}
+
+#contenu .encart {
+	float: right; width: 205px; margin: 0 0 1.5em 0; padding: 0;
+}
+
+/*-----------------------------*/
+/* Section 6.4 - Content title */
+/*-----------------------------*/
+
+#contenubox-title-noshading-noline {
+	display: block; margin: 0; padding: 0; background-color: transparent; text-transform: none; font-weight: bold; font-size: 150%;
+}
+
+h3.spip, #contenu h2 {
+	display: block; margin: 0 0 0.2em 0; padding: 0; border-bottom: solid 2px rgb(135,135,135); background-color: transparent; text-transform: none; font-weight: bold; font-size: 150%; text-align: left;
+}
+h3.spip a, #contenu h2 a { text-decoration: none; }
+
+.liste-articles ul, .encart ul, .page_plan ul { list-style: none; margin: 0; padding: 0; }
+.liste-articles li .titre {
+  	margin: 0; padding: 1px 0 2px 3px; background-color: rgb(225,225,225); font-weight: bold; font-size: 150%;	
+}
+
+/*--------------------------------*/
+/* Section 6.5 - Contentbox size  */
+/*--------------------------------*/
+
+/* No shading */
+#contenubox-noshading {
+	margin: 0; padding: 0.7em 0 0px 0; background-color: transparent;
+}
+
+/* Shading */
+.liste-articles li {
+	margin: 0; padding: 7px 10px 5px 10px; background-color: transparent;
+}
+
+/*-------------------------------*/
+/* Section 6.6 - Contentbox text */
+/*-------------------------------*/
+
+/* Heading */
+h1 {
+	clear: left; margin: 1.0em 0 1.0em 0; font-weight: bold; font-size: 150%;
+}
+
+h2 {
+	clear: left; margin: 1.5em 0 1.0em 0; font-weight: bold; font-size: 140%;
+}
+
+h3 {
+	clear: left; margin: 1.0em 0 0.6em 0; font-weight: bold; font-size: 130%;
+}
+
+h4 {
+	clear: left; margin: 0.5em 0 0.5em 0; font-weight: bold; font-style: italic; font-size: 130%;
+}
+
+/* Paragraph text */
+p {
+   clear: left; margin: 0 0 0.5em 0; padding: 0; font-size: 130%;
+}
+
+/* Quote */
+p.quote {
+   clear: left; margin: 0 30px 0.6em 30px; line-height: 120%; font-size: 120%;
+}
+
+/* Embedded */
+.embed {
+   float: left; width: 120px; margin: 2px 7px 2px 0; padding: 5px 5px 5px 5px; background-color: rgb(225,225,225); font-style: italic; font-weight: bold;  line-height: 1.2em; font-size: 180%;
+}
+
+.embed-caption {
+   float: left; margin: 5px 0 0px 0; padding: 0; font-style: italic; font-weight: normal; line-height: 1.2em; font-size: 50%;
+}
+
+/* Unordered list */
+ul.spip {
+	margin: 0 10px 0 10px; padding: 0 0 0px 30px; list-style-type: disc; list-style-position: outside;
+}
+
+/* Ordered List */
+ol.spip {
+	margin: 0 10px 0 17px; padding: 0 0 0px 30px; list-style-type: decimal; list-style-position: outside;
+}
+
+/*--------------------------*/
+/* Section 6.7 - Datatables */
+/*--------------------------*/
+
+table {
+	clear: left; margin: 0.5em 0 0.2em 30px; border: solid 1px rgb(150,150,150); empty-cells: show; border-collapse: collapse; background-color: rgb(225,225,225);
+}
+
+table tr {
+	margin: 0; padding: 0;
+}
+
+table td {
+	padding: 2px 7px 2px 7px; border: solid 1px rgb(150,150,150); text-align: left; font-size: 120%;
+}
+
+table th {
+	margin: 0; padding: 2px 7px 2px 7px; border: solid 1px rgb(150,150,150); empty-cells: show; text-align: left; font-size: 120%; 	
+}
+
+p table caption {
+	margin: 0 0 10px 30px; padding: 0; clear: both; text-align: left; font-size: 120%;
+}
+
+/*----------------------*/
+/* Section 6.8 - Images */
+/*----------------------*/
+
+.spip_documents img {
+	border: solid 1px rgb(150,150,150);
+}
+
+.spip_documents_center {
+	float: left; margin: 0.3em 0 3px 0;
+}
+
+.spip_documents_left {
+	float: left; margin: 0.3em 7px 3px 0;
+}
+
+.spip_documents_right {
+	float: right; margin: 0.3em 0 3px 7px;	
+}
+
+/***********************/
+/* SECTION 7 - SIDEBAR */
+/***********************/
+#navigation {
+	 float: right; width: 144px; margin: 0; padding: 57px 5px 0 0; background-color: rgb(255,255,255);
+}
+
+/*-----------------------*/
+/* Section 7.2 - Textbox */
+/*-----------------------*/
+
+/*#navigation box-noborder {
+	width: 140px; margin: 0 0 1.0em 0; padding: 0;
+}*/
+
+#navigation div {
+	width: 130px; margin: 0 0 1.0em 0; padding: 4px 4px 4px 4px; border: solid 1px rgb(200,200,200);
+}
+#navigation div div { width: auto; margin: 0; padding: 0; border: none; }
+#navigation fieldset { margin: 0; padding: 0; border: none; }
+
+/*-----------------------------*/
+/* Section 7.3 - Textbox title */
+/*-----------------------------*/
+
+/*#navigationbox-title-noshading-noline {
+	 display: block; margin: 0 0 0.5em 0; padding: 1px 0 1px 0;font-weight: bold; font-size: 120%;
+}
+
+#navigationbox-title-noshading-line {
+	display: block; margin: 0 0 0.5em 0; padding: 1px 0 1px 0; border-bottom: solid 1px rgb(135,135,135); background-color: transparent; font-weight: bold; font-size: 120%;
+}*/
+#navigation .menu-titre, #navigation legend {
+	display: block; margin: 0 0 0.5em 0; padding: 2px 5px 2px 5px; background-color: rgb(225,225,225); font-weight: bold; font-size: 120%;
+}
+#navigation legend, #navigation .menu-titre, #navigation .menu-titre a { text-decoration: none; color: rgb(255,255,255); }
+
+/*------------------------------*/
+/* Section 7.4 - Paragraph text */
+/*------------------------------*/
+
+/*#navigation .box-noborder p {
+	margin: 0 4px 0.4em 4px; padding: 0; background-color: transparent; font-size: 110%;
+}*/
+
+#navigation p, #navigation ul {
+	margin: 0 0 0.4em 0; padding: 0; background-color: transparent; font-size: 110%; list-style: none;
+}
+
+/**********************/
+/* SECTION 8 - FOOTER */
+/**********************/
+
+#pied {
+	clear: both; width: 780px; margin: 0 0 0px 0; padding: 5px 0 5px 0; border-top: solid 1px rgb(200,200,200); border-bottom: solid 1px rgb(200,200,200); background-color: rgb(255,255,255); text-align: center;	
+}
+
+/***************************************************/
+/* SECTION 9 - HYPERLINKS FOR NON-NAVIGATION TEXTS */
+/***************************************************/
+
+#contenu a, #navigation a {
+	color: rgb(0,0,0); text-decoration: underline;
+}
+
+#contenu a:hover, #navigation a:hover {
+	color: rgb(110,110,110); text-decoration: none;
+}
+
+#contenu a:visited, #navigation a:visited {
+	color: rgb(110,110,110);
+}
+
+#pied a {
+	color: rgb(150,150,150); text-decoration: underline;
+}
+
+#pied a:hover {
+	color: rgb(0,0,0); text-decoration: none;
+}
+
+/********************************/
+/* SECTION 10 - GENERIC CLASSES */
+/********************************/
+
+/*------------------------------------------*/
+/* Section 10.1 - Global default fonts      */
+/*------------------------------------------*/
+/* Only applied to the main div-statements  */
+/* for the basic page regions.              */
+/*------------------------------------------*/
+
+#entete {
+	font-size: 1em;
+}
+
+/*#hierarchie {
+	font-size: 1.1em;
+}*/
+
+.forum-fil {
+	font-size: 1em;
+}
+
+#contenu {
+	font-size: 1em; line-height: 1.7em; color: rgb(110,110,110);
+}
+
+#navigation {
+	font-size: 1em; line-height: 1.4em; color: rgb(110,110,110);
+}
+
+/* Percentage value does not work in "footer", so we     */
+/* cannot give the normed size of "1.0em" here and scale */
+/* it up inside the "footer". Thus we define the final   */
+/* font-size here the way it will appear on screen.      */
+#pied {
+	font-size: 1.1em; color: rgb(150,150,150);
+}
+
+/*--------------------------------------*/
+/* Section 10.2 - Horizontal alignments */
+/*--------------------------------------*/
+
+.align-left {
+	text-align: left;
+}
+
+.align-right {
+	text-align: right;
+}
+
+.float-left {
+	float: left;
+}
+
+.float-right {
+	float: right;
+}
+
+/*-------------------------------------*/
+/* Section 10.3 - Title decoration box */
+/*-------------------------------------*/
+
+.box-on {
+	float: left; width: 1em; margin-right: 0.2em; padding-left: 0.3em;
+}
+
+.box-off {
+	display: none;
+}
+
+/*---------------------------*/
+/* Section 10.4  Text colors */
+/*---------------------------*/
+
+/* Basic Colors */
+.txt-white {
+	color: rgb(255,255,255);
+}
+
+.txt-black {
+	color: rgb(0,0,0);
+}
+
+/* Grey */
+.txt-grey01 {
+	color: rgb(242,242,242);
+}
+
+.txt-grey02 {
+	color: rgb(230,230,230);
+}
+
+.txt-grey03 {
+	color: rgb(217,217,217);
+}
+
+.txt-grey04 {
+	color: rgb(204,204,204);
+}
+
+.txt-grey05 {
+	color: rgb(191,191,191);
+}
+
+.txt-grey06 {
+	color: rgb(178,178,178);
+}
+
+.txt-grey07 {
+	color: rgb(153,153,153);
+}
+
+.txt-grey08 {
+	color: rgb(127,127,127);
+}
+
+.txt-grey09 {
+	color: rgb(89,89,89);
+}
+
+.txt-grey10 {
+	color: rgb(51,51,51);
+}
+
+/* Yellow */
+.txt-yellow01 {
+	color: rgb(254,252,232);
+}
+
+.txt-yellow02 {
+	color: rgb(253,249,201);
+}
+
+.txt-yellow03 {
+	color: rgb(253,246,185);
+}
+
+.txt-yellow04 {
+	color: rgb(252,243,162);
+}
+
+.txt-yellow05 {
+	color: rgb(251,239,139);
+}
+
+.txt-yellow06 {
+	color: rgb(250,236,116);
+}
+
+.txt-yellow07 {
+	color: rgb(249,233,93);
+}
+
+.txt-yellow08 {
+	color: rgb(249,230,69);
+}
+
+.txt-yellow09 {
+	color: rgb(248,227,46);
+}
+
+.txt-yellow10 {
+	color: rgb(247,224,23);
+}
+
+/* Blue */
+.txt-blue01 {
+	color: rgb(238,237,249);
+}
+
+.txt-blue02 {
+	color: rgb(222,220,242);
+}
+
+.txt-blue03 {
+	color: rgb(205,202,236);
+}
+
+.txt-blue04 {
+	color: rgb(189,185,229);
+}
+
+.txt-blue05 {
+	color: rgb(172,167,223);
+}
+
+.txt-blue06 {
+	color: rgb(155,149,217);
+}
+
+.txt-blue07 {
+	color: rgb(139,132,210);
+}
+
+.txt-blue08 {
+	color: rgb(122,114,204);
+}
+
+.txt-blue09 {
+	color: rgb(106,97,197);
+}
+
+.txt-blue10 {
+	color: rgb(89,79,191);
+}
+
+/* Green */
+.txt-green01 {
+	color: rgb(237,246,229);
+}
+
+.txt-green02 {
+	color: rgb(220,238,204);
+}
+
+.txt-green03 {
+	color: rgb(202,229,178);
+}
+
+.txt-green04 {
+	color: rgb(185,220,153);
+}
+
+.txt-green05 {
+	color: rgb(167,211,127);
+}
+
+.txt-green06 {
+	color: rgb(149,203,102);
+}
+
+.txt-green07 {
+	color: rgb(132,194,76);
+}
+
+.txt-green08 {
+	color: rgb(114,185,51);
+}
+
+.txt-green09 {
+	color: rgb(97,177,25);
+}
+
+.txt-green10 {
+	color: rgb(79,168,0);
+}
+
+/* Red */
+.txt-red01 {
+	color: rgb(252,235,233);
+}
+
+.txt-red02 {
+	color: rgb(248,216,211);
+}
+
+.txt-red03 {
+	color: rgb(245,196,188);
+}
+
+.txt-red04 {
+	color: rgb(242,177,166);
+}
+
+.txt-red05 {
+	color: rgb(238,157,144);
+}
+
+.txt-red06 {
+	color: rgb(235,137,122);
+}
+
+.txt-red07 {
+	color: rgb(232,118,100);
+}
+
+.txt-red08 {
+	color: rgb(229,98,77);
+}
+
+.txt-red09 {
+	color: rgb(225,79,55);
+}
+
+.txt-red10 {
+	color: rgb(222,59,33);
+}
+
+/*----------------------------------*/
+/* Section 10.5 - Background colors */
+/*----------------------------------*/
+
+/* Basic Colors */
+.bg-white {
+	background-color: rgb(255,255,255);
+}
+
+.bg-black {
+	background-color: rgb(0,0,0);
+}
+
+/* Grey */
+.bg-grey01 {
+	background-color: rgb(242,242,242);
+}
+
+.bg-grey02 {
+	background-color: rgb(230,230,230);
+}
+
+.bg-grey03 {
+	background-color: rgb(217,217,217);
+}
+
+.bg-grey04 {
+	background-color: rgb(204,204,204);
+}
+
+.bg-grey05 {
+	background-color: rgb(191,191,191);
+}
+
+.bg-grey06 {
+	background-color: rgb(178,178,178);
+}
+
+.bg-grey07 {
+	background-color: rgb(153,153,153);
+}
+
+.bg-grey08 {
+	background-color: rgb(127,127,127);
+}
+
+.bg-grey09 {
+	background-color: rgb(89,89,89);
+}
+
+.bg-grey10 {
+	background-color: rgb(51,51,51);
+}
+
+/* Yellow */
+.bg-yellow01 {
+	background-color: rgb(254,252,232);
+}
+
+.bg-yellow02 {
+	background-color: rgb(253,249,201);
+}
+
+#navigation .rubriques, .bg-yellow03 {
+	background-color: rgb(253,246,185);
+}
+
+.bg-yellow04 {
+	background-color: rgb(252,243,162);
+}
+
+.bg-yellow05 {
+	background-color: rgb(251,239,139);
+}
+
+.bg-yellow06 {
+	background-color: rgb(250,236,116);
+}
+
+#navigation .rubriques .menu-titre, .bg-yellow07 {
+	background-color: rgb(249,233,93);
+}
+
+.bg-yellow08 {
+	background-color: rgb(249,230,69);
+}
+
+.bg-yellow09 {
+	background-color: rgb(248,227,46);
+}
+
+.bg-yellow10 {
+	background-color: rgb(247,224,23);
+}
+
+/* Blue */
+.bg-blue01 {
+	background-color: rgb(238,237,249);
+}
+
+#navigation .breves, .bg-blue02 {
+	background-color: rgb(222,220,242);
+}
+
+.bg-blue03 {
+	background-color: rgb(205,202,236);
+}
+
+.bg-blue04 {
+	background-color: rgb(189,185,229);
+}
+
+#navigation .breves .menu-titre, .bg-blue05 {
+	background-color: rgb(172,167,223);
+}
+
+.bg-blue06 {
+	background-color: rgb(155,149,217);
+}
+
+.bg-blue07 {
+	background-color: rgb(139,132,210);
+}
+
+.bg-blue08 {
+	background-color: rgb(122,114,204);
+}
+
+.bg-blue09 {
+	background-color: rgb(106,97,197);
+}
+
+.bg-blue10 {
+	background-color: rgb(89,79,191);
+}
+
+/* Green */
+.bg-green01 {
+	background-color: rgb(237,246,229);
+}
+
+#navigation .formulaire_inscription, .bg-green02 {
+	background-color: rgb(220,238,204);
+}
+
+.bg-green03 {
+	background-color: rgb(202,229,178);
+}
+
+.bg-green04 {
+	background-color: rgb(185,220,153);
+}
+
+#navigation .formulaire_inscription legend, .bg-green05 {
+	background-color: rgb(167,211,127);
+}
+
+.bg-green06 {
+	background-color: rgb(149,203,102);
+}
+
+.bg-green07 {
+	background-color: rgb(132,194,76);
+}
+
+.bg-green08 {
+	background-color: rgb(114,185,51);
+}
+
+.bg-green09 {
+	background-color: rgb(97,177,25);
+}
+
+.bg-green10 {
+	background-color: rgb(79,168,0);
+}
+
+/* Red */
+.bg-red01 {
+	background-color: rgb(252,235,233);
+}
+
+#navigation .divers, .bg-red02 {
+	background-color: rgb(248,216,211);
+}
+
+.bg-red03 {
+	background-color: rgb(245,196,188);
+}
+
+.bg-red04 {
+	background-color: rgb(242,177,166);
+}
+
+#navigation .divers .menu-titre, .bg-red05 {
+	background-color: rgb(238,157,144);
+}
+
+.bg-red06 {
+	background-color: rgb(235,137,122);
+}
+
+.bg-red07 {
+	background-color: rgb(232,118,100);
+}
+
+.bg-red08 {
+	background-color: rgb(229,98,77);
+}
+
+.bg-red09 {
+	background-color: rgb(225,79,55);
+}
+
+.bg-red10 {
+	background-color: rgb(222,59,33);
+}
+
+/******************************/
+/* SECTION 11 - MISCELLANEOUS */
+/******************************/
+
+/* Horizontal line */
+hr {
+	clear: both; width: 425px; height: 1px; border: none;
+}
+
+/* HTML-code examples */
+.showcode {
+  font-family: monospace; font-weight: bold; font-size: 13px; color: rgb(255,0,0);
+}
+
+/* Hide HTML-tags. Good when no pagestyle supported by browser */
+.invisible {
+	display: none;
+}
+
+br {
+	clear: both;
+}
Index: /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/impression.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/impression.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/impression.css	(revision 30)
@@ -0,0 +1,946 @@
+/*****************************************************/
+/*   Design:  GoFlexiblePro                          */
+/*            Stylesheet to make printer-friendly    */
+/*---------------------------------------------------*/
+/*   Author:  G. Wolfgang                            */
+/*   Email:   gw@actamail.com                        */
+/*   Date:    April 14, 2006                         */
+/*---------------------------------------------------*/
+/*   You can use this stylesheet freely under the    */
+/*   condition of giving proper author credits.      */
+/*---------------------------------------------------*/
+/*   Check out my favorite website: www.sda.org      */
+/*****************************************************/
+
+/*-----------------------------------------------------------------------*/
+/* REMARK: FONT-SIZE DEFINITIONS                                         */
+/*-----------------------------------------------------------------------*/
+/* Relative font-sizes in "em" are used where necessary. To make the     */
+/* "em"-units normed, the incoming font sizes are set to 1.0 em. The     */
+/* font-size variations throughout the webpage are then expressed in     */
+/* percentage values respective to the incoming font-size. To make       */
+/* calculations easier, the font definition in "body" is such that       */
+/* 1.0em = 10px. This makes life a real breeze!                          */
+/*-----------------------------------------------------------------------*/
+
+/*************************/
+/* SECTION 1 - MAIN BODY */
+/*************************/
+
+/*-------------------------------*/
+/* Section 1.1 - Page definition */
+/*-------------------------------*/
+
+body {
+	font-size: 62.5%; margin: 0 auto; padding: 0; font-family: "trebuchet ms", verdana, arial, sans-serif;
+}
+
+#page {
+	width: 680px; margin: 0 auto; padding: 0;
+}
+
+/**********************/
+/* SECTION 2 - HEADER */
+/**********************/
+
+/*--------------------------------------*/
+/* Section 2.1 - Global navigation menu */
+/*--------------------------------------*/
+
+#entete-container, #entete, #entete * {
+	display: none;
+}
+
+/*-----------------------------------*/
+/* Section 2.2 - Sitename and Banner */
+/*-----------------------------------*/
+
+.site-name  {
+	display: none;
+}
+
+.site-slogan  {
+	display: none;
+}
+
+.img-header {
+	display: none;
+}
+
+/*------------------------------------*/
+/* Section 2.3 - Main navigation menu */
+/*------------------------------------*/
+
+#hierarchie {
+	display: none;
+}
+
+#hierarchie ul {	
+	display: none;
+}	
+
+#hierarchie li {
+	display: none;
+}
+
+#hierarchie li a {
+	display: none;
+}
+
+#hierarchie a:hover, #hierarchie a.selected {
+	display: none;
+}
+
+/*************************************/
+/* SECTION 3 - FRONT-PAGE SIDEBANNER */
+/*************************************/
+
+.sidebanner-frontpage {
+	display: none;
+}
+
+.img-sidebanner {
+	display: none;
+}
+
+/******************************/
+/* SECTION 4 - SUB-NAVIGATION */
+/******************************/
+
+/*--------------------*/
+/* Section 4.1 - Size */
+/*--------------------*/
+
+.forum-fil {
+   display: none;
+}
+
+/*--------------------*/
+/* Section 4.2 - Menu */
+/*--------------------*/
+
+.forum-fil ul {	
+   display: none;
+}	
+
+.forum-fil li {
+   display: none;
+}
+
+.forum-fil li.title {
+   display: none;
+}
+
+.forum-fil li.group a {
+   display: none;
+}	
+	
+.forum-fil li a {
+   display: none;
+}
+
+.forum-fil li.group a:hover, .forum-fil li.group .selected {
+   display: none;
+}
+
+.forum-fil a:hover, .forum-fil .selected {
+   display: none;
+}
+
+.forum-fil-align {
+   display: none;
+}
+
+/*******************************************************************/
+/* SECTION 5 -  Extend left column height to footer                */
+/*******************************************************************/
+
+.container-content-sidebar {
+   float:left; width: 780px; margin: 0; padding: 0; background-color: rgb(255,255,255);
+}
+
+.buffer {
+   display: none;
+}
+
+/***********************/
+/* SECTION 6 - CONTENT */
+/***********************/
+
+/*--------------------*/
+/* Section 6.1 - Size */
+/*--------------------*/
+
+#contenu {
+	float: left; width: 629px; margin: 0; padding: 0; background-color: rgb(255,255,255);	
+}
+
+/*-------------------------*/
+/* Section 6.2 - Pagetitle */
+/*-------------------------*/
+
+#contenu-pagetitle {
+	width: 390px; margin: 0 0 10px 0; padding: 0;
+}
+
+#contenu-pagetitle p {
+	padding: 0; margin: 0; font-weight: bold; font-size: 140%;
+}
+
+/*----------------------------------*/
+/* Section 6.3 - Extra container    */
+/*----------------------------------*/
+/* To ensure that no problems arise */
+/* with right and left floatings    */
+/* and make the implementation      */
+/* robuster.                        */
+/*----------------------------------*/
+
+#contenubox-container-full {
+	 float: left; width: 629px; margin: 0 0 1.5em 0; padding: 0;
+}
+
+#contenu.contre-encart {
+	float: left; width: 295px; margin: 0 0 1.5em 0; padding: 0;
+}
+
+#contenu.encart {
+	clear: right; float: right; width: 295px; margin: 0 0 1.5em 0; padding: 0;
+}
+
+/*-----------------------------*/
+/* Section 6.4 - Content title */
+/*-----------------------------*/
+
+#contenubox-title-noshading-noline {
+	display: block; margin: 0; padding: 0; background-color: transparent; text-transform: none; font-weight: bold; font-size: 150%;
+}
+
+#contenubox-title-noshading-line {
+	display: block; margin: 0 0 0.2em 0; padding: 0; border-bottom: solid 2px rgb(135,135,135); background-color: transparent; text-transform: none; font-weight: bold; font-size: 150%;
+}
+
+#contenubox-title-shading {
+  	margin: 0; padding: 1px 0 3px 3px; background-color: rgb(225,225,225); font-weight: bold; font-size: 150%;	
+}
+
+/*--------------------------------*/
+/* Section 6.5 - Contentbox size  */
+/*--------------------------------*/
+
+/* No shading */
+#contenubox-noshading {
+	margin: 0; padding: 0.7em 0 0px 0; background-color: transparent;
+}
+
+/* Shading */
+#contenubox-shading {
+	margin: 0 0 0em 0; padding: 7px 10px 5px 10px; background-color: transparent;
+}
+
+/*-------------------------------*/
+/* Section 6.6 - Contentbox text */
+/*-------------------------------*/
+
+/* Heading */
+h1 {
+	clear: left; margin: 1.0em 0 1.0em 0; font-weight: bold; font-size: 150%;
+}
+
+h2 {
+	clear: left; margin: 1.5em 0 1.0em 0; font-weight: bold; font-size: 140%;
+}
+
+h3 {
+	clear: left; margin: 1.0em 0 0.6em 0;	font-weight: bold; font-size: 130%;
+}
+
+h4 {
+	clear: left; margin: 0.5em 0 0.5em 0;	font-weight: bold; font-style: italic; font-size: 130%;
+}
+
+/* Paragraph text */
+p {
+   clear: left; margin: 0 0 0.5em 0; padding: 0; font-size: 130%;
+}
+
+/* Quote */
+p.quote {
+   clear: left; margin: 0 30px 0.6em 30px;	line-height: 120%; font-size: 120%;
+}
+
+/* Embedded */
+.embed {
+   float: left; width: 120px; margin: 2px 7px 2px 0; padding: 5px 5px 5px 5px; background-color: rgb(225,225,225); font-style: italic; font-weight: bold;  line-height: 1.2em; font-size: 180%;
+}
+
+.embed-caption {
+   float: left; margin: 5px 0 0px 0; padding: 0; font-style: italic; font-weight: normal; line-height: 1.2em; font-size: 50%;
+}
+
+/* Unordered list */
+ul.spip {
+	margin: 0 10px 0 10px; padding: 0 0 0px 30px; list-style-type: disc; list-style-position: outside; font-size: 130%;
+}
+
+/* Ordered List */
+ol.spip {
+	margin: 0 10px 0 17px; padding: 0 0 0px 30px; list-style-type: decimal; list-style-position: outside; font-size: 130%;
+}
+
+/*--------------------------*/
+/* Section 6.7 - Datatables */
+/*--------------------------*/
+
+table {
+	clear: both; margin: 0.5em 0 0.2em 30px; border: solid 1px rgb(150,150,150); empty-cells: show; border-collapse: collapse; background-color: rgb(225,225,225);
+}
+
+table tr {
+	margin: 0; padding: 0;
+}
+
+table td {
+	padding: 2px 7px 2px 7px; border: solid 1px rgb(150,150,150); text-align: left; font-size: 120%;
+}
+
+table th {
+	margin: 0; padding: 2px 7px 2px 7px; border: solid 1px rgb(150,150,150); empty-cells: show; text-align: left; font-size: 120%; 	
+}
+
+p table caption {
+	margin: 0 0 10px 30px; padding: 0; clear: both; text-align: left; font-size: 120%;
+}
+
+/*----------------------*/
+/* Section 6.8 - Images */
+/*----------------------*/
+
+/* No border */
+.img-left-noborder {
+	float: left; margin: 0.3em 7px 3px 0;
+}
+
+.img-right-noborder {
+	float: right; margin: 0.3em 0 3px 7px;
+}
+
+/* Border */
+.spip_documents_left {
+	float: left; margin: 0.3em 7px 3px 0; border: solid 1px rgb(150,150,150);
+}
+
+.spip_documents_right {
+	float: right; margin: 0.3em 0 3px 7px; border: solid 1px rgb(150,150,150);	
+}
+
+/***********************/
+/* SECTION 7 - SIDEBAR */
+/***********************/
+
+/*-----------------------------------------------*/
+/* Section 7.1 - Size                            */
+/*-----------------------------------------------*/
+
+#navigation {
+	clear: both; float: left; width: 629px; margin: 0; padding: 0 0 0px 0; background-color: rgb(255,255,255);
+}
+
+/*-----------------------*/
+/* Section 7.2 - Textbox */
+/*-----------------------*/
+
+#navigationbox-noborder {
+	width: 629px; margin: 0 0 20px 0; padding: 0;
+}
+
+#navigationbox-border {
+	width: 629px; margin: 0 0 20px 0; padding: 4px 4px 4px 4px; border: solid 0px rgb(200,200,200);
+}
+
+/*-----------------------------*/
+/* Section 7.3 - Textbox title */
+/*-----------------------------*/
+
+#navigationbox-title-noshading-noline {
+	display: block; margin: 0 0 5px 0; padding: 1px 0 1px 0;font-weight: bold; font-size: 130%;
+}
+
+#navigationbox-title-noshading-line {
+	display: block; margin: 0 0 5px 0; padding: 1px 0 1px 0; border-bottom: solid 1px rgb(135,135,135); background-color: transparent; font-weight: bold; font-size: 130%;
+}
+
+#navigationbox-title-shading {
+	display: block; margin: 0 0 5px 0; padding: 2px 5px 2px 5px; background-color: rgb(225,225,225); font-weight: bold; font-size: 130%;
+}
+
+/*------------------------------*/
+/* Section 7.4 - Paragraph text */
+/*------------------------------*/
+
+#navigationbox-noborder p, sidebarbox-border p {
+	margin: 0 4px 4px 4px; padding: 0; background-color: transparent; font-size: 130%;
+}
+
+/**********************/
+/* SECTION 8 - FOOTER */
+/**********************/
+
+/* Somehow not possible to use percentage values to scale the font-size here. */
+/* Therefore the is the font-size definition given in the generic CSS-class   */
+/* "footer-font", even though those generic font classes should all have a    */
+/* normed size of 1.0em. But making footer an exception will not hurt us.     */
+
+#pied {
+	clear: both; width: 629px; margin: 30px 0 0px 0; padding: 5px 0 5px 0; border-top: solid 1px rgb(0,0,0); border-bottom: solid 1px rgb(0,0,0); background-color: rgb(255,255,255); text-align: center;
+}
+
+/***************************************************/
+/* SECTION 9 - HYPERLINKS FOR NON-NAVIGATION TEXTS */
+/***************************************************/
+
+#contenu a, #navigation a {
+	color: rgb(0,0,0); text-decoration: underline;
+}
+
+#contenu a:hover, #navigation a:hover {
+	display: none;
+}
+
+#contenu a:visited, #navigation a:visited {
+	color: rgb(0,0,0);
+}
+
+#pied a {
+	color: rgb(0,0,0); text-decoration: underline;
+}
+
+#pied a:hover {
+	display: none;
+}
+
+/********************************/
+/* SECTION 10 - GENERIC CLASSES */
+/********************************/
+
+/*------------------------------------------*/
+/* Section 10.1 - Global default fonts      */
+/*------------------------------------------*/
+/* Only applied to the main div-statements  */
+/* for the basic page regions.              */
+/*------------------------------------------*/
+
+#entete {
+	display: none;
+}
+
+#hierarchie {
+	display: none;
+}
+
+.forum-fil-font {
+	display: none;
+}
+
+#contenu {
+	font-size: 1.1em; line-height: 1.7em; color: rgb(0,0,0);
+}
+
+#navigation {
+	font-size: 1.1em; line-height: 1.4em; color: rgb(0,0,0);
+}
+
+#pied {
+	font-size: 1em; color: rgb(0,0,0);
+}
+
+/*--------------------------------------*/
+/* Section 10.2 - Horizontal alignments */
+/*--------------------------------------*/
+
+.align-left {
+	display: none;
+}
+
+.align-right {
+	display: none;
+}
+
+.float-left {
+	display: none;
+}
+
+.float-right {
+	display: none;
+}
+
+/*-------------------------------------*/
+/* Section 10.3 - Title decoration box */
+/*-------------------------------------*/
+
+.box-on {
+	float: left; width: 1em; margin-right: 0.2em; padding-left: 0.3em;
+}
+
+.box-off {
+	display: none;
+}
+
+/*---------------------------*/
+/* Section 10.4  Text colors */
+/*---------------------------*/
+
+/* Basic Colors */
+.txt-white {
+	color: rgb(255,255,255);
+}
+
+.txt-black {
+	color: rgb(0,0,0);
+}
+
+/* Grey */
+.txt-grey01 {
+	color: rgb(242,242,242);
+}
+
+.txt-grey02 {
+	color: rgb(230,230,230);
+}
+
+.txt-grey03 {
+	color: rgb(217,217,217);
+}
+
+.txt-grey04 {
+	color: rgb(204,204,204);
+}
+
+.txt-grey05 {
+	color: rgb(191,191,191);
+}
+
+.txt-grey06 {
+	color: rgb(178,178,178);
+}
+
+.txt-grey07 {
+	color: rgb(153,153,153);
+}
+
+.txt-grey08 {
+	color: rgb(127,127,127);
+}
+
+.txt-grey09 {
+	color: rgb(89,89,89);
+}
+
+.txt-grey10 {
+	color: rgb(51,51,51);
+}
+
+/* Yellow */
+.txt-yellow01 {
+	color: rgb(254,252,232);
+}
+
+.txt-yellow02 {
+	color: rgb(253,249,201);
+}
+
+.txt-yellow03 {
+	color: rgb(253,246,185);
+}
+
+.txt-yellow04 {
+	color: rgb(252,243,162);
+}
+
+.txt-yellow05 {
+	color: rgb(251,239,139);
+}
+
+.txt-yellow06 {
+	color: rgb(250,236,116);
+}
+
+.txt-yellow07 {
+	color: rgb(249,233,93);
+}
+
+.txt-yellow08 {
+	color: rgb(249,230,69);
+}
+
+.txt-yellow09 {
+	color: rgb(248,227,46);
+}
+
+.txt-yellow10 {
+	color: rgb(247,224,23);
+}
+
+/* Blue */
+.txt-blue01 {
+	color: rgb(238,237,249);
+}
+
+.txt-blue02 {
+	color: rgb(222,220,242);
+}
+
+.txt-blue03 {
+	color: rgb(205,202,236);
+}
+
+.txt-blue04 {
+	color: rgb(189,185,229);
+}
+
+.txt-blue05 {
+	color: rgb(172,167,223);
+}
+
+.txt-blue06 {
+	color: rgb(155,149,217);
+}
+
+.txt-blue07 {
+	color: rgb(139,132,210);
+}
+
+.txt-blue08 {
+	color: rgb(122,114,204);
+}
+
+.txt-blue09 {
+	color: rgb(106,97,197);
+}
+
+.txt-blue10 {
+	color: rgb(89,79,191);
+}
+
+/* Green */
+.txt-green01 {
+	color: rgb(237,246,229);
+}
+
+.txt-green02 {
+	color: rgb(220,238,204);
+}
+
+.txt-green03 {
+	color: rgb(202,229,178);
+}
+
+.txt-green04 {
+	color: rgb(185,220,153);
+}
+
+.txt-green05 {
+	color: rgb(167,211,127);
+}
+
+.txt-green06 {
+	color: rgb(149,203,102);
+}
+
+.txt-green07 {
+	color: rgb(132,194,76);
+}
+
+.txt-green08 {
+	color: rgb(114,185,51);
+}
+
+.txt-green09 {
+	color: rgb(97,177,25);
+}
+
+.txt-green10 {
+	color: rgb(79,168,0);
+}
+
+/* Red */
+.txt-red01 {
+	color: rgb(252,235,233);
+}
+
+.txt-red02 {
+	color: rgb(248,216,211);
+}
+
+.txt-red03 {
+	color: rgb(245,196,188);
+}
+
+.txt-red04 {
+	color: rgb(242,177,166);
+}
+
+.txt-red05 {
+	color: rgb(238,157,144);
+}
+
+.txt-red06 {
+	color: rgb(235,137,122);
+}
+
+.txt-red07 {
+	color: rgb(232,118,100);
+}
+
+.txt-red08 {
+	color: rgb(229,98,77);
+}
+
+.txt-red09 {
+	color: rgb(225,79,55);
+}
+
+.txt-red10 {
+	color: rgb(222,59,33);
+}
+
+/*----------------------------------*/
+/* Section 10.5 - Background colors */
+/*----------------------------------*/
+
+/* Basic Colors */
+.bg-white {
+	background-color: rgb(255,255,255);
+}
+
+.bg-black {
+	background-color: rgb(0,0,0);
+}
+
+/* Grey */
+.bg-grey01 {
+	background-color: rgb(242,242,242);
+}
+
+.bg-grey02 {
+	background-color: rgb(230,230,230);
+}
+
+.bg-grey03 {
+	background-color: rgb(217,217,217);
+}
+
+.bg-grey04 {
+	background-color: rgb(204,204,204);
+}
+
+.bg-grey05 {
+	background-color: rgb(191,191,191);
+}
+
+.bg-grey06 {
+	background-color: rgb(178,178,178);
+}
+
+.bg-grey07 {
+	background-color: rgb(153,153,153);
+}
+
+.bg-grey08 {
+	background-color: rgb(127,127,127);
+}
+
+.bg-grey09 {
+	background-color: rgb(89,89,89);
+}
+
+.bg-grey10 {
+	background-color: rgb(51,51,51);
+}
+
+/* Yellow */
+.bg-yellow01 {
+	background-color: rgb(254,252,232);
+}
+
+.bg-yellow02 {
+	background-color: rgb(253,249,201);
+}
+
+.bg-yellow03 {
+	background-color: rgb(253,246,185);
+}
+
+.bg-yellow04 {
+	background-color: rgb(252,243,162);
+}
+
+.bg-yellow05 {
+	background-color: rgb(251,239,139);
+}
+
+.bg-yellow06 {
+	background-color: rgb(250,236,116);
+}
+
+.bg-yellow07 {
+	background-color: rgb(249,233,93);
+}
+
+.bg-yellow08 {
+	background-color: rgb(249,230,69);
+}
+
+.bg-yellow09 {
+	background-color: rgb(248,227,46);
+}
+
+.bg-yellow10 {
+	background-color: rgb(247,224,23);
+}
+
+/* Blue */
+.bg-blue01 {
+	background-color: rgb(238,237,249);
+}
+
+.bg-blue02 {
+	background-color: rgb(222,220,242);
+}
+
+.bg-blue03 {
+	background-color: rgb(205,202,236);
+}
+
+.bg-blue04 {
+	background-color: rgb(189,185,229);
+}
+
+.bg-blue05 {
+	background-color: rgb(172,167,223);
+}
+
+.bg-blue06 {
+	background-color: rgb(155,149,217);
+}
+
+.bg-blue07 {
+	background-color: rgb(139,132,210);
+}
+
+.bg-blue08 {
+	background-color: rgb(122,114,204);
+}
+
+.bg-blue09 {
+	background-color: rgb(106,97,197);
+}
+
+.bg-blue10 {
+	background-color: rgb(89,79,191);
+}
+
+/* Green */
+.bg-green01 {
+	background-color: rgb(237,246,229);
+}
+
+.bg-green02 {
+	background-color: rgb(220,238,204);
+}
+
+.bg-green03 {
+	background-color: rgb(202,229,178);
+}
+
+.bg-green04 {
+	background-color: rgb(185,220,153);
+}
+
+.bg-green05 {
+	background-color: rgb(167,211,127);
+}
+
+.bg-green06 {
+	background-color: rgb(149,203,102);
+}
+
+.bg-green07 {
+	background-color: rgb(132,194,76);
+}
+
+.bg-green08 {
+	background-color: rgb(114,185,51);
+}
+
+.bg-green09 {
+	background-color: rgb(97,177,25);
+}
+
+.bg-green10 {
+	background-color: rgb(79,168,0);
+}
+
+/* Red */
+.bg-red01 {
+	background-color: rgb(252,235,233);
+}
+
+.bg-red02 {
+	background-color: rgb(248,216,211);
+}
+
+.bg-red03 {
+	background-color: rgb(245,196,188);
+}
+
+.bg-red04 {
+	background-color: rgb(242,177,166);
+}
+
+.bg-red05 {
+	background-color: rgb(238,157,144);
+}
+
+.bg-red06 {
+	background-color: rgb(235,137,122);
+}
+
+.bg-red07 {
+	background-color: rgb(232,118,100);
+}
+
+.bg-red08 {
+	background-color: rgb(229,98,77);
+}
+
+.bg-red09 {
+	background-color: rgb(225,79,55);
+}
+
+.bg-red10 {
+	background-color: rgb(222,59,33);
+}
+
+/******************************/
+/* SECTION 11 - MISCELLANEOUS */
+/******************************/
+
+/* Horizontal line */
+hr {
+	clear: left; width: 429px; height: 1px; border: none;
+}
+
+/* HTML-code examples */
+.showcode {
+  font-family: monospace; font-weight: bold; font-size: 13px; color: rgb(255,0,0);
+}
+
+/* Hide HTML-tags. Good when no pagestyle supported by browser */
+.invisible {
+	display: none;
+}
+
+br {
+	clear: left;
+}
Index: /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/plugin.xml	(revision 30)
@@ -0,0 +1,15 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	GoFlexiblePro
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	[Gerhard->http://www.oswd.org/user/profile/id/10227], adaptÃ© par [romy.tetue.net->http://romy.tetue.net]
+_ Mars-Septembre 2006 - Distribu&eacute; sous licence GNU/GPL.
+	</auteur>
+	<version>1.9.1</version>
+	<etat>experimental</etat>
+	<description>
+	Tentative d'adaptation Ã  la dist de la troisÃšme version du thÃšme [GoFlexiblePro de Gerhard sur OSWD->http://www.oswd.org/design/preview/id/2933], compatible avec les 3 principaux navigateurs (IE, FF, Safari)...
+	</description>
+	 <prefix>theme</prefix>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/GoFlexiblePro/theme.xml	(revision 30)
@@ -0,0 +1,20 @@
+<theme>
+	<nom> <!-- Nom du plugin -->
+	GoFlexiblePro
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	[Gerhard->http://www.oswd.org/user/profile/id/10227], adapt&eactute; par [romy.tetue.net->http://romy.tetue.net]
+_ Mars-Septembre 2006 - Distribu&eacute; sous licence GNU/GPL.
+	</auteur>
+	<version>1.9.1</version>
+	<etat>experimental</etat>
+	<description>
+	Tentative d'adaptation &agrave;  la dist de la trois&egrave;me version du th&egrave;me [GoFlexiblePro de Gerhard sur OSWD->http://www.oswd.org/design/preview/id/2933], compatible avec les 3 principaux navigateurs (IE, FF, Safari)...
+	</description>
+	<type> 
+	themes
+	</type>
+	<squelettes>
+	dist
+	</squelettes>
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/SkBlue/habillage.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/SkBlue/habillage.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/SkBlue/habillage.css	(revision 30)
@@ -0,0 +1,489 @@
+
+/*  ----------------------------------------------------------- */
+/*  Feuilles de styles des squelettes par defaut pour SPIP 1.9  */
+/*  ----------------------------------------------------------- */
+
+/* taille typo
+ * Base				100%
+ * -------------------------------------
+ * 20px				1.27em
+ * 19px				1.21em
+ * 18px				1.15em
+ * 17px				1.09em
+ * 16px				1.03em
+ * 15px				0.96em
+ * 14px				0.88em
+ * 13px				0.82em
+ * 12px				0.77em
+ * 11px				0.71em
+ * 10px				0.65em
+ *  9px				0.59em
+ * Attention : en dessous de 0.71em le texte devient illisible en text smallest sur MSIE
+ */
+
+/* skedus: remplacer #5673b3 (~bleu) par la couleur de votre choix */
+ 
+/*  ------------------------------------------
+/*  Correction des styles HTML par defaut
+/*  ------------------------------------------ */
+body {
+	color: #333;
+	/*background: #5673b3;*/
+	background: #ccc;
+	margin: 1.5em;
+	text-align: center;
+	font-size: 1em;
+}
+
+img, table { margin: 0; padding: 0; border: 0; }
+ul, ol, li { margin: 0; padding: 0; }
+ul { list-style: none; }
+h1, h2, h3, h4, h5, h6 { margin: 0; padding: 0; font-size: 1em; font-weight: normal; }
+
+/*  ------------------------------------------
+/*  Disposition a l'ecran des blocs principaux
+/*  ------------------------------------------ */
+#page {
+	width: 50em;
+	text-align: left;
+	margin-left: auto;
+	margin-right: auto;
+	background : #FFF url(images/navigation.jpg) repeat-y top right;
+	border: 1px solid #333;
+
+}
+
+#conteneur { 
+	width: 100%; 
+}
+
+#conteneur #contenu {
+	float: left;
+	width: 33em;
+	margin-left: 1em;
+}
+
+#conteneur #navigation {
+	float: right;
+	width: 12em;
+	margin-right: 1em;
+}
+
+/* Blocs du contenu (c-a-d. la colonne principale) */
+#contenu .contre-encart {
+	float: left;
+	width: 21em;
+}
+
+#contenu .encart {
+	float: right;
+	width: 11em;
+	margin: 0;
+	margin-bottom: 1em;
+}
+
+#contenu a {color: #5673b3;}
+
+/* Entete */
+#entete { 
+	/*background : #5f84bb url(images/banniere.jpg) repeat-x top left;*/
+	background : #abbcc4 url(images/banniere.jpg) no-repeat top left;
+}
+#entete #nom_site_spip, #entete a .spip_logos {
+	margin-top : 0.5em;
+	margin-left : 1em;
+	height : 120px;
+	display: block;
+	float: left;
+	font-weight: bold;
+	font-size: 1.5em;
+	color: #fff; 
+	/*background : transparent url(images/logo.png) no-repeat bottom left;*/
+}
+#entete a { text-decoration: none; }
+#entete .formulaire_recherche { 
+	margin-top : 1em;
+	margin-right : 1em;
+	float: right; 
+	background : #e7e7e7 ;
+}
+
+/* Fil d'Ariane */
+#hierarchie {
+	clear: both;
+	padding-left: 1em;
+	margin-bottom: 1em;
+	border-top: 1px solid #333;
+	border-bottom: 1px solid #333;
+	font-size: 0.77em; 
+	background : #e7e7e7 ;
+}
+
+/* Pied de page */
+#pied {
+	clear: both;
+	width: 100%;
+	margin-top: 4em;
+	border-top: 1px dotted #CCC;
+	padding-top: 2px;
+	padding-bottom: 2px;
+	text-align: center; 
+	background: #FFF;
+	}
+#pied small { font-size: 0.77em; }
+#pied img { vertical-align: bottom; }
+
+/* Espaceur de blocs */
+.nettoyeur { clear: both; margin: 0; padding: 0; border: 0; height: 0; line-height: 1px; font-size: 1px; overflow: hidden; }
+
+/* Non visible a l'ecran */
+.invisible { position: absolute; top: -3000em; height: 1%; }
+
+
+/*  ------------------------------------------
+/*  Typographie generale du site
+/*  ------------------------------------------ */
+
+/* Typo pour les menus et la navigation */
+body, #navigation, .encart,.formulaire_spip {
+	font-family: Verdana, "Bitstream Vera Sans", Tahoma, Arial, sans-serif; }
+
+/* Typo pour le contenu */
+#contenu {
+	font-family: "Trebuchet MS", Helvetica, sans-serif; }
+
+/* Typo pour les citations et extraits introductifs */
+q, blockquote, .liste-articles li .texte, h3.spip {
+	font-family: "Bitstream Vera Serif", Georgia, Times, serif; }
+
+
+/*  ------------------------------------------
+/*  Habillage des menus et de la navigation
+/*  ------------------------------------------ */
+
+/*  Habillage general des menus de navigation
+---------------------------------------------- */
+.rubriques, .breves, .syndic, .forums, .divers {
+	min-width: 10em;
+	/*border: 1px solid #CCC;*/
+	margin-bottom: 1em;
+	font-size: 0.77em;
+}
+
+.menu-titre a { color:#5673b3; }
+.menu-titre {
+	padding: 0.2em 0.4em;
+	/*border-bottom: 1px dotted #CCC;*/
+	text-align: left;
+	font-weight: bold;
+}
+
+.rubriques p, .breves p, .syndic p, .forums p, .divers p { margin: 0; padding: 0.2em 0.7em;  }
+.rubriques ul, .breves ul, .syndic ul, .forums ul, .divers ul { padding: 0.2em 0; }
+.rubriques li, .breves li, .syndic li, .forums li, .divers li { padding: 0 0.7em; }
+
+/*  Des couleurs specifiques selon les types de menus
+---------------------------------------------- */
+.rubriques { }
+.rubriques .menu-titre { color: #5673b3; }
+
+.breves {  }
+.breves .menu-titre { color: #5673b3; }
+
+.syndic {  }
+.syndic .menu-titre { color: #5673b3; }
+
+.forums {  }
+.forums .menu-titre { color: #5673b3; }
+
+.divers {  }
+.divers .menu-titre { color: #5673b3; }
+
+/*  ------------------------------------------
+/*  Habillage du contenu
+/*  ------------------------------------------ */
+
+/*  Cartouche et titraille
+---------------------------------------------- */
+.cartouche { margin-bottom: 2em; }
+
+.cartouche .titre {
+	font-size: 1.27em;
+	font-weight: bold;
+	color: #5673b3; }
+#contenu .surtitre, #contenu .soustitre { font-size: 0.82em; }
+
+.cartouche .spip_logos {
+	float: right;
+	margin-left: 16px;
+	margin-bottom: 16px; }
+
+.cartouche p { margin: 0; padding: 0; clear: left; }
+.cartouche small { font-size: 0.71em; }
+
+.cartouche .traductions { font-size: 0.71em; }
+.cartouche .traductions * { display: inline; }
+.cartouche .traductions li { padding-left: 1em; }
+
+
+/*  Mise en forme des textes du contenu
+---------------------------------------------- */
+.chapo {
+	margin-bottom: 1.5em;
+	font-weight: bold;
+	line-height: 1.4em; }
+
+.lien {
+	background: #EEE;
+	margin: 1em;
+	margin-bottom: 1.5em;
+	padding: 0.82em;
+	border: 1px solid #CCC;
+	font-size: 0.82em;
+	font-weight: bold; }
+
+.texte { color: #000; font-size: 0.96em; }
+
+.ps, .notes {
+	margin-top: 1.4em;
+	padding-top: 2px;
+	border-top: 2px solid #CCC; }
+.ps { font-size: 0.82em; }
+.notes { clear: both; font-size: 0.77em; }
+.ps h2, .notes h2 { font-size: 1.19em; font-weight: bold; }
+
+/*  Portfolio
+---------------------------------------------- */
+#documents_portfolio {
+	clear: both;
+	margin-top: 1.4em;
+	padding-top: 2px;
+	border-top: 2px solid #CCC; }
+#documents_portfolio img {
+	width:60px;
+}
+#documents_portfolio h2 { margin-bottom: 0.4em; font-size: 0.88em; font-weight: bold; color: #5673b3;}
+
+#document_actif { 
+	margin-top: 1em; 
+}
+#document_actif img { 
+	height:auto;
+	width:100%;
+}
+
+/*  Listes de documents joints (a un article ou une rubrique)
+---------------------------------------------- */
+#documents_joints {
+	margin-top: 1.4em;
+	padding-top: 2px;
+	border-top: 2px solid #CCC; }
+#documents_joints h2 { margin-bottom: 0.4em; font-size: 0.88em; font-weight: bold; color: #5673b3;}
+#documents_joints li { margin-bottom: 0.4em; }
+#documents_joints li .spip_doc_titre {}
+#documents_joints li .spip_doc_titre small { font-weight: normal; }
+#documents_joints li .spip_doc_descriptif {}
+
+/* Listes d'articles et extraits introductifs
+----------------------------------------------- */
+.liste-articles li { 
+	margin-bottom: 1em; 
+	padding: 0.5em  0.5em 0.5em 0.5em; 
+	border: 1px solid #CCC;
+}
+
+.liste-articles li .titre {
+	font-size: 1.03em;
+	font-weight: bold; }
+
+.liste-articles li .spip_logos {
+	float: right;
+	margin-left: 16px;
+	margin-bottom: 16px;
+	clear: right; }
+
+.liste-articles li p { margin: 0; padding: 0; }
+
+.liste-articles li .enclosures {
+	float: right;
+	text-align: right;
+	max-width: 60%;
+	margin: 0; }
+
+.liste-articles li small {
+	display: block;
+	font-size: 0.71em; }
+
+.liste-articles li .texte {
+	margin-top: 5px;
+	margin-bottom: 2em;
+	/*border: 1px solid #CCC;*/
+	padding: 0.9em;
+	font-size: 0.82em;
+	line-height: 1.4em; }
+	
+.liste-articles h3 a { color: #5673b3;}
+
+.pagination { font-size: 0.90em; }
+
+/*  ------------------------------------------
+/*  Habillage specifique du plan du site
+/*  ------------------------------------------ */
+.page_plan #contenu h2 a { color: #5673b3;}
+
+.page_plan #contenu h2 {
+	clear: both;
+	background: #EEE;
+	border: 1px solid #CCC;
+	padding: 0.5em;
+	margin-bottom: 1em;
+	font-weight: bold;
+	text-align: center; }
+
+.page_plan #contenu .contre-encart ul {
+	display: block;
+	clear: left;
+	margin-left: 1em;
+	margin-bottom: 1em;
+	list-style: square; }
+.page_plan #contenu .contre-encart li { list-style: inherit; }
+
+/*  ------------------------------------------
+/*  Habillage des formulaires
+/*  ------------------------------------------ */
+
+/* Correction des styles HTML par defaut */
+.formulaire_spip form, .formulaire_spip fieldset, .formulaire_spip legend, .formulaire_spip label, .formulaire_spip input, .formulaire_spip textarea, .formulaire_spip select, .formulaire_spip option { margin: 0; padding: 0; border: 0; background: none; }
+
+/* Styles des formulaires de Spip */
+.formulaire_spip {
+	text-align: left;
+	font-size: 0.77em;
+}
+
+.formulaire_spip p {
+	margin: 0.5em 0;
+	padding: 0; }
+
+.formulaire_spip fieldset {
+    display: block;
+	margin: 0.77em 0;
+	padding: 0.77em;
+	border: 1px dotted; }
+.formulaire_spip legend { 
+	font-weight: bold; 
+	padding: 3px;
+	background: #FFF; /* Sinon, superposition dans MSIE */
+}
+
+.formulaire_spip label {}
+.formulaire_spip .forml {
+	width: 99%;
+	padding: 1px;
+	border: 1px solid;
+	font-family: inherit;
+	font-size: inherit; }
+
+.spip_bouton { text-align: right; }
+.spip_bouton input {
+	margin: 3px 0;
+	padding: 1px 2px;
+	border: 2px outset;
+	font-weight: bold;
+	float: right; }
+
+/* Reponse du formulaire */
+.reponse_formulaire { font-weight: bold; color: #F00; }
+fieldset.reponse_formulaire { border: 1px dotted; font-weight: normal; }
+
+/* Previsualisation du message */
+fieldset.previsu {
+	padding: 1em;
+	border: 1px solid; }
+
+/* Formulaire de login au forum */
+.formulaire_login_forum .forml { width: 12em; }
+.formulaire_login_forum .spip_logos { float: right; padding-left: 10px; }
+
+/* Choix des mots-clefs */
+.choix_mots { width: 47%; float: left; } 
+.choix_mots label { display: inline; }
+
+/* Formulaire de recherche */
+.formulaire_recherche { text-align: left; width: 12em; }
+.formulaire_recherche label { display: none; }
+
+/*  ------------------------------------------
+/*  Habillage des forums
+/*  ------------------------------------------ */
+
+.forum-repondre, .forum-decompte {
+	clear: both;
+	margin-top: 2.5em;
+	padding-top: 2px;
+	border-top: 2px solid #CCC;
+	font-size: 0.88em;
+	font-weight: bold; }
+
+/* * Habillage des forums */
+ul.forum { display: block; clear: both; margin: 0; padding: 0; }
+.forum-fil { margin-top: 1.5em; }
+.forum-fil ul { display: block; margin: 0; padding: 0; margin-left: 1em; }
+.forum-chapo .forum-titre, .forum-chapo .forum-titre a { display: block; margin: 0; padding: 0; font-weight: bold; text-decoration: none; color: #333; }
+.forum-chapo small {}
+.forum-texte { margin: 0; padding: 0.5em 1em 0 1em; color: #333; font-size: 0.82em; }
+.forum-texte .forum-lien {}
+.forum-texte .forum-repondre-message { margin: 0; padding: 1px 0; text-align: right; }
+
+/* Boite d'un forum : eclaircissement progressif des bords */
+ul .forum-message { border: 1px solid #666; margin: 0; padding: 0; margin-bottom: 1em; }
+ul ul .forum-message { border: 1px solid #A4A4A4; }
+ul ul ul .forum-message { border: 1px solid #B8B8B8; }
+ul ul ul ul .forum-message { border: 1px solid #CCC; }
+ul ul ul ul ul .forum-message { border: 1px solid #E0E0E0; }
+ul ul ul ul ul ul .forum-message { border: 1px dotted #E0E0E0; }
+
+/* Boite de titre d'un forum : mise en couleur selon la profondeur du forum */
+ul .forum-chapo { border: 0; border-bottom: 1px dotted #B8B8B8; margin: 0; padding: 3px 6px 2px 6px; font-size: 0.88em; background: #C4E0E0; }
+ul ul .forum-chapo { background: #D4E8E8; }
+ul ul ul .forum-chapo { background: #E4F0F0; }
+ul ul ul ul .forum-chapo { background: #F4F8F8; border-bottom: 1px dotted #E0E0E0; }
+ul ul ul ul ul .forum-chapo { background: #FFF; }
+
+/*  ------------------------------------------
+/*  Habillage des petitions
+/*  ------------------------------------------ */
+
+#signatures { clear: both; font-size: 0.77em; }
+
+#signatures h2 {
+	padding: 0.5em;
+	text-align: center;
+	font-size: 1.2em;
+	font-weight: bold; }
+
+#signatures table { width: 100%; margin: 1em 0; }
+#signatures thead { display: none; } /* On n'affiche pas les titres du tableau */
+
+#signatures td.signature-date {
+	background: #E4F0F0;
+	padding: 0.5em;
+	white-space: nowrap; }
+
+#signatures td.signature-nom {
+	background: #ECF4F4;
+	padding: 0.2em;
+	text-align: center;
+	font-weight: bold; }
+
+#signatures td.signature-message {
+	background: #F4F8F8;
+	padding: 0.4em;
+	font-size: 0.96em; }
+
+/*  ------------------------------------------
+/*  Couleurs des liens
+/*  ------------------------------------------ */
+a { text-decoration: none; color: #333; }
+a:hover { text-decoration: underline; }
+
Index: /trunk/spip/esqueleto-redcta/themes/SkBlue/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/SkBlue/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/SkBlue/plugin.xml	(revision 30)
@@ -0,0 +1,28 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	SkBlue
+	</nom>
+	<auteur>	<!-- Auteur du plugin -->
+	[Skedus->http://skedus.free.fr]
+_ <multi>    
+    July 2006 - Distributed under GNU/GPL Licence.
+[fr]Juillet 2006 - Distribu&eacute; sous licence GNU/GPL.
+</multi>
+	</auteur>
+	<version>
+	0.7
+	</version>
+	<etat>
+	stable
+	</etat>
+	<description>
+<multi>
+Activate this plugin to modify the look and feel of the official distribution
+
+[fr]
+Activez le plugin pour changer l'habillage de votre squelettes SPIP
+</multi>
+	</description>
+	 <prefix>theme</prefix>
+
+</plugin>
Index: /trunk/spip/esqueleto-redcta/themes/SkBlue/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/SkBlue/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/SkBlue/theme.xml	(revision 30)
@@ -0,0 +1,22 @@
+<theme>
+<nom>SkBlue</nom>
+<auteur>
+[Skedus->http://skedus.free.fr]
+_ <multi>    
+    July 2006 - Distributed under GNU/GPL Licence.
+[fr]Juillet 2006 - Distribu&eacute; sous licence GNU/GPL.
+</multi>
+</auteur>
+<version>0.7</version>
+<etat>stable</etat>
+<type>themes</type>
+<squelettes>dist</squelettes>
+<description>
+<multi>
+Activate this habillage to modify the look and feel of the official distribution, or of your 'squelettes'.
+
+[fr]
+Activez cet habillage pour changer les couleurs de vos squelettes SPIP
+</multi>
+</description>
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/article.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/article.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/article.html	(revision 30)
@@ -0,0 +1,164 @@
+#CACHE{86400}
+<BOUCLE_article_principal(ARTICLES) {id_article}><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+	<INCLURE{fond=inc/inc-head}{lang}>
+   
+	#INSERT_HEAD 
+	#SPIP_HEAD
+</head>
+
+<body>
+<div id="pagina">
+	<div id="cabeza"><INCLURE{fond=inc/inc-cabeza}{lang}></div>
+	<div id="barracabeza"><div id="estructura">barracabeza</div>#DESCRIPTIF_SITE_SPIP</div>
+	
+<B_squelette_rubrique>
+<BOUCLE_squelette_rubrique(MOTS){id_rubrique}{type=Esqueletos}{0,1}>
+	<div id="cuerpo-[(#TITRE|texte_script)]">
+
+</BOUCLE_squelette_rubrique>
+</B_squelette_rubrique>
+	<div id="cuerpo">
+<//B_squelette_rubrique>
+
+	<div id="cuerpo">
+	  <div id="estructura"></div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		
+		
+  		<INCLURE{fond=inc/inc-menu-principal}{id_rubrique}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+							
+
+			</div><!-- avisoprincipal -->
+			
+				
+				<BOUCLE_squelette_rubrique1(MOTS){id_rubrique}{type=Esqueletos}{0,1}>
+					<INCLURE{fond=inc/inc-muestra-actividades}{id_rubrique}>
+				</BOUCLE_squelette_rubrique1>
+				
+				<div class="cartouche">
+				<div class="iconitos" >
+					#ENVIAR_EMAIL** 
+					#IMPRIMIR_DOCUMENTO**
+					<a HREF="#" onClick="window.open('spip.php?page=article_pdf&id_article=#ID_ARTICLE','_blank','toolbar=0, location=0, directories=0, status=0, scrollbars=0, resizable=0, copyhistory=0, menuBar=0, width=400, height=620');return(false)">
+						<img src="#DOSSIER_SQUELETTE/img/crear_pdf.gif" / style="border:0px ">
+					</a>
+				</div>
+				<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+				
+				<BOUCLE_comunicadodeprensa(MOTS){id_rubrique}{titre=comunicado de prensa}{0,1}>
+					[(#LOGO_MOT|center)]
+				</BOUCLE_comunicadodeprensa>
+				#DEBUT_SURLIGNE
+				[(#LOGO_ARTICLE||image_reduire{200,200})]
+				[<p class="surtitre">(#SURTITRE)</p>]
+				<h1 class="titre">[(#TITRE|supprimer_numero)]</h1>
+				[<p class="soustitre">(#SOUSTITRE)</p>]
+				#FIN_SURLIGNE
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+
+				<p><small>[(#DATE|nom_jour) ][(#DATE|affdate)][, <:par_auteur:> (#LESAUTEURS)]</small></p>
+				</BOUCLE_sivafecha>
+				[(#REM) Inclure le modele des liens de traductions ]
+				#MODELE{article_traductions}
+
+			</div>
+			
+			#DEBUT_SURLIGNE
+			[<div class="chapo">(#CHAPO)</div>]
+			<br class="nettoyeur" />
+			[<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+			[<div class="texte">(#TEXTE|image_reduire{520,0})</div>]
+			#FIN_SURLIGNE
+
+			[(#REM) Portfolio : album d'images ]
+			<B_afficher_document>
+			
+			<BOUCLE_afficher_document(DOCUMENTS) {id_document} {id_article} {mode=document}{extension IN png,jpg,gif}>
+			<center><hr /><div class="spip_documents spip_documents_center" id="document_actif">
+				#EMBED_DOCUMENT
+				[<div class="spip_doc_titre">(#TITRE)</div>]
+				[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+			</div></center>
+			</BOUCLE_afficher_document>
+			</B_afficher_document>
+			<B_documents_portfolio>
+			<div id="documents_portfolio">
+				<h3>Galeria de Imagenes<small><small><i> - Click en las miniaturas para agrandarlas</i> </small></small></h3>
+				<BOUCLE_documents_portfolio(DOCUMENTS) {id_article} {mode=document} {extension IN png,jpg,gif} {par num titre, date} {doublons}>
+				[<a href="#URL_DOCUMENT" type="#MIME_TYPE" onclick="location.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return false;"[ title="(#TITRE|couper{80}|texte_backend)"]>(#LOGO_DOCUMENT||image_reduire{0,60}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+				</BOUCLE_documents_portfolio>
+			</div>
+			</B_documents_portfolio>
+			
+			[<div class="ps"><h2><:info_ps:></h2>#DEBUT_SURLIGNE(#PS)#FIN_SURLIGNE</div>]
+
+			[(#REM) Autres documents joints a l'article ]
+			<B_documents_joints>
+			<div id="documents_joints">
+				<h3>Documentos Asociados</h3>
+				
+					<BOUCLE_documents_joints(DOCUMENTS) {id_article} {mode=document} {par num titre, date} {doublons}>
+					
+						<div class="spip_doc_titre"><a href="#URL_DOCUMENT" title="<:bouton_telecharger:>" type="#MIME_TYPE">[(#LOGO_DOCUMENT)<br />][(#TITRE|sinon{<:info_document:>})]</a> <small>(#TYPE_DOCUMENT[ - (#TAILLE|taille_en_octets)])</small></div>
+						[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+					
+					</BOUCLE_documents_joints>
+				
+			</div>
+			</B_documents_joints>
+				
+				
+				
+				
+
+	
+	<?php  if ($nombreRubrique + $nombreArticle == 0) { ?>
+	<style>#boite-srubrique-rubrique {display: none;}</style>
+	<?php } ?>
+			
+			<div id="bloquemedio">
+				<BOUCLE_seccion(RUBRIQUES){id_rubrique}>
+				<B_art_mot2>
+						<div style="border-bottom:1px solid #0066CC; "></div>
+					<div class="regional">
+						<img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> 
+						[(#TITRE|supprimer_numero)] 
+						[ <span class="detalleregional"> -(#DESCRIPTIF)-</span>] 
+					</div>
+					<BOUCLE_art_mot2(ARTICLES){titre_mot=#TITRE} {par date}{inverse}>
+   						<div class="tituloarticulo" style="font-size:85% "><a href="#URL_BREVE"><strong>[(#TITRE|supprimer_numero)]</strong></a>[ - (#DATE|nom_jour) ][(#DATE|affdate)]<br /></div>
+					</BOUCLE_art_mot2>
+				</B_art_mot2>
+				</BOUCLE_seccion>
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div>
+			
+			</div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			  			 	<INCLURE{fond=inc/inc-avisos}{lang}>
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}> 
+	
+</div><!-- pagina -->
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]	
+</body>
+</html>
+</BOUCLE_article_principal>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-avisosuperior.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-avisosuperior.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-avisosuperior.html	(revision 30)
@@ -0,0 +1,22 @@
+			<B_avisos>
+				<div id="estructura"><:Aviso Derecha:></div>
+			<BOUCLE_avisos(ARTICLES) {lang?}{titre_mot=aviso superior} {par num titre}>
+				<B_muestraspots>
+				<BOUCLE_muestraspots(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        			<div class="avisosderecha">	
+					#EMBED_DOCUMENT                                                     <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    				</div><!-- avisosderecha -->
+				</BOUCLE_muestraspots>
+				</B_muestraspots>
+					
+					<div class="avisosderecha">	
+						
+						
+						<!--[(#LOGO_ARTICLE|#URL_SITE|sinon{<a href="#URL_SITE" title="#NOM_SITE">[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{120,0}) ]-->
+						
+						[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{110,0}) ]
+						
+					</div><!-- avisosderecha -->
+				<//B_muestraspots>     
+    		</BOUCLE_avisos> 
+    		</B_avisos>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-menu-principal.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-menu-principal.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-menu-principal.html	(revision 30)
@@ -0,0 +1,69 @@
+[(#REM)
+	Barre de navigation, ouverte sur la hierarchie courante
+
+	On fait un plan, et, quand on avance vers une rubrique,
+	on l'affiche si son parent est expose ou est la racine du site. ]
+
+
+
+<B_rubriques>
+<div class="menu" id="menusecciones">
+  <div class="menuseccionesarriba"></div>	
+
+	<ul class="titulo">
+    	<!--<li class="titulo">
+			<div class='menuseccionesitem'>
+				<a href="#URL_SITE_SPIP">Principal</a>
+			</div>
+         </li>-->
+	<BOUCLE_rubriques(RUBRIQUES) {racine}{titre_mot=menu principal} {par num titre, titre}>
+		<ld class="titulo">
+			<div class='menuseccionesitem#EXPOSE'>
+			<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+			</div>
+			<B_articulosmenu>
+			<ul>
+			<BOUCLE_articulosmenu(ARTICLES) {id_rubrique} {titre_mot=menu principal} {par num titre}{doublons}>
+				<ld>
+					</ld>
+						<div class="menuseccionesitem-sub#EXPOSE">
+							<a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+						</div>
+					</ld>	
+				</BOUCLE_articulosmenu>	
+				</ul>
+				</B_articulosmenu>
+			<B_sous_rubriques>
+			<ul>
+				
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<ld>
+						<div class='menuseccionesitem-sub#EXPOSE'>
+						<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+						</div>
+						<BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
+					</ld>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			</ul>
+			</B_sous_rubriques>
+
+		</ld>
+	</BOUCLE_rubriques>
+			<B_articulosmenusueltos>
+			<ul>
+			<BOUCLE_articulosmenusueltos(ARTICLES) {titre_mot=menu principal} {par num titre}{doublons}>
+				<ld>
+					</ld>
+						<div class="menuseccionesitem">
+							<a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+						</div>
+					</ld>	
+				</BOUCLE_articulosmenusueltos>	
+				</ul>
+				</B_articulosmenusueltos>
+
+	</ul>
+
+<div class="menuseccionesabajo"></div>	
+	</div><!-- menusecciones -->
+</B_rubriques>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-menu-secundario.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-menu-secundario.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-menu-secundario.html	(revision 30)
@@ -0,0 +1,50 @@
+[(#REM)
+	Barre de navigation, ouverte sur la hierarchie courante
+
+	On fait un plan, et, quand on avance vers une rubrique,
+	on l'affiche si son parent est expose ou est la racine du site. ]
+
+
+
+<B_rubriques>
+
+
+	<table align="center">
+    	
+	<BOUCLE_rubriques(RUBRIQUES) {racine}{titre_mot=menu secundario} {par num titre, titre}>
+		<tr align="center"><TD align="center">
+			<div>
+			<!--<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>-->
+			[(#LOGO_RUBRIQUE|center|#URL_RUBRIQUE|reduire_image{110,0})]
+			</div>
+			<B_sous_rubriques>
+			<ul>
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<li>
+						<div>
+						<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+						</div>
+						<BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
+					</li>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			</ul>
+			</B_sous_rubriques>
+
+		</TD></tr>
+	</BOUCLE_rubriques>
+	
+	</table>
+</B_rubriques>
+<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+<!--[(#REM) mini calendrier : 
+1er arg la date, 
+2eme le nom de la variable date (optionel : 'date' par defaut)
+3eme l'url sur laquelle boucler (optionel : url courante par defaut) ]
+#CALENDRIER_MINI{#ENV{date},'date',#SELF}-->
+
+
+
+
Index: /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-nota-principal.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-nota-principal.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-nota-principal.html	(revision 30)
@@ -0,0 +1,18 @@
+<BOUCLE_principal(ARTICLES) {titre_mot=nota principal} {par date} {inverse}{0,1}{doublons}>
+	<div id="nota_principal">
+		
+			<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+
+[(#LOGO_DOCUMENT|center||image_reduire{310,0}|inserer_attribut{hspace,0}|inserer_attribut{vspace,0}|inserer_attribut{style,border:0px solid #000000})]
+                           		
+			</BOUCLE_foto>
+		<div class="volantadest1">	
+			#SURTITRE
+		</div>
+		<a href="#URL_ARTICLE"><div class="titulo1">#TITRE</div><span class="espcioblancochico"></span></a>
+		<div class="texto">
+				<span class="FECHA-COMUNIC">[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)]- #NOM_SITE_SPIP - </SPAN> #CHAPO<br><br>
+				<a href="#URL_ARTICLE"> <span class="notacompleta-col">Nota completa</span></a>
+		</div>
+	</div>
+</BOUCLE_principal>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-nota-secundaria.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-nota-secundaria.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-nota-secundaria.html	(revision 30)
@@ -0,0 +1,19 @@
+<BOUCLE_secundaria(ARTICLES) {titre_mot=nota secundaria} {par date} {inverse}{0,2}{doublons}>
+	<div id="nota_secundaria">
+		
+			
+		<div class="volantadest1">	
+			#SURTITRE
+		</div>
+		<a href="#URL_ARTICLE"><div class="titulo-0">#TITRE</div><span class="espcioblancochico"></span></a>
+		<div class="texto1">
+		<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+
+[(#LOGO_DOCUMENT|right||image_reduire{140,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,0}|inserer_attribut{style,border:0px solid #000000})]
+                           		
+			</BOUCLE_foto>
+				<span class="FECHA-COMUNIC">[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)]-AJB - </SPAN> #CHAPO<br><br>
+				<a href="#URL_ARTICLE"> <span class="notacompleta-col">Nota completa</span></a>
+		</div>
+	</div>
+</BOUCLE_secundaria>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-notas-destacadas.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-notas-destacadas.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-notas-destacadas.html	(revision 30)
@@ -0,0 +1,24 @@
+<B_articles_por_secciones>
+	<BOUCLE_articles_por_secciones(ARTICLES) {lang?}{titre_mot=nota destacada}{lang} {par id_rubrique}{unique}>
+      	<!--<BOUCLE_nom_rub2 (RUBRIQUES){id_rubrique}>
+			[<div id="rubriquedestacada">[(#LOGO_RUBRIQUE|left|#URL_RUBRIQUE|reduire_image{70}|inserer_attribut{hspace,5}||inserer_attribut{style,border:0px;margin-left:-3px})]<a href="#URL_RUBRIQUE">(#TITRE|supprimer_numero|unique{dest})</a></div>]
+		</BOUCLE_nom_rub2>-->
+		<div id="notadestacada">
+			<div class="spacedestacada"></div>
+			<div class="volantadest1">	
+			#SURTITRE
+		</div>
+		<a href="#URL_ARTICLE"><div class="titulo-0">#TITRE</div><span class="espcioblancochico"></span></a>
+		<div class="texto1">
+		<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+
+[(#LOGO_DOCUMENT|right||image_reduire{110,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,0}|inserer_attribut{style,border:0px solid #000000})]
+                           		
+			</BOUCLE_foto>
+				<span class="FECHA-COMUNIC">[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)]-AJB - </SPAN> #CHAPO<br><br>
+				<a href="#URL_ARTICLE"> <span class="notacompleta-col">Nota completa</span></a>
+		</div>
+		</div>
+						
+	</BOUCLE_articles_por_secciones>
+</B_articles_por_secciones><!-- Fin Por las secciones -->
Index: /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-titulares.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-titulares.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/inc/inc-titulares.html	(revision 30)
@@ -0,0 +1,25 @@
+<BOUCLE_principal(ARTICLES) {titre_mot=nota principal} {par date} {inverse}{0,1}{doublons principal}>
+</BOUCLE_principal>
+<BOUCLE_secundaria(ARTICLES) {titre_mot=nota secundaria} {par date} {inverse}{0,2}{doublons secundaria}>
+</BOUCLE_secundaria>
+<BOUCLE_articles_por_secciones(ARTICLES) {lang?}{titre_mot=nota destacada}{lang} {par id_rubrique}{doublons destacadas}>
+</BOUCLE_articles_por_secciones>
+
+<BOUCLE_ultimas(ARTICLES) {titre_mot=titulares}{par date} {inverse}{0,6}{doublons princpipal}{doublons secundaria}{doublons destacadas}>
+			<div id="bloquenoti">
+				
+				
+				<p align="left">
+					<span class="volantadest1">
+						[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)] 
+                  	</span>
+					<span class="titulo02">
+						<a href="#URL_ARTICLE">#TITRE</a>
+					</span>
+
+				  </p> 
+				  
+				
+				
+			</div>
+		</BOUCLE_ultimas>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/rubrique.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/rubrique.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/rubrique.html	(revision 30)
@@ -0,0 +1,224 @@
+<BOUCLE_rubrica(RUBRIQUES) {id_rubrique}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+   	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<div id="cabeza"><INCLURE{fond=inc/inc-cabeza}{lang}>	</div>
+	<div id="barracabeza"><div id="estructura">barracabeza</div>#DESCRIPTIF_SITE_SPIP</div>
+	
+<B_squelette_rubrique>
+<BOUCLE_squelette_rubrique(MOTS){id_rubrique}{type=Esqueletos}{0,1}>
+	<div id="cuerpo-[(#TITRE|texte_script)]">
+
+</BOUCLE_squelette_rubrique>
+</B_squelette_rubrique>
+	<div id="cuerpo-[(#TITRE|texte_script)]">
+<//B_squelette_rubrique>
+
+	<div id="cuerpo">
+	  <div id="estructura"></div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		
+		
+  		<INCLURE{fond=inc/inc-menu-principal}{id_rubrique}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+			</div><!-- avisoprincipal -->
+			
+				<BOUCLE_squelette_rubrique1(MOTS){id_rubrique}{type=Esqueletos}{0,1}>
+					<INCLURE{fond=inc/inc-muestra-actividades}{id_rubrique}{lang}>
+				</BOUCLE_squelette_rubrique1>
+				<table border="0" cellspacing="0" cellpadding="0">
+  <tr>
+    <td id="texte-article">
+		[<h2>(#LOGO_RUBRIQUE|left||sinon{#TITRE|supprimer_numero})</h2>]
+
+		[#DESCRIPTIF
+	    <div class="texte">(#TEXTE)</div>]
+	    </td>
+    </tr>
+  [<tr>
+    <td>
+	    <div class="notes">(#NOTES)</div>
+	    </td>
+  </tr>]
+	<B_docs>
+	<tr>
+    <td>
+	<!-- Documents liés -->
+	<div id="documents_boite">
+
+	<h3><:documents_boite_titre:></h3>
+	<BOUCLE_docs(DOCUMENTS){id_article}{mode=document}{doublons}> 
+	<dl class="document">
+		[<dt>(#LOGO_DOCUMENT|#URL_DOCUMENT)</dt>]
+		<dd><a href="#URL_DOCUMENT">
+		[<strong>(#TITRE)</strong><br />]
+		[(#DESCRIPTIF)<br />]
+		[[(#TAILLE|taille_en_octets)][<br />
+		(#LARGEUR) X] [(#HAUTEUR) pixels]]
+		</a></dd>
+	</dl>
+	</BOUCLE_docs>
+	</div>
+
+</td>
+    </tr>
+	</B_docs>
+
+</table>
+<BOUCLE_article_langue_TOP(ARTICLES) {id_rubrique}{titre_mot=destacada seccion} {par date} {inverse} {0,3}{doublons portada}>
+      					<div class="fotoportada">
+							[<div id="rubriqueportada">(#SURTITRE)</div>]
+							[(#LOGO_ARTICLE|left||reduire_image{192,0}|inserer_attribut{hspace,5})]
+										<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+				<img src="#URL_DOCUMENT"  width="20%" hspace="4" vspace="4" alt="#TITRE" border="1" align="right" >
+			</BOUCLE_foto> 
+							
+								<h3>[(#TITRE|supprimer_numero)]</h3>
+      							[<div class="sous-titre">(#SOUSTITRE)</div>]
+	  							[<div class="texte">(#CHAPO)</div>] 
+								#TEXTE
+								
+						</div>
+					</BOUCLE_article_langue_TOP>
+					<br />
+    				</B_article_langue_TOP>
+	<div id="boite-srubrique-rubrique">
+    
+
+ 	<B_articles_rubriques>
+	
+    <!-- Les articles -->
+	
+			<BOUCLE_articles_rubriques(ARTICLES){id_rubrique}{par date}{inverse}{doublons portada}>
+   			<?php	$nombreArticle = "#TOTAL_BOUCLE"; ?>
+        	<table><tr><td>
+			[(#LOGO_ARTICLE|right||reduire_image{80,0}|inserer_attribut{hspace,5})]<a href="#URL_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong><br />
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+					<small>[(#DATE|nom_jour) ][(#DATE|affdate)]</small>
+				</BOUCLE_sivafecha>
+				<BOUCLE_sivaautor(MOTS){id_article}{titre=con autor}>
+					<small>[, <:par_auteur:> (#LESAUTEURS)]</small>
+				</BOUCLE_sivaautor>
+				[<br />(#CHAPO)]</a>
+			</td></tr></table>
+			</BOUCLE_articles_rubriques><br />
+      
+    <!-- Fin des articles -->
+ 	</B_articles_rubriques>
+	    <!-- Les sous-rubriques -->
+		
+    <!--<h3><:sousrubrique_recitfp:></h3>-->
+    <B_srubriques>
+	<div style="border-bottom:1px solid #0033CC; "></div>
+	Contenidos
+		<ul>
+			<BOUCLE_srubriques(RUBRIQUES){id_parent}{par num titre}>
+            <?php $nombreRubrique = "#TOTAL_BOUCLE"; ?>
+        	<li class="[(#COMPTEUR_BOUCLE|alterner{'pairs','impairs'})]"><a href="#URL_RUBRIQUE"><strong>[(#TITRE|supprimer_numero)]</strong><br />
+			[(#INTRODUCTION|couper{175})]</a></li>
+			</BOUCLE_srubriques><br />
+		</ul>
+    <!-- Fin des sous-rubriques -->
+	</B_srubriques>
+	</div>
+	<?php  if ($nombreRubrique + $nombreArticle == 0) { ?>
+	<style>#boite-srubrique-rubrique {display: none;}</style>
+	<?php } ?>
+			
+			
+			
+							<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+
+			
+			<div id="bloquemedio">
+	
+				
+				
+				
+				<BOUCLE_masinfo(RUBRIQUES)>
+					<B_conclave>
+					[<div style="border-top:1px solid #0066CC; ">Información de (#_rubrica:TITRE|unique) en el sitio #NOM_SITE_SPIP</div>]
+						<div class="regional">
+						<img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> 
+						[<a href="#URL_RUBRIQUE">(#TITRE|supprimer_numero)</a>] 
+						[ <span class="detalleregional"> -(#DESCRIPTIF)-</span>] 
+					</div>
+						<BOUCLE_conclave(ARTICLES){id_rubrique}{titre_mot=#_rubrica:TITRE} {par date}{inverse}>
+							<div class="tituloarticulo" style="font-size:85% "><a href="#URL_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong></a>[ - (#DATE|nom_jour) ][(#DATE|affdate)]<br /></div>
+						</BOUCLE_conclave>
+					</B_conclave>	
+				</BOUCLE_masinfo>
+				
+				
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div>
+			[(#REM) Sites de la rubrique ]
+				<B_sites>
+				<div class="syndic" style="text-align:left ">
+					
+					
+						<BOUCLE_sites(SITES) {id_rubrique} {par nom_site}>
+						<table><tr><td>
+						<b>[(#LOGO_SITE|left||reduire_image{80,0}|inserer_attribut{hspace,5})]<a href="#URL_SITE">#NOM_SITE</a></b>
+							[<br />(#DESCRIPTIF)<br />]
+							<B_syndic>
+							Ultimas Noticias
+							<ul>
+								<BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,10}>
+								<li><a href="#URL_ARTICLE" class="spip_out">#TITRE</a></li>
+								
+								</BOUCLE_syndic>
+							</ul>
+							</B_syndic>
+						</td></tr></table>
+						</BOUCLE_sites>
+						
+						<B_sous_rubriques>
+			<ul>
+				
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<li>
+						<div class='menuseccionesitem-sub#EXPOSE'>
+						<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+						</div>
+						<BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
+					</li>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			</ul>
+			</B_sous_rubriques>
+					
+				</div>
+				</B_sites>
+			</div>
+			
+
+			
+			
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+						 	<INCLURE{fond=inc/inc-avisos}{lang}>
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}> 
+	
+</div><!-- pagina -->
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]	
+</body>
+</html>
+</BOUCLE_rubrica>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/sommaire.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/sommaire.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/sommaire.html	(revision 30)
@@ -0,0 +1,86 @@
+#CACHE{0}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title>[(#NOM_SITE_SPIP)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<div id="cabeza"><INCLURE{fond=inc/inc-cabeza}{lang}>	</div>
+	<div id="barracabeza"><div id="estructura">barracabeza</div>#DESCRIPTIF_SITE_SPIP</div>
+	<div id="cuerpo"><div id="estructura"></div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+			<INCLURE{fond=inc/inc-menu-principal}{lang}>	
+			
+	   
+	 
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+				<B_avisos_superior>
+					<div id="estructura"><:Aviso Superior:></div>
+					<BOUCLE_avisos_superior(ARTICLES){lang?}{titre_mot=aviso portada} {par num titre}>
+						<B_muestradoc>
+							<BOUCLE_muestradoc(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        						<div class="avisossuperior">	
+									#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    							</div><!-- avisossuperior -->
+							</BOUCLE_muestradoc>
+						</B_muestradoc>
+							<div class="avisossuperior">	
+								<!--[(#LOGO_ARTICLE|#URL_SITE|sinon{<a href="#URL_SITE" title="#NOM_SITE">[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{120,0}) ]-->
+								[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{500,0}) ]
+							</div><!-- avisossuperior -->
+						<//B_muestradoc>     
+					</BOUCLE_avisos_superior> 
+    			</B_avisos_superior>
+			
+
+			</div><!-- avisoprincipal -->
+			<div id="bloquearriba">
+			
+				<div id="estructura"><:bloquearriba:></div>
+				<INCLURE{fond=inc/inc-nota-principal}{lang}>
+				<INCLURE{fond=inc/inc-nota-secundaria}{lang}>
+				
+				
+			</div><!-- bloquearriba -->
+			<div id="bloquemedio">
+				<div id="estructura">bloquemedio</div>
+				<INCLURE{fond=inc/inc-comunicados}{lang}>
+				<INCLURE{fond=inc/inc-notas-destacadas}{lang}>
+				<INCLURE{fond=inc/inc-galeria}{lang}>
+
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo" style="text-align:left; font-size:90% "><div id="estructura">bloqueabajo</div>
+	
+		<INCLURE{fond=inc/inc-titulares}{lang}>
+
+
+
+
+
+			</div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			 	<INCLURE{fond=inc/inc-avisos}{lang}>	
+			
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}>	
+	
+</div><!-- pagina -->
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]	
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/ajb/styles/personalizado.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/styles/personalizado.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/styles/personalizado.css	(revision 30)
@@ -0,0 +1,722 @@
+body 
+{ 
+
+font-family:Verdana, Arial, Helvetica, sans-serif;; 
+font-size: 85%;
+background-image: url("../img/fondo.gif");
+margin: 0 ;
+text-align:center;
+}
+img{ border:1px solid #000000;
+margin:5px}
+a, a:visited
+{
+color: #0C2A80;
+text-decoration: none;
+
+}
+a:hover , a.over
+{ 
+color: #0C2A50
+}
+
+#pagina 
+{
+margin: 0; 
+padding: 0; 
+width: 780px ;
+text-align:center;
+position:relative;
+margin: 0px auto;
+}
+#estructura
+{
+color:#FFFF00;
+font-size: 80%;
+overflow:hidden;
+display:none;
+}
+#cabeza img{border:0;
+margin:0px}
+#cabeza 
+{float:left;
+background-image: url("../img/fondo.gif");
+/*background-color: #000; 
+background-image: url("../img/cabeza.jpg");
+margin-bottom: 0; 
+padding: 0; 
+height: 51px;*/
+}
+#barracabeza
+{
+/*border: solid 1px #000000;*/
+background-color:#cccccc;
+padding:3px;
+margin: 0px 0px 0px 0px;
+font-size:85%;
+float:left;
+width:774px
+}
+*html #barracabeza {margin-top:-3px}
+#cuerpo
+{
+background-image: url("../img/fondoportada.gif");
+
+float:left;
+background-repeat:repeat-y;
+}
+#cuerpo-actividades
+{
+background-image: url("../img/fondoblanco-menu.jpg");
+
+float:left;
+background-repeat:repeat-y;
+}
+#columnaizquierda
+{
+/*border:1px solid #0066CC;*/
+text-align:left;
+width:780px;
+float:left;
+margin: 0px 0px 0px 0px;
+padding-bottom:0px;
+overflow:hidden;
+}
+#menusecciones{
+text-align:left;
+}
+*html #menusecciones {margin-top:-17px}
+.mostrar{display:none}
+.menuseccionesarriba{
+/*background-image: url("../img/secciones.gif");*/
+height:0px;
+background-repeat:no-repeat}
+.menuseccionesitem
+{
+	text-align:center;
+	width:110px;
+	float:left;
+	padding: 4px 0px 4px 0px;
+	font-size:90%;
+	background-repeat:repeat-y;
+	
+	font-weight: 200;
+}
+* html .menuseccionesitem	/* selecteur reconnu seulement par IE (Win et Mac)*/
+{
+/*margin-top:-3px*/
+}
+.menuseccionesitem a , .menuseccionesitem a:visited
+{
+color:#006666;
+font-weight: bold;
+}
+.pico{margin: -2px 0px 0px -14px;
+position:relative;
+}
+.menuseccionesitem:hover{
+color:#023568}
+
+.menuseccionesitemon
+{
+text-align:center;
+width:110px;
+float:left;
+padding: 4px 0px 4px 0px;
+/*border-bottom: solid 1px #23475D;
+border-right: solid 1px #23475D;*/
+font-size:90%;
+background-color:#ccc;
+background-repeat:repeat-y
+}
+
+a.on, a:visited.on{color:#FFFFff;font-weight: bold;}
+.menuseccionesitem-sub a , .menuseccionesitem-sub a:visited 
+{
+color:#cccccc;
+font-weight: bold;
+}
+.menuseccionesitem-sub
+{
+/*background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;*/
+padding: 4px 10px 4px 20px;
+border-bottom: solid 1px #23475D;
+border-right: solid 1px #23475D;
+font-size:80%;
+/*background-color:#B7D8DA;*/
+display:none;
+}
+
+.menuseccionesitem-subon
+{
+/*background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;*/
+padding: 4px 10px 4px 20px;
+/*border-bottom: solid 1px #23475D;*/
+border-right: solid 1px #23475D;
+font-size:80%;
+/*
+background-color:#B7D8DA;*/
+}
+.menuseccionesitem-subon ul li .menuseccionesitem-sub{
+position:relative;
+background-image: url("../img/bordemenusubsub1.gif");
+background-repeat:repeat-y;
+padding-left:25px;
+margin-right:-11px;
+margin-left:-20px;
+font-weight: bold;
+margin-top:2px;
+border-top: solid 1px #23475D;}
+
+.menuseccionesitem-subon ul li .menuseccionesitem-subon{
+position:relative;
+background-image: url("../img/bordemenusubsub1.gif");
+background-repeat:repeat-y;
+padding-left:25px;
+margin-right:-11px;
+margin-left:-20px;
+font-weight: bold;
+margin-top:2px;
+border-top: solid 1px #23475D;}
+
+.articuloson ul li .menuarticuloitem{
+background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;
+padding: 4px 10px 4px 20px;
+border-bottom: solid 1px #23475D;
+border-right: solid 1px #23475D;
+font-size:80%;
+
+background-color:#B7D8DA;
+}
+.articulos ul li .menuarticuloitem{
+display:none
+}
+
+.lienon {color:blue}
+* html .menuseccionesitem-sub	/* selecteur reconnu seulement par IE (Win et Mac)*/
+{
+/*margin-top:-3px*/;
+}
+
+.menuseccionesitem-sub:hover{
+color:#023568;
+}
+
+
+.menuseccionesabajo{
+
+height:13px;
+background-repeat:no-repeat;
+
+}
+
+
+
+#contenido
+{
+text-align:left;
+width:650px;
+float:left;
+vertical-align:middle;
+padding-left:10px;
+overflow:hidden}
+#columnaderecha
+{
+width:129px;
+float:right;
+overflow:hidden;
+text-align:center
+}
+#avisoprincipal
+{
+
+}
+#bloquearriba
+{
+text-align:left;
+	/*border-bottom:1px solid #0066CC;*/
+padding: 0px 0px 10px 0px;
+margin: 0px 0px 0px 0px;
+float:left;
+background-image: url("../img/bloquearriba.gif");
+border-bottom:2px solid #ccc;
+}
+#bloquemedio{
+}
+#bloqueabajo
+{
+border-top:2px solid #ccc;
+width:100%;
+float:left;
+
+
+}
+#pie
+{background-image: url("../img/fondo.gif");
+background-color: #ECF0F4;
+width:780px;
+width:100%;
+float:left;
+color:#000000;
+margin: 0px 0px 0px 0px
+}
+#prueba 
+{
+/*border: solid 1px #ffffff;*/
+width:100%;
+float:left;
+position:absolute;
+width:500px;
+float:left;
+height: 30px;
+background-image: url("../img/fondo2.gif");
+margin: -46px 0px 0px 154px;
+}
+* html #prueba	/* selecteur reconnu seulement par IE (Win et Mac)*/
+{
+	margin: -30px 0px 0px -542px;
+
+}
+
+ /* -------------------------------------------------------
+ 	MENU NAVIGADORON (IZQUIERDA)
+ ------------------------------------------------------- */
+.menu a
+{
+
+
+}
+.menu ul {
+	display: block;
+	margin: 0px;
+	padding: 0px;
+	padding-bottom: 0px;
+	list-style: none;
+}
+
+.menu ul.titulo {
+	display: block;
+	margin: 0px;
+	padding: 0px;
+	
+	list-style: none;
+}
+
+.menu li.titulo {
+	display: block;
+	margin: 0px;
+	padding: 0px;
+	
+	list-style: none;
+}
+#menusecundario{
+width:140px;
+margin-left:2px;
+border-bottom:solid 5px #cc0000;
+
+
+}
+.titulosecundario
+{
+background-color:#000000;
+margin-left:8px;
+color:#cccccc;
+font-size: 80%;
+font-weight: bold;
+}
+.menusecundarioitem     
+{ 
+border-bottom:solid 2px #000099; 
+padding: 0px 6px 0px 6px; 
+font-size: 85%; 
+}
+.menusecundarioitem a ,.menusecundarioitem a:visited 
+{ 
+color: #09f; 
+}
+.menusecundarioitem a:hover 
+{ 
+color: #9cf;  
+}
+
+.menu-item a {
+ 
+padding: 0px 8px 0px 18px; 
+font-size: 85%; }
+
+.menu-item a ,.menu-item a:visited 
+{ 
+color: #09f; 
+}
+.menu-item a:hover 
+{ 
+color: #9cf;  
+}
+.menu-subitem {
+padding: 0px 8px 0px 23px; 
+font-size: 85%;}
+.avisosizquierda
+{
+margin: 10px 0px 10px 6px}
+.avisosderecha
+{
+border-bottom:1px solid #0066CC;
+margin: 0px 0px 0px 0px;
+padding: 10px 0px 10px 0px;
+font-size: 80%;
+
+
+}
+.spip-admin-bloc {
+text-align:center;float:left;
+width:780px}
+
+.avisossuperior
+{
+border-bottom:1px solid #0066CC;
+padding: 10px 0px 10px 0px;
+margin: 0px 0px 0px 0px;
+font-size: 90%; 
+}
+
+
+
+.subtituloaviso
+{
+font-size: 105%;
+text-align:left ;
+background-color:#FFFFFF;
+padding: 0px 10px 0px 10px;
+}
+.tituloaviso
+{ 
+font-size: 140%;
+font-weight: bold;
+color:red;
+background-color:#FFFFFF
+}
+a:hover .tituloaviso
+{ 
+
+color:#000ddd
+}
+
+/* contenido del pie general */
+#datos{
+color:#000000;
+padding:5px;
+text-align:center;
+font-size: 80%;
+font-weight:bold
+}
+.texto1datos{}
+.texto2datos{
+font-size: 120%;
+color:#ccc;
+font-weight: bold;}
+.texto3datos{
+font-size: 110%;
+}
+#afiliados{
+}
+.evento { font-size: 11px; font-family: Verdana, Arial, Helvetica; border-top: 1px solid #036 }
+.adagenciat      { font-size: 14px; font-family: Arial, Helvetica, Geneva, Swiss, SunSans-Regular }
+.adagenciat a    { color: #036; text-decoration: none }
+.adagenciat a:hover   { color: #00c }
+.adagencia a      { color: #036; text-decoration: none }
+.evento a  { color: #900; text-decoration: none }
+.evento a:hover    { color: #036 }
+.adagencia a:hover1 { color: #036 }
+.adagenciase    { color: #036; font-size: 13px; font-family: Verdana, Arial, Helvetica; border-top: 1px solid #036 }
+.activtit  { color: #036; font-size: 13px; font-family: Verdana, Arial, Helvetica }
+.activfecha { font-weight: bold; font-size: 11px; font-family: Verdana, Arial, Helvetica }
+.adagenciase a   { color: #036; font-family: Verdana, Arial, Helvetica }
+.adagenciase a:hover  { color: #00c; font-family: Verdana, Arial, Helvetica; text-decoration: none }
+
+#cuerpodespacho
+{
+background-image: url("../img/fondoatedespacho.gif");
+float:left;
+background-repeat:repeat-y;
+}
+#contenidodespacho
+{
+
+
+padding:0px 0px 0px 0px;
+width:640px;
+
+overflow:hidden}
+#despacho
+{
+
+padding:10px 0px 20px 10px;
+width:620px;
+float:left;
+overflow:hidden}
+.regional{
+font-size: 80%;
+margin-top:10px;
+font-weight: bold;
+text-align:left;
+
+color:#005555}
+.detalleregional{
+font-size: 80%;
+text-align:left;
+color:#000000
+}
+.tituloarticulo{
+font-size: 120%;
+text-align:left;
+margin-top:2px;
+}
+.textoarticulo{
+font-size: 80%;
+text-align:justify;
+margin-top:20px
+}
+.volver{
+text-align:right;font-size:80%
+}
+#datosedicion a , #datosedicion a:visited {color:#CCCCCC}
+#datosedicion a:hover {color:#eeeeee}
+#datosedicion{
+padding-top:20px;
+text-align:center;
+
+color:#ffffff;
+text-align:left}
+.frase{font-size: 90%;
+padding:3px 0px 3px 10px;
+font-style:italic;font-family:"Times New Roman", Times, serif;}
+.despachodatos{padding:3px 0px 3px 10px;;font-size: 75%;}
+.titulomedios{
+background-color:#005555;
+font-size:80%;
+
+padding:3px 0px 3px 0px;
+font-weight: bold;
+color:#ffffff;
+}
+.division{
+margin:20px -10px 20px -10px;
+height:20px;
+background-color:#cccccc}
+.numerodespacho{font-weight: bold;
+font-size: 80%;
+padding:3px 5px 3px 5px;
+text-align:center}
+.pirulos
+{
+font-size: 80%;
+margin-left:5px;
+margin-right:5px;
+position: relative;
+	/*overflow:hidden;*/
+text-align:center;
+border: solid 1px black
+}
+.pirulos img {border:0px}
+.spacepirulo{margin-bottom:2px;}
+/*.cortepirulo{background-color:transparent;
+height:8px;}*/
+
+#rubriquepirulo { 
+font-weight:bold; 
+font-size:80%; 
+text-align:center;
+color:#000000; 
+background-color:#669ACC;
+padding: 2px 5px 2px 5px;
+margin-top:10px;
+
+}
+#rubriquepirulo a{color:#000000;font-size:115%; }
+#rubriquepirulo a:hover{color:#ffffff}
+.surtitrep{
+padding: 1px 0px 1px 5px;
+background-color:white;
+font-size:1.0em; 
+
+margin-bottom:35px;
+	FONT-WEIGHT: bold; FONT-SIZE: 90%
+
+}
+
+.h5p {
+padding: 1px 3px 3px 3px;
+background-color:white;
+font-size:120%;
+font-weight:bold
+}
+
+.h5p a{
+}
+.h5p a:hover{color:blue
+}
+
+.sous-titrep{padding: 0px 3px 5px 3px;background-color:white;font-size:90%; }
+
+#nota_principal
+{
+/*border:1px solid #ccc;*/
+background-color:#ecf0f4;
+width:315px;
+float:left;
+padding:4px;
+margin-bottom:-10px}
+#nota_secundaria
+{
+border-top:2px solid #ccc;
+/*border-left:3px solid #ccc;*/
+background-color:#ffffff;
+padding-bottom:10px;
+width:295px;
+float:left;
+padding:4px;
+margin-left:2px}
+
+#notadestacada{
+padding-bottom:10px;
+width:292px;
+float:left;
+padding:4px;
+border-top:2px solid #ccc;
+margin-left:3px;
+margin-right:3px;
+margin-top:-2px
+}
+
+
+.agendabanner       {background-image: url("../img/agenda.gif");
+height:33px}
+.agendain       {  }
+.agendatit, .agendatit a,  .agendatit a:visited    { color: #036}
+.agendaevent    {  margin-bottom: 5px; padding-bottom: 3px; border-bottom: 1px dashed #789 }
+.agendafecha       { color: #900;  margin-top: 5px; padding-top: 5px; padding-bottom: 10px }
+#bloquemedio{float:inherit;
+text-align:left;
+width:628px;
+margin: 0px 0px 0px 0px;}
+
+.volantadest1{
+font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 85%;
+	font-style: normal;
+	line-height: 10pt;
+	font-weight: bold;
+	font-variant: normal;
+	color: #333333;}
+.titulo1 {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 20px;
+	font-style: normal;
+	line-height: 23px;
+	font-weight: bold;
+	font-variant: normal;
+	color: #006666;
+	background-position: left top;
+	letter-spacing: -0.5pt;
+	vertical-align: middle;
+	word-spacing: normal;
+	text-align: left;
+}
+.FECHA-COMUNIC {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: bold;
+	font-variant: normal;
+	color: #658181;
+}
+.texto {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #333333;
+	text-align: justify;
+}
+.notacompleta-col {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 9px;
+	font-style: normal;
+	line-height: 9pt;
+	font-weight: normal;
+	font-variant: normal;
+	color: #333333;
+	display: inline;
+}
+.espcioblancochico {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 5px;
+	line-height: 5px;
+}
+.titulo-0 {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 20px;
+	font-style: normal;
+	line-height: 23px;
+	font-weight: lighter;
+	font-variant: normal;
+	color: #006666;
+}
+.texto1 {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #333333;
+	text-align: left;
+}
+.titulo02 {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 13px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: bold;
+	font-variant: normal;
+	color: #006666;
+}
+
+
+.chapo {
+	FONT-WEIGHT: bold
+}
+#contenido
+{
+width:630px;
+float:left;
+vertical-align:middle;
+
+margin: 0px 0px 0px 0px;
+overflow:hidden;
+padding:0px}
+.spip{font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 90%;
+	font-style: normal;
+	line-height: normal;
+	
+	font-variant: normal;
+	}
+	.iconitos{
+float:right; 
+margin-top:-10px ; 
+text-align:right; 
+border:0px}
+#fotogaleria{float:left}
+.comunicado-in{
+font-size:90%;
+border: solid 1px #ccc;
+padding:10px;
+background-color:#eee
+}
Index: /trunk/spip/esqueleto-redcta/themes/ajb/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ajb/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ajb/theme.xml	(revision 30)
@@ -0,0 +1,19 @@
+<theme>
+  <nom>redcta - &#192; ajb</nom>
+  <auteur>
+    [Andr&#233; Vincent->http://andre-vincent.info] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>1.9.1.1</version>
+  <etat>test</etat>
+  <type>themes</type>
+  <squelettes>redcta</squelettes>
+  <description>
+    <multi>
+    Select this theme to modify the look and feel of ALTERNATIVES.
+    This theme swrinks the banner from 3 to 2 collums at right in the header of the page.
+      [fr]
+	S&#233;lectionnez ce th&#232;me pour changer l'habillage du squelette ALTERNATIVES.
+	Cet habillage r&#233;duit la largeur du bandeau de 3 &#224; 2 colonnes et positionne le bandeau &#224; droite.
+    </multi>
+  </description>
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/404.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/404.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/404.html	(revision 30)
@@ -0,0 +1,94 @@
+#CACHE{24 * 3600}
+#HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}
+#HTTP_HEADER{Pragma: no-cache}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title><:pass_erreur:> 404 - [(#NOM_SITE_SPIP|textebrut)]</title>
+	<INCLURE{fond=page}{fond=styles}{lang}>
+</head>
+<body dir="#LANG_DIR">
+<div id="page">
+
+<!-- *****************************************************************
+	Entete et menu principal (haut et droite)
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<div id="principal">
+	
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+	<div id="bloc-contenu">		
+		<div class="cartouche">
+			<h1 class="titre-article"><:pass_erreur:> 404</h1>
+      <h2><:info_erreur_requete:> <:avis_aucun_resultat:></h2>
+      [<p>(#ENV*{erreur}|propre)</p>]
+		</div><!-- cartouche -->
+		<div class="chapo">
+			<:avis_chemin_invalide_1:>
+			<:avis_chemin_invalide_2:>
+		</div>
+		<div class="texte">
+
+			<h2><:bouton_choisir:></h2> 
+			<ul>
+				<li>
+					<a href="javascript:history.back()"><:page_precedente:></a> 
+				</li>
+				<li>
+					<a href="#URL_PAGE{recherche}"><:info_rechercher:></a> 
+				</li>
+				<li>
+					<a href="#URL_SITE_SPIP"><:accueil_site:></a> 
+				</li>
+				<li>
+					<a href="#URL_PAGE{plan}"><:plan_site:></a> 
+				</li>
+			</ul>
+		</div>
+	</div><!-- bloc-contenu -->
+
+
+<!-- *****************************************************************
+	Menus contextuels (gauche)
+	Contextual menus (left) 
+    ************************************************************* -->
+	<div id="encart">	
+
+<INCLURE{fond=inc/inc-breves}{lang}>
+
+<INCLURE{fond=inc/inc-syndic}{lang}>
+
+    <!-- Inscription au site -->
+    [<div class="menu">
+        <ul>
+          <li><b><:pass_vousinscrire:></b>            
+            <ul>
+              <li>
+                <span><:participer_site:></span>
+                (#FORMULAIRE_INSCRIPTION)
+              </li>
+            </ul>
+          </li>
+        </ul>
+    </div><!-- menu -->]
+
+	</div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+</div><!-- principal -->
+
+<!-- *****************************************************************
+	Pied-de-page (bas)
+	Footer (bottom) 
+    ************************************************************* -->
+<INCLURE{fond=inc/inc-bas} {lang}>
+</div><!-- page -->
+
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/COPYING.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/COPYING.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/COPYING.txt	(revision 30)
@@ -0,0 +1,344 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/TODO.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/TODO.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/TODO.txt	(revision 30)
@@ -0,0 +1,148 @@
+﻿Keynotes for developpers of the template 'Alternatives'
+Pense-bête pour les développeurs du squelette 'Alternatives'
+
+BUGS connus ou rapportés (à vérifier ou à corriger)
+------------------------
+
+1.	il semblerait que Sktheme désactive le CACHE - à vérifier.
+	Voir une solution possible pour ceux qui en ont besoin.
+	http://www.spip-contrib.net/Plugin-Sktheme#forum390378
+	Nos serveurs étant plutôt rapides, nous ne l'intégrons pas à notre distribution.
+2.	il semblerait que Sktheme ne soit plus compatible en 1.9.2 - à vérifier
+3.	le formulaire d'édition des forums fait éclater la mise en page et/ou est trop étroit dans 
+	les diverses versions de IE/Win (les bugs sont différents selon les versions) - à corriger
+4.	les documents insérés dans le TEXTE d'un article se retrouvent en doublons dans le bas de l'article; 
+	il semble que la fonction dans mes_fonctions.php pour découper en pages un article et générer 
+	un sommaire basé sur les intertitres en soit la cause - à corriger
+
+
+TO DO
+-----
+
+-	trier les articles des rubriques et page d'accueil {par num titre} {!par date} - OK, c'est fait
+	- ajouter par {!date modif} si mot-clé 'modification' est appliqué à un article - à faire
+
+-	trier {par num titre, titre} pour les rubriques dans inc-menu.html 
+	et {par num titre} {!par date} pour les articles 
+
+-	combiner Plan et Résumé et ajouter tri par auteur, par mots-clés, etc... dans plan.html
+
+-	sommaire.html - plus modulaire - OK, c'est fait: 
+		ajout de inc-sommaire-edito.html et inc-sommaire-articles.html
+
+-	développer davantage site.html
+
+-	automatiser par plugin l'injection dans la base de données des mot-clés utilisés par 
+	les squelettes Alternatives (voir : http://egt.bardourel.com/spip.php?article2)
+
+-	revoir la position des listes d'articles liés aux mots-clés et aux auteurs dans le bas 
+	des articles, avant les forums. Pour le mot-clés, envisager d'utiliser le plugin 'nuages' de mots clés
+
+-	améliorer la feuille de style d'impression (print.css) - ajouter un icône d'impression
+
+LAYOUT
+------
+-	revoir le système d'insertion et de personnalisation des images dans le bandeau (inc-entete.html) :
+	- utilisation de la balise #LOGO_SITE 
+	- utilisation de la balise #DESCRIPTIF_SITE (donc repenser inc-sommaire-edito.html)
+
+-	inverser l'odre de #encart et #navigation afin d'obtenir la souplesse de mise en page 
+	de Layout Gala (voir notamment l'application qu'en fait les squelettes Multi-Médic)
+
+-	revoir le mécanisme d'insertion des annonces
+	- insertion des images d'Annonce basé sur le logo de l'article et le mot-clé "Annonce" appliqué 
+	à l'article plutôt que basé sur le titre de l'image (plus cohérent avec les autres méthodes 
+	d'insertion des annonces basé sur le titre, le surtitre et le sous-titre).
+	- possibilité d'insérer les Annonces à divers endroits (à la Joomla)
+	- voir les nombreuses possibilités du squelette EGT (attention de préserver le multilinguisme)
+
+-	ajouter un menu permanent par imagemap en en-tête et en pied de page pour :
+	- accueil
+	- plan du site
+	- contact
+	Voir l'adaption d'un thème pour CMSimple (Designed By DotcomWebdesign.com) 
+	-> http://stages.alternatives.ca/_test/
+	[À faire : séparer l'image de fond (la photo) du menu et des effets d'habillage.]
+
+-	ajouter un menu 'navigation rapide' optionnel sous le bandeau construit à partir de mot-clé 
+	(voir : afrique-du-nord), dont le mécanisme serait le suivant :
+	- le mot-clé 'nav-rapido' appliqué à une rubrique insère le menu 'navigation rapide' sous la bannière.
+	- cette rubrique est exclue du menu-rubrique (à gauche) et serait placée en début du plan
+	- les articles et sous-rubriques de ce menu sont affichés sous forme de menu horizontal
+	- les articles peuvent rediriger vers n'importe quel autre page du site (mécanisme d'article virtuel 
+	  de SPIP) ou des squelettes particuliers ou personnalisés (agenda, album photo, formulaires, etc...)
+	- les sous-rubriques de ce menu rapide sont déroulantes pour afficher leurs articles ou leurs sous-sous-rubriques
+
+En somme, ça permettrait de construire un menu totalement sur mesure
+
+-	en conséquence de ce qui précède, la possibilité d'exclure sélectivement par le mot-clé 
+	'exclusion' certaines rubriques des rubriques du menu-rubrique (à gauche)
+
+-	de même, la possibilité d'inclure par le mot-clé 'inclusion' des articles dans le menu-rubrique 
+	à gauche, et ce, à tout niveau, pas seulement dans les rubriques racines (secteurs); en conséquence,
+	les articles placés dans les rubriques racines ne seront plus affichés automatiquement, comme c'est 
+	le cas présentement;
+	
+	ATTENTION : 
+		ceci risque de modifier passablement l'affichage du menu de gauche pour les sites existants
+
+-	sélection du type de rubrique et d'article par mot-clé (dans ce cas, le mécanisme n'est pas 
+	encore arrêté, il faut étudier les mécanismes proposés par les squelettes Epona, Multi-Médic, etc.)
+
+DÉPENDANCE AU PLUGIN SKTHEME
+----------------------------
+
+- Trouver un mécanisme pour éliminer la dépendance actuelle au plugin SkTheme tout en conservant la même 
+souplesse (le plugin sktheme, dans sa version actuelle, semble désactiver le CACHE et n'est plus compatible
+avec la version 1.9.2 de SPIP). Une piste serait de revenir à une installation du squelette 'alternatives' 
+dans le dossier squelettes et des thèmes dans un dossier '/plugins/themes-alternatives/'. Ça fonctionne 
+déjà correctement dans l'état actuel, mais ce n'est pas documenté. Une légère modification du plugin 
+'switcher' pourrait faire ce que fait présentement la partie 'switcher de squelettes' du plugin 'sktheme'.
+
+COMPATIBILITÉ PLUGINS
+---------------------
+
+* le jeu de squelettes Alternatives est déjà compatible avec les plugins 
+	- qui n'opèrent que dans l'espace privé 
+		(exemple: saveauto, skel_editor)
+	- qui s'insèrent dans les squelettes uniquement via la balise #INC_HEAD
+		(exemples : antispam, switcher, sktheme, habillages)
+	- qui s'insérent comme modèles dans le texte des articles, brèves, etc...
+		(exemples : lecteurs mulmédia)	
+
+Par contre, certains plugins exigent, pour être fonctionnels, de modifier ou d'ajouter des balises, 
+propriétés ou attributs particuliers dans les squelettes ou les feuilles de styles. 
+
+Il nous faudra donc ajouter ces éléments, du moins, pour les plugins les plus populaires qui exigent une 
+modification des squelettes. Il seraient donc immédiatement pris en compte s'ils sont installés et activés.
+Mais il faut aussi qu'on puisse les désactiver et désinstaller sans rien perturber. Il faut donc insérer 
+ces éléments de manière conditionnelle. Si le plugin n'est pas présent, rien de ne se produit, point c'est
+tout.
+
+Les premiers candidats qui nous viennent à l'esprit sont les suivants :
+- pour barre typo enrichie ou ecologique (BTE) - ajouter règles de styles dans base.css
+- thikbox - revoir traitement du porfolio dans article et rubrique
+- agenda - à fouiller
+- forms et tables - à fouiller
+- spip-listes - à fouiller
+- clevermail - à fouiller
+- abonnement mailman - à fouiller
+- nuages de mots clés - à fouiller
+	
+
+
+ASSURER et CONSOLIDER
+---------------------
+- Conformité XHTML 1.0 Strict - OK
+- Conformité CSS 2.1 - OK
+- Acessibilité et conformité WAI-AAA - à améliorer (accesskey, tabindex = ???)
+- Compatibilité avec le maximum de navigateurs (dont IE/Win 5.0 à 7.0)
+	- commencer à vérifier la compatibilité avec les petits écrans des bidulles portables
+- Multilinguisme ET unilinguisme - 
+  Continuer à n'utiliser que des chaînes de caractères multilingues livrées avec SPIP
+  Attention aux plugins unilingues ou même bilingues
+	OK, le mécanisme semble au point pour une foule de situations avec le minimum de contraintes et le maximum de souplesse
+- Multi styles et multi thèmes (par diverses méthodes et/ou plugins) - à consolider
+
+AMÉLIORER LA DOCUMENTATION
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/agenda.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/agenda.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/agenda.html	(revision 30)
@@ -0,0 +1,109 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : <:icone_agenda:></title>
+	<INCLURE{fond=page}{fond=styles}>
+	<INCLURE{fond=inc/inc-meta}{lang}>
+</head>
+<body dir="#LANG_DIR" class="#LANG plan">
+<div id="page">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+
+	<div id="bloc-contenu">
+		<BOUCLE_langue_contexte_exclus(ARTICLES){tout}{doublons contexte}{lang}></BOUCLE_langue_contexte_exclus>
+		<B_langues>
+		<div id="sommaire">
+			<h4><:info_langues:></h4>
+			<ul>
+			<BOUCLE_langues(ARTICLES){tout}{doublons contexte}{par lang}>[
+				<li lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR">
+					<a href="spip.php?action=cookie&amp;url=[(#SELF)]&amp;var_lang=#LANG" hreflang="#LANG">(#LANG|unique|traduire_nom_langue{lang})</a>
+				</li>
+			]</BOUCLE_langues>
+			</ul>
+		</div>
+		</B_langues>
+
+		<h2><:icone_agenda:></h2>
+
+    <B_article_langue>
+    <BOUCLE_article_langue(ARTICLES) {lang} {par date} {inverse} {pagination} {!par date_redac}{age_redac < 1}{doublons archives}>
+    <hr />
+        <h3>[(#DATE_REDAC|nom_jour)] [(#DATE_REDAC|affdate)]</h3>
+    <hr />
+      [<span style="float:right;">(#LOGO_ARTICLE||reduire_image{150,0})</span>]
+			[<div class="surtitre">(#SURTITRE)</div>]
+      <h3><a href="#URL_SITE_SPIP/#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></h3>
+      [<div class="sous-titre">(#SOUSTITRE)</div>]
+      <div class="detail">
+      </div><!-- detail -->
+      [<div class="texte">
+      	<div class="extrait">
+      	 (#DESCRIPTIF|sinon{[(#CHAPO|sinon{#TEXTE}|couper{300})]})&nbsp;<b class="separateur">&gt;</b>&nbsp;<a  class="suite" href="#URL_SITE_SPIP/#URL_ARTICLE" title="...<:suite:>" ><:suite:></a>
+      	</div>
+      </div>]
+      <br />
+    </BOUCLE_article_langue>
+    </B_article_langue>
+    <//B_article_langue>
+
+    <hr />
+		
+	[(#REM) ARCHIVES : 
+	Boucle tiré de "Usage du filtre 'unique' pour classer des articles"
+	sur SPIP-Contrib : http://www.spip-contrib.net/Usage-du-filtre-unique-pour]
+		<h3><:info_visites_par_mois:></h3>
+	<BOUCLE_archive(ARTICLES){titre_mot=Agenda}{lang}{doublons archives}>
+		[
+			[(#COMPTEUR_BOUCLE|>{1}|?{'</ul></li></ul></div>',''})]
+			<div class="archives">
+			<h3 class="plan-archives" style="cursor: pointer; margin-top:.5em;" onclick="deplier('bloc[(#COMPTEUR_BOUCLE)]');">(#DATE|annee|unique)</h3>
+
+			<ul id="bloc[(#COMPTEUR_BOUCLE)]" style="display: block;">
+		]
+		[
+			[(#DATE|annee|unique{nouvelle}|?{'','</ul></li>'})]
+			<li style="cursor: pointer;" onclick="deplier('bloc[(#COMPTEUR_BOUCLE)2]');">(#DATE|affdate{'Y-m'}|unique|nom_mois)
+  			<ul id="bloc[(#COMPTEUR_BOUCLE)2]" style="display: none;">
+		]
+		<li><a href="#URL_ARTICLE" title="commentaire">[(#TITRE|supprimer_numero)]</a></li>
+	</BOUCLE_archive>
+		</ul></li></ul>
+			</div><!-- archives -->
+	</B_archive>
+	</div><!-- bloc-contenu -->
+
+	[(#REM) Fin de l'archive]
+        
+
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+	<div id="encart">
+    <INCLURE{fond=inc/inc-annonces}{lang}>
+    <INCLURE{fond=inc/inc-breves}{lang}>
+    <INCLURE{fond=inc/inc-syndic}{lang}>
+
+	</div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas} {lang}>
+</div><!-- page -->
+
+</body>
+</html>
+
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/article.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/article.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/article.html	(revision 30)
@@ -0,0 +1,242 @@
+#CACHE{7200}
+<BOUCLE_article_principal(ARTICLES) {id_article} {lang_select} {doublons} >
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[(#TITRE|textebrut)] - [[(#NOM_SITE_SPIP|textebrut)]]</title>
+		<INCLURE{fond=inc/inc-meta}{lang}{id_article}>
+		<INCLURE{fond=styles}{lang}>
+	
+</head>
+<body dir="#LANG_DIR" class="#LANG article sect#ID_SECTEUR <BOUCLE_rubriques_body(HIERARCHIE){id_article}{" "}>rub#ID_RUBRIQUE</BOUCLE_rubriques_body> art#ID_ARTICLE">
+<div id="page" class="article art#ID_ARTICLE">
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}{id_article}>
+
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+
+    <div id="bloc-contenu">
+      <div class="article-info-rubrique">
+        <h5><B_rubriques_chemin>
+            <BOUCLE_rubriques_chemin(HIERARCHIE){id_article}{" <b class='separateur'>&gt;</b> "}>
+              <a href="#URL_SITE_SPIP/#URL_RUBRIQUE">[(#TITRE|supprimer_numero|couper{60})]</a>
+            </BOUCLE_rubriques_chemin>
+        </h5>
+
+        <B_traductions>
+            <div class="petit-info" style="text-align:right"><:titre_langue_trad_article:> 
+            <BOUCLE_traductions(ARTICLES){traduction}{exclus}{"<br />"}>
+              [<div dir="#LANG_DIR">(#LANG|traduire_nom_langue) : <a href="#URL_SITE_SPIP/spip.php?action=cookie&amp;url=#URL_SITE_SPIP%2F#URL_ARTICLE&amp;var_lang=#LANG" dir="#LANG_DIR">][(#TITRE|supprimer_numero)</a></div>]
+            </BOUCLE_traductions>
+            </div>
+        </B_traductions>
+        
+        <div class="ligne-debut"></div><!-- ligne-debut -->
+      </div><!-- article-info-rubrique -->
+      
+      <div class="cartouche">
+			[<span style="float:right;">(#LOGO_ARTICLE||reduire_image{160,0})</span>]
+			[<div class="surtitre">(#SURTITRE)</div>]
+			<h1 class="titre-article">[(#TITRE|supprimer_numero)]</h1>
+            [<div class="sous-titre">(#SOUSTITRE)</div>]
+				<p class="detail">
+				[(#DATE|nom_jour)] [(#DATE|affdate)]
+				<B_auteurs_recents><:par_auteur:>
+				<BOUCLE_auteurs_recents(AUTEURS) {id_article} {", "}><a href="#URL_SITE_SPIP/#URL_AUTEUR">#NOM</a>
+				</BOUCLE_auteurs_recents>
+				</p>
+				
+      </div><!-- cartouche -->
+
+
+		[<div class="chapo">(#CHAPO|reduire_image{440,0})</div>]
+		[<div id="sommaire">
+			<h4><:icone_brouteur:></h4> [(#REM) = "Navigation rapide" on aurait prefere "Sommaire", mais pas de traduction ]
+			(#TEXTE*|sommaire_article|propre)
+		</div>]
+		[<div class="texte">(#TEXTE*|decouper_en_page{#ID_ARTICLE}|propre|reduire_image{440,0})</div>]
+		[<div class="ps">(#PS)</div>]
+		[<div class="notes">(#NOTES)</div>]
+		[(#TEXTE|?{""})]
+		[<div class="chapo"><:voir_en_ligne:> : <a href="(#URL_SITE)">[(#NOM_SITE|sinon{#URL_SITE})]</a></div>]
+
+			[(#REM) Portfolio : album d'images ]
+			<B_documents_portfolio>
+			<div id="documents_portfolio">
+				<h2><:info_portfolio:></h2>
+				<BOUCLE_documents_portfolio(DOCUMENTS) {id_article} {mode=document} {extension IN png,jpg,gif} {par num titre, date} {doublons}>
+				[<a href="#URL_DOCUMENT" type="#MIME_TYPE" onclick="location.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return false;"[ title="(#TITRE|couper{80}|texte_backend)"]>(#LOGO_DOCUMENT||image_reduire{0,60}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+				</BOUCLE_documents_portfolio>
+			</div>
+			</B_documents_portfolio>
+
+			<BOUCLE_afficher_document(DOCUMENTS) {id_document} {id_article} {mode=document}{extension IN png,jpg,gif}>
+			<div class="spip_documents spip_documents_center" id="document_actif">
+				[<a href="[(#URL_DOCUMENT|abs_url)]">(#FICHIER|reduire_image{450,0}|inserer_attribut{alt,[(#TITRE|supprimer_numero|couper{80}|texte_backend)]})</a>]
+				[<div class="spip_doc_titre">(#TITRE)</div>]
+				[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+			</div>
+			</BOUCLE_afficher_document>
+
+<B_documents_joints>
+<div><hr />
+<BOUCLE_documents_joints(DOCUMENTS) {id_article} {mode=document} {doublons}>
+	<div style="float: left;">
+	[(#LOGO_DOCUMENT|#URL_DOCUMENT)][<div style="clear: both;"><b>(#TITRE)</b></div>][<div style="clear: both;">(#DESCRIPTIF)</div>]
+	</div>
+</BOUCLE_documents_joints>
+</div>
+<div style="clear: both;"></div>
+</B_documents_joints>
+
+		<br />
+			[(#REM) Petition :
+			La petition ayant une PAGINATION il faut absolument lui passer SELF en argument. ]
+			[ #REM Conserver cet invalideur : (#PETITION|?{'',''}) ]
+			<INCLURE{fond=inc-petition}{id_article}{self=#SELF}>
+		
+		<!-- Derniers articles des auteurs de l'article -->
+		<B_auteurs>
+			<div class="ps">
+				<BOUCLE_auteurs(AUTEURS) {id_article} {par nom}>
+				<h4><a href="#URL_AUTEUR" title="#NOM">#NOM</a></h4>	
+					<B_articles_auteur>
+					<h3><em><:articles_auteur:></em></h3>
+					<ul>
+						<BOUCLE_articles_auteur(ARTICLES) {id_auteur} {par date} {inverse} {exclus}{0,5}>
+						<li>	
+							<a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+						</li>
+							</BOUCLE_articles_auteur>
+						<li><a href="#URL_AUTEUR" title="<:suite:>">[...]</a></li>
+					</ul>
+					</B_articles_auteur>
+				</BOUCLE_auteurs>
+			</div><!-- notes chapo -->
+		</B_auteurs>
+
+		<!-- Mots cles -->
+		<B_mots>
+		<div class="ps">
+			<h2><:mots_clefs:></h2>
+			<ul title="<:mots_clefs:>">
+				<BOUCLE_mots(MOTS) {id_article} {par titre}>
+					<li>
+							<a href="#URL_MOT" title="<:info_articles_lies_mot:>">[(#TITRE|supprimer_numero)]</a>
+						<B_articles_mots>
+						<ul>
+							<BOUCLE_articles_mots(ARTICLES) {id_mot} {par date} {inverse} {0,5}>
+								<li>
+									<a href="#URL_ARTICLE" title="[(#DESCRIPTIF|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a>
+								</li>
+							</BOUCLE_articles_mots>
+						</ul>
+						</B_articles_mots>						
+					</li>
+				</BOUCLE_mots>
+			</ul>
+		</div><!-- menu -->
+		</B_mots>
+
+		<!-- Forums -->
+		[<div class="forum-repondre">
+			<h5><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_article:></a></h5>
+		</div>]
+		<B_forums>
+		<h2 class="structure"><:Forum:></h2>
+		<ul class="forum-total">
+			<BOUCLE_forums(FORUMS){id_article}{par date}{inverse}>
+				<li>
+					<div class="forum-fil">
+						<div class="forum">
+							<a name="forum#ID_FORUM"></a>
+							<div class="forum-chapo">
+								<div class="forum-titre">[(#TITRE|supprimer_numero)]</div>
+								[(#DATE|affdate)][, <:par_auteur:> <strong>(#NOM)</strong>]
+							</div><!-- forum-chapo -->
+							<div class="forum-item">
+								#TEXTE
+								[<div class="forum-titre"><a href="(#URL_SITE)" class="spip_out">#NOM_SITE</a></div>]
+								[<div class="forum-repondre-message"><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_message:></a></div>]
+							</div><!-- forum-item -->
+						</div><!-- forum -->
+						<B_forums_fils>
+						<ul>
+						<BOUCLE_forums_fils(FORUMS){id_parent}{par date}>
+
+							<li>
+								<div class="forum">
+									<a name="forum#ID_FORUM"></a>
+									<div class="forum-chapo">
+										<div class="forum-titre">[(#TITRE|supprimer_numero)]</div>
+										[(#DATE|affdate)][, <:par_auteur:> <strong>(#NOM)</strong>]
+									</div><!-- forum-chapo -->
+									<div class="forum-item">
+										#TEXTE
+										[<div class="forum-titre"><a href="(#URL_SITE)" class="spip_out">#NOM_SITE</a></div>]
+										[<div class="forum-repondre-message"><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_message:></a></div>]
+									</div><!-- forum-item -->
+								</div><!-- forum -->
+							<BOUCLE_Forums_Boucle(boucle_forums_fils)></BOUCLE_Forums_Boucle>
+								</li>
+							</BOUCLE_forums_fils>
+						</ul>
+						</B_forums_fils><!-- forum-fil -->
+					</div>
+				</li>
+			</BOUCLE_forums>
+		</ul><!-- forum-total -->
+		</B_forums>
+	</div><!-- bloc-contenu -->
+	
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+    <div id="encart"> 
+      <INCLURE{fond=inc/inc-annonces}{lang}>
+		<!-- Derniers articles dans la meme rubrique -->
+		<B_articles_rubrique>
+			<div class="menu">
+			<h2 class="structure"><:articles_recents:></h2>
+				#ANCRE_PAGINATION
+				<ul>
+					<li>
+						<a href="#URL_SITE_SPIP/#URL_RUBRIQUE"><:meme_rubrique:></a>
+						<ul>
+							<BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {par num titre} {!par date} {doublons} {id_article != #ID_ARTICLE} {pagination 15}>
+							<li>
+								<a href="#URL_SITE_SPIP/#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+							</li>
+							</BOUCLE_articles_rubrique>
+						</ul>
+					</li>
+    <!--[if lte IE 6]><style>#encart a{height:1em;}#encart li{height:1em;float:left;clear:both;width:100%}</style><![endif]-->
+    <!--[if IE 6]><style>#encart li{clear:none;}</style><![endif]-->
+				</ul>
+				#PAGINATION
+			</div><!-- menu -->
+		</B_articles_rubrique>
+
+	</div><!-- encart -->
+	
+<BOUCLE_rub_en_cours(ARTICLES){id_article}{lang_select}>
+<INCLURE{fond=inc/inc-menu}{lang}{id_rubrique}>
+</BOUCLE_rub_en_cours>
+<INCLURE{fond=inc/inc-bas}{lang}{id_article}{id_rubrique}{id_secteur}>
+</div><!-- page -->
+
+</body>
+</html>
+</BOUCLE_article_principal>
+<INCLURE{fond=404}{lang}{id_article}>
+<//B_article_principal>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/auteur.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/auteur.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/auteur.html	(revision 30)
@@ -0,0 +1,81 @@
+<BOUCLE_auteur_principal(AUTEURS) {id_auteur}{tous}>
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : [(#NOM|textebrut)]</title>
+	<INCLURE{fond=page}{fond=styles}{lang}{id_auteur}>
+</head>
+<body dir="#LANG_DIR" class="#LANG auteur aut#ID_AUTEUR">
+<div id="page" class="auteur">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}{id_auteur}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+	<div id="bloc-contenu">
+		<div class="cartouche">
+		[<span style="float:right;">(#LOGO_AUTEUR||reduire_image{120,0})</span>]
+			<h1>#NOM</h1>
+			<div class="texte">
+				[(#BIO)<br />]
+				[<b>#NOM_SITE : <a href="(#URL_SITE)">#URL_SITE</a></b><br />]
+				[(#NOTES)<br />]
+				<br />
+				[<h2 id="message"><:info_envoyer_message_prive:></h2>(#FORMULAIRE_ECRIRE_AUTEUR)]
+			</div><!-- texte -->
+		</div><!-- cartouche -->
+		<!-- Articles de l'auteur -->
+		<h2><:articles_auteur:></h2>
+		<BOUCLE_articles(ARTICLES) {id_auteur} {par titre} {"<br />"}>
+			<h3><a href="#URL_SITE_SPIP/spip.php?action=cookie&amp;url=#URL_SITE_SPIP%2F#URL_ARTICLE&amp;var_lang=#LANG" hreflang="#LANG" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a></h3>
+			<div class="detail">
+				[(#DATE|nom_jour)] [(#DATE|affdate)]
+			</div>
+		</BOUCLE_articles>
+	</div><!-- bloc-contenu -->
+
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+	<div id="encart">
+	<INCLURE{fond=inc/inc-annonces}{lang}>
+
+		<B_auteurs>
+		<!-- Tous les auteurs -->
+			<div class="menu">
+				<ul class="titre">
+					<li><b><:icone_tous_auteur:></b>
+						<BOUCLE_auteurs(AUTEURS) {par nom}{tous}>
+						<ul>
+							<li>
+								<a href="#URL_AUTEUR">#NOM</a>	
+							</li>
+						</ul>
+						</BOUCLE_auteurs>
+					</li>
+    <!--[if lte IE 6]><style>#encart a{height:1em;}#encart li{height:1em;float:left;clear:both;width:100%}</style><![endif]-->
+    <!--[if IE 6]><style>#encart li{clear:none;}</style><![endif]-->
+				</ul>
+			</div><!-- menu -->
+		</B_auteurs>
+	</div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas} {lang}{id_auteur}>
+</div><!-- page -->
+
+</body>
+</html>
+</BOUCLE_auteur_principal>
+<INCLURE{fond=404}{lang}{id_auteur}>
+<//B_auteur_principal>
+ 
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/breve.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/breve.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/breve.html	(revision 30)
@@ -0,0 +1,123 @@
+#CACHE{7200}
+<BOUCLE_breve_principal(BREVES) {id_breve} {doublons}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : [(#TITRE|supprimer_numero|textebrut)]</title>
+	<INCLURE{fond=inc/inc-meta}{lang}{id_breve}>
+	<INCLURE{fond=styles}{lang}>
+
+
+</head>
+<body dir="#LANG_DIR" class="#LANG breve sect#ID_SECTEUR rub#ID_RUBRIQUE br#ID_BREVE">
+<div id="page" class="breve">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}{id_breve}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+	<div id="bloc-contenu">
+		<div id="cartouche">
+			[<span style="float:right;">(#LOGO_BREVE||reduire_image{120,0})</span>]
+			<h2 class="titre-article">[(#TITRE|supprimer_numero)]</h2>
+			<h6>[(#DATE|nom_jour)] [(#DATE|affdate).]</h6>
+		</div><!-- cartouche -->
+		<br />
+		[<div class="texte">(#TEXTE|reduire_image{440,0})</div>]
+		[<div class="chapo"><:voir_en_ligne:> : <a href="(#URL_SITE)">[(#NOM_SITE|sinon{#URL_SITE})]</a></div>]
+		[<div class="notes">(#NOTES)</div>]
+		<br />
+
+		<!-- Forums -->
+		[<div class="forum-repondre"><h5><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_breve:></a></h5></div>]
+
+		<B_forums>
+		<h1 class="structure"><:forum:></h1>
+		<ul class="forum-total">
+			<BOUCLE_forums(FORUMS){id_breve}{par date}{inverse}>
+				<li>
+					<div class="forum-fil">
+						<div class="forum">
+							<a name="forum#ID_FORUM"></a>
+							<div class="forum-chapo">
+								<div class="forum-titre">[(#TITRE|supprimer_numero)]</div>
+								[(#DATE|affdate)][, <:par_auteur:> <A HREF="mailto:#EMAIL">(#NOM)</A>]
+							</div><!-- forum-chapo -->
+							<div class="forum-item">
+								#TEXTE
+								[<div class="forum-titre"><a href="(#URL_SITE)" class="spip_out">#NOM_SITE</a></div>]
+								[<div class="forum-repondre-message"><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_message:></a></div>]
+							</div><!-- forum-item -->
+						</div><!-- forum -->
+						<B_forums_fils>
+						<ul>
+							<BOUCLE_forums_fils(FORUMS){id_parent}{par date}>
+								<li>
+									<div class="forum">
+										<a name="forum#ID_FORUM"></a>
+										<div class="forum-chapo">
+										<div class="forum-titre">[(#TITRE|supprimer_numero)]</div>
+											[(#DATE|affdate)][, par <A HREF="mailto:#EMAIL">(#NOM)</A>]
+										</div><!-- forum-titre -->
+										<div class="forum-item">
+											#TEXTE
+											[<div class="forum-titre"><a href="(#URL_SITE)" class="spip_out">#NOM_SITE</a></div>]
+											[<div class="forum-repondre-message"><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_message:></a></div>]
+										</div><!-- forum-item -->
+									</div><!-- forum -->
+									<BOUCLE_Forums_Boucle(boucle_forums_fils)></BOUCLE_Forums_Boucle>
+								</li>
+							</BOUCLE_forums_fils>
+						</ul>
+						</B_forums_fils>
+					</div><!-- forum-fil -->
+				</li>
+			</BOUCLE_forums>
+		</ul>
+		</B_forums>
+	</div><!-- bloc-contenu -->
+
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+	<div id="encart">
+
+		<!-- Breves dans la meme rubrique -->
+		<B_breves_rubrique>
+		<div class="menu">
+		<h2 class="structure"><:breves:></h2>
+      <ul>
+        <li><b><:autres_breves:></b>
+					<ul>
+					<BOUCLE_breves_rubrique(BREVES) {doublons} {par date} {inverse} {0,10}>
+          	<li>[<span>(#DATE|affdate)</span>]
+              <a href="#URL_SITE_SPIP/#URL_BREVE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+          	</li>
+					</BOUCLE_breves_rubrique>
+          </ul>
+        </li>
+      </ul>
+		</div><!-- menu -->
+		</B_breves_rubrique>
+
+	</div><!-- encart -->
+	
+<INCLURE{fond=inc/inc-menu}{lang}{id_breve}>
+<INCLURE{fond=inc/inc-bas}{lang}{id_breve}>
+</div><!-- page -->
+
+</body>
+</html>
+</BOUCLE_breve_principal>
+<INCLURE{fond=404}{lang}{id_breve}>
+<//B_breve_principal>
+  
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/ecrire/mes_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/ecrire/mes_options.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/ecrire/mes_options.php	(revision 30)
@@ -0,0 +1,66 @@
+<?php
+##############################################################
+# Fichier mes_options.php                        SPIP v1.9.x #
+#                                                            #
+# L'utilisation de ce fichier est optionnelle,               #
+# mais fortement recommandee                                 #
+#                                                            #
+# Permet de configurer :                                     #
+# 1. le mode multilingue du site (ACTIVE)                    #
+# 2. le type d'adressage (URL) (ACTIVE)                      #
+#    le mode propsose ici est 'html'                         #
+#                                                            #
+# Pour utiliser ce fichier copiez-le dans le repertoire      #
+# /ecrire, en veillant a ne pas ecraser un mes_options.php   #
+# personnalise qui s'y trouverait deja                       #
+#                                                            #
+##############################################################
+
+############### CONFIGURATION MULTILINGUE ####################
+
+// Pour desactiver le mode multilingue, si votre site est monolingue,
+// commenter en placant un '#' au debut de la ligne suivante :
+
+	$forcer_lang = true ;
+
+############# CONFIGURATION ADRESSAGE .html ##################
+
+// Pour activer, 
+// 1. activer le fichier .htaccess (lire INSTALL.txt situe a la racine du repertoire de SPIP)
+// 2. lire les instructions dans le fichier 'htaccess.txt' 
+// 3. pour obtenir des adresses du type /article23.html,
+//    supprimer le '#' devant la ligne suivante :
+
+#	$type_urls = "html";
+
+
+################ CONFIGURATION TITRAGE #######################
+
+// Dans le squelette ALTERNATIVES, tous les #TITRE sont filtrés
+// par #TITRE|supprimer_numero ; mais il est possible que nous
+// en ayons oublie ; on ne prend pas de chance, on les supprime
+// ici globalement ; ca s'appliquera aussi a tous les squelettes
+// du site que nous pourrions ajouter et aux squelettes /dist/
+// que l'on utilise (backend, formulaire, etc...).
+
+	$table_des_traitements['TITRE'][]= 'supprimer_numero(typo(%s))';
+
+################ CONFIGURATION PLUGINS ######################
+
+// Configuration pour divers plugin, si actives
+
+######### Les divers plugins de "Barre typo enrichi" ########
+// Conserve les triangles noir comme puces avec les listes dites
+// "a puces" de SPIP (- en debut de ligne), assurant une compatibilite
+// ascendante avec le contenu de sites deja existants.
+//
+// Pour obtenir en lieu et place de veritables listes a puces du 
+// type (-*), simplement commenter la ligne suivante en placant 
+// un '#' au debut de la ligne suivante :
+
+	$GLOBALS['barre_typo_preserve_puces'] = true;
+
+// Pour les nouveaux sites, il est recommande de commenter 
+// la ligne precedente.
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/formulaires/formulaire_menu_lang.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/formulaires/formulaire_menu_lang.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/formulaires/formulaire_menu_lang.html	(revision 30)
@@ -0,0 +1,23 @@
+[(#REM) *********************************************************
+	Formulaire de langues modifie - renvoie systematiquement a la page d'accueil
+	Modified Language's Form - systematicly returns to home page 
+    ************************************************************* ]
+<div class="formulaire_spip formulaire_menu_lang">
+<a name="formulaire_menu_lang" id="formulaire_menu_lang"></a>
+
+<form method="post" action="#ENV{url}">
+<fieldset>
+	[(#ENV{url}|form_hidden)]
+	<label for="#ENV{nom}"><:info_langues:></label>
+	<select class="forml" name="#ENV{nom}" id="#ENV{nom}"  onchange="document.location.href='#URL_SITE_SPIP/spip.php?action=cookie&amp;url=#URL_SITE_SPIP/&amp;#ENV{nom}='+this.options[this.selectedIndex].value">
+	#ENV*{langues}
+	</select>
+</fieldset>
+	<noscript>
+		<fieldset>
+			<input type="submit" value="&gt;&gt;" />
+		</fieldset>
+	</noscript>
+</form>
+
+</div>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/formulaires/formulaire_recherche.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/formulaires/formulaire_recherche.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/formulaires/formulaire_recherche.html	(revision 30)
@@ -0,0 +1,17 @@
+[(#REM) *********************************************************
+	Formulaire de recherche - ajout de FIELDSET pour conformite XHTML 
+	Search Form - to be conform with XHTML Strict 
+    ************************************************************* ]
+<div class="formulaire_spip formulaire_recherche">
+<a name="formulaire_recherche" id="formulaire_recherche"></a>
+
+<form action="[(#ENV{lien})]" method="get">
+<fieldset>
+	[(#ENV{lien}|form_hidden)]
+	[<input type="hidden" name="lang" value="(#ENV{lang})" />]
+	<label for="recherche"><:info_rechercher:></label>
+	<input type="text" class="forml" name="recherche" id="recherche" value="[(#ENV{recherche}|sinon{<:info_rechercher:>" onfocus="this.value='';})]" />
+</fieldset>
+</form>
+
+</div>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/forum.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/forum.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/forum.html	(revision 30)
@@ -0,0 +1,71 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : <:poster_message:></title>
+	<INCLURE{fond=page}{fond=styles}{lang}>
+</head>
+<body dir="#LANG_DIR">
+<div id="page" class="forum">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+	<div id="bloc-contenu">
+		<h1 class="structure"><:poster_message:></h1>
+		<BOUCLE_article(ARTICLES) {id_article}>
+			<h2><:en_reponse:></h2>
+			[(#LOGO_ARTICLE|right||reduire_image{120,0})]
+			[<div class="surtitre">(#SURTITRE)</div>]
+			<h3 class="titre-extrait"><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></h3>
+			[<div class="surtitre">(#SOUSTITRE)</div>]
+			<div class="detail">
+				[(#DATE|nom_jour)] [(#DATE|affdate)]
+				<B_auteurs_un><:par_auteur:> <BOUCLE_auteurs_un(AUTEURS) {id_article} {", "}>#NOM</BOUCLE_auteurs_un>
+			</div><!-- detail -->
+			[<div class="texte"><div class="extrait">(#INTRODUCTION)</div></div>]
+			<br />
+		</BOUCLE_article>
+		<BOUCLE_breve(BREVES) {id_breve}>
+			<h2><:en_reponse:></h2>
+			[(#LOGO_BREVE|right)]
+
+			<h3><a href="#URL_BREVE">[(#TITRE|supprimer_numero)]</a></h3>
+			<div class="detail">
+				[(#DATE|nom_jour)] [(#DATE|affdate)]
+			</div>
+			[<div class="texte"><div class="extrait">(#INTRODUCTION)</div></div>]
+			<br /><!-- detail -->
+		</BOUCLE_breve>
+		<BOUCLE_forum_parent(FORUMS) {id_forum}>
+			<h2><:en_reponse:></h2>
+			<h3><a href="#URL_FORUM">[(#TITRE|supprimer_numero)]</a></h3>
+			<div class="detail">
+				[(#DATE|affdate)][(#DATE|heures)][:(#DATE|minutes)][, <:par_auteur:> (#NOM)]
+			</div><!-- detail -->
+			[<div class="texte"><div class="extrait">(#INTRODUCTION|lignes_longues)</div></div>]
+			<br />
+		</BOUCLE_forum_parent>
+		
+		<!--*****************************************************************
+			Forum
+		******************************************************************-->
+		#FORMULAIRE_FORUM
+	</div><!-- bloc-contenu -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas}{lang}>
+</div><!-- page -->
+
+</body>
+</html>
+
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-affvisit.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-affvisit.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-affvisit.html	(revision 30)
@@ -0,0 +1,21 @@
+<?php
+$query = "SELECT SUM(visites) AS total_absolu FROM spip_visites";
+	$result = spip_query($query);
+
+	if ($row = spip_fetch_array($result)) {
+		$total_absolu = $row['total_absolu'];
+	}
+
+
+$query = "SELECT COUNT(DISTINCT ip) AS visites FROM spip_visites_temp";
+		$result = spip_query($query);
+	
+	if ($row = @spip_fetch_array($result)) {
+		$visites_today = $row['visites'];
+}
+
+$total_gen = $total_absolu + $visites_today;
+
+echo "<strong>".$total_gen."</strong>";
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-annonces.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-annonces.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-annonces.html	(revision 30)
@@ -0,0 +1,49 @@
+    <B_annonces_art_img>
+    <!-- Annonces -->
+    <div class="menu">
+    <h2 class="structure"><:info_annonces_generales:></h2>
+      <ul>
+        <li><b class="titre-annonce"><:bouton_annonce:></b>
+          <ul><BOUCLE_annonces_art_img(ARTICLES) {lang} {par date} {inverse} {doublons}><B_logo_art_doc>
+            <li class="annonce">
+              <BOUCLE_logo_art_doc(DOCUMENTS){id_article}{titre=Annonce} >
+                [<a href="#URL_SITE_SPIP/#URL_ARTICLE"[ title="(#DESCRIPTIF|supprimer_tags)"]>(#FICHIER|image_reduire{150,0}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+              </BOUCLE_logo_art_doc><hr />
+          	</li>
+            </B_logo_art_doc></BOUCLE_annonces_art_img>
+            <BOUCLE_annonces_rub(RUBRIQUES) {lang} {par date} {inverse} {doublons}><B_logo_rub_doc>
+          	<li class="annonce">
+              <BOUCLE_logo_rub_doc(DOCUMENTS){id_rubrique}{titre=Annonce} >
+                [<a href="#URL_SITE_SPIP/#URL_RUBRIQUE"[ title="(#DESCRIPTIF|supprimer_tags)"]>(#FICHIER|image_reduire{150,0}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+              </BOUCLE_logo_rub_doc><hr />
+          	</li>
+            </B_logo_rub_doc></BOUCLE_annonces_rub>            
+          </ul>
+        </li>
+      </ul>
+    </div><!-- menu -->
+    </B_annonces_art_img>
+
+    <B_annonces_art>
+    <!-- Annonces -->
+    <div class="menu">
+    <h2 class="structure"><:info_annonces_generales:></h2>
+      <ul>
+        <li><b class="titre-annonce"><:bouton_annonce:></b>
+          <ul><BOUCLE_annonces_art(ARTICLES) {lang} {par date} {inverse} {titre_mot=Annonce}>
+            <li class="annonce">
+                <p>
+                [<small style="text-transform:uppercase">(#SURTITRE)</small>]
+                [<big><a href="#URL_SITE_SPIP/#URL_ARTICLE"[ title="(#DESCRIPTIF|supprimer_tags)"]>(#TITRE)</a></big>]
+                [<span>(#SOUSTITRE)</span>]
+                <br />
+                </p>
+          	</li>
+            </BOUCLE_annonces_art>
+          </ul>
+        </li>
+      </ul>
+    </div><!-- menu -->
+    </B_annonces_art>
+
+<//B_annonces_art_img>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bandeau.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bandeau.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bandeau.html	(revision 30)
@@ -0,0 +1,13 @@
+<!-- L'entete du site -->
+<div id="entete">
+	<a href="#URL_SITE_SPIP" title="<:accueil_site:> : #NOM_SITE_SPIP" class="nom-site"><span>#NOM_SITE_SPIP</span></a>
+
+[(#REM) Pour activer le formulaire des langues au lieu du menu,
+		décommenter la bloc qui suit - preferable pour les sites 
+		avec beaucoup de langues
+  <!-- Le formulaire des langues -->
+  <div id="formulaire-lang">
+	  	[(#MENU_LANG)]
+  </div><!-- formulaire-lang --> ]
+  
+</div><!-- entete -->
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas.html	(revision 30)
@@ -0,0 +1,46 @@
+[(#REM) *****************************************************************
+	Pied-de-page (bas)
+	Footer (bottom) 
+    ************************************************************* ]
+<div id="bas">
+	<a href="#URL_SITE_SPIP" title="<:accueil_site:>"><:accueil_site:></a> | 
+	<B_contact><a href="<BOUCLE_contact(AUTEURS) {tout}{0,1}>#URL_SITE_SPIP/[(#URL_AUTEUR)]</BOUCLE_contact>" title="<:info_contact:>"><:info_contact:></a> | </B_contact>
+	<a href="#URL_PAGE{plan}" title="<:plan_site:>"><:plan_site:></a> | 
+	<a href="#URL_SITE_SPIP/ecrire/" rel="nofollow" title="<:espace_prive:>"><:espace_prive:></a> | 
+	<a href="#URL_PAGE{statistiques}" title="<:titre_statistiques:>"><:icone_statistiques_visites:></a> | 
+	<span style="white-space: nowrap;"><:info_visites:> <INCLURE{fond=inc/inc-affvisit}></span>
+
+	<p>
+		<a href="http://www.spip.net" title="<:site_realise_avec_spip:> #SPIP_VERSION"> <:site_realise_avec_spip:> #SPIP_VERSION</a> + 
+		<a href="http://www.stages.alternatives.ca/article73.html" title="<multi>Squelette ALTERNATIVES[en] Template ALTERNATIVES[es]Esqueleto ALTERNATIVES[pt]Esqueleto ALTERNATIVES</multi> - 1.9.1.2">ALTERNATIVES</a>
+	</p>
+	<p>
+		&nbsp;&nbsp;&nbsp;&nbsp;
+		<a href="#URL_PAGE{backend}" rel="nofollow" title="<:bouton_radio_syndication:> [(#LANG|traduire_nom_langue)]">
+	<span style="border-width:1px 0px 1px 1px; border-style: solid; border-color:#FC9 #630 #330 #F96;  padding:0 3px; font:bold 10px verdana,sans-serif; color:#FFF; background:#F60; text-decoration:none; margin:0;">RSS</span><span style="border-width:1px 1px 1px 0px;border-style: solid;border-color:#dcb #330 #330 #F96; padding:0 3px;font:normal 10px verdana,sans-serif;color:#333;background:#FFE8D9;text-decoration:none;margin:0;text-transform:uppercase;"> #LANG</span></a>
+
+<BOUCLE_rubriques_chemin(HIERARCHIE){id_rubrique}{" "}>
+		<a href="#URL_PAGE{backend,id_rubrique=#ID_RUBRIQUE}" rel="nofollow" title="<:syndiquer_rubrique:>">
+	<span style="border-width:1px 0px 1px 1px; border-style: solid; border-color:#FC9 #630 #330 #F96;  padding:0 3px; font:bold 10px verdana,sans-serif; color:#FFF; background:#F60; text-decoration:none; margin:0;">RSS</span><span style="border-width:1px 1px 1px 0px;border-style: solid;border-color:#dcb #330 #330 #F96; padding:0 3px;font:normal 10px verdana,sans-serif;color:#333;background:#FFE8D9;text-decoration:none;margin:0;">[(#TITRE|supprimer_numero|couper{60})]</span></a>
+</BOUCLE_rubriques_chemin>
+
+<BOUCLE_syndic_rub(RUBRIQUES) {id_rubrique}>
+		<a href="#URL_PAGE{backend,id_rubrique=#ID_RUBRIQUE}" rel="nofollow" title="<:syndiquer_rubrique:>">
+	<span style="border-width:1px 0px 1px 1px; border-style: solid; border-color:#FC9 #630 #330 #F96;  padding:0 3px; font:bold 10px verdana,sans-serif; color:#FFF; background:#F60; text-decoration:none; margin:0;">RSS</span><span style="border-width:1px 1px 1px 0px;border-style: solid;border-color:#dcb #330 #330 #F96; padding:0 3px;font:normal 10px verdana,sans-serif;color:#333;background:#FFE8D9;text-decoration:none;margin:0;">[(#TITRE|supprimer_numero|couper{60})]</span></a>
+</BOUCLE_syndic_rub>
+	<big>&nbsp;
+		<b><a href="http://#LANG.wikipedia.org/wiki/Really_Simple_Syndication">?</a></b>
+	</big>
+	</p>
+
+<INCLURE{fond=inc/inc-bas_cc}{lang}>
+
+</div><!-- fin bas -->
+
+<INCLURE{fond=inc/inc-bas_menu-lang}{lang}>
+
+[(#REM)
+	La balise SPIP_CRON permet de deporter les calculs lourds (indexation, etc)
+	dans une image cachee, ce qui evite de ralentir l'affichage des pages.
+]	#SPIP_CRON
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas_cc.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas_cc.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas_cc.html	(revision 30)
@@ -0,0 +1,39 @@
+<!-- Creative Commons License -->
+[(#REM) Pour afficher la Licence CC (by-sa), compatible avec le licence GNU-GPL.
+		Pour modifier, changer toutes les occurences 'by-sa', a votre choix, par :
+		- by
+		- by-sa
+		- by-nc
+		- by-nd
+		- by-nc-sa
+		- by-nc-nd
+		Voir : http://creativecommons.org/about/licenses/meet-the-licenses
+		----
+		To display the CC Licence (by-sa), compatible with GNU/GPL. 
+		To modify the Licence, change every occurence of'by-sa' to what you want:
+		- by
+		- by-sa
+		- by-nc
+		- by-nd
+		- by-nc-sa
+		- by-nc-nd
+		Details : http://creativecommons.org/about/licenses/meet-the-licenses]
+<p>
+<a rel="license" href="http://creativecommons.org/licenses/by-sa/2.5/deed.#LANG"><img alt="Creative Commons License" style="border: 0;" src="http://i.creativecommons.org/l/by-sa/2.5/88x31.png" /></a> 
+</p>
+
+[(#REM) Laisser le passage suivant sous forme de commentaire
+		Don't remove comment's code in the following lines ]
+    <!--/Creative Commons License-->
+    <!-- <rdf:RDF xmlns="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+    <Work rdf:about="">
+      <license rdf:resource="http://creativecommons.org/licenses/by-sa/2.5/deed.#LANG" />
+		</Work>
+    <License rdf:about="http://creativecommons.org/licenses/by-sa/2.5/deed.#LANG">
+      <permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+      <permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+      <requires rdf:resource="http://web.resource.org/cc/Notice"/>
+      <requires rdf:resource="http://web.resource.org/cc/Attribution"/>
+      <permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+      <requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
+    </License></rdf:RDF> -->
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas_menu-lang.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas_menu-lang.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-bas_menu-lang.html	(revision 30)
@@ -0,0 +1,34 @@
+[(#REM) Menu contextuel des langues du site public - alternative à formulaire_menu_lang.html
+    - pour que ce menu fonctionne correctement, il faut installer le
+      fichier 'mes_options.php' dans /ecrire/ a la racine de SPIP qui 
+      active la ligne suivante : 
+      	$forcer_lang = true ;    		
+    - si le site est monolingue, le menu ne s'affiche pas
+    - si le site publie dans plus d'une langue, le menu affiche toutes 
+      les langues utilisees seulement
+    - la langue du contexte est mise en emphase forte, sans lien
+    - cliquer sur une autre langue du site, renvoie vers la page d'accueil  
+      et change le cookie de langue
+    - certaines pages (Plan, Resume) possedent leur propre menu de langue
+      qui renvoie sur elles-memes; dans ce cas, on n'affiche pas les autres 
+      langues du site
+    - la mise en forme et les couleurs du menu est controle dans une feuille 
+      de style de base par les regles suivantes :
+      	#menu-lang { }
+      	#menu-lang strong { }
+      	#menu-lang span { }
+      	#menu-lang a { }
+      	etc...
+      	Vous pouvez les modifier dans votre feuille de styles perso.css
+]
+<B_langues>
+	<div id="menu-lang">
+		<span class="structure"><:info_langues:> : </span>
+		[<strong class="langue_contexte">(#LANG|traduire_nom_langue)</strong>]
+<BOUCLE_langues(RUBRIQUES){racine} {par lang} {lang !=#ENV{lang}}>[
+		<span lang="#LANG" xml:lang="#LANG">| 
+		<a href="spip.php?action=cookie&amp;url=#URL_SITE_SPIP/&amp;var_lang=#LANG" rel="alternate" hreflang="#LANG" title="<:accueil_site:> : [(#LANG|traduire_nom_langue)]"   dir="#LANG_DIR">(#LANG|unique|traduire_nom_langue{lang})</a>
+		</span>
+]</BOUCLE_langues>
+	</div>
+</B_langues>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-breves.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-breves.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-breves.html	(revision 30)
@@ -0,0 +1,19 @@
+    <!-- Breves -->
+    <B_breves>
+    <div class="menu">
+    <h2 class="structure"><:dernieres_breves:></h2>
+      <ul>
+        <li><b><:nouvelles_breves:></b>
+          <ul>
+            <BOUCLE_breves(BREVES) {par date} {lang}{inverse} {0,3}>
+          	<li>[<span>(#DATE|affdate)</span>]
+              <a href="#URL_SITE_SPIP/#URL_BREVE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+          	</li>
+            </BOUCLE_breves>
+          </ul>
+        </li>
+    <!--[if lte IE 6]><style>#encart a{height:1em;}#encart li{height:1em;float:left;clear:both;width:100%}</style><![endif]-->
+    <!--[if IE 6]><style>#encart li{clear:none;}</style><![endif]-->
+      </ul>
+    </div><!-- menu -->
+    </B_breves>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-forums.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-forums.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-forums.html	(revision 30)
@@ -0,0 +1,18 @@
+    <!-- Liens des forums -->
+    <B_forums_liens>
+    <div class="menu">
+    <h2 class="structure"><:messages_recents:></h2>
+      <ul>
+        <li><b><:derniers_commentaires:></b>
+          <ul>
+            <BOUCLE_forums_liens(FORUMS){plat}{par date}{inverse}{0,15}>
+            <li>
+                [<span>(#DATE|affdate)</span>]
+               <a href="#URL_SITE_SPIP/#URL_FORUM">[(#TITRE|supprimer_numero)]</a>
+            </li>
+            </BOUCLE_forums_liens>
+          </ul>
+        </li>
+      </ul>
+    </div><!-- menu -->
+    </B_forums_liens>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-install.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-install.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-install.html	(revision 30)
@@ -0,0 +1,65 @@
+<multi>
+<h3 class="edito-titre">Welcome to your Website.</h3> 
+<div class="chapo">
+	<ul class="spip">
+		<li class="spip">
+			To modify your <i class="spip">Contact</i> informations, go to: <a href="ecrire/?exec=auteurs_edit&amp;id_auteur=1" class="spip_out">Your name or the name of your organisation </a>
+		</li>
+		<li class="spip">
+			To create new authors, go to: <a href="ecrire/?exec=auteurs" class="spip_out">Authors </a>
+		</li>
+		<li class="spip">
+			To create Content:
+			<ol class="spip">
+				<li class="spip">
+					create one or more <a href="ecrire/?exec=rubriques_edit&amp;new=oui" class="spip_out">sections </a>,
+				</li>
+				<li class="spip">
+					inside a <i class="spip">section</i>, create an <a href="ecrire/?exec=articles_edit&amp;new=oui" class="spip_out">article </a>, save and publish it.
+				</li>
+			</ol>
+		</li>
+		<li class="spip">
+			To remove or modify this message which always displays in top of your home page, go to <a href="ecrire/?exec=configuration" class="spip_out">Configuration </a> and edit your site&#8217;s name and site description.
+		</li>
+		<li class="spip">
+			For general help about this Content Management System, go to <a href="ecrire/?exec=aide_index&amp;var_lang=en" class="spip_out">Help </a>.
+		</li>
+		<li class="spip">
+			More documentation available on <a href="http://www.spip.net/en" class="spip_url spip_out">www.spip.net/en</a>.
+		</li>
+	</ul>
+</div>
+
+[fr]<h3 class="edito-titre">Bienvenue sur votre site</h3> 
+<div class="chapo">
+	<ul class="spip">
+		<li class="spip">
+			Pour modifier les informations de <i class="spip">Contact</i>, allez modifier les informations du <a href="ecrire/?exec=auteurs_edit&amp;id_auteur=1" class="spip_out">premier auteur</a>.
+		</li>
+		<li class="spip">
+			Pour cr&eacute;er un nouvel auteur, aller à : <a href="ecrire/?exec=auteurs" class="spip_out">Auteurs</a>
+		</li>
+		<li class="spip">
+			Pour cr&eacute;er du contenu :
+			<ol class="spip">
+				<li class="spip">
+					cr&eacute;er une nouvelle <a href="ecrire/?exec=rubriques_edit&amp;new=oui" class="spip_out">rubrique</a>,
+				</li>
+				<li class="spip">
+					&agrave; l'int&eacute;rieur de cette <i class="spip">rubrique</i>, cr&eacute;er un <a href="ecrire/?exec=articles_edit&amp;new=oui" class="spip_out">article</a>, l'enregistrer et le publier.
+				</li>
+			</ol>
+		</li>
+		<li class="spip">
+			Pour enlever ou modifier le pr&eacute;sent message, aller &agrave; <a href="ecrire/?exec=configuration" class="spip_out">Configuration</a> et modifier le nom et la description de votre site.
+		</li>
+		<li class="spip">
+			Pour obtenir de l'aide sur SPIP, aller &agrave; <a href="ecrire/?exec=aide_index&amp;var_lang=fr" class="spip_out">Aide</a>.
+		</li>
+		<li class="spip">
+			De la documentaiton suppl&eacute;mentaire est disponible &agrave;&nbsp;: <a href="http://www.spip.net/fr" class="spip_url spip_out">www.spip.net/fr</a>.
+		</li>
+	</ul>
+</div>
+</multi>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-langues.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-langues.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-langues.html	(revision 30)
@@ -0,0 +1,10 @@
+		<div id="sommaire-art">
+			<h4><:info_langues:></h4>
+			<ul>
+			<BOUCLE_langues(RUBRIQUES){racine}{par lang}>[
+				<li lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR">
+		<a href="spip.php?page=plan[#(#LANG)]" hreflang="#LANG">(#LANG|unique|traduire_nom_langue{lang})</a>
+	</li>
+]</BOUCLE_langues>
+			</ul>
+		</div>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-menu-principal.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-menu-principal.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-menu-principal.html	(revision 30)
@@ -0,0 +1,23 @@
+	<div class="menu" id="menu-principal">
+		<ul>
+			<li id="menu-principal-accueil"><a href="#URL_SITE_SPIP" title="<:accueil_site:> : #NOM_SITE_SPIP"><:accueil_site:></a></li>
+			<B_contact><li id="menu-principal-contact"><a href="<BOUCLE_contact(AUTEURS) {tout}{0,1}>[(#URL_SITE_SPIP)/][(#URL_AUTEUR)]</BOUCLE_contact>" title="<:info_contact:>"><:info_contact:></a></li></B_contact>
+			<li id="menu-principal-plan"><a href="#URL_PAGE{plan}" title="<:plan_site:>"><:plan_site:></a></li>
+			<BOUCLE_site(SITES) {0,1}><li id="menu-principal-sites"><a href="#URL_PAGE{site}" title="<:nouveautes_web:>"><:sites_web:></a></li></BOUCLE_site>
+			<li id="menu-principal-resume"><a href="#URL_PAGE{resume}" title="<:en_resume:>"><:en_resume:></a></li>
+			[<li id="menu-principal-recherche">
+	[(#REM) *********************************************************
+	Formulaire de recherche
+	Search form 
+    ************************************************************* ]
+			<div class="menu" id="menu-recherche">
+				<h3 class="structure"><:info_rechercher:></h3>
+					<ul>
+						<li>
+					(#FORMULAIRE_RECHERCHE)			
+						</li>			
+					</ul>
+			</div>[(#REM) fin menu-recherche ]<!-- menu-recherche -->
+			</li>]
+		</ul>
+	</div>[(#REM) fin menu-principal ]
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-menu.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-menu.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-menu.html	(revision 30)
@@ -0,0 +1,133 @@
+<!-- menu permanent de navigation - permanent navigation -->
+<div id="navigation">
+    <h2 class="structure"><:navigation:></h2>
+[(#REM) *********************************************************
+	Menu de navigation principal - liens statiques
+	Main navigation - static links 
+    ************************************************************* ]
+<INCLURE{fond=inc/inc-menu-principal}>
+
+[(#REM) *********************************************************
+	Menu rubriques DEPLIANT dynamique
+	voir: http://spip-contrib.net/ecrire/articles.php3?id_article=913
+	Dynamic sections menu 
+    ************************************************************* ]
+<div class="menu" id="menu-rubriques">
+<BOUCLE_rub_menu(RUBRIQUES){id_rubrique}>
+<BOUCLE_filles(RUBRIQUES){id_parent}{doublons filles}></BOUCLE_filles>
+[(#REM) les rubriques filles de la rubrique en cours sont mémorisées dans {doublons filles} ]
+[(#REM) les soeurs et tantes jusqu'aux rubriques racines sont mémorisées dans {doublons parents} ]
+   <BOUCLE_hierarchie_courante(HIERARCHIE){id_rubrique} {tout}>
+        <BOUCLE_parents(RUBRIQUES){meme_parent} {doublons parents} ></BOUCLE_parents>
+   </BOUCLE_hierarchie_courante>
+[(#REM) L'ensemble des rubriques contenues dans {doublons filles} et {doublons parents} représente
+l'ensembles des rubriques à afficher  
+
+		 Toutes les rubriques qui ne doivent pas être affichées sont exclues dans la  boucle suivante
+ qui liste toutes les rubriques du site - {doublons filles} et {doublons parents} le resultat est stocké dans {doublons exclus} ]
+<BOUCLE_tout(RUBRIQUES){tout}{doublons parents}{doublons filles}{doublons exclus}></BOUCLE_tout>
+
+[(#REM) boucle principale d'affichage pour squelettes rubriques, articles, brèves...
+On limite l'affichage du plan aux seules rubriques utiles, les autres sont exclues par {doublons exclus} ]
+	<h3 class="structure"><:rubriques:></h3>
+	<ul>
+	<BOUCLE_RubExclues_sect(RUBRIQUES){titre_mot=agenda}{doublons}></BOUCLE_RubExclues_sect>
+
+	<BOUCLE_secteurs2(RUBRIQUES){racine}{lang}{par num titre} {par titre}{doublons} >
+		<li>
+				<a class="lien[(#EXPOSER)]" href="#URL_RUBRIQUE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+		<B_art_secteur>
+		[(#REM) debut BOUCLE art_secteur pour afficher dans les articles des rubriques racine (secteur) ]
+			<ul>
+		<BOUCLE_art_secteur(ARTICLES){id_rubrique}{par num titre} {par titre}{lang}>
+				<li>
+					<a class="lien[(#EXPOSER)] article" href="#URL_ARTICLE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+				</li>
+		</BOUCLE_art_secteur>
+			</ul>
+		</B_art_secteur>[(#REM) fin BOUCLE art_secteur  ]
+		<B_sousrub2>
+			<ul>
+		<BOUCLE_sousrub2(RUBRIQUES){id_parent}{lang}{par num titre} {par titre}{doublons exclus}>
+				<li>
+					<a class="lien[(#EXPOSER)]" href="#URL_RUBRIQUE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+		<BOUCLE_sousousrub2(boucle_sousrub2)></BOUCLE_sousousrub2>
+				</li>
+		</BOUCLE_sousrub2>
+			</ul>
+		</B_sousrub2>
+		</li>
+	</BOUCLE_secteurs2>
+    <!--[if lte IE 6]><style>#menu-rubriques a{height:1em;}#menu-rubriques li{height:1em;float:left;clear:both;width:100%}</style><![endif]-->
+    <!--[if IE 6]><style>#menu-rubriques li{clear:none;}</style><![endif]-->
+	</ul>
+ </BOUCLE_rub_menu>
+
+[(#REM) boucle d'affichage pour les autres squelettes : sommaire, plan, recherche, resume, etc... 
+Ici, on affiche 2 niveaux de rubriques a partir de la racine pour la langue du contexte.Si on ne veut afficher qu'un seul niveau, pour ces , on efface la boucle sousrub_sommaire.
+Pour les sites multilingues, on n'affiche pas les autres langues; 
+si on veut afficher uniquement le premier niveau (secteur) des autres langues, on efface lang dans BOUCLE_sommaire). ]
+
+<BOUCLE_RubExclues_som(RUBRIQUES){titre_mot=agenda}{doublons}></BOUCLE_RubExclues_som>
+<B_sommaire>
+	<h3 class="structure"><:rubriques:></h3>
+	<ul>
+<BOUCLE_sommaire(RUBRIQUES){racine}{lang}{par num titre} {par titre} {doublons}>
+		<li>
+			<a class="lien[(#EXPOSER)]" href="#URL_RUBRIQUE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+<B_art_sommaire><!-- debut BOUCLE art_somm pour afficher des articles dans les rubriques racine (secteur) -->
+			<ul>
+		<BOUCLE_art_sommaire(ARTICLES){id_rubrique}{par num titre} {par titre}{lang}>
+				<li>
+					<a class="lien[(#EXPOSER)] article" href="#URL_ARTICLE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+				</li>
+		</BOUCLE_art_sommaire>
+			</ul>
+</B_art_sommaire>
+		<B_sousrub_sommaire>[(#REM) pour afficher dans le menu 2 niveaux de rubriques ]
+			<ul>
+		<BOUCLE_sousrub_sommaire(RUBRIQUES){id_parent}{par num titre} {par titre}{lang}>
+				<li>
+					<a class="lien[(#EXPOSER)]" href="#URL_RUBRIQUE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+				</li>
+		</BOUCLE_sousrub_sommaire>
+			</ul>
+		</B_sousrub_sommaire>
+		</li>
+</BOUCLE_sommaire>
+    <!--[if lte IE 6]><style>#menu-rubriques a{height:1em;}#menu-rubriques li{height:1em;float:left;clear:both;width:100%}</style><![endif]-->
+    <!--[if IE 6]><style>##menu-rubriques li{clear:none;}</style><![endif]-->
+	</ul>
+</B_sommaire>
+
+<//B_rub_menu>
+
+[(#REM) boucle d'affichage d'un agenda ou calendrier d'evenements. 
+Pour s'afficher dans ce menu, une rubrique doit se voir attribuer le mot-cle "agenda". Pour s'afficher dans l'agenda, les articles doivent, en plus d'une date de publication, se voir attribuer une "Date de publication anterieure" qui constituera la date de l'evenement. ]
+[(#REM) boucle d'affichage d'un agenda ou calendrier d'evenements. 
+Pour s'afficher dans ce menu, un article doit se voir attribuer le mot-cle "Agenda". Pour s'afficher dans l'agenda, les articles doivent, en plus du mot-cle, se voir attribuer une "Date de publication anterieure" qui constituera la date de l'evenement. ]
+
+<B_art_agenda>
+<div class="menu" id="menu-agenda">
+	<h3 class="structure"><:icone_agenda:></h3>
+	<ul>
+		<li>
+			<a class="lien" href="#URL_PAGE{agenda}" title="<:icone_agenda:>"><:icone_agenda:></a>
+			<ul>
+		<BOUCLE_art_agenda(ARTICLES){titre_mot=Agenda}{!par date_redac}{age_redac < 1}{0,5}{lang}>
+				<li>[<span>(#DATE_REDAC|affdate)</span>]
+					<a class="lien[(#EXPOSER)] article" href="#URL_ARTICLE" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+
+				</li>
+		</BOUCLE_art_agenda>
+			</ul>
+		</li>
+    <!--[if lte IE 6]><style>#menu-agenda a{height:1em;}#menu-agenda li{height:1em;float:left;clear:both;width:100%}</style><![endif]-->
+    <!--[if IE 6]><style>##menu-agenda li{clear:none;}</style><![endif]-->
+	</ul>
+</div>
+</B_art_agenda>
+
+</div>[(#REM) fin menu ]
+
+</div>[(#REM) navigation ]
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-meta.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-meta.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-meta.html	(revision 30)
@@ -0,0 +1,72 @@
+<!-- META DATA -->
+	<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+	<meta http-equiv="Content-language" content="#LANG" />
+	<meta name="generator" content="SPIP" />
+	<meta name="robots" content="index,follow" />
+	<link rel="schema.DCTERMS"  href="http://purl.org/dc/terms/" />
+	<link rel="schema.DC"       href="http://purl.org/dc/elements/1.1/" />
+<B_article_head><BOUCLE_article_head(ARTICLES) {id_article}>
+  <!-- META article -->
+  [<meta name="Description" content="(#INTRODUCTION|textebrut|entites_html)" />]
+<B_author>  <meta name="Author" content="<BOUCLE_author(AUTEURS){id_article}{", "}>[(#NOM|textebrut|entites_html)]</BOUCLE_author>" /></B_author>
+<B_keywords_article>  <meta name="Keywords" content="<BOUCLE_keywords_article(MOTS){id_article}{", "}>[(#TITRE|supprimer_numero|textebrut|entites_html)]</BOUCLE_keywords_article>" /></B_keywords_article>
+  <!-- META Dublin Core - voir: http://uk.dublincore.org/documents/dcq-html/  -->
+  [<meta name="DC.title" content="(#TITRE|supprimer_numero|textebrut|entites_html)" />
+  ][<meta name="DC.language" scheme="ISO639-1" content="(#LANG)" />
+  ][<meta name="DC.identifier" scheme="DCTERMS.URI" content="(#URL_SITE_SPIP)/][(#URL_ARTICLE)" />
+  ][<meta name="DC.source" scheme="DCTERMS.URI" content="(#URL_SITE_SPIP)" />]<BOUCLE_auteursDC(AUTEURS){id_article}{" "}>
+  <meta name="DC.creator" content="[(#NOM|textebrut|entites_html)]" /></BOUCLE_auteursDC>[
+  <meta name="DC.description" content="(#INTRODUCTION|textebrut|entites_html|attribut_html)" />]<B_subjectDC>
+  <meta name="DC.subject" content="<BOUCLE_subjectDC(MOTS){id_article}{"; "}>[(#TITRE|textebrut|entites_html)]</BOUCLE_subjectDC>" /></B_subjectDC>[
+  <meta name="DC.date" scheme="ISO8601" content="(#DATE|date_iso)" />]
+</BOUCLE_article_head>
+<B_breve_head><BOUCLE_breve_head(BREVES) {id_breve}>
+	<!-- META breve - META news item -->
+	[<meta name="Description" content="(#TITRE|supprimer_numero|textebrut|entites_html)" />]
+	<B_keywords_breve><meta name="Keywords" content="<BOUCLE_keywords_breve(MOTS){id_breve}{","}>[(#TITRE|supprimer_numero|textebrut|entites_html)]</BOUCLE_keywords_breve>" /></B_keywords_breve>
+</BOUCLE_breve_head><BOUCLE_mot_head(MOTS) {id_mot}>
+
+	<!-- META mot-cle - META keyword -->
+	[<meta name="Description" content="(#DESCRIPTIF|textebrut|entites_html)" />]
+	<B_keywords_mot><meta name="Keywords" content="<BOUCLE_keywords_mot(MOTS){id_mot}{","}>[(#TITRE|supprimer_numero|textebrut|entites_html)]</BOUCLE_keywords_mot>" /></B_keywords_mot>
+</BOUCLE_mot_head><BOUCLE_rubrique_head(RUBRIQUES) {id_rubrique}>
+
+	<!-- META rubrique - META section -->
+	[<meta name="Description" content="(#DESCRIPTIF|textebrut|entites_html)" />]
+	<B_keywords_rubrique><meta name="Keywords" content="<BOUCLE_keywords_rubrique(MOTS){id_rubrique}{","}>[(#TITRE|supprimer_numero|textebrut|entites_html)]</BOUCLE_keywords_rubrique>" /></B_keywords_rubrique>
+  <!-- META Dublin Core - voir: http://uk.dublincore.org/documents/dcq-html/  -->
+  [<meta name="DC.title" content="(#TITRE|supprimer_numero|textebrut|entites_html)" />
+  ][<meta name="DC.language" scheme="ISO639-1" content="(#LANG)" />
+  ][<meta name="DC.identifier" scheme="DCTERMS.URI" content="(#URL_SITE_SPIP)/][(#URL_RUBRIQUE)" />
+  ][<meta name="DC.source" scheme="DCTERMS.URI" content="(#URL_SITE_SPIP)" />
+  ][<meta name="DC.description" content="(#INTRODUCTION|textebrut|entites_html|attribut_html)" />]<B_subjectDC_rub>
+  <meta name="DC.subject" content="<BOUCLE_subjectDC_rub(MOTS){id_rubrique}{"; "}>[(#TITRE|textebrut|entites_html)]</BOUCLE_subjectDC_rub>" /></B_subjectDC_rub>[
+  <meta name="DC.date" scheme="ISO8601" content="(#DATE|date_iso)" />]
+</BOUCLE_rubrique_head><BOUCLE_site_head(SITES) {id_syndic}>
+
+  <!-- META site -->
+  [<meta name="Description" content="(#DESCRIPTIF|textebrut|entites_html)" />]
+	<B_keywords_site><meta name="Keywords" content="<BOUCLE_keywords_site(MOTS){id_syndic}{","}>[(#TITRE|supprimer_numero|textebrut|entites_html)]</BOUCLE_keywords_site>" /></B_keywords_site>
+</BOUCLE_site_head>  
+	<!-- META pages recapitulatives - META summary pages -->
+  [<meta name="description" content="(#DESCRIPTIF_SITE_SPIP|couper{150}|attribut_html)" />]<B_keywords_recap>
+  <meta name="keywords" content="<BOUCLE_keywords_recap(RUBRIQUES){racine}{","}>[(#TITRE|supprimer_numero|attribut_html)]</BOUCLE_keywords_recap>" /></B_keywords_recap>
+  <meta name="author" content="<BOUCLE_author_recap(AUTEURS){id_auteur=1}>[(#NOM|textebrut|entites_html)]</BOUCLE_author_recap>" />
+  <!-- META Dublin Core - voir: http://uk.dublincore.org/documents/dcq-html/  -->
+  [<meta name="DC.title" content="(#NOM_SITE_SPIP|textebrut|entites_html)" />
+  ][<meta name="DC.language" scheme="ISO639-1" content="(#LANG)" />
+  ][<meta name="DC.identifier" scheme="DCTERMS.URI" content="(#URL_SITE_SPIP)" />
+  ][<meta name="DC.source" scheme="DCTERMS.URI" content="(#URL_SITE_SPIP)" />]<BOUCLE_recap_auteursDC(AUTEURS){id_auteur=1}>
+  <meta name="DC.creator" content="[(#NOM|textebrut|entites_html)]" /></BOUCLE_recap_auteursDC>[
+  <meta name="DC.description" content="(#DESCRIPTIF_SITE_SPIP|couper{150}|attribut_html)" />]<B_recap_subjectDC>
+  <meta name="DC.subject" content="<BOUCLE_recap_subjectDC(RUBRIQUES){racine}{","}>[(#TITRE|supprimer_numero|textebrut|entites_html)]</BOUCLE_recap_subjectDC>" /></B_recap_subjectDC>[
+  <meta name="DC.date" scheme="ISO8601" content="(#DATE|date_iso)" />]
+
+<//B_site_head><//B_rubrique_head><//B_mot_head><//B_breve_head><//B_article_head>
+
+	[(#REM) Icone dans la barre d'adresse - Icon in address bar
+	][<link rel="shortcut icon" href="(#CHEMIN{favicon.ico})" />]
+
+	[(#REM) Lien vers le(s) fil(s) de syndication RSS - Link(s) to RSS feed(s)
+	][<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:> : [(#NOM_SITE_SPIP|textebrut)]" href="(#URL_PAGE{backend})" />]
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-sommaire-articles.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-sommaire-articles.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-sommaire-articles.html	(revision 30)
@@ -0,0 +1,31 @@
+    <BOUCLE_article_edito(ARTICLES) {lang} {titre_mot=Editorial} {doublons}></BOUCLE_article_edito>
+    <B_article_langue>
+    #ANCRE_PAGINATION
+    <BOUCLE_article_langue(ARTICLES) {lang} {par date} {inverse} {pagination} {doublons}>
+      [<span style="float:right;">(#LOGO_ARTICLE||reduire_image{150,0})</span>]
+			[<div class="surtitre">(#SURTITRE)</div>]
+      <h3><a href="#URL_SITE_SPIP/#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></h3>
+      [<div class="sous-titre">(#SOUSTITRE)</div>]
+      <div class="detail">
+        [(#DATE|nom_jour)] [(#DATE|affdate)]
+        <B_auteurs_langue><:par_auteur:> <BOUCLE_auteurs_langue(AUTEURS) {id_article} {", "}><a href="#URL_SITE_SPIP/[(#URL_AUTEUR)]">#NOM</a></BOUCLE_auteurs_langue>
+      </div><!-- detail -->
+      [<div class="texte">
+      	<div class="extrait">
+      	 (#DESCRIPTIF|sinon{[(#CHAPO|sinon{#TEXTE}|couper{300})]})&nbsp;<b class="separateur">&gt;</b>&nbsp;<a  class="suite" href="#URL_SITE_SPIP/#URL_ARTICLE" title="...<:suite:>" ><:suite:></a>
+      	</div>
+      </div>]
+      <br />
+    </BOUCLE_article_langue>
+
+    [<div class="pagination">
+      <div class="ligne1">
+        <div dir="#LANG_DIR">#TOTAL_BOUCLE/#GRAND_TOTAL <:articles:></div>
+      </div>
+      <div class="ligne2">
+        (#PAGINATION)
+      </div>
+    </div>]
+
+    </B_article_langue>
+    <//B_article_langue>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-sommaire-edito.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-sommaire-edito.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-sommaire-edito.html	(revision 30)
@@ -0,0 +1,30 @@
+   [(#REM) 
+   		On affiche le TITRE, le LOGO et l'INTRODUCTION du plus recent article affecte du mot-cle "Editorial", et ce, pour chaque langue, 
+		- sinon le DESCRIPTIF du SITE
+		- sinon, le DESCRIPTIF de la premiere rubrique racine (par num titre), pour chaque langue
+		- sinon un texte statique de Bienvenue !
+	]<B_articles_edito>
+<BOUCLE_articles_edito(ARTICLES) {lang?} {par date} {inverse} {titre_mot=Editorial} {0,1}>
+      [<h3 class="edito-titre"><a href="#URL_SITE_SPIP/#URL_ARTICLE">(#TITRE|supprimer_numero)</a></h3>]
+      [<span style="float:right;"><a href="#URL_SITE_SPIP/#URL_ARTICLE">(#LOGO_ARTICLE||reduire_image{120,0})</a></span>]
+      [<div class="chapo">(#DESCRIPTIF|sinon{[(#CHAPO|sinon{#TEXTE}|couper{300})]})</div>]
+    </BOUCLE_articles_edito>
+    </B_articles_edito>
+
+	<B_rub_first>
+	<BOUCLE_rub_first(RUBRIQUES)  {racine} {lang?} {par num titre} {0,1}>
+
+[(#DESCRIPTIF_SITE_SPIP|?{	
+		[<h3 class="edito-titre"><:entree_description_site:></h3>
+		<div class="chapo">(#DESCRIPTIF_SITE_SPIP)</div>]
+	,
+    	[<h3 class="edito-titre"><a href="#URL_SITE_SPIP/#URL_RUBRIQUE">(#TITRE|supprimer_numero)</a></h3>]
+        [<span style="float:right;"><a href="#URL_SITE_SPIP/#URL_RUBRIQUE">(#LOGO_RUBRIQUE||reduire_image{120,0})</a></span>]
+        [<div class="chapo">(#DESCRIPTIF|sinon{[(#TEXTE|couper{300})]})</div>]
+})]
+	</BOUCLE_rub_first>
+	</B_rub_first>
+	<INCLURE{fond=inc/inc-install}{lang}>
+	<//B_rub_first>
+    <//B_articles_edito>
+    
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-syndic.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-syndic.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-syndic.html	(revision 30)
@@ -0,0 +1,57 @@
+    <!-- Sur le Web -->
+
+    <B_art_syndic>
+      <div class="menu rub">
+      <ul>
+        <li><a href="#URL_PAGE{site}" title="<:autres_sites:>"><:nouveautes_web:></a>
+          <ul>
+
+            <BOUCLE_art_syndic(SYNDIC_ARTICLES) {id_rubrique} {par date} {inverse} {0,5}>
+            <li>[<span>(#DATE|affdate)</span>]
+                [<a href="#URL_ARTICLE" [title="<:form_prop_nom_site:> : (#NOM_SITE|supprimer_tags|attribut_html)"]>(#TITRE*|supprimer_numero|couper{60})</a>]
+            </li>
+            </BOUCLE_art_syndic>
+
+          </ul>
+        </li>
+      </ul>
+      </div><!-- menu -->                
+    </B_art_syndic>
+
+    <B_art_syndic2>
+      <div class="menu rub">
+      <ul>
+        <li><a href="#URL_PAGE{site}" title="<:autres_sites:>"><:nouveautes_web:></a>
+          <ul>
+
+            <BOUCLE_art_syndic2(SYNDIC_ARTICLES) {par date}{inverse} {0,10}>
+            <li>[<span>(#DATE|affdate)</span>]
+                [<a href="#URL_ARTICLE" [title="<:form_prop_nom_site:> : (#NOM_SITE|supprimer_tags|attribut_html)"]>(#TITRE*|supprimer_numero|couper{60})</a>]
+            </li>
+            </BOUCLE_art_syndic2>
+
+          </ul>
+        </li>
+      </ul>
+      </div><!-- menu -->                
+    </B_art_syndic2>
+
+    <//B_art_syndic>
+      	
+    <B_sites>
+      <div class="menu rub">
+      <ul>
+        <li><a href="#URL_PAGE{site}" title="<:autres_sites:>"><:sites_web:></a>
+          <ul>
+            <BOUCLE_sites(SITES) {syndication=non} {id_rubrique} {par nom_site} {0,5}>
+            <li>
+                [<a href="#URL_SITE" [title="(#DESCRIPTIF|supprimer_tags|attribut_html)"]>(#NOM_SITE)</a>]
+            </li>            
+            </BOUCLE_sites>
+          </ul>
+        </li>
+      </ul>
+      </div><!-- menu -->
+    </B_sites>
+
+    
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-trad.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-trad.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/inc/inc-trad.html	(revision 30)
@@ -0,0 +1,27 @@
+#CACHE{0}
+[(#REM)
+    	Articles recents - autres langues 
+    	New articles - other languages 
+
+]    <BOUCLE_articles_langue(ARTICLES) {lang}{doublons}></BOUCLE_articles_langue>
+    <B_articles>
+    <div class="menu">
+    <h2 class="structure"><:info_multilinguisme:></h2>
+      <ul>
+        <li><b><:info_langues:><br />
+              <small><:articles_recents:></small>
+            </b>
+          <ul>
+
+            <BOUCLE_articles(ARTICLES) {doublons}{par date} {inverse} {0,3}>
+          	<li>[<span>(#DATE|affdate)[ - <dfn class="lang">(#LANG|traduire_nom_langue)</dfn>]</span>] 
+          	    
+              <a href="#URL_SITE_SPIP/spip.php?action=cookie&amp;url=#URL_SITE_SPIP%2F#URL_ARTICLE&amp;var_lang=#LANG" hreflang="#LANG" [title="(#INTRODUCTION|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+          	</li>
+            </BOUCLE_articles>
+          </ul>
+        </li>
+
+      </ul>
+    </div><!-- menu -->
+    </B_articles>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/js/base.js
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/js/base.js	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/js/base.js	(revision 30)
@@ -0,0 +1,9 @@
+function deplier(objet){
+	d = document.getElementById(objet);
+	var etat = d.style.display;
+	if (etat!='none') {
+	d.style.display = 'none';
+	} else {
+	d.style.display = 'block';
+	}
+}
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_ber_tam.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_ber_tam.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_ber_tam.php	(revision 30)
@@ -0,0 +1,206 @@
+<?php
+
+// Tous les fichiers de la langue berbere (tamazigh) n'etant pas encore
+// trduits, nous fournissons ici un exemple de fichier de langue
+// utilisees par le squelette ALTERNATIVES. Il s'agit du fichier
+// /squelettes/lang/local_ber_tam.php3. Laissez-le a cet endroit, 
+// SPIP va le reconnaitre.
+
+// Pour toutes les langues de SPIP disposant de fichiers de langues
+// complets, il n'est pas necessaire d'operer une telle traduction.
+//
+// Voir aussi : /squelettes/lang/public_ber_tam.php3.
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+// Reprise integral de ecrire/lang/public_ber_tam.php3
+
+// A
+'accueil_site' => 'Asbrrek',
+'articles' => 'Imagraden',
+'articles_auteur' => 'Imagraden n umara yad', 
+'articles_populaires' => 'Imagraden bahra itawassen', 
+'articles_recents' => 'Imagraden n wasa', 
+'articles_rubrique' => 'Imagraden n tarslt ad', 
+'aucun_article' => 'Amagrad war ansa', 
+'aucun_auteur' => 'Amara war tansa', 
+'aucun_site' => 'Tansa tar site', 
+'aucune_breve' => 'Tansa tar azigzul', 
+'aucune_rubrique' => 'Tansa tar tarslt', 
+'autres_breves' => 'Izigzulen yad&ecirc;n', 
+'autres_groupes_mots_clefs' => 'Tirabbutin yad&ecirc;n', 
+'autres_sites' => 'Sites yad&ecirc;n', 
+
+
+// B
+'bonjour' => 'Azul', 
+'breves' => 'Izigzulen', 
+
+
+// C
+'commenter_site' => 'Sawel f cite ad', 
+
+
+// D
+'date' => 'Azemz', 
+'dernier_ajout' => 'Assrnu igwran', 
+'dernieres_breves' => 'Inghmisen gzzulnin',
+'derniers_articles' => 'Amagrad amggaru', 
+'derniers_commentaires' => 'Iwaliwen ggranin', 
+'derniers_messages_forum' => 'Izen gran g isuyas', 
+
+
+// E
+'edition_mode_texte' => 'Tirra s tgharast n adr&icirc;s', 
+'en_reponse' => 'Tamrarut i', 
+'en_resume' => 'Azigzul',
+'envoyer_message' => 'Azen yuwen izen', 
+'espace_prive' => 'Asays n iswingimen',
+
+
+// F
+'forum' => 'Asays', 
+
+
+// H
+'hierarchie_site' => 'Tusska n usays', 
+
+
+// J
+'jours' => 'Ussan', 
+
+
+// M
+'meme_auteur' => 'Amara lli nit', 
+'meme_rubrique' => 'Gh tarslt lli nit', 
+'memes_auteurs' => 'Imaraten lli nit', 
+'message' => 'Izen',  
+'messages_forum' => 'Izen n usays',
+'messages_recents' => 'Izen n isuyas n wasa', 
+'mots_clefs' => 'Tiguriwin', 
+'mots_clefs_meme_groupe' => 'Tiguriwin', 
+
+
+// N
+'navigation' => 'Amuddu', 
+'nom' => 'Assagh', 
+'nouveautes' => 'Imaynuten', 
+'nouveautes_web' => 'Imaynuten n Web', 
+'nouveaux_articles' => 'Imagraden imaynuten', 
+'nouvelles_breves' => 'Izigzulen imaynuten', 
+
+
+// P
+'page_precedente' => 'Tifrt izrin', 
+'page_suivante' => 'Tifrt d iddan', 
+'par_auteur' => 's umara',
+'participer_site' => 'Tzmerem ad tawsem g tudert n site ad s isumar nun.',
+'plan_site' => 'Plan n site',
+'popularite' => 'Popularit&eacute;',  
+'poster_message' => 'Azen yun izen',
+'proposer_site' => 'Tzmerem ad trnum kra',
+
+
+// R
+'repondre_article' => 'Rar ghef amagrad ad', 
+'repondre_breve' => 'Rar xef azigzul ad', 
+'repondre_message' => 'Rar f izen nad', 
+'resultats_recherche' => 'Tanattaft n trzzut', 
+'retour_debut_forums' => 'Ughul gher ixef n usays', 
+'rubrique' => 'Tarslt', 
+'rubriques' => 'Tirsal', 
+
+
+// S
+'signatures_petition' => 'Takbabt', 
+'site_realise_avec_spip' => 'Site ittugan s SPIP',
+'sites_web' => 'Sites Web',
+'sous_rubriques' => 'Tarslt mzzin', 
+'suite' => 'Andfer', 
+'sur_web' => 'Iggi n Web', 
+'syndiquer_rubrique' => 'Zdi tarslt ad',
+'syndiquer_site' => 'Zdi site akw', 
+
+
+// T
+'texte_lettre_information' => 'Had tabrat n unghmis n site', 
+'texte_lettre_information_2' => 'Tabrat ad ar tsghal imagraden d izigzulen yad illan', 
+
+
+// V
+'ver_imprimer' => 'Ssfegh iggi n tifrt', 
+'voir_en_ligne' => 'Z&ecirc;r iggi n ud&ecirc;rf', 
+
+
+// Extraits de ecrire/lang/spip_fr.php3
+'bouton_changer' => 'Ssenfl',
+'bouton_choisir' => 'Sti',
+'bouton_radio_syndication' => 'Ughul izdin d sites yad&ecirc;n',
+'date_jour_1' => 'Asamas', 
+'date_jour_2' => 'Aynas', 
+'date_jour_3' => 'Asinas', 
+'date_jour_4' => 'Akras', 
+'date_jour_5' => 'Akwas', 
+'date_jour_6' => 'Asimwas', 
+'date_jour_7' => 'As&icirc;dwas', 
+'date_jours' => 'Ussan', 
+'date_minutes' => 'Tusdadin', 
+'date_mois' => 'Iyyuren', 
+'date_mois_1' => 'Innayer', 
+'date_mois_10' => 'Ktuber', 
+'date_mois_11' => 'Nwanbir', 
+'date_mois_12' => 'Djambir', 
+'date_mois_2' => 'Brayer', 
+'date_mois_3' => 'mars',
+'date_mois_4' => 'Ibril', 
+'date_mois_5' => 'Mayyu', 
+'date_mois_6' => 'Yunyu',  
+'date_mois_7' => 'Yulyuz', 
+'date_mois_8' => 'Ghuct', 
+'date_mois_9' => 'Cutanbir', 
+'icone_agenda' => 'Tamssktut', 
+'icone_tous_auteur' => 'Imaraten q&agrave;h', 
+'icone_sites_references' => 'Sites n ughul',
+'info_annonce' => 'ALGHU', 
+'info_annonces_generales' => 'Ilghuten imattuten', 
+'info_envoyer_message_prive' => 'Azen at izen &icirc;zlin i umara yad', 
+'info_auteurs_nombre' => 'Amara (Imaraten)', 
+'info_erreur_requete' => 'Azgal g tutra :', 
+'info_rechercher' => 'Rzu', 
+'info_visites' => 'Tinrziwt:', 
+'form_prop_nom_site' => 'Assagh n site', 
+'lien_petitions' => 'TASUMERT',
+'login_acces_prive' => 'Akchum gher usays &icirc;zlin;', 
+'login_motpasseoublie' => 'Taguri n uzzruy ittwattun', 
+'login_retour_public' => 'Ughul s site unbiz ', 
+'login_sinscrire' => 'Azemmem', 
+'pass_erreur' => 'Azgal',
+'pass_ok' => 'WAXXA', 
+'pass_vousinscrire' => 'Ad tzemmem g site ad', 
+'precedent' => 'Izrin', 
+'suivant' => 'D iddan', 
+
+// Extraits de ecrire/lang/spip_fr.php3
+'avis_aucun_resultat' => 'Walu agm&ucirc;d.', 
+'avis_aucun_resultat' => 'Walu agm&ucirc;d.', 
+'avis_chemin_invalide_1' => 'Abrid tstim', 
+'avis_chemin_invalide_2' => 'Amya, ughul s tifrt izrin talst inghmisen nek.',
+'bouton_annonce' => 'ALGHU',
+'info_articles_lies_mot' => 'Imagraden izdin d taguri n urzzum', 
+'info_articles_trouves' => 'Imagraden ittwafan', 
+'info_auteurs_trouves' => 'Imaraten ittwafan', 
+'info_breves_liees_mot' => 'Izigzulen izdin d taguri n urzzum', 
+'info_breves_touvees' => 'Izigzulen ittwafan', 
+'info_contact' => 'Anermis', 
+'info_dans_groupe' => 'G trabbut:', 
+'info_rubriques_liees_mot' => 'Tirsal izdin d taguri n urzzum ad', 
+'info_rubriques_trouvees' => 'Tirsal ittwafan', 
+'info_sites_lies_mot' => 'Sites n ughul izdin d taguri n urzzum', 
+'info_sites_trouves' => 'Sites ittwafan', 
+'info_sites' => 'sites',
+
+
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_fr.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_fr.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_fr.txt	(revision 30)
@@ -0,0 +1,232 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+//
+// Bien qu'il ne soit pas necessaire de traduire ce fichier pour les
+// langues dont SPIP dispose de fichiers de langues, il est possible de 
+// personnaliser les chaines de caracteres multilingues utilises par le
+// squelette ALTERNATIVES ou bien de les traduire dans une langue dont SPIP 
+// ne dispose pas encore de fichier de langues (un exemple en berbere (tamazigh) 
+// est fourni dans le present dossier.
+//
+// INSTRUCTIONS pour personnalisation.
+// 1. Placez le present fichier dans votre dossier thematique de personnalisation.
+// 2. Renommez-le 'local_fr.php' pour le francais ou 'local_xx.php' pour la langue voulue.
+//    Exemple : /themes/perso-mon_theme/lang/local_fr.php
+// 3. Traduire dans la langue voulue ce qui se trouve apres le signe =>
+//    
+// Exemple de fichiers de langues :
+//		local_fr.php
+//		local_en.php
+//		local_es.php
+//		etc...
+// 
+// Vous pouvez aussi dnas le fichier lang/local_xx.php 
+// ne conserver que les chaines de carateres a personnaliser, 
+// les autres continuant a etre gere par les fichiers de langues de SPIP
+// dans /ecrire/lang/.
+// (voir aussi : http://www.spip.net/fr_article2128.html )
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+// Reprise integrale de ecrire/lang/public_fr.php
+
+// A
+'accueil_site' => 'Accueil du site',
+'articles' => 'Articles',
+'articles_auteur' => 'Articles de cet auteur',
+'articles_populaires' => 'Articles les plus populaires',
+'articles_recents' => 'Articles les plus r&eacute;cents',
+'articles_rubrique' => 'Articles de cette rubrique',
+'aucun_article' => 'Il n\'y a pas d\'article &agrave; cette adresse',
+'aucun_auteur' => 'Il n\'y a pas d\'auteur &agrave; cette adresse',
+'aucun_site' => 'Il n\'y a pas de site &agrave; cette adresse',
+'aucune_breve' => 'Il n\'y a pas de br&egrave;ve &agrave; cette adresse',
+'aucune_rubrique' => 'Il n\'y a pas de rubrique &agrave; cette adresse',
+'autres_breves' => 'Autres br&egrave;ves',
+'autres_groupes_mots_clefs' => 'Autres groupes de mots-cl&eacute;s',
+'autres_sites' => 'Autres sites',
+
+
+// B
+'bonjour' => 'Bonjour',
+'breves' => 'Br&egrave;ves',
+
+
+// C
+'commenter_site' => 'Commenter ce site',
+
+
+// D
+'date' => 'Date',
+'dernier_ajout' => 'Dernier ajout',
+'dernieres_breves' => 'Derni&egrave;res br&egrave;ves',
+'derniers_articles' => 'Derniers articles',
+'derniers_commentaires' => 'Derniers commentaires',
+'derniers_messages_forum' => 'Derniers messages publi&eacute;s dans les forums',
+
+
+// E
+'edition_mode_texte' => '&Eacute;dition en mode texte de',
+'en_reponse' => 'En r&eacute;ponse &agrave;&nbsp;:',
+'en_resume' => 'En r&eacute;sum&eacute;',
+'envoyer_message' => 'Envoyer un message',
+'espace_prive' => 'Espace priv&eacute;',
+
+
+// F
+'forum' => 'Forum',
+
+
+// H
+'hierarchie_site' => 'Hi&eacute;rarchie du site',
+
+
+// J
+'jours' => 'jours',
+
+
+// M
+'meme_auteur' => 'Du m&ecirc;me auteur',
+'meme_rubrique' => 'Dans la m&ecirc;me rubrique',
+'memes_auteurs' => 'Des m&ecirc;mes auteurs',
+'message' => 'Message',
+'messages_forum' => 'Messages de forum',
+'messages_recents' => 'Messages de forums les plus r&eacute;cents',
+'mots_clefs' => 'Mots-cl&eacute;s',
+'mots_clefs_meme_groupe' => 'Mots-cl&eacute;s dans le m&ecirc;me groupe',
+
+
+// N
+'navigation' => 'Navigation',
+'nom' => 'Nom',
+'nouveautes' => 'Les nouveaut&eacute;s',
+'nouveautes_web' => 'Nouveaut&eacute;s sur le Web',
+'nouveaux_articles' => 'Nouveaux articles',
+'nouvelles_breves' => 'Nouvelles br&egrave;ves',
+
+
+// P
+'page_precedente' => 'page pr&eacute;c&eacute;dente',
+'page_suivante' => 'page suivante',
+'par_auteur' => 'par ',
+'participer_site' => 'Vous pouvez participer &agrave; la vie de ce site et proposer vos propres articles en vous inscrivant ci-dessous. Vous recevrez imm&eacute;diatement un email vous indiquant vos codes d\'acc&egrave;s &agrave; l\'espace priv&eacute; du site.',
+'plan_site' => 'Plan du site',
+'popularite' => 'Popularit&eacute;',
+'poster_message' => 'Poster un message',
+'proposer_site' => 'Vous pouvez proposer un site &agrave; ajouter dans cette rubrique&nbsp;:',
+
+
+// R
+'repondre_article' => 'R&eacute;pondre &agrave; cet article',
+'repondre_breve' => 'R&eacute;pondre &agrave; cette br&egrave;ve',
+'repondre_message' => 'R&eacute;pondre &agrave; ce message',
+'resultats_recherche' => 'R&eacute;sultats de la recherche',
+'retour_debut_forums' => 'Retour au d&eacute;but des forums',
+'rubrique' => 'Rubrique',
+'rubriques' => 'Rubriques',
+
+
+// S
+'signatures_petition' => 'Signatures',
+'site_realise_avec_spip' => 'Site r&eacute;alis&eacute; avec SPIP',
+'sites_web' => 'Sites Web',
+'sous_rubriques' => 'Sous-rubriques',
+'suite' => 'suite',
+'sur_web' => 'Sur le Web',
+'syndiquer_rubrique' => 'Syndiquer cette rubrique',
+'syndiquer_site' => 'Syndiquer tout le site',
+
+
+// T
+'texte_lettre_information' => 'Voici la lettre d\'information du site',
+'texte_lettre_information_2' => 'Cette lettre recense les articles et les br&egrave;ves publi&eacute;s depuis',
+
+
+// V
+'ver_imprimer' => 'Version &agrave; imprimer',
+'voir_en_ligne' => 'Voir en ligne',
+
+// Extraits de ecrire/lang/ecrire_fr.php
+'avis_aucun_resultat' => 'Aucun r&eacute;sultat.',
+'avis_chemin_invalide_1' => 'Le chemin que vous avez choisi',
+'avis_chemin_invalide_2' => 'ne semble pas valide. Veuillez retourner &agrave; la page pr&eacute;c&eacute;dente et v&eacute;rifier les informations fournies.',
+'bouton_annonce' => 'ANNONCE',
+'info_articles_lies_mot' => 'Les articles li&eacute;s &agrave; ce mot-cl&eacute;',
+'info_articles_trouves' => 'Articles trouv&eacute;s',
+'info_auteurs_trouves' => 'Auteurs trouv&eacute;s',
+'info_breves_liees_mot' => 'Les br&egrave;ves li&eacute;es &agrave; ce mot-cl&eacute;',
+'info_breves_touvees' => 'Br&egrave;ves trouv&eacute;es',
+'info_contact' => 'Contact',
+'info_dans_groupe' => 'Dans le groupe :',
+'info_langues' => 'Langues du site',
+'info_mots_cles' => 'Les mots-cl&eacute;s',
+'info_rubriques_liees_mot' => 'Les rubriques li&eacute;es &agrave; ce mot-cl&eacute;',
+'info_rubriques_trouvees' => 'Rubriques trouv&eacute;es',
+'info_sites_lies_mot' => 'Les sites r&eacute;f&eacute;renc&eacute;s li&eacute;s &agrave; ce mot-cl&eacute;',
+'info_sites_trouves' => 'Sites trouv&eacute;s',
+'info_sites' => 'sites',
+'info_visites_par_mois' => 'Affichage par mois :',
+'titre_evolution_visite' => '&Eacute;volution des visites',
+'titre_langue_trad_article' => 'LANGUE ET TRADUCTIONS DE L\'ARTICLE',
+'titre_sites_syndiques' => 'Les sites syndiqu&eacute;s',
+
+
+// Extraits de ecrire/lang/spip_fr.php
+'bouton_changer' => 'Changer',
+'bouton_choisir' => 'Choisir',
+'bouton_radio_syndication' => 'Syndication :',
+'date_jour_1' => 'dimanche',
+'date_jour_2' => 'lundi',
+'date_jour_3' => 'mardi',
+'date_jour_4' => 'mercredi',
+'date_jour_5' => 'jeudi',
+'date_jour_6' => 'vendredi',
+'date_jour_7' => 'samedi',
+'date_jours' => 'jours',
+'date_minutes' => 'minutes',
+'date_mois' => 'mois',
+'date_mois_1' => 'janvier',
+'date_mois_10' => 'octobre',
+'date_mois_11' => 'novembre',
+'date_mois_12' => 'd&eacute;cembre',
+'date_mois_2' => 'f&eacute;vrier',
+'date_mois_3' => 'mars',
+'date_mois_4' => 'avril',
+'date_mois_5' => 'mai',
+'date_mois_6' => 'juin',
+'date_mois_7' => 'juillet',
+'date_mois_8' => 'ao&ucirc;t',
+'date_mois_9' => 'septembre',
+'icone_agenda' => 'Agenda',
+'icone_brouteur' => 'Navigation rapide',
+'icone_statistiques_visites' => 'Statistiques',
+'icone_tous_auteur' => 'Tous les auteurs',
+'icone_sites_references' => 'Sites r&eacute;f&eacute;renc&eacute;s',
+'info_annonce' => 'ANNONCE',
+'info_annonces_generales' => 'Annonces g&eacute;n&eacute;rales&nbsp;:',
+'info_auteurs_nombre' => 'auteur(s)&nbsp;:',
+'info_envoyer_message_prive' => 'Envoyer un message priv&eacute; &agrave; cet auteur',
+'info_erreur_requete' => 'Erreur dans la requ&ecirc;te :',
+'info_multilinguisme' => 'Multilinguisme',
+'info_rechercher' => 'Rechercher',
+'info_visites' => 'visites :',
+'form_prop_nom_site' => 'Nom du site',
+'lien_petitions' => 'P&Eacute;TITION',
+'login_acces_prive' => 'acc&egrave;s &agrave; l\'espace priv&eacute;',
+'login_motpasseoublie' => 'mot&nbsp;de&nbsp;passe&nbsp;oubli&eacute;&nbsp;?',
+'login_retour_public' => 'Retour au site public',
+'login_sinscrire' => 's\'inscrire',
+'onglet_repartition_lang' => 'R&eacute;partition par langues',
+'pass_erreur' => 'Erreur',
+'pass_ok' => 'OK',
+'pass_vousinscrire' => 'Vous inscrire sur ce site',
+'precedent' => 'pr&eacute;c&eacute;dent',
+'suivant' => 'suivant',
+'titre_statistiques' => 'Statistiques du site',
+
+
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_total_fr.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_total_fr.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/lang/local_total_fr.txt	(revision 30)
@@ -0,0 +1,645 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+//
+// Ce fichier de langue recence les chaines de caracteres pertinentes
+// disponibles dans toutes les langues geres par SPIP.
+//
+// Pour les utiliser dans vos squelettes, il suffit de les inserer sous
+// la forme suivante :
+//     <:accueil_site:>
+// ____________________
+
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+// Reprise integrale de ecrire/lang/public_fr.php
+
+// A
+'accueil_site' => 'Accueil du site',
+'articles' => 'Articles',
+'articles_auteur' => 'Articles de cet auteur',
+'articles_populaires' => 'Articles les plus populaires',
+'articles_recents' => 'Articles les plus r&eacute;cents',
+'articles_rubrique' => 'Articles de cette rubrique',
+'aucun_article' => 'Il n\'y a pas d\'article &agrave; cette adresse',
+'aucun_auteur' => 'Il n\'y a pas d\'auteur &agrave; cette adresse',
+'aucun_site' => 'Il n\'y a pas de site &agrave; cette adresse',
+'aucune_breve' => 'Il n\'y a pas de br&egrave;ve &agrave; cette adresse',
+'aucune_rubrique' => 'Il n\'y a pas de rubrique &agrave; cette adresse',
+'autres_breves' => 'Autres br&egrave;ves',
+'autres_groupes_mots_clefs' => 'Autres groupes de mots-cl&eacute;s',
+'autres_sites' => 'Autres sites',
+
+
+// B
+'bonjour' => 'Bonjour',
+'breves' => 'Br&egrave;ves',
+
+
+// C
+'commenter_site' => 'Commenter ce site',
+
+
+// D
+'date' => 'Date',
+'dernier_ajout' => 'Dernier ajout',
+'dernieres_breves' => 'Derni&egrave;res br&egrave;ves',
+'derniers_articles' => 'Derniers articles',
+'derniers_commentaires' => 'Derniers commentaires',
+'derniers_messages_forum' => 'Derniers messages publi&eacute;s dans les forums',
+
+
+// E
+'edition_mode_texte' => '&Eacute;dition en mode texte de',
+'en_reponse' => 'En r&eacute;ponse &agrave;&nbsp;:',
+'en_resume' => 'En r&eacute;sum&eacute;',
+'envoyer_message' => 'Envoyer un message',
+'espace_prive' => 'Espace priv&eacute;',
+
+
+// F
+'forum' => 'Forum',
+
+
+// H
+'hierarchie_site' => 'Hi&eacute;rarchie du site',
+
+
+// J
+'jours' => 'jours',
+
+
+// M
+'meme_auteur' => 'Du m&ecirc;me auteur',
+'meme_rubrique' => 'Dans la m&ecirc;me rubrique',
+'memes_auteurs' => 'Des m&ecirc;mes auteurs',
+'message' => 'Message',
+'messages_forum' => 'Messages de forum',
+'messages_recents' => 'Messages de forums les plus r&eacute;cents',
+'mots_clefs' => 'Mots-cl&eacute;s',
+'mots_clefs_meme_groupe' => 'Mots-cl&eacute;s dans le m&ecirc;me groupe',
+
+
+// N
+'navigation' => 'Navigation',
+'nom' => 'Nom',
+'nouveautes' => 'Les nouveaut&eacute;s',
+'nouveautes_web' => 'Nouveaut&eacute;s sur le Web',
+'nouveaux_articles' => 'Nouveaux articles',
+'nouvelles_breves' => 'Nouvelles br&egrave;ves',
+
+
+// P
+'page_precedente' => 'page pr&eacute;c&eacute;dente',
+'page_suivante' => 'page suivante',
+'par_auteur' => 'par ',
+'participer_site' => 'Vous pouvez participer &agrave; la vie de ce site et proposer vos propres articles en vous inscrivant ci-dessous. Vous recevrez imm&eacute;diatement un email vous indiquant vos codes d\'acc&egrave;s &agrave; l\'espace priv&eacute; du site.',
+'plan_site' => 'Plan du site',
+'popularite' => 'Popularit&eacute;',
+'poster_message' => 'Poster un message',
+'proposer_site' => 'Vous pouvez proposer un site &agrave; ajouter dans cette rubrique&nbsp;:',
+
+
+// R
+'repondre_article' => 'R&eacute;pondre &agrave; cet article',
+'repondre_breve' => 'R&eacute;pondre &agrave; cette br&egrave;ve',
+'repondre_message' => 'R&eacute;pondre &agrave; ce message',
+'resultats_recherche' => 'R&eacute;sultats de la recherche',
+'retour_debut_forums' => 'Retour au d&eacute;but des forums',
+'rubrique' => 'Rubrique',
+'rubriques' => 'Rubriques',
+
+
+// S
+'signatures_petition' => 'Signatures',
+'site_realise_avec_spip' => 'Site r&eacute;alis&eacute; avec SPIP',
+'sites_web' => 'Sites Web',
+'sous_rubriques' => 'Sous-rubriques',
+'suite' => 'suite',
+'sur_web' => 'Sur le Web',
+'syndiquer_rubrique' => 'Syndiquer cette rubrique',
+'syndiquer_site' => 'Syndiquer tout le site',
+
+
+// T
+'texte_lettre_information' => 'Voici la lettre d\'information du site',
+'texte_lettre_information_2' => 'Cette lettre recense les articles et les br&egrave;ves publi&eacute;s depuis',
+
+
+// V
+'ver_imprimer' => 'Version &agrave; imprimer',
+'voir_en_ligne' => 'Voir en ligne'
+
+// Extraits de ecrire/lang/ecrire_fr.php
+'auteur' => 'Auteur&nbsp;:',
+'avis_acces_interdit' => 'Acc&egrave;s interdit.',
+'avis_article_modifie' => 'Attention, @nom_auteur_modif@ a travaill&eacute; sur cet article il y a @date_diff@ minutes',
+'avis_aucun_resultat' => 'Aucun r&eacute;sultat.',
+'avis_chemin_invalide_1' => 'Le chemin que vous avez choisi',
+'avis_chemin_invalide_2' => 'ne semble pas valide. Veuillez retourner &agrave; la page pr&eacute;c&eacute;dente et v&eacute;rifier les informations fournies.',
+'avis_connexion_echec_2' => 'Revenez &agrave; la page pr&eacute;c&eacute;dente, et v&eacute;rifiez les informations que vous avez fournies.',
+'avis_non_acces_message' => 'Vous n\'avez pas acc&egrave;s &agrave; ce message.',
+'avis_non_acces_page' => 'Vous n\'avez pas acc&egrave;s &agrave; cette page.',
+'avis_site_introuvable' => 'Site introuvable',
+
+'bouton_annonce' => 'ANNONCE',
+'bouton_checkbox_qui_attribue_mot_cle_administrateurs' => 'les administrateurs du site',
+'bouton_checkbox_qui_attribue_mot_cle_redacteurs' => 'les r&eacute;dacteurs',
+'bouton_radio_afficher' => 'Afficher',
+'bouton_radio_syndication' => 'Syndication :',
+'bouton_redirection' => 'REDIRECTION',
+'bouton_suivant' => 'Suivant',
+
+'date_mot_heures' => 'heures',
+
+'email' => 'email',
+'email_2' => 'email :',
+'entree_adresse_email' => 'Votre adresse email',
+'entree_adresse_fichier_syndication' => 'Adresse du fichier de syndication&nbsp;:',
+'entree_description_site' => 'Description du site',
+
+'ical_titre_mailing' => 'Mailing-list',
+'ical_titre_rss' => 'Fichiers de syndication',
+'icone_calendrier' => 'Calendrier',
+'icone_ecrire_nouvel_article' => 'Les br&egrave;ves contenues dans cette rubrique',
+'icone_retour_article' => 'Retour &agrave; l\'article',
+'info_article' => 'article',
+'info_article_2' => 'articles',
+'info_articles_2' => 'Articles',
+'info_articles_auteur' => 'Les articles de cet auteur',
+'info_articles_lies_mot' => 'Les articles li&eacute;s &agrave; ce mot-cl&eacute;',
+'info_articles_trouves' => 'Articles trouv&eacute;s',
+'info_aujourdhui' => 'aujourd\'hui&nbsp;:',
+'info_auteur_message' => 'AUTEUR DU MESSAGE :',
+'info_auteurs' => 'Les auteurs',
+'info_auteurs_trouves' => 'Auteurs trouv&eacute;s',
+'info_avertissement' => 'Avertissement',
+'info_breves_liees_mot' => 'Les br&egrave;ves li&eacute;es &agrave; ce mot-cl&eacute;',
+'info_breves_touvees' => 'Br&egrave;ves trouv&eacute;es',
+'info_contact' => 'Contact',
+'info_contenu_articles' => 'Contenu des articles',
+'info_dans_groupe' => 'Dans le groupe :',
+'info_dans_rubrique' => 'Dans la rubrique :',
+'info_date_publication_anterieure' => 'Date de r&eacute;daction ant&eacute;rieure :',
+'info_date_referencement' => 'DATE DE R&Eacute;F&Eacute;RENCEMENT DE CE SITE&nbsp;:',
+'info_derniere_syndication' => 'La derni&egrave;re syndication de ce site a &eacute;t&eacute; effectu&eacute;e le',
+'info_descriptif' => 'Descriptif :',
+'info_discussion_cours' => 'Discussions en cours',
+'info_email_envoi' => 'Adresse email d\'envoi (optionnel)',
+'info_envoi_email_automatique' => 'Envoi de mails automatique',
+'info_envoyer_maintenant' => 'Envoyer maintenant',
+'info_forum_statistiques' => 'Statistiques des visites',
+'info_hier' => 'hier&nbsp;:',
+'info_historique' => 'R&eacute;visions&nbsp;:',
+'info_jours' => 'jours',
+'info_lien_hypertexte' => 'Lien hypertexte :',
+'info_liens_syndiques_1' => 'liens syndiqu&eacute;s',
+'info_liens_syndiques_3' => 'forums',
+'info_liens_syndiques_4' => 'sont',
+'info_liens_syndiques_5' => 'forum',
+'info_liens_syndiques_6' => 'est',
+'info_langues' => 'Langues du site',
+'info_message' => 'Message du',
+'info_message_technique' => 'Message technique :',
+'info_messagerie_interne' => 'Messagerie interne',
+'info_moteur_recherche' => 'Moteur de recherche int&eacute;gr&eacute;',
+'info_mots_cles' => 'Les mots-cl&eacute;s',
+'info_moyenne' => 'moyenne&nbsp;:',
+'info_multi_cet_article' => 'Langue de cet article&nbsp;:',
+'info_nom' => 'Nom',
+'info_nom_destinataire' => 'Nom du destinataire',
+'info_nouveaux_message' => 'Nouveaux messages',
+'info_nouvel_article' => 'Nouvel article',
+'info_page_interdite' => 'Page interdite',
+'info_pas_de_forum' => 'pas de forum',
+'info_passe_trop_court' => 'Mot de passe trop court.',
+'info_popularite_2' => 'popularit&eacute; du site&nbsp;:',
+'info_post_scriptum' => 'Post-Scriptum',
+'info_post_scriptum_2' => 'Post-scriptum :',
+'info_pour' => 'pour',
+'info_ps' => 'P.-S.',
+'info_redacteurs' => 'R&eacute;dacteurs',
+'info_redaction_en_cours' => 'EN COURS DE R&Eacute;DACTION',
+'info_redirection' => 'Redirection',
+'info_redacteur_1' => 'R&eacute;dacteur',
+'info_resultat_recherche' => 'R&eacute;sultats de la recherche :',
+'info_rubriques' => 'Rubriques',
+'info_rubriques_02' => 'rubriques',
+'info_rubriques_liees_mot' => 'Les rubriques li&eacute;es &agrave; ce mot-cl&eacute;',
+'info_rubriques_trouvees' => 'Rubriques trouv&eacute;es',
+'info_signatures' => 'signatures',
+'info_site' => 'Site',
+'info_site_2' => 'site :',
+'info_site_min' => 'site',
+'info_site_reference_2' => 'Site r&eacute;f&eacute;renc&eacute;',
+'info_site_syndique' => 'Ce site est syndiqu&eacute;...',
+'info_site_web' => 'SITE WEB :',
+'info_sites' => 'sites',
+'info_sites_lies_mot' => 'Les sites r&eacute;f&eacute;renc&eacute;s li&eacute;s &agrave; ce mot-cl&eacute;',
+'info_sites_trouves' => 'Sites trouv&eacute;s',
+'info_sites' => 'sites',
+'info_sous_titre' => 'Soustitre :',
+'info_statut_administrateur' => 'Administrateur',
+'info_statut_redacteur' => 'R&eacute;dacteur',
+'info_statut_site_1' => 'Ce site est&nbsp;:',
+'info_surtitre' => 'Surtitre :',
+'info_texte_explicatif' => 'Texte explicatif',
+'info_texte_message_02' => 'Texte du message',
+'info_titre' => 'Titre :',
+'info_total' => 'total :',
+'info_tous_articles_presents' => 'Tous les articles publi&eacute;s dans cette rubrique',
+'info_tous_les' => 'tous les :',
+'info_tout_site' => 'Tout le site',
+'info_tout_site2' => 'L\'article n\'a pas &eacute;t&eacute; traduit dans cette langue.',
+'info_tout_site5' => 'Article original.',
+'info_un_article' => 'un article,',
+'info_un_mot' => 'Un seul mot &agrave; la fois',
+'info_un_site' => 'un site,',
+'info_une_breve' => 'une br&egrave;ve,',
+'info_une_rubrique' => 'une rubrique,',
+'info_une_rubrique_02' => '1 rubrique',
+'info_url' => 'URL&nbsp;:',
+'info_url_site' => 'URL DU SITE&nbsp;:',
+'info_urlref' => 'Lien hypertexte&nbsp;:',
+'info_visites_par_mois' => 'Affichage par mois :',
+'info_visiteur_1' => 'Visiteur',
+'info_visiteur_2' => 'du site public',
+'info_visiteurs' => 'Visiteurs',
+'info_visiteurs_02' => 'Visiteurs du site public',
+'intem_redacteur' => 'r&eacute;dacteur',
+'item_administrateur_2' => 'administrateur',
+'item_choix_administrateurs' => 'les administrateurs',
+'item_choix_redacteurs' => 'les r&eacute;dacteurs',
+'item_choix_visiteurs' => 'les visiteurs du site public',
+'item_mots_cles_association_articles' => 'aux articles',
+'item_mots_cles_association_breves' => 'aux br&egrave;ves',
+'item_mots_cles_association_rubriques' => 'aux rubriques',
+'item_mots_cles_association_sites' => 'aux sites r&eacute;f&eacute;renc&eacute;s ou syndiqu&eacute;s.',
+'item_non' => 'Non',
+'item_oui' => 'Oui',
+'item_reponse_article' => 'R&eacute;ponse &agrave; l\'article',
+'item_visiteur' => 'visiteur',
+'jour_non_connu_nc' => 'n.c.',
+'lien_email' => 'email',
+'lien_nom_site' => 'NOM DU SITE :',
+'lien_reponse_article' => 'R&eacute;ponse &agrave; l\'article',
+'lien_reponse_breve' => 'R&eacute;ponse &agrave; la br&egrave;ve',
+'lien_reponse_breve_2' => 'R&eacute;ponse &agrave; la br&egrave;ve',
+'lien_reponse_rubrique' => 'R&eacute;ponse &agrave; la rubrique',
+'lien_reponse_site_reference' => 'R&eacute;ponse au site r&eacute;f&eacute;renc&eacute; :',
+'lien_site' => 'site',
+'lien_tout_deplier' => 'Tout d&eacute;plier',
+'lien_tout_replier' => 'Tout replier',
+'mois_non_connu' => 'non connu',
+'onglet_repartition_actuelle' => 'actuellement',
+'repertoire_plugins' => 'R&eacute;pertoire&nbsp;:',
+'syndic_option_resume_oui' => 'un simple r&eacute;sum&eacute; (au format texte)',
+'texte_article_statut' => 'Cet article est :',
+'texte_article_virtuel' => 'Article virtuel',
+'texte_auteurs' => 'LES AUTEURS',
+'texte_date_creation_article' => 'DATE DE CR&Eacute;ATION DE L\'ARTICLE&nbsp;:',
+'texte_date_publication_anterieure' => 'Date de r&eacute;daction ant&eacute;rieure&nbsp;:',
+'texte_date_publication_article' => 'DATE DE PUBLICATION EN LIGNE&nbsp;:',
+'texte_descriptif_petition' => 'Descriptif de la p&eacute;tition',
+'texte_descriptif_rapide' => 'Descriptif rapide',
+'texte_messages_publics' => 'Messages publics de l\'article :',
+'texte_modifier_article' => 'Modifier l\'article :',
+'texte_nouveau_message' => 'Nouveau message',
+'texte_nouveau_mot' => 'Nouveau mot',
+'texte_sous_titre' => 'Sous-titre',
+'texte_statut_publies' => 'publi&eacute;s en ligne',
+'texte_titre_02' => 'Titre :',
+'texte_vide' => 'vide',
+'titre_admin_tech' => 'Maintenance technique',
+
+'titre_articles_syndiques' => 'Articles syndiqu&eacute;s tir&eacute;s de ce site',
+'titre_breves' => 'Les br&egrave;ves',
+'titre_cadre_interieur_rubrique' => '&Agrave; l\'int&eacute;rieur de la rubrique',
+'titre_dernier_article_syndique' => 'Derniers articles syndiqu&eacute;s',
+'titre_documents_joints' => 'Documents joints',
+'titre_evolution_visite' => '&Eacute;volution des visites',
+'titre_forum_suivi' => 'Suivi des forums',
+'titre_groupe_mots' => 'GROUPE DE MOTS :',
+'titre_langue_article' => 'LANGUE DE L\'ARTICLE',
+'titre_langue_breve' => 'LANGUE DE LA BR&Egrave;VE',
+'titre_langue_rubrique' => 'LANGUE DE LA RUBRIQUE',
+'titre_langue_trad_article' => 'LANGUE ET TRADUCTIONS DE L\'ARTICLE',
+'titre_les_articles' => 'LES ARTICLES',
+'titre_mots_tous' => 'Les mots-cl&eacute;s',
+'titre_naviguer_dans_le_site' => 'Naviguer dans le site...',
+'titre_nouveau_groupe' => 'Nouveau groupe',
+'titre_nouvelle_breve' => 'Nouvelle br&egrave;ve',
+'titre_nouvelle_rubrique' => 'Nouvelle rubrique',
+'titre_page_articles_page' => 'Les articles',
+'titre_page_articles_tous' => 'Tout le site',
+'titre_page_auteurs' => 'Visiteurs',
+'titre_page_breves' => 'Br&egrave;ves',
+'titre_page_controle_petition' => 'Suivi des p&eacute;titions',
+'titre_page_documents_liste' => 'Les documents des rubriques',
+'titre_page_forum_envoi' => 'Envoyer un message',
+'titre_page_message_edit' => 'R&eacute;diger un message',
+'titre_page_mots_tous' => 'Mots-cl&eacute;s',
+'titre_page_sites_tous' => 'Les sites r&eacute;f&eacute;renc&eacute;s',
+'titre_page_statistiques' => 'Statistiques par rubriques',
+'titre_page_statistiques_referers' => 'Statistiques (liens entrants)',
+'titre_page_statistiques_visites' => 'Statistiques des visites',
+'titre_referencement_sites' => 'R&eacute;f&eacute;rencement de sites et syndication',
+'titre_referencer_site' => 'R&eacute;f&eacute;rencer le site :',
+'titre_sites_references_rubrique' => 'Les sites r&eacute;f&eacute;renc&eacute;s dans cette rubrique',
+'titre_sites_syndiques' => 'Les sites syndiqu&eacute;s',
+'titre_sites_tous' => 'Les sites r&eacute;f&eacute;renc&eacute;s',
+'titre_suivi_petition' => 'Suivi des p&eacute;titions',
+'titre_syndication' => 'Syndication de sites',
+'trad_article_inexistant' => 'Il n\'y a pas d\'article portant ce num&eacute;ro.',
+'trad_article_traduction' => 'Toutes les versions de cet article&nbsp;:',
+'version' => 'Version&nbsp;:',
+'version_initiale' => 'Version initiale'
+
+
+// Extraits de ecrire/lang/spip_fr.php
+'avis_attention' => 'ATTENTION&nbsp;!',
+
+'bouton_changer' => 'Changer',
+'bouton_chercher' => 'Chercher',
+'bouton_choisir' => 'Choisir',
+'bouton_enregistrer' => 'Enregistrer',
+'bouton_radio_syndication' => 'Syndication :',
+'bouton_telecharger' => 'T&eacute;l&eacute;charger',
+'bouton_valider' => 'Valider',
+
+'cal_apresmidi' => 'apr&egrave;s-midi',
+'cal_jour_entier' => 'jour entier',
+'cal_matin' => 'matin',
+'cal_par_jour' => 'calendrier par jour',
+'cal_par_mois' => 'calendrier par mois',
+'cal_par_semaine' => 'calendrier par semaine',
+'correcte' => 'correcte',
+
+'date_aujourdhui' => 'aujourd\'hui',
+'date_demain' => 'demain',
+'date_heures' => 'heures',
+'date_hier' => 'hier',
+'date_jnum1' => '1er',
+'date_jnum10' => '10',
+'date_jnum11' => '11',
+'date_jnum12' => '12',
+'date_jnum13' => '13',
+'date_jnum14' => '14',
+'date_jnum15' => '15',
+'date_jnum16' => '16',
+'date_jnum17' => '17',
+'date_jnum18' => '18',
+'date_jnum19' => '19',
+'date_jnum2' => '2',
+'date_jnum20' => '20',
+'date_jnum21' => '21',
+'date_jnum22' => '22',
+'date_jnum23' => '23',
+'date_jnum24' => '24',
+'date_jnum25' => '25',
+'date_jnum26' => '26',
+'date_jnum27' => '27',
+'date_jnum28' => '28',
+'date_jnum29' => '29',
+'date_jnum3' => '3',
+'date_jnum30' => '30',
+'date_jnum31' => '31',
+'date_jnum4' => '4',
+'date_jnum5' => '5',
+'date_jnum6' => '6',
+'date_jnum7' => '7',
+'date_jnum8' => '8',
+'date_jnum9' => '9',
+'date_jour_1' => 'dimanche',
+'date_jour_2' => 'lundi',
+'date_jour_3' => 'mardi',
+'date_jour_4' => 'mercredi',
+'date_jour_5' => 'jeudi',
+'date_jour_6' => 'vendredi',
+'date_jour_7' => 'samedi',
+'date_jours' => 'jours',
+'date_minutes' => 'minutes',
+'date_mois' => 'mois',
+'date_mois_1' => 'janvier',
+'date_mois_10' => 'octobre',
+'date_mois_11' => 'novembre',
+'date_mois_12' => 'd&eacute;cembre',
+'date_mois_2' => 'f&eacute;vrier',
+'date_mois_3' => 'mars',
+'date_mois_4' => 'avril',
+'date_mois_5' => 'mai',
+'date_mois_6' => 'juin',
+'date_mois_7' => 'juillet',
+'date_mois_8' => 'ao&ucirc;t',
+'date_mois_9' => 'septembre',
+'date_saison_1' => 'hiver',
+'date_saison_2' => 'printemps',
+'date_saison_3' => '&eacute;t&eacute;',
+'date_saison_4' => 'automne',
+'date_semaines' => 'semaines',
+
+'entree_dimensions' => 'Dimensions&nbsp;:',
+'entree_titre_document' => 'Titre du document&nbsp;:',
+'entree_titre_image' => 'Titre de l\'image&nbsp;:',
+'envoi_via_le_site' => 'Envoi via le site',
+
+'form_forum_login' => 'login :',
+'form_forum_message_auto' => '(ceci est un message automatique)',
+'form_indiquer_email' => 'Veuillez indiquer votre adresse email.',
+'form_indiquer_nom' => 'Veuillez indiquer votre nom.',
+'form_indiquer_nom_site' => 'Veuillez indiquer le nom de votre site.',
+'form_pet_adresse_site' => 'Adresse de votre site',
+'form_pet_message_commentaire' => 'Un message, un commentaire&nbsp;?',
+'form_pet_nom_site2' => 'Nom de votre site Web',
+'form_pet_votre_email' => 'Votre adresse email',
+'form_pet_votre_nom' => 'Votre nom ou pseudo',
+'form_pet_votre_site' => 'Si vous avez un site Web, vous pouvez l\'indiquer ci-dessous',
+'form_prop_confirmer_envoi' => 'Confirmer l\'envoi',
+'form_prop_description' => 'Description/commentaire',
+'form_prop_enregistre' => 'Votre proposition est enregistr&eacute;e, elle appara&icirc;tra en ligne apr&egrave;s validation par les responsables de ce site.',
+'form_prop_envoyer' => 'Envoyer un message',
+'form_prop_indiquer_email' => 'Veuillez indiquer une adresse email valide',
+'form_prop_indiquer_nom_site' => 'Veuillez indiquer le nom du site.',
+'form_prop_indiquer_sujet' => 'Veuillez indiquer un sujet',
+'form_prop_message_envoye' => 'Message envoy&eacute;',
+'form_prop_nom_site' => 'Nom du site',
+'form_prop_non_enregistre' => 'Votre proposition n\'a pas &eacute;t&eacute; enregistr&eacute;e.',
+'form_prop_sujet' => 'Sujet',
+'form_prop_url_site' => 'Adresse (URL) du site',
+'forum_texte' => 'Texte de votre message :',
+'forum_titre' => 'Titre :',
+'forum_titre_erreur' => 'Erreur...',
+'forum_url' => 'URL :',
+'forum_valider' => 'Valider ce choix',
+'forum_voir_avant' => 'Voir ce message avant de le poster',
+'forum_votre_email' => 'Votre adresse email :',
+'forum_votre_nom' => 'Votre nom (ou pseudonyme) :',
+
+'ical_texte_rss_articles' => 'Le fichier &laquo;backend&raquo; des articles de ce site se trouve &agrave; l\'adresse:',
+'ical_texte_rss_articles2' => 'Vous pouvez &eacute;galement obtenir des fichiers &laquo;backend&raquo; pour les articles de chaque rubrique du site:',
+'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les br&egrave;ves du site. En pr&eacute;cisant un num&eacute;ro de rubrique, vous obtiendrez uniquement les br&egrave;ves de cette rubrique.',
+'icone_a_suivre' => '&Agrave; suivre',
+'icone_admin_site' => 'Administration du site',
+'icone_agenda' => 'Agenda',
+'icone_aide_ligne' => 'Aide',
+'icone_articles' => 'Articles',
+'icone_auteurs' => 'Auteurs',
+'icone_breves' => 'Br&egrave;ves',
+'icone_brouteur' => 'Navigation rapide',
+'icone_discussions' => 'Discussions',
+'icone_doc_rubrique' => 'Documents des rubriques',
+'icone_edition_site' => '&Eacute;dition',
+'icone_mots_cles' => 'Mots-cl&eacute;s',
+'icone_repartition_actuelle' => 'Afficher la r&eacute;partition actuelle',
+'icone_repartition_debut' => 'Afficher la r&eacute;partition depuis le d&eacute;but',
+'icone_repartition_visites' => 'R&eacute;partition des visites',
+'icone_rubriques' => 'Rubriques',
+'icone_site_entier' => 'Tout le site',
+'icone_sites_references' => 'Sites r&eacute;f&eacute;renc&eacute;s',
+'icone_statistiques' => 'Statistiques du site',
+'icone_statistiques_visites' => 'Statistiques',
+'icone_suivi_activite' => 'Suivre la vie du site',
+'icone_suivi_actualite' => '&Eacute;volution du&nbsp;site',
+'icone_tous_auteur' => 'Tous les auteurs',
+'icone_valider_message' => 'Valider ce message',
+'icone_visiter_site' => 'Visiter',
+'icone_voir_en_ligne' => 'Voir en ligne',
+'img_indisponible' => 'image indisponible',
+'impossible' => 'impossible',
+
+'info_a_suivre' => '&Agrave; SUIVRE&nbsp;&raquo;',
+'info_a_valider' => '[&agrave; valider]',
+'info_acces_interdit' => 'Acc&egrave;s interdit',
+'info_acces_refuse' => 'Acc&egrave;s refus&eacute;',
+'info_aide' => 'AIDE :',
+'info_annonce' => 'ANNONCE',
+'info_annonces_generales' => 'Annonces g&eacute;n&eacute;rales&nbsp;:',
+'info_articles' => 'Articles',
+'info_auteurs_nombre' => 'auteur(s)&nbsp;:',
+
+'info_breves_02' => 'Br&egrave;ves',
+'info_breves_2' => 'br&egrave;ves',
+'info_connexion_refusee' => 'Connexion refus&eacute;e',
+'info_contenance' => 'Ce site contient&nbsp;:',
+'info_contribution' => 'contributions de forum',
+'info_copyright_gpl' => 'sous licence GPL',
+'info_deplier' => 'D&eacute;plier',
+'info_descriptif_nombre' => 'descriptif(s)&nbsp;:',
+'info_description' => 'Description&nbsp;:',
+'info_description_2' => 'Description&nbsp;:',
+'info_dimension' => 'Dimensions&nbsp;:',
+'info_document' => 'Document',
+'info_documents' => 'Documents',
+'info_ecire_message_prive' => 'Ecrire un message priv&eacute;',
+'info_email_invalide' => 'Adresse email invalide.',
+'info_en_ligne' => 'Actuellement en ligne&nbsp;:',
+'info_envoyer_message_prive' => 'Envoyer un message priv&eacute; &agrave; cet auteur',
+'info_erreur_requete' => 'Erreur dans la requ&ecirc;te :',
+'info_fini' => 'C\'est fini !',
+'info_image_aide' => 'AIDE',
+'info_l_article' => 'l\'article',
+'info_la_breve' => 'la br&egrave;ve',
+'info_la_rubrique' => 'la rubrique',
+'info_langue_principale' => 'Langue principale du site',
+'info_message_2' => 'MESSAGE',
+'info_mise_en_ligne' => 'Date de mise en ligne&nbsp;:',
+'info_mois_courant' => 'Dans le courant du mois :',
+'info_multi_herit' => 'Langue par d&eacute;faut',
+'info_multilinguisme' => 'Multilinguisme',
+'info_numero_abbreviation' => 'N&deg;&nbsp;',
+'info_pense_bete' => 'PENSE-B&Ecirc;TE',
+'info_pixels' => 'pixels',
+'info_popularite_5' => 'popularit&eacute;&nbsp;:',
+'info_portfolio' => 'Portfolio',
+'info_rechercher' => 'Rechercher',
+'info_rechercher_02' => 'Rechercher&nbsp;:',
+'info_sans_titre_2' => 'sans titre',
+'info_sites_referencer' => 'R&eacute;f&eacute;rencer un site',
+'info_syndication' => 'syndication&nbsp;:',
+'info_syndication_articles' => 'article(s)',
+'info_tout_afficher' => 'Tout afficher',
+'info_travaux_titre' => 'Site en travaux',
+'info_visite' => 'visite :',
+'info_visites' => 'visites :',
+'info_zoom' => 'zoom',
+
+'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
+'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
+'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
+'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-B&Ecirc;TE',
+'lien_nouveau_message' => 'NOUVEAU MESSAGE',
+'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
+'lien_petitions' => 'P&Eacute;TITION',
+'lien_reessayer' => 'r&eacute;essayer',
+'lien_repondre_message' => 'R&eacute;pondre &agrave; ce message',
+'lien_tout_afficher' => 'Tout afficher',
+'lien_visite_site' => 'visiter ce site',
+'lien_voir_auteur' => 'Voir cet auteur',
+
+'login_acces_prive' => 'acc&egrave;s &agrave; l\'espace priv&eacute;',
+'login_autre_identifiant' => 'se connecter sous un autre identifiant',
+'login_connexion_refusee' => 'Connexion refus&eacute;e.',
+'login_cookie_accepte' => 'Veuillez r&eacute;gler votre navigateur pour qu\'il les accepte (au moins pour ce site).',
+'login_cookie_oblige' => 'Pour vous identifier de fa&ccedil;on s&ucirc;re sur ce site, vous devez accepter les cookies.',
+'login_deconnexion_ok' => 'D&eacute;connexion effectu&eacute;e.',
+'login_erreur_pass' => 'Erreur de mot de passe.',
+'login_espace_prive' => 'espace priv&eacute;',
+'login_login' => 'Login :',
+'login_login2' => 'Login (identifiant de connexion au site)&nbsp;:',
+'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
+'login_motpasseoublie' => 'mot&nbsp;de&nbsp;passe&nbsp;oubli&eacute;&nbsp;?',
+'login_non_securise' => 'Attention, ce formulaire n\'est pas s&eacute;curis&eacute;.
+			Si vous ne voulez pas que votre mot de passe puisse &ecirc;tre
+			intercept&eacute; sur le r&eacute;seau, veuillez activer Javascript
+			dans votre navigateur et',
+'login_nouvelle_tentative' => 'Nouvelle tentative',
+'login_par_ici' => 'Vous &ecirc;tes enregistr&eacute;... par ici...',
+'login_pass2' => 'Mot de passe&nbsp;:',
+'login_preferez_refuser' => '<b>Si vous pr&eacute;f&eacute;rez refuser les cookies</b>, une autre m&eacute;thode de connexion (moins s&eacute;curis&eacute;e) est &agrave; votre disposition&nbsp;:',
+'login_recharger' => 'recharger cette page',
+'login_rester_identifie' => 'Rester identifi&eacute; quelques jours',
+'login_retour_public' => 'Retour au site public',
+'login_retour_site' => 'Retour au site public',
+'login_retoursitepublic' => 'retour&nbsp;au&nbsp;site&nbsp;public',
+'login_sans_cookiie' => 'Identification sans cookie',
+'login_sinscrire' => 's\'inscrire',
+'login_test_navigateur' => 'test navigateur/reconnexion',
+'login_verifiez_navigateur' => '(V&eacute;rifiez toutefois que votre navigateur n\'a pas m&eacute;moris&eacute; votre mot de passe...)',
+
+
+'onglet_auteur' => 'L\'auteur',
+'onglet_contenu_site' => 'Contenu du site',
+'onglet_evolution_visite_mod' => '&Eacute;volution',
+'onglet_informations_personnelles' => 'Informations personnelles',
+'onglet_interactivite' => 'Interactivit&eacute;',
+'onglet_messagerie' => 'Messagerie',
+'onglet_messages_publics' => 'Messages publics',
+'onglet_repartition_debut' => 'depuis le d&eacute;but',
+'onglet_repartition_lang' => 'R&eacute;partition par langues',
+'onglet_repartition_rubrique' => 'R&eacute;partition par rubriques',
+
+'pass_erreur' => 'Erreur',
+'pass_quitter_fenetre' => 'Quitter cette fen&ecirc;tre',
+'pass_ok' => 'OK',
+'pass_retour_public' => 'Retour sur le site public',
+'pass_rien_a_faire_ici' => 'Rien &agrave; faire ici.',
+'pass_vousinscrire' => 'Vous inscrire sur ce site',
+'precedent' => 'pr&eacute;c&eacute;dent',
+'previsualisation' => 'Pr&eacute;visualisation',
+'previsualiser' => 'Pr&eacute;visualiser',
+
+'squelette' => 'squelette',
+'suivant' => 'suivant',
+
+'titre_cadre_raccourcis' => 'RACCOURCIS :',
+'titre_statistiques' => 'Statistiques du site',
+'titre_titre_document' => 'Titre du document&nbsp;:',
+'trad_reference' => '(article de r&eacute;f&eacute;rence)',
+
+
+
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/lang/public_ber_tam.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/lang/public_ber_tam.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/lang/public_ber_tam.php	(revision 30)
@@ -0,0 +1,137 @@
+<?php
+
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// SPIP sait gerer la langue berbere, mais la traduction de tous ses fichiers
+// de langue en berbere n'est pas finie. Nous fournissons ici l'un de ces fichiers 
+// pour les chaines de caracteres du site public qu'il suffit de glisser dans 
+// le dossier /ecrire/lang/ pour qu'il soit disponible.
+//
+// Nous fournissons aussi dans ce meme dossier toutes les chaines de caracteres
+// utilisees par le squelette ALTERNATIVES en berbere. Il s'agit du fichier
+// /squelettes/lang/local_ber_tam.php3. Laissez-le a cet endroit, 
+// SPIP va le reconnaitre.
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+
+// A
+'accueil_site' => 'Asbrrek',
+'articles' => 'Imagraden',
+'articles_auteur' => 'Imagraden n umara yad', 
+'articles_populaires' => 'Imagraden bahra itawassen', 
+'articles_recents' => 'Imagraden n wasa', 
+'articles_rubrique' => 'Imagraden n tarslt ad', 
+'aucun_article' => 'Amagrad war ansa', 
+'aucun_auteur' => 'Amara war tansa', 
+'aucun_site' => 'Tansa tar site', 
+'aucune_breve' => 'Tansa tar azigzul', 
+'aucune_rubrique' => 'Tansa tar tarslt', 
+'autres_breves' => 'Izigzulen yad&ecirc;n', 
+'autres_groupes_mots_clefs' => 'Tirabbutin yad&ecirc;n', 
+'autres_sites' => 'Sites yad&ecirc;n', 
+
+
+// B
+'bonjour' => 'Azul', 
+'breves' => 'Izigzulen', 
+
+
+// C
+'commenter_site' => 'Sawel f cite ad', 
+
+
+// D
+'date' => 'Azemz', 
+'dernier_ajout' => 'Assrnu igwran', 
+'dernieres_breves' => 'Inghmisen gzzulnin',
+'derniers_articles' => 'Amagrad amggaru', 
+'derniers_commentaires' => 'Iwaliwen ggranin', 
+'derniers_messages_forum' => 'Izen gran g isuyas', 
+
+
+// E
+'edition_mode_texte' => 'Tirra s tgharast n adr&icirc;s', 
+'en_reponse' => 'Tamrarut i', 
+'en_resume' => 'Azigzul',
+'envoyer_message' => 'Azen yuwen izen', 
+'espace_prive' => 'Asays n iswingimen',
+
+
+// F
+'forum' => 'Asays', 
+
+
+// H
+'hierarchie_site' => 'Tusska n usays', 
+
+
+// J
+'jours' => 'Ussan', 
+
+
+// M
+'meme_auteur' => 'Amara lli nit', 
+'meme_rubrique' => 'Gh tarslt lli nit', 
+'memes_auteurs' => 'Imaraten lli nit', 
+'message' => 'Izen',  
+'messages_forum' => 'Izen n usays',
+'messages_recents' => 'Izen n isuyas n wasa', 
+'mots_clefs' => 'Tiguriwin', 
+'mots_clefs_meme_groupe' => 'Tiguriwin', 
+
+
+// N
+'navigation' => 'Amuddu', 
+'nom' => 'Assagh', 
+'nouveautes' => 'Imaynuten', 
+'nouveautes_web' => 'Imaynuten n Web', 
+'nouveaux_articles' => 'Imagraden imaynuten', 
+'nouvelles_breves' => 'Izigzulen imaynuten', 
+
+
+// P
+'page_precedente' => 'Tifrt izrin', 
+'page_suivante' => 'Tifrt d iddan', 
+'par_auteur' => 's umara',
+'participer_site' => 'Tzmerem ad tawsem g tudert n site ad s isumar nun.',
+'plan_site' => 'Plan n site',
+'popularite' => 'Popularit&eacute;',  
+'poster_message' => 'Azen yun izen',
+'proposer_site' => 'Tzmerem ad trnum kra',
+
+
+// R
+'repondre_article' => 'Rar ghef amagrad ad', 
+'repondre_breve' => 'Rar xef azigzul ad', 
+'repondre_message' => 'Rar f izen nad', 
+'resultats_recherche' => 'Tanattaft n trzzut', 
+'retour_debut_forums' => 'Ughul gher ixef n usays', 
+'rubrique' => 'Tarslt', 
+'rubriques' => 'Tirsal', 
+
+
+// S
+'signatures_petition' => 'Takbabt', 
+'site_realise_avec_spip' => 'Site ittugan s SPIP',
+'sites_web' => 'Sites Web',
+'sous_rubriques' => 'Tarslt mzzin', 
+'suite' => 'Andfer', 
+'sur_web' => 'Iggi n Web', 
+'syndiquer_rubrique' => 'Zdi tarslt ad',
+'syndiquer_site' => 'Zdi site akw', 
+
+
+// T
+'texte_lettre_information' => 'Had tabrat n unghmis n site', 
+'texte_lettre_information_2' => 'Tabrat ad ar tsghal imagraden d izigzulen yad illan', 
+
+
+// V
+'ver_imprimer' => 'Ssfegh iggi n tifrt', 
+'voir_en_ligne' => 'Z&ecirc;r iggi n ud&ecirc;rf', 
+
+
+);
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/mes_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/mes_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/mes_fonctions.php	(revision 30)
@@ -0,0 +1,178 @@
+<?php
+
+/*
+ *   +----------------------------------+
+ *    Nom de la balise : Afficher version SPIP                                              
+ *   +----------------------------------+
+ *    Fonctions de cette balise :
+ *      Afficher le numero de version de SPIP.
+ *
+ *    Utilisation 
+ *      Inserer #VERSION_SPIP dans votre squelette
+ *   +-------------------------------------+ 
+ *   REMARQUE
+ *  	#SPIP_VERSION = $spip_version_affichee = 1.9.1
+ *		#CONFIG{version_installee} = $version_installee = 1.916
+*/
+
+function balise_SPIP_VERSION($p) {
+	global $spip_version_affichee;
+	$p->code = "'$spip_version_affichee'";
+	$p->interdire_scripts = false;
+	return $p;
+}
+
+function bellespuces_pre_typo($texte) {
+    $texte = preg_replace('/^-\s+/m','-* ',$texte);
+    return $texte;
+}
+
+
+
+
+
+
+/*
+ *   +----------------------------------+
+ *    Nom du Filtre : Sommaire de l'article                                               
+ *   +----------------------------------+
+ *    Date : Vendredi 6 juin 2003
+ *    Auteur :  Noplay (noplay@altern.org) 
+ *              Aurélien PIERARD : aurelien.pierard@sig.premier-ministre.gouv.fr                                     
+ *   +-------------------------------------+
+ *    Fonctions de ce filtre :
+ *      Cette modification permet d'afficher le sommaire de l'article 
+ *      généré dynamiquement à partir des intertitres du texte de l'article. 
+ *		Vous pouvez naviguer dans l'article en cliquant sur les intitres 
+ *      du sommaire de l'article. 
+ *
+ *      Tout ce qui ce trouve entre {{{ et }}} est considéré comme un titre 
+ *      à ajouter au sommaire de l'article.
+ *   +-------------------------------------+ 
+ *  
+ * 		Pour toute suggestion, remarque, proposition d'ajout
+ * 		reportez-vous au forum de l'article :
+ * 		http://spip_contrib.net/article.php3?id_article=76
+*/
+//SOMMAIRE
+function sommaire_article($texte)
+{
+		$artsuite = 0;
+        $page = split('-----', $texte);
+        $uri_art = generer_url_article($GLOBALS['id_article']);
+        $uri_art .= strpos($uri_art, '?') ? '&' : '?';
+
+	$i=0;
+	$texte="";
+	while($page[$i]){
+		// On ajoute une ancre aux intertitres "{{{ }}}" que l'on utilise pour créer le sommaire
+		preg_match_all("|\{\{\{(.*)\}\}\}|U",$page[$i], $regs);
+	 	$nb=1;
+		for($j=0;$j<count($regs[1]);$j++){
+			$p=$i+1;
+	    	$texte=$texte."<li><a href=\"". $uri_art . "artsuite=" .$i. "#sommaire_".$nb."\" title=\"".$regs[1][$j]."\">".$regs[1][$j]."</a>,&nbsp;p$p</li>\n";
+			$nb++;
+	    }
+		$i++;
+	}
+		if (empty($texte)) $texte="";
+		else $texte="<ul>\n".$texte."</ul>\n";
+		return $texte;
+}
+// Fin du filtre sommaire
+
+/*
+ *   +----------------------------------+
+ *    Nom du Filtre : decouper_en_page                                               
+ *   +----------------------------------+
+ *    Date : Vendredi 6 juin 2003
+ *    Auteur :  "gpl"  : gpl@macplus.org  
+ *              Aurélien PIERARD : aurelien.pierard@sig.premier-ministre.gouv.fr
+ *   +-------------------------------------+
+ *    Fonctions de ce filtre :
+ *		Il sert a présenter un article sur plusieurs pages  
+ *   +-------------------------------------+ 
+ *  
+ * Pour toute suggestion, remarque, proposition d'ajout
+ * reportez-vous au forum de l'article :
+ * http://www.uzine.net/spip_contrib/article.php3?id_article=62
+*/
+
+
+function decouper_en_page($texte,$id_article) {
+        global $artsuite, $var_recherche, $num_pages;
+		
+        if (empty($artsuite)) $artsuite = 0;
+	
+		// on divise la page (séparateur : "-----")        
+        $page = split('-----', $texte);
+        // Nombre total de pages
+        $num_pages = count($page);
+
+        // Si une seule page ou numéro illégal, alors retourner tout le texte.
+        // Cas spécial : si var_recherche positionné, tout renvoyer pour permettre à la surbrillance de fonctionner correctement.
+        if ($num_pages == 1 || !empty($var_recherche) || $artsuite < 0 || $artsuite > $num_pages) {
+			// On place les ancres sur les intertitres
+			$texte = preg_replace("|\{\{\{(.*)\}\}\}|U","<a id=\"sommaire_#NB_TITRE_DE_MON_ARTICLE#\"></a>$0", $texte);
+			$array = explode("#NB_TITRE_DE_MON_ARTICLE#" , $texte);
+			$res =count($array);
+			$i =1;
+			$texte=$array[0];
+			while($i<$res){
+				$texte=$texte.$i.$array[$i];
+				$i++;
+			}
+			return $texte;
+        } 
+
+        $p_prec = $artsuite - 1;
+        $p_suiv = $artsuite + 1;
+        $uri_art = generer_url_article($id_article);
+        $uri_art .= strpos($uri_art, '?') ? '&' : '?';
+
+		// On place les ancres sur les intertitres
+		$page[$artsuite] = preg_replace("|\{\{\{(.*)\}\}\}|U","<a id=\"sommaire_#NB_TITRE_DE_MON_ARTICLE#\"></a>$0", $page[$artsuite]);
+		$array = explode("#NB_TITRE_DE_MON_ARTICLE#" , $page[$artsuite]);
+		$res =count($array);
+		$i =1;
+		$page[$artsuite]=$array[0];
+		while($i<$res){
+			$page[$artsuite]=$page[$artsuite].$i.$array[$i];
+			$i++;
+		}
+		// Pagination
+	    switch (TRUE) {
+			case ($artsuite == 0):
+				$precedent = "";
+				$suivant = "<a href='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</a>";
+				break;
+			case ($artsuite == ($num_pages-1)):
+				$precedent = "<a href='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</a>";
+				$suivant = "";
+				break;
+			default:
+				$precedent = "<a href='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</a>";
+				$suivant = "<a href='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</a>";
+				break;
+        }
+    
+        for ($i = 0; $i < $num_pages; $i++) {
+			$j = $i;
+			if ($i == $artsuite) {
+				$milieu .= " <strong>" . ++$j . "</strong> ";
+            } 
+			else {
+				$milieu .= " <a href='" . $uri_art . "artsuite=$i'>" . ++$j . "</a> ";
+			}
+        }
+
+        // Ici, on peut personnaliser la présentation
+        $resultat .= $page[$artsuite];
+        $resultat .= "<div class='pagination' style='text-align:center'>pages : $precedent $milieu $suivant</div>";
+        return $resultat;
+}
+// FIN du Filtre decouper_en_page
+
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/mes_fonctions.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/mes_fonctions.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/mes_fonctions.txt	(revision 30)
@@ -0,0 +1,178 @@
+<?php
+
+/*
+ *   +----------------------------------+
+ *    Nom de la balise : Afficher version SPIP                                              
+ *   +----------------------------------+
+ *    Fonctions de cette balise :
+ *      Afficher le numero de version de SPIP.
+ *
+ *    Utilisation 
+ *      Inserer #VERSION_SPIP dans votre squelette
+ *   +-------------------------------------+ 
+ *   REMARQUE
+ *  	#SPIP_VERSION = $spip_version_affichee = 1.9.1
+ *		#CONFIG{version_installee} = $version_installee = 1.916
+*/
+
+function balise_SPIP_VERSION($p) {
+	global $spip_version_affichee;
+	$p->code = "'$spip_version_affichee'";
+	$p->interdire_scripts = false;
+	return $p;
+}
+
+function bellespuces_pre_typo($texte) {
+    $texte = preg_replace('/^-\s+/m','-* ',$texte);
+    return $texte;
+}
+
+
+
+
+
+
+/*
+ *   +----------------------------------+
+ *    Nom du Filtre : Sommaire de l'article                                               
+ *   +----------------------------------+
+ *    Date : Vendredi 6 juin 2003
+ *    Auteur :  Noplay (noplay@altern.org) 
+ *              Aurélien PIERARD : aurelien.pierard@sig.premier-ministre.gouv.fr                                     
+ *   +-------------------------------------+
+ *    Fonctions de ce filtre :
+ *      Cette modification permet d'afficher le sommaire de l'article 
+ *      généré dynamiquement à partir des intertitres du texte de l'article. 
+ *		Vous pouvez naviguer dans l'article en cliquant sur les intitres 
+ *      du sommaire de l'article. 
+ *
+ *      Tout ce qui ce trouve entre {{{ et }}} est considéré comme un titre 
+ *      à ajouter au sommaire de l'article.
+ *   +-------------------------------------+ 
+ *  
+ * 		Pour toute suggestion, remarque, proposition d'ajout
+ * 		reportez-vous au forum de l'article :
+ * 		http://spip_contrib.net/article.php3?id_article=76
+*/
+//SOMMAIRE
+function sommaire_article($texte)
+{
+		$artsuite = 0;
+        $page = split('-----', $texte);
+        $uri_art = generer_url_article($GLOBALS['id_article']);
+        $uri_art .= strpos($uri_art, '?') ? '&' : '?';
+
+	$i=0;
+	$texte="";
+	while($page[$i]){
+		// On ajoute une ancre aux intertitres "{{{ }}}" que l'on utilise pour créer le sommaire
+		preg_match_all("|\{\{\{(.*)\}\}\}|U",$page[$i], $regs);
+	 	$nb=1;
+		for($j=0;$j<count($regs[1]);$j++){
+			$p=$i+1;
+	    	$texte=$texte."<li><a href=\"". $uri_art . "artsuite=" .$i. "#sommaire_".$nb."\" title=\"".$regs[1][$j]."\">".$regs[1][$j]."</a>,&nbsp;p$p</li>\n";
+			$nb++;
+	    }
+		$i++;
+	}
+		if (empty($texte)) $texte="";
+		else $texte="<ul>\n".$texte."</ul>\n";
+		return $texte;
+}
+// Fin du filtre sommaire
+
+/*
+ *   +----------------------------------+
+ *    Nom du Filtre : decouper_en_page                                               
+ *   +----------------------------------+
+ *    Date : Vendredi 6 juin 2003
+ *    Auteur :  "gpl"  : gpl@macplus.org  
+ *              Aurélien PIERARD : aurelien.pierard@sig.premier-ministre.gouv.fr
+ *   +-------------------------------------+
+ *    Fonctions de ce filtre :
+ *		Il sert a présenter un article sur plusieurs pages  
+ *   +-------------------------------------+ 
+ *  
+ * Pour toute suggestion, remarque, proposition d'ajout
+ * reportez-vous au forum de l'article :
+ * http://www.uzine.net/spip_contrib/article.php3?id_article=62
+*/
+
+
+function decouper_en_page($texte,$id_article) {
+        global $artsuite, $var_recherche, $num_pages;
+		
+        if (empty($artsuite)) $artsuite = 0;
+	
+		// on divise la page (séparateur : "-----")        
+        $page = split('-----', $texte);
+        // Nombre total de pages
+        $num_pages = count($page);
+
+        // Si une seule page ou numéro illégal, alors retourner tout le texte.
+        // Cas spécial : si var_recherche positionné, tout renvoyer pour permettre à la surbrillance de fonctionner correctement.
+        if ($num_pages == 1 || !empty($var_recherche) || $artsuite < 0 || $artsuite > $num_pages) {
+			// On place les ancres sur les intertitres
+			$texte = preg_replace("|\{\{\{(.*)\}\}\}|U","<a id=\"sommaire_#NB_TITRE_DE_MON_ARTICLE#\"></a>$0", $texte);
+			$array = explode("#NB_TITRE_DE_MON_ARTICLE#" , $texte);
+			$res =count($array);
+			$i =1;
+			$texte=$array[0];
+			while($i<$res){
+				$texte=$texte.$i.$array[$i];
+				$i++;
+			}
+			return $texte;
+        } 
+
+        $p_prec = $artsuite - 1;
+        $p_suiv = $artsuite + 1;
+        $uri_art = generer_url_article($id_article);
+        $uri_art .= strpos($uri_art, '?') ? '&' : '?';
+
+		// On place les ancres sur les intertitres
+		$page[$artsuite] = preg_replace("|\{\{\{(.*)\}\}\}|U","<a id=\"sommaire_#NB_TITRE_DE_MON_ARTICLE#\"></a>$0", $page[$artsuite]);
+		$array = explode("#NB_TITRE_DE_MON_ARTICLE#" , $page[$artsuite]);
+		$res =count($array);
+		$i =1;
+		$page[$artsuite]=$array[0];
+		while($i<$res){
+			$page[$artsuite]=$page[$artsuite].$i.$array[$i];
+			$i++;
+		}
+		// Pagination
+	    switch (TRUE) {
+			case ($artsuite == 0):
+				$precedent = "";
+				$suivant = "<a href='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</a>";
+				break;
+			case ($artsuite == ($num_pages-1)):
+				$precedent = "<a href='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</a>";
+				$suivant = "";
+				break;
+			default:
+				$precedent = "<a href='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</a>";
+				$suivant = "<a href='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</a>";
+				break;
+        }
+    
+        for ($i = 0; $i < $num_pages; $i++) {
+			$j = $i;
+			if ($i == $artsuite) {
+				$milieu .= " <strong>" . ++$j . "</strong> ";
+            } 
+			else {
+				$milieu .= " <a href='" . $uri_art . "artsuite=$i'>" . ++$j . "</a> ";
+			}
+        }
+
+        // Ici, on peut personnaliser la présentation
+        $resultat .= $page[$artsuite];
+        $resultat .= "<div class='pagination' style='text-align:center'>pages : $precedent $milieu $suivant</div>";
+        return $resultat;
+}
+// FIN du Filtre decouper_en_page
+
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/modeles/site_box.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/modeles/site_box.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/modeles/site_box.html	(revision 30)
@@ -0,0 +1,20 @@
+[(#REM)
+
+	Ce modele (a installer dans le dossier modeles/) permet d'afficher,
+	dans n'importe quel texte, une boite listant les 5 derniers liens
+	d'un site syndique ; il suffit d'employer la syntaxe <site1|box>
+	dans le texte a l'endroit ou on souhaite que la boite apparaisse.
+
+	Variantes : <site1|box|left>, <site1|box|center>...
+]
+
+<BOUCLE_j(SITES){id_syndic}>
+	<div style='[float:(#ALIGN|match{left|right});] margin[-(#ALIGN|match{left}|?{right}|sinon{#ALIGN|match{right}|?{left}})]:1em;' class='spip_modele'>
+		<h4><a href="#URL_SITE" [title="(#DESCRIPTIF|supprimer_tags|attribut_html)"]>#NOM_SITE</a></h4>
+		<ul>
+<BOUCLE_i(SYNDIC_ARTICLES){id_syndic}{par date}{inverse}{0,5}>
+			<li><a href="#URL_ARTICLE" class="spip_out">#TITRE</a></li>
+</BOUCLE_i>
+		</ul>
+	</div>
+</BOUCLE_j>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/mot.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/mot.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/mot.html	(revision 30)
@@ -0,0 +1,157 @@
+<BOUCLE_mot_principal(MOTS) {id_mot} {doublons}>
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : [(#TITRE|supprimer_numero|textebrut)]</title>
+	<INCLURE{fond=page}{fond=styles}{lang}{id_mot}>
+</head>
+<body dir="#LANG_DIR" class="#LANG mot groupe#ID_GROUPE mot#ID_MOT">
+<div id="page">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}{id_mot}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+	<div id="bloc-contenu">
+		<div class="cartouche">
+			[(#LOGO_MOT|right)]
+			[<h1 class="titre-article">(#TITRE|supprimer_numero)</h1>]
+			<div class="surtitre"><:info_dans_groupe:> <BOUCLE_meme_groupe(GROUPES_MOTS) {id_groupe}>[(#TITRE|supprimer_numero)]</BOUCLE_meme_groupe></div>
+			<br />
+			<div class="sous-titre"><:info_articles_lies_mot:></div>
+		</div><!-- cartouche -->
+		[<h4>(#TEXTE)</h4>]
+		[<h6>(#NOTES)</h6>]
+		
+		<!-- Articles lies au mot-cle -->
+		<h1 class="structure"><:articles:></h1>
+		<BOUCLE_articles(ARTICLES) {id_mot} {par titre}{lang?}>
+			<h3><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a></h3>
+			<div class="detail">
+				[(#DATE|nom_jour)] [(#DATE|affdate)]
+				<B_auteurs><:par_auteur:> <BOUCLE_auteurs(AUTEURS) {id_article} {", "}>#NOM</BOUCLE_auteurs>
+			</div><!-- detail -->
+			<br />
+		</BOUCLE_articles>
+	</div><!-- bloc-contenu -->
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+	<div id="encart">
+	
+      <!-- Menu de navigation mots-cles : les autres mots cles du meme groupe -->
+      <B_groupe>
+      <h2 class="structure"><:mots_clefs_meme_groupe:></h2>
+      <div class="menu">
+      <ul>
+        <li>
+          <b><BOUCLE_groupe(GROUPES_MOTS) {id_groupe} {doublons}>[(#TITRE|supprimer_numero)]</BOUCLE_groupe></b>
+          <span>(<:mots_clefs_meme_groupe:>)</span>
+          <ul>
+            <BOUCLE_mots_freres(MOTS) {type} {par titre}>
+            <li>
+              <a href="#URL_MOT" title="[(#DESCRIPTIF|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a>
+            </li>
+            </BOUCLE_mots_freres>
+          </ul>
+        </li>
+      </ul>
+      </div><!-- menu -->
+      </B_groupe>
+	
+      <!-- Menu de navigation mots-cles : les autres groupes avec un lien sur le premier mot du groupe -->
+      <B_groupes_freres>
+      <h2 class="structure"><:autres_groupes_mots_clefs:></h2>
+      <div class="menu">
+      <ul>
+        <li><b><:autres_groupes_mots_clefs:></b>
+          <ul>
+            <BOUCLE_groupes_freres(GROUPES_MOTS) {par titre} {doublons}>
+              <BOUCLE_mot_cousin(MOTS) {id_groupe} {par titre} {0,1}>
+            <li>
+              <a href="#URL_MOT">[(#TYPE|supprimer_numero)]</a>
+            </li>
+              </BOUCLE_mot_cousin>
+            </BOUCLE_groupes_freres>
+          </ul>
+        </li>
+      </ul>
+      </div><!-- menu -->
+      </B_groupes_freres>
+		
+      <!-- Rubriques liees au mot-cle -->
+      <B_rubriques>
+      <h2 class="structure"><:rubriques:></h2>
+      <div class="menu">
+      <ul>
+        <li><b><:info_rubriques_liees_mot:></b>
+          <ul>
+            <BOUCLE_rubriques(RUBRIQUES) {id_mot} {par titre}>
+            <li>
+              <a href="#URL_RUBRIQUE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+            </li>
+            </BOUCLE_rubriques>
+          </ul>
+        </li>
+      </ul>
+      </div><!-- menu -->
+      </B_rubriques>
+
+      <!-- Breves liees au mot-cle -->
+      <B_breves>
+      <h2 class="structure"><:breves:></h2>
+      <div class="menu">
+      <ul>
+        <li><b><:info_breves_liees_mot:></b>
+          <ul>
+            <BOUCLE_breves(BREVES) {id_mot} {par titre}>
+            <li >
+              <a href="#URL_BREVE">[(#TITRE|supprimer_numero)]</a>
+            </li>
+            </BOUCLE_breves>
+          </ul>
+        </li>
+      </ul>
+      </div><!-- menu -->
+      </B_breves>
+
+      <!-- Sites Web lies au mot-cle -->
+      <B_sites>
+      <div class="menu">
+      <h2 class="structure"><:sites_web:></h2>
+      <ul>
+        <li><b><:info_sites_lies_mot:></b>
+          <ul>
+            <BOUCLE_sites(SITES) {id_mot} {par nom_site}>
+            <li>
+              <a href="#URL_SITE">#NOM_SITE</a>
+            </li>
+            </BOUCLE_sites>
+          </ul>
+        </li>
+      </ul>
+      </div><!-- menu -->
+      </B_sites>
+      
+	</div><!-- encart -->
+
+<INCLURE{fond=inc/inc-menu}{lang}{id_mot}>
+<INCLURE{fond=inc/inc-bas}{lang}{id_mot}>
+</div>	<!-- page -->
+
+</body>
+</html>
+</BOUCLE_mot_principal>
+<INCLURE{fond=404}{lang}{id_mot}>
+<//B_mot_principal>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plan.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plan.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plan.html	(revision 30)
@@ -0,0 +1,92 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : <:plan_site:></title>
+	<INCLURE{fond=page}{fond=styles}>
+	<INCLURE{fond=inc/inc-meta}{lang}>
+</head>
+<body dir="#LANG_DIR" class="#LANG plan">
+<div id="page">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+	<div id="bloc-contenu">
+			<BOUCLE_langue_contexte_exclus(RUBRIQUES){tout}{doublons contexte}{lang}></BOUCLE_langue_contexte_exclus>
+		<B_langues>
+		<div id="sommaire">
+			<h4><:info_langues:></h4>
+			<ul>
+			<BOUCLE_langues(RUBRIQUES){racine}{doublons contexte}{par lang}>[
+				<li lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR">
+					<a href="spip.php?action=cookie&amp;url=[(#SELF)]&amp;var_lang=#LANG" hreflang="#LANG">(#LANG|unique|traduire_nom_langue{lang})</a>
+				</li>
+			]</BOUCLE_langues>
+			</ul>
+		</div>
+		</B_langues>
+		<h2><:plan_site:></h2>
+		<div id="plan">
+			<BOUCLE_secteurs(RUBRIQUES) {racine} {!par lang} {par num titre}{lang}>
+			[<h2>(#LANG|unique|traduire_nom_langue{langues})</h2>]
+				<div class="plan-archives" style="clear:both;">
+				[(#LOGO_RUBRIQUE|right||reduire_image{120,0})]
+				<h3><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]</a></h3>
+				</div>
+				<B_articles_racine>
+				<ul>
+					<BOUCLE_articles_racine(ARTICLES) {id_rubrique} {par num titre}>
+						<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
+					</BOUCLE_articles_racine>
+				</ul>
+				</B_articles_racine>
+					<B_rubriques>
+					<ul>
+						<BOUCLE_rubriques(RUBRIQUES) {id_parent} {par num titre}>
+							<li>
+								<a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]</a>
+								<B_articles>
+								<ul>
+									<BOUCLE_articles(ARTICLES) {id_rubrique} {par titre}>
+										<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
+									</BOUCLE_articles>
+								</ul>
+								</B_articles>
+								<BOUCLE_sous_rubriques(BOUCLE_rubriques)>
+								</BOUCLE_sous_rubriques>
+							</li>
+						</BOUCLE_rubriques>
+					</ul>
+				</B_rubriques>
+			</BOUCLE_secteurs>
+		</div><!-- plan -->
+	</div><!-- bloc-contenu -->
+
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+	<div id="encart">
+    <INCLURE{fond=inc/inc-annonces}{lang}>
+    <INCLURE{fond=inc/inc-breves}{lang}>
+    <INCLURE{fond=inc/inc-syndic}{lang}>
+
+	</div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas} {lang}>
+</div><!-- page -->
+
+</body>
+</html>
+
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugin.xml	(revision 30)
@@ -0,0 +1,17 @@
+<plugin>
+  <nom>Alternatives</nom>
+  <auteur>
+    [Andr&#233; Vincent->http://andre-vincent.info] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>1.9.1.1</version>
+  <etat>stable</etat>
+  <description>
+    <multi>
+      Select this template to make it the default template of your site.
+      [fr]
+      S&#233;lectionner ce squelette pour l'activer comme squelette par d&#233;faut de votre site.
+    </multi>
+  </description>
+  <lien>http://stages.alternatives.ca/spip.php?article73</lien>
+  <prefix>alternatives</prefix>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/COPYING.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/COPYING.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/COPYING.txt	(revision 30)
@@ -0,0 +1,344 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/DOCUMENTATION.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/DOCUMENTATION.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/DOCUMENTATION.txt	(revision 30)
@@ -0,0 +1,76 @@
+// ----------------------------------------------------------------------------
+// STRUCTURE DOCUMENTATION
+//     
+// The Theme directory structure need to be like this
+// This is only for the public theme
+// 
+// themes/ 
+//      <squelette_dir1>
+//         theme.xml
+//        <files ... >
+//      <squelette_dir2>
+//         theme.xml
+//        <files ... >
+//      <...>
+//      <habillage_dir1>
+//         theme.xml
+//        <files ...>
+//      <habillage_dir2>
+//         theme.xml
+//        <files ...>
+//
+// Theme = Squelette [+ Habillage]
+// Habillage is optional, because default 'habillage' could be in the
+// 'squelette' directory itself (such 'dist').
+//
+// Available 'squelettes' or 'habillage' can be now stored in the same
+// directory but you still have the possibility to have 2 differents 
+// directories
+//
+// ---------------------------------------------------------------------------
+// Habillage
+// theme.xml (use to give a description in the interface and to select it
+//                with <squelettes> name)
+//    <theme>
+// 	<nom>name_of_the_habillage</nom>
+// 	<auteur>
+// 	author of the habillage
+// 	</auteur>
+// 	<version>
+// 	1.0
+// 	</version>
+// 	<etat>
+// 	stable
+// 	</etat>
+// 	<description>
+// 	...
+// 	</description>
+//      <type>themes</type>
+// 	<squelettes>dist</squelettes>
+// 	<squelettes>SarkaSpip</squelettes>
+//    </theme>
+//
+// You can define several dependances <squelettes></squelettes>
+// 
+// ---------------------------------------------------------------------------
+// Squelette
+// theme.xml (use to give description in the interface)
+//
+//    <theme>
+// 	<nom>name_of_the_squelette</nom>
+// 	<auteur>
+// 	author of the squelette
+// 	</auteur>
+// 	<version>
+// 	1.0
+// 	</version>
+// 	<etat>
+// 	stable
+// 	</etat>
+//      <type>squelettes</type>
+// 	<description>
+// 	...
+// 	</description>
+//    </theme>
+//
+// ---------------------------------------------------------------------------
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/TODO.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/TODO.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/TODO.txt	(revision 30)
@@ -0,0 +1,10 @@
+// <b>VOUS POUVEZ AJOUTER DES ELEMENTS A CETTE LISTE</b>
+// <b>TODO</b>: Probablement ajouter des tests pour detecter l'usage de 'dossier_squelettes'.
+// <b>TODO</b>: Telecharger un squelette ou un theme distribue par internet et l'installer.
+// <b>TODO</b>: Afficher les fichiers capture.png si ils existent
+//
+// <b>YOU CAN ADD ITEM TO THIS LIST AS YOU WISH</b>
+// <b>TODO</b>: Probably add some tests to detect the usage of 'dossier_squelettes'.
+// <b>TODO</b>: Download a whole squelette or theme zip distribution trough the net and install it.
+// <b>TODO</b>: Display capture.png files if exist
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_config.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_config.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_config.php	(revision 30)
@@ -0,0 +1,160 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/sktheme_util');
+
+function exec_sktheme_config() {
+  
+  global $sktheme_action;
+  global $squelettes_public_dir;
+  global $habillages_public_dir;
+  global $habillage_switcher_style;
+  global $theme_switcher_style;
+  global $switcher_activated;
+  global $switcher_admin_only;
+  
+  debut_page(_T('sktheme:title_config'),'configuration','sktheme_config');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:main_config_title'));
+  
+  // Include 'onglets'
+  sktheme_config_onglets();
+  
+  debut_gauche();
+  
+  // Include Doc box
+  sktheme_config_doc_box();
+  
+  debut_droite();
+  
+  //
+  // PUBLIC THEMES DIRECTORIES CONFIG
+  //
+  debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:public_themes_config'));
+  
+  // if submit : then save values
+  if ($sktheme_action=="set_dir") {
+    ecrire_meta('sktheme_squelettes_public_dir',$squelettes_public_dir);
+    ecrire_meta('sktheme_habillages_public_dir',$habillages_public_dir);
+    ecrire_metas();
+  }
+  
+  // Set directories
+  echo '<form action="'.generer_url_ecrire("sktheme_config", "sktheme_action=set_dir").'" method="post">';
+  
+  // Set squelettes_public_dir
+  debut_cadre_gris_clair();
+  echo '<strong>'._T('sktheme:squelettes_public_dir').' : </strong><input type="text" name="squelettes_public_dir" size="25" value="'.
+    $GLOBALS['meta']['sktheme_squelettes_public_dir'].'">';
+  fin_cadre_gris_clair();
+  
+  // Set habillages_public_dir
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:habillages_public_dir').' : </strong><input type="text" name="habillages_public_dir" size="25" value="'.
+    $GLOBALS['meta']['sktheme_habillages_public_dir'].'">';
+  fin_cadre_couleur(); 
+  
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_public_directories').'" /></div></div>';
+  echo '</form>';
+ 
+  fin_cadre_trait_couleur();  
+  
+  //
+  // PRIVATE THEMES DIRECTORIES CONFIG
+  //
+  //   debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:private_themes_config'));
+  //   echo '<br />';
+  //   echo _T('sktheme:to_be_done');
+  //   echo '<br />';
+  //   fin_cadre_trait_couleur();  
+  //
+  // SWITCHER OPTIONS
+  //
+  // if submit : save switcher options
+  if ($sktheme_action=="set_switcher") {
+    ecrire_meta('sktheme_theme_switcher_style',$theme_switcher_style);
+    ecrire_meta('sktheme_habillage_switcher_style',$habillage_switcher_style);
+    ecrire_meta('sktheme_switcher_activated',$switcher_activated);
+    ecrire_meta('sktheme_switcher_admin_only',$switcher_admin_only);
+    ecrire_metas();
+  }
+  debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:themes_switcher'));
+  
+  echo '<form action="'.generer_url_ecrire("sktheme_config", "sktheme_action=set_switcher").'" method="post">';
+  
+  // Set sktheme_switcher_activated
+  debut_cadre_gris_clair();
+  echo '<strong>'._T('sktheme:switcher_activated').' : </strong>';
+  echo '<input type="radio" name="switcher_activated"  value="yes" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) AND ($GLOBALS['meta']['sktheme_switcher_activated']=="yes")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:yes');
+  echo '<input type="radio" name="switcher_activated" value="no" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) AND ($GLOBALS['meta']['sktheme_switcher_activated']=="no")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:no');
+  fin_cadre_gris_clair();
+  
+  // Set sktheme_switcher_admin_only
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:switcher_admin_only').' : </strong>';
+  echo '<input type="radio" name="switcher_admin_only"  value="yes" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="yes")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:yes');
+  echo '<input type="radio" name="switcher_admin_only"  value="no" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="no")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:no');
+  fin_cadre_couleur(); 
+  
+  // Set theme_switcher_style
+  debut_cadre_gris_clair();
+  echo '<strong>'._T('sktheme:theme_switcher_style').' : </strong>';
+  echo "<br />";
+  echo '<textarea  cols="50" rows="8" name="theme_switcher_style">';
+  echo $GLOBALS['meta']['sktheme_theme_switcher_style'].'</textarea>';  
+  fin_cadre_gris_clair();
+  
+  // Set habillage_switcher_style
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:habillage_switcher_style').' : </strong>';
+  echo "<br />";
+  echo '<textarea  cols="50" rows="8" name="habillage_switcher_style">';
+  echo $GLOBALS['meta']['sktheme_habillage_switcher_style'].'</textarea>';  
+  fin_cadre_couleur(); 
+  
+    
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_switcher_options').'" /></div></div>';
+  echo '</form>';
+  
+  fin_cadre_trait_couleur();  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_doc.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_doc.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_doc.php	(revision 30)
@@ -0,0 +1,78 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/flock');
+include_spip('inc/sktheme_util');
+
+//
+// Private Area Page definition 
+//
+function exec_sktheme_doc() {
+
+  debut_page(_T('sktheme:extra_documentation'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:extra_documentation'));
+  
+  // Include 'onglets'
+  sktheme_doc_onglets();
+  
+  debut_gauche();
+
+  
+  debut_droite();
+  echo "<br />";
+  // debut_cadre_trait_couleur($icone='', $return = false, $fonction='', $titre=''){
+  debut_cadre_trait_couleur('', false, "sktheme_documentation", _T('sktheme:extra_documentation'));
+  
+  $doc = _DIR_PLUGIN_SKTHEME."/DOCUMENTATION.txt";
+  if (is_file($doc)) {
+    lire_fichier ($doc,$contenu);
+    $contenu = str_replace("<", "&lt;", $contenu);
+    $contenu = str_replace(">", "&gt;", $contenu);
+    $contenu = str_replace(" ", "&nbsp;", $contenu);
+    $contenu = str_replace("//", "<br />", $contenu);
+    echo $contenu;
+  } else {
+    echo _T('sktheme:to_be_done');
+  }
+  fin_cadre_trait_couleur();
+  debut_cadre_trait_couleur('', false, "sktheme_documentation", _T('sktheme:to_be_done'));
+  $todo = _DIR_PLUGIN_SKTHEME."/TODO.txt";
+  if (is_file($todo)) {
+    lire_fichier ($todo,$contenu);
+    $list = split('\/\/',$contenu);
+    foreach ($list as $lign) {
+      echo "$lign<br />";
+    }
+    echo "<br />";
+  } else {
+    echo _T('sktheme:to_be_done');
+  }
+   
+  fin_cadre_trait_couleur();
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_private_choice.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_private_choice.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_private_choice.php	(revision 30)
@@ -0,0 +1,67 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/sktheme_util');
+
+//
+// Private Area Page definition 
+//
+function exec_sktheme_private_choice() {
+
+  debut_page(_T('sktheme:private_theme_choice'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:private_theme_choice'));
+  
+  // Include 'onglets'
+  sktheme_private_choice_onglets();
+  
+  debut_gauche();
+  // Include 'raccourcis'
+  sktheme_raccourcis();
+
+  
+  debut_droite();
+  echo "<br />";
+  // debut_cadre_trait_couleur($icone='', $return = false, $fonction='', $titre=''){
+  debut_cadre_trait_couleur('', false, "sktheme_private_squelette_list", _T('sktheme:available_squelette_list'));
+  
+  echo '<br />';
+  echo _T('sktheme:to_be_done');
+  echo '<br />';
+   
+  fin_cadre_trait_couleur();
+  
+  debut_cadre_trait_couleur('', false, "sktheme_squelette_list", _T('sktheme:available_habillage_list'));
+
+  echo '<br />';
+  echo _T('sktheme:to_be_done');
+  echo '<br />';   
+  
+  fin_cadre_trait_couleur();
+ 
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_public_choice.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_public_choice.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/exec/sktheme_public_choice.php	(revision 30)
@@ -0,0 +1,259 @@
+<?php
+
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');   // for spip presentation functions
+include_spip('inc/layer');          // for spip layer functions
+include_spip('inc/utils');          // for _request function
+include_spip('inc/plugin');         // xml function
+include_spip('inc/sktheme_util');   // for sktheme_* functions
+include_spip('inc/sktheme_xml');    // for sktheme_* functions
+
+
+//
+// Public page choice definition
+//
+function exec_sktheme_public_choice() {
+
+  global $squelette_public_name; // parameter
+  global $habillage_public_name; // parameter
+  
+  // Get the specific action to do if some
+  $sktheme_action = _request('sktheme_action');
+  $original = _T('sktheme:original');
+
+  debut_page(_T('sktheme:public_theme_choice'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:public_theme_choice'));
+
+  // Include 'onglets'
+  sktheme_public_choice_onglets();
+  
+  debut_gauche();
+
+  // download a squelette distribution
+//  debut_cadre_gris_clair();
+//  echo '<form action="' . generer_url_action("sktheme_install") .'" method="post">';
+//  echo       '<strong>'._T('sktheme:zip_squelette_url').' : </strong>';
+//  echo       '<input type="text" name="zip_url" size="25" value="http://">';
+//  echo       '<input type="hidden" name="zip_type" value="squelette" />';
+//  echo	     '<input type="submit" value="Download" />';
+//  echo	'</form>';
+//  fin_cadre_gris_clair();
+
+  // download a habillage distribution
+// debut_cadre_gris_clair();
+// echo '<form action="' . generer_url_action("sktheme_install") .'" method="post">';
+// echo       '<strong>'._T('sktheme:zip_habillage_url').' : </strong>';
+// echo       '<input type="text" name="zip_url" size="25" value="http://">';
+// echo       '<input type="hidden" name="zip_type" value="habillage" />';
+// echo	     '<input type="submit" value="Download" />';
+// echo	'</form>';
+// fin_cadre_gris_clair();
+
+  // Include 'raccourcis'
+  sktheme_public_theme_doc_box();
+  
+  debut_droite();
+  
+  //
+  // Choose Squelette
+  $s_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_squelettes_public_dir'];
+  debut_cadre_trait_couleur('', false, "sktheme_public_squelette_list",
+			    _T('sktheme:available_squelette_list')." : ".$GLOBALS['meta']['sktheme_squelettes_public_dir']);
+  
+  $squelettes_list = array('dist' => '' );
+  if (is_dir($s_dir)) {
+    if ($dh = opendir($s_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($s_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is squelettes
+	  if (is_file($s_dir."/".$dir."/theme.xml")) {
+	    $s_info = sktheme_xml_get_infos($s_dir."/".$dir,"theme");
+	    $type = (isset($s_info['type'])) ? propre($s_info['type']) : "";
+	    if ($type == 'squelettes') {
+	      $squelettes_list[$dir]=$s_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    }
+  } else {
+      echo _T('sktheme:no_available_squelette');
+  }
+  
+  // Save if needed
+  if ($sktheme_action=="set_squelette") {
+    echo _T('sktheme:update_squelette_to') . $squelette_public_name. "<br />";
+    ecrire_meta('sktheme_squelette_public_name',$squelette_public_name);
+    // Set habillage to the original one when squelette is changed
+    ecrire_meta('sktheme_habillage_public_name',$original);
+    ecrire_metas();
+  } else {
+    $squelette_public_name = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+  	
+  echo '<br />';
+  echo '<form action="'.generer_url_ecrire("sktheme_public_choice", "sktheme_action=set_squelette").'" method="post">';
+  foreach( $squelettes_list as $key => $value) {
+    $s_info = sktheme_xml_get_infos($value,"theme");
+    echo debut_cadre_gris_clair();
+    echo $s_info['extra_img_puce'];
+    if ($squelette_public_name==$key) {
+      echo '<input type="radio" name="squelette_public_name" value="'.$key.'" checked="checked" />';
+      $o_info = $s_info;
+    } else {
+      echo '<input type="radio" name="squelette_public_name" value="'.$key.'" />';
+    }
+    echo bouton_block_invisible("$key");
+    echo "<strong>$key</strong>";
+    echo debut_block_invisible("$key");
+    echo _T('version') .' '.  $s_info['version'] . " | <strong>".$s_info['extra_titre_etat']."</strong><br />";
+    if (isset($s_info['description']))
+      echo "<hr />" . propre($s_info['description']) . "<br />";
+    if (isset($s_info['auteur']))
+      echo "<hr />" . _T('auteur') .' '. propre($s_info['auteur']) . "<br />";
+    if (isset($s_info['lien']))
+      echo "<hr />" . _T('info_url') .' '. propre($s_info['lien']) . "<br />";
+    echo fin_block();
+    echo fin_cadre_gris_clair();
+  }
+  echo '<br />';
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_squelette').'"></div></div>';
+  echo '</form>';
+  
+  
+  fin_cadre_trait_couleur();
+  
+  //
+  // Choose Habillage
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  debut_cadre_trait_couleur('', false, "sktheme_public_habillage_list", 
+			    _T('sktheme:available_habillage_list')." : ".$GLOBALS['meta']['sktheme_habillages_public_dir']);
+  
+  
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is themes
+	  if (is_file($h_dir."/".$dir."/theme.xml")) {
+	    $h_info = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    $type = (isset($h_info['type'])) ? propre($h_info['type']) : "";
+	    if ($type == 'themes') {
+	      $habillages_list[$dir]=$h_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    echo _T('sktheme:no_available_habillage');
+  }
+  
+  // Save habillage if needed
+  if ($sktheme_action=="set_habillage") {
+    echo _T('sktheme:update_habillage_to') . $habillage_public_name . "<br />";
+    ecrire_meta('sktheme_habillage_public_name',$habillage_public_name);
+    ecrire_metas();
+  } else {
+    $habillage_public_name = $GLOBALS['meta']['sktheme_habillage_public_name'];
+  }
+    
+  echo '<br />';
+  echo '<form action="'.generer_url_ecrire("sktheme_public_choice", "sktheme_action=set_habillage").'" method="post">';
+  foreach( $habillages_list as $key => $value) {
+    $h_info = sktheme_xml_get_infos($value,"theme");
+
+    // Check if habillage is available for this squelette selection
+    // probably better way to do it in php (such grep perl function ? but its
+    // works anyway)
+    $squelette_ok = false;
+    if (is_array($h_info['squelettes'])) {
+      foreach ($h_info['squelettes'] as $sq){
+	$sq = trim($sq);
+	if ($sq == $squelette_public_name) {
+	  $squelette_ok = true;
+	}
+      }
+    } else {
+      if ($h_info['squelettes'] == $squelette_public_name) {
+	$squelette_ok = true;
+      }
+    }
+    
+    if (($key == $original)||($squelette_ok)) {
+      echo debut_cadre_gris_clair();
+      if ($key == $original) {
+	echo $o_info['extra_img_puce'];
+      } else {
+	echo $h_info['extra_img_puce'];
+      }
+      if ($habillage_public_name==$key) {
+	echo '<input type=radio  name="habillage_public_name" value="'.$key.'" checked="checked" />';
+      } else {
+	echo '<input type=radio  name="habillage_public_name" value="'.$key.'" />';
+      }
+      echo bouton_block_invisible("$key");
+      if ($key == $original) {
+	echo "<strong><i>$key (".$o_info['nom'].")</i></strong>";
+	echo debut_block_invisible("$key");
+	echo _T('version') .' '.  $o_info['version'] . " | <strong>".$o_info['extra_titre_etat']."</strong><br />";
+	if (isset($o_info['description']))
+	  echo "<hr />" . propre($o_info['description']) . "<br />";
+	if (isset($o_info['auteur']))
+	  echo "<hr />" . _T('auteur') .' '. propre($o_info['auteur']) . "<br />";
+	if (isset($o_info['lien']))
+	  echo "<hr />" . _T('info_url') .' '. propre($o_info['lien']) . "<br />";
+
+      } else {
+	echo "<strong>$key</strong>";
+	echo debut_block_invisible("$key");
+	echo _T('version') .' '.  $h_info['version'] . " | <strong>".$h_info['extra_titre_etat']."</strong><br />";
+	if (isset($h_info['description']))
+	  echo "<hr />" . propre($h_info['description']) . "<br />";
+	if (isset($h_info['auteur']))
+	  echo "<hr />" . _T('auteur') .' '. propre($h_info['auteur']) . "<br />";
+	if (isset($h_info['lien']))
+	  echo "<hr />" . _T('info_url') .' '. propre($h_info['lien']) . "<br />";
+      }
+      echo fin_block();
+      echo fin_cadre_gris_clair();
+    }
+  }
+    
+  echo '<br />';
+  echo '<div><div align="right"><input type="submit" value="'._t('sktheme:save_habillage').'"></div></div>';
+  echo '</form>';
+  
+  fin_cadre_trait_couleur();
+  
+  
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_balises.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_balises.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_balises.php	(revision 30)
@@ -0,0 +1,51 @@
+<?php
+
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+
+include_spip('inc/sktheme_list');
+
+// @param p est un objet SPIP
+function balise_SKTHEME_THEMES_SWITCHER ($p) {
+  $sktheme_list = sktheme_list();
+  $code.='<form action="" method="post">';
+  $code.='<select name="selecteurTheme" style="'.$GLOBALS['meta']['sktheme_theme_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+  $code.='<option selected="selected" value="">'._T('themes').'</option>';
+  foreach( $sktheme_list as $value )	$code.='<option value="'.parametre_url(self(),'var_sktheme',$value).'">&nbsp;-> '.$value.'</option>';
+  $code.='</select>';
+  $code.='</form>';  
+  
+  $p->code = "'$code'";
+  return ($p);
+}
+
+// @param p est un objet SPIP
+function balise_SKTHEME_HABILLAGES_SWITCHER ($p) {
+  $sktheme_habillage_list = sktheme_habillage_list();
+  $code.='<form action="" method="post">';
+  $code.='<select name="selecteurHabillage" style="'.$GLOBALS['meta']['sktheme_habillage_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+  $code.='<option selected="selected" value="">'._T('habillages').'</option>';
+  foreach( $sktheme_habillage_list as $value )	{
+    $code.='<option value="'.parametre_url(self(),'var_sktheme',"__current::".$value).'">&nbsp;-> '.$value.'</option>';
+  }
+  $code.='</select>';
+  $code.='</form>';  
+  $p->code = "'$code'";
+  return ($p);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_list.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_list.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_list.php	(revision 30)
@@ -0,0 +1,159 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+  
+  // Create theme list
+function sktheme_list() {
+    
+  include_spip('inc/sktheme_xml');
+
+  $original = _T('sktheme:original');
+  $sktheme_list = array();
+  
+  $s_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_squelettes_public_dir'];
+  $squelettes_list = array('dist' => '' );
+  if (is_dir($s_dir)) {
+    if ($dh = opendir($s_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($s_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is squelettes
+	  if (is_file($s_dir."/".$dir."/theme.xml")) {
+	    $s_info = sktheme_xml_get_infos($s_dir."/".$dir,"theme");
+	    $type = (isset($s_info['type'])) ? propre($s_info['type']) : "";
+	    if ($type == 'squelettes') {
+	      $squelettes_list[$dir]=$s_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    }
+  } else {
+    // no extra directory for squelette
+    array_push($sktheme_list,"dist::".$original);
+    return $sktheme_list;
+  }
+
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is themes
+	  if (is_file($h_dir."/".$dir."/theme.xml")) {
+	    $h_info = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    $type = (isset($h_info['type'])) ? propre($h_info['type']) : "";
+	    if ($type == 'themes') {
+	      $habillages_list[$dir] = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    // no habillage directory
+    foreach( $squelettes_list as $s_key => $s_value) {
+      array_push($sktheme_list,$s_key."::".$original);
+      return $sktheme_list;
+    }
+  }
+
+  // Look for matching theme
+  foreach( $squelettes_list as $s_key => $s_value) {
+    
+    foreach( $habillages_list as $h_key => $h_info) {
+      if ($h_key == $original) {
+	array_push($sktheme_list,$s_key."::".$h_key);
+      } else {
+	$squelette_ok = false;
+	if (is_array($h_info['squelettes'])) {
+	  foreach ($h_info['squelettes'] as $sq){
+	    $sq = trim($sq);
+	    if ($sq == $s_key) {
+	      $squelette_ok = true;
+	    }
+	  }
+	} else {
+	  if ($h_info['squelettes'] == $s_key) {
+	    $squelette_ok = true;
+	  }
+	}
+	if ($squelette_ok) {
+	  array_push($sktheme_list,$s_key."::".$h_key);
+	}
+      }
+    }
+  }
+  return $sktheme_list;
+}
+
+
+
+function sktheme_habillage_list() {
+    
+  include_spip('inc/sktheme_xml');
+
+  $original = _T('sktheme:original');
+  $sktheme_habillage_list = array();
+  
+  $squelette_name = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($file = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$file)) AND ($file[0]!=".") ) {
+	  $habillages_list[$file] = sktheme_xml_get_infos($h_dir."/".$file,"theme");
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    // no habillage directory
+    array_push($sktheme_habillage_list,$original);
+    return $sktheme_habillage_list;
+  }
+
+  // Look for matching theme
+    
+  foreach( $habillages_list as $h_key => $h_info) {
+    if ($h_key == $original) {
+      array_push($sktheme_habillage_list,$h_key);
+    } else {
+      $squelette_ok = false;
+      if (is_array($h_info['squelettes'])) {
+	foreach ($h_info['squelettes'] as $sq){
+	  $sq = trim($sq);
+	  if ($sq == $squelette_name) {
+	    $squelette_ok = true;
+	  }
+	}
+      } else {
+	if ($h_info['squelettes'] == $squelette_name) {
+	  $squelette_ok = true;
+	}
+      }
+      if ($squelette_ok) {
+	array_push($sktheme_habillage_list,$h_key);
+      }
+    }
+  }
+  return $sktheme_habillage_list;
+}
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_util.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_util.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_util.php	(revision 30)
@@ -0,0 +1,99 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+include_spip('inc/presentation');
+
+// Build 'onglets' for all pages
+function sktheme_public_choice_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_public_choice", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_public_choice", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_public_choice", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_public_choice", "sktheme_doc", "");
+   fin_onglet();
+
+}
+function sktheme_private_choice_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_private_choice", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_private_choice", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_private_choice", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_private_choice", "sktheme_doc", "");
+  fin_onglet();
+
+}
+function sktheme_config_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_config", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_config", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_config", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_config", "sktheme_doc", "");
+  fin_onglet();
+
+}
+function sktheme_doc_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_doc", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_config", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_doc", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_doc", "sktheme_doc", "");
+  fin_onglet();
+
+}
+
+// Build 'raccourcis' for all pages
+function sktheme_raccourcis() {
+
+  debut_raccourcis();
+  
+  
+  fin_raccourcis();
+
+}
+
+// Build documentation
+function sktheme_config_doc_box() {
+  
+  debut_cadre_relief();
+  echo _T('sktheme:config_doc_directories');
+  fin_cadre_relief();
+  debut_cadre_relief();
+  echo _T('sktheme:config_doc_switcher');
+  fin_cadre_relief();
+  
+}
+
+// Build documentation
+function  sktheme_public_theme_doc_box() {
+  debut_cadre_relief();
+  echo _T('sktheme:public_theme_doc_squelette');
+  fin_cadre_relief();
+  debut_cadre_relief();
+  echo _T('sktheme:public_theme_doc_habillage');
+  fin_cadre_relief();
+ 
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_xml.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_xml.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/inc/sktheme_xml.php	(revision 30)
@@ -0,0 +1,173 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function sktheme_xml_get_infos($xml_dir,$xml_type){
+
+  include_spip('inc/plugin'); 
+
+  $ret = array();
+  if ((@file_exists($xml_dir))&&(is_dir($xml_dir))){
+    if (@file_exists($xml_dir."/$xml_type.xml")) {
+      lire_fichier($xml_dir."/$xml_type.xml", $texte);
+      $arbre = parse_plugin_xml($texte);
+      if (!isset($arbre[$xml_type])&&is_array($arbre[$xml_type]))
+	$arbre = array('erreur' => array(_T('erreur_plugin_fichier_def_incorrect')." : $xml_dir/$xml_type.xml"));
+    }
+    else {
+      // pour arriver ici on l'a vraiment cherche...
+      //debug echo "error: erreur_plugin_fichier_def_absent $xml_dir/$xml_type.xml<br>";
+      $arbre = array('erreur' => array(_T('erreur_plugin_fichier_def_absent')." : $xml_dir/$xml_type.xml"));
+    }
+
+    sktheme_xml_verifie_conformite($xml_dir,$xml_type,$arbre);
+		
+    $ret['nom'] = applatit_arbre($arbre['nom']);
+    $ret['version'] = trim(end($arbre['version']));
+    if (isset($arbre['auteur']))
+      $ret['auteur'] = applatit_arbre($arbre['auteur']);
+    if (isset($arbre['description']))
+      $ret['description'] = applatit_arbre($arbre['description']);
+    if (isset($arbre['lien']))
+      $ret['lien'] = join(' ',$arbre['lien']);
+    if (isset($arbre['etat']))
+      $ret['etat'] = trim(end($arbre['etat']));
+    if (isset($arbre['options']))
+      $ret['options'] = $arbre['options'];
+    if (isset($arbre['fonctions']))
+      $ret['fonctions'] = $arbre['fonctions'];
+    $ret['prefix'] = $arbre['prefix'];
+    if (isset($arbre['pipeline']))
+      $ret['pipeline'] = $arbre['pipeline'];
+    if (isset($arbre['erreur']))
+      $ret['erreur'] = $arbre['erreur'];
+    if (isset($arbre['squelettes'])) {
+      $ret['squelettes'] = $arbre['squelettes'];
+    }
+    if (isset($arbre['type'])) {
+      $ret['type'] =  trim(applatit_arbre($arbre['type']));
+    }
+
+    // Compute extra values
+    $etat = 'dev';
+    if (isset($ret['etat']))
+      $etat = $ret['etat'];
+    switch ($etat) {
+    case 'experimental':
+      $puce = 'puce-rouge.gif';
+      $titre_etat = _T('plugin_etat_experimental');
+      break;
+    case 'test':
+      $puce = 'puce-orange.gif';
+      $titre_etat = _T('plugin_etat_test');
+      break;
+    case 'stable':
+      $puce = 'puce-verte.gif';
+      $titre_etat = _T('plugin_etat_stable');
+      break;
+    default:
+      $puce = 'puce-poubelle.gif';
+      $titre_etat = _T('plugin_etat_developpement');
+      break;
+    }
+    $ret['extra_puce']       = $puce;
+    $ret['extra_img_puce']   = "<img src='"._DIR_IMG_PACK."$puce' width='9' height='9' style='border:0;' alt=\"$titre_etat\" title=\"$titre_etat\" />&nbsp;";
+    $ret['extra_titre_etat'] = $titre_etat;
+  }
+  return $ret;
+}
+
+function sktheme_xml_verifie_conformite($xml_dir,$xml_type="plugin",&$arbre){
+	$silence = false;
+	if (isset($arbre[$xml_type])&&is_array($arbre[$xml_type]))
+		$arbre = end($arbre[$xml_type]); // derniere def xml_type
+	else{
+		$arbre = array('erreur' => array(_T('erreur_plugin_tag_plugin_absent')." : $xml_dir/plugin.xml"));
+		$silence = true;
+	}
+  // verification de la conformite du plugin avec quelques
+  // precautions elementaires
+  if (!isset($arbre['nom'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_nom_manquant');
+		$arbre['nom'] = array("");
+	}
+  if (!isset($arbre['version'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_version_manquant');
+		$arbre['version'] = array("");
+	}
+  if (!isset($arbre['prefix'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_prefix_manquant');
+		$arbre['prefix'] = array("");
+	}
+	else{
+		$prefix = "";
+		$prefix = trim(end($arbre['prefix']));
+		if (isset($arbre['etat'])){
+			$etat = trim(end($arbre['etat']));
+			if (!preg_match(',^(dev|experimental|test|stable)$,',$etat))
+				$arbre['erreur'][] = _T('erreur_plugin_etat_inconnu')." : $etat";
+		}
+		if (isset($arbre['options'])){
+			foreach($arbre['options'] as $optfile){
+				$optfile = trim($optfile);
+				if (!@is_readable(_DIR_PLUGINS."$xml_dir/$optfile"))
+  				if (!$silence)
+						$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile";
+			}
+		}
+		if (isset($arbre['fonctions'])){
+			foreach($arbre['fonctions'] as $optfile){
+				$optfile = trim($optfile);
+				if (!@is_readable(_DIR_PLUGINS."$xml_dir/$optfile"))
+  				if (!$silence)
+						$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile";
+			}
+		}
+		$fonctions = array();
+		if (isset($arbre['fonctions']))
+			$fonctions = $arbres['fonctions'];
+	  $liste_methodes_reservees = array('__construct','__destruct','plugin','install','uninstall',strtolower($prefix));
+		if (is_array($arbre['pipeline'])){
+			foreach($arbre['pipeline'] as $pipe){
+				$nom = trim(end($pipe['nom']));
+				if (isset($pipe['action']))
+					$action = trim(end($pipe['action']));
+				else
+					$action = $nom;
+				// verif que la methode a un nom autorise
+				if (in_array(strtolower($action),$liste_methodes_reservees)){
+					if (!$silence)
+						$arbre['erreur'][] = _T("erreur_plugin_nom_fonction_interdit")." : $action";
+				}
+				else{
+					// verif que le fichier de def est bien present
+					if (isset($pipe['inclure'])){
+						$inclure = _DIR_PLUGINS."$xml_dir/".end($pipe['inclure']);
+						if (!@is_readable($inclure))
+		  				if (!$silence)
+								$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $inclure";
+					}
+				}
+			}
+		}
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_en.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_en.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_en.php	(revision 30)
@@ -0,0 +1,138 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Available habillages",
+	  "available_squelette_list" => "Available squelettes",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Advanced configuration",
+	  "config_doc_directories" => "<b>R&eacute;pertoires</b>:<br>
+	  It is possible to re-defined default directories locations of yours
+	  <i>squelettes/habillages</i> distributions.Default is  the <i>'themes'</i>
+	   directory, directories are always relatives to
+	  your SPIP root site.
+	  ",
+	  "config_doc_switcher" => "<b>Switcher</b>:<br>
+	  The theme switcher can be activated to include a selection list in the
+	  public area, and then easily test themes. It is possible to limit this
+	  functionnality to the administrator only.<br>
+	  Moreover you can modify the style of this theme selector.<br>
+	  <br>
+	  A new 'balise' <b>#SKTHEME_HABILLAGES_SWITCHER</b> is available to
+	  include an 'habillage' selector list in your squelette. This list is
+	  composed of all available 'habillage' corresponding to the squelette
+	  distribution you have choosen. You can as well modify this
+	  list selector style here.
+	  
+	  
+	  ",
+	  
+	  // D
+	  "documentation" => "Documentation",
+	  "extra_documentation" => "Extra Documentation",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "Public habillages directory",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuration",
+	  "manage_theme" => "Manage themes",
+
+	  // N
+	  "no" => "No",
+	  "no_available_habillage" => "No available habillage",
+	  "no_available_squelette" => "No available squelette",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Private theme choice",
+	  "private_themes_config" => "Private themes configuration",
+	  "private_theme_choice" => "Private theme choice",
+	  "public_choice" => "Public theme choice",
+	  "public_theme_choice" => "Public theme choice",
+	  "public_themes_config" => "Public themes configuration",
+	  "public_theme_doc_squelette" => "<b>Squelette choice:</b><br>
+	  Each time you will choose a 'squelette' (more exactly a squelettes distribution)
+	  the 'habillage' list will be updated with the available ones.
+	  The small square represent the state of the distribution, stable,
+	  test, experimental, ...<br>
+	  Clic on the small black triangle to get more details about the distribution.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Habillage choice:</b><br>
+	  An Habillage is modifing colors and graphical aspect of your squelettes.
+	  It is composed of CSS, pictures, ...<br>
+	  A squelette distribution always contain a default 'habillage' which is
+	  called <b>Original</b>.  
+	  ",
+	  
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Save habillage",
+	  "save_public_directories" => "Save directories",
+	  "save_squelette" => "Save squelette",
+	  "save_switcher_options" => "Save switcher options",
+	  "squelettes_public_dir" => "Public squelettes directory",
+	  "switcher_activated" => "Theme switcher activated",
+	  "switcher_admin_only" => "Only for administrators",
+	  "switcher_style" => "Switcher style",
+
+	  // T
+	  "to_be_done" => "To be done !",
+	  "themes_switcher" => "Theme switch",
+
+	  // U
+	  "update_habillage_to" => "Update habillage to : ",
+	  "update_squelette_to" => "Update squelette to : ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "Yes",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_es.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_es.php	(revision 30)
@@ -0,0 +1,131 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Lista de pieles disponibles",
+	  "available_squelette_list" => "Lista de esqueletos disponibles",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Configuraci&oacute;n avanzada",
+	  "config_doc_directories" => "<b>Carpetas</b>:<br /> 
+	  Es posible redefinir las carpetas de almacenaje de tus <i>'esqueletos'</i> 
+	  y de tus <i>'pieles'</i>, por omisi&oacute;n est&aacute;n en la carpeta 
+	  <i>'themes'</i>. Estas carpetas siempre son relativas a la ra&iacute;z detu sitio SPIP.
+	  ",
+	  "config_doc_switcher" => "<b>Alternador</b>:<br />
+	  Le 'alternador' (o 'switcher' de temas permite hacer aparecer una lista de selecci&oacute;n
+	  de temas en el espacio p&uacute;blico y as&iacute; probar los diferentes temas m&aacute;s 
+	  r&aacute;pidamente. Es posible limitar esta posibilidad s&oacute;lo a los administradores.<br />
+	  Adicionalmente, puedes cambiar aqu&iacute; el estilo de tiuselector de temas. 
+	  <br />
+	  <br />
+	  TambiÃ©n existe una baliza<br /> <b><small>#SKTHEME_HABILLAGES_SWITCHER</small></b><br />
+	  que es posible integrar a los esqueletos para disponer, esta vez, de un selector que corresponda a 
+      tu elecci&oacute;n de esqueletos. Igualmente, se puede modificar el estilo de este selector.
+	  ",
+	  // D
+	  "documentation" => "Documentaci&oacute;n",
+	  "extra_documentation" => "Documentaci&oacute;n extra",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "Carpetas para las pieles p&uacute;blicas",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuraci&oacute;n",
+	  "manage_theme" => "Gesti&oacute;n des temas",
+
+	  // N
+	  "no" => "No",
+	  "no_available_habillage" => "Ninguna piel disponible",
+	  "no_available_squelette" => "Aucun squelette disponible",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Elecci&oacute;n tema privado",
+	  "private_themes_config" => "Configuraci&oacute;n para los temas privados",
+	  "private_theme_choice" => "Elecci&oacute;n del tema del espacio privado",
+	  "public_choice" => "Elecci&oacute;n tema p&uacute;blico",
+	  "public_theme_choice" => "Elecci&oacute;n del tema del espacio p&uacute;blico",
+	  "public_themes_config" => "Configuraci&oacute;n para los temas p&uacute;blicos",
+	  "public_theme_doc_squelette" => "<b>Elecci&oacute;n del esqueleto:</b><br />
+	  Cada vez que seleccionar&aacute;s un esqueleto (m&aacute;s exactamente una distribuci&oacute;n de 
+	  esqueletos) la lista de ropas disponibles se actualiza. El cuadradito indica el estado de la
+	  distribuci&oacute;n de esqueletos: estable, test, experimental ...<br />
+	  Para mayores detalles acerca de una distribuci&oacute;n pincha en la flecha negra.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Elecci&oacute;n de la piel:</b><br />
+	  Las 'pieles' permiten modificar los colores y el aspecto gr&aacute;fico de una distribuci&oacute;n 
+	  de esqueletos. Se trata de CSS y/o de im&aacute;genes, ect. <br /> 
+	  Una distribuci&oacute;n de esqueletos siempre contiene una presentaci&oacute;n gr&aacute;fica
+      por omisi&oacute;n, que corresponde a la piel denominada <b>Original</b>.
+	  ",
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Guardar la piel",
+	  "save_public_directories" => "Guardar las carpetas ",
+	  "save_squelette" => "Guardar es esqueleto",
+	  "save_switcher_options" => "Guardar las opciones del alternador",
+	  "squelettes_public_dir" => "Carpetas para los esqueletos p&uacute;blicos",
+	  "switcher_activated" => "Activar el alternador de temas",
+	  "switcher_admin_only" => "S&oacute;lo para los administratdores",
+	  "switcher_style" => "Style du switcher",
+
+	  // T
+	  "to_be_done" => "&iexcl;a&uacute;n por hacer!",
+	  "themes_switcher" => "Alternador de temas",
+
+	  // U
+	  "update_habillage_to" => "Actualizaci&oacute;n de la piel por: ",
+	  "update_squelette_to" => "Actualizaci&oacute;n del esqueleto por: ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "S&iacute;",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/lang/sktheme_fr.php	(revision 30)
@@ -0,0 +1,140 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Liste des habillages disponibles",
+	  "available_squelette_list" => "Liste des squelettes disponibles",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Configuration avanc&eacute;e",
+	  "config_doc_directories" => "<b>R&eacute;pertoires</b>:<br /> 
+	  Il est possible de red&eacute;finir les r&eacute;pertoires de stockage 
+	  de vos <i>'squelettes'</i> et de vos <i>'habillages'</i>, par 
+	  d&eacute;faut il s'agit du r&eacute;pertoire <i>'themes'</i>, les r&eacute;pertoires sont toujours 
+	  relatifs &agrave; la racine de votre site SPIP 
+	  ",
+	  "config_doc_switcher" => "<b>Switcher</b>:<br />
+	  Le 'switcher' de th&egrave;mes permet de faire appara&icirc;tre une liste de
+	  s&eacute;lection de th&egrave;mes dans l'espace public et ainsi tester
+	  les diff&eacute;rents th&egrave;mes plus rapidement. Il est possible
+	  de ne donner cette possibilit&eacute; qu'aux administrateurs<br />
+	  De plus vous pouvez changer le style de votre s&eacute;lecteur de
+	  th&egrave;mes ici.
+	  <br>
+	  <br>
+	  Il existe &eacute;galement une balise <br />
+	  <b><small>#SKTHEME_HABILLAGES_SWITCHER</small></b><br />
+	  qu'il est possible d'int&eacute;grer &agrave; vos squelettes pour disposer
+	  cette fois d'un s&eacute;lecteur d'habillage correspondant &agrave; votre
+	  choix de squelette. Une fois encore vous pouvez en modifier le style si besoin.
+	  ",
+	  // D
+	  "documentation" => "Documentation",
+	  "extra_documentation" => "Extra Documentation",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "R&eacute;pertoires pour les habillages publics",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuration",
+	  "manage_theme" => "Gestion des th&egrave;mes",
+
+	  // N
+	  "no" => "Non",
+	  "no_available_habillage" => "Aucun habillage disponible",
+	  "no_available_squelette" => "Aucun squelette disponible",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Choix th&egrave;me priv&eacute;",
+	  "private_themes_config" => "Configuration pour les th&egrave;mes priv&eacute;s",
+	  "private_theme_choice" => "Choix du th&egrave;me de l'espace priv&eacute;",
+	  "public_choice" => "Choix th&egrave;me public",
+	  "public_theme_choice" => "Choix du th&egrave;me de l'espace public",
+	  "public_themes_config" => "Configuration pour les th&egrave;mes publics",
+	  "public_theme_doc_squelette" => "<b>Choix du squelette :</b><br />
+	  Chaque fois que vous s&eacute;lectionnez un squelette (plus exactement une
+	  distribution de squelettes) la liste des habillages disponibles est mise &agrave; 
+	  jour. Le petit carr&eacute;s indique l'&eacute;tat de
+	  la distribution de squelette, stable, test, experimental ...<br />
+	  Pour plus de d&eacute;tail sur une distribution cliquez sur la
+	  fl&egrave;che noire.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Choix de l'habillage :</b><br />
+	  Les habillages permettent de modifier les couleurs et l'aspect
+	  graphique d'une distribution de squelettes. Il s'agit de CSS et/ou d'images
+	  etc ...<br /> 
+	  Une distribution de squelette contient toujours une
+	  pr&eacute;sentation graphique par d&eacute;faut, ceci correspond
+	  &agrave; l'habillage nomm&eacute; <b>Original</b>.
+	  ",
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Enregister l'habillage",
+	  "save_public_directories" => "Enregistrer les r&eacute;pertoires",
+	  "save_squelette" => "Enregister le squelette",
+	  "save_switcher_options" => "Enregistrer les options du switcher",
+	  "squelettes_public_dir" => "R&eacute;pertoires pour les squelettes publics",
+	  "switcher_activated" => "Activer le switcher de th&egrave;me",
+	  "switcher_admin_only" => "Seulement pour les administrateurs",
+	  "switcher_style" => "Style du switcher",
+
+	  // T
+	  "to_be_done" => "&agrave; faire !",
+	  "themes_switcher" => "Switcher de th&egrave;me",
+
+	  // U
+	  "update_habillage_to" => "Mise &agrave; jour de l'habillage par : ",
+	  "update_squelette_to" => "Mise &agrave; jour du squelette par : ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "Oui",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/plugin.xml	(revision 30)
@@ -0,0 +1,38 @@
+<plugin>
+ <nom>SkTheme (SPIP 1.9.1)</nom>
+ <version>0.6</version>
+ <etat>stable</etat>
+ <auteur>Skedus
+<multi>
+_ &copy; September 2006 - distributed under GNU/GPL licence.
+[fr]_ &copy; Septembre 2006 - distribu&#233; sous license GNU/GPL.
+</multi>
+</auteur>
+<description>
+<multi>
+Manage theme for SPIP
+_ WATCH OUT: You need to desactivate switcher plugin (quite incompatible because using same process - this means i copied it inside this plugin and i would like to thank  its authors Philippe Drouot and Fil for this nice switcher plugin)
+_ Activate this plugin and manage themes in the {{Configuration}} menu.
+[fr]
+Gestion des th&#232;mes de SPIP
+_ ATTENTION: D&#233;sactivez le plugin switcher (ils sont quelque peu incompatibles, car il est monstreusement copi&#233; dans ce plugin, merci aux auteurs Philippe Drouot et Fil)
+_ Activez ce plugin et g&#233;rez les th&#232;mes dans le menu {{Configuration}}.
+</multi>
+</description>
+	<lien>http://skedus.free.fr/spip/spip.php?article8</lien> <!-- URI de documentation -->
+ <prefix>sktheme</prefix>
+ <options>sktheme_options.php</options>
+ <pipeline>
+    <nom>ajouter_boutons</nom>
+    <inclure>sktheme_fonctions.php</inclure>
+ </pipeline>
+ <pipeline>
+    <nom>affichage_final</nom>
+    <action>affichage_final</action>
+    <inclure>sktheme_fonctions.php</inclure>
+ </pipeline>
+ <pipeline>
+   <nom>insert_head</nom>
+      <inclure>sktheme_head.php</inclure>
+ </pipeline>
+ </plugin>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_fonctions.php	(revision 30)
@@ -0,0 +1,89 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
+define('_DIR_PLUGIN_SKTHEME',(_DIR_PLUGINS.end($p)));
+
+include_spip('inc/sktheme_list');
+
+// Add private area button
+function sktheme_ajouter_boutons($boutons_admin) {
+  // administrator only
+  if ($GLOBALS['connect_statut'] == "0minirezo" && $GLOBALS["connect_toutes_rubriques"]) {
+    
+    // See button in the 'configuration' 
+    $boutons_admin['configuration']->sousmenu["sktheme_public_choice"]= 
+       new Bouton("../"._DIR_PLUGIN_SKTHEME."/img_pack/sktheme_icon.png",  // icon
+		  _L("sktheme:manage_theme"));                                     // title
+  }
+  return $boutons_admin;
+}
+
+
+//
+// Include Philippe Drouot switcher functionnality
+// Based on Fil contrib
+function sktheme_affichage_final($texte){
+	
+  global $html;
+  
+  $sktheme_list = sktheme_list();
+   
+  // Insertion du Javascript de rechargement de page
+  // Always include this script used for #SKTHEME_HABILLAGES_SWITCHER and #SKTHEME_THEMES_SWITCHER
+  $code = '<script type="text/javascript">
+		//<![CDATA[
+		function sktheme_gotof(url) {
+		window.location=url;
+		}//]]>
+		</script>';	  
+  
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) 
+      AND ($GLOBALS['meta']['sktheme_switcher_activated']=="yes")) {
+    if ($html) {
+		
+      // Doit-on afficher le selecteur de squelette ? (Fonctionnalite restreinte aux seuls administrateurs ?)
+      $afficherSelecteur=TRUE;
+      if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) 
+	  AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="yes") 
+	  AND (!isset($_COOKIE['spip_admin']))) $afficherSelecteur=FALSE;
+		
+      if ($afficherSelecteur) {
+			
+			
+	// Insertion du selecteur de squelettes			
+	$code.='<div id="sktheme_switcher" style="top: 0;left: 20px; position: absolute; background-color: transparent;z-index: 100;">';
+	$code.='<form action="" method="post">';
+	$code.='<fieldset style="margin:0;padding:0;border:0">';
+	$code.='<select name="selecteurTheme" style="'.$GLOBALS['meta']['sktheme_theme_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+	$code.='<option selected="selected" value="">Themes</option>';
+	foreach( $sktheme_list as $value )	$code.='<option value="'.parametre_url(self(),'var_sktheme',$value).'">&nbsp;-> '.$value.'</option>';
+	$code.='</select>';
+	$code.='</fieldset>';
+	$code.='</form>';
+	$code.='</div>';
+      }
+
+			
+    }
+  } 
+	// On rajoute le code du selecteur de squelettes avant la balise </body>  
+	$texte=eregi_replace("</body>","$code</body>",$texte);
+	return($texte);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_head.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_head.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_head.php	(revision 30)
@@ -0,0 +1,23 @@
+<?php
+
+
+
+function sktheme_insert_head($flux){
+  
+  if ($GLOBALS['meta']['sktheme_switcher_activated']) {
+
+    $flux .='
+	<style type="text/css" media="print">
+/* <![CDATA[ */
+	#sktheme_switcher { display: none; }
+/* ]]> */
+	</style>
+';
+
+    return $flux;
+  
+  }  
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_options.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_1/sktheme_options.php	(revision 30)
@@ -0,0 +1,90 @@
+<?php
+// ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+  // cache desactivation
+  $_SERVER['REQUEST_METHOD']='POST';
+
+include_spip("inc/meta");
+include_spip('inc/sktheme_balises');
+
+// Set a default configuration - each values can be modify 
+// in the private area
+if (!isset($GLOBALS['meta']['sktheme_squelettes_public_dir'])){
+  ecrire_meta('sktheme_squelettes_public_dir',"themes");
+  ecrire_meta('sktheme_habillages_public_dir',"themes");
+  ecrire_meta('sktheme_squelette_public_name',"dist");
+  ecrire_meta('sktheme_habillage_public_name',"");
+  ecrire_meta('sktheme_theme_switcher_style',"font-size: 10px;background-color: #FFF;color: #0C479D;border-top: 1px solid #CECECE; border-bottom: 2px solid #4A4A4A; border-left: 1px solid #CECECE; border-right: 1px solid #CECECE;margin:2px .5em;");
+  ecrire_meta('sktheme_habillage_switcher_style',"font-size: 10px;background-color: #FFF;color: #0C479D;border-top: 1px solid #CECECE; border-bottom: 2px solid #4A4A4A; border-left: 1px solid #CECECE; border-right: 1px solid #CECECE;margin:2px .5em;");
+  ecrire_meta('sktheme_switcher_activated',"no");
+  ecrire_meta('sktheme_switcher_admin_only',"yes");
+  ecrire_metas();
+} 
+
+// Set default user choice
+$s_dir = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$GLOBALS['meta']['sktheme_squelette_public_name'];
+$h_dir = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$GLOBALS['meta']['sktheme_habillage_public_name'];
+
+//
+// SWITCHER THEME
+//
+// Contrib de Fil : voir http://trac.rezo.net/trac/spip-zone/browser/_contribs_/switcher/switcher.php
+// --------------------------------------------------------------------------------------------------
+// Ask sktheme 
+if (isset($_GET['var_sktheme'])) {
+  
+  // sktheme format : 
+  // for theme           = squelette_name::habillage_name
+  // for habillage only  = __current::habillage_name
+  // 
+  list($squelette,$habillage)= split ("::", $_GET['sktheme']);
+    
+  // For habillage only
+  if ($squelette == "__current") {
+    $squelette = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+    
+  $s_dir = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$squelette;
+  $h_dir = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$habillage;
+  if (is_dir(_DIR_RACINE.$s_dir)) {
+    // theme exist put a cookie
+    setcookie('spip_sktheme', $_COOKIE['spip_sktheme'] = $_GET['var_sktheme'], NULL, '/');
+  } else {
+    // not valid remove cookie
+    setcookie('spip_sktheme', $_COOKIE['spip_sktheme'] = '', -24*3600, '/');
+  }
+}
+
+if (isset($_COOKIE['spip_sktheme'])) {
+  list($squelette,$habillage)= split ("::", $_COOKIE['spip_sktheme']);
+  // For habillage only
+  if ($squelette == "__current") {
+    $squelette = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+  $s_dir_new = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$squelette;
+  $h_dir_new = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$habillage;
+  
+  if (is_dir(_DIR_RACINE.$s_dir_new)) {
+    $s_dir = $s_dir_new;
+  }
+  if (is_dir(_DIR_RACINE.$h_dir_new)) {
+    $h_dir = $h_dir_new;
+  }
+} 
+
+// So set only the 'dossier_squelettes' to the corresponding user choice
+$dossier_squelettes = $h_dir.':'.$s_dir;
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/COPYING.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/COPYING.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/COPYING.txt	(revision 30)
@@ -0,0 +1,344 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/DOCUMENTATION.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/DOCUMENTATION.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/DOCUMENTATION.txt	(revision 30)
@@ -0,0 +1,76 @@
+// ----------------------------------------------------------------------------
+// STRUCTURE DOCUMENTATION
+//     
+// The Theme directory structure need to be like this
+// This is only for the public theme
+// 
+// themes/ 
+//      <squelette_dir1>
+//         theme.xml
+//        <files ... >
+//      <squelette_dir2>
+//         theme.xml
+//        <files ... >
+//      <...>
+//      <habillage_dir1>
+//         theme.xml
+//        <files ...>
+//      <habillage_dir2>
+//         theme.xml
+//        <files ...>
+//
+// Theme = Squelette [+ Habillage]
+// Habillage is optional, because default 'habillage' could be in the
+// 'squelette' directory itself (such 'dist').
+//
+// Available 'squelettes' or 'habillage' can be now stored in the same
+// directory but you still have the possibility to have 2 differents 
+// directories
+//
+// ---------------------------------------------------------------------------
+// Habillage
+// theme.xml (use to give a description in the interface and to select it
+//                with <squelettes> name)
+//    <theme>
+// 	<nom>name_of_the_habillage</nom>
+// 	<auteur>
+// 	author of the habillage
+// 	</auteur>
+// 	<version>
+// 	1.0
+// 	</version>
+// 	<etat>
+// 	stable
+// 	</etat>
+// 	<description>
+// 	...
+// 	</description>
+//      <type>themes</type>
+// 	<squelettes>dist</squelettes>
+// 	<squelettes>SarkaSpip</squelettes>
+//    </theme>
+//
+// You can define several dependances <squelettes></squelettes>
+// 
+// ---------------------------------------------------------------------------
+// Squelette
+// theme.xml (use to give description in the interface)
+//
+//    <theme>
+// 	<nom>name_of_the_squelette</nom>
+// 	<auteur>
+// 	author of the squelette
+// 	</auteur>
+// 	<version>
+// 	1.0
+// 	</version>
+// 	<etat>
+// 	stable
+// 	</etat>
+//      <type>squelettes</type>
+// 	<description>
+// 	...
+// 	</description>
+//    </theme>
+//
+// ---------------------------------------------------------------------------
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/TODO.txt
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/TODO.txt	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/TODO.txt	(revision 30)
@@ -0,0 +1,10 @@
+// <b>VOUS POUVEZ AJOUTER DES ELEMENTS A CETTE LISTE</b>
+// <b>TODO</b>: Probablement ajouter des tests pour detecter l'usage de 'dossier_squelettes'.
+// <b>TODO</b>: Telecharger un squelette ou un theme distribue par internet et l'installer.
+// <b>TODO</b>: Afficher les fichiers capture.png si ils existent
+//
+// <b>YOU CAN ADD ITEM TO THIS LIST AS YOU WISH</b>
+// <b>TODO</b>: Probably add some tests to detect the usage of 'dossier_squelettes'.
+// <b>TODO</b>: Download a whole squelette or theme zip distribution trough the net and install it.
+// <b>TODO</b>: Display capture.png files if exist
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_config.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_config.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_config.php	(revision 30)
@@ -0,0 +1,161 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/sktheme_util');
+
+function exec_sktheme_config() {
+  
+  global $sktheme_action;
+  global $squelettes_public_dir;
+  global $habillages_public_dir;
+  global $habillage_switcher_style;
+  global $theme_switcher_style;
+  global $switcher_activated;
+  global $switcher_admin_only;
+  
+  debut_page(_T('sktheme:title_config'),'configuration','sktheme_config');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:main_config_title'));
+  echo "<small><a href='?exec=sktheme_public_choice'>Habillages</a> | <a href='?exec=sktheme_doc'>Documentation</a></small><br />";
+  
+  // Include 'onglets'
+  sktheme_config_onglets();
+  
+  debut_gauche();
+  
+  // Include Doc box
+  sktheme_config_doc_box();
+  
+  debut_droite();
+  
+  //
+  // PUBLIC THEMES DIRECTORIES CONFIG
+  //
+  debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:public_themes_config'));
+  
+  // if submit : then save values
+  if ($sktheme_action=="set_dir") {
+    ecrire_meta('sktheme_squelettes_public_dir',$squelettes_public_dir);
+    ecrire_meta('sktheme_habillages_public_dir',$habillages_public_dir);
+    ecrire_metas();
+  }
+  
+  // Set directories
+  echo '<form action="'.generer_url_ecrire("sktheme_config", "sktheme_action=set_dir").'" method="post">';
+  
+  // Set squelettes_public_dir
+  debut_cadre('gris_clair');
+  echo '<strong>'._T('sktheme:squelettes_public_dir').' : </strong><input type="text" name="squelettes_public_dir" size="25" value="'.
+    $GLOBALS['meta']['sktheme_squelettes_public_dir'].'">';
+  fin_cadre('gris_clair');
+  
+  // Set habillages_public_dir
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:habillages_public_dir').' : </strong><input type="text" name="habillages_public_dir" size="25" value="'.
+    $GLOBALS['meta']['sktheme_habillages_public_dir'].'">';
+  fin_cadre_couleur(); 
+  
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_public_directories').'" /></div></div>';
+  echo '</form>';
+ 
+  fin_cadre_trait_couleur();  
+  
+  //
+  // PRIVATE THEMES DIRECTORIES CONFIG
+  //
+  //   debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:private_themes_config'));
+  //   echo '<br />';
+  //   echo _T('sktheme:to_be_done');
+  //   echo '<br />';
+  //   fin_cadre_trait_couleur();  
+  //
+  // SWITCHER OPTIONS
+  //
+  // if submit : save switcher options
+  if ($sktheme_action=="set_switcher") {
+    ecrire_meta('sktheme_theme_switcher_style',$theme_switcher_style);
+    ecrire_meta('sktheme_habillage_switcher_style',$habillage_switcher_style);
+    ecrire_meta('sktheme_switcher_activated',$switcher_activated);
+    ecrire_meta('sktheme_switcher_admin_only',$switcher_admin_only);
+    ecrire_metas();
+  }
+  debut_cadre_trait_couleur('', false, "sktheme_config", _T('sktheme:themes_switcher'));
+  
+  echo '<form action="'.generer_url_ecrire("sktheme_config", "sktheme_action=set_switcher").'" method="post">';
+  
+  // Set sktheme_switcher_activated
+  debut_cadre('gris_clair');
+  echo '<strong>'._T('sktheme:switcher_activated').' : </strong>';
+  echo '<input type="radio" name="switcher_activated"  value="yes" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) AND ($GLOBALS['meta']['sktheme_switcher_activated']=="yes")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:yes');
+  echo '<input type="radio" name="switcher_activated" value="no" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) AND ($GLOBALS['meta']['sktheme_switcher_activated']=="no")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:no');
+  fin_cadre('gris_clair');
+  
+  // Set sktheme_switcher_admin_only
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:switcher_admin_only').' : </strong>';
+  echo '<input type="radio" name="switcher_admin_only"  value="yes" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="yes")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:yes');
+  echo '<input type="radio" name="switcher_admin_only"  value="no" ';
+  if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="no")) {
+    echo ' checked="checked" ';
+  }
+  echo ' />'._T('sktheme:no');
+  fin_cadre_couleur(); 
+  
+  // Set theme_switcher_style
+  debut_cadre('gris_clair');
+  echo '<strong>'._T('sktheme:theme_switcher_style').' : </strong>';
+  echo "<br />";
+  echo '<textarea  cols="50" rows="8" name="theme_switcher_style">';
+  echo $GLOBALS['meta']['sktheme_theme_switcher_style'].'</textarea>';  
+  fin_cadre('gris_clair');
+  
+  // Set habillage_switcher_style
+  debut_cadre_couleur();
+  echo '<strong>'._T('sktheme:habillage_switcher_style').' : </strong>';
+  echo "<br />";
+  echo '<textarea  cols="50" rows="8" name="habillage_switcher_style">';
+  echo $GLOBALS['meta']['sktheme_habillage_switcher_style'].'</textarea>';  
+  fin_cadre_couleur(); 
+  
+    
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_switcher_options').'" /></div></div>';
+  echo '</form>';
+  
+  fin_cadre_trait_couleur();  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_doc.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_doc.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_doc.php	(revision 30)
@@ -0,0 +1,79 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/flock');
+include_spip('inc/sktheme_util');
+
+//
+// Private Area Page definition 
+//
+function exec_sktheme_doc() {
+
+  debut_page(_T('sktheme:extra_documentation'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:extra_documentation'));
+  echo "<small><a href='?exec=sktheme_public_choice'>Habillages</a> | <a href='?exec=sktheme_config'>Configuration</a></small><br />";
+  
+  // Include 'onglets'
+  sktheme_doc_onglets();
+  
+  debut_gauche();
+
+  
+  debut_droite();
+  echo "<br />";
+  // debut_cadre_trait_couleur($icone='', $return = false, $fonction='', $titre=''){
+  debut_cadre_trait_couleur('', false, "sktheme_documentation", _T('sktheme:extra_documentation'));
+  
+  $doc = _DIR_PLUGIN_SKTHEME."/DOCUMENTATION.txt";
+  if (is_file($doc)) {
+    lire_fichier ($doc,$contenu);
+    $contenu = str_replace("<", "&lt;", $contenu);
+    $contenu = str_replace(">", "&gt;", $contenu);
+    $contenu = str_replace(" ", "&nbsp;", $contenu);
+    $contenu = str_replace("//", "<br />", $contenu);
+    echo $contenu;
+  } else {
+    echo _T('sktheme:to_be_done');
+  }
+  fin_cadre_trait_couleur();
+  debut_cadre_trait_couleur('', false, "sktheme_documentation", _T('sktheme:to_be_done'));
+  $todo = _DIR_PLUGIN_SKTHEME."/TODO.txt";
+  if (is_file($todo)) {
+    lire_fichier ($todo,$contenu);
+    $list = split('\/\/',$contenu);
+    foreach ($list as $lign) {
+      echo "$lign<br />";
+    }
+    echo "<br />";
+  } else {
+    echo _T('sktheme:to_be_done');
+  }
+   
+  fin_cadre_trait_couleur();
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_private_choice.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_private_choice.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_private_choice.php	(revision 30)
@@ -0,0 +1,67 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');
+include_spip('inc/sktheme_util');
+
+//
+// Private Area Page definition 
+//
+function exec_sktheme_private_choice() {
+
+  debut_page(_T('sktheme:private_theme_choice'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:private_theme_choice'));
+  
+  // Include 'onglets'
+  sktheme_private_choice_onglets();
+  
+  debut_gauche();
+  // Include 'raccourcis'
+  sktheme_raccourcis();
+
+  
+  debut_droite();
+  echo "<br />";
+  // debut_cadre_trait_couleur($icone='', $return = false, $fonction='', $titre=''){
+  debut_cadre_trait_couleur('', false, "sktheme_private_squelette_list", _T('sktheme:available_squelette_list'));
+  
+  echo '<br />';
+  echo _T('sktheme:to_be_done');
+  echo '<br />';
+   
+  fin_cadre_trait_couleur();
+  
+  debut_cadre_trait_couleur('', false, "sktheme_squelette_list", _T('sktheme:available_habillage_list'));
+
+  echo '<br />';
+  echo _T('sktheme:to_be_done');
+  echo '<br />';   
+  
+  fin_cadre_trait_couleur();
+ 
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_public_choice.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_public_choice.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/exec/sktheme_public_choice.php	(revision 30)
@@ -0,0 +1,260 @@
+<?php
+
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/presentation');   // for spip presentation functions
+include_spip('inc/layer');          // for spip layer functions
+include_spip('inc/utils');          // for _request function
+include_spip('inc/plugin');         // xml function
+include_spip('inc/sktheme_util');   // for sktheme_* functions
+include_spip('inc/sktheme_xml');    // for sktheme_* functions
+
+
+//
+// Public page choice definition
+//
+function exec_sktheme_public_choice() {
+
+  global $squelette_public_name; // parameter
+  global $habillage_public_name; // parameter
+  
+  // Get the specific action to do if some
+  $sktheme_action = _request('sktheme_action');
+  $original = _T('sktheme:original');
+
+  debut_page(_T('sktheme:public_theme_choice'),'configuration','sktheme_public_choice');
+
+  echo "<br />";
+  gros_titre(_T('sktheme:public_theme_choice'));
+  echo "<small><a href='?exec=sktheme_config'>Configuration</a> | <a href='?exec=sktheme_doc'>Documentation</a></small><br />";
+
+  // Include 'onglets'
+  sktheme_public_choice_onglets();
+  
+  debut_gauche();
+
+  // download a squelette distribution
+//  debut_cadre_gris_clair();
+//  echo '<form action="' . generer_url_action("sktheme_install") .'" method="post">';
+//  echo       '<strong>'._T('sktheme:zip_squelette_url').' : </strong>';
+//  echo       '<input type="text" name="zip_url" size="25" value="http://">';
+//  echo       '<input type="hidden" name="zip_type" value="squelette" />';
+//  echo	     '<input type="submit" value="Download" />';
+//  echo	'</form>';
+//  fin_cadre_gris_clair();
+
+  // download a habillage distribution
+// debut_cadre_gris_clair();
+// echo '<form action="' . generer_url_action("sktheme_install") .'" method="post">';
+// echo       '<strong>'._T('sktheme:zip_habillage_url').' : </strong>';
+// echo       '<input type="text" name="zip_url" size="25" value="http://">';
+// echo       '<input type="hidden" name="zip_type" value="habillage" />';
+// echo	     '<input type="submit" value="Download" />';
+// echo	'</form>';
+// fin_cadre_gris_clair();
+
+  // Include 'raccourcis'
+  sktheme_public_theme_doc_box();
+  
+  debut_droite();
+  
+  //
+  // Choose Squelette
+  $s_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_squelettes_public_dir'];
+  debut_cadre_trait_couleur('', false, "sktheme_public_squelette_list",
+			    _T('sktheme:available_squelette_list')." : ".$GLOBALS['meta']['sktheme_squelettes_public_dir']);
+  
+  $squelettes_list = array('dist' => '' );
+  if (is_dir($s_dir)) {
+    if ($dh = opendir($s_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($s_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is squelettes
+	  if (is_file($s_dir."/".$dir."/theme.xml")) {
+	    $s_info = sktheme_xml_get_infos($s_dir."/".$dir,"theme");
+	    $type = (isset($s_info['type'])) ? propre($s_info['type']) : "";
+	    if ($type == 'squelettes') {
+	      $squelettes_list[$dir]=$s_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    }
+  } else {
+      echo _T('sktheme:no_available_squelette');
+  }
+  
+  // Save if needed
+  if ($sktheme_action=="set_squelette") {
+    echo _T('sktheme:update_squelette_to') . $squelette_public_name. "<br />";
+    ecrire_meta('sktheme_squelette_public_name',$squelette_public_name);
+    // Set habillage to the original one when squelette is changed
+    ecrire_meta('sktheme_habillage_public_name',$original);
+    ecrire_metas();
+  } else {
+    $squelette_public_name = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+  	
+  echo '<br />';
+  echo '<form action="'.generer_url_ecrire("sktheme_public_choice", "sktheme_action=set_squelette").'" method="post">';
+  foreach( $squelettes_list as $key => $value) {
+    $s_info = sktheme_xml_get_infos($value,"theme");
+    echo debut_cadre('gris_clair');
+    echo $s_info['extra_img_puce'];
+    if ($squelette_public_name==$key) {
+      echo '<input type="radio" name="squelette_public_name" value="'.$key.'" checked="checked" />';
+      $o_info = $s_info;
+    } else {
+      echo '<input type="radio" name="squelette_public_name" value="'.$key.'" />';
+    }
+    echo bouton_block_invisible("$key");
+    echo "<strong>$key</strong>";
+    echo debut_block_invisible("$key");
+    echo _T('version') .' '.  $s_info['version'] . " | <strong>".$s_info['extra_titre_etat']."</strong><br />";
+    if (isset($s_info['description']))
+      echo "<hr />" . propre($s_info['description']) . "<br />";
+    if (isset($s_info['auteur']))
+      echo "<hr />" . _T('auteur') .' '. propre($s_info['auteur']) . "<br />";
+    if (isset($s_info['lien']))
+      echo "<hr />" . _T('info_url') .' '. propre($s_info['lien']) . "<br />";
+    echo fin_block();
+    echo fin_cadre('gris_clair');
+  }
+  echo '<br />';
+  echo '<div><div style="text-align:right"><input type="submit" value="'._T('sktheme:save_squelette').'"></div></div>';
+  echo '</form>';
+  
+  
+  fin_cadre_trait_couleur();
+  
+  //
+  // Choose Habillage
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  debut_cadre_trait_couleur('', false, "sktheme_public_habillage_list", 
+			    _T('sktheme:available_habillage_list')." : ".$GLOBALS['meta']['sktheme_habillages_public_dir']);
+  
+  
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is themes
+	  if (is_file($h_dir."/".$dir."/theme.xml")) {
+	    $h_info = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    $type = (isset($h_info['type'])) ? propre($h_info['type']) : "";
+	    if ($type == 'themes') {
+	      $habillages_list[$dir]=$h_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    echo _T('sktheme:no_available_habillage');
+  }
+  
+  // Save habillage if needed
+  if ($sktheme_action=="set_habillage") {
+    echo _T('sktheme:update_habillage_to') . $habillage_public_name . "<br />";
+    ecrire_meta('sktheme_habillage_public_name',$habillage_public_name);
+    ecrire_metas();
+  } else {
+    $habillage_public_name = $GLOBALS['meta']['sktheme_habillage_public_name'];
+  }
+    
+  echo '<br />';
+  echo '<form action="'.generer_url_ecrire("sktheme_public_choice", "sktheme_action=set_habillage").'" method="post">';
+  foreach( $habillages_list as $key => $value) {
+    $h_info = sktheme_xml_get_infos($value,"theme");
+
+    // Check if habillage is available for this squelette selection
+    // probably better way to do it in php (such grep perl function ? but its
+    // works anyway)
+    $squelette_ok = false;
+    if (is_array($h_info['squelettes'])) {
+      foreach ($h_info['squelettes'] as $sq){
+	$sq = trim($sq);
+	if ($sq == $squelette_public_name) {
+	  $squelette_ok = true;
+	}
+      }
+    } else {
+      if ($h_info['squelettes'] == $squelette_public_name) {
+	$squelette_ok = true;
+      }
+    }
+    
+    if (($key == $original)||($squelette_ok)) {
+      echo debut_cadre('gris_clair');
+      if ($key == $original) {
+	echo $o_info['extra_img_puce'];
+      } else {
+	echo $h_info['extra_img_puce'];
+      }
+      if ($habillage_public_name==$key) {
+	echo '<input type=radio  name="habillage_public_name" value="'.$key.'" checked="checked" />';
+      } else {
+	echo '<input type=radio  name="habillage_public_name" value="'.$key.'" />';
+      }
+      echo bouton_block_invisible("$key");
+      if ($key == $original) {
+	echo "<strong><i>$key (".$o_info['nom'].")</i></strong>";
+	echo debut_block_invisible("$key");
+	echo _T('version') .' '.  $o_info['version'] . " | <strong>".$o_info['extra_titre_etat']."</strong><br />";
+	if (isset($o_info['description']))
+	  echo "<hr />" . propre($o_info['description']) . "<br />";
+	if (isset($o_info['auteur']))
+	  echo "<hr />" . _T('auteur') .' '. propre($o_info['auteur']) . "<br />";
+	if (isset($o_info['lien']))
+	  echo "<hr />" . _T('info_url') .' '. propre($o_info['lien']) . "<br />";
+
+      } else {
+	echo "<strong>$key</strong>";
+	echo debut_block_invisible("$key");
+	echo _T('version') .' '.  $h_info['version'] . " | <strong>".$h_info['extra_titre_etat']."</strong><br />";
+	if (isset($h_info['description']))
+	  echo "<hr />" . propre($h_info['description']) . "<br />";
+	if (isset($h_info['auteur']))
+	  echo "<hr />" . _T('auteur') .' '. propre($h_info['auteur']) . "<br />";
+	if (isset($h_info['lien']))
+	  echo "<hr />" . _T('info_url') .' '. propre($h_info['lien']) . "<br />";
+      }
+      echo fin_block();
+      echo fin_cadre('gris_clair');
+    }
+  }
+    
+  echo '<br />';
+  echo '<div><div align="right"><input type="submit" value="'._t('sktheme:save_habillage').'"></div></div>';
+  echo '</form>';
+  
+  fin_cadre_trait_couleur();
+  
+  
+  
+  
+  fin_page();
+
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_balises.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_balises.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_balises.php	(revision 30)
@@ -0,0 +1,51 @@
+<?php
+
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+
+include_spip('inc/sktheme_list');
+
+// @param p est un objet SPIP
+function balise_SKTHEME_THEMES_SWITCHER ($p) {
+  $sktheme_list = sktheme_list();
+  $code.='<form action="" method="post">';
+  $code.='<select name="selecteurTheme" style="'.$GLOBALS['meta']['sktheme_theme_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+  $code.='<option selected="selected" value="">'._T('themes').'</option>';
+  foreach( $sktheme_list as $value )	$code.='<option value="'.parametre_url(self(),'var_sktheme',$value).'">&nbsp;-> '.$value.'</option>';
+  $code.='</select>';
+  $code.='</form>';  
+  
+  $p->code = "'$code'";
+  return ($p);
+}
+
+// @param p est un objet SPIP
+function balise_SKTHEME_HABILLAGES_SWITCHER ($p) {
+  $sktheme_habillage_list = sktheme_habillage_list();
+  $code.='<form action="" method="post">';
+  $code.='<select name="selecteurHabillage" style="'.$GLOBALS['meta']['sktheme_habillage_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+  $code.='<option selected="selected" value="">'._T('habillages').'</option>';
+  foreach( $sktheme_habillage_list as $value )	{
+    $code.='<option value="'.parametre_url(self(),'var_sktheme',"__current::".$value).'">&nbsp;-> '.$value.'</option>';
+  }
+  $code.='</select>';
+  $code.='</form>';  
+  $p->code = "'$code'";
+  return ($p);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_list.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_list.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_list.php	(revision 30)
@@ -0,0 +1,159 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+  
+  // Create theme list
+function sktheme_list() {
+    
+  include_spip('inc/sktheme_xml');
+
+  $original = _T('sktheme:original');
+  $sktheme_list = array();
+  
+  $s_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_squelettes_public_dir'];
+  $squelettes_list = array('dist' => '' );
+  if (is_dir($s_dir)) {
+    if ($dh = opendir($s_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($s_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is squelettes
+	  if (is_file($s_dir."/".$dir."/theme.xml")) {
+	    $s_info = sktheme_xml_get_infos($s_dir."/".$dir,"theme");
+	    $type = (isset($s_info['type'])) ? propre($s_info['type']) : "";
+	    if ($type == 'squelettes') {
+	      $squelettes_list[$dir]=$s_dir."/".$dir;
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    }
+  } else {
+    // no extra directory for squelette
+    array_push($sktheme_list,"dist::".$original);
+    return $sktheme_list;
+  }
+
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($dir = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$dir)) AND ($dir[0]!=".") ) {
+	  // Check if a theme.xml exists and if the type is themes
+	  if (is_file($h_dir."/".$dir."/theme.xml")) {
+	    $h_info = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    $type = (isset($h_info['type'])) ? propre($h_info['type']) : "";
+	    if ($type == 'themes') {
+	      $habillages_list[$dir] = sktheme_xml_get_infos($h_dir."/".$dir,"theme");
+	    }
+	  }
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    // no habillage directory
+    foreach( $squelettes_list as $s_key => $s_value) {
+      array_push($sktheme_list,$s_key."::".$original);
+      return $sktheme_list;
+    }
+  }
+
+  // Look for matching theme
+  foreach( $squelettes_list as $s_key => $s_value) {
+    
+    foreach( $habillages_list as $h_key => $h_info) {
+      if ($h_key == $original) {
+	array_push($sktheme_list,$s_key."::".$h_key);
+      } else {
+	$squelette_ok = false;
+	if (is_array($h_info['squelettes'])) {
+	  foreach ($h_info['squelettes'] as $sq){
+	    $sq = trim($sq);
+	    if ($sq == $s_key) {
+	      $squelette_ok = true;
+	    }
+	  }
+	} else {
+	  if ($h_info['squelettes'] == $s_key) {
+	    $squelette_ok = true;
+	  }
+	}
+	if ($squelette_ok) {
+	  array_push($sktheme_list,$s_key."::".$h_key);
+	}
+      }
+    }
+  }
+  return $sktheme_list;
+}
+
+
+
+function sktheme_habillage_list() {
+    
+  include_spip('inc/sktheme_xml');
+
+  $original = _T('sktheme:original');
+  $sktheme_habillage_list = array();
+  
+  $squelette_name = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  
+  $h_dir = _DIR_RACINE.$GLOBALS['meta']['sktheme_habillages_public_dir'];
+  $habillages_list = array($original => '');
+  if (is_dir($h_dir)) {
+    if ($dh = opendir($h_dir)) {
+      while (($file = readdir($dh)) !== false) {
+	if ( (is_dir($h_dir."/".$file)) AND ($file[0]!=".") ) {
+	  $habillages_list[$file] = sktheme_xml_get_infos($h_dir."/".$file,"theme");
+	}
+      }
+      closedir($dh);
+    } 
+  } else {
+    // no habillage directory
+    array_push($sktheme_habillage_list,$original);
+    return $sktheme_habillage_list;
+  }
+
+  // Look for matching theme
+    
+  foreach( $habillages_list as $h_key => $h_info) {
+    if ($h_key == $original) {
+      array_push($sktheme_habillage_list,$h_key);
+    } else {
+      $squelette_ok = false;
+      if (is_array($h_info['squelettes'])) {
+	foreach ($h_info['squelettes'] as $sq){
+	  $sq = trim($sq);
+	  if ($sq == $squelette_name) {
+	    $squelette_ok = true;
+	  }
+	}
+      } else {
+	if ($h_info['squelettes'] == $squelette_name) {
+	  $squelette_ok = true;
+	}
+      }
+      if ($squelette_ok) {
+	array_push($sktheme_habillage_list,$h_key);
+      }
+    }
+  }
+  return $sktheme_habillage_list;
+}
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_util.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_util.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_util.php	(revision 30)
@@ -0,0 +1,99 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+include_spip('inc/presentation');
+
+// Build 'onglets' for all pages
+function sktheme_public_choice_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_public_choice", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_public_choice", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_public_choice", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_public_choice", "sktheme_doc", "");
+   fin_onglet();
+
+}
+function sktheme_private_choice_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_private_choice", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_private_choice", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_private_choice", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_private_choice", "sktheme_doc", "");
+  fin_onglet();
+
+}
+function sktheme_config_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_config", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_config", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_config", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_config", "sktheme_doc", "");
+  fin_onglet();
+
+}
+function sktheme_doc_onglets() {
+
+  debut_onglet();
+  // onglet($texte, $lien, $onglet_ref, $onglet, $icone="")
+  onglet(_T('sktheme:public_choice'),  "?exec=sktheme_public_choice",  "sktheme_doc", "sktheme_public_choice", "");
+  //onglet(_T('sktheme:private_choice'), "?exec=sktheme_private_choice", "sktheme_config", "sktheme_private_choice", "");
+  onglet(_T('sktheme:configuration'),  "?exec=sktheme_config",         "sktheme_doc", "sktheme_config", "");
+  onglet(_T('sktheme:documentation'),  "?exec=sktheme_doc",            "sktheme_doc", "sktheme_doc", "");
+  fin_onglet();
+
+}
+
+// Build 'raccourcis' for all pages
+function sktheme_raccourcis() {
+
+  debut_raccourcis();
+  
+  
+  fin_raccourcis();
+
+}
+
+// Build documentation
+function sktheme_config_doc_box() {
+  
+  debut_cadre_relief();
+  echo _T('sktheme:config_doc_directories');
+  fin_cadre_relief();
+  debut_cadre_relief();
+  echo _T('sktheme:config_doc_switcher');
+  fin_cadre_relief();
+  
+}
+
+// Build documentation
+function  sktheme_public_theme_doc_box() {
+  debut_cadre_relief();
+  echo _T('sktheme:public_theme_doc_squelette');
+  fin_cadre_relief();
+  debut_cadre_relief();
+  echo _T('sktheme:public_theme_doc_habillage');
+  fin_cadre_relief();
+ 
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_xml.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_xml.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/inc/sktheme_xml.php	(revision 30)
@@ -0,0 +1,173 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function sktheme_xml_get_infos($xml_dir,$xml_type){
+
+  include_spip('inc/plugin'); 
+
+  $ret = array();
+  if ((@file_exists($xml_dir))&&(is_dir($xml_dir))){
+    if (@file_exists($xml_dir."/$xml_type.xml")) {
+      lire_fichier($xml_dir."/$xml_type.xml", $texte);
+      $arbre = parse_plugin_xml($texte);
+      if (!isset($arbre[$xml_type])&&is_array($arbre[$xml_type]))
+	$arbre = array('erreur' => array(_T('erreur_plugin_fichier_def_incorrect')." : $xml_dir/$xml_type.xml"));
+    }
+    else {
+      // pour arriver ici on l'a vraiment cherche...
+      //debug echo "error: erreur_plugin_fichier_def_absent $xml_dir/$xml_type.xml<br>";
+      $arbre = array('erreur' => array(_T('erreur_plugin_fichier_def_absent')." : $xml_dir/$xml_type.xml"));
+    }
+
+    sktheme_xml_verifie_conformite($xml_dir,$xml_type,$arbre);
+		
+    $ret['nom'] = applatit_arbre($arbre['nom']);
+    $ret['version'] = trim(end($arbre['version']));
+    if (isset($arbre['auteur']))
+      $ret['auteur'] = applatit_arbre($arbre['auteur']);
+    if (isset($arbre['description']))
+      $ret['description'] = applatit_arbre($arbre['description']);
+    if (isset($arbre['lien']))
+      $ret['lien'] = join(' ',$arbre['lien']);
+    if (isset($arbre['etat']))
+      $ret['etat'] = trim(end($arbre['etat']));
+    if (isset($arbre['options']))
+      $ret['options'] = $arbre['options'];
+    if (isset($arbre['fonctions']))
+      $ret['fonctions'] = $arbre['fonctions'];
+    $ret['prefix'] = $arbre['prefix'];
+    if (isset($arbre['pipeline']))
+      $ret['pipeline'] = $arbre['pipeline'];
+    if (isset($arbre['erreur']))
+      $ret['erreur'] = $arbre['erreur'];
+    if (isset($arbre['squelettes'])) {
+      $ret['squelettes'] = $arbre['squelettes'];
+    }
+    if (isset($arbre['type'])) {
+      $ret['type'] =  trim(applatit_arbre($arbre['type']));
+    }
+
+    // Compute extra values
+    $etat = 'dev';
+    if (isset($ret['etat']))
+      $etat = $ret['etat'];
+    switch ($etat) {
+    case 'experimental':
+      $puce = 'puce-rouge.gif';
+      $titre_etat = _T('plugin_etat_experimental');
+      break;
+    case 'test':
+      $puce = 'puce-orange.gif';
+      $titre_etat = _T('plugin_etat_test');
+      break;
+    case 'stable':
+      $puce = 'puce-verte.gif';
+      $titre_etat = _T('plugin_etat_stable');
+      break;
+    default:
+      $puce = 'puce-poubelle.gif';
+      $titre_etat = _T('plugin_etat_developpement');
+      break;
+    }
+    $ret['extra_puce']       = $puce;
+    $ret['extra_img_puce']   = "<img src='"._DIR_IMG_PACK."$puce' width='9' height='9' style='border:0;' alt=\"$titre_etat\" title=\"$titre_etat\" />&nbsp;";
+    $ret['extra_titre_etat'] = $titre_etat;
+  }
+  return $ret;
+}
+
+function sktheme_xml_verifie_conformite($xml_dir,$xml_type="plugin",&$arbre){
+	$silence = false;
+	if (isset($arbre[$xml_type])&&is_array($arbre[$xml_type]))
+		$arbre = end($arbre[$xml_type]); // derniere def xml_type
+	else{
+		$arbre = array('erreur' => array(_T('erreur_plugin_tag_plugin_absent')." : $xml_dir/plugin.xml"));
+		$silence = true;
+	}
+  // verification de la conformite du plugin avec quelques
+  // precautions elementaires
+  if (!isset($arbre['nom'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_nom_manquant');
+		$arbre['nom'] = array("");
+	}
+  if (!isset($arbre['version'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_version_manquant');
+		$arbre['version'] = array("");
+	}
+  if (!isset($arbre['prefix'])){
+  	if (!$silence)
+			$arbre['erreur'][] = _T('erreur_plugin_prefix_manquant');
+		$arbre['prefix'] = array("");
+	}
+	else{
+		$prefix = "";
+		$prefix = trim(end($arbre['prefix']));
+		if (isset($arbre['etat'])){
+			$etat = trim(end($arbre['etat']));
+			if (!preg_match(',^(dev|experimental|test|stable)$,',$etat))
+				$arbre['erreur'][] = _T('erreur_plugin_etat_inconnu')." : $etat";
+		}
+		if (isset($arbre['options'])){
+			foreach($arbre['options'] as $optfile){
+				$optfile = trim($optfile);
+				if (!@is_readable(_DIR_PLUGINS."$xml_dir/$optfile"))
+  				if (!$silence)
+						$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile";
+			}
+		}
+		if (isset($arbre['fonctions'])){
+			foreach($arbre['fonctions'] as $optfile){
+				$optfile = trim($optfile);
+				if (!@is_readable(_DIR_PLUGINS."$xml_dir/$optfile"))
+  				if (!$silence)
+						$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile";
+			}
+		}
+		$fonctions = array();
+		if (isset($arbre['fonctions']))
+			$fonctions = $arbres['fonctions'];
+	  $liste_methodes_reservees = array('__construct','__destruct','plugin','install','uninstall',strtolower($prefix));
+		if (is_array($arbre['pipeline'])){
+			foreach($arbre['pipeline'] as $pipe){
+				$nom = trim(end($pipe['nom']));
+				if (isset($pipe['action']))
+					$action = trim(end($pipe['action']));
+				else
+					$action = $nom;
+				// verif que la methode a un nom autorise
+				if (in_array(strtolower($action),$liste_methodes_reservees)){
+					if (!$silence)
+						$arbre['erreur'][] = _T("erreur_plugin_nom_fonction_interdit")." : $action";
+				}
+				else{
+					// verif que le fichier de def est bien present
+					if (isset($pipe['inclure'])){
+						$inclure = _DIR_PLUGINS."$xml_dir/".end($pipe['inclure']);
+						if (!@is_readable($inclure))
+		  				if (!$silence)
+								$arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $inclure";
+					}
+				}
+			}
+		}
+	}
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_en.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_en.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_en.php	(revision 30)
@@ -0,0 +1,138 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Available habillages",
+	  "available_squelette_list" => "Available squelettes",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Advanced configuration",
+	  "config_doc_directories" => "<b>R&eacute;pertoires</b>:<br>
+	  It is possible to re-defined default directories locations of yours
+	  <i>squelettes/habillages</i> distributions.Default is  the <i>'themes'</i>
+	   directory, directories are always relatives to
+	  your SPIP root site.
+	  ",
+	  "config_doc_switcher" => "<b>Switcher</b>:<br>
+	  The theme switcher can be activated to include a selection list in the
+	  public area, and then easily test themes. It is possible to limit this
+	  functionnality to the administrator only.<br>
+	  Moreover you can modify the style of this theme selector.<br>
+	  <br>
+	  A new 'balise' <b>#SKTHEME_HABILLAGES_SWITCHER</b> is available to
+	  include an 'habillage' selector list in your squelette. This list is
+	  composed of all available 'habillage' corresponding to the squelette
+	  distribution you have choosen. You can as well modify this
+	  list selector style here.
+	  
+	  
+	  ",
+	  
+	  // D
+	  "documentation" => "Documentation",
+	  "extra_documentation" => "Extra Documentation",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "Public habillages directory",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuration",
+	  "manage_theme" => "Manage themes",
+
+	  // N
+	  "no" => "No",
+	  "no_available_habillage" => "No available habillage",
+	  "no_available_squelette" => "No available squelette",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Private theme choice",
+	  "private_themes_config" => "Private themes configuration",
+	  "private_theme_choice" => "Private theme choice",
+	  "public_choice" => "Public theme choice",
+	  "public_theme_choice" => "Public theme choice",
+	  "public_themes_config" => "Public themes configuration",
+	  "public_theme_doc_squelette" => "<b>Squelette choice:</b><br>
+	  Each time you will choose a 'squelette' (more exactly a squelettes distribution)
+	  the 'habillage' list will be updated with the available ones.
+	  The small square represent the state of the distribution, stable,
+	  test, experimental, ...<br>
+	  Clic on the small black triangle to get more details about the distribution.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Habillage choice:</b><br>
+	  An Habillage is modifing colors and graphical aspect of your squelettes.
+	  It is composed of CSS, pictures, ...<br>
+	  A squelette distribution always contain a default 'habillage' which is
+	  called <b>Original</b>.  
+	  ",
+	  
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Save habillage",
+	  "save_public_directories" => "Save directories",
+	  "save_squelette" => "Save squelette",
+	  "save_switcher_options" => "Save switcher options",
+	  "squelettes_public_dir" => "Public squelettes directory",
+	  "switcher_activated" => "Theme switcher activated",
+	  "switcher_admin_only" => "Only for administrators",
+	  "switcher_style" => "Switcher style",
+
+	  // T
+	  "to_be_done" => "To be done !",
+	  "themes_switcher" => "Theme switch",
+
+	  // U
+	  "update_habillage_to" => "Update habillage to : ",
+	  "update_squelette_to" => "Update squelette to : ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "Yes",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_es.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_es.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_es.php	(revision 30)
@@ -0,0 +1,131 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Lista de pieles disponibles",
+	  "available_squelette_list" => "Lista de esqueletos disponibles",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Configuraci&oacute;n avanzada",
+	  "config_doc_directories" => "<b>Carpetas</b>:<br /> 
+	  Es posible redefinir las carpetas de almacenaje de tus <i>'esqueletos'</i> 
+	  y de tus <i>'pieles'</i>, por omisi&oacute;n est&aacute;n en la carpeta 
+	  <i>'themes'</i>. Estas carpetas siempre son relativas a la ra&iacute;z detu sitio SPIP.
+	  ",
+	  "config_doc_switcher" => "<b>Alternador</b>:<br />
+	  Le 'alternador' (o 'switcher' de temas permite hacer aparecer una lista de selecci&oacute;n
+	  de temas en el espacio p&uacute;blico y as&iacute; probar los diferentes temas m&aacute;s 
+	  r&aacute;pidamente. Es posible limitar esta posibilidad s&oacute;lo a los administradores.<br />
+	  Adicionalmente, puedes cambiar aqu&iacute; el estilo de tiuselector de temas. 
+	  <br />
+	  <br />
+	  TambiÃ©n existe una baliza<br /> <b><small>#SKTHEME_HABILLAGES_SWITCHER</small></b><br />
+	  que es posible integrar a los esqueletos para disponer, esta vez, de un selector que corresponda a 
+      tu elecci&oacute;n de esqueletos. Igualmente, se puede modificar el estilo de este selector.
+	  ",
+	  // D
+	  "documentation" => "Documentaci&oacute;n",
+	  "extra_documentation" => "Documentaci&oacute;n extra",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "Carpetas para las pieles p&uacute;blicas",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuraci&oacute;n",
+	  "manage_theme" => "Gesti&oacute;n des temas",
+
+	  // N
+	  "no" => "No",
+	  "no_available_habillage" => "Ninguna piel disponible",
+	  "no_available_squelette" => "Aucun squelette disponible",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Elecci&oacute;n tema privado",
+	  "private_themes_config" => "Configuraci&oacute;n para los temas privados",
+	  "private_theme_choice" => "Elecci&oacute;n del tema del espacio privado",
+	  "public_choice" => "Elecci&oacute;n tema p&uacute;blico",
+	  "public_theme_choice" => "Elecci&oacute;n del tema del espacio p&uacute;blico",
+	  "public_themes_config" => "Configuraci&oacute;n para los temas p&uacute;blicos",
+	  "public_theme_doc_squelette" => "<b>Elecci&oacute;n del esqueleto:</b><br />
+	  Cada vez que seleccionar&aacute;s un esqueleto (m&aacute;s exactamente una distribuci&oacute;n de 
+	  esqueletos) la lista de ropas disponibles se actualiza. El cuadradito indica el estado de la
+	  distribuci&oacute;n de esqueletos: estable, test, experimental ...<br />
+	  Para mayores detalles acerca de una distribuci&oacute;n pincha en la flecha negra.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Elecci&oacute;n de la piel:</b><br />
+	  Las 'pieles' permiten modificar los colores y el aspecto gr&aacute;fico de una distribuci&oacute;n 
+	  de esqueletos. Se trata de CSS y/o de im&aacute;genes, ect. <br /> 
+	  Una distribuci&oacute;n de esqueletos siempre contiene una presentaci&oacute;n gr&aacute;fica
+      por omisi&oacute;n, que corresponde a la piel denominada <b>Original</b>.
+	  ",
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Guardar la piel",
+	  "save_public_directories" => "Guardar las carpetas ",
+	  "save_squelette" => "Guardar es esqueleto",
+	  "save_switcher_options" => "Guardar las opciones del alternador",
+	  "squelettes_public_dir" => "Carpetas para los esqueletos p&uacute;blicos",
+	  "switcher_activated" => "Activar el alternador de temas",
+	  "switcher_admin_only" => "S&oacute;lo para los administratdores",
+	  "switcher_style" => "Style du switcher",
+
+	  // T
+	  "to_be_done" => "&iexcl;a&uacute;n por hacer!",
+	  "themes_switcher" => "Alternador de temas",
+
+	  // U
+	  "update_habillage_to" => "Actualizaci&oacute;n de la piel por: ",
+	  "update_squelette_to" => "Actualizaci&oacute;n del esqueleto por: ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "S&iacute;",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_fr.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_fr.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/lang/sktheme_fr.php	(revision 30)
@@ -0,0 +1,140 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$GLOBALS[$GLOBALS['idx_lang']] = 
+    array(
+	  // A
+	  "available_habillage_list" => "Liste des habillages disponibles",
+	  "available_squelette_list" => "Liste des squelettes disponibles",
+	  
+	  // B
+
+	  // C
+	  "configuration" => "Configuration avanc&eacute;e",
+	  "config_doc_directories" => "<b>R&eacute;pertoires</b>:<br /> 
+	  Il est possible de red&eacute;finir les r&eacute;pertoires de stockage 
+	  de vos <i>'squelettes'</i> et de vos <i>'habillages'</i>, par 
+	  d&eacute;faut il s'agit du r&eacute;pertoire <i>'themes'</i>, les r&eacute;pertoires sont toujours 
+	  relatifs &agrave; la racine de votre site SPIP 
+	  ",
+	  "config_doc_switcher" => "<b>Switcher</b>:<br />
+	  Le 'switcher' de th&egrave;mes permet de faire appara&icirc;tre une liste de
+	  s&eacute;lection de th&egrave;mes dans l'espace public et ainsi tester
+	  les diff&eacute;rents th&egrave;mes plus rapidement. Il est possible
+	  de ne donner cette possibilit&eacute; qu'aux administrateurs<br />
+	  De plus vous pouvez changer le style de votre s&eacute;lecteur de
+	  th&egrave;mes ici.
+	  <br>
+	  <br>
+	  Il existe &eacute;galement une balise <br />
+	  <b><small>#SKTHEME_HABILLAGES_SWITCHER</small></b><br />
+	  qu'il est possible d'int&eacute;grer &agrave; vos squelettes pour disposer
+	  cette fois d'un s&eacute;lecteur d'habillage correspondant &agrave; votre
+	  choix de squelette. Une fois encore vous pouvez en modifier le style si besoin.
+	  ",
+	  // D
+	  "documentation" => "Documentation",
+	  "extra_documentation" => "Extra Documentation",
+
+	  // E
+
+	  // F
+
+	  // G
+
+	  // H
+	  "habillages_public_dir" => "R&eacute;pertoires pour les habillages publics",
+
+	  // I
+
+	  // J
+
+	  // K
+
+	  // L
+
+	  // M
+	  "main_config_title" => "Configuration",
+	  "manage_theme" => "Gestion des th&egrave;mes",
+
+	  // N
+	  "no" => "Non",
+	  "no_available_habillage" => "Aucun habillage disponible",
+	  "no_available_squelette" => "Aucun squelette disponible",
+
+	  // O
+	  "original" => "Original",
+
+	  // P
+	  "private_choice" => "Choix th&egrave;me priv&eacute;",
+	  "private_themes_config" => "Configuration pour les th&egrave;mes priv&eacute;s",
+	  "private_theme_choice" => "Choix du th&egrave;me de l'espace priv&eacute;",
+	  "public_choice" => "Choix th&egrave;me public",
+	  "public_theme_choice" => "Choix du th&egrave;me de l'espace public",
+	  "public_themes_config" => "Configuration pour les th&egrave;mes publics",
+	  "public_theme_doc_squelette" => "<b>Choix du squelette :</b><br />
+	  Chaque fois que vous s&eacute;lectionnez un squelette (plus exactement une
+	  distribution de squelettes) la liste des habillages disponibles est mise &agrave; 
+	  jour. Le petit carr&eacute;s indique l'&eacute;tat de
+	  la distribution de squelette, stable, test, experimental ...<br />
+	  Pour plus de d&eacute;tail sur une distribution cliquez sur la
+	  fl&egrave;che noire.
+	  ",
+	  "public_theme_doc_habillage" => "<b>Choix de l'habillage :</b><br />
+	  Les habillages permettent de modifier les couleurs et l'aspect
+	  graphique d'une distribution de squelettes. Il s'agit de CSS et/ou d'images
+	  etc ...<br /> 
+	  Une distribution de squelette contient toujours une
+	  pr&eacute;sentation graphique par d&eacute;faut, ceci correspond
+	  &agrave; l'habillage nomm&eacute; <b>Original</b>.
+	  ",
+	  // Q
+
+	  // R
+
+	  // S
+	  "save_habillage" => "Enregister l'habillage",
+	  "save_public_directories" => "Enregistrer les r&eacute;pertoires",
+	  "save_squelette" => "Enregister le squelette",
+	  "save_switcher_options" => "Enregistrer les options du switcher",
+	  "squelettes_public_dir" => "R&eacute;pertoires pour les squelettes publics",
+	  "switcher_activated" => "Activer le switcher de th&egrave;me",
+	  "switcher_admin_only" => "Seulement pour les administrateurs",
+	  "switcher_style" => "Style du switcher",
+
+	  // T
+	  "to_be_done" => "&agrave; faire !",
+	  "themes_switcher" => "Switcher de th&egrave;me",
+
+	  // U
+	  "update_habillage_to" => "Mise &agrave; jour de l'habillage par : ",
+	  "update_squelette_to" => "Mise &agrave; jour du squelette par : ",
+
+	  // V
+
+	  // W
+
+	  // X
+
+	  // Y
+	  "yes" => "Oui",
+
+	  // Z
+
+);
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/plugin.xml	(revision 30)
@@ -0,0 +1,38 @@
+<plugin>
+ <nom>SkTheme (SPIP 1.9.2)</nom>
+ <version>0.6</version>
+ <etat>stable</etat>
+ <auteur>Skedus
+<multi>
+_ &copy; September 2006 - distributed under GNU/GPL licence.
+[fr]_ &copy; Septembre 2006 - distribu&#233; sous license GNU/GPL.
+</multi>
+</auteur>
+<description>
+<multi>
+Manage theme for SPIP
+_ WATCH OUT: You need to desactivate switcher plugin (quite incompatible because using same process - this means i copied it inside this plugin and i would like to thank  its authors Philippe Drouot and Fil for this nice switcher plugin)
+_ Activate this plugin and manage themes in the {{Configuration}} menu.
+[fr]
+Gestion des th&#232;mes de SPIP
+_ ATTENTION: D&#233;sactivez le plugin switcher (ils sont quelque peu incompatibles, car il est monstreusement copi&#233; dans ce plugin, merci aux auteurs Philippe Drouot et Fil)
+_ Activez ce plugin et g&#233;rez les th&#232;mes dans le menu {{Configuration}}.
+</multi>
+</description>
+	<lien>http://skedus.free.fr/spip/spip.php?article8</lien> <!-- URI de documentation -->
+ <prefix>sktheme</prefix>
+ <options>sktheme_options.php</options>
+ <pipeline>
+    <nom>ajouter_boutons</nom>
+    <inclure>sktheme_fonctions.php</inclure>
+ </pipeline>
+ <pipeline>
+    <nom>affichage_final</nom>
+    <action>affichage_final</action>
+    <inclure>sktheme_fonctions.php</inclure>
+ </pipeline>
+ <pipeline>
+   <nom>insert_head</nom>
+      <inclure>sktheme_head.php</inclure>
+ </pipeline>
+ </plugin>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_fonctions.php	(revision 30)
@@ -0,0 +1,89 @@
+<?php
+  // ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+
+$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
+define('_DIR_PLUGIN_SKTHEME',(_DIR_PLUGINS.end($p)));
+
+include_spip('inc/sktheme_list');
+
+// Add private area button
+function sktheme_ajouter_boutons($boutons_admin) {
+  // administrator only
+  if ($GLOBALS['connect_statut'] == "0minirezo" && $GLOBALS["connect_toutes_rubriques"]) {
+    
+    // See button in the 'configuration' 
+    $boutons_admin['configuration']->sousmenu["sktheme_public_choice"]= 
+       new Bouton("../"._DIR_PLUGIN_SKTHEME."/img_pack/sktheme_icon.png",  // icon
+		  _L("sktheme:manage_theme"));                                     // title
+  }
+  return $boutons_admin;
+}
+
+
+//
+// Include Philippe Drouot switcher functionnality
+// Based on Fil contrib
+function sktheme_affichage_final($texte){
+	
+  global $html;
+  
+  $sktheme_list = sktheme_list();
+   
+  // Insertion du Javascript de rechargement de page
+  // Always include this script used for #SKTHEME_HABILLAGES_SWITCHER and #SKTHEME_THEMES_SWITCHER
+  $code = '<script type="text/javascript">
+		//<![CDATA[
+		function sktheme_gotof(url) {
+		window.location=url;
+		}//]]>
+		</script>';	  
+  
+  if (isset($GLOBALS['meta']['sktheme_switcher_activated']) 
+      AND ($GLOBALS['meta']['sktheme_switcher_activated']=="yes")) {
+    if ($html) {
+		
+      // Doit-on afficher le selecteur de squelette ? (Fonctionnalite restreinte aux seuls administrateurs ?)
+      $afficherSelecteur=TRUE;
+      if (isset($GLOBALS['meta']['sktheme_switcher_admin_only']) 
+	  AND ($GLOBALS['meta']['sktheme_switcher_admin_only']=="yes") 
+	  AND (!isset($_COOKIE['spip_admin']))) $afficherSelecteur=FALSE;
+		
+      if ($afficherSelecteur) {
+			
+			
+	// Insertion du selecteur de squelettes			
+	$code.='<div id="sktheme_switcher" style="top: 0;left: 20px; position: absolute; background-color: transparent;z-index: 100;">';
+	$code.='<form action="" method="post">';
+	$code.='<fieldset style="margin:0;padding:0;border:0">';
+	$code.='<select name="selecteurTheme" style="'.$GLOBALS['meta']['sktheme_theme_switcher_style'].'" onchange="sktheme_gotof(this.options[this.selectedIndex].value)">';
+	$code.='<option selected="selected" value="">Themes</option>';
+	foreach( $sktheme_list as $value )	$code.='<option value="'.parametre_url(self(),'var_sktheme',$value).'">&nbsp;-> '.$value.'</option>';
+	$code.='</select>';
+	$code.='</fieldset>';
+	$code.='</form>';
+	$code.='</div>';
+      }
+
+			
+    }
+  } 
+	// On rajoute le code du selecteur de squelettes avant la balise </body>  
+	$texte=eregi_replace("</body>","$code</body>",$texte);
+	return($texte);
+}
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_head.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_head.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_head.php	(revision 30)
@@ -0,0 +1,23 @@
+<?php
+
+
+
+function sktheme_insert_head($flux){
+  
+  if ($GLOBALS['meta']['sktheme_switcher_activated']) {
+
+    $flux .='
+	<style type="text/css" media="print">
+/* <![CDATA[ */
+	#sktheme_switcher { display: none; }
+/* ]]> */
+	</style>
+';
+
+    return $flux;
+  
+  }  
+}
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_options.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_options.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/plugins/sktheme/1_9_2/sktheme_options.php	(revision 30)
@@ -0,0 +1,90 @@
+<?php
+// ---------------------------------------------------------------------
+  //
+  // Sktheme : manage themes under SPIP (squelettes + habillages)
+  //
+  // Copyright (c) 2006 - Skedus
+  //
+  // This program is free software; you can redistribute it and/or modify
+  // it under the terms of the GNU General Public License as published by
+  // the Free Software Foundation; either version 2 of the License, or
+  // (at your option) any later version.
+  //
+  // You should have received a copy of the GNU General Public License
+  // along with this program; 
+  //
+  // ---------------------------------------------------------------------
+  // cache desactivation
+  $_SERVER['REQUEST_METHOD']='POST';
+
+include_spip("inc/meta");
+include_spip('inc/sktheme_balises');
+
+// Set a default configuration - each values can be modify 
+// in the private area
+if (!isset($GLOBALS['meta']['sktheme_squelettes_public_dir'])){
+  ecrire_meta('sktheme_squelettes_public_dir',"themes");
+  ecrire_meta('sktheme_habillages_public_dir',"themes");
+  ecrire_meta('sktheme_squelette_public_name',"dist");
+  ecrire_meta('sktheme_habillage_public_name',"");
+  ecrire_meta('sktheme_theme_switcher_style',"font-size: 10px;background-color: #FFF;color: #0C479D;border-top: 1px solid #CECECE; border-bottom: 2px solid #4A4A4A; border-left: 1px solid #CECECE; border-right: 1px solid #CECECE;margin:2px .5em;");
+  ecrire_meta('sktheme_habillage_switcher_style',"font-size: 10px;background-color: #FFF;color: #0C479D;border-top: 1px solid #CECECE; border-bottom: 2px solid #4A4A4A; border-left: 1px solid #CECECE; border-right: 1px solid #CECECE;margin:2px .5em;");
+  ecrire_meta('sktheme_switcher_activated',"no");
+  ecrire_meta('sktheme_switcher_admin_only',"yes");
+  ecrire_metas();
+} 
+
+// Set default user choice
+$s_dir = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$GLOBALS['meta']['sktheme_squelette_public_name'];
+$h_dir = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$GLOBALS['meta']['sktheme_habillage_public_name'];
+
+//
+// SWITCHER THEME
+//
+// Contrib de Fil : voir http://trac.rezo.net/trac/spip-zone/browser/_contribs_/switcher/switcher.php
+// --------------------------------------------------------------------------------------------------
+// Ask sktheme 
+if (isset($_GET['var_sktheme'])) {
+  
+  // sktheme format : 
+  // for theme           = squelette_name::habillage_name
+  // for habillage only  = __current::habillage_name
+  // 
+  list($squelette,$habillage)= split ("::", $_GET['sktheme']);
+    
+  // For habillage only
+  if ($squelette == "__current") {
+    $squelette = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+    
+  $s_dir = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$squelette;
+  $h_dir = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$habillage;
+  if (is_dir(_DIR_RACINE.$s_dir)) {
+    // theme exist put a cookie
+    setcookie('spip_sktheme', $_COOKIE['spip_sktheme'] = $_GET['var_sktheme'], NULL, '/');
+  } else {
+    // not valid remove cookie
+    setcookie('spip_sktheme', $_COOKIE['spip_sktheme'] = '', -24*3600, '/');
+  }
+}
+
+if (isset($_COOKIE['spip_sktheme'])) {
+  list($squelette,$habillage)= split ("::", $_COOKIE['spip_sktheme']);
+  // For habillage only
+  if ($squelette == "__current") {
+    $squelette = $GLOBALS['meta']['sktheme_squelette_public_name'];
+  }
+  $s_dir_new = $GLOBALS['meta']['sktheme_squelettes_public_dir'].'/'.$squelette;
+  $h_dir_new = $GLOBALS['meta']['sktheme_habillages_public_dir'].'/'.$habillage;
+  
+  if (is_dir(_DIR_RACINE.$s_dir_new)) {
+    $s_dir = $s_dir_new;
+  }
+  if (is_dir(_DIR_RACINE.$h_dir_new)) {
+    $h_dir = $h_dir_new;
+  }
+} 
+
+// So set only the 'dossier_squelettes' to the corresponding user choice
+$dossier_squelettes = $h_dir.':'.$s_dir;
+?>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/recherche.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/recherche.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/recherche.html	(revision 30)
@@ -0,0 +1,163 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+  <title>[[(#NOM_SITE_SPIP|textebrut)]] : <:resultats_recherche:>[ - (#RECHERCHE)]</title>
+  <INCLURE{fond=page}{fond=styles}{lang}>
+  <INCLURE{fond=inc/inc-meta}{lang}>
+</head>
+<body dir="#LANG_DIR" class="#LANG recherche">
+<div id="page">
+
+<!-- *****************************************************************
+  Bandeau, titre du site et menu langue
+  Header and main menu (top and right) 
+    ************************************************************* -->
+  
+<INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<!-- *****************************************************************
+  Contenu principal (centre)
+  Main content (center) 
+    ************************************************************* -->
+  <div id="bloc-contenu">
+    <div class="cartouche">
+      <div class="surtitre"><:resultats_recherche:></div>
+      [<h1 class="titre-article">(#RECHERCHE|majuscules)</h1>
+]    </div><!-- cartouche -->
+    <B_rubriques>
+      <h2><:info_rubriques_trouvees:> : [(#TOTAL_BOUCLE)]</h2>
+    <BOUCLE_rubriques(RUBRIQUES)  {recherche} {lang_select=non} {par points} {inverse}{tout} >
+      <h3><a href="#URL_SITE_SPIP/spip.php?action=cookie&amp;url=#URL_SITE_SPIP%2F#URL_RUBRIQUE&amp;var_lang=#LANG" hreflang="#LANG"[title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a> [<dfn><small>&#8212; (#LANG)</small></dfn>]</h3>
+    </BOUCLE_rubriques>
+      <br />
+    </B_rubriques>
+    <B_articles>
+      <h2><:info_articles_trouves:> : [(#TOTAL_BOUCLE)]</h2>
+    <BOUCLE_articles(ARTICLES)  {recherche} {lang_select=non} {par points} {inverse} {tout} >
+      <h3><a href="#URL_SITE_SPIP/spip.php?action=cookie&amp;url=#URL_SITE_SPIP%2F#URL_ARTICLE&amp;var_lang=#LANG" hreflang="#LANG" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a></h3>
+      <div class="detail">
+        [(#DATE|nom_jour)] [(#DATE|affdate)]
+        <B_auteurs_articles><:par_auteur:> <BOUCLE_auteurs_articles(AUTEURS) {id_article} {", "}>#NOM</BOUCLE_auteurs_articles> - [<dfn>(#LANG|traduire_nom_langue)</dfn>]
+      </div><!-- detail -->
+      <br />
+    </BOUCLE_articles>
+      <br />
+    </B_articles>
+[(#REM) Si aucun resultat, on affiche le formulaire de recherche
+        If no result, we display the research form ] 
+        <BOUCLE_rub_result(RUBRIQUES){recherche}{par points}{inverse}> </BOUCLE_rub_result><BOUCLE_art_result(ARTICLES){recherche}{par points}{inverse}> </BOUCLE_art_result><BOUCLE_breves_result(BREVES){recherche}{par points}{inverse}> </BOUCLE_breves_result><BOUCLE_forums_result(FORUMS){recherche}{par points}{inverse}> </BOUCLE_forums_result><BOUCLE_sites_result(SITES){recherche}{par points}{inverse}> </BOUCLE_sites_result><BOUCLE_auteurs_result(AUTEURS){recherche}{par points}{inverse}> </BOUCLE_auteurs_result><BOUCLE_mots_result(AUTEURS){recherche}{par points}{inverse}> </BOUCLE_mots_result>
+      <div class="surtitre"><:avis_aucun_resultat:></div>
+      <div class="detail">
+        <h1 class="titre-article"><:info_rechercher:></h1>
+          [(#FORMULAIRE_RECHERCHE)]
+          <br />
+      </div><!-- detail -->
+      <//B_mots_result> <//B_auteurs_result> <//B_sites_result> <//B_forums_result> <//B_breves_result> <//B_art_result> <//B_rub_result>
+
+
+
+  </div><!-- bloc-contenu -->
+  
+<!-- *****************************************************************
+  Menus contextuels (droite)
+  Contextual menus (right) 
+    ************************************************************* -->
+  <div id="encart">
+  
+    <!-- Mots trouves -->
+    <B_mots>
+    <div class="menu">
+      <ul>
+        <li><b><:info_mots_cles:></b>
+           <ul>
+             <BOUCLE_mots(MOTS) {recherche} {par points} {inverse} >
+             <li class="menu-item">
+               <a href="#URL_MOT">[(#TITRE|supprimer_numero)]</a>
+             </li>
+             </BOUCLE_mots>
+           </ul>
+         </li>
+       </ul>
+    </div><!-- menu -->
+    </B_mots>
+
+    <!-- Breves trouvees -->
+    <B_breves>
+    <div class="menu">
+      <ul>
+        <li><b><:info_breves_touvees:></b>
+           <ul>
+             <BOUCLE_breves(BREVES) {lang?}{recherche} {par points} {inverse} >
+             <li class="menu-item">
+               <span>[(#DATE|affdate_court)]</span>
+               <a href="#URL_SITE_SPIP/spip.php?action=cookie&amp;url=#URL_SITE_SPIP%2F#URL_BREVE&amp;var_lang=#LANG" hreflang="#LANG"[title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+             </li>
+             </BOUCLE_breves>
+           </ul>
+         </li>
+       </ul>
+    </div><!-- menu -->
+    </B_breves>
+
+    <!-- Auteurs trouves -->
+    <B_auteurs>
+    <div class="menu">
+      <ul>
+        <li><b><:info_auteurs_trouves:></b>
+           <ul>
+             <BOUCLE_auteurs(AUTEURS) {recherche} {par points} {inverse} >
+             <li class="menu-item">
+               <a href="#URL_AUTEUR">[(#NOM)]</a>
+             </li>
+             </BOUCLE_auteurs>
+           </ul>
+         </li>
+       </ul>
+    </div><!-- menu -->
+    </B_auteurs>
+
+  <!-- Sites Web trouves -->
+    <B_sites>
+    <div class="menu">
+      <ul>
+        <li><b><:info_sites_trouves:></b>
+           <ul>
+             <BOUCLE_sites(SITES) {recherche} {par points} {inverse} >
+             <li class="menu-item">
+               <a href="#URL_SITE_SPIP/site.php3?id_syndic=#ID_SYNDIC" title="[(#DESCRIPTIF|textebrut|entites_html)]">#NOM_SITE</a>
+             </li>
+             </BOUCLE_sites>
+           </ul>
+         </li>
+       </ul>
+     </div><!-- menu -->
+     </B_sites>
+
+  <!-- Messages trouves -->
+  <B_messages>
+    <div class="menu">
+      <ul>
+        <li><b><:messages_forum:></b>
+           <ul>
+              <BOUCLE_messages(FORUMS) {recherche} {par points} {inverse} >
+              <li class="menu-item">
+                <a href="#URL_FORUM">[(#TITRE|supprimer_numero)]</a>
+              </li>
+              </BOUCLE_messages>
+           </ul>
+         </li>
+       </ul>
+    </div><!-- menu -->
+    </B_messages>
+
+  </div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas} {lang}>
+</div><!-- page -->
+
+</body>
+</html>
+
+ 
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/resume.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/resume.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/resume.html	(revision 30)
@@ -0,0 +1,86 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : Archives</title>
+	<INCLURE{fond=page}{fond=styles}>
+	<INCLURE{fond=inc/inc-meta}{lang}>
+
+</head>
+<body dir="#LANG_DIR" class="#LANG plan">
+<div id="page">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+
+	<div id="bloc-contenu">
+		<BOUCLE_langue_contexte_exclus(ARTICLES){tout}{doublons contexte}{lang}></BOUCLE_langue_contexte_exclus>
+		<B_langues>
+		<div id="sommaire">
+			<h4><:info_langues:></h4>
+			<ul>
+			<BOUCLE_langues(ARTICLES){tout}{doublons contexte}{par lang}>[
+				<li lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR">
+					<a href="spip.php?action=cookie&amp;url=[(#SELF)]&amp;var_lang=#LANG" hreflang="#LANG">(#LANG|unique|traduire_nom_langue{lang})</a>
+				</li>
+			]</BOUCLE_langues>
+			</ul>
+		</div>
+		</B_langues>
+		
+		<h2><:en_resume:></h2>
+		<h3><:info_visites_par_mois:> [<em>(#LANG|unique|traduire_nom_langue{langues})</em>]</h3>
+	[(#REM) ARCHIVES : 
+	Boucle tiré de "Usage du filtre 'unique' pour classer des articles"
+	sur SPIP-Contrib : http://www.spip-contrib.net/Usage-du-filtre-unique-pour]
+	<BOUCLE_archive(ARTICLES){par date} {inverse} {lang}>
+		[
+			[(#COMPTEUR_BOUCLE|>{1}|?{'</ul></li></ul></div>',''})]
+			<div class="archives">
+			<h3 class="plan-archives" style="cursor: pointer; margin-top:.5em;" onclick="deplier('bloc[(#COMPTEUR_BOUCLE)]');">(#DATE|annee|unique)</h3>
+
+			<ul id="bloc[(#COMPTEUR_BOUCLE)]" style="display: block;">
+		]
+		[
+			[(#DATE|annee|unique{nouvelle}|?{'','</ul></li>'})]
+			<li style="cursor: pointer;" onclick="deplier('bloc[(#COMPTEUR_BOUCLE)2]');">(#DATE|affdate{'Y-m'}|unique|nom_mois)
+  			<ul id="bloc[(#COMPTEUR_BOUCLE)2]" style="display: none;">
+		]
+		<li><a href="#URL_ARTICLE" title="commentaire">[(#TITRE|supprimer_numero)]</a></li>
+	</BOUCLE_archive>
+		</ul></li></ul>
+			</div><!-- archives -->
+	</B_archive>
+	</div><!-- bloc-contenu -->
+
+	[(#REM) Fin de l'archive]
+        
+
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+	<div id="encart">
+    <INCLURE{fond=inc/inc-annonces}{lang}>
+    <INCLURE{fond=inc/inc-breves}{lang}>
+    <INCLURE{fond=inc/inc-syndic}{lang}>
+
+	</div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas} {lang}>
+</div><!-- page -->
+
+</body>
+</html>
+
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/rubrique.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/rubrique.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/rubrique.html	(revision 30)
@@ -0,0 +1,109 @@
+#CACHE{7200}
+<BOUCLE_rubrique_principal(RUBRIQUES) {id_rubrique} {lang_select}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : [(#TITRE|supprimer_numero|textebrut|entites_html)]</title>
+	<INCLURE{fond=page}{fond=styles}{lang}{id_rubrique}>
+	<INCLURE{fond=inc/inc-meta}{lang}{id_rubrique}>
+</head>
+<body dir="#LANG_DIR" class="#LANG rubrique sect#ID_SECTEUR <BOUCLE_rubriques_body(HIERARCHIE) {id_secteur}{" "}>rub#ID_RUBRIQUE</BOUCLE_rubriques_body></B_rubriques_body> rub#ID_RUBRIQUE">
+<div id="page" class="rubrique rub#ID_RUBRIQUE">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}{id_rubrique}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+	<div id="bloc-contenu">
+		<h5>
+    <B_rubriques_chemin>
+    <BOUCLE_rubriques_chemin(HIERARCHIE){id_secteur}{" <b class='separateur'>&gt;</b> "}>
+		<a href="#URL_SITE_SPIP/#URL_RUBRIQUE">[(#TITRE|supprimer_numero|couper{60})]</a>
+	</BOUCLE_rubriques_chemin>
+	</B_rubriques_chemin>
+		[<b class='separateur'>&gt;</b> (#TITRE|supprimer_numero|couper{60})]
+		</h5>
+		<div class="ligne-debut"></div><!-- ligne-debut -->
+    [<span style="float:right;">(#LOGO_RUBRIQUE||reduire_image{120,0})</span>]
+    [<div class="chapo">(#TEXTE|reduire_image{440,0})</div><br />]
+		[<div class="notes">(#NOTES)</div>]
+		<BOUCLE_documents_joints(DOCUMENTS) {id_rubrique} {mode=document} {doublons} {"<br />"}>
+			[<div class="texte">(#TITRE|supprimer_numero)][ - (#DESCRIPTIF)</div>][(#LOGO_DOCUMENT|#URL_DOCUMENT)]<br />
+		</BOUCLE_documents_joints>
+
+		<!-- Articles de la rubrique -->
+		<B_articles_rubrique>
+		<h2 class="structure"><:articles_rubrique:></h2>
+		 #ANCRE_PAGINATION
+		<BOUCLE_articles_rubrique(ARTICLES) {branche} {par num titre} {!par date} {pagination}>
+			[<div class="logo-liste-art">(#LOGO_ARTICLE_RUBRIQUE|right|#URL_ARTICLE||reduire_image{120,0})</div>]
+			[<div class="surtitre">(#SURTITRE)</div>]
+			<h3>
+			<a href="#URL_SITE_SPIP/#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+			<BOUCLE_articles_rubrique_nom(RUBRIQUES) {id_rubrique} >
+				<b class="petit-info"><a href="#URL_SITE_SPIP/#URL_RUBRIQUE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>([(#TITRE|supprimer_numero)])</a></b>
+			</BOUCLE_articles_rubrique_nom>
+			</h3>
+      [<div class="sous-titre">(#SOUSTITRE)</div>]
+			<div class="detail">
+				[(#DATE|nom_jour)] [(#DATE|affdate)]
+				<B_auteurs_recents><:par_auteur:> <BOUCLE_auteurs_recents(AUTEURS) {id_article} {", "}><a href="#URL_SITE_SPIP/#URL_AUTEUR">#NOM</a></BOUCLE_auteurs_recents>
+			</div><!-- detail -->
+      [<div class="texte">
+      	<div class="extrait">
+      	 (#DESCRIPTIF|sinon{[(#CHAPO|sinon{#TEXTE}|couper{300})]})&nbsp;<b class="separateur">&gt;</b>&nbsp;<a  class="suite" href="#URL_SITE_SPIP/#URL_ARTICLE" title="...<:suite:>" ><:suite:></a>
+      	</div>
+      </div>]
+			<br />
+		</BOUCLE_articles_rubrique>
+		
+		[<div class="pagination">
+			<div class="ligne1">
+				<div dir="#LANG_DIR">#TOTAL_BOUCLE/#GRAND_TOTAL <:articles:></div>
+			</div>
+			<div class="ligne2">
+        (#PAGINATION)
+			</div>
+		</div>]
+
+		</B_articles_rubrique>
+	</div><!-- bloc-contenu -->
+	
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+  <div id="encart">  
+
+<INCLURE{fond=inc/inc-annonces}{lang}>
+
+<INCLURE{fond=inc/inc-breves}{id_rubrique}{lang}>
+
+<INCLURE{fond=inc/inc-syndic}{id_rubrique}{lang}>
+	
+  </div><!-- encart -->
+
+<!-- *****************************************************************
+	Navigation principale et rubriques (haut et/ou gauche)
+	Main and Sections Navigation (top and/orleft) 
+    ************************************************************* -->
+<INCLURE{fond=inc/inc-menu}{lang}{id_rubrique}>
+<!-- *****************************************************************
+	Pied de page - Footer
+    ************************************************************* -->
+<INCLURE{fond=inc/inc-bas}{lang}{id_rubrique}{id_secteur}>
+
+</div><!-- page -->
+</body>
+</html>
+</BOUCLE_rubrique_principal>
+<INCLURE{fond=404}{lang}{id_rubrique}>
+<//B_rubrique_principal>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/site.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/site.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/site.html	(revision 30)
@@ -0,0 +1,148 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+  <title>[[(#NOM_SITE_SPIP|textebrut)]] : <:sur_web:></title>
+  <INCLURE{fond=page}{fond=styles}{lang}>
+</head>
+<body dir="#LANG_DIR" class="#LANG site">
+<div id="page" class="site">
+
+<!-- *****************************************************************
+  Bandeau, titre du site et menu langue
+  Header and main menu (top and right) 
+    ************************************************************* -->
+  
+<INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<!-- *****************************************************************
+  Contenu principal (centre)
+  Main content (center) 
+    ************************************************************* -->
+    
+  <div id="bloc-contenu">
+  <BOUCLE_site(SITES) {id_syndic}>
+    <div class="cartouche">
+      <div class="surtitre"><:sur_web:></div>
+      [(#LOGO_SITE|right||reduire_image{120,0})]
+      <h1 class="titre-article"><a href="#URL_SITE">#NOM_SITE</a></h1>
+      <div class="detail"><a href="#URL_SITE">#URL_SITE</a></div>
+      [<div class="chapo">(#DESCRIPTIF)</div>]
+    </div><!-- cartouche -->
+
+    <B_articles>
+    <br />
+      <h2><:articles_recents:></h2>
+		#ANCRE_PAGINATION    
+    <BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {par date}{inverse}{pagination}>  
+      <h3><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></h3>
+      <div class="detail">
+        [(#DATE|nom_jour)] [(#DATE|affdate)] [<:par_auteur:> (#LESAUTEURS)][ &mdash; <em>(#TAGS|afficher_tags)</em>]
+      </div><!-- detail -->
+      [<div class="texte"><div class="extrait">(#DESCRIPTIF|image_reduire{200})</div></div>]
+      <br />
+    </BOUCLE_articles>
+      [<div class="pagination">
+        <div class="ligne1">
+          <div dir="#LANG_DIR">#TOTAL_BOUCLE/#GRAND_TOTAL <:articles:></div>
+        </div>
+        <div class="ligne2">
+          (#PAGINATION)
+        </div>
+      </div>]
+    </B_articles>
+	
+  </BOUCLE_site>
+  
+    <!-- si aucun site, afficher derniers articles de tous les sites -->
+    <B_articles_tous>
+    <div class="cartouche">
+      <div class="surtitre"><:sur_web:></div>
+      <h1 class="titre-article"><:nouveautes_web:></h1>
+    <br />
+      <h2><:articles_recents:></h2>
+    </div><!-- cartouche -->
+ 		#ANCRE_PAGINATION       
+    <BOUCLE_articles_tous(SYNDIC_ARTICLES) {par date}{inverse}{pagination}>  
+      <h3><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></h3>
+      <div class="detail">
+        [(#DATE|nom_jour)] [(#DATE|affdate)] [<:par_auteur:> (#LESAUTEURS)][ &mdash; <em>(#TAGS|afficher_tags)</em>]
+      </div><!-- detail -->
+      <div class="texte">
+        <div class="extrait">[(#DESCRIPTIF|couper{300}|image_reduire{200})]
+          [<div class="detail"><a href="[(#URL_SITE)]" title="[(#URL_SITE)]">(#NOM_SITE)</a></div>]
+        </div>
+      </div>
+      <br />
+    </BOUCLE_articles_tous>
+      [<div class="pagination">
+        <div class="ligne1">
+          <div dir="#LANG_DIR">#TOTAL_BOUCLE/#GRAND_TOTAL <:articles:></div>
+        </div>
+        <div class="ligne2">
+          (#PAGINATION)
+        </div>
+      </div>]
+    </B_articles_tous>
+  <//B_site>
+  </div><!-- bloc-contenu -->
+  
+<!-- *****************************************************************
+  Menus contextuels (droite)
+  Contextual menus (right) 
+    ************************************************************* -->
+  <div id="encart">
+  <INCLURE{fond=inc/inc-annonces}{lang}>
+
+    <B_syndic>
+    <!-- Tous les sites syndiques -->
+    <div class="menu">
+  		#ANCRE_PAGINATION
+      <ul>
+        <li><b><:titre_sites_syndiques:></b>
+           <ul>
+             <BOUCLE_syndic(SITES) {syndication=oui} {par nom_site}{pagination 20} >
+             <li class="menu-item">
+               <a href="[(#ID_SYNDIC|generer_url_site)]"[ class="(#EXPOSE)"]>#NOM_SITE</a>
+             </li>
+             </BOUCLE_syndic>
+           </ul>
+         </li>
+    <!--[if lte IE 6]><style>#encart a{height:1em;}#encart li{height:1em; float:left; clear:both; width:100%}</style><![endif]-->
+    <!--[if IE 6]><style>#encart li{clear:none;}</style><![endif]-->
+       </ul>
+       [<p class="pagination">(#PAGINATION)</p>]
+    </div><!-- menu -->
+    </B_syndic>
+
+    <B_sites>
+    <!-- Les sites references non syndiques -->
+    <div class="menu">
+  		#ANCRE_PAGINATION
+     <ul>
+        <li><b><:sites_web:></b>
+           <ul>
+            <BOUCLE_sites(SITES) {syndication=non} {par nom_site}{pagination 20} >
+             <li class="menu-item">
+               <a href="[(#ID_SYNDIC|generer_url_site)]"[ class="(#EXPOSE)"]>#NOM_SITE</a>
+             </li>
+             </BOUCLE_sites>
+           </ul>
+        </li>
+    <!--[if lte IE 6]><style>#encart a{height:1em;}#encart li{height:1em;float:left;clear:both;width:100%}</style><![endif]-->
+    <!--[if IE 6]><style>#encart li{clear:none;}</style><![endif]-->
+       </ul>
+       [<p class="pagination">(#PAGINATION)</p>]
+    </div><!-- menu -->
+    </B_sites>
+
+  </div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas} {lang}>
+</div><!-- page -->
+
+</body>
+</html>
+
+ 
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/sommaire.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/sommaire.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/sommaire.html	(revision 30)
@@ -0,0 +1,70 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]]</title>
+		<INCLURE{fond=inc/inc-meta}{lang}>
+		<INCLURE{fond=styles}{lang}>
+</head>
+<body dir="#LANG_DIR" class="#LANG sommaire">
+<div id="page" class="sommaire">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+
+  <INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+  <div id="bloc-contenu">
+    <div class="edito">
+		<INCLURE{fond=inc/inc-sommaire-edito}{lang}>
+    </div><!-- edito -->
+    
+    <h2 class="structure"><:articles_recents:></h2>
+    <INCLURE{fond=inc/inc-sommaire-articles}{lang}{self=#SELF}>
+    
+     
+  </div><!-- bloc-contenu-->
+
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+  <div id="encart">  
+
+<INCLURE{fond=inc/inc-trad}{lang}>
+
+<INCLURE{fond=inc/inc-annonces}{lang}>
+
+<INCLURE{fond=inc/inc-breves}{lang}>
+
+<INCLURE{fond=inc/inc-syndic}{lang}>
+
+    <!-- Inscription au site -->
+    [<div class="menu">
+        <ul>
+          <li><b><:pass_vousinscrire:></b>            
+            <ul>
+              <li>
+                <span><:participer_site:></span>
+                (#FORMULAIRE_INSCRIPTION)
+              </li>
+            </ul>
+          </li>
+        </ul>
+    </div><!-- menu -->]
+
+  </div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas} {lang}>
+
+</div><!-- page-->
+#SPIP_CRON
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/statistiques.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/statistiques.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/statistiques.html	(revision 30)
@@ -0,0 +1,73 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+	<title>[[(#NOM_SITE_SPIP|textebrut)]] : <:en_resume:></title>
+	<INCLURE{fond=page}{fond=styles}{lang}>
+	<INCLURE{fond=inc/inc-meta}{lang}>
+</head>
+
+<body dir="#LANG_DIR" class="#LANG resume">
+<div id="page">
+
+<!-- *****************************************************************
+	Bandeau, titre du site et menu langue
+	Header and main menu (top and right) 
+    ************************************************************* -->
+	
+<INCLURE{fond=inc/inc-bandeau}{lang}>
+
+<!-- *****************************************************************
+	Contenu principal (centre)
+	Main content (center) 
+    ************************************************************* -->
+	<div id="bloc-contenu">
+		<div class="cartouche">
+			<div class="surtitre"><:titre_statistiques:></div>
+		</div><!-- cartouche -->
+			
+    <div class="bande-stats">
+<B_tous_articles><BOUCLE_tous_articles(ARTICLES){tout}> </BOUCLE_tous_articles>
+        <b>#TOTAL_BOUCLE <:articles:></b></B_tous_articles>
+<B_tous_breves><BOUCLE_tous_breves(BREVES){tout}> </BOUCLE_tous_breves>
+        | <b>#TOTAL_BOUCLE <:breves:></b></B_tous_breves>
+<B_tous_sites><BOUCLE_tous_sites(SITES){tout}> </BOUCLE_tous_sites>
+        | <b>#TOTAL_BOUCLE <:info_sites:></b></B_tous_sites>
+<B_tous_auteurs><BOUCLE_tous_auteurs(AUTEURS){tout}> </BOUCLE_tous_auteurs>
+        | <b><:info_auteurs_nombre:> #TOTAL_BOUCLE</b></B_tous_auteurs>
+        | <b><:info_visites:> <INCLURE{fond=inc/inc-affvisit}></b>
+    </div>
+
+		<!-- Articles les plus populaires -->
+			<h1 class="titre-article"><:articles_populaires:></h1>
+		<BOUCLE_articles_populaires(ARTICLES) {par popularite} {lang?} {inverse} {0,10}>
+			<h3><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a></h3>
+			<div class="detail">
+				[(#DATE|nom_jour)] [(#DATE|affdate)]
+				<B_auteurs_recents><:par_auteur:> <BOUCLE_auteurs_recents(AUTEURS) {id_article} {", "}>#NOM</BOUCLE_auteurs_recents><br />
+				<:popularite:>&nbsp;: <span class="important">#POPULARITE</span> %
+			</div><!-- detail -->
+			<br />
+		</BOUCLE_articles_populaires>
+	</div><!-- bloc-contenu -->
+	
+<!-- *****************************************************************
+	Menus contextuels (droite)
+	Contextual menus (right) 
+    ************************************************************* -->
+  <div id="encart">  
+<INCLURE{fond=inc/inc-annonces}{lang}>
+
+<INCLURE{fond=inc/inc-breves}{lang}>
+
+<INCLURE{fond=inc/inc-syndic}{lang}>
+
+ <INCLURE{fond=inc/inc-forums}{lang}>
+ 
+  </div><!-- encart -->
+<INCLURE{fond=inc/inc-menu}{lang}>
+<INCLURE{fond=inc/inc-bas}{lang}></div><!-- page -->
+
+</body>
+</html>  
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/styles.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/styles.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/styles.html	(revision 30)
@@ -0,0 +1,39 @@
+[(#REM) 
+	ATTENTION : suite a un bogue rapporte sur :
+		http://trac.rezo.net/trac/spip/ticket/531
+	Les feuilles de styles 'alter.css' et 'perso.css' ne sont pas filtrees par |direction_css. En consequence :
+	- elles conservent le chemin d'acces aux images de fond. Placez-y vos declarations de styles pour les images de fond ( background-image: url(img/fond.jpg); ),
+	- mais evitez d'y declarer toute proriete ou valeur 'left' ou 'right' que vous desirez inverser selon la direction d'ecriture des langues. A cet effet, utilisez plutot la feuille de styles 'habillages.css'. Sans consequence pour les sites qui n'utilisent pas de langues qui exigent d'inverser l'ecriture de droite a gauche (comme l'arabe, l'hebreux, etc.)
+]
+[(#REM) - dist/spip-style.css
+    Styles par defaut de SPIP : ne pas modifier  - Default Styles from SPIP: don't change 
+]	[<link rel="stylesheet" href="#URL_SITE_SPIP/(#CHEMIN{spip_style.css}|direction_css)" type="text/css" media="all" />]
+[(#REM) - styles/base.css
+    Styles de base toujours actif : ne pas modifier - Basic styles always active: don't change 
+]	[<link rel="stylesheet" href="#URL_SITE_SPIP/(#CHEMIN{styles/base.css}|direction_css)" type="text/css" media="projection, screen, tv" />]
+[(#REM) - styles/alter.css
+    Style toujours actif - pour les images de fond et les propriete et valeurs 'left' et 'right' qu'on ne désire pas inverser pour les langues de droite à gauche.
+]	[<link rel="stylesheet" href="#URL_SITE_SPIP/(#CHEMIN{styles/alter.css})" type="text/css" media="projection, screen, tv" />]
+[(#REM) - styles/habillages.css
+    Style de personnalisations (non livre avec le squelette de base).
+    Si vous creez un fichier /styles/habillages.css ce style sera alors reconnu 
+    et ajoute aux styles base.css (et alter.css le cas echeant). 
+]	[<link rel="stylesheet" href="#URL_SITE_SPIP/(#CHEMIN{styles/habillages.css}|direction_css)" type="text/css" media="projection, screen, tv" />]
+[(#REM) styles/perso.css
+    Autre style de personnalisations (non livre avec le squelette de base).
+    Si vous creez un fichier /styles/perso.css ce style sera alors reconnu 
+    et ajoute aux styles base.css (et alter.css et habillages.css, le cas echeant).
+]	[<link rel="stylesheet" href="#URL_SITE_SPIP/(#CHEMIN{styles/perso.css})" type="text/css" media="projection, screen, tv" />]
+[(#REM) - styles/print.css
+    Style pour impression - Print style 
+]	[<link rel="stylesheet" href="#URL_SITE_SPIP/(#CHEMIN{styles/print.css}|direction_css)" type="text/css" media="print" />]
+
+[(#REM) Balise permettant aux plugins d'inserer des appels javascript ou css ]
+	#INSERT_HEAD
+[(#REM) - js/base.js
+    Appel des scipts de base d'Alternatives - Call to Alternatives' base scripts 
+	][<script src="#URL_SITE_SPIP/(#CHEMIN{js/base.js})"  type="text/javascript"></script>]
+[(#REM) - perso.js
+    Appel des scipts personnalises, s'ils existent...  
+	][<script src="#URL_SITE_SPIP/(#CHEMIN{js/perso.js})"  type="text/javascript"></script>]
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/styles/alter.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/styles/alter.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/styles/alter.css	(revision 30)
@@ -0,0 +1,60 @@
+body {
+	background-image: url(img/body_bg.png);
+	background-repeat: repeat;
+}
+#entete
+{
+	background-image: url(img/globe.jpg);
+	background-repeat: no-repeat;
+	background-position: left bottom;
+	text-align: right;
+}
+#entete a.nom-site, 
+#entete a.nom-site:link,  
+#entete a.nom-site:visited
+{
+	background-image: url(img/autre-monde.jpg);
+	background-repeat: no-repeat;
+	background-position: right top;
+}
+.menu ul li a, .menu ul li b
+{	
+	background-image: url(img/titre-coin.gif);
+	background-repeat: no-repeat;
+	background-position: top left;
+}
+.edito h3
+{
+	background-image: url(img/titre-coin.gif);
+	background-repeat: no-repeat;
+	background-position: top left;
+}
+.signatures td 
+{ 	
+	background-image: url(img/titre-coin.gif);
+	background-repeat: no-repeat;
+	background-position: top left;
+}
+
+/* a deplacer dans styles.html */
+.separateur
+{
+	background-repeat: no-repeat;
+	background-position: left center;
+	background-image: url(img/puce.gif);
+}
+
+#entete .nom-site span { right: 200px; }
+
+#menu-lang,
+#formulaire-lang
+{
+	right: 0;
+	text-align: right;
+}
+
+
+
+
+
+
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/styles/base.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/styles/base.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/styles/base.css	(revision 30)
@@ -0,0 +1,1243 @@
+/* -------------------------------------------------------
+ 	1. LIENS base
+ ------------------------------------------------------- */
+
+a, a:link, a:visited
+{
+	text-decoration: none;
+	color: #0A74A6;
+}
+
+a:hover
+{
+	text-decoration: underline;
+	color: #0A74A6;
+}
+
+a.spip_out,
+a.spip_in,
+a.spip_url,
+a.spip_glossaire { color: #0A74A6; }
+
+
+/* -------------------------------------------------------
+ 	2. MISE EN PAGE - BLOCS PRINCIPAUX
+ ------------------------------------------------------- */
+
+body {
+	color: #444;
+	font: 85%/1.0 "Trebuchet MS", "Lucida Grande", "Lucida Sans", Tahoma, Arial, 'Helvetica Neue', Helvetica, Geneva, Lucida, sans-serif;
+	margin: 0;
+	text-align: center;
+	/* pour centrer horizontalement la boite #page dans IE/Win */
+	background-color: #ddd;
+	/* background-image - voir/see : 'alter.css' */
+}
+
+#page
+{
+	position: relative;
+	text-align: left; /* pour annuler l'heritage de text-align:center de BODY */
+	margin: 3em auto; /* auto pour centrer horizontalement la boite dans BODY 
+						 pour le navigateurs autres que IE/WIN */
+	padding: 0;
+	width: 780px; /* ou 100% pour largeur fluide pleine largeur */
+}
+
+#entete			/* voir (../inc/inc-bandeau.html) */
+{
+	position: relative;
+	height: 180px;
+	margin: 0px 0px 0px 0px;
+	padding: 0;
+	border-width: 0;
+	text-align: right;
+	background-color: #787878;
+	overflow: hidden;
+	z-index: 10;
+	/* background-image - voir/see : 'alter.css' */
+}
+
+
+#navigation			/* (inc/inc-menu.html) */ {
+	position: absolute;
+	top: 0px;
+	left: 0px;
+	width: 150px;
+	margin: 0 0 1em 0;
+	padding: 0 0 1em 0;
+}
+
+#bloc-contenu
+{
+	position: static;
+	border: solid 1px #DEDEDE;
+	margin: 10px 155px 5px 155px;
+	padding: 10px 10px 5px;
+	background: white;
+	z-index: 20;
+}
+
+#encart
+{
+	position: absolute;
+	top: 190px;
+	right: 0px;
+	width: 150px;
+	margin: 0 0 1em 0;
+	padding: 0 0 1em 0;
+}
+
+#bas			/* (inc/inc-bas.html) */
+{
+	margin: 0px;
+	padding: 0px;
+	padding-top: 5px;
+	padding-right: 0px;
+	padding-left: 0px;
+	padding-bottom: 2px;
+	text-align: center;
+	margin-left: 155px;
+	margin-right: 155px;
+}
+
+
+/* -------------------------------------------------------
+ 	3. BANDEAU - ENTETE (inc/inc-bandeau.html)
+ ------------------------------------------------------- */
+
+#entete a.nom-site, 
+#entete a.nom-site:link,  
+#entete a.nom-site:visited
+{
+	display: block;
+	position: relative;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	font-family: Verdana, 'Bitstream Vera Sans', Tahoma,  "Lucida Grande", "Lucida Sans", Arial, 'Helvetica Neue', Helvetica, Lucida, Geneva, sans-serif;
+	text-decoration: none;
+	color: #EDDF5C;
+	font-size: 2em;
+	font-weight: bold;
+	padding: 0;
+	background-color: transparent;
+	/* background-image - voir/see : 'alter.css' */
+}
+
+#entete a.nom-site:hover
+{
+	color: #ddd;
+	font-style: italic;
+	text-shadow: white 0px 0px 8px;
+	/* une fleur pour safari seulement */
+}
+
+#entete .nom-site span 		/* position du nom du site - position of the site's name  */
+{
+	display: block;
+	position: absolute;
+	bottom: 48px;
+	right: 200px;
+}
+
+
+
+/* -------------------------------------------------------
+ 	4. ELEMENTS HTML DE BASE
+ ------------------------------------------------------- */
+
+h1
+{
+	margin-top: 0px;
+	margin-bottom: 0px;
+	font-size: 160%;
+	font-weight: bold;
+}
+
+h2
+{
+	margin-top: 0px;
+	margin-bottom: 15px;
+	font-size: 140%;
+	font-weight: bold;
+}
+
+h2.titre-article { margin-bottom: 0px; }
+
+h3
+{
+	margin-top: 0px;
+	margin-bottom: 0px;
+	font-size: 110%;
+	font-weight: bold;
+}
+
+/* Intertitres insérés dans un article  */
+h3.spip {
+	margin-top: 1em;
+	margin-bottom: .4em;
+	padding-bottom: .1em;
+	/* border-bottom: 1px #444 dashed; */
+	font-size: 110%;
+	font-weight: bold;
+	text-align: left;
+	background-color: #F3F3F3;
+}
+
+h4
+{
+	margin: 2px;
+	font-size: 100%;
+	font-weight: bold;
+}
+
+h5
+{
+	margin: 2px;
+	margin-left: 0px;
+	font-size: 90%;
+	font-weight: bold;
+}
+
+h6
+{
+	margin: 2px;
+	margin-left: 0px;
+	font-size: 80%;
+	font-weight: bold;
+}
+
+/* ------------------------------------------------------------------
+ 	5. NAVIGATION et MENUS
+ -------------------------------------------------------------------- */
+/* COULEURS des menus */
+.menu ul li {	border-top: 1px solid #eee; } /* separateur : meme couleur que fond de BODY */
+
+.menu ul li a:hover { text-decoration: none; }
+
+/* text : color */
+.menu ul li a, 
+.menu ul li a:visited,
+.menu ul li b 				{ color: white;}
+
+.menu ul li li a, 
+.menu ul li li a:visited 			{ color: #0A74A6;}
+
+.menu li span 				{ color: #444;}
+
+
+.menu ul li a:hover,
+.menu ul li li a:hover,
+.menu ul li li a.lienon 	{ color: maroon;}
+
+
+/* background */
+.menu ul li a,
+.menu ul li b 				{ background-color: #313c72; }
+
+
+.menu ul li li a, 
+.menu ul li li a:visited,
+.menu li span 				{ background-color: #DDD; }
+
+.menu ul li a:hover,
+.menu ul li li a:hover { background-color: #EDFBFF; }
+.menu ul li li a.lienon 	{ background-color: #ffd; }
+
+
+.menu ul li li a.article { background-color: #eee; }
+.menu ul li li a.article:hover { background-color: #EDFBFF; }
+
+/* TYPO et ESPACEMENT des menus */
+
+.menu ul 
+{
+	font-size: 88%;
+	line-height: 1.2em;
+	font-weight: normal;
+	text-align: left;
+	list-style-type: none;
+	margin: 0;	padding: 0;
+}
+
+.menu ul ul { font-size: 1em; margin: 0;}
+.menu ul li { margin: 0; }
+
+.menu ul li a, .menu ul li b
+{	
+	text-decoration: none;
+	text-align: left;
+	padding: 3px 4px 3px 4px;
+	display: block;	
+	/* background-image - voir/see : 'alter.css' */
+}
+
+.menu ul li li a { padding-left: 4px; font-weight: normal;}
+.menu ul li li li a { padding-left: 10px;}
+.menu ul li li li li a { padding-left: 16px;}
+.menu ul li li li li li a { padding-left: 22px;}
+.menu ul li li li li li li a { padding-left: 28px;}
+
+.menu li span
+{
+	display: block;	
+	font-style: italic;
+	font-size: 92%;	
+}
+.menu li li address a
+{
+	padding: 0px 0 4px 4px;
+	font-style: italic;
+	font-size: 92%;	
+}
+
+/*  ANNONCE dans #encart */
+.annonce
+{
+	background-color: #DDD;
+	/* overflow: hidden; */
+	text-align: center;
+}
+.menu li.annonce a { padding: 0; }
+.menu li.annonce .spip_logos,
+.menu li.annonce a img { margin: 0; }
+
+#menu-principal {
+	position: absolute;
+	top: -1.4em;
+	margin-top: 0px;
+	margin-left: 0px;
+	width: 780px;
+}
+
+#menu-principal li a
+{
+	padding: .2em 1em .2em 1em;
+	margin: 0 1px 0 0;
+} 
+
+#menu-principal ul li 
+{ float: left; }
+
+/* #menu-recherche {  position: absolute; top: 185px; width: 148px;} */
+#menu-recherche { width: 100px; }
+#menu-recherche.menu ul li { border-top: 0; }
+
+#menu-rubriques { position: absolute; top: 190px; width: 150px;}
+
+.menu-item { font-size: 85%; }
+
+.menu-item,
+.menu-titre-special, 
+.menu-titre { background-color: #313c72; } 
+
+
+/* -------------------------------------------------------
+ 	6. ARTICLE
+ ------------------------------------------------------- */
+
+.texte
+{
+	text-align: left;
+	line-height: 1.3em;
+	text-transform: inherit;
+}
+
+p.spip { text-align: left; }
+
+.chapo
+{
+	font-weight: bold;
+	text-align: left;
+	background-color: #f3f3f3;
+	padding: .5em;
+	margin: 0 0 1em 0;
+}
+
+/* L'information de date et auteur au dessus de l'article */
+.detail
+{
+	font-size: smaller;
+	padding: 0px;
+	margin: 0px;
+}
+
+.petit-info
+{
+	font-size: smaller;
+	font-weight: bold;
+}
+
+.spip_bouton
+{
+	font-size: smaller;
+	font-weight: bold;
+}
+
+.ps
+{
+	text-align: left;
+	font-size: 90%;
+}
+
+.notes
+{
+	text-align: left;
+	font-size: 90%;
+}
+
+.surtitre
+{
+	font-variant: small-caps;
+	margin-top: 0px;
+	margin-bottom: 0px;
+	font-size: 110%;
+	font-weight: bold;
+}
+
+.sous-titre
+{
+	font-variant: small-caps;
+	margin-top: 0px;
+	margin-bottom: 15px;
+	font-size: 110%;
+	font-weight: bold;
+}
+
+.pagination { font-size: 90%; }
+
+.spip_documents
+{
+	font-size: 85%;
+	margin: 10px;
+}
+
+.spip_doc_titre { font-weight: bold; font-size: 1em; line-height: 1em; margin-left:auto; margin-right:auto;}
+.spip_doc_descriptif { clear: both; font-size: 1em; line-height: 1em; margin-left:auto; margin-right:auto;
+}
+
+ul.spip { margin-left: 1em; padding: 0; } 
+ol.spip { margin-left: .8em; padding: 0; }
+ul ul.spip,
+ol ol.spip,
+ol ul.spip,
+ul ol.spip { margin-left: 0; padding: 0; }
+ul.spip, ul ul.spip, ol ul.spip { list-style: square;}
+ol.spip { list-style: decimal; }
+/* ul.spip li, ol.spip li { list-style: inherit; } */
+ol li.spip { margin: 0.3em 0 0.3em 1.5em; list-style-position: outside; }
+ul li.spip { margin: 0.3em 0 0.3em 1.2em; list-style-position: outside; }
+ul ol li.spip { margin: 0.3em 0 0.3em 1.5em; list-style-position: outside; }
+
+
+/* -------------------------------------------------------
+ 	7. GENERAL
+ ------------------------------------------------------- */
+
+#bas { font-size: 85%; }
+#plan { font-size: 85%; }
+
+.date-entete { font-size: 80%; }
+
+/* mot recherche dans page resultats de recherche */
+.mot-precis
+{
+	font-style: italic;
+	font-size: 83%;
+	color: #777777;
+}
+
+.lang
+{
+	color: red;
+	text-transform: uppercase;
+}
+
+
+/* -------------------------------------------------------
+ 8. EDITO (sur page sommaire.html)
+------------------------------------------------------- */
+
+.edito .bandeau {
+	overflow: hidden;
+	margin-bottom: 1em;
+	padding-bottom: 1em;
+	border-color: #BBB;
+	border-width: 0 0 2px 0;
+	border-style: dotted;
+}
+
+.edito h3 {
+	margin: 0;
+	padding: 0;
+	color: white;
+	background-color: #313c72;
+	text-transform: uppercase;
+	text-indent: 4px;
+	width: 100%;
+	font-size: 1.1em;
+	line-height: 1.4;
+	/* background-image - voir/see : 'alter.css' */
+}
+
+.edito h3 a, 
+.edito h3 a:link, 
+.edito h3 a:visited,
+.edito h3 a:hover {
+	color: white;
+	font-size: 90%;
+}
+
+.edito .chapo { margin-top: 0; background-color: #eee;}
+
+.edito .suite { text-align: right; }
+
+/* -------------------------------------------------------
+ 9. PETITION
+------------------------------------------------------- */
+
+#petition
+{
+	float: right;
+	width: 170px;
+	margin-left: 12px;
+}
+#petition fieldset
+{
+	margin: 0;
+	padding: 0;
+}
+#petition fieldset
+{
+	margin: 0;
+	padding: 0;
+}
+
+.signatures
+{
+	font-size: 92%;
+	margin-left: 0px;
+	margin-right: 0px;
+	margin-top: 1em;
+	margin-bottom: 1em;
+	width:100%;
+}
+
+.signatures td 
+{ 	
+	/* background-image - voir/see : 'alter.css' */
+ }
+
+.signatures-titre
+{
+	font-size: 92%;
+	font-weight: bold;
+	margin: 0px;
+}
+
+.signature-date
+{
+	white-space: nowrap;
+	background: #DDDDDD;
+	padding: 0.5em;
+}
+
+.signature-nom
+{
+	font-weight: bold;
+	background: #EEEEEE;
+	padding: 0.2em;
+	text-align: center;
+}
+
+.signature-message
+{
+	background: #f4f8f8;
+	padding: 0.4em;
+	text-align: left;
+}
+
+
+/* -------------------------------------------------------
+ 	10. FORUM
+ ------------------------------------------------------- */
+
+a.spip_barre img
+{
+	border: 1px solid #bbb;
+	padding: 2px;
+	margin: 0px;
+	background-color: #eee;
+}
+
+a.spip_barre:hover img
+{
+	border: 1px solid #aaa;
+	padding: 2px;
+	margin: 0px;
+	background-color: white;
+}
+
+.reponse_formulaire
+{
+	font-family: Arial, Geneva, Helvetica, Lucida, sans-serif;
+	font-weight: bold;
+	font-size: 110%;
+	color: red;
+}
+
+.forum-titre
+{
+	font-weight: bold;
+	font-size: 120%;
+}
+
+ul .forum-chapo { font-size: 83%; }
+.forum-item { font-size: 92%; }
+
+/* Format des champs d'entrée pour le forum*/
+.forml
+{
+	font-size: 100%;
+	color: #444444;
+}
+
+
+/* -------------------------------------------------------
+ 11. FORMULAIRE (PETITION, INSCRIPTION, FORUM)
+------------------------------------------------------- */
+
+.formulaire
+{
+	color: #777;
+	font-size: 83%;
+}
+
+/* -------------------------------------------------------
+ 	12. ADMIN, LOGIN, BOUTONS ADMIN
+ ------------------------------------------------------- */
+
+.spip-admin { font-size: 92%; }
+.spip_bouton { color: #444; }
+
+/* -------------------------------------------------------
+ 	13. STYLE DÉSACTIVÉ
+ ------------------------------------------------------- */
+
+.structure { display: none; }
+
+/* -------------------------------------------------------
+ 	14. FORMATS DE TEXTE
+ ------------------------------------------------------- */
+
+.article-info-rubrique
+{
+	text-align: left;
+	margin-bottom: 10px;
+}
+
+.extrait
+{
+	margin: 5px;
+	line-height: 1.4em;
+	padding: 8px;
+	background-color: #F6F6F6;
+}
+
+
+.extrait a.suite,
+.extrait a.suite:link,
+.extrait a.suite:visited
+{
+	text-decoration: none;
+	color: maroon;
+	font-variant: small-caps;
+	display: inline;
+}
+
+.extrait a.suite:hover
+{
+	color: #085D85;
+	text-decoration: underline;
+}
+
+.bouton
+{
+	background: #EEEEEE;
+	border: solid 1px #BBBBBB;
+	padding: 1px;
+	margin-bottom: 2px;
+	margin-top: 0px;
+}
+
+.separateur
+{
+	width: 6px;
+	font-size: 10px;
+	height: 9px;
+	padding-right: 2px;
+	/* background-image - voir/see : 'alter.css' */
+}
+
+.mot-precis
+{
+	padding-left: 2px;
+	padding-right: 3px;
+}
+
+.chapo
+{
+	line-height: 1.4em;
+	margin-top: 1em;
+}
+
+.ps
+{
+	padding-top: 0.6em;
+	margin-top: 0.6em;
+	margin-bottom: 10px;
+	border-top: 1px dashed #AAAAAA;
+}
+
+.ligne-debut
+{
+	padding-top: 0px;
+	margin-top: 5px;
+	margin-bottom: 15px;
+	border-top: 1px dashed #AAAAAA;
+}
+
+.notes
+{
+	margin-top: 0.6em;
+	margin-bottom: 0.6em;
+	border-top: 1px solid #a0a0a0;
+	padding: 1.5em;
+}
+
+/* date dernier ajout */
+.date-entete
+{
+	text-align: right;
+	margin-top: -16px;
+	margin-right: -5px;
+	margin-bottom: 10px;
+}
+
+.cartouche
+{
+	/*border-top: 2px solid #404040;*/
+	margin-bottom: 15px;
+	/*clear: right;*/
+}
+
+.spip_logos,
+.cartouche .spip_logos,
+.logo-liste-art .spip_logos
+{
+	padding-left: 0px;
+	margin: 0 0 0 1em;
+}
+.sommaire .logo-liste-art {clear:both}
+
+/* -------------------------------------------------------
+ 	15. PLAN DE SITE
+ ------------------------------------------------------- */
+
+#plan
+{
+	margin: 0px;
+	padding: 0px;
+	font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+}
+
+#plan ul
+{
+	padding-left: 2px;
+	list-style: none;
+	margin-top: 2px;
+	margin-bottom: 5px;
+	margin-left: 1.5em;
+}
+
+#plan ul ul { list-style: disc; }
+#plan ul ul ul { list-style: disc; margin-left: 1em;}
+#plan ul ul ul ul { list-style: disc; }
+
+#plan li
+{
+	/*background: #EEEEEE;*/
+	margin-bottom: 1px;
+	padding-left: 0px;
+	font-weight: bold;
+}
+
+#plan li li
+{
+	font-weight: normal;
+	list-style-type: square;
+}
+
+.plan-archives
+{
+	font-size: 95%;
+	font-weight: bold;
+	padding-left: 1px;
+	font-weight: bold;
+	background: #DDDDDD;
+}
+
+#plan h2 {
+	color: #333;
+	text-transform: uppercase;
+	font-weight: normal;
+}
+#plan h3 {
+	text-transform: uppercase;
+	padding: 2px 0;
+	text-indent: 2px;
+}
+
+
+/* -------------------------------------------------------
+ 	16. FORUM
+ ------------------------------------------------------- */
+
+ul.forum-total
+{
+	display: block;
+	padding: 0px;
+	margin: 0px;
+	list-style: none;
+}
+
+.forum-fil { margin-top: 10px; }
+
+.forum-fil ul
+{
+	display: block;
+	margin: 0px;
+	margin-left: 8px;
+	padding: 0px;
+	list-style: none;
+}
+
+.forum-item
+{
+	margin: 0px;
+	padding: 5px;
+	padding-bottom: 0;
+	text-align: left;
+	background: white;
+}
+
+.forum-repondre-message
+{
+	margin: 0;
+	padding: 0;
+	padding-top: 4px;
+	text-align: right;
+}
+
+/* Boite d'un forum : eclaircissement progressif des bords */
+ul .forum
+{
+	border: 1px solid #909090;
+	padding: 0px;
+	margin: 0px;
+	margin-bottom: 1px;
+}
+
+ul ul .forum { border: 1px solid #a4a4a4; }
+ul ul ul .forum { border: 1px solid #b8b8b8; }
+ul ul ul ul .forum { border: 1px solid #cccccc; }
+ul ul ul ul ul .forum { border: 1px solid #e0e0e0; }
+ul ul ul ul ul ul .forum { border: 1px solid #e0e0e0; }
+
+/* Boite de titre d'un forum : mise en couleur selon la profondeur du forum */
+ul .forum-chapo
+{
+	border: 0px;
+	border-bottom: 1px dashed #b8b8b8;
+	margin: 0px;
+	padding-left: 6px;
+	padding-right: 6px;
+	/*padding-top: 3px;*/
+	padding-bottom: 2px;
+	background: #EEEEEE;
+}
+
+ul ul .forum-chapo { background: #EEEEEE; }
+ul ul ul .forum-chapo { background: #EEEEEE; }
+ul ul ul ul .forum-chapo { background: #EEEEEE; }
+ul ul ul ul ul .forum-chapo { background: #EEEEEE; }
+
+
+/* -------------------------------------------------------
+ 	17. FORMULAIRES
+ ------------------------------------------------------- */
+
+form
+{
+	margin: 0px;
+	padding: 0px;
+	text-align: left;
+	text-transform: inherit;
+}
+
+fieldset { border: 0px; }
+
+.formulaire
+{
+	margin: 0px;
+	margin-bottom: 16px;
+	/*padding: 4px;*/
+	/*border: 1px solid #a0a0a0;
+	background-color: #f6f6f6;*/
+}
+
+#form_rech
+{
+	width: 150px;
+}
+
+#form_rech2
+{
+	font-size:1.4em;
+}
+
+
+.formrecherche
+{
+	color: #777;
+	font-size: 90%;
+  display:block;
+	font-weight: normal;
+	padding: 1px;
+	padding-top: 2px;
+	background-color: white;
+	margin: 2px;
+	margin-right: 0px;
+	margin-left: 0px;
+	border: solid 1px #BBBBBB;
+}
+
+.formulaire_recherche label,
+.formulaire_menu_lang label,
+a#formulaire_recherche,
+a#formulaire_menu_lang { display: none; }
+
+.formulaire_recherche fieldset,
+.formulaire_menu_lang fieldset {
+	padding: 0;
+	margin: 0;
+}
+
+#champ-recherche { width: 80px; }
+.bouton
+{
+	display:none;
+}
+
+/* Format des champs d'entrée pour le forum*/
+.forml
+{
+	background-color: white;
+	margin: 5px 0;
+	padding: 2px;
+	border: solid 1px #AAAAAA;
+	width: 98%;
+}
+
+#menu-recherche .forml
+{
+	margin: 0px 0;
+}
+
+
+#menu-lang,
+#formulaire-lang
+{
+	position: absolute;
+	top: 0;
+	right: 0;
+	text-transform: uppercase;
+	text-align: right;
+	font-size: 80%;
+	margin: 0;
+	padding: 0;	
+	z-index:99;
+}
+
+#formulaire-lang {width: 120px;}
+#formulaire-lang .forml { margin: 0; }
+
+#menu-lang { margin: .5em; color: white; } 
+#menu-lang a { color: aqua; }
+#menu-lang a:hover { color: #FBA; }
+
+.spip_bouton
+{
+	background-color: white;
+	border: solid 1px #cccccc;
+	padding: 0px;
+	margin: 0px;
+}
+
+.spip-admin form { display: inline; }
+
+.spip_encadrer
+{
+	border: solid 1px #cccccc;
+	background-color: white;
+	padding: 5px;
+	margin: 0px;
+}
+
+/* -------------------------------------------------------
+ 	18. AUTRES ELEMENTS PRODUITS PAR SPIP
+ ------------------------------------------------------- */
+
+.spip_code { background-color: #FCF4D0; }
+p.spip_note { }
+.spip_puce { list-style-position: inside; }
+table.spip { }
+table.spip tr.row_first { background-color: #FCF4D0; }
+table.spip tr.row_odd { background-color: #C0C0C0; }
+table.spip tr.row_even { background-color: #F0F0F0; }
+
+table.spip td
+{
+	padding: 1px;
+	text-align: left;
+	vertical-align: middle;
+}
+
+hr.spip { }
+b.spip { }
+i.spip { }
+
+blockquote.spip
+{
+	margin-top: 8px;
+	margin-right: 0px;
+	margin-bottom: 8px;
+	margin-left: 12px;
+	border: solid 0px #AAA; 
+	border-left: solid 6px #C90;
+	background-color: white;
+	padding: 5px;
+}
+
+.spip_cadre
+{
+	width: 100%;
+	background-color: white;
+	padding: 5px;
+}
+
+div.spip_poesie
+{
+	margin-left: 10px;
+	padding-left: 10px;
+	border-left: 1px solid #999999;
+	font-size: 1.2em;
+}
+
+div.spip_poesie div
+{
+	text-indent: -60px;
+	margin-left: 60px;
+}
+
+.spip_surligne { background-color: #FF6; }
+
+/*
+ * Barre de raccourcis
+ */
+
+a.spip_barre img
+{
+	padding: 3px;
+	background-color: #ffddaa;
+	border-color: white #A96 #A96 white;
+	border-width: 1px;
+	border-style: solid;
+}
+
+a.spip_barre:hover img
+{
+	border: 1px solid #808080;
+	padding: 3px;
+	background-color: #f8f8f4;
+}
+
+/*------------------------------------------------
+	19. AGENDA
+ ------------------------------------------------*/
+
+
+.agenda #bloc-contenu
+{
+	position: static;
+	border: solid 1px #DEDEDE;
+	margin: 0px 0px 5px 155px;
+	padding: 10px 10px 5px;
+	background: white;
+}
+
+#calendrier {
+	background-color: #EAEAEA; 
+	margin: 0; 
+	padding-bottom: 15px; 
+	position:relative;
+	}
+#calendrier table {
+	width: 100%; 
+	margin: 1px auto; 
+	padding: 15px 0; 
+	border-style: none;
+	}
+
+table.agenda tr, table.agenda td {
+	border-collapse: collapse; 
+	border: 1px solid #BFBFBF;
+	}
+
+table.agenda {
+	border-collapse: collapse; 
+	border: 1px solid #EAEAEA; 
+	}
+table.agenda th {
+	border-collapse: collapse; 
+	border-style: none; 
+	background-color: #EAEAEA;
+	}
+table.agenda a, table.agenda a:link, 
+table.agenda a:visited, table.agenda a:active { 
+	text-decoration: none; 
+	color: #000; 
+	padding: 2px; 
+	font-size: 9px;
+	}
+table.agenda a:hover { 
+	text-decoration: underline; 
+	}
+.agendaBouton { 
+	border-style: none; 
+	color: #FFFFFF; 
+	background-color: #BABEBF; 
+	padding: 1px 10px;
+	}
+.agendaNav, .agendaHead, .agendaThisMonth {
+	background-color: #FFFFFF;
+	}
+.agendaThisDay {
+	background-color: #BBC9E3;
+	}
+.agendaNotThisMonth { 
+	background: #EFEFEF;
+	}
+.agendaNav {
+	text-align: center; 
+	border: none;
+	}
+.AgendaForm {
+	text-align: center; 
+	margin: 0; 
+	padding: 10px 0; 
+	}
+div.AgendaForm form fieldset {
+	margin: 0; 
+	text-align: center; 
+	border: none; 
+	position: relative;
+	}
+
+
+/* Les flèches de navigation du calendrier */
+a.droite {
+	position: absolute; 
+	width: 8px; 
+	height: 14px; 
+	display: block;  
+	background: url(img/agenda-nav-droite.gif) no-repeat left top; 
+	right: 15px; 
+	top: 1.5em;
+	}
+a.gauche {
+	position: absolute; 
+	display: block; 
+	width: 8px; 
+	height: 14px; 
+	background: url(img/agenda-nav-gauche.gif) no-repeat; 
+	left: 15px; 
+	top: 1.5em; 
+	z-index: 98;
+	}
+a.gauche span, a.droite span {
+	display: none;
+	}
+
+ 
+/*------------------------------------------------
+	20. PAGINATION
+ ------------------------------------------------*/
+ .pagination 
+ {
+ 	text-align: right;
+ 	clear: both;
+ 	margin: 16px 4px 4px 4px;
+ }
+
+.pagination .ligne2 { text-align: center; background-color: #eee; }
+
+p.pagination {margin-top:0;text-align:center;font-size:80%;}
+
+/*------------------------------------------------
+	21. SOMMAIRE ARTICLE - PLAN
+		MODELES (voir : /alternatives/modeles)
+ ------------------------------------------------*/
+#sommaire {
+	float: right;
+	display: block;
+	width: 160px;
+	margin: 0 0 0 1em;
+	border: 1px gray solid;
+	background-color: white;
+	overflow: hidden;
+}
+
+.spip_modele {
+	width: 160px;
+	margin: 0 0 0 1em;
+	border: 1px gray solid;
+	background-color: white;
+	clear: both;
+	overflow: hidden;
+}
+
+#sommaire h4,
+.spip_modele h4 {
+	border-bottom: 1px silver dotted;
+	text-align: center;
+	line-height: 1em;
+}
+
+#sommaire ul,
+.spip_modele ul {
+	font-size: 84%;
+	margin: .5em;
+	margin-left: 1em;
+	padding: 0; 
+	list-style-type: square;
+}
+
+#sommaire ul li,
+.spip_modele ul li { line-height: 1em;margin: .3em 0 0 .5em; }
+
+body.plan #sommaire {
+	width: 118px;
+}
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/styles/print.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/styles/print.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/styles/print.css	(revision 30)
@@ -0,0 +1,139 @@
+/*
+ * Feuille de style specifique a l'impression
+ */
+ 
+/* Pour les liens, on desactive les couleurs
+   et on affiche l'URL cible a la suite du lien (!) */
+
+a { color: black; text-decoration: underline; }
+a:visited { color: black; text-decoration: underline; }
+a.spip_in { color: black; text-decoration: underline; }
+a.spip_out { color: black; text-decoration: underline; }
+/*
+a:after
+{
+	display: inline;
+	content: " [" attr(href) "]";
+	border-width: 1px;
+	border-style: dotted;
+}
+*/
+
+/*
+ * Un peu de coquetterie
+ */
+
+.chapo {
+	line-height: 1.4em;
+	margin-top: 1em;
+}
+.texte {
+}
+.ps {
+	padding-top: 0.6em;
+	margin-top: 0.6em;
+	border-top: 1px dashed #404040;
+}
+.notes {
+	margin-top: 0.6em;
+	margin-bottom: 0.6em;
+	border-top: 1px solid #707070;
+}
+.structure {
+	display: none;
+}
+.spip-admin {
+	display: none;
+}
+
+
+.contenu {
+	margin: 10px;
+}
+.contenu h1 {
+	margin-top: 0em;
+	margin-bottom: 0em;
+}
+.contenu h1.titre-extrait {
+}
+.contenu h1.titre-texte {
+}
+.contenu .surtitre {
+	margin-top: 0em;
+	margin-bottom: 0em;
+}
+.contenu .detail {
+	margin-left: 2em;
+}
+.extrait {
+	margin-top: 0.5em;
+	margin-bottom: 0.5em;
+	margin-left: 2em;
+	margin-right: 0em;
+	line-height: 1.4em;
+}
+
+
+/*
+ * Disposition : on elimine les elements de navigation (display: none)
+ * et on choisit un affichage de base pour le principal
+ */
+
+#principal {
+	margin: 10px;
+}
+
+#navigation {
+	display: none;
+}
+
+.encart {
+	display: none;
+}
+
+.cartouche {
+	margin-top: 0.5em;
+	padding-top: 1em;
+	margin-bottom: 1em;
+}
+
+.cartouche .spip_logos {
+	margin-left: 0px;
+	padding-left: 0px;
+	margin-right: 0.8em;
+}
+
+
+/*
+ * Forums
+ */
+
+.forum-repondre {
+	display: none;
+}
+.forum-repondre-message {
+	display: none;
+}
+
+
+/*
+ *  Images typographiques (via image_typo)
+ */
+.image_typo {
+	behavior: url("win_png.htc");
+}
+
+/*
+ * Boutons admin
+ */
+#entete { display: none; }
+#bas { display: none; }
+#encart { display: none; }
+.article-info-rubrique { display: none; }
+.spip-admin-float {
+	display: none;
+}
+.ps h3, .ps h4, .ps ul { display: none; }
+.cartouche .texte h2,
+.cartouche .texte form
+{ display: none; }
Index: /trunk/spip/esqueleto-redcta/themes/alternatives/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/alternatives/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/alternatives/theme.xml	(revision 30)
@@ -0,0 +1,19 @@
+<theme>
+  <nom>Alternatives</nom>
+  <auteur>
+    [Andr&#233; Vincent->http://andre-vincent.info] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>1.9.1.1</version>
+  <etat>stable</etat>
+  <type>squelettes</type>
+  <squelettes>alternatives</squelettes>
+  <description>
+    <multi>
+      Select this template to make it the default template of your site.
+      [fr]
+      S&#233;lectionner ce squelette pour l'activer comme squelette par d&#233;faut de votre site.
+    </multi>
+  </description>
+  <lien>[->www.stages.alternatives.ca/article73.html]</lien>
+  <prefix>alternatives</prefix>
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/atesenasa/sommaire.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/atesenasa/sommaire.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/atesenasa/sommaire.html	(revision 30)
@@ -0,0 +1,52 @@
+#CACHE{0}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title>[(#NOM_SITE_SPIP)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+	
+	<div id="cuerpo"><div id="estructura">cuerpo</div>
+		<div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+			<INCLURE{fond=inc/inc-menu-principal}{lang}>	
+		</div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<INCLURE{fond=inc/inc-aviso-portada}{lang}>
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+				<INCLURE{fond=inc/inc-nota-principal}{lang}>
+				<INCLURE{fond=inc/inc-nota-secundaria}{lang}>
+			</div><!-- bloquearriba -->
+			<div id="bloquemedio">
+				<div id="estructura">bloquemedio</div>
+				<INCLURE{fond=inc/inc-comunicados}{lang}>
+				<INCLURE{fond=inc/inc-notas-destacadas}{lang}>
+				<INCLURE{fond=inc/inc-galeria}{lang}>
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo">
+				<div id="estructura">bloqueabajo</div>
+				<INCLURE{fond=inc/inc-titulares}{lang}>	
+			</div><!-- bloqueabajo -->
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			 	<INCLURE{fond=inc/inc-avisos}{lang}>	
+			</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}>	
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/atesenasa/styles/personalizado.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/atesenasa/styles/personalizado.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/atesenasa/styles/personalizado.css	(revision 30)
@@ -0,0 +1,359 @@
+BODY {
+	FONT-SIZE: 90%; MARGIN: 0px; FONT-FAMILY: Helvetica, Arial, sans-serif; TEXT-ALIGN: center
+}
+IMG {
+	BORDER-RIGHT: #000000 0px solid; BORDER-TOP: #000000 0px solid; BORDER-LEFT: #000000 0px solid; BORDER-BOTTOM: #000000 0px solid
+}
+A {
+	COLOR: #0c2a80; TEXT-DECORATION: none
+}
+A:visited {
+	COLOR: #0c2a80; TEXT-DECORATION: none
+}
+A:hover {
+	COLOR: #0c2a50
+}
+A.over {
+	COLOR: #0c2a50
+}
+#pagina {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px auto; WIDTH: 780px; PADDING-TOP: 0px; POSITION: relative; TEXT-ALIGN: center
+}
+#estructura {
+	DISPLAY: none; FONT-SIZE: 80%; OVERFLOW: hidden; COLOR: #ffff00
+}
+#cabeza {
+	
+}
+#barracabeza {
+	PADDING-RIGHT: 3px; PADDING-LEFT: 3px; FONT-SIZE: 85%; PADDING-BOTTOM: 3px; MARGIN: 0px; PADDING-TOP: 3px; BACKGROUND-COLOR: #cccccc
+}
+
+#columnaizquierda {
+	FLOAT: left; PADDING-BOTTOM: 20px; MARGIN: 0px; OVERFLOW: hidden; WIDTH: 130px; TEXT-ALIGN: left
+}
+#menusecciones {
+	TEXT-ALIGN: left
+}
+.mostrar {
+	DISPLAY: none
+}
+.menuseccionesarriba {
+	BACKGROUND-REPEAT: no-repeat; HEIGHT: 13px
+}
+.menuseccionesitem {
+	BORDER-RIGHT: #23475d 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: 14px; FONT-SIZE: 80%; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; BORDER-BOTTOM: #23475d 1px solid; BACKGROUND-REPEAT: repeat-y
+}
+ HTML .menuseccionesitem {
+	
+}
+
+.pico {
+	MARGIN: -2px 0px 0px -14px; POSITION: relative
+}
+.menuseccionesitem:hover {
+	COLOR: #023568
+}
+.menuseccionesitemon {
+	BORDER-RIGHT: #23475d 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: 14px; FONT-WEIGHT: bold; FONT-SIZE: 80%; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; BORDER-BOTTOM: #23475d 1px solid; BACKGROUND-REPEAT: repeat-y
+}
+A.on {
+	FONT-WEIGHT: bold; COLOR: #ffffff
+}
+A.on:visited {
+	FONT-WEIGHT: bold; COLOR: #ffffff
+}
+.menuseccionesitem-sub A {
+	FONT-WEIGHT: bold; COLOR: #cccccc
+}
+.menuseccionesitem-sub A:visited {
+	FONT-WEIGHT: bold; COLOR: #cccccc
+}
+.menuseccionesitem-sub {
+	BORDER-RIGHT: #23475d 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: 20px; FONT-SIZE: 80%; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; BORDER-BOTTOM: #23475d 1px solid
+}
+.menuseccionesitem-subon {
+	BORDER-RIGHT: #23475d 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: 20px; FONT-SIZE: 80%; PADDING-BOTTOM: 4px; PADDING-TOP: 4px
+}
+.menuseccionesitem-subon UL LI .menuseccionesitem-sub {
+	BORDER-TOP: #23475d 1px solid; MARGIN-TOP: 2px; PADDING-LEFT: 25px; FONT-WEIGHT: bold; BACKGROUND-IMAGE: url(../img/bordemenusubsub1.gif); MARGIN-LEFT: -20px; MARGIN-RIGHT: -11px; BACKGROUND-REPEAT: repeat-y; POSITION: relative
+}
+.menuseccionesitem-subon UL LI .menuseccionesitem-subon {
+	BORDER-TOP: #23475d 1px solid; MARGIN-TOP: 2px; PADDING-LEFT: 25px; FONT-WEIGHT: bold; BACKGROUND-IMAGE: url(../img/bordemenusubsub1.gif); MARGIN-LEFT: -20px; MARGIN-RIGHT: -11px; BACKGROUND-REPEAT: repeat-y; POSITION: relative
+}
+.articuloson UL LI .menuarticuloitem {
+	BORDER-RIGHT: #23475d 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: 20px; FONT-SIZE: 80%; BACKGROUND-IMAGE: url(../img/bordemenusub1.gif); PADDING-BOTTOM: 4px; PADDING-TOP: 4px; BORDER-BOTTOM: #23475d 1px solid; BACKGROUND-REPEAT: repeat-y; BACKGROUND-COLOR: #b7d8da
+}
+.articulos UL LI .menuarticuloitem {
+	DISPLAY: none
+}
+.lienon {
+	COLOR: blue
+}
+ HTML .menuseccionesitem-sub {
+	
+}
+.menuseccionesitem-sub:hover {
+	COLOR: #023568
+}
+.menuseccionesabajo {
+	BACKGROUND-REPEAT: no-repeat; HEIGHT: 13px
+}
+#contenido {
+	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FLOAT: left; PADDING-BOTTOM: 10px; MARGIN: 0px; VERTICAL-ALIGN: middle; OVERFLOW: hidden; WIDTH: 510px; PADDING-TOP: 10px
+}
+#cuerpo
+{
+background-image: url("../img/fondoportada.gif");
+
+float:left;
+background-repeat:repeat-y;
+}
+#columnaderecha {
+	FLOAT: right; OVERFLOW: hidden; WIDTH: 120px
+}
+#avisoprincipal {
+	
+}
+#bloquearriba {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: 0px; TEXT-ALIGN: left
+}
+#bloquemedio {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: 0px; TEXT-ALIGN: left
+}
+#bloqueabajo {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: 30px; WIDTH: 100%; PADDING-TOP: 0px
+
+}
+#pie {
+	FLOAT: left; MARGIN: 0px; WIDTH: 100%; BACKGROUND-COLOR: #cccccc
+}
+
+.menu A {
+	
+}
+.menu UL {
+	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
+}
+.menu UL.titulo {
+	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
+}
+.menu LI.titulo {
+	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
+}
+#menusecundario {
+	MARGIN-LEFT: 2px; WIDTH: 140px; BORDER-BOTTOM: #cc0000 5px solid
+}
+.titulosecundario {
+	FONT-WEIGHT: bold; FONT-SIZE: 80%; MARGIN-LEFT: 8px; COLOR: #cccccc; BACKGROUND-COLOR: #000000
+}
+.menusecundarioitem {
+	PADDING-RIGHT: 6px; PADDING-LEFT: 6px; FONT-SIZE: 85%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: #000099 2px solid
+}
+.menusecundarioitem A {
+	COLOR: #09f
+}
+.menusecundarioitem A:visited {
+	COLOR: #09f
+}
+.menusecundarioitem A:hover {
+	COLOR: #9cf
+}
+.menu-item A {
+	PADDING-RIGHT: 8px; PADDING-LEFT: 18px; FONT-SIZE: 85%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
+}
+.menu-item A {
+	COLOR: #09f
+}
+.menu-item A:visited {
+	COLOR: #09f
+}
+.menu-item A:hover {
+	COLOR: #9cf
+}
+.menu-subitem {
+	PADDING-RIGHT: 8px; PADDING-LEFT: 23px; FONT-SIZE: 85%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
+}
+.avisosizquierda {
+	MARGIN: 10px 0px 10px 6px
+}
+.avisosderecha {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 80%; PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: 10px; BORDER-BOTTOM: #0066cc 1px solid
+}
+.spip-admin-bloc {
+	FLOAT: left; WIDTH: 780px; TEXT-ALIGN: center
+}
+.avisossuperior {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 90%; PADDING-BOTTOM: 0px; MARGIN: -7px 0px 0px -10px; PADDING-TOP: 0px
+}
+.subtituloaviso {
+	TEXT-ALIGN: left
+}
+.tituloaviso {
+	FONT-WEIGHT: bold; FONT-SIZE: 140%; COLOR: red
+}
+A:hover .tituloaviso {
+	COLOR: #000ddd
+}
+#datos {
+	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; FONT-SIZE: 80%; PADDING-BOTTOM: 5px; PADDING-TOP: 5px; TEXT-ALIGN: center
+}
+
+
+
+.texto1datos {
+	
+}
+.texto2datos {
+	FONT-WEIGHT: bold; FONT-SIZE: 120%; COLOR: blue
+}
+.texto3datos {
+	FONT-SIZE: 110%
+}
+#afiliados {
+	
+}
+.evento {
+	BORDER-TOP: #036 1px solid; FONT-SIZE: 11px; FONT-FAMILY: Verdana, Helvetica, Arial
+}
+.adagenciat {
+	FONT-SIZE: 14px; FONT-FAMILY: Helvetica, Arial, Geneva, Swiss, SunSans-Regular
+}
+.adagenciat A {
+	COLOR: #036; TEXT-DECORATION: none
+}
+.adagenciat A:hover {
+	COLOR: #00c
+}
+.adagencia A {
+	COLOR: #036; TEXT-DECORATION: none
+}
+.evento A {
+	COLOR: #900; TEXT-DECORATION: none
+}
+.evento A:hover {
+	COLOR: #036
+}
+.adagencia A:unknown {
+	COLOR: #036
+}
+.adagenciase {
+	BORDER-TOP: #036 1px solid; FONT-SIZE: 13px; COLOR: #036; FONT-FAMILY: Verdana, Helvetica, Arial
+}
+.activtit {
+	FONT-SIZE: 13px; COLOR: #036; FONT-FAMILY: Verdana, Helvetica, Arial
+}
+.activfecha {
+	FONT-WEIGHT: bold; FONT-SIZE: 11px; FONT-FAMILY: Verdana, Helvetica, Arial
+}
+.adagenciase A {
+	COLOR: #036; FONT-FAMILY: Verdana, Helvetica, Arial
+}
+.adagenciase A:hover {
+	COLOR: #00c; FONT-FAMILY: Verdana, Helvetica, Arial; TEXT-DECORATION: none
+}
+#cuerpodespacho {
+	FLOAT: left; BACKGROUND-IMAGE: url(../img/fondoatedespacho.gif); BACKGROUND-REPEAT: repeat-y
+}
+#contenidodespacho {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; OVERFLOW: hidden; WIDTH: 640px; PADDING-TOP: 0px
+}
+#despacho {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; FLOAT: left; PADDING-BOTTOM: 20px; OVERFLOW: hidden; WIDTH: 620px; PADDING-TOP: 10px
+}
+.regional {
+	MARGIN-TOP: 10px; FONT-WEIGHT: bold; FONT-SIZE: 80%; COLOR: #005555; TEXT-ALIGN: left
+}
+.detalleregional {
+	FONT-SIZE: 80%; COLOR: #000000; TEXT-ALIGN: left
+}
+.tituloarticulo {
+	MARGIN-TOP: 2px; FONT-SIZE: 120%; TEXT-ALIGN: left
+}
+.textoarticulo {
+	MARGIN-TOP: 20px; FONT-SIZE: 80%; TEXT-ALIGN: justify
+}
+.volver {
+	FONT-SIZE: 80%; TEXT-ALIGN: right
+}
+#datosedicion A {
+	COLOR: #cccccc
+}
+#datosedicion A:visited {
+	COLOR: #cccccc
+}
+#datosedicion A:hover {
+	COLOR: #eeeeee
+}
+#datosedicion {
+	COLOR: #ffffff; PADDING-TOP: 20px; TEXT-ALIGN: left
+}
+.frase {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; FONT-SIZE: 90%; PADDING-BOTTOM: 3px; PADDING-TOP: 3px; FONT-STYLE: italic; FONT-FAMILY: "Times New Roman", Times, serif
+}
+.despachodatos {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; FONT-SIZE: 75%; PADDING-BOTTOM: 3px; PADDING-TOP: 3px
+}
+.titulomedios {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: 80%; PADDING-BOTTOM: 3px; COLOR: #ffffff; PADDING-TOP: 3px; BACKGROUND-COLOR: #005555
+}
+.division {
+	MARGIN: 20px -10px; HEIGHT: 20px; BACKGROUND-COLOR: #cccccc
+}
+.numerodespacho {
+	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 80%; PADDING-BOTTOM: 3px; PADDING-TOP: 3px; TEXT-ALIGN: center
+}
+.galeriaup {
+	BACKGROUND-IMAGE: url(../img/galeriaup.gif); HEIGHT: 25px
+}
+.rollo {
+	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FLOAT: left; PADDING-BOTTOM: 2px; PADDING-TOP: 2px; BACKGROUND-COLOR: #000000
+}
+.galeriadown {
+	MARGIN-TOP: -3px; BACKGROUND-IMAGE: url(../img/galeriadown.gif); HEIGHT: 25px
+}
+#notadestacada {
+	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 85%; FLOAT: left; PADDING-BOTTOM: 10px; WIDTH: 230px; PADDING-TOP: 10px; TEXT-ALIGN: justify
+}
+#galeria {
+	FLOAT: left
+}
+#rubriqueportada {
+	BORDER-TOP: #ccc 1px solid; FONT-WEIGHT: bold; FONT-SIZE: 95%; PADDING-TOP: 5px
+}
+H3 {
+	MARGIN-TOP: 4px; FONT-SIZE: 140%; MARGIN-BOTTOM: 3px
+}
+.texte {
+	FONT-SIZE: 90%; MARGIN-BOTTOM: 10px
+}
+.titulo-0 {
+	FONT-WEIGHT: bold; FONT-SIZE: 120%; MARGIN-BOTTOM: 5px
+}
+.FECHA-COMUNIC {
+	FONT-WEIGHT: bold; COLOR: #666633; FONT-STYLE: italic
+}
+.titulocongreso {
+	MARGIN-TOP: -10px; FONT-WEIGHT: bold; FONT-SIZE: 130%; MARGIN-LEFT: 10px; MARGIN-RIGHT: 10px
+}
+.fecha {
+	FONT-SIZE: 80%; FONT-STYLE: italic
+}
+.surtitre {
+	FONT-WEIGHT: bold; FONT-SIZE: 90%
+}
+.chapo {
+	FONT-WEIGHT: bold
+}
+.titre {
+	FONT-WEIGHT: bold; FONT-SIZE: 130%
+}
+.articulos {
+	WIDTH: 100%; BORDER-BOTTOM: #ccc 1px solid
+}
+.sous-titre {
+	FONT-WEIGHT: bold
+}
+#bloc-contenu-top {
+	BORDER-BOTTOM: #ccc 1px solid
+}
Index: /trunk/spip/esqueleto-redcta/themes/atesenasa/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/atesenasa/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/atesenasa/theme.xml	(revision 30)
@@ -0,0 +1,22 @@
+<theme>
+  <nom>redcta - &#192; atesenasacapital</nom>
+  <auteur>
+    [redCTA->http://www.redcta.org.ar] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>1.0</version>
+  <etat>test</etat>
+  <type>themes</type>
+  <squelettes>redcta</squelettes>
+  <description>
+    <multi>
+		 [es]
+	  Seleccionar esta plantilla para que sea la plantilla por default. 	
+       [en]
+	  Select this template to make it the default template of your site.
+      [fe]
+      S&#233;lectionner ce squelette pour l'activer comme squelette par d&#233;faut de votre site.
+    </multi>
+  </description>
+  <lien>[redcta->www.redcta.org.ar]</lien>
+
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/ctabsas/inc/inc-avisosuperior.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ctabsas/inc/inc-avisosuperior.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ctabsas/inc/inc-avisosuperior.html	(revision 30)
@@ -0,0 +1,22 @@
+			<B_avisos>
+				<div id="estructura"><:Aviso Derecha:></div>
+			<BOUCLE_avisos(ARTICLES) {lang?}{titre_mot=aviso superior} {par num titre}>
+				<B_muestraspots>
+				<BOUCLE_muestraspots(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        			<div class="avisosderecha">	
+					#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    				</div><!-- avisosderecha -->
+				</BOUCLE_muestraspots>
+				</B_muestraspots>
+					
+					<div class="avisosderecha">	
+						
+						
+						<!--[(#LOGO_ARTICLE|#URL_SITE|sinon{<a href="#URL_SITE" title="#NOM_SITE">[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{120,0}) ]-->
+						
+						[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{140,0}) ]
+						
+					</div><!-- avisosderecha -->
+				<//B_muestraspots>     
+    		</BOUCLE_avisos> 
+    		</B_avisos>
Index: /trunk/spip/esqueleto-redcta/themes/ctabsas/styles/personalizado.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ctabsas/styles/personalizado.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ctabsas/styles/personalizado.css	(revision 30)
@@ -0,0 +1,48 @@
+
+#cuerpo
+{
+background-image: url("../img/fondoportada.gif");
+
+float:left;
+background-repeat:repeat-y;
+}
+/*MENU*/
+ul#nav        { color: #dcdcdc; font-size: 12px; font-family: Arial, Helvetica, Geneva, Swiss, SunSans-Regular; font-weight: bold; list-style-type: none; list-style-position: outside; margin: 0; padding: 0; width: 150px; border-top: none; border-bottom: 1px solid #fff }
+
+ul li {
+	position: relative;
+	}
+
+li ul  { display: none; position: absolute; top: 0; left: 149px }
+
+/* Fix IE. Hide from IE Mac \*/
+* html ul li { float: left; height: 1%; }
+* html ul li a { height: 1%; }
+/* End */
+
+ul li a:hover     { color: #dcdcdc; background-image: url("../img/botonon.gif") } /* Hover Styles */
+
+li ul li a    { padding: 5px 5px 5px 25px } /* Sub Menu Styles */
+
+ul li a        { color: #dcdcdc; text-decoration: none; background-color: #191970; display: block; padding: 5px 5px 5px 25px; border-style: solid solid none; border-width: 1px 1px 0; border-color: #fff }
+
+li:hover ul, li.over ul     { background-image: url("../img/botonon.gif"); display: block }
+/* FIN DEL MENU */
+
+#columnaizquierda
+{
+/*border:1px solid #0066CC;*/
+width:151px;
+}
+#columnaderecha
+{
+/*border:1px solid #0066CC;*/
+width:150px;
+}
+#contenido
+{
+	margin:5px;
+	border:1px solid #999999;
+	width:447px;
+	
+}
Index: /trunk/spip/esqueleto-redcta/themes/ctabsas/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ctabsas/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ctabsas/theme.xml	(revision 30)
@@ -0,0 +1,19 @@
+<theme>
+  <nom>redcta - &#192; ctabsas</nom>
+  <auteur>
+    [redCTA->http://www.redcta.org.ar] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>1.0</version>
+  <etat>test</etat>
+  <type>themes</type>
+  <squelettes>redcta</squelettes>
+  <description>
+    <multi>
+		 [es]
+	  Plantilla de CTA Buenos Aires 	
+      
+    </multi>
+  </description>
+  <lien>[redcta->www.redcta.org.ar]</lien>
+
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/inc/inc-fondo.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/inc/inc-fondo.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/inc/inc-fondo.html	(revision 30)
@@ -0,0 +1,16 @@
+<B_cabezaprincipal>
+
+
+	<BOUCLE_cabezaprincipal(ARTICLES){lang?}{titre_mot=fondo sitio} {par num titre}>
+<style>
+#cuerpoportada
+{ 
+background-image: url("[IMG/(#LOGO_ARTICLE|fichier)]");
+height:450px
+}
+
+</style>		
+					
+	</BOUCLE_cabezaprincipal> 
+
+</B_cabezaprincipal>
Index: /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/inc/inc-menu-portada.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/inc/inc-menu-portada.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/inc/inc-menu-portada.html	(revision 30)
@@ -0,0 +1,41 @@
+[(#REM)
+	Barre de navigation, ouverte sur la hierarchie courante
+
+	On fait un plan, et, quand on avance vers une rubrique,
+	on l'affiche si son parent est expose ou est la racine du site. ]
+
+
+
+<B_rubriques>
+
+
+	
+    	
+	<BOUCLE_rubriques(RUBRIQUES) {racine}{titre_mot=menu principal} {par num titre, titre}>
+		
+			<div class="celda">
+			<!--<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>-->
+			[(#LOGO_RUBRIQUE|center|#URL_RUBRIQUE|reduire_image{140,0})]
+			</div>
+			<B_sous_rubriques>
+			<ul>
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<li>
+						<div>
+						<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+						</div>
+						<BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
+					</li>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			</ul>
+			</B_sous_rubriques>
+
+	
+	</BOUCLE_rubriques>
+	
+	
+</B_rubriques>
+<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
Index: /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/sommaire.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/sommaire.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/sommaire.html	(revision 30)
@@ -0,0 +1,39 @@
+#CACHE{0}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title>[(#NOM_SITE_SPIP)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<INCLURE{fond=inc/inc-head}{lang}>	
+
+
+<INCLURE{fond=inc/inc-fondo}{lang}>
+
+</head>
+
+<body>
+<div id="pagina">
+	
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+	
+	<div id="cuerpoportada"><div id="estructura">cuerpo</div>
+		<div id="menuportada"><div id="estructura">columnaizquierda</div>
+			<INCLURE{fond=inc/inc-menu-portada}{lang}>	
+		</div><!-- columnaizquierda -->
+		<!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			 	<INCLURE{fond=inc/inc-avisos}{lang}>	
+			</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}>	
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/styles/personalizado.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/styles/personalizado.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/styles/personalizado.css	(revision 30)
@@ -0,0 +1,16 @@
+#cuerpoportada{margin-top:100px;
+float:left;
+
+}
+#menuportada{
+margin-top:10px;
+float:left;
+width:780px;
+overflow:hidden
+}
+.celda{
+float:left;
+width:250px;
+overflow:hidden;
+margin-bottom:145px
+}
Index: /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/ctaenmovimiento/theme.xml	(revision 30)
@@ -0,0 +1,22 @@
+<theme>
+  <nom>redcta - &#192; ctaenmovimiento</nom>
+  <auteur>
+    [redCTA->http://www.redcta.org.ar] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>1.0</version>
+  <etat>test</etat>
+  <type>themes</type>
+  <squelettes>redcta</squelettes>
+  <description>
+    <multi>
+		 [es]
+	  Seleccionar esta plantilla para que sea la plantilla por default. 	
+       [en]
+	  Select this template to make it the default template of your site.
+      [fe]
+      S&#233;lectionner ce squelette pour l'activer comme squelette par d&#233;faut de votre site.
+    </multi>
+  </description>
+  <lien>[redcta->www.redcta.org.ar]</lien>
+
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/le_modele/plugin.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/le_modele/plugin.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/le_modele/plugin.xml	(revision 30)
@@ -0,0 +1,20 @@
+<plugin>
+	<nom> <!-- Nom du plugin -->
+	Nom du Th&#232;me
+	</nom>
+	<auteur>	<!-- Auteur du plugin et URI de l'auteur -->
+	[Pr&#233;nom Nom->http://zone.spip.org/trac/spip-zone/browser/_themes_/_le_modele_]
+_ Nov. 2006 - Licence GNU/GPL.
+	</auteur>
+	<version>0.8</version> <!-- version du plugin, pas de SPIP -->
+	<etat>test</etat>
+	<description>
+<multi>
+Activate this 'theme' to modify the look and feel of the default template.
+	[fr]
+Activez ce theme pour varier l'apparence du squelette par defaut de SPIP.
+</multi>
+<lien>http://zine.spip.org/spip.php?article8</lien> <!-- URI de documentation -->
+	</description>
+	 <prefix>dist</prefix>
+</plugin>
Index: /trunk/spip/esqueleto-redcta/themes/le_modele/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/le_modele/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/le_modele/theme.xml	(revision 30)
@@ -0,0 +1,41 @@
+<theme>
+  <!-- 
+       Ce fichier identifie les themes pour les plugins de gestion 
+       de themes ou d'habillages pour SPIP, tels "habillages" et "skthemes". 
+    -->
+  <nom>Nom du Th&#232;me</nom>
+  <auteur>
+    [Pr&#233;nom Nom->http://zone.spip.org/trac/spip-zone/browser/_themes_/_le_modele_]
+_ Nov. 2006 - Licence GNU/GPL.
+  </auteur>
+  <version>0.8</version>
+  <etat>stable</etat>
+  <!-- 
+       Le type sert a identifier le contenu du dossier qui
+       contient le present fichier. Les types sont :
+       - "squelettes" : les squelettes de l'espace public;
+       - "themes" : les couleurs de fonds et de textes;
+       - "logos_site" : les logos de site;
+       - "logos_rubart" : les logos de rubriques et d'articles;
+       - "icones_prive" : les icones de l'espace prive;
+       - "extras" : les comportements inseres notament par du javascript.
+       Le type sert au plugin pour savoir quel contenu lister dans
+       les rubriques dediees (squelettes, themes, logos, extras, espace prive).
+    -->
+  <type>themes</type>
+  <!-- 
+       La balise <squelettes> contient les squelettes avec lesquels
+       est compatible ce style. Pas de majuscule, ni de caracteres
+       accentues ici. <squelettes> correspond ici au prefixe (indique
+       dans theme.xml) du/des squelettes concernes.
+    -->
+  <squelettes>dist</squelettes>
+  <description>
+    <multi>
+      Activate this theme to modify the look of the official distribution.
+
+      [fr]
+      Activez ce th&#232;me pour changer les couleurs de vos squelettes SPIP
+    </multi>
+  </description>
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/404.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/404.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/404.html	(revision 30)
@@ -0,0 +1,43 @@
+#CACHE{24 * 3600}
+#HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}
+#HTTP_HEADER{Pragma: no-cache}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title> 404 - [(#NOM_SITE_SPIP|textebrut)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<INCLURE{fond=inc/inc-head}{lang}>	
+	<meta name="robots" content="none" />
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+	
+	<div id="cuerpo"><div id="estructura">cuerpo</div>
+		<div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+			<INCLURE{fond=inc/inc-menu-principal}{lang}>	
+		</div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div class="cartouche">
+			<h1 class="titre"><:pass_erreur:> 404</h1>
+			</div>
+			[<div class="chapo">(#ENV*{erreur}|propre)</div>]
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			 	<INCLURE{fond=inc/inc-avisos}{lang}>	
+			</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}>	
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/article.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/article.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/article.html	(revision 30)
@@ -0,0 +1,157 @@
+#CACHE{86400}
+<BOUCLE_article_principal(ARTICLES) {id_article} {lang_select} {doublons} ><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+	<INCLURE{fond=inc/inc-head}{lang}>
+   
+	#INSERT_HEAD 
+	#SPIP_HEAD
+</head>
+
+<body>
+<div id="pagina">
+<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>	
+
+	<div id="cuerpo">
+	  <div id="estructura"></div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		
+		
+  		<INCLURE{fond=inc/inc-menu-principal}{id_rubrique}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+							
+
+			</div><!-- avisoprincipal -->
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+				
+				<BOUCLE_squelette_rubrique1(MOTS){id_rubrique}{type=Esqueletos}{0,1}>
+					<INCLURE{fond=inc/inc-muestra-actividades}{id_rubrique}>
+				</BOUCLE_squelette_rubrique1>
+				
+				<div class="cartouche">
+				<div class="iconitos" style="float:right; margin-top:5px ; text-align:right; border:0px">
+					#ENVIAR_EMAIL** 
+					#IMPRIMIR_DOCUMENTO**
+					<a HREF="#" onClick="window.open('spip.php?page=article_pdf&id_article=#ID_ARTICLE','_blank','toolbar=0, location=0, directories=0, status=0, scrollbars=0, resizable=0, copyhistory=0, menuBar=0, width=400, height=620');return(false)">
+						<img src="#DOSSIER_SQUELETTE/img/crear_pdf.gif" / style="border:0px ">
+					</a>
+				</div>
+				<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+				
+				<BOUCLE_comunicadodeprensa(MOTS){id_rubrique}{titre=comunicado de prensa}{0,1}>
+					[(#LOGO_MOT|center)]
+				</BOUCLE_comunicadodeprensa>
+				#DEBUT_SURLIGNE
+				[(#LOGO_ARTICLE||image_reduire{200,200})]
+				[<p class="surtitre">(#SURTITRE)</p>]
+				<h1 class="titre">[(#TITRE|supprimer_numero)]</h1>
+				[<p class="soustitre">(#SOUSTITRE)</p>]
+				#FIN_SURLIGNE
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+
+				<p><small>[(#DATE|nom_jour) ][(#DATE|affdate)][, <:par_auteur:> (#LESAUTEURS)]</small></p>
+				</BOUCLE_sivafecha>
+				[(#REM) Inclure le modele des liens de traductions ]
+				#MODELE{article_traductions}
+
+			</div>
+			
+			#DEBUT_SURLIGNE
+			[<div class="chapo">(#CHAPO)</div>]
+			[<div id="sommaire">
+				<h4><:icone_brouteur:></h4> [(#REM) = "Navigation rapide" on aurait prefere "Sommaire", mais pas de traduction ]
+				(#TEXTE*|sommaire_article|propre)
+			</div>]
+			<br class="nettoyeur" />
+			[<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+			[<div class="texte">(#TEXTE*|decouper_en_page{#ID_ARTICLE}|propre|reduire_image{510,0})</div>]
+			#FIN_SURLIGNE
+
+			[(#REM) Portfolio : album d'images ]
+			<B_afficher_document>
+			
+			<BOUCLE_afficher_document(DOCUMENTS) {id_document} {id_article} {mode=document}{extension IN png,jpg,gif}>
+			<center><hr /><div class="spip_documents spip_documents_center" id="document_actif">
+				[(#EMBED_DOCUMENT|image_reduire{510,0})]
+				[<div class="spip_doc_titre">(#TITRE)</div>]
+				[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+			</div></center>
+			</BOUCLE_afficher_document>
+			</B_afficher_document>
+			<B_documents_portfolio>
+			<div id="documents_portfolio">
+				<h3>Galeria de Imagenes<small><small><i> - Click en las miniaturas para agrandarlas</i> </small></small></h3>
+				<BOUCLE_documents_portfolio(DOCUMENTS) {id_article} {mode=document} {extension IN png,jpg,gif} {par num titre, date} >
+				[<a href="#URL_DOCUMENT" type="#MIME_TYPE" onclick="location.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return false;"[ title="(#TITRE|couper{80}|texte_backend)"]>(#LOGO_DOCUMENT||image_reduire{0,60}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+				</BOUCLE_documents_portfolio>
+			</div>
+			</B_documents_portfolio>
+			
+			[<div class="ps"><h2><:info_ps:></h2>#DEBUT_SURLIGNE(#PS)#FIN_SURLIGNE</div>]
+
+			[(#REM) Autres documents joints a l'article ]
+			<B_documents_joints>
+			<div><hr />
+				<BOUCLE_documents_joints(DOCUMENTS) {id_article} {mode=document} {par num titre, date} {doublons}>
+					<div style="float: left;">
+						[(#LOGO_DOCUMENT|#URL_DOCUMENT)][<div style="clear: both;"><b>(#TITRE)</b></div>][<div style="clear: both;">(#DESCRIPTIF)</div>]
+					</div>
+				</BOUCLE_documents_joints>
+			</div>
+			<div style="clear: both;"></div>
+		</B_documents_joints>
+				
+				
+				
+				
+
+	
+	<?php  if ($nombreRubrique + $nombreArticle == 0) { ?>
+	<style>#boite-srubrique-rubrique {display: none;}</style>
+	<?php } ?>
+			</div><!-- bloquearriba -->
+			<div id="bloquemedio">
+				<BOUCLE_seccion(RUBRIQUES){id_rubrique}>
+				<B_art_mot2>
+						<div style="border-bottom:1px solid #0066CC; "></div>
+					<div class="regional">
+						<img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> 
+						[(#TITRE|supprimer_numero)] 
+						[ <span class="detalleregional"> -(#DESCRIPTIF)-</span>] 
+					</div>
+					<BOUCLE_art_mot2(ARTICLES){titre_mot=#TITRE} {par date}{inverse}>
+   						<div class="tituloarticulo" style="font-size:85% "><a href="#URL_BREVE"><strong>[(#TITRE|supprimer_numero)]</strong></a>[ - (#DATE|nom_jour) ][(#DATE|affdate)]<br /></div>
+					</BOUCLE_art_mot2>
+				</B_art_mot2>
+				</BOUCLE_seccion>
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div>
+			
+			</div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			  			 	<INCLURE{fond=inc/inc-avisos}{lang}>
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}> 
+	
+</div><!-- pagina -->
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]	
+</body>
+</html>
+</BOUCLE_article_principal>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/auteur.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/auteur.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/auteur.html	(revision 30)
@@ -0,0 +1,75 @@
+<BOUCLE_auteur_principal(AUTEURS) {id_auteur}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+   	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>	
+
+	<div id="cuerpo"><div id="estructura">Cuerpo</div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		
+		
+  		<INCLURE{fond=inc/inc-menu-principal}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div class="cartouche">
+				[(#LOGO_AUTEUR||image_reduire{200,200})]
+				<h1 class="#EDIT{qui} titre">#NOM</h1>
+				[<p class="#EDIT{hyperlien} soustitre"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+			</div>
+
+			[<div class="#EDIT{bio} texte">(#BIO)</div><br />]
+
+			<br class="nettoyeur" />
+
+			[<div class="encart">
+			(#FORMULAIRE_ECRIRE_AUTEUR)
+			</div><!-- fin encart -->]
+
+			[(#REM) Articles de l'auteur ]
+			<B_articles>
+			<div class="contre-encart">
+
+				<div class="liste-articles">
+					#ANCRE_PAGINATION
+					<h2 class="invisible"><:articles_auteur:></h2>
+					<ul>
+						<BOUCLE_articles(ARTICLES) {id_auteur} {par date}{inverse} {pagination 10}>
+						<li>
+							<h3 class="titre"><a href="#URL_ARTICLE">#TITRE</a></h3>
+							<small>[(#DATE|affdate_jourcourt)]</small>
+						</li>
+						</BOUCLE_articles>
+					</ul>
+					[<p class="pagination">(#PAGINATION)</p>]
+				</div>
+
+			</div><!-- fin contre-encart -->
+			</B_articles>
+
+			[<div class="notes"><h2><:info_notes:></h2>(#NOTES)</div>]
+
+			
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+						 	<INCLURE{fond=inc/inc-avisos}{lang}>
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}> 
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
+</BOUCLE_auteur_principal>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/despacho-mail.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/despacho-mail.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/despacho-mail.html	(revision 30)
@@ -0,0 +1,149 @@
+<BOUCLE_mot_principal(MOTS) {id_mot} {doublons}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title>[(#NOM_SITE_SPIP)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/icon.gif" />
+
+<link rel="stylesheet" 
+		href="#DOSSIER_SQUELETTE/styles/estilo-despachos.css" 
+		type="text/css" media="projection, screen, tv" title="cta" />
+</head>
+
+<body>
+<a name="inicio"></a>
+<table width="780px" cellpadding="0" cellspacing="0" border="0" >
+	<tr>
+		<td>
+			<div id="cabeza">
+				<B_cabezaprincipal>
+	
+	<BOUCLE_cabezaprincipal(ARTICLES){lang?}{titre_mot=cabeza despacho} {par num titre}>
+		<B_muestradoc1>
+			<BOUCLE_muestradoc1(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        		<div>	
+					#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    			</div><!-- avisossuperior -->
+			</BOUCLE_muestradoc1>
+			</B_muestradoc1>
+			<div>	
+				<a href="#URL_SITE_SPIP">
+					[<img src='#URL_SITE_SPIP/IMG/(#LOGO_ARTICLE|fichier)'  style='border-width: 0px;' class='spip_logos' align='left'  /> ]
+				</a>
+			</div><!-- avisossuperior -->
+		<//B_muestradoc1>     
+	</BOUCLE_cabezaprincipal> 
+</B_cabezaprincipal>
+				
+			</div>
+		</td>
+	</tr>
+	<tr>
+		<td>		
+	<B_barracabeza>
+			<div id="barracabeza">
+				
+					<BOUCLE_barracabeza(ARTICLES){lang?}{titre_mot=Despacho Bajada} {par num titre}>
+						<div>	
+							#TEXTE
+						</div><!-- avisossuperior --> 
+					</BOUCLE_barracabeza> 
+				
+			</div>
+			</B_barracabeza>
+		</td>
+	</tr>
+	<tr>
+	<td>		
+	
+
+		<table width="100%"  cellpadding="0" cellspacing="0"  border="0">
+  <tr>
+    <td width="130" valign="top" id="columnaizquierda"><div id="columnaizquierda">
+			
+			<div id="datosedicion">
+			<BOUCLE_despacho(MOTS){id_mot}{par titre}>
+				<div class="numerodespacho">Despacho N° #TITRE <br />#DESCRIPTIF</div>
+			</BOUCLE_despacho>
+				<BOUCLE_frases(BREVES){lang?}{id_rubrique=8} {par hasard} {0,1}>
+					<div class="frase">	
+						#TEXTE
+						</div>
+				</BOUCLE_frases> 
+				<BOUCLE_despachodatos(ARTICLES){lang?}{titre_mot=Despacho Datos} {par num titre}>
+					<div class="despachodatos">	
+						#TEXTE
+					</div> 
+				</BOUCLE_despachodatos> 
+				<B_medios>
+					<div class="titulomedios">ATE en los medios</div>
+					<BOUCLE_medios(BREVES){lang?}{id_rubrique=7}  {par num titre}>
+						<div class="despachodatos">	
+							#TITRE<br />
+							<a href="#URL_SITE">#NOM_SITE</a>
+						</div>
+					</BOUCLE_medios> 
+				</B_medios>
+				</div><!-- datosedicion -->
+		</div><!-- columnaizquierda --></td>
+    <td  valign="top">		<div id="contenidodespacho">
+			<div id="despacho">
+				
+
+					
+					<div class="regional"><img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> [(#TITRE|supprimer_numero)] [ <span class="detalleregional"> -(#DESCRIPTIF)-</span>] </div>
+					<ul>
+					<BOUCLE_art_mot(ARTICLES){id_mot}{par num titre}>
+   						<li><div class="tituloarticulo"><a href="##ID_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong><br /></a></div></li>
+					</BOUCLE_art_mot>
+					</ul>
+					
+					
+
+				<div class="division"></div>
+				
+
+					<BOUCLE_art_mot3(ARTICLES){id_mot=#ENV{id_mot}} {titre_mot=#TITRE} {par num titre}>
+   						<div class="tituloarticulo">
+							<img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> 
+								<a name="#ID_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong></a> <br />
+						</div>
+							[<img src='#URL_SITE_SPIP/IMG/(#LOGO_ARTICLE|fichier)'  style='border-width: 0px;' class='spip_logos' align='left' hspace='5' /> ]
+								[<div class="textoarticulo"><b>#CHAPO</b>(#TEXTE|abs_url)  </div>] <div class="volver"><a href="#inicio">[ Volver a titulares ]</a></div> 
+					</BOUCLE_art_mot3>
+      			
+
+				<!-- Ahora para los articulos -->
+				
+				
+
+      			
+			</div><!-- despacho -->
+			
+			
+		</div><!-- contenidodespacho --></td>
+  </tr>
+</table>
+
+	  	
+
+
+  </td>
+</tr>
+<tr>
+<td>
+  
+  <INCLURE{fond=inc/inc-piegral}{lang}>  
+	
+</td>
+</tr>
+</table>
+
+</body>
+</html>
+
+</BOUCLE_mot_principal>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-affvisit.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-affvisit.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-affvisit.html	(revision 30)
@@ -0,0 +1,21 @@
+<?php
+$query = "SELECT SUM(visites) AS total_absolu FROM spip_visites";
+	$result = spip_query($query);
+
+	if ($row = spip_fetch_array($result)) {
+		$total_absolu = $row['total_absolu'];
+	}
+
+
+$query = "SELECT COUNT(DISTINCT ip) AS visites FROM spip_visites_temp";
+		$result = spip_query($query);
+	
+	if ($row = @spip_fetch_array($result)) {
+		$visites_today = $row['visites'];
+}
+
+$total_gen = $total_absolu + $visites_today;
+
+echo "<strong>".$total_gen."</strong>";
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-agenda-plugin.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-agenda-plugin.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-agenda-plugin.html	(revision 30)
@@ -0,0 +1,34 @@
+<B_lesevenements>
+	<div class="agendabanner"></div>
+	<div class="agendain">
+	<BOUCLE_lesevenements(EVENEMENTS){age_debut>=-9}{age_debut<=0}{par date}>
+		<div class="agendafecha"> 
+			[[(#DATE_DEBUT|nom_jour)] (#DATE_DEBUT|affdate_jourcourt|unique)]
+		</div>
+		<div class="agendatit">
+			<a href="#URL_ARTICLE#[(#DATE_DEBUT||affdate{'Y-m-d'})]">[(#TITRE|supprimer_numero)]</a>
+		</div>
+		<div class="agendaevent">
+			[(#HORAIRE|=={oui}|?{[<b>(#DATE_DEBUT|heures)]:[(#DATE_DEBUT|minutes) horas],''})</b><br>]
+  			[lugar: (#LIEU)]</div>
+
+ 	</BOUCLE_lesevenements>
+ 	<!-- Esto si no hay noticias en el dia acual ni en el proximo -->
+	</div>
+</B_lesevenements>
+	<B_lesevenements1>  
+		<div class="agendain">
+		<BOUCLE_lesevenements1(EVENEMENTS){age_debut>=-8}{age_debut<=-1}{par date}>
+			<div class="agendafecha"> 
+				[[(#DATE_DEBUT|nom_jour)] (#DATE_DEBUT|affdate_jourcourt|unique)]
+			</div>
+			<div class="agendatit">
+				<a href="#URL_ARTICLE#[(#DATE_DEBUT||affdate{'Y-m-d'})]">[(#TITRE|supprimer_numero)]</a>
+			</div>
+			<div class="agendaevent">
+				[(#HORAIRE|=={oui}|?{[<b>(#DATE_DEBUT|heures)]:[(#DATE_DEBUT|minutes) horas],''})</b><br>]
+  				[lugar: (#LIEU)]</div>
+		</BOUCLE_lesevenements1>
+		</div>
+	</B_lesevenements1>	
+<//B_lesevenements>        
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-aviso-portada.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-aviso-portada.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-aviso-portada.html	(revision 30)
@@ -0,0 +1,17 @@
+
+				<B_avisos_superior>
+				<div id="avisoportada">
+					<div id="estructura"><:Aviso portada:></div>
+					<BOUCLE_avisos_superior(ARTICLES){lang?}{titre_mot=aviso portada} {par num titre}>
+						<B_muestradoc>
+							<BOUCLE_muestradoc(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+									[<a href="#URL_ARTICLE">(#EMBED_DOCUMENT|reduire_image{526,0})</a>]                                                         <!-- Inserta el documento en este caso FLASH en la pagina -->  
+							</BOUCLE_muestradoc>
+						</B_muestradoc>
+								[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{526,0}) ]
+						<//B_muestradoc>     
+					</BOUCLE_avisos_superior> 
+					</div><!-- avisoportada -->
+    			</B_avisos_superior>
+
+		
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisoinferior.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisoinferior.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisoinferior.html	(revision 30)
@@ -0,0 +1,16 @@
+			<B_avisos>
+				<div id="estructura"><:Aviso Derecha:></div>
+			<BOUCLE_avisos(ARTICLES) {lang?}{titre_mot=aviso inferior} {par num titre}>
+				<B_muestraspots>
+				<BOUCLE_muestraspots(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        			<div class="avisosderecha">	
+					[<a href="#URL_ARTICLE">(#EMBED_DOCUMENT|reduire_image{110,0})</a>]                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    				</div><!-- avisosderecha -->
+				</BOUCLE_muestraspots>
+				</B_muestraspots>
+					<div class="avisosderecha">	
+						[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{110,0}) ]
+					</div><!-- avisosderecha -->
+				<//B_muestraspots>     
+    		</BOUCLE_avisos> 
+    		</B_avisos>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisos.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisos.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisos.html	(revision 30)
@@ -0,0 +1,4 @@
+ 	<INCLURE{fond=inc/inc-avisosuperior}{lang}>
+  	<INCLURE{fond=inc/inc-destacadalateral}{lang}>
+	<INCLURE{fond=inc/inc-agenda-plugin}{lang}>
+    <INCLURE{fond=inc/inc-avisoinferior}{lang}>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisosuperior.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisosuperior.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-avisosuperior.html	(revision 30)
@@ -0,0 +1,16 @@
+			<B_avisos>
+				<div id="estructura"><:Aviso Derecha:></div>
+			<BOUCLE_avisos(ARTICLES) {lang?}{titre_mot=aviso superior} {par num titre}>
+				<B_muestraspots>
+				<BOUCLE_muestraspots(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        			<div class="avisosderecha">	
+					[<a href="#URL_ARTICLE">(#EMBED_DOCUMENT|reduire_image{110,0})</a>]                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    				</div><!-- avisosderecha -->
+				</BOUCLE_muestraspots>
+				</B_muestraspots>
+					<div class="avisosderecha">	
+						[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{110,0}) ]
+					</div><!-- avisosderecha -->
+				<//B_muestraspots>     
+    		</BOUCLE_avisos> 
+    		</B_avisos>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-barracabeza.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-barracabeza.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-barracabeza.html	(revision 30)
@@ -0,0 +1,25 @@
+<B_cabezaprincipal>
+<div id="barracabeza">
+	<div id="estructura"><:barra cabeza:></div>
+	<BOUCLE_cabezaprincipal(ARTICLES){lang?}{titre_mot=barra cabeza} {par num titre}>
+		<B_muestradoc1>
+			<BOUCLE_muestradoc1(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        		<div>	
+					#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    			</div>
+			</BOUCLE_muestradoc1>
+			</B_muestradoc1>
+			<div>	
+						[(#LOGO_ARTICLE|#URL_SPIP|sinon{<a href="#URL_SPIP" >[(#TEXTE|supprimer_numero)]</a>}|reduire_image{780,0}|inserer_attribut{style,border:0}) ]
+					</div>
+		<//B_muestradoc1>     
+	</BOUCLE_cabezaprincipal> 
+	</div><!-- barracabeza -->
+</B_cabezaprincipal>
+	<div id="barracabeza"><div id="estructura">barracabeza</div><a href="#URL_SPIP" >#DESCRIPTIF_SITE_SPIP</a></div>
+<//B_cabezaprincipal>	
+
+ 
+
+ 	
+		
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-cabeza.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-cabeza.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-cabeza.html	(revision 30)
@@ -0,0 +1,24 @@
+<B_cabezaprincipal>
+<div id="cabeza">
+	<div id="estructura"><:cabeza:></div>
+	<BOUCLE_cabezaprincipal(ARTICLES){lang?}{titre_mot=cabeza principal} {par num titre}>
+		<B_muestradoc1>
+			<BOUCLE_muestradoc1(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        		<div>	
+					#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    			</div>
+			</BOUCLE_muestradoc1>
+			</B_muestradoc1>
+			<div>	
+						[(#LOGO_ARTICLE|#URL_SITE_SPIP|sinon{<a href="#URL_SITE_SPIP" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{780,0}) ]
+			</div>
+		<//B_muestradoc1>     
+	</BOUCLE_cabezaprincipal> 
+</div><!-- cabeza -->
+</B_cabezaprincipal>
+	
+
+ 
+
+ 	
+		
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-comunicados.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-comunicados.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-comunicados.html	(revision 30)
@@ -0,0 +1,35 @@
+		<B_comunicado>
+		<div id="comunicado">
+				<B_logo_comunicado>
+					<div id="estructura"><:Aviso Superior:></div>
+						<BOUCLE_logo_comunicado(ARTICLES){lang?}{titre_mot=logo comunicado de prensa} {par num titre}>
+							<B_muestradoc1>
+								<BOUCLE_muestradoc1(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        							<div>	
+										#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    								</div><!-- avisossuperior -->
+								</BOUCLE_muestradoc1>
+							</B_muestradoc1>
+							<div>	
+								<!--[(#LOGO_ARTICLE|#URL_SITE|sinon{<a href="#URL_SITE" title="#NOM_SITE">[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{120,0}) ]-->
+								[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{780,0}) ]
+							</div><!-- avisossuperior -->
+						<//B_muestradoc1>     
+					</BOUCLE_logo_comunicado> 
+				</B_logo_comunicado>
+				<BOUCLE_comunicado(ARTICLES) {lang?}{titre_mot=comunicado de prensa}{lang} {par date}{0,1} {inverse}>
+      					<div class="comunicado-in">
+							[<div id="rubriqueportada">(#SURTITRE)</div>]
+							
+										
+							<a href="#URL_ARTICLE">
+							
+								<h3>[(#TITRE|supprimer_numero)]</h3>
+								[[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)] - Prensa #NOM_SITE_SPIP]
+      							[<div class="sous-titre">(#SOUSTITRE)</div>]
+	  							[<div class="texte">(#CHAPO)<a href="#URL_ARTICLE">(ver articulo completo)</a></div>] 
+							</a>	
+						</div>
+					</BOUCLE_comunicado>
+					</div>
+    				</B_comunicado>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-contenidos_grupo.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-contenidos_grupo.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-contenidos_grupo.html	(revision 30)
@@ -0,0 +1,72 @@
+					<BOUCLE_rubrique(RUBRIQUES) {id_rubrique}>
+ <B_mot>					
+[(#REM) Nube de palabras ]
+
+    <div class="nube01">#TITRE:
+    </div>
+    <div class="nube02">
+  <?php
+
+
+ <BOUCLE_mot(MOTS){type=#TITRE}{par titre}>
+  $titre[#ID_MOT]='[(#TITRE|texte_script)]';
+  $url[#ID_MOT]='#URL_MOT';
+ <BOUCLE_art1(ARTICLES){id_mot}>
+ </BOUCLE_art1>
+  $pop[#ID_MOT]=#TOTAL_BOUCLE; # Nombre d'articles pour ce mot
+ </B_art1>
+ </BOUCLE_mot>
+
+ $maxpop = max($pop); # Plus grand nombre d'article pour un mot
+
+ foreach ($titre as $id => $t) {
+  $score = $pop[$id]/$maxpop; # entre 0 et 1
+  if($score > 0.02){
+   $s = ceil(20*$score);
+   $s = 10 + $s;
+   $t = str_replace(' ', '&nbsp;', $t);
+   $l = "<span style='font-size:".$s."px'>$t</span>";
+   $l = "<a href='".$url[$id]."'>$l</a>";
+   echo "$l &nbsp; \n";
+  }
+ }
+
+ ?>
+  </div>
+<br />	
+ </B_mot>				
+					
+
+
+					<hr color="#999999" noshade size="1">
+
+				<B_art_mot2>
+					#ANCRE_PAGINATION
+					<BOUCLE_art_mot2(ARTICLES){type=#TITRE} {par date}{inverse}{pagination 10}>
+   						
+						<BOUCLE_provinciast2(MOTS) {id_article}{type=#_rubrique:TITRE}> 
+	<b><div class="titre-texte"><small>[<a style="color:#993333" href="#URL_MOT">(#TITRE)</a> ]</small></div></b>
+	</BOUCLE_provinciast2> 	
+	<table><tr><td>
+			<B_foto1>
+										<BOUCLE_foto1(DOCUMENTS){id_article}{extension==jpg|png|gif}{par hasard}{0,1}>
+											[(#LOGO_DOCUMENT|left||image_reduire{110,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,4}|inserer_attribut{style,border:1px solid #000000})]
+     
+										</BOUCLE_foto1> 
+										</B_foto1> 
+										[(#LOGO_ARTICLE|left|#URL_ARTICLE|reduire_image{140,0}|inserer_attribut{hspace,5})]
+										<//B_foto1>
+			[(#LOGO_ARTICLE|right||reduire_image{80,0}|inserer_attribut{hspace,5})]<a href="#URL_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong><br />
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+					<small>[(#DATE|nom_jour) ][(#DATE|affdate)]</small>
+				</BOUCLE_sivafecha>
+				<BOUCLE_sivaautor(MOTS){id_rubrique}{titre=con autor}>
+					<small>[, <:par_auteur:> (#LESAUTEURS)]</small>
+				</BOUCLE_sivaautor>
+				[<br />(#CHAPO)]</a>
+			</td></tr></table>
+					</BOUCLE_art_mot2>
+					
+      [<p class="pagination">(#PAGINATION)</p>]
+				</B_art_mot2>
+				</BOUCLE_rubrique>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-destacadalateral.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-destacadalateral.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-destacadalateral.html	(revision 30)
@@ -0,0 +1,26 @@
+<B_articles_por_secciones1>
+	<div class="pirulos" >									
+		<BOUCLE_articles_por_secciones1(ARTICLES){titre_mot=destacada lateral}{lang} {par id_rubrique}>
+      		<BOUCLE_nom_rub3 (RUBRIQUES){id_rubrique}>
+				[
+					<div class="cortepirulo"></div>
+					<div id="rubriquepirulo"><a href="#URL_RUBRIQUE">(#TITRE|supprimer_numero|unique{aca})</a></div>
+				]
+			</BOUCLE_nom_rub3>
+			<div class="spacepirulo"></div>
+			<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+				[(#LOGO_DOCUMENT|right||image_reduire{110,0})]
+            </BOUCLE_foto>
+			[<div class="surtitrep">(#SURTITRE)</div>]
+			<div class="h5p">
+				<a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a>
+			</div>
+			[<div class="sous-titrep">(#SOUSTITRE)</div>]
+		</BOUCLE_articles_por_secciones1>
+	</div>
+</B_articles_por_secciones1>
+<!-- Fin Por las secciones -->
+					
+								
+					
+					
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-fotogaleria.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-fotogaleria.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-fotogaleria.html	(revision 30)
@@ -0,0 +1,25 @@
+<div id="fotogaleria">
+	<table width="100%" align="center" bgcolor="#ECEAEB" id="tablagaleria">
+	  <tr><td>
+	
+	
+    <B_article_langue1>
+	<h3 style="margin-bottom:1px; margin-top:2px "><a href="<BOUCLE_linkea(MOTS){titre=Galeria de Fotos}>#URL_MOT</BOUCLE_linkea>">Fotogalería</a></h3>
+	
+  	
+    <BOUCLE_article_langue1(ARTICLES) {lang}{titre_mot=fotogaleria} {par date}{inverse}>
+		<a href="#URL_ARTICLE"><h3>[(#TITRE|supprimer_numero)	]</h3></a>	
+		<BOUCLE_foto1(DOCUMENTS){id_article}{fichier==(png|jpg|gif)$}>
+	  		[<a href="#URL_DOCUMENT" type="#MIME_TYPE" onclick="location.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return false;"[ title="(#_article_langue1:TITRE|supprimer_numero)"]>(#LOGO_DOCUMENT||image_reduire{0,64}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+		</BOUCLE_foto1> 
+		
+    </BOUCLE_article_langue1>
+
+	
+
+    </B_article_langue1>
+    <//B_article_langue1>
+	 
+
+</td></tr></table>
+</div>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-galeria.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-galeria.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-galeria.html	(revision 30)
@@ -0,0 +1,28 @@
+
+	
+	
+    <B_article_langue1>
+	<div id="fotogaleria">
+	<table align="center" bgcolor="#ECEAEB" id="tablagaleria">
+	  <tr><td>
+	<a href="<BOUCLE_linkea(MOTS){titre=fotogaleria}>#URL_MOT</BOUCLE_linkea>"><h3 style="text-align:center; margin-bottom:1px; margin-top:2px ">Fotogalería</h3>
+	<div class="galeriaup"></div>
+  		
+    <BOUCLE_article_langue1(ARTICLES) {lang}{titre_mot=fotogaleria} {par date}{inverse} {0,5}>
+		
+		<BOUCLE_foto1(DOCUMENTS){id_article}{fichier==(png|jpg|gif)$}{par hasard}{0,1}>
+	  		[(#LOGO_DOCUMENT||image_reduire{0,64}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})]
+		</BOUCLE_foto1> 
+		
+    </BOUCLE_article_langue1>
+		
+	<div class="galeriadown"></div>
+	</a>
+	</td></tr></table>
+	</div>
+    </B_article_langue1>
+	
+    <//B_article_langue1>
+	 
+
+
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-head.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-head.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-head.html	(revision 30)
@@ -0,0 +1,121 @@
+ 
+<!-- links a las hojas de estilo -->
+
+  	<link rel="stylesheet" 
+		href="#DOSSIER_SQUELETTE/../styles/estilo.css" 
+		type="text/css" media="projection, screen, tv" title="cta" />
+	
+	<link rel="stylesheet" 
+		href="#DOSSIER_SQUELETTE/../styles/agenda.css" 
+		type="text/css" media="projection, screen, tv"  />
+	
+	<!--  media="print" : hoja de estilos para imprimir la pagina desde su navegador -->
+	<link rel="stylesheet" 
+		href="#DOSSIER_SQUELETTE/../styles/impresion.css" type="text/css" media="print" />
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<!-- esqueleto de menu que estoy probando 
+	<link rel="stylesheet" 
+		href="#DOSSIER_SQUELETTE/../styles/spip-menu-vertical.css" -->
+
+
+
+<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+
+
+
+	<!-- META TAGS para algunos motores de busqueda, 
+		Google no lo tiene en cuenta, se puede remover -->
+<B_article_head><BOUCLE_article_head(ARTICLES) {id_article}>
+	<!-- Para articulo -->
+	[<meta name="Description" content="(#DESCRIPTIF|supprimer_tags|attribut_html)" />]
+	<B_keywords_article><meta name="Keywords" content='<BOUCLE_keywords_article(MOTS){id_article}{","}>[(#TITRE|supprimer_numero|supprimer_tags|attribut_html)]</BOUCLE_keywords_article>' /></B_keywords_article>
+	<meta name="Author" content='<BOUCLE_author(AUTEURS){id_article}{","}>[(#NOM|supprimer_tags|attribut_html)]</BOUCLE_author>' />
+</BOUCLE_article_head>
+<B_breve_head><BOUCLE_breve_head(BREVES) {id_breve}>
+	<!-- Para Breve -->
+	[<meta name="Description" content="(#TITRE|supprimer_numero|supprimer_tags|attribut_html)" />]
+	<B_keywords_breve><meta name="Keywords" content='<BOUCLE_keywords_breve(MOTS){id_breve}{","}>[(#TITRE|supprimer_numero|supprimer_tags|attribut_html)]</BOUCLE_keywords_breve>' /></B_keywords_breve>
+</BOUCLE_breve_head><BOUCLE_mot_head(MOTS) {id_mot}>
+	<!-- Para Palabra Clave -->
+	[<meta name="Description" content="(#DESCRIPTIF|supprimer_tags|attribut_html)" />]
+	<B_keywords_mot><meta name="Keywords" content='<BOUCLE_keywords_mot(MOTS){id_mot}{","}>[(#TITRE|supprimer_numero|supprimer_tags|attribut_html)]</BOUCLE_keywords_mot>' /></B_keywords_mot>
+</BOUCLE_mot_head><BOUCLE_rubrique_head(RUBRIQUES) {id_rubrique}>
+	<!-- Para una sección -->
+	[<meta name="Description" content="(#DESCRIPTIF|supprimer_tags|attribut_html)" />]
+	<B_keywords_rubrique><meta name="Keywords" content='<BOUCLE_keywords_rubrique(MOTS){id_rubrique}{","}>[(#TITRE|supprimer_numero|supprimer_tags|attribut_html)]</BOUCLE_keywords_rubrique>' /></B_keywords_rubrique>
+</BOUCLE_rubrique_head><BOUCLE_site_head(SITES) {id_syndic}>
+	<!-- para el Sitio -->
+	[<meta name="Description" content="(#DESCRIPTIF|supprimer_tags|attribut_html)" />]
+	<B_keywords_site><meta name='Keywords" content="<BOUCLE_keywords_site(MOTS){id_syndic}{","}>[(#TITRE|supprimer_numero|supprimer_tags|attribut_html)]</BOUCLE_keywords_site>' /></B_keywords_site>
+</BOUCLE_site_head>	
+	<!-- Para la pagina de Resumen -->
+	<meta name="description" content="#NOM_SITE_SPIP" />
+	<B_keywords_vide><meta name="keywords" content='<BOUCLE_keywords_vide(RUBRIQUES){racine}{","}>[(#TITRE|supprimer_numero|supprimer_tags|attribut_html)]</BOUCLE_keywords_vide>' /></B_keywords_vide>
+	<meta name="author" content='<BOUCLE_author_vide(AUTEURS){id_auteur=1}>[(#NOM|supprimer_tags|attribut_html)]</BOUCLE_author_vide>' />
+<//B_site_head><//B_rubrique_head><//B_mot_head><//B_breve_head><//B_article_head>
+	<!-- Para navegadores que permiten agregar sindicacion por RSS -->
+	<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>" href="backend.php3" />
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/../img/icon.gif" />
+	[(#REM) Feuille de style CSS pour l'affichage du site a l'ecran ]
+<link rel="stylesheet" href="[(#CHEMIN{styles/personalizado.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
+<!-- Calculo de los colores Basicos de fondos y letras -->
+	
+
+
+<BOUCLE_fondoportada(ARTICLES) {titre_mot=gama de colores}>
+[<style type='text/css'>
+#cuerpo
+{
+background-image: url("IMG/(#LOGO_ARTICLE|fichier)");
+float:left;
+background-repeat:repeat-y;
+}
+body{ background-color:#[(#LOGO_ARTICLE||couleur_extraire{90,1}|couleur_foncer_si_claire |couleur_eclaircir_si_foncee|couleur_foncer_si_claire |couleur_eclaircir_si_foncee)]}
+#contenido, #contenido a, #contenido a:visited{ color:#[(#LOGO_ARTICLE||couleur_extraire{90,1}|couleur_extreme)]}
+.menuseccionesitem a{ color:#[(#LOGO_ARTICLE||couleur_extraire{90,1}|couleur_inverser|couleur_foncer_si_claire |couleur_eclaircir_si_foncee)]}
+.menuseccionesitem-sub a{ color:#[(#LOGO_ARTICLE||couleur_extraire{90,1}|couleur_inverser|couleur_foncer_si_claire)]}
+.agendain ,#rubriquepirulo, .cortepirulo{background-color:#[(#LOGO_ARTICLE||couleur_extraire{90,1}|couleur_foncer_si_claire |couleur_eclaircir_si_foncee)]}
+</style>]
+</BOUCLE_fondoportada>
+
+<BOUCLE_colorfondo(MOTS) {titre=fondo paginax}{par titre}{" - "}>
+[<style type='text/css'>
+body{ background-color:#(#LOGO_MOT||couleur_extraire)
+}
+</style>]
+</BOUCLE_colorfondo>
+
+
+<BOUCLE_colortextocontenido(MOTS) {titre=texto contenidox}{par titre}{" - "}>
+[<style type='text/css'>
+#contenido, #contenido a, #contenido a:visited{ color:#(#LOGO_MOT||couleur_extraire)
+}
+</style>]
+</BOUCLE_colortextocontenido>
+<BOUCLE_colortitulomenu(MOTS) {titre=titulo menux}{par titre}{" - "}>
+[<style type='text/css'>
+.menuseccionesitem a{ color:#(#LOGO_MOT||couleur_extraire)
+}
+</style>]
+</BOUCLE_colortitulomenu>
+<BOUCLE_colorsubtitulomenu(MOTS) {titre=subtitulo menux}{par titre}{" - "}>
+[<style type='text/css'>
+.menuseccionesitem-sub a{ color:#(#LOGO_MOT||couleur_extraire)
+}
+</style>]
+</BOUCLE_colorsubtitulomenu>
+<BOUCLE_colortitulomenuhover(MOTS) {titre=titulo menu hover}{par titre}{" - "}>
+[<style type='text/css'>
+.menuseccionesitem a:hover,.menuseccionesitem-sub a:hover, .menuseccionesitemon a,.menuseccionesitem-subon a{ color:#(#LOGO_MOT||couleur_extraire)
+}
+</style>]
+</BOUCLE_colortitulomenuhover>
+
+<BOUCLE_colortitulocontenido(MOTS) {titre=titulo contenido}{par titre}{" - "}>
+[<style type='text/css'>
+#contenido h3 a , h3 a:visited{ color:#(#LOGO_MOT||couleur_extraire)
+}
+</style>]
+</BOUCLE_colortitulocontenido>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-instalacion.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-instalacion.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-instalacion.html	(revision 30)
@@ -0,0 +1,36 @@
+<multi>
+
+
+<div id="instalacion" style="text-align:left ">
+<h3>Bienvenido a su Pagina Web<br>con Spip y esqueleto red CTA.</h3>
+<p>Si ves esta informaci&oacute;n es que aun no creaste ningun articulo en tu sitio web, segui las instrucciones para una instalaci&oacute;n correcta utilizando todas las funciones de redCTA (ver la documentacion completa en <a href="http://www.redcta.org.ar/SPIP:Instalaci%C3%B3n:CargaInicialEsqueletoCTA">redcta</a>) </p>
+<ul class="spip">
+		<li class="spip">
+			Para crear  la informaci&oacute;n de <i class="spip">Contact</i>o del sitio, cree un nuevo autor con: <a href="ecrire/?exec=auteur_infos&new=oui" class="spip_out">Su nombre o el nombre de su organizacion</a>
+		</li>
+		<li class="spip">
+			Para crear un nuevo autor, vaya a : <a href="ecrire/?exec=auteurs" class="spip_out">Autores </a>
+		</li>
+		<li class="spip">
+			Para crear Contenidos:
+			  <ol class="spip">
+				<li class="spip">
+					crear uno o m&aacute;s <a href="ecrire/?exec=rubriques_edit&amp;new=oui" class="spip_out">secciones </a>,
+				</li>
+				<li class="spip">
+					dentro de una secci&oacute;n, crear un <a href="ecrire/?exec=articles_edit&amp;new=oui" class="spip_out">articulo</a>, guarda y publicarlo.
+				</li>
+			</ol>
+		</li>
+		<li class="spip">
+			Para quitar o modificar este mensaje que siempre aparece arriba de la pagina prinicpal, vaya a <a href="ecrire/?exec=configuration" class="spip_out">Configuracion </a> y edite el nombre y la descripcion del Sitio.
+		</li>
+		<li class="spip">Para una ayuda general sobre este sistema de Contenidos , vaya a <a href="ecrire/?exec=aide_index&var_lang=es" class="spip_out">Ayuda</a>.
+		</li>
+		<li class="spip"> M&aacute;s	informacion	disponible en	<a href="http://www.spip.net/es" class="spip_url spip_out">www.spip.net/es</a>.
+		</li>
+	</ul>
+</div>
+
+
+</multi>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-menu-principal.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-menu-principal.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-menu-principal.html	(revision 30)
@@ -0,0 +1,74 @@
+[(#REM)
+	Barre de navigation, ouverte sur la hierarchie courante
+
+	On fait un plan, et, quand on avance vers une rubrique,
+	on l'affiche si son parent est expose ou est la racine du site. ]
+
+
+
+
+<div class="menu" id="menusecciones">
+  <div class="menuseccionesarriba"></div>	
+
+	<ul class="titulo">
+    	<li class="titulo">
+			<div class='menuseccionesitem'>
+				<a href="#URL_SITE_SPIP">Principal</a>
+			</div>
+         </li>
+<B_rubriques>
+	<BOUCLE_rubriques(RUBRIQUES) {racine}{titre_mot=menu principal} {par num titre, titre}>
+		<li class="titulo">
+			<div class='menuseccionesitem#EXPOSE'>
+			<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+			</div>
+			<B_articulosmenu>
+			<ul>
+			<BOUCLE_articulosmenu(ARTICLES) {id_rubrique} {titre_mot=menu principal} {par num titre}{doublons}>
+				<li>
+					</li>
+						<div class="menuseccionesitem-sub#EXPOSE">
+							<a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+						</div>
+					</li>	
+				</BOUCLE_articulosmenu>	
+				</ul>
+				</B_articulosmenu>
+			<B_sous_rubriques>
+			<ul>
+				
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<li>
+						<div class='menuseccionesitem-sub#EXPOSE'>
+						<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+						</div>
+						<BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
+					</li>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			</ul>
+			</B_sous_rubriques>
+
+		</li>
+	</BOUCLE_rubriques>
+			<B_articulosmenusueltos>
+			<ul>
+			<BOUCLE_articulosmenusueltos(ARTICLES) {titre_mot=menu principal} {par num titre}{doublons}>
+				<li>
+					</li>
+						<div class="menuseccionesitem">
+							<a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
+						</div>
+					</li>	
+				</BOUCLE_articulosmenusueltos>	
+				</ul>
+				</B_articulosmenusueltos>
+
+	</ul>
+
+<div class="menuseccionesabajo"></div>	
+
+</B_rubriques>
+	</div><!-- menusecciones -->
+<INCLURE{fond=inc/inc-menu-secundario}{lang}>	
+<INCLURE{fond=inc/inc-sindicacion}{lang}>	
+	
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-menu-secundario.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-menu-secundario.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-menu-secundario.html	(revision 30)
@@ -0,0 +1,55 @@
+[(#REM)
+	Barre de navigation, ouverte sur la hierarchie courante
+
+	On fait un plan, et, quand on avance vers une rubrique,
+	on l'affiche si son parent est expose ou est la racine du site. ]
+
+
+
+<B_rubriques>
+<div class="menu" id="menusecciones">
+  <div class="menuseccionesarriba"></div>	
+	
+	<BOUCLE_rubriques(RUBRIQUES) {racine}{titre_mot=menu secundario} {tout}{par num titre, titre}>
+		<ul class="titulo">
+			<li class="titulo">
+				<div class='menuseccionesitem#EXPOSE'>
+			
+				[(#LOGO_RUBRIQUE|center|#URL_RUBRIQUE|reduire_image{110,0}|sinon{[<a href="#URL_RUBRIQUE" >(#TITRE|supprimer_numero)</a>]})]
+			</div>
+			<BOUCLE_mot(MOTS){type=#TITRE} {par num titre, titre}>
+				<B_art>
+				<ul>
+				 <BOUCLE_art(ARTICLES){id_mot}>
+				 <div class="menuseccionesitem-sub#EXPOSE">
+				 [<li><a href="#URL_MOT" >(#_mot:TITRE|unique)</a></li>]
+				 </div>
+ 				</BOUCLE_art>
+				</ul>
+				 </B_art>
+ 			</BOUCLE_mot>
+			</li>
+			<B_sous_rubriques>
+			
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<ul>
+						<div>
+							[(#LOGO_RUBRIQUE|center|#URL_RUBRIQUE|reduire_image{110,0}|sinon{[<a href="#URL_RUBRIQUE" ><div class="tituloaviso">(#TITRE|supprimer_numero)</div></a>]})]
+						</div>
+						<BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
+					</ul>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			
+			</B_sous_rubriques>
+
+		</ul>
+	</BOUCLE_rubriques>
+	
+</div><!-- menusecciones -->
+</B_rubriques>
+
+
+
+
+
+
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-mot-default.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-mot-default.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-mot-default.html	(revision 30)
@@ -0,0 +1,29 @@
+<B_art_mot2>
+					#ANCRE_PAGINATION
+					<BOUCLE_art_mot2(ARTICLES){id_mot} {par date}{inverse}{pagination 10}>
+   						
+						<BOUCLE_provinciast2(MOTS) {id_article}{type=#_rubrique:TITRE}> 
+	<b><div class="titre-texte"><small>[<a style="color:#993333" href="#URL_MOT">(#TITRE)</a> ]</small></div></b>
+	</BOUCLE_provinciast2> 	
+	<table><tr><td>
+			<B_foto1>
+										<BOUCLE_foto1(DOCUMENTS){id_article}{extension==jpg|png|gif}{par hasard}{0,1}>
+											[(#LOGO_DOCUMENT|left||image_reduire{110,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,4}|inserer_attribut{style,border:1px solid #000000})]
+     
+										</BOUCLE_foto1> 
+										</B_foto1> 
+										[(#LOGO_ARTICLE|left|#URL_ARTICLE|reduire_image{140,0}|inserer_attribut{hspace,5})]
+										<//B_foto1>
+			[(#LOGO_ARTICLE|right||reduire_image{80,0}|inserer_attribut{hspace,5})]<a href="#URL_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong><br />
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+					<small>[(#DATE|nom_jour) ][(#DATE|affdate)]</small>
+				</BOUCLE_sivafecha>
+				<BOUCLE_sivaautor(MOTS){id_rubrique}{titre=con autor}>
+					<small>[, <:par_auteur:> (#LESAUTEURS)]</small>
+				</BOUCLE_sivaautor>
+				[<br />(#CHAPO)]</a>
+			</td></tr></table>
+					</BOUCLE_art_mot2>
+					
+      [<p class="pagination">(#PAGINATION)</p>]
+				</B_art_mot2>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-mot-fotogaleria.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-mot-fotogaleria.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-mot-fotogaleria.html	(revision 30)
@@ -0,0 +1,25 @@
+<div id="fotogaleria">
+	<table width="100%" align="center" bgcolor="#ECEAEB" id="tablagaleria">
+	  <tr><td>
+	
+	
+    <B_article_langue1>
+	<h3 style="margin-bottom:1px; margin-top:2px "><a href="<BOUCLE_linkea(MOTS){titre=Galeria de Fotos}>#URL_MOT</BOUCLE_linkea>">Fotogalería</a></h3>
+	
+  	
+    <BOUCLE_article_langue1(ARTICLES) {lang}{titre_mot=fotogaleria} {par date}{inverse}>
+		<a href="#URL_ARTICLE"><h3>[(#TITRE|supprimer_numero)	]</h3></a>	
+		<BOUCLE_foto1(DOCUMENTS){id_article}{fichier==(png|jpg|gif)$}>
+	  		[<a href="#URL_DOCUMENT" type="#MIME_TYPE" onclick="location.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return false;"[ title="(#_article_langue1:TITRE|supprimer_numero)"]>(#LOGO_DOCUMENT||image_reduire{0,64}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+		</BOUCLE_foto1> 
+		
+    </BOUCLE_article_langue1>
+
+	
+
+    </B_article_langue1>
+    <//B_article_langue1>
+	 
+
+</td></tr></table>
+</div>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-nota-principal.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-nota-principal.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-nota-principal.html	(revision 30)
@@ -0,0 +1,23 @@
+<B_principal>
+<BOUCLE_principal(ARTICLES) {titre_mot=nota principal} {par date} {inverse}{0,1}{doublons}>
+	<div id="nota_principal">
+		<div class="volantadest1">
+			<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+				[(#LOGO_DOCUMENT|right|#URL_ARTICLE|image_reduire{140,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,4}|inserer_attribut{style,border:1px solid #000000})]
+            </BOUCLE_foto>
+			
+		</div>
+		<a href="#URL_ARTICLE">
+			#SURTITRE
+			<h3>#TITRE</h3>
+			<div class="chapodest1">
+				[[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)] - #NOM_SITE_SPIP] #CHAPO
+				<span class="vermas"> &gt; nota completa</span>
+			</div>
+		</a>	
+	</div>
+</BOUCLE_principal>
+
+</B_principal>
+<INCLURE{fond=inc/inc-instalacion}{lang}>
+<//B_principal>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-nota-secundaria.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-nota-secundaria.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-nota-secundaria.html	(revision 30)
@@ -0,0 +1,19 @@
+<BOUCLE_principal(ARTICLES) {titre_mot=nota secundaria} {par date} {inverse}{0,2}{doublons}>
+	<table><tr><td>
+	<div id="nota_secundaria">
+		<div class="volantadest1">
+			<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+
+[(#LOGO_DOCUMENT|right||image_reduire{120,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,4}|inserer_attribut{style,border:1px solid #000000})]
+                           		
+			</BOUCLE_foto>
+			<a href="#URL_ARTICLE">#SURTITRE
+		</div>
+		<h3>#TITRE</h3>
+		<div class="chapodest1">
+				[[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)] - #NOM_SITE_SPIP] #CHAPO
+				<span class="vermas"> &gt; nota completa</span></a>
+		</div>
+	</div>
+	</td></tr></table>
+</BOUCLE_principal>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-notas-destacadas.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-notas-destacadas.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-notas-destacadas.html	(revision 30)
@@ -0,0 +1,13 @@
+<B_articles_por_secciones>
+	<BOUCLE_articles_por_secciones(ARTICLES) {lang?}{titre_mot=nota destacada}{lang} {par id_rubrique}{unique}>
+      	<BOUCLE_nom_rub2 (RUBRIQUES){id_rubrique}>
+			[<div id="rubriquedestacada">[(#LOGO_RUBRIQUE|left|#URL_RUBRIQUE|reduire_image{70}|inserer_attribut{hspace,5}||inserer_attribut{style,border:0px;margin-left:-3px})]<a href="#URL_RUBRIQUE">(#TITRE|supprimer_numero|unique{dest})</a></div>]</BOUCLE_nom_rub2>
+			<div class="spacedestacada"></div>
+			[(#LOGO_ARTICLE|left|#URL_ARTICLE|reduire_image{122}|inserer_attribut{hspace,5})] 
+			[<div class="surtitre">(#SURTITRE)</div>]
+			<h3><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></h3>
+      		[<div class="sous-titre">(#SOUSTITRE)</div>]
+	  		[<div class="texte">(#CHAPO)</div>]
+						
+	</BOUCLE_articles_por_secciones>
+</B_articles_por_secciones><!-- Fin Por las secciones -->
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-piegral.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-piegral.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-piegral.html	(revision 30)
@@ -0,0 +1,54 @@
+<div id="pie">
+		<div id="datos">
+		<BOUCLE_pie(ARTICLES){titre_mot=Datos Pie}>
+			<B_muestradoc1>
+			<BOUCLE_muestradoc1(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        		<div>	
+					#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    			</div><!-- avisossuperior -->
+			</BOUCLE_muestradoc1>
+			</B_muestradoc1>
+			<div>	
+				<!--[(#LOGO_ARTICLE|#URL_SITE|sinon{<a href="#URL_SITE" title="#NOM_SITE">[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{120,0}) ]-->
+				[(#LOGO_ARTICLE|#URL_SPIP|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{780,0}|inserer_attribut{style,border:0}) ]
+			</div><!-- avisossuperior -->
+		<//B_muestradoc1>     
+		</BOUCLE_pie>
+		</div>
+		
+		
+</div><!-- pie -->
+<div id="bas">
+	<a href="#URL_SITE_SPIP" title="<:accueil_site:>"><:accueil_site:></a> | 
+	<B_contact><a href="<BOUCLE_contact(AUTEURS) {tout}{0,1}>#URL_SITE_SPIP/[(#URL_AUTEUR)]</BOUCLE_contact>" title="<:info_contact:>"><:info_contact:></a> | </B_contact>
+	<a href="#URL_PAGE{plan}" title="<:plan_site:>"><:plan_site:></a> | 
+	<a href="#URL_SITE_SPIP/ecrire/" rel="nofollow" title="<:espace_prive:>"><:espace_prive:></a> | 
+	<a href="#URL_PAGE{statistiques}" title="<:titre_statistiques:>"><:icone_statistiques_visites:></a> | 
+	<span style="white-space: nowrap;"><:info_visites:> <INCLURE{fond=inc/inc-affvisit}></span>
+
+	<p>
+		<a href="http://www.spip.net" title="<:site_realise_avec_spip:> #SPIP_VERSION"> <:site_realise_avec_spip:> #SPIP_VERSION</a> + 
+		<a href="http://www.redcta.org.ar/SPIP:esqueletos:redCTA" title="<multi>Squelette redCTA[en] Template redCTA[es]Esqueleto redCTA[pt]Esqueleto redCTA</multi> - 1.9.2.1">redCTA</a>
+	</p>
+	<p>
+		&nbsp;&nbsp;&nbsp;&nbsp;
+		<a href="#URL_PAGE{backend}" rel="nofollow" title="<:bouton_radio_syndication:> [(#LANG|traduire_nom_langue)]">
+	<span style="border-width:1px 0px 1px 1px; border-style: solid; border-color:#FC9 #630 #330 #F96;  padding:0 3px; font:bold 10px verdana,sans-serif; color:#FFF; background:#F60; text-decoration:none; margin:0;">RSS</span><span style="border-width:1px 1px 1px 0px;border-style: solid;border-color:#dcb #330 #330 #F96; padding:0 3px;font:normal 10px verdana,sans-serif;color:#333;background:#FFE8D9;text-decoration:none;margin:0;text-transform:uppercase;"> #LANG</span></a>
+
+<BOUCLE_rubriques_chemin(HIERARCHIE){id_rubrique}{" "}>
+		<a href="#URL_PAGE{backend,id_rubrique=#ID_RUBRIQUE}" rel="nofollow" title="<:syndiquer_rubrique:>">
+	<span style="border-width:1px 0px 1px 1px; border-style: solid; border-color:#FC9 #630 #330 #F96;  padding:0 3px; font:bold 10px verdana,sans-serif; color:#FFF; background:#F60; text-decoration:none; margin:0;">RSS</span><span style="border-width:1px 1px 1px 0px;border-style: solid;border-color:#dcb #330 #330 #F96; padding:0 3px;font:normal 10px verdana,sans-serif;color:#333;background:#FFE8D9;text-decoration:none;margin:0;">[(#TITRE|supprimer_numero|couper{60})]</span></a>
+</BOUCLE_rubriques_chemin>
+
+<BOUCLE_syndic_rub(RUBRIQUES) {id_rubrique}>
+		<a href="#URL_PAGE{backend,id_rubrique=#ID_RUBRIQUE}" rel="nofollow" title="<:syndiquer_rubrique:>">
+	<span style="border-width:1px 0px 1px 1px; border-style: solid; border-color:#FC9 #630 #330 #F96;  padding:0 3px; font:bold 10px verdana,sans-serif; color:#FFF; background:#F60; text-decoration:none; margin:0;">RSS</span><span style="border-width:1px 1px 1px 0px;border-style: solid;border-color:#dcb #330 #330 #F96; padding:0 3px;font:normal 10px verdana,sans-serif;color:#333;background:#FFE8D9;text-decoration:none;margin:0;">[(#TITRE|supprimer_numero|couper{60})]</span></a>
+</BOUCLE_syndic_rub>
+	<big>&nbsp;
+		<b><a href="http://#LANG.wikipedia.org/wiki/Really_Simple_Syndication">?</a></b>
+	</big>
+	</p>
+
+
+
+</div>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-sindicacion.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-sindicacion.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-sindicacion.html	(revision 30)
@@ -0,0 +1,30 @@
+#CACHE{0}
+<h1 id="estructura"><multi>[fr]Membres [en]Members</multi></h1>
+	<B_syndic>
+		<div class="agendain">
+        	<!--<ul class="titre">
+          		<li>-->
+          			
+          			<!--<ul>-->
+            			<BOUCLE_syndic(SITES) {tout}>
+            				<!--<li>-->
+              					<div>
+									
+									<a href="#URL_SITE" target="_blank" title="[Noticias de (#NOM_SITE|supprimer_numero)]">[(#LOGO_SITE|center||reduire_image{100,0})]</a>
+									</div>
+								<!--<ul class='menu-hierarchie'>-->
+									<BOUCLE_sindic_art(SYNDIC_ARTICLES){id_syndic}{0,10}{par date}{inverse}>
+										<div class="agendaevent">
+										[(#DATE|affdate{'Y-m-d'})[ (#DATE|affdate{'H:m'})]<br>]
+											<a href="#URL_ARTICLE" target="_blank" [(#EXPOSER| class='current',)][title="(#DESCRIPTIF|textebrut)"]>[(#TITRE|supprimer_numero)]</a><br>
+											
+										</div>	
+									</BOUCLE_sindic_art>
+								<!--</ul>
+            				</li>-->
+            			</BOUCLE_syndic>
+          			<!--</ul>
+          		</li>
+        	</ul>-->
+		</div>
+    </B_syndic>	
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-titulares.htm
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-titulares.htm	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-titulares.htm	(revision 30)
@@ -0,0 +1,17 @@
+			
+			<BOUCLE_articles_por_secciones10(ARTICLES){titre_mot=destacada lateral}{lang} {par id_rubrique}{doublons laterales}>
+			</BOUCLE_articles_por_secciones10>
+			<BOUCLE_secciones_ultimas(RUBRIQUES) {titre_mot=ultimas noticias}>
+		<BOUCLE_ultimas(ARTICLES) {id_rubrique} {par date} {inverse}{0,6}{doublons portada}{doublons laterales}>
+			<div id="bloquenoti">
+				<BOUCLE_foto_ultimas(DOCUMENTS){id_article}{mode=image}{0,1}>
+					<img src="#URL_DOCUMENT" alt="#TITRE" width="25%" align="right" border="1" hspace="3" vspace="2">
+				</BOUCLE_foto_ultimas>				
+				<a href="#URL_ARTICLE">
+					<div class="sous-titre">#SURTITRE</div>
+					<h3>#TITRE</h3>
+					[[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)] ] #CHAPO<span class="mas"> (+)</span><hr />
+				</a>
+			</div>
+		</BOUCLE_ultimas>
+	</BOUCLE_secciones_ultimas>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-titulares.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-titulares.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/inc/inc-titulares.html	(revision 30)
@@ -0,0 +1,16 @@
+<B_ultimas>
+	<ul>
+	<BOUCLE_ultimas(ARTICLES){titre_mot=titulares} {par date} {inverse}{0,6}>
+			<div id="titulares">
+						
+				<li><a href="#URL_ARTICLE">
+					
+					#TITRE
+					[<span class="fechatitulares">[(#DATE|journum)]/[(#DATE|mois)]/[(#DATE|annee)]</span> ] #CHAPO<span class="mas"> (+)</span>
+					
+				</a>
+				</li>
+			</div>
+	</BOUCLE_ultimas>
+	</ul>
+</B_ultimas>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/mes_fonctions.php
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/mes_fonctions.php	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/mes_fonctions.php	(revision 30)
@@ -0,0 +1,170 @@
+<?php
+
+/*
+ *   +----------------------------------+
+ *    Nom de la balise : Afficher version SPIP                                              
+ *   +----------------------------------+
+ *    Fonctions de cette balise :
+ *      Afficher le numero de version de SPIP.
+ *
+ *    Utilisation 
+ *      Inserer #VERSION_SPIP dans votre squelette
+ *   +-------------------------------------+ 
+ *   REMARQUE
+ *  	#SPIP_VERSION = $spip_version_affichee = 1.9.1
+ *		#CONFIG{version_installee} = $version_installee = 1.916
+*/
+
+function balise_SPIP_VERSION($p) {
+	global $spip_version_affichee;
+	$p->code = "'$spip_version_affichee'";
+	$p->interdire_scripts = false;
+	return $p;
+}
+
+
+
+/*
+ *   +----------------------------------+
+ *    Nom du Filtre : Sommaire de l'article                                               
+ *   +----------------------------------+
+ *    Date : Vendredi 6 juin 2003
+ *    Auteur :  Noplay (noplay@altern.org) 
+ *              Aurélien PIERARD : aurelien.pierard@sig.premier-ministre.gouv.fr                                     
+ *   +-------------------------------------+
+ *    Fonctions de ce filtre :
+ *      Cette modification permet d'afficher le sommaire de l'article 
+ *      généré dynamiquement à partir des intertitres du texte de l'article. 
+ *		Vous pouvez naviguer dans l'article en cliquant sur les intitres 
+ *      du sommaire de l'article. 
+ *
+ *      Tout ce qui ce trouve entre {{{ et }}} est considéré comme un titre 
+ *      à ajouter au sommaire de l'article.
+ *   +-------------------------------------+ 
+ *  
+ * 		Pour toute suggestion, remarque, proposition d'ajout
+ * 		reportez-vous au forum de l'article :
+ * 		http://spip_contrib.net/article.php3?id_article=76
+*/
+//SOMMAIRE
+function sommaire_article($texte)
+{
+		$artsuite = 0;
+        $page = split('-----', $texte);
+        $uri_art = generer_url_article($GLOBALS['id_article']);
+        $uri_art .= strpos($uri_art, '?') ? '&' : '?';
+
+	$i=0;
+	$texte="";
+	while($page[$i]){
+		// On ajoute une ancre aux intertitres "{{{ }}}" que l'on utilise pour créer le sommaire
+		preg_match_all("|\{\{\{(.*)\}\}\}|U",$page[$i], $regs);
+	 	$nb=1;
+		for($j=0;$j<count($regs[1]);$j++){
+			$p=$i+1;
+	    	$texte=$texte."<li><a href=\"". $uri_art . "artsuite=" .$i. "#sommaire_".$nb."\" title=\"".$regs[1][$j]."\">".$regs[1][$j]."</a>,&nbsp;p$p</li>\n";
+			$nb++;
+	    }
+		$i++;
+	}
+		if (empty($texte)) $texte="";
+		else $texte="<ul>\n".$texte."</ul>\n";
+		return $texte;
+}
+// Fin du filtre sommaire
+
+/*
+ *   +----------------------------------+
+ *    Nom du Filtre : decouper_en_page                                               
+ *   +----------------------------------+
+ *    Date : Vendredi 6 juin 2003
+ *    Auteur :  "gpl"  : gpl@macplus.org  
+ *              Aurélien PIERARD : aurelien.pierard@sig.premier-ministre.gouv.fr
+ *   +-------------------------------------+
+ *    Fonctions de ce filtre :
+ *		Il sert a présenter un article sur plusieurs pages  
+ *   +-------------------------------------+ 
+ *  
+ * Pour toute suggestion, remarque, proposition d'ajout
+ * reportez-vous au forum de l'article :
+ * http://www.uzine.net/spip_contrib/article.php3?id_article=62
+*/
+
+
+function decouper_en_page($texte,$id_article) {
+        global $artsuite, $var_recherche, $num_pages;
+		
+        if (empty($artsuite)) $artsuite = 0;
+	
+		// on divise la page (séparateur : "-----")        
+        $page = split('-----', $texte);
+        // Nombre total de pages
+        $num_pages = count($page);
+
+        // Si une seule page ou numéro illégal, alors retourner tout le texte.
+        // Cas spécial : si var_recherche positionné, tout renvoyer pour permettre à la surbrillance de fonctionner correctement.
+        if ($num_pages == 1 || !empty($var_recherche) || $artsuite < 0 || $artsuite > $num_pages) {
+			// On place les ancres sur les intertitres
+			$texte = preg_replace("|\{\{\{(.*)\}\}\}|U","<a id=\"sommaire_#NB_TITRE_DE_MON_ARTICLE#\"></a>$0", $texte);
+			$array = explode("#NB_TITRE_DE_MON_ARTICLE#" , $texte);
+			$res =count($array);
+			$i =1;
+			$texte=$array[0];
+			while($i<$res){
+				$texte=$texte.$i.$array[$i];
+				$i++;
+			}
+			return $texte;
+        } 
+
+        $p_prec = $artsuite - 1;
+        $p_suiv = $artsuite + 1;
+        $uri_art = generer_url_article($id_article);
+        $uri_art .= strpos($uri_art, '?') ? '&' : '?';
+
+		// On place les ancres sur les intertitres
+		$page[$artsuite] = preg_replace("|\{\{\{(.*)\}\}\}|U","<a id=\"sommaire_#NB_TITRE_DE_MON_ARTICLE#\"></a>$0", $page[$artsuite]);
+		$array = explode("#NB_TITRE_DE_MON_ARTICLE#" , $page[$artsuite]);
+		$res =count($array);
+		$i =1;
+		$page[$artsuite]=$array[0];
+		while($i<$res){
+			$page[$artsuite]=$page[$artsuite].$i.$array[$i];
+			$i++;
+		}
+		// Pagination
+	    switch (TRUE) {
+			case ($artsuite == 0):
+				$precedent = "";
+				$suivant = "<a href='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</a>";
+				break;
+			case ($artsuite == ($num_pages-1)):
+				$precedent = "<a href='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</a>";
+				$suivant = "";
+				break;
+			default:
+				$precedent = "<a href='" . $uri_art . "artsuite=" . $p_prec . "'>&lt;&lt;</a>";
+				$suivant = "<a href='" . $uri_art . "artsuite=" . $p_suiv . "'>&gt;&gt;</a>";
+				break;
+        }
+    
+        for ($i = 0; $i < $num_pages; $i++) {
+			$j = $i;
+			if ($i == $artsuite) {
+				$milieu .= " <strong>" . ++$j . "</strong> ";
+            } 
+			else {
+				$milieu .= " <a href='" . $uri_art . "artsuite=$i'>" . ++$j . "</a> ";
+			}
+        }
+
+        // Ici, on peut personnaliser la présentation
+        $resultat .= $page[$artsuite];
+        $resultat .= "<div class='pagination' style='text-align:center'>pages : $precedent $milieu $suivant</div>";
+        return $resultat;
+}
+// FIN du Filtre decouper_en_page
+
+
+
+?>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/mot.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/mot.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/mot.html	(revision 30)
@@ -0,0 +1,98 @@
+<BOUCLE_mot_principal(MOTS) {id_mot} {doublons}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+   	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>	
+
+
+	<div id="cuerpo">
+	  <div id="estructura"></div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		<INCLURE{fond=inc/inc-menu-principal}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+							
+
+			</div><!-- avisoprincipal -->
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+
+				<table border="0" cellspacing="0" cellpadding="0">
+  <tr>
+    <td id="texte-article">
+		[<h2>(#TITRE|supprimer_numero)</h2>]
+		[<div id="boite-logo-rubrique"> 
+		(#LOGO_MOT||reduire_image{142})
+		</div>] [<div class="texte">(#DESCRIPTIF)</div>] 
+		[<div class="texte">(#TEXTE)</div>]
+		
+	    </td>
+    </tr>
+  [<tr>
+    <td>
+	    <div class="notes">(#NOTES)</div>
+	    </td>
+  </tr>]
+	
+	<tr>
+    <td>
+	<!-- Documents liés -->
+	<div id="documents_boite">
+		<B_esqueleto_mot>
+			<BOUCLE_esqueleto_mot(MOTS){type=Esqueleto mot}{titre_mot=#TITRE}>
+				<INCLURE{fond=inc/inc-mot-#TITRE}{id_mot}{lang}>	
+			</BOUCLE_esqueleto_mot>
+		</B_esqueleto_mot>
+			<INCLURE{fond=inc/inc-mot-default}{id_mot}{lang}>
+		<//B_esqueleto_mot>		
+		
+			
+	</div>
+
+</td>
+    </tr>
+	
+</table>
+
+	<div id="boite-srubrique-rubrique">
+    
+    <!-- Les sous-rubriques -->
+    <!--<h3><:sousrubrique_recitfp:></h3>-->
+   
+
+	</div>
+	
+			</div><!-- bloquearriba -->
+			<div id="bloquemedio">
+				
+				
+
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div></div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			  <INCLURE{fond=inc/inc-avisos}{lang}>
+			
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+    <INCLURE{fond=inc/inc-piegral}{lang}> 
+	
+	
+</div><!-- pagina -->
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]	
+</body>
+</html>
+</BOUCLE_mot_principal>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/mot_groupe.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/mot_groupe.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/mot_groupe.html	(revision 30)
@@ -0,0 +1,148 @@
+<BOUCLE_mot_principal(GROUPES_MOTS){id_groupe} {doublons}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+   	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>	
+
+	<div id="cuerpo"><div id="estructura">Cuerpo</div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		
+		
+  		<INCLURE{fond=inc/inc-menu-principal}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+			</div><!-- avisoprincipal -->
+			[(#REM) Fil d'Ariane ]
+	<div id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(GROUPES_MOTS){id_groupe}>[ &gt; Categor&iacute;a &gt; (#TITRE|supprimer_numero|couper{80})]</BOUCLE_ariane>[ &gt; (#TITRE|supprimer_numero|couper{80})]</div>
+			<div id="bloquearriba">
+<table border="0" cellspacing="0" cellpadding="0">
+  <tr>
+    <td id="texte-article">
+		[<h2>(#LOGO_MOT|left||sinon{#TITRE|supprimer_numero})</h2>]
+
+		[#DESCRIPTIF
+	    <div class="texte">(#TEXTE)</div>]
+	    </td>
+    </tr>
+  [<tr>
+    <td>
+	    <div class="notes">(#NOTES)</div>
+	    </td>
+  </tr>]
+</table>
+			</div><!-- bloquearriba -->
+			<div id="bloquemedio">
+	
+				<BOUCLE_palabras(MOTS){id_groupe}{par titre}{doublons}>
+					<?php $articulos="0"; $breves="0"; $sitios="0"; $secciones="0"; ?>
+						<div class="margen_abajo_6">
+							<h2><a href="#URL_MOT">#TITRE</a></h2>
+							<!-- Rubriques liees au mot-cle -->
+							<B_rubriques>
+								<div class="modulo_titulo">
+									SECCIONES RELACIONADAS:&nbsp;
+									<?php $secciones='[(#TOTAL_BOUCLE)]'; ?>
+									<BOUCLE_rubriques(RUBRIQUES) {id_mot} {par titre}{" / "}>
+										<a href="#URL_RUBRIQUE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a>
+									</BOUCLE_rubriques>
+								</div>
+							</B_rubriques>
+							<!-- Articulos liees au mot-cle -->
+							<B_articles>
+								<?php $articulos='[(#TOTAL_BOUCLE)]'; ?>
+								<BOUCLE_articles(ARTICLES) {id_mot} {par titre}>
+									<div class="fuente_80"><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>&raquo; #TITRE</a></div>
+									<div class="fecha margen_izquierdo_11">
+										[(#DATE|nom_jour)] [(#DATE|affdate)]
+										<B_auteurs><:par_auteur:> <BOUCLE_auteurs(AUTEURS) {id_article} {", "}><a href="#URL_AUTEUR">#NOM</a></BOUCLE_auteurs></B_auteurs>
+									</div>
+								</BOUCLE_articles>
+							</B_articles>
+							<!-- Breves liees au mot-cle -->
+							<B_breves>
+								<div class="grupo_palabras_breves">
+									BREVES:
+									<?php $breves='[(#TOTAL_BOUCLE)]'; ?>
+									<BOUCLE_breves(BREVES) {id_mot} {par titre}>
+										<div><a href="#URL_BREVE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>&raquo; #TITRE</a></div>
+									</BOUCLE_breves>
+								</div>
+							</B_breves>
+							<!-- Sites Web lies au mot-cle -->
+							<B_sites>
+								<div class="grupo_palabras_breves">
+									ENLACES:
+									<?php $sitios='[(#TOTAL_BOUCLE)]'; ?>
+									<BOUCLE_sites(SITES) {id_mot} {par nom_site}>
+										<div><a href="#URL_SITE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>&raquo; #TITRE</a></div>
+									</BOUCLE_sites>
+								</div>
+							</B_sites>
+
+						<?php
+							if ($articulos+$breves+$sitios+$secciones<1){
+								echo '<div class="fecha">Por ahora no hay contenidos</div>';
+								}
+						?>
+					</div>
+				</BOUCLE_palabras>
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div>
+			<hr />
+			
+					<hr color="#999999" noshade size="1">
+<BOUCLE_palabras1(MOTS){id_groupe}{par titre}>
+				<B_art_mot2>
+					#ANCRE_PAGINATION
+					<BOUCLE_art_mot2(ARTICLES){id_mot} {par date}{inverse}{pagination 10}>
+   						
+						<BOUCLE_provinciast2(MOTS) {id_article}{id_mot}> 
+	<b><div class="titre-texte">[<a style="color:#993333" href="#URL_MOT">(#TITRE|unique)</a> ]</div></b>
+	</BOUCLE_provinciast2> 	
+	<table><tr><td>
+			<B_foto1>
+										<BOUCLE_foto1(DOCUMENTS){id_article}{extension==jpg|png|gif}{par hasard}{0,1}>
+											[(#LOGO_DOCUMENT|left||image_reduire{110,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,4}|inserer_attribut{style,border:1px solid #000000})]
+     
+										</BOUCLE_foto1> 
+										</B_foto1> 
+										[(#LOGO_ARTICLE|left|#URL_ARTICLE|reduire_image{140,0}|inserer_attribut{hspace,5})]
+										<//B_foto1>
+			[(#LOGO_ARTICLE|right||reduire_image{80,0}|inserer_attribut{hspace,5})]<a href="#URL_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong><br />
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+					<small>[(#DATE|nom_jour) ][(#DATE|affdate)]</small>
+				</BOUCLE_sivafecha>
+				<BOUCLE_sivaautor(MOTS){id_rubrique}{titre=con autor}>
+					<small>[, <:par_auteur:> (#LESAUTEURS)]</small>
+				</BOUCLE_sivaautor>
+				[<br />(#CHAPO)]</a>
+			</td></tr></table>
+					</BOUCLE_art_mot2>
+					
+      [<p class="pagination">(#PAGINATION)</p>]
+				</B_art_mot2>
+</BOUCLE_palabras1>
+			</div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+						 	<INCLURE{fond=inc/inc-avisos}{lang}>
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}> 
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
+</BOUCLE_mot_principal>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/mot_grupo.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/mot_grupo.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/mot_grupo.html	(revision 30)
@@ -0,0 +1,196 @@
+#CACHE{86400}
+<!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>[(#TITRE|textebrut|supprimer_numero) - ][(#NOM_SITE_SPIP|textebrut)]</title>
+	[<meta name="description" content="(#DESCRIPTIF|couper{150}|textebrut)" />]
+	<INCLURE{fond=inc/inc-head}>
+
+	[(#REM) Lien vers le flux RSS du mot cle ]
+	<link rel="alternate" type="application/rss+xml" title="[(#TITRE|textebrut|texte_backend)]" href="[(#URL_PAGE{backend}|parametre_url{id_mot,#ID_MOT})]" />
+</head>
+
+<body>
+<BOUCLE_mot_principal(GROUPES_MOTS){id_groupe} {doublons}>
+
+<!-- Todo el contenido -->
+<div id="pagina">
+
+<INCLURE{fond=inc/inc-cabeza}>
+
+<!-- Bloque central -->
+<div id="cuerpo">
+
+<!-- Lado derecho -->
+	<div id="col_derecha">
+	
+	<INCLURE{fond=inc/inc-menu-principal}>
+			
+	
+	[(#REM) Fil d'Ariane ]
+	<div class="fecha">Estás aquí: <a href="#URL_SITE_SPIP/">Portada</a><BOUCLE_ariane(GROUPES_MOTS){id_groupe}>[ &gt; Categor&iacute;a &gt; (#TITRE|supprimer_numero|couper{80})]</BOUCLE_ariane></div>
+	
+				<div class="separacion_top"></div>
+<div id="zona_central">
+	<div class="articulo">
+[(#LOGO_MOT|left)]
+<div class="articulo_titulo"><span class="gris">Categor&iacute;a: </span>#TITRE</div>
+<div class="articulo_barra"></div>
+
+<BOUCLE_palabras(MOTS){id_groupe}{par titre}{doublons}>
+
+<?php $articulos="0"; $breves="0"; $sitios="0"; $secciones="0"; ?>
+
+<div class="margen_abajo_6">
+<div class="grupo_palabras_titulo"><a href="#URL_MOT">#TITRE</a></div>
+
+<!-- Rubriques liees au mot-cle -->
+<B_rubriques>
+	<div class="modulo_titulo">
+	SECCIONES RELACIONADAS:&nbsp;
+<?php $secciones='[(#TOTAL_BOUCLE)]'; ?>
+<BOUCLE_rubriques(RUBRIQUES) {id_mot} {par titre}{" / "}>
+	<a href="#URL_RUBRIQUE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a>
+</BOUCLE_rubriques>
+</div>
+</B_rubriques>
+
+<!-- Articulos liees au mot-cle -->
+<B_articles>
+<?php $articulos='[(#TOTAL_BOUCLE)]'; ?>
+<BOUCLE_articles(ARTICLES) {id_mot} {par titre}>
+	<div class="fuente_80"><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>&raquo; #TITRE</a></div>
+	<div class="fecha margen_izquierdo_11">
+	[(#DATE|nom_jour)] [(#DATE|affdate)]
+	<B_auteurs><:par_auteur:> <BOUCLE_auteurs(AUTEURS) {id_article} {", "}><a href="#URL_AUTEUR">#NOM</a></BOUCLE_auteurs></B_auteurs>
+	</div>
+</BOUCLE_articles>
+</B_articles>
+
+	<!-- Breves liees au mot-cle -->
+<B_breves>
+<div class="grupo_palabras_breves">
+BREVES:
+<?php $breves='[(#TOTAL_BOUCLE)]'; ?>
+<BOUCLE_breves(BREVES) {id_mot} {par titre}>
+	<div><a href="#URL_BREVE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>&raquo; #TITRE</a></div>
+</BOUCLE_breves>
+</div>
+</B_breves>
+
+	<!-- Sites Web lies au mot-cle -->
+<B_sites>
+<div class="grupo_palabras_breves">
+	ENLACES:
+<?php $sitios='[(#TOTAL_BOUCLE)]'; ?>
+<BOUCLE_sites(SITES) {id_mot} {par nom_site}>
+	<div><a href="#URL_SITE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>&raquo; #TITRE</a></div>
+</BOUCLE_sites>
+</div>
+</B_sites>
+
+<?php
+if ($articulos+$breves+$sitios+$secciones<1){
+echo '<div class="fecha">Por ahora no hay contenidos</div>';
+}
+?>
+</div>
+
+</BOUCLE_palabras>
+
+
+<div class="limpiar"></div>
+
+	[(#REM) Pied de page ]
+	<INCLURE{fond=inc/inc-pied}{skel=#SQUELETTE}>
+	
+	</div><!-- fin cuerpo articulo -->
+</div><!-- fin zona central -->
+	
+	</div><!-- fin col_derecha -->
+
+	<div id="col_1">	
+	
+	<INCLURE{fond=inc/inc-logo-sitio}>
+	
+		<INCLURE{fond=inc/inc-rubriques}>
+		
+		<!-- Menu de navigation mots-cles : les autres mots cles du meme groupe-->
+
+<B_mots_freres>
+<div class="modulo_titulo">Otros temas relacionados</div>
+<div class="modulo_contenido">
+<BOUCLE_mots_freres(MOTS) {type} {type!=Maquetación}{par titre}{doublons}>
+<?php $total_palabras_art="0"; $total_rubriques_art="0"; $total_breves_art="0"; $total_sites_art="0"; ?>
+<BOUCLE_articulos_clave(ARTICLES){id_mot}{statut=publie}>
+<?php $total_palabras_art='[(#TOTAL_BOUCLE)]'; ?>
+</BOUCLE_articulos_clave>
+<BOUCLE_rubriques_clave(RUBRIQUES){id_mot}>
+<?php $total_rubriques_art='[(#TOTAL_BOUCLE)]'; ?>
+</BOUCLE_rubriques_clave>
+<BOUCLE_breves_clave(BREVES){id_mot}>
+<?php $total_breves_art='[(#TOTAL_BOUCLE)]'; ?>
+</BOUCLE_breves_clave>
+<BOUCLE_sites_clave(SITES){id_mot}>
+<?php $total_sites_art='[(#TOTAL_BOUCLE)]'; ?>
+</BOUCLE_sites_clave>
+
+<?php
+$total_palabras=$total_sites_art+$total_palabras_art+$total_rubriques_art+$total_breves_art;
+?>
+<div class="gris en_linea"><a [(#EXPOSE{name,href})]="#URL_MOT" title="[(#DESCRIPTIF|textebrut|entites_html)]">&rsaquo; #TITRE</a> [<?php echo $total_palabras; ?>]</div>
+
+</BOUCLE_mots_freres>
+</div>
+</B_mots_freres>
+
+
+<!-- Menu de navigation mots-cles : les autres groupes avec un lien sur le premier mot du groupe -->
+
+
+<B_groupes_freres>
+<div class="modulo_titulo">Otras categorías</div>
+<div class="modulo_contenido">
+<BOUCLE_groupes_freres(GROUPES_MOTS){!id_groupe}{par titre}>
+<BOUCLE_mot_cousin(MOTS) {id_groupe} {type!=Maquetación}{par titre}{0,1}>
+
+<?php $total_palabras_art2="0"; $total_rubriques_art2="0"; $total_breves_art2="0"; $total_sites_art2="0"; ?>
+
+<BOUCLE_articulos_clave2(ARTICLES){id_mot}>
+<?php $total_palabras_art2='[(#TOTAL_BOUCLE)]'; ?>
+</BOUCLE_articulos_clave2>
+<BOUCLE_rubriques_clave2(RUBRIQUES){id_mot}>
+<?php $total_rubriques_art2='[(#TOTAL_BOUCLE)]'; ?>
+</BOUCLE_rubriques_clave2>
+<BOUCLE_breves_clave2(BREVES){id_mot}>
+<?php $total_breves_art2='[(#TOTAL_BOUCLE)]'; ?>
+</BOUCLE_breves_clave2>
+<BOUCLE_sites_clave2(SITES){id_mot}>
+<?php $total_sites_art2='[(#TOTAL_BOUCLE)]'; ?>
+</BOUCLE_sites_clave2>
+
+<?php
+$total_palabras2=$total_sites_art2+$total_palabras_art2+$total_rubriques_art2+$total_breves_art2;
+if ($total_palabras2>0){
+echo '<div class="gris_claro block"><a href="#URL_PAGE{mot_grupo}&id_groupe=#ID_GROUPE">> #TYPE</a></div>';
+}
+?>
+
+</BOUCLE_mot_cousin>
+</BOUCLE_groupes_freres>
+</div>
+</B_groupes_freres>
+
+	</div><!-- fin col_1 -->
+	
+		</div><!-- fin cuerpo -->
+
+
+</div><!-- fin page -->
+
+
+
+</BOUCLE_mot_principal>
+
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/plan.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/plan.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/plan.html	(revision 30)
@@ -0,0 +1,113 @@
+#CACHE{0}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title>[(#NOM_SITE_SPIP)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+	
+	<div id="cuerpo"><div id="estructura">cuerpo</div>
+		<div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+			<INCLURE{fond=inc/inc-menu-principal}{lang}>	
+		</div><!-- columnaizquierda -->
+		<div id="contenido" class="contenidoin"><div id="estructura">contenido</div>
+			<div class="contenidoin">
+			<div class="cartouche">
+				<h1 class="titre"><:plan_site:></h1>
+			</div>
+				<BOUCLE_sectoresocultos(RUBRIQUES){titre_mot=seccion oculta} {racine} {par num titre}{doublons raiz}>
+				</BOUCLE_sectoresocultos>
+
+				<BOUCLE_secteurs(RUBRIQUES) {racine} {par num titre}{doublons raiz}>
+
+				<div id="rubriquedestacada"><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]</a></div>
+
+				[(#REM) Articles et sous-rubriques ]
+
+				<div class="contre-encart">
+
+					<B_articles_racine>
+					
+					<ul>
+						<BOUCLE_articles_racine(ARTICLES) {id_rubrique} {par num titre}>
+						<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
+						</BOUCLE_articles_racine>
+					</ul>
+					</B_articles_racine>
+
+					<B_rubriques>
+					<ul>
+						<BOUCLE_rubriques(RUBRIQUES) {id_parent} {par titre}>
+						<li><strong><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]</a></strong>
+
+							<B_articles>
+							<ul>
+								<BOUCLE_articles(ARTICLES) {id_rubrique} {par titre}>
+								<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
+								</BOUCLE_articles>
+							</ul>
+							</B_articles>
+
+							<BOUCLE_sous_rubriques(BOUCLE_rubriques)></BOUCLE_sous_rubriques>
+
+						</li>
+						</BOUCLE_rubriques>
+
+					</ul>
+					</B_rubriques>
+
+				</div><!-- fin contre-encart -->
+
+				<div class="encart">
+
+				[(#REM) Breves ]
+				<B_breves>
+				<div class="breves">
+					<h3 class="menu-titre"><:breves:></h3>
+					<ul>
+						<BOUCLE_breves(BREVES) {id_secteur} {par date}{inverse}>
+						<li><a href="#URL_BREVE">[(#TITRE|supprimer_numero)]</a></li>
+						</BOUCLE_breves>
+					</ul>
+				</div>
+				</B_breves>
+
+				[(#REM) Sur le Web ]
+				<B_sites>
+				<div class="syndic">
+					<h3 class="menu-titre"><:sites_web:></h3>
+					<ul>
+						<BOUCLE_sites(SITES) {id_secteur} {par nom_site}>
+						<li><a href="[(#ID_SYNDIC|generer_url_site)]">#NOM_SITE</a></li>
+						</BOUCLE_sites>
+					</ul>
+				</div>
+				</B_sites>
+
+				</div><!-- fin encart -->
+
+				</BOUCLE_secteurs>
+				</div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			 	<INCLURE{fond=inc/inc-avisos}{lang}>	
+			</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}>	
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/rubrique.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/rubrique.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/rubrique.html	(revision 30)
@@ -0,0 +1,220 @@
+<BOUCLE_rubrica(RUBRIQUES) {id_rubrique}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+   	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>	
+
+	<div id="cuerpo"><div id="estructura">Cuerpo</div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		
+		
+  		<INCLURE{fond=inc/inc-menu-principal}{id_rubrique}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+			</div><!-- avisoprincipal -->
+			[(#REM) Fil d'Ariane ]
+	<div id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero|couper{80})]</a></BOUCLE_ariane>[ &gt; (#TITRE|supprimer_numero|couper{80})]</div>
+
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+				<BOUCLE_squelette_rubrique1(MOTS){id_rubrique}{type=Esqueletos}{0,1}>
+					<INCLURE{fond=inc/inc-muestra-actividades}{id_rubrique}{lang}>
+				</BOUCLE_squelette_rubrique1>
+				<table border="0" cellspacing="0" cellpadding="0">
+  <tr>
+    <td id="texte-article">
+		[<h2>(#LOGO_RUBRIQUE|left||sinon{#TITRE|supprimer_numero})</h2>]
+
+		[#DESCRIPTIF
+	    <div class="texte">(#TEXTE)</div>]
+	    </td>
+    </tr>
+  [<tr>
+    <td>
+	    <div class="notes">(#NOTES)</div>
+	    </td>
+  </tr>]
+	<B_docs>
+	<tr>
+    <td>
+	<!-- Documents liés -->
+	<div id="documents_boite">
+
+	<h3>Documentos asociados</h3>
+	<BOUCLE_docs(DOCUMENTS){id_rubrique}{mode=document}{doublons}> 
+	<dl class="document">
+		[<dt>(#LOGO_DOCUMENT|#URL_DOCUMENT)</dt>]
+		<dd><a href="#URL_DOCUMENT">
+		[<strong>(#TITRE)</strong><br />]
+		[(#DESCRIPTIF)<br />]
+		[[(#TAILLE|taille_en_octets)][<br />
+		(#LARGEUR) X] [(#HAUTEUR) pixels]]
+		</a></dd>
+	</dl>
+	</BOUCLE_docs>
+	</div>
+
+</td>
+    </tr>
+	</B_docs>
+
+</table>
+<BOUCLE_article_langue_TOP(ARTICLES) {id_rubrique}{titre_mot=destacada seccion} {par date} {inverse} {0,3}{doublons portada}>
+      					<div class="fotoportada">
+							[<div id="rubriqueportada">(#SURTITRE)</div>]
+							[(#LOGO_ARTICLE|left||reduire_image{192,0}|inserer_attribut{hspace,5})]
+										<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+				<img src="#URL_DOCUMENT"  width="20%" hspace="4" vspace="4" alt="#TITRE" border="1" align="right" >
+			</BOUCLE_foto> 
+							
+								<h3>[(#TITRE|supprimer_numero)]</h3>
+      							[<div class="sous-titre">(#SOUSTITRE)</div>]
+	  							[<div class="texte">(#CHAPO)</div>] 
+								#TEXTE
+								
+						</div>
+					</BOUCLE_article_langue_TOP>
+					<br />
+    				</B_article_langue_TOP>
+	<div id="boite-srubrique-rubrique">
+    
+
+ 	<B_articles_rubriques>
+	
+    <!-- Les articles -->
+	
+			<BOUCLE_articles_rubriques(ARTICLES){id_rubrique}{par date}{inverse}{doublons portada}>
+   			<?php	$nombreArticle = "#TOTAL_BOUCLE"; ?>
+        	<table><tr><td>
+			<B_foto1>
+										<BOUCLE_foto1(DOCUMENTS){id_article}{extension==jpg|png|gif}{par hasard}{0,1}>
+											[(#LOGO_DOCUMENT|left||image_reduire{110,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,4}|inserer_attribut{style,border:1px solid #000000})]
+     
+										</BOUCLE_foto1> 
+										</B_foto1> 
+										[(#LOGO_ARTICLE|left|#URL_ARTICLE|reduire_image{140,0}|inserer_attribut{hspace,5})]
+										<//B_foto1>
+			[(#LOGO_ARTICLE|right||reduire_image{80,0}|inserer_attribut{hspace,5})]<a href="#URL_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong><br />
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+					<small>[(#DATE|nom_jour) ][(#DATE|affdate)]</small>
+				</BOUCLE_sivafecha>
+				<BOUCLE_sivaautor(MOTS){id_rubrique}{titre=con autor}>
+					<small>[, <:par_auteur:> (#LESAUTEURS)]</small>
+				</BOUCLE_sivaautor>
+				[<br />(#CHAPO)]</a>
+			</td></tr></table>
+			</BOUCLE_articles_rubriques><br />
+      
+    <!-- Fin des articles -->
+ 	</B_articles_rubriques>
+	    <!-- Les sous-rubriques -->
+		
+    <!--<h3><:sousrubrique_recitfp:></h3>-->
+    <B_srubriques>
+	<div style="border-bottom:1px solid #0033CC; "></div>
+	Contenidos
+		<ul>
+			<BOUCLE_srubriques(RUBRIQUES){id_parent}{par num titre}>
+            <?php $nombreRubrique = "#TOTAL_BOUCLE"; ?>
+        	<li class="[(#COMPTEUR_BOUCLE|alterner{'pairs','impairs'})]"><a href="#URL_RUBRIQUE"><strong>[(#TITRE|supprimer_numero)]</strong><br />
+			[(#INTRODUCTION|couper{175})]</a></li>
+			</BOUCLE_srubriques><br />
+		</ul>
+    <!-- Fin des sous-rubriques -->
+	</B_srubriques>
+	</div>
+	<?php  if ($nombreRubrique + $nombreArticle == 0) { ?>
+	<style>#boite-srubrique-rubrique {display: none;}</style>
+	<?php } ?>
+			</div><!-- bloquearriba -->
+			
+			
+							<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+
+			
+			<div id="bloquemedio">
+	
+				<INCLURE{fond=inc/inc-contenidos_grupo}{id_rubrique}{lang}>
+				
+				
+				<BOUCLE_masinfo(RUBRIQUES)>
+					<B_conclave>
+					[<div style="border-top:1px solid #0066CC; ">Información de (#_rubrica:TITRE|unique) en el sitio #NOM_SITE_SPIP</div>]
+						<div class="regional">
+						<img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> 
+						[<a href="#URL_RUBRIQUE">(#TITRE|supprimer_numero)</a>] 
+						[ <span class="detalleregional"> -(#DESCRIPTIF)-</span>] 
+					</div>
+						<BOUCLE_conclave(ARTICLES){id_rubrique}{titre_mot=#_rubrica:TITRE} {par date}{inverse}>
+							<div class="tituloarticulo" style="font-size:85% "><a href="#URL_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong></a>[ - (#DATE|nom_jour) ][(#DATE|affdate)]<br /></div>
+						</BOUCLE_conclave>
+					</B_conclave>	
+				</BOUCLE_masinfo>
+				
+				
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div>
+			[(#REM) Sites de la rubrique ]
+				<B_sites>
+				<div class="syndic" style="text-align:left ">
+					
+					
+						<BOUCLE_sites(SITES) {id_rubrique} {par nom_site}>
+						<table><tr><td>
+						<b>[(#LOGO_SITE|left||reduire_image{80,0}|inserer_attribut{hspace,5})]<a href="#URL_SITE">#NOM_SITE</a></b>
+							[<br />(#DESCRIPTIF)<br />]
+							<B_syndic>
+							Ultimas Noticias
+							<ul>
+								<BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,10}>
+								<li><a href="#URL_ARTICLE" class="spip_out">#TITRE</a></li>
+								
+								</BOUCLE_syndic>
+							</ul>
+							</B_syndic>
+						</td></tr></table>
+						</BOUCLE_sites>
+						
+						<B_sous_rubriques>
+			<ul>
+				
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<li>
+						<div class='menuseccionesitem-sub#EXPOSE'>
+						<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+						</div>
+						<BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
+					</li>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			</ul>
+			</B_sous_rubriques>
+					
+				</div>
+				</B_sites>
+			</div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+						 	<INCLURE{fond=inc/inc-avisos}{lang}>
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}> 
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
+</BOUCLE_rubrica>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/site.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/site.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/site.html	(revision 30)
@@ -0,0 +1,69 @@
+#CACHE{7200}
+<BOUCLE_site(SITES){id_syndic}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+[(#REM) Les sites n'ont pas de "lang" a proprement parler ; on se base donc sur la langue de la rubrique qui les contient. Les articles syndiques, eux, ont une "lang". ]
+<BOUCLE_lang(RUBRIQUES){id_rubrique}><html dir="#LANG_DIR" lang="#LANG"></BOUCLE_lang>
+<head>
+	<title>[(#NOM_SITE|textebrut) - ][(#NOM_SITE_SPIP|textebrut)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<INCLURE{fond=inc/inc-head}{lang}>	
+	<meta name="robots" content="none" />
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+	
+	<div id="cuerpo"><div id="estructura">cuerpo</div>
+		<div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+			<INCLURE{fond=inc/inc-menu-principal}{lang}>	
+		</div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+						<div class="cartouche">
+				<a href="#URL_SITE">[(#LOGO_SITE||image_reduire{150,100})]</a>
+				<h1 class="#EDIT{nom_site} titre">#NOM_SITE</h1>
+				[<p class="#EDIT{url_site} soustitre"><a href="#URL_SITE" class="spip_out">(#URL_SITE|couper{80})</a></p>]
+			</div>
+
+			[<div class="#EDIT{descriptif} chapo">(#DESCRIPTIF)</div>]
+
+			[(#REM) Articles issus de la syndication ]
+			<B_articles>
+			<div class="liste-articles">
+				#ANCRE_PAGINATION
+				<h2 class="invisible"><:articles:></h2>
+				<ul>
+					<BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {pagination 5}>
+					<li>
+						<h3 class="titre"><a href="#URL_ARTICLE" class="spip_out">#TITRE</a></h3>
+						[<div class="enclosures">(#TAGS|afficher_enclosures)</div>]
+						<small>[(#DATE|affdate_court)][, <:par_auteur:> (#LESAUTEURS)][ &mdash; <em>(#TAGS|afficher_tags)</em>]</small>
+						[<div class="texte">(#DESCRIPTIF|image_reduire{300})
+						<br class="nettoyeur" /></div>]
+					</li>
+					</BOUCLE_articles>
+				</ul>
+				[<p class="pagination">(#PAGINATION)</p>]
+			</div>
+			</B_articles>
+
+			[<div class="notes"><h2><:info_notes:></h2>(#NOTES)</div>]
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			 	<INCLURE{fond=inc/inc-avisos}{lang}>	
+			</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}>	
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
+</BOUCLE_site>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/sommaire.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/sommaire.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/sommaire.html	(revision 30)
@@ -0,0 +1,52 @@
+#CACHE{0}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title>[(#NOM_SITE_SPIP)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+	
+	<div id="cuerpo"><div id="estructura">cuerpo</div>
+		<div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+			<INCLURE{fond=inc/inc-menu-principal}{lang}>	
+		</div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<INCLURE{fond=inc/inc-aviso-portada}{lang}>
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+				<INCLURE{fond=inc/inc-nota-principal}{lang}>
+				<INCLURE{fond=inc/inc-nota-secundaria}{lang}>
+			</div><!-- bloquearriba -->
+			<div id="bloquemedio">
+				<div id="estructura">bloquemedio</div>
+				<INCLURE{fond=inc/inc-comunicados}{lang}>
+				<INCLURE{fond=inc/inc-notas-destacadas}{lang}>
+				<INCLURE{fond=inc/inc-galeria}{lang}>
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo">
+				<div id="estructura">bloqueabajo</div>
+				<INCLURE{fond=inc/inc-titulares}{lang}>	
+			</div><!-- bloqueabajo -->
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			 	<INCLURE{fond=inc/inc-avisos}{lang}>	
+			</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}>	
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/styles/estilo-despachos.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/styles/estilo-despachos.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/styles/estilo-despachos.css	(revision 30)
@@ -0,0 +1,144 @@
+/* CSS Document */
+#cuerpodespacho
+{
+
+}
+#contenidodespacho
+{
+}
+#despacho
+{
+
+padding:10px 0px 20px 10px;
+width:620px;
+float:left;
+overflow:hidden}
+.regional{
+font-size: 90%;
+margin-top:10px;
+font-weight: bold;
+text-align:left;
+
+color:#005555}
+.detalleregional{
+font-size: 90%;
+text-align:left;
+color:#000000
+}
+.tituloarticulo{
+font-size: 120%;
+text-align:left;
+margin-top:2px;
+}
+.textoarticulo{
+font-size: 90%;
+text-align:justify;
+margin-top:20px
+}
+.volver{
+text-align:right;font-size:80%
+}
+#datosedicion a , #datosedicion a:visited {color:#CCCCCC}
+#datosedicion a:hover {color:#eeeeee}
+#datosedicion{
+padding-top:20px;
+text-align:center;
+
+color:#ffffff;
+text-align:left}
+.frase{font-size: 90%;
+padding:3px 0px 3px 10px;
+font-style:italic;font-family:"Times New Roman", Times, serif;}
+.despachodatos{
+padding:3px 0px 3px 10px;
+;font-size: 75%;}
+.titulomedios{
+background-color:#005555;
+font-size:80%;
+
+padding:3px 0px 3px 10px;
+font-weight: bold;
+color:#ffffff;
+}
+.division{
+margin:20px -10px 20px -10px;
+height:20px;
+background-color:#cccccc}
+.numerodespacho{font-weight: bold;
+font-size: 80%;
+padding:3px 5px 3px 5px;
+text-align:center}
+
+body 
+{ 
+
+font-family:Arial, Helvetica, sans-serif; 
+font-size: 90%;
+/*background-image: url("../img/fondo.gif");*/ 
+margin: 0 ;
+text-align:center;
+}
+a, a:visited
+{
+color: #0C2A80;
+text-decoration: none;  
+}
+a:hover , a.over
+{ 
+color: #0C2A50
+}
+
+#pagina 
+{
+margin: 0; 
+padding: 0; 
+width: 780px ;
+text-align:center;
+position:relative;
+margin: 0px auto;
+}
+#estructura
+{
+color:#FFFF00;
+font-size: 80%;
+overflow:hidden;
+
+display:none;
+}
+#columnaizquierda
+{
+
+margin: 0px 0px 0px 0px;
+padding-bottom:20px;
+background-image: url("../img/fondo.gif")
+
+}
+#pie
+{
+width:780px;
+width:100%;
+float:left;
+background-color:#cccccc;
+margin: 0px 0px 0px 0px
+}
+#datos{
+
+padding:5px;
+text-align:center;
+font-size: 80%;
+}
+#barracabeza
+{
+border-top: solid 1px #000000;
+background-color:#cccccc;
+padding:3px;
+margin: 0px 0px 0px 0px;
+font-size:85%;
+
+
+}
+.spip-admin-bloc {display:none}
+
+
+
+
Index: /trunk/spip/esqueleto-redcta/themes/redcta/styles/estilo.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/styles/estilo.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/styles/estilo.css	(revision 30)
@@ -0,0 +1,691 @@
+body 
+{ 
+
+font-family:Helvetica, Arial, sans-serif; 
+font-size: 85%;
+/*background-image: url("../img/fondo.gif");*/ 
+margin: 0 ;
+text-align:center;
+}
+img{ border:0px solid #000000}
+a, a:visited
+{
+color: #0C2A80;
+text-decoration: none;
+
+}
+a:hover , a.over
+{ 
+color: #0C2A50
+}
+
+#pagina 
+{
+margin: 0; 
+padding: 0; 
+width: 780px ;
+text-align:center;
+position:relative;
+margin: 0px auto;
+}
+#estructura
+{
+/*color:#FFFF00;*/
+font-size: 80%;
+overflow:hidden;
+display:none;
+}
+#cabeza img{border:0}
+#cabeza 
+{float:left;
+/*background-image: url("../img/fondo.gif");
+background-color: #000; 
+background-image: url("../img/cabeza.jpg");
+
+margin-bottom: 0; 
+padding: 0; 
+height: 51px;*/
+}
+#barracabeza
+{
+/*border: solid 1px #000000;*/
+background-image: url("../img/fondobarra.gif");
+padding:3px;
+margin: 0px 0px 0px 0px;
+font-size:85%;
+float:left;
+width:774px
+
+}
+#cuerpo
+{
+background-image: url("../img/fondoportada.gif");
+
+float:left;
+background-repeat:repeat-y;
+}
+#cuerpo-actividades
+{
+background-image: url("../img/fondoblanco-menu.jpg");
+
+float:left;
+background-repeat:repeat-y;
+}
+#columnaizquierda
+{
+/*border:1px solid #0066CC;*/
+text-align:left;
+width:131px;
+float:left;
+margin: 0px 0px 0px 0px;
+
+overflow:hidden;
+}
+#menusecciones{
+text-align:left;
+
+}
+.mostrar{display:none}
+.menuseccionesarriba{
+/*background-image: url("../img/secciones.gif");*/
+height:13px;
+background-repeat:no-repeat}
+.menuseccionesitem
+{
+padding: 4px 10px 4px 14px;
+
+font-size:90%;
+background-repeat:repeat-y
+}
+* html .menuseccionesitem	/* selecteur reconnu seulement par IE (Win et Mac)*/
+{
+/*margin-top:-3px*/
+}
+.menuseccionesitem a , .menuseccionesitem a:visited
+{
+
+font-weight: bold;
+}
+.pico{margin: -2px 0px 0px -14px;
+position:relative;
+}
+.menuseccionesitem:hover{
+}
+
+.menuseccionesitemon
+{
+background-repeat:repeat-y;
+padding: 4px 10px 4px 14px;
+
+font-size:80%;
+font-weight: bold;
+}
+
+a.on, a:visited.on{;font-weight: bold;}
+.menuseccionesitem-sub a , .menuseccionesitem-sub a:visited 
+{
+
+font-weight: bold;
+}
+.menuseccionesitem-sub
+{
+/*background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;*/
+padding: 4px 10px 4px 20px;
+
+font-size:80%;
+/*background-color:#B7D8DA;*/
+}
+
+.menuseccionesitem-subon
+{
+/*background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;*/
+padding: 4px 10px 4px 20px;
+/*border-bottom: solid 1px #23475D;*/
+border-right: solid 1px #23475D;
+font-size:80%;
+/*
+background-color:#B7D8DA;*/
+}
+.menuseccionesitem-subon ul li .menuseccionesitem-sub{
+position:relative;
+background-image: url("../img/bordemenusubsub1.gif");
+background-repeat:repeat-y;
+padding-left:25px;
+margin-right:-11px;
+margin-left:-20px;
+font-weight: bold;
+margin-top:2px;
+border-top: solid 1px #23475D;}
+
+.menuseccionesitem-subon ul li .menuseccionesitem-subon{
+position:relative;
+background-image: url("../img/bordemenusubsub1.gif");
+background-repeat:repeat-y;
+padding-left:25px;
+margin-right:-11px;
+margin-left:-20px;
+font-weight: bold;
+margin-top:2px;
+border-top: solid 1px #23475D;}
+
+.articuloson ul li .menuarticuloitem{
+background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;
+padding: 4px 10px 4px 20px;
+border-bottom: solid 1px #23475D;
+border-right: solid 1px #23475D;
+font-size:80%;
+
+background-color:#B7D8DA;
+}
+.articulos ul li .menuarticuloitem{
+display:none
+}
+
+.lienon {color:blue}
+* html .menuseccionesitem-sub	/* selecteur reconnu seulement par IE (Win et Mac)*/
+{
+/*margin-top:-3px*/;
+}
+
+.menuseccionesitem-sub:hover{
+color:#023568;
+}
+
+
+.menuseccionesabajo{
+
+height:13px;
+background-repeat:no-repeat;
+
+}
+
+
+
+#contenido
+{
+
+width:508px;
+float:left;
+vertical-align:middle;
+padding: 10px ;
+margin: 0px 0px 0px 0px;
+overflow:hidden;
+text-align:left;
+}
+.contenidoin{padding:10px}
+
+#columnaderecha
+{
+width:120px;
+float:right;
+overflow:hidden;
+text-align:center
+}
+#avisoportada
+{
+padding: 0px 0px 0px 0px;
+margin: -10px 0px 0px -10px;
+font-size: 90%; 
+}
+#bloquearriba
+{
+text-align:left;
+	/*border-bottom:1px solid #0066CC;*/
+
+}
+#bloquemedio
+{
+text-align:left;
+	/*border-bottom:1px solid #0066CC;*/
+	
+
+}
+#bloqueabajo
+{
+/*border: solid 1px #ffffff;*/
+
+float:left;
+}
+#pie
+{/*background-image: url("../img/fondo.gif");*/
+width:780px;
+width:100%;
+float:left;
+
+margin: 0px 0px 0px 0px
+}
+#prueba 
+{
+/*border: solid 1px #ffffff;*/
+width:100%;
+float:left;
+position:absolute;
+width:500px;
+float:left;
+height: 30px;
+background-image: url("../img/fondo2.gif");
+margin: -46px 0px 0px 154px;
+}
+* html #prueba	/* selecteur reconnu seulement par IE (Win et Mac)*/
+{
+	margin: -30px 0px 0px -542px;
+
+}
+
+ /* -------------------------------------------------------
+ 	MENU NAVIGADORON (IZQUIERDA)
+ ------------------------------------------------------- */
+.menu a
+{
+
+
+}
+.menu ul {
+	display: block;
+	margin: 0px;
+	padding: 0px;
+	padding-bottom: 0px;
+	list-style: none;
+}
+
+.menu ul.titulo {
+	display: block;
+	margin: 0px;
+	padding: 0px;
+	
+	list-style: none;
+}
+
+.menu li.titulo {
+	display: block;
+	margin: 0px;
+	padding: 0px;
+	
+	list-style: none;
+}
+#menusecundario{
+width:140px;
+margin-left:2px;
+border-bottom:solid 5px #cc0000;
+
+
+}
+.titulosecundario
+{
+
+margin-left:8px;
+
+font-size: 80%;
+font-weight: bold;
+}
+.menusecundarioitem     
+{ 
+border-bottom:solid 2px #000099; 
+padding: 0px 6px 0px 6px; 
+font-size: 85%; 
+}
+.menusecundarioitem a ,.menusecundarioitem a:visited 
+{ 
+color: #09f; 
+}
+.menusecundarioitem a:hover 
+{ 
+color: #9cf;  
+}
+
+.menu-item a {
+ 
+padding: 0px 8px 0px 18px; 
+font-size: 85%; }
+
+.menu-item a ,.menu-item a:visited 
+{ 
+color: #09f; 
+}
+.menu-item a:hover 
+{ 
+color: #9cf;  
+}
+.menu-subitem {
+padding: 0px 8px 0px 23px; 
+font-size: 85%;}
+.avisosizquierda
+{
+margin: 10px 0px 10px 6px}
+.avisosderecha
+{
+border-bottom:1px solid #0066CC;
+margin: 0px 5px 0px 5px;
+padding: 10px 0px 10px 0px;
+font-size: 80%;
+
+
+}
+.spip-admin-bloc {
+text-align:center;float:left;
+width:780px}
+
+.avisossuperior
+{
+border-bottom:1px solid #0066CC;
+padding: 10px 0px 10px 0px;
+margin: 0px 0px 0px 0px;
+font-size: 90%; 
+}
+
+
+
+.subtituloaviso
+{
+font-size: 105%;
+text-align:left ;
+background-color:#FFFFFF;
+padding: 0px 10px 0px 10px;
+}
+.tituloaviso
+{ 
+font-size: 140%;
+font-weight: bold;
+color:red;
+background-color:#FFFFFF
+}
+a:hover .tituloaviso
+{ 
+
+color:#000ddd
+}
+
+/* contenido del pie general */
+#datos{
+
+/*padding:5px;*/
+text-align:center;
+font-size: 80%;
+font-weight:bold
+}
+.texto1datos{}
+.texto2datos{
+font-size: 120%;
+
+font-weight: bold;}
+.texto3datos{
+font-size: 110%;
+}
+#afiliados{
+}
+.evento { font-size: 11px; font-family: Verdana, Arial, Helvetica; border-top: 1px solid #036 }
+.adagenciat      { font-size: 14px; font-family: Arial, Helvetica, Geneva, Swiss, SunSans-Regular }
+.adagenciat a    { color: #036; text-decoration: none }
+.adagenciat a:hover   { color: #00c }
+.adagencia a      { color: #036; text-decoration: none }
+.evento a  { color: #900; text-decoration: none }
+.evento a:hover    { color: #036 }
+.adagencia a:hover1 { color: #036 }
+.adagenciase    { color: #036; font-size: 13px; font-family: Verdana, Arial, Helvetica; border-top: 1px solid #036 }
+.activtit  { color: #036; font-size: 13px; font-family: Verdana, Arial, Helvetica }
+.activfecha { font-weight: bold; font-size: 11px; font-family: Verdana, Arial, Helvetica }
+.adagenciase a   { color: #036; font-family: Verdana, Arial, Helvetica }
+.adagenciase a:hover  { color: #00c; font-family: Verdana, Arial, Helvetica; text-decoration: none }
+
+#cuerpodespacho
+{
+background-image: url("../img/fondoatedespacho.gif");
+float:left;
+background-repeat:repeat-y;
+}
+#contenidodespacho
+{
+
+padding:0px 0px 0px 0px;
+width:640px;
+
+overflow:hidden}
+#despacho
+{
+
+padding:10px 0px 20px 10px;
+width:620px;
+float:left;
+overflow:hidden}
+.regional{
+font-size: 80%;
+margin-top:10px;
+font-weight: bold;
+text-align:left;
+
+color:#005555}
+.detalleregional{
+font-size: 80%;
+text-align:left;
+color:#000000
+}
+.tituloarticulo{
+font-size: 120%;
+text-align:left;
+margin-top:2px;
+}
+.textoarticulo{
+font-size: 80%;
+text-align:justify;
+margin-top:20px
+}
+.volver{
+text-align:right;font-size:80%
+}
+#datosedicion a , #datosedicion a:visited {color:#CCCCCC}
+#datosedicion a:hover {color:#eeeeee}
+#datosedicion{
+padding-top:20px;
+text-align:center;
+
+color:#ffffff;
+text-align:left}
+.frase{font-size: 90%;
+padding:3px 0px 3px 10px;
+font-style:italic;font-family:"Times New Roman", Times, serif;}
+.despachodatos{padding:3px 0px 3px 10px;;font-size: 75%;}
+.titulomedios{
+background-color:#005555;
+font-size:80%;
+
+padding:3px 0px 3px 0px;
+font-weight: bold;
+color:#ffffff;
+}
+.division{
+margin:20px -10px 20px -10px;
+height:20px;
+background-color:#cccccc}
+.numerodespacho{font-weight: bold;
+font-size: 80%;
+padding:3px 5px 3px 5px;
+text-align:center}
+.pirulos
+{
+font-size: 80%;
+margin-left:5px;
+margin-right:5px;
+position: relative;
+	/*overflow:hidden;*/
+text-align:center;
+/*border: solid 1px black*/
+}
+.pirulos img {border:0px}
+.spacepirulo{margin-bottom:2px;}
+/*.cortepirulo{background-color:transparent;
+height:8px;}*/
+
+#rubriquepirulo { 
+font-weight:bold; 
+font-size:80%; 
+text-align:center;
+color:#000000; 
+background-color:#669ACC;
+padding: 2px 5px 2px 5px;
+margin-top:10px;
+
+}
+#rubriquepirulo a{color:#000000;font-size:115%; }
+#rubriquepirulo a:hover{color:#ffffff}
+.surtitrep{
+padding: 1px 0px 1px 5px;
+background-color:white;
+font-size:1.0em; 
+;
+}
+
+.h5p {
+padding: 1px 3px 3px 3px;
+background-color:white;
+font-size:120%;
+font-weight:bold
+}
+
+.h5p a{
+}
+.h5p a:hover{color:blue
+}
+
+.sous-titrep{padding: 0px 3px 5px 3px;background-color:white;font-size:90%; }
+
+#nota_principal
+{
+padding:10px
+}
+#nota_secundaria
+{
+padding:10px
+}
+#sktheme_switcher {
+text-align:left;float:left;
+position:relative;
+width:780px}
+
+.agendabanner{background-image: url("../img/agenda.gif");
+height:31px;
+background-repeat:no-repeat;
+background-position:center;
+margin-top:10px;
+margin-bottom:0px}
+.agendain       { padding-right: 10px; padding-left: 10px;
+margin-left:6px;
+margin-right:6px;
+ }
+.agendatit, .agendatit a,  .agendatit a:visited    { font-size: 1em; font-family: Helvetica, Geneva, Arial, SunSans-Regular, sans-serif; font-weight: bold; padding-bottom: 10px }
+.agendaevent    { font-size: 0.8em; font-family: Helvetica, Geneva, Arial, SunSans-Regular, sans-serif; margin-bottom: 5px; padding-bottom: 3px; border-bottom: 1px dashed #789 }
+.agendafecha       { font-size: 0.9em; font-family: Verdana, Arial, Helvetica, sans-serif; margin-top: 5px; padding-top: 5px; padding-bottom: 10px }
+#rubriquedestacada{
+padding-left:3px;
+background-color:#ccc;
+font-weight:bold;
+
+}
+.comunicado-in{
+font-size:90%;
+border: solid 1px #ccc;
+padding:10px;
+background-color:#eee
+}
+
+#instalacion
+{
+
+width:492px;
+
+padding:15px;
+font-size:110%;
+color:brown;
+
+background-image: url("http://www.redcta.org.ar/images/Logo-redcta-trac.png");
+background-repeat:no-repeat;
+background-position:right top; 
+
+}
+#titulares{
+font-size:120%;
+
+font-weight:bold;
+text-align:left;
+}
+.fechatitulares{
+font-weight:normal}
+
+#galeria{float:left}
+#rubriqueportada{font-size:95%;
+font-weight:bold;
+padding-top:5px;
+border-top:1px solid #ccc}
+h3{margin-top:4px;
+margin-bottom:3px;
+font-size:140%}
+.texte{font-size:90%;margin-bottom:10px}
+.titulo-0{font-size:120%;
+font-weight:bold;
+margin-bottom:5px}
+.FECHA-COMUNIC{font-weight:bold;
+font-style:italic;
+color:#666633}
+.titulocongreso{font-weight:bold;
+margin-top:-10px;
+margin-left:10px;
+margin-right:10px;
+font-size:130%;
+}
+.fecha{font-size:80%;
+font-style:italic;
+}
+.surtitre{font-size:90%;
+font-weight:bold}
+.chapo{
+font-weight:bold}
+.titre{font-size:130%;
+font-weight:bold}
+.articulos{width:100%;border-bottom:1px solid #ccc}
+.sous-titre{;
+font-weight:bold}
+#bloc-contenu-top{border-bottom:1px solid #ccc}
+.volantadest1{font-weight:bold}
+.pagination .ligne2{text-align:center;background-color:#eee;}
+p.pagination{margin-top:0;text-align:center;font-size:80%;}
+#sommaire{float:right;display:block;width:160px;margin:0 0 0 1em;border:1px gray solid;background-color:white;overflow:hidden;}
+.spip_modele{width:160px;margin:0 0 0 1em;border:1px gray solid;background-color:white;clear:both;overflow:hidden;}
+#sommaire h4,.spip_modele h4{border-bottom:1px silver dotted;text-align:center;line-height:1em;}
+#sommaire ul,.spip_modele ul{font-size:90%;margin:.5em;margin-left:1em;padding:0;list-style-type:square;}
+#sommaire ul li,.spip_modele ul li{line-height:1em;margin:.3em 0 0 .5em;}
+
+.spip_code, .spip_cadre { font-family: monospace; font-style: normal; font-size: 1.2em; }
+.spip_cadre { width: 99%; border: 1px inset; }
+.spip_code { background-color: #FCF4D0; }
+/*
+    NUBE DE PALABRAS
+*/
+.nube01{
+ background-color: Black;
+ font-size: 9pt;
+ text-align: left;
+ padding-left: 5px;
+ padding-right: 5px;
+ color: #ffffff;
+ font-weight: bold;
+ width: 502px;
+}
+.nube02{
+ background-color: #D6DCF5;
+ width: 500px;
+ border: 1px solid #D6DCF5;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+a.nubelink:link, a.nubelink:visited, a.nubelink:active{
+
+ color: #FFCC00;
+ text-decoration: none;
+}
+A.nubelink:hover{
+
+ color: White;
+ text-decoration: underline;
+}
Index: /trunk/spip/esqueleto-redcta/themes/redcta/styles/inc-instalacion.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/styles/inc-instalacion.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/styles/inc-instalacion.html	(revision 30)
@@ -0,0 +1,35 @@
+<multi>
+
+
+<div id="instalacion" style="text-align:left ">
+<h3>Bienvenido a su Pagina Web .</h3>
+	<ul class="spip">
+		<li class="spip">
+			Para crear  la informaci&oacute;n de <i class="spip">Contact</i>o del sitio, cree un nuevo autor con: <a href="ecrire/?exec=auteur_infos&new=oui" class="spip_out">Su nombre o el nombre de su organizacion</a>
+		</li>
+		<li class="spip">
+			Para crear un nuevo autor, vaya a : <a href="ecrire/?exec=auteurs" class="spip_out">Autores </a>
+		</li>
+		<li class="spip">
+			Para crear Contenidos:
+			  <ol class="spip">
+				<li class="spip">
+					crear uno o m&aacute;s <a href="ecrire/?exec=rubriques_edit&amp;new=oui" class="spip_out">secciones </a>,
+				</li>
+				<li class="spip">
+					dentro de una secci&oacute;n, crear un <a href="ecrire/?exec=articles_edit&amp;new=oui" class="spip_out">articulo</a>, guarda y publicarlo.
+				</li>
+			</ol>
+		</li>
+		<li class="spip">
+			Para quitar o modificar este mensaque que siempre aparece arriba de la pagina prinicpal, vaya a <a href="ecrire/?exec=configuration" class="spip_out">Configuracion </a> y edite el nombre y la descripcion del Sitio.
+		</li>
+		<li class="spip">Para una ayuda general sobre este sistema de Contenidos , vaya a <a href="ecrire/?exec=aide_index&var_lang=es" class="spip_out">Ayuda</a>.
+		</li>
+		<li class="spip"> M&aacute;s	informacion	disponible en	<a href="http://www.spip.net/es" class="spip_url spip_out">www.spip.net/es</a>.
+		</li>
+	</ul>
+</div>
+
+
+</multi>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/sub_mot-Despachos.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/sub_mot-Despachos.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/sub_mot-Despachos.html	(revision 30)
@@ -0,0 +1,149 @@
+<BOUCLE_mot_principal(MOTS) {id_mot} {doublons}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title>[(#NOM_SITE_SPIP)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/icon.gif" />
+
+<link rel="stylesheet" 
+		href="#DOSSIER_SQUELETTE/styles/estilo-despachos.css" 
+		type="text/css" media="projection, screen, tv" title="cta" />
+</head>
+
+<body>
+<a name="inicio"></a>
+<table width="780px" cellpadding="0" cellspacing="0" border="0" >
+	<tr>
+		<td>
+			<div id="cabeza">
+				<B_cabezaprincipal>
+	
+	<BOUCLE_cabezaprincipal(ARTICLES){lang?}{titre_mot=cabeza despacho} {par num titre}>
+		<B_muestradoc1>
+			<BOUCLE_muestradoc1(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        		<div>	
+					#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    			</div><!-- avisossuperior -->
+			</BOUCLE_muestradoc1>
+			</B_muestradoc1>
+			<div>	
+				<a href="#URL_SITE_SPIP">
+					[<img src='#URL_SITE_SPIP/IMG/(#LOGO_ARTICLE|fichier)'  style='border-width: 0px;' class='spip_logos' align='left'  /> ]
+				</a>
+			</div><!-- avisossuperior -->
+		<//B_muestradoc1>     
+	</BOUCLE_cabezaprincipal> 
+</B_cabezaprincipal>
+				
+			</div>
+		</td>
+	</tr>
+	<tr>
+		<td>		
+	<B_barracabeza>
+			<div id="barracabeza">
+				
+					<BOUCLE_barracabeza(ARTICLES){lang?}{titre_mot=Despacho Bajada} {par num titre}>
+						<div>	
+							#TEXTE
+						</div><!-- avisossuperior --> 
+					</BOUCLE_barracabeza> 
+				
+			</div>
+			</B_barracabeza>
+		</td>
+	</tr>
+	<tr>
+	<td>		
+	
+
+		<table width="100%"  cellpadding="0" cellspacing="0"  border="0">
+  <tr>
+    <td width="130" valign="top" id="columnaizquierda"><div id="columnaizquierda">
+			
+			<div id="datosedicion">
+			<BOUCLE_despacho(MOTS){id_mot}{par titre}>
+				<div class="numerodespacho">Despacho N° #TITRE <br />#DESCRIPTIF</div>
+			</BOUCLE_despacho>
+				<BOUCLE_frases(BREVES){lang?}{id_rubrique=8} {par hasard} {0,1}>
+					<div class="frase">	
+						#TEXTE
+						</div>
+				</BOUCLE_frases> 
+				<BOUCLE_despachodatos(ARTICLES){lang?}{titre_mot=Despacho Datos} {par num titre}>
+					<div class="despachodatos">	
+						#TEXTE
+					</div> 
+				</BOUCLE_despachodatos> 
+				<B_medios>
+					<div class="titulomedios">ATE en los medios</div>
+					<BOUCLE_medios(BREVES){lang?}{id_rubrique=7}  {par num titre}>
+						<div class="despachodatos">	
+							#TITRE<br />
+							<a href="#URL_SITE">#NOM_SITE</a>
+						</div>
+					</BOUCLE_medios> 
+				</B_medios>
+				</div><!-- datosedicion -->
+		</div><!-- columnaizquierda --></td>
+    <td  valign="top">		<div id="contenidodespacho">
+			<div id="despacho">
+				
+
+					
+					<div class="regional"><img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> [(#TITRE|supprimer_numero)] [ <span class="detalleregional"> -(#DESCRIPTIF)-</span>] </div>
+					<ul>
+					<BOUCLE_art_mot(ARTICLES){id_mot}{par num titre}>
+   						<li><div class="tituloarticulo"><a href="##ID_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong><br /></a></div></li>
+					</BOUCLE_art_mot>
+					</ul>
+					
+					
+
+				<div class="division"></div>
+				
+
+					<BOUCLE_art_mot3(ARTICLES){id_mot=#ENV{id_mot}} {titre_mot=#TITRE} {par num titre}>
+   						<div class="tituloarticulo">
+							<img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> 
+								<a name="#ID_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong></a> <br />
+						</div>
+							[<img src='#URL_SITE_SPIP/IMG/(#LOGO_ARTICLE|fichier)'  style='border-width: 0px;' class='spip_logos' align='left' hspace='5' /> ]
+								[<div class="textoarticulo"><b>#CHAPO</b>(#TEXTE|abs_url)  </div>] <div class="volver"><a href="#inicio">[ Volver a titulares ]</a></div> 
+					</BOUCLE_art_mot3>
+      			
+
+				<!-- Ahora para los articulos -->
+				
+				
+
+      			
+			</div><!-- despacho -->
+			
+			
+		</div><!-- contenidodespacho --></td>
+  </tr>
+</table>
+
+	  	
+
+
+  </td>
+</tr>
+<tr>
+<td>
+  
+  <INCLURE{fond=inc/inc-piegral}{lang}>  
+	
+</td>
+</tr>
+</table>
+
+</body>
+</html>
+
+</BOUCLE_mot_principal>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/sub_mot-Multimedia.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/sub_mot-Multimedia.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/sub_mot-Multimedia.html	(revision 30)
@@ -0,0 +1,94 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+   	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>	
+
+
+	<div id="cuerpo">
+	  <div id="estructura"></div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		<INCLURE{fond=inc/inc-menu-principal}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+							
+
+			</div><!-- avisoprincipal -->
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+				
+				
+				
+				
+				
+				
+				<table border="0" cellspacing="0" cellpadding="0">
+  <tr>
+    <td id="texte-article">
+		[<h2><strong>&gt;&gt;</strong>(#TITRE|supprimer_numero)</h2>]
+		[<div id="boite-logo-rubrique"> 
+		(#LOGO_RUBRIQUE||reduire_image{142})
+		</div>][
+	    <div class="texte">(#TEXTE)</div>]
+	    </td>
+    </tr>
+  [<tr>
+    <td>
+	    <div class="notes">(#NOTES)</div>
+	    </td>
+  </tr>]
+	<B_docs>
+	<tr>
+    <td>
+	<!-- Documents liés -->
+	<div id="documents_boite">
+
+<INCLURE{fond=inc/inc-fotogaleria}{lang}>	
+	</div>
+
+</td>
+    </tr>
+	</B_docs>
+
+</table>
+
+	<div id="boite-srubrique-rubrique">
+    
+    <!-- Les sous-rubriques -->
+    <!--<h3><:sousrubrique_recitfp:></h3>-->
+   
+
+	</div>
+	
+			</div><!-- bloquearriba -->
+			<div id="bloquemedio">
+				
+				
+
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div></div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			  <INCLURE{fond=inc/inc-avisos}{lang}>
+			
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+    <INCLURE{fond=inc/inc-piegral}{lang}> 
+	
+</div><!-- pagina -->
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]	
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/redcta/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/redcta/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/redcta/theme.xml	(revision 30)
@@ -0,0 +1,22 @@
+<theme>
+  <nom>redCTA</nom>
+  <auteur>
+    [redCTA->http://www.redcta.org.ar] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>1.0</version>
+  <etat>test</etat>
+  <type>squelettes</type>
+  <squelettes>CTAlomas</squelettes>
+  <description>
+    <multi>
+		 [es]
+	  Seleccionar esta plantilla para que sea la plantilla por default. 	
+       [en]
+	  Select this template to make it the default template of your site.
+      [fe]
+      S&#233;lectionner ce squelette pour l'activer comme squelette par d&#233;faut de votre site.
+    </multi>
+  </description>
+  <lien>[redcta->www.redcta.org.ar]</lien>
+  <prefix>redCTA</prefix>
+</theme>
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/article.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/article.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/article.html	(revision 30)
@@ -0,0 +1,158 @@
+#CACHE{86400}
+<BOUCLE_article_principal(ARTICLES) {id_article}><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+	<INCLURE{fond=inc/inc-head}{lang}>
+   
+	#INSERT_HEAD 
+	#SPIP_HEAD
+</head>
+
+<body>
+<div id="pagina">
+	<div id="cabeza"><INCLURE{fond=inc/inc-cabeza}{lang}></div>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+	
+
+
+	<div id="cuerpo">
+	  <div id="estructura"></div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		
+		
+  		<INCLURE{fond=inc/inc-menu-principal}{id_rubrique}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+							
+
+			</div><!-- avisoprincipal -->
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+				
+				<BOUCLE_squelette_rubrique1(MOTS){id_rubrique}{type=Esqueletos}{0,1}>
+					<INCLURE{fond=inc/inc-muestra-actividades}{id_rubrique}>
+				</BOUCLE_squelette_rubrique1>
+				
+				<div class="cartouche">
+				<div class="iconitos" style="float:right; margin-top:5px ; text-align:right; border:0px">
+					#ENVIAR_EMAIL** 
+					#IMPRIMIR_DOCUMENTO**
+					<a HREF="#" onClick="window.open('spip.php?page=article_pdf&id_article=#ID_ARTICLE','_blank','toolbar=0, location=0, directories=0, status=0, scrollbars=0, resizable=0, copyhistory=0, menuBar=0, width=400, height=620');return(false)">
+						<img src="#DOSSIER_SQUELETTE/img/crear_pdf.gif" / style="border:0px ">
+					</a>
+				</div>
+				<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+				
+				<BOUCLE_comunicadodeprensa(MOTS){id_rubrique}{titre=comunicado de prensa}{0,1}>
+					[(#LOGO_MOT|center)]
+				</BOUCLE_comunicadodeprensa>
+				#DEBUT_SURLIGNE
+				[(#LOGO_ARTICLE||image_reduire{200,200})]
+				[<p class="surtitre">(#SURTITRE)</p>]
+				<h1 class="titre">[(#TITRE|supprimer_numero)]</h1>
+				[<p class="soustitre">(#SOUSTITRE)</p>]
+				#FIN_SURLIGNE
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+
+				<p><small>[(#DATE|nom_jour) ][(#DATE|affdate)][, <:par_auteur:> (#LESAUTEURS)]</small></p>
+				</BOUCLE_sivafecha>
+				[(#REM) Inclure le modele des liens de traductions ]
+				#MODELE{article_traductions}
+
+			</div>
+			
+			#DEBUT_SURLIGNE
+			[<div class="chapo">(#CHAPO)</div>]
+			<br class="nettoyeur" />
+			[<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+			[<div class="texte">(#TEXTE|image_reduire{520,0})</div>]
+			#FIN_SURLIGNE
+
+			[(#REM) Portfolio : album d'images ]
+			<B_afficher_document>
+			
+			<BOUCLE_afficher_document(DOCUMENTS) {id_document} {id_article} {mode=document}{extension IN png,jpg,gif}>
+			<center><hr /><div class="spip_documents spip_documents_center" id="document_actif">
+				[(#EMBED_DOCUMENT|image_reduire{520,0})]
+				[<div class="spip_doc_titre">(#TITRE)</div>]
+				[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+			</div></center>
+			</BOUCLE_afficher_document>
+			</B_afficher_document>
+			<B_documents_portfolio>
+			<div id="documents_portfolio">
+				<h3>Galeria de Imagenes<small><small><i> - Click en las miniaturas para agrandarlas</i> </small></small></h3>
+				<BOUCLE_documents_portfolio(DOCUMENTS) {id_article} {mode=document} {extension IN png,jpg,gif} {par num titre, date} {doublons}>
+				[<a href="#URL_DOCUMENT" type="#MIME_TYPE" onclick="location.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return false;"[ title="(#TITRE|couper{80}|texte_backend)"]>(#LOGO_DOCUMENT||image_reduire{0,60}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
+				</BOUCLE_documents_portfolio>
+			</div>
+			</B_documents_portfolio>
+			
+			[<div class="ps"><h2><:info_ps:></h2>#DEBUT_SURLIGNE(#PS)#FIN_SURLIGNE</div>]
+
+			[(#REM) Autres documents joints a l'article ]
+			<B_documents_joints>
+			<div id="documents_joints">
+				<h3>Documentos Asociados</h3>
+				
+					<BOUCLE_documents_joints(DOCUMENTS) {id_article} {mode=document} {par num titre, date} {doublons}>
+					
+						<div class="spip_doc_titre"><a href="#URL_DOCUMENT" title="<:bouton_telecharger:>" type="#MIME_TYPE">[(#LOGO_DOCUMENT)<br />][(#TITRE|sinon{<:info_document:>})]</a> <small>(#TYPE_DOCUMENT[ - (#TAILLE|taille_en_octets)])</small></div>
+						[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
+					
+					</BOUCLE_documents_joints>
+				
+			</div>
+			</B_documents_joints>
+				
+				
+				
+				
+
+	
+	<?php  if ($nombreRubrique + $nombreArticle == 0) { ?>
+	<style>#boite-srubrique-rubrique {display: none;}</style>
+	<?php } ?>
+			</div><!-- bloquearriba -->
+			<div id="bloquemedio">
+				<BOUCLE_seccion(RUBRIQUES){id_rubrique}>
+				<B_art_mot2>
+						<div style="border-bottom:1px solid #0066CC; "></div>
+					<div class="regional">
+						<img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> 
+						[(#TITRE|supprimer_numero)] 
+						[ <span class="detalleregional"> -(#DESCRIPTIF)-</span>] 
+					</div>
+					<BOUCLE_art_mot2(ARTICLES){titre_mot=#TITRE} {par date}{inverse}>
+   						<div class="tituloarticulo" style="font-size:85% "><a href="#URL_BREVE"><strong>[(#TITRE|supprimer_numero)]</strong></a>[ - (#DATE|nom_jour) ][(#DATE|affdate)]<br /></div>
+					</BOUCLE_art_mot2>
+				</B_art_mot2>
+				</BOUCLE_seccion>
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div>
+			
+			</div>
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			  			 	<INCLURE{fond=inc/inc-avisos}{lang}>
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}> 
+	<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]	
+</div><!-- pagina -->
+
+</body>
+</html>
+</BOUCLE_article_principal>
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-aviso-portada.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-aviso-portada.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-aviso-portada.html	(revision 30)
@@ -0,0 +1,21 @@
+
+				<B_avisos_superior>
+				<div id="avisoportada">
+					<div id="estructura"><:Aviso portada:></div>
+					<BOUCLE_avisos_superior(ARTICLES){lang?}{titre_mot=aviso portada} {par num titre}>
+						<B_muestradoc>
+							<BOUCLE_muestradoc(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        						<div class="avisossuperior">	
+									#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    							</div><!-- avisossuperior -->
+							</BOUCLE_muestradoc>
+						</B_muestradoc>
+							<div class="avisossuperior">	
+								[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{738,0}) ]
+							</div><!-- avisossuperior -->
+						<//B_muestradoc>     
+					</BOUCLE_avisos_superior> 
+					</div><!-- avisoportada -->
+    			</B_avisos_superior>
+
+		
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisoinferior.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisoinferior.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisoinferior.html	(revision 30)
@@ -0,0 +1,22 @@
+			<B_avisos>
+				<div id="estructura"><:Aviso Derecha:></div>
+			<BOUCLE_avisos(ARTICLES) {lang?}{titre_mot=aviso inferior} {par num titre}>
+				<B_muestraspots>
+				<BOUCLE_muestraspots(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        			<div class="avisosderecha">	
+					#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    				</div><!-- avisosderecha -->
+				</BOUCLE_muestraspots>
+				</B_muestraspots>
+					
+					<div class="avisosderecha">	
+						
+						
+						<!--[(#LOGO_ARTICLE|#URL_SITE|sinon{<a href="#URL_SITE" title="#NOM_SITE">[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{120,0}) ]-->
+						
+						[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{180,0}) ]
+						
+					</div><!-- avisosderecha -->
+				<//B_muestraspots>     
+    		</BOUCLE_avisos> 
+    		</B_avisos>
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisos.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisos.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisos.html	(revision 30)
@@ -0,0 +1,6 @@
+ 	<INCLURE{fond=inc/inc-avisosuperior}{lang}>
+			  	<INCLURE{fond=inc/inc-menu-secundario}{lang}>
+				
+  				<INCLURE{fond=inc/inc-destacadalateral}{lang}>
+				<!--<INCLURE{fond=inc/inc-agenda-plugin}{lang}>-->
+    			<INCLURE{fond=inc/inc-avisoinferior}{lang}>
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisosuperior.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisosuperior.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-avisosuperior.html	(revision 30)
@@ -0,0 +1,22 @@
+			<B_avisos>
+				<div id="estructura"><:Aviso Derecha:></div>
+			<BOUCLE_avisos(ARTICLES) {lang?}{titre_mot=aviso superior} {par num titre}>
+				<B_muestraspots>
+				<BOUCLE_muestraspots(DOCUMENTS){id_article}{par num titre}>                   <!-- selecciona los documentos en el articulos --> 
+        			<div class="avisosderecha">	
+					#EMBED_DOCUMENT                                                          <!-- Inserta el documento en este caso FLASH en la pagina -->  
+    				</div><!-- avisosderecha -->
+				</BOUCLE_muestraspots>
+				</B_muestraspots>
+					
+					<div class="avisosderecha">	
+						
+						
+						<!--[(#LOGO_ARTICLE|#URL_SITE|sinon{<a href="#URL_SITE" title="#NOM_SITE">[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{120,0}) ]-->
+						
+						[(#LOGO_ARTICLE|#URL_ARTICLE|sinon{<a href="#URL_ARTICLE" >[<div class="subtituloaviso">#SURTITRE</div><div class="tituloaviso">(#TITRE|supprimer_numero)</div>]</a>}|reduire_image{180,0}) ]
+						
+					</div><!-- avisosderecha -->
+				<//B_muestraspots>     
+    		</BOUCLE_avisos> 
+    		</B_avisos>
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-menu-principal.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-menu-principal.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-menu-principal.html	(revision 30)
@@ -0,0 +1,43 @@
+[(#REM)
+	Barre de navigation, ouverte sur la hierarchie courante
+
+	On fait un plan, et, quand on avance vers une rubrique,
+	on l'affiche si son parent est expose ou est la racine du site. ]
+
+<div id="navegacion">
+
+<B_rubriques>
+
+<div id="menu">
+<div class="menu">
+
+	<ul>
+		<li>
+			<a href="#URL_SITE_SPIP/">Portada</a>
+		</li>
+	<BOUCLE_rubriques(RUBRIQUES) {racine} {titre_mot=menu principal}{par num titre, titre}>
+		<li>
+			<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+
+			<B_sous_rubriques>
+			<ul>
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<li><a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|couper{80})]</a><BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	</li>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			</ul>
+			</B_sous_rubriques>
+
+		</li>
+	</BOUCLE_rubriques>
+			
+	</ul>
+</div>
+</div>
+
+</B_rubriques>
+
+<div id="busqueda"><img src="#DOSSIER_SQUELETTE/../img/busqueda.gif" / align="left">
+		#FORMULAIRE_RECHERCHE
+		</div>
+		
+</div>		
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-nota-principal.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-nota-principal.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/inc/inc-nota-principal.html	(revision 30)
@@ -0,0 +1,22 @@
+<B_principal>
+<BOUCLE_principal(ARTICLES) {titre_mot=nota principal} {par date} {inverse}{0,1}{doublons}>
+	<div id="nota_principal">
+		<div class="volantadest1">
+			<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+
+[(#LOGO_DOCUMENT|right||image_reduire{160,0}|inserer_attribut{hspace,4}|inserer_attribut{vspace,4}|inserer_attribut{style,border:1px solid #000000})]
+                           		
+			</BOUCLE_foto>
+			<a href="#URL_ARTICLE">#SURTITRE
+		</div>
+		<h1>#TITRE</h1>
+		<div class="chapodest1">
+				 #CHAPO
+				<span class="vermas"> &gt; nota completa</span></a>
+		</div>
+	</div>
+</BOUCLE_principal>
+
+</B_principal>
+<INCLURE{fond=inc/inc-instalacion}{lang}>
+<//B_principal>
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/rubrique.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/rubrique.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/rubrique.html	(revision 30)
@@ -0,0 +1,214 @@
+<BOUCLE_rubrica(RUBRIQUES) {id_rubrique}>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+ 	<title>[(#NOM_SITE_SPIP)]</title>
+   	<INCLURE{fond=inc/inc-head}{lang}>	
+</head>
+
+<body>
+<div id="pagina">
+	<div id="cabeza"><INCLURE{fond=inc/inc-cabeza}{lang}>	</div>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+
+
+	<div id="cuerpo">
+	  <div id="estructura"></div>
+	  <div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+		<INCLURE{fond=inc/inc-menu-principal}{id_rubrique}{lang}>
+	  </div><!-- columnaizquierda -->
+		<div id="contenido"><div id="estructura">contenido</div>
+			<div id="avisoprincipal">
+			</div><!-- avisoprincipal -->
+			[(#REM) Fil d'Ariane ]
+	<div id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; (#TITRE|couper{80})]</div>
+
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+				<BOUCLE_squelette_rubrique1(MOTS){id_rubrique}{type=Esqueletos}{0,1}>
+					<INCLURE{fond=inc/inc-muestra-actividades}{id_rubrique}{lang}>
+				</BOUCLE_squelette_rubrique1>
+				<table border="0" cellspacing="0" cellpadding="0">
+
+  [<tr>
+    <td>
+	    <div class="notes">(#NOTES)</div>
+	    </td>
+  </tr>]
+	<B_docs>
+	<tr>
+    <td>
+	<!-- Documents liés -->
+	<div id="documents_boite">
+
+	<h3><:documents_boite_titre:></h3>
+	<BOUCLE_docs(DOCUMENTS){id_article}{mode=document}{doublons}> 
+	<dl class="document">
+		[<dt>(#LOGO_DOCUMENT|#URL_DOCUMENT)</dt>]
+		<dd><a href="#URL_DOCUMENT">
+		[<strong>(#TITRE)</strong><br />]
+		[(#DESCRIPTIF)<br />]
+		[[(#TAILLE|taille_en_octets)][<br />
+		(#LARGEUR) X] [(#HAUTEUR) pixels]]
+		</a></dd>
+	</dl>
+	</BOUCLE_docs>
+	</div>
+
+</td>
+    </tr>
+	</B_docs>
+
+</table>
+<BOUCLE_article_langue_TOP(ARTICLES) {id_rubrique}{titre_mot=destacada seccion} {par date} {inverse} {0,3}{doublons portada}>
+      					<div class="fotoportada">
+							[<div id="rubriqueportada">(#SURTITRE)</div>]
+							[(#LOGO_ARTICLE|left||reduire_image{192,0}|inserer_attribut{hspace,5})]
+										<BOUCLE_foto(DOCUMENTS){id_article}{mode=image}{0,1}>
+				<img src="#URL_DOCUMENT"  width="20%" hspace="4" vspace="4" alt="#TITRE" border="1" align="right" >
+			</BOUCLE_foto> 
+							
+								<h3>[(#TITRE|supprimer_numero)]</h3>
+      							[<div class="sous-titre">(#SOUSTITRE)</div>]
+	  							[<div class="texte">(#CHAPO)</div>] 
+								#TEXTE
+								
+						</div>
+					</BOUCLE_article_langue_TOP>
+					<br />
+    				</B_article_langue_TOP>
+	<div id="boite-srubrique-rubrique">
+    
+
+ 	<B_articles_rubriques>
+	
+    <!-- Les articles -->
+	
+			<BOUCLE_articles_rubriques(ARTICLES){id_rubrique}{par date}{inverse}{doublons portada}>
+   			<?php	$nombreArticle = "#TOTAL_BOUCLE"; ?>
+        	<table id="noticia"><tr><td>
+			<a href="#URL_ARTICLE">
+			[<b>(#SURTITRE)</b>]
+			[(#LOGO_ARTICLE|right||reduire_image{80,0}|inserer_attribut{hspace,5})]<h2>[(#TITRE|supprimer_numero)]</h2>
+				<BOUCLE_sivafecha(MOTS){id_rubrique}{titre=con fecha}>
+					<small>[(#DATE|nom_jour) ][(#DATE|affdate)]</small>
+				</BOUCLE_sivafecha>
+				<BOUCLE_sivaautor(MOTS){id_article}{titre=con autor}>
+					<small>[, <:par_auteur:> (#LESAUTEURS)]</small>
+				</BOUCLE_sivaautor>
+				[(#CHAPO)]
+				</a>
+			</td></tr></table>
+			</BOUCLE_articles_rubriques><br />
+      
+    <!-- Fin des articles -->
+ 	</B_articles_rubriques>
+	    <!-- Les sous-rubriques -->
+		
+    <!--<h3><:sousrubrique_recitfp:></h3>-->
+    <B_srubriques>
+	<div style="border-bottom:1px solid #0033CC; "></div>
+	Contenidos
+		<ul>
+			<BOUCLE_srubriques(RUBRIQUES){id_parent}{par num titre}>
+            <?php $nombreRubrique = "#TOTAL_BOUCLE"; ?>
+        	<li class="[(#COMPTEUR_BOUCLE|alterner{'pairs','impairs'})]"><a href="#URL_RUBRIQUE"><strong>[(#TITRE|supprimer_numero)]</strong><br />
+			[(#INTRODUCTION|couper{175})]</a></li>
+			</BOUCLE_srubriques><br />
+		</ul>
+    <!-- Fin des sous-rubriques -->
+	</B_srubriques>
+	</div>
+	<?php  if ($nombreRubrique + $nombreArticle == 0) { ?>
+	<style>#boite-srubrique-rubrique {display: none;}</style>
+	<?php } ?>
+			</div><!-- bloquearriba -->
+			
+			
+							<style type='text/css'>
+		td.occupe a {font-weight:bold;text-decoration:underline;}
+		td.horsperiode {color:#878787;font-size:.9em;}
+</style>
+
+			
+			<div id="bloquemedio">
+	
+				
+				
+				
+				<BOUCLE_masinfo(RUBRIQUES)>
+					<B_conclave>
+					[<div style="border-top:1px solid #0066CC; ">Información de (#_rubrica:TITRE|unique) en el sitio #NOM_SITE_SPIP</div>]
+						<div class="regional">
+						<img src="#URL_SITE_SPIP/#DOSSIER_SQUELETTE/img/boton.gif" /> 
+						[<a href="#URL_RUBRIQUE">(#TITRE|supprimer_numero)</a>] 
+						[ <span class="detalleregional"> -(#DESCRIPTIF)-</span>] 
+					</div>
+						<BOUCLE_conclave(ARTICLES){id_rubrique}{titre_mot=#_rubrica:TITRE} {par date}{inverse}>
+							<div class="tituloarticulo" style="font-size:85% "><a href="#URL_ARTICLE"><strong>[(#TITRE|supprimer_numero)]</strong></a>[ - (#DATE|nom_jour) ][(#DATE|affdate)]<br /></div>
+						</BOUCLE_conclave>
+					</B_conclave>	
+				</BOUCLE_masinfo>
+				
+				
+			</div><!-- bloquemedio -->
+			<div id="bloqueabajo"><div id="estructura">bloqueabajo</div>
+			[(#REM) Sites de la rubrique ]
+				<B_sites>
+				<div class="syndic" style="text-align:left ">
+					
+					
+						<BOUCLE_sites(SITES) {id_rubrique} {par nom_site}>
+						<table><tr><td>
+						<b>[(#LOGO_SITE|left||reduire_image{80,0}|inserer_attribut{hspace,5})]<a href="#URL_SITE">#NOM_SITE</a></b>
+							[<br />(#DESCRIPTIF)<br />]
+							<B_syndic>
+							Ultimas Noticias
+							<ul>
+								<BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,10}>
+								<li><a href="#URL_ARTICLE" class="spip_out">#TITRE</a></li>
+								
+								</BOUCLE_syndic>
+							</ul>
+							</B_syndic>
+						</td></tr></table>
+						</BOUCLE_sites>
+						
+						<B_sous_rubriques>
+			<ul>
+				
+				<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+					<li>
+						<div class='menuseccionesitem-sub#EXPOSE'>
+						<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|supprimer_numero|couper{80})]</a>
+						</div>
+						<BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
+					</li>
+				</B_test_expose></BOUCLE_sous_rubriques>
+			</ul>
+			</B_sous_rubriques>
+					
+				</div>
+				</B_sites>
+			</div>
+			
+
+			
+			
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+						 	<INCLURE{fond=inc/inc-avisos}{lang}>
+			
+
+		</div><!-- columnaderecha -->
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}> 
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
+</BOUCLE_rubrica>
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/sommaire.html
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/sommaire.html	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/sommaire.html	(revision 30)
@@ -0,0 +1,54 @@
+#CACHE{86400}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG">
+<head>
+  <title>[(#NOM_SITE_SPIP)]</title>
+
+	
+	<!-- Icono del Sitio para incluir en favoritos -->
+	<link rel="shortcut icon" type="image/gif" href="#DOSSIER_SQUELETTE/img/icon.gif" />
+	<INCLURE{fond=inc/inc-head}{lang}>	
+	
+</head>
+
+<body>
+<div id="pagina">
+	<INCLURE{fond=inc/inc-cabeza}{lang}>
+	<INCLURE{fond=inc/inc-barracabeza}{lang}>		
+	
+	<div id="cuerpo"><div id="estructura">cuerpo</div>
+	
+	<div id="columnaizquierda"><div id="estructura">columnaizquierda</div>
+	
+			<INCLURE{fond=inc/inc-menu-principal}{lang}>	
+		</div><!-- columnaizquierda -->
+		<INCLURE{fond=inc/inc-aviso-portada}{lang}>
+		<div id="contenido"><div id="estructura">contenido</div>
+		
+			
+			<div id="bloquearriba">
+				<div id="estructura"><:bloquearriba:></div>
+				<INCLURE{fond=inc/inc-nota-principal}{lang}>
+				<INCLURE{fond=inc/inc-nota-secundaria}{lang}>
+			</div><!-- bloquearriba -->
+			
+			<div id="bloqueabajo">
+				<div id="estructura">bloqueabajo</div>
+				<!--<INCLURE{fond=inc/inc-titulares}{lang}>-->	
+			</div><!-- bloqueabajo -->
+		</div><!-- contenido -->
+		<div id="columnaderecha">
+			<div id="estructura">columnaderecha</div>
+			 	<INCLURE{fond=inc/inc-avisos}{lang}>	
+			</div><!-- columnaderecha -->
+
+		
+  </div><!-- cuerpo -->
+  <INCLURE{fond=inc/inc-piegral}{lang}>	
+<!-- Formulario de administracion-->
+[(#FORMULAIRE_ADMIN)]		
+</div><!-- pagina -->
+
+</body>
+</html>
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/styles/personalizado.css
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/styles/personalizado.css	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/styles/personalizado.css	(revision 30)
@@ -0,0 +1,199 @@
+body{font-family:Helvetica, Arial,sans-serif; 
+font-size: 90%;
+/*background-image: url("../img/fondo.gif");*/ 
+margin: 0 ;
+text-align:center;}
+#columnaizquierda
+{
+/*border:1px solid #0066CC;*/
+text-align:left;
+width:778px;
+float:left;
+margin: 0px 0px 0px 0px;
+
+overflow:hidden;
+}
+#menusecciones{
+text-align:left;
+
+}
+.mostrar{display:none}
+.menuseccionesarriba{
+/*background-image: url("../img/secciones.gif");*/
+height:0px;
+background-repeat:no-repeat}
+.menuseccionesitem
+{
+text-align:center;
+width:110px;
+float:left;
+padding: 4px 0px 4px 0px;
+/*border-bottom: solid 1px #23475D;
+border-right: solid 1px #23475D;*/
+font-size:90%;
+background-repeat:repeat-y
+}
+* html .menuseccionesitem	/* selecteur reconnu seulement par IE (Win et Mac)*/
+{
+/*margin-top:-3px*/
+}
+.menuseccionesitem a , .menuseccionesitem a:visited
+{
+color:#ff9900;
+font-weight: bold;
+}
+.pico{margin: -2px 0px 0px -14px;
+position:relative;
+}
+.menuseccionesitem:hover{
+color:#023568}
+
+.menuseccionesitemon
+{
+text-align:center;
+width:110px;
+float:left;
+padding: 4px 0px 4px 0px;
+/*border-bottom: solid 1px #23475D;
+border-right: solid 1px #23475D;*/
+font-size:90%;
+background-color:#ccc;
+background-repeat:repeat-y
+}
+
+a.on, a:visited.on{color:#FFFFff;font-weight: bold;}
+.menuseccionesitem-sub a , .menuseccionesitem-sub a:visited 
+{
+color:#cccccc;
+font-weight: bold;
+}
+.menuseccionesitem-sub
+{
+/*background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;*/
+padding: 4px 10px 4px 20px;
+border-bottom: solid 1px #23475D;
+border-right: solid 1px #23475D;
+font-size:80%;
+/*background-color:#B7D8DA;*/
+}
+
+.menuseccionesitem-subon
+{
+/*background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;*/
+padding: 4px 10px 4px 20px;
+/*border-bottom: solid 1px #23475D;*/
+border-right: solid 1px #23475D;
+font-size:80%;
+/*
+background-color:#B7D8DA;*/
+}
+.menuseccionesitem-subon ul li .menuseccionesitem-sub{
+position:relative;
+background-image: url("../img/bordemenusubsub1.gif");
+background-repeat:repeat-y;
+padding-left:25px;
+margin-right:-11px;
+margin-left:-20px;
+font-weight: bold;
+margin-top:2px;
+border-top: solid 1px #23475D;}
+
+.menuseccionesitem-subon ul li .menuseccionesitem-subon{
+position:relative;
+background-image: url("../img/bordemenusubsub1.gif");
+background-repeat:repeat-y;
+padding-left:25px;
+margin-right:-11px;
+margin-left:-20px;
+font-weight: bold;
+margin-top:2px;
+border-top: solid 1px #23475D;}
+
+.articuloson ul li .menuarticuloitem{
+background-image: url("../img/bordemenusub1.gif");
+background-repeat:repeat-y;
+padding: 4px 10px 4px 20px;
+border-bottom: solid 1px #23475D;
+border-right: solid 1px #23475D;
+font-size:80%;
+
+background-color:#B7D8DA;
+}
+.articulos ul li .menuarticuloitem{
+display:none
+}
+
+.lienon {color:blue}
+* html .menuseccionesitem-sub	/* selecteur reconnu seulement par IE (Win et Mac)*/
+{
+/*margin-top:-3px*/;
+}
+
+.menuseccionesitem-sub:hover{
+color:#023568;
+}
+
+
+.menuseccionesabajo{
+
+height:13px;
+background-repeat:no-repeat;
+
+}
+#avisoportada
+{
+
+}
+#columnaderecha{width:180px}
+#contenido {padding:15px;
+width:568px;}
+.avisosderecha
+{
+border-bottom:1px solid #0066CC;
+margin: 0px 0px 0px 0px;
+padding: 0px 0px 0px 0px;
+font-size: 80%
+}
+.volantadest1 a{
+color:#000000;
+font-size:130%;
+
+}
+.chapodest1 a{color:#000000;
+font-size:120%}
+#cuerpo
+{
+background-image: url("");
+
+float:left;
+background-repeat:repeat-y;
+border:1px solid #000000;
+}
+.chapo {font-weight: bold;}
+#hierarchie{margin-bottom:15px}
+h2, h1{margin-bottom:3px;
+margin-top:3px}
+#noticia{padding-bottom:10px;
+border-bottom:1px solid #0066CC;
+margin-bottom:10px}
+.menu { background-image: url("../img/fondomenu.gif"); background-repeat: repeat-x;; text-align: center; margin: 0; padding: 0; width: 535px; height: 25px; float: left }
+.menu ul{ font-size:70%;font-weight: bold;margin: 0;padding: 0;list-style-type: none;}
+.menu ul li{display: inline;}
+.menu ul li a{text-decoration: none;padding: 5px;color: #94d8fb; border-right: 1px solid #FFFFFF;line-height:25px; } 
+.menu ul li a:hover, .menu ul li a:focus{color: #FFCC66;}
+.menu ::-moz-selection{color:#FDEFD5;}
+.menu ::selection {color:#FDEFD5;}
+#navegacion { width: 780px; height: 25px }
+* html #navegacion  {margin-top:-4px }	
+#menu{542px;
+float:left;
+font-size:120%}
+#busqueda{
+width:240px;
+float:left;
+background-image: url("../img/fondobusqueda.gif"); background-repeat: repeat-x;
+vertical-align:middle;
+text-align:center;
+height:25px}
Index: /trunk/spip/esqueleto-redcta/themes/volveareparto/theme.xml
===================================================================
--- /trunk/spip/esqueleto-redcta/themes/volveareparto/theme.xml	(revision 30)
+++ /trunk/spip/esqueleto-redcta/themes/volveareparto/theme.xml	(revision 30)
@@ -0,0 +1,22 @@
+<theme>
+  <nom>redcta - &#192; volveareparto</nom>
+  <auteur>
+    [redCTA->http://www.redcta.org.ar] - &#169; 2006 - Licence GNU/GPL   
+  </auteur>
+  <version>1.0</version>
+  <etat>test</etat>
+  <type>themes</type>
+  <squelettes>redcta</squelettes>
+  <description>
+    <multi>
+		 [es]
+	  Seleccionar esta plantilla para que sea la plantilla por default. 	
+       [en]
+	  Select this template to make it the default template of your site.
+      [fe]
+      S&#233;lectionner ce squelette pour l'activer comme squelette par d&#233;faut de votre site.
+    </multi>
+  </description>
+  <lien>[redcta->www.redcta.org.ar]</lien>
+
+</theme>
