[PLUGINS] +agenda2.0 et calendrier_mini
authorLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Fri, 12 Jul 2013 15:43:24 +0000 (17:43 +0200)
committerLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Fri, 12 Jul 2013 15:43:24 +0000 (17:43 +0200)
166 files changed:
www/plugins/agenda_3_5/action/activer_agenda_rubrique.php [new file with mode: 0644]
www/plugins/agenda_3_5/action/editer_evenement.php [new file with mode: 0644]
www/plugins/agenda_3_5/action/supprimer_evenement.php [new file with mode: 0644]
www/plugins/agenda_3_5/agenda_administrations.php [new file with mode: 0644]
www/plugins/agenda_3_5/agenda_autoriser.php [new file with mode: 0644]
www/plugins/agenda_3_5/agenda_fonctions.php [new file with mode: 0644]
www/plugins/agenda_3_5/agenda_pipelines.php [new file with mode: 0644]
www/plugins/agenda_3_5/base/agenda_evenements.php [new file with mode: 0644]
www/plugins/agenda_3_5/css/spip.agenda.css [new file with mode: 0644]
www/plugins/agenda_3_5/demo/agenda_calendrier_mini.html [new file with mode: 0644]
www/plugins/agenda_3_5/demo/exemple_navigation_jours.html [new file with mode: 0644]
www/plugins/agenda_3_5/demo/test/test_boucle_evenements.html [new file with mode: 0644]
www/plugins/agenda_3_5/demo/test/testagenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/configurer_agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/editer_evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/editer_evenement.php [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/evenement_participants.html [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/evenement_participants.php [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/migrer_agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/migrer_agenda.php [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/participer_evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/formulaires/participer_evenement.php [new file with mode: 0644]
www/plugins/agenda_3_5/inc/agenda_filtres.php [new file with mode: 0644]
www/plugins/agenda_3_5/inc/date_gestion.php [new file with mode: 0644]
www/plugins/agenda_3_5/inc/un-evenement-ical.html [new file with mode: 0644]
www/plugins/agenda_3_5/javascript/jquery-ui.multidatespicker.js [new file with mode: 0755]
www/plugins/agenda_3_5/lang/agenda.xml [new file with mode: 0644]
www/plugins/agenda_3_5/lang/agenda_de.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/agenda_en.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/agenda_es.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/agenda_fr.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/agenda_nl.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/agenda_sk.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/configureragenda_fr.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/migreragenda_fr.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/paquet-agenda.xml [new file with mode: 0644]
www/plugins/agenda_3_5/lang/paquet-agenda_en.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/paquet-agenda_es.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/paquet-agenda_fr.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/paquet-agenda_sk.php [new file with mode: 0644]
www/plugins/agenda_3_5/lang/paquet-albums.xml [new file with mode: 0644]
www/plugins/agenda_3_5/modeles/evenement_vevent.html [new file with mode: 0644]
www/plugins/agenda_3_5/paquet.xml [new file with mode: 0644]
www/plugins/agenda_3_5/prive/objets/contenu/article-evenements.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/objets/contenu/evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/objets/infos/evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/objets/liste/evenement_participants.html [new file with mode: 0755]
www/plugins/agenda_3_5/prive/objets/liste/evenements-post.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/objets/liste/evenements.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/squelettes/contenu/agenda_inscriptions.html [new file with mode: 0755]
www/plugins/agenda_3_5/prive/squelettes/contenu/configurer_agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/squelettes/contenu/evenement_edit.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/squelettes/contenu/evenements.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/squelettes/extra/agenda_inscriptions.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/squelettes/inclure/agenda-navigation-mois.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/squelettes/inclure/agenda-rubriques.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/squelettes/navigation/agenda_inscriptions.html [new file with mode: 0755]
www/plugins/agenda_3_5/prive/squelettes/navigation/evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/squelettes/navigation/evenements.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/style_prive_plugin_agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-non-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/agenda-ok-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/repetition-16.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/repetition-24.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/themes/spip/images/repetition-32.png [new file with mode: 0644]
www/plugins/agenda_3_5/prive/transmettre/evenement_participants.html [new file with mode: 0755]
www/plugins/agenda_3_5/prive/transmettre/evenements_participants.html [new file with mode: 0755]
www/plugins/agenda_3_5/public/agenda.php [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/agenda-ical.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/agenda-rss.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/agenda-zpip.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/aside/agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/breadcrumb/agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/calendrier_mini_event.json.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/calendrier_mini_event.json_fonctions.php [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/content/agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/content/article-evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/content/evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/content/jour.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/content/rubrique-agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/contenu/page-agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/contenu/page-jour.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/extra/agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/extra/evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/extra/jour.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/extra/rubrique-agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/extra1/agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/extra1/evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/extra1/jour.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/extra1/rubrique-agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/ical-agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/inc-rss-item-evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/inclure/agenda-evenements-meme-article.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/inclure/agenda-liste.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/inclure/resume/evenement.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/navigation/page-agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/squelettes/style_public_plugin_agenda.html [new file with mode: 0644]
www/plugins/agenda_3_5/svn.revision [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/balise/calendrier_mini.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/calendrier_mini.json.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/calendrier_mini.json_fonctions.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/calendriermini_fonctions.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/css/img/month_next.png [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/css/img/month_prev.png [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/css/img/month_prev_next-32x16.png [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/css/minical.css [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/demos/minical_demo.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/formulaires/calendrier_mini.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/formulaires/configurer_calendriermini.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/javascript/calendrier_mini.js.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/javascript/jquery-ui.multidatespicker.js [new file with mode: 0755]
www/plugins/calendrier_mini-2.0/lang/minical.xml [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_ar.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_ca.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_de.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_en.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_es.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_fa.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_fr.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_it.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_sk.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/minical_sl.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini.xml [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_de.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_en.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_es.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_fr.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_sk.php [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/minical-32.png [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/modeles/archives_mensuelles.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/modeles/rubrique_calendrier.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/modeles/select_archives_mensuelles.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/paquet.xml [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/prive/squelettes/contenu/configurer_calendriermini.html [new file with mode: 0644]
www/plugins/calendrier_mini-2.0/svn.revision [new file with mode: 0644]
www/plugins/skel_lhc/plugin.xml

diff --git a/www/plugins/agenda_3_5/action/activer_agenda_rubrique.php b/www/plugins/agenda_3_5/action/activer_agenda_rubrique.php
new file mode 100644 (file)
index 0000000..0fb08c7
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+function action_activer_agenda_rubrique_dist()
+{
+       $securiser_action = charger_fonction('securiser_action', 'inc');
+       $arg = $securiser_action();
+       
+       // A-t-on vraiment le droit de modifier la rubrique en question ?
+       if (!autoriser('modifier', 'rubrique', abs(intval($arg)))){
+               include_spip('inc/minipres');
+               echo minipres(_T('info_acces_interdit'));
+               exit;
+       }
+       
+       if (intval($arg)!=0) {
+               if (intval($arg)>0)
+                       sql_updateq('spip_rubriques',array('agenda'=>1),'id_rubrique='.intval($arg));
+               else
+                       sql_updateq('spip_rubriques',array('agenda'=>0),'id_rubrique='.(-intval($arg)));
+       }
+}
+
+?>
diff --git a/www/plugins/agenda_3_5/action/editer_evenement.php b/www/plugins/agenda_3_5/action/editer_evenement.php
new file mode 100644 (file)
index 0000000..d192815
--- /dev/null
@@ -0,0 +1,383 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Edition d'un evenement
+ * @param string $arg
+ * @return array
+ */
+function action_editer_evenement_dist($arg=null){
+
+       if (is_null($arg)){
+               $securiser_action = charger_fonction('securiser_action', 'inc');
+               $arg = $securiser_action();
+       }
+
+       // si id_evenement n'est pas un nombre, c'est une creation
+       // mais on verifie qu'on a toutes les donnees qu'il faut.
+       if (!$id_evenement = intval($arg)) {
+               $id_parent = _request('id_parent');
+               if (!$id_evenement = agenda_action_insert_evenement($id_parent))
+                       return array(false,_L('echec'));
+       }
+
+       $err = action_evenement_set($id_evenement);
+       return array($id_evenement,$err);
+}
+
+/**
+ * Creer un nouvel evenement
+ *
+ * @param int $id_article
+ * @param int $id_evenement_source
+ * @return int
+ */
+function evenement_inserer($id_article,$id_evenement_source = 0){
+       include_spip('inc/autoriser');
+       if (!autoriser('creerevenementdans','article',$id_article)){
+               spip_log("agenda action formulaire article : auteur ".$GLOBALS['visiteur_session']['id_auteur']." n'a pas le droit de creer un evenement dans article $id_article",'agenda');
+               return false;
+       }
+
+       $champs = array(
+               "id_evenement_source"=>intval($id_evenement_source),
+               'id_article'=>intval($id_article),
+               'statut' => 'prop',
+       );
+
+       // Envoyer aux plugins
+       $champs = pipeline('pre_insertion',
+               array(
+                       'args' => array(
+                               'table' => 'spip_evenements',
+                       ),
+                       'data' => $champs
+               )
+       );
+
+       // nouvel evenement
+       $id_evenement = sql_insertq("spip_evenements", $champs);
+
+       pipeline('post_insertion',
+               array(
+                       'args' => array(
+                               'table' => 'spip_evenements',
+                               'id_objet' => $id_evenement
+                       ),
+                       'data' => $champs
+               )
+       );
+
+       if (!$id_evenement){
+               spip_log("agenda action formulaire evenement : impossible d'ajouter un evenement",'agenda');
+               return false;
+       }
+       return $id_evenement;
+}
+
+/**
+ * Modifier un evenement existant
+ *
+ * @param int $id_evenement
+ * @param array $set
+ * @return bool|string
+ */
+function evenement_modifier($id_evenement, $set=null){
+
+       include_spip('inc/modifier');
+       include_spip('inc/filtres');
+       $c = collecter_requests(
+               // white list
+               objet_info('evenement','champs_editables'),
+               // black list
+               array('statut','id_article'),
+               // donnees eventuellement fournies
+               $set
+       );
+
+       // Si l'evenement est publie, invalider les caches et demander sa reindexation
+       $t = sql_getfetsel("statut", "spip_evenements", "id_evenement=".intval($id_evenement));
+       $invalideur = $indexation = false;
+       if ($t == 'publie') {
+               $invalideur = "id='evenement/$id_evenement'";
+               $indexation = true;
+       }
+
+       if ($err = objet_modifier_champs('evenement', $id_evenement,
+               array(
+                       'nonvide' => array('titre' => _T('info_nouvel_evenement')." "._T('info_numero_abbreviation').$id_evenement),
+                       'invalideur' => $invalideur,
+                       'indexation' => $indexation,
+               ),
+               $c))
+               return $err;
+
+       if (!is_null($repetitions = _request('repetitions', $set)))
+               agenda_action_revision_evenement_repetitions($id_evenement, $repetitions);
+
+       // Modification de statut, changement de parent ?
+       $c = collecter_requests(array('statut', 'id_parent'), array(), $set);
+       $err = evenement_instituer($id_evenement, $c);
+
+       return $err;
+}
+
+
+function agenda_action_revision_evenement_repetitions($id_evenement, $repetitions=""){
+       include_spip('inc/filtres');
+       $repetitions = preg_split(",[^0-9\-\/],",$repetitions);
+       // gestion des repetitions
+       $rep = array();
+       foreach($repetitions as $date){
+               if (strlen($date)){
+                       $date = recup_date($date);
+                       if ($date=mktime(0,0,0,$date[1],$date[2],$date[0]))
+                               $rep[] = $date;
+               }
+       }
+       agenda_action_update_repetitions($id_evenement, $rep);
+}
+
+function agenda_action_update_repetitions($id_evenement, $repetitions){
+       // evenement source
+       if ($row = sql_fetsel("*", "spip_evenements","id_evenement=".intval($id_evenement))){
+               // Si ce n'est pas un événement source, on n'a rien à faire ici
+               if ($row['id_evenement_source'] != 0){ return; }
+               
+               // On ne garde que les données correctes pour une modification
+               $c = collecter_requests(
+                       // white list
+                       objet_info('evenement','champs_editables'),
+                       // black list
+                       array('id_evenement', 'id_evenement_source'),
+                       // donnees fournies
+                       $row
+               );
+               
+               // Savoir si la source était publiée ou pas
+               $publie = ($row['statut'] == 'publie');
+               
+               // On calcule la durée en secondes de l'événement source pour la reporter telle quelle aux répétitions
+               $date_debut = strtotime($row['date_debut']);
+               $date_fin = strtotime($row['date_fin']);
+               $duree = $date_fin - $date_debut;
+               
+               $repetitions_updated = array();
+               // mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu
+               $res = sql_select("id_evenement,date_debut","spip_evenements","id_evenement_source=".intval($id_evenement));
+               while ($row = sql_fetch($res)){
+                       $date = strtotime(date('Y-m-d', strtotime($row['date_debut'])));
+                       if (in_array($date, $repetitions)){
+                               // Cette répétition existe déjà, on la met à jour
+                               $repetitions_updated[] = $date;
+                               
+                               // On calcule les nouvelles dates/heures en reportant la durée de la source
+                               $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);
+                               
+                               // Seules les dates sont changées dans les champs de la source
+                               // TODO : prendre en charge la mise a jour uniquement si conforme a l'original
+                               $c['date_debut'] = $update_date_debut;
+                               $c['date_fin'] = $update_date_fin;
+
+                               // mettre a jour l'evenement
+                               sql_updateq(
+                                       'spip_evenements',
+                                       $c,
+                                       'id_evenement = '.$row['id_evenement']
+                               );
+                       }
+                       else {
+                               // il est supprime
+                               sql_delete("spip_evenements","id_evenement=".$row['id_evenement']);
+                       }
+               }
+               
+               // regarder les repetitions a ajouter
+               foreach($repetitions as $date){
+                       if (!in_array($date, $repetitions_updated)){
+                               // On calcule les dates/heures en reportant la durée de la source
+                               $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);
+                               
+                               // Seules les dates sont changées dans les champs de la source
+                               $c['date_debut'] = $update_date_debut;
+                               $c['date_fin'] = $update_date_fin;
+                               
+                               // On crée la nouvelle répétition
+                               if ($id_evenement_new = agenda_action_insert_evenement($c['id_article'], $id_evenement)) {
+                                       // Si c'est bon, on ajoute tous les champs
+                                       sql_updateq(
+                                               'spip_evenements',
+                                               $c,
+                                               'id_evenement = '.$id_evenement_new
+                                       );
+                                       
+                                       // Pour les créations il ne faut pas oublier de dupliquer les liens
+                                       // En effet, sinon les documents insérés avant la création (0-id_auteur) ne seront pas dupliqués
+                                       include_spip('action/editer_liens');
+                                       objet_dupliquer_liens('evenement', $id_evenement, $id_evenement_new);
+                               }
+                       }
+               }
+       }
+}
+
+/**
+ * Instituer un evenement
+ *
+ * @param int $id_evenement
+ * @param array $c
+ * @return bool|string
+ */
+function evenement_instituer($id_evenement, $c) {
+
+       include_spip('inc/autoriser');
+       include_spip('inc/modifier');
+
+       $row = sql_fetsel("id_article, statut", "spip_evenements", "id_evenement=".intval($id_evenement));
+       $id_parent  = $id_parent_ancien = $row['id_article'];
+       $statut = $statut_ancien = $row['statut'];
+
+       $champs = array();
+
+       if (!autoriser('modifier', 'article', $id_parent)
+         OR (isset($c['id_parent']) AND !autoriser('modifier', 'article', $c['id_parent']))){
+               spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
+               return false;
+       }
+
+       // Verifier que l'article demande existe et est different
+       // de l'article actuel
+       if ($c['id_parent']
+         AND $c['id_parent'] != $id_parent
+         AND (sql_countsel("spip_articles", "id_article=".intval($c['id_parent'])))) {
+               $id_parent = $champs['id_article'] = $c['id_parent'];
+       }
+
+       $sa = sql_getfetsel('statut','spip_articles','id_article='.intval($id_parent));
+       if ($id_parent
+         AND (
+                       $id_parent!==$id_parent_ancien OR $statut=='0'
+               )){
+               switch($sa){
+                       case 'publie':
+                               // statut par defaut si besoin
+                               if ($statut=='0')
+                                       $champs['statut'] = $statut = 'publie';
+                               break;
+                       case 'poubelle':
+                               // si article a la poubelle, evenement aussi
+                               $champs['statut'] = $statut = 'poubelle';
+                               break;
+                       default:
+                               // pas de publie ni 0 si article pas publie
+                               if (in_array($statut,array('publie','0')))
+                                       $champs['statut'] = $statut = 'prop';
+                               break;
+               }
+       }
+
+       // si pas d'article lie, et statut par defaut
+       // on met en propose
+       if ($statut=='0')
+               $champs['statut'] = $statut = 'prop';
+
+       if (isset($c['statut'])
+               AND $s = $c['statut']
+               AND $s != $statut) {
+               // pour instituer un evenement il faut avoir le droit d'instituer l'article associe avec le meme statut
+               if (autoriser('instituer', 'article', $id_parent, null, array('statut'=>$s))
+                 AND ($sa=='publie' OR $s!=='publie'))
+                       $champs['statut'] = $statut = $s;
+               else
+                       spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
+       }
+
+       // Envoyer aux plugins
+       $champs = pipeline('pre_edition',
+               array(
+                       'args' => array(
+                               'table' => 'spip_evenements',
+                               'action'=>'instituer',
+                               'id_objet' => $id_evenement,
+                               'id_parent_ancien' => $id_parent_ancien,
+                               'statut_ancien' => $statut_ancien,
+                       ),
+                       'data' => $champs
+               )
+       );
+
+       if (!count($champs)) return;
+
+       // Envoyer les modifs sur l'evenement et toutes ses repetitons
+       $ids = array_map('reset', sql_allfetsel('id_evenement', 'spip_evenements', 'id_evenement_source='.intval($id_evenement)));
+       $ids[] = intval($id_evenement);
+       sql_updateq('spip_evenements', $champs, sql_in('id_evenement', $ids));
+
+       // Invalider les caches
+       include_spip('inc/invalideur');
+       suivre_invalideur("id='id_article/$id_parent_ancien'");
+       suivre_invalideur("id='id_article/$id_parent'");
+
+       // Pipeline
+       pipeline('post_edition',
+               array(
+                       'args' => array(
+                               'table' => 'spip_evenements',
+                               'action'=>'instituer',
+                               'id_objet' => $id_evenement,
+                               'id_parent_ancien' => $id_parent_ancien,
+                               'statut_ancien' => $statut_ancien,
+                       ),
+                       'data' => $champs
+               )
+       );
+
+       // Notifications
+       if ($notifications = charger_fonction('notifications', 'inc')) {
+               $notifications('instituerevenement', $id_evenement,
+                       array('id_parent' => $id_parent, 'statut' => $statut, 'id_parent_ancien' => $id_parent, 'statut_ancien' => $statut_ancien)
+               );
+       }
+
+       return ''; // pas d'erreur
+}
+
+/*
+function agenda_action_supprime_repetitions($supp_evenement){
+       $res = sql_select("id_evenement", "spip_evenements", "id_evenement_source=".intval($supp_evenement));
+       while ($row = sql_fetch($res)){
+               $id_evenement = $row['id_evenement'];
+               sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
+       }
+}
+*/
+/*
+function agenda_action_supprime_evenement($id_article,$supp_evenement){
+       $id_evenement = sql_getfetsel("id_evenement", "spip_evenements", array(
+               "id_article=" . intval($id_article),
+               "id_evenement=" . intval($supp_evenement)));
+       if (intval($id_evenement) AND $id_evenement == $supp_evenement){
+               sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
+               agenda_action_supprime_repetitions($id_evenement);
+       }
+       include_spip('inc/invalideur');
+       suivre_invalideur("article/$id_article");
+       $id_evenement = 0;
+       return $id_evenement;
+}*/
+
+
+function agenda_action_insert_evenement($id_article,$id_evenement_source = 0){return evenement_inserer($id_article,$id_evenement_source);}
+function action_evenement_set($id_evenement, $set=null){return evenement_modifier($id_evenement, $set);}
+function agenda_action_instituer_evenement($id_evenement, $c) {return evenement_instituer($id_evenement,$c);}
+?>
diff --git a/www/plugins/agenda_3_5/action/supprimer_evenement.php b/www/plugins/agenda_3_5/action/supprimer_evenement.php
new file mode 100644 (file)
index 0000000..dc0b8c9
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+function action_supprimer_evenement_dist()
+{
+       $securiser_action = charger_fonction('securiser_action', 'inc');
+       $arg = $securiser_action();
+       
+       
+       list($id_evenement,$id_article) = preg_split(',[^0-9],',$arg);
+       include_spip('inc/autoriser');
+       if (intval($id_article) AND intval($id_evenement) AND autoriser('supprimer','evenement',$id_evenement,null,array('id_article'=>$id_article))){
+               include_spip("action/editer_evenement");
+               evenement_modifier($id_evenement,array('statut'=>'poubelle'));
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/agenda_administrations.php b/www/plugins/agenda_3_5/agenda_administrations.php
new file mode 100644 (file)
index 0000000..895beed
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Installation/maj des tables evenements et participants...
+ *
+ * @param string $nom_meta_base_version
+ * @param string $version_cible
+ */
+function agenda_upgrade($nom_meta_base_version,$version_cible){
+
+
+       $maj = array();
+       $maj['create'] = array(
+               array('maj_tables',array('spip_evenements','spip_evenements_participants')),
+               array('sql_alter',"TABLE spip_rubriques ADD agenda tinyint(1) DEFAULT 0 NOT NULL"),
+       );
+       $maj['0.11'] = array(
+               array('sql_alter',"TABLE spip_evenements ADD `horaire` ENUM('oui','non') DEFAULT 'oui' NOT NULL AFTER `lieu`"),
+       );
+       $maj['0.12'] = array(
+               array('sql_alter',"TABLE spip_evenements ADD `id_article`  bigint(21) DEFAULT '0' NOT NULL AFTER `id_evenement`"),
+               array('sql_alter',"TABLE spip_evenements ADD ADD INDEX ( `id_article` )"),              
+               array('upgrade_evenements_articles_012'),
+               array('sql_drop_table',"spip_evenements_articles"),
+       );
+       
+       $maj['0.13'] = array(
+               array('maj_tables',array('spip_evenements','spip_evenements_participants')),
+       );
+       $maj['0.18'] = array(
+               array('maj_tables',array('spip_evenements','spip_evenements_participants')),
+               array('sql_update',"spip_groupes_mots", array('tables_liees'=>"concat(tables_liees,'evenements,')"), "evenements='oui'"),
+               array('sql_alter',"TABLE spip_groupes_mots DROP evenements"),   
+       );      
+
+       $maj['0.20'] = array(
+               array('sql_alter',"TABLE spip_rubriques ADD agenda tinyint(1) DEFAULT 0 NOT NULL"),
+       );      
+       
+       $maj['0.21'] = array(
+               array('sql_alter',"TABLE spip_evenements ADD adresse text NOT NULL"),
+               array('sql_alter',"TABLE spip_evenements ADD inscription text NOT NULL"),
+               array('sql_alter',"TABLE spip_evenements ADD places text NOT NULL"),
+       );      
+       
+       $maj['0.22'] = array(
+               array('maj_tables',array('spip_evenements_participants')),
+       );      
+       
+       $maj['0.23'] = array(
+               array('sql_alter',"TABLE spip_evenements CHANGE titre titre text NOT NULL DEFAULT ''"),
+               array('sql_alter',"TABLE spip_evenements CHANGE descriptif descriptif text NOT NULL DEFAULT ''"),
+               array('sql_alter',"TABLE spip_evenements CHANGE lieu lieu text NOT NULL DEFAULT ''"),
+               array('sql_alter',"TABLE spip_evenements CHANGE adresse adresse text NOT NULL DEFAULT ''"),
+       );              
+       include_spip('maj/svn10000');
+       $maj['0.24.0'] = array(
+               array('maj_liens','mot','evenement'),
+               array('sql_drop_table',"spip_mots_evenements"),
+               array('sql_alter',"TABLE spip_evenements ADD statut varchar(10) DEFAULT 0 NOT NULL"),
+       );
+       
+       $maj['0.25.0'] = array(
+               array('upgrade_evenements_statut_025'),
+       );
+       
+       $maj['0.26.0'] = array(
+               array('maj_tables',array('spip_evenements')),
+               array('sql_update',"spip_evenements", array('date_creation'=>'maj')),
+       );
+
+       include_spip('base/upgrade');
+       maj_plugin($nom_meta_base_version, $version_cible, $maj);
+}
+
+function agenda_vider_tables($nom_meta_base_version) {
+       sql_drop_table("spip_evenements");
+       #sql_drop_table("spip_mots_evenements"); // au cas ou ?
+       sql_alter("TABLE spip_rubriques DROP COLUMN agenda");
+       effacer_meta($nom_meta_base_version);
+}
+
+function upgrade_evenements_articles_012(){
+       $res = sql_select("*", "spip_evenements_articles");
+       while ($row = sql_fetch($res)){
+               $id_article = $row['id_article'];
+               $id_evenement = $row['id_evenement'];
+               sql_update("spip_evenements", array('id_article'=>$id_article),'id_evenement='.intval($id_evenement));
+       }
+}
+
+function upgrade_evenements_statut_025(){
+       include_spip('action/editer_evenement');
+       $res = sql_select('id_evenement','spip_evenements',"statut='0'");
+       while ($row = sql_fetch($res)){
+               evenement_modifier($row['id_evenement'],array());
+       }
+}
+
+?>
diff --git a/www/plugins/agenda_3_5/agenda_autoriser.php b/www/plugins/agenda_3_5/agenda_autoriser.php
new file mode 100644 (file)
index 0000000..5a944c9
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/* pour que le pipeline ne rale pas ! */
+function agenda_autoriser(){}
+
+function autoriser_evenementcreer_menu_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL){
+       autoriser('creer','evenement',$id,$qui,$opt);
+}
+
+function autoriser_evenements_menu_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL){
+       return true;
+}
+
+/**
+ * Autorisation d'ajout d'un evenement a un article
+ *
+ * @param string $faire
+ * @param string $quoi
+ * @param int $id
+ * @param int $qui
+ * @param array $options
+ * @return bool
+ */
+function autoriser_article_creerevenementdans_dist($faire,$quoi,$id,$qui,$options){
+       if (!$id) return false; // interdit de creer un evenement sur un article vide !
+       // si on a le droit de modifier l'article alors on a peut-etre le droit d'y creer un evenement
+       $afficher = false;
+       if (autoriser('modifier','article',$id,$qui)) {
+               $afficher = true;
+               // un article avec des evenements a toujours le droit
+               if (!sql_countsel('spip_evenements','id_article='.intval($id))){
+                       // si au moins une rubrique a le flag agenda
+                       if (sql_countsel('spip_rubriques','agenda=1')){
+                               // alors il faut le flag agenda dans cette branche !
+                               $afficher = false;
+                               include_spip('inc/rubriques');
+                               $in = calcul_hierarchie_in(sql_getfetsel('id_rubrique','spip_articles','id_article='.intval($id)));
+                               $afficher = sql_countsel('spip_rubriques',sql_in('id_rubrique',$in)." AND agenda=1");
+                       }
+               }
+       }
+       return $afficher;
+}
+
+// Autorisation pour créer un événement n'importe où (article ou autre ou rien)
+// Par défaut : comme pour créer dans un article si on l'a dans les options, sinon être admin complet
+function autoriser_evenement_creer_dist($faire,$quoi,$id,$qui,$options){
+       if (isset($options['id_article']) and $options['id_article'] > 0){
+               return autoriser('creerevenementdans', 'article', $options['id_article'], $qui, $options);
+       }
+       else{
+               return ($qui['statut'] == '0minirezo' and !$qui['restreint']);
+       }
+}
+
+/**
+ * Autorisation de modifier un evenement : autorisations de l'article parent
+ *
+ * @param string $faire
+ * @param string $quoi
+ * @param int $id
+ * @param int $qui
+ * @param array $options
+ * @return bool
+ */
+function autoriser_evenement_modifier_dist($faire,$quoi,$id,$qui,$options){
+       if (!isset($options['id_article']) OR !$id_article=$options['id_article'])
+               $id_article = sql_getfetsel('id_article','spip_evenements','id_evenement='.intval($id));
+       if (!$id_article) return false;
+       return autoriser('modifier','article',$id_article,$qui);
+}
+
+/**
+ * Autorisation d'instituer un evenement : voir si l'article est publie ou non
+ * @param string $faire
+ * @param string $quoi
+ * @param int $id
+ * @param int $qui
+ * @param array $options
+ * @return bool
+ */
+function autoriser_evenement_instituer_dist($faire,$quoi,$id,$qui,$options){
+       if (!isset($options['id_article']) OR !$id_article=$options['id_article'])
+               $id_article = sql_getfetsel('id_article','spip_evenements','id_evenement='.intval($id));
+       if (!$id_article) return false;
+       $statut = sql_getfetsel('statut','spip_articles','id_article='.intval($id_article));
+       // interdit de publier un evenement sur un article non publie
+       if ($statut!=='publie'
+         AND isset($options['statut'])
+               AND $options['statut']=='publie')
+               return false;
+       $options['id_article']=$id_article;
+       return autoriser('modifier','evenement',$id,$qui,$options);
+}
+
+/**
+ * Autorisation de voir un evenement : autorisations de l'article parent
+ *
+ * @param string $faire
+ * @param string $quoi
+ * @param int $id
+ * @param int $qui
+ * @param array $options
+ * @return bool
+ */
+function autoriser_evenement_voir_dist($faire,$quoi,$id,$qui,$options){
+       if (!isset($options['id_article']) OR !$id_article=$options['id_article'])
+               $id_article = sql_getfetsel('id_article','spip_evenements','id_evenement='.intval($id));
+       if (!$id_article) return false;
+       return autoriser('voir','article',$id_article,$qui);
+}
+
+
+/**
+ * Autorisation de supprimer un evenement : autorisations de l'article parent
+ *
+ * @param string $faire
+ * @param string $quoi
+ * @param int $id
+ * @param int $qui
+ * @param array $options
+ * @return bool
+ */
+function autoriser_evenement_supprimer_dist($faire,$quoi,$id,$qui,$options){
+       if (!isset($options['id_article']) OR !$id_article=$options['id_article'])
+               $id_article = sql_getfetsel('id_article','spip_evenements','id_evenement='.intval($id));
+       if (!$id_article) {
+               if ($qui['statut']=='0minirezo')
+                       return true;
+               else
+                       return false;
+       }
+       return autoriser('modifier','article',$id_article,$qui);
+}
+
+
+?>
diff --git a/www/plugins/agenda_3_5/agenda_fonctions.php b/www/plugins/agenda_3_5/agenda_fonctions.php
new file mode 100644 (file)
index 0000000..2060d58
--- /dev/null
@@ -0,0 +1,197 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('public/agenda');
+include_spip('inc/agenda_filtres'); // deprecies mais encore supportes pour le moment
+
+/**
+ * Ajout d'un offset a une date
+ *
+ * @param string $date
+ * @param int $secondes
+ *   peut etre une expression math : 24*60*60
+ * @param string $format
+ *   format de sortie de la date
+ * @return string
+ */
+function agenda_dateplus($date,$secondes,$format="Y-m-d H:i:s"){
+       $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
+ *
+ * @param string $date
+ * @param int $decalage
+ * @param string $format
+ * @return string
+ */
+function agenda_moisdecal($date,$decalage,$format="Y-m-d H:i:s"){
+       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);
+}
+
+
+/**
+ * decale les jours de la date.
+ *
+ * @param string $date
+ * @param int $decalage
+ * @param string $format
+ * @return string
+ */
+function agenda_jourdecal($date,$decalage,$format="Y-m-d H:i:s"){
+       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;
+       $jour2 = $jour + $decalage;
+       $date2 = mktime(1, 1, 1, $mois, $jour2, $annee);
+       return date($format, $date2);
+}
+
+/**
+ * Filtre pour tester si une date est dans le futur
+ * [(#DATE|agenda_date_a_venir) Dans le futur...]
+ *
+ * @param string $date_test
+ * @param string $date_ref
+ *   date de reference, par defaut celle du serveur (argument utile pour les tests unitaires)
+ * @return string
+ */
+function agenda_date_a_venir($date_test,$date_ref=null){
+       if (is_null($date_ref))
+               $date_ref = $_SERVER['REQUEST_TIME'];
+       else
+               $date_ref = strtotime($date_ref);
+
+       return (strtotime($date_test)>$date_ref)?' ':'';
+}
+
+
+/**
+ * Filtre pour tester si une date est dans le passe
+ * [(#DATE|agenda_date_passee) Dans le passe...]
+ *
+ * @param string $date_test
+ * @param string $date_ref
+ *   date de reference, par defaut celle du serveur (argument utile pour les tests unitaires)
+ * @return string
+ */
+function agenda_date_passee($date_test,$date_ref=null){
+       if (is_null($date_ref))
+               $date_ref = $_SERVER['REQUEST_TIME'];
+       else
+               $date_ref = strtotime($date_ref);
+
+       return (strtotime($date_test)<$date_ref)?' ':'';
+}
+
+/**
+ * Determiner la date de debut de l'affichage de la liste des evenements
+ * en fonction du mode demande et de la date courante
+ * @param string $date
+ * @param string $affichage_debut
+ * @return string
+ */
+function agenda_date_debut_liste($date,$affichage_debut='date_jour'){
+       switch($affichage_debut){
+               case 'date_jour' :
+                       break;
+               case 'date_veille' :
+                       $date = agenda_jourdecal($date, -1);
+                       break;
+               case 'debut_semaine' :
+                       $t = strtotime($date);
+                       $date = agenda_jourdecal($date, -(date('N', $t)-1));
+                       break;
+               case 'debut_semaine_prec' :
+                       $t = strtotime($date);
+                       $date = agenda_jourdecal($date, -(date('N', $t)-1+7));
+                       break;
+               case 'debut_mois' :
+                       $t = strtotime($date);
+                       $date = agenda_jourdecal($date, -(date('j', $t)-1));
+                       break;
+               case 'debut_mois_prec' :
+                       $t = strtotime($date);
+                       $date = agenda_jourdecal($date, -(date('j', $t)-1)); // debut de mois
+                       $date = agenda_moisdecal($date, -1); // precedent
+                       break;
+               case 'debut_mois_1' :
+               case 'debut_mois_2' :
+               case 'debut_mois_3' :
+               case 'debut_mois_4' :
+               case 'debut_mois_5' :
+               case 'debut_mois_6' :
+               case 'debut_mois_7' :
+               case 'debut_mois_8' :
+               case 'debut_mois_9' :
+               case 'debut_mois_10' :
+               case 'debut_mois_11' :
+               case 'debut_mois_12' :
+                       $t = strtotime($date);
+                       $mdebut = intval(substr($affichage_debut,strlen('debut_mois_')));
+                       $mcourant = date('n', $t);
+                       $offset = ($mcourant-$mdebut+12)%12;
+                       $date = agenda_jourdecal($date, -(date('j', $t)-1)); // debut de mois
+                       $date = agenda_moisdecal($date, -$offset);
+                       break;
+       }
+       return $date;
+}
+/**
+ * Afficher la periode de l'agenda :
+ * Le nom du mois si nb_mois = 1
+ * L'annee si nb_mois=12 et debut du mois = janvier
+ * sinon : mois annee - mois annee (xxx 12 - yyy 13)
+ * si le debut de la periode est fixe (debut d'un mois donnee), on precede de
+ * "Annee" ou "Saison" la periode
+ *
+ * @param string $date
+ * @param int $nb_mois
+ * @param string $affichage_debut
+ * @return string
+ */
+function affdate_periode($date,$nb_mois,$affichage_debut='date_jour'){
+       $fixe = in_array($affichage_debut,array('debut_mois_1','debut_mois_2','debut_mois_3','debut_mois_4','debut_mois_5','debut_mois_6','debut_mois_7','debut_mois_8','debut_mois_9','debut_mois_10','debut_mois_11','debut_mois_12'));
+       if ($nb_mois==1)
+               return affdate_mois_annee($date);
+       if ($nb_mois==12 AND mois($date)==1)
+               return ($fixe?_T('agenda:label_annee').' ':'').annee($date);
+
+       return ($fixe?_T('agenda:label_periode_saison').' ':'').affdate_mois_annee($date)." - ".affdate_mois_annee(agenda_moisdecal($date, $nb_mois-1));
+}
+
+/**
+ * Raccourcis [->evenement12] et [->evt12]
+ */
+/*
+function generer_url_evenement($id, $args='', $ancre='') {
+       return array('evenement', $id);
+}*/
+
+?>
diff --git a/www/plugins/agenda_3_5/agenda_pipelines.php b/www/plugins/agenda_3_5/agenda_pipelines.php
new file mode 100644 (file)
index 0000000..a4eb8d0
--- /dev/null
@@ -0,0 +1,253 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Inserer la CSS de l'agenda si config cochee
+ * forcee par define('_AGENDA_INSERT_HEAD_CSS',false|true) par le squelette si besoin
+ *
+ * @param $flux
+ * @return mixed
+ */
+function agenda_insert_head_css($flux){
+       if (!defined('_AGENDA_INSERT_HEAD_CSS') OR !_AGENDA_INSERT_HEAD_CSS){
+               include_spip("inc/config");
+               $cfg = (defined('_AGENDA_INSERT_HEAD_CSS')?_AGENDA_INSERT_HEAD_CSS:lire_config("agenda/insert_head_css"));
+               if ($cfg){
+                       $flux .= '<link rel="stylesheet" type="text/css" href="'.find_in_path("css/spip.agenda.css").'" />';
+               }
+       }
+       return $flux;
+}
+
+/**
+ * Inserer les infos d'agenda sur les articles et rubriques
+ *
+ * @param array $flux
+ * @return array
+ */
+function agenda_affiche_milieu($flux) {
+       $e = trouver_objet_exec($flux['args']['exec']);
+       $out = "";
+       if ($e['type']=='rubrique'
+         AND autoriser('configurer')
+         AND $e['edition']==false
+         AND $id_rubrique = intval($flux['args']['id_rubrique'])
+         AND autoriser('modifier', 'rubrique', $id_rubrique)){
+               $activer = true;
+               $res = "";
+               $actif = sql_getfetsel('agenda','spip_rubriques','id_rubrique='.intval($id_rubrique));
+               $statut="-32";
+               $alt = "";
+               $voir = "";
+               if (!sql_countsel('spip_rubriques','agenda=1'))
+                       $res .= "<span class='small'>" . _T('agenda:aucune_rubrique_mode_agenda') . "</span><br />";
+               else {
+                       include_spip('inc/rubriques');
+                       if (sql_countsel('spip_rubriques',sql_in('id_rubrique',calcul_hierarchie_in($id_rubrique))." AND agenda=1 AND id_rubrique<>".intval($id_rubrique))){
+                               $alt = _T('agenda:rubrique_dans_une_rubrique_mode_agenda');
+                               $activer = false;
+                               $statut="-ok-32";
+                               $voir = _T('agenda:voir_evenements_rubrique');
+                       }
+                       elseif(!$actif) {
+                               $alt = _T('agenda:rubrique_sans_gestion_evenement').'<br />';
+                               $statut="-non-32";
+                       }
+                       if ($actif){
+                               $alt = _T('agenda:rubrique_mode_agenda').'<br />';
+                               $statut="-ok-32";
+                               $voir = _T('agenda:voir_evenements_rubrique');
+                       }
+               }
+
+               if (!$actif){
+                       if($activer){
+                               $res .= bouton_action(_T('agenda:rubrique_activer_agenda'),generer_action_auteur('activer_agenda_rubrique',$id_rubrique,self()),'ajax');
+                       }
+               }
+               else
+                       $res .= bouton_action(_T('agenda:rubrique_desactiver_agenda'),generer_action_auteur('activer_agenda_rubrique',"-$id_rubrique",self()),'ajax');
+               if ($voir)
+                       $res .= " | <a href='".generer_url_ecrire('evenements',"id_rubrique=$id_rubrique")."'>$voir</a>";
+               if ($res)
+                       $out .= boite_ouvrir(_T('agenda:agenda').http_img_pack("agenda$statut.png",$alt,"class='statut'",$alt),'simple agenda-statut')
+                         . $res
+                         . boite_fermer();
+       }
+       elseif ($e['type']=='article'
+         AND $e['edition']==false){
+               $id_article = $flux['args']['id_article'];
+               $out .= recuperer_fond('prive/objets/contenu/article-evenements',$flux['args']);
+       }
+
+       if ($out){
+               if ($p=strpos($flux['data'],'<!--affiche_milieu-->'))
+                       $flux['data'] = substr_replace($flux['data'],$out,$p,0);
+               else
+                       $flux['data'] .= $out;
+       }
+       return $flux;
+}
+
+/**
+ * Optimiser la base (evenements a la poubelle, lies a des articles disparus, ou liens mots sur evenements disparus)
+ *
+ * @param array $flux
+ * @return array
+ */
+function agenda_optimiser_base_disparus($flux){
+
+       # passer a la poubelle
+       # les evenements lies a un article inexistant
+       $res = sql_select("DISTINCT evenements.id_article","spip_evenements AS evenements
+                       LEFT JOIN spip_articles AS articles
+                       ON evenements.id_article=articles.id_article","articles.id_article IS NULL");
+       while ($row = sql_fetch($res))
+               sql_updateq("spip_evenements",array('statut'=>'poubelle'),"id_article=".$row['id_article']);
+
+       // Evenements a la pouvelle
+       sql_delete("spip_evenements", "statut='poubelle' AND maj < ".$flux['args']['date']);
+
+       include_spip('action/editer_liens');
+       // optimiser les liens de tous les mots vers des objets effaces
+       // et depuis des mots effaces
+       $flux['data'] += objet_optimiser_liens(array('mot'=>'*'),array('evenement'=>'*'));
+
+       return $flux;
+}
+
+
+/**
+ * Lister les evenements dans le calendrier de l'espace prive (extension organiseur)
+ *
+ * @param array $flux
+ * @return array
+ */
+function agenda_quete_calendrier_prive($flux){
+       $quoi = $flux['args']['quoi'];
+       if (!$quoi OR $quoi=='evenements'){
+               $start = sql_quote($flux['args']['start']);
+               $end = sql_quote($flux['args']['end']);
+               $res = sql_select('*','spip_evenements AS E',"((E.date_fin >= $start OR E.date_debut >= $start) AND E.date_debut <= $end)");
+               while ($row = sql_fetch($res)){
+                       $flux['data'][] = array(
+                               'id' => $row['id_evenement'],
+                               'title' => $row['titre'],
+                               'allDay' => false,
+                               'start' => $row['date_debut'],
+                               'end' => $row['date_fin'],
+                               'url' => str_replace("&amp;","&",generer_url_entite($row['id_evenement'],'evenement')),
+                               'className' => "calendrier-event evenement calendrier-couleur5",
+                               'description' => $row['descriptif'],
+                       );
+               }
+       }
+       return $flux;
+}
+
+/**
+ * Synchroniser le statut des evenements lorsqu'on publie/depublie un article
+ * @param array $flux
+ * @return array
+ */
+function agenda_post_edition($flux){
+       if ($flux['args']['table']=='spip_articles'
+         AND $flux['args']['action'] == 'instituer'
+         AND $id_article = $flux['args']['id_objet']
+         AND isset($flux['data']['statut'])
+         AND $statut = $flux['data']['statut']
+         AND $statut_ancien = $flux['args']['statut_ancien']
+         AND $statut!=$statut_ancien){
+
+               $set = array();
+               // les evenements principaux, associes a cet article
+               $where = array('id_article='.intval($id_article),'id_evenement_source=0');
+               switch($statut){
+                       case 'poubelle':
+                               // on passe aussi tous les evenements associes a la poubelle, sans distinction
+                               $set['statut'] = 'poubelle';
+                               break;
+                       case 'publie':
+                               // on passe aussi tous les evenements prop en publie
+                               $set['statut'] = 'publie';
+                               $where[] = "statut='prop'";
+                               break;
+                       default:
+                               if ($statut_ancien=='publie'){
+                                       // on depublie aussi tous les evenements publie
+                                       $set['statut'] = 'prop';
+                                       $where[] = "statut='publie'";
+                               }
+                               break;
+               }
+               if (count($set)){
+                       include_spip('action/editer_evenement');
+                       $res = sql_select('id_evenement','spip_evenements',$where);
+                       // et on applique a tous les evenements lies a l'article
+                       while ($row = sql_fetch($res)){
+                               evenement_modifier($row['id_evenement'],$set);
+                       }
+               }
+       }
+       return $flux;
+}
+
+/*
+ * Synchroniser les liaisons (mots, docs, gis, etc) de l'événement édité avec ses répétitions s'il en a
+ * @param array $flux
+ * @param array
+ */
+function agenda_post_edition_lien($flux){
+       // Si on est en train de lier ou délier quelque chose a un événement
+       if ($flux['args']['objet'] == 'evenement'){
+               // On cherche si cet événement a des répétitions
+               if ($id_evenement = $flux['args']['id_objet']
+                       and $id_evenement > 0
+                       and $repetitions = sql_allfetsel('id_evenement', 'spip_evenements', 'id_evenement_source = '.$id_evenement)
+                       and is_array($repetitions)
+               ){
+                       include_spip('action/editer_liens');
+                       
+                       // On a la liste des ids des répétitions
+                       $repetitions = array_map('reset', $repetitions);
+                       
+                       // Si c'est un ajout de lien, on l'ajoute à toutes les répétitions
+                       if ($flux['args']['action'] == 'insert'){
+                               objet_associer(
+                                       array($flux['args']['objet_source'] => $flux['args']['id_objet_source']),
+                                       array('evenement' => $repetitions)
+                               );
+                       }
+                       // Si c'est une suppression de lien, on le supprime à toutes les répétitions
+                       elseif ($flux['args']['action'] == 'delete'){
+                               objet_dissocier(
+                                       array($flux['args']['objet_source'] => $flux['args']['id_objet_source']),
+                                       array('evenement' => $repetitions)
+                               );
+                       }
+               }
+       }
+       
+       return $flux;
+}
+
+/**
+ * Les evenements peuvent heriter des compositions des articles
+ * @param array $heritages
+ * @return array
+ */
+function agenda_compositions_declarer_heritage($heritages) {
+       $heritages['evenement'] = 'article';
+       return $heritages;
+}
+
+
+?>
diff --git a/www/plugins/agenda_3_5/base/agenda_evenements.php b/www/plugins/agenda_3_5/base/agenda_evenements.php
new file mode 100644 (file)
index 0000000..f4e61fb
--- /dev/null
@@ -0,0 +1,149 @@
+<?php\r
+/**\r
+ * Plugin Agenda 4 pour Spip 3.0\r
+ * Licence GPL 3\r
+ *\r
+ * 2006-2011\r
+ * Auteurs : cf paquet.xml\r
+ */\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+\r
+/**\r
+ * Interfaces du compilateur\r
+ *\r
+ * @param array $interface\r
+ * @return array\r
+ */\r
+function agenda_declarer_tables_interfaces($interface){\r
+       // 'spip_' dans l'index de $tables_principales\r
+       $interface['table_des_tables']['evenements']='evenements';\r
+       \r
+       $interface['table_des_traitements']['LIEU'][]= 'expanser_liens('._TRAITEMENT_TYPO.')';\r
+       $interface['table_des_traitements']['ADRESSE'][]= _TRAITEMENT_RACCOURCIS;\r
+       \r
+       // permet d'utiliser les criteres racine, meme_parent, id_parent\r
+       $interface['exceptions_des_tables']['evenements']['id_parent']='id_evenement_source';\r
+       $interface['exceptions_des_tables']['evenements']['id_rubrique']=array('spip_articles', 'id_rubrique');\r
+               \r
+       return $interface;\r
+}\r
+\r
+/**\r
+ * Tables auxiliaires de liens\r
+ * @param array $tables_auxiliaires\r
+ * @return array\r
+ */\r
+function agenda_declarer_tables_auxiliaires($tables_auxiliaires){\r
+\r
+       //-- Table des participants ----------------------\r
+       $spip_evenements_participants = array(\r
+                       "id_evenement"  => "BIGINT (21) DEFAULT '0' NOT NULL",\r
+                       "id_auteur"     => "BIGINT (21) DEFAULT '0' NOT NULL",\r
+                       "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",\r
+                       "reponse" => "char(3) default '?' NOT NULL", // oui, non, ?\r
+                       );\r
+       \r
+       $spip_evenements_participants_key = array(\r
+                       "PRIMARY KEY"   => "id_evenement, id_auteur",\r
+                       "KEY id_auteur" => "id_auteur");\r
+       \r
+       $tables_auxiliaires['spip_evenements_participants'] = array(\r
+               'field' => &$spip_evenements_participants,\r
+               'key' => &$spip_evenements_participants_key);\r
+\r
+       return $tables_auxiliaires;\r
+}\r
+\r
+/**\r
+ * Declarer la table objet evenement\r
+ *\r
+ * @param array $tables\r
+ * @return array\r
+ */\r
+function agenda_declarer_tables_objets_sql($tables){\r
+       $tables['spip_evenements'] = array(\r
+               'page'=>'evenement',\r
+               'texte_retour' => 'icone_retour',\r
+               'texte_objets' => 'agenda:info_evenements',\r
+               'texte_objet' => 'agenda:info_evenement',\r
+               'texte_modifier' => 'agenda:icone_modifier_evenement',\r
+               'texte_creer' => 'agenda:titre_cadre_ajouter_evenement',\r
+               'texte_logo_objet' => 'agenda:texte_logo_objet',\r
+               'info_aucun_objet'=> 'agenda:info_aucun_evenement',\r
+               'info_1_objet' => 'agenda:info_un_evenement',\r
+               'info_nb_objets' => 'agenda:info_nombre_evenements',\r
+               'titre' => 'titre, "" AS lang',\r
+               'date' => 'date_debut',\r
+               'principale' => 'oui',\r
+               'champs_editables' => array('date_debut', 'date_fin', 'titre', 'descriptif','lieu', 'adresse', 'inscription', 'places', 'horaire'),\r
+               'field'=> array(\r
+                       "id_evenement"  => "bigint(21) NOT NULL",\r
+                       "id_article"    => "bigint(21) DEFAULT '0' NOT NULL",\r
+                       "date_debut"    => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",\r
+                       "date_fin"      => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",\r
+                       "titre" => "text NOT NULL DEFAULT ''",\r
+                       "descriptif"    => "text NOT NULL DEFAULT ''",\r
+                       "lieu"  => "text NOT NULL DEFAULT ''",\r
+                       "adresse"       => "text NOT NULL DEFAULT ''",\r
+                       "inscription" => "tinyint(1) DEFAULT 0 NOT NULL",\r
+                       "places" => "int(11) DEFAULT 0 NOT NULL",\r
+                       "horaire" => "varchar(3) DEFAULT 'oui' NOT NULL",\r
+                       "id_evenement_source"   => "bigint(21) NOT NULL",\r
+                       "statut"        => "varchar(10) DEFAULT '0' NOT NULL",\r
+                       "maj"   => "TIMESTAMP",\r
+                       "date_creation" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"\r
+               ),\r
+               'key' => array(\r
+                       "PRIMARY KEY"   => "id_evenement",\r
+                       "KEY date_debut"        => "date_debut",\r
+                       "KEY date_fin"  => "date_fin",\r
+                       "KEY id_article"        => "id_article"\r
+               ),\r
+               'join' => array(\r
+                       "id_evenement"=>"id_evenement",\r
+                       "id_article"=>"id_article"\r
+               ),\r
+               'tables_jointures' => array(\r
+                       'articles',\r
+                       'evenements_participants',\r
+               ),\r
+               'rechercher_champs' => array(\r
+                 'titre' => 8, 'descriptif' => 5, 'lieu' => 5, 'adresse' => 3\r
+               ),\r
+               'rechercher_jointures' => array(\r
+                       'document' => array('titre' => 2, 'descriptif' => 1)\r
+               ),\r
+               'statut' => array(\r
+                       array(\r
+                               'champ' => 'statut',\r
+                               'publie' => 'publie',\r
+                               'previsu' => '!',\r
+                               'exception' => array('statut','tout')\r
+                       ),\r
+               ),\r
+               'statut_titres' => array(\r
+                       'prop'=>'agenda:info_evenement_propose',\r
+                       'publie'=>'agenda:info_evenement_publie',\r
+                       'poubelle'=>'agenda:info_evenement_supprime'\r
+               ),\r
+               'statut_textes_instituer' =>    array(\r
+                       'prop' => 'texte_statut_propose_evaluation',\r
+                       'publie' => 'texte_statut_publie',\r
+                       'poubelle' => 'texte_statut_poubelle',\r
+               ),\r
+               'texte_changer_statut' => 'agenda:texte_evenement_statut',\r
+               'champs_versionnes' => array('id_article', 'titre', 'descriptif', 'lieu', 'adresse', 'date_debut', 'date_fin', 'horaire'),\r
+\r
+       );\r
+\r
+       //-- Jointures ----------------------------------------------------\r
+       $tables['spip_articles']['tables_jointures'][] = 'evenements';\r
+       $tables['spip_auteurs']['tables_jointures'][] = 'evenements_participants';\r
+       $tables['spip_rubriques']['field']['agenda'] = 'tinyint(1) DEFAULT 0 NOT NULL';\r
+\r
+       return $tables;\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/css/spip.agenda.css b/www/plugins/agenda_3_5/css/spip.agenda.css
new file mode 100644 (file)
index 0000000..795e0c5
--- /dev/null
@@ -0,0 +1,36 @@
+
+.evenement.one {padding: 0.75em;background: #eee;margin-bottom: 1.5em;}
+.evenement.one .lire-la-suite {display: none;}
+
+.long .liste-items .evenement {padding-left: 7.5em;}
+.long .liste-items .evenement .banner {display:block;float: left;margin-left: -7.5em;width: 5.5em;text-align: center;overflow: hidden;opacity: 0.7;}
+.long .liste-items .evenement .banner .label {display: block;padding:0.75em 0;}
+.long .liste-items .evenement .banner .day {display: block;text-align: center;font-size: 2em;line-height: 1;}
+.long .liste-items .evenement .banner .month {display: block;text-align: center;text-transform: uppercase;font-size: 0.85em;}
+.long .liste-items .evenement .banner .year {display: block;text-align: center;font-size: 0.85em;}
+
+/*.long .liste-items.evenements .item.month, .long .liste-items.evenements .item.month {padding: 0.75em;background: #e4e4e4; text-transform: uppercase;}*/
+.liste-items.evenements .item.fini  .entry-title a {color:#ccc;}
+.liste-items.evenements .item.fini  .entry-content {margin-bottom: 0;max-height: 4.5em;overflow: hidden;}
+.liste-items.evenements .item.fini  .meta-publi {display: none;}
+.liste-items.evenements .item.fini  .lire-la-suite {display: none;}
+.liste-items.evenements .item.fini  .evenement .banner {opacity: 0.5;}
+
+.liste-items.evenements.short .info-publi, .short .liste-items.evenements .info-publi {display:block;margin: 0;}
+.liste-items.evenements .meta-publi {left:7.5em;}
+.liste-items.evenements .lire-la-suite {left:7.5em;}
+.liste-items.evenements .entry-title {margin-top: 0;}
+
+.page_jour .liste-items.evenements .evenement .banner {display: none;}
+.page_jour .long .liste-items .evenement{padding-left: 0;}
+.page_jour .liste-items.evenements .meta-publi {left:0;}
+.page_jour .liste-items.evenements .lire-la-suite {left:0;}
+
+/*
+.liste-items.evenements.short .evenement {padding-left: 0;background-image: none;}
+.liste-items.evenements.short .entry-title {margin: 0;font-size: inherit;}
+.liste-items.evenements.short .banner {display: none;}
+.liste-items.evenements.short .entry-content {display: none;}
+.liste-items.evenements.short .lire-la-suite {display: none;}
+.liste-items.evenements.short .meta-publi {display: none;}
+*/
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/demo/agenda_calendrier_mini.html b/www/plugins/agenda_3_5/demo/agenda_calendrier_mini.html
new file mode 100644 (file)
index 0000000..34e8c5b
--- /dev/null
@@ -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>
diff --git a/www/plugins/agenda_3_5/demo/exemple_navigation_jours.html b/www/plugins/agenda_3_5/demo/exemple_navigation_jours.html
new file mode 100644 (file)
index 0000000..b3b318b
--- /dev/null
@@ -0,0 +1,8 @@
+\r
+[<a href="(#URL_PAGE{jour}|parametre_url{date,[(#VAL{Y-m-d}|date{#VAL{-1 day}|strtotime{#ENV{date}|affdate{U}}})]})" title="jour précédent">\r
+[(#VAL{Y-m-d}|date{#VAL{-1 day}|strtotime{#ENV{date}|affdate{U}}}|nom_jour)]&nbsp;&#8249;</a>]\r
+       \r
+[(#EVAL{' '}|concat{[(#ENV{date}|nom_jour) ],#ENV{date}|jour})]\r
+\r
+[<a href="(#URL_PAGE{jour}|parametre_url{date,[(#VAL{Y-m-d}|date{#VAL{+1 day}|strtotime{#ENV{date}|affdate{U}}})]})"\r
+title="jour suivant">&#8250;&nbsp; [(#VAL{Y-m-d}|date{#VAL{+1 day}|strtotime{#ENV{date}|affdate{U}}}|nom_jour)]</a>]
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/demo/test/test_boucle_evenements.html b/www/plugins/agenda_3_5/demo/test/test_boucle_evenements.html
new file mode 100644 (file)
index 0000000..91769a1
--- /dev/null
@@ -0,0 +1,9 @@
+<BOUCLE_eve(EVENEMENTS)>
+#ID_EVENEMENT:
+</BOUCLE_eve>
+
+<BOUCLE_rub1(RUBRIQUES){id_rubrique=1}>
+<BOUCLE_eve1(EVENEMENTS){branche}>
+plop
+</BOUCLE_eve1>
+</BOUCLE_rub1>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/demo/test/testagenda.html b/www/plugins/agenda_3_5/demo/test/testagenda.html
new file mode 100644 (file)
index 0000000..8e994db
--- /dev/null
@@ -0,0 +1,36 @@
+<h1>{id_mot}</h1>
+<ul>
+<BOUCLE_ListeMots(MOTS)>
+<li>#TITRE
+       <B_Evenements>
+       <ul>
+       <BOUCLE_Evenements(EVENEMENTS){id_mot}>
+               <li>#TITRE</li>
+       </BOUCLE_Evenements>
+       </ul>
+       </B_Evenements>
+</li>
+</BOUCLE_ListeMots>
+</ul>
+
+<h1>{titre_mot}</h1>
+<ul>
+<BOUCLE_ListeEvenements(EVENEMENTS){titre_mot=mc1}>
+       <li>#TITRE</li>
+</BOUCLE_ListeEvenements>
+</ul>
+
+<h1>{branche}</h1>
+<ul>
+<BOUCLE_ListeSecteurs(RUBRIQUES){racine}>
+<li>#TITRE
+       <B_EvenementsSecteur>
+       <ul>
+       <BOUCLE_EvenementsSecteur(EVENEMENTS){branche}>
+               <li>#TITRE</li>
+       </BOUCLE_EvenementsSecteur>
+       </ul>
+       </B_EvenementsSecteur>
+</li>
+</BOUCLE_ListeSecteurs>
+</ul>
diff --git a/www/plugins/agenda_3_5/formulaires/configurer_agenda.html b/www/plugins/agenda_3_5/formulaires/configurer_agenda.html
new file mode 100644 (file)
index 0000000..7d61bbd
--- /dev/null
@@ -0,0 +1,105 @@
+<div class="ajax formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}">
+       <h3 class="titrem"><:configureragenda:titre_configuration:></h3>
+       [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
+       [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>]
+
+       <form method='post' action='#ENV{action}'><div>
+               [(#REM) déclarer les hidden qui déclencheront le service du formulaire
+               paramêtre : url d'action ]
+               #ACTION_FORMULAIRE{#ENV{action}}
+               #SET{fl,configureragenda}
+                               <ul>
+                               <!--EX01-->
+                               #SET{name,titre}#SET{obli,''}[(#SET{defaut,<:agenda:titre_sur_l_agenda:>})]#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                               <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                                       <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                                       <span class='erreur_message'>(#GET{erreurs})</span>
+                                       ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
+                               </li>
+                               #SET{name,descriptif}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                               <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                                       <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                                       <span class='erreur_message'>(#GET{erreurs})</span>
+                                       ]<textarea name="#GET{name}" class="textarea">
+#ENV*{#GET{name},#GET{defaut}}</textarea>
+                               </li>
+                               #SET{name,url_evenement}#SET{obli,''}#SET{defaut,'evenement'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                               <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                                       <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                                       <span class='erreur_message'>(#GET{erreurs})</span>
+                                       ]
+                                       #SET{val,evenement}
+                                       <div class="choix">
+                                               <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                                       </div>
+                                       #SET{val,article}
+                                       <div class="choix">
+                                               <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                                       </div>
+                               </li>
+                               [(#VAL{_AGENDA_INSERT_HEAD_CSS}|defined|non)
+                               #SET{name,insert_head_css}#SET{obli,''}#SET{defaut,1}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                               <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
+                                       <span class='erreur_message'>(#GET{erreurs})</span>
+                                       ]
+                                       #SET{val,1}
+                                       <div class="choix">
+                                               <input type="checkbox" name="#GET{name}" class="checkbox" id="#GET{name}_#GET{val}" value="#GET{val}"[(#GET{val}|=={#ENV{#GET{name},#GET{defaut}}}|oui)checked="checked"] />
+                                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                                       </div>
+                               </li>
+                               ]
+                               <li class="fieldset">
+                                       <fieldset>
+                                               <legend><:configureragenda:legend_presentation_agenda:></legend>
+                                               <ul>
+                                                       #SET{name,affichage_debut}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                                                       <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                                                               <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                                                               <span class='erreur_message'>(#GET{erreurs})</span>
+                                                               ]<select name="#GET{name}" class="select" id="#GET{name}">
+                                                                       #SET{val,date_jour}
+                                                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</option>
+                                                                       #SET{val,date_veille}
+                                                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</option>
+                                                                       #SET{val,debut_semaine}
+                                                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</option>
+                                                                       #SET{val,debut_semaine_prec}
+                                                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</option>
+                                                                       #SET{val,debut_mois}
+                                                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</option>
+                                                                       #SET{val,debut_mois_prec}
+                                                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</option>
+                                                                       #SET{val,debut_mois_1}
+                                                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</option>
+                                                                       <BOUCLE_dmois(DATA){enum 2,12}>
+                                                                               #SET{val,debut_mois_#VALEUR}
+                                                                               <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_',#GET{name},'_mois_passe'}|_T{[(#ARRAY{mois,[(#VAL{date_mois_}|concat{#VALEUR}|_T|ucfirst)]})]})]</option>
+                                                                       </BOUCLE_dmois>
+                                                               </select>
+                                                       </li>
+                                                       #SET{name,affichage_duree}#SET{obli,''}#SET{defaut,1}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                                                       <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                                                               <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                                                               <span class='erreur_message'>(#GET{erreurs})</span>
+                                                               ]<select name="#GET{name}" class="select" id="#GET{name}">
+                                                                       <BOUCLE_nmois(DATA){enum 1,12}>
+                                                                               #SET{val,#VALEUR}
+                                                                               <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{val}|singulier_ou_pluriel{agenda:info_1_mois,agenda:info_nb_mois})]</option>
+                                                                       </BOUCLE_nmois>
+                                                               </select>
+                                                       </li>
+                                               </ul>
+                                       </fieldset>
+                               </li>
+                       </ul>
+
+         [(#REM) ajouter les saisies supplémentaires : extra et autre, à cet endroit ]
+         <!--extra-->
+         <p class='boutons'><span class='image_loading'>&nbsp;</span>
+                       <input type='submit' name="cancel" class='submit' value='<:bouton_annuler|attribut_html:>' />
+                       <input type='submit' class='submit' value='<:bouton_enregistrer|attribut_html:>' /></p>
+       </div></form>
+</div>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/formulaires/editer_evenement.html b/www/plugins/agenda_3_5/formulaires/editer_evenement.html
new file mode 100644 (file)
index 0000000..269778e
--- /dev/null
@@ -0,0 +1,113 @@
+<div class="formulaire_spip formulaire_editer formulaire_editer_evenement formulaire_editer_evenemnt-#ENV{id_evenement,nouveau}">
+       [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
+       [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>]
+       [(#ENV{editable})
+       <form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
+               [(#REM) declarer les hidden qui declencheront le service du formulaire 
+               parametre : url d'action ]
+               #ACTION_FORMULAIRE{#ENV{action}}
+               <input type='hidden' name='id_evenement' value='#ID_EVENEMENT' />
+               <input type='hidden' name='id_parent' value='#ENV{id_parent}' />
+         <ul>
+                       <li class="editer_titre obligatoire[ (#ENV**{erreurs}|table_valeur{titre}|oui)erreur]">
+                               <label for="titre"><:agenda:evenement_titre:></label>[
+                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{titre})</span>
+                               ]<input type='text' class='text' name='titre' id='titre' value="#ENV{titre}" />
+                       </li>
+               <li class='editer_parent[ (#ENV**{erreurs}|table_valeur{id_parent}|oui)erreur]'>
+               <label for="id_parent"><:agenda:evenement_article:></label>[
+               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{id_parent})</span>
+               ]<INCLURE{fond=formulaires/selecteur/articles}{selected=#ENV{parents_id}}{id_article=#ENV{id_parent}}{name=parents_id}{select=1}{rubriques=0}>
+               </li>
+           <li class='editer_date fieldset'><fieldset><legend><:agenda:evenement_date:></legend>
+                               <ul>
+                                       <li class="editer_horaire[ (#ENV**{erreurs}|table_valeur{horaire}|oui)erreur]">
+                                               <label for="horaire"><:agenda:evenement_horaire:></label>[
+                                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{horaire})</span>
+                                               ]<input type='checkbox' name='horaire' id='horaire' value='non' [(#ENV{horaire}|=={oui}|non)checked='checked']
+                                                       onclick="if (this.checked==false) { $('span.afficher_horaire').show();} else {$('span.afficher_horaire').hide();}" />
+                                       </li>
+                                       <li class="editer_date_debut_fin[ (#ENV**{erreurs}|table_valeur{date_debut}|oui)erreur][ (#ENV**{erreurs}|table_valeur{date_fin}|oui)erreur]">
+                                               [
+                                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{date_debut})</span>][
+                                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{date_fin})</span>
+                                               ]<label for="date_debut"><:agenda:evenement_date_de:></label><input type='text' class='text date' name='date_debut' id='date_debut' size='10' maxlength='10' value="[(#ENV{date_debut})]" />
+                                               <span class='afficher_horaire[(#ENV{horaire}|=={oui}|non)none]'>
+                                               <label for='heure_debut' class='heure'><:agenda:evenement_date_a_immediat:></label>
+                                               <input type='text' class='text heure' name='heure_debut' id='heure_debut' size='4' maxlength='5' value="[(#ENV{heure_debut})]"
+                                               /></span>
+                                               <label for="date_fin" class='date_fin'><:agenda:evenement_date_a:></label>
+                                               <span class='afficher_horaire[(#ENV{horaire}|=={oui}|non)none]'><label for='heure_fin' class='heure'><:agenda:evenement_date_a_immediat:></label>
+                                               <input type='text' class='text heure' name='heure_fin' id='heure_fin' size='4' maxlength='5' value="[(#ENV{heure_fin})]"
+                                               /></span><input type='text' class='text date' name='date_fin' id='date_fin' size='10' maxlength='10' value="[(#ENV{date_fin})]" />
+                                       </li>
+                               </ul>
+           </fieldset></li>
+                       <li class="editer_repetitions[ (#ENV**{erreurs}|table_valeur{repetitions}|oui)erreur]">
+                               <label for="repetitions"><:agenda:evenement_repetitions:></label>[
+                               (#ENV{repetitions}|non)<a href='#' onclick="$(this).hide().next().show('fast');return false;"><:agenda:ajouter_repetition:></a>
+                               <div class='ajouter_repetitions none'>][
+                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{repetitions})</span>
+                               ]<div id='repetitions_picker'></div>
+                               <textarea name='repetitions' id='repetitions'>#ENV{repetitions}</textarea>[
+                               (#ENV{repetitions}|non)</div>]
+                       </li>
+           <li class="editer_descriptif[ (#ENV**{erreurs}|table_valeur{descriptif}|oui)erreur]">
+                               <label for="descriptif"><:agenda:evenement_descriptif:></label>[
+                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{descriptif})</span>
+                               ]<textarea name='descriptif' rows='5' id='descriptif' class="inserer_barre_edition">[(#ENV{descriptif})]</textarea>
+           </li>[
+               (#ENV{affiche_inscription,oui}|=={oui}|oui)
+           <li class="editer_inscription[ (#ENV**{erreurs}|table_valeur{inscription}|oui)erreur]">
+                   <div class='choix inscription'>
+                                       [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{inscription})</span>]
+                                       <input type='checkbox' class='checkbox' name='inscription' id='inscription' value="1"[ (#ENV{inscription}|oui)checked="checked"] />
+                                       <label for="inscription"><:agenda:label_inscription:></label>
+                               </div><div class='choix places'>
+                               <label for="places"><:agenda:label_places:></label>[
+                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{places})</span>
+                               ]<input type='text' class='text' name='places' id='places' value="[(#ENV{places})]" />
+                               </div>
+           </li>]
+           <li class="editer_lieu[ (#ENV**{erreurs}|table_valeur{lieu}|oui)erreur]">
+                               <label for="lieu"><:agenda:evenement_lieu:></label>[
+                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{lieu})</span>
+                               ]<input type='text' class='text' name='lieu' id='lieu' value="[(#ENV{lieu})]" />
+           </li>
+           <li class="editer_adresse[ (#ENV**{erreurs}|table_valeur{adresse}|oui)erreur]">
+                               <label for="adresse"><:agenda:evenement_adresse:></label>[
+                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{adresse})</span>
+                               ]<textarea name='adresse' rows='3' id='adresse'>[(#ENV{adresse})]</textarea>
+           </li>
+         </ul>
+         [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
+         <!--extra-->
+         <p class='boutons'><input type='submit' class='submit' value='[(#ENV{id_evenement}|?{<:bouton_enregistrer:>,<:bouton_ajouter:>})]' /></p>
+       </div></form>
+       #INCLURE{fond=formulaires/dateur/inc-dateur}
+       ]
+</div>
+<script type="text/javascript">
+       var repetitions_done = false;
+       jQuery(document).bind('datePickerLoaded',function(){
+               if (!repetitions_done){
+                       repetitions_done = true;
+                       jQuery.getScript('#CHEMIN{javascript/jquery-ui.multidatespicker.js}',function(){
+                               var multidate_picker_options = {altField: '#repetitions'};
+                               /**
+                                * Multidatepicker n'aime pas un array vide apparemment
+                                */
+                               if(jQuery('#repetitions').html() != ""){
+                                       multidate_picker_options.addDates = jQuery('#repetitions').html().split(',');
+                               }
+                               jQuery('#repetitions_picker')
+                                       .multiDatesPicker(jQuery.extend(
+                                                               date_picker_options(),
+                                                               multidate_picker_options
+                                       ))
+                                       .addClass('.pickable'); // une seule fois;
+                               jQuery('#repetitions').attr("readonly","readonly");
+                       });
+               }
+       });
+</script>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/formulaires/editer_evenement.php b/www/plugins/agenda_3_5/formulaires/editer_evenement.php
new file mode 100644 (file)
index 0000000..fe89622
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/actions');
+include_spip('inc/editer');
+include_spip('inc/autoriser');
+
+function formulaires_editer_evenement_charger_dist($id_evenement='new', $id_article=0, $retour='', $lier_trad = 0, $config_fonc='evenements_edit_config', $row=array(), $hidden=''){
+
+       $valeurs = formulaires_editer_objet_charger('evenement',$id_evenement,$id_article,0,$retour,$config_fonc,$row,$hidden);
+
+       if (!$valeurs['id_article'])
+               $valeurs['id_article'] = $id_article;
+       if (!$valeurs['titre'])
+               $valeurs['titre'] = sql_getfetsel('titre','spip_articles','id_article='.intval($valeurs['id_article']));
+       $valeurs['id_parent'] = $valeurs['id_article'];
+       unset($valeurs['id_article']);
+       // pour le selecteur d'article(s) optionnel
+       $valeurs['parents_id'] = array("article|".$valeurs['id_parent']);
+
+       // fixer la date par defaut en cas de creation d'evenement
+       if (!intval($id_evenement)){
+               $t=time();
+               $valeurs["date_debut"] = date('Y-m-d H:i:00',$t);
+               $valeurs["date_fin"] = date('Y-m-d H:i:00',$t+3600);
+               $valeurs['horaire'] = 'oui';
+       }
+
+       // les repetitions
+       $valeurs['repetitions'] = array();
+       if (intval($id_evenement)){
+               $repetitons = sql_allfetsel("date_debut","spip_evenements","id_evenement_source=".intval($id_evenement),'','date_debut');
+               foreach($repetitons as $d)
+                       $valeurs['repetitions'][] = date('d/m/Y',strtotime($d['date_debut']));
+       }
+       $valeurs['repetitions'] = implode(',',$valeurs['repetitions']);
+
+       // dispatcher date et heure
+       list($valeurs["date_debut"],$valeurs["heure_debut"]) = explode(' ',date('d/m/Y H:i',strtotime($valeurs["date_debut"])));
+       list($valeurs["date_fin"],$valeurs["heure_fin"]) = explode(' ',date('d/m/Y H:i',strtotime($valeurs["date_fin"])));
+
+       // traiter specifiquement l'horaire qui est une checkbox
+       if (_request('date_debut') AND !_request('horaire'))
+               $valeurs['horaire'] = 'oui';
+
+       // Pouvoir interdire l'affichage de l'inscription (puisque ce n'est pas traite' par le plugin)
+       $valeurs['affiche_inscription'] = $GLOBALS['agenda_affiche_inscription'];
+
+       $valeurs['places'] = intval($valeurs['places']);
+
+       return $valeurs;
+}
+
+/**
+ * Identifier le formulaire en faisant abstraction des parametres qui
+ * ne representent pas l'objet edite
+ */
+function formulaires_editer_evenement_identifier_dist($id_evenement='new', $id_article=0, $retour='', $lier_trad = 0, $config_fonc='evenements_edit_config', $row=array(), $hidden=''){
+       return serialize(array(intval($id_evenement),$lier_trad));
+}
+
+
+function evenements_edit_config(){
+       return array();
+}
+
+function formulaires_editer_evenement_verifier_dist($id_evenement='new', $id_article=0, $retour='', $lier_trad = 0, $config_fonc='evenements_edit_config', $row=array(), $hidden=''){
+       $erreurs = formulaires_editer_objet_verifier('evenement',$id_evenement,array('titre','date_debut','date_fin'));
+
+       include_spip('inc/date_gestion');
+
+       $horaire = _request('horaire')=='non'?false:true;
+       $date_debut = verifier_corriger_date_saisie('debut',$horaire,$erreurs);
+       $date_fin = verifier_corriger_date_saisie('fin',$horaire,$erreurs);
+
+       if ($date_debut AND $date_fin AND $date_fin<$date_debut)
+               $erreurs['date_fin'] = _T('agenda:erreur_date_avant_apres');
+
+       include_spip('formulaires/selecteur/selecteur_fonctions');
+       if (count($id = picker_selected(_request('parents_id'),'article'))
+         AND $id = reset($id)
+         AND $id = sql_getfetsel('id_article','spip_articles','id_article='.intval($id))){
+         // reinjecter dans id_parent
+         set_request('id_parent',$id);
+       }
+
+       if (!$id_parent = intval(_request('id_parent')))
+               $erreurs['id_parent'] = _T('agenda:erreur_article_manquant');
+       else {
+               if (!autoriser('creerevenementdans','article',$id_parent))
+                       $erreurs['id_parent'] = _T('agenda:erreur_article_interdit');
+       }
+
+       #if (!count($erreurs))
+       #       $erreurs['message_erreur'] = 'ok?';
+       return $erreurs;
+}
+
+function formulaires_editer_evenement_traiter_dist($id_evenement='new', $id_article=0, $retour='', $lier_trad = 0, $config_fonc='evenements_edit_config', $row=array(), $hidden=''){
+       set_request('horaire',_request('horaire')=='non'?'non':'oui');
+       set_request('inscription',_request('inscription')?1:0);
+       include_spip('inc/date_gestion');
+       $erreurs = array();
+       $date_debut = verifier_corriger_date_saisie('debut',_request('horaire')=='oui',$erreurs);
+       $date_fin = verifier_corriger_date_saisie('fin',_request('horaire')=='oui',$erreurs);
+       set_request('date_debut',date('Y-m-d H:i:s',$date_debut));
+       set_request('date_fin',date('Y-m-d H:i:s',$date_fin));
+
+       $res = formulaires_editer_objet_traiter('evenement',$id_evenement,$id_article,0,$retour,$config_fonc,$row,$hidden);
+       // si c'est une creation dans un article publie, passer l'evenement en publie
+       // l'article peut être renseigné/modifié par l'utilisateur dans le formulaire. On le retrouve.
+       if (!intval($id_evenement)
+         AND $id_article = sql_getfetsel('id_article', 'spip_evenements', 'id_evenement='.$res['id_evenement'])
+         AND objet_test_si_publie('article',$id_article)){
+               // sera refuse si auteur pas autorise
+               evenement_modifier($res['id_evenement'],array('statut'=>'publie'));
+       }
+       // a la creation, documenter la date de creation
+       if (!intval($id_evenement))
+               evenement_modifier($res['id_evenement'],array('date_creation'=>date('Y-m-d H:i:s')));
+
+       $id_evenement = $res['id_evenement'];
+       if ($res['redirect']) {
+               if (strpos($res['redirect'],'article')!==false){
+                       $id_article = sql_getfetsel('id_article','spip_evenements','id_evenement='.intval($id_evenement));
+                       $res['redirect'] = parametre_url($res['redirect'],'id_article',$id_article);
+               }
+       }
+       return $res;
+}
+
+?>
diff --git a/www/plugins/agenda_3_5/formulaires/evenement_participants.html b/www/plugins/agenda_3_5/formulaires/evenement_participants.html
new file mode 100644 (file)
index 0000000..3ba1228
--- /dev/null
@@ -0,0 +1,15 @@
+<div class="formulaire_spip formulaire_#FORM" >
+       [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+       [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+       <form method='post' action='#ENV{action}'><div>
+               #ACTION_FORMULAIRE{#ENV{action}}
+               <div class="over"><span class='image_loading'>&nbsp;</span><input type='submit' class='submit' value='<:bouton_changer:>' /></div>
+               
+               <INCLURE{fond=prive/objets/liste/evenement_participants}{env}>
+               
+       </div></form>
+</div>
+<script type="text/javascript">/*<![CDATA[*/
+jQuery('.formulaire_evenement_participants .delete').click(function(){jQuery(this).parents('tr').eq(0).animateRemove();});
+jQuery('.formulaire_evenement_participants .append').animateAppend();
+/*]]>*/</script>
diff --git a/www/plugins/agenda_3_5/formulaires/evenement_participants.php b/www/plugins/agenda_3_5/formulaires/evenement_participants.php
new file mode 100644 (file)
index 0000000..7761a0e
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * 
+ * @return array
+ */
+function formulaires_evenement_participants_charger_dist($evenement,$tri){
+       
+       if (autoriser('voir','evenement',$evenement)) {
+               $valeurs = array(
+                       'id_evenement'=>$evenement,
+                       'tri_inscrits'=>$tri,
+                       'supprimer_lien'=>''
+               );
+       }
+       
+       return $valeurs;
+}
+
+/**
+ * Traiter le post des informations de suppression d'inscription
+ *
+ * @param string $a
+ * @param bool $editable
+ * @return array
+ */
+function formulaires_evenement_participants_traiter_dist($a,$editable=true){
+       
+       $supprimer = _request('supprimer_lien');
+               
+       if ($supprimer){
+               foreach($supprimer as $k=>$v) {
+                       if ($lien = lien_verifier_action($k,$v)){
+                               $lien = explode("-",$lien);
+                               list($objet_source,$ids,$objet_lie,$idl) = $lien;
+                               if(autoriser('modifier','evenement',$ids)){
+                                       if ($idl=="*") sql_delete("spip_evenements_participants", "id_evenement=$ids");
+                                       else sql_delete("spip_evenements_participants", "id_evenement=$ids and id_auteur=$idl");
+                               }
+                       }
+               }
+       }
+       
+       return $res;
+}
+
+/**
+ * Fonction issue de prive/formulaires/editer_liens.php
+ *
+ * Les formulaires envoient une action dans un tableau ajouter_lien
+ * ou supprimer_lien
+ * L'action est de la forme
+ * objet1-id1-objet2-id2
+ *
+ * L'action peut etre indiquee dans la cle, ou dans la valeur
+ * Si elle est indiquee dans la valeur, et que la cle est non numerique,
+ * on ne la prend en compte que si un submit avec la cle a ete envoye
+ *
+ * @param string $k
+ * @param string $v
+ * @return string
+ */
+function lien_verifier_action($k,$v){
+       if (preg_match(",^\w+-[\w*]+-[\w*]+-[\w*]+,",$k))
+               return $k;
+       if (preg_match(",^\w+-[\w*]+-[\w*]+-[\w*]+,",$v)){
+               if (is_numeric($k))
+                       return $v;
+               if (_request($k))
+                       return $v;
+       }
+       return '';
+}
+?>
diff --git a/www/plugins/agenda_3_5/formulaires/migrer_agenda.html b/www/plugins/agenda_3_5/formulaires/migrer_agenda.html
new file mode 100644 (file)
index 0000000..29f09e7
--- /dev/null
@@ -0,0 +1,102 @@
+<div class="formulaire_spip formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}">
+       <h3 class="titrem"><:migreragenda:titre_migrer_agenda:></h3>
+       [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
+       [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>]
+       [(#ENV{editable})
+       <form method='post' action='#ENV{action}'><div>
+               [(#REM) déclarer les hidden qui déclencheront le service du formulaire
+               paramêtre : url d'action ]
+               #ACTION_FORMULAIRE{#ENV{action}}
+               #SET{fl,migreragenda}
+
+               <p class="explication"><:migreragenda:explication_migration_agenda_article_1:></p>
+               <p class="explication"><:migreragenda:explication_migration_agenda_article_2:></p>
+               <ul>
+                       [<li class="editer editer_parent[ (#ENV**{erreurs}|table_valeur{id_parent}|oui)erreur]">
+                               <label for="id_parent"><:migreragenda:label_rubrique_source:></label>[
+                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{id_parent})</span>
+                               ]
+                               (#VAL|chercher_rubrique{0,#ENV{id_parent},'article',0,0,0,form_simple})
+           </li>]
+                       #SET{name,toute_la_branche}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                       <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
+                               <span class='erreur_message'>(#GET{erreurs})</span>
+                               ]
+                               #SET{val,oui}
+                               <div class="choix">
+                                       <input type="checkbox" name="#GET{name}" class="checkbox" id="#GET{name}_#GET{val}" value="#GET{val}"[(#GET{val}|=={#ENV{#GET{name},#GET{defaut}}}|oui)checked="checked"] />
+                                       <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                               </div>
+                       </li>
+
+                       #SET{name,champ_date_debut}#SET{obli,''}#SET{defaut,'date'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                       <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                               <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                               <span class='erreur_message'>(#GET{erreurs})</span>
+                               ]<select name="#GET{name}" class="select" id="#GET{name}">
+                                       #SET{val,date}
+                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_champ_',#GET{val}}|_T)]</option>
+                                       #SET{val,date_redac}
+                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_champ_',#GET{val}}|_T)]</option>
+                               </select>
+                       </li>
+                       #SET{name,champ_date_fin}#SET{obli,''}#SET{defaut,'date_redac'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                       <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                               <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                               <span class='erreur_message'>(#GET{erreurs})</span>
+                               ]<select name="#GET{name}" class="select" id="#GET{name}">
+                                       #SET{val,date}
+                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_champ_',#GET{val}}|_T)]</option>
+                                       #SET{val,date_redac}
+                                       <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#GET{fl}|concat{':label_champ_',#GET{val}}|_T)]</option>
+                               </select>
+                       </li>
+
+                       #SET{name,horaire}#SET{obli,''}#SET{defaut,'oui'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                       <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                               <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                               <span class='erreur_message'>(#GET{erreurs})</span>
+                               ]
+                               #SET{val,oui}
+                               <div class="choix">
+                                       <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                                       <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                               </div>
+                               #SET{val,non}
+                               <div class="choix">
+                                       <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                                       <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                               </div>
+                       </li>
+
+                       #SET{name,groupes_mots}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                       <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                               <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                               <span class='erreur_message'>(#GET{erreurs})</span>
+                               ]
+       ]
+                               <BOUCLE_gr(GROUPES_MOTS){par num titre,titre}{si #ENV{editable}}>
+                               #SET{val,#ID_GROUPE}
+                               <div class="choix">
+                                       <input type="checkbox" name="#GET{name}#EVAL{chr(91)}#EVAL{chr(93)}" class="checkbox" id="#GET{name}_#GET{val}" value="#GET{val}"[(#GET{val}|in_any{#ENV{#GET{name},#GET{defaut}}}|oui)checked="checked"] />
+                                       <label for="#GET{name}_#GET{val}">#TITRE (<:info_numero_abbreviation:> #ID_GROUPE)</label>
+                               </div>
+                               </BOUCLE_gr>
+       [(#ENV{editable})
+                       </li>
+               </ul>
+               <p class="explication"><:migreragenda:explication_migration_agenda_article_fin:></p>
+               [(#REM) ajouter les saisies supplémentaires : extra et autre, à cet endroit ]
+    <!--extra-->
+    <p class='boutons'><span class='image_loading'>&nbsp;</span>
+               <input type='submit' class='submit' value='<:migreragenda:bouton_migrer|attribut_html:>' /></p>
+
+               [<div class="notice">
+                        (#ENV**{erreurs}|table_valeur{confirmer})
+               </div>
+               <p class='boutons'><span class='image_loading'>&nbsp;</span>
+<input type='submit' class='submit' name='confirm' value='<:migreragenda:bouton_lancer_migration|attribut_html:>' /></p>
+               ]
+       </div></form>
+       ]
+</div>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/formulaires/migrer_agenda.php b/www/plugins/agenda_3_5/formulaires/migrer_agenda.php
new file mode 100644 (file)
index 0000000..1f79a57
--- /dev/null
@@ -0,0 +1,182 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+function formulaires_migrer_agenda_charger_dist(){
+
+       $valeurs = array(
+
+               'id_parent'=>'',
+               'toute_la_branche' => '',
+               'champ_date_debut' => 'date',
+               'champ_date_fin' => 'date_redac',
+               'horaire' => 'oui',
+               'groupes_mots' => array(),
+       );
+
+       return $valeurs;
+}
+
+function formulaires_migrer_agenda_verifier_dist(){
+
+       $erreurs = array();
+       $oblis = array('id_parent','champ_date_debut','champ_date_fin','horaire');
+
+       foreach ($oblis as $obli){
+               if (!_request($obli))
+                       $erreurs[$obli] = _T('info_obligatoire');
+       }
+
+       if (!isset($erreurs['champ_date_debut'])
+               AND !in_array(_request('champ_date_debut'),array('date','date_redac')))
+               $erreurs['champ_date_debut'] = _T('migreragenda:erreur_choix_incorrect');
+
+       if (!isset($erreurs['champ_date_fin'])
+               AND !in_array(_request('champ_date_fin'),array('date','date_redac')))
+               $erreurs['champ_date_fin'] = _T('migreragenda:erreur_choix_incorrect');
+
+       if (!isset($erreurs['horaire'])
+               AND !in_array(_request('horaire'),array('oui','non')))
+               $erreurs['horaire'] = _T('migreragenda:erreur_choix_incorrect');
+
+       if (!isset($erreurs['groupes_mots'])
+         AND $groupes = _request('groupes_mots')){
+
+               if (!is_array($groupes))
+                       $erreurs['groupes_mots'] = _T('migreragenda:erreur_choix_incorrect');
+               else {
+                       $groupes = array_map('intval',$groupes);
+                       if (sql_countsel('spip_groupes_mots',sql_in('id_groupe',$groupes))!=count($groupes))
+                               $erreurs['groupes_mots'] = _T('migreragenda:erreur_choix_incorrect');
+               }
+       }
+
+       // pas d'erreurs ? verifier ce qui va etre fait et l'annoncer
+       if (!count($erreurs) AND !_request('confirm')){
+               $where = migrer_agenda_where_articles(_request('id_parent'),_request('toute_la_branche'));
+               $nba = sql_countsel("spip_articles",$where);
+
+               $message = _T('migreragenda:info_migration_articles')." ";
+               $message .= sinon(singulier_ou_pluriel($nba,'info_1_article','info_nb_articles'),_T('info_aucun_article'));
+
+               $erreurs['confirmer'] = $message;
+       }
+
+       return $erreurs;
+}
+
+
+function formulaires_migrer_agenda_traiter_dist(){
+       $id_rubrique = _request('id_parent');
+       $where_articles = migrer_agenda_where_articles($id_rubrique,_request('toute_la_branche'));
+       $groupes = _request('groupes_mots');
+       if (!$groupes)
+               $groupes = array();
+       $where_mots = migrer_agenda_where_mots($groupes);
+
+       $horaire = (_request('horaire')=='oui'?true:false);
+       $champ_date_debut = _request('champ_date_debut');
+       $champ_date_fin = _request('champ_date_fin');
+
+       // poser le flag agenda sur la rubrique !
+       sql_updateq("spip_rubriques",array('agenda'=>1),'id_rubrique='.intval($id_rubrique));
+       // et migrer les articles
+       $nb = migrer_articles($where_articles,$champ_date_debut,$champ_date_fin,$horaire,$where_mots);
+
+       $message = _T('migreragenda:info_migration_articles_reussi')." ";
+       $message .= sinon(singulier_ou_pluriel($nb,'info_1_article','info_nb_articles'),_T('info_aucun_article'));
+
+       return array('message_ok'=>$message);
+}
+
+
+
+function migrer_articles($where_articles,$champ_date_debut,$champ_date_fin,$horaire,$where_mots){
+
+       include_spip("action/editer_evenement");
+
+       $where_mots = implode(" AND ",$where_mots);
+
+       $nb = 0;
+       $res = sql_select("*","spip_articles",$where_articles);
+       while ($row = sql_fetch($res)){
+
+               $id_evenement = evenement_inserer($row['id_article']);
+               // mettre les champs
+               $set = array(
+                       'date_debut' => $row[$champ_date_debut],
+                       'date_fin' => $row[$champ_date_fin],
+                       'titre' => $row['titre'],
+                       'horaire' => ($horaire?'oui':'non')
+               );
+               evenement_modifier($id_evenement,$set);
+
+               // associer les mots : en sql pour ne pas exploser si plein de mots en base
+               $mots = sql_allfetsel('M.id_mot','spip_mots AS M JOIN spip_mots_liens AS L ON (M.id_mot=L.id_mot AND L.objet='.sql_quote('article').')',"id_objet=".intval($row['id_article'])." AND (".$where_mots.")");
+               if (count($mots)){
+                       $insert = array();
+                       foreach ($mots as $mot){
+                               $insert[] = array('id_mot'=>$mot['id_mot'],'objet'=>'evenement','id_objet'=>$id_evenement);
+                       }
+                       sql_insertq_multi("spip_mots_liens",$insert);
+               }
+
+
+               // publier l'evenement
+               evenement_modifier($id_evenement,array('statut'=>'publie'));
+
+               $nb++;
+       }
+
+       return $nb;
+}
+
+
+
+function migrer_agenda_where_articles($id_rubrique,$branche = false){
+
+       $where = array();
+       $where[] = "statut=".sql_quote('publie');
+       if ($branche){
+               include_spip("inc/rubriques");
+               $where[] = sql_in('id_rubrique',calcul_branche_in($id_rubrique));
+       }
+       else
+               $where[] = "id_rubrique=".intval($id_rubrique);
+
+       // exclure les articles qui ont deja un evenement
+       $where[] = "id_article NOT IN (".sql_get_select("id_article","spip_evenements").")";
+
+       return $where;
+}
+
+function migrer_agenda_where_mots($groupes){
+       $id_groupe = array();
+
+       $rows = sql_allfetsel('*','spip_groupes_mots',sql_in('id_groupe',$groupes));
+       foreach($rows as $row){
+               $id_groupe[] = $row['id_groupe'];
+               $tables_liees = explode(',',$row['tables_liees']);
+               $tables_liees = array_filter($tables_liees);
+               // ajouter les evenements a ce groupe de mot
+               if (!in_array('evenements',$tables_liees)){
+                       include_spip("action/editer_groupe_mots");
+                       $tables_liees[] = 'evenements';
+                       $tables_liees = implode(',',$tables_liees);
+                       groupemots_modifier($row['id_groupe'],array('tables_liees'=>$tables_liees));
+               }
+       }
+
+       $where = array(sql_in('id_groupe',$id_groupe));
+       return $where;
+}
+
+?>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/formulaires/participer_evenement.html b/www/plugins/agenda_3_5/formulaires/participer_evenement.html
new file mode 100644 (file)
index 0000000..c25dd05
--- /dev/null
@@ -0,0 +1,37 @@
+<div class="formulaire_spip formulaire_#FORM formulaire_#FORM-#ENV{id,#ENV{id_evenement}}">
+       [(#ENV{editable}|non)
+       [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
+       [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>]
+       ]
+       [(#ENV{editable})
+       <form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
+               [(#REM) declarer les hidden qui declencheront le service du formulaire 
+               parametre : url d'action ]
+               #ACTION_FORMULAIRE{#ENV{action}}
+               <fieldset><legend><:agenda:label_vous_inscrire:></legend>
+               [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+               [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+         <ul>
+           <li class="saisie_reponse[ (#ENV**{erreurs}|table_valeur{reponse}|oui)erreur]">
+                               [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{reponse})</span>]
+                   <div class='choix'>
+                                       <input type='radio' class='radio' name='reponse' id='reponse_oui' value="oui"[ (#ENV{reponse}|=={oui}|oui)checked="checked"] />
+                                       <label for="reponse_oui"><:agenda:label_reponse_jyparticipe:></label>
+                               </div>
+                   <div class='choix'>
+                                       <input type='radio' class='radio' name='reponse' id='reponse_peutetre' value="?"[ (#ENV{reponse}|=={?}|oui)checked="checked"] />
+                                       <label for="reponse_peutetre"><:agenda:label_reponse_jyparticipe_peutetre:></label>
+                               </div>
+                   <div class='choix'>
+                                       <input type='radio' class='radio' name='reponse' id='reponse_non' value="non"[ (#ENV{reponse}|=={non}|oui)checked="checked"] />
+                                       <label for="reponse_non"><:agenda:label_reponse_jyparticipe_pas:></label>
+                               </div>
+           </li>
+         </ul>
+         </fieldset>
+         [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
+         <!--extra-->
+         <p class='boutons'><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p>
+       </div></form>
+       ]
+</div>
diff --git a/www/plugins/agenda_3_5/formulaires/participer_evenement.php b/www/plugins/agenda_3_5/formulaires/participer_evenement.php
new file mode 100644 (file)
index 0000000..868ec6b
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/actions');
+include_spip('inc/editer');
+
+function formulaires_participer_evenement_charger_dist($id_evenement){
+       $valeurs = array();
+       // si pas d'evenement ou d'inscription, on echoue silencieusement
+       if (!$row = sql_fetsel('inscription,places','spip_evenements','id_evenement='.intval($id_evenement).' AND date_fin>NOW()')
+         OR !$row['inscription'])
+               return false;
+
+       // si anonyme, on echoue avec avertissement
+       if (!$GLOBALS['visiteur_session']['id_auteur'])
+               return array(
+                       'message_erreur'=>_T('agenda:connexion_necessaire_pour_inscription'),
+                       'editable'=>false
+               );
+
+       // valeurs d'initialisation
+       $valeurs['id'] = $id_evenement;
+       $valeurs['reponse'] = sql_getfetsel('reponse','spip_evenements_participants','id_evenement='.intval($id_evenement).' AND id_auteur='.intval($GLOBALS['visiteur_session']['id_auteur']));
+
+       // si les places sont comptees, regarder si il en reste
+       if ($places = $row['places']){
+               $ok = sql_countsel('spip_evenements_participants','id_evenement='.intval($id_evenement)." AND reponse='oui'");
+               $peutetre = sql_countsel('spip_evenements_participants','id_evenement='.intval($id_evenement)." AND reponse='?'");
+               // Les reponses PEUT-ETRE sont ponderees a 0,5 donc
+               // on multiplie tout par 2 pour eviter les troncatures ($total ne sert de toute facon que dans les tests)
+               $total = 2*$ok+$peutetre;
+               if ($total>=2*$places){
+                 // dans ce cas, le formulaire est editable seulement si l'auteur a deja repondu oui ou peut-etre, et peut changer d'avis !
+                 if (!($valeurs['reponse']=='oui' OR $valeurs['reponse']=='?')){
+                               $valeurs['editable'] = false;
+                               $valeurs['message_ok'] = _T('agenda:evenement_complet');
+                       }
+               }
+       }
+
+       return $valeurs;
+}
+
+function formulaires_participer_evenement_verifier_dist($id_evenement){
+       $erreurs = array();
+       $reponse = _request('reponse');
+       // Le test de la ligne suivante sert a savoir si la reponse est vide, non?
+       // On vient juste de la recuperer ci-dessus, pas la peine de la reaffecter...
+       if (!($reponse) OR !in_array($reponse,array('oui','non','?')))
+               $erreurs['reponse'] = _T('agenda:indiquez_votre_choix');
+       elseif ($reponse!=='non') {
+               $row = sql_fetsel('places','spip_evenements','id_evenement='.intval($id_evenement));
+               $valeurs['reponse'] = sql_getfetsel('reponse','spip_evenements_participants','id_evenement='.intval($id_evenement).' AND id_auteur='.intval($GLOBALS['visiteur_session']['id_auteur']));
+               if ($places = $row['places'] AND $valeurs['reponse']!==$reponse){
+                       $ok = sql_countsel('spip_evenements_participants','id_evenement='.intval($id_evenement)." AND reponse='oui'");
+                       $peutetre = sql_countsel('spip_evenements_participants','id_evenement='.intval($id_evenement)." AND reponse='?'");
+                       // Les reponses PEUT-ETRE sont ponderees a 0,5 donc
+                       // on multiplie tout par 2 pour eviter les troncatures ($total ne sert de toute facon que dans les tests)
+                       $total = 2*$ok+$peutetre;
+                       if (
+                           // Si on est au taquet, le seul cas autorise restant (la reponse NON et la reponse identique sont prises
+                           // en compte dans les tests ci-dessus) est: transformation d'un OUI en PEUT-ETRE (-0,5)
+                           ($total>=2*$places AND !($valeurs['reponse']=='oui' AND $reponse=='?'))
+                           OR
+                           // Si il reste un siege PEUT-ETRE, le seul cas interdit restant est: transformation d'un NON en OUI (+1)
+                           ($total==2*$places-1 AND ($valeurs['reponse']=='non' AND $reponse=='oui'))
+                           ){
+                               $erreurs['reponse'] = _T('agenda:plus_de_place');
+                       }
+               }
+       }
+       return $erreurs;
+}
+
+function formulaires_participer_evenement_traiter_dist($id_evenement){
+
+       $reponse = _request('reponse');
+       if (sql_fetsel('reponse','spip_evenements_participants','id_evenement='.intval($id_evenement).' AND id_auteur='.intval($GLOBALS['visiteur_session']['id_auteur']))){
+               sql_updateq('spip_evenements_participants',array('reponse'=>$reponse),'id_evenement='.intval($id_evenement).' AND id_auteur='.intval($GLOBALS['visiteur_session']['id_auteur']));
+       }
+       else
+               sql_insertq('spip_evenements_participants',array('id_evenement'=>$id_evenement,'id_auteur'=>$GLOBALS['visiteur_session']['id_auteur'],'reponse'=>$reponse,'date'=>'NOW()'));
+
+       $retour = array('editable'=>true);
+       if (!$reponse = sql_getfetsel('reponse','spip_evenements_participants','id_evenement='.intval($id_evenement).' AND id_auteur='.intval($GLOBALS['visiteur_session']['id_auteur']))
+       OR $reponse!=_request('reponse')){
+               $retour['message_erreur'] = _T('agenda:probleme_technique');
+       }
+       else {
+               if ($reponse=='oui')
+                       $message = _T('agenda:participation_prise_en_compte');
+               elseif ($reponse=='?')
+                       $message = _T('agenda:participation_incertaine_prise_en_compte');
+               else
+                       $message = _T('agenda:absence_prise_en_compte');
+       }
+       return array('message_ok'=>$message,'editable'=>true);
+}
+
+?>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/inc/agenda_filtres.php b/www/plugins/agenda_3_5/inc/agenda_filtres.php
new file mode 100644 (file)
index 0000000..84a6186
--- /dev/null
@@ -0,0 +1,197 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+/**
+ * Filtres&criteres deprecies/obsoletes
+ */
+
+
+/**
+ * {agendafull ..} variante etendue du crietre agenda du core
+ * qui accepte une date de debut et une date de fin
+ *
+ * {agendafull date_debut, date_fin, jour, #ENV{annee}, #ENV{mois}, #ENV{jour}}
+ * {agendafull date_debut, date_fin, semaine, #ENV{annee}, #ENV{mois}, #ENV{jour}}
+ * {agendafull date_debut, date_fin, mois, #ENV{annee}, #ENV{mois}}
+ * {agendafull date_debut, date_fin, periode, #ENV{annee}, #ENV{mois}, #ENV{jour},
+ *                                            #ENV{annee_fin}, #ENV{mois_fin}, #ENV{jour_fin}}
+ *
+ * @param string $idb
+ * @param object $boucles
+ * @param object $crit
+ */
+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";
+
+       $quote_end = ",'".$boucle->sql_serveur."','text'";
+
+       if ($type == 'jour')
+               $boucle->where[]= array("'AND'",
+                                       array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m%d\')'",("sql_quote($annee . $mois . $jour$quote_end)")),
+                                       array("'>='", "'DATE_FORMAT($date_fin, \'%Y%m%d\')'",("sql_quote($annee . $mois . $jour$quote_end)")));
+       elseif ($type == 'mois')
+               $boucle->where[]= array("'AND'",
+                                       array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m\')'",("sql_quote($annee . $mois$quote_end)")),
+                                       array("'>='", "'DATE_FORMAT($date_fin, \'%Y%m\')'",("sql_quote($annee . $mois$quote_end)")));
+       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\')'",
+                                             ("sql_quote($annee . $mois . $jour$quote_end)")),
+                                       array("'<='", "'DATE_FORMAT($date_deb, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")));
+       // sinon on prend tout
+}
+
+
+/**
+ * Afficher de facon textuelle les dates de debut et fin en fonction des cas
+ * - Le lundi 20 fevrier a 18h
+ * - Le 20 fevrier de 18h a 20h
+ * - Du 20 au 23 fevrier
+ * - du 20 fevrier au 30 mars
+ * - du 20 fevrier 2007 au 30 mars 2008
+ * $horaire='oui' permet d'afficher l'horaire, toute autre valeur n'indique que le jour
+ * $forme peut contenir abbr (afficher le nom des jours en abbrege) et ou hcal (generer une date au format hcal)
+ * 
+ * @param string $date_debut
+ * @param string $date_fin
+ * @param string $horaire
+ * @param string $forme
+ * @return string
+ */
+function agenda_affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
+       $abbr = '';
+       if (strpos($forme,'abbr')!==false) $abbr = 'abbr';
+       $affdate = "affdate_jourcourt";
+       if (strpos($forme,'annee')!==false) $affdate = 'affdate';
+       
+       $dtstart = $dtend = $dtabbr = "";
+       if (strpos($forme,'hcal')!==false) {
+               $dtstart = "<abbr class='dtstart' title='".date_iso($date_debut)."'>";
+               $dtend = "<abbr class='dtend' title='".date_iso($date_fin)."'>";
+               $dtabbr = "</abbr>";
+       }
+       
+       $date_debut = strtotime($date_debut);
+       $date_fin = strtotime($date_fin);
+       $d = date("Y-m-d", $date_debut);
+       $f = date("Y-m-d", $date_fin);
+       $h = $horaire=='oui';
+       $hd = date("H:i",$date_debut);
+       $hf = date("H:i",$date_fin);
+       $au = " " . strtolower(_T('agenda:evenement_date_au'));
+       $du = _T('agenda:evenement_date_du') . " ";
+       $s = "";
+       if ($d==$f)
+       { // meme jour
+               $s = ucfirst(nom_jour($d,$abbr))." ".$affdate($d);
+               if ($h)
+                       $s .= " $hd";
+               $s = "$dtstart$s$dtabbr";
+               if ($h AND $hd!=$hf) $s .= "-$dtend$hf$dtabbr";
+       }
+       else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin))
+       { // meme annee et mois, jours differents
+               if ($h){
+                       $s = $du . $dtstart . affdate_jourcourt($d) . " $hd" . $dtabbr;
+                       $s .= $au . $dtend . $affdate($f);
+                       if ($hd!=$hf) $s .= " $hf";
+                       $s .= $dtabbr;
+               }
+               else {
+                       $s = $du . $dtstart . jour($d) . $dtabbr;
+                       $s .= $au . $dtend . $affdate($f) . $dtabbr;
+               }
+       }
+       else if ((date("Y",$date_debut))==date("Y",$date_fin))
+       { // meme annee, mois et jours differents
+               $s = $du . $dtstart . affdate_jourcourt($d);
+               if ($h) $s .= " $hd";
+               $s .= $dtabbr . $au . $dtend . $affdate($f);
+               if ($h) $s .= " $hf";
+               $s .= $dtabbr;
+       }
+       else
+       { // tout different
+               $s = $du . $dtstart . affdate($d);
+               if ($h)
+                       $s .= " ".date("(H:i)",$date_debut);
+               $s .= $dtabbr . $au . $dtend. affdate($f);
+               if ($h)
+                       $s .= " ".date("(H:i)",$date_fin);
+               $s .= $dtabbr;
+       }
+       return unicode2charset(charset2unicode($s,'AUTO'));     
+}
+
+
+?>
diff --git a/www/plugins/agenda_3_5/inc/date_gestion.php b/www/plugins/agenda_3_5/inc/date_gestion.php
new file mode 100644 (file)
index 0000000..6531615
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+
+/**
+ * Recuperer les champs date_xx et heure_xx, verifier leur coherence et les reformater
+ *
+ * @param string $suffixe
+ * @param bool $horaire
+ * @param array $erreurs
+ * @return int
+ */
+function verifier_corriger_date_saisie($suffixe,$horaire,&$erreurs){
+       include_spip('inc/filtres');
+       $date = _request("date_$suffixe").($horaire?' '.trim(_request("heure_$suffixe")).':00':'');
+       $date = recup_date($date);
+       if (!$date)
+               return '';
+       $ret = null;
+       if (!$ret=mktime(0,0,0,$date[1],$date[2],$date[0]))
+               $erreurs["date_$suffixe"] = _T('agenda:erreur_date');
+       elseif (!$ret=mktime($date[3],$date[4],$date[5],$date[1],$date[2],$date[0]))
+               $erreurs["date_$suffixe"] = _T('agenda:erreur_heure');
+       if ($ret){
+               if (trim(_request("date_$suffixe")!==($d=date('d/m/Y',$ret)))){
+                       $erreurs["date_$suffixe"] = _T('agenda:erreur_date_corrigee');
+                       set_request("date_$suffixe",$d);
+               }
+               if ($horaire AND trim(_request("heure_$suffixe")!==($h=date('H:i',$ret)))){
+                       $erreurs["heure_$suffixe"] = _T('agenda:erreur_heure_corrigee');
+                       set_request("heure_$suffixe",$h);
+               }
+       }
+       return $ret;
+}
+
+?>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/inc/un-evenement-ical.html b/www/plugins/agenda_3_5/inc/un-evenement-ical.html
new file mode 100644 (file)
index 0000000..ac77161
--- /dev/null
@@ -0,0 +1,17 @@
+BEGIN:VEVENT
+SUMMARY:[(#EVTITRE|textebrut|filtrer_ical)]
+UID:evenement#ID_EVENEMENT @ [(#URL_SITE_SPIP|filtrer_ical)][
+DTSTAMP:(#DATE_CREATION|date_ical)][(#HORAIRE|=={oui}|?{[
+DTSTART:(#DATE_DEBUT|date_ical)][
+DTEND:(#DATE_FIN|date_ical)],[
+DTSTART;VALUE=DATE:(#DATE_DEBUT|affdate{Ymd})][
+DTEND;VALUE=DATE:(#DATE_FIN|agenda_jourdecal{1,Ymd})]})][
+CREATED:(#DATE_CREATION|date_ical)][
+LAST-MODIFIED:(#MAJ|date_ical)][
+LOCATION:(#LIEU|PtoBR|textebrut|filtrer_ical)][
+DESCRIPTION:(#DESCRIPTIF|supprimer_tags|textebrut|filtrer_ical)]
+CATEGORIES:<BOUCLE_article(ARTICLES) {id_article=#ID_ARTICLE}>[(#TITRE|textebrut|filtrer_ical)]</BOUCLE_article>
+URL:[(#URL_ARTICLE|parametre_url{id_evenement,#ID_EVENEMENT}|url_absolue|filtrer_ical)]<BOUCLE_sequence(VERSIONS ?){objet=evenement}{id_objet=#ID_EVENEMENT}{!par id_version}{0,1}>[
+SEQUENCE:(#ID_VERSION|moins{1})
+]</BOUCLE_sequence>STATUS:CONFIRMED
+END:VEVENT
diff --git a/www/plugins/agenda_3_5/javascript/jquery-ui.multidatespicker.js b/www/plugins/agenda_3_5/javascript/jquery-ui.multidatespicker.js
new file mode 100755 (executable)
index 0000000..36511a8
--- /dev/null
@@ -0,0 +1,461 @@
+/*\r
+ * MultiDatesPicker v1.6.1\r
+ * http://multidatespickr.sourceforge.net/\r
+ * \r
+ * Copyright 2011, Luca Lauretta\r
+ * Dual licensed under the MIT or GPL version 2 licenses.\r
+ */\r
+(function( $ ){\r
+       $.extend($.ui, { multiDatesPicker: { version: "1.6.1" } });\r
+       \r
+       $.fn.multiDatesPicker = function(method) {\r
+               var mdp_arguments = arguments;\r
+               var ret = this;\r
+               var today_date = new Date();\r
+               var day_zero = new Date(0);\r
+               var mdp_events = {};\r
+               \r
+               function removeDate(date, type) {\r
+                       if(!type) type = 'picked';\r
+                       date = dateConvert.call(this, date);\r
+                       for(var i in this.multiDatesPicker.dates[type])\r
+                               if(!methods.compareDates(this.multiDatesPicker.dates[type][i], date))\r
+                                       return this.multiDatesPicker.dates[type].splice(i, 1).pop();\r
+               }\r
+               function removeIndex(index, type) {\r
+                       if(!type) type = 'picked';\r
+                       return this.multiDatesPicker.dates[type].splice(index, 1).pop();\r
+               }\r
+               function addDate(date, type, no_sort) {\r
+                       if(!type) type = 'picked';\r
+                       date = dateConvert.call(this, date);\r
+                       \r
+                       // @todo: use jQuery UI datepicker method instead\r
+                       date.setHours(0);\r
+                       date.setMinutes(0);\r
+                       date.setSeconds(0);\r
+                       date.setMilliseconds(0);\r
+                       \r
+                       if (methods.gotDate.call(this, date, type) === false) {\r
+                               this.multiDatesPicker.dates[type].push(date);\r
+                               if(!no_sort) this.multiDatesPicker.dates[type].sort(methods.compareDates);\r
+                       } \r
+               }\r
+               function sortDates(type) {\r
+                       if(!type) type = 'picked';\r
+                       this.multiDatesPicker.dates[type].sort(methods.compareDates);\r
+               }\r
+               function dateConvert(date, desired_type, date_format) {\r
+                       if(!desired_type) desired_type = 'object';/*\r
+                       if(!date_format && (typeof date == 'string')) {\r
+                               date_format = $(this).datepicker('option', 'dateFormat');\r
+                               if(!date_format) date_format = $.datepicker._defaults.dateFormat;\r
+                       }\r
+                       */\r
+                       return methods.dateConvert.call(this, date, desired_type, date_format);\r
+               }\r
+               \r
+               var methods = {\r
+                       init : function( options ) {\r
+                               var $this = $(this);\r
+                               this.multiDatesPicker.changed = false;\r
+                               \r
+                               var mdp_events = {\r
+                                       beforeShow: function(input, inst) {\r
+                                               this.multiDatesPicker.changed = false;\r
+                                               if(this.multiDatesPicker.originalBeforeShow) \r
+                                                       this.multiDatesPicker.originalBeforeShow.call(this, input, inst);\r
+                                       },\r
+                                       onSelect : function(dateText, inst) {\r
+                                               var $this = $(this);\r
+                                               this.multiDatesPicker.changed = true;\r
+                                               \r
+                                               if (dateText) {\r
+                                                       $this.multiDatesPicker('toggleDate', dateText);\r
+                                               }\r
+                                               \r
+                                               if (this.multiDatesPicker.mode == 'normal' && this.multiDatesPicker.dates.picked.length > 0 && this.multiDatesPicker.pickableRange) {\r
+                                                       var min_date = this.multiDatesPicker.dates.picked[0],\r
+                                                               max_date = new Date(min_date.getTime());\r
+                                                       \r
+                                                       methods.sumDays(max_date, this.multiDatesPicker.pickableRange-1);\r
+                                                               \r
+                                                       // counts the number of disabled dates in the range\r
+                                                       if(this.multiDatesPicker.adjustRangeToDisabled) {\r
+                                                               var c_disabled, \r
+                                                                       disabled = this.multiDatesPicker.dates.disabled.slice(0);\r
+                                                               do {\r
+                                                                       c_disabled = 0;\r
+                                                                       for(var i = 0; i < disabled.length; i++) {\r
+                                                                               if(disabled[i].getTime() <= max_date.getTime()) {\r
+                                                                                       if((min_date.getTime() <= disabled[i].getTime()) && (disabled[i].getTime() <= max_date.getTime()) ) {\r
+                                                                                               c_disabled++;\r
+                                                                                       }\r
+                                                                                       disabled.splice(i, 1);\r
+                                                                                       i--;\r
+                                                                               }\r
+                                                                       }\r
+                                                                       max_date.setDate(max_date.getDate() + c_disabled);\r
+                                                               } while(c_disabled != 0);\r
+                                                       }\r
+                                                       \r
+                                                       if(this.multiDatesPicker.maxDate && (max_date > this.multiDatesPicker.maxDate))\r
+                                                               max_date = this.multiDatesPicker.maxDate;\r
+                                                       \r
+                                                       $this\r
+                                                               .datepicker("option", "minDate", min_date)\r
+                                                               .datepicker("option", "maxDate", max_date);\r
+                                               } else {\r
+                                                       $this\r
+                                                               .datepicker("option", "minDate", this.multiDatesPicker.minDate)\r
+                                                               .datepicker("option", "maxDate", this.multiDatesPicker.maxDate);\r
+                                               }\r
+                                               \r
+                                               if(this.tagName == 'INPUT') { // for inputs\r
+                                                       $this.val(\r
+                                                               $this.multiDatesPicker('getDates', 'string')\r
+                                                       );\r
+                                               }\r
+                                               \r
+                                               if(this.multiDatesPicker.originalOnSelect && dateText)\r
+                                                       this.multiDatesPicker.originalOnSelect.call(this, dateText, inst);\r
+                                               \r
+                                               // thanks to bibendus83 -> http://sourceforge.net/tracker/?func=detail&atid=1495384&aid=3403159&group_id=358205\r
+                                               if ($this.datepicker('option', 'altField') != undefined && $this.datepicker('option', 'altField') != "") {\r
+                                                       $($this.datepicker('option', 'altField')).val(\r
+                                                               $this.multiDatesPicker('getDates', 'string')\r
+                                                       );\r
+                                               }\r
+                                       },\r
+                                       beforeShowDay : function(date) {\r
+                                               var $this = $(this),\r
+                                                       gotThisDate = $this.multiDatesPicker('gotDate', date) !== false,\r
+                                                       isDisabledCalendar = $this.datepicker('option', 'disabled'),\r
+                                                       isDisabledDate = $this.multiDatesPicker('gotDate', date, 'disabled') !== false,\r
+                                                       areAllSelected = this.multiDatesPicker.maxPicks == this.multiDatesPicker.dates.picked.length;\r
+                                               \r
+                                               var custom = [true, ''];\r
+                                               if(this.multiDatesPicker.originalBeforeShowDay)\r
+                                                       custom = this.multiDatesPicker.originalBeforeShowDay.call(this, date);\r
+                                               \r
+                                               var highlight_class = gotThisDate ? 'ui-state-highlight' : custom[1];\r
+                                               var highlight_class = (gotThisDate ? 'ui-state-highlight' : '') + ((custom[1] && gotThisDate) ? ' ' : '') + custom[1];\r
+                                               var selectable_date = !(isDisabledCalendar || isDisabledDate || (areAllSelected && !highlight_class));\r
+                                               custom[0] = selectable_date && custom[0];\r
+                                               custom[1] = highlight_class;\r
+                                               return custom;\r
+                                       },\r
+                                       onClose: function(dateText, inst) {\r
+                                               if(this.tagName == 'INPUT' && this.multiDatesPicker.changed) {\r
+                                                       $(inst.dpDiv[0]).stop(false,true);\r
+                                                       setTimeout('$("#'+inst.id+'").datepicker("show")',50);\r
+                                               }\r
+                                               if(this.multiDatesPicker.originalOnClose) this.multiDatesPicker.originalOnClose.call(this, dateText, inst);\r
+                                       }\r
+                               };\r
+                               \r
+                               if(options) {\r
+                                       this.multiDatesPicker.originalBeforeShow = options.beforeShow;\r
+                                       this.multiDatesPicker.originalOnSelect = options.onSelect;\r
+                                       this.multiDatesPicker.originalBeforeShowDay = options.beforeShowDay;\r
+                                       this.multiDatesPicker.originalOnClose = options.onClose;\r
+                                       \r
+                                       $this.datepicker(options);\r
+                                       \r
+                                       this.multiDatesPicker.minDate = $.datepicker._determineDate(this, options.minDate, null);\r
+                                       this.multiDatesPicker.maxDate = $.datepicker._determineDate(this, options.maxDate, null);\r
+                                       \r
+                                       if(options.addDates) methods.addDates.call(this, options.addDates);\r
+                                       if(options.addDisabledDates)\r
+                                               methods.addDates.call(this, options.addDisabledDates, 'disabled');\r
+                                       \r
+                                       methods.setMode.call(this, options);\r
+                               } else {\r
+                                       $this.datepicker();\r
+                               }\r
+                               \r
+                               $this.datepicker('option', mdp_events);\r
+                               \r
+                               if(this.tagName == 'INPUT') $this.val($this.multiDatesPicker('getDates', 'string'));\r
+                               \r
+                               // Fixes the altField filled with defaultDate by default\r
+                               var altFieldOption = $this.datepicker('option', 'altField');\r
+                               if (altFieldOption) $(altFieldOption).val($this.multiDatesPicker('getDates', 'string'));\r
+                       },\r
+                       compareDates : function(date1, date2) {\r
+                               date1 = dateConvert.call(this, date1);\r
+                               date2 = dateConvert.call(this, date2);\r
+                               // return > 0 means date1 is later than date2 \r
+                               // return == 0 means date1 is the same day as date2 \r
+                               // return < 0 means date1 is earlier than date2 \r
+                               var diff = date1.getFullYear() - date2.getFullYear();\r
+                               if(!diff) {\r
+                                       diff = date1.getMonth() - date2.getMonth();\r
+                                       if(!diff) \r
+                                               diff = date1.getDate() - date2.getDate();\r
+                               }\r
+                               return diff;\r
+                       },\r
+                       sumDays : function( date, n_days ) {\r
+                               var origDateType = typeof date;\r
+                               obj_date = dateConvert.call(this, date);\r
+                               obj_date.setDate(obj_date.getDate() + n_days);\r
+                               return dateConvert.call(this, obj_date, origDateType);\r
+                       },\r
+                       dateConvert : function( date, desired_format, dateFormat ) {\r
+                               var from_format = typeof date;\r
+                               \r
+                               if(from_format == desired_format) {\r
+                                       if(from_format == 'object') {\r
+                                               try {\r
+                                                       date.getTime();\r
+                                               } catch (e) {\r
+                                                       $.error('Received date is in a non supported format!');\r
+                                                       return false;\r
+                                               }\r
+                                       }\r
+                                       return date;\r
+                               }\r
+                               \r
+                               var $this = $(this);\r
+                               if(typeof date == 'undefined') date = new Date(0);\r
+                               \r
+                               if(desired_format != 'string' && desired_format != 'object' && desired_format != 'number')\r
+                                       $.error('Date format "'+ desired_format +'" not supported!');\r
+                               \r
+                               if(!dateFormat) {\r
+                                       dateFormat = $.datepicker._defaults.dateFormat;\r
+                                       \r
+                                       // thanks to bibendus83 -> http://sourceforge.net/tracker/index.php?func=detail&aid=3213174&group_id=358205&atid=1495382\r
+                                       var dp_dateFormat = $this.datepicker('option', 'dateFormat');\r
+                                       if (dp_dateFormat) {\r
+                                               dateFormat = dp_dateFormat;\r
+                                       }\r
+                               }\r
+                               \r
+                               // converts to object as a neutral format\r
+                               switch(from_format) {\r
+                                       case 'object': break;\r
+                                       case 'string': date = $.datepicker.parseDate(dateFormat, date); break;\r
+                                       case 'number': date = new Date(date); break;\r
+                                       default: $.error('Conversion from "'+ desired_format +'" format not allowed on jQuery.multiDatesPicker');\r
+                               }\r
+                               // then converts to the desired format\r
+                               switch(desired_format) {\r
+                                       case 'object': return date;\r
+                                       case 'string': return $.datepicker.formatDate(dateFormat, date);\r
+                                       case 'number': return date.getTime();\r
+                                       default: $.error('Conversion to "'+ desired_format +'" format not allowed on jQuery.multiDatesPicker');\r
+                               }\r
+                               return false;\r
+                       },\r
+                       gotDate : function( date, type ) {\r
+                               if(!type) type = 'picked';\r
+                               for(var i = 0; i < this.multiDatesPicker.dates[type].length; i++) {\r
+                                       if(methods.compareDates.call(this, this.multiDatesPicker.dates[type][i], date) === 0) {\r
+                                               return i;\r
+                                       }\r
+                               }\r
+                               return false;\r
+                       },\r
+                       getDates : function( format, type ) {\r
+                               if(!format) format = 'string';\r
+                               if(!type) type = 'picked';\r
+                               switch (format) {\r
+                                       case 'object':\r
+                                               return this.multiDatesPicker.dates[type];\r
+                                       case 'string':\r
+                                       case 'number':\r
+                                               var o_dates = new Array();\r
+                                               for(var i in this.multiDatesPicker.dates[type])\r
+                                                       o_dates.push(\r
+                                                               dateConvert.call(\r
+                                                                       this, \r
+                                                                       this.multiDatesPicker.dates[type][i], \r
+                                                                       format\r
+                                                               )\r
+                                                       );\r
+                                               return o_dates;\r
+                                       \r
+                                       default: $.error('Format "'+format+'" not supported!');\r
+                               }\r
+                       },\r
+                       addDates : function( dates, type ) {\r
+                               if(dates.length > 0) {\r
+                                       if(!type) type = 'picked';\r
+                                       switch(typeof dates) {\r
+                                               case 'object':\r
+                                               case 'array':\r
+                                                       if(dates.length) {\r
+                                                               for(var i in dates)\r
+                                                                       if (typeof dates[i] != "function")\r
+                                                                               addDate.call(this, dates[i], type, true);\r
+                                                               sortDates.call(this, type);\r
+                                                               break;\r
+                                                       } // else does the same as 'string'\r
+                                               case 'string':\r
+                                               case 'number':\r
+                                                       addDate.call(this, dates, type);\r
+                                                       break;\r
+                                               default: \r
+                                                       $.error('Date format "'+ typeof dates +'" not allowed on jQuery.multiDatesPicker');\r
+                                       }\r
+                                       $(this).datepicker('refresh');\r
+                               } else {\r
+                                       $.error('Empty array of dates received.');\r
+                               }\r
+                       },\r
+                       removeDates : function( dates, type ) {\r
+                               if(!type) type = 'picked';\r
+                               var removed = [];\r
+                               if (Object.prototype.toString.call(dates) === '[object Array]') {\r
+                                       for(var i in dates.sort(function(a,b){return b-a})) {\r
+                                               removed.push(removeDate.call(this, dates[i], type));\r
+                                       }\r
+                               } else {\r
+                                       removed.push(removeDate.call(this, dates, type));\r
+                               }\r
+                               $(this).datepicker('refresh');\r
+                               return removed;\r
+                       },\r
+                       removeIndexes : function( indexes, type ) {\r
+                               if(!type) type = 'picked';\r
+                               var removed = [];\r
+                               if (Object.prototype.toString.call(indexes) === '[object Array]') {\r
+                                       for(var i in indexes.sort(function(a,b){return b-a})) {\r
+                                               removed.push(removeIndex.call(this, indexes[i], type));\r
+                                       }\r
+                               } else {\r
+                                       removed.push(removeIndex.call(this, indexes, type));\r
+                               }\r
+                               $(this).datepicker('refresh');\r
+                               return removed;\r
+                       },\r
+                       resetDates : function ( type ) {\r
+                               if(!type) type = 'picked';\r
+                               this.multiDatesPicker.dates[type] = [];\r
+                               $(this).datepicker('refresh');\r
+                       },\r
+                       toggleDate : function( date, type ) {\r
+                               if(!type) type = 'picked';\r
+                               \r
+                               switch(this.multiDatesPicker.mode) {\r
+                                       case 'daysRange':\r
+                                               this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled dates\r
+                                               var end = this.multiDatesPicker.autoselectRange[1];\r
+                                               var begin = this.multiDatesPicker.autoselectRange[0];\r
+                                               if(end < begin) { // switch\r
+                                                       end = this.multiDatesPicker.autoselectRange[0];\r
+                                                       begin = this.multiDatesPicker.autoselectRange[1];\r
+                                               }\r
+                                               for(var i = begin; i < end; i++) \r
+                                                       methods.addDates.call(this, methods.sumDays(date, i), type);\r
+                                               break;\r
+                                       default:\r
+                                               if(methods.gotDate.call(this, date) === false) // adds dates\r
+                                                       methods.addDates.call(this, date, type);\r
+                                               else // removes dates\r
+                                                       methods.removeDates.call(this, date, type);\r
+                                               break;\r
+                               }\r
+                       }, \r
+                       setMode : function( options ) {\r
+                               var $this = $(this);\r
+                               if(options.mode) this.multiDatesPicker.mode = options.mode;\r
+                               \r
+                               switch(this.multiDatesPicker.mode) {\r
+                                       case 'normal':\r
+                                               for(option in options)\r
+                                                       switch(option) {\r
+                                                               case 'maxPicks':\r
+                                                               case 'minPicks':\r
+                                                               case 'pickableRange':\r
+                                                               case 'adjustRangeToDisabled':\r
+                                                                       this.multiDatesPicker[option] = options[option];\r
+                                                                       break;\r
+                                                               //default: $.error('Option ' + option + ' ignored for mode "'.options.mode.'".');\r
+                                                       }\r
+                                       break;\r
+                                       case 'daysRange':\r
+                                       case 'weeksRange':\r
+                                               var mandatory = 1;\r
+                                               for(option in options)\r
+                                                       switch(option) {\r
+                                                               case 'autoselectRange':\r
+                                                                       mandatory--;\r
+                                                               case 'pickableRange':\r
+                                                               case 'adjustRangeToDisabled':\r
+                                                                       this.multiDatesPicker[option] = options[option];\r
+                                                                       break;\r
+                                                               //default: $.error('Option ' + option + ' does not exist for setMode on jQuery.multiDatesPicker');\r
+                                                       }\r
+                                               if(mandatory > 0) $.error('Some mandatory options not specified!');\r
+                                       break;\r
+                               }\r
+                               \r
+                               /*\r
+                               if(options.pickableRange) {\r
+                                       $this.datepicker("option", "maxDate", options.pickableRange);\r
+                                       $this.datepicker("option", "minDate", this.multiDatesPicker.minDate);\r
+                               }\r
+                               */\r
+                               \r
+                               if(mdp_events.onSelect)\r
+                                       mdp_events.onSelect();\r
+                               $this.datepicker('refresh');\r
+                       }\r
+               };\r
+               \r
+               this.each(function() {\r
+                       if (!this.multiDatesPicker) {\r
+                               this.multiDatesPicker = {\r
+                                       dates: {\r
+                                               picked: [],\r
+                                               disabled: []\r
+                                       },\r
+                                       mode: 'normal',\r
+                                       adjustRangeToDisabled: true\r
+                               };\r
+                       }\r
+                       \r
+                       if(methods[method]) {\r
+                               var exec_result = methods[method].apply(this, Array.prototype.slice.call(mdp_arguments, 1));\r
+                               switch(method) {\r
+                                       case 'getDates':\r
+                                       case 'removeDates':\r
+                                       case 'gotDate':\r
+                                       case 'sumDays':\r
+                                       case 'compareDates':\r
+                                       case 'dateConvert':\r
+                                               ret = exec_result;\r
+                               }\r
+                               return exec_result;\r
+                       } else if( typeof method === 'object' || ! method ) {\r
+                               return methods.init.apply(this, mdp_arguments);\r
+                       } else {\r
+                               $.error('Method ' +  method + ' does not exist on jQuery.multiDatesPicker');\r
+                       }\r
+                       return false;\r
+               });\r
+               \r
+               if(method != 'gotDate' && method != 'getDates') {\r
+                       aaaa = 1;\r
+               }\r
+               \r
+               return ret;\r
+       };\r
+\r
+       var PROP_NAME = 'multiDatesPicker';\r
+       var dpuuid = new Date().getTime();\r
+       var instActive;\r
+\r
+       $.multiDatesPicker = {version: false};\r
+       //$.multiDatesPicker = new MultiDatesPicker(); // singleton instance\r
+       $.multiDatesPicker.initialized = false;\r
+       $.multiDatesPicker.uuid = new Date().getTime();\r
+       $.multiDatesPicker.version = $.ui.multiDatesPicker.version;\r
+\r
+       // Workaround for #4055\r
+       // Add another global to avoid noConflict issues with inline event handlers\r
+       window['DP_jQuery_' + dpuuid] = $;\r
+})( jQuery );
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/lang/agenda.xml b/www/plugins/agenda_3_5/lang/agenda.xml
new file mode 100644 (file)
index 0000000..9b8cd30
--- /dev/null
@@ -0,0 +1,15 @@
+<traduction module="agenda" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/agenda/trunk/lang/" reference="fr">
+       <langue code="de" url="http://trad.spip.net/tradlang_module/agenda?lang_cible=de">
+               <traducteur nom="Rainer Müller" lien="http://trad.spip.net/auteur/rainer-muller" />
+       </langue>
+       <langue code="en" url="http://trad.spip.net/tradlang_module/agenda?lang_cible=en">
+               <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
+       </langue>
+       <langue code="es" url="http://trad.spip.net/tradlang_module/agenda?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fr" />
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/agenda?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/agenda_3_5/lang/agenda_de.php b/www/plugins/agenda_3_5/lang/agenda_de.php
new file mode 100644 (file)
index 0000000..49fad44
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/agenda?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'absence_prise_en_compte' => 'Ihre Abwesenheit wurde erfasst',
+       'activite_editoriale' => 'Redaktionelle Aktivität',
+       'afficher_calendrier' => 'Kalender anzeigen',
+       'agenda' => 'Kalender',
+       'ajouter_repetition' => 'Wiederholungen hinzufügen',
+       'ajouter_un_evenement' => 'diesem Artikel ein Event hinzufügen',
+       'annee_precedente' => 'Jahr davor', # MODIF
+       'annee_suivante' => 'Jahr danach',
+       'aucun_evenement' => 'Kein Event',
+       'aucun_inscrit' => 'Aucun inscrit', # NEW
+       'aucune_rubrique_mode_agenda' => 'In der Grundeinstellung können Events in alle Rubriken eingetragen werden. Wenn sie den Kalender gezielt für eine oder mehrere Rubriken aktivieren, dann steht ihnen der Kalender nur für diese Rubriken zur Verfügung.',
+
+       // B
+       'bouton_annuler' => 'Abbrechen',
+       'bouton_supprimer' => 'Löschen',
+
+       // C
+       'confirm_suppression_inscription' => 'Wollen sie diese Anmeldung wirklich löschen?',
+       'confirm_suppression_inscription_toutes' => 'Voulez-vous vraiment supprimer toutes les inscriptions ?', # NEW
+       'connexion_necessaire_pour_inscription' => 'Merci de <a href=\'#LOGIN_PUBLIC\'>vous connecter</a> pour pouvoir vous inscrire à cet événement.', # NEW
+       'creer_evenement' => 'Event neu anlegen',
+
+       // E
+       'erreur_article_interdit' => 'Sie dürfen dieses Event nicht diesem Artikel zuordnen',
+       'erreur_article_manquant' => 'Sie müssen einen Artikel angeben',
+       'erreur_date' => 'Falsches Datum',
+       'erreur_date_avant_apres' => 'Das Enddatum muß nach dem Anfangsdatum liegen!',
+       'erreur_date_corrigee' => 'Das Datum wurde korrigiert',
+       'erreur_heure' => 'Falsche Uhrzeit',
+       'erreur_heure_corrigee' => 'Die Uhrzeit wurde korrigiert',
+       'evenement_adresse' => 'Adresse',
+       'evenement_article' => 'Verbunden mit Artikel',
+       'evenement_autres_occurences' => 'Weitere Zuordnungen:',
+       'evenement_date' => 'Datum',
+       'evenement_date_a' => 'bis ',
+       'evenement_date_a_immediat' => 'zu ',
+       'evenement_date_au' => 'bis ',
+       'evenement_date_de' => 'Von ',
+       'evenement_date_debut' => 'Anfangsdatum',
+       'evenement_date_du' => 'Vom ',
+       'evenement_date_fin' => 'Enddatum',
+       'evenement_date_inscription' => 'Date d\'inscription', # NEW
+       'evenement_descriptif' => 'Beschreibung',
+       'evenement_horaire' => 'ganztägig',
+       'evenement_lieu' => 'Ort',
+       'evenement_repetitions' => 'Wiederholungen',
+       'evenement_titre' => 'Titel',
+       'evenements' => 'Event',
+       'evenements_a_venir' => 'In der Zukunft',
+       'evenements_depuis_debut' => 'Alle',
+       'explication_synchro_flux_ical' => 'Le plugin Agenda fournit un flux des évènements au format iCal. Certains clients ne mettent à jour un évènement que si un numéro de version (indiquant ansi qu\'il y a eu modification) est présent dans ce flux. Pour que ce numéro de version soit intégré dans le flux iCal généré, vous devez activer le suivi des révisions pour les évènements (menu Configuration > Révisions).', # NEW
+       'explication_synchro_flux_ical_titre' => 'Synchronisation du flux iCal', # NEW
+
+       // F
+       'fermer' => 'Schließen',
+
+       // I
+       'icone_creer_evenement' => 'Neue Veranstaltung anlegen',
+       'icone_modifier_evenement' => 'Event Bearbeiten',
+       'indiquez_votre_choix' => 'Indiquez votre choix', # NEW
+       'info_1_mois' => '1 mois', # NEW
+       'info_1_place' => '1 Platz',
+       'info_aucun_evenement' => 'Kein Event',
+       'info_evenement' => 'Event',
+       'info_evenement_poubelle' => 'Event gelöscht',
+       'info_evenement_propose' => 'Event vorgeschlagen',
+       'info_evenement_publie' => 'Event veröffentlicht',
+       'info_evenements' => 'Event',
+       'info_inscription' => 'Inscription en ligne :', # NEW
+       'info_lieu' => 'Ort:',
+       'info_nb_inscrits' => '@nb@ inscrits', # NEW
+       'info_nb_mois' => '@nb@ mois', # NEW
+       'info_nb_places' => '@nb@ Plätze',
+       'info_nombre_evenements' => '@nb@ Events',
+       'info_nouvel_evenement' => 'Neues Event',
+       'info_reponse_inscription_non' => 'nein',
+       'info_reponse_inscription_nsp' => '?',
+       'info_reponse_inscription_oui' => 'ja',
+       'info_reponse_inscriptions' => 'Réponse', # NEW
+       'info_reponses_inscriptions' => 'Antworten',
+       'info_un_evenement' => 'ein Event',
+       'info_un_inscrit' => 'Un inscrit', # NEW
+       'inscrits' => 'Anmeldungen',
+
+       // L
+       'label_annee' => 'Année', # NEW
+       'label_inscription' => 'Online-Anmeldungen',
+       'label_periode_saison' => 'Saison', # NEW
+       'label_places' => 'Maximale Anzahl Plätze',
+       'label_reponse_jyparticipe' => 'Ich komme',
+       'label_reponse_jyparticipe_pas' => 'Ich komme nicht',
+       'label_reponse_jyparticipe_peutetre' => 'Ich komem vielleicht',
+       'label_vous_inscrire' => 'Ihre Teilnahme',
+       'lien_desinscrire' => 'Entfernen',
+       'lien_desinscrire_tous' => 'Supprimer toutes les inscriptions', # NEW
+       'lien_retirer_evenement' => 'Löschen',
+       'liste_inscrits' => 'Liste der Anmeldungen',
+
+       // M
+       'mois_precedent' => 'voriger Monat',
+       'mois_suivant' => 'nächster Monat',
+
+       // N
+       'nb_repetitions' => '@nb@ Wiederholungen',
+
+       // P
+       'participation_incertaine_prise_en_compte' => 'Ihre vorläufige Anmeldung wurde gespeichert',
+       'participation_prise_en_compte' => 'Ihre Anmeldung wurde gespeichert',
+       'probleme_technique' => 'Ein technisches Problem ist aufgetreten. Bitte versuchen sie es später noch einmal.',
+
+       // R
+       'repetition' => 'Wiederholung',
+       'repetition_de' => 'Wiederholung von',
+       'retour_evenement' => 'Retour à l\'événement', # NEW
+       'rubrique_activer_agenda' => 'Kalender für diese Rubrik aktivieren',
+       'rubrique_dans_une_rubrique_mode_agenda' => 'Diese Rubrik kann den Kalender nutzen, denn sie befindet sich innerhalb einer Rubrik, für die den Kalende nutzen darf.',
+       'rubrique_desactiver_agenda' => 'Kalender in dieser Rubrik deaktivieren',
+       'rubrique_liste_evenements_de' => 'Events der Rubrik',
+       'rubrique_mode_agenda' => 'Der Kalender wurde für diese Rubrik und ihre Artikel aktiviert. ',
+       'rubrique_sans_gestion_evenement' => 'Der Kalender ist für diese Rubrik noch nicht aktiviert. ',
+       'rubriques' => 'Kalender-Rubriken',
+
+       // S
+       'sans_titre' => '(ohne Titel)',
+
+       // T
+       'telecharger' => 'Herunterladen', # MODIF
+       'telecharger_oui' => 'Seulement les réponses positives', # NEW
+       'telecharger_toutes' => 'Toutes les réponses', # NEW
+       'telecharger_toutes_tous_evenements' => 'Toutes les réponses aux inscriptions', # NEW
+       'texte_agenda' => 'KALENDER', # MODIF
+       'texte_evenement_statut' => 'Dieses Event ist',
+       'texte_logo_objet' => 'EVENT-LOGO', # MODIF
+       'titre_cadre_ajouter_evenement' => 'Event hinzufügen',
+       'titre_cadre_modifier_evenement' => 'Event umändern',
+       'titre_sur_l_agenda' => 'Im Kalender',
+       'titre_sur_l_agenda_aussi' => 'Et aussi...', # NEW
+       'toutes_rubriques' => 'Alle',
+
+       // U
+       'une_repetition' => '1 Wiederholung',
+
+       // V
+       'voir_evenements_rubrique' => 'Die Events der Rubrik einsehen'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/agenda_en.php b/www/plugins/agenda_3_5/lang/agenda_en.php
new file mode 100644 (file)
index 0000000..1e5bbc9
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/agenda?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'absence_prise_en_compte' => 'Your absence is recorded',
+       'activite_editoriale' => 'Editorial activity',
+       'afficher_calendrier' => 'Show the calendar',
+       'agenda' => 'Agenda',
+       'ajouter_repetition' => 'Add repetitions',
+       'ajouter_un_evenement' => 'Add one event to this article',
+       'annee_precedente' => 'previous year',
+       'annee_suivante' => 'next year',
+       'aucun_evenement' => 'no event',
+       'aucun_inscrit' => 'No registered',
+       'aucune_rubrique_mode_agenda' => 'By default, all sections can use the events. If you activate the agenda mode on one or more sections, event management will be limited in its subtree.',
+
+       // B
+       'bouton_annuler' => 'Cancel',
+       'bouton_supprimer' => 'Delete',
+
+       // C
+       'confirm_suppression_inscription' => 'Are you sure you want to delete this registration?',
+       'confirm_suppression_inscription_toutes' => 'Do you really want to delete all registrations?',
+       'connexion_necessaire_pour_inscription' => 'Please log in to register to this event.',
+       'creer_evenement' => 'Create an event',
+
+       // E
+       'erreur_article_interdit' => 'You have no right to associate this event to this article',
+       'erreur_article_manquant' => 'You should link to an article',
+       'erreur_date' => 'This date is incorrect',
+       'erreur_date_avant_apres' => 'Please enter an end date after the date of beginning.',
+       'erreur_date_corrigee' => 'The date has been corrected',
+       'erreur_heure' => 'This hour is incorrect',
+       'erreur_heure_corrigee' => 'The hour has been corrected',
+       'evenement_adresse' => 'Address',
+       'evenement_article' => 'Link to the article',
+       'evenement_autres_occurences' => 'Other occurences :',
+       'evenement_date' => 'Date',
+       'evenement_date_a' => 'to ',
+       'evenement_date_a_immediat' => 'at ',
+       'evenement_date_au' => 'To ',
+       'evenement_date_de' => 'From ',
+       'evenement_date_debut' => 'Starting date',
+       'evenement_date_du' => 'From ',
+       'evenement_date_fin' => 'Ending date',
+       'evenement_date_inscription' => 'Registration date',
+       'evenement_descriptif' => 'Description',
+       'evenement_horaire' => 'All day',
+       'evenement_lieu' => 'Location',
+       'evenement_repetitions' => 'Repetition',
+       'evenement_titre' => 'Title',
+       'evenements' => 'Events',
+       'evenements_a_venir' => 'Next',
+       'evenements_depuis_debut' => 'All',
+       'explication_synchro_flux_ical' => 'Le plugin Agenda fournit un flux des évènements au format iCal. Certains clients ne mettent à jour un évènement que si un numéro de version (indiquant ansi qu\'il y a eu modification) est présent dans ce flux. Pour que ce numéro de version soit intégré dans le flux iCal généré, vous devez activer le suivi des révisions pour les évènements (menu Configuration > Révisions).', # NEW
+       'explication_synchro_flux_ical_titre' => 'Synchronisation du flux iCal', # NEW
+
+       // F
+       'fermer' => 'close',
+
+       // I
+       'icone_creer_evenement' => 'Generate a new event',
+       'icone_modifier_evenement' => 'Edit the event',
+       'indiquez_votre_choix' => 'Indicate your choice',
+       'info_1_mois' => '1 month',
+       'info_1_place' => '1 seat',
+       'info_aucun_evenement' => 'No event',
+       'info_evenement' => 'Event',
+       'info_evenement_poubelle' => 'Event deleted',
+       'info_evenement_propose' => 'Event proposed',
+       'info_evenement_publie' => 'Event published',
+       'info_evenements' => 'Events',
+       'info_inscription' => 'Online registration:',
+       'info_lieu' => 'Place:',
+       'info_nb_inscrits' => '@nb@ registered',
+       'info_nb_mois' => '@nb@ months',
+       'info_nb_places' => '@nb@ seats',
+       'info_nombre_evenements' => '@nb@ events',
+       'info_nouvel_evenement' => 'New event',
+       'info_reponse_inscription_non' => 'no',
+       'info_reponse_inscription_nsp' => '?',
+       'info_reponse_inscription_oui' => 'yes',
+       'info_reponse_inscriptions' => 'Answer',
+       'info_reponses_inscriptions' => 'Answers:',
+       'info_un_evenement' => 'One event',
+       'info_un_inscrit' => 'One registered',
+       'inscrits' => 'Registrations',
+
+       // L
+       'label_annee' => 'Year',
+       'label_inscription' => 'Online registration',
+       'label_periode_saison' => 'Season',
+       'label_places' => 'Limit the seats number',
+       'label_reponse_jyparticipe' => 'I\'ll be there',
+       'label_reponse_jyparticipe_pas' => 'I won\'t be there',
+       'label_reponse_jyparticipe_peutetre' => 'Maybe I\'ll be there',
+       'label_vous_inscrire' => 'Your participation',
+       'lien_desinscrire' => 'Remove',
+       'lien_desinscrire_tous' => 'Delete all registrations',
+       'lien_retirer_evenement' => 'Deleted ',
+       'liste_inscrits' => 'Registrations',
+
+       // M
+       'mois_precedent' => 'previous month',
+       'mois_suivant' => 'next month',
+
+       // N
+       'nb_repetitions' => '@nb@ repetitions',
+
+       // P
+       'participation_incertaine_prise_en_compte' => 'Your possible participation is registered',
+       'participation_prise_en_compte' => 'Your participation is recorded',
+       'probleme_technique' => 'A technical problem occurred. Try again later.',
+
+       // R
+       'repetition' => 'Repetition',
+       'repetition_de' => 'Repetition of',
+       'retour_evenement' => 'Back to the event',
+       'rubrique_activer_agenda' => 'Activate the agenda for this section',
+       'rubrique_dans_une_rubrique_mode_agenda' => 'This section allows you to use the events as it is in a section where agenda mode has been enabled',
+       'rubrique_desactiver_agenda' => 'Disable agenda mode for this section',
+       'rubrique_liste_evenements_de' => 'Events of the section',
+       'rubrique_mode_agenda' => 'The agenda mode is enabled for this section and its subtree',
+       'rubrique_sans_gestion_evenement' => 'The agenda mode is not enabled for this section',
+       'rubriques' => 'Agenda sections',
+
+       // S
+       'sans_titre' => '(without title)',
+
+       // T
+       'telecharger' => 'Download (csv)',
+       'telecharger_oui' => 'Only positive answers',
+       'telecharger_toutes' => 'All answers',
+       'telecharger_toutes_tous_evenements' => 'All answers to registrations',
+       'texte_agenda' => 'Agenda',
+       'texte_evenement_statut' => 'This event is:',
+       'texte_logo_objet' => 'Event\'s logo',
+       'titre_cadre_ajouter_evenement' => 'Add one event',
+       'titre_cadre_modifier_evenement' => 'Modify one event',
+       'titre_sur_l_agenda' => 'On agenda',
+       'titre_sur_l_agenda_aussi' => 'And also...',
+       'toutes_rubriques' => 'All',
+
+       // U
+       'une_repetition' => '1 repetition',
+
+       // V
+       'voir_evenements_rubrique' => 'See this section\'s events'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/agenda_es.php b/www/plugins/agenda_3_5/lang/agenda_es.php
new file mode 100644 (file)
index 0000000..ffba447
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/agenda?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'absence_prise_en_compte' => 'Su ausencia se ha registrado',
+       'activite_editoriale' => 'Actividad Editorial',
+       'afficher_calendrier' => 'Mostrar el calendario',
+       'agenda' => 'Agenda',
+       'ajouter_repetition' => 'Añadir repeticiones',
+       'ajouter_un_evenement' => 'Añadir un evento a este artículo',
+       'annee_precedente' => 'Año anterior',
+       'annee_suivante' => 'Año siguiente',
+       'aucun_evenement' => 'Ningún evento',
+       'aucun_inscrit' => 'Ningún inscrito',
+       'aucune_rubrique_mode_agenda' => 'Por defecto, todas las secciones permiten utilizar los eventos. Si activa el modo agenda sobre una o más secciones, la gestión de enventos se limitará a su rama.',
+
+       // B
+       'bouton_annuler' => 'Cancelar',
+       'bouton_supprimer' => 'Eliminar',
+
+       // C
+       'confirm_suppression_inscription' => '¿Desea realmente eliminar esta inscripción?',
+       'confirm_suppression_inscription_toutes' => '¿Desea realmente eliminar todas las inscripciones?',
+       'connexion_necessaire_pour_inscription' => 'Gracias por <a href=\'#LOGIN_PUBLIC\'>conectarse</a> para poder inscribirse a este evento.',
+       'creer_evenement' => 'Crear un evento',
+
+       // E
+       'erreur_article_interdit' => 'No tiene permiso para asociar este evento a este artículo',
+       'erreur_article_manquant' => 'Debe indicar un artículo',
+       'erreur_date' => 'Esta fecha es incorrecta',
+       'erreur_date_avant_apres' => '¡Indique una fecha de finalización posterior a la fecha de inicio!',
+       'erreur_date_corrigee' => 'La fecha ha sido corregida',
+       'erreur_heure' => 'Esta hora es incorrecta',
+       'erreur_heure_corrigee' => 'La hora ha sido corregida',
+       'evenement_adresse' => 'Dirección',
+       'evenement_article' => 'Asociado al artículo',
+       'evenement_autres_occurences' => 'Otras ocasiones:',
+       'evenement_date' => 'Fecha',
+       'evenement_date_a' => 'a las ',
+       'evenement_date_a_immediat' => 'a las ',
+       'evenement_date_au' => 'Al',
+       'evenement_date_de' => 'De ',
+       'evenement_date_debut' => 'Fecha de inicio',
+       'evenement_date_du' => 'Del ',
+       'evenement_date_fin' => 'Fecha de finalización',
+       'evenement_date_inscription' => 'Fecha de inscripción',
+       'evenement_descriptif' => 'Descripción',
+       'evenement_horaire' => 'Todo el día',
+       'evenement_lieu' => 'Lugar',
+       'evenement_repetitions' => 'Repeticiones',
+       'evenement_titre' => 'Título',
+       'evenements' => 'Eventos',
+       'evenements_a_venir' => 'Próximos',
+       'evenements_depuis_debut' => 'Desde el inicio',
+       'explication_synchro_flux_ical' => 'Le plugin Agenda fournit un flux des évènements au format iCal. Certains clients ne mettent à jour un évènement que si un numéro de version (indiquant ansi qu\'il y a eu modification) est présent dans ce flux. Pour que ce numéro de version soit intégré dans le flux iCal généré, vous devez activer le suivi des révisions pour les évènements (menu Configuration > Révisions).', # NEW
+       'explication_synchro_flux_ical_titre' => 'Synchronisation du flux iCal', # NEW
+
+       // F
+       'fermer' => 'cerrar',
+
+       // I
+       'icone_creer_evenement' => 'Crear un nuevo evento',
+       'icone_modifier_evenement' => 'Modificar el evento',
+       'indiquez_votre_choix' => 'Indique su elección',
+       'info_1_mois' => '1 mes',
+       'info_1_place' => '1 plaza',
+       'info_aucun_evenement' => 'Ningún evento',
+       'info_evenement' => 'Evento',
+       'info_evenement_poubelle' => 'Evento eliminado',
+       'info_evenement_propose' => 'Evento propuesto',
+       'info_evenement_publie' => 'Evento publicado',
+       'info_evenements' => 'Eventos',
+       'info_inscription' => 'Inscripción en línea:',
+       'info_lieu' => 'Lugar:',
+       'info_nb_inscrits' => '@nb@ inscritos',
+       'info_nb_mois' => '@nb@ meses',
+       'info_nb_places' => '@nb@ plazas',
+       'info_nombre_evenements' => '@nb@ eventos',
+       'info_nouvel_evenement' => 'Nuevo evento',
+       'info_reponse_inscription_non' => 'no',
+       'info_reponse_inscription_nsp' => '¿?',
+       'info_reponse_inscription_oui' => 'sí',
+       'info_reponse_inscriptions' => 'Respuesta',
+       'info_reponses_inscriptions' => 'Respuestas:',
+       'info_un_evenement' => '1 evento',
+       'info_un_inscrit' => 'Un inscrito',
+       'inscrits' => 'Inscripciones',
+
+       // L
+       'label_annee' => 'Año',
+       'label_inscription' => 'Inscripción en línea ',
+       'label_periode_saison' => 'Estación',
+       'label_places' => 'Limitar el número de lugares',
+       'label_reponse_jyparticipe' => 'Asistiré',
+       'label_reponse_jyparticipe_pas' => 'No asistiré',
+       'label_reponse_jyparticipe_peutetre' => 'Tal vez asista',
+       'label_vous_inscrire' => 'Su participación',
+       'lien_desinscrire' => 'Eliminar',
+       'lien_desinscrire_tous' => 'Eliminar todas las inscripciones',
+       'lien_retirer_evenement' => 'Eliminar',
+       'liste_inscrits' => 'Lista de inscripciones',
+
+       // M
+       'mois_precedent' => 'mes anterior',
+       'mois_suivant' => 'mes siguiente',
+
+       // N
+       'nb_repetitions' => '@nb@ repeticiones',
+
+       // P
+       'participation_incertaine_prise_en_compte' => 'Su eventual participación ha sido registrada',
+       'participation_prise_en_compte' => 'Su participación ha sido registrada',
+       'probleme_technique' => 'Ha habido un problema técnico. Por favor, inténtelo más tarde.',
+
+       // R
+       'repetition' => 'Repetición',
+       'repetition_de' => 'Repetición de',
+       'retour_evenement' => 'Volver al evento',
+       'rubrique_activer_agenda' => 'Activar el modo agenda',
+       'rubrique_dans_une_rubrique_mode_agenda' => 'Esta sección permite utilizar eventos porque está en una sección en la que el modo agenda ha sido activado',
+       'rubrique_desactiver_agenda' => 'Desactivar el modo agenda',
+       'rubrique_liste_evenements_de' => 'Eventos de la sección',
+       'rubrique_mode_agenda' => 'El modo agenda está activado para esta sección y su rama',
+       'rubrique_sans_gestion_evenement' => 'El modo agenda no está activado para esta sección',
+       'rubriques' => 'Secciones Agenda',
+
+       // S
+       'sans_titre' => '(sin título)',
+
+       // T
+       'telecharger' => 'Descargar',
+       'telecharger_oui' => 'Solamente respuestas positivas',
+       'telecharger_toutes' => 'Todas las respuestas',
+       'telecharger_toutes_tous_evenements' => 'Todas las respuestas a las inscripciones',
+       'texte_agenda' => 'Agenda',
+       'texte_evenement_statut' => 'Este evento es:',
+       'texte_logo_objet' => 'Logo del evento',
+       'titre_cadre_ajouter_evenement' => 'Añadir un evento',
+       'titre_cadre_modifier_evenement' => 'Modificar un evento',
+       'titre_sur_l_agenda' => 'En la agenda',
+       'titre_sur_l_agenda_aussi' => 'Y también...',
+       'toutes_rubriques' => 'Todas',
+
+       // U
+       'une_repetition' => '1 repetición',
+
+       // V
+       'voir_evenements_rubrique' => 'Ver los eventos de la sección'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/agenda_fr.php b/www/plugins/agenda_3_5/lang/agenda_fr.php
new file mode 100644 (file)
index 0000000..f93569b
--- /dev/null
@@ -0,0 +1,155 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/agenda/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'absence_prise_en_compte' => 'Votre absence est enregistrée',
+       'activite_editoriale' => 'Activité Éditoriale',
+       'afficher_calendrier' => 'Afficher le calendrier',
+       'agenda' => 'Agenda',
+       'ajouter_repetition' => 'Ajouter des répétitions',
+       'ajouter_un_evenement' => 'ajouter un événement à cet article',
+       'annee_precedente' => 'année précédente',
+       'annee_suivante' => 'année suivante',
+       'aucun_evenement' => 'aucun événement',
+       'aucun_inscrit' => 'Aucun inscrit',
+       'aucune_rubrique_mode_agenda' => 'Par défaut, toutes les rubriques permettent d\'utiliser les événements. Si vous activez le mode agenda sur une ou plusieurs rubriques, la gestion des événements sera limitée a sa branche.',
+
+       // B
+       'bouton_annuler' => 'Annuler',
+       'bouton_supprimer' => 'Supprimer',
+
+       // C
+       'confirm_suppression_inscription' => 'Voulez-vous vraiment supprimer cette inscription ?',
+       'confirm_suppression_inscription_toutes' => 'Voulez-vous vraiment supprimer toutes les inscriptions ?',
+       'connexion_necessaire_pour_inscription' => 'Merci de vous connecter pour pouvoir vous inscrire à cet événement.',
+       'creer_evenement' => 'Créer un événement',
+
+       // E
+       'erreur_article_interdit' => 'Vous n\'avez pas le droit d\'associer cet événement à cet article',
+       'erreur_article_manquant' => 'Vous devez indiquer un article',
+       'erreur_date' => 'Cette date est incorrecte',
+       'erreur_date_avant_apres' => 'Indiquez une date de fin après la date de début !',
+       'erreur_date_corrigee' => 'La date a été corrigée',
+       'erreur_heure' => 'Cette heure est incorrecte',
+       'erreur_heure_corrigee' => 'L\'heure a été corrigée',
+       'evenement_adresse' => 'Adresse',
+       'evenement_article' => 'Associé à l\'article',
+       'evenement_autres_occurences' => 'Autres occurences :',
+       'evenement_date' => 'Date',
+       'evenement_date_a' => 'à ',
+       'evenement_date_a_immediat' => 'à ',
+       'evenement_date_au' => 'Au ',
+       'evenement_date_de' => 'De ',
+       'evenement_date_debut' => 'Date de début',
+       'evenement_date_du' => 'Du ',
+       'evenement_date_fin' => 'Date de fin',
+       'evenement_date_inscription' => 'Date d\'inscription',
+       'evenement_descriptif' => 'Descriptif',
+       'evenement_horaire' => 'Toute la journée',
+       'evenement_lieu' => 'Lieu',
+       'evenement_repetitions' => 'Répétitions',
+       'evenement_titre' => 'Titre',
+       'evenements' => 'Événements',
+       'evenements_a_venir' => 'À venir',
+       'evenements_depuis_debut' => 'Depuis le début',
+       'explication_synchro_flux_ical' => 'Le plugin Agenda fournit un flux des évènements au format iCal. Certains clients ne mettent à jour un évènement que si un numéro de version (indiquant ansi qu\'il y a eu modification) est présent dans ce flux. Pour que ce numéro de version soit intégré dans le flux iCal généré, vous devez activer le suivi des révisions pour les évènements (menu Configuration > Révisions).',
+       'explication_synchro_flux_ical_titre' => 'Synchronisation du flux iCal',
+
+       // F
+       'fermer' => 'fermer',
+
+       // I
+       'icone_creer_evenement' => 'Créer un nouvel événement',
+       'icone_modifier_evenement' => 'Modifier l\'événement',
+       'indiquez_votre_choix' => 'Indiquez votre choix',
+       'info_1_mois' => '1 mois',
+       'info_1_place' => '1 place',
+       'info_aucun_evenement' => 'Aucun événement',
+       'info_evenement' => 'Événement',
+       'info_evenement_poubelle' => 'Événement supprimé',
+       'info_evenement_propose' => 'Événement proposé',
+       'info_evenement_publie' => 'Événement publié',
+       'info_evenements' => 'Événements',
+       'info_inscription' => 'Inscription en ligne :',
+       'info_lieu' => 'Lieu :',
+       'info_nb_inscrits' => '@nb@ inscrits',
+       'info_nb_mois' => '@nb@ mois',
+       'info_nb_places' => '@nb@ places',
+       'info_nombre_evenements' => '@nb@ événements',
+       'info_nouvel_evenement' => 'Nouvel événement',
+       'info_reponse_inscription_non' => 'non',
+       'info_reponse_inscription_nsp' => '?',
+       'info_reponse_inscription_oui' => 'oui',
+       'info_reponse_inscriptions' => 'Réponse',
+       'info_reponses_inscriptions' => 'Réponses :',
+       'info_un_evenement' => '1 événement',
+       'info_un_inscrit' => 'Un inscrit',
+       'inscrits' => 'Inscriptions',
+
+       // L
+       'label_annee' => 'Année',
+       'label_inscription' => 'Inscription en ligne',
+       'label_periode_saison' => 'Saison',
+       'label_places' => 'Limiter le nombre de places',
+       'label_reponse_jyparticipe' => 'J\'y serai',
+       'label_reponse_jyparticipe_pas' => 'Je n\'y vais pas',
+       'label_reponse_jyparticipe_peutetre' => 'J\'y serai peut-être',
+       'label_vous_inscrire' => 'Votre participation',
+       'lien_desinscrire' => 'Supprimer',
+       'lien_desinscrire_tous' => 'Supprimer toutes les inscriptions',
+       'lien_retirer_evenement' => 'Supprimer',
+       'liste_inscrits' => 'Liste des inscriptions',
+
+       // M
+       'mois_precedent' => 'mois précédent',
+       'mois_suivant' => 'mois suivant',
+
+       // N
+       'nb_repetitions' => '@nb@ répétitions',
+
+       // P
+       'participation_incertaine_prise_en_compte' => 'Votre participation éventuelle est enregistrée',
+       'participation_prise_en_compte' => 'Votre participation est enregistrée',
+       'probleme_technique' => 'Un problème technique est survenu. Reessayez plus tard.',
+
+       // R
+       'repetition' => 'Répétition',
+       'repetition_de' => 'Répétition de',
+       'retour_evenement' => 'Retour à l\'événement',
+       'rubrique_activer_agenda' => 'Activer le mode agenda',
+       'rubrique_dans_une_rubrique_mode_agenda' => 'Cette rubrique permet d\'utiliser les événements car elle est dans une rubrique dont le mode agenda a été activé',
+       'rubrique_desactiver_agenda' => 'Désactiver le mode agenda',
+       'rubrique_liste_evenements_de' => 'Événements de la rubrique',
+       'rubrique_mode_agenda' => 'Le mode agenda est activé pour cette rubrique et sa branche',
+       'rubrique_sans_gestion_evenement' => 'Le mode agenda n\'est pas activé pour cette rubrique',
+       'rubriques' => 'Rubriques Agenda',
+
+       // S
+       'sans_titre' => '(sans titre)',
+
+       // T
+       'telecharger' => 'Télécharger (csv)',
+       'telecharger_oui' => 'Seulement les réponses positives',
+       'telecharger_toutes' => 'Toutes les réponses',
+       'telecharger_toutes_tous_evenements' => 'Toutes les réponses aux inscriptions',
+       'texte_agenda' => 'Agenda',
+       'texte_evenement_statut' => 'Cet événement est :',
+       'texte_logo_objet' => 'Logo de l\'événement',
+       'titre_cadre_ajouter_evenement' => 'Ajouter un événement',
+       'titre_cadre_modifier_evenement' => 'Modifier un événement',
+       'titre_sur_l_agenda' => 'Sur l\'agenda',
+       'titre_sur_l_agenda_aussi' => 'Et aussi...',
+       'toutes_rubriques' => 'Toutes',
+
+       // U
+       'une_repetition' => '1 répétition',
+
+       // V
+       'voir_evenements_rubrique' => 'Voir les événements de la rubrique'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/agenda_nl.php b/www/plugins/agenda_3_5/lang/agenda_nl.php
new file mode 100644 (file)
index 0000000..fabba51
--- /dev/null
@@ -0,0 +1,60 @@
+<?php\r
+\r
+// Ceci est un fichier langue de SPIP -- This is a SPIP language file\r
+// Produit automatiquement par le plugin LangOnet a partir de la langue source nl\r
+// Module: agenda\r
+// Langue: nl\r
+// Date: 27-05-2011 12:08:10\r
+// Items: 35\r
+\r
+if (!defined('_ECRIRE_INC_VERSION')) return;\r
+\r
+$GLOBALS[$GLOBALS['idx_lang']] = array(\r
+\r
+// A\r
+       'activite_editoriale' => 'Hoofdactiviteit',\r
+       'ajouter_un_evenement' => 'een gebeurtenis toevoegen aan dit artikel',\r
+// B\r
+       'bouton_annuler' => 'Annuleren',\r
+       'bouton_supprimer' => 'Afschaffen',\r
+// E\r
+       'evenement_autres_occurences' => 'Andere omstandigheden:',\r
+       'evenement_date' => 'Date',\r
+       'evenement_date_a' => 'tot ',\r
+       'evenement_date_a_immediat' => 'om ',\r
+       'evenement_date_au' => 'Tot ',\r
+       'evenement_date_de' => 'Van ',\r
+       'evenement_date_debut' => 'Aanvangsdatum',\r
+       'evenement_date_du' => 'Van ',\r
+       'evenement_date_fin' => 'Einddatum',\r
+       'evenement_descriptif' => 'Beschrijvend',\r
+       'evenement_horaire' => 'Dienstregeling',\r
+       'evenement_lieu' => 'Plaats',\r
+       'evenement_repetitions' => 'Herhalingen',\r
+       'evenement_titre' => 'Titel',\r
+       'evenements' => 'Gebeurtenissen',\r
+// I\r
+       'icone_creer_evenement' => 'Een nieuwe gebeurtenis creëren',\r
+       'info_evenements' => 'Gebeurtenissen',\r
+       'info_nombre_evenements' => '@nb@ gebeurtenissen,',\r
+       'info_un_evenement' => 'een gebeurtenis,',\r
+       'item_mots_cles_association_evenements' => 'aan de gebeurtenissen',\r
+// L\r
+       'lien_retirer_evenement' => 'Afschaffen',\r
+// N\r
+       'nb_mots_clefs' => '@nb@ trefwoorden',\r
+       'nb_repetitions' => '@nb@ herhalingen',\r
+// R\r
+       'repetition_de' => 'Herhaling van',\r
+// S\r
+       'sans_titre' => '(zonder titel)',\r
+// T\r
+       'texte_agenda' => 'AGENDA',\r
+       'titre_cadre_ajouter_evenement' => 'Een gebeurtenis toevoegen',\r
+       'titre_cadre_modifier_evenement' => 'Een gebeurtenis wijzigen',\r
+       'titre_sur_l_agenda' => 'Op de agenda',\r
+// U\r
+       'un_mot_clef' => '1 trefwoord',\r
+       'une_repetition' => '1 herhaling',\r
+);\r
+?>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/lang/agenda_sk.php b/www/plugins/agenda_3_5/lang/agenda_sk.php
new file mode 100644 (file)
index 0000000..2526554
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/agenda?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'absence_prise_en_compte' => 'Vaša neúčasť bola zaznamenaná',
+       'activite_editoriale' => 'Redakčná činnosť',
+       'afficher_calendrier' => 'Zobraziť kalendár',
+       'agenda' => 'Kalendár udalostí',
+       'ajouter_repetition' => 'Pridať opakovania',
+       'ajouter_un_evenement' => 'pridať udalosť k tomuto článku',
+       'annee_precedente' => 'predchádzajúci rok',
+       'annee_suivante' => 'ďalší rok',
+       'aucun_evenement' => 'žiadna udalosť',
+       'aucun_inscrit' => 'Žiadne prihlásenie',
+       'aucune_rubrique_mode_agenda' => 'Podľa predvolených nastavení vám všetky rubriky umožňujú umožňujú využívať udalosti. Ak kalendár udalostí aktivujete pre jednu rubriku alebo viacero rubrík, riadenie udalostí bude obmedzené na vetvy týchto rubrík.',
+
+       // B
+       'bouton_annuler' => 'Zrušiť',
+       'bouton_supprimer' => 'Odstrániť',
+
+       // C
+       'confirm_suppression_inscription' => 'Chcete odstrániť tento údaj?',
+       'confirm_suppression_inscription_toutes' => 'Naozaj chcete vymazať všetky prihlásenia?',
+       'connexion_necessaire_pour_inscription' => 'Ďakujeme vám, že sa prihlásite predtým, ako sa zaregistrujete na túto udalosť.',
+       'creer_evenement' => 'Vytvoriť udalosť',
+
+       // E
+       'erreur_article_interdit' => 'Nemáte dostatočné práva na to, aby ste mohli priradiť túto udalosť k tomuto článku',
+       'erreur_article_manquant' => 'Musíte uviesť článok',
+       'erreur_date' => 'Tento dátum nie je správny',
+       'erreur_date_avant_apres' => 'Zadajte dátum ukončenia, ktorý nasleduje po dátume začiatku!',
+       'erreur_date_corrigee' => 'Dátum bol opravený',
+       'erreur_heure' => 'Tento čas nie je správny',
+       'erreur_heure_corrigee' => 'Čas bol opravený',
+       'evenement_adresse' => 'Adresa',
+       'evenement_article' => 'Priradená k článku',
+       'evenement_autres_occurences' => 'Ďalšie výskyty:',
+       'evenement_date' => 'Dátum',
+       'evenement_date_a' => 'k ',
+       'evenement_date_a_immediat' => 'o ',
+       'evenement_date_au' => 'Do ',
+       'evenement_date_de' => 'Z(o) ',
+       'evenement_date_debut' => 'Dátum začiatku',
+       'evenement_date_du' => 'Od ',
+       'evenement_date_fin' => 'Dátum ukončenia',
+       'evenement_date_inscription' => 'Dátum prihlásenia',
+       'evenement_descriptif' => 'Opis',
+       'evenement_horaire' => 'Celý deň',
+       'evenement_lieu' => 'Miesto',
+       'evenement_repetitions' => 'Opakovania',
+       'evenement_titre' => 'Nadpis',
+       'evenements' => 'Udalosti',
+       'evenements_a_venir' => 'Budúce',
+       'evenements_depuis_debut' => 'od začiatku',
+       'explication_synchro_flux_ical' => 'Zásuvný modul Kalendár udalostí poskytuje výpis zoznamu udalostí vo formáte iCal. Niektoré programy aktualizujú udalosti, iba ak  je pri nich uvedené číslo verzie (a to, že nastala zmena). Na to, aby bolo toto číslo verzie zavedené do vygenerovaného zdroja iCal, treba aktivovať sledovanie zmien pre udalosti (menu Konfigurácia > Zmeny).',
+       'explication_synchro_flux_ical_titre' => 'Synchronizácia zdroja iCal',
+
+       // F
+       'fermer' => 'zatvoriť',
+
+       // I
+       'icone_creer_evenement' => 'Vytvoriť novú udalosť',
+       'icone_modifier_evenement' => 'Upraviť udalosť',
+       'indiquez_votre_choix' => 'Uveďte svoju voľbu',
+       'info_1_mois' => '1 mesiac',
+       'info_1_place' => '1 miesto',
+       'info_aucun_evenement' => 'Žiadna udalosť',
+       'info_evenement' => 'Udalosť',
+       'info_evenement_poubelle' => 'Odstránená udalosť',
+       'info_evenement_propose' => 'Navrhovaná udalosť',
+       'info_evenement_publie' => 'Uverejnená udalosť',
+       'info_evenements' => 'Udalosti',
+       'info_inscription' => 'Registrácia online:',
+       'info_lieu' => 'Miesto:',
+       'info_nb_inscrits' => '@nb@ prihlásení',
+       'info_nb_mois' => '@nb@ mesiac',
+       'info_nb_places' => '@nb@ miest',
+       'info_nombre_evenements' => '@nb@ udalostí',
+       'info_nouvel_evenement' => 'Nová udalosť',
+       'info_reponse_inscription_non' => 'nie',
+       'info_reponse_inscription_nsp' => '?',
+       'info_reponse_inscription_oui' => 'áno',
+       'info_reponse_inscriptions' => 'Reakcia',
+       'info_reponses_inscriptions' => 'Reakcie:',
+       'info_un_evenement' => '1 udalosť',
+       'info_un_inscrit' => 'Jedno prihlásenie',
+       'inscrits' => 'Registrácie',
+
+       // L
+       'label_annee' => 'Rok',
+       'label_inscription' => 'Registrácia online',
+       'label_periode_saison' => 'Ročné obdobie',
+       'label_places' => 'Obmedziť počet miest',
+       'label_reponse_jyparticipe' => 'Budem tam',
+       'label_reponse_jyparticipe_pas' => 'Neprídem',
+       'label_reponse_jyparticipe_peutetre' => 'Možno prídem',
+       'label_vous_inscrire' => 'Vaša účasť',
+       'lien_desinscrire' => 'Odstrániť',
+       'lien_desinscrire_tous' => 'Vymazať všetky prihlásenia',
+       'lien_retirer_evenement' => 'Odstrániť',
+       'liste_inscrits' => 'Zoznam zaregistrovaných',
+
+       // M
+       'mois_precedent' => 'predchádzajúci mesiac',
+       'mois_suivant' => 'ďalší mesiac',
+
+       // N
+       'nb_repetitions' => '@nb@ opakovaní',
+
+       // P
+       'participation_incertaine_prise_en_compte' => 'Vaša prípadná účasť bola zaznamenaná',
+       'participation_prise_en_compte' => 'Vaša účasť bola zaznamenaná',
+       'probleme_technique' => 'Vyskytol sa technický problém. Skúste neskôr, prosím.',
+
+       // R
+       'repetition' => 'Opakovanie',
+       'repetition_de' => 'Opakovanie',
+       'retour_evenement' => 'Vrátiť sa na udalosť',
+       'rubrique_activer_agenda' => 'Aktivovať Kalendár udalostí pre túto rubriku',
+       'rubrique_dans_une_rubrique_mode_agenda' => 'Táto rubrika vám umožňuje využívať udalosti, keďže sa nachádza v rubrike, pre ktorú bol Kalendár udalostí aktivovaný',
+       'rubrique_desactiver_agenda' => 'Deaktivovať Kalendár udalostí pre túto rubriku',
+       'rubrique_liste_evenements_de' => 'Udalosti rubriky',
+       'rubrique_mode_agenda' => 'Režim Kalendár udalostí  bol aktivovaný pre túto rubriku a jej vetvu',
+       'rubrique_sans_gestion_evenement' => 'Režim Kalendár udalostí  nie je pre túto rubriku aktivovaný',
+       'rubriques' => 'Rubriky s kalendárom udalostí',
+
+       // S
+       'sans_titre' => '(bez nadpisu)',
+
+       // T
+       'telecharger' => 'Stiahnuť (csv)',
+       'telecharger_oui' => 'Iba pozitívne reakcie',
+       'telecharger_toutes' => 'Všetky reakcie',
+       'telecharger_toutes_tous_evenements' => 'Všetky reakcie cez prihlásenie',
+       'texte_agenda' => 'Kalendár udalostí',
+       'texte_evenement_statut' => 'Táto udalosť je:',
+       'texte_logo_objet' => 'Logo udalosti',
+       'titre_cadre_ajouter_evenement' => 'Pridať udalosť',
+       'titre_cadre_modifier_evenement' => 'Upraviť udalosť',
+       'titre_sur_l_agenda' => 'V Kalendári udalostí ',
+       'titre_sur_l_agenda_aussi' => 'A tiež...',
+       'toutes_rubriques' => 'Všetky',
+
+       // U
+       'une_repetition' => '1 opakovanie',
+
+       // V
+       'voir_evenements_rubrique' => 'Zobraziť udalosti rubriky'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/configureragenda_fr.php b/www/plugins/agenda_3_5/lang/configureragenda_fr.php
new file mode 100644 (file)
index 0000000..a2d6724
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/agenda/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+
+       'titre_configuration' => 'Affichage de l\'Agenda',
+       'label_titre' => 'Titre de la page',
+       'label_descriptif' => 'Descriptif',
+       'label_insert_head_css_1' => 'Insérer automatiquement les styles par défaut de l\'agenda',
+       'label_url_evenement' => 'Affichage d\'un événement',
+       'label_url_evenement_article' => 'sur la page de l\'article associé',
+       'label_url_evenement_evenement' => 'sur une page dédiée pour chaque événement',
+       'label_affichage_duree' => 'Lister les événements sur',
+       'label_affichage_debut' => 'Début de la liste',
+       'label_affichage_debut_date_jour' => 'Date du jour',
+       'label_affichage_debut_date_veille' => 'Date de la veille',
+       'label_affichage_debut_debut_semaine' => 'Début de la semaine',
+       'label_affichage_debut_debut_semaine_prec' => 'Début de la semaine précédente',
+       'label_affichage_debut_debut_mois' => 'Début du mois',
+       'label_affichage_debut_debut_mois_prec' => 'Début du mois précédent',
+       'label_affichage_debut_debut_mois_1' => 'Début d\'année',
+       'label_affichage_debut_mois_passe' => '@mois@ précédent',
+
+       'legend_presentation_agenda' => 'Présentation de l\'agenda',
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/migreragenda_fr.php b/www/plugins/agenda_3_5/lang/migreragenda_fr.php
new file mode 100644 (file)
index 0000000..e1d0482
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/agenda/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       'titre_migrer_agenda' => 'Migrer un Agenda d\'articles',
+       'explication_migration_agenda_article_1' => 'Si votre site contient un agenda basé sur des articles,
+vous pouvez utiliser cet outil pour le transformer automatiquement en événements.',
+       'explication_migration_agenda_article_2' => 'Dans la rubrique agenda sélectionnée, un événement sera créé et renseigné pour dater chaque article, selon les réglages ci-dessous.',
+       'explication_migration_agenda_article_fin' => 'Seuls les articles publiés et n\'ayant pas déjà d\'événement seront migrés.
+       Aucune donnée ne sera supprimée sur les articles : si le résultat ne vous convient pas, il suffit de désinstaller le plugin Agenda pour retrouver votre rubrique comme avant la migration.',
+
+       'label_rubrique_source' => 'Rubrique Agenda à migrer',
+       'label_toute_la_branche_oui' => 'Migrer aussi toutes les sous-rubriques',
+       'label_champ_date_debut' => 'Date de début',
+       'label_champ_date_fin' => 'Date de fin',
+       'label_champ_date' => 'Date de publication',
+       'label_champ_date_redac' => 'Date de rédaction antérieure',
+       'label_horaire' => 'Horaire',
+       'label_horaire_oui' => 'Prendre en compte l\'heure',
+       'label_horaire_non' => 'Pas d\'horaire (événements par journées)',
+       'label_groupes_mots' => 'Associer les mots des groupes suivants',
+       'bouton_migrer' => 'Prévisualiser la migration',
+       'bouton_lancer_migration' => 'Lancer la migration',
+
+       'erreur_choix_incorrect' => 'Ce choix n\'est pas permis',
+
+       'info_migration_articles' => "Articles à migrer :",
+       'info_migration_articles_reussi' => "Articles migrés :",
+
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/paquet-agenda.xml b/www/plugins/agenda_3_5/lang/paquet-agenda.xml
new file mode 100644 (file)
index 0000000..cac2b72
--- /dev/null
@@ -0,0 +1,12 @@
+<traduction module="paquet-agenda" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/agenda/trunk/lang/" reference="fr">
+       <langue code="en" url="http://trad.spip.net/tradlang_module/paquet-agenda?lang_cible=en">
+               <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
+       </langue>
+       <langue code="es" url="http://trad.spip.net/tradlang_module/paquet-agenda?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fr" />
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-agenda?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/agenda_3_5/lang/paquet-agenda_en.php b/www/plugins/agenda_3_5/lang/paquet-agenda_en.php
new file mode 100644 (file)
index 0000000..d3e9409
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-agenda?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'agenda_description' => 'Events agenda',
+       'agenda_nom' => 'Agenda',
+       'agenda_slogan' => 'Events agenda'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/paquet-agenda_es.php b/www/plugins/agenda_3_5/lang/paquet-agenda_es.php
new file mode 100644 (file)
index 0000000..340def3
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-agenda?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'agenda_description' => 'Agenda de Eventos',
+       'agenda_nom' => 'Agenda',
+       'agenda_slogan' => 'Agenda de Eventos'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/paquet-agenda_fr.php b/www/plugins/agenda_3_5/lang/paquet-agenda_fr.php
new file mode 100644 (file)
index 0000000..f6fba01
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/agenda/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'agenda_description' => 'Agenda Evénementiel',
+       'agenda_nom' => 'Agenda',
+       'agenda_slogan' => 'Agenda Evénementiel'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/paquet-agenda_sk.php b/www/plugins/agenda_3_5/lang/paquet-agenda_sk.php
new file mode 100644 (file)
index 0000000..20fa3df
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-agenda?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'agenda_description' => 'Kalendár udalostí',
+       'agenda_nom' => 'Diár',
+       'agenda_slogan' => 'Kalendár udalostí'
+);
+
+?>
diff --git a/www/plugins/agenda_3_5/lang/paquet-albums.xml b/www/plugins/agenda_3_5/lang/paquet-albums.xml
new file mode 100644 (file)
index 0000000..f2b1b69
--- /dev/null
@@ -0,0 +1,2 @@
+<traduction module="paquet-albums" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/agenda/trunk/lang/" reference="fr">
+</traduction>
diff --git a/www/plugins/agenda_3_5/modeles/evenement_vevent.html b/www/plugins/agenda_3_5/modeles/evenement_vevent.html
new file mode 100644 (file)
index 0000000..28aa078
--- /dev/null
@@ -0,0 +1 @@
+#INCLURE{fond=inclure/resume/evenement,id_evenement=#ENV{id,#ENV{id_evenement}}}
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/paquet.xml b/www/plugins/agenda_3_5/paquet.xml
new file mode 100644 (file)
index 0000000..9d25950
--- /dev/null
@@ -0,0 +1,49 @@
+<paquet
+       prefix="agenda"
+       categorie="date"
+       version="3.12.1"
+       etat="stable"
+       compatibilite="[3.0.0;3.0.*]"
+       logo="prive/themes/spip/images/evenement-32.png"
+       schema="0.26.0"
+       documentation="http://contrib.spip.net/article2858"
+>      
+
+       <nom>Agenda</nom>
+       <!-- Agenda Evenementiel -->
+
+       <auteur lien="http://www.yterium.net">Cedric MORIN</auteur>
+       <auteur lien="http://contrib.spip.net/b_b">b_b</auteur>
+       <auteur lien="http://romy.tetue.net">romy.tetue.net</auteur>
+       <auteur lien="http://www.cahri.com">Julien Tessier</auteur>
+
+       <copyright>2006-2013</copyright>
+
+       <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</licence>
+
+       <traduire module="agenda" reference="fr" gestionnaire="salvatore" />
+       <traduire module="paquet-agenda" reference="fr" gestionnaire="salvatore" />
+       
+       <pipeline nom="autoriser" inclure="agenda_autoriser.php" />
+       <pipeline nom="declarer_tables_interfaces" inclure="base/agenda_evenements.php" />
+       <pipeline nom="declarer_tables_auxiliaires" inclure="base/agenda_evenements.php" />
+       <pipeline nom="declarer_tables_objets_sql" inclure="base/agenda_evenements.php" />
+
+       <pipeline nom="affiche_milieu" inclure="agenda_pipelines.php" />
+       <pipeline nom="compositions_declarer_heritage"  inclure="agenda_pipelines.php" />
+       <pipeline nom="insert_head_css" inclure="agenda_pipelines.php" />
+       <pipeline nom="optimiser_base_disparus" inclure="agenda_pipelines.php" />
+       <pipeline nom="post_edition" inclure="agenda_pipelines.php" />
+       <pipeline nom="post_edition_lien" inclure="agenda_pipelines.php" />
+       <pipeline nom="quete_calendrier_prive" inclure="agenda_pipelines.php" />
+
+       <utilise nom="Fulltext" compatibilite="[0.2;[" />
+       <utilise nom="mots" compatibilite="[2.0.0;[" />
+       <necessite nom="calendriermini" compatibilite="[2.0.0;[" />
+
+       <menu nom="evenements" titre="agenda:evenements" parent="menu_edition" icone="images/evenement-16.png" />
+       <menu nom="evenement_creer" titre="agenda:creer_evenement" parent="outils_rapides" action="evenement_edit" icone="images/evenement-new-16.png" />
+
+       <chemin path="./" />
+       <chemin path="squelettes" type='public'/>
+</paquet>
diff --git a/www/plugins/agenda_3_5/prive/objets/contenu/article-evenements.html b/www/plugins/agenda_3_5/prive/objets/contenu/article-evenements.html
new file mode 100644 (file)
index 0000000..0839510
--- /dev/null
@@ -0,0 +1,7 @@
+[(#REM) afficher les evenements de cet article]
+<div id="agenda">
+<INCLURE{fond=prive/objets/liste/evenements-post,nb=5,sinon=<:agenda:info_aucun_evenement:>,statut=#LISTE{publie,prop},env}>
+[(#AUTORISER{creerevenementdans, article, #ID_ARTICLE}|oui)
+       [(#URL_ECRIRE{evenement_edit,id_evenement=new}|parametre_url{id_article,#ID_ARTICLE}|parametre_url{redirect,#SELF}|icone_horizontale{<:agenda:creer_evenement:>,evenement-24.png,new,creer_evenement})]
+]
+</div>
diff --git a/www/plugins/agenda_3_5/prive/objets/contenu/evenement.html b/www/plugins/agenda_3_5/prive/objets/contenu/evenement.html
new file mode 100644 (file)
index 0000000..780d67b
--- /dev/null
@@ -0,0 +1,46 @@
+<BOUCLE_afficher_contenu(EVENEMENTS){id_evenement=#ENV{id}}{statut==.*}>
+<div class="champ contenu_titre[ (#TITRE*|strlen|?{'',vide})]">
+<div class='label'><:info_titre:></div>
+<div dir='#LANG_DIR' class='#EDIT{titre} titre'>#TITRE</div>
+</div>
+<div class="champ contenu_dates">
+<div class='label'><:agenda:info_dates:></div>
+<div dir='#LANG_DIR' class='dates'>[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE})]</div>
+</div>
+<B_repetitions>
+<div class="champ contenu_repetitions">
+       <div class='label'>[(#GRAND_TOTAL|singulier_ou_pluriel{agenda:une_repetition,agenda:nb_repetitions})]</div>
+       <div dir='#LANG_DIR' class='repetitions'>(<BOUCLE_repetitions(EVENEMENTS){par date_debut}{id_evenement_source=#ID_EVENEMENT}{', '}{statut==.*}>[(#DATE_DEBUT|affdate_court)]</BOUCLE_repetitions>)</div>
+</div>
+</B_repetitions>
+<div class="champ contenu_descriptif[ (#DESCRIPTIF*|strlen|?{'',vide})]">
+<div class='label'><:info_descriptif:></div>
+<div dir='#LANG_DIR' class='#EDIT{descriptif} descriptif'>[(#DESCRIPTIF|image_reduire{500,0})]</div>
+</div>
+<div class="champ contenu_lieu[ (#LIEU*|strlen|?{'',vide})]">
+<div class='label'><:agenda:info_lieu:></div>
+<div dir='#LANG_DIR' class='#EDIT{lieu} lieu'>[(#LIEU|image_reduire{500,0})]</div>
+</div>
+<div class="champ contenu_adresse[ (#ADRESSE*|strlen|?{'',vide})]">
+<div class='label'><:agenda:evenement_adresse:></div>
+<div dir='#LANG_DIR' class='#EDIT{adresse} adresse'>[(#ADRESSE|image_reduire{500,0})]</div>
+</div>
+<div class="champ contenu_places[ (#INSCRIPTION*|?{'',vide})]">
+<div class='label'><:agenda:info_inscription:></div>
+<BOUCLE_decompte_oui(evenements_participants){id_evenement}{reponse=oui} />#SET{rep_oui,#TOTAL_BOUCLE}<//B_decompte_oui>
+<BOUCLE_decompte_non(evenements_participants){id_evenement}{reponse=non} />#SET{rep_non,#TOTAL_BOUCLE}<//B_decompte_non>
+<BOUCLE_decompte_nsp(evenements_participants){id_evenement}{reponse=?} />#SET{rep_nsp,#TOTAL_BOUCLE}<//B_decompte_nsp>
+[<div dir='#LANG_DIR' class='#EDIT{places} places'>(#PLACES|singulier_ou_pluriel{agenda:info_1_place,agenda:info_nb_places})
+       <span class="reponses">(<:agenda:info_reponses_inscriptions:>
+               [(#GET{rep_oui}) ]<:agenda:info_reponse_inscription_oui:> |
+               [(#GET{rep_non}) ]<:agenda:info_reponse_inscription_non:> |
+               [(#GET{rep_nsp}) ]<:agenda:info_reponse_inscription_nsp:>)
+       </span>
+</div>]
+<div><a href="[(#URL_ECRIRE{agenda_inscriptions}|parametre_url{id_evenement,#ID_EVENEMENT})]"><:agenda:liste_inscrits:></a></div>
+</div>
+[<div class="champ contenu_notes">
+<div class='label'><:info_notes:></div>
+<div dir='#LANG_DIR' class='#EDIT{notes} notes'>(#NOTES)</div>
+</div>
+]</BOUCLE_afficher_contenu>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/prive/objets/infos/evenement.html b/www/plugins/agenda_3_5/prive/objets/infos/evenement.html
new file mode 100644 (file)
index 0000000..2304c66
--- /dev/null
@@ -0,0 +1,33 @@
+<BOUCLE_art(EVENEMENTS){id_evenement=#ENV{id}}{statut?}>
+<div class='infos'>
+#SET{texte_objet,#VAL{evenement}|objet_info{texte_objet}|_T}
+<div class='numero'><:titre_cadre_numero_objet{objet=#GET{texte_objet}}:><p>#ID_EVENEMENT</p></div>
+
+[(#FORMULAIRE_INSTITUER_OBJET{evenement,#ID_EVENEMENT})]
+
+[(#REM)
+
+       Bouton voir en ligne
+
+]
+<BOUCLE_has(ARTICLES){id_article}{statut==.*}>
+       <ul class="liste-items articles">
+               <li class="item"><a href="[(#ID_ARTICLE|generer_url_entite{article})]">#TITRE</a></li>
+       </ul>
+</BOUCLE_has>
+
+<BOUCLE_epublie(EVENEMENTS){id_evenement}>
+       [(#VAL{redirect}
+               |generer_url_action{type=evenement&id=#ID_EVENEMENT}
+               |parametre_url{var_mode,calcul}
+               |icone_horizontale{<:icone_voir_en_ligne:>,racine})]
+</BOUCLE_epublie>
+       [(#AUTORISER{previsualiser,evenement,#ID_EVENEMENT,'',#ARRAY{statut,#STATUT}})
+               [(#VAL{redirect}
+                       |generer_url_action{type=evenement&id=#ID_ARTICLE}
+                       |parametre_url{var_mode,preview}
+                       |icone_horizontale{<:previsualiser:>,preview})]
+       ]
+<//B_epublie>
+</div>
+</BOUCLE_art>
diff --git a/www/plugins/agenda_3_5/prive/objets/liste/evenement_participants.html b/www/plugins/agenda_3_5/prive/objets/liste/evenement_participants.html
new file mode 100755 (executable)
index 0000000..390fc41
--- /dev/null
@@ -0,0 +1,39 @@
+<B_inscrits>
+#ANCRE_PAGINATION
+<div class="liste-objets auteurs">
+<table class='spip liste'>
+[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{agenda:info_un_inscrit,agenda:info_nb_inscrits,nb}})</strong></caption>]
+       <thead>
+               <tr class='first_row'>
+                       <th class='statut' scope='col'>[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</th>
+                       <th class='nom' scope='col'>[(#TRI{nom,<span title="<:lien_trier_nom|attribut_html:>"><:nom:></span>,ajax})]</th>
+                       <th class='mail' scope='col'>[(#TRI{email,<:email:>,ajax})]</th>
+                       <th class='date' scope='col'>[(#TRI{date,<:agenda:evenement_date_inscription:>,ajax})]</th>
+                       <th class='reponse' scope='col'>[(#TRI{reponse,<:agenda:info_reponse_inscriptions:>,ajax})]</th>[
+                       (#AUTORISER{modifier,evenement,#ID_EVENEMENT})<th class='reponse' scope='col'>Action</th>]
+               </tr>
+       </thead>
+       <tbody>
+       <BOUCLE_inscrits(AUTEURS evenements_participants){id_evenement}{tri #ENV{par,date},#GET{defaut_tri}}{pagination #ENV{nb,15}}>
+               <tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
+                       <td class='statut'>[(#STATUT|puce_statut{auteur,#ID_AUTEUR})]</td>
+                       <td class='nom'><a href="[(#ID_AUTEUR|generer_url_entite{auteur})]"[ title="(#BIO*|couper{200}|attribut_html)"]>[(#RANG). ][(#NOM|sinon{<:texte_vide:>})]</a></td>
+                       <td class='mail'>#EMAIL</td>
+                       <td class='date'>[(#DATE|affdate_jourcourt|unique{liste_evt})]</td>
+                       <td class='reponse'>#REPONSE</td>[
+                       (#AUTORISER{modifier,evenement,#ID_EVENEMENT})<td class='delete'>
+                               <button class="button link delete" name="supprimer_lien&#91;evenement-#ID_EVENEMENT-auteur-#ID_AUTEUR&#93;" value="X" onclick="return (confirm('<:agenda:confirm_suppression_inscription:>'));"><:agenda:lien_desinscrire:> [(#CHEMIN_IMAGE{supprimer-12.png}|balise_img{'X'})]</button>
+                       </td>]
+               </tr>
+       </BOUCLE_inscrits>
+       </tbody>
+</table>
+[<p class='pagination'>(#PAGINATION{prive})</p>]
+</div>
+[(#AUTORISER{modifier,evenement,#ID_EVENEMENT})<p><button class="button link delete" name="supprimer_lien&#91;evenement-#ID_EVENEMENT-auteur-*&#93;" value="X" onclick="return (confirm('<:agenda:confirm_suppression_inscription_toutes:>'));"><:agenda:lien_desinscrire_tous:> [(#CHEMIN_IMAGE{supprimer-12.png}|balise_img{'X'})]</button></p>]
+
+</B_inscrits>
+<h2><:agenda:aucun_inscrit:></h2>
+<//B_inscrits>
+
+
diff --git a/www/plugins/agenda_3_5/prive/objets/liste/evenements-post.html b/www/plugins/agenda_3_5/prive/objets/liste/evenements-post.html
new file mode 100644 (file)
index 0000000..0197a75
--- /dev/null
@@ -0,0 +1,11 @@
+[(#REM) Se placer au debut du mois en cours par defaut]
+#SET{date_debut,#ENV{date_debut,#ENV{date}}|affdate{Y-m-d 00:00:00}|agenda_dateplus{-1}}
+<BOUCLE_un(EVENEMENTS){statut==.*}{id_evenement}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}>
+[(#REM) Si un evenement passe, on commence par le jour de cet evenement]
+       #SET{id_evenement,#ID_EVENEMENT}
+</BOUCLE_un>
+       <BOUCLE_debut(EVENEMENTS){evenement_a_venir #GET{date_debut}}{statut==.*}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}{par date_debut}{0,1}>
+               #SET{id_evenement,#ID_EVENEMENT}
+       </BOUCLE_debut>
+<//B_un>
+[(#INCLURE{fond=prive/objets/liste/evenements,debut_liste_evt=#ENV{debut_liste_evt,@#GET{id_evenement}},id_evenement=#EVAL{null},env})]
diff --git a/www/plugins/agenda_3_5/prive/objets/liste/evenements.html b/www/plugins/agenda_3_5/prive/objets/liste/evenements.html
new file mode 100644 (file)
index 0000000..42dc489
--- /dev/null
@@ -0,0 +1,49 @@
+[(#SET{defaut_tri,#ARRAY{
+       date_debut,#ENV{date_sens,1},
+       titre,1,
+       id_evenement,1,
+       points,-1
+}})
+]<B_liste_evt>
+#ANCRE_PAGINATION
+<div class="liste-objets evenements">
+<table class='spip liste'>
+[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{agenda:info_un_evenement,agenda:info_nombre_evenements}})</strong></caption>]
+       <thead>
+               <tr class='first_row'>
+                       <th class='statut' scope='col'>[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</th>
+                       <th class='date' scope='col'>[(#TRI{date_debut,<:date:>,ajax})]</th>
+                       <th class='article secondaire' scope='col'></th>
+                       <th class='titre principale' scope='col'>[(#TRI{titre,<:info_titre:>,ajax})]</th>
+                       <th class='lieu' scope='col secondaire'><:agenda:evenement_lieu:></th>
+                       <th class='id' scope='col'>[(#TRI{id_evenement,<:info_numero_abbreviation:>,ajax})]</th>
+               </tr>
+       </thead>
+       <tbody>
+       <BOUCLE_liste_evt(EVENEMENTS){id_evenement?}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}{where?}{statut?}{recherche?}{tri #ENV{par,date_debut},#GET{defaut_tri}}{pagination #ENV{nb,15}}>
+               <tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})][ (#EXPOSE)][(#ID_EVENEMENT_SOURCE|oui)repetition]">
+                       <td class='statut'>[(#STATUT|puce_statut{evenement,#ID_EVENEMENT})]</td>
+                       <td class='date'>[(#DATE_DEBUT|affdate_jourcourt|unique{liste_evt})]</td>
+                       <td class='article secondaire'>[<a (#ID_ARTICLE|oui) href="[(#ID_ARTICLE|generer_url_entite{article})]" title="[(#INFO_TITRE{article,#ID_ARTICLE}|attribut_html)]">[(#CHEMIN_IMAGE{article-16.png}|balise_img{#INFO_TITRE{article,#ID_ARTICLE}})]</a>]</td>
+                       <td class='titre principale'><a href="[(#ID_EVENEMENT_SOURCE|?{#ID_EVENEMENT_SOURCE,#ID_EVENEMENT}|generer_url_entite{evenement})]"
+                                                                                                                                                                                                                                                                                                               title="<:info_numero_abbreviation|attribut_html:> #ID_EVENEMENT">[(#RANG). ]#TITRE</a>
+                               <p class="date">[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE})]</p>
+                       </td>
+                       <td class='lieu secondaire'>#LIEU</td>
+                       #SET{id_evenement,#ID_EVENEMENT_SOURCE|?{#ID_EVENEMENT_SOURCE,#ID_EVENEMENT}}
+                       <td class='id'>[(#ID_EVENEMENT_SOURCE|oui)
+                               [(#CHEMIN_IMAGE{repetition-16.png}|balise_img{<:agenda:repetition:>,''}|inserer_attribut{title,<:agenda:repetition:>})]
+                               ][(#AUTORISER{modifier,evenement,#GET{id_evenement}}|?{[
+                               <a href="[(#URL_ECRIRE{evenement_edit}|parametre_url{id_evenement,#GET{id_evenement}}|parametre_url{redirect,#SELF})]">(#GET{id_evenement})</a>],
+                               [(#GET{id_evenement})]
+                       })]
+                       </td>
+               </tr>
+       </BOUCLE_liste_evt>
+       </tbody>
+</table>
+[<p class='pagination'>(#PAGINATION{prive})</p>]
+</div>
+</B_liste_evt>[
+<div class="liste-objets evenements caption-wrap"><strong class="caption">(#ENV*{sinon,''})</strong></div>
+]<//B_liste_evt>
diff --git a/www/plugins/agenda_3_5/prive/squelettes/contenu/agenda_inscriptions.html b/www/plugins/agenda_3_5/prive/squelettes/contenu/agenda_inscriptions.html
new file mode 100755 (executable)
index 0000000..8fde0b8
--- /dev/null
@@ -0,0 +1,16 @@
+#BOITE_OUVRIR
+<BOUCLE_evt(EVENEMENTS){id_evenement}>
+<h1 class="grostitre"><:agenda:liste_inscrits:></h1>
+<h2 class="#EDIT{titre}">#TITRE</h2>
+<div dir='#LANG_DIR' class='dates'>[(#DATE_DEBUT|affdate_debut_fin{#DATE_FIN,#HORAIRE})]</div>
+[<div class='descriptif secondaire #EDIT{descriptif}'><:agenda:evenement_descriptif:> : (#DESCRIPTIF|PtoBR)</div>]
+[<div class='lieu secondaire #EDIT{lieu}'><:agenda:evenement_lieu:> : (#LIEU)</div>]
+<div class="ajax">
+       #FORMULAIRE_EVENEMENT_PARTICIPANTS{#ENV{id_evenement},#ENV{tri_inscrits}}
+</div>
+
+</BOUCLE_evt>
+</B_evt>
+<h2><:agenda:aucun_evenement:></h2>
+<//B_evt>
+#BOITE_FERMER
diff --git a/www/plugins/agenda_3_5/prive/squelettes/contenu/configurer_agenda.html b/www/plugins/agenda_3_5/prive/squelettes/contenu/configurer_agenda.html
new file mode 100644 (file)
index 0000000..d47dd30
--- /dev/null
@@ -0,0 +1,9 @@
+[(#AUTORISER{configurer_agenda}|sinon_interdire_acces)]
+<h1 class="grostitre"><:agenda:agenda:></h1>
+[(#BOITE_OUVRIR{[(#VAL{agenda:explication_synchro_flux_ical_titre}|_T)],'info'})]
+<:agenda:explication_synchro_flux_ical:>
+#BOITE_FERMER
+<div class="ajax">#FORMULAIRE_CONFIGURER_AGENDA</div>
+<div class="ajax">#FORMULAIRE_CONFIGURER_CALENDRIERMINI</div>
+<h2><:agenda:rubriques:></h2>
+<div class="ajax">#FORMULAIRE_MIGRER_AGENDA</div>
diff --git a/www/plugins/agenda_3_5/prive/squelettes/contenu/evenement_edit.html b/www/plugins/agenda_3_5/prive/squelettes/contenu/evenement_edit.html
new file mode 100644 (file)
index 0000000..48e97a3
--- /dev/null
@@ -0,0 +1,32 @@
+[(#ID_EVENEMENT|intval|oui)
+       [(#AUTORISER{modifier,evenement,#ID_EVENEMENT}|sinon_interdire_acces)]]
+[(#ID_EVENEMENT|intval|non)
+       [(#AUTORISER{creer,evenement,0,'',#ARRAY{id_article,#ENV{id_article}}}|sinon_interdire_acces)]]
+
+#SET{retour,#ENV{redirect}|sinon{#ENV{id_article}|?{#URL_ECRIRE{article,id_article=#ID_ARTICLE},#ID_EVENEMENT|?{#ID_EVENEMENT|generer_url_entite{evenement},#URL_ECRIRE{evenements}}}}}
+<div class='cadre-formulaire-editer'>
+<div class="entete-formulaire">
+       [(#GET{retour}|icone_verticale{<:icone_retour:>,evenement,'',left retour[(#ENV{retourajax,''}|oui)ajax preload]})]
+       [[(#ID_EVENEMENT|?{<:agenda:titre_cadre_modifier_evenement:>,<:agenda:titre_cadre_ajouter_evenement:>})]
+       <h1>(#ENV{titre,#INFO_TITRE{evenement,#ID_EVENEMENT}|sinon{<:agenda:info_nouvel_evenement:>}})</h1>]
+</div>
+
+#SET{redirect,#ENV{redirect,#ID_EVENEMENT|generer_url_entite{evenement}}}
+[(#ENV{retourajax,''}|oui)
+       #SET{redirect,'javascript:if (window.jQuery) jQuery(".entete-formulaire .retour a").followLink();'}
+       <div class="ajax">
+       <script type="text/javascript">/*<!\[CDATA\[*/var date_picker_loading = false;/*\]\]>*/</script>
+]
+       #FORMULAIRE_EDITER_EVENEMENT{#ENV{id_evenement,oui},#ENV{id_article},#GET{redirect},#ENV{associer_objet}}
+[(#ENV{retourajax,''}|oui)
+       </div>
+       <script type="text/javascript">/*<!\[CDATA\[*/reloadExecPage('#ENV{exec}', '#navigation,#chemin');/*\]\]>*/</script>
+]
+[(#ENV{id_evenement,''}|intval|oui)
+<div class="ajax">
+       #FORMULAIRE_EDITER_LIENS{mots,evenement,#ENV{id_evenement}}
+</div>
+]
+
+</div>
+
diff --git a/www/plugins/agenda_3_5/prive/squelettes/contenu/evenements.html b/www/plugins/agenda_3_5/prive/squelettes/contenu/evenements.html
new file mode 100644 (file)
index 0000000..9584d51
--- /dev/null
@@ -0,0 +1,16 @@
+[(#AUTORISER{menu,_evenements}|sinon_interdire_acces)]
+<h1 class="grostitre"><:agenda:agenda:></h1>
+<BOUCLE_expose(RUBRIQUES){id_rubrique}{statut==.*}>
+#BOITE_OUVRIR{'','note'}
+       <a class='annule_filtre' href="[(#SELF|parametre_url{id_rubrique,''})]" title="<:info_tout_afficher|attribut_html:>">[(#CHEMIN_IMAGE{fermer-16.png}|balise_img|inserer_attribut{alt,<:info_tout_afficher:>})]</a>
+       <:agenda:rubrique_liste_evenements_de:>
+       <h2 class='objet_titre'><a href='[(#ID_RUBRIQUE|generer_url_entite{rubrique})]'>#TITRE</a></h2>
+#BOITE_FERMER
+</BOUCLE_expose>
+
+<div id="liste_des_evenements">
+       [(#INCLURE{fond=prive/objets/liste/evenements-post}{env})]
+</div>
+[(#AUTORISER{creer,evenement}|oui)
+[(#URL_ECRIRE{evenement_edit,id_evenement=new}|parametre_url{id_article,#ID_ARTICLE}|icone_verticale{<:agenda:creer_evenement:>,evenement-24.png,new,right})]
+]
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/prive/squelettes/extra/agenda_inscriptions.html b/www/plugins/agenda_3_5/prive/squelettes/extra/agenda_inscriptions.html
new file mode 100644 (file)
index 0000000..d3fff83
--- /dev/null
@@ -0,0 +1,23 @@
+[(#BOITE_OUVRIR{[(#CHEMIN_IMAGE{calendrier-24.png}|balise_img{'',cadre-icone})],'info'})]
+<h3><:agenda:info_inscription:></h3>
+<BOUCLE_decompte_oui(evenements_participants){id_evenement}{reponse=oui} />#SET{rep_oui,#TOTAL_BOUCLE}<//B_decompte_oui>
+<BOUCLE_decompte_non(evenements_participants){id_evenement}{reponse=non} />#SET{rep_non,#TOTAL_BOUCLE}<//B_decompte_non>
+<BOUCLE_decompte_nsp(evenements_participants){id_evenement}{reponse=?} />#SET{rep_nsp,#TOTAL_BOUCLE}<//B_decompte_nsp>
+<BOUCLE_evt(EVENEMENTS){id_evenement}>
+[<div class="label"><span dir="#LANG_DIR" class="#EDIT{places} places">(#PLACES|singulier_ou_pluriel{agenda:info_1_place,agenda:info_nb_places})</span></div>]
+</BOUCLE_evt>
+<div class="label"><:agenda:info_reponses_inscriptions:></div>
+<ul class="liste-items">
+    <li class="item">[(#GET{rep_oui}) ]<:agenda:info_reponse_inscription_oui:></li>
+    <li class="item">[(#GET{rep_non}) ]<:agenda:info_reponse_inscription_non:></li>
+    <li class="item">[(#GET{rep_nsp}) ]<:agenda:info_reponse_inscription_nsp:></li>
+</ul>
+#SET{args,#ARRAY{id_evenement,#ID_EVENEMENT}}
+<h3><:agenda:telecharger:></h3>
+<ul class="liste-items">
+    <li class="item"><a href="[(#URL_PAGE{transmettre,[(#VAL{evenement_participants}|param_low_sec{#GET{args}, '', 'transmettre'})]}|parametre_url{reponse,oui})]" class="noajax"><:agenda:telecharger_oui:></a></li>
+    <li class="item"><a href="[(#URL_PAGE{transmettre,[(#VAL{evenement_participants}|param_low_sec{#GET{args}, '', 'transmettre'})]})]" class="noajax"><:agenda:telecharger_toutes:></a></li>
+#SET{args,#ARRAY{}}
+    <li class="item"><a href="[(#URL_PAGE{transmettre,[(#VAL{evenements_participants}|param_low_sec{#GET{args}, '', 'transmettre'})]})]" class="noajax"><:agenda:telecharger_toutes_tous_evenements:></a></li>
+</ul>
+#BOITE_FERMER
diff --git a/www/plugins/agenda_3_5/prive/squelettes/inclure/agenda-navigation-mois.html b/www/plugins/agenda_3_5/prive/squelettes/inclure/agenda-navigation-mois.html
new file mode 100644 (file)
index 0000000..1a986b0
--- /dev/null
@@ -0,0 +1,12 @@
+#SET{self,#ENV{self}|parametre_url{debut_mois,#EVAL{_request('debut_mois')}}}
+<B_mois>
+[(#REM) navigation par mois]
+<ul class="liste-items mois">
+<BOUCLE_mois(EVENEMENTS){!par date_debut}{pagination 12}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}{fusion_par_mois date_debut}{statut==.*}>
+<li class="item[(#ENV{date_debut,''}|=={#DATE_DEBUT|affdate{Y-m-01}}|oui)on]"><a
+       href="[(#GET{self}|parametre_url{date_debut,#DATE_DEBUT|affdate{Y-m-01}})]"
+       onclick='return update_agenda(this);'>[(#DATE_DEBUT|affdate_mois_annee{})]</a></li>
+</BOUCLE_mois>
+</ul>
+[<p class='pagination'>(#PAGINATION{prive})</p>]
+</B_mois>
diff --git a/www/plugins/agenda_3_5/prive/squelettes/inclure/agenda-rubriques.html b/www/plugins/agenda_3_5/prive/squelettes/inclure/agenda-rubriques.html
new file mode 100644 (file)
index 0000000..0371454
--- /dev/null
@@ -0,0 +1,13 @@
+#SET{self,#SELF|parametre_url{debut_rubriques,#EVAL{_request('debut_rubriques')}}}
+<B_rubriques>
+[(#BOITE_OUVRIR{[<:agenda:rubriques:>(#CHEMIN_IMAGE{rubrique-24.png}|balise_img{'',cadre-icone})],simple})]
+[(#REM) navigation par rubriques agenda]
+[<p class='pagination'>(#PAGINATION{page})</p>]
+<ul class='liste_items'>
+<li class='item[ (#ENV{id_rubrique}|non)on]'>[(#GET{self}|parametre_url{id_rubrique,''}|lien_ou_expose{<:agenda:toutes_rubriques:>,#ENV{id_rubrique,0}|=={0}})]</li>
+<BOUCLE_rubriques(RUBRIQUES){par titre}{pagination 10}{agenda=1}>
+<li class='item[ (#EXPOSE)]'>[(#GET{self}|parametre_url{id_rubrique,#ID_RUBRIQUE}|lien_ou_expose{#TITRE|supprimer_numero{},#ENV{id_rubrique}|=={#ID_RUBRIQUE}})] (<a href='#URL_RUBRIQUE'><:info_numero_abbreviation:>#ID_RUBRIQUE</a>)</li>
+</BOUCLE_rubriques>
+</ul>
+#BOITE_FERMER
+</B_rubriques>
diff --git a/www/plugins/agenda_3_5/prive/squelettes/navigation/agenda_inscriptions.html b/www/plugins/agenda_3_5/prive/squelettes/navigation/agenda_inscriptions.html
new file mode 100755 (executable)
index 0000000..ac724bc
--- /dev/null
@@ -0,0 +1,5 @@
+<BOUCLE_evt(EVENEMENTS){id_evenement}>
+[(#BOITE_OUVRIR{[(#CHEMIN_IMAGE{calendrier-24.png}|balise_img{'',cadre-icone})]})]
+    <h3><a href="[(#URL_ECRIRE{evenement}|parametre_url{id_evenement,#ID_EVENEMENT})]" class="noajax"><:agenda:retour_evenement:></a></h3>
+#BOITE_FERMER
+</BOUCLE_evt>
diff --git a/www/plugins/agenda_3_5/prive/squelettes/navigation/evenement.html b/www/plugins/agenda_3_5/prive/squelettes/navigation/evenement.html
new file mode 100644 (file)
index 0000000..0c3d615
--- /dev/null
@@ -0,0 +1,14 @@
+<BOUCLE_nav(EVENEMENTS){id_evenement}{statut==.*}{si #ENV{exec}|=={evenement}}>
+#BOITE_OUVRIR{'','info'}
+#PIPELINE{boite_infos,#ARRAY{data,'',args,#ARRAY{'type','evenement','id',#ENV{id_evenement}}}}
+#BOITE_FERMER
+
+<div class="ajax">
+#FORMULAIRE_EDITER_LOGO{evenement,#ID_EVENEMENT,'',#ENV**}
+</div>
+
+#PIPELINE{afficher_config_objet,#ARRAY{args,#ARRAY{type,evenement,id,#ID_EVENEMENT},data,''}}
+
+</BOUCLE_nav>
+[(#ENV{exec}|=={evenement_edit}|oui)<INCLURE{fond=prive/squelettes/navigation/evenement_edit,env} />]
+<//B_nav>
diff --git a/www/plugins/agenda_3_5/prive/squelettes/navigation/evenements.html b/www/plugins/agenda_3_5/prive/squelettes/navigation/evenements.html
new file mode 100644 (file)
index 0000000..a2c1eb3
--- /dev/null
@@ -0,0 +1,25 @@
+[(#BOITE_OUVRIR{[(#CHEMIN_IMAGE{calendrier-24.png}|balise_img{'',cadre-icone})],'simple'})]
+#SET{self,#SELF|parametre_url{id_evenement|date_debut|debut_liste_evt,''}|parametre_url{debut_mois,#EVAL{_request('debut_mois')}}}
+<ul class='liste-items agenda-nav'>
+<BOUCLE_debut(EVENEMENTS){par date_debut}{0,1}{id_article?}{id_rubrique?}{id_evenement_source?}{statut==.*}>
+<li class="item[(#ENV{date_debut,''}|=={#DATE_DEBUT|affdate{Y-01-01}}|oui)on]"><a
+       href="[(#GET{self}|parametre_url{date_debut,#DATE_DEBUT|affdate{Y-01-01}})]"
+       onclick='return update_agenda(this);'><:agenda:evenements_depuis_debut:></a></li>
+</BOUCLE_debut>
+<li class="item[(#ENV{date_debut,''}|non)on]"><a
+       href="[(#GET{self})]"
+       onclick='return update_agenda(this);'><:agenda:evenements_a_venir:></a></li>
+</ul>
+[(#INCLURE{fond=prive/squelettes/inclure/agenda-navigation-mois}{ajax}{env}{self=#GET{self}})]
+#BOITE_FERMER
+[(#INCLURE{fond=prive/squelettes/inclure/agenda-rubriques}{ajax}{env}{self=#GET{self}})]
+<script type="text/javascript">
+function update_agenda(link){
+       var date_debut = parametre_url(jQuery(link).attr('href'),'date_debut');
+       $("#liste_des_evenements").ajaxReload({args:{date_debut:date_debut,debut_liste_evt:""},history:true});
+       jQuery(link).closest('.box').find('li.on').removeClass('on');
+       jQuery(link).closest('li').addClass('on');
+       return false;
+}
+
+</script>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/prive/style_prive_plugin_agenda.html b/www/plugins/agenda_3_5/prive/style_prive_plugin_agenda.html
new file mode 100644 (file)
index 0000000..7d0c867
--- /dev/null
@@ -0,0 +1,102 @@
+[(#REM)
+
+       Ce squelette definit les styles de l'espace prive
+
+       Note: l'entete "Vary:" sert a repousser l'entete par
+       defaut "Vary: Cookie,Accept-Encoding", qui est (un peu)
+       genant en cas de "rotation du cookie de session" apres
+       un changement d'IP (effet de clignotement).
+
+       ATTENTION: il faut absolument le charset sinon Firefox croit que
+       c'est du text/html !
+       <style>
+]
+#CACHE{3600*100,cache-client}
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
+#HTTP_HEADER{Vary: Accept-Encoding}
+
+/*.pagination a.creer {float:#ENV{left};}*/
+/* vevent */
+/*
+li.item div.vevent h3 {margin:0;font-size:1.1em;}
+li.item div.vevent p {margin:2px 0 0;}
+li.item div.vevent p.date {font-size: 0.98em; }
+ul.evenements li.item.court p,ul.evenements li.item.court .actions { display: none; }
+li.item div.vevent p.category {font-size:0.9em;color:#999;}
+*/
+/* liste des evenements */
+/*
+.plier_deplier { float: #ENV{left}; font-size: 0.9em; }
+.liste-items.evenements li.item { padding-left: 130px; }
+.liste-items.evenements li.court { border-width: 1px; }
+.liste-items.evenements li.item .jour { width: 120px; margin-left: -130px; float: #ENV{left}; display: inline; position: relative; overflow: hidden; white-space: nowrap; font-size: 98%; }
+
+li.item .repetitions {margin-top:0.5em;font-size:0.9em;}
+li.court .repetitions {display: none;}
+li.item .repetitions ul,
+li.item .repetitions li {display:inline;margin:0;padding:0;}
+*/
+
+.liste-items.evenements .actions {text-align:right;font-size:0.9em;margin:5px 0 0;}
+.liste-objets.evenements p.date {margin-bottom: 0;}
+.liste-objets.evenements .on td,.liste-objets.evenements .on th {background-color: [#(#ENV{claire}|couleur_eclaircir{0.75})]}
+.liste-objets.evenements tr.repetition {filter:alpha(opacity=70); -moz-opacity:0.7; opacity: 0.7;}
+.liste-objets.evenements .repetition .id a {display: block;}
+/* sur la fiche rubriques */
+.rubrique .agenda-statut img.statut {float:#ENV{right};margin-#ENV{left}:5px;}
+
+/* sur la fiche article */
+.fiche_objet #agenda {position: relative;}
+.fiche_objet #agenda .creer_evenement {position: absolute;top:-1px;right: 5px;}
+
+/* sur la fiche evenement */
+.evenement .fiche_objet .formulaire_dater {display: none;}
+.evenement #wysiwyg .contenu_lieu .label {display: inline;font-weight: bold;}
+.evenement #wysiwyg .contenu_lieu .lieu {display: inline;}
+.evenement #wysiwyg .contenu_adresse .label {display: block;}
+.evenement .fiche_objet .contenu_dates {padding-#ENV{left}:20px;background:url(#CHEMIN_IMAGE{calendrier-16.png}) no-repeat center #ENV{left};}
+.evenement #wysiwyg .contenu_places {margin-top: 1em;}
+.evenement #wysiwyg .contenu_places .label {display: inline;font-weight: bold;}
+.evenement #wysiwyg .contenu_places .places {display: inline;}
+.evenement .fiche_objet .contenu_repetitions {padding-#ENV{left}:20px;}
+.evenement #wysiwyg .contenu_repetitions .label {display: inline;color:inherit;}
+.evenement .fiche_objet .contenu_repetitions .repetitions {display: inline;color:#999;}
+
+/* edition d'un evenement */
+.formulaire_editer_evenement .editer_parent {}
+.formulaire_editer_evenement .editer_parent label {margin-#ENV{left}:0;display:block;float:left;padding:2px 0;width:130px;}
+
+.formulaire_editer_evenement .editer_horaire {padding-top:0;margin-top:0;}
+.formulaire_editer_evenement .editer_horaire label {margin:0;display:inline;width:auto;float:none;}
+.formulaire_editer_evenement li.editer_date,
+.formulaire_editer_evenement li.editer_date li {clear:left;}
+.formulaire_editer_evenement li.editer_date_debut_fin label { /*vertical-align: top;*/ }
+
+.formulaire_editer_evenement input.date {width:6.5em !important;padding-right:20px;-moz-box-sizing: content-box;-webkit-box-sizing: content-box;-ms-box-sizing: content-box;box-sizing: content-box;}
+.formulaire_editer_evenement span.afficher_horaire label {float:none;display:inline;padding:0;margin:0;}
+.formulaire_editer_evenement input.heure {width:4.5em !important;}
+
+.formulaire_editer_evenement li.editer_date label.heure {display:none;}
+.formulaire_editer_evenement li.editer_date label {display:inline;float:none;margin:0;}
+
+.formulaire_editer_evenement .editer_inscription .choix {display:inline;}
+.formulaire_editer_evenement .editer_inscription .choix input.text {width:50px;margin-left:1em;/*vertical-align:top;*/}
+
+/* le picker */
+
+/* begin: jQuery UI Datepicker moving pixels fix */
+       table.ui-datepicker-calendar {border-collapse: separate;}
+       .ui-datepicker-calendar td {border: 1px solid transparent;}
+/* end: jQuery UI Datepicker moving pixels fix */
+/* begin: jQuery UI Datepicker emphasis on selected dates */
+.ui-datepicker .ui-datepicker-calendar .ui-state-highlight a {
+       background: #ENV{foncee}; /* a color that fits the widget theme */
+       color: white; /* a color that is readeable with the color above */
+}
+/* end: jQuery UI Datepicker emphasis on selected dates */
+
+#repetitions_picker {}
+.editer_repetitions textarea {width:100%;height:4em;color:#999;border:1px solid #999;}
+
+/* Calendrier */
+ul.menu li .pagination a, ul.menu li .pagination strong.on { display:inline; }
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-16.png
new file mode 100644 (file)
index 0000000..bd06328
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-24.png
new file mode 100644 (file)
index 0000000..ba15877
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-32.png
new file mode 100644 (file)
index 0000000..52fcf84
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-16.png
new file mode 100644 (file)
index 0000000..6745d21
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-24.png
new file mode 100644 (file)
index 0000000..07fcbe6
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-32.png
new file mode 100644 (file)
index 0000000..4b7935d
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-add-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-16.png
new file mode 100644 (file)
index 0000000..4dc9d1c
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-24.png
new file mode 100644 (file)
index 0000000..04665d2
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-32.png
new file mode 100644 (file)
index 0000000..7ee0806
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-del-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-16.png
new file mode 100644 (file)
index 0000000..d8b20f8
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-24.png
new file mode 100644 (file)
index 0000000..0c942c9
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-32.png
new file mode 100644 (file)
index 0000000..d155573
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-edit-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-16.png
new file mode 100644 (file)
index 0000000..90e7d9c
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-24.png
new file mode 100644 (file)
index 0000000..1f76e78
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-32.png
new file mode 100644 (file)
index 0000000..80e4048
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-new-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-non-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-non-32.png
new file mode 100644 (file)
index 0000000..8d8aa42
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-non-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-ok-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-ok-32.png
new file mode 100644 (file)
index 0000000..187f521
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/agenda-ok-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-16.png
new file mode 100644 (file)
index 0000000..03f8f88
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-24.png
new file mode 100644 (file)
index 0000000..557ccda
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-32.png
new file mode 100644 (file)
index 0000000..8c314ac
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-16.png
new file mode 100644 (file)
index 0000000..6fac578
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-24.png
new file mode 100644 (file)
index 0000000..fdbb71e
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-32.png
new file mode 100644 (file)
index 0000000..058f547
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-add-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-16.png
new file mode 100644 (file)
index 0000000..b938925
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-24.png
new file mode 100644 (file)
index 0000000..433e740
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-32.png
new file mode 100644 (file)
index 0000000..60b8c70
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-del-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-16.png
new file mode 100644 (file)
index 0000000..59b1461
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-24.png
new file mode 100644 (file)
index 0000000..1a6343b
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-32.png
new file mode 100644 (file)
index 0000000..ba6c3b3
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-edit-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-16.png
new file mode 100644 (file)
index 0000000..5cfa59e
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-24.png
new file mode 100644 (file)
index 0000000..877deff
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-32.png
new file mode 100644 (file)
index 0000000..8535fd3
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/evenement-new-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-16.png b/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-16.png
new file mode 100644 (file)
index 0000000..61e580f
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-16.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-24.png b/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-24.png
new file mode 100644 (file)
index 0000000..3a931ae
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-24.png differ
diff --git a/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-32.png b/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-32.png
new file mode 100644 (file)
index 0000000..b2359c9
Binary files /dev/null and b/www/plugins/agenda_3_5/prive/themes/spip/images/repetition-32.png differ
diff --git a/www/plugins/agenda_3_5/prive/transmettre/evenement_participants.html b/www/plugins/agenda_3_5/prive/transmettre/evenement_participants.html
new file mode 100755 (executable)
index 0000000..ebcbda2
--- /dev/null
@@ -0,0 +1,15 @@
+<BOUCLE0(AUTEURS){tout}{id_auteur=#ENV{id}}{lang_select}><?php
+if ([(#ID_AUTEUR|securiser_acces{#ENV{cle},transmettre,#ENV{op}, #ENV{args}}|?{1,0})]) {
+?><B_participants_oui>"<:nom:>","<:email:>","<:agenda:evenement_date_inscription:>"
+<BOUCLE_participants_oui(AUTEURS evenements_participants){id_evenement}{si #ENV{reponse}}{reponse=#ENV{reponse}}>"[(#NOM|sinon{<:texte_vide:>})]","#EMAIL","[(#DATE|affdate{'d/m/Y H:i:s'})]"
+</BOUCLE_participants_oui>
+</B_participants_oui>
+<B_participants>"<:nom:>","<:email:>","<:agenda:evenement_date_inscription:>","<:agenda:reponse:>"
+<BOUCLE_participants(AUTEURS evenements_participants){id_evenement}>"[(#NOM|sinon{<:texte_vide:>})]","#EMAIL","[(#DATE|affdate{'d/m/Y H:i:s'})]","#REPONSE"
+</BOUCLE_participants>
+<//B_participants_oui>
+<?php
+} else {
+include_spip('inc/minipres'); 
+echo minipres();
+}?></BOUCLE0>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/prive/transmettre/evenements_participants.html b/www/plugins/agenda_3_5/prive/transmettre/evenements_participants.html
new file mode 100755 (executable)
index 0000000..fbf5522
--- /dev/null
@@ -0,0 +1,10 @@
+<BOUCLE0(AUTEURS){tout}{id_auteur=#ENV{id}}{lang_select}><?php
+if ([(#ID_AUTEUR|securiser_acces{#ENV{cle},transmettre,#ENV{op}, #ENV{args}}|?{1,0})]) {
+?>"<:numero:>","<:agenda:evenement:>","<:nom:>","<:email:>","<:agenda:evenement_date_inscription:>","<:agenda:reponse:>"
+<BOUCLE_evt(EVENEMENTS){par id_evenement}><BOUCLE_participants(AUTEURS evenements_participants){id_evenement}>"#ID_EVENEMENT","#INFO_TITRE{evenement,#ID_EVENEMENT}","[(#NOM|sinon{<:texte_vide:>})]","#EMAIL","[(#DATE|affdate{'d/m/Y H:i:s'})]","#REPONSE"
+</BOUCLE_participants></BOUCLE_evt>
+<?php
+} else {
+include_spip('inc/minipres');
+echo minipres();
+}?></BOUCLE0>
diff --git a/www/plugins/agenda_3_5/public/agenda.php b/www/plugins/agenda_3_5/public/agenda.php
new file mode 100644 (file)
index 0000000..d138999
--- /dev/null
@@ -0,0 +1,397 @@
+<?php\r
+/**\r
+ * Plugin Agenda 4 pour Spip 3.0\r
+ * Licence GPL 3\r
+ *\r
+ * 2006-2011\r
+ * Auteurs : cf paquet.xml\r
+ */\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+/**\r
+ * #URL_EVENEMENT envoie sur la page de l'evenement\r
+ * ou sur la page de l'article avec un &id_evenement=xxx\r
+ * selon la configuration de l'agenda\r
+ *\r
+ * @param object $p\r
+ * @return object\r
+ */\r
+function balise_URL_EVENEMENT_dist($p) {\r
+\r
+       include_spip("inc/config");\r
+       include_spip("balise/url_");\r
+\r
+       if (lire_config("agenda/url_evenement",'evenement')!=='article'){\r
+               $code = generer_generer_url('evenement', $p);\r
+       }\r
+       else {\r
+               $_ide = interprete_argument_balise(1,$p);\r
+               if (!$_ide)\r
+                       $_ide = champ_sql('id_evenement', $p);\r
+               $_ida = "generer_info_entite($_ide,'evenement','id_article')";\r
+\r
+               $code = generer_generer_url_arg('article', $p, $_ida);\r
+               $code = "parametre_url($code,'id_evenement',$_ide,'&')";\r
+       }\r
+\r
+       $code = champ_sql('url_evenement', $p, $code);\r
+       $p->code = $code;\r
+       if (!$p->etoile)\r
+               $p->code = "vider_url($code)";\r
+       $p->interdire_scripts = false;\r
+\r
+       return $p;\r
+}\r
+\r
+\r
+/**\r
+ * fonction sous jacente pour les 3 criteres\r
+ * fusion_par_jour, fusion_par_mois, fusion_par_annee\r
+ * \r
+ * @param string $format\r
+ * @param strinf $as\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function agenda_critere_fusion_par_xx($format, $as, $idb, &$boucles, $crit){\r
+       $boucle = &$boucles[$idb];\r
+       $type = $boucle->type_requete;\r
+       $_date = isset($crit->param[0]) ? calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent)\r
+         : "'".(isset($GLOBALS['table_date'][$type])?$GLOBALS['table_date'][$type]:"date")."'";\r
+\r
+       $date = $boucle->id_table. '.' .substr($_date,1,-1);\r
+\r
+       // annuler une eventuelle fusion sur cle primaire !\r
+       foreach($boucles[$idb]->group as $k=>$g)\r
+               if ($g==$boucle->id_table.'.'.$boucle->primary)\r
+                       unset($boucles[$idb]->group[$k]);\r
+       $boucles[$idb]->group[]  = 'DATE_FORMAT('.$boucle->id_table.'.".'.$_date.'.", ' . "'$format')";\r
+       $boucles[$idb]->select[] = 'DATE_FORMAT('.$boucle->id_table.'.".'.$_date.'.", ' . "'$format') AS $as";\r
+}\r
+\r
+/**\r
+ * {fusion_par_jour date_debut}\r
+ * {fusion_par_jour date_fin}\r
+ * \r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_fusion_par_jour_dist($idb, &$boucles, $crit) {\r
+       agenda_critere_fusion_par_xx('%Y-%m-%d','jour',$idb, $boucles, $crit);\r
+}\r
+\r
+/**\r
+ * {fusion_par_mois date_debut}\r
+ * {fusion_par_mois date_fin}\r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_fusion_par_mois_dist($idb, &$boucles, $crit) {\r
+       agenda_critere_fusion_par_xx('%Y-%m','mois',$idb, $boucles, $crit);\r
+}\r
+\r
+/**\r
+ * {fusion_par_annee date_debut}\r
+ * {fusion_par_annee date_fin}\r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_fusion_par_annee_dist($idb, &$boucles, $crit) {\r
+       agenda_critere_fusion_par_xx('%Y','annee',$idb, $boucles, $crit);\r
+}\r
+\r
+/**\r
+ * {evenement_a_venir}\r
+ * {evenement_a_venir #ENV{date}}\r
+ * \r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_evenement_a_venir_dist($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $id_table = $boucle->id_table;\r
+       \r
+       $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);\r
+       $_date = "$id_table.date_debut";\r
+       $op = $crit->not ? "<=":">";\r
+       \r
+       // si on ne sait pas si les heures comptent, on utilise toute la journee.\r
+       // sinon, on s'appuie sur le champ 'horaire=oui'\r
+       // pour savoir si les dates utilisent les heures ou pas.        \r
+       $where_futur_sans_heure =\r
+               array("'$op'", "'$_date'", "sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))");\r
+               \r
+       if (array_key_exists('horaire', $boucle->show['field'])) {\r
+               $where =\r
+                       array("'OR'",\r
+                               array("'AND'",\r
+                                       array("'='", "'horaire'", "sql_quote('oui')"),\r
+                                       array("'$op'","'$_date'","sql_quote($_dateref)")\r
+                               ),              \r
+                               array("'AND'",\r
+                                       array("'!='", "'horaire'", "sql_quote('oui')"),\r
+                                       $where_futur_sans_heure\r
+                               )\r
+                       );\r
+       } else {\r
+               $where = $where_futur_sans_heure;\r
+       }\r
+       \r
+       \r
+       $boucle->where[] = $where;\r
+}\r
+\r
+/**\r
+ * {evenement_passe}\r
+ * {evenement_passe #ENV{date}}\r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_evenement_passe_dist($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $id_table = $boucle->id_table;\r
+\r
+       $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);\r
+       $_date = "$id_table.date_fin";\r
+       $op = $crit->not ? ">=":"<";\r
+       \r
+       // si on ne sait pas si les heures comptent, on utilise toute la journee.\r
+       // sinon, on s'appuie sur le champ 'horaire=oui'\r
+       // pour savoir si les dates utilisent les heures ou pas.        \r
+       $where_passe_sans_heure =\r
+               array("'$op'", "'$_date'", "sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref)))");\r
+               \r
+       if (array_key_exists('horaire', $boucle->show['field'])) {\r
+               $where =\r
+                       array("'OR'",\r
+                               array("'AND'",\r
+                                       array("'='", "'horaire'", "sql_quote('oui')"),\r
+                                       array("'$op'","'$_date'","sql_quote($_dateref)")\r
+                               ),              \r
+                               array("'AND'",\r
+                                       array("'!='", "'horaire'", "sql_quote('oui')"),\r
+                                       $where_passe_sans_heure\r
+                               )\r
+                       );\r
+       } else {\r
+               $where = $where_passe_sans_heure;\r
+       }\r
+       \r
+       \r
+       $boucle->where[] = $where;\r
+}\r
+\r
+/**\r
+ * {evenement_en_cours}\r
+ * {evenement_en_cours #ENV{date}}\r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_evenement_en_cours_dist($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $id_table = $boucle->id_table;\r
+\r
+       $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);\r
+       $_date_debut = "$id_table.date_debut";\r
+       $_date_fin = "$id_table.date_fin";\r
+\r
+       // si on ne sait pas si les heures comptent, on utilise toute la journee.\r
+       // sinon, on s'appuie sur le champ 'horaire=oui'\r
+       // pour savoir si les dates utilisent les heures ou pas.        \r
+       $where_jour_sans_heure =\r
+               array("'AND'",\r
+                       array("'<='", "'$_date_debut'", "sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))"),\r
+                       array("'>='", "'$_date_fin'", "sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref)))")\r
+               );\r
+               \r
+       if (array_key_exists('horaire', $boucle->show['field'])) {\r
+               $where =\r
+                       array("'OR'",\r
+                               array("'AND'",\r
+                                       array("'='", "'horaire'", "sql_quote('oui')"),\r
+                                       array("'AND'",\r
+                                               array("'<='", "'$_date_debut'", "sql_quote($_dateref)"),\r
+                                               array("'>='", "'$_date_fin'", "sql_quote($_dateref)")\r
+                                       )\r
+                               ),              \r
+                               array("'AND'",\r
+                                       array("'!='", "'horaire'", "sql_quote('oui')"),\r
+                                       $where_jour_sans_heure\r
+                               )\r
+                       );\r
+       } else {\r
+               $where = $where_jour_sans_heure;\r
+       }\r
+\r
+       if ($crit->not)\r
+               $where = array("'NOT'",$where);\r
+       $boucle->where[] = $where;\r
+}\r
+\r
+/**\r
+ * {evenementrelatif #ENV{choix}}\r
+ * {evenementrelatif #ENV{choix}, #ENV{date}}\r
+ * #ENV{choix} peut prendre 6 valeurs : tout, a_venir, en_cours, passe, en_cours_a_venir ou passe_en_cours\r
+ * \r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_evenementrelatif_dist($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $id_table = $boucle->id_table;\r
+       if (isset($crit->param[1]))\r
+               $_dateref = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);\r
+       else\r
+               $_dateref = "date('Y-m-d H:i:00')";\r
+       $not = $crit->not ? 'oui' : '';\r
+       $choix = isset($crit->param[0]) ? calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) : "''";\r
+       $horaire = array_key_exists('horaire', $boucle->show['field']) ? 'oui' : '';\r
+       \r
+       $boucle->where[] = "agenda_calculer_critere_evenementrelatif('$id_table',$_dateref,'$not',$choix,'$horaire')";\r
+}\r
+\r
+/**\r
+ * Fonction interne utilisee par le critere {evenementrelatif}\r
+ * @param string $id_table\r
+ * @param string $_dateref\r
+ * @param string $not\r
+ * @param string $choix\r
+ * @param string $horaire\r
+ * @return array\r
+ */\r
+function agenda_calculer_critere_evenementrelatif($id_table,$_dateref,$not,$choix,$horaire){\r
+       $_date_debut = "$id_table.date_debut";\r
+       $_date_fin = "$id_table.date_fin";\r
+       if ($choix == 'en_cours_a_venir') {\r
+               $choix = 'passe';\r
+               $not = ($not) ? '' : 'oui';\r
+       }\r
+       if ($choix == 'passe_en_cours') {\r
+               $choix = 'a_venir';\r
+               $not = ($not) ? '' : 'oui';\r
+       }\r
+       \r
+       switch($choix) {\r
+               case 'a_venir':\r
+                       $op_a_venir = $not ? "<=":">";\r
+                       $where_a_venir_sans_heure =\r
+                               array($op_a_venir, $_date_debut, sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref))));\r
+                       if ($horaire) {\r
+                               $where =\r
+                               array('OR',\r
+                                       array('AND',\r
+                                               array('=', 'horaire', sql_quote('oui')),\r
+                                               array($op_a_venir,$_date_debut,sql_quote($_dateref))\r
+                                       ),              \r
+                                       array('AND',\r
+                                               array('!=', 'horaire', sql_quote('oui')),\r
+                                               $where_a_venir_sans_heure\r
+                                       )\r
+                               );\r
+                       } else {\r
+                               $where = $where_a_venir_sans_heure;\r
+                       }\r
+                       return $where;\r
+                       break;\r
+\r
+               case 'passe':\r
+                       $op_passe = $not ? ">=":"<";\r
+                       $where_passe_sans_heure =\r
+                               array($op_passe, $_date_fin, sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref))));\r
+                       if ($horaire) {\r
+                               $where =\r
+                                       array('OR',\r
+                                               array('AND',\r
+                                                       array('=', 'horaire', sql_quote('oui')),\r
+                                                       array($op_passe,$_date_fin,sql_quote($_dateref))\r
+                                               ),              \r
+                                               array('AND',\r
+                                                       array('!=', 'horaire', sql_quote('oui')),\r
+                                                       $where_passe_sans_heure\r
+                                               )\r
+                                       );\r
+                       } else {\r
+                               $where = $where_passe_sans_heure;\r
+                       }\r
+                       return $where;\r
+                       break;\r
+\r
+               case 'en_cours':\r
+                       $where_en_cours_sans_heure =\r
+                               array('AND',\r
+                                       array('<=', $_date_debut, sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))),\r
+                                       array('>=', $_date_fin, sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref))))\r
+                               );\r
+                                               if ($horaire) {\r
+                               $where =\r
+                                       array('OR',\r
+                                               array('AND',\r
+                                                       array('=', 'horaire', sql_quote('oui')),\r
+                                                       array('AND',\r
+                                                               array('<=', $_date_debut, sql_quote($_dateref)),\r
+                                                               array('>=', $_date_fin, sql_quote($_dateref))\r
+                                                       )\r
+                                               ),              \r
+                                               array('AND',\r
+                                                       array('!=', 'horaire', sql_quote('oui')),\r
+                                                       $where_en_cours_sans_heure\r
+                                               )\r
+                                       );\r
+                       } else {\r
+                               $where = $where_en_cours_sans_heure;\r
+                       }\r
+                       return ($not) ? array('NOT' , $where) : $where;\r
+                       break;\r
+\r
+               default:\r
+                       return array();\r
+                       break;\r
+       }\r
+}\r
+\r
+/**\r
+ * Fonction privee pour mutualiser de code des criteres_evenement_*\r
+ * Retourne le code php pour obtenir la date de reference de comparaison\r
+ * des evenements a trouver \r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ * \r
+ * @return string code PHP concernant la date.\r
+**/\r
+function agenda_calculer_date_reference($idb, &$boucles, $crit) {\r
+       if (isset($crit->param[0]))\r
+               return calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);\r
+       else\r
+               return "date('Y-m-d H:i:00')";\r
+}\r
+\r
+\r
+/**\r
+ * Balise #NB_INSCRITS\r
+ * pour afficher le nombre d'inscrits (qui ont repondu oui) a un evenement\r
+ *\r
+ * @param Object $p\r
+ * @return object\r
+ */\r
+function balise_NB_INSCRITS_dist($p) {\r
+        $id_evenement = champ_sql('id_evenement', $p);\r
+        $p->code = "sql_countsel('spip_evenements_participants','id_evenement='.intval($id_evenement).' AND reponse=\'oui\'')";\r
+        return $p;\r
+}\r
+\r
+?>\r
diff --git a/www/plugins/agenda_3_5/squelettes/agenda-ical.html b/www/plugins/agenda_3_5/squelettes/agenda-ical.html
new file mode 100644 (file)
index 0000000..8d06452
--- /dev/null
@@ -0,0 +1,12 @@
+#HTTP_HEADER{Content-type:text/calendar; charset=utf-8}#CACHE{3600}BEGIN:VCALENDAR
+VERSION:2.0
+X-WR-TIMEZONE:Europe/Paris
+CALSCALE:GREGORIAN
+PRODID:-//SPIP/Plugin #PLUGIN{AGENDA,nom}//NONSGML v1.0//FR
+X-WR-CALNAME;VALUE=TEXT:[(#NOM_SITE_SPIP|filtrer_ical)] -- Agenda[
+X-WR-CALDESC:(#DESCRIPTIF_SITE_SPIP|supprimer_tags|filtrer_ical)]
+X-WR-RELCALID:[(#URL_SITE_SPIP|filtrer_ical)]
+<BOUCLE_evenement2(EVENEMENTS) {branche ?}{id_article ?} {statut=publie}{par date_fin} {age_fin<=0} {0,50} {doublons}>[(#INCLURE{fond=inc/un-evenement-ical}{evtitre=#TITRE}{id_evenement}{date_debut}{horaire}{date_fin}{id_article}{descriptif}{lieu}{date_creation}{maj})]
+</BOUCLE_evenement2><BOUCLE_evenement3(EVENEMENTS) {branche ?}{id_article ?} {statut=publie}{par date_fin} {age_fin>=0} {inverse} {0,50} {doublons}>[(#INCLURE{fond=inc/un-evenement-ical}{evtitre=#TITRE}{id_evenement}{date_debut}{horaire}{date_fin}{id_article}{descriptif}{lieu}{date_creation}{maj})]
+</BOUCLE_evenement3><BOUCLE_evenement(EVENEMENTS) {branche ?}{id_article ?} {statut=publie}{par date_fin} {inverse} {0,50} {doublons}>[(#INCLURE{fond=inc/un-evenement-ical}{evtitre=#TITRE}{id_evenement}{date_debut}{horaire}{date_fin}{id_article}{descriptif}{lieu}{date_creation}{maj})]
+</BOUCLE_evenement>END:VCALENDAR
diff --git a/www/plugins/agenda_3_5/squelettes/agenda-rss.html b/www/plugins/agenda_3_5/squelettes/agenda-rss.html
new file mode 100644 (file)
index 0000000..3741a95
--- /dev/null
@@ -0,0 +1,30 @@
+[(#HTTP_HEADER{Content-type: text/xml[; charset=(#CHARSET)]})]<?xml 
+version="1.0"[ encoding="(#CHARSET)"]?>
+<rss version="2.0" [(#REM) rss 2.0.9)]
+       xmlns:dc="http://purl.org/dc/elements/1.1/"
+       xmlns:content="http://purl.org/rss/1.0/modules/content/"
+>
+
+<channel[ xml:lang="(#LANG)"]>
+       [<title>Agenda (#NOM_SITE_SPIP|texte_backend)</title>]
+       <link>#URL_SITE_SPIP/</link>
+       [<description>(#DESCRIPTIF_SITE_SPIP|supprimer_tags|texte_backend)</description>]
+       <language>#LANG</language>
+       <generator>SPIP - www.spip.net</generator>
+       
+[      <image>
+               <title>[(#NOM_SITE_SPIP|texte_backend)]</title>
+               <url>(#LOGO_SITE_SPIP||image_reduire{150,150}|extraire_attribut{src}|url_absolue|texte_backend)</url>
+               <link>#URL_SITE_SPIP/</link>
+               [<height>(#LOGO_SITE_SPIP||image_reduire{150,150}|extraire_attribut{height})</height>]
+               [<width>(#LOGO_SITE_SPIP||image_reduire{150,150}|extraire_attribut{width})</width>]
+       </image>
+]
+       
+       <BOUCLE_evenement(EVENEMENTS) {branche ?}{id_article ?}{!evenement_passe}{par date_debut} {0,60}>
+               <INCLURE{fond=inc-rss-item-evenement,id_evenement} />
+       </BOUCLE_evenement>
+
+</channel>
+
+</rss>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/agenda-zpip.html b/www/plugins/agenda_3_5/squelettes/agenda-zpip.html
new file mode 100644 (file)
index 0000000..428f283
--- /dev/null
@@ -0,0 +1 @@
+<INCLURE{fond=structure}{env}{type=page}{composition=agenda} />
diff --git a/www/plugins/agenda_3_5/squelettes/aside/agenda.html b/www/plugins/agenda_3_5/squelettes/aside/agenda.html
new file mode 100644 (file)
index 0000000..99c2ac9
--- /dev/null
@@ -0,0 +1,16 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<B_mois>
+#ANCRE_PAGINATION
+<ul class="liste-items">
+<BOUCLE_mois(EVENEMENTS){!par date_debut}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}{fusion_par_mois date_debut}{pagination 10}>
+<li class="item">[(#SELF|parametre_url{date_debut,#DATE_DEBUT|affdate{Y-m-01}}|lien_ou_expose{#DATE_DEBUT|affdate_mois_annee{},#ENV{date_debut,''}|=={#DATE_DEBUT|affdate{Y-m-01}}})]</li>
+</BOUCLE_mois>
+</ul>
+[<div class="pagination">(#PAGINATION)</div>]
+</B_mois>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/breadcrumb/agenda.html b/www/plugins/agenda_3_5/squelettes/breadcrumb/agenda.html
new file mode 100644 (file)
index 0000000..58b70bc
--- /dev/null
@@ -0,0 +1,4 @@
+<ul class="breadcrumb">
+       <li><a href="#URL_SITE_SPIP/"><:accueil_site:></a><span class="divider"> &gt; </span></li>
+       <li class="active">[(#CONFIG{agenda/titre}|sinon{<:agenda:titre_sur_l_agenda:>}|typo)]</li>
+</ul>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/calendrier_mini_event.json.html b/www/plugins/agenda_3_5/squelettes/calendrier_mini_event.json.html
new file mode 100644 (file)
index 0000000..a89efa8
--- /dev/null
@@ -0,0 +1,18 @@
+#HTTP_HEADER{Content-type:text/javascript;}
+[<BOUCLE_ev(EVENEMENTS)
+       {!evenement_passe #ENV{start}|todate}{!evenement_a_venir #ENV{end}|todate}{par date_debut}
+       {id_article?}
+       {id_rubrique?}
+       {id_mot?}
+       {id_evenement_source?}
+       {', '}>
+[(#ARRAY{
+id,#ID_EVENEMENT,
+title,[(#TITRE|html2unicode|unicode2charset|textebrut)],
+allDay,[(#HORAIRE|=={oui}|non)],
+start,#DATE_DEBUT,
+end,#DATE_FIN,
+url,#URL_EVENEMENT*,
+className,calendrier-couleur6,
+description,[(#DESCRIPTIF|html2unicode|unicode2charset)]
+}|json_encode)]</BOUCLE_ev>]
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/calendrier_mini_event.json_fonctions.php b/www/plugins/agenda_3_5/squelettes/calendrier_mini_event.json_fonctions.php
new file mode 100644 (file)
index 0000000..134d3e8
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Fichier de fonction du json du calendrier mini
+ *
+ * @package SPIP\Agenda\Fonctions
+**/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('calendrier_mini.json_fonctions');
+
+?>
diff --git a/www/plugins/agenda_3_5/squelettes/content/agenda.html b/www/plugins/agenda_3_5/squelettes/content/agenda.html
new file mode 100644 (file)
index 0000000..263c0c5
--- /dev/null
@@ -0,0 +1,21 @@
+[(#REM)
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+]
+<section>
+
+       <header class="cartouche">
+               <h1 class="#EDIT{meta-agenda/titre}">[(#CONFIG{agenda/titre}|sinon{<:agenda:titre_sur_l_agenda:>}|typo)]</h1>
+       </header>
+
+       [<div class="chapo #EDIT{meta-agenda/descriptif}">(#CONFIG{agenda/descriptif}|propre)</div>]
+
+       <div class="main">
+               <INCLURE{fond=inclure/agenda-liste,env,ajax} />
+       </div>
+</section>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/content/article-evenement.html b/www/plugins/agenda_3_5/squelettes/content/article-evenement.html
new file mode 100644 (file)
index 0000000..83d20fb
--- /dev/null
@@ -0,0 +1,13 @@
+[(#REM)
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+]
+<BOUCLE_ev(EVENEMENTS){id_evenement}>
+<div class="evenement one well">#INCLURE{fond=inclure/resume/evenement,id_evenement}</div>
+<INCLURE{fond=content/article,id_article,id_evenement,env} />
+</BOUCLE_ev>
diff --git a/www/plugins/agenda_3_5/squelettes/content/evenement.html b/www/plugins/agenda_3_5/squelettes/content/evenement.html
new file mode 100644 (file)
index 0000000..ed77ee5
--- /dev/null
@@ -0,0 +1,13 @@
+[(#REM)
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+]
+[(#CONFIG{agenda/url_evenement,evenement}|=={article}|non|sinon_interdire_acces{#URL_EVENEMENT*,301})]
+<BOUCLE_ev(EVENEMENTS){id_evenement}>
+<INCLURE{fond=content/article-evenement,id_article,id_evenement,env} />
+</BOUCLE_ev>
diff --git a/www/plugins/agenda_3_5/squelettes/content/jour.html b/www/plugins/agenda_3_5/squelettes/content/jour.html
new file mode 100644 (file)
index 0000000..e66a611
--- /dev/null
@@ -0,0 +1,35 @@
+[(#REM)
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+]
+#SET{date_debut,#ENV{date_debut,#ENV{date}}|affdate{Y-m-d 00:00:00}}
+#SET{date_fin,#ENV{date_debut,#ENV{date}}|affdate{Y-m-d 23:59:59}}
+
+<section>
+
+       <header class="cartouche">
+               <h1><:agenda:titre_sur_l_agenda:>
+               <small>[(#GET{date_debut}|affdate)]</small>
+               </h1>
+       </header>
+
+       <div class="main">
+               <B_ev>
+                       <div class="liste long evenements">
+                               <ul class="liste-items evenements">
+                               <BOUCLE_ev(EVENEMENTS){!evenement_passe #GET{date_debut}}{!evenement_a_venir #GET{date_fin}}{par date_debut}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}>
+                                       [(#TOTAL_BOUCLE|>{1}|sinon_interdire_acces{#URL_EVENEMENT})]
+                                       <li class="item">#INCLURE{fond=inclure/resume/evenement,id_evenement}</li>
+                               </BOUCLE_ev>
+                               </ul>
+                       </div>
+               </B_ev>
+               <p><:agenda:info_aucun_evenement:></p>
+               <//B_ev>
+       </div>
+</section>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/content/rubrique-agenda.html b/www/plugins/agenda_3_5/squelettes/content/rubrique-agenda.html
new file mode 100644 (file)
index 0000000..1860294
--- /dev/null
@@ -0,0 +1,24 @@
+[(#REM)
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+]
+<BOUCLE_rub(RUBRIQUES){id_rubrique}>
+<section>
+
+       <header class="cartouche">
+               <h1 class="#EDIT{titre}">[(#LOGO_RUBRIQUE|image_reduire)]#TITRE</h1>
+       </header>
+
+       <div class="main">
+               [<div class="#EDIT{texte} chapo">(#TEXTE)</div>]
+
+               <INCLURE{fond=inclure/agenda-liste,id_rubrique,env,ajax} />
+       </div>
+
+</section>
+</BOUCLE_rub>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/contenu/page-agenda.html b/www/plugins/agenda_3_5/squelettes/contenu/page-agenda.html
new file mode 100644 (file)
index 0000000..0ca3d75
--- /dev/null
@@ -0,0 +1,17 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<B_ev>
+       [<h1>(#TOTAL_BOUCLE|singulier_ou_pluriel{agenda:info_un_evenement,agenda:info_nombre_evenements})</h1>]
+       <ul class="liste-items evenements">
+       <BOUCLE_ev(EVENEMENTS){!evenement_passe #ENV{date_debut,#ENV{date}}}{!evenement_a_venir #ENV{date_debut,#ENV{date}}|agenda_moisdecal{1,'Y-m-d H:i:00'}}{par date_debut}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}>
+               <li class="item">#INCLURE{fond=inclure/resume/evenement,id_evenement}</li>
+       </BOUCLE_ev>
+       </ul>
+</B_ev>
+<h1><:agenda:info_aucun_evenement:></h1>
+<//B_ev>
diff --git a/www/plugins/agenda_3_5/squelettes/contenu/page-jour.html b/www/plugins/agenda_3_5/squelettes/contenu/page-jour.html
new file mode 100644 (file)
index 0000000..6372cc4
--- /dev/null
@@ -0,0 +1,18 @@
+[(#REM)
+
+  Squelette pour affichage de la liste des evenements d'une journee
+  (c) 2012 xxx
+  Distribue sous licence GPL
+
+]#SET{date_debut,#ENV{date_debut,#ENV{date}}|affdate{Y-m-d 00:00:00}}
+#SET{date_fin,#ENV{date_debut,#ENV{date}}|affdate{Y-m-d 23:59:59}}
+<B_ev>
+       [<h1>[(#GET{date_debut}|affdate): ](#TOTAL_BOUCLE|singulier_ou_pluriel{agenda:info_un_evenement,agenda:info_nombre_evenements})</h1>]
+       <ul class="liste-items evenements">
+<BOUCLE_ev(EVENEMENTS){!evenement_passe #GET{date_debut}}{!evenement_a_venir #GET{date_fin}}{par date_debut}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}>
+               <li class="item">#INCLURE{fond=inclure/resume/evenement,id_evenement}</li>
+       </BOUCLE_ev>
+       </ul>
+</B_ev>
+<h1>[(#ENV{date}|affdate): ]<:agenda:info_aucun_evenement:></h1>
+<//B_ev>
diff --git a/www/plugins/agenda_3_5/squelettes/extra/agenda.html b/www/plugins/agenda_3_5/squelettes/extra/agenda.html
new file mode 100644 (file)
index 0000000..a0b1474
--- /dev/null
@@ -0,0 +1,16 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+#SET{id_article,#ENV{id_article,''}}
+<BOUCLE_ev(EVENEMENTS){id_evenement}>
+#CALENDRIER_MINI{#DATE_DEBUT,date_debut,#URL_PAGE{jour},#URL_PAGE{calendrier_mini_event.json,id_article=#ID_ARTICLE}}
+#SET{id_article,#ID_ARTICLE}
+</BOUCLE_ev>
+#CALENDRIER_MINI{#DATE_DEBUT,date_debut,#URL_PAGE{jour},#URL_PAGE{calendrier_mini_event.json}|parametre_url{id_article,#GET{id_article}}|parametre_url{id_rubrique,#GET{id_rubrique}}}
+<//B_ev>
+
+<INCLURE{fond=inclure/agenda-evenements-meme-article,id_article=#GET{id_article},env,ajax} />
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/extra/evenement.html b/www/plugins/agenda_3_5/squelettes/extra/evenement.html
new file mode 100644 (file)
index 0000000..a704a01
--- /dev/null
@@ -0,0 +1,8 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<INCLURE{fond=extra1/agenda,env} />
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/extra/jour.html b/www/plugins/agenda_3_5/squelettes/extra/jour.html
new file mode 100644 (file)
index 0000000..a704a01
--- /dev/null
@@ -0,0 +1,8 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<INCLURE{fond=extra1/agenda,env} />
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/extra/rubrique-agenda.html b/www/plugins/agenda_3_5/squelettes/extra/rubrique-agenda.html
new file mode 100644 (file)
index 0000000..a704a01
--- /dev/null
@@ -0,0 +1,8 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<INCLURE{fond=extra1/agenda,env} />
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/extra1/agenda.html b/www/plugins/agenda_3_5/squelettes/extra1/agenda.html
new file mode 100644 (file)
index 0000000..a0b1474
--- /dev/null
@@ -0,0 +1,16 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+#SET{id_article,#ENV{id_article,''}}
+<BOUCLE_ev(EVENEMENTS){id_evenement}>
+#CALENDRIER_MINI{#DATE_DEBUT,date_debut,#URL_PAGE{jour},#URL_PAGE{calendrier_mini_event.json,id_article=#ID_ARTICLE}}
+#SET{id_article,#ID_ARTICLE}
+</BOUCLE_ev>
+#CALENDRIER_MINI{#DATE_DEBUT,date_debut,#URL_PAGE{jour},#URL_PAGE{calendrier_mini_event.json}|parametre_url{id_article,#GET{id_article}}|parametre_url{id_rubrique,#GET{id_rubrique}}}
+<//B_ev>
+
+<INCLURE{fond=inclure/agenda-evenements-meme-article,id_article=#GET{id_article},env,ajax} />
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/extra1/evenement.html b/www/plugins/agenda_3_5/squelettes/extra1/evenement.html
new file mode 100644 (file)
index 0000000..a704a01
--- /dev/null
@@ -0,0 +1,8 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<INCLURE{fond=extra1/agenda,env} />
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/extra1/jour.html b/www/plugins/agenda_3_5/squelettes/extra1/jour.html
new file mode 100644 (file)
index 0000000..a704a01
--- /dev/null
@@ -0,0 +1,8 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<INCLURE{fond=extra1/agenda,env} />
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/extra1/rubrique-agenda.html b/www/plugins/agenda_3_5/squelettes/extra1/rubrique-agenda.html
new file mode 100644 (file)
index 0000000..a704a01
--- /dev/null
@@ -0,0 +1,8 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<INCLURE{fond=extra1/agenda,env} />
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/ical-agenda.html b/www/plugins/agenda_3_5/squelettes/ical-agenda.html
new file mode 100644 (file)
index 0000000..8fea8d1
--- /dev/null
@@ -0,0 +1 @@
+#INCLURE{fond=agenda-ical}
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/inc-rss-item-evenement.html b/www/plugins/agenda_3_5/squelettes/inc-rss-item-evenement.html
new file mode 100644 (file)
index 0000000..f4bc59d
--- /dev/null
@@ -0,0 +1,29 @@
+<BOUCLE_evenement(EVENEMENTS) {id_evenement}>
+<item>
+       [<title>(#TITRE|texte_backend)</title>]
+       <link>[(#URL_EVENEMENT|url_absolue)]</link>
+       [<guid isPermaLink="true">(#URL_EVENEMENT|url_absolue)</guid>]
+       <date>#DATE_DEBUT</date>
+       [<dc:date>(#DATE_DEBUT|date_iso)</dc:date>]
+       <dc:format>text/html</dc:format>
+       [<dc:language>(#LANG)</dc:language>]
+
+       #SET{intro,''}<BOUCLE_art(ARTICLES){id_article}>#SET{intro,#INTRODUCTION{#ENV{coupe,300}}</BOUCLE_art>
+       [(#REM) Le bloc qui suit diffuse l'evenement a la mode RSS ]
+       <description>
+               [(#DATE_DEBUT|agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE}|texte_backend)][ - (#LIEU|PtoBR|texte_backend)]
+               [(#DESCRIPTIF|sinon{#GET{intro}}|texte_backend)]
+       </description>
+
+       [(#REM) Le bloc qui suit diffuse aussi le texte integral de l'evenement,
+       ce qui permet une syndication plus riche (mais plus "lourde").
+       Fonction desactivable depuis les reglages du site.]
+       [(#CONFIG{syndication_integrale}|=={oui}|?{' ',''})<content:encoded>
+       [(#LOGO_ARTICLE{right}|image_reduire{150,150}|texte_backend)]
+       &lt;div class='rss_texte'&gt;
+               [(#DATE_DEBUT|agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE}|texte_backend)][ - (#LIEU|PtoBR|texte_backend)]
+               [(#DESCRIPTIF|sinon{#GET{intro}}|texte_backend)]
+       &lt;/div&gt;
+       </content:encoded>]
+</item>
+</BOUCLE_evenement>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/inclure/agenda-evenements-meme-article.html b/www/plugins/agenda_3_5/squelettes/inclure/agenda-evenements-meme-article.html
new file mode 100644 (file)
index 0000000..b8df95e
--- /dev/null
@@ -0,0 +1,12 @@
+<B_et_aussi>
+<div class="liste">
+<h2><:agenda:titre_sur_l_agenda_aussi:></h2>
+#ANCRE_PAGINATION
+<ul class="liste-items evenements short">
+<BOUCLE_et_aussi(EVENEMENTS){par date_debut}{!evenement_passe #ENV{date_debut,#ENV{date}}}{id_article=#ENV{id_article}}{id_evenement!=#ENV{id_evenement,0}}{pagination 10}>
+<li class="item evenement">#INCLURE{fond=inclure/resume/evenement,id_evenement}</li>
+</BOUCLE_et_aussi>
+</ul>
+[<p class="pagination">(#PAGINATION)</p>]
+</div>
+</B_et_aussi>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/inclure/agenda-liste.html b/www/plugins/agenda_3_5/squelettes/inclure/agenda-liste.html
new file mode 100644 (file)
index 0000000..00273a6
--- /dev/null
@@ -0,0 +1,49 @@
+[(#REM)
+/**
+ * Plugin Agenda 4 pour Spip 3.0
+ * Licence GPL 3
+ *
+ * 2006-2011
+ * Auteurs : cf paquet.xml
+ */
+]
+#SET{affichage_duree,#ENV{affichage_duree,#CONFIG{agenda/affichage_duree,12}}}
+#SET{affichage_debut,#CONFIG{agenda/affichage_debut,#ENV{affichage_debut,date_jour}}}
+#SET{date_debut,#ENV{date_debut,#ENV{date}}|agenda_date_debut_liste{#GET{affichage_debut}}}
+#SET{date_prev,#GET{date_debut}|agenda_moisdecal{#GET{affichage_duree}|mult{-1},'Y-m-d H:i:00'}}
+#SET{date_fin,#GET{date_debut}|agenda_moisdecal{#GET{affichage_duree},'Y-m-d H:i:00'}}
+
+[(#REM) Ne pas afficher l'annee de depart, elle est dans le h2)]
+[(#GET{date_debut}|annee|unique{annee}|non)]
+<div id="agenda-liste" class="liste long evenements">
+<h2>[(#GET{date_debut}|affdate_periode{#GET{affichage_duree},#GET{affichage_debut}})]</h2>
+<B_ev>
+       <ul class="liste-items evenements">
+       <BOUCLE_ev(EVENEMENTS){!evenement_passe #GET{date_debut}}{!evenement_a_venir #GET{date_fin}}{par date_debut}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}>
+               [<li class="item item-header month[(#DATE_DEBUT|agenda_date_passee)fini]">(#GET{affichage_duree}|>{1}?{[(#DATE_DEBUT|nom_mois|unique{mois})[ (#DATE_DEBUT|annee|unique{annee})]]})</li>]
+               <li class="item[(#DATE_FIN|agenda_date_passee)fini]">
+                       #INCLURE{fond=inclure/resume/evenement,id_evenement}
+               </li>
+       </BOUCLE_ev>
+       </ul>
+</B_ev>
+       <p><:agenda:info_aucun_evenement:></p>
+<//B_ev>
+
+<div class="pagination">
+       #SET{hasprev,''}
+       <BOUCLE_prev(EVENEMENTS){id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}{!evenement_a_venir #GET{date_prev}}{0,1}>#SET{hasprev,1}</BOUCLE_prev>
+       #SET{hasnext,''}
+       <BOUCLE_next(EVENEMENTS){id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}{!evenement_passe #GET{date_fin}}{0,1}>#SET{hasnext,1}</BOUCLE_next>
+       [(#GET{hasprev}|=={1}|ou{#GET{hasnext}|=={1}}|oui)
+       [(#INCLURE{fond=modeles/pagination_precedent_suivant,
+       label_precedent=#GET{date_prev}|affdate_periode{#GET{affichage_duree}},
+       label_suivant=#GET{date_fin}|affdate_periode{#GET{affichage_duree}},
+       nombre_pages=#VAL{1}|plus{#GET{hasprev}|?{1,0}}|plus{#GET{hasnext}|?{1,0}},
+       page_courante=#GET{hasprev}|?{2,1},
+       url_precedent=#SELF|parametre_url{date_debut,#GET{date_prev}|affdate{Y-m-d}},
+       url_suivant=#SELF|parametre_url{date_debut,#GET{date_fin}|affdate{Y-m-d}},
+       ancre=agenda-liste,
+       separateur=' | '})]]
+</div>
+</div>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/inclure/resume/evenement.html b/www/plugins/agenda_3_5/squelettes/inclure/resume/evenement.html
new file mode 100644 (file)
index 0000000..4d4635d
--- /dev/null
@@ -0,0 +1,20 @@
+<BOUCLE_vevent(EVENEMENTS){id_evenement=#ENV{id,#ENV{id_evenement}}}{tout}>
+<article class="entry evenement vevent id_#ID_EVENEMENT" itemscope itemtype="http://schema.org/Event">
+       <span class="banner #EDIT{date_debut}"><span class="label label-inverse"><b class="day">[(#DATE_DEBUT|jour)]</b> <b class="month">[(#DATE_DEBUT|nom_mois)]</b> <b class="year">[(#DATE_DEBUT|annee)]</b></span></span>
+       <strong class="h3-like summary entry-title #EDIT{titre}"><a itemprop="url" class="url" href="[(#URL_EVENEMENT)]">[(#LOGO_EVENEMENT|image_reduire{150,100}|inserer_attribut{itemprop,image})]<span itemprop="name">#TITRE</span><span
+                       class="lire-la-suite hide"><i class="icon-chevron-right" title="<:zpip:lire_la_suite|attribut_html:><:zpip:lire_la_suite_de|attribut_html:>&laquo;[(#TITRE|attribut_html)]&raquo;"></i></span></a></strong>
+       <meta itemprop="startDate" content="[(#DATE_DEBUT|date_iso)]" />
+       <meta itemprop="endDate" content="[(#DATE_FIN|date_iso)]" />
+       <p class="info-publi">[<time><i class="icon-calendar"></i> (#DATE_DEBUT|agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE,'hcal'})</time>]</p>
+       <div class="entry-content">
+       #SET{intro,''}<BOUCLE_art(ARTICLES){si #ENV{sinon_intro_article,oui}|=={non}|ou{#ENV{intro}|=={non}}|non}{id_article}>#SET{intro,#INTRODUCTION{#ENV{coupe,300}}</BOUCLE_art>
+       [(#ENV{intro,oui}|=={non}|non)[<div class="introduction #EDIT{descriptif}" itemprop="description">(#DESCRIPTIF|sinon{#GET{intro}})</div>]]
+
+       [<p class="location" itemprop="location"><span class="lieu #EDIT{lieu}">(#LIEU)</span>[<br /><span class="adresse #EDIT{adresse}">(#ADRESSE|PtoBR)</span>]</p>]
+       </div>
+       <p class="meta-publi">
+               [(#INSCRIPTION|?{' ',''})<span class="inscrits"><span class="sep">|</span> <i class="icon-user" title="#NB_INSCRITS[/(#PLACES) ] <:agenda:inscrits|attribut_html:>"></i> #NB_INSCRITS[/(#PLACES) ]</span>]
+               <B_mots><span class="sep">|</span> <BOUCLE_mots(MOTS){id_evenement}{par num titre,titre}{', '}><span class="category"><i class="icon-tag"></i> #TITRE</span></BOUCLE_mots>
+       </p>
+</article>
+</BOUCLE_vevent>
diff --git a/www/plugins/agenda_3_5/squelettes/navigation/page-agenda.html b/www/plugins/agenda_3_5/squelettes/navigation/page-agenda.html
new file mode 100644 (file)
index 0000000..9fc1f66
--- /dev/null
@@ -0,0 +1,22 @@
+[(#REM)
+
+  Squelette
+  (c) 2009 xxx
+  Distribue sous licence GPL
+
+]
+<BOUCLE_ev(EVENEMENTS){id_evenement}>
+#CALENDRIER_MINI{#DATE_DEBUT,date_debut,#URL_PAGE{jour},#URL_PAGE{calendrier_mini_event.json}}
+</BOUCLE_ev>
+#CALENDRIER_MINI{#DATE_DEBUT,date_debut,#URL_PAGE{jour},#URL_PAGE{calendrier_mini_event.json}}
+<//B_ev>
+
+<B_mois>
+#ANCRE_PAGINATION
+<ul class="liste-items">
+<BOUCLE_mois(EVENEMENTS){!par date_debut}{evenement_passe #ENV{date}}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}{fusion_par_mois date_debut}{pagination 10}>
+<li class="item">[(#SELF|parametre_url{date_debut,#DATE_DEBUT|affdate{Y-m-01}}|lien_ou_expose{#DATE_DEBUT|affdate_mois_annee{},#ENV{date_debut,''}|=={#DATE_DEBUT|affdate{Y-m-01}}})]</li>
+</BOUCLE_mois>
+</ul>
+[<p class="pagination">(#PAGINATION)</p>]
+</B_mois>
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/squelettes/style_public_plugin_agenda.html b/www/plugins/agenda_3_5/squelettes/style_public_plugin_agenda.html
new file mode 100644 (file)
index 0000000..4b54c5b
--- /dev/null
@@ -0,0 +1,26 @@
+#CACHE{0}
+[(#REM)
+
+       Ce squelette definit les styles de l'espace prive
+
+       Note: l'entete "Vary:" sert a repousser l'entete par
+       defaut "Vary: Cookie,Accept-Encoding", qui est (un peu)
+       genant en cas de "rotation du cookie de session" apres
+       un changement d'IP (effet de clignotement).
+
+       ATTENTION: il faut absolument le charset sinon Firefox croit que
+       c'est du text/html !
+]
+#CACHE{3600*100,cache-client}
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
+#HTTP_HEADER{Vary: Accept-Encoding}
+
+#SET{claire,##ENV{couleur_claire,edf3fe}}
+#SET{foncee,##ENV{couleur_foncee,3874b0}}
+#SET{left,#ENV{ltr}|choixsiegal{left,left,right}}
+#SET{right,#ENV{ltr}|choixsiegal{left,right,left}}
+
+[(#INCLURE{fond=prive/style_prive_plugin_agenda}
+       {couleur_claire=#GET{claire}}
+       {couleur_foncee=#GET{foncee}}
+       {ltr=#GET{left}})]
\ No newline at end of file
diff --git a/www/plugins/agenda_3_5/svn.revision b/www/plugins/agenda_3_5/svn.revision
new file mode 100644 (file)
index 0000000..8d6a639
--- /dev/null
@@ -0,0 +1,10 @@
+<svn_revision>
+<text_version>
+Origine: file:///home/svn/repository/spip-zone/_plugins_/agenda/trunk
+Revision: 74120
+Dernier commit: 2013-07-06 00:00:23 +0200 
+</text_version>
+<origine>file:///home/svn/repository/spip-zone/_plugins_/agenda/trunk</origine>
+<revision>74120</revision>
+<commit>2013-07-06 00:00:23 +0200 </commit>
+</svn_revision>
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/balise/calendrier_mini.php b/www/plugins/calendrier_mini-2.0/balise/calendrier_mini.php
new file mode 100644 (file)
index 0000000..36fff63
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Balise #CALENDRIER_MINI
+ * Auteur James (c) 2006-2012
+ * Plugin pour SPIP 3.0.0
+ * Licence GNU/GPL
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;   #securite
+
+include_spip('calendriermini_fonctions');
+
+function balise_CALENDRIER_MINI($p) {
+       return calculer_balise_dynamique($p,'CALENDRIER_MINI', array(VAR_DATE, 'id_rubrique','id_article', 'id_mot'));
+}
+function balise_CALENDRIER_MINI_stat($args, $filtres) {
+ //les parametres passe en {...}, les filtres sont des vraiss filtres
+       return $args;
+}
+
+/**
+ * Syntaxe raccourcie du plugin
+ * #CALENDRIER_MINI
+ * #CALENDRIER_MINI{#SELF}
+ * #CALENDRIER_MINI{#SELF,#URL_PAGE{calendrier_mini.json}}
+ *
+ * Syntaxe ancienne (ou plugin agenda)
+ * #CALENDRIER_MINI{#ENV{date}}
+ * #CALENDRIER_MINI{#ENV{date},date}
+ * #CALENDRIER_MINI{#ENV{date},date,#SELF}
+ * #CALENDRIER_MINI{#ENV{date},date,#SELF,#URL_PAGE{calendrier_mini.json}}
+ *
+ * Quand l'url json est explicitée dans les arguments, la collecte automatisée de id_rubrique, id_article et id_mot est desactivée
+ * car dans ce cas il suffit simplement de les expliciter sur l'url json pour les prendre en compte
+ *
+ * @param string $date
+ *   date automatique collectee par VAR_DATE
+ * @param int $id_rubrique
+ * @param int $id_article
+ * @param int $id_mot
+ * @param null $self_or_date_or_nothing
+ * @param null $urljson_or_var_date_or_nothing
+ * @param null $self_or_nothing
+ * @param null $urljson_or_nothing
+ * @return array
+ */
+function balise_CALENDRIER_MINI_dyn($date, $id_rubrique = 0, $id_article = 0, $id_mot = 0,
+                                    $self_or_date_or_nothing = null, $urljson_or_var_date_or_nothing = null, $self_or_nothing = null, $urljson_or_nothing = null) {
+       $var_date = VAR_DATE;
+       $url = null;
+       $url_json = null;
+
+       if(!is_null($self_or_date_or_nothing)){
+               // est-ce une date ou une url ?
+               if (!function_exists('recup_date'))
+                       include_spip('inc/filtres');
+               if (!strlen($self_or_date_or_nothing) OR
+                       (preg_match(",^[\d\s:-]+$,",$self_or_date_or_nothing))
+                 AND list($annee, $mois, $jour, $heures, $minutes, $secondes) = recup_date($self_or_date_or_nothing)
+                 AND $annee){
+                       // si c'est une date on est dans l'ancienne syntaxe
+                       $date = $self_or_date_or_nothing;
+                       $var_date = $urljson_or_var_date_or_nothing;
+                       $url = $self_or_nothing;
+                       $url_json = $urljson_or_nothing;
+               }
+               else {
+                       // sinon on est sur la nouvelle syntaxe
+                       $url = $self_or_date_or_nothing;
+                       $url_json = $urljson_or_var_date_or_nothing;
+               }
+       }
+
+       $args = array(
+               'date' => $date?$date:date('Y-m'),
+               'var_date' => $var_date,
+               'self' => $url?$url:self(),
+       );
+
+       // si pas de url_json explicite, la renseigner et peupler automatiquement les
+       if (is_null($url_json)){
+               $url_json = generer_url_public("calendrier_mini.json");
+               if (!is_null($id_rubrique))
+                       $args['id_rubrique'] = $id_rubrique;
+               if (!is_null($id_article))
+                       $args['id_article'] = $id_article;
+               if (!is_null($id_mot))
+                       $args['id_mot'] = $id_mot;
+       }
+
+       if (defined('_VAR_MODE') and _VAR_MODE == "recalcul")
+               $url_json = parametre_url($url_json,'var_mode','recalcul');
+
+       $args['urljson'] = $url_json;
+
+       /* tenir compte de la langue, c'est pas de la tarte */
+       return array('formulaires/calendrier_mini', 3600, $args);
+}
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/calendrier_mini.json.html b/www/plugins/calendrier_mini-2.0/calendrier_mini.json.html
new file mode 100644 (file)
index 0000000..f41a5f7
--- /dev/null
@@ -0,0 +1,6 @@
+#HTTP_HEADER{Content-type:text/javascript;}
+[<BOUCLE_periode(ARTICLES){id_mot?}{branche?}
+       {agenda date, periode,
+       #ENV{start}|todate|affdate{Y}, #ENV{start}|todate|affdate{m}, #ENV{start}|todate|affdate{d},
+       #ENV{end}|todate|affdate{Y}, #ENV{end}|todate|affdate{m}, #ENV{end}|todate|affdate{d}}{', '}>
+[(#ARRAY{id,#ID_ARTICLE,title,[(#TITRE|html2unicode|unicode2charset|textebrut)],allDay,#EVAL{false},start,#DATE,end,#DATE,url,#URL_ARTICLE,className,calendrier-couleur6,description,[(#INTRODUCTION|html2unicode|unicode2charset)]}|json_encode)]</BOUCLE_periode>]
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/calendrier_mini.json_fonctions.php b/www/plugins/calendrier_mini-2.0/calendrier_mini.json_fonctions.php
new file mode 100644 (file)
index 0000000..de9fe80
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Fichier de fonction du json du calendrier mini
+ *
+ * @package SPIP\CalendrierMini\Fonctions
+**/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+include_spip('inc/json');
+
+/**
+ * Transforme un timestamp en date au format SQL
+ *
+ * @param int $t Timestamp
+ * @return string Date au format SQL
+**/
+function todate($t){return date('Y-m-d H:i:s',$t);}
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/calendriermini_fonctions.php b/www/plugins/calendrier_mini-2.0/calendriermini_fonctions.php
new file mode 100644 (file)
index 0000000..1cff092
--- /dev/null
@@ -0,0 +1,57 @@
+<?php\r
+\r
+/**\r
+ * Balises et critères du calendrier mini\r
+ *\r
+ * @package SPIP\CalendrierMini\Fonctions\r
+**/\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;   #securite\r
+\r
+if (!defined('VAR_DATE')) define('VAR_DATE', 'archives');\r
+\r
+function balise_DATE_ARCHIVES($p) {\r
+       $p->code = "_request('".VAR_DATE."')";\r
+\r
+       #$p->interdire_scripts = true;\r
+       return $p;\r
+}\r
+\r
+function critere_archives($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $objet = objet_type($boucle->id_table);\r
+       $date = objet_info($objet,'date');\r
+       $champ_date = "'" . $boucle->id_table ."." .\r
+       $date . "'";\r
+       $boucle->where[] = array(\r
+               'REGEXP',\r
+               $champ_date, \r
+               "sql_quote(('^' . interdire_scripts(entites_html(\$Pile[0]['".VAR_DATE."']))))"\r
+       );\r
+}\r
+\r
+/**\r
+ * Crée un array d'un intervalle de jour entre la date de début $start et la date de fin $end\r
+ * \r
+ * $start datetime SQL - La date de début\r
+ * $end datetime SQL La date de fin\r
+ */\r
+function calendriermini_intervalle($start,$end=false){\r
+       $jours = array();\r
+       $starttime = strtotime($start);\r
+       $startdate = date('Y-m-d',$starttime);\r
+       $jours[] = $startdate;\r
+       if(!$end){\r
+               return $jours;\r
+       }\r
+       $endtime = strtotime($end);\r
+       $enddate = date('Y-m-d',strtotime($end));\r
+       $starttime = $starttime + (3600*24);\r
+       while(($date_test = date('Y-m-d',$starttime)) < $enddate){\r
+               $jours[] = $date_test;\r
+               $starttime = $starttime + (3600*24);\r
+       }\r
+       $jours[] = $enddate;\r
+       return array_unique($jours);\r
+}\r
+?>\r
diff --git a/www/plugins/calendrier_mini-2.0/css/img/month_next.png b/www/plugins/calendrier_mini-2.0/css/img/month_next.png
new file mode 100644 (file)
index 0000000..75a8d7a
Binary files /dev/null and b/www/plugins/calendrier_mini-2.0/css/img/month_next.png differ
diff --git a/www/plugins/calendrier_mini-2.0/css/img/month_prev.png b/www/plugins/calendrier_mini-2.0/css/img/month_prev.png
new file mode 100644 (file)
index 0000000..4ee1fb4
Binary files /dev/null and b/www/plugins/calendrier_mini-2.0/css/img/month_prev.png differ
diff --git a/www/plugins/calendrier_mini-2.0/css/img/month_prev_next-32x16.png b/www/plugins/calendrier_mini-2.0/css/img/month_prev_next-32x16.png
new file mode 100644 (file)
index 0000000..03837b9
Binary files /dev/null and b/www/plugins/calendrier_mini-2.0/css/img/month_prev_next-32x16.png differ
diff --git a/www/plugins/calendrier_mini-2.0/css/minical.css b/www/plugins/calendrier_mini-2.0/css/minical.css
new file mode 100644 (file)
index 0000000..16d1972
--- /dev/null
@@ -0,0 +1,56 @@
+/* CSS Document */
+.calendriermini{margin-bottom:1em;}
+.calendriermini .calendar-container {height: 17em;position: relative;}
+.calendriermini .calendar-container .image_loading {position: absolute;top:0;right:0;}
+
+.js .calendriermini .calendar-container .alt {display: none;}
+
+.calendriermini table{width: 100%;font-size: 0.8em;text-align: center;margin: 0 auto;border-collapse: collapse;}
+.calendriermini table caption{margin: 0 auto;  padding:0;}
+.calendriermini table th{padding:0;}
+.calendriermini table td {width: 14%;line-height: 2em;padding:0;}
+.calendriermini table td a{display: block;background: #fff;border: 1px solid #EEE;font-weight: bold;text-decoration: none;color:inherit;}
+.calendriermini .ui-datepicker-other-month {opacity: .5; filter:Alpha(Opacity=50);}
+.calendriermini .ui-datepicker-other-month a {font-weight: normal;background:#eee;}
+.calendriermini .ui-state-highlight a {background: #EAEA98;border-color: #EAEA98;}
+.calendriermini .ui-datepicker-today a {border-color:#bbbb99;}
+
+.calendriermini table .ui-state-highlight a:hover{background: #DBB8DC;color: #636;border-color:#DBB8DC;}
+.calendriermini table .ui-state-highlight.ui-datepicker-today a:hover{border-color:#636;}
+.calendriermini span{}
+
+.calendriermini .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+.calendriermini .ui-icon { width: 16px; height: 16px; background-repeat:no-repeat;background-position: center; }
+.calendriermini .ui-datepicker-header { position:relative; padding:.2em 0; }
+.calendriermini .ui-datepicker-prev, .calendriermini .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.calendriermini .ui-datepicker-prev-hover, .calendriermini .ui-datepicker-next-hover { top: 1px; }
+.calendriermini .ui-datepicker-prev { left:2px; }
+.calendriermini .ui-datepicker-next { right:2px; }
+.calendriermini .ui-datepicker-prev .ui-icon {background-position: top left;}
+.calendriermini .ui-datepicker-next .ui-icon {background-position: top right;}
+.calendriermini .ui-datepicker-prev-hover { left:1px; }
+.calendriermini .ui-datepicker-next-hover { right:1px; }
+.calendriermini .ui-datepicker-prev span, .calendriermini .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.calendriermini .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.calendriermini .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.calendriermini select.ui-datepicker-month-year {width: 100%;}
+.calendriermini select.ui-datepicker-month,
+.calendriermini select.ui-datepicker-year { width: 49%;}
+.calendriermini .ui-datepicker-buttonpane { background-image: none; margin: 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; font-size: 0.8em;}
+.calendriermini .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+
+
+/* RTL support */
+/*
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+*/
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/demos/minical_demo.html b/www/plugins/calendrier_mini-2.0/demos/minical_demo.html
new file mode 100644 (file)
index 0000000..024daf4
--- /dev/null
@@ -0,0 +1,91 @@
+#CACHE{7200}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+[(#REM) Cf.: http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/
+]<!--[if lt IE 7 ]> <html dir="#LANG_DIR" lang="#LANG" xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" class="[(#LANG_DIR)][ (#LANG)] no-js ie ie6"> <![endif]-->
+<!--[if IE 7 ]> <html dir="#LANG_DIR" lang="#LANG" xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" class="[(#LANG_DIR)][ (#LANG)] no-js ie ie7"> <![endif]-->
+<!--[if IE 8 ]> <html dir="#LANG_DIR" lang="#LANG" xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" class="[(#LANG_DIR)][ (#LANG)] no-js ie ie8"> <![endif]-->
+<!--[if IE 9 ]> <html dir="#LANG_DIR" lang="#LANG" xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" class="[(#LANG_DIR)][ (#LANG)] no-js ie ie9"> <![endif]-->
+<!--[if (gt IE 9)|!(IE)]><!--> <html dir="#LANG_DIR" lang="#LANG" xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" class="[(#LANG_DIR)][ (#LANG)] no-js"> <!--<![endif]-->
+<head>
+<script type='text/javascript'>/*<![CDATA[*/(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement);/*]]>*/</script>
+       <title>Exemple #[(#REM)]CALENDRIER_MINI</title>
+       <INCLURE{fond=squelettes-dist/inclure/head} />
+       <link rel="stylesheet" href="[(#CHEMIN{minical.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
+</head>
+
+<body class="pas_surlignable page_demo_minical">
+<div class="page">
+       <INCLURE{fond=inclure/header} />
+       <INCLURE{fond=inclure/nav,env} />
+
+       <div class="main">
+               [(#REM) Contenu principal : contenu de l'article ]
+               <div class="wrapper hfeed">
+               <div class="content hentry" id="content">
+
+                       [(#REM) Les deux derniers articles ]
+                       <B_articles_recents>
+                       <div class="liste-articles">
+                               [(#ANCRE_PAGINATION)]
+                               [(#ENV{debut_articles_recents}|?{'',' '})<h2 class="invisible"><:articles_recents:>[ - (#DATE_ARCHIVES|affdate)]</h2>]
+                               <ul>
+                                       <BOUCLE_articles_recents(ARTICLES) {pagination} {par date}{inverse} {archives ?}{branche ?} {lang ?}>
+                                       <li>
+                                               [(#LOGO_ARTICLE_RUBRIQUE|#URL_ARTICLE|image_reduire{150,100})]
+                                               [<p class="surtitre">(#SURTITRE)</p>]
+                                               <h3 class="titre"><a href="#URL_ARTICLE">#TITRE</a></h3>
+                                               [<p class="soustitre">(#SOUSTITRE)</p>]
+                                               <small>[(#DATE|affdate)][, <:par_auteur:> (#LESAUTEURS)]</small>
+                                               [<div class="texte">(#INTRODUCTION)</div>]
+                                               <br class="nettoyeur" />
+                                       </li>
+                                       </BOUCLE_articles_recents>
+                               </ul>
+                               [<p class="pagination">(#PAGINATION)</p>]
+                       </div>
+                       </B_articles_recents>[
+                       <h2>Rien pour (#DATE_ARCHIVES|affdate)[ (#ENV{id_rubrique}?{dans ce secteur})]</h2>
+                       ]<//B_articles_recents>
+
+                       <br class="nettoyeur" />
+
+               </div><!--.content-->
+               </div><!--.wrapper-->
+
+               [(#REM) Menu de navigation laterale ]
+               <div class="aside">
+                       #CALENDRIER_MINI
+                       <B_categories>
+                       <div id='categories' class="rubriques">
+                               <h2 class="menu-titre"><:categories|ucfirst:></h2>
+                               <ul>
+                                       <BOUCLE_categories(RUBRIQUES){racine}>[
+                                       <li>[(#EXPOSE{<b>})]
+                                       <a href="(#SELF|parametre_url{id_rubrique,#ID_RUBRIQUE})">#TITRE</a>
+                                       [(#EXPOSE{</b>})]</li>
+                                       ]</BOUCLE_categories>
+                               </ul>
+                       </div>
+                       </B_categories>
+          
+                       [(#MODELE{archives_mensuelles,id_rubrique,archives,self=#SELF,lang})]
+          
+                       [(#MODELE{select_archives_mensuelles,id_rubrique,archives,self=#SELF,lang})]
+          
+                       [<div>(#MENU_LANG)<small>(<a href="[(#SELF|parametre_url{lang,''})]">toutes les langues</a>)</small><br class="nettoyeur" /></div>]
+       
+                       <div id="links" class="syndic">
+                               <h2 class="menu-titre"><:liens|ucfirst:></h2>
+                               <ul>
+                                       <li><a href="http://zone.spip.org/trac/spip-zone/">Spip Zone</a></li>
+                                       <li><a href="#URL_PAGE{minical_doc}"><:documentation|ucfirst:></a></li>
+                               </ul>
+                       </div>
+               </div><!--.aside-->
+       </div><!--.main-->
+
+       <INCLURE{fond=inclure/footer,self=#SELF} />
+
+</div><!--.page-->
+</body>
+</html>
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/formulaires/calendrier_mini.html b/www/plugins/calendrier_mini-2.0/formulaires/calendrier_mini.html
new file mode 100644 (file)
index 0000000..2bda6db
--- /dev/null
@@ -0,0 +1,57 @@
+[(#SET{urljson,[(#ENV{urljson}
+                                               |parametre_url{id_rubrique,#ENV{id_rubrique,#ENV{urljson}|parametre_url{id_rubrique}}}
+                                               |parametre_url{id_article,#ENV{id_article,#ENV{urljson}|parametre_url{id_article}}}
+                                               |parametre_url{id_mot,#ENV{id_mot,#ENV{urljson}|parametre_url{id_mot}}}
+                                               |parametre_url{lang,#ENV{lang,#ENV{urljson}|parametre_url{lang}}}
+                                               )]})
+]<div id="calendar" class="calendriermini minicalendar">
+       <h2 class="menu-titre"><:icone_calendrier:></h2>
+       <div class="calendar-container"
+                                       data-json="#GET{urljson}"
+                                       data-year="[(#ENV{date}|affdate{Y})]"
+                                       data-month="[(#ENV{date}|affdate{n})]"
+                                       data-url="#ENV{self}"
+                                       data-vardate="#ENV{var_date}"
+                                       >[(#REM)
+
+               Contenu alternatif statique pour les Bot et les utilisateurs sans JS
+               ]<div class="alt">
+                       #SET{start,#ENV{date}|affdate{Y-m-01}|strtotime}
+                       #SET{end,#VAL{Y-m-01}|date{#GET{start}|plus{2764800}}|strtotime}
+                       #SET{url,#GET{urljson}|parametre_url{start,#GET{start},'&'}|parametre_url{end,#GET{end},'&'}|url_absolue}
+                       <strong>[(#ENV{date}|affdate_mois_annee)]&nbsp;:</strong>
+                       <B_alt>
+                       <ul class="liste-items">
+                       <BOUCLE_alt(DATA){source json,#GET{url}}><BOUCLE_dates(DATA){source table,#VALEUR{start}|calendriermini_intervalle{#VALEUR{end}}}>[
+                               <li class="item"><a href="[(#ENV{self}|parametre_url{#ENV{var_date},#VALEUR})]">(#VALEUR|affdate|unique)</a></li>
+                               ]</BOUCLE_dates></BOUCLE_alt>
+                       </ul>
+                       </B_alt>
+                       <p><:minical:aucune_date:></p>
+                       <//B_alt>
+                       <p class="pagination">
+                       #SET{prev,#VAL{Y-m-01}|date{#GET{start}|moins{172800}}}
+                       #SET{next,#VAL{Y-m-01}|date{#GET{end}}}
+                       <a href="[(#ENV{self}|parametre_url{#ENV{var_date},#GET{prev}|affdate{Y-m-d}})]">[(#GET{prev}|affdate_mois_annee)]</a>
+                       | <a href="[(#ENV{self}|parametre_url{#ENV{var_date},#GET{next}|affdate{Y-m-d}})]">[(#GET{next}|affdate_mois_annee)]</a>
+                       </p>
+               </div>
+       </div>
+</div>[
+(#REM) --------------------------------------------------------------------------------------------------
+
+Chargement du javascript du mini-calendrier
+
+]<script type='text/javascript'>/*<![CDATA[*/
+if (window.jQuery){jQuery(function(){
+               jQuery.getScript('[(#PRODUIRE{fond=javascript/calendrier_mini.js,lang=#ENV{lang}}|compacte)]',function(){minical.init('.minicalendar .calendar-container');});
+});}/*]]>*/</script>[
+(#REM) --------------------------------------------------------------------------------------------------
+
+Chargement de la css que l'on importe inline pour eviter un hit (performance)
++ fixer la css de background pour les boutons precedent/suivant
+
+]<style type="text/css">
+[(#INCLURE{css/minical.css}|compacte{css})]
+.calendriermini .ui-datepicker-header .ui-icon {background-image: url("#CHEMIN{css/img/month_prev_next-32x16.png}");}
+</style>
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/formulaires/configurer_calendriermini.html b/www/plugins/calendrier_mini-2.0/formulaires/configurer_calendriermini.html
new file mode 100644 (file)
index 0000000..f5a1ca9
--- /dev/null
@@ -0,0 +1,79 @@
+<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
+<h3 class="titrem"><:minical:config_titre_calendriermini:></h3>
+
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+
+<form method="post" action="#ENV{action}"><div>
+       #ACTION_FORMULAIRE{#ENV{action}}
+       <ul>
+               #SET{fl,minical}
+               #SET{name,jour1}#SET{obli,''}#SET{defaut,1}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+               <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                       <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                       <span class='erreur_message'>(#GET{erreurs})</span>
+                       ]<select name="#GET{name}" class="select" id="#GET{name}">
+                               <BOUCLE_jours(DATA){enum 1,7}>
+                               #SET{val,#VALEUR|moins{1}}
+                               <option value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)selected="selected"]>[(#VAL{date_jour_}|concat{#VALEUR}|_T)]</option>
+                               </BOUCLE_jours>
+                       </select>
+               </li>
+               #SET{name,format_jour}#SET{defaut,1}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+               <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                       <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                       <span class='erreur_message'>(#GET{erreurs})</span>
+                       ]
+                       #SET{val,initiale}
+                       <div class="choix">
+                               <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)] (<:date_jour_1_initiale:> <:date_jour_2_initiale:> <:date_jour_3_initiale:> <:date_jour_4_initiale:>
+                                       <:date_jour_5_initiale:> <:date_jour_6_initiale:> <:date_jour_7_initiale:>)</label>
+                       </div>
+                       #SET{val,abbr}
+                       <div class="choix">
+                               <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)] (<:date_jour_1_abbr:> <:date_jour_2_abbr:> <:date_jour_3_abbr:> <:date_jour_4_abbr:>
+                                                                       <:date_jour_5_abbr:> <:date_jour_6_abbr:> <:date_jour_7_abbr:>)</label>
+                       </div>
+               </li>
+               #SET{name,affichage_hors_mois}#SET{defaut,1}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+               <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                       <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                       <span class='erreur_message'>(#GET{erreurs})</span>
+                       ]
+                       #SET{val,1}
+                       <div class="choix">
+                               <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                       </div>
+                       #SET{val,0}
+                       <div class="choix">
+                               <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                       </div>
+               </li>
+               #SET{name,changement_rapide}#SET{defaut,1}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+               <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                       <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
+                       <span class='erreur_message'>(#GET{erreurs})</span>
+                       ]
+                       #SET{val,1}
+                       <div class="choix">
+                               <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                       </div>
+                       #SET{val,0}
+                       <div class="choix">
+                               <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
+                               <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
+                       </div>
+               </li>
+
+
+       </ul>
+
+       <p class='boutons'><span class='image_loading'>&nbsp;</span>
+       <input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p>
+</div></form>
+</div>
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/javascript/calendrier_mini.js.html b/www/plugins/calendrier_mini-2.0/javascript/calendrier_mini.js.html
new file mode 100644 (file)
index 0000000..84c1db9
--- /dev/null
@@ -0,0 +1,208 @@
+#HTTP_HEADER{Content-type:text/javascript}
+if (!jQuery.fn.datepicker){
+#INCLURE{javascript/ui/jquery.ui.core.js}
+#INCLURE{javascript/ui/jquery.ui.widget.js}
+#INCLURE{javascript/ui/jquery.ui.datepicker.js}
+}
+if (!jQuery.fn.multiDatesPicker){
+#INCLURE{javascript/jquery-ui.multidatespicker.js}
+}
+[(#REM)<script>]
+var ajax_image_searching = "<img src='#CHEMIN{images/searching.gif}' width='16' height='16' />";
+var minical = {
+       options: {
+               buttonText: '<:afficher_calendrier|texte_script:>',
+               buttonImage: '#CHEMIN_IMAGE{calendrier-16.png}',
+               buttonImageOnly: true,
+               prevText: '<:precedent|texte_script:>',
+               nextText: '<:suivant|texte_script:>',
+               currentText: '<:date_aujourdhui|texte_script:>',
+               closeText: '<:bouton_fermer|texte_script:>',
+               monthNames: [
+                       '<:date_mois_1|texte_script:>','<:date_mois_2|texte_script:>','<:date_mois_3|texte_script:>','<:date_mois_4|texte_script:>','<:date_mois_5|texte_script:>','<:date_mois_6|texte_script:>',
+                       '<:date_mois_7|texte_script:>','<:date_mois_8|texte_script:>','<:date_mois_9|texte_script:>','<:date_mois_10|texte_script:>','<:date_mois_11|texte_script:>','<:date_mois_12|texte_script:>'],
+               monthNamesShort: [
+                       '<:date_mois_1_abbr|texte_script:>','<:date_mois_2_abbr|texte_script:>','<:date_mois_3_abbr|texte_script:>','<:date_mois_4_abbr|texte_script:>','<:date_mois_5_abbr|texte_script:>','<:date_mois_6_abbr|texte_script:>',
+                       '<:date_mois_7_abbr|texte_script:>','<:date_mois_8_abbr|texte_script:>','<:date_mois_9_abbr|texte_script:>','<:date_mois_10_abbr|texte_script:>','<:date_mois_11_abbr|texte_script:>','<:date_mois_12_abbr|texte_script:>'],
+               dayNames: [
+                       '<:date_jour_1|texte_script:>','<:date_jour_2|texte_script:>','<:date_jour_3|texte_script:>','<:date_jour_4:|texte_script:>',
+                       '<:date_jour_5|texte_script:>','<:date_jour_6|texte_script:>','<:date_jour_7|texte_script:>'],
+               dayNamesShort: [
+                       '<:date_jour_1_abbr|texte_script:>','<:date_jour_2_abbr|texte_script:>','<:date_jour_3_abbr|texte_script:>','<:date_jour_4_abbr|texte_script:>',
+                       '<:date_jour_5_abbr|texte_script:>','<:date_jour_6_abbr|texte_script:>','<:date_jour_7_abbr|texte_script:>'],
+               dayNamesMin: [
+                       '<:date_jour_1_initiale|texte_script:>','<:date_jour_2_initiale|texte_script:>','<:date_jour_3_initiale|texte_script:>','<:date_jour_4_initiale|texte_script:>',
+                       '<:date_jour_5_initiale|texte_script:>','<:date_jour_6_initiale|texte_script:>','<:date_jour_7_initiale|texte_script:>'],
+               dateFormat: 'yy-mm-dd',
+               firstDay: #CONFIG{calendriermini/jour1,1},
+               isRTL: [(#ENV{lang}|lang_dir|=={rtl}|?{true,false})],
+               changeMonth: [(#CONFIG{calendriermini/changement_rapide,1}|?{true,false})],
+               changeYear: [(#CONFIG{calendriermini/changement_rapide,1}|?{true,false})],
+               showOtherMonths: [(#CONFIG{calendriermini/affichage_hors_mois,1}|?{true,false})],
+               selectOtherMonths: [(#CONFIG{calendriermini/affichage_hors_mois,1}|?{true,false})]
+       },
+
+       add_tooltip_and_class: function($this,date,id,tooltip,className){
+               if (!$this.tooltip)
+                       $this.tooltip = {};
+               if (!$this.cn)
+                       $this.cn = {};
+
+               var d = date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate();
+               if (!$this.tooltip[d])
+                       $this.tooltip[d] = {};
+               tooltip = tooltip.replace(/"/g,'&quot;'); // echapper les " pour ne pas casser le html (secu, supprimer le html en amont !)
+               $this.tooltip[d][id] = tooltip;
+
+               if (className && typeof className != "undefined"){
+                       if (!$this.cn[d])
+                               $this.cn[d] = {};
+                       $this.cn[d][id] = className;
+               }
+       },
+
+       set_events: function(me,start,end,data){
+               var dates = [];
+               var $this = me.get(0);
+
+               if (data.length){
+                       var d,datebegin,dateend;
+                       for(var j=0;j<data.length;j++){
+                               d = data[j].start.split(" ");
+                               d = d[0].split("-");
+                               d = new Date(d[0],d[1]-1,d[2]);
+                               dates.push(d);
+                               minical.add_tooltip_and_class($this,d,data[j].id,data[j].title,data[j].className);
+
+                               if(data[j].end){
+                                       /* prendre la plus grande date de debut entre debut a afficher et l'interval donne */
+                                       datebegin = Math.max(start * 1000,d.getTime());
+                                       d = data[j].end.split(" ");
+                                       d = d[0].split("-");
+                                       d = new Date(d[0],d[1]-1,d[2]);
+                                       /* prendre la plus petite date de fin entre fin a afficher et l'interval donne */
+                                       dateend = Math.min(end * 1000, d.getTime());
+                                       if (dateend>datebegin){
+                                               dates.push(d);
+                                               minical.add_tooltip_and_class($this,d,data[j].id,data[j].title,data[j].className);
+                                               datebegin = datebegin+(3600*24*1000);
+                                               while(datebegin < dateend){
+                                                       d = new Date(datebegin);
+                                                       dates.push(d);
+                                                       minical.add_tooltip_and_class($this,d,data[j].id,data[j].title,data[j].className);
+                                                       datebegin = datebegin+(3600*24*1000);
+                                               }
+                                       }
+                               }
+                       }
+
+                       me.multiDatesPicker('addDates', dates);
+                       // toujours retirer la classe active qui n'a pas de sens pour l'affichage
+                       jQuery('.ui-state-active',me).removeClass('ui-state-active');
+               }
+       },
+
+       before_show_day: function(date) {
+               var d = date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate();
+               var c = [true, ''];
+               if (this.cn && this.cn[d]){
+                       for (var i in this.cn[d])
+                               c[1] += ' ' + this.cn[d][i];
+               }
+
+               if (this.tooltip && this.tooltip[d]){
+                       var glue = '';
+                       c[2] = '';
+                       for (var i in this.tooltip[d]) {
+                               c[2] += glue + this.tooltip[d][i];
+                               glue = "\n";
+      }
+               }
+               return c;
+       },
+
+       change_month_year: function(year, month, inst){
+               var me = inst;
+               //console.log("change_month_year:"+year+"/"+month);
+               if (typeof inst.input != "undefined")
+                       me = inst.input;
+               //console.log(me);
+               var t = new Date(year,month-1,1);
+               t = parseInt(t.getTime()/1000);
+               var start = t-7*24*3600;
+               var end = t+38*24*3600;
+               // stocker les year/month deja vus pour ne pas les recharger 2 fois quand on va et vient
+               var o = me.get(0);
+               if (typeof o.dateseen == "undefined")
+                       o.dateseen = {};
+               if (!o.dateseen[year+"/"+month]){
+                       //console.log(o.dateseen);
+                       o.dateseen[year+"/"+month] = true;
+                       minical.show_loading(me);
+                       jQuery.ajax({
+                               url:jQuery(me).attr("data-json"),
+                               data:{start:start,end:end},
+                               success:function(data, textStatus, jqXHR){
+                                       data = eval(data);
+                                       minical.set_events(me,start,end,data);
+                                       minical.hide_loading(me);
+                               }
+                       });
+               }
+               inst.currentDay=0; // annuler la date active : pas de sens ici
+       },
+       show_loading : function(me){
+               me.animateLoading();
+       },
+       hide_loading : function(me) {
+               me.endLoading(true);
+       },
+
+       scripts_loaded: {widget:false,datepicker:false,multidatepicker:false},
+       init : function(selecteur){
+               //if (!minical.scripts_loaded.widget || !minical.scripts_loaded.datepicker || !minical.scripts_loaded.multidatepicker)
+               //      return;
+               [(#CONFIG{calendriermini/format_jour,initiale}|=={abbr}|oui)
+               minical.options.dayNamesMin = minical.options.dayNamesShort;
+               ]
+               jQuery(function(){
+                       jQuery(selecteur).not('.loaded')
+                               .addClass('loaded')
+                               .multiDatesPicker(jQuery.extend(minical.options,
+                                       {
+                                               showButtonPanel: true,
+                                               prevText: '<:minical:mois_precedent|texte_script:>',
+                                               nextText: '<:minical:mois_suivant|texte_script:>',
+                                               create: minical.create,
+                                               beforeShowDay: minical.before_show_day,
+                                               onChangeMonthYear: minical.change_month_year,
+                                               onSelect: minical.on_select
+                                       })
+                               )
+                               .each(function(){
+                                       var me=jQuery(this);
+                                       // se mettre a la date demandee (pour afficher le bon mois)
+                                       me.datepicker("setDate" , me.attr('data-year')+"-"+me.attr('data-month')+"-1");
+                                       // et retirer la classe active qui n'a pas de sens pour l'affichage
+                                       jQuery('.ui-state-active',me).removeClass('ui-state-active');
+                                       minical.change_month_year(me.attr('data-year'),me.attr('data-month'),me);
+                               })
+                               .trigger('miniCalendarLoaded')
+                               .find(".alt").remove();
+               });
+       },
+       on_select : function(dateText, inst){
+               var me = inst.input;
+               if (dateText) {
+                       // annuler la selection !
+                       me.multiDatesPicker('toggleDate', dateText);
+                       var actif = (me.multiDatesPicker('gotDate', dateText) !==false);
+                       if (actif){
+                               var url = me.attr('data-url');
+                               url = parametre_url(url,me.attr('data-vardate'),dateText);
+                               //console.log(url);
+                               window.location = url;
+                       }
+               }
+       }
+}
diff --git a/www/plugins/calendrier_mini-2.0/javascript/jquery-ui.multidatespicker.js b/www/plugins/calendrier_mini-2.0/javascript/jquery-ui.multidatespicker.js
new file mode 100755 (executable)
index 0000000..a5787b0
--- /dev/null
@@ -0,0 +1,460 @@
+/*\r
+ * MultiDatesPicker v1.6.1\r
+ * http://multidatespickr.sourceforge.net/\r
+ * \r
+ * Copyright 2011, Luca Lauretta\r
+ * Dual licensed under the MIT or GPL version 2 licenses.\r
+ */\r
+(function( $ ){\r
+       $.extend($.ui, { multiDatesPicker: { version: "1.6.1" } });\r
+       \r
+       $.fn.multiDatesPicker = function(method) {\r
+               var mdp_arguments = arguments;\r
+               var ret = this;\r
+               var today_date = new Date();\r
+               var day_zero = new Date(0);\r
+               var mdp_events = {};\r
+               \r
+               function removeDate(date, type) {\r
+                       if(!type) type = 'picked';\r
+                       date = dateConvert.call(this, date);\r
+                       for(var i in this.multiDatesPicker.dates[type])\r
+                               if(!methods.compareDates(this.multiDatesPicker.dates[type][i], date))\r
+                                       return this.multiDatesPicker.dates[type].splice(i, 1).pop();\r
+               }\r
+               function removeIndex(index, type) {\r
+                       if(!type) type = 'picked';\r
+                       return this.multiDatesPicker.dates[type].splice(index, 1).pop();\r
+               }\r
+               function addDate(date, type, no_sort) {\r
+                       if(!type) type = 'picked';\r
+                       date = dateConvert.call(this, date);\r
+                       \r
+                       // @todo: use jQuery UI datepicker method instead\r
+                       date.setHours(0);\r
+                       date.setMinutes(0);\r
+                       date.setSeconds(0);\r
+                       date.setMilliseconds(0);\r
+                       \r
+                       if (methods.gotDate.call(this, date, type) === false) {\r
+                               this.multiDatesPicker.dates[type].push(date);\r
+                               if(!no_sort) this.multiDatesPicker.dates[type].sort(methods.compareDates);\r
+                       } \r
+               }\r
+               function sortDates(type) {\r
+                       if(!type) type = 'picked';\r
+                       this.multiDatesPicker.dates[type].sort(methods.compareDates);\r
+               }\r
+               function dateConvert(date, desired_type, date_format) {\r
+                       if(!desired_type) desired_type = 'object';/*\r
+                       if(!date_format && (typeof date == 'string')) {\r
+                               date_format = $(this).datepicker('option', 'dateFormat');\r
+                               if(!date_format) date_format = $.datepicker._defaults.dateFormat;\r
+                       }\r
+                       */\r
+                       return methods.dateConvert.call(this, date, desired_type, date_format);\r
+               }\r
+               \r
+               var methods = {\r
+                       init : function( options ) {\r
+                               var $this = $(this);\r
+                               this.multiDatesPicker.changed = false;\r
+                               \r
+                               var mdp_events = {\r
+                                       beforeShow: function(input, inst) {\r
+                                               this.multiDatesPicker.changed = false;\r
+                                               if(this.multiDatesPicker.originalBeforeShow) \r
+                                                       this.multiDatesPicker.originalBeforeShow.call(this, input, inst);\r
+                                       },\r
+                                       onSelect : function(dateText, inst) {\r
+                                               var $this = $(this);\r
+                                               this.multiDatesPicker.changed = true;\r
+                                               \r
+                                               if (dateText) {\r
+                                                       $this.multiDatesPicker('toggleDate', dateText);\r
+                                               }\r
+                                               \r
+                                               if (this.multiDatesPicker.mode == 'normal' && this.multiDatesPicker.dates.picked.length > 0 && this.multiDatesPicker.pickableRange) {\r
+                                                       var min_date = this.multiDatesPicker.dates.picked[0],\r
+                                                               max_date = new Date(min_date.getTime());\r
+                                                       \r
+                                                       methods.sumDays(max_date, this.multiDatesPicker.pickableRange-1);\r
+                                                               \r
+                                                       // counts the number of disabled dates in the range\r
+                                                       if(this.multiDatesPicker.adjustRangeToDisabled) {\r
+                                                               var c_disabled, \r
+                                                                       disabled = this.multiDatesPicker.dates.disabled.slice(0);\r
+                                                               do {\r
+                                                                       c_disabled = 0;\r
+                                                                       for(var i = 0; i < disabled.length; i++) {\r
+                                                                               if(disabled[i].getTime() <= max_date.getTime()) {\r
+                                                                                       if((min_date.getTime() <= disabled[i].getTime()) && (disabled[i].getTime() <= max_date.getTime()) ) {\r
+                                                                                               c_disabled++;\r
+                                                                                       }\r
+                                                                                       disabled.splice(i, 1);\r
+                                                                                       i--;\r
+                                                                               }\r
+                                                                       }\r
+                                                                       max_date.setDate(max_date.getDate() + c_disabled);\r
+                                                               } while(c_disabled != 0);\r
+                                                       }\r
+                                                       \r
+                                                       if(this.multiDatesPicker.maxDate && (max_date > this.multiDatesPicker.maxDate))\r
+                                                               max_date = this.multiDatesPicker.maxDate;\r
+                                                       \r
+                                                       $this\r
+                                                               .datepicker("option", "minDate", min_date)\r
+                                                               .datepicker("option", "maxDate", max_date);\r
+                                               } else {\r
+                                                       $this\r
+                                                               .datepicker("option", "minDate", this.multiDatesPicker.minDate)\r
+                                                               .datepicker("option", "maxDate", this.multiDatesPicker.maxDate);\r
+                                               }\r
+                                               \r
+                                               if(this.tagName == 'INPUT') { // for inputs\r
+                                                       $this.val(\r
+                                                               $this.multiDatesPicker('getDates', 'string')\r
+                                                       );\r
+                                               }\r
+                                               \r
+                                               if(this.multiDatesPicker.originalOnSelect && dateText)\r
+                                                       this.multiDatesPicker.originalOnSelect.call(this, dateText, inst);\r
+                                               \r
+                                               // thanks to bibendus83 -> http://sourceforge.net/tracker/?func=detail&atid=1495384&aid=3403159&group_id=358205\r
+                                               if ($this.datepicker('option', 'altField') != undefined && $this.datepicker('option', 'altField') != "") {\r
+                                                       $($this.datepicker('option', 'altField')).val(\r
+                                                               $this.multiDatesPicker('getDates', 'string')\r
+                                                       );\r
+                                               }\r
+                                       },\r
+                                       beforeShowDay : function(date) {\r
+                                               var $this = $(this),\r
+                                                       gotThisDate = $this.multiDatesPicker('gotDate', date) !== false,\r
+                                                       isDisabledCalendar = $this.datepicker('option', 'disabled'),\r
+                                                       isDisabledDate = $this.multiDatesPicker('gotDate', date, 'disabled') !== false,\r
+                                                       areAllSelected = this.multiDatesPicker.maxPicks == this.multiDatesPicker.dates.picked.length;\r
+                                               \r
+                                               var custom = [true, ''];\r
+                                               if(this.multiDatesPicker.originalBeforeShowDay)\r
+                                                       custom = this.multiDatesPicker.originalBeforeShowDay.call(this, date);\r
+                                               \r
+                                               var highlight_class = (gotThisDate ? 'ui-state-highlight' : '') + ((custom[1] && gotThisDate) ? ' ' : '') + custom[1];\r
+                                               var selectable_date = !(isDisabledCalendar || isDisabledDate || (areAllSelected && !highlight_class));\r
+                                               custom[0] = selectable_date && custom[0];\r
+                                               custom[1] = highlight_class;\r
+                                               return custom;\r
+                                       },\r
+                                       onClose: function(dateText, inst) {\r
+                                               if(this.tagName == 'INPUT' && this.multiDatesPicker.changed) {\r
+                                                       $(inst.dpDiv[0]).stop(false,true);\r
+                                                       setTimeout('$("#'+inst.id+'").datepicker("show")',50);\r
+                                               }\r
+                                               if(this.multiDatesPicker.originalOnClose) this.multiDatesPicker.originalOnClose.call(this, dateText, inst);\r
+                                       }\r
+                               };\r
+                               \r
+                               if(options) {\r
+                                       this.multiDatesPicker.originalBeforeShow = options.beforeShow;\r
+                                       this.multiDatesPicker.originalOnSelect = options.onSelect;\r
+                                       this.multiDatesPicker.originalBeforeShowDay = options.beforeShowDay;\r
+                                       this.multiDatesPicker.originalOnClose = options.onClose;\r
+                                       \r
+                                       $this.datepicker(options);\r
+                                       \r
+                                       this.multiDatesPicker.minDate = $.datepicker._determineDate(this, options.minDate, null);\r
+                                       this.multiDatesPicker.maxDate = $.datepicker._determineDate(this, options.maxDate, null);\r
+                                       \r
+                                       if(options.addDates) methods.addDates.call(this, options.addDates);\r
+                                       if(options.addDisabledDates)\r
+                                               methods.addDates.call(this, options.addDisabledDates, 'disabled');\r
+                                       \r
+                                       methods.setMode.call(this, options);\r
+                               } else {\r
+                                       $this.datepicker();\r
+                               }\r
+                               \r
+                               $this.datepicker('option', mdp_events);\r
+                               \r
+                               if(this.tagName == 'INPUT') $this.val($this.multiDatesPicker('getDates', 'string'));\r
+                               \r
+                               // Fixes the altField filled with defaultDate by default\r
+                               var altFieldOption = $this.datepicker('option', 'altField');\r
+                               if (altFieldOption) $(altFieldOption).val($this.multiDatesPicker('getDates', 'string'));\r
+                       },\r
+                       compareDates : function(date1, date2) {\r
+                               date1 = dateConvert.call(this, date1);\r
+                               date2 = dateConvert.call(this, date2);\r
+                               // return > 0 means date1 is later than date2 \r
+                               // return == 0 means date1 is the same day as date2 \r
+                               // return < 0 means date1 is earlier than date2 \r
+                               var diff = date1.getFullYear() - date2.getFullYear();\r
+                               if(!diff) {\r
+                                       diff = date1.getMonth() - date2.getMonth();\r
+                                       if(!diff) \r
+                                               diff = date1.getDate() - date2.getDate();\r
+                               }\r
+                               return diff;\r
+                       },\r
+                       sumDays : function( date, n_days ) {\r
+                               var origDateType = typeof date;\r
+                               obj_date = dateConvert.call(this, date);\r
+                               obj_date.setDate(obj_date.getDate() + n_days);\r
+                               return dateConvert.call(this, obj_date, origDateType);\r
+                       },\r
+                       dateConvert : function( date, desired_format, dateFormat ) {\r
+                               var from_format = typeof date;\r
+                               \r
+                               if(from_format == desired_format) {\r
+                                       if(from_format == 'object') {\r
+                                               try {\r
+                                                       date.getTime();\r
+                                               } catch (e) {\r
+                                                       $.error('Received date is in a non supported format!');\r
+                                                       return false;\r
+                                               }\r
+                                       }\r
+                                       return date;\r
+                               }\r
+                               \r
+                               var $this = $(this);\r
+                               if(typeof date == 'undefined') date = new Date(0);\r
+                               \r
+                               if(desired_format != 'string' && desired_format != 'object' && desired_format != 'number')\r
+                                       $.error('Date format "'+ desired_format +'" not supported!');\r
+                               \r
+                               if(!dateFormat) {\r
+                                       dateFormat = $.datepicker._defaults.dateFormat;\r
+                                       \r
+                                       // thanks to bibendus83 -> http://sourceforge.net/tracker/index.php?func=detail&aid=3213174&group_id=358205&atid=1495382\r
+                                       var dp_dateFormat = $this.datepicker('option', 'dateFormat');\r
+                                       if (dp_dateFormat) {\r
+                                               dateFormat = dp_dateFormat;\r
+                                       }\r
+                               }\r
+                               \r
+                               // converts to object as a neutral format\r
+                               switch(from_format) {\r
+                                       case 'object': break;\r
+                                       case 'string': date = $.datepicker.parseDate(dateFormat, date); break;\r
+                                       case 'number': date = new Date(date); break;\r
+                                       default: $.error('Conversion from "'+ desired_format +'" format not allowed on jQuery.multiDatesPicker');\r
+                               }\r
+                               // then converts to the desired format\r
+                               switch(desired_format) {\r
+                                       case 'object': return date;\r
+                                       case 'string': return $.datepicker.formatDate(dateFormat, date);\r
+                                       case 'number': return date.getTime();\r
+                                       default: $.error('Conversion to "'+ desired_format +'" format not allowed on jQuery.multiDatesPicker');\r
+                               }\r
+                               return false;\r
+                       },\r
+                       gotDate : function( date, type ) {\r
+                               if(!type) type = 'picked';\r
+                               for(var i = 0; i < this.multiDatesPicker.dates[type].length; i++) {\r
+                                       if(methods.compareDates.call(this, this.multiDatesPicker.dates[type][i], date) === 0) {\r
+                                               return i;\r
+                                       }\r
+                               }\r
+                               return false;\r
+                       },\r
+                       getDates : function( format, type ) {\r
+                               if(!format) format = 'string';\r
+                               if(!type) type = 'picked';\r
+                               switch (format) {\r
+                                       case 'object':\r
+                                               return this.multiDatesPicker.dates[type];\r
+                                       case 'string':\r
+                                       case 'number':\r
+                                               var o_dates = new Array();\r
+                                               for(var i in this.multiDatesPicker.dates[type])\r
+                                                       o_dates.push(\r
+                                                               dateConvert.call(\r
+                                                                       this, \r
+                                                                       this.multiDatesPicker.dates[type][i], \r
+                                                                       format\r
+                                                               )\r
+                                                       );\r
+                                               return o_dates;\r
+                                       \r
+                                       default: $.error('Format "'+format+'" not supported!');\r
+                               }\r
+                       },\r
+                       addDates : function( dates, type ) {\r
+                               if(dates.length > 0) {\r
+                                       if(!type) type = 'picked';\r
+                                       switch(typeof dates) {\r
+                                               case 'object':\r
+                                               case 'array':\r
+                                                       if(dates.length) {\r
+                                                               for(var i in dates)\r
+                                                                       if (typeof dates[i] != "function")\r
+                                                                               addDate.call(this, dates[i], type, true);\r
+                                                               sortDates.call(this, type);\r
+                                                               break;\r
+                                                       } // else does the same as 'string'\r
+                                               case 'string':\r
+                                               case 'number':\r
+                                                       addDate.call(this, dates, type);\r
+                                                       break;\r
+                                               default: \r
+                                                       $.error('Date format "'+ typeof dates +'" not allowed on jQuery.multiDatesPicker');\r
+                                       }\r
+                                       $(this).datepicker('refresh');\r
+                               } else {\r
+                                       $.error('Empty array of dates received.');\r
+                               }\r
+                       },\r
+                       removeDates : function( dates, type ) {\r
+                               if(!type) type = 'picked';\r
+                               var removed = [];\r
+                               if (Object.prototype.toString.call(dates) === '[object Array]') {\r
+                                       for(var i in dates.sort(function(a,b){return b-a})) {\r
+                                               removed.push(removeDate.call(this, dates[i], type));\r
+                                       }\r
+                               } else {\r
+                                       removed.push(removeDate.call(this, dates, type));\r
+                               }\r
+                               $(this).datepicker('refresh');\r
+                               return removed;\r
+                       },\r
+                       removeIndexes : function( indexes, type ) {\r
+                               if(!type) type = 'picked';\r
+                               var removed = [];\r
+                               if (Object.prototype.toString.call(indexes) === '[object Array]') {\r
+                                       for(var i in indexes.sort(function(a,b){return b-a})) {\r
+                                               removed.push(removeIndex.call(this, indexes[i], type));\r
+                                       }\r
+                               } else {\r
+                                       removed.push(removeIndex.call(this, indexes, type));\r
+                               }\r
+                               $(this).datepicker('refresh');\r
+                               return removed;\r
+                       },\r
+                       resetDates : function ( type ) {\r
+                               if(!type) type = 'picked';\r
+                               this.multiDatesPicker.dates[type] = [];\r
+                               $(this).datepicker('refresh');\r
+                       },\r
+                       toggleDate : function( date, type ) {\r
+                               if(!type) type = 'picked';\r
+                               \r
+                               switch(this.multiDatesPicker.mode) {\r
+                                       case 'daysRange':\r
+                                               this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled dates\r
+                                               var end = this.multiDatesPicker.autoselectRange[1];\r
+                                               var begin = this.multiDatesPicker.autoselectRange[0];\r
+                                               if(end < begin) { // switch\r
+                                                       end = this.multiDatesPicker.autoselectRange[0];\r
+                                                       begin = this.multiDatesPicker.autoselectRange[1];\r
+                                               }\r
+                                               for(var i = begin; i < end; i++) \r
+                                                       methods.addDates.call(this, methods.sumDays(date, i), type);\r
+                                               break;\r
+                                       default:\r
+                                               if(methods.gotDate.call(this, date) === false) // adds dates\r
+                                                       methods.addDates.call(this, date, type);\r
+                                               else // removes dates\r
+                                                       methods.removeDates.call(this, date, type);\r
+                                               break;\r
+                               }\r
+                       }, \r
+                       setMode : function( options ) {\r
+                               var $this = $(this);\r
+                               if(options.mode) this.multiDatesPicker.mode = options.mode;\r
+                               \r
+                               switch(this.multiDatesPicker.mode) {\r
+                                       case 'normal':\r
+                                               for(option in options)\r
+                                                       switch(option) {\r
+                                                               case 'maxPicks':\r
+                                                               case 'minPicks':\r
+                                                               case 'pickableRange':\r
+                                                               case 'adjustRangeToDisabled':\r
+                                                                       this.multiDatesPicker[option] = options[option];\r
+                                                                       break;\r
+                                                               //default: $.error('Option ' + option + ' ignored for mode "'.options.mode.'".');\r
+                                                       }\r
+                                       break;\r
+                                       case 'daysRange':\r
+                                       case 'weeksRange':\r
+                                               var mandatory = 1;\r
+                                               for(option in options)\r
+                                                       switch(option) {\r
+                                                               case 'autoselectRange':\r
+                                                                       mandatory--;\r
+                                                               case 'pickableRange':\r
+                                                               case 'adjustRangeToDisabled':\r
+                                                                       this.multiDatesPicker[option] = options[option];\r
+                                                                       break;\r
+                                                               //default: $.error('Option ' + option + ' does not exist for setMode on jQuery.multiDatesPicker');\r
+                                                       }\r
+                                               if(mandatory > 0) $.error('Some mandatory options not specified!');\r
+                                       break;\r
+                               }\r
+                               \r
+                               /*\r
+                               if(options.pickableRange) {\r
+                                       $this.datepicker("option", "maxDate", options.pickableRange);\r
+                                       $this.datepicker("option", "minDate", this.multiDatesPicker.minDate);\r
+                               }\r
+                               */\r
+                               \r
+                               if(mdp_events.onSelect)\r
+                                       mdp_events.onSelect();\r
+                               $this.datepicker('refresh');\r
+                       }\r
+               };\r
+               \r
+               this.each(function() {\r
+                       if (!this.multiDatesPicker) {\r
+                               this.multiDatesPicker = {\r
+                                       dates: {\r
+                                               picked: [],\r
+                                               disabled: []\r
+                                       },\r
+                                       mode: 'normal',\r
+                                       adjustRangeToDisabled: true\r
+                               };\r
+                       }\r
+                       \r
+                       if(methods[method]) {\r
+                               var exec_result = methods[method].apply(this, Array.prototype.slice.call(mdp_arguments, 1));\r
+                               switch(method) {\r
+                                       case 'getDates':\r
+                                       case 'removeDates':\r
+                                       case 'gotDate':\r
+                                       case 'sumDays':\r
+                                       case 'compareDates':\r
+                                       case 'dateConvert':\r
+                                               ret = exec_result;\r
+                               }\r
+                               return exec_result;\r
+                       } else if( typeof method === 'object' || ! method ) {\r
+                               return methods.init.apply(this, mdp_arguments);\r
+                       } else {\r
+                               $.error('Method ' +  method + ' does not exist on jQuery.multiDatesPicker');\r
+                       }\r
+                       return false;\r
+               });\r
+               \r
+               if(method != 'gotDate' && method != 'getDates') {\r
+                       aaaa = 1;\r
+               }\r
+               \r
+               return ret;\r
+       };\r
+\r
+       var PROP_NAME = 'multiDatesPicker';\r
+       var dpuuid = new Date().getTime();\r
+       var instActive;\r
+\r
+       $.multiDatesPicker = {version: false};\r
+       //$.multiDatesPicker = new MultiDatesPicker(); // singleton instance\r
+       $.multiDatesPicker.initialized = false;\r
+       $.multiDatesPicker.uuid = new Date().getTime();\r
+       $.multiDatesPicker.version = $.ui.multiDatesPicker.version;\r
+\r
+       // Workaround for #4055\r
+       // Add another global to avoid noConflict issues with inline event handlers\r
+       window['DP_jQuery_' + dpuuid] = $;\r
+})( jQuery );
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical.xml b/www/plugins/calendrier_mini-2.0/lang/minical.xml
new file mode 100644 (file)
index 0000000..b7811ba
--- /dev/null
@@ -0,0 +1,13 @@
+<traduction module="minical" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/calendrier_mini/trunk/lang/" reference="fr">
+       <langue code="en" url="http://trad.spip.net/tradlang_module/minical?lang_cible=en">
+               <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
+               <traducteur nom="Martin McCaffery" lien="http://trad.spip.net/auteur/martin-mccaffery" />
+       </langue>
+       <langue code="es" url="http://trad.spip.net/tradlang_module/minical?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fr" />
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/minical?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_ar.php b/www/plugins/calendrier_mini-2.0/lang/minical_ar.php
new file mode 100644 (file)
index 0000000..91b9bbf
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/minical?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'لا شيء لهذا الشهر',
+
+       // M
+       'mois_precedent' => 'الشهر السابق',
+       'mois_suivant' => 'الشهر التالي'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_ca.php b/www/plugins/calendrier_mini-2.0/lang/minical_ca.php
new file mode 100644 (file)
index 0000000..932efbb
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.org/tradlang_module/minical?lang_cible=ca
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'Rien pour ce mois', # NEW
+
+       // D
+       'date_jour_abbr_1' => 'dg',
+       'date_jour_abbr_2' => 'dl',
+       'date_jour_abbr_3' => 'dt',
+       'date_jour_abbr_4' => 'dc',
+       'date_jour_abbr_5' => 'dj',
+       'date_jour_abbr_6' => 'dv',
+       'date_jour_abbr_7' => 'db',
+
+       // M
+       'mois_precedent' => 'Mois précédent', # NEW
+       'mois_suivant' => 'Mois suivant' # NEW
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_de.php b/www/plugins/calendrier_mini-2.0/lang/minical_de.php
new file mode 100644 (file)
index 0000000..9942b56
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.org/tradlang_module/minical?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'Rien pour ce mois', # NEW
+
+       // D
+       'date_jour_abbr_1' => 'So',
+       'date_jour_abbr_2' => 'Mo',
+       'date_jour_abbr_3' => 'Di',
+       'date_jour_abbr_4' => 'Mi',
+       'date_jour_abbr_5' => 'Do',
+       'date_jour_abbr_6' => 'Fr',
+       'date_jour_abbr_7' => 'Sa',
+
+       // M
+       'mois_precedent' => 'Mois précédent', # NEW
+       'mois_suivant' => 'Mois suivant' # NEW
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_en.php b/www/plugins/calendrier_mini-2.0/lang/minical_en.php
new file mode 100644 (file)
index 0000000..660e033
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/minical?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'Nothing for this month',
+
+       // C
+       'config_titre_calendriermini' => 'Mini-Calendar',
+
+       // L
+       'label_affichage_hors_mois' => 'Days displayed',
+       'label_affichage_hors_mois_0' => 'Hide days of previous and next months',
+       'label_affichage_hors_mois_1' => 'Display days of previous and next months',
+       'label_changement_rapide' => 'Navigation',
+       'label_changement_rapide_0' => 'Enable quick selection of the month or year.',
+       'label_changement_rapide_1' => 'Enable quick selection of the month or year.',
+       'label_format_jour' => 'Days format',
+       'label_format_jour_abbr' => 'Short',
+       'label_format_jour_initiale' => 'Initial letter',
+       'label_jour1' => 'First day of the week',
+
+       // M
+       'mois_precedent' => 'Previous month',
+       'mois_suivant' => 'Next month'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_es.php b/www/plugins/calendrier_mini-2.0/lang/minical_es.php
new file mode 100644 (file)
index 0000000..77fa3d2
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/minical?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'Nada para este mes',
+
+       // C
+       'config_titre_calendriermini' => 'Mini-Calendario',
+
+       // L
+       'label_affichage_hors_mois' => 'Días mostrados',
+       'label_affichage_hors_mois_0' => 'Ocultar los días del mes precedente y siguiente',
+       'label_affichage_hors_mois_1' => 'Mostrar los días del mes precedente y siguiente',
+       'label_changement_rapide' => 'Navegación',
+       'label_changement_rapide_0' => 'Desactivar la selección rápida del mes o del año',
+       'label_changement_rapide_1' => 'Activar la selección rápida del mes o del año',
+       'label_format_jour' => 'Formato de los días',
+       'label_format_jour_abbr' => 'Corto',
+       'label_format_jour_initiale' => 'Inicial',
+       'label_jour1' => 'Primer día de la semana',
+
+       // M
+       'mois_precedent' => 'Mes precedente',
+       'mois_suivant' => 'Mes siguiente'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_fa.php b/www/plugins/calendrier_mini-2.0/lang/minical_fa.php
new file mode 100644 (file)
index 0000000..4c4a739
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/minical?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'اين ماه برنامه‌اي نيست',
+
+       // M
+       'mois_precedent' => 'ماه قبل',
+       'mois_suivant' => 'ماه بعد'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_fr.php b/www/plugins/calendrier_mini-2.0/lang/minical_fr.php
new file mode 100644 (file)
index 0000000..9d72de2
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/calendrier_mini/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'Rien pour ce mois',
+
+       // C
+       'config_titre_calendriermini' => 'Mini-Calendrier',
+
+       // L
+       'label_affichage_hors_mois' => 'Jours affichés',
+       'label_affichage_hors_mois_0' => 'Masquer les jours des mois précédent et suivant',
+       'label_affichage_hors_mois_1' => 'Afficher les jours des mois précédent et suivant',
+       'label_changement_rapide' => 'Navigation',
+       'label_changement_rapide_0' => 'Désactiver la sélection rapide du mois ou de l\'année',
+       'label_changement_rapide_1' => 'Activer la sélection rapide du mois ou de l\'année',
+       'label_format_jour' => 'Format des jours',
+       'label_format_jour_abbr' => 'Court',
+       'label_format_jour_initiale' => 'Initiale',
+       'label_jour1' => 'Premier jour de la semaine',
+
+       // M
+       'mois_precedent' => 'Mois précédent',
+       'mois_suivant' => 'Mois suivant'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_it.php b/www/plugins/calendrier_mini-2.0/lang/minical_it.php
new file mode 100644 (file)
index 0000000..fde1071
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.org/tradlang_module/minical?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'Rien pour ce mois', # NEW
+
+       // D
+       'date_jour_abbr_1' => 'dom',
+       'date_jour_abbr_2' => 'lun',
+       'date_jour_abbr_3' => 'mar',
+       'date_jour_abbr_4' => 'mer',
+       'date_jour_abbr_5' => 'giov',
+       'date_jour_abbr_6' => 'ven',
+       'date_jour_abbr_7' => 'sab',
+
+       // M
+       'mois_precedent' => 'Mois précédent', # NEW
+       'mois_suivant' => 'Mois suivant' # NEW
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_sk.php b/www/plugins/calendrier_mini-2.0/lang/minical_sk.php
new file mode 100644 (file)
index 0000000..e496dd9
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/minical?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'Nič na tento mesiac',
+
+       // C
+       'config_titre_calendriermini' => 'Minikalendár',
+
+       // L
+       'label_affichage_hors_mois' => 'Zobrazené dni',
+       'label_affichage_hors_mois_0' => 'Schovať dni predchádzajúceho a ďalšieho mesiaca',
+       'label_affichage_hors_mois_1' => 'Zobraziť dni predchádzajúceho a nasledujúceho mesiaca',
+       'label_changement_rapide' => 'Navigácia',
+       'label_changement_rapide_0' => 'Deaktivovať rýchly výber mesiaca alebo roka',
+       'label_changement_rapide_1' => 'Aktivovať rýchly výber mesiaca alebo roka',
+       'label_format_jour' => 'Formát dní',
+       'label_format_jour_abbr' => 'Krátky',
+       'label_format_jour_initiale' => 'Začiatočné písmeno',
+       'label_jour1' => 'Prvý deň v týždni',
+
+       // M
+       'mois_precedent' => 'Predchádzajúci mesiac',
+       'mois_suivant' => 'Ďalší mesiac'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/minical_sl.php b/www/plugins/calendrier_mini-2.0/lang/minical_sl.php
new file mode 100644 (file)
index 0000000..188f63b
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/minical?lang_cible=sl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'aucune_date' => 'Nič v tem mesecu',
+
+       // M
+       'mois_precedent' => 'Prejšnji mesec',
+       'mois_suivant' => 'Naslednji mesec'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini.xml b/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini.xml
new file mode 100644 (file)
index 0000000..8894bca
--- /dev/null
@@ -0,0 +1,15 @@
+<traduction module="paquet-calendriermini" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/calendrier_mini/trunk/lang/" reference="fr">
+       <langue code="de" url="http://trad.spip.net/tradlang_module/paquet-calendriermini?lang_cible=de">
+               <traducteur nom="klaus++" lien="http://trad.spip.net/auteur/klaus" />
+       </langue>
+       <langue code="en" url="http://trad.spip.net/tradlang_module/paquet-calendriermini?lang_cible=en">
+               <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
+       </langue>
+       <langue code="es" url="http://trad.spip.net/tradlang_module/paquet-calendriermini?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fr" />
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-calendriermini?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_de.php b/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_de.php
new file mode 100644 (file)
index 0000000..f602696
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-calendriermini?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'calendriermini_description' => '#CALENDRIER_MINI zeigt einen Kalender in der Art von DotClear an, der zu den Stilen dieses Blogsystems passt.
+_ Dazu kommen weitere Elemente wie Tags, Kriterien, Modelle, ...',
+       'calendriermini_nom' => 'Minikalender',
+       'calendriermini_slogan' => 'Stellt den Tag #CALENDRIER_MINI bereit'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_en.php b/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_en.php
new file mode 100644 (file)
index 0000000..53f1717
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-calendriermini?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'calendriermini_description' => '#CALENDRIER_MINI displays a calendar designed as dotclear\'s one and therefore compatible with the styles from this blog system.
+_ Other tools are added, such as tags, criteria, models...',
+       'calendriermini_nom' => 'Mini Calendar',
+       'calendriermini_slogan' => 'Allow to use a #CALENDRIER_MINI tag'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_es.php b/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_es.php
new file mode 100644 (file)
index 0000000..379d03d
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-calendriermini?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'calendriermini_description' => '#CALENDRIER_MINI muestra un calendario en el diseño derivado de dotclear y por lo tanto compatible con los estilos derivados de este sistema de blog.
+_ Le son agregados otros elementos como etiquetas, criterios, modelos...',
+       'calendriermini_nom' => 'Mini Calendario',
+       'calendriermini_slogan' => 'Permite el uso de una etiqueta #CALENDRIER_MINI'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_fr.php b/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_fr.php
new file mode 100644 (file)
index 0000000..467dc05
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/calendrier_mini/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'calendriermini_description' => '#CALENDRIER_MINI affiche un calendrier au design issu de dotclear et donc compatible avec les styles issus de ce système de blog.
+_ Lui sont adjoints d\'autre éléments, tels que balises, critères, modèles...',
+       'calendriermini_nom' => 'Mini Calendrier',
+       'calendriermini_slogan' => 'Permet l\'utilisation d\'une balise #CALENDRIER_MINI'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_sk.php b/www/plugins/calendrier_mini-2.0/lang/paquet-calendriermini_sk.php
new file mode 100644 (file)
index 0000000..73cf016
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-calendriermini?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'calendriermini_description' => '#CALENDRIER_MINI zobrazí kalendár s dizajnom od dotclear, a preto je kompatibilný so štýlmi tohto  publikačného systému pre blogy.
+_ Sám pomáha iným objektom, ako sú tagy, kritériá, šablóny atď.
+.',
+       'calendriermini_nom' => 'Minikalendár',
+       'calendriermini_slogan' => 'Umožňuje používať tag #CALENDRIER_MINI'
+);
+
+?>
diff --git a/www/plugins/calendrier_mini-2.0/minical-32.png b/www/plugins/calendrier_mini-2.0/minical-32.png
new file mode 100644 (file)
index 0000000..9880597
Binary files /dev/null and b/www/plugins/calendrier_mini-2.0/minical-32.png differ
diff --git a/www/plugins/calendrier_mini-2.0/modeles/archives_mensuelles.html b/www/plugins/calendrier_mini-2.0/modeles/archives_mensuelles.html
new file mode 100644 (file)
index 0000000..a8d8eb7
--- /dev/null
@@ -0,0 +1,16 @@
+<B_archives_mensuelles>
+<div id="archives" class="rubriques">
+  <h2 class="menu-titre"><:archives|ucfirst:></h2>
+  <ul>
+   <BOUCLE_archives_mensuelles(ARTICLES){branche ?}{lang}{par date}{inverse}>[
+   <li>
+   <a href="[(#ENV{self}|parametre_url{archives,[(#DATE|affdate{'Y-m'})]})]">[
+   (#ENV{archives}|=={[(#DATE|affdate{'Y-m'})]}|?{<b>})
+   ](#DATE|affdate{'Y-m'}|unique|affdate_mois_annee)[
+   (#ENV{archives}|=={[(#DATE|affdate{'Y-m'})]}|?{</b>})
+   ]</a>
+   </li>
+   ]</BOUCLE_archives_mensuelles>
+  </ul>
+</div>
+</B_archives_mensuelles>
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/modeles/rubrique_calendrier.html b/www/plugins/calendrier_mini-2.0/modeles/rubrique_calendrier.html
new file mode 100644 (file)
index 0000000..41223d0
--- /dev/null
@@ -0,0 +1 @@
+#CALENDRIER_MINI
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/modeles/select_archives_mensuelles.html b/www/plugins/calendrier_mini-2.0/modeles/select_archives_mensuelles.html
new file mode 100644 (file)
index 0000000..bad7c19
--- /dev/null
@@ -0,0 +1,26 @@
+<B_archives_mensuelles>
+<div id="form_archives" class="formulaire_spip">
+       <form action='#ENV{self}' method='get'>
+               [(#ENV{self}|form_hidden)]
+               <ul>
+                       <li class="fieldset">
+                               <h3 class="legend"><:archives|ucfirst:></h3>
+                               <fieldset>
+                                       <ul>
+                                               <li class="editer editer_archives">
+                                                       <label for="archives"><:date:></label>
+                                                       <select class="forml" name='archives'>
+                                                       <BOUCLE_archives_mensuelles(ARTICLES){branche ?}{lang}{par date}{inverse}>[
+                                                               <option value='[(#DATE|affdate{'Y-m'})]'[
+                                                               (#ENV{archives}|=={[(#DATE|affdate{'Y-m'})]}|?{selected="selected"})
+                                                               ]>(#DATE|affdate{'Y-m'}|unique{select}|affdate_mois_annee)</option>
+                                                       ]</BOUCLE_archives_mensuelles>
+                                                       </select>
+                                               </li>
+                                       </ul>
+                               </fieldset>
+                       </li>
+               </ul>
+       </form>
+</div>
+</B_archives_mensuelles>
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/paquet.xml b/www/plugins/calendrier_mini-2.0/paquet.xml
new file mode 100644 (file)
index 0000000..9685fa0
--- /dev/null
@@ -0,0 +1,20 @@
+<paquet
+       prefix="calendriermini"
+       categorie="date"
+       version="2.3.4"
+       etat="test"
+       compatibilite="[3.0.0-beta;3.0.99]"
+       logo="minical-32.png"
+       documentation="http://www.spip-contrib.net/Calendrier-Mini-2-0"
+>      
+
+       <nom>Mini Calendrier</nom>
+       <!-- Permet l'utilisation d'une balise #CALENDRIER_MINI -->
+
+       <auteur mail="james@rezo.net">James</auteur>
+
+       <credit lien="http://tempest.deviantart.com/">Tempest pour l'icone sous licence CC BY-NC-ND.</credit>
+       <copyright>2006-2012</copyright>
+
+       <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</licence>
+</paquet>
diff --git a/www/plugins/calendrier_mini-2.0/prive/squelettes/contenu/configurer_calendriermini.html b/www/plugins/calendrier_mini-2.0/prive/squelettes/contenu/configurer_calendriermini.html
new file mode 100644 (file)
index 0000000..0b3b36b
--- /dev/null
@@ -0,0 +1,4 @@
+<h1 class="grostitre"><:minical:config_titre_calendriermini:></h1>
+<div class="ajax">
+       #FORMULAIRE_CONFIGURER_CALENDRIERMINI
+</div>
\ No newline at end of file
diff --git a/www/plugins/calendrier_mini-2.0/svn.revision b/www/plugins/calendrier_mini-2.0/svn.revision
new file mode 100644 (file)
index 0000000..5ecbd66
--- /dev/null
@@ -0,0 +1,10 @@
+<svn_revision>
+<text_version>
+Origine: file:///home/svn/repository/spip-zone/_plugins_/calendrier_mini/trunk
+Revision: 69463
+Dernier commit: 2013-01-28 03:41:28 +0100 
+</text_version>
+<origine>file:///home/svn/repository/spip-zone/_plugins_/calendrier_mini/trunk</origine>
+<revision>69463</revision>
+<commit>2013-01-28 03:41:28 +0100 </commit>
+</svn_revision>
\ No newline at end of file
index ba9445c..3068a2e 100755 (executable)
     <categorie>squelette</categorie>
     <necessite id="SPIP" version="[3.0.0;]" />
     <necessite id="Z" version= "[1.7.21;]" />
-    <necessite id="multilang" version= "[0.9.2;]" />
-    <necessite id="mll" version= "[1.1.9;]" />
-    <necessite id="menus" version= "[1.4.5;]" />
-    <necessite id="zengarden" version= "[2.5.2;]" />
-    <necessite id="crayons" version= "[1.16.1;]" />
     <necessite id="abomailmans" version= "[1.1.4;]" />
+    <necessite id="agenda" version= "[3.12.1;]" />
+    <necessite id="carte_de_sites" version= "[1.1.3;]" />
     <necessite id="compositions" version= "[3.3.2;]" />
-    <necessite id="typoenluminee" version= "[3.3.2;]" />
+    <necessite id="crayons" version= "[1.16.1;]" />
     <necessite id="facteur" version= "[2.4.5;]" />
-    <necessite id="rssarticle" version= "[1.1.0;]" />
     <necessite id="formidable" version= "[1.3.6;]" />
+    <necessite id="menus" version= "[1.4.5;]" />
+    <necessite id="mll" version= "[1.1.9;]" />
+    <necessite id="multilang" version= "[0.9.2;]" />
     <necessite id="nospam" version= "[1.3.0;]" />
     <necessite id="notifications" version= "[3.0.10;]" />
     <necessite id="odt2spip" version= "[2.0.1;]" />
     <necessite id="piwik" version= "[0.6.0;]" />
+    <necessite id="rssarticle" version= "[1.1.0;]" />
     <necessite id="seo" version= "[1.8.1;]" />
+    <necessite id="typoenluminee" version= "[3.3.2;]" />
+    <necessite id="zengarden" version= "[2.5.2;]" />
 </plugin>