Index: /plugins/agenda/1_9_0/agenda.php
===================================================================
--- /plugins/agenda/1_9_0/agenda.php	(revision 10)
+++ /plugins/agenda/1_9_0/agenda.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/agenda_jour.html
===================================================================
--- /plugins/agenda/1_9_0/agenda_jour.html	(revision 10)
+++ /plugins/agenda/1_9_0/agenda_jour.html	(revision 10)
@@ -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: /plugins/agenda/1_9_0/agenda_mes_fonctions.php
===================================================================
--- /plugins/agenda/1_9_0/agenda_mes_fonctions.php	(revision 10)
+++ /plugins/agenda/1_9_0/agenda_mes_fonctions.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/agenda_mes_options.php
===================================================================
--- /plugins/agenda/1_9_0/agenda_mes_options.php	(revision 10)
+++ /plugins/agenda/1_9_0/agenda_mes_options.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/agenda_mois.html
===================================================================
--- /plugins/agenda/1_9_0/agenda_mois.html	(revision 10)
+++ /plugins/agenda/1_9_0/agenda_mois.html	(revision 10)
@@ -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: /plugins/agenda/1_9_0/agenda_periode.html
===================================================================
--- /plugins/agenda/1_9_0/agenda_periode.html	(revision 10)
+++ /plugins/agenda/1_9_0/agenda_periode.html	(revision 10)
@@ -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: /plugins/agenda/1_9_0/agenda_semaine.html
===================================================================
--- /plugins/agenda/1_9_0/agenda_semaine.html	(revision 10)
+++ /plugins/agenda/1_9_0/agenda_semaine.html	(revision 10)
@@ -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: /plugins/agenda/1_9_0/balise/calendrier_mini.php
===================================================================
--- /plugins/agenda/1_9_0/balise/calendrier_mini.php	(revision 10)
+++ /plugins/agenda/1_9_0/balise/calendrier_mini.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/balise/formulaire_edition_evenement.php
===================================================================
--- /plugins/agenda/1_9_0/balise/formulaire_edition_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_0/balise/formulaire_edition_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/base/agenda_evenements.php
===================================================================
--- /plugins/agenda/1_9_0/base/agenda_evenements.php	(revision 10)
+++ /plugins/agenda/1_9_0/base/agenda_evenements.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/demo_calendrier_mini.html
===================================================================
--- /plugins/agenda/1_9_0/demo_calendrier_mini.html	(revision 10)
+++ /plugins/agenda/1_9_0/demo_calendrier_mini.html	(revision 10)
@@ -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: /plugins/agenda/1_9_0/exec/agenda_evenements.php
===================================================================
--- /plugins/agenda/1_9_0/exec/agenda_evenements.php	(revision 10)
+++ /plugins/agenda/1_9_0/exec/agenda_evenements.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/exec/articles.php.sav
===================================================================
--- /plugins/agenda/1_9_0/exec/articles.php.sav	(revision 10)
+++ /plugins/agenda/1_9_0/exec/articles.php.sav	(revision 10)
@@ -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: /plugins/agenda/1_9_0/exec/mots_tous.php
===================================================================
--- /plugins/agenda/1_9_0/exec/mots_tous.php	(revision 10)
+++ /plugins/agenda/1_9_0/exec/mots_tous.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/exec/mots_type.php
===================================================================
--- /plugins/agenda/1_9_0/exec/mots_type.php	(revision 10)
+++ /plugins/agenda/1_9_0/exec/mots_type.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/formulaires/calendrier_mini.html
===================================================================
--- /plugins/agenda/1_9_0/formulaires/calendrier_mini.html	(revision 10)
+++ /plugins/agenda/1_9_0/formulaires/calendrier_mini.html	(revision 10)
@@ -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: /plugins/agenda/1_9_0/formulaires/formulaire_edition_evenement.html
===================================================================
--- /plugins/agenda/1_9_0/formulaires/formulaire_edition_evenement.html	(revision 10)
+++ /plugins/agenda/1_9_0/formulaires/formulaire_edition_evenement.html	(revision 10)
@@ -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: /plugins/agenda/1_9_0/ical-agenda.html
===================================================================
--- /plugins/agenda/1_9_0/ical-agenda.html	(revision 10)
+++ /plugins/agenda/1_9_0/ical-agenda.html	(revision 10)
@@ -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: /plugins/agenda/1_9_0/img_pack/agenda.css
===================================================================
--- /plugins/agenda/1_9_0/img_pack/agenda.css	(revision 10)
+++ /plugins/agenda/1_9_0/img_pack/agenda.css	(revision 10)
@@ -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: /plugins/agenda/1_9_0/img_pack/agenda_articles.css
===================================================================
--- /plugins/agenda/1_9_0/img_pack/agenda_articles.css	(revision 10)
+++ /plugins/agenda/1_9_0/img_pack/agenda_articles.css	(revision 10)
@@ -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: /plugins/agenda/1_9_0/img_pack/calendrier.css
===================================================================
--- /plugins/agenda/1_9_0/img_pack/calendrier.css	(revision 10)
+++ /plugins/agenda/1_9_0/img_pack/calendrier.css	(revision 10)
@@ -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: /plugins/agenda/1_9_0/img_pack/multiselect.js
===================================================================
--- /plugins/agenda/1_9_0/img_pack/multiselect.js	(revision 10)
+++ /plugins/agenda/1_9_0/img_pack/multiselect.js	(revision 10)
@@ -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: /plugins/agenda/1_9_0/inc/agenda.php.sav
===================================================================
--- /plugins/agenda/1_9_0/inc/agenda.php.sav	(revision 10)
+++ /plugins/agenda/1_9_0/inc/agenda.php.sav	(revision 10)
@@ -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: /plugins/agenda/1_9_0/inc/agenda_filtres.php
===================================================================
--- /plugins/agenda/1_9_0/inc/agenda_filtres.php	(revision 10)
+++ /plugins/agenda/1_9_0/inc/agenda_filtres.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/inc/agenda_gestion.php
===================================================================
--- /plugins/agenda/1_9_0/inc/agenda_gestion.php	(revision 10)
+++ /plugins/agenda/1_9_0/inc/agenda_gestion.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/lang/agenda_es.php
===================================================================
--- /plugins/agenda/1_9_0/lang/agenda_es.php	(revision 10)
+++ /plugins/agenda/1_9_0/lang/agenda_es.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/lang/agenda_fr.php
===================================================================
--- /plugins/agenda/1_9_0/lang/agenda_fr.php	(revision 10)
+++ /plugins/agenda/1_9_0/lang/agenda_fr.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/lang/agenda_nl.php
===================================================================
--- /plugins/agenda/1_9_0/lang/agenda_nl.php	(revision 10)
+++ /plugins/agenda/1_9_0/lang/agenda_nl.php	(revision 10)
@@ -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: /plugins/agenda/1_9_0/plugin.xml
===================================================================
--- /plugins/agenda/1_9_0/plugin.xml	(revision 10)
+++ /plugins/agenda/1_9_0/plugin.xml	(revision 10)
@@ -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: /plugins/agenda/1_9_0/public/criteres_agenda.php
===================================================================
--- /plugins/agenda/1_9_0/public/criteres_agenda.php	(revision 10)
+++ /plugins/agenda/1_9_0/public/criteres_agenda.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/agenda.php
===================================================================
--- /plugins/agenda/1_9_1/agenda.php	(revision 10)
+++ /plugins/agenda/1_9_1/agenda.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/agenda_jour.html
===================================================================
--- /plugins/agenda/1_9_1/agenda_jour.html	(revision 10)
+++ /plugins/agenda/1_9_1/agenda_jour.html	(revision 10)
@@ -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: /plugins/agenda/1_9_1/agenda_mes_fonctions.php
===================================================================
--- /plugins/agenda/1_9_1/agenda_mes_fonctions.php	(revision 10)
+++ /plugins/agenda/1_9_1/agenda_mes_fonctions.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/agenda_mes_options.php
===================================================================
--- /plugins/agenda/1_9_1/agenda_mes_options.php	(revision 10)
+++ /plugins/agenda/1_9_1/agenda_mes_options.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/agenda_mois.html
===================================================================
--- /plugins/agenda/1_9_1/agenda_mois.html	(revision 10)
+++ /plugins/agenda/1_9_1/agenda_mois.html	(revision 10)
@@ -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: /plugins/agenda/1_9_1/agenda_periode.html
===================================================================
--- /plugins/agenda/1_9_1/agenda_periode.html	(revision 10)
+++ /plugins/agenda/1_9_1/agenda_periode.html	(revision 10)
@@ -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: /plugins/agenda/1_9_1/agenda_semaine.html
===================================================================
--- /plugins/agenda/1_9_1/agenda_semaine.html	(revision 10)
+++ /plugins/agenda/1_9_1/agenda_semaine.html	(revision 10)
@@ -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: /plugins/agenda/1_9_1/balise/calendrier_mini.php
===================================================================
--- /plugins/agenda/1_9_1/balise/calendrier_mini.php	(revision 10)
+++ /plugins/agenda/1_9_1/balise/calendrier_mini.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/balise/formulaire_edition_evenement.php
===================================================================
--- /plugins/agenda/1_9_1/balise/formulaire_edition_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_1/balise/formulaire_edition_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/base/agenda_evenements.php
===================================================================
--- /plugins/agenda/1_9_1/base/agenda_evenements.php	(revision 10)
+++ /plugins/agenda/1_9_1/base/agenda_evenements.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/demo_calendrier_mini.html
===================================================================
--- /plugins/agenda/1_9_1/demo_calendrier_mini.html	(revision 10)
+++ /plugins/agenda/1_9_1/demo_calendrier_mini.html	(revision 10)
@@ -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: /plugins/agenda/1_9_1/exec/agenda_evenements.php
===================================================================
--- /plugins/agenda/1_9_1/exec/agenda_evenements.php	(revision 10)
+++ /plugins/agenda/1_9_1/exec/agenda_evenements.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/exec/mots_tous.php
===================================================================
--- /plugins/agenda/1_9_1/exec/mots_tous.php	(revision 10)
+++ /plugins/agenda/1_9_1/exec/mots_tous.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/exec/mots_type.php
===================================================================
--- /plugins/agenda/1_9_1/exec/mots_type.php	(revision 10)
+++ /plugins/agenda/1_9_1/exec/mots_type.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/formulaires/calendrier_mini.html
===================================================================
--- /plugins/agenda/1_9_1/formulaires/calendrier_mini.html	(revision 10)
+++ /plugins/agenda/1_9_1/formulaires/calendrier_mini.html	(revision 10)
@@ -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: /plugins/agenda/1_9_1/formulaires/formulaire_edition_evenement.html
===================================================================
--- /plugins/agenda/1_9_1/formulaires/formulaire_edition_evenement.html	(revision 10)
+++ /plugins/agenda/1_9_1/formulaires/formulaire_edition_evenement.html	(revision 10)
@@ -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: /plugins/agenda/1_9_1/ical-agenda.html
===================================================================
--- /plugins/agenda/1_9_1/ical-agenda.html	(revision 10)
+++ /plugins/agenda/1_9_1/ical-agenda.html	(revision 10)
@@ -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: /plugins/agenda/1_9_1/img_pack/agenda.css
===================================================================
--- /plugins/agenda/1_9_1/img_pack/agenda.css	(revision 10)
+++ /plugins/agenda/1_9_1/img_pack/agenda.css	(revision 10)
@@ -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: /plugins/agenda/1_9_1/img_pack/agenda_articles.css
===================================================================
--- /plugins/agenda/1_9_1/img_pack/agenda_articles.css	(revision 10)
+++ /plugins/agenda/1_9_1/img_pack/agenda_articles.css	(revision 10)
@@ -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: /plugins/agenda/1_9_1/img_pack/calendrier.css
===================================================================
--- /plugins/agenda/1_9_1/img_pack/calendrier.css	(revision 10)
+++ /plugins/agenda/1_9_1/img_pack/calendrier.css	(revision 10)
@@ -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: /plugins/agenda/1_9_1/img_pack/multiselect.js
===================================================================
--- /plugins/agenda/1_9_1/img_pack/multiselect.js	(revision 10)
+++ /plugins/agenda/1_9_1/img_pack/multiselect.js	(revision 10)
@@ -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: /plugins/agenda/1_9_1/inc/agenda.php.sav
===================================================================
--- /plugins/agenda/1_9_1/inc/agenda.php.sav	(revision 10)
+++ /plugins/agenda/1_9_1/inc/agenda.php.sav	(revision 10)
@@ -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: /plugins/agenda/1_9_1/inc/agenda_filtres.php
===================================================================
--- /plugins/agenda/1_9_1/inc/agenda_filtres.php	(revision 10)
+++ /plugins/agenda/1_9_1/inc/agenda_filtres.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/inc/agenda_gestion.php
===================================================================
--- /plugins/agenda/1_9_1/inc/agenda_gestion.php	(revision 10)
+++ /plugins/agenda/1_9_1/inc/agenda_gestion.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/lang/agenda_en.php
===================================================================
--- /plugins/agenda/1_9_1/lang/agenda_en.php	(revision 10)
+++ /plugins/agenda/1_9_1/lang/agenda_en.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/lang/agenda_es.php
===================================================================
--- /plugins/agenda/1_9_1/lang/agenda_es.php	(revision 10)
+++ /plugins/agenda/1_9_1/lang/agenda_es.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/lang/agenda_fr.php
===================================================================
--- /plugins/agenda/1_9_1/lang/agenda_fr.php	(revision 10)
+++ /plugins/agenda/1_9_1/lang/agenda_fr.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/lang/agenda_nl.php
===================================================================
--- /plugins/agenda/1_9_1/lang/agenda_nl.php	(revision 10)
+++ /plugins/agenda/1_9_1/lang/agenda_nl.php	(revision 10)
@@ -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: /plugins/agenda/1_9_1/plugin.xml
===================================================================
--- /plugins/agenda/1_9_1/plugin.xml	(revision 10)
+++ /plugins/agenda/1_9_1/plugin.xml	(revision 10)
@@ -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: /plugins/agenda/1_9_1/public/criteres_agenda.php
===================================================================
--- /plugins/agenda/1_9_1/public/criteres_agenda.php	(revision 10)
+++ /plugins/agenda/1_9_1/public/criteres_agenda.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/action/editer_evenement.php
===================================================================
--- /plugins/agenda/1_9_2/action/editer_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_2/action/editer_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/action/instituer_groupe_mots.php
===================================================================
--- /plugins/agenda/1_9_2/action/instituer_groupe_mots.php	(revision 10)
+++ /plugins/agenda/1_9_2/action/instituer_groupe_mots.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/action/voir_evenement.php
===================================================================
--- /plugins/agenda/1_9_2/action/voir_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_2/action/voir_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/agenda.php
===================================================================
--- /plugins/agenda/1_9_2/agenda.php	(revision 10)
+++ /plugins/agenda/1_9_2/agenda.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/agenda_jour.html
===================================================================
--- /plugins/agenda/1_9_2/agenda_jour.html	(revision 10)
+++ /plugins/agenda/1_9_2/agenda_jour.html	(revision 10)
@@ -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: /plugins/agenda/1_9_2/agenda_mes_fonctions.php
===================================================================
--- /plugins/agenda/1_9_2/agenda_mes_fonctions.php	(revision 10)
+++ /plugins/agenda/1_9_2/agenda_mes_fonctions.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/agenda_mes_options.php
===================================================================
--- /plugins/agenda/1_9_2/agenda_mes_options.php	(revision 10)
+++ /plugins/agenda/1_9_2/agenda_mes_options.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/agenda_mois.html
===================================================================
--- /plugins/agenda/1_9_2/agenda_mois.html	(revision 10)
+++ /plugins/agenda/1_9_2/agenda_mois.html	(revision 10)
@@ -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: /plugins/agenda/1_9_2/agenda_periode.html
===================================================================
--- /plugins/agenda/1_9_2/agenda_periode.html	(revision 10)
+++ /plugins/agenda/1_9_2/agenda_periode.html	(revision 10)
@@ -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: /plugins/agenda/1_9_2/agenda_semaine.html
===================================================================
--- /plugins/agenda/1_9_2/agenda_semaine.html	(revision 10)
+++ /plugins/agenda/1_9_2/agenda_semaine.html	(revision 10)
@@ -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: /plugins/agenda/1_9_2/balise/calendrier_mini.php
===================================================================
--- /plugins/agenda/1_9_2/balise/calendrier_mini.php	(revision 10)
+++ /plugins/agenda/1_9_2/balise/calendrier_mini.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/balise/formulaire_edition_evenement.php
===================================================================
--- /plugins/agenda/1_9_2/balise/formulaire_edition_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_2/balise/formulaire_edition_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/base/agenda_evenements.php
===================================================================
--- /plugins/agenda/1_9_2/base/agenda_evenements.php	(revision 10)
+++ /plugins/agenda/1_9_2/base/agenda_evenements.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/base/agenda_upgrade.php
===================================================================
--- /plugins/agenda/1_9_2/base/agenda_upgrade.php	(revision 10)
+++ /plugins/agenda/1_9_2/base/agenda_upgrade.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/demo_calendrier_mini.html
===================================================================
--- /plugins/agenda/1_9_2/demo_calendrier_mini.html	(revision 10)
+++ /plugins/agenda/1_9_2/demo_calendrier_mini.html	(revision 10)
@@ -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: /plugins/agenda/1_9_2/exec/agenda_evenements.php
===================================================================
--- /plugins/agenda/1_9_2/exec/agenda_evenements.php	(revision 10)
+++ /plugins/agenda/1_9_2/exec/agenda_evenements.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/exec/editer_evenement.php
===================================================================
--- /plugins/agenda/1_9_2/exec/editer_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_2/exec/editer_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/exec/mots_tous.php
===================================================================
--- /plugins/agenda/1_9_2/exec/mots_tous.php	(revision 10)
+++ /plugins/agenda/1_9_2/exec/mots_tous.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/exec/mots_type.php
===================================================================
--- /plugins/agenda/1_9_2/exec/mots_type.php	(revision 10)
+++ /plugins/agenda/1_9_2/exec/mots_type.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/exec/voir_agenda.php
===================================================================
--- /plugins/agenda/1_9_2/exec/voir_agenda.php	(revision 10)
+++ /plugins/agenda/1_9_2/exec/voir_agenda.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/exec/voir_evenement.php
===================================================================
--- /plugins/agenda/1_9_2/exec/voir_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_2/exec/voir_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/formulaires/calendrier_mini.html
===================================================================
--- /plugins/agenda/1_9_2/formulaires/calendrier_mini.html	(revision 10)
+++ /plugins/agenda/1_9_2/formulaires/calendrier_mini.html	(revision 10)
@@ -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: /plugins/agenda/1_9_2/formulaires/formulaire_edition_evenement.html
===================================================================
--- /plugins/agenda/1_9_2/formulaires/formulaire_edition_evenement.html	(revision 10)
+++ /plugins/agenda/1_9_2/formulaires/formulaire_edition_evenement.html	(revision 10)
@@ -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: /plugins/agenda/1_9_2/ical-agenda.html
===================================================================
--- /plugins/agenda/1_9_2/ical-agenda.html	(revision 10)
+++ /plugins/agenda/1_9_2/ical-agenda.html	(revision 10)
@@ -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: /plugins/agenda/1_9_2/img_pack/agenda.css
===================================================================
--- /plugins/agenda/1_9_2/img_pack/agenda.css	(revision 10)
+++ /plugins/agenda/1_9_2/img_pack/agenda.css	(revision 10)
@@ -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: /plugins/agenda/1_9_2/img_pack/agenda_articles.css
===================================================================
--- /plugins/agenda/1_9_2/img_pack/agenda_articles.css	(revision 10)
+++ /plugins/agenda/1_9_2/img_pack/agenda_articles.css	(revision 10)
@@ -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: /plugins/agenda/1_9_2/img_pack/calendrier.css
===================================================================
--- /plugins/agenda/1_9_2/img_pack/calendrier.css	(revision 10)
+++ /plugins/agenda/1_9_2/img_pack/calendrier.css	(revision 10)
@@ -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: /plugins/agenda/1_9_2/img_pack/multiselect.js
===================================================================
--- /plugins/agenda/1_9_2/img_pack/multiselect.js	(revision 10)
+++ /plugins/agenda/1_9_2/img_pack/multiselect.js	(revision 10)
@@ -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: /plugins/agenda/1_9_2/inc/agenda.php.sav
===================================================================
--- /plugins/agenda/1_9_2/inc/agenda.php.sav	(revision 10)
+++ /plugins/agenda/1_9_2/inc/agenda.php.sav	(revision 10)
@@ -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: /plugins/agenda/1_9_2/inc/agenda_filtres.php
===================================================================
--- /plugins/agenda/1_9_2/inc/agenda_filtres.php	(revision 10)
+++ /plugins/agenda/1_9_2/inc/agenda_filtres.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/inc/agenda_gestion.php
===================================================================
--- /plugins/agenda/1_9_2/inc/agenda_gestion.php	(revision 10)
+++ /plugins/agenda/1_9_2/inc/agenda_gestion.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/inc/agenda_saisie_rapide.php
===================================================================
--- /plugins/agenda/1_9_2/inc/agenda_saisie_rapide.php	(revision 10)
+++ /plugins/agenda/1_9_2/inc/agenda_saisie_rapide.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/inc/editer_evenement.php
===================================================================
--- /plugins/agenda/1_9_2/inc/editer_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_2/inc/editer_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/inc/voir_agenda.php
===================================================================
--- /plugins/agenda/1_9_2/inc/voir_agenda.php	(revision 10)
+++ /plugins/agenda/1_9_2/inc/voir_agenda.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/inc/voir_evenement.php
===================================================================
--- /plugins/agenda/1_9_2/inc/voir_evenement.php	(revision 10)
+++ /plugins/agenda/1_9_2/inc/voir_evenement.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/lang/agenda_de.php
===================================================================
--- /plugins/agenda/1_9_2/lang/agenda_de.php	(revision 10)
+++ /plugins/agenda/1_9_2/lang/agenda_de.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/lang/agenda_en.php
===================================================================
--- /plugins/agenda/1_9_2/lang/agenda_en.php	(revision 10)
+++ /plugins/agenda/1_9_2/lang/agenda_en.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/lang/agenda_es.php
===================================================================
--- /plugins/agenda/1_9_2/lang/agenda_es.php	(revision 10)
+++ /plugins/agenda/1_9_2/lang/agenda_es.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/lang/agenda_fr.php
===================================================================
--- /plugins/agenda/1_9_2/lang/agenda_fr.php	(revision 10)
+++ /plugins/agenda/1_9_2/lang/agenda_fr.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/lang/agenda_nl.php
===================================================================
--- /plugins/agenda/1_9_2/lang/agenda_nl.php	(revision 10)
+++ /plugins/agenda/1_9_2/lang/agenda_nl.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/lang/saisierapide_fr.php
===================================================================
--- /plugins/agenda/1_9_2/lang/saisierapide_fr.php	(revision 10)
+++ /plugins/agenda/1_9_2/lang/saisierapide_fr.php	(revision 10)
@@ -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: /plugins/agenda/1_9_2/plugin.xml
===================================================================
--- /plugins/agenda/1_9_2/plugin.xml	(revision 10)
+++ /plugins/agenda/1_9_2/plugin.xml	(revision 10)
@@ -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: /plugins/agenda/1_9_2/public/criteres_agenda.php
===================================================================
--- /plugins/agenda/1_9_2/public/criteres_agenda.php	(revision 10)
+++ /plugins/agenda/1_9_2/public/criteres_agenda.php	(revision 10)
@@ -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: /plugins/article_pdf/Code SPIP Demo/Code.txt
===================================================================
--- /plugins/article_pdf/Code SPIP Demo/Code.txt	(revision 10)
+++ /plugins/article_pdf/Code SPIP Demo/Code.txt	(revision 10)
@@ -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: /plugins/article_pdf/article_pdf.html
===================================================================
--- /plugins/article_pdf/article_pdf.html	(revision 10)
+++ /plugins/article_pdf/article_pdf.html	(revision 10)
@@ -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: /plugins/article_pdf/article_pdf_mes_fonctions.php
===================================================================
--- /plugins/article_pdf/article_pdf_mes_fonctions.php	(revision 10)
+++ /plugins/article_pdf/article_pdf_mes_fonctions.php	(revision 10)
@@ -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: /plugins/article_pdf/article_pdf_mes_options.php
===================================================================
--- /plugins/article_pdf/article_pdf_mes_options.php	(revision 10)
+++ /plugins/article_pdf/article_pdf_mes_options.php	(revision 10)
@@ -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: /plugins/article_pdf/lang/articlepdf_fr.php
===================================================================
--- /plugins/article_pdf/lang/articlepdf_fr.php	(revision 10)
+++ /plugins/article_pdf/lang/articlepdf_fr.php	(revision 10)
@@ -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: /plugins/article_pdf/modeles/article_pdf.html
===================================================================
--- /plugins/article_pdf/modeles/article_pdf.html	(revision 10)
+++ /plugins/article_pdf/modeles/article_pdf.html	(revision 10)
@@ -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: /plugins/article_pdf/pdf/GifSplit.class.php
===================================================================
--- /plugins/article_pdf/pdf/GifSplit.class.php	(revision 10)
+++ /plugins/article_pdf/pdf/GifSplit.class.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/courier.php
===================================================================
--- /plugins/article_pdf/pdf/font/courier.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/courier.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/helvetica.php
===================================================================
--- /plugins/article_pdf/pdf/font/helvetica.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/helvetica.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/helveticab.php
===================================================================
--- /plugins/article_pdf/pdf/font/helveticab.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/helveticab.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/helveticabi.php
===================================================================
--- /plugins/article_pdf/pdf/font/helveticabi.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/helveticabi.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/helveticai.php
===================================================================
--- /plugins/article_pdf/pdf/font/helveticai.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/helveticai.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp1250.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp1250.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp1250.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp1251.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp1251.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp1251.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp1252.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp1252.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp1252.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp1253.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp1253.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp1253.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp1254.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp1254.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp1254.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp1255.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp1255.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp1255.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp1257.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp1257.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp1257.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp1258.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp1258.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp1258.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/cp874.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/cp874.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/cp874.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-1.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-1.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-1.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-11.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-11.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-11.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-15.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-15.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-15.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-16.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-16.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-16.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-2.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-2.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-2.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-4.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-4.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-4.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-5.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-5.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-5.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-7.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-7.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-7.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/iso-8859-9.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/iso-8859-9.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/iso-8859-9.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/koi8-r.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/koi8-r.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/koi8-r.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/koi8-u.map
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/koi8-u.map	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/koi8-u.map	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/makefont/makefont.php
===================================================================
--- /plugins/article_pdf/pdf/font/makefont/makefont.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/makefont/makefont.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/symbol.php
===================================================================
--- /plugins/article_pdf/pdf/font/symbol.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/symbol.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/times.php
===================================================================
--- /plugins/article_pdf/pdf/font/times.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/times.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/timesb.php
===================================================================
--- /plugins/article_pdf/pdf/font/timesb.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/timesb.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/timesbi.php
===================================================================
--- /plugins/article_pdf/pdf/font/timesbi.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/timesbi.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/timesi.php
===================================================================
--- /plugins/article_pdf/pdf/font/timesi.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/timesi.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/font/zapfdingbats.php
===================================================================
--- /plugins/article_pdf/pdf/font/zapfdingbats.php	(revision 10)
+++ /plugins/article_pdf/pdf/font/zapfdingbats.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/fpdf.php
===================================================================
--- /plugins/article_pdf/pdf/fpdf.php	(revision 10)
+++ /plugins/article_pdf/pdf/fpdf.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/gif.php
===================================================================
--- /plugins/article_pdf/pdf/gif.php	(revision 10)
+++ /plugins/article_pdf/pdf/gif.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/lib_pdf_global.php
===================================================================
--- /plugins/article_pdf/pdf/lib_pdf_global.php	(revision 10)
+++ /plugins/article_pdf/pdf/lib_pdf_global.php	(revision 10)
@@ -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: /plugins/article_pdf/pdf/lib_pdf_spip.php
===================================================================
--- /plugins/article_pdf/pdf/lib_pdf_spip.php	(revision 10)
+++ /plugins/article_pdf/pdf/lib_pdf_spip.php	(revision 10)
@@ -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: /plugins/article_pdf/plugin.xml
===================================================================
--- /plugins/article_pdf/plugin.xml	(revision 10)
+++ /plugins/article_pdf/plugin.xml	(revision 10)
@@ -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>
