diff --git a/ecrire/inc_agenda.php3 b/ecrire/inc_agenda.php3
index 8e1e7968020512946989e953e813eb4d44b431c9..27e6f80f30eeb7db40fa8c3f3fe171bafffded9d 100644
--- a/ecrire/inc_agenda.php3
+++ b/ecrire/inc_agenda.php3
@@ -5,6 +5,8 @@
 if (defined("_ECRIRE_INC_AGENDA")) return;
 define("_ECRIRE_INC_AGENDA", "1");
 
+include_ecrire("inc_acces.php3");
+
 
 //
 // Afficher un agenda (un mois) sous forme de petit tableau
@@ -312,7 +314,7 @@ function liste_rv($query, $type) {
 }
 
 function afficher_taches () {
-	global $connect_id_auteur;
+	global $connect_id_auteur, $options;
 	$query = "SELECT * FROM spip_messages WHERE type = 'affich' AND rv != 'oui' AND statut = 'publie' ORDER BY date_heure DESC";
 	liste_rv($query, "annonces");
 
@@ -321,7 +323,13 @@ function afficher_taches () {
 
 	$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) AND messages.statut='publie' GROUP BY messages.id_message ORDER BY messages.date_heure";
 	liste_rv($query, "rv");
-
+	
+	if ($options == "avancees") {
+		echo debut_cadre_enfonce();
+		echo "<div class='verdana1'>"._T("calendrier_synchro")."</div>";
+		icone_horizontale (_T("calendrier_synchro_lien"), "../spip_cal.php3?cle=".afficher_low_sec($connect_id_auteur), "calendrier-24.gif");
+		echo fin_cadre_enfonce();
+	}
 }
 
 
diff --git a/ecrire/index.php3 b/ecrire/index.php3
index 1bf9d1d12f7403d8f82b0afe988208210a30e955..306a668ec66562c749e2b6a862b5a12251fcc147 100644
--- a/ecrire/index.php3
+++ b/ecrire/index.php3
@@ -108,19 +108,53 @@ fin_cadre_relief();
 
 
 //
-// Annonces
+// Afficher le calendrier du mois s'il y a des rendez-vous
 //
-if (lire_meta('activer_messagerie') != 'non') {
-	include_ecrire("inc_agenda.php3");
-	afficher_taches();
+include_ecrire("inc_agenda.php3");
+
+if (lire_meta('activer_messagerie') != 'non' AND $connect_activer_messagerie != "non" AND $options == "avancees") {
+	$today = getdate(time());
+	$jour_today = $today["mday"];
+	$mois_today = $today["mon"];
+	$annee_today = $today["year"];
+	$date = date("Y-m-d", mktime(0,0,0,$mois_today, 1, $annee_today));
+	$mois = mois($date);
+	$annee = annee($date);
+	$jour = jour($date);
+
+	// rendez-vous personnels dans le mois
+	$result_messages = spip_query("SELECT messages.id_message 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' LIMIT 0,1");
+	if (spip_num_rows($result_messages)) {
+		echo "<p />";
+		agenda ($mois_today, $annee_today, $jour_today, $mois_today, $annee_today);
+	}
+	// rendez-vous personnels dans le mois
+	$result_messages = spip_query("SELECT messages.id_message 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_today-$mois_today-$jour_today' AND messages.date_heure < DATE_ADD('$annee_today-$mois_today-$jour_today', INTERVAL 1 DAY) ".
+			"AND messages.statut='publie' LIMIT 0,1");
+	if (spip_num_rows($result_messages)) {
+		echo "<p />";
+		calendrier_jour($jour_today,$mois_today,$annee_today, false);
+	}
 }
-debut_raccourcis();
 
+if ($options != 'avancees') {
+	debut_boite_info();
+	echo "<div class='verdana2'>";
+	echo "<p><center><b>&laquo;&nbsp;"._T('info_a_suivre')."</b></center>";
+	echo "<p>"._T('texte_actualite_site_1')."<a href='index.php3?&set_options=avancees'>"._T('texte_actualite_site_2')."</a>"._T('texte_actualite_site_3');
+	echo "</div>";
+	fin_boite_info();
+}
 
+debut_raccourcis();
 //
 // Afficher les boutons de creation d'article et de breve
 //
-
 $query = "SELECT id_rubrique FROM spip_rubriques LIMIT 0,1";
 $result = spip_query($query);
 
@@ -170,55 +204,15 @@ else if ($connect_statut == '0minirezo' and $connect_toutes_rubriques) {
 
 fin_raccourcis();
 
-
 //
-// Afficher le calendrier du mois s'il y a des rendez-vous
+// Annonces
 //
+	afficher_taches();
 
-if (lire_meta('activer_messagerie') != 'non' AND $connect_activer_messagerie != "non" AND $options == "avancees") {
-	$today = getdate(time());
-	$jour_today = $today["mday"];
-	$mois_today = $today["mon"];
-	$annee_today = $today["year"];
-	$date = date("Y-m-d", mktime(0,0,0,$mois_today, 1, $annee_today));
-	$mois = mois($date);
-	$annee = annee($date);
-	$jour = jour($date);
 
-	// rendez-vous personnels dans le mois
-	$result_messages = spip_query("SELECT messages.id_message 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' LIMIT 0,1");
-	if (spip_num_rows($result_messages)) {
-		echo "<p />";
-		agenda ($mois_today, $annee_today, $jour_today, $mois_today, $annee_today);
-	}
-	// rendez-vous personnels dans le mois
-	$result_messages = spip_query("SELECT messages.id_message 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_today-$mois_today-$jour_today' AND messages.date_heure < DATE_ADD('$annee_today-$mois_today-$jour_today', INTERVAL 1 DAY) ".
-			"AND messages.statut='publie' LIMIT 0,1");
-	if (spip_num_rows($result_messages)) {
-		echo "<p />";
-		calendrier_jour($jour_today,$mois_today,$annee_today, false);
-	}
-}
 
 debut_droite();
 
-if ($options != 'avancees') {
-	debut_boite_info();
-	echo "<div class='verdana2'>";
-	echo "<p><center><b>&laquo;&nbsp;"._T('info_a_suivre')."</b></center>";
-	echo "<p>"._T('texte_actualite_site_1')."<a href='index.php3?&set_options=avancees'>"._T('texte_actualite_site_2')."</a>"._T('texte_actualite_site_3');
-	echo "</div>";
-	fin_boite_info();
-}
-
-
-
-
 //
 // Restauration d'une archive
 //
diff --git a/ecrire/lang/spip_fr.php3 b/ecrire/lang/spip_fr.php3
index f892a4b0b441f54e615a184db4120f5dbe16cf60..de61a605ca8abf59ae002d466b0f38f4144aa6b2 100644
--- a/ecrire/lang/spip_fr.php3
+++ b/ecrire/lang/spip_fr.php3
@@ -170,6 +170,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 'bouton_voir_message' => 'Voir ce message avant de le valider',
 
 
+// C
+'calendrier_synchro' => 'Si vous utilisez un logiciel d\'agenda compatible <b>iCal</b> (Apple iCal, Mozilla Calendar, Ximian Evolution, KOrganizer...), vous pouvez le synchroniser avec l\'actualitŽ de ce site.',
+'calendrier_synchro_lien' => 'R&eacute;cup&eacute;rer le fichier <i>iCal</i>',
 // D
 'date_avant_jc' => 'av. J.C.',
 'date_fmt_heures_minutes' => '@h@h@m@min',
diff --git a/ecrire/messagerie.php3 b/ecrire/messagerie.php3
index f52c8387bc5c468810c4289b9f5c89b28e8434a8..2049c0ce0c06610e2b50201b562b56ac030cdccd 100644
--- a/ecrire/messagerie.php3
+++ b/ecrire/messagerie.php3
@@ -41,8 +41,6 @@ echo "<p>"."<IMG SRC='img_pack/m_envoi_jaune$spip_lang_rtl.gif' WIDTH='14' HEIGH
 fin_boite_info();
 
 
-echo "<div>&nbsp;</div>";
-icone ("iCal", "../spip_cal.php3?cle=".afficher_low_sec($connect_id_auteur), "calendrier-24.gif");
 
 
 
diff --git a/spip_cal.php3 b/spip_cal.php3
new file mode 100644
index 0000000000000000000000000000000000000000..d4a8fd125798fe747fdc501aed35ebca42387156
--- /dev/null
+++ b/spip_cal.php3
@@ -0,0 +1,181 @@
+<?php
+
+include ("ecrire/inc_version.php3");
+
+include_ecrire("inc_filtres.php3");
+include_ecrire("inc_texte.php3");
+include_ecrire("inc_charsets.php3");
+include_ecrire("inc_meta.php3");
+include_ecrire("inc_admin.php3");
+
+
+function ligne_x ($texte) {
+	if (ereg("^BEGIN", $texte)) echo "<br>";
+	echo $texte."<br>";
+}
+function ligne ($texte) {
+	echo $texte."\n";
+}
+
+function filtrer_ical ($texte) {
+	global $charset;
+	$texte = html2unicode($texte);
+	$texte = unicode2charset(charset2unicode($texte, $charset, 1), 'utf-8');
+	$texte = ereg_replace("\n", " ", $texte);
+	$texte = ereg_replace(",", "\,", $texte);
+
+	return $texte;
+}
+
+
+
+if (!$charset = lire_meta('charset')) $charset = 'utf-8';
+$nom_site = filtrer_ical(lire_meta("nom_site"));
+$adresse_site = lire_meta("adresse_site");
+
+
+if (strlen($cle)>1) {
+	$query = "SELECT * FROM spip_auteurs WHERE low_sec='$cle'";
+	$result = spip_query($query);
+
+	if ($row = spip_fetch_array($result)) {
+		$id_utilisateur=$row['id_auteur'];
+		$nom_utilisateur=$row['nom'];
+		$nom_utilisateur = filtrer_ical(unicode2charset(charset2unicode($nom_utilisateur, $charset, 1), 'utf-8'));
+	} else {
+		die ("Interdit");
+	}
+} else {
+	die ("Interdit");
+}	
+
+
+@header ("content-type:text/calendar");
+//@header("Content-Disposition: attachment; filename=spipcal-$id_utilisateur.ics");
+
+ligne ("BEGIN:VCALENDAR");
+ligne ("CALSCALE:GREGORIAN");
+ligne ("X-WR-CALNAME;VALUE=TEXT:$nom_site / $nom_utilisateur");
+ligne ("X-WR-RELCALID:cal$id_utilisateur @ $adresse_site");
+ligne ("VERSION:2.0");
+
+
+	// rendez-vous
+	$result_messages=spip_query("SELECT messages.* FROM spip_messages AS messages, spip_auteurs_messages AS lien WHERE ((lien.id_auteur='$id_utilisateur' AND lien.id_message=messages.id_message) OR messages.type='affich') AND messages.rv='oui' AND messages.statut='publie' GROUP BY messages.id_message ORDER BY messages.date_heure");
+	while($row=spip_fetch_array($result_messages)){
+		$id_message=$row['id_message'];
+		$date_heure=$row["date_heure"];
+		$date_heure_fin=$row["date_fin"];
+		//$titre=typo($row["titre"]);
+		$titre = filtrer_ical($row["titre"]);
+		$texte = filtrer_ical($row["texte"]);
+		$type=$row["type"];
+
+		if ($type == "affich") {
+			$titre = "[$nom_site] $titre";
+		}
+		
+		ligne ("BEGIN:VEVENT");
+		if ($type == "normal") {
+			$result_auteurs=spip_query("SELECT auteurs.* FROM spip_auteurs AS auteurs, spip_auteurs_messages AS lien WHERE (lien.id_message='$id_message' AND lien.id_auteur=auteurs.id_auteur)");
+			while($row_auteur=spip_fetch_array($result_auteurs)){
+				$id_auteur=$row_auteur['id_auteur'];
+				$nom_auteur=$row_auteur['nom'];
+				$email = $row_auteur ['email'];
+				$nom_auteur = filtrer_ical($nom_auteur);
+
+				if ($id_auteur != $id_utilisateur) $titre = $titre." - ".$nom_auteur;
+				
+				if ($id_auteur == $id_utilisateur) ligne ("ORGANIZER:$nom_auteur <$email>");
+				else  ligne ("ATTENDEE:$nom_auteur <$email>");
+			}
+		}
+		ligne ("SUMMARY:".$titre);
+		ligne ("DESCRIPTION:$texte");
+		ligne ("UID:mess$id_message @ $adresse_site");
+		ligne ("DTSTAMP:".date ("Ymd\THis", mktime (heures($date_heure),minutes($date_heure),0,mois($date_heure),jour($date_heure),annee($date_heure))));
+		ligne ("DTSTART:".date ("Ymd\THis", mktime (heures($date_heure),minutes($date_heure),0,mois($date_heure),jour($date_heure),annee($date_heure))));
+		if ($date_heure_fin > $date_heure) ligne ("DTEND:".date ("Ymd\THis", mktime (heures($date_heure_fin),minutes($date_heure_fin),0,mois($date_heure_fin),jour($date_heure_fin),annee($date_heure_fin))));
+		ligne ("CATEGORIES:$type");
+		ligne("URL:$adresse_site/ecrire/message.php3?id_message=$id_message");
+		
+		ligne ("END:VEVENT");
+		
+	}
+
+	// todo
+	$result_messages=spip_query("SELECT messages.* FROM spip_messages AS messages, spip_auteurs_messages AS lien WHERE ((lien.id_auteur='$id_utilisateur' AND lien.id_message=messages.id_message AND messages.type='pb') OR messages.type='affich') AND messages.rv!='oui' AND messages.statut='publie' GROUP BY messages.id_message ORDER BY messages.date_heure");
+	while($row=spip_fetch_array($result_messages)){
+		$id_message=$row['id_message'];
+		$date_heure=$row["date_heure"];
+		$titre = filtrer_ical($row["titre"]);
+		$texte = filtrer_ical($row["texte"]);
+		$type=$row["type"];
+
+		if ($type == "affich") {
+			$titre = "[$nom_site] $titre";
+		}
+		
+		ligne ("BEGIN:VTODO");
+		ligne ("SUMMARY:".$titre);
+		ligne ("DESCRIPTION:$texte");
+		ligne ("UID:mess$id_message @ $adresse_site");
+		ligne ("DTSTAMP:".date ("Ymd\THis", mktime (heures($date_heure),minutes($date_heure),0,mois($date_heure),jour($date_heure),annee($date_heure))));
+		ligne ("DTSTART:".date ("Ymd\THis", mktime (heures($date_heure),minutes($date_heure),0,mois($date_heure),jour($date_heure),annee($date_heure))));
+		ligne ("CATEGORIES:$type");
+		ligne("URL:$adresse_site/ecrire/message.php3?id_message=$id_message");
+		ligne ("END:VTODO");
+		
+	}
+
+
+
+	// Articles et breves proposes
+	$result_articles = spip_query("SELECT id_article, titre, date FROM spip_articles WHERE statut = 'prop'");
+	while($row=spip_fetch_array($result_articles)){
+		$id_article=$row['id_article'];
+		$titre = filtrer_ical(_T('info_article_propose').": ".$row['titre']);
+		$date_heure = $row['date'];
+		ligne ("BEGIN:VTODO");
+		ligne ("SUMMARY:[$nom_site] $titre ");
+		ligne ("UID:article$id_article @ $adresse_site");
+		ligne ("DTSTAMP:".date ("Ymd\THis", mktime (heures($date_heure),minutes($date_heure),0,mois($date_heure),jour($date_heure),annee($date_heure))));
+		ligne ("DTSTART:".date ("Ymd\THis", mktime (heures($date_heure),minutes($date_heure),0,mois($date_heure),jour($date_heure),annee($date_heure))));
+		ligne ("CATEGORIES:article");
+		ligne("URL:$adresse_site/ecrire/articles.php3?id_article=$id_article");
+		ligne ("END:VTODO");
+	}
+	$result_articles = spip_query("SELECT id_breve, titre, date_heure FROM spip_breves WHERE statut = 'prop'");
+	while($row=spip_fetch_array($result_articles)){
+		$id_breve=$row['id_breve'];
+		$titre = filtrer_ical(_T('item_breve_proposee').": ".$row['titre']);
+		$date_heure = $row['date_heure'];
+		ligne ("BEGIN:VTODO");
+		ligne ("SUMMARY:[$nom_site] $titre");
+		ligne ("UID:breve$id_breve @ $adresse_site");
+		ligne ("DTSTAMP:".date ("Ymd\THis", mktime (heures($date_heure),minutes($date_heure),0,mois($date_heure),jour($date_heure),annee($date_heure))));
+		ligne ("DTSTART:".date ("Ymd\THis", mktime (heures($date_heure),minutes($date_heure),0,mois($date_heure),jour($date_heure),annee($date_heure))));
+		ligne ("CATEGORIES:breve");
+		ligne("URL:$adresse_site/ecrire/breves_voir.php3?id_breve=$id_breve");
+		ligne ("END:VTODO");
+	}
+	
+
+
+
+/*ligne ("BEGIN:VEVENT");
+	DTSTAMP:20031121T064748Z
+	SUMMARY:L.A. Clippers @ Kings Preseason \nW 101-82\n 
+	LOCATION:
+	UID:4FF899AA-1BE0-11D8-8939-000A959A2EA8-RID
+	DTSTART;TZID=US/Pacific:20031007T190000
+	DURATION:PT3H
+ligne ("END:VEVENT");
+*/
+
+
+ligne ("END:VCALENDAR");
+
+
+
+?>
\ No newline at end of file