[PLUGINS] +les plugins de bases
authorLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Wed, 5 Jun 2013 09:53:51 +0000 (11:53 +0200)
committerLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Wed, 5 Jun 2013 09:53:51 +0000 (11:53 +0200)
679 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/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/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/beespip/base/beespip_upgrade.php [new file with mode: 0755]
www/plugins/beespip/beespip_administrations.php [new file with mode: 0755]
www/plugins/beespip/beespip_headline.php [new file with mode: 0755]
www/plugins/beespip/beespip_options.php [new file with mode: 0755]
www/plugins/beespip/body.html [new file with mode: 0755]
www/plugins/beespip/contenu/article-doc_droite.html [new file with mode: 0755]
www/plugins/beespip/contenu/article-doc_droite.xml [new file with mode: 0755]
www/plugins/beespip/contenu/article-logo_droite.html [new file with mode: 0755]
www/plugins/beespip/contenu/article-logo_droite.xml [new file with mode: 0755]
www/plugins/beespip/contenu/article-pleine_largeur.html [new file with mode: 0755]
www/plugins/beespip/contenu/article-pleine_largeur.xml [new file with mode: 0755]
www/plugins/beespip/contenu/article.html [new file with mode: 0755]
www/plugins/beespip/contenu/auteur.html [new file with mode: 0755]
www/plugins/beespip/contenu/breve.html [new file with mode: 0755]
www/plugins/beespip/contenu/mot.html [new file with mode: 0755]
www/plugins/beespip/contenu/page-401.html [new file with mode: 0755]
www/plugins/beespip/contenu/page-404.html [new file with mode: 0755]
www/plugins/beespip/contenu/page-forum.html [new file with mode: 0755]
www/plugins/beespip/contenu/page-login.html [new file with mode: 0755]
www/plugins/beespip/contenu/page-plan.html [new file with mode: 0755]
www/plugins/beespip/contenu/page-recherche.html [new file with mode: 0755]
www/plugins/beespip/contenu/page-sommaire.html [new file with mode: 0755]
www/plugins/beespip/contenu/page-spip_pass.html [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique-a3cols.html [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique-a3cols.xml [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique-articles_2cols.html [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique-articles_2cols.xml [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique-articles_4cols.html [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique-articles_4cols.xml [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique-signets.html [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique-signets.xml [new file with mode: 0755]
www/plugins/beespip/contenu/rubrique.html [new file with mode: 0755]
www/plugins/beespip/contenu/site.html [new file with mode: 0755]
www/plugins/beespip/css/960.css [new file with mode: 0755]
www/plugins/beespip/css/easyslider.css.html [new file with mode: 0755]
www/plugins/beespip/css/easyslider2.css.html [new file with mode: 0755]
www/plugins/beespip/css/reset.css [new file with mode: 0755]
www/plugins/beespip/css/structure.css.html [new file with mode: 0755]
www/plugins/beespip/css/styles.css.html [new file with mode: 0755]
www/plugins/beespip/css/superfish.css.html [new file with mode: 0755]
www/plugins/beespip/extra/article-pleine_largeur.html [new file with mode: 0755]
www/plugins/beespip/extra/article.html [new file with mode: 0755]
www/plugins/beespip/extra/auteur.html [new file with mode: 0755]
www/plugins/beespip/extra/breve.html [new file with mode: 0755]
www/plugins/beespip/extra/mot.html [new file with mode: 0755]
www/plugins/beespip/extra/page-sommaire.html [new file with mode: 0755]
www/plugins/beespip/extra/rubrique-articles_2cols.html [new file with mode: 0755]
www/plugins/beespip/extra/rubrique-articles_4cols.html [new file with mode: 0755]
www/plugins/beespip/extra/rubrique-signets.html [new file with mode: 0755]
www/plugins/beespip/extra/rubrique.html [new file with mode: 0755]
www/plugins/beespip/extra/site.html [new file with mode: 0755]
www/plugins/beespip/fonds/cfg_beespip_config.html [new file with mode: 0755]
www/plugins/beespip/fonds/cfg_beespip_couleur.html [new file with mode: 0755]
www/plugins/beespip/fonds/cfg_beespip_options_affichage.html [new file with mode: 0755]
www/plugins/beespip/formulaires/calendrier_mini.html [new file with mode: 0755]
www/plugins/beespip/formulaires/configurer_beespip.html [new file with mode: 0755]
www/plugins/beespip/formulaires/configurer_beespip_couleur.html [new file with mode: 0755]
www/plugins/beespip/formulaires/configurer_beespip_options_affichage.html [new file with mode: 0755]
www/plugins/beespip/formulaires/recherche.html [new file with mode: 0755]
www/plugins/beespip/head/page-agenda.html [new file with mode: 0755]
www/plugins/beespip/images/article_une0.png [new file with mode: 0755]
www/plugins/beespip/images/article_une1.png [new file with mode: 0755]
www/plugins/beespip/images/article_une2.png [new file with mode: 0755]
www/plugins/beespip/images/article_une3.png [new file with mode: 0755]
www/plugins/beespip/images/article_une4.png [new file with mode: 0755]
www/plugins/beespip/images/bg_sous_menu.png [new file with mode: 0755]
www/plugins/beespip/images/blocune_accroche.png [new file with mode: 0755]
www/plugins/beespip/images/blocune_accroche_ie.png [new file with mode: 0755]
www/plugins/beespip/images/entete.png [new file with mode: 0755]
www/plugins/beespip/images/fond_pour_puce_niv1.png [new file with mode: 0755]
www/plugins/beespip/images/fond_pour_puce_niv2.png [new file with mode: 0755]
www/plugins/beespip/images/fond_pour_puce_niv3.png [new file with mode: 0755]
www/plugins/beespip/images/fond_pour_puce_niv4.png [new file with mode: 0755]
www/plugins/beespip/images/fond_vide_pour_puce.gif [new file with mode: 0755]
www/plugins/beespip/images/gravatar.jpg [new file with mode: 0755]
www/plugins/beespip/images/liste1_niv1.png [new file with mode: 0755]
www/plugins/beespip/images/liste1_niv2.png [new file with mode: 0755]
www/plugins/beespip/images/liste1_niv3.png [new file with mode: 0755]
www/plugins/beespip/images/liste1_niv4.png [new file with mode: 0755]
www/plugins/beespip/images/recherche.gif [new file with mode: 0755]
www/plugins/beespip/images/recherche.png [new file with mode: 0755]
www/plugins/beespip/images/transp.gif [new file with mode: 0755]
www/plugins/beespip/inclure/agenda.html [new file with mode: 0755]
www/plugins/beespip/inclure/articles_liste.html [new file with mode: 0755]
www/plugins/beespip/inclure/articles_populaires.html [new file with mode: 0755]
www/plugins/beespip/inclure/articles_une_colonne_droite.html [new file with mode: 0755]
www/plugins/beespip/inclure/articles_une_recents.html [new file with mode: 0755]
www/plugins/beespip/inclure/articles_une_slide.html [new file with mode: 0755]
www/plugins/beespip/inclure/documents.html [new file with mode: 0755]
www/plugins/beespip/inclure/entete.html [new file with mode: 0755]
www/plugins/beespip/inclure/evenements.html [new file with mode: 0755]
www/plugins/beespip/inclure/forum.html [new file with mode: 0755]
www/plugins/beespip/inclure/head.html [new file with mode: 0755]
www/plugins/beespip/inclure/infos_auteurs_dates.html [new file with mode: 0755]
www/plugins/beespip/inclure/liens_evitement.html [new file with mode: 0755]
www/plugins/beespip/inclure/menu.html [new file with mode: 0755]
www/plugins/beespip/inclure/menu_rubrique.html [new file with mode: 0755]
www/plugins/beespip/inclure/menu_standard.html [new file with mode: 0755]
www/plugins/beespip/inclure/mot_breves.html [new file with mode: 0755]
www/plugins/beespip/inclure/mot_rubriques.html [new file with mode: 0755]
www/plugins/beespip/inclure/mot_sites.html [new file with mode: 0755]
www/plugins/beespip/inclure/page_lessites.html [new file with mode: 0755]
www/plugins/beespip/inclure/petition.html [new file with mode: 0755]
www/plugins/beespip/inclure/pied.html [new file with mode: 0755]
www/plugins/beespip/js/easySlider1.7.js [new file with mode: 0755]
www/plugins/beespip/js/mColorPicker.min.js [new file with mode: 0755]
www/plugins/beespip/js/superfish.js [new file with mode: 0755]
www/plugins/beespip/lang/beespip_de.php [new file with mode: 0755]
www/plugins/beespip/lang/beespip_en.php [new file with mode: 0755]
www/plugins/beespip/lang/beespip_fr.php [new file with mode: 0755]
www/plugins/beespip/lang/beespip_it.php [new file with mode: 0755]
www/plugins/beespip/lang/paquet-beespip_fr.php [new file with mode: 0755]
www/plugins/beespip/modeles/image.html [new file with mode: 0755]
www/plugins/beespip/modeles/img.html [new file with mode: 0755]
www/plugins/beespip/modeles/lessites.html [new file with mode: 0755]
www/plugins/beespip/paquet.xml [new file with mode: 0755]
www/plugins/beespip/plugin.xml [new file with mode: 0755]
www/plugins/beespip/prive/squelettes/contenu/configurer_beespip.html [new file with mode: 0755]
www/plugins/beespip/prive/squelettes/navigation/configurer_beespip.html [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/beespip-16.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/beespip-24.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/beespip-32.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/beespip-64.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/beespip_config-16.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/beespip_config-24.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/beespip_config-32.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/beespip_config-64.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/color.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/couleur.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/entete.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/grid.gif [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/meta100.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/options.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/page_accueil.png [new file with mode: 0755]
www/plugins/beespip/prive/themes/spip/images/picker.png [new file with mode: 0755]
www/plugins/beespip/structure.html [new file with mode: 0755]
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/menus_1/action/editer_menu.php [new file with mode: 0644]
www/plugins/menus_1/action/editer_menus_entree.php [new file with mode: 0644]
www/plugins/menus_1/action/exporter_menu.php [new file with mode: 0644]
www/plugins/menus_1/action/supprimer_menu.php [new file with mode: 0644]
www/plugins/menus_1/balise/menus_afficher_entree.php [new file with mode: 0644]
www/plugins/menus_1/base/menus_tables.php [new file with mode: 0644]
www/plugins/menus_1/css/menuspip.css [new file with mode: 0644]
www/plugins/menus_1/formulaires/configurer_menus.html [new file with mode: 0644]
www/plugins/menus_1/formulaires/configurer_menus.php [new file with mode: 0644]
www/plugins/menus_1/formulaires/editer_menu.html [new file with mode: 0644]
www/plugins/menus_1/formulaires/editer_menu.php [new file with mode: 0644]
www/plugins/menus_1/formulaires/editer_menus_entree.html [new file with mode: 0644]
www/plugins/menus_1/formulaires/editer_menus_entree.php [new file with mode: 0644]
www/plugins/menus_1/formulaires/inc-menus_entrees.html [new file with mode: 0644]
www/plugins/menus_1/formulaires/inc-menus_entrees_inexistantes.html [new file with mode: 0644]
www/plugins/menus_1/formulaires/inc-nouvelle_entree-1.html [new file with mode: 0644]
www/plugins/menus_1/formulaires/inc-nouvelle_entree-2.html [new file with mode: 0644]
www/plugins/menus_1/images/export.png [new file with mode: 0644]
www/plugins/menus_1/images/menus-16.png [new file with mode: 0644]
www/plugins/menus_1/images/menus-24.png [new file with mode: 0644]
www/plugins/menus_1/images/menus-48.png [new file with mode: 0644]
www/plugins/menus_1/images/menus-nouveau-24.png [new file with mode: 0644]
www/plugins/menus_1/images/menus-nouveau-48.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_accueil.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_action_ajouter.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_action_bas.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_action_haut.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_action_modifier.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_action_supprimer.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_articles_rubrique.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_groupes_mots.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_lien.png [new file with mode: 0755]
www/plugins/menus_1/images/menus_logout.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_mapage.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_mots.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_objet.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_page_speciale.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_rubriques.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_secteurlangue.png [new file with mode: 0644]
www/plugins/menus_1/images/menus_texte_libre.png [new file with mode: 0644]
www/plugins/menus_1/inc/menus.php [new file with mode: 0644]
www/plugins/menus_1/inc/menus_autoriser.php [new file with mode: 0644]
www/plugins/menus_1/inclure/barre-nav.html [new file with mode: 0644]
www/plugins/menus_1/inclure/menu.html [new file with mode: 0644]
www/plugins/menus_1/inclure/nav.html [new file with mode: 0644]
www/plugins/menus_1/lang/menus.xml [new file with mode: 0644]
www/plugins/menus_1/lang/menus_ar.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_ca.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_de.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_en.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_es.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_fa.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_fr.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_it.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_ru.php [new file with mode: 0644]
www/plugins/menus_1/lang/menus_sk.php [new file with mode: 0644]
www/plugins/menus_1/lang/paquet-menus.xml [new file with mode: 0644]
www/plugins/menus_1/lang/paquet-menus_ar.php [new file with mode: 0644]
www/plugins/menus_1/lang/paquet-menus_de.php [new file with mode: 0644]
www/plugins/menus_1/lang/paquet-menus_en.php [new file with mode: 0644]
www/plugins/menus_1/lang/paquet-menus_es.php [new file with mode: 0644]
www/plugins/menus_1/lang/paquet-menus_fr.php [new file with mode: 0644]
www/plugins/menus_1/lang/paquet-menus_it.php [new file with mode: 0644]
www/plugins/menus_1/lang/paquet-menus_sk.php [new file with mode: 0644]
www/plugins/menus_1/menu.html [new file with mode: 0644]
www/plugins/menus_1/menus/accueil.html [new file with mode: 0644]
www/plugins/menus_1/menus/accueil.xml [new file with mode: 0644]
www/plugins/menus_1/menus/articles_rubrique.html [new file with mode: 0644]
www/plugins/menus_1/menus/articles_rubrique.xml [new file with mode: 0644]
www/plugins/menus_1/menus/deconnecter.html [new file with mode: 0644]
www/plugins/menus_1/menus/deconnecter.xml [new file with mode: 0644]
www/plugins/menus_1/menus/espace_prive.html [new file with mode: 0644]
www/plugins/menus_1/menus/espace_prive.xml [new file with mode: 0644]
www/plugins/menus_1/menus/groupe_mots.html [new file with mode: 0644]
www/plugins/menus_1/menus/groupe_mots.xml [new file with mode: 0644]
www/plugins/menus_1/menus/lien.html [new file with mode: 0644]
www/plugins/menus_1/menus/lien.xml [new file with mode: 0644]
www/plugins/menus_1/menus/mapage.html [new file with mode: 0644]
www/plugins/menus_1/menus/mapage.xml [new file with mode: 0644]
www/plugins/menus_1/menus/mots.html [new file with mode: 0644]
www/plugins/menus_1/menus/mots.xml [new file with mode: 0644]
www/plugins/menus_1/menus/objet.html [new file with mode: 0644]
www/plugins/menus_1/menus/objet.xml [new file with mode: 0644]
www/plugins/menus_1/menus/page_speciale.html [new file with mode: 0644]
www/plugins/menus_1/menus/page_speciale.xml [new file with mode: 0644]
www/plugins/menus_1/menus/page_speciale_zajax.html [new file with mode: 0644]
www/plugins/menus_1/menus/page_speciale_zajax.xml [new file with mode: 0644]
www/plugins/menus_1/menus/rubriques_completes.html [new file with mode: 0644]
www/plugins/menus_1/menus/rubriques_completes.xml [new file with mode: 0644]
www/plugins/menus_1/menus/secteurlangue.html [new file with mode: 0644]
www/plugins/menus_1/menus/secteurlangue.xml [new file with mode: 0644]
www/plugins/menus_1/menus/texte_libre.html [new file with mode: 0644]
www/plugins/menus_1/menus/texte_libre.xml [new file with mode: 0644]
www/plugins/menus_1/menus_administrations.php [new file with mode: 0644]
www/plugins/menus_1/menus_fonctions.php [new file with mode: 0644]
www/plugins/menus_1/menus_ieconfig.php [new file with mode: 0644]
www/plugins/menus_1/menus_pipelines.php [new file with mode: 0644]
www/plugins/menus_1/noisettes/menu-preview.html [new file with mode: 0644]
www/plugins/menus_1/noisettes/menu.html [new file with mode: 0644]
www/plugins/menus_1/noisettes/menu.yaml [new file with mode: 0644]
www/plugins/menus_1/paquet.xml [new file with mode: 0644]
www/plugins/menus_1/prive/squelettes/contenu/configurer_menus.html [new file with mode: 0644]
www/plugins/menus_1/prive/squelettes/contenu/menus_editer.html [new file with mode: 0644]
www/plugins/menus_1/prive/squelettes/contenu/menus_tous.html [new file with mode: 0644]
www/plugins/menus_1/prive/squelettes/navigation/menus_editer.html [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-16.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-24.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-32.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-add-16.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-add-24.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-add-32.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-del-16.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-del-24.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-del-32.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-export-24.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menu-exporter-24.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menus-16.png [new file with mode: 0644]
www/plugins/menus_1/prive/themes/spip/images/menus-24.png [new file with mode: 0644]
www/plugins/menus_1/saisies-vues/menu.html [new file with mode: 0644]
www/plugins/menus_1/saisies-vues/menus_multiple.html [new file with mode: 0644]
www/plugins/menus_1/saisies/menu.html [new file with mode: 0644]
www/plugins/menus_1/saisies/menus_multiple.html [new file with mode: 0644]
www/plugins/menus_1/svn.revision [new file with mode: 0644]
www/plugins/saisies/action/deplacer_saisie.php [new file with mode: 0644]
www/plugins/saisies/aide/saisies.html [new file with mode: 0644]
www/plugins/saisies/balise/configurer_saisie.php [new file with mode: 0644]
www/plugins/saisies/balise/generer_saisies.php [new file with mode: 0644]
www/plugins/saisies/balise/saisie.php [new file with mode: 0644]
www/plugins/saisies/balise/voir_saisie.php [new file with mode: 0644]
www/plugins/saisies/balise/voir_saisies.php [new file with mode: 0644]
www/plugins/saisies/contenu/page-saisies_cvt.html [new file with mode: 0644]
www/plugins/saisies/css/formulaires_constructeur.css [new file with mode: 0644]
www/plugins/saisies/extra-vues/pays.html [new file with mode: 0644]
www/plugins/saisies/formulaires/construire_formulaire.html [new file with mode: 0644]
www/plugins/saisies/formulaires/construire_formulaire.php [new file with mode: 0644]
www/plugins/saisies/formulaires/inc-construire_formulaire-actions.html [new file with mode: 0644]
www/plugins/saisies/formulaires/inc-generer_saisies_configurables.html [new file with mode: 0644]
www/plugins/saisies/formulaires/inc-saisies-cvt.html [new file with mode: 0644]
www/plugins/saisies/formulaires/saisies_cvt.html [new file with mode: 0644]
www/plugins/saisies/formulaires/saisies_cvt.php [new file with mode: 0644]
www/plugins/saisies/images/formulaire-annuler-16.png [new file with mode: 0644]
www/plugins/saisies/images/formulaire-configurer-16.png [new file with mode: 0644]
www/plugins/saisies/images/formulaire-deplacer-16.png [new file with mode: 0644]
www/plugins/saisies/images/formulaire-dupliquer-16.png [new file with mode: 0644]
www/plugins/saisies/images/formulaire-enregistrer-16.png [new file with mode: 0644]
www/plugins/saisies/images/formulaire-reinitialiser-24.png [new file with mode: 0644]
www/plugins/saisies/images/formulaire-saisie-defaut.png [new file with mode: 0644]
www/plugins/saisies/images/formulaire-supprimer-16.png [new file with mode: 0644]
www/plugins/saisies/images/logo_saisie_48.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_auteurs.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_case.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_checkbox.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_date.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_explication.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_fieldset.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_hidden.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_input.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_oui_non.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_radio.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_selecteur_article.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_selecteur_rubrique.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_selecteur_rubrique_article.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_selection.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_selection_multiple.png [new file with mode: 0644]
www/plugins/saisies/images/saisies_textarea.png [new file with mode: 0644]
www/plugins/saisies/inc/saisies.php [new file with mode: 0644]
www/plugins/saisies/inc/saisies_afficher.php [new file with mode: 0644]
www/plugins/saisies/inc/saisies_lister.php [new file with mode: 0644]
www/plugins/saisies/inc/saisies_manipuler.php [new file with mode: 0644]
www/plugins/saisies/inclure/configurer_saisie.html [new file with mode: 0644]
www/plugins/saisies/inclure/configurer_saisie_fonctions.php [new file with mode: 0644]
www/plugins/saisies/inclure/generer_saisies.html [new file with mode: 0644]
www/plugins/saisies/inclure/js_afficher_si.html [new file with mode: 0644]
www/plugins/saisies/inclure/saisies_aide.html [new file with mode: 0644]
www/plugins/saisies/inclure/voir_saisies.html [new file with mode: 0644]
www/plugins/saisies/javascript/saisies.js [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies.xml [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies_de.php [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies_en.php [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies_es.php [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies_fr.php [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies_ru.php [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies_sk.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies.xml [new file with mode: 0644]
www/plugins/saisies/lang/saisies_ca.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_de.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_en.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_es.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_fa.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_fr.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_fr_tu.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_it.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_ru.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_sk.php [new file with mode: 0644]
www/plugins/saisies/paquet.xml [new file with mode: 0644]
www/plugins/saisies/plugin.xml [new file with mode: 0644]
www/plugins/saisies/prive/exec/construire_formulaire.html [new file with mode: 0644]
www/plugins/saisies/prive/listes/articles_originaux_recursifs.html [new file with mode: 0644]
www/plugins/saisies/prive/listes/rubriques_recursives.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/_base.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/auteurs.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/case.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/checkbox.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/date.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/destinataires.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/explication.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/fieldset.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/groupe_mots.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/oui_non.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/radio.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/secteur.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selecteur.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selecteur_article.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selecteur_article_fonctions.php [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selecteur_document.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selecteur_rubrique.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selecteur_rubrique_article.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selecteur_site.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selection.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/selection_multiple.html [new file with mode: 0644]
www/plugins/saisies/saisies.css.html [new file with mode: 0644]
www/plugins/saisies/saisies/_base.html [new file with mode: 0644]
www/plugins/saisies/saisies/articles_originaux.html [new file with mode: 0644]
www/plugins/saisies/saisies/auteurs.html [new file with mode: 0644]
www/plugins/saisies/saisies/auteurs.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/case.html [new file with mode: 0644]
www/plugins/saisies/saisies/case.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/checkbox.html [new file with mode: 0644]
www/plugins/saisies/saisies/checkbox.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/choisir_objet.html [new file with mode: 0644]
www/plugins/saisies/saisies/choisir_objets.html [new file with mode: 0644]
www/plugins/saisies/saisies/couleur.html [new file with mode: 0644]
www/plugins/saisies/saisies/date.html [new file with mode: 0644]
www/plugins/saisies/saisies/date.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/date_jour_mois_annee.html [new file with mode: 0644]
www/plugins/saisies/saisies/destinataires.html [new file with mode: 0644]
www/plugins/saisies/saisies/destinataires.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/email.html [new file with mode: 0644]
www/plugins/saisies/saisies/explication.html [new file with mode: 0644]
www/plugins/saisies/saisies/explication.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/fieldset.html [new file with mode: 0644]
www/plugins/saisies/saisies/fieldset.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/groupe_mots.html [new file with mode: 0644]
www/plugins/saisies/saisies/hidden.html [new file with mode: 0644]
www/plugins/saisies/saisies/hidden.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/input.html [new file with mode: 0644]
www/plugins/saisies/saisies/input.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/mot.html [new file with mode: 0644]
www/plugins/saisies/saisies/oui_non.html [new file with mode: 0644]
www/plugins/saisies/saisies/oui_non.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/pays.html [new file with mode: 0644]
www/plugins/saisies/saisies/police.html [new file with mode: 0644]
www/plugins/saisies/saisies/position_construire_formulaire.html [new file with mode: 0644]
www/plugins/saisies/saisies/radio.html [new file with mode: 0644]
www/plugins/saisies/saisies/radio.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/recherche.html [new file with mode: 0644]
www/plugins/saisies/saisies/secteur.html [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur.html [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_article.html [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_article.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_document.html [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_langue.html [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_rubrique.html [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_rubrique.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_rubrique_article.html [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_rubrique_article.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/selecteur_site.html [new file with mode: 0644]
www/plugins/saisies/saisies/selection.html [new file with mode: 0644]
www/plugins/saisies/saisies/selection.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/selection_multiple.html [new file with mode: 0755]
www/plugins/saisies/saisies/selection_multiple.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/selection_par_groupe.html [new file with mode: 0644]
www/plugins/saisies/saisies/statuts_auteurs.html [new file with mode: 0644]
www/plugins/saisies/saisies/telephone.html [new file with mode: 0644]
www/plugins/saisies/saisies/textarea.html [new file with mode: 0644]
www/plugins/saisies/saisies/textarea.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/true_false.html [new file with mode: 0644]
www/plugins/saisies/saisies/url.html [new file with mode: 0644]
www/plugins/saisies/saisies_fonctions.php [new file with mode: 0644]
www/plugins/saisies/saisies_options.php [new file with mode: 0644]
www/plugins/saisies/saisies_pipelines.php [new file with mode: 0644]
www/plugins/saisies/svn.revision [new file with mode: 0644]
www/plugins/saisies/test/configurer_saisie.html [new file with mode: 0644]
www/plugins/saisies/test/generer_saisies.html [new file with mode: 0644]
www/plugins/saisies/test/saisie.html [new file with mode: 0644]
www/plugins/saisies/test/voir_saisie.html [new file with mode: 0644]
www/plugins/saisies/test/voir_saisies.html [new file with mode: 0644]
www/plugins/zpip_v1/404.html [new file with mode: 0644]
www/plugins/zpip_v1/article.html [new file with mode: 0644]
www/plugins/zpip_v1/auteur.html [new file with mode: 0644]
www/plugins/zpip_v1/backend.html [new file with mode: 0644]
www/plugins/zpip_v1/body.html [new file with mode: 0644]
www/plugins/zpip_v1/breve.html [new file with mode: 0644]
www/plugins/zpip_v1/contact.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/article.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/auteur.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/breve.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/mot.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page-401.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page-404.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page-forum.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page-login.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page-plan.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page-recherche.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page-sommaire.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page-spip_pass.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/page.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/rubrique.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/site.html [new file with mode: 0644]
www/plugins/zpip_v1/contenu/z_apl.html [new file with mode: 0644]
www/plugins/zpip_v1/conventions.txt [new file with mode: 0644]
www/plugins/zpip_v1/extra/article.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/auteur.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/breve.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/dist.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/mot.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/page-sommaire.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/page.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/rubrique.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/site.html [new file with mode: 0644]
www/plugins/zpip_v1/extra/z_apl.html [new file with mode: 0644]
www/plugins/zpip_v1/feed.png [new file with mode: 0644]
www/plugins/zpip_v1/forum.html [new file with mode: 0644]
www/plugins/zpip_v1/habillage.css [new file with mode: 0755]
www/plugins/zpip_v1/head/article.html [new file with mode: 0644]
www/plugins/zpip_v1/head/auteur.html [new file with mode: 0644]
www/plugins/zpip_v1/head/breve.html [new file with mode: 0644]
www/plugins/zpip_v1/head/dist.html [new file with mode: 0644]
www/plugins/zpip_v1/head/mot.html [new file with mode: 0644]
www/plugins/zpip_v1/head/page-404.html [new file with mode: 0644]
www/plugins/zpip_v1/head/page-plan.html [new file with mode: 0644]
www/plugins/zpip_v1/head/page-recherche.html [new file with mode: 0644]
www/plugins/zpip_v1/head/page-sommaire.html [new file with mode: 0644]
www/plugins/zpip_v1/head/page.html [new file with mode: 0644]
www/plugins/zpip_v1/head/rubrique.html [new file with mode: 0644]
www/plugins/zpip_v1/head/site.html [new file with mode: 0644]
www/plugins/zpip_v1/img/out.gif [new file with mode: 0644]
www/plugins/zpip_v1/img/zpip-128.png [new file with mode: 0644]
www/plugins/zpip_v1/img/zpip-16.png [new file with mode: 0644]
www/plugins/zpip_v1/img/zpip-32.png [new file with mode: 0644]
www/plugins/zpip_v1/img/zpip-48.png [new file with mode: 0644]
www/plugins/zpip_v1/img/zpip-64.png [new file with mode: 0644]
www/plugins/zpip_v1/inclure/ajax_parallel_load.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/article-resume.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/barre-nav-secteurs.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/barre-nav.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/documents.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/entete.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/forum.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/head.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/petition.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/pied.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/rss-item.html [new file with mode: 0644]
www/plugins/zpip_v1/inclure/rubriques.html [new file with mode: 0644]
www/plugins/zpip_v1/lang/zpip_de.php [new file with mode: 0644]
www/plugins/zpip_v1/lang/zpip_en.php [new file with mode: 0644]
www/plugins/zpip_v1/lang/zpip_es.php [new file with mode: 0644]
www/plugins/zpip_v1/lang/zpip_fr.php [new file with mode: 0644]
www/plugins/zpip_v1/lang/zpip_nl.php [new file with mode: 0644]
www/plugins/zpip_v1/lang/zpip_pt.php [new file with mode: 0644]
www/plugins/zpip_v1/lang/zpip_sv.php [new file with mode: 0644]
www/plugins/zpip_v1/login.html [new file with mode: 0644]
www/plugins/zpip_v1/mot.html [new file with mode: 0644]
www/plugins/zpip_v1/navigation/dist.html [new file with mode: 0644]
www/plugins/zpip_v1/navigation/page.html [new file with mode: 0644]
www/plugins/zpip_v1/navigation/z_apl.html [new file with mode: 0644]
www/plugins/zpip_v1/objet.html [new file with mode: 0644]
www/plugins/zpip_v1/page.html [new file with mode: 0644]
www/plugins/zpip_v1/plan.html [new file with mode: 0644]
www/plugins/zpip_v1/plugin.xml [new file with mode: 0644]
www/plugins/zpip_v1/recherche.html [new file with mode: 0644]
www/plugins/zpip_v1/rechercher.gif [new file with mode: 0644]
www/plugins/zpip_v1/rubrique.html [new file with mode: 0644]
www/plugins/zpip_v1/site.html [new file with mode: 0644]
www/plugins/zpip_v1/sommaire.html [new file with mode: 0644]
www/plugins/zpip_v1/spip.png [new file with mode: 0644]
www/plugins/zpip_v1/spip_formulaires.css [new file with mode: 0644]
www/plugins/zpip_v1/spip_pass.html [new file with mode: 0644]
www/plugins/zpip_v1/spip_style.css [new file with mode: 0644]
www/plugins/zpip_v1/structure.html [new file with mode: 0644]
www/plugins/zpip_v1/svn.revision [new file with mode: 0644]
www/plugins/zpip_v1/tests/z_scaffoldable.php [new file with mode: 0644]
www/plugins/zpip_v1/z_options.php [new file with mode: 0644]
www/plugins/zpip_v1/z_pipelines.php [new file with mode: 0644]

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..c40462a
--- /dev/null
@@ -0,0 +1,103 @@
+<?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'),
+       );
+
+       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..1cdf7eb
--- /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" 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..3b7973b
--- /dev/null
@@ -0,0 +1,148 @@
+<?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
+               ),\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'),\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..c998359
--- /dev/null
@@ -0,0 +1,136 @@
+<?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'));
+       }
+       $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..68cd4db
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:VEVENT
+SUMMARY:[(#EVTITRE|textebrut|filtrer_ical)]
+UID:evenement#ID_EVENEMENT @ [(#URL_SITE_SPIP|filtrer_ical)][
+DTSTAMP:(#DATE_DEBUT|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})]})][
+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)]
+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..dbe4f62
--- /dev/null
@@ -0,0 +1,155 @@
+<?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',
+
+       // 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..32a7c1d
--- /dev/null
@@ -0,0 +1,155 @@
+<?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',
+
+       // 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..c598089
--- /dev/null
@@ -0,0 +1,155 @@
+<?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',
+
+       // 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..f975b6e
--- /dev/null
@@ -0,0 +1,153 @@
+<?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',
+
+       // 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..45c6b68
--- /dev/null
@@ -0,0 +1,155 @@
+<?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' => 'Popis',
+       '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',
+
+       // 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..1c4818b
--- /dev/null
@@ -0,0 +1,49 @@
+<paquet
+       prefix="agenda"
+       categorie="date"
+       version="3.11.8"
+       etat="stable"
+       compatibilite="[3.0.0;3.0.*]"
+       logo="prive/themes/spip/images/evenement-32.png"
+       schema="0.25.0"
+       documentation="http://www.spip-contrib.net/article2858"
+>      
+
+       <nom>Agenda</nom>
+       <!-- Agenda Evenementiel -->
+
+       <auteur lien="http://www.yterium.net">Cedric MORIN</auteur>
+       <auteur lien="http://www.spip-contrib.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-2012</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..741df29
--- /dev/null
@@ -0,0 +1,6 @@
+[(#AUTORISER{configurer_agenda}|sinon_interdire_acces)]
+<h1 class="grostitre"><:agenda:agenda:></h1>
+<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..dc1491c
--- /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})]
+</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})]
+</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})]
+</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/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..dfaa307
--- /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>[(#CONFIG{agenda/titre}|sinon{<:agenda:titre_sur_l_agenda:>}|entites_html)]</h1>
+       </header>
+
+       [<div class="chapo">(#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..157d953
--- /dev/null
@@ -0,0 +1,18 @@
+[(#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>
\ No newline at end of file
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/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..2b87e18
--- /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){!evenement_a_venir #GET{date_debut}}{0,1}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}>#SET{hasprev,1}</BOUCLE_prev>
+       #SET{hasnext,''}
+       <BOUCLE_next(EVENEMENTS){!evenement_passe #GET{date_fin}}{0,1}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}>#SET{hasnext,1}</BOUCLE_next>
+       [(#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..8d0c432
--- /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"><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"><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){id_article}>#SET{intro,#INTRODUCTION{#ENV{coupe,300}}</BOUCLE_art>
+       [<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..9ab691f
--- /dev/null
@@ -0,0 +1,10 @@
+<svn_revision>
+<text_version>
+Origine: file:///home/svn/repository/spip-zone/_plugins_/agenda/trunk
+Revision: 72384
+Dernier commit: 2013-04-27 14:00:20 +0200 
+</text_version>
+<origine>file:///home/svn/repository/spip-zone/_plugins_/agenda/trunk</origine>
+<revision>72384</revision>
+<commit>2013-04-27 14:00:20 +0200 </commit>
+</svn_revision>
\ No newline at end of file
diff --git a/www/plugins/beespip/base/beespip_upgrade.php b/www/plugins/beespip/base/beespip_upgrade.php
new file mode 100755 (executable)
index 0000000..d1fba2f
--- /dev/null
@@ -0,0 +1,494 @@
+<?php
+##########################################################################
+#
+#                              Plugin Beespip pour SPIP
+#
+#
+#             Site de documentation des squelettes BeeSpip
+#                       http://www.beespip.org
+#
+#                       2004-2011 - Christophe Gindro
+############################################################################
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/meta');
+include_spip('base/create');
+
+
+function beespip_upgrade($nom_meta_base_version, $version_cible){
+        $current_version = 0.0;
+        if (   (!isset($GLOBALS['meta'][$nom_meta_base_version]) )
+                        || (($current_version = $GLOBALS['meta'][$nom_meta_base_version])!=$version_cible)){
+                               $ancienne_installation = lire_meta('spipgen_version');
+                               if ($ancienne_installation!='') {
+                                       beespip_recuperer_meta();
+                                       beespip_effacer_meta();
+                               }
+                if ($current_version==0.0){
+                        //include_spip('base/beespip');
+                        //creer_base();
+                        beespip_definir_meta();
+                        ecrire_meta($nom_meta_base_version,$current_version=$version_cible);
+                }
+                if (version_compare($current_version,"0.26","<")){
+                        $lien_affichebloc = lire_config('BeeSpip/menu/lien_affichebloc');
+                        if ($lien_affichebloc!='') ecrire_config('BeeSpip/menu/lien_affichebloc','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.26",'non');
+                }
+                if (version_compare($current_version,"0.31","<")){
+                        beespip_modifier_motscles();
+                        // Supression des configurations obsolètes
+                        $intranet = lire_config('BeeSpip/configuration/intranet');
+                        if ($intranet!='') effacer_config('BeeSpip/configuration/intranet');
+                        $fils_rss = lire_config('BeeSpip/configuration/fils_rss');
+                        if ($fils_rss!='') effacer_config('BeeSpip/configuration/fils_rss');
+                        $fond_entete = lire_config('BeeSpip/affichage/fond_entete');
+                        if ($fond_entete!='') effacer_config('BeeSpip/affichage/fond_entete');
+                        $logo = lire_config('BeeSpip/affichage/logo');
+                        if ($logo!='') effacer_config('BeeSpip/affichage/logo');
+                        $logo_largeur = lire_config('BeeSpip/affichage/logo_largeur');
+                        if ($logo_largeur!='') effacer_config('BeeSpip/affichage/logo_largeur');
+                        $logo_hauteur = lire_config('BeeSpip/affichage/logo_hauteur');
+                        if ($logo_hauteur!='') effacer_config('BeeSpip/affichage/logo_hauteur');
+                        $site_ombre = lire_config('BeeSpip/affichage/site_ombre');
+                        if ($site_ombre!='') effacer_config('BeeSpip/affichage/site_ombre');
+                        $cartouche_services = lire_config('BeeSpip/affichage/cartouche_services');
+                        if ($cartouche_services!='') effacer_config('BeeSpip/affichage/cartouche_services');
+                        // Ajout des nouvelles configurations
+                        $nom_site = lire_config('BeeSpip/affichage/nom_site');
+                        if ($nom_site!='') ecrire_config('BeeSpip/affichage/nom_site','oui');
+                        $hauteur_entete = lire_config('BeeSpip/affichage/hauteur_entete');
+                        if ($hauteur_entete!='') ecrire_config('BeeSpip/affichage/hauteur_entete','275');
+                        $hauteur_menu = lire_config('BeeSpip/affichage/hauteur_menu');
+                        if ($hauteur_menu!='') ecrire_config('BeeSpip/affichage/hauteur_menu','5');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.31",'non');
+                }
+                if (version_compare($current_version,"0.36","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/couleur/couleur_principale','#b83233');
+                        ecrire_config('BeeSpip/couleur/couleur_secondaire_foncee','#8b0b00');
+                        ecrire_config('BeeSpip/couleur/couleur_secondaire_claire','#ff645b');
+                        ecrire_config('BeeSpip/couleur/couleur_principale_texte','#666666');
+                        ecrire_config('BeeSpip/couleur/beespip_couleur_titres','#444444');
+                        ecrire_config('BeeSpip/couleur/couleur_liens','#0070a7');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.36",'non');
+                }
+                if (version_compare($current_version,"0.40","<")){
+                        // Supression des configurations obsolètes 
+                        $affichage_portfolio = lire_config('BeeSpip/affichage/affichage_portfolio');
+                        if ($affichage_portfolio!='') effacer_config('BeeSpip/affichage/affichage_portfolio');
+                        $emplacement_date = lire_config('BeeSpip/affichage/emplacement_date');
+                        if ($emplacement_date!='') effacer_config('BeeSpip/affichage/emplacement_date');
+                        $menu_vertical = lire_config('BeeSpip/menu/menu_vertical');
+                        if ($menu_vertical!='') effacer_config('BeeSpip/menu/menu_vertical');
+                        $menu_liens_deplier_replier = lire_config('BeeSpip/menu/menu_liens_deplier_replier');
+                        if ($menu_liens_deplier_replier!='') effacer_config('BeeSpip/menu/menu_liens_deplier_replier');
+                        $menu_articles = lire_config('BeeSpip/menu/menu_articles');
+                        if ($menu_articles!='') effacer_config('BeeSpip/menu/menu_articles');
+                        $menu_horizontal = lire_config('BeeSpip/menu/menu_horizontal');
+                        if ($menu_horizontal!='') effacer_config('BeeSpip/menu/menu_horizontal');
+                        $lien_agenda = lire_config('BeeSpip/menu/lien_agenda');
+                        if ($lien_agenda!='') effacer_config('BeeSpip/menu/lien_agenda');
+                        $lien_reactions = lire_config('BeeSpip/menu/lien_reactions');
+                        if ($lien_reactions!='') effacer_config('BeeSpip/menu/lien_reactions');
+                        $lien_usagers = lire_config('BeeSpip/menu/lien_usagers');
+                        if ($lien_usagers!='') effacer_config('BeeSpip/menu/lien_usagers');
+                        $lien_actu_web = lire_config('BeeSpip/menu/lien_actu_web');
+                        if ($lien_actu_web!='') effacer_config('BeeSpip/menu/lien_actu_web');
+                        $lien_newsletter = lire_config('BeeSpip/menu/lien_newsletter');
+                        if ($lien_newsletter!='') effacer_config('BeeSpip/menu/lien_newsletter');
+                        $lien_annuaire = lire_config('BeeSpip/menu/lien_annuaire');
+                        if ($lien_annuaire!='') effacer_config('BeeSpip/menu/lien_annuaire');
+                        $lien_portfolio = lire_config('BeeSpip/menu/lien_portfolio');
+                        if ($lien_portfolio!='') effacer_config('BeeSpip/menu/lien_portfolio');
+                        $index_mots_cles = lire_config('BeeSpip/menu/index_mots_cles');
+                        if ($index_mots_cles!='') effacer_config('BeeSpip/menu/index_mots_cles');
+                        $lien_plan = lire_config('BeeSpip/menu/lien_plan');
+                        if ($lien_plan!='') effacer_config('BeeSpip/menu/lien_plan');
+                        $lien_espace_redacteur = lire_config('BeeSpip/menu/lien_espace_redacteur');
+                        if ($lien_espace_redacteur!='') effacer_config('BeeSpip/menu/lien_espace_redacteur');
+                        $lien_affichebloc = lire_config('BeeSpip/menu/lien_affichebloc');
+                        if ($lien_affichebloc!='') effacer_config('BeeSpip/menu/lien_affichebloc');
+                        $theme = lire_config('BeeSpip/themes/theme');
+                        if ($theme!='') effacer_config('BeeSpip/themes/theme');
+
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/nb_items_menu','5');
+                        ecrire_config('BeeSpip/configuration/nb_article_col_droite','2');
+                        ecrire_config('BeeSpip/configuration/nb_evenement_accueil','5');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.40",'non');
+                }
+                if (version_compare($current_version,"0.41","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/configuration/autres_articles','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.41",'non');
+                }
+                if (version_compare($current_version,"0.44","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/couleur/couleur_fond_page','#ffffff');
+                        ecrire_config('BeeSpip/couleur/couleur_menu_fond','#f5f4f3');
+                        ecrire_config('BeeSpip/couleur/couleur_menu_liens','#666666');
+                        ecrire_config('BeeSpip/couleur/couleur_menu_liens_survol','#000000');
+                        ecrire_config('BeeSpip/couleur/couleur_filets_titres','#ebebeb');
+                        ecrire_config('BeeSpip/couleur/couleur_filets_colonnes','#e8e8e8');
+                        ecrire_config('BeeSpip/couleur/couleur_cadres','#ebebeb');
+                        ecrire_config('BeeSpip/couleur/couleur_liens_survol','#b83233');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.44",'non');
+                }
+                if (version_compare($current_version,"0.45","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/couleur/couleur_fond_formulaires','#f8f8f8');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.45",'non');
+                }
+                if (version_compare($current_version,"0.46","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/modele_pagination','');
+                        ecrire_config('BeeSpip/configuration/articles_populaires','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.46",'non');
+                }
+                if (version_compare($current_version,"0.47","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/taille_typo_menu','1.1');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.47",'non');
+                }
+                if (version_compare($current_version,"0.48","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/configuration/nb_article_une','6');
+                        ecrire_config('BeeSpip/configuration/nb_ligne_sousune','1');
+                        ecrire_config('BeeSpip/affichage/libelle_rubrique_article','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.48",'non');
+                }
+
+                if (version_compare($current_version,"0.49","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/largeur_items_menu','0');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.49",'non');
+                }
+                if (version_compare($current_version,"0.50","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/menu_debut','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.50",'non');
+                }
+                ecrire_metas();
+        }
+}
+/*
+function beespip_vider_tables($nom_meta_base_version){
+       include_spip('base/abstract_sql');
+       sql_drop_table("spip_annuaire_individus");
+       sql_drop_table("spip_annuaire_organisations");
+       sql_drop_table("spip_annuaire_categories");
+       effacer_meta('beespip_base_version');
+}*/
+
+
+function beespip_verifier_meta(){
+       // Vérifier si les tables de l'annuaire "ancienne version" sont installées
+       /*include_spip('base/abstract_sql');
+       if (sql_showtable('intra_annuaire_cate_orga')) {
+               // Passer les tables en prefixage spip_ ou autre..
+               if ($GLOBALS['table_prefix']) $table_pref = $GLOBALS['table_prefix']."_";
+               else $table_pref = "spip_";
+               sql_query("RENAME TABLE intra_annuaire_indi TO ".$table_pref."annuaire_individus");
+               sql_query("RENAME TABLE intra_annuaire_orga TO ".$table_pref."annuaire_organisations");
+               sql_query("RENAME TABLE intra_annuaire_categories TO ".$table_pref."annuaire_categories");
+               sql_query("RENAME TABLE intra_annuaire_indi_orga TO ".$table_pref."annuaire_individus_organisations");
+               sql_query("RENAME TABLE intra_annuaire_cate_orga TO ".$table_pref."annuaire_categories_organisations");
+               sql_alter("TABLE spip_annuaire_individus CHANGE `i_id` `id_individu` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_organisations CHANGE `i_id` `id_organisation` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_categories CHANGE `i_id` `id_categorie` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_categories_organisations CHANGE `i_id` `id_i` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_categories_organisations CHANGE `i_orga` `id_organisation` BIGINT( 20 ) NOT NULL DEFAULT '1'");
+               sql_alter("TABLE spip_annuaire_categories_organisations CHANGE `i_cate` `id_categorie` BIGINT( 20 ) NOT NULL DEFAULT '1'");
+               sql_alter("TABLE spip_annuaire_individus_organisations CHANGE `i_id` `id_i` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_individus_organisations CHANGE `i_orga` `id_organisation` BIGINT( 20 ) NOT NULL DEFAULT '1'");
+               sql_alter("TABLE spip_annuaire_individus_organisations CHANGE `i_user` `id_individu` BIGINT( 20 ) NOT NULL DEFAULT '1'");
+               // Encodage des tables
+               include_spip('inc/charsets');
+               $s = spip_query("SELECT * FROM spip_annuaire_categories");
+               while ($t = sql_fetch($s)) {
+                       sql_query("UPDATE spip_annuaire_categories SET `nom_cate` = '". utf8_decode($t[nom_cate]). "' WHERE `id_categorie`='".$t[id_categorie]."'");
+               }
+               $s = spip_query("SELECT * FROM spip_annuaire_individus");
+               while ($t = sql_fetch($s)) {
+                       sql_query("UPDATE spip_annuaire_individus SET `titre` = '". utf8_decode($t[titre]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `prenom` = '". utf8_decode($t[prenom]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `nom` = '". utf8_decode($t[nom]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `adr1` = '". utf8_decode($t[adr1]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `adr2` = '". utf8_decode($t[adr2]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `ville` = '". utf8_decode($t[ville]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `commentaire` = '". utf8_decode($t[commentaire]). "' WHERE `id_individu`='".$t[id_individu]."'");
+               }
+               $s = spip_query("SELECT * FROM spip_annuaire_organisations");
+               while ($t = sql_fetch($s)) {
+                       sql_query("UPDATE spip_annuaire_organisations SET `nom_organisme` = '". utf8_decode($t[nom_organisme]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `sigle` = '". utf8_decode($t[sigle]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `adr1` = '". utf8_decode($t[adr1]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `adr2` = '". utf8_decode($t[adr2]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `ville` = '". utf8_decode($t[ville]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `commentaire` = '". utf8_decode($t[commentaire]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+               }
+               $s = spip_query("SELECT * FROM spip_annuaire_individus_organisations");
+               while ($t = sql_fetch($s)) {
+                       sql_query("UPDATE spip_annuaire_individus_organisations SET `fonction` = '". utf8_decode($t[fonction]). "' WHERE `id_i`='".$t[id_i]."'");
+                       sql_query("UPDATE spip_annuaire_individus_organisations SET `commentaire` = '". utf8_decode($t[commentaire]). "' WHERE `id_i`='".$t[id_i]."'");
+               }
+               // Supprimer les tables inutiles
+               sql_drop_table("intra_sessions");
+               sql_drop_table("intra_sessions_logs");
+               sql_drop_table("intra_users");
+               
+       }*/
+
+}
+
+function beespip_modifier_motscles(){
+       // On supprime tous les mots clés obsolètes
+       $titre_groupemotscles = "~meta_beespip_communs";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='revisit-after' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+       
+       $titre_groupemotscles = "~meta_beespip";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='description' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='description' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+
+       $titre_groupemotscles = "~rubriques_beespip";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_accueil' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_actu' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_com' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_signets' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_rss' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_blog' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+
+       $titre_groupemotscles = "~modalites_affichage_sites";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_syndic", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_syndic", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_syndic", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_actualites_web' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_syndic", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+
+       $titre_groupemotscles = "~modalites_affichage_breves";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites_resume' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_rubrique' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_rubrique_resume' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites_titre' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+
+       $titre_groupemotscles = "~modalites_affichage_rubriques";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='trier_par_date' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='menu_deplie' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='menu_sans_articles' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='menu_horizontal' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       // On renomme ceux que l'on conserve
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("exclu"), "texte" => ("Permet d'exclure (tant que le mot lui est affecté) l'élément du plan du site, de la recherche et de la page d'accueil")), "id_mot=".$row['id_mot']);
+       // On renomme le groupe et on modifie les éléments ciblés
+       $nouveau_titre_groupemotscles = "~modalites_affichage";
+       sql_updateq("spip_groupes_mots", array("titre" => $nouveau_titre_groupemotscles, "tables_liees" => "breves,rubriques,syndic"), "titre='".$titre_groupemotscles."'");
+
+
+       $titre_groupemotscles = "~modalites_affichage_articles";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_rubrique' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_rubrique_resume' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_page_reactions' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='portfolio' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='portfolio_vignette' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       
+       // On renomme ceux que l'on conserve
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("exclu"), "texte" => ("Permet d'exclure (tant que le mot lui est affecté) l'article du plan du site, de la recherche et de la page d'accueil")), "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("actualites_une"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article dans la partie Une")), "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites_resume' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("actualites_sous_une"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article sous les Unes")), "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites_titre' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("actualites_colonne_droite"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article en colonne de droite sur la page d'accueil")), "id_mot=".$row['id_mot']);
+
+
+}
+
+function beespip_recuperer_meta(){
+       $page_accueil = $GLOBALS['meta']['page_accueil'];
+       if ($page_accueil!='') ecrire_config('BeeSpip/configuration/page_accueil',$page_accueil);
+       $spipgen_cal = $GLOBALS['meta']['spipgen_cal'];
+       if ($spipgen_cal!='') ecrire_config('BeeSpip/configuration/calendrier_public',$spipgen_cal);
+       $beespip_pos_recherche = $GLOBALS['meta']['beespip_pos_recherche'];
+       if ($beespip_pos_recherche!='') ecrire_config('BeeSpip/affichage/emplacement_recherche',$beespip_pos_recherche);
+       $beespip_datepubli = $GLOBALS['meta']['beespip_datepubli'];
+       if ($beespip_datepubli!='') ecrire_config('BeeSpip/affichage/dates_articles',$beespip_datepubli);
+       $beespip_datepubli_breve = $GLOBALS['meta']['beespip_datepubli_breve'];
+       if ($beespip_datepubli_breve!='') ecrire_config('BeeSpip/affichage/dates_breves',$beespip_datepubli_breve);
+       $beespip_auteur = $GLOBALS['meta']['beespip_auteur'];
+       if ($beespip_auteur!='') ecrire_config('BeeSpip/affichage/auteurs_articles',$beespip_auteur);
+       $spipgen_maj = $GLOBALS['meta']['spipgen_maj'];
+       if ($spipgen_maj!='') ecrire_config('BeeSpip/affichage/derniere_date_publication',$spipgen_maj);
+
+}
+
+function beespip_effacer_meta(){
+       effacer_meta('spipgen_version');
+       effacer_meta('page_accueil');
+       effacer_meta('spipgen_intranet');
+       effacer_meta('spipgen_cal');
+       effacer_meta('spipgen_lien_syndic');
+       effacer_meta('spipgen_fond_entete');
+       effacer_meta('spipgen_logo');
+       effacer_meta('spipgen_logo_largeur');
+       effacer_meta('spipgen_logo_hauteur');
+       effacer_meta('spipgen_affichage');
+       effacer_meta('beespip_cart_services');
+       effacer_meta('beespip_aff_portfolio');
+       effacer_meta('beespip_pos_date');
+       effacer_meta('emplacement_recherche');
+       effacer_meta('beespip_datepubli');
+       effacer_meta('beespip_datepubli_breve');
+       effacer_meta('beespip_auteur');
+       effacer_meta('spipgen_maj');
+       effacer_meta('menu_vertical');
+       effacer_meta('spipgen_menudeplie');
+       effacer_meta('article_menu');
+       effacer_meta('menu_horizontal');
+       effacer_meta('spipgen_agenda');
+       effacer_meta('spipgen_forums');
+       effacer_meta('spipgen_auteurs');
+       effacer_meta('spipgen_syndic');
+       effacer_meta('spipgen_newsletter');
+       effacer_meta('beespip_theme');
+       effacer_meta('spipgen_portfolio');
+       effacer_meta('spipgen_annuaire');
+       effacer_meta('spipgen_index');
+       effacer_meta('spipgen_plan');
+       effacer_meta('spipgen_prive');
+       effacer_meta('spipgen_spikini');
+       effacer_meta('spipgen_chat');
+       effacer_meta('spipgen_phpbb');
+       effacer_meta('spipgen_artpdf');
+       effacer_meta('spipgen_access');
+       effacer_meta('spipgen_access_niveaumax');
+       effacer_meta('beespip_theme');
+}
+
+function beespip_definir_meta(){
+       // Casier configuration
+       ecrire_config('BeeSpip/configuration/page_accueil','accueil');
+       ecrire_config('BeeSpip/configuration/calendrier_public','non');
+       ecrire_config('BeeSpip/configuration/nb_article_une','6');
+       ecrire_config('BeeSpip/configuration/nb_ligne_sousune','1');
+       ecrire_config('BeeSpip/configuration/nb_article_col_droite','2');
+       ecrire_config('BeeSpip/configuration/nb_evenement_accueil','5');
+       ecrire_config('BeeSpip/configuration/autres_articles','oui');
+       ecrire_config('BeeSpip/configuration/articles_populaires','oui');
+       // Casier affichage
+       ecrire_config('BeeSpip/affichage/nom_site','oui');
+       ecrire_config('BeeSpip/affichage/hauteur_entete','275');
+       ecrire_config('BeeSpip/affichage/hauteur_menu','5');
+       ecrire_config('BeeSpip/affichage/nb_items_menu','5');
+       ecrire_config('BeeSpip/affichage/menu_debut','oui');
+       ecrire_config('BeeSpip/affichage/largeur_items_menu','0');
+       ecrire_config('BeeSpip/affichage/taille_typo_menu','1.1');
+       ecrire_config('BeeSpip/affichage/emplacement_recherche','haut');
+       ecrire_config('BeeSpip/affichage/libelle_rubrique_article','oui');
+       ecrire_config('BeeSpip/affichage/modele_pagination','');
+       ecrire_config('BeeSpip/affichage/dates_articles','oui');
+       ecrire_config('BeeSpip/affichage/dates_breves','oui');
+       ecrire_config('BeeSpip/affichage/auteurs_articles','oui');
+       ecrire_config('BeeSpip/affichage/derniere_date_publication','non');
+       // Casier couleur
+       ecrire_config('BeeSpip/couleur/couleur_principale','#b83233');
+       ecrire_config('BeeSpip/couleur/couleur_secondaire_foncee','#8b0b00');
+       ecrire_config('BeeSpip/couleur/couleur_secondaire_claire','#ff645b');
+       ecrire_config('BeeSpip/couleur/couleur_principale_texte','#666666');
+       ecrire_config('BeeSpip/couleur/beespip_couleur_titres','#444444');
+       ecrire_config('BeeSpip/couleur/couleur_liens','#0070a7');
+       ecrire_config('BeeSpip/couleur/couleur_fond_page','#ffffff');
+       ecrire_config('BeeSpip/couleur/couleur_menu_fond','#f5f4f3');
+       ecrire_config('BeeSpip/couleur/couleur_menu_liens','#666666');
+       ecrire_config('BeeSpip/couleur/couleur_menu_liens_survol','#000000');
+       ecrire_config('BeeSpip/couleur/couleur_filets_titres','#ebebeb');
+       ecrire_config('BeeSpip/couleur/couleur_filets_colonnes','#e8e8e8');
+       ecrire_config('BeeSpip/couleur/couleur_cadres','#ebebeb');
+       ecrire_config('BeeSpip/couleur/couleur_liens_survol','#b83233');
+       ecrire_config('BeeSpip/couleur/couleur_fond_formulaires','#f8f8f8');
+       
+       beespip_modifier_motscles();
+
+       /*$titre_groupemotscles = "~modalites_affichage";
+       sql_insertq("spip_groupes_mots", array("titre" => $titre_groupemotscles, "tables_liees" => "breves,rubriques,syndic", "minirezo" => "oui","comite" => "oui"));
+       $row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+       sql_insertq("spip_mots", array("titre" => ("exclu"), "texte" => ("Permet d'exclure (tant que le mot lui est affecté) l'élément du plan du site, de la recherche et de la page d'accueil"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+
+       $titre_groupemotscles = "~modalites_affichage_articles";
+       sql_insertq("spip_groupes_mots", array("titre" => $titre_groupemotscles, "tables_liees" => "articles", "minirezo" => "oui","comite" => "oui"));
+       $row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+       sql_insertq("spip_mots", array("titre" => ("exclu"), "texte" => ("Permet d'exclure (tant que le mot lui est affecté) l'article du plan du site, de la recherche et de la page d'accueil"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+       sql_insertq("spip_mots", array("titre" => ("actualites_une"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article dans la partie Une"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+       sql_insertq("spip_mots", array("titre" => ("actualites_sous_une"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article sous les Unes"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+       sql_insertq("spip_mots", array("titre" => ("actualites_colonne_droite"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article en colonne de droite sur la page d'accueil"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+       */
+}
+
+?>
diff --git a/www/plugins/beespip/beespip_administrations.php b/www/plugins/beespip/beespip_administrations.php
new file mode 100755 (executable)
index 0000000..8f9a94f
--- /dev/null
@@ -0,0 +1,498 @@
+<?php
+##########################################################################
+#
+#                              Plugin Beespip pour SPIP
+#
+#
+#             Site de documentation des squelettes BeeSpip
+#                       http://www.beespip.org
+#
+#                       2004-2011 - Christophe Gindro
+############################################################################
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/meta');
+include_spip('base/create');
+
+
+function beespip_upgrade($nom_meta_base_version, $version_cible){
+        $current_version = 0.0;
+        if (   (!isset($GLOBALS['meta'][$nom_meta_base_version]) )
+                        || (($current_version = $GLOBALS['meta'][$nom_meta_base_version])!=$version_cible)){
+                               $ancienne_installation = lire_meta('spipgen_version');
+                               if ($ancienne_installation!='') {
+                                       beespip_recuperer_meta();
+                                       beespip_effacer_meta();
+                               }
+                if ($current_version==0.0){
+                        //include_spip('base/beespip');
+                        //creer_base();
+                        beespip_definir_meta();
+                        ecrire_meta($nom_meta_base_version,$current_version=$version_cible);
+                }
+                if (version_compare($current_version,"0.26","<")){
+                        $lien_affichebloc = lire_config('BeeSpip/menu/lien_affichebloc');
+                        if ($lien_affichebloc!='') ecrire_config('BeeSpip/menu/lien_affichebloc','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.26",'non');
+                }
+                if (version_compare($current_version,"0.31","<")){
+                        beespip_modifier_motscles();
+                        // Supression des configurations obsolètes
+                        $intranet = lire_config('BeeSpip/configuration/intranet');
+                        if ($intranet!='') effacer_config('BeeSpip/configuration/intranet');
+                        $fils_rss = lire_config('BeeSpip/configuration/fils_rss');
+                        if ($fils_rss!='') effacer_config('BeeSpip/configuration/fils_rss');
+                        $fond_entete = lire_config('BeeSpip/affichage/fond_entete');
+                        if ($fond_entete!='') effacer_config('BeeSpip/affichage/fond_entete');
+                        $logo = lire_config('BeeSpip/affichage/logo');
+                        if ($logo!='') effacer_config('BeeSpip/affichage/logo');
+                        $logo_largeur = lire_config('BeeSpip/affichage/logo_largeur');
+                        if ($logo_largeur!='') effacer_config('BeeSpip/affichage/logo_largeur');
+                        $logo_hauteur = lire_config('BeeSpip/affichage/logo_hauteur');
+                        if ($logo_hauteur!='') effacer_config('BeeSpip/affichage/logo_hauteur');
+                        $site_ombre = lire_config('BeeSpip/affichage/site_ombre');
+                        if ($site_ombre!='') effacer_config('BeeSpip/affichage/site_ombre');
+                        $cartouche_services = lire_config('BeeSpip/affichage/cartouche_services');
+                        if ($cartouche_services!='') effacer_config('BeeSpip/affichage/cartouche_services');
+                        // Ajout des nouvelles configurations
+                        $nom_site = lire_config('BeeSpip/affichage/nom_site');
+                        if ($nom_site!='') ecrire_config('BeeSpip/affichage/nom_site','oui');
+                        $hauteur_entete = lire_config('BeeSpip/affichage/hauteur_entete');
+                        if ($hauteur_entete!='') ecrire_config('BeeSpip/affichage/hauteur_entete','275');
+                        $hauteur_menu = lire_config('BeeSpip/affichage/hauteur_menu');
+                        if ($hauteur_menu!='') ecrire_config('BeeSpip/affichage/hauteur_menu','5');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.31",'non');
+                }
+                if (version_compare($current_version,"0.36","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/couleur/couleur_principale','#b83233');
+                        ecrire_config('BeeSpip/couleur/couleur_secondaire_foncee','#8b0b00');
+                        ecrire_config('BeeSpip/couleur/couleur_secondaire_claire','#ff645b');
+                        ecrire_config('BeeSpip/couleur/couleur_principale_texte','#666666');
+                        ecrire_config('BeeSpip/couleur/beespip_couleur_titres','#444444');
+                        ecrire_config('BeeSpip/couleur/couleur_liens','#0070a7');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.36",'non');
+                }
+                if (version_compare($current_version,"0.40","<")){
+                        // Supression des configurations obsolètes 
+                        $affichage_portfolio = lire_config('BeeSpip/affichage/affichage_portfolio');
+                        if ($affichage_portfolio!='') effacer_config('BeeSpip/affichage/affichage_portfolio');
+                        $emplacement_date = lire_config('BeeSpip/affichage/emplacement_date');
+                        if ($emplacement_date!='') effacer_config('BeeSpip/affichage/emplacement_date');
+                        $menu_vertical = lire_config('BeeSpip/menu/menu_vertical');
+                        if ($menu_vertical!='') effacer_config('BeeSpip/menu/menu_vertical');
+                        $menu_liens_deplier_replier = lire_config('BeeSpip/menu/menu_liens_deplier_replier');
+                        if ($menu_liens_deplier_replier!='') effacer_config('BeeSpip/menu/menu_liens_deplier_replier');
+                        $menu_articles = lire_config('BeeSpip/menu/menu_articles');
+                        if ($menu_articles!='') effacer_config('BeeSpip/menu/menu_articles');
+                        $menu_horizontal = lire_config('BeeSpip/menu/menu_horizontal');
+                        if ($menu_horizontal!='') effacer_config('BeeSpip/menu/menu_horizontal');
+                        $lien_agenda = lire_config('BeeSpip/menu/lien_agenda');
+                        if ($lien_agenda!='') effacer_config('BeeSpip/menu/lien_agenda');
+                        $lien_reactions = lire_config('BeeSpip/menu/lien_reactions');
+                        if ($lien_reactions!='') effacer_config('BeeSpip/menu/lien_reactions');
+                        $lien_usagers = lire_config('BeeSpip/menu/lien_usagers');
+                        if ($lien_usagers!='') effacer_config('BeeSpip/menu/lien_usagers');
+                        $lien_actu_web = lire_config('BeeSpip/menu/lien_actu_web');
+                        if ($lien_actu_web!='') effacer_config('BeeSpip/menu/lien_actu_web');
+                        $lien_newsletter = lire_config('BeeSpip/menu/lien_newsletter');
+                        if ($lien_newsletter!='') effacer_config('BeeSpip/menu/lien_newsletter');
+                        $lien_annuaire = lire_config('BeeSpip/menu/lien_annuaire');
+                        if ($lien_annuaire!='') effacer_config('BeeSpip/menu/lien_annuaire');
+                        $lien_portfolio = lire_config('BeeSpip/menu/lien_portfolio');
+                        if ($lien_portfolio!='') effacer_config('BeeSpip/menu/lien_portfolio');
+                        $index_mots_cles = lire_config('BeeSpip/menu/index_mots_cles');
+                        if ($index_mots_cles!='') effacer_config('BeeSpip/menu/index_mots_cles');
+                        $lien_plan = lire_config('BeeSpip/menu/lien_plan');
+                        if ($lien_plan!='') effacer_config('BeeSpip/menu/lien_plan');
+                        $lien_espace_redacteur = lire_config('BeeSpip/menu/lien_espace_redacteur');
+                        if ($lien_espace_redacteur!='') effacer_config('BeeSpip/menu/lien_espace_redacteur');
+                        $lien_affichebloc = lire_config('BeeSpip/menu/lien_affichebloc');
+                        if ($lien_affichebloc!='') effacer_config('BeeSpip/menu/lien_affichebloc');
+                        $theme = lire_config('BeeSpip/themes/theme');
+                        if ($theme!='') effacer_config('BeeSpip/themes/theme');
+
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/nb_items_menu','5');
+                        ecrire_config('BeeSpip/configuration/nb_article_col_droite','2');
+                        ecrire_config('BeeSpip/configuration/nb_evenement_accueil','5');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.40",'non');
+                }
+                if (version_compare($current_version,"0.41","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/configuration/autres_articles','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.41",'non');
+                }
+                if (version_compare($current_version,"0.44","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/couleur/couleur_fond_page','#ffffff');
+                        ecrire_config('BeeSpip/couleur/couleur_menu_fond','#f5f4f3');
+                        ecrire_config('BeeSpip/couleur/couleur_menu_liens','#666666');
+                        ecrire_config('BeeSpip/couleur/couleur_menu_liens_survol','#000000');
+                        ecrire_config('BeeSpip/couleur/couleur_filets_titres','#ebebeb');
+                        ecrire_config('BeeSpip/couleur/couleur_filets_colonnes','#e8e8e8');
+                        ecrire_config('BeeSpip/couleur/couleur_cadres','#ebebeb');
+                        ecrire_config('BeeSpip/couleur/couleur_liens_survol','#b83233');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.44",'non');
+                }
+                if (version_compare($current_version,"0.45","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/couleur/couleur_fond_formulaires','#f8f8f8');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.45",'non');
+                }
+                if (version_compare($current_version,"0.46","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/modele_pagination','');
+                        ecrire_config('BeeSpip/configuration/articles_populaires','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.46",'non');
+                }
+                if (version_compare($current_version,"0.47","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/taille_typo_menu','1.1');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.47",'non');
+                }
+                if (version_compare($current_version,"0.48","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/configuration/nb_article_une','6');
+                        ecrire_config('BeeSpip/configuration/nb_ligne_sousune','1');
+                        ecrire_config('BeeSpip/affichage/libelle_rubrique_article','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.48",'non');
+                }
+
+                if (version_compare($current_version,"0.49","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/largeur_items_menu','0');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.49",'non');
+                }
+                if (version_compare($current_version,"0.50","<")){
+                        // Ajout des nouvelles configurations
+                        ecrire_config('BeeSpip/affichage/menu_debut','oui');
+                        ecrire_meta($nom_meta_base_version,$current_version="0.50",'non');
+                }
+                ecrire_metas();
+        }
+}
+
+function beespip_vider_tables($nom_meta_base_version){
+       /*include_spip('base/abstract_sql');
+       sql_drop_table("spip_annuaire_individus");
+       sql_drop_table("spip_annuaire_organisations");
+       sql_drop_table("spip_annuaire_categories");*/
+       effacer_meta($nom_meta_base_version);
+}
+
+
+function beespip_verifier_meta(){
+       // Vérifier si les tables de l'annuaire "ancienne version" sont installées
+       /*include_spip('base/abstract_sql');
+       if (sql_showtable('intra_annuaire_cate_orga')) {
+               // Passer les tables en prefixage spip_ ou autre..
+               if ($GLOBALS['table_prefix']) $table_pref = $GLOBALS['table_prefix']."_";
+               else $table_pref = "spip_";
+               sql_query("RENAME TABLE intra_annuaire_indi TO ".$table_pref."annuaire_individus");
+               sql_query("RENAME TABLE intra_annuaire_orga TO ".$table_pref."annuaire_organisations");
+               sql_query("RENAME TABLE intra_annuaire_categories TO ".$table_pref."annuaire_categories");
+               sql_query("RENAME TABLE intra_annuaire_indi_orga TO ".$table_pref."annuaire_individus_organisations");
+               sql_query("RENAME TABLE intra_annuaire_cate_orga TO ".$table_pref."annuaire_categories_organisations");
+               sql_alter("TABLE spip_annuaire_individus CHANGE `i_id` `id_individu` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_organisations CHANGE `i_id` `id_organisation` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_categories CHANGE `i_id` `id_categorie` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_categories_organisations CHANGE `i_id` `id_i` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_categories_organisations CHANGE `i_orga` `id_organisation` BIGINT( 20 ) NOT NULL DEFAULT '1'");
+               sql_alter("TABLE spip_annuaire_categories_organisations CHANGE `i_cate` `id_categorie` BIGINT( 20 ) NOT NULL DEFAULT '1'");
+               sql_alter("TABLE spip_annuaire_individus_organisations CHANGE `i_id` `id_i` DOUBLE NOT NULL AUTO_INCREMENT");
+               sql_alter("TABLE spip_annuaire_individus_organisations CHANGE `i_orga` `id_organisation` BIGINT( 20 ) NOT NULL DEFAULT '1'");
+               sql_alter("TABLE spip_annuaire_individus_organisations CHANGE `i_user` `id_individu` BIGINT( 20 ) NOT NULL DEFAULT '1'");
+               // Encodage des tables
+               include_spip('inc/charsets');
+               $s = spip_query("SELECT * FROM spip_annuaire_categories");
+               while ($t = sql_fetch($s)) {
+                       sql_query("UPDATE spip_annuaire_categories SET `nom_cate` = '". utf8_decode($t[nom_cate]). "' WHERE `id_categorie`='".$t[id_categorie]."'");
+               }
+               $s = spip_query("SELECT * FROM spip_annuaire_individus");
+               while ($t = sql_fetch($s)) {
+                       sql_query("UPDATE spip_annuaire_individus SET `titre` = '". utf8_decode($t[titre]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `prenom` = '". utf8_decode($t[prenom]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `nom` = '". utf8_decode($t[nom]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `adr1` = '". utf8_decode($t[adr1]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `adr2` = '". utf8_decode($t[adr2]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `ville` = '". utf8_decode($t[ville]). "' WHERE `id_individu`='".$t[id_individu]."'");
+                       sql_query("UPDATE spip_annuaire_individus SET `commentaire` = '". utf8_decode($t[commentaire]). "' WHERE `id_individu`='".$t[id_individu]."'");
+               }
+               $s = spip_query("SELECT * FROM spip_annuaire_organisations");
+               while ($t = sql_fetch($s)) {
+                       sql_query("UPDATE spip_annuaire_organisations SET `nom_organisme` = '". utf8_decode($t[nom_organisme]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `sigle` = '". utf8_decode($t[sigle]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `adr1` = '". utf8_decode($t[adr1]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `adr2` = '". utf8_decode($t[adr2]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `ville` = '". utf8_decode($t[ville]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+                       sql_query("UPDATE spip_annuaire_organisations SET `commentaire` = '". utf8_decode($t[commentaire]). "' WHERE `id_organisation`='".$t[id_organisation]."'");
+               }
+               $s = spip_query("SELECT * FROM spip_annuaire_individus_organisations");
+               while ($t = sql_fetch($s)) {
+                       sql_query("UPDATE spip_annuaire_individus_organisations SET `fonction` = '". utf8_decode($t[fonction]). "' WHERE `id_i`='".$t[id_i]."'");
+                       sql_query("UPDATE spip_annuaire_individus_organisations SET `commentaire` = '". utf8_decode($t[commentaire]). "' WHERE `id_i`='".$t[id_i]."'");
+               }
+               // Supprimer les tables inutiles
+               sql_drop_table("intra_sessions");
+               sql_drop_table("intra_sessions_logs");
+               sql_drop_table("intra_users");
+               
+       }*/
+
+}
+
+function beespip_modifier_motscles(){
+       // On supprime tous les mots clés obsolètes
+       $titre_groupemotscles = "~meta_beespip_communs";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='revisit-after' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+       
+       $titre_groupemotscles = "~meta_beespip";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='description' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='description' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+
+       $titre_groupemotscles = "~rubriques_beespip";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_accueil' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_actu' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_com' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_signets' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_rss' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='beespip_blog' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+
+       $titre_groupemotscles = "~modalites_affichage_sites";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_syndic", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_syndic", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_syndic", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_actualites_web' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_syndic", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+
+       $titre_groupemotscles = "~modalites_affichage_breves";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites_resume' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_rubrique' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_rubrique_resume' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites_titre' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_breves", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       sql_delete("spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+
+       $titre_groupemotscles = "~modalites_affichage_rubriques";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='trier_par_date' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='menu_deplie' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='menu_sans_articles' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='menu_horizontal' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_rubriques", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       // On renomme ceux que l'on conserve
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("exclu"), "texte" => ("Permet d'exclure (tant que le mot lui est affecté) l'élément du plan du site, de la recherche et de la page d'accueil")), "id_mot=".$row['id_mot']);
+       // On renomme le groupe et on modifie les éléments ciblés
+       $nouveau_titre_groupemotscles = "~modalites_affichage";
+       sql_updateq("spip_groupes_mots", array("titre" => $nouveau_titre_groupemotscles, "tables_liees" => "breves,rubriques,syndic"), "titre='".$titre_groupemotscles."'");
+
+
+       $titre_groupemotscles = "~modalites_affichage_articles";
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_rubrique' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_rubrique_resume' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_actualites' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu_page_reactions' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='portfolio' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='portfolio_vignette' AND type='".$titre_groupemotscles."'");
+       sql_delete("spip_mots_articles", "id_mot=".$row['id_mot']);
+       sql_delete("spip_mots", "id_mot=".$row['id_mot']);
+       
+       // On renomme ceux que l'on conserve
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='exclu' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("exclu"), "texte" => ("Permet d'exclure (tant que le mot lui est affecté) l'article du plan du site, de la recherche et de la page d'accueil")), "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("actualites_une"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article dans la partie Une")), "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites_resume' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("actualites_sous_une"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article sous les Unes")), "id_mot=".$row['id_mot']);
+       $row = sql_fetsel("id_mot", "spip_mots", "titre='ouvert_actualites_titre' AND type='".$titre_groupemotscles."'");
+       sql_updateq("spip_mots", array("titre" => ("actualites_colonne_droite"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article en colonne de droite sur la page d'accueil")), "id_mot=".$row['id_mot']);
+
+
+}
+
+function beespip_recuperer_meta(){
+       $page_accueil = $GLOBALS['meta']['page_accueil'];
+       if ($page_accueil!='') ecrire_config('BeeSpip/configuration/page_accueil',$page_accueil);
+       $spipgen_cal = $GLOBALS['meta']['spipgen_cal'];
+       if ($spipgen_cal!='') ecrire_config('BeeSpip/configuration/calendrier_public',$spipgen_cal);
+       $beespip_pos_recherche = $GLOBALS['meta']['beespip_pos_recherche'];
+       if ($beespip_pos_recherche!='') ecrire_config('BeeSpip/affichage/emplacement_recherche',$beespip_pos_recherche);
+       $beespip_datepubli = $GLOBALS['meta']['beespip_datepubli'];
+       if ($beespip_datepubli!='') ecrire_config('BeeSpip/affichage/dates_articles',$beespip_datepubli);
+       $beespip_datepubli_breve = $GLOBALS['meta']['beespip_datepubli_breve'];
+       if ($beespip_datepubli_breve!='') ecrire_config('BeeSpip/affichage/dates_breves',$beespip_datepubli_breve);
+       $beespip_auteur = $GLOBALS['meta']['beespip_auteur'];
+       if ($beespip_auteur!='') ecrire_config('BeeSpip/affichage/auteurs_articles',$beespip_auteur);
+       $spipgen_maj = $GLOBALS['meta']['spipgen_maj'];
+       if ($spipgen_maj!='') ecrire_config('BeeSpip/affichage/derniere_date_publication',$spipgen_maj);
+
+}
+
+function beespip_effacer_meta(){
+       effacer_meta('spipgen_version');
+       effacer_meta('page_accueil');
+       effacer_meta('spipgen_intranet');
+       effacer_meta('spipgen_cal');
+       effacer_meta('spipgen_lien_syndic');
+       effacer_meta('spipgen_fond_entete');
+       effacer_meta('spipgen_logo');
+       effacer_meta('spipgen_logo_largeur');
+       effacer_meta('spipgen_logo_hauteur');
+       effacer_meta('spipgen_affichage');
+       effacer_meta('beespip_cart_services');
+       effacer_meta('beespip_aff_portfolio');
+       effacer_meta('beespip_pos_date');
+       effacer_meta('emplacement_recherche');
+       effacer_meta('beespip_datepubli');
+       effacer_meta('beespip_datepubli_breve');
+       effacer_meta('beespip_auteur');
+       effacer_meta('spipgen_maj');
+       effacer_meta('menu_vertical');
+       effacer_meta('spipgen_menudeplie');
+       effacer_meta('article_menu');
+       effacer_meta('menu_horizontal');
+       effacer_meta('spipgen_agenda');
+       effacer_meta('spipgen_forums');
+       effacer_meta('spipgen_auteurs');
+       effacer_meta('spipgen_syndic');
+       effacer_meta('spipgen_newsletter');
+       effacer_meta('beespip_theme');
+       effacer_meta('spipgen_portfolio');
+       effacer_meta('spipgen_annuaire');
+       effacer_meta('spipgen_index');
+       effacer_meta('spipgen_plan');
+       effacer_meta('spipgen_prive');
+       effacer_meta('spipgen_spikini');
+       effacer_meta('spipgen_chat');
+       effacer_meta('spipgen_phpbb');
+       effacer_meta('spipgen_artpdf');
+       effacer_meta('spipgen_access');
+       effacer_meta('spipgen_access_niveaumax');
+       effacer_meta('beespip_theme');
+}
+
+function beespip_definir_meta(){
+       // Casier configuration
+       ecrire_config('BeeSpip/configuration/page_accueil','accueil');
+       ecrire_config('BeeSpip/configuration/calendrier_public','non');
+       ecrire_config('BeeSpip/configuration/nb_article_une','6');
+       ecrire_config('BeeSpip/configuration/nb_ligne_sousune','1');
+       ecrire_config('BeeSpip/configuration/nb_article_col_droite','2');
+       ecrire_config('BeeSpip/configuration/nb_evenement_accueil','5');
+       ecrire_config('BeeSpip/configuration/autres_articles','oui');
+       ecrire_config('BeeSpip/configuration/articles_populaires','oui');
+       // Casier affichage
+       ecrire_config('BeeSpip/affichage/nom_site','oui');
+       ecrire_config('BeeSpip/affichage/hauteur_entete','275');
+       ecrire_config('BeeSpip/affichage/hauteur_menu','5');
+       ecrire_config('BeeSpip/affichage/nb_items_menu','5');
+       ecrire_config('BeeSpip/affichage/menu_debut','oui');
+       ecrire_config('BeeSpip/affichage/largeur_items_menu','0');
+       ecrire_config('BeeSpip/affichage/taille_typo_menu','1.1');
+       ecrire_config('BeeSpip/affichage/emplacement_recherche','haut');
+       ecrire_config('BeeSpip/affichage/libelle_rubrique_article','oui');
+       ecrire_config('BeeSpip/affichage/modele_pagination','');
+       ecrire_config('BeeSpip/affichage/dates_articles','oui');
+       ecrire_config('BeeSpip/affichage/dates_breves','oui');
+       ecrire_config('BeeSpip/affichage/auteurs_articles','oui');
+       ecrire_config('BeeSpip/affichage/derniere_date_publication','non');
+       // Casier couleur
+       ecrire_config('BeeSpip/couleur/couleur_principale','#b83233');
+       ecrire_config('BeeSpip/couleur/couleur_secondaire_foncee','#8b0b00');
+       ecrire_config('BeeSpip/couleur/couleur_secondaire_claire','#ff645b');
+       ecrire_config('BeeSpip/couleur/couleur_principale_texte','#666666');
+       ecrire_config('BeeSpip/couleur/beespip_couleur_titres','#444444');
+       ecrire_config('BeeSpip/couleur/couleur_liens','#0070a7');
+       ecrire_config('BeeSpip/couleur/couleur_fond_page','#ffffff');
+       ecrire_config('BeeSpip/couleur/couleur_menu_fond','#f5f4f3');
+       ecrire_config('BeeSpip/couleur/couleur_menu_liens','#666666');
+       ecrire_config('BeeSpip/couleur/couleur_menu_liens_survol','#000000');
+       ecrire_config('BeeSpip/couleur/couleur_filets_titres','#ebebeb');
+       ecrire_config('BeeSpip/couleur/couleur_filets_colonnes','#e8e8e8');
+       ecrire_config('BeeSpip/couleur/couleur_cadres','#ebebeb');
+       ecrire_config('BeeSpip/couleur/couleur_liens_survol','#b83233');
+       ecrire_config('BeeSpip/couleur/couleur_fond_formulaires','#f8f8f8');
+       
+       beespip_modifier_motscles();
+
+       /*On créé les mots clés si ils n'existent pas */
+       $titre_groupemotscles = "~modalites_affichage";
+       if (!sql_fetsel("id_groupe", "spip_groupes_mots", "titre='".$titre_groupemotscles."'")) {
+               sql_insertq("spip_groupes_mots", array("titre" => $titre_groupemotscles, "tables_liees" => "breves,rubriques,syndic", "minirezo" => "oui","comite" => "oui"));
+               $row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+               sql_insertq("spip_mots", array("titre" => ("exclu"), "texte" => ("Permet d'exclure (tant que le mot lui est affecté) l'élément du plan du site, de la recherche et de la page d'accueil"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+       }
+
+       $titre_groupemotscles = "~modalites_affichage_articles";
+       if (!sql_fetsel("id_groupe", "spip_groupes_mots", "titre='".$titre_groupemotscles."'")) {
+               sql_insertq("spip_groupes_mots", array("titre" => $titre_groupemotscles, "tables_liees" => "articles", "minirezo" => "oui","comite" => "oui"));
+               $row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre='".$titre_groupemotscles."'");
+               sql_insertq("spip_mots", array("titre" => ("exclu"), "texte" => ("Permet d'exclure (tant que le mot lui est affecté) l'article du plan du site, de la recherche et de la page d'accueil"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+               sql_insertq("spip_mots", array("titre" => ("actualites_une"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article dans la partie Une"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+               sql_insertq("spip_mots", array("titre" => ("actualites_sous_une"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article sous les Unes"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+               sql_insertq("spip_mots", array("titre" => ("actualites_colonne_droite"), "texte" => ("Permet d'afficher (tant que le mot lui est affecté) l'article en colonne de droite sur la page d'accueil"), "id_groupe" => $row['id_groupe'], "type" => $titre_groupemotscles));
+       }
+}
+
+?>
diff --git a/www/plugins/beespip/beespip_headline.php b/www/plugins/beespip/beespip_headline.php
new file mode 100755 (executable)
index 0000000..93fc533
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+function beespip_header_prive($flux){
+  $flux .= "<script src='".url_absolue(find_in_path('js/mColorPicker.min.js'))."' type=\"text/javascript\"></script>\n"
+  ."<script type=\"text/javascript\" charset=\"UTF-8\">$.fn.mColorPicker.defaults.imageFolder = \"".url_absolue(find_in_path(_DIR_PLUGIN_BEESPIP.'prive/themes/spip/images/'))."\";
+  $.fn.mColorPicker.init.replace = '.beestyle'</script>";
+
+       return $flux;
+}
+
+?>
diff --git a/www/plugins/beespip/beespip_options.php b/www/plugins/beespip/beespip_options.php
new file mode 100755 (executable)
index 0000000..cb9d8a4
--- /dev/null
@@ -0,0 +1,14 @@
+<?php\r
+//permet de se passer du filtre supprimer_numero ecriture des titres 22. untitre\r
+$table_des_traitements['TITRE'][]= 'supprimer_numero(typo(%s))';\r
+\r
+// Pour bénéficier de la mise en évidence des termes de la recherche dès la première page d’affichage\r
+if (isset($_REQUEST['recherche'])) {\r
+  $_GET['var_recherche'] = $_REQUEST['recherche'];\r
+}\r
+function beespip_info_version($var_plugin) {\r
+       $get_infos = charger_fonction('get_infos','plugins');\r
+       $info = $get_infos($var_plugin);\r
+       return $info['version'];\r
+}\r
+?>\r
diff --git a/www/plugins/beespip/body.html b/www/plugins/beespip/body.html
new file mode 100755 (executable)
index 0000000..acf1e5b
--- /dev/null
@@ -0,0 +1,11 @@
+[(#ENV{acces}|=={'reserve'}|non)<div id="entete-wrap">                                 
+       <INCLURE{fond=inclure/entete,env}>
+</div>]
+
+<div id="conteneur"><div id="conteneur-wrapper" class="container_16">
+       <INCLURE{fond=contenu/#ENV{type},env}>
+</div></div>
+
+[(#ENV{acces}|=={'reserve'}|non)<div id="pied-wrapper" class="container_16">
+       <INCLURE{fond=inclure/pied,env}{intranet=#ENV{intranet}}>
+</div>]
diff --git a/www/plugins/beespip/contenu/article-doc_droite.html b/www/plugins/beespip/contenu/article-doc_droite.html
new file mode 100755 (executable)
index 0000000..d95be37
--- /dev/null
@@ -0,0 +1,54 @@
+<BOUCLE_contenu_article(ARTICLES){id_article}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p 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; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+<div id="contenu" class="grid_12">
+       <div class="cartouche">
+               [(#LOGO_ARTICLE||image_reduire{200,200}|inserer_attribut{class,float-left})]
+               [<p class="#EDIT{surtitre} surtitre">(#SURTITRE)</p>]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>]
+
+               [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article})]
+               
+               [(#REM) Inclure le modele des liens de traductions ]
+               #MODELE{article_traductions}
+       </div>
+
+       <div class="surlignable">
+               [<div class="#EDIT{chapo} chapo">(#CHAPO|image_reduire{640,0})</div>]
+               [<div class="#EDIT{texte} texte">(#TEXTE|image_reduire{640,0})</div>]
+       </div>
+
+       [<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+
+       [<div class="ps">
+               <h4><:info_ps:></h4>
+               <div class="#EDIT{ps} surlignable">(#PS|image_reduire{640,0})</div>
+       </div>]
+
+
+
+[(#REM) Petition :
+La petition ayant une PAGINATION il faut absolument {env}
+et pourquoi pas ajax
+][(#PETITION|oui)<INCLURE{fond=inclure/petition}{id_article}{env}{ajax}>]
+
+[<div class="notes surlignable"><h4 class="pas_surlignable"><:info_notes:></h4>(#NOTES)</div>]
+
+[(#REM) Forum de l'article ]
+<a href="#forum" name="forum" id="forum"></a>
+<INCLURE{fond=inclure/forum}{id_article} />
+[<p class="info-publi"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:repondre_article:></a>
+[(#PLUGIN{article_pdf}|oui) | <a href="spip.php?page=article_pdf&amp;id_article=#ID_ARTICLE" onclick="window.open(this.href); return false;" title="<:beespip:article_pdf:>"><:beespip:article_pdf:></a>]</p>]
+</div>
+
+<div id="colonne" class="grid_4">
+       <div class="grid_4 alpha omega">
+       [(#REM) Gestion du portfolio et des documents ]
+       [(#INCLURE{fond=inclure/documents}{id_article}{compteur=1})]
+               
+               <INCLURE{fond=extra/#ENV{type},env}{nodiv=oui}>
+       </div>
+</div>
+</BOUCLE_contenu_article>
diff --git a/www/plugins/beespip/contenu/article-doc_droite.xml b/www/plugins/beespip/contenu/article-doc_droite.xml
new file mode 100755 (executable)
index 0000000..87a9fd4
--- /dev/null
@@ -0,0 +1,4 @@
+<composition>
+  <nom>Article documents en colonne droite</nom>
+  <description>Les documents sont tous listés dans la colonne de droite.</description>
+</composition>
diff --git a/www/plugins/beespip/contenu/article-logo_droite.html b/www/plugins/beespip/contenu/article-logo_droite.html
new file mode 100755 (executable)
index 0000000..00d5a2d
--- /dev/null
@@ -0,0 +1,56 @@
+<BOUCLE_contenu_article(ARTICLES){id_article}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p 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; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+<div id="contenu_presentation" class="grid_16">
+
+       <div class="cartouche">
+               [(#LOGO_ARTICLE||image_reduire{200,200}|inserer_attribut{class,float-right})]
+               [<p class="#EDIT{surtitre} surtitre">(#SURTITRE)</p>]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>]
+
+               [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article})]
+               
+               [(#REM) Inclure le modele des liens de traductions ]
+               #MODELE{article_traductions}
+       </div>
+
+       <div class="surlignable">
+               [<div class="#EDIT{chapo} chapo">(#CHAPO|image_reduire{640,0})</div>]
+       </div>
+</div>
+
+<div id="contenu" class="grid_12">
+       <div class="surlignable">
+               [<div class="#EDIT{texte} texte">(#TEXTE|image_reduire{640,0})</div>]
+       </div>
+
+       [<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+
+       [<div class="ps">
+               <h4><:info_ps:></h4>
+               <div class="#EDIT{ps} surlignable">(#PS|image_reduire{640,0})</div>
+       </div>]
+
+[(#REM) Gestion du portfolio et des documents ]
+[(#INCLURE{fond=inclure/documents}{id_article}{compteur=3})]
+
+[(#REM) Petition :
+La petition ayant une PAGINATION il faut absolument {env}
+et pourquoi pas ajax
+][(#PETITION|oui)<INCLURE{fond=inclure/petition}{id_article}{env}{ajax}>]
+
+[<div class="notes surlignable"><h4 class="pas_surlignable"><:info_notes:></h4>(#NOTES)</div>]
+
+[(#REM) Forum de l'article ]
+<a href="#forum" name="forum" id="forum"></a>
+<INCLURE{fond=inclure/forum}{id_article} />
+[<p class="info-publi"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:repondre_article:></a>
+[(#PLUGIN{article_pdf}|oui) | <a href="spip.php?page=article_pdf&amp;id_article=#ID_ARTICLE" onclick="window.open(this.href); return false;" title="<:beespip:article_pdf:>"><:beespip:article_pdf:></a>]</p>]
+</div>
+
+<div id="colonne" class="grid_4">
+       <INCLURE{fond=extra/#ENV{type},env}>
+</div>
+</BOUCLE_contenu_article>
diff --git a/www/plugins/beespip/contenu/article-logo_droite.xml b/www/plugins/beespip/contenu/article-logo_droite.xml
new file mode 100755 (executable)
index 0000000..583435c
--- /dev/null
@@ -0,0 +1,4 @@
+<composition>
+  <nom>Article avec logo en colonne droite</nom>
+  <description>Le logo est en colonne de droite, et le titre et le chapeau sont sur toute la largeur de la page.</description>
+</composition>
diff --git a/www/plugins/beespip/contenu/article-pleine_largeur.html b/www/plugins/beespip/contenu/article-pleine_largeur.html
new file mode 100755 (executable)
index 0000000..b27d84a
--- /dev/null
@@ -0,0 +1,53 @@
+<BOUCLE_contenu_article(ARTICLES){id_article}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p 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; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+<div id="contenu" class="grid_16">
+
+       <div class="cartouche">
+               [(#LOGO_ARTICLE||image_reduire{200,200}|inserer_attribut{class,float-left})]
+               [<p class="#EDIT{surtitre} surtitre">(#SURTITRE)</p>]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>]
+
+               [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article})]
+               
+               [(#REM) Inclure le modele des liens de traductions ]
+               #MODELE{article_traductions}
+       </div>
+
+       <div class="surlignable">
+               [<div class="#EDIT{chapo} chapo">(#CHAPO|image_reduire{900,0})</div>]
+       </div>
+
+       <div class="surlignable">
+               [<div class="#EDIT{texte} texte">(#TEXTE|image_reduire{900,0})</div>]
+       </div>
+
+       [<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+
+       [<div class="ps">
+               <h4><:info_ps:></h4>
+               <div class="#EDIT{ps} surlignable">(#PS|image_reduire{900,0})</div>
+       </div>]
+
+[(#REM) Gestion du portfolio et des documents ]
+[(#INCLURE{fond=inclure/documents}{id_article}{compteur=4})]
+
+[(#REM) Petition :
+La petition ayant une PAGINATION il faut absolument {env}
+et pourquoi pas ajax
+][(#PETITION|oui)<INCLURE{fond=inclure/petition}{id_article}{env}{ajax}>]
+
+[<div class="notes surlignable"><h4 class="pas_surlignable"><:info_notes:></h4>(#NOTES)</div>]
+
+[(#REM) Forum de l'article ]
+<a href="#forum" name="forum" id="forum"></a>
+<INCLURE{fond=inclure/forum}{id_article} />
+[<p class="info-publi"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:repondre_article:></a>
+[(#PLUGIN{article_pdf}|oui) | <a href="spip.php?page=article_pdf&amp;id_article=#ID_ARTICLE" onclick="window.open(this.href); return false;" title="<:beespip:article_pdf:>"><:beespip:article_pdf:></a>]</p>]
+</div>
+
+[<div id="colonne_bandeau" class="grid_16">(#INCLURE{fond=extra/#ENV{type}-#COMPOSITION,env})</div>]
+
+</BOUCLE_contenu_article>
diff --git a/www/plugins/beespip/contenu/article-pleine_largeur.xml b/www/plugins/beespip/contenu/article-pleine_largeur.xml
new file mode 100755 (executable)
index 0000000..857ad03
--- /dev/null
@@ -0,0 +1,4 @@
+<composition>
+  <nom>Article en pleine largeur</nom>
+  <description>L'article est affiché sur toute la largeur de la page</description>
+</composition>
diff --git a/www/plugins/beespip/contenu/article.html b/www/plugins/beespip/contenu/article.html
new file mode 100755 (executable)
index 0000000..568c5eb
--- /dev/null
@@ -0,0 +1,50 @@
+<BOUCLE_contenu_article(ARTICLES){id_article}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p 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; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+<div id="contenu" class="grid_12">
+       <div class="cartouche">
+               [(#LOGO_ARTICLE||image_reduire{200,200}|inserer_attribut{class,float-left})]
+               [<p class="#EDIT{surtitre} surtitre">(#SURTITRE)</p>]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>]
+               
+               [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article})]
+
+               [(#REM) Inclure le modele des liens de traductions ]
+               #MODELE{article_traductions}
+       </div>
+
+       <div class="surlignable">
+               [<div class="#EDIT{chapo} chapo">(#CHAPO|image_reduire{640,0})</div>]
+               [<div class="#EDIT{texte} texte">(#TEXTE|image_reduire{640,0})</div>]
+       </div>
+
+       [<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+
+       [<div class="ps">
+               <h4><:info_ps:></h4>
+               <div class="#EDIT{ps} surlignable">(#PS|image_reduire{640,0})</div>
+       </div>]
+
+[(#REM) Gestion du portfolio et des documents ]
+[(#INCLURE{fond=inclure/documents}{id_article}{compteur=3})]
+
+[(#REM) Petition :
+La petition ayant une PAGINATION il faut absolument {env}
+et pourquoi pas ajax
+][(#PETITION|oui)<INCLURE{fond=inclure/petition}{id_article}{env}{ajax}>]
+
+[<div class="notes surlignable"><h4 class="pas_surlignable"><:info_notes:></h4>(#NOTES)</div>]
+
+[(#REM) Forum de l'article ]
+<a href="#forum" name="forum" id="forum"></a>
+<INCLURE{fond=inclure/forum}{id_article} />
+[<p class="info-publi"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:repondre_article:></a>
+[(#PLUGIN{article_pdf}|oui) | <a href="spip.php?page=article_pdf&amp;id_article=#ID_ARTICLE" onclick="window.open(this.href); return false;" title="<:beespip:article_pdf:>"><:beespip:article_pdf:></a>]</p>]
+</div>
+
+<div id="colonne" class="grid_4">
+       <INCLURE{fond=extra/#ENV{type},env}>
+</div>
+</BOUCLE_contenu_article>
diff --git a/www/plugins/beespip/contenu/auteur.html b/www/plugins/beespip/contenu/auteur.html
new file mode 100755 (executable)
index 0000000..e3fd316
--- /dev/null
@@ -0,0 +1,46 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<BOUCLE_contenu_auteur(AUTEURS){id_auteur}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <:info_auteurs:>[ &gt; <strong class="on">(#NOM|couper{80})</strong>]</p>
+<div id="contenu_presentation" class="grid_16">
+
+       <div class="vcard">[(#REM) microformat vcard]
+               <div class="cartouche">
+                       [(#LOGO_AUTEUR||image_reduire{200,200}|inserer_attribut{class,float-left})]
+                       <h1 class="h1 #EDIT{qui} fn">#NOM</h1>
+               </div>
+
+               [<div class="#EDIT{bio} texte note">(#BIO)</div>]
+               [<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="url spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+       </div>[(#REM) / vcard]
+</div>
+<div id="contenu" class="grid_8">
+
+       [(#REM) Articles de l'auteur ]
+       <INCLURE{fond=inclure/articles_liste,id_auteur,lang,doublons}{tri=date}{ordre=1}{ajax}>
+
+[<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+</div>
+
+<div id="colonne" class="grid_8 ajax">
+#FORMULAIRE_ECRIRE_AUTEUR
+
+<INCLURE{fond=extra/#ENV{type},env}{ajax}{doublons}>
+       
+</div>
+</BOUCLE_contenu_auteur>
diff --git a/www/plugins/beespip/contenu/breve.html b/www/plugins/beespip/contenu/breve.html
new file mode 100755 (executable)
index 0000000..8ce5974
--- /dev/null
@@ -0,0 +1,21 @@
+<BOUCLE_breve_principal(BREVES) {id_breve}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/" ><:accueil_site:></a><BOUCLE_ariane(RUBRIQUES){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+<div id="contenu" class="grid_12">
+  <div class="cartouche">
+      [(#LOGO_BREVE||image_reduire{200,200}|inserer_attribut{class,float-left})]
+      <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+      [(#CONFIG{BeeSpip/affichage/dates_breves}|=={'oui'}|oui)<p class="post-info"><abbr class="date" title="[(#DATE|date_iso)]">[(#DATE|nom_jour)] [(#DATE|affdate)]</abbr></p>]
+  </div>
+  
+  [<div class="#EDIT{texte} texte">(#TEXTE)</div>]
+  [<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+  [<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+
+</div>
+
+<div id="colonne" class="grid_4">
+       <INCLURE{fond=extra/#ENV{type},env}{doublons}>
+</div>  
+</BOUCLE_breve_principal>
diff --git a/www/plugins/beespip/contenu/mot.html b/www/plugins/beespip/contenu/mot.html
new file mode 100755 (executable)
index 0000000..e694b56
--- /dev/null
@@ -0,0 +1,46 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<BOUCLE_mot_principal(MOTS) {id_mot} {doublons}{type!==^[~]}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <:mots_clefs:><BOUCLE_ariane(GROUPES_MOTS){id_groupe}> &gt; [(#TITRE|couper{80})]</BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+<div id="contenu" class="grid_12">
+       <div class="cartouche">
+               [(#LOGO_MOT||image_reduire{200,200}|inserer_attribut{class,float-left})]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+       </div>
+       [<div class="#EDIT{texte} chapo">(#TEXTE)</div>]
+               
+       [(#REM) Articles lies au mot-cle]
+       <INCLURE{fond=inclure/articles_liste,id_mot,lang,doublons}{tri=date}{ordre=1}{ajax}>
+               
+       [(#REM) Rubriques liees au mot-cle]
+       <INCLURE{fond=inclure/mot_rubriques,id_mot,lang,doublons}{ajax}{nbpages=5}>
+
+       [(#REM) Breves liees au mot-cle]
+       <INCLURE{fond=inclure/mot_breves,id_mot,lang,doublons}{ajax}{nbpages=5}>
+
+       [(#REM) Sites Web lies au mot-cle]
+       <INCLURE{fond=inclure/mot_sites,id_mot,doublons}{ajax}{nbpages=5}>
+
+
+       [<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+       </div>
+
+       <div id="colonne" class="grid_4">
+               <INCLURE{fond=extra/#ENV{type},env}{doublons}>
+       </div>
+</BOUCLE_mot_principal>
diff --git a/www/plugins/beespip/contenu/page-401.html b/www/plugins/beespip/contenu/page-401.html
new file mode 100755 (executable)
index 0000000..1de34f8
--- /dev/null
@@ -0,0 +1,10 @@
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <strong class="on"><:pass_erreur:>[ (#ENV{status})]</strong></p>
+<div id="contenu" class="grid_16">
+       <div class="cartouche">
+               <h1 class="h1"><:pass_erreur:>[ (#ENV{status})]</h1>
+       </div>
+       [<div class="chapo">(#ENV*{erreur}|propre)</div>]
+       #FORMULAIRE_LOGIN{#ENV{cible},'',0}
+</div>
diff --git a/www/plugins/beespip/contenu/page-404.html b/www/plugins/beespip/contenu/page-404.html
new file mode 100755 (executable)
index 0000000..f1baa36
--- /dev/null
@@ -0,0 +1,9 @@
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <strong class="on"><:pass_erreur:> 404</strong></p>
+<div id="contenu" class="grid_16">
+       <div class="cartouche">
+               <h1 class="h1"><:pass_erreur:> 404</h1>
+       </div>
+       [<div class="chapo">(#ENV{erreur})</div>]
+</div>
diff --git a/www/plugins/beespip/contenu/page-forum.html b/www/plugins/beespip/contenu/page-forum.html
new file mode 100755 (executable)
index 0000000..999cfa6
--- /dev/null
@@ -0,0 +1,91 @@
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a>
+
+               <BOUCLE_contexte_article(ARTICLES) {id_article}>
+               <BOUCLE_ariane_article(HIERARCHIE) {id_article}>
+               &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+               </BOUCLE_ariane_article>
+               &gt; <a href="#URL_ARTICLE">[(#TITRE|couper{80})]</a>
+               </BOUCLE_contexte_article>
+               </B_contexte_article>
+
+               <BOUCLE_contexte_breve(BREVES) {id_breve}>
+               <BOUCLE_ariane_breve(RUBRIQUES) {id_rubrique}>
+               &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+               </BOUCLE_ariane_breve>
+               &gt; <a href="#URL_BREVE">[(#TITRE|couper{80})]</a>
+               </BOUCLE_contexte_breve>
+
+               <BOUCLE_contexte_rubrique(RUBRIQUES) {id_rubrique}>
+               <BOUCLE_ariane_rubrique(HIERARCHIE) {id_rubrique}>
+               &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+               </BOUCLE_ariane_rubrique>
+               &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+               </BOUCLE_contexte_rubrique>
+
+               <BOUCLE_contexte_site(SITES) {id_syndic}>
+               <BOUCLE_ariane_site(HIERARCHIE) {id_rubrique}>
+               &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+               </BOUCLE_ariane_site>
+               &gt; <a href="[(#ID_SYNDIC|generer_url_entite{'site'})]">[(#TITRE|couper{80})]</a>
+               </BOUCLE_contexte_site>
+
+               <//B_contexte_site>
+               <//B_contexte_rubrique>
+               <//B_contexte_breve>
+               <//B_contexte_article>
+
+               <BOUCLE_contexte_forum(FORUMS) {id_forum}>
+               &gt; <a href="#URL_FORUM">[(#TITRE|couper{80})]</a>
+               </BOUCLE_contexte_forum>
+
+               &gt; <strong class="on"><:poster_message:></strong>
+               
+       </p><!--#hierarchie-->
+<div id="contenu" class="grid_12">
+
+
+       <div class="cartouche">
+               <h1 class="h1"><:poster_message:></h1>
+       </div>
+
+       <div class="resume articles">
+               <h2><:en_reponse:></h2>
+
+               <BOUCLE_forum_parent(FORUMS) {id_forum}>
+               <h3><a href="#URL_FORUM">#TITRE</a></h3>
+               <p class="post-info">Publi&eacute; par [(#NOM)] | <abbr class="date" title="[(#DATE|date_iso)]">[(#DATE|affdate_jourcourt)][&nbsp;(#DATE|heures)][:(#DATE|minutes)]</abbr></p>
+               [<div class="introduction">(#INTRODUCTION|lignes_longues)</div>]
+               </BOUCLE_forum_parent>
+               
+               <BOUCLE_article(ARTICLES) {id_article}>
+               <h3><a href="#URL_ARTICLE" rel="bookmark">[(#LOGO_ARTICLE_RUBRIQUE||image_reduire{150,100})]#TITRE</a></h3>
+               <p class="post-info">Publi&eacute; par [(#LESAUTEURS)] | <abbr class="date" title="[(#DATE|date_iso)]">[(#DATE|nom_jour)] [(#DATE|affdate)]</abbr></p>
+               [<div class="#EDIT{intro} introduction entry-content">(#INTRODUCTION)</div>]
+               <p class="info-publi"><a class="lire-la-suite" href="#URL_ARTICLE"><:zpip:lire_la_suite:><span class="lire-la-suite-titre"><:zpip:lire_la_suite_de:> <em>#TITRE</em></span></a>
+               </BOUCLE_article>
+               
+               <BOUCLE_breve(BREVES) {id_breve}>
+               [(#LOGO_BREVE||image_reduire{150,100})]
+               <h3><a href="#URL_BREVE">#TITRE</a></h3>
+               <p class="post-info"<abbr class="date" title="[(#DATE|date_iso)]">[(#DATE|affdate_jourcourt)]</abbr></p>
+               [<div class="introduction">(#INTRODUCTION)</div>]
+               </BOUCLE_breve>
+               
+               <BOUCLE_rubrique(RUBRIQUES) {id_rubrique}>
+               <h3><a href="#URL_RUBRIQUE">#TITRE</a></h3>
+               [<div class="texte">(#TEXTE)</div>]
+               </BOUCLE_rubrique>
+               
+               <BOUCLE_syndic(SITES) {id_syndic}>
+               <h3><a href="[(#ID_SYNDIC|generer_url_entite{'site'})]">#NOM_SITE</a></h3>
+               [<div class="texte">(#DESCRIPTIF)</div>]
+               </BOUCLE_syndic>
+               
+               <//B_forum_parent>
+
+       </div>
+
+       #FORMULAIRE_FORUM
+</div>
diff --git a/www/plugins/beespip/contenu/page-login.html b/www/plugins/beespip/contenu/page-login.html
new file mode 100755 (executable)
index 0000000..a0b55ab
--- /dev/null
@@ -0,0 +1,20 @@
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a>[ &gt; <strong class="on">(#GET{prive}|?{<:login_acces_prive:>,<:lien_connecter:>})</strong>]</p>
+
+<div id="contenu" class="grid_16">
+       [(#REM)
+               Est-ce qu'on se connecte a l'espace prive ou pas ?
+       ]
+       [(#ENV{url}|=={''}|?{#SET{prive,' '}})]
+       [(#ENV{url}|match{^#EVAL{_DIR_RESTREINT_ABS}}|?{#SET{prive,' '}})]
+
+       <div class="cartouche">
+               [<h1 class="h1">(#GET{prive}|?{<:login_acces_prive:>,<:lien_connecter:>})</h1>]
+               <p class="soustitre">#NOM_SITE_SPIP</p>
+       </div>
+       <div class="prefix_4 grid_8">
+       #MENU_LANG_ECRIRE
+       
+       [(#FORMULAIRE_LOGIN{#ENV{url}|sinon{#URL_ECRIRE{accueil}}})]
+       </div>
+</div>
diff --git a/www/plugins/beespip/contenu/page-plan.html b/www/plugins/beespip/contenu/page-plan.html
new file mode 100755 (executable)
index 0000000..a78defe
--- /dev/null
@@ -0,0 +1,58 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <strong class="on"><:plan_site:></strong></p>
+<div id="contenu" class="grid_16">      
+       <div class="cartouche">
+               <h1 class="h1"><:plan_site:></h1>
+       </div>
+
+       <BOUCLE_secteurs(RUBRIQUES) {racine} {par titre}{doublons}>
+
+               <h2 class="h2"><a href="#URL_RUBRIQUE">#TITRE</a></h2>
+
+               [(#REM) Articles et sous-rubriques ]
+               <B_articles_racine>
+               <ul class="plan">
+                       <BOUCLE_articles_racine(ARTICLES) {id_rubrique} {par titre}{doublons}>
+                       <li><a href="#URL_ARTICLE">#TITRE</a></li>
+                       </BOUCLE_articles_racine>
+               </ul>
+               </B_articles_racine>
+
+               <B_rubriques>
+               <ul class="plan">
+                       <BOUCLE_rubriques(RUBRIQUES) {id_parent} {par titre}{doublons}>
+                       <li>
+                               <strong><a href="#URL_RUBRIQUE">#TITRE</a></strong>
+                               
+                               <B_articles>
+                               <ul>
+                                       <BOUCLE_articles(ARTICLES) {id_rubrique} {par titre}{doublons}>
+                                       <li><a href="#URL_ARTICLE">#TITRE</a></li>
+                                       </BOUCLE_articles>
+                               </ul>
+                               </B_articles>
+                               
+                               <BOUCLE_sous_rubriques(BOUCLE_rubriques)></BOUCLE_sous_rubriques>
+                       </li>
+                       </BOUCLE_rubriques>
+               </ul>
+               </B_rubriques>
+
+       </BOUCLE_secteurs>
+</div>
diff --git a/www/plugins/beespip/contenu/page-recherche.html b/www/plugins/beespip/contenu/page-recherche.html
new file mode 100755 (executable)
index 0000000..dd1d387
--- /dev/null
@@ -0,0 +1,53 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <:info_rechercher:>[ &gt; <strong class="on">(#RECHERCHE)</strong>]</p>
+
+<div id="contenu" class="grid_16">
+       [<div class="cartouche">
+               <h1 class="h1"><:resultats_recherche:></h1>
+               <p class="soustitre">&#171;&nbsp;(#RECHERCHE)&nbsp;&#187;</p>
+       </div>]
+
+       [(#REM) Articles trouves ]
+       <B_articles>
+       <div class="liste resultats articles">
+               #ANCRE_PAGINATION
+               <h2 class="h2"><:articles:> (#GRAND_TOTAL)</h2>
+               <ul class="liste-items">
+                       <BOUCLE_articles(ARTICLES) {recherche} {par points}{inverse} {pagination}{doublons}>
+                       <li class="item"><a href="#URL_ARTICLE">#TITRE</a></li>
+                       </BOUCLE_articles>
+               </ul>
+               [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       </div>
+       </B_articles>
+
+       [(#REM) Rubriques trouvees ]
+       <B_rubriques>
+       <div class="liste resultats rubriques">
+               #ANCRE_PAGINATION
+               <h2 class="h2"><:rubriques:> (#GRAND_TOTAL)</h2>
+               <ul class="liste-items">
+                       <BOUCLE_rubriques(RUBRIQUES) {recherche} {par points}{inverse} {pagination 5}{doublons}>
+                       <li class="item"><a href="#URL_RUBRIQUE">#TITRE</a></li>
+                       </BOUCLE_rubriques>
+               </ul>
+               [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       </div>
+       </B_rubriques>
+</div>
diff --git a/www/plugins/beespip/contenu/page-sommaire.html b/www/plugins/beespip/contenu/page-sommaire.html
new file mode 100755 (executable)
index 0000000..82a27ea
--- /dev/null
@@ -0,0 +1,72 @@
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+<div id="contenu" class="grid_12">
+       #SET{nb_articles_une,#CONFIG{BeeSpip/configuration/nb_article_une}}
+       #SET{nb_articles_sousune,#CONFIG{BeeSpip/configuration/nb_ligne_sousune}|mult{3}}
+
+       #SET{articles_avec_motscles,#ARRAY}
+       [(#REM) Les articles en "sous-une" ne peuvent pas être récupérés pour les boucles "sansmotscles"]
+       <BOUCLE_article_sousune(ARTICLES){titre_mot=actualites_sous_une}{!par date}{lang}{doublons}{0,#GET{nb_articles_sousune}}></BOUCLE_article_sousune>
+
+       [(#REM) Les articles de la colonne de droite ne peuvent pas être récupérés pour les boucles "sansmotscles"]
+       <BOUCLE_article_colonne_droite(ARTICLES){titre_mot=actualites_colonne_droite}{!par date}{lang}{doublons sansmotscles}{0,#CONFIG{BeeSpip/configuration/nb_article_col_droite}}></BOUCLE_article_colonne_droite>
+
+       
+       [(#REM) Si la page est en "slide2", il faut découper en 3 colonnes]
+       [(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide2'}|oui)<div class="grid_8 alpha">]
+
+       [(#CONFIG{BeeSpip/configuration/page_accueil}|match{'slide'}|oui)<div id="slider" style="margin-top:10px;"><ul>]
+       <BOUCLE_articles_actualites(ARTICLES){titre_mot=actualites_une}{!par date}{lang}{0,#GET{nb_articles_une}}{doublons}>
+               [(#CONFIG{BeeSpip/configuration/page_accueil}|match{'slide'}|oui)<INCLURE{fond=inclure/articles_une_slide,id_article,lang}{nb_articles_une_encours=#COMPTEUR_BOUCLE}>]
+               [(#CONFIG{BeeSpip/configuration/page_accueil}|match{'slide'}|non)<INCLURE{fond=inclure/articles_liste,id_article,lang}{bloc=pagination}{largeur=680}{tri=date}{ordre=1}>]
+       </BOUCLE_articles_actualites>
+               <BOUCLE_articles_actualites_sansmotscles(ARTICLES){!par date}{lang}{doublons}{doublons sansmotscles}{0,#GET{nb_articles_une}}>
+                       [(#CONFIG{BeeSpip/configuration/page_accueil}|match{'slide'}|oui)<INCLURE{fond=inclure/articles_une_slide,id_article,lang}{nb_articles_une_encours=#COMPTEUR_BOUCLE}>]
+                       [(#CONFIG{BeeSpip/configuration/page_accueil}|match{'slide'}|non)<INCLURE{fond=inclure/articles_liste,id_article,lang}{bloc=pagination}{largeur=680{tri=date}{ordre=1}>]
+               </BOUCLE_articles_actualites_sansmotscles>
+       <//B_articles_actualites>
+       [(#CONFIG{BeeSpip/configuration/page_accueil}|match{'slide'}|oui)</ul></div>]
+
+       [(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide2'}|oui)</div><div class="grid_4 omega actucolonne2">#INCLURE{fond=inclure/articles_une_colonne_droite,lang,doublons}</div>]
+       <div class="clear">&nbsp;</div>
+                       
+       <BOUCLE_article_sous_une(ARTICLES){titre_mot=actualites_sous_une}{!par date}{lang}{0,#GET{nb_articles_sousune}}>
+       <div class="grid_4[(#COMPTEUR_BOUCLE|alterner{' alpha','',' omega'})]">
+       <h3 class="sommaire"><a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a></h3>
+       [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article}{affichage=court})]
+       [<div style="text-align:center">(#LOGO_ARTICLE_RUBRIQUE||image_reduire{190,120}|inserer_attribut{alt,#TITRE|texte_backend})</div>][(#DESCRIPTIF|sinon{<p>[(#INTRODUCTION|couper{250}|PtoBR)]</p>}|image_reduire{190,120})]
+       <p><a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]" class="lire_la_suite">Lire la suite</a></p>
+       </div>[(#COMPTEUR_BOUCLE|modulo{3}|non)<div class="clear">&nbsp;</div>]
+       </BOUCLE_article_sous_une>
+               <BOUCLE_article_sous_une_sansmotscles(ARTICLES){!par date}{lang}{doublons}{doublons sansmotscles}{0,#GET{nb_articles_sousune}}>
+               <div class="grid_4[(#COMPTEUR_BOUCLE|alterner{' alpha','',' omega'})]">
+               <h3 class="sommaire"><a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a></h3>
+               [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article}{affichage=court})]
+               [<div style="text-align:center">(#LOGO_ARTICLE_RUBRIQUE||image_reduire{190,120}|inserer_attribut{alt,#TITRE|texte_backend})</div>][(#DESCRIPTIF|sinon{<p>[(#INTRODUCTION|couper{250}|PtoBR)]</p>}|image_reduire{190,120})]
+               <p><a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]" class="lire_la_suite">Lire la suite</a></p>
+               </div>[(#COMPTEUR_BOUCLE|modulo{3}|non)<div class="clear">&nbsp;</div>]
+               </BOUCLE_article_sous_une_sansmotscles>
+       <//B_article_sous_une>
+       
+       [(#CONFIG{BeeSpip/configuration/autres_articles}|=={'oui'}|oui)<hr class="spip" />[(#INCLURE{fond=inclure/articles_une_recents,env,lang}{ajax}{doublons})]]
+</div>
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+
+<div id="colonne" class="grid_4">
+       <INCLURE{fond=extra/#ENV{type},env}{doublons}>
+</div>
+
+
diff --git a/www/plugins/beespip/contenu/page-spip_pass.html b/www/plugins/beespip/contenu/page-spip_pass.html
new file mode 100755 (executable)
index 0000000..bf7b6db
--- /dev/null
@@ -0,0 +1,15 @@
+<div id="contenu" class="grid_16">
+       [(#REM) Fil d'Ariane ]
+       <p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a>[ &gt; <strong class="on">(#GET{prive}|?{<:login_acces_prive:>,<:lien_connecter:>})</strong>]</p>
+
+       <h1 class="h1 spip">#NOM_SITE_SPIP</h1>
+
+       <div class="prefix_4 grid_8">
+               [(#ENV{p}|non)
+                       #FORMULAIRE_OUBLI
+               ]
+               [(#ENV{p}|oui)
+                       #FORMULAIRE_MOT_DE_PASSE
+               ]
+       </div>
+</div>
diff --git a/www/plugins/beespip/contenu/rubrique-a3cols.html b/www/plugins/beespip/contenu/rubrique-a3cols.html
new file mode 100755 (executable)
index 0000000..221e550
--- /dev/null
@@ -0,0 +1,70 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<BOUCLE_contenu_rubrique(RUBRIQUES){id_rubrique}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+
+<div id="contenu" class="grid_8">
+       <div class="cartouche">
+               [(#LOGO_RUBRIQUE||image_reduire{200,200}|inserer_attribut{class,float-left})]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [(#CONFIG{BeeSpip/affichage/dates_articles}|=={'oui'}|oui)[<p class="post-info"><:dernier_ajout:> | <abbr class="date" title="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</abbr></p>]]
+       </div>
+       [<div class="#EDIT{texte} chapo">(#TEXTE)</div><div class="clear">&nbsp;</div>]
+       
+
+       [(#REM) Gestion du portfolio et des documents ]
+       [(#INCLURE{fond=inclure/documents}{id_rubrique})]       
+
+       <INCLURE{fond=inclure/articles_liste,id_rubrique,lang,doublons}{tri=date}{ordre=1}{ajax}{nbpages=3}{largeur=440}>
+
+
+       [(#REM) Proposer un site ]
+       #FORMULAIRE_SITE
+
+       [<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+</div>
+
+<div id="colonne"  class="grid_8">
+               <div class="grid_4 alpha">
+               [(#REM) Affiche un plan de la rubrique ]
+               <B_sous_rubriques>
+               <div class="menu rubriques">
+                       [(#CONFIG{BeeSpip/affichage/libelle_rubrique_article}|=={'oui'}|oui)<h4><:sous_rubriques:></h4>]
+                       <ul class="menu-liste">
+                               <BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}{doublons}>
+                               <li class="menu-entree">
+                                       <a href="#URL_RUBRIQUE">[(#TITRE)]</a>[<br />(#DESCRIPTIF|PtoBR)]
+
+                                       [(#REM) Une boucle recursive pour le mini plan]
+                                       <B_miniplan>
+                                       <ul class="menu-liste">
+                                               <BOUCLE_miniplan(RUBRIQUES) {id_parent} {par num titre, titre}{doublons}>
+                                               <li class="menu-entree">
+                                                       <a href="#URL_RUBRIQUE">[(#TITRE)]</a>[<br />(#DESCRIPTIF|PtoBR)]
+                                                       <BOUCLE_m2(BOUCLE_miniplan)></BOUCLE_m2>
+                                               </li>
+                                               </BOUCLE_miniplan>
+                                       </ul>
+                                       </B_miniplan>
+
+                               </li>
+                               </BOUCLE_sous_rubriques>
+                       </ul>
+                       </div>
+               </B_sous_rubriques>
+
+               </div>
+               <div class="grid_4 alpha omega">
+                       <INCLURE{fond=extra/#ENV{type},env}{nodiv=oui}{doublons}>
+               </div>
+</div>
+</BOUCLE_contenu_rubrique>
diff --git a/www/plugins/beespip/contenu/rubrique-a3cols.xml b/www/plugins/beespip/contenu/rubrique-a3cols.xml
new file mode 100755 (executable)
index 0000000..a6d2d69
--- /dev/null
@@ -0,0 +1,4 @@
+<composition>
+  <nom>Présentation de la rubrique en 3 colonnes</nom>
+  <description>Les articles sont affichés par 3 à gauche, les rubriques au milieu et les brèves et sites web à droite.</description>
+</composition>
diff --git a/www/plugins/beespip/contenu/rubrique-articles_2cols.html b/www/plugins/beespip/contenu/rubrique-articles_2cols.html
new file mode 100755 (executable)
index 0000000..e59d4aa
--- /dev/null
@@ -0,0 +1,79 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<BOUCLE_contenu_rubrique(RUBRIQUES){id_rubrique}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+
+<div id="contenu_presentation" class="grid_16">
+       <div class="cartouche">
+               [(#LOGO_RUBRIQUE||image_reduire{200,200}|inserer_attribut{class,float-right})]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [(#CONFIG{BeeSpip/affichage/dates_articles}|=={'oui'}|oui)[<p class="post-info"><:dernier_ajout:> | <abbr class="date" title="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</abbr></p>]]
+       </div>
+       [<div class="#EDIT{texte} chapo">(#TEXTE)</div><div class="clear">&nbsp;</div>]
+
+       [(#REM) Gestion du portfolio et des documents ]
+       [(#INCLURE{fond=inclure/documents}{id_rubrique})]       
+
+       [(#REM) Affiche un plan de la rubrique ]
+       <B_sous_rubriques>
+       <div class="menu rubriques">
+               [(#CONFIG{BeeSpip/affichage/libelle_rubrique_article}|=={'oui'}|oui)<h2><:sous_rubriques:></h2>]
+               <ul class="menu-liste">
+                       <BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}{doublons}>
+                       <li class="menu-entree">
+                               <a href="#URL_RUBRIQUE">[(#TITRE)]</a>[<br />(#DESCRIPTIF|PtoBR)]
+
+                               [(#REM) Une boucle recursive pour le mini plan]
+                               <B_miniplan>
+                               <ul class="menu-liste">
+                                       <BOUCLE_miniplan(RUBRIQUES) {id_parent} {par num titre, titre}{doublons}>
+                                       <li class="menu-entree">
+                                               <a href="#URL_RUBRIQUE">[(#TITRE)]</a>[<br />(#DESCRIPTIF|PtoBR)]
+                                               <BOUCLE_m2(BOUCLE_miniplan)></BOUCLE_m2>
+                                       </li>
+                                       </BOUCLE_miniplan>
+                               </ul>
+                               </B_miniplan>
+
+                       </li>
+                       </BOUCLE_sous_rubriques>
+               </ul>
+               </div>
+       </B_sous_rubriques>
+</div>
+<div id="contenu" class="grid_16">
+       
+       <B_calcul_articles>
+       [(#REM) Si le nombre d'articles de la rubrique est inférieur à 10, on calcule la valeur pour répartir les articles en 2 colonnes]
+               #SET{rupture,#TOTAL_BOUCLE|div{2}|ceil}
+               #SET{col2,#GET{rupture}|plus{1}}
+       <BOUCLE_calcul_articles(ARTICLES){id_rubrique}{!par date}{debut_articles,10}> </BOUCLE_calcul_articles>
+
+       <B_articles>
+       #ANCRE_PAGINATION
+       #SET{compteur_boucle,0}
+       <div class="grid_8 alpha"><BOUCLE_articles(ARTICLES){id_rubrique}{!par date}{pagination 10}{doublons}>
+               #SET{compteur_boucle,#GET{compteur_boucle}|plus{1}}
+               [(#GET{compteur_boucle}|=={#GET{col2}}|oui)</div><div class="grid_8 omega">]
+               <INCLURE{fond=inclure/articles_liste,id_article=#ID_ARTICLE,lang}{bloc=pagination}{largeur=440}{tri=date}{ordre=1}>
+       </BOUCLE_articles></div>
+       <div class="clear">&nbsp;</div>[<div class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</div>]
+       </B_articles>
+
+       [(#REM) Proposer un site ]
+       #FORMULAIRE_SITE
+
+       [<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+</div>
+
+[<div id="colonne_bandeau" class="grid_16">(#INCLURE{fond=extra/#ENV{type}-#COMPOSITION,env}{doublons})</div>]
+</BOUCLE_contenu_rubrique>
diff --git a/www/plugins/beespip/contenu/rubrique-articles_2cols.xml b/www/plugins/beespip/contenu/rubrique-articles_2cols.xml
new file mode 100755 (executable)
index 0000000..51c8f24
--- /dev/null
@@ -0,0 +1,4 @@
+<composition>
+  <nom>Présentation des articles en 2 colonnes</nom>
+  <description>Les articles sont affichés en 2 colonnes, et les autres éléments en pied de page. Le logo de la rubrique est affiché à droite.</description>
+</composition>
diff --git a/www/plugins/beespip/contenu/rubrique-articles_4cols.html b/www/plugins/beespip/contenu/rubrique-articles_4cols.html
new file mode 100755 (executable)
index 0000000..1b53db5
--- /dev/null
@@ -0,0 +1,66 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<BOUCLE_contenu_rubrique(RUBRIQUES){id_rubrique}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+<script type="text/javascript">
+       function equalHeight(group) {
+               var tallest = 0;
+               group.each(function() {
+                       var thisHeight = $(this).height();
+                       if(thisHeight > tallest) {
+                               tallest = thisHeight;
+                       }
+               });
+               group.height(tallest);
+       }
+       $(document).ready(function() {
+               equalHeight($(".liste_bloc"));
+       });
+</script>
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+
+<div id="contenu_presentation" class="grid_16">
+       <div class="cartouche">
+               [(#LOGO_RUBRIQUE||image_reduire{200,200}|inserer_attribut{class,float-right})]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [(#CONFIG{BeeSpip/affichage/dates_articles}|=={'oui'}|oui)[<p class="post-info"><:dernier_ajout:> | <abbr class="date" title="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</abbr></p>]]
+       </div>
+       [<div class="#EDIT{texte} chapo">(#TEXTE)</div><div class="clear">&nbsp;</div>]
+
+       [(#REM) Gestion du portfolio et des documents ]
+       [(#INCLURE{fond=inclure/documents}{id_rubrique})]
+</div>
+<div id="contenu" class="grid_16">
+       #SET{increment,0}
+       <BOUCLE_sous_rubriques(RUBRIQUES){par num titre,titre}{id_parent}{doublons}>
+       <BOUCLE_articles(ARTICLES){par num titre,titre}{id_rubrique = #_contenu_rubrique:ID_RUBRIQUE}{titre<#TITRE*}{doublons}>
+       [(#GET{increment}|=={4}|oui)<div class="clear">&nbsp;</div>#SET{increment,0}]#SET{increment,#GET{increment}|plus{1}}
+       <div class="grid_4[(#GET{increment}|=={1}|oui) alpha][(#GET{increment}|=={4}|oui) omega]"><div class="liste_bloc"><h3><a href="[(#URL_ARTICLE)]"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></h3>
+       [<div style="text-align:center;"><a href="[(#URL_ARTICLE)]"[ title="(#TITRE|attribut_html)"] class="image_survol">(#LOGO_ARTICLE_RUBRIQUE||image_reduire{180,120})</a></div>][(#DESCRIPTIF|PtoBR)]</div></div>
+       </BOUCLE_articles>
+       [(#GET{increment}|=={4}|oui)<div class="clear">&nbsp;</div>#SET{increment,0}]#SET{increment,#GET{increment}|plus{1}}
+       <div class="grid_4[(#GET{increment}|=={1}|oui) alpha][(#GET{increment}|=={4}|oui) omega]"><div class="liste_bloc"><h3><a href="[(#URL_RUBRIQUE)]"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></h3>
+       [<div style="text-align:center;"><a href="[(#URL_RUBRIQUE)]"[ title="(#TITRE|attribut_html)"] class="image_survol">(#LOGO_ARTICLE_RUBRIQUE||image_reduire{180,120})</a></div>][(#DESCRIPTIF|PtoBR)]</div></div></BOUCLE_sous_rubriques>
+       <BOUCLE_articles_fin(ARTICLES){par num titre,titre}{id_rubrique = #_contenu_rubrique:ID_RUBRIQUE}{doublons}>
+       [(#GET{increment}|=={4}|oui)<div class="clear">&nbsp;</div>#SET{increment,0}]#SET{increment,#GET{increment}|plus{1}}
+       <div class="grid_4[(#GET{increment}|=={1}|oui) alpha][(#GET{increment}|=={4}|oui) omega]"><div class="liste_bloc"><h3><a href="[(#URL_ARTICLE)]"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></h3>
+       [<div style="text-align:center;"><a href="[(#URL_ARTICLE)]"[ title="(#TITRE|attribut_html)"] class="image_survol">(#LOGO_ARTICLE_RUBRIQUE||image_reduire{180,120})</a></div>][(#DESCRIPTIF|PtoBR)]</div></div>
+       </BOUCLE_articles_fin>
+
+
+       [(#REM) Proposer un site ]
+       #FORMULAIRE_SITE
+
+       [<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+</div>
+
+[<div id="colonne_bandeau" class="grid_16">(#INCLURE{fond=extra/#ENV{type}-#COMPOSITION,env}{doublons})</div>]
+</BOUCLE_contenu_rubrique>
diff --git a/www/plugins/beespip/contenu/rubrique-articles_4cols.xml b/www/plugins/beespip/contenu/rubrique-articles_4cols.xml
new file mode 100755 (executable)
index 0000000..4f333f8
--- /dev/null
@@ -0,0 +1,4 @@
+<composition>
+  <nom>Présentation des articles et rubriques en 4 colonnes</nom>
+  <description>Les articles sont affichés en 4 colonnes mélangés avec les rubriques, et les autres éléments en pied de page. Le logo de la rubrique est affiché à droite.</description>
+</composition>
diff --git a/www/plugins/beespip/contenu/rubrique-signets.html b/www/plugins/beespip/contenu/rubrique-signets.html
new file mode 100755 (executable)
index 0000000..8fe1772
--- /dev/null
@@ -0,0 +1,102 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<BOUCLE_contenu_rubrique(RUBRIQUES){id_rubrique}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+<div id="contenu" class="grid_12">
+       <div class="cartouche">
+               [(#LOGO_RUBRIQUE||image_reduire{200,200}|inserer_attribut{class,float-right})]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [(#CONFIG{BeeSpip/affichage/dates_articles}|=={'oui'}|oui)[<p class="post-info"><:dernier_ajout:> | <abbr class="date" title="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</abbr></p>]]
+       </div>
+       [<div class="#EDIT{texte} chapo">(#TEXTE)</div><div class="clear">&nbsp;</div>]
+
+       [(#REM) Gestion du portfolio et des documents ]
+       [(#INCLURE{fond=inclure/documents}{id_rubrique})]       
+
+
+       [(#REM) Compte et affiche le nombre total d'articles de la rubrique]
+       <B_compte_sites>
+       <BOUCLE_compte_sites(SITES){id_rubrique}>
+       </BOUCLE_compte_sites>
+       <p><:beespip:elle_contient:> #TOTAL_BOUCLE <:beespip:sites_references:>.</p>
+       </B_compte_sites>
+
+
+       <B_groupes_mots_tri>
+       <BOUCLE_groupes_mots_tri(GROUPES_MOTS) {id_groupe}{titre==^~~}><p><:beespip:presentation_des:>
+       [(#REM) Compte et affiche le nombre total d'articles de la sélection]
+       <BOUCLE_compte_sites2(SITES){id_groupe}{id_rubrique}>
+       </BOUCLE_compte_sites2><span class="texterub">#TOTAL_BOUCLE</span></B_compte_sites2> <:beespip:sites_par:> <span class="texterub">[(#TITRE|replace{~~}|replace{'&nbsp;'})]</span>.</p>
+       </BOUCLE_groupes_mots_tri>
+
+               <BOUCLE_mots_tri(MOTS){id_groupe}{par titre}{" <p /> "}>
+               <h2><a href="[(#SELF|parametre_url{id_mot|id_groupe,''}|parametre_url{id_mot,#ID_MOT})]" title="[(#DESCRIPTIF|sinon{#TITRE}|textebrut|attribut_html)]">#TITRE</a></h2>
+               <BOUCLE_sites_mots4(SITES) {par nom_site}{id_mot}{id_rubrique}{" <p />&nbsp;<br /> "}>
+               <div style="font-weight:bold;">#PUCE <a href="#URL_SITE" [title="(#DESCRIPTIF|textebrut|attribut_html)"] class="spip_out">#NOM_SITE</a></div>
+               <BOUCLE_mots4(MOTS){type==^~~} {id_syndic} {par titre}{" - "}>
+               <a href="[(#SELF|parametre_url{id_mot|id_groupe,''}|parametre_url{id_mot,#ID_MOT})]" [title="(#DESCRIPTIF|sinon{#TITRE}|textebrut|attribut_html)"]>[(#TITRE|supprimer_numero)]</a>
+               </BOUCLE_mots4>
+               [<div style="text-align:justify;">(#DESCRIPTIF)</div>]
+               </BOUCLE_sites_mots4>
+               </BOUCLE_mots_tri>
+       </B_groupes_mots_tri>
+
+               <B_principale1>
+                       <BOUCLE_detail_mot(MOTS) {id_mot}{0,1}><p><:beespip:selection_des:>
+                       [(#REM)  Compte et affiche le nombre total d'articles de la sélection ]
+                       <B_compte_sites_detail_mot><BOUCLE_compte_sites_detail_mot(SITES){id_mot}{id_rubrique}>
+                       </BOUCLE_compte_sites_detail_mot><span class="texterub">#TOTAL_BOUCLE</span></B_compte_sites_detail_mot> <:beespip:sites_associes:> <strong>[(#TYPE|replace{~~}|replace{'&nbsp;'})] / <span class="texterub">[(#TITRE|supprimer_numero)]</span></strong>.</p></BOUCLE_detail_mot>
+                       </B_detail_mot>
+                       <p><:beespip:liste_sites_par:> <span class="texterub"><:beespip:ordre_alphabetique:></span>.</p>
+                       <//B_detail_mot>
+               <div class="cleaner">&nbsp;</div>
+
+               [(#REM) Colonne gauche ]
+               <div class="grid_6 alpha">
+               <BOUCLE_principale1(SITES) {id_mot?}{par nom_site}{id_rubrique}{1/2}{" <p />&nbsp;<br /> "}>
+               <div style="font-weight:bold;">#PUCE <a href="#URL_SITE" [title="(#DESCRIPTIF|sinon{#TITRE}|textebrut|attribut_html)"] class="spip_out">#NOM_SITE</a></div>
+               <BOUCLE_sites_mots(MOTS) {type==^~~}{id_syndic} {par titre}{" - "}>
+               <a href="[(#SELF|parametre_url{id_mot|id_groupe,''}|parametre_url{id_mot,#ID_MOT})]" [title="(#DESCRIPTIF|sinon{#TITRE}|textebrut|attribut_html)"]>[(#TITRE|supprimer_numero)]</a>
+               </BOUCLE_sites_mots>
+               [<div style="text-align:justify;">(#DESCRIPTIF)</div>]
+               </BOUCLE_principale1>
+               </div>
+
+               [(#REM) Colonne de droite ]
+               <div class="grid_6 omega">
+               <BOUCLE_principale2(SITES) {id_mot?}{par nom_site}{id_rubrique}{2/2}{" <p />&nbsp;<br /> "}>
+               <div style="font-weight:bold;">#PUCE <a href="#URL_SITE" [title="(#DESCRIPTIF|textebrut|attribut_html)"] class="spip_out">#NOM_SITE</a></div>
+               <BOUCLE_sites_mots2(MOTS) {type==^~~} {id_syndic} {par titre}{" - "}>
+               <a href="[(#SELF|parametre_url{id_mot|id_groupe,''}|parametre_url{id_mot,#ID_MOT})]" [title="(#DESCRIPTIF|sinon{#TITRE}|textebrut|attribut_html)"]>[(#TITRE|supprimer_numero)]</a>
+               </BOUCLE_sites_mots2>
+               [<div style="text-align:justify;">(#DESCRIPTIF)</div>]
+               </BOUCLE_principale2>
+               </div>
+               </B_principale1>
+
+               <//B_principale1>
+
+       <//B_groupes_mots_tri>
+
+       <div class="clear">&nbsp;</div>
+
+
+       [(#REM) Proposer un site ]
+       #FORMULAIRE_SITE
+
+       [<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+</div>
+
+<div id="colonne" class="grid_4">
+       <INCLURE{fond=extra/#ENV{type},env}{doublons}>
+</div>
+</BOUCLE_contenu_rubrique>
diff --git a/www/plugins/beespip/contenu/rubrique-signets.xml b/www/plugins/beespip/contenu/rubrique-signets.xml
new file mode 100755 (executable)
index 0000000..f45d565
--- /dev/null
@@ -0,0 +1,4 @@
+<composition>
+  <nom>Présentation des sites de la rubrique en 2 colonnes</nom>
+  <description>Les sites sont affichés en 2 colonnes, et les autres éléments en colonne de droite de page. Le logo de la rubrique est affiché à droite.</description>
+</composition>
diff --git a/www/plugins/beespip/contenu/rubrique.html b/www/plugins/beespip/contenu/rubrique.html
new file mode 100755 (executable)
index 0000000..9994f7a
--- /dev/null
@@ -0,0 +1,64 @@
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<BOUCLE_contenu_rubrique(RUBRIQUES){id_rubrique}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+<div id="contenu" class="grid_12">
+       <div class="cartouche">
+               [(#LOGO_RUBRIQUE||image_reduire{200,200}|inserer_attribut{class,float-right})]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [(#CONFIG{BeeSpip/affichage/dates_articles}|=={'oui'}|oui)[<p class="post-info"><:dernier_ajout:> | <abbr class="date" title="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</abbr></p>]]
+       </div>
+       [<div class="#EDIT{texte} chapo">(#TEXTE)</div><div class="clear">&nbsp;</div>]
+
+       [(#REM) Gestion du portfolio et des documents ]
+       [(#INCLURE{fond=inclure/documents}{id_rubrique})]       
+
+       <INCLURE{fond=inclure/articles_liste,id_rubrique,lang,doublons}{tri=date}{ordre=1}{ajax}{largeur=680}>
+
+               [(#REM) Affiche un plan de la rubrique ]
+               <B_sous_rubriques>
+               <div class="menu rubriques">
+                       [(#CONFIG{BeeSpip/affichage/libelle_rubrique_article}|=={'oui'}|oui)<h2><:sous_rubriques:></h2>]
+                       <ul class="menu-liste">
+                               <BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}{doublons}>
+                               <li class="menu-entree">
+                                       <a href="#URL_RUBRIQUE">[(#TITRE)]</a>[<br />(#INTRODUCTION|PtoBR)]
+
+                                       [(#REM) Une boucle recursive pour le mini plan]
+                                       <B_miniplan>
+                                       <ul class="menu-liste">
+                                               <BOUCLE_miniplan(RUBRIQUES) {id_parent} {par num titre, titre}{doublons}>
+                                               <li class="menu-entree">
+                                                       <a href="#URL_RUBRIQUE">[(#TITRE)]</a>[<br />(#DESCRIPTIF|PtoBR)]
+                                                       <BOUCLE_m2(BOUCLE_miniplan)></BOUCLE_m2>
+                                               </li>
+                                               </BOUCLE_miniplan>
+                                       </ul>
+                                       </B_miniplan>
+
+                               </li>
+                               </BOUCLE_sous_rubriques>
+                       </ul>
+                       </div>
+               </B_sous_rubriques>
+
+
+       [(#REM) Proposer un site ]
+       #FORMULAIRE_SITE
+
+       [<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+</div>
+
+<div id="colonne" class="grid_4">
+       <INCLURE{fond=extra/#ENV{type},env}{doublons}>
+</div>
+</BOUCLE_contenu_rubrique>
diff --git a/www/plugins/beespip/contenu/site.html b/www/plugins/beespip/contenu/site.html
new file mode 100755 (executable)
index 0000000..2f764ad
--- /dev/null
@@ -0,0 +1,40 @@
+<BOUCLE_site(SITES){id_syndic}>
+[(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'bas'}|oui)#FORMULAIRE_RECHERCHE]
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_syndic}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#NOM_SITE|couper{80})</strong>]</p>
+
+<div id="contenu" class="grid_12">
+  <div class="cartouche">
+      <a href="#URL_SITE">[(#LOGO_SITE||image_reduire{150,100})]</a>
+      <h1 class="h1 #EDIT{nom_site}">#NOM_SITE</h1>
+  </div>
+
+  [<div class="#EDIT{descriptif} chapo">(#DESCRIPTIF)</div>]
+  [<p class="#EDIT{url_site} hyperlien"><a href="#URL_SITE" class="spip_out">(#URL_SITE|couper{80})</a></p>]
+
+  [(#REM) Articles issus de la syndication ]
+  <B_articles>
+  <div class="liste articles syndic">
+      #ANCRE_PAGINATION
+      <h2 class="h2"><:articles:></h2>
+      <ul class="liste-items">
+          <BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {pagination 5}>
+          <li class="item">
+              <h3 class="h3"><a href="#URL_ARTICLE" class="spip_out">#TITRE</a></h3>
+              [<div class="enclosures">(#TAGS|afficher_enclosures)</div>]
+              <div class="small">[(#DATE|affdate_jourcourt)][, <:par_auteur:> (#LESAUTEURS)][ &mdash; <em>(#TAGS|afficher_tags)</em>]</div>
+              [<div class="introduction">(#DESCRIPTIF|image_reduire{300})</div>]
+          </li>
+          </BOUCLE_articles>
+      </ul>
+      [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+  </div>
+  </B_articles>
+
+  [<div class="notes"><h4><:info_notes:></h4>(#NOTES)</div>]
+</div>
+
+<div id="colonne" class="grid_4">
+       <INCLURE{fond=extra/#ENV{type},env}{doublons}>
+</div>  
+</BOUCLE_site>
diff --git a/www/plugins/beespip/css/960.css b/www/plugins/beespip/css/960.css
new file mode 100755 (executable)
index 0000000..6db1bd3
--- /dev/null
@@ -0,0 +1,491 @@
+/*
+       960 Grid System ~ Core CSS.
+       Learn more ~ http://960.gs/
+
+       Licensed under GPL and MIT.
+*/
+
+/* =Containers
+--------------------------------------------------------------------------------*/
+
+.container_12,
+.container_16
+{
+       margin-left: auto;
+       margin-right: auto;
+       width: 960px;
+}
+
+/* =Grid >> Global
+--------------------------------------------------------------------------------*/
+
+.grid_1,
+.grid_2,
+.grid_3,
+.grid_4,
+.grid_5,
+.grid_6,
+.grid_7,
+.grid_8,
+.grid_9,
+.grid_10,
+.grid_11,
+.grid_12,
+.grid_13,
+.grid_14,
+.grid_15,
+.grid_16
+{
+       display: inline;
+       float: left;
+       margin-left: 10px;
+       margin-right: 10px;
+}
+
+.container_12 .grid_3,
+.container_16 .grid_4
+{
+       width: 220px;
+}
+
+.container_12 .grid_6,
+.container_16 .grid_8
+{
+       width: 460px;
+}
+
+.container_12 .grid_9,
+.container_16 .grid_12
+{
+       width: 700px;
+}
+
+.container_12 .grid_12,
+.container_16 .grid_16
+{
+       width: 940px;
+}
+
+/* =Grid >> Children (Alpha ~ First, Omega ~ Last)
+--------------------------------------------------------------------------------*/
+
+.alpha
+{
+       margin-left: 0;
+}
+
+.omega
+{
+       margin-right: 0;
+}
+
+/* =Grid >> 12 Columns
+--------------------------------------------------------------------------------*/
+
+.container_12 .grid_1
+{
+       width: 60px;
+}
+
+.container_12 .grid_2
+{
+       width: 140px;
+}
+
+.container_12 .grid_4
+{
+       width: 300px;
+}
+
+.container_12 .grid_5
+{
+       width: 380px;
+}
+
+.container_12 .grid_7
+{
+       width: 540px;
+}
+
+.container_12 .grid_8
+{
+       width: 620px;
+}
+
+.container_12 .grid_10
+{
+       width: 780px;
+}
+
+.container_12 .grid_11
+{
+       width: 860px;
+}
+
+/* =Grid >> 16 Columns
+--------------------------------------------------------------------------------*/
+
+.container_16 .grid_1
+{
+       width: 40px;
+}
+
+.container_16 .grid_2
+{
+       width: 100px;
+}
+
+.container_16 .grid_3
+{
+       width: 160px;
+}
+
+.container_16 .grid_5
+{
+       width: 280px;
+}
+
+.container_16 .grid_6
+{
+       width: 340px;
+}
+
+.container_16 .grid_7
+{
+       width: 400px;
+}
+
+.container_16 .grid_9
+{
+       width: 520px;
+}
+
+.container_16 .grid_10
+{
+       width: 580px;
+}
+
+.container_16 .grid_11
+{
+       width: 640px;
+}
+
+.container_16 .grid_13
+{
+       width: 760px;
+}
+
+.container_16 .grid_14
+{
+       width: 820px;
+}
+
+.container_16 .grid_15
+{
+       width: 880px;
+}
+
+/* =Prefix Extra Space >> Global
+--------------------------------------------------------------------------------*/
+
+.container_12 .prefix_3,
+.container_16 .prefix_4
+{
+       padding-left: 240px;
+}
+
+.container_12 .prefix_6,
+.container_16 .prefix_8
+{
+       padding-left: 480px;
+}
+
+.container_12 .prefix_9,
+.container_16 .prefix_12
+{
+       padding-left: 720px;
+}
+
+/* =Prefix Extra Space >> 12 Columns
+--------------------------------------------------------------------------------*/
+
+.container_12 .prefix_1
+{
+       padding-left: 80px;
+}
+
+.container_12 .prefix_2
+{
+       padding-left: 160px;
+}
+
+.container_12 .prefix_4
+{
+       padding-left: 320px;
+}
+
+.container_12 .prefix_5
+{
+       padding-left: 400px;
+}
+
+.container_12 .prefix_7
+{
+       padding-left: 560px;
+}
+
+.container_12 .prefix_8
+{
+       padding-left: 640px;
+}
+
+.container_12 .prefix_10
+{
+       padding-left: 800px;
+}
+
+.container_12 .prefix_11
+{
+       padding-left: 880px;
+}
+
+/* =Prefix Extra Space >> 16 Columns
+--------------------------------------------------------------------------------*/
+
+.container_16 .prefix_1
+{
+       padding-left: 60px;
+}
+
+.container_16 .prefix_2
+{
+       padding-left: 120px;
+}
+
+.container_16 .prefix_3
+{
+       padding-left: 180px;
+}
+
+.container_16 .prefix_5
+{
+       padding-left: 300px;
+}
+
+.container_16 .prefix_6
+{
+       padding-left: 360px;
+}
+
+.container_16 .prefix_7
+{
+       padding-left: 420px;
+}
+
+.container_16 .prefix_9
+{
+       padding-left: 540px;
+}
+
+.container_16 .prefix_10
+{
+       padding-left: 600px;
+}
+
+.container_16 .prefix_11
+{
+       padding-left: 660px;
+}
+
+.container_16 .prefix_13
+{
+       padding-left: 780px;
+}
+
+.container_16 .prefix_14
+{
+       padding-left: 840px;
+}
+
+.container_16 .prefix_15
+{
+       padding-left: 900px;
+}
+
+/* =Suffix Extra Space >> Global
+--------------------------------------------------------------------------------*/
+
+.container_12 .suffix_3,
+.container_16 .suffix_4
+{
+       padding-right: 240px;
+}
+
+.container_12 .suffix_6,
+.container_16 .suffix_8
+{
+       padding-right: 480px;
+}
+
+.container_12 .suffix_9,
+.container_16 .suffix_12
+{
+       padding-right: 720px;
+}
+
+/* =Suffix Extra Space >> 12 Columns
+--------------------------------------------------------------------------------*/
+
+.container_12 .suffix_1
+{
+       padding-right: 80px;
+}
+
+.container_12 .suffix_2
+{
+       padding-right: 160px;
+}
+
+.container_12 .suffix_4
+{
+       padding-right: 320px;
+}
+
+.container_12 .suffix_5
+{
+       padding-right: 400px;
+}
+
+.container_12 .suffix_7
+{
+       padding-right: 560px;
+}
+
+.container_12 .suffix_8
+{
+       padding-right: 640px;
+}
+
+.container_12 .suffix_10
+{
+       padding-right: 800px;
+}
+
+.container_12 .suffix_11
+{
+       padding-right: 880px;
+}
+
+/* =Suffix Extra Space >> 16 Columns
+--------------------------------------------------------------------------------*/
+
+.container_16 .suffix_1
+{
+       padding-right: 60px;
+}
+
+.container_16 .suffix_2
+{
+       padding-right: 120px;
+}
+
+.container_16 .suffix_3
+{
+       padding-right: 180px;
+}
+
+.container_16 .suffix_5
+{
+       padding-right: 300px;
+}
+
+.container_16 .suffix_6
+{
+       padding-right: 360px;
+}
+
+.container_16 .suffix_7
+{
+       padding-right: 420px;
+}
+
+.container_16 .suffix_9
+{
+       padding-right: 540px;
+}
+
+.container_16 .suffix_10
+{
+       padding-right: 600px;
+}
+
+.container_16 .suffix_11
+{
+       padding-right: 660px;
+}
+
+.container_16 .suffix_13
+{
+       padding-right: 780px;
+}
+
+.container_16 .suffix_14
+{
+       padding-right: 840px;
+}
+
+.container_16 .suffix_15
+{
+       padding-right: 900px;
+}
+
+/* =Clear Floated Elements
+--------------------------------------------------------------------------------*/
+
+/* http://sonspring.com/journal/clearing-floats */
+
+html body * span.clear,
+html body * div.clear,
+html body * li.clear,
+html body * dd.clear
+{
+       background: none;
+       border: 0;
+       clear: both;
+       display: block;
+       float: none;
+       font-size: 0;
+       list-style: none;
+       margin: 0;
+       padding: 0;
+       overflow: hidden;
+       visibility: hidden;
+       width: 0;
+       height: 0;
+}
+
+/* http://www.positioniseverything.net/easyclearing.html */
+
+.clearfix:after
+{
+       clear: both;
+       content: '.';
+       display: block;
+       visibility: hidden;
+       height: 0;
+}
+
+.clearfix
+{
+       display: inline-block;
+}
+
+* html .clearfix
+{
+       height: 1%;
+}
+
+.clearfix
+{
+       display: block;
+}
\ No newline at end of file
diff --git a/www/plugins/beespip/css/easyslider.css.html b/www/plugins/beespip/css/easyslider.css.html
new file mode 100755 (executable)
index 0000000..57efbb6
--- /dev/null
@@ -0,0 +1,120 @@
+#CACHE{3600*100,cache-client}
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
+#HTTP_HEADER{Vary: Accept-Encoding}
+/* ----------------------------------------------
+       Beespip 3
+       Contingences
+       2011    
+ ------------------------------------------------ */
+/* Valeurs par defaut :
+#SET{couleur_principale,#CONFIG{BeeSpip/couleur/couleur_principale,#b83233}} [ couleur_principale: (#GET{couleur_principale});]
+#SET{couleur_secondaire_foncee,#CONFIG{BeeSpip/couleur/couleur_secondaire_foncee,#8b0b00}} [ couleur_secondaire_foncee: (#GET{couleur_secondaire_foncee});]
+#SET{couleur_secondaire_claire,#CONFIG{BeeSpip/couleur/couleur_secondaire_claire,#ff645b}} [ couleur_secondaire_claire: (#GET{couleur_secondaire_claire});]
+#SET{couleur_principale_texte,#CONFIG{BeeSpip/couleur/couleur_principale_texte,#666666}} [ couleur_principale_texte: (#GET{couleur_principale_texte});]
+#SET{couleur_titres,#CONFIG{BeeSpip/couleur/couleur_titres,#444444}} [ couleur_titres: (#GET{couleur_titres});]
+#SET{typo_titre,#CONFIG{BeeSpip/couleur/typo_titre,"font-family: 'Lucida Grande', Verdana, Helvetica, sans-serif;"}} [ typo_titre: (#GET{typo_titre});]
+#SET{couleur_liens,#CONFIG{BeeSpip/couleur/couleur_liens,#0070a7}} [ couleur_liens: (#GET{couleur_liens});]
+#SET{couleur_liens_survol,#CONFIG{BeeSpip/couleur/couleur_liens_survol,#b83233}} [ couleur_liens_survol: (#GET{couleur_liens_survol});]
+
+*/
+.accroche {
+       position:relative;
+       /*bottom: 120px;
+       left:15px;*/
+       margin-top:-185px;
+       height:172px;
+       margin-left:0px;
+       width:680px;
+       padding:3px 10px 5px 10px;
+       background:url(#CHEMIN{/images/blocune_accroche.png}) repeat;
+       border:0;
+       color:#fff;
+       font-weight:normal;
+       line-height: 1.2em;
+}
+* html#slider .accroche {
+       background:url(#CHEMIN{/images/blocune_accroche_ie.png}) repeat;
+       filter:alpha(opacity=80);
+}
+
+*:first-child+html#slider .accroche {
+       background:url(#CHEMIN{/images/blocune_accroche_ie.png}) repeat;
+       filter:alpha(opacity=80);
+}
+.accroche h2 { /*font-size : 1.6em;*/ font-weight: normal;margin:0;#GET{typo_titre}line-height:1.2em;color:#fff;padding:2px 5px 4px;}
+.accroche h2 a, .accroche h2 a:visited,
+.accroche a, .accroche a:visited  { color: #fff; text-decoration:none; }
+.accroche a:hover, .accroche a:focus, .accroche h2 a:hover, .accroche h2 a:focus  { color: #GET{couleur_liens_survol}; }
+.publie {color: #b3b3b3;font-size:0.8em;}
+.accroche p {margin:3px 0; padding:0 5px;}
+
+#slider ul, #slider li {
+       margin:0;
+       padding:0;
+       list-style:none;
+       }
+#slider li{ 
+       /* 
+               define width and height of list item (slide)
+               entire slider area will adjust according to the parameters provided here
+       */ 
+       width:700px;
+       height:450px;
+       overflow:hidden;
+       background: #GET{couleur_principale};
+       }       
+#prevBtn, #nextBtn,
+#slider1next, #slider1prev{ 
+       display:block;
+       width:30px;
+       height:77px;
+       position:absolute;
+       left:-30px;
+       top:71px;
+       z-index:1000;
+       }
+#nextBtn, #slider1next{ 
+       left:380px;
+       }
+#prevBtn a, #nextBtn a,
+#slider1next a, #slider1prev a{  
+       display:block;
+       position:relative;
+       width:30px;
+       height:77px;
+       background:url(#CHEMIN{/images/btn_prev.gif}) no-repeat 0 0;    
+       }
+#nextBtn a, #slider1next a{ 
+       background:url(#CHEMIN{/images/btn_next.gif}) no-repeat 0 0;    
+       }
+
+/* numeric controls */ 
+
+       ol#controls{
+               margin:1em 0;
+               padding:0;
+               height:28px;    
+               }
+       ol#controls li{
+               margin:0 10px 0 0; 
+               padding:0;
+               float:left;
+               list-style:none;
+               height:28px;
+               line-height:28px;
+               }
+       ol#controls li a{
+               float:left;
+               height:28px;
+               line-height:28px;
+               border:1px solid #ccc;
+               background:#[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir|couleur_eclaircir)];
+               color:#GET{couleur_secondaire_claire};
+               padding:0 10px;
+               text-decoration:none;
+               }
+       ol#controls li.current a, ol#controls li a:hover{
+               background:#[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_foncer)];
+               color:#fff;
+               }
+       ol#controls li a:focus, #prevBtn a:focus, #nextBtn a:focus{outline:none;}
diff --git a/www/plugins/beespip/css/easyslider2.css.html b/www/plugins/beespip/css/easyslider2.css.html
new file mode 100755 (executable)
index 0000000..1ff07cb
--- /dev/null
@@ -0,0 +1,120 @@
+#CACHE{3600*100,cache-client}
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
+#HTTP_HEADER{Vary: Accept-Encoding}
+/* ----------------------------------------------
+       Beespip 3
+       Contingences
+       2011    
+ ------------------------------------------------ */
+/* Valeurs par defaut :
+#SET{couleur_principale,#CONFIG{BeeSpip/couleur/couleur_principale,#b83233}} [ couleur_principale: (#GET{couleur_principale});]
+#SET{couleur_secondaire_foncee,#CONFIG{BeeSpip/couleur/couleur_secondaire_foncee,#8b0b00}} [ couleur_secondaire_foncee: (#GET{couleur_secondaire_foncee});]
+#SET{couleur_secondaire_claire,#CONFIG{BeeSpip/couleur/couleur_secondaire_claire,#ff645b}} [ couleur_secondaire_claire: (#GET{couleur_secondaire_claire});]
+#SET{couleur_principale_texte,#CONFIG{BeeSpip/couleur/couleur_principale_texte,#666666}} [ couleur_principale_texte: (#GET{couleur_principale_texte});]
+#SET{couleur_titres,#CONFIG{BeeSpip/couleur/couleur_titres,#444444}} [ couleur_titres: (#GET{couleur_titres});]
+#SET{typo_titre,#CONFIG{BeeSpip/couleur/typo_titre,"font-family: 'Lucida Grande', Verdana, Helvetica, sans-serif;"}} [ typo_titre: (#GET{typo_titre});]
+#SET{couleur_liens,#CONFIG{BeeSpip/couleur/couleur_liens,#0070a7}} [ couleur_liens: (#GET{couleur_liens});]
+#SET{couleur_liens_survol,#CONFIG{BeeSpip/couleur/couleur_liens_survol,#b83233}} [ couleur_liens_survol: (#GET{couleur_liens_survol});]
+
+*/
+.accroche {
+       position:relative;
+       /*bottom: 120px;
+       left:15px;*/
+       margin-top:-135px;
+       height:122px;
+       margin-left:0px;
+       width:440px;
+       padding:3px 10px 5px 10px;
+       background:url(#CHEMIN{/images/blocune_accroche.png}) repeat;
+       border:0;
+       color:#fff;
+       font-weight:normal;
+       line-height: 1.2em;
+}
+* html#slider .accroche {
+       background:url(#CHEMIN{/images/blocune_accroche_ie.png}) repeat;
+       filter:alpha(opacity=80);
+}
+
+*:first-child+html#slider .accroche {
+       background:url(#CHEMIN{/images/blocune_accroche_ie.png}) repeat;
+       filter:alpha(opacity=80);
+}
+.accroche h2 { /*font-size : 1.6em;*/ font-weight: normal;margin:0;#GET{typo_titre}line-height:1em;color:#fff;padding:2px 5px 4px;}
+.accroche h2 a, .accroche h2 a:visited,
+.accroche a, .accroche a:visited  { color: #fff; text-decoration:none; }
+.accroche a:hover, .accroche a:focus, .accroche h2 a:hover, .accroche h2 a:focus  { color: #GET{couleur_liens_survol}; }
+.publie {color: #b3b3b3;font-size:0.8em;}
+.accroche p {margin:3px 0; padding:0 5px;}
+
+#slider ul, #slider li {
+       margin:0;
+       padding:0;
+       list-style:none;
+       }
+#slider li{ 
+       /* 
+               define width and height of list item (slide)
+               entire slider area will adjust according to the parameters provided here
+       */ 
+       width:460px;
+       height:320px;
+       overflow:hidden;
+       background: #GET{couleur_principale};
+       }       
+#prevBtn, #nextBtn,
+#slider1next, #slider1prev{ 
+       display:block;
+       width:30px;
+       height:77px;
+       position:absolute;
+       left:-30px;
+       top:71px;
+       z-index:1000;
+       }
+#nextBtn, #slider1next{ 
+       left:380px;
+       }
+#prevBtn a, #nextBtn a,
+#slider1next a, #slider1prev a{  
+       display:block;
+       position:relative;
+       width:30px;
+       height:77px;
+       background:url(#CHEMIN{/images/btn_prev.gif}) no-repeat 0 0;    
+       }
+#nextBtn a, #slider1next a{ 
+       background:url(#CHEMIN{/images/btn_next.gif}) no-repeat 0 0;    
+       }
+
+/* numeric controls */ 
+
+       ol#controls{
+               margin:1em 0;
+               padding:0;
+               height:28px;    
+               }
+       ol#controls li{
+               margin:0 10px 0 0; 
+               padding:0;
+               float:left;
+               list-style:none;
+               height:28px;
+               line-height:28px;
+               }
+       ol#controls li a{
+               float:left;
+               height:28px;
+               line-height:28px;
+               border:1px solid #ccc;
+               background:#[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir|couleur_eclaircir)];
+               color:#GET{couleur_secondaire_claire};
+               padding:0 10px;
+               text-decoration:none;
+               }
+       ol#controls li.current a, ol#controls li a:hover{
+               background:#[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_foncer)];
+               color:#fff;
+               }
+       ol#controls li a:focus, #prevBtn a:focus, #nextBtn a:focus{outline:none;}
diff --git a/www/plugins/beespip/css/reset.css b/www/plugins/beespip/css/reset.css
new file mode 100755 (executable)
index 0000000..6e4692d
--- /dev/null
@@ -0,0 +1,44 @@
+/* http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/ */
+
+html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,dl, dt, dd, ol, ul, li, fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       outline: 0;
+       font-weight: inherit;
+       font-style: inherit;
+       font-size: 100%;
+       font-family: inherit;
+       vertical-align: baseline;
+}
+/* remember to define focus styles! */
+:focus {
+       outline: 0;
+}
+body {
+       line-height: 1;
+       color: black;
+       background: white;
+}
+ol, ul {
+       list-style: none;
+}
+/* tables still need 'cellspacing="0"' in the markup */
+table {
+       border-collapse: separate;
+       border-spacing: 0;
+}
+caption, th, td {
+       text-align: left;
+       font-weight: normal;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+       content: "";
+}
+blockquote, q {
+       quotes: "" "";
+}
\ No newline at end of file
diff --git a/www/plugins/beespip/css/structure.css.html b/www/plugins/beespip/css/structure.css.html
new file mode 100755 (executable)
index 0000000..7cd44f8
--- /dev/null
@@ -0,0 +1,323 @@
+#CACHE{3600*100,cache-client}\r
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}\r
+#HTTP_HEADER{Vary: Accept-Encoding}\r
+/* ----------------------------------------------\r
+       Beespip 3\r
+       Contingences\r
+       2011    \r
+ ------------------------------------------------ */\r
+/* Valeurs par defaut :\r
+#SET{couleur_principale,#CONFIG{BeeSpip/couleur/couleur_principale,#b83233}} [ couleur_principale: (#GET{couleur_principale});]\r
+#SET{couleur_secondaire_foncee,#CONFIG{BeeSpip/couleur/couleur_secondaire_foncee,#8b0b00}} [ couleur_secondaire_foncee: (#GET{couleur_secondaire_foncee});]\r
+#SET{couleur_secondaire_claire,#CONFIG{BeeSpip/couleur/couleur_secondaire_claire,#ff645b}} [ couleur_secondaire_claire: (#GET{couleur_secondaire_claire});]\r
+#SET{couleur_principale_texte,#CONFIG{BeeSpip/couleur/couleur_principale_texte,#666666}} [ couleur_principale_texte: (#GET{couleur_principale_texte});]\r
+#SET{couleur_titres,#CONFIG{BeeSpip/couleur/couleur_titres,#444444}} [ couleur_titres: (#GET{couleur_titres});]\r
+#SET{typo_titre,#CONFIG{BeeSpip/couleur/typo_titre,"font-family: 'Lucida Grande', Verdana, Helvetica, sans-serif;"}} [ typo_titre: (#GET{typo_titre});]\r
+#SET{couleur_liens,#CONFIG{BeeSpip/couleur/couleur_liens,#0070a7}} [ couleur_liens: (#GET{couleur_liens});]\r
+#SET{couleur_menu_fond,#CONFIG{BeeSpip/couleur/couleur_menu_fond,#f5f4f3}} [ couleur_menu_fond: (#GET{couleur_menu_fond});]\r
+#SET{couleur_filets_titres,#CONFIG{BeeSpip/couleur/couleur_filets_titres,#ebebeb}} [ couleur_filets_titres: (#GET{couleur_filets_titres});]\r
+#SET{couleur_liens_survol,#CONFIG{BeeSpip/couleur/couleur_liens_survol,#b83233}} [ couleur_liens_survol: (#GET{couleur_liens_survol});]\r
+#SET{couleur_menu_liens,#CONFIG{BeeSpip/couleur/couleur_menu_liens,#666666}} [ couleur_menu_liens: (#GET{couleur_menu_liens});]\r
+#SET{couleur_cadres,#CONFIG{BeeSpip/couleur/couleur_cadres,#ebebeb}} [ couleur_cadres: (#GET{couleur_cadres});]\r
+\r
+*/\r
+/* Evitement */\r
+#evitement {line-height:1;z-index:100;font-size:1.1em;font-weight:bold;}\r
+#evitement a {position:absolute;left:0;top:-10em;padding:.5em 1em;box-shadow:0 10px 10px rgba(0, 0, 0, 0.4);}\r
+#evitement a:focus, #evitement a:active {top:0;z-index:999 !important;background-color:#GET{couleur_menu_fond} !important;border-color:#GET{couleur_cadres} !important;text-decoration:none;outline:none; color:#GET{couleur_menu_liens};}\r
+\r
+#conteneur {\r
+       width: 100%;\r
+       padding: 0 0 5px 0;\r
+       border-bottom: 1px solid #E8E8E8;\r
+       border-top: 1px solid #E8E8E8;\r
+       text-align: left;               \r
+}\r
+#conteneur-wrapper {\r
+       background: #fff;\r
+       margin: 0 auto; \r
+       padding: 5px 0 35px 0;\r
+       overflow: auto;\r
+}\r
+#entete-wrap {\r
+       width: 100%;\r
+       \r
+       margin: 0; padding: 0; \r
+}\r
+#entete {\r
+       position: relative;\r
+       margin: 0 auto;\r
+       height: #CONFIG{BeeSpip/affichage/hauteur_entete}px;\r
+       background: #GET{couleur_principale};\r
+       border-right: 1px solid #E8E8E8;\r
+       border-left: 1px solid #E8E8E8;\r
+}\r
+#entete h1#logo-text { margin: 0; padding: 0; }\r
+#entete h1#logo-text a {\r
+       position: absolute; \r
+       margin: 0; padding: 0 5px 0 0;\r
+       font-size: 75px;\r
+       #GET{typo_titre}\r
+       letter-spacing: -1px;\r
+       color: #GET{couleur_liens};\r
+       text-decoration: none;\r
+               \r
+       /* change the values of top and left to adjust the position of the logo*/\r
+       top: 90px; left: 20px;  \r
+}\r
+#entete h1#logo-text a:hover { border: none; }\r
+#entete p#intro {\r
+       position: absolute;\r
+       margin: 0; padding: 0;\r
+       #GET{typo_titre}\r
+       font-weight: normal;\r
+       font-size: 17px;\r
+       line-height: 1.6em;\r
+       font-style: italic;\r
+       letter-spacing: -.5px;\r
+       color: #GET{couleur_secondaire_foncee};\r
+       width: 400px;\r
+       \r
+       /* change the values of top and left to adjust the position */\r
+       top: 165px; left: 110px;                \r
+}\r
+#entete #entete-image {\r
+       position: absolute;\r
+       width: 960px;\r
+       height: #CONFIG{BeeSpip/affichage/hauteur_entete}px;\r
+       left: 0px; top: 0px;\r
+}\r
+#entete #entete-image a {\r
+       border-bottom:0;\r
+}\r
+/* Entete recherche */\r
+#entete #formulaire_recherche form, #conteneur #formulaire_recherche form {\r
+       float:right;\r
+       padding: 0; margin: 0;\r
+       border: 1px solid #e3e3e3;\r
+       width: 210px; height: 28px;\r
+       background: #fcfcfc;    \r
+       z-index: 50;\r
+}\r
+#entete #formulaire_recherche form {\r
+       position: absolute;\r
+       top: 7px; right: 10px;\r
+}\r
+#conteneur #formulaire_recherche form {\r
+       margin:0 10px 10px 10px;\r
+}\r
+#entete #formulaire_recherche input, #conteneur #formulaire_recherche input {\r
+       border: none;\r
+       background: transparent;\r
+       color: #bababa;\r
+       float: left;\r
+       margin: 0; padding: 5px;\r
+}\r
+#entete #formulaire_recherche input:focus, #conteneur #formulaire_recherche input:focus {\r
+       color: #GET{couleur_secondaire_claire};\r
+}\r
+#entete #formulaire_recherche .saisie, #conteneur #formulaire_recherche .saisie {\r
+       margin: 4px 0 0 5px; \r
+       width: 156px;\r
+       display: inline;\r
+}\r
+#entete #formulaire_recherche .submit, #conteneur #formulaire_recherche .submit {\r
+       width: 24px; height: 24px;\r
+       border: none;\r
+       font-size:0;\r
+       background: [(#GET{couleur_principale})] url(#CHEMIN{/images/recherche.png}) no-repeat center center;\r
+}\r
+#entete #formulaire_recherche label, #conteneur #formulaire_recherche label {\r
+       display: none;\r
+}\r
+\r
+/*  navigation  */\r
+#entete #nav {\r
+       position: absolute;\r
+       margin: 0; padding: 0;\r
+       width: 960px;\r
+       height:45px;\r
+       left: 0;        top: 5px;\r
+       z-index:99;\r
+       background:#GET{couleur_menu_fond};\r
+}/*\r
+#entete #nav ul {\r
+       float: left;    \r
+       list-style: none;\r
+       margin: 5px 0 0 0;\r
+       height: 45px;\r
+       padding: 0 0 0 15px;                                    \r
+}\r
+#entete #nav ul li {\r
+       float: left;\r
+       margin: 0; padding: 0 0 0 10px;         \r
+}\r
+#entete #nav ul li a {\r
+       float: left;\r
+       margin: 0;\r
+       padding: 0 15px 0 5px;\r
+       color: #GET{couleur_principale_texte};\r
+       font: bold 14px/40px 'Trebuchet MS', 'Helvetica Neue', Arial, Sans-Serif;\r
+       /*text-transform: uppercase;*/\r
+/*}*/\r
+/*#entete #nav ul li a:hover, \r
+#entete #nav ul li a:active {\r
+       border: none;\r
+       color: #111;\r
+       background: transparent;\r
+       border\r
+}*/\r
+#entete #nav ul li#current {\r
+       background:#FFF;\r
+       border: 1px solid #E8E8E8;\r
+       border-bottom:0;\r
+}\r
+#entete #nav ul li#current a { \r
+       color: #GET{couleur_titres};\r
+}\r
+\r
+\r
+\r
+/* Contenu */\r
+#hierarchie {font-size:0.8em; padding: 0 15px; }\r
+#contenu h1, #contenu_presentation h1 {\r
+       font-weight: normal;\r
+       font-size: 3.7em;\r
+       #GET{typo_titre}\r
+       line-height: 1em;\r
+       color: #GET{couleur_titres};\r
+       letter-spacing: -2px;   \r
+       margin-left: 5px;       \r
+       margin-right: 15px;\r
+       padding-left: 5px;\r
+       padding-bottom: 3px;\r
+       border-bottom: 1px solid #GET{couleur_filets_titres};   \r
+}\r
+#contenu h1 a {\r
+       color: #GET{couleur_titres};\r
+       border: none;\r
+}\r
+#contenu h2.sommaire, #contenu h3.sommaire {\r
+       color: #GET{couleur_titres};\r
+       letter-spacing: -1.2px; \r
+       line-height: 1em;\r
+       margin-left: 5px;       \r
+       margin-right: 15px;\r
+       padding-left: 5px;\r
+       padding-bottom: 3px;\r
+       border-bottom: 1px solid #GET{couleur_filets_titres};   \r
+}\r
+/* Colonne en bandeau */\r
+#colonne_bandeau {border-top: 1px solid #GET{couleur_filets_colonnes};}\r
+/* Colonne de droite */\r
+#colonne .grid_4 {border-left: 1px solid #GET{couleur_filets_colonnes};}\r
+#colonne .grid_4 .grid_4 {border-left: none;}\r
+#colonne h3, #colonne_bandeau h3 {\r
+       color: #GET{couleur_titres};\r
+       font-size: 2em;\r
+       font-weight: normal;\r
+       line-height: 1em;\r
+       #GET{typo_titre}\r
+       letter-spacing: -0.5px;\r
+       padding: 5px 10px;\r
+       margin: 12px 0 5px 0;\r
+}\r
+/* Pied de page */\r
+#pied-wrapper {\r
+       clear: both;\r
+       margin: 0 auto;\r
+       text-align: left;       \r
+}\r
+#pied-wrapper h3 {\r
+       color: #GET{couleur_titres};\r
+       font: normal 1.8em 'Lucida Grande', Verdana, Helvetica, sans-serif;\r
+       text-transform: none;\r
+       letter-spacing: -0.5px; \r
+}\r
+#pied-wrapper h3, \r
+#pied-wrapper p {\r
+       padding-left: 0;\r
+}\r
+#pied-wrapper a:link, #pied-wrapper a:visited{\r
+       color: #333;\r
+       background: transparent;\r
+}\r
+\r
+/* Pied liste */\r
+#pied-wrapper ul.pied-list {\r
+       border-top: 1px solid #E6E6E6;\r
+       list-style: none;\r
+       padding: 0;\r
+       margin-left: 0;\r
+}\r
+#pied-wrapper ul.pied-list li {\r
+       border-bottom: 1px solid #E6E6E6;\r
+}\r
+#pied-wrapper ul.pied-list li a {\r
+       display: block;\r
+       width: 98%;\r
+    line-height: 2em;\r
+       font-weight: bold;\r
+       padding: 7px 0;\r
+       margin-left: 0;\r
+       padding-left: 0;\r
+       color: #888;\r
+       border: none;\r
+}\r
+#pied-wrapper ul.pied-list li a span {\r
+       font-style: italic;\r
+       font-weight: normal;\r
+       font-family: 'Lucida Grande', Verdana, Helvetica, sans-serif;\r
+}\r
+#pied-wrapper ul.pied-list li a:hover, #pied-wrapper ul.pied-list li a:hover span,\r
+#pied-wrapper ul.pied-list li a:focus, #pied-wrapper ul.pied-list li a:focus span  {\r
+       color: #333;    \r
+}\r
+\r
+/* pied contenu */\r
+#pied-content {\r
+       float: left;    \r
+       width: 100%;    \r
+       padding: 0 0 35px 0;                            \r
+       margin: 10px 0 0 5px;                   \r
+}\r
+\r
+/* pied-bottom */\r
+#pied-bottom {\r
+       clear: both;\r
+       /*border-top: 1px solid #dadada;*/\r
+       width: 940px;\r
+       margin: 0 auto; \r
+       font-family: 'Trebuchet MS', 'Helvetica Neue', Arial, sans-serif;\r
+}\r
+#pied-bottom a:hover, #pied-bottom a:focus { color: #GET{couleur_liens_survol};border: none }\r
+#pied-bottom ul.bottom-left {\r
+       float: left;\r
+       list-style: none;\r
+       margin:0;\r
+       padding: 5px 0 10px 5px;\r
+}\r
+#pied-bottom ul.bottom-left li {display: inline;}\r
+#pied-bottom .bottom-right {\r
+       text-align: right;\r
+       padding-right: 0;\r
+}\r
+.pieddate {text-align:center;clear:both;background:#F8F8F8;border:1px solid #EBEBEB;}\r
+\r
+/* Alignement */\r
+.float-left  { float: left; }\r
+.float-right { float: right; }\r
+.align-left  { text-align: left; }\r
+.align-right { text-align: right; }\r
+.no-border { border: none; }\r
+\r
+/* clear */\r
+.clearer { clear: both; }\r
+.clear { display:inline-block; }\r
+.clear:after {\r
+       display:block; \r
+       visibility:hidden; \r
+       clear:both; \r
+       height:0; \r
+       content: "."; \r
+}\r
diff --git a/www/plugins/beespip/css/styles.css.html b/www/plugins/beespip/css/styles.css.html
new file mode 100755 (executable)
index 0000000..34a6e29
--- /dev/null
@@ -0,0 +1,465 @@
+#CACHE{3600*100,cache-client}\r
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}\r
+#HTTP_HEADER{Vary: Accept-Encoding}\r
+/* ----------------------------------------------\r
+       Beespip 3\r
+       Contingences\r
+       2011    \r
+ ------------------------------------------------ */\r
+/* Valeurs par defaut :\r
+#SET{couleur_fond_page,#CONFIG{BeeSpip/couleur/couleur_fond_page,#ffffff}} [ couleur_fond_page: (#GET{couleur_fond_page});]\r
+#SET{couleur_principale,#CONFIG{BeeSpip/couleur/couleur_principale,#b83233}} [ couleur_principale: (#GET{couleur_principale});]\r
+#SET{couleur_secondaire_foncee,#CONFIG{BeeSpip/couleur/couleur_secondaire_foncee,#8b0b00}} [ couleur_secondaire_foncee: (#GET{couleur_secondaire_foncee});]\r
+#SET{couleur_secondaire_claire,#CONFIG{BeeSpip/couleur/couleur_secondaire_claire,#ff645b}} [ couleur_secondaire_claire: (#GET{couleur_secondaire_claire});]\r
+#SET{couleur_principale_texte,#CONFIG{BeeSpip/couleur/couleur_principale_texte,#666666}} [ couleur_principale_texte: (#GET{couleur_principale_texte});]\r
+#SET{couleur_titres,#CONFIG{BeeSpip/couleur/couleur_titres,#444444}} [ couleur_titres: (#GET{couleur_titres});]\r
+#SET{typo_titre,#CONFIG{BeeSpip/couleur/typo_titre,"font-family: 'Lucida Grande', Verdana, Helvetica, sans-serif;"}} [ typo_titre: (#GET{typo_titre});]\r
+#SET{couleur_liens,#CONFIG{BeeSpip/couleur/couleur_liens,#0070a7}} [ couleur_liens: (#GET{couleur_liens});]\r
+#SET{couleur_liens_survol,#CONFIG{BeeSpip/couleur/couleur_liens_survol,#b83233}} [ couleur_liens_survol: (#GET{couleur_liens_survol});]\r
+#SET{couleur_cadres,#CONFIG{BeeSpip/couleur/couleur_cadres,#ebebeb}} [ couleur_cadres: (#GET{couleur_cadres});]\r
+#SET{couleur_filets_titres,#CONFIG{BeeSpip/couleur/couleur_filets_titres,#ebebeb}} [ couleur_filets_titres: (#GET{couleur_filets_titres});]\r
+#SET{couleur_filets_colonnes,#CONFIG{BeeSpip/couleur/couleur_filets_colonnes,#e8e8e8}} [ couleur_filets_colonnes: (#GET{couleur_filets_colonnes});]\r
+#SET{couleur_fond_formulaires,#CONFIG{BeeSpip/couleur/couleur_fond_formulaires,#f8f8f8}} [ couleur_filets_colonnes: (#GET{couleur_fond_formulaires});]\r
+\r
+*/\r
+\r
+body {\r
+       font: 11px/165% 'Lucida Grande', Verdana, Helvetica, sans-serif;\r
+       color: #GET{couleur_principale_texte};  \r
+       margin: 0; padding: 0 0 50px 0; \r
+       background: #GET{couleur_fond_page} ;\r
+       text-align: center;\r
+}\r
+/* Liens */\r
+a:link, a:visited { \r
+       text-decoration: none;\r
+       color: #GET{couleur_liens};\r
+}\r
+a:hover, a:focus {\r
+       color: #GET{couleur_liens_survol};\r
+       border-bottom: 1px dotted #GET{couleur_liens_survol};\r
+}\r
+a.more-link {\r
+       padding-bottom: 2px;\r
+       font-weight: bold;      \r
+       border-bottom: 1px dotted #GET{couleur_liens};\r
+}\r
+a:hover.more-link, a:focus.more-link {\r
+       text-decoration: none;\r
+}\r
+h2 a:link, h2 a:visited,\r
+h3 a:link, h3 a:visited { \r
+       text-decoration: none;\r
+       color: #GET{couleur_titres};\r
+}\r
+h2 a:hover, h2 a:focus,\r
+h3 a:hover, h3 a:focus { \r
+       color: #GET{couleur_liens_survol};\r
+       border-bottom:0;\r
+}\r
+/* Headers */\r
+h1, h2, h3, h4, h5, h6\r
+h1.spip, h2.spip, h3.spip, h4.spip, h5.spip, h6.spip {\r
+       font-weight: bold;\r
+       #GET{typo_titre}\r
+       color: #GET{couleur_titres};\r
+       padding: 10px 15px 7px;\r
+}\r
+h1, h1.spip { font-size: 3.7em; }\r
+h2, h2.spip { font-size: 2.8em; }\r
+h3, h3.spip { font-size: 2em; }\r
+h4, h4.spip { font-size: 1.3em; }\r
+h5, h5.spip { font-size: 1.1em; }\r
+h6, h6.spip { font-size: 1em; }\r
+\r
+h1, h2, h3, h4, h5, h6 {font-weight: normal;}\r
+\r
+h1 { letter-spacing: -1px; }\r
+h2 { color: #GET{couleur_secondaire_foncee}; }\r
+h3 { letter-spacing: -0.5px; padding-top: 15px}\r
+h5.recents {padding-bottom:0;}\r
+/* Listes */\r
+ul, ol {\r
+       margin: 10px 20px;\r
+       padding: 0 20px;\r
+}\r
+ul { list-style: disc; }\r
+ol { list-style: decimal; }\r
+\r
+dt {\r
+  font-weight: bold;\r
+  color: #GET{couleur_secondaire_claire};\r
+}\r
+dd {\r
+  padding-left: 25px; \r
+}\r
+\r
+p { padding: 5px 15px; }\r
+dl { padding: 0px 15px; }\r
+hr.spip { margin: 2em auto; clear:both;height: 1px;padding: 0;color: #GET{couleur_filets_colonnes};background-color: #GET{couleur_filets_colonnes};border:0;}\r
+/* Images */\r
+#conteneur img {\r
+       background: #FAFAFA;\r
+       border: 1px solid #DCDCDC;\r
+       padding: 8px;\r
+}\r
+#conteneur img.puce, #conteneur form img, #conteneur table.calendrier-large img, #conteneur img.simple,\r
+#conteneur a:hover img.puce, #conteneur form a:hover img, #conteneur table.calendrier-large a:hover img, #conteneur a:hover img.simple,\r
+#conteneur a:focus img.puce, #conteneur form a:focus img, #conteneur table.calendrier-large a:focus img, #conteneur a:focus img.simple {\r
+       background: none;\r
+       border: none;\r
+       padding: 0;\r
+}\r
+#conteneur #slider img {\r
+       background: none;\r
+       border: 9px solid #FAFAFA;\r
+       padding: 0;\r
+}\r
+\r
+#conteneur a:hover img, #conteneur a:focus img { border: 1px solid #D2D2D2;    background: #DDD; }\r
+img.float-right {\r
+       margin: 5px 0px 10px 10px;  \r
+}\r
+img.float-left {\r
+       margin: 5px 10px 10px 0px;\r
+}\r
+\r
+code {\r
+       margin: 3px 0;\r
+       /*padding: 15px;*/\r
+       text-align: left;\r
+       /*display: block;*/\r
+       overflow: auto;  \r
+       font: 1em 'Lucida Console', 'Courier New', Monospace ;\r
+       /* white-space: pre; */\r
+       border: 1px solid #F0F0F0;\r
+       background: #f8f8f8;  \r
+}\r
+acronym {\r
+  cursor: help;\r
+  border-bottom: 1px dotted #895F30;\r
+}\r
+blockquote {\r
+       margin: 10px;\r
+       padding: 10px 10px 10px 32px;  \r
+   border: 1px solid #F0F0F0;\r
+       background: #f8f8f8 url(#CHEMIN{/images/quote.gif}) no-repeat 12px 12px;\r
+       font-weight: normal;\r
+       font-size: 1.2em;\r
+       line-height: 1.5em;\r
+       font-style: italic;\r
+       font-family: Georgia, 'Times New Roman', Times, Serif;  \r
+       color: #555;    \r
+}\r
+strong { font-weight: bold; }\r
+\r
+/* Tableaux */\r
+table {\r
+       border-collapse: collapse;\r
+       margin: 10px;\r
+}\r
+tr { background: #fff; }\r
+tr.altrow, tr.row_odd { background: #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir|couleur_eclaircir|couleur_eclaircir)] }\r
+th, td {\r
+       text-align: left;                       \r
+       border-width: 1px;\r
+       border-style: solid;\r
+}\r
+th {\r
+       font-weight: bold;\r
+       color: #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_foncer)];\r
+       background: #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir|couleur_eclaircir)];\r
+       padding: .8em 1em;      \r
+       border-color: #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir|couleur_eclaircir)] #[(#GET{couleur_secondaire_claire}|replace{#,''})] #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_foncer)];\r
+}\r
+td {\r
+       border-color: #EFEFEF;  \r
+       padding: .7em 1em;      \r
+}      \r
+\r
+/* Colonne */\r
+ul.liste-items, ul.liste-items ul  { list-style: none; margin:2px 2px 2px 20px; padding:0;}\r
+ul.liste-items a:link, ul.liste-items a:visited { \r
+       text-decoration: none;\r
+       color: #GET{couleur_liens};\r
+}\r
+ul.liste-items a:hover, ul.liste-items a:focus {\r
+       border-bottom: 1px dotted #GET{couleur_liens_survol};\r
+       color: #GET{couleur_liens_survol};\r
+}\r
+#colonne .liste {\r
+       padding-bottom: 15px;                   \r
+}\r
+#colonne .liste h4, .grid_4.actucolonne2 h4, #colonne_bandeau .liste h4 {\r
+       padding: 0 0 3px 0;\r
+       margin: 5px 0 0 12px;\r
+       border-bottom: 1px solid #GET{couleur_filets_titres};\r
+}\r
+#colonne .liste h4 a, #colonne .liste h4 a:visited,\r
+.grid_4.actucolonne2 h4 a, .grid_4.actucolonne2 h4 a:visited,\r
+#colonne_bandeau .liste h4 a, #colonne_bandeau .liste h4 a:visited {\r
+       color: #GET{couleur_secondaire_foncee};\r
+       border: none;\r
+}\r
+#colonne .liste h4 a:hover, .grid_4.actucolonne2 h4 a:hover,\r
+#colonne_bandeau .liste h4 a:hover,\r
+#colonne .liste h4 a:focus, .grid_4.actucolonne2 h4 a:focus,\r
+#colonne_bandeau .liste h4 a:focus {\r
+       color: #GET{couleur_liens_survol};\r
+}\r
+#colonne .liste .post-info, .grid_4.actucolonne2 .post-info,\r
+#colonne_bandeau .liste .post-info {\r
+       margin-left: 0;\r
+       padding-bottom: 5px;\r
+}\r
+#colonne .liste p, .grid_4.actucolonne2 p,\r
+#colonne_bandeau .liste p {\r
+       padding-top: 0;\r
+}\r
+#colonne .liste .liste-items, #colonne_bandeau .liste .liste-items {\r
+       list-style: none;\r
+       margin:0;\r
+       padding: 0 0 0 20px;\r
+}\r
+#colonne .liste .liste-items li.item, #colonne_bandeau .liste .liste-items li.item {margin-bottom:5px;}\r
+\r
+.liste_bloc {border:1px solid #GET{couleur_cadres}; padding:5px;margin:5px 0;}\r
+.liste_bloc_bandeau {border:1px solid #GET{couleur_cadres}; padding:5px;margin:5px 0;}\r
+.liste_bloc h3, .liste_bloc_bandeau h3 {padding-top:0}\r
+/* Compléments */\r
+.info-publi {  \r
+       padding: 5px; margin: 5px 15px 15px 10px;\r
+       border: 1px solid #EBEBEB;\r
+       background: #f8f8f8;\r
+       clear:left;     \r
+}\r
+.info-publi a { background: transparent; }\r
+.info-publi a:hover, .info-publi a:focus { border: none; color:#000;}\r
+.info-publi a.nb_commentaires { margin: 0 10px 0 5px;  }\r
+.info-publi a.lire_la_suite { margin: 0 10px 0 5px;    }\r
+.info-publi .date{ margin: 0 10px 0 5px;       }\r
+\r
+.post-info { font-size: .95em; padding-top: 3px; color: #B0B0B0; }\r
+.post-info a, .post-info a:visited { color: #000; border: none; }\r
+.post-info a:hover, .post-info a:focus { color: #GET{couleur_liens_survol}; border: none; }\r
+\r
+/* Gestion des listes */\r
+ul.spip, ol.spip {margin-top:0}\r
+ul.spip li {background: url([(#CHEMIN{images/fond_vide_pour_puce.gif}|image_aplatir{gif,#GET{couleur_principale}}|image_masque{#CHEMIN{images/fond_pour_puce_niv1.png}}|extraire_attribut{src})]) no-repeat 0 .5em;list-style:none;padding-left:1em;}\r
+ul.spip li ul.spip, ol.spip li ol.spip {margin-bottom:0}\r
+ul.spip li li {background: url([(#CHEMIN{images/fond_vide_pour_puce.gif}|image_aplatir{gif,#GET{couleur_principale}}|image_masque{#CHEMIN{images/fond_pour_puce_niv2.png}}|extraire_attribut{src})]) no-repeat 0 .5em;}\r
+ul.spip li li li {background: url([(#CHEMIN{images/fond_vide_pour_puce.gif}|image_aplatir{gif,#GET{couleur_principale}}|image_masque{#CHEMIN{images/fond_pour_puce_niv3.png}}|extraire_attribut{src})]) no-repeat 0 .5em;}\r
+ul.spip li li li li {background: url([(#CHEMIN{images/fond_vide_pour_puce.gif}|image_aplatir{gif,#GET{couleur_principale}}|image_masque{#CHEMIN{images/fond_pour_puce_niv4.png}}|extraire_attribut{src})]) no-repeat 0 .5em;}\r
+\r
+\r
+/* Vignettes */\r
+p.thumbs{ padding: 10px 0 0 10px; }\r
+.thumbs img { \r
+       position: relative;\r
+       padding: 8px;\r
+       margin: 5px;\r
+       background: #fafafa;\r
+       border: 1px solid #ddd; \r
+}\r
+.thumbs img:hover, .thumbs img:focus {\r
+       border: 1px solid #D2D2D2;\r
+       background: #DDD;       \r
+}\r
+.thumbs a:hover, .thumbs a:focus { background-color: transparent; border: none }\r
+\r
+/* Commentaires */\r
+ul.comments-list {\r
+       margin: 12px 10px 0 10px;\r
+       padding: 0;\r
+       border-style: solid;    \r
+       border-color: #F0F0F0;  \r
+       border-width: 1px 1px 0 1px;\r
+       list-style: none;\r
+}\r
+.comments-list li {\r
+       margin: 0;\r
+       padding: 10px;\r
+       list-style: none;\r
+       border-bottom: 1px solid #F0F0F0; \r
+       position:relative;\r
+}\r
+.comments-list li .comment-meta {\r
+       display: block;\r
+       font-style: normal;\r
+       font-weight: bold;\r
+       padding: 7px;   \r
+}\r
+.comments-list li .comment-meta .permalink { /*float: right;*/ position:absolute;right:0;top:0; padding: 15px 10px; /*margin: 0 0 1.5em 1.5em;*/font-size: 2em; text-decoration: none; }\r
+\r
+.comments-list li .comment-meta img {\r
+       float: left;\r
+       margin-right: 10px;     \r
+}\r
+.comments-list li .comment-meta .comment-data {\r
+       font-size: .8em;\r
+       font-weight: normal;\r
+}\r
+.comments-list li .comment-content {\r
+       clear: both;\r
+       margin: 0; padding: 0;\r
+}\r
+.comments-list li.even {\r
+       background: #f8f8f8 \r
+}\r
+.comment-reply { text-align:right; margin: 2px 10px 15px 10px; padding:0; font-size: 1em; text-decoration: none; }\r
+.comment-reply a {padding:5px 10px;border-style: solid; border-color: #F0F0F0; border-width: 0 1px 1px 1px;}\r
+.comment-reply a:hover, .comment-reply a:focus {color:#fff;background:#GET{couleur_liens_survol};}\r
+\r
+\r
+/* Pagination */\r
+.pagination { clear: both; text-align: right; font-size: 0.90em; color: #666; }\r
+#contenu .pagination { padding-right:15px; }\r
+.pagination .on { font-weight: bold; color: #666; }\r
+\r
+/* Habillage general des menus de navigation */\r
+\r
+.menu { clear: both; margin-bottom: 2em; text-align: left; }\r
+.menu p { margin: 0.20em 0; padding: 0.20em 0.10em; }\r
+.menu.rubriques .menu-liste { margin: 0; padding: 0 0 0 15px; list-style: none; }\r
+.menu-liste { margin: 0; padding: 0 25px; list-style: none; }\r
+.menu-liste .menu-entree { margin: 0 0 0.20em; padding: 0.20em; }\r
+.menu-liste .menu-entree a {  font-size:1em}\r
+.menu-liste .menu-entree .menu-liste { margin-left: 1em; border: 0; }\r
+.menu-liste .menu-entree .menu-entree { padding: 0; border: 0; }\r
+.menu-liste .menu-entree .menu-entree a { font-size:1em }\r
+/*.menu-liste .menu-entree .menu-entree .menu-entree a { font-size:1em }*/\r
+\r
+/* Plan du site */\r
+ul.plan { margin: 5px 20px; padding: 0; list-style: none; }\r
+ul.plan ul { margin: 5px 20px; padding: 0; list-style: none; }\r
+\r
+/* Logos, documents et images */\r
+img, .spip_logos { margin: 0; padding: 0; border: 0; }\r
+.spip_documents { text-align: center; line-height: normal; }\r
+.spip_documents p { margin: 0.10em; padding: 0; }\r
+.spip_documents dd {padding: 0; }\r
+.spip_documents_center { display: block; clear: both; /*width: 100%;*/ margin: 10px auto; }\r
+.spip_documents_left { float: left; margin-right: 15px; margin-bottom: 5px; }\r
+.spip_documents_right { float: right; margin-left: 15px; margin-bottom: 5px; }\r
+.spip_doc_titre { margin-right: auto; margin-left: auto; font-weight: bold; font-size: 0.90em; }\r
+.spip_doc_descriptif { clear: both; margin-right: auto; margin-left: auto; font-size: 0.90em; }\r
+\r
+.documents_joints, .documents_portfolio {clear:both;}\r
+.documents_joints .item {text-align:center;margin-bottom:10px;}\r
+.documents_joints .item a:hover, .documents_joints .item a:focus { border: none;}\r
+#colonne .documents_joints .item {margin-top:3px;}\r
+#colonne .documents_portfolio {padding-left:10px;}\r
+#colonne .documents_portfolio img {margin-top:10px;}\r
+#colonne .documents_portfolio.liste h4 {margin-left:0;}\r
+.documents_portfolio a:hover, a.image_survol:hover,\r
+.documents_portfolio a:focus, a.image_survol:focus {border:none;}\r
+/* modeles par defaut */\r
+.spip_modele { float: right; display: block; padding: 1em; border: 1px solid; width: 180px; }\r
+\r
+\r
+/* Formulaires */\r
+form {\r
+       margin: 10px; \r
+       padding: 15px 25px 25px 20px; \r
+       border: 1px solid #[(#GET{couleur_fond_formulaires}|replace{#,''}|couleur_foncer|couleur_foncer)];\r
+       background: #GET{couleur_fond_formulaires};\r
+}\r
+/* Fieldset */\r
+form fieldset { clear: both; margin: 0 0 1em 0; padding: 0; border: 0; }\r
+form fieldset legend { margin: 0; padding: 0; font-size: 1.05em; font-weight: bold; /*background-color: #fff;*/ color: #333; } /* Preciser la couleur des legend et du fond pour IE/Win */\r
+form fieldset fieldset { margin-top: 1em; }\r
+form fieldset fieldset legend { font-size: 1em; font-weight: normal; }\r
+form p {\r
+       /*border-bottom: 1px solid #E6E6E6;*/\r
+       padding: 12px 0 5px 0;\r
+       margin: 0;      \r
+}\r
+/* Lignes */\r
+form ul { margin: 0; padding: 0; list-style: none; }\r
+form ul li { clear: both; margin: 0; padding: 0.50em 0; }\r
+\r
+/* Labels */\r
+form label { display: block; text-align: left; color: #GET{couleur_secondaire_foncee}; font-weight: bold; /* pour IE/Win */ position: relative;  }\r
+form li p { margin-top: 0; margin-bottom: 0; }\r
+form .choix label{display:inline;font-weight:normal;}\r
+form .choix input.radio,\r
+form .choix input.checkbox {width:auto;}\r
+\r
+input, select, textarea {\r
+       margin: 5px 0;\r
+       padding: 5px;\r
+       color: #6A6969;\r
+       border-width: 1px;\r
+       border-style: solid;\r
+       border-color: #d4d4d4 #ebebeb #ebebeb #d4d4d4;\r
+       font: 1em 'Lucida Grande', Verdana, Helvetica, sans-serif;\r
+}\r
+input:focus, select:focus, textarea:focus {\r
+       color: #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_foncer|couleur_foncer|couleur_foncer)];\r
+       background: #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir|couleur_eclaircir|couleur_eclaircir)];\r
+}\r
+\r
+input.button { \r
+       font: bold 12px Arial, Sans-serif; \r
+       height: 30px;\r
+       margin: 0;\r
+       padding: 2px 3px; \r
+       color: #fff;\r
+       background: #GET{couleur_secondaire_claire};\r
+       \r
+       border-width: 1px;\r
+       border-style: solid;\r
+       border-color: #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir)] #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_foncer)] #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_foncer)] #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir)];\r
+}\r
+.formulaire_login .editer_password .details {display:block;}\r
+.formulaire_login #spip_logo_auteur {float:right;}\r
+.formulaire_ecrire_auteur input, .formulaire_ecrire_auteur select, .formulaire_ecrire_auteur textarea {width:385px}\r
+.formulaire_inscription input, .formulaire_inscription select, .formulaire_inscription textarea {width:145px}\r
+.formulaire_ecrire_auteur input.submit, .formulaire_inscription input.submit {width:auto}\r
+\r
+/* Choix des mots-clefs */\r
+ul.choix_mots { display: block; margin: 0; padding: 0; list-style: none; }\r
+ul.choix_mots li { clear: none; float: left; display: block; width: 30%; padding: 1%; }\r
+ul.choix_mots li label { display: inline; font-weight: normal; }\r
+\r
+.formulaire_spip .bugajaxie { display: none; } /* Bug IE/Win */\r
+\r
+/* Reponses, previsu et erreurs\r
+----------------------------------------------- */\r
+\r
+/* Champs obligatoires */\r
+.formulaire_spip li.obligatoire {}\r
+.formulaire_spip li.obligatoire label {}\r
+\r
+/* Previsualisation du message */\r
+.formulaire_spip fieldset.previsu { margin-bottom: 2em; padding: 1em; border: 2px dashed #F57900; }\r
+.formulaire_spip fieldset.previsu legend { padding: 0 0.50em; font-weight: bold; color: #F57900; }\r
+.formulaire_spip fieldset.previsu li { padding: 3px; border: none; }\r
+.formulaire_spip fieldset.previsu p { margin: 1em 0; } \r
+\r
+/* Reponse du formulaire */\r
+.reponse_formulaire { font-weight: bold; color: #e86519; font-size: 1.20em; }\r
+fieldset.reponse_formulaire { border-color: #e86519; font-weight: normal; }\r
+fieldset.reponse_formulaire.reponse_formulaire legend { color: #F57900; } /* Preciser la couleur des legend et du fond pour IE/Win */\r
+\r
+/* * Erreurs */\r
+.formulaire_spip li.erreur .erreur_message { display: block; color: #C30; font-weight: bold; }\r
+.formulaire_spip li.erreur input.text, .formulaire_spip li.erreur textarea { background-color: #FCC; border-style: solid; border-color: #C30; }\r
+.reponse_formulaire_erreur { margin: 0; color: #C30; font-weight: bold; }\r
+\r
+/* * OK */\r
+.reponse_formulaire_ok { margin: 0; color: #53AD20; font-weight: bold; }\r
+\r
+/* Agenda */\r
+#contenu table.calendrier-large {width:920px}\r
+#calendar caption {text-align:center}\r
+#calendar th, #calendar td {padding:0.6em 0.65em;text-align:center;}\r
+#calendar .today {color: #GET{couleur_secondaire_claire};}\r
+#calendar .occupe {color: #GET{couleur_secondaire_claire};background: #[(#GET{couleur_secondaire_claire}|replace{#,''}|couleur_eclaircir)];}\r
+#calendar .horsperiode {color:#ccc}\r
+\r
+/* Barre typo */\r
+.texteencadre-spip {clear:both;}\r
+\r
+/* Evenement */\r
+.formulaire_participer_evenement form {padding:5px}\r
diff --git a/www/plugins/beespip/css/superfish.css.html b/www/plugins/beespip/css/superfish.css.html
new file mode 100755 (executable)
index 0000000..680f34a
--- /dev/null
@@ -0,0 +1,205 @@
+#CACHE{3600*100,cache-client}
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
+#HTTP_HEADER{Vary: Accept-Encoding}
+/* ----------------------------------------------
+       Beespip 3
+       Contingences
+       2012    
+ ------------------------------------------------ */
+/* Valeurs par defaut :
+#SET{couleur_principale,#CONFIG{BeeSpip/couleur/couleur_principale,#b83233}} [ couleur_principale: (#GET{couleur_principale});]
+#SET{couleur_secondaire_foncee,#CONFIG{BeeSpip/couleur/couleur_secondaire_foncee,#8b0b00}} [ couleur_secondaire_foncee: (#GET{couleur_secondaire_foncee});]
+#SET{couleur_secondaire_claire,#CONFIG{BeeSpip/couleur/couleur_secondaire_claire,#ff645b}} [ couleur_secondaire_claire: (#GET{couleur_secondaire_claire});]
+#SET{couleur_principale_texte,#CONFIG{BeeSpip/couleur/couleur_principale_texte,#666666}} [ couleur_principale_texte: (#GET{couleur_principale_texte});]
+#SET{couleur_titres,#CONFIG{BeeSpip/couleur/couleur_titres,#444444}} [ couleur_titres: (#GET{couleur_titres});]
+#SET{couleur_liens,#CONFIG{BeeSpip/couleur/couleur_liens,#0070a7}} [ couleur_liens: (#GET{couleur_liens});]
+#SET{couleur_menu_liens,#CONFIG{BeeSpip/couleur/couleur_menu_liens,#666666}} [ couleur_menu_liens: (#GET{couleur_menu_liens});]
+#SET{couleur_menu_liens_survol,#CONFIG{BeeSpip/couleur/couleur_menu_liens_survol,#000000}} [ couleur_menu_liens_survol: (#GET{couleur_menu_liens_survol});]
+#SET{largeur_items_menu,#CONFIG{BeeSpip/affichage/largeur_items_menu,0}} [ largeur_items_menu: (#GET{largeur_items_menu});]
+#SET{taille_typo_menu,#CONFIG{BeeSpip/affichage/taille_typo_menu,1.1}} [ taille_typo_menu: (#GET{taille_typo_menu});]
+
+*/
+/*** ESSENTIAL STYLES ***/
+.sf-menu, .sf-menu * {
+       /*margin: 4px 0 0 0;*/
+       margin:0;
+       padding: 0;
+       list-style: none;
+       color: #GET{couleur_menu_liens};
+       font: bold 1.1em 'Trebuchet MS', 'Helvetica Neue', Arial, Sans-Serif;
+       text-align: left;
+}
+.sf-menu {
+       line-height:    1.8em;
+}
+.sf-menu ul {
+       position:               absolute;
+       top:                    -999em;
+       width:                  185px; /* left offset of submenus need to match (see below) */
+}
+.sf-menu ul li {
+       width:                  100%;
+}
+.sf-menu li:hover, .sf-menu li:focus {
+       visibility:             inherit; /* fixes IE7 'sticky bug' */
+}
+.sf-menu li {
+       float:                  left;
+       position:               relative;
+       border-top-width: 0px;
+       padding: 0 10px 0 0;
+       margin-top:13px;
+       max-width : 160px;
+}
+.sf-menu a {
+       display:                block;
+       position:               relative;
+}
+
+.sf-menu li:hover ul, .sf-menu li:focus ul,
+.sf-menu li.sfHover ul {
+       left:                   0;
+       top:                    1.8em; /* match top ul list item height */
+       z-index:                90;
+       padding: 0px;
+       margin: 0px;
+       padding-bottom: 12px;
+}
+ul.sf-menu li:hover li ul, ul.sf-menu li:focus li ul,
+ul.sf-menu li.sfHover li ul {
+       top:                    -999em;
+}
+ul.sf-menu li li:hover ul, ul.sf-menu li li:focus ul,
+ul.sf-menu li li.sfHover ul {
+       left:                   185px; /* match ul width */
+       top:                    -1px;
+}
+ul.sf-menu li li:hover li ul, ul.sf-menu li li:focus li ul,
+ul.sf-menu li li.sfHover li ul {
+       top:                    -999em;
+}
+ul.sf-menu li li li:hover ul, ul.sf-menu li li li:focus ul,
+ul.sf-menu li li li.sfHover ul {
+       left:                   185px; /* match ul width */
+       top:                    0;
+}
+
+/*** DEMO SKIN ***/
+.sf-menu {
+       float: left;
+       /*margin-bottom: 12px;*/
+}
+.sf-menu .menu-entree {font-size:#GET{taille_typo_menu}em}
+.menu-liste.sf-menu .menu-entree a {font-size:1em}
+.sf-menu .menu-entree .menu-entree  { font-size:0.9em }
+.menu-liste.sf-menu .menu-entree .menu-entree a {font-size:0.9em}
+
+/*.sf-menu a {*/
+.sf-menu .menu-entree .menu-liste .menu-entree {
+       /*border-left:  1px solid #fff;*/
+       /*border-top:           1px solid #CFDEFF;*/
+       padding:                .15em 0em .15em 1em;
+       margin: 0 0 0.20em;
+       text-decoration:none;
+       max-width:160px;
+}
+.sf-menu a, .sf-menu a:visited  { /* visited pseudo selector so IE6 applies text colour*/
+       color:          #GET{couleur_menu_liens};
+       font-weight: bold;
+       text-align:center;
+}
+.sf-menu ul li a, .sf-menu ul li a:visited  { /* visited pseudo selector so IE6 applies text colour*/
+       color:          #GET{couleur_liens};
+       font-weight: bold;
+       text-align:left;
+}
+.sf-menu ul li a:hover, .sf-menu a:hover,
+.sf-menu li:hover, .sf-menu:hover,
+.sf-menu ul li a:focus, .sf-menu a:focus,
+.sf-menu li:focus, .sf-menu:focus  { /* visited pseudo selector so IE6 applies text colour*/
+       color:          #GET{couleur_menu_liens_survol};
+       border:none;
+}
+.sf-menu li {
+       /*background:           #BDD2FF;*/
+       text-align:center;
+       [(#GET{largeur_items_menu}|>{0}|oui)width:#GET{largeur_items_menu}px;]
+}
+.sf-menu li.menu-entree ul, .sf-menu li.menu-entree ul li.menu-entree ul {
+       background-image: url(#CHEMIN{/images/bg_sous_menu.png});
+       background-repeat: no-repeat;
+       background-position: left bottom;
+       margin:0;
+       text-align:left;
+       /*margin-bottom:10px;*/
+}
+.sf-menu li li {
+       /*background:           #AABDE6;*/
+       font-size:0.9em;
+       margin-top:2px;
+       max-width : none;
+}
+.sf-menu li li li {
+       /*background:           #9AAEDB;*/
+}
+.sf-menu li:hover, .sf-menu li.sfHover,
+.sf-menu a:focus, .sf-menu a:hover, .sf-menu a:active {
+       /*background:           #CFDEFF;*/
+       outline:                0;
+}
+
+/*** arrows **/
+.sf-menu .menu-entree {
+/*.sf-menu a.sf-with-ul {*/
+       margin: 0.20em 0.5em;
+       padding:        0.20em 0.55em 0.20em 0.20em;
+       min-width:              1px; /* trigger IE7 hasLayout so spans position accurately */
+}
+.sf-sub-indicator {
+       position:               absolute;
+       display:                none;/*block;*/
+       right:                  .75em;
+       top:                    1.05em; /* IE6 only */
+       width:                  10px;
+       height:                 10px;
+       text-indent:    -999em;
+       overflow:               hidden;
+       /*background:           url('../images/arrows-ffffff.png') no-repeat -10px -100px;*/ /* 8-bit indexed alpha png. IE6 gets solid image only */
+}
+a > .sf-sub-indicator {  /* give all except IE6 the correct values */
+       top:                    .8em;
+       background-position: 0 -100px; /* use translucent arrow for modern browsers*/
+}
+/* apply hovers to modern browsers */
+a:focus > .sf-sub-indicator,
+a:hover > .sf-sub-indicator,
+a:active > .sf-sub-indicator,
+li:hover > a > .sf-sub-indicator,
+li.sfHover > a > .sf-sub-indicator {
+       background-position: -10px -100px; /* arrow hovers for modern browsers*/
+}
+
+/* point right for anchors in subs */
+.sf-menu ul .sf-sub-indicator { background-position:  -10px 0; }
+.sf-menu ul a > .sf-sub-indicator { background-position:  0 0; }
+/* apply hovers to modern browsers */
+.sf-menu ul a:focus > .sf-sub-indicator,
+.sf-menu ul a:hover > .sf-sub-indicator,
+.sf-menu ul a:active > .sf-sub-indicator,
+.sf-menu ul li:hover > a > .sf-sub-indicator,
+.sf-menu ul li.sfHover > a > .sf-sub-indicator {
+       background-position: -10px 0; /* arrow hovers for modern browsers*/
+}
+
+/*** shadows for all but IE6 ***/
+.sf-shadow ul {
+       /*background:   url('../images/shadow.png') no-repeat bottom right;*/
+       padding: 0 8px 9px 0;
+       /*-moz-border-radius-bottomleft: 17px;
+       -moz-border-radius-topright: 17px;
+       -webkit-border-top-right-radius: 17px;
+       -webkit-border-bottom-left-radius: 17px;*/
+}
+.sf-shadow ul.sf-shadow-off {
+       background: transparent;
+}
diff --git a/www/plugins/beespip/extra/article-pleine_largeur.html b/www/plugins/beespip/extra/article-pleine_largeur.html
new file mode 100755 (executable)
index 0000000..8189236
--- /dev/null
@@ -0,0 +1,49 @@
+<BOUCLE_extra_article(ARTICLES){id_article}{doublons}>
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+       #SET{premiere_colonne,oui}[(#REM) Gestion des évenements ]
+       [(#PLUGIN{agenda}|oui)
+               [(#CONFIG{BeeSpip/configuration/calendrier_public}|=={'oui'}|oui)<div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]"><INCLURE{fond=inclure/evenements}{id_article}{bandeau=oui}></div>]
+       ]
+
+       [(#REM) Articles dans la meme rubrique ]
+       <B_articles_rubrique>
+       <div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]">
+       <div class="liste articles liste_bloc_bandeau">
+               <h4><a href="#URL_RUBRIQUE"><:meme_rubrique:></a></h4>
+               <ul class="liste-items">
+                       <BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {par date}{inverse} {0,10}{doublons}>
+                       <li class="item"><a href="#URL_ARTICLE" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                       </BOUCLE_articles_rubrique>
+               </ul>
+       </div>
+       </div>
+       </B_articles_rubrique>
+
+  [(#REM) Menu de navigation mots-cles ]
+       <B_mots>
+       <div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]">
+       <div class="liste mots liste_bloc_bandeau">
+      <h4><:mots_clefs:></h4>
+      <ul class="liste-items">
+      <BOUCLE_mots(MOTS) {id_article} {par titre}{type!==^[~]}>
+          <li class="item"><a href="#URL_MOT" rel="tag" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+      </BOUCLE_mots>
+      </ul>
+  </div>
+  </div>
+  </B_mots>
+</BOUCLE_extra_article>
diff --git a/www/plugins/beespip/extra/article.html b/www/plugins/beespip/extra/article.html
new file mode 100755 (executable)
index 0000000..e9c7fcf
--- /dev/null
@@ -0,0 +1,34 @@
+<BOUCLE_extra_article(ARTICLES){id_article}{doublons}>
+[(#REM) Exclusion des articles, ayant le mot clé "exclu"]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+[(#ENV{nodiv}|=={oui}|non)<div class="grid_4 alpha omega">]
+[(#REM) Gestion des évenements ]
+[(#PLUGIN{agenda}|oui)
+       [(#CONFIG{BeeSpip/configuration/calendrier_public}|=={'oui'}|oui)<INCLURE{fond=inclure/evenements}{id_article}>]
+]
+
+       [(#REM) Articles dans la meme rubrique ]
+       <B_articles_rubrique>
+       <div class="liste articles">
+               <h4><a href="#URL_RUBRIQUE"><:meme_rubrique:></a></h4>
+               <ul class="liste-items">
+                       <BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {par date}{inverse} {0,10}{doublons}>
+                       <li class="item"><a href="#URL_ARTICLE" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                       </BOUCLE_articles_rubrique>
+               </ul>
+       </div>
+       </B_articles_rubrique>
+
+  [(#REM) Menu de navigation mots-cles ]
+  <B_mots>
+  <div class="liste mots">
+      <h4><:mots_clefs:></h4>
+      <ul class="liste-items">
+      <BOUCLE_mots(MOTS) {id_article} {par titre}{type!==^[~]}>
+          <li class="item"><a href="#URL_MOT" rel="tag" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+      </BOUCLE_mots>
+      </ul>
+  </div>
+  </B_mots>
+[(#ENV{nodiv}|=={oui}|non)</div>]
+</BOUCLE_extra_article>
diff --git a/www/plugins/beespip/extra/auteur.html b/www/plugins/beespip/extra/auteur.html
new file mode 100755 (executable)
index 0000000..be3a2ac
--- /dev/null
@@ -0,0 +1,17 @@
+<BOUCLE_extra_auteur(AUTEURS){id_auteur}{doublons}>
+<div class="grid_8 alpha omega">
+       [(#REM) Autres auteurs ]
+       <B_auteurs>
+       <div class="liste auteurs">
+               #ANCRE_PAGINATION
+               <h4><:info_auteurs:></h4>
+               <ul class="liste-items">
+                       <BOUCLE_auteurs(AUTEURS) {par nom} {pagination 20}{doublons}>
+                       <li class="item"><a href="#URL_AUTEUR" title="[(#NOM|attribut_html)]">[(#NOM|couper{80})]</a></li>
+                       </BOUCLE_auteurs>
+               </ul>
+               [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       </div>
+       </B_auteurs>
+</div>
+</BOUCLE_extra_auteur>
diff --git a/www/plugins/beespip/extra/breve.html b/www/plugins/beespip/extra/breve.html
new file mode 100755 (executable)
index 0000000..3a8e93c
--- /dev/null
@@ -0,0 +1,42 @@
+<BOUCLE_breve_principal(BREVES) {id_breve}{doublons}>
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<div class="grid_4 alpha omega">
+  [(#REM) Breves dans la meme rubrique ]
+  <B_breves>
+  <div class="liste breves">
+      <h4><:autres_breves:></h4>
+      <ul class="liste-items">
+          <BOUCLE_breves(BREVES) {id_rubrique} {par date}{inverse} {0,10}{doublons}>
+          <li class="item">[(#CONFIG{BeeSpip/affichage/dates_breves}|=={'oui'}|oui)[(#DATE|affdate_jourcourt) &ndash; ]]<a href="#URL_BREVE"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></li>
+          </BOUCLE_breves>
+      </ul>
+  </div>
+  </B_breves>
+
+  [(#REM) Menu de navigation mots-cles ]
+  <B_mots>
+  <div class="liste mots">
+      <h4><:mots_clefs:></h4>
+      <ul class="liste-items">
+      <BOUCLE_mots(MOTS) {id_breve} {par titre}{type!==^[~]}>
+          <li class="item"><a href="#URL_MOT" rel="tag" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+      </BOUCLE_mots>
+      </ul>
+  </div>
+  </B_mots>
+</div>
+</BOUCLE_breve_principal>
diff --git a/www/plugins/beespip/extra/mot.html b/www/plugins/beespip/extra/mot.html
new file mode 100755 (executable)
index 0000000..636ac57
--- /dev/null
@@ -0,0 +1,31 @@
+<BOUCLE_principale(MOTS) {id_mot} {doublons}{type!==^[~]}>
+<div class="grid_4 alpha omega">
+       [(#REM) Menu de navigation mots-cles : les autres mots cles du meme groupe ]
+  <B_mots_freres>
+  <div class="liste mots">
+      #ANCRE_PAGINATION
+      <h4><:mots_clefs_meme_groupe:></h4>
+      <ul class="liste-items">
+          <BOUCLE_mots_freres(MOTS) {type} {par titre} {pagination 20}{doublons}>
+          <li class="item"><a href="#URL_MOT" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+          </BOUCLE_mots_freres>
+      </ul>
+      [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+  </div>
+  </B_mots_freres>
+
+  [(#REM) Menu de navigation mots-cles : les autres groupes avec un lien sur le premier mot du groupe ]
+  <B_groupes_freres>
+  <div class="liste groupes_mots">
+      <h4><:autres_groupes_mots_clefs:></h4>
+      <ul class="liste-items">
+          <BOUCLE_groupes_freres(GROUPES_MOTS) {!id_groupe} {par titre} {doublons}{titre!==^[~]}>
+          <BOUCLE_mot_cousin(MOTS) {id_groupe} {par titre} {0,1}>
+          <li class="item"><a href="#URL_MOT" title="[(#TYPE|attribut_html)]">#TYPE</a></li>
+          </BOUCLE_mot_cousin>
+          </BOUCLE_groupes_freres>
+      </ul>
+  </div>
+  </B_groupes_freres>
+</div>
+</BOUCLE_principale>
diff --git a/www/plugins/beespip/extra/page-sommaire.html b/www/plugins/beespip/extra/page-sommaire.html
new file mode 100755 (executable)
index 0000000..6723b63
--- /dev/null
@@ -0,0 +1,61 @@
+<div class="grid_4 alpha omega liste">
+[(#REM) Faut-il afficher l'agenda]
+[(#PLUGIN{agenda}|oui)[(#CONFIG{BeeSpip/configuration/calendrier_public}|=={'oui'}|oui)<INCLURE{fond=inclure/agenda,env}{date}{ajax}{self}>]]
+
+[(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide2'}|non)<INCLURE{fond=inclure/articles_une_colonne_droite,lang}{doublons}>]
+
+
+[(#REM) Les brèves ]
+<B_breves>
+<div class="liste breves">
+       <h4><:dernieres_breves:></h4>
+       <ul class="liste-items">
+               <BOUCLE_breves(BREVES) {doublons}{par date}{inverse} {0,5}{age<120}>
+               <li class="item">[(#CONFIG{BeeSpip/affichage/dates_breves}|=={'oui'}|oui)[(#DATE|affdate_jourcourt) &ndash; ]]<a href="#URL_BREVE"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></li>
+               </BOUCLE_breves>
+       </ul>
+</div>
+</B_breves>
+
+[(#REM) Inscription au site ]
+#FORMULAIRE_INSCRIPTION
+
+[(#REM) Liens des forums ]
+<B_forums_liens>
+<div class="liste forums">
+       <h4><:derniers_commentaires:></h4>
+       <ul class="liste-items">
+               <BOUCLE_forums_liens(FORUMS?) {doublons}{plat} {par date}{inverse} {0,4}{age<120}>
+               <li class="item">[(#DATE|affdate_jourcourt) &ndash; ]<a href="#URL_FORUM"[ title="(#TITRE|attribut_html|couper{80})"]>[(#TITRE|couper{80})]</a></li>
+               </BOUCLE_forums_liens>
+       </ul>
+</div>
+</B_forums_liens>
+
+
+[(#REM) Sur le Web syndiqués]
+<B_syndic>
+<div class="liste syndic_articles">
+       <h4><:nouveautes_web:></h4>
+       <ul class="liste-items">
+               <BOUCLE_syndic(SYNDIC_ARTICLES) {doublons}{age<180} {par date}{inverse} {0,5}{age<120}>
+               <li class="item">[(#DATE|affdate_jourcourt) &ndash; ]<a href="#URL_ARTICLE"[ title="(#NOM_SITE|attribut_html|couper{80})"] class="spip_out">#TITRE</a></li>
+               </BOUCLE_syndic>
+       </ul>
+</div>
+</B_syndic>
+
+[(#REM) Sur le Web]
+<B_sites_autres>
+<div class="liste syndic">
+       <h4><:sur_web:></h4>
+       <ul class="liste-items">
+               <BOUCLE_sites_autres(SITES) {!par date} {doublons} {0,5}>
+               <li class="item"><a href="#URL_SITE" title="[(#DESCRIPTIF|textebrut|entites_html)]" onclick="window.open(this.href); return false;">#NOM_SITE</a></li>
+               </BOUCLE_sites_autres>
+       </ul>
+</div>
+</B_sites_autres>
+
+[(#CONFIG{BeeSpip/configuration/articles_populaires}|=={'oui'}|oui)<INCLURE{fond=inclure/articles_populaires,lang}>]
+</div>
diff --git a/www/plugins/beespip/extra/rubrique-articles_2cols.html b/www/plugins/beespip/extra/rubrique-articles_2cols.html
new file mode 100755 (executable)
index 0000000..20d5227
--- /dev/null
@@ -0,0 +1,70 @@
+<BOUCLE_extra_rubrique(RUBRIQUES){id_rubrique}>
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}>
+               <BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}>
+       </BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+       #SET{premiere_colonne,oui}[(#REM) Menu de navigation mots-cles ]
+       <B_mots>
+       <div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]">
+       <div class="liste mots liste_bloc_bandeau">
+               <h4><:mots_clefs:></h4>
+               <ul class="liste-items">
+                       <BOUCLE_mots(MOTS) {id_rubrique} {par titre}{type!==^[~]}>
+                       <li class="item"><a href="#URL_MOT" rel="tag" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                       </BOUCLE_mots>
+               </ul>
+       </div>
+       </div>
+       </B_mots>
+                       
+       [(#REM) Breves du secteur ]
+       <B_breves>
+       <div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]">
+       <div class="liste breves liste_bloc_bandeau">
+                       #ANCRE_PAGINATION
+                       <h4><:breves:></h4>
+                       <ul class="liste-items">
+                                       <BOUCLE_breves(BREVES) {doublons}{id_rubrique} {par date}{inverse} {pagination 5}>
+                                       <li class="item">[(#CONFIG{BeeSpip/affichage/dates_breves}|=={'oui'}|oui)[(#DATE|affdate{'d/m/Y'}) &ndash; ]]<a href="#URL_BREVE"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></li>
+                                       </BOUCLE_breves>
+                       </ul>
+                       [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       </div>
+       </div>
+       </B_breves>
+
+       [(#REM) Sites de la rubrique ]
+       <B_sites>
+       <div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]">
+       <div class="liste sites liste_bloc_bandeau">
+                       <h4><:sur_web:></h4>
+                       <ul class="liste-items">
+                                       <BOUCLE_sites(SITES) {doublons}{id_rubrique} {par nom_site}>
+                                       <li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]">#NOM_SITE</a>
+                                                       <B_syndic>
+                                                       <ul>
+                                                                       <BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,3}>
+                                                                       <li><a href="#URL_ARTICLE" class="spip_out" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                                                                       </BOUCLE_syndic>
+                                                       </ul>
+                                                       </B_syndic>
+                                       </li>
+                                       </BOUCLE_sites>
+                       </ul>
+       </div>
+       </div>
+       </B_sites>
+</BOUCLE_extra_rubrique>
diff --git a/www/plugins/beespip/extra/rubrique-articles_4cols.html b/www/plugins/beespip/extra/rubrique-articles_4cols.html
new file mode 100755 (executable)
index 0000000..20d5227
--- /dev/null
@@ -0,0 +1,70 @@
+<BOUCLE_extra_rubrique(RUBRIQUES){id_rubrique}>
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}>
+               <BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}>
+       </BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+       #SET{premiere_colonne,oui}[(#REM) Menu de navigation mots-cles ]
+       <B_mots>
+       <div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]">
+       <div class="liste mots liste_bloc_bandeau">
+               <h4><:mots_clefs:></h4>
+               <ul class="liste-items">
+                       <BOUCLE_mots(MOTS) {id_rubrique} {par titre}{type!==^[~]}>
+                       <li class="item"><a href="#URL_MOT" rel="tag" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                       </BOUCLE_mots>
+               </ul>
+       </div>
+       </div>
+       </B_mots>
+                       
+       [(#REM) Breves du secteur ]
+       <B_breves>
+       <div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]">
+       <div class="liste breves liste_bloc_bandeau">
+                       #ANCRE_PAGINATION
+                       <h4><:breves:></h4>
+                       <ul class="liste-items">
+                                       <BOUCLE_breves(BREVES) {doublons}{id_rubrique} {par date}{inverse} {pagination 5}>
+                                       <li class="item">[(#CONFIG{BeeSpip/affichage/dates_breves}|=={'oui'}|oui)[(#DATE|affdate{'d/m/Y'}) &ndash; ]]<a href="#URL_BREVE"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></li>
+                                       </BOUCLE_breves>
+                       </ul>
+                       [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       </div>
+       </div>
+       </B_breves>
+
+       [(#REM) Sites de la rubrique ]
+       <B_sites>
+       <div class="grid_4[(#GET{premiere_colonne}|=={oui}|oui) alpha#SET{premiere_colonne,non}]">
+       <div class="liste sites liste_bloc_bandeau">
+                       <h4><:sur_web:></h4>
+                       <ul class="liste-items">
+                                       <BOUCLE_sites(SITES) {doublons}{id_rubrique} {par nom_site}>
+                                       <li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]">#NOM_SITE</a>
+                                                       <B_syndic>
+                                                       <ul>
+                                                                       <BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,3}>
+                                                                       <li><a href="#URL_ARTICLE" class="spip_out" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                                                                       </BOUCLE_syndic>
+                                                       </ul>
+                                                       </B_syndic>
+                                       </li>
+                                       </BOUCLE_sites>
+                       </ul>
+       </div>
+       </div>
+       </B_sites>
+</BOUCLE_extra_rubrique>
diff --git a/www/plugins/beespip/extra/rubrique-signets.html b/www/plugins/beespip/extra/rubrique-signets.html
new file mode 100755 (executable)
index 0000000..785be22
--- /dev/null
@@ -0,0 +1,67 @@
+<BOUCLE_extra_rubrique(RUBRIQUES){id_rubrique}>
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+[(#ENV{nodiv}|=={oui}|non)<div class="grid_4 alpha omega">]
+       [(#REM) Menu de navigation mots-cles ]
+       <B_groupes_mots>
+       <div class="liste mots">
+               <h4><:beespip:liste_afficher_triant_par:></h4>
+               <ul class="liste-items">
+                       <li class="item"><a href="#URL_RUBRIQUE"> <:beespip:ordre_alphabetique2:></a></li>
+                       <BOUCLE_groupes_mots(GROUPES_MOTS){titre==^~~}{par titre}{doublons}>
+                               <BOUCLE_mots(MOTS){id_groupe=15}{0,1}>
+                               <li class="item"><a href="[(#SELF|parametre_url{id_mot|id_groupe,''}|parametre_url{id_groupe,#ID_GROUPE})]">[(#_groupes_mots:TITRE|replace{~~}|replace{'&nbsp;'})]</a></li></BOUCLE_mots>
+                       </BOUCLE_groupes_mots>
+               </ul>
+       </div>
+       </B_groupes_mots>
+
+                       
+       [(#REM) Breves du secteur ]
+       <B_breves>
+       <div class="liste breves">
+                       #ANCRE_PAGINATION
+                       <h4><:breves:></h4>
+                       <ul class="liste-items">
+                                       <BOUCLE_breves(BREVES) {doublons}{id_rubrique} {par date}{inverse} {pagination 5}>
+                                       <li class="item">[(#CONFIG{BeeSpip/affichage/dates_breves}|=={'oui'}|oui)[(#DATE|affdate{'d/m/Y'}) &ndash; ]]<a href="#URL_BREVE"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></li>
+                                       </BOUCLE_breves>
+                       </ul>
+                       [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       </div>
+       </B_breves>
+
+       [(#REM) Sites de la rubrique ]
+       <B_sites>
+       <div class="liste sites">
+                       <h4><:sur_web:></h4>
+                       <ul class="liste-items">
+                                       <BOUCLE_sites(SITES) {doublons}{id_rubrique} {!par date}{0,5}>
+                                       <li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]">#NOM_SITE</a>
+                                                       <B_syndic>
+                                                       <ul>
+                                                               <BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,3}>
+                                                               <li><a href="#URL_ARTICLE" class="spip_out" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                                                               </BOUCLE_syndic>
+                                                       </ul>
+                                                       </B_syndic>
+                                       </li>
+                                       </BOUCLE_sites>
+                       </ul>
+       </div>
+       </B_sites>
+[(#ENV{nodiv}|=={oui}|non)</div>]
+</BOUCLE_extra_rubrique>
diff --git a/www/plugins/beespip/extra/rubrique.html b/www/plugins/beespip/extra/rubrique.html
new file mode 100755 (executable)
index 0000000..93b8187
--- /dev/null
@@ -0,0 +1,64 @@
+<BOUCLE_extra_rubrique(RUBRIQUES){id_rubrique}>
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+[(#ENV{nodiv}|=={oui}|non)<div class="grid_4 alpha omega">]
+       [(#REM) Menu de navigation mots-cles ]
+       <B_mots>
+       <div class="liste mots">
+               <h4><:mots_clefs:></h4>
+               <ul class="liste-items">
+                       <BOUCLE_mots(MOTS) {id_rubrique} {par titre}{type!==^[~]}>
+                       <li class="item"><a href="#URL_MOT" rel="tag" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                       </BOUCLE_mots>
+               </ul>
+       </div>
+       </B_mots>
+                       
+       [(#REM) Breves du secteur ]
+       <B_breves>
+       <div class="liste breves">
+                       #ANCRE_PAGINATION
+                       <h4><:breves:></h4>
+                       <ul class="liste-items">
+                                       <BOUCLE_breves(BREVES) {doublons}{id_rubrique} {par date}{inverse} {pagination 5}>
+                                       <li class="item">[(#CONFIG{BeeSpip/affichage/dates_breves}|=={'oui'}|oui)[(#DATE|affdate{'d/m/Y'}) &ndash; ]]<a href="#URL_BREVE"[ title="(#TITRE|attribut_html)"]>[(#TITRE)]</a></li>
+                                       </BOUCLE_breves>
+                       </ul>
+                       [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       </div>
+       </B_breves>
+
+       [(#REM) Sites de la rubrique ]
+       <B_sites>
+       <div class="liste sites">
+                       <h4><:sur_web:></h4>
+                       <ul class="liste-items">
+                                       <BOUCLE_sites(SITES) {doublons}{id_rubrique} {par nom_site}>
+                                       <li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]">#NOM_SITE</a>
+                                                       <B_syndic>
+                                                       <ul>
+                                                                       <BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,3}>
+                                                                       <li><a href="#URL_ARTICLE" class="spip_out" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                                                                       </BOUCLE_syndic>
+                                                       </ul>
+                                                       </B_syndic>
+                                       </li>
+                                       </BOUCLE_sites>
+                       </ul>
+       </div>
+       </B_sites>
+[(#ENV{nodiv}|=={oui}|non)</div>]
+</BOUCLE_extra_rubrique>
diff --git a/www/plugins/beespip/extra/site.html b/www/plugins/beespip/extra/site.html
new file mode 100755 (executable)
index 0000000..4c3653a
--- /dev/null
@@ -0,0 +1,44 @@
+<BOUCLE_site(SITES){id_syndic}{doublons}>
+[(#REM) Exclusion des articles, brèves et sites ayant le mot clé "exclu" et des rubriques ]
+<BOUCLE_exclus_articles(ARTICLES){titre_mot=exclu}{doublons}{lang}><BOUCLE_exclus_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_articles_forum></BOUCLE_exclus_articles>
+<BOUCLE_exclus_breves(BREVES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_breves>
+<BOUCLE_exclus_sites(SITES){titre_mot=exclu}{doublons}><BOUCLE_exclus_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_articles_sites></BOUCLE_exclus_sites>
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}>
+       <BOUCLE_exclus_rub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_rub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_rub_articles_forum></BOUCLE_exclus_rub_articles>
+       <BOUCLE_exclus_rub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_rub_breves>
+       <BOUCLE_exclus_rub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_rub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_rub_articles_sites></BOUCLE_exclus_rub_sites>
+       <BOUCLE_exclus_sousrubriques(RUBRIQUES){id_parent}{doublons}{lang}>
+               <BOUCLE_exclus_sousrub_articles(ARTICLES){id_rubrique}{doublons}{lang}><BOUCLE_exclus_sousrub_articles_forum(FORUMS){id_article}{doublons}></BOUCLE_exclus_sousrub_articles_forum></BOUCLE_exclus_sousrub_articles>
+               <BOUCLE_exclus_sousrub_breves(BREVES){id_rubrique}{doublons}{lang}></BOUCLE_exclus_sousrub_breves>
+               <BOUCLE_exclus_sousrub_sites(SITES){id_rubrique}{doublons}><BOUCLE_exclus_sousrub_articles_sites(SYNDIC_ARTICLES) {id_syndic}{doublons}></BOUCLE_exclus_sousrub_articles_sites></BOUCLE_exclus_sousrub_sites>
+       </BOUCLE_exclus_sousrubriques>
+       <BOUCLE_recursive(BOUCLE_exclus_sousrubriques)></BOUCLE_recursive>
+</BOUCLE_exclus_rubriques>
+<div class="grid_4 alpha omega">
+       [(#REM) Autres sites web ]
+       <B_sites>
+       <div class="liste sites">
+               #ANCRE_PAGINATION
+               <h4><:sites_web:></h4>
+               <ul class="liste-items">
+                       <BOUCLE_sites(SITES) {par nom_site} {pagination 20}{doublons}>
+                       <li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]" title="[(#NOM_SITE|attribut_html)]">#NOM_SITE</a></li>
+                       </BOUCLE_sites>
+               </ul>
+               [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       </div>
+       </B_sites>
+
+       [(#REM) Menu de navigation mots-cles ]
+       <B_mots>
+       <div class="liste mots">
+               <h4><:mots_clefs:></h4>
+               <ul class="liste-items">
+                       <BOUCLE_mots(MOTS) {id_syndic} {par titre}{type!==^[~]}>
+                       <li class="item"><a href="#URL_MOT" rel="tag" title="[(#TITRE|attribut_html)]">#TITRE</a></li>
+                       </BOUCLE_mots>
+               </ul>
+       </div>
+       </B_mots>
+</div>
+</BOUCLE_site>
diff --git a/www/plugins/beespip/fonds/cfg_beespip_config.html b/www/plugins/beespip/fonds/cfg_beespip_config.html
new file mode 100755 (executable)
index 0000000..f42c384
--- /dev/null
@@ -0,0 +1,25 @@
+<!-- descriptif=\r
+<h4>\r
+Configuration du plugin Beespip.\r
+</h4>\r
+<:beespip:version:>[(#VAL{beespip}|beespip_info_version)]\r
+-->\r
+\r
+<!-- titre=Configuration de Beespip-->\r
+<!-- icone=images/config/beespipconfig-24.gif-->\r
+<!-- boite=<:beespip:beespip_config:> -->\r
+\r
+<!-- liens*=beespip:beespip_config -->\r
+<!-- liens*=beespip:beespip_options_affichage -->\r
+<!-- liens*=beespip:beespip_couleur -->\r
+\r
+<!-- nom=BeeSpip -->\r
+<!-- casier=configuration -->\r
+<style type="text/css" media="screen">\r
+.formulaire_spip fieldset {padding: 0 10px;}\r
+</style>\r
+#CACHE{0}\r
+<div class="ajax">\r
+#FORMULAIRE_CONFIGURER_BEESPIP\r
+</div>\r
+\r
diff --git a/www/plugins/beespip/fonds/cfg_beespip_couleur.html b/www/plugins/beespip/fonds/cfg_beespip_couleur.html
new file mode 100755 (executable)
index 0000000..d155ede
--- /dev/null
@@ -0,0 +1,26 @@
+<!-- descriptif=\r
+<h4>\r
+Configuration du plugin Beespip.\r
+</h4>\r
+<:beespip:version:>[(#VAL{beespip}|beespip_info_version)]\r
+-->\r
+\r
+<!-- titre=Configuration de Beespip-->\r
+<!-- icone=images/config/beespipconfig-24.gif-->\r
+<!-- boite=<:beespip:beespip_couleur:> -->\r
+\r
+<!-- liens*=beespip:beespip_config -->\r
+<!-- liens*=beespip:beespip_options_affichage -->\r
+<!-- liens*=beespip:beespip_couleur -->\r
+\r
+<!-- onglet=beespip_config -->\r
+\r
+<!-- nom=BeeSpip -->\r
+<!-- casier=couleur -->\r
+<style type="text/css" media="screen">\r
+.formulaire_spip fieldset {padding: 0 10px;}\r
+</style>\r
+#CACHE{0}\r
+<div class="ajax">\r
+#FORMULAIRE_CONFIGURER_BEESPIP_COULEUR\r
+</div>\r
diff --git a/www/plugins/beespip/fonds/cfg_beespip_options_affichage.html b/www/plugins/beespip/fonds/cfg_beespip_options_affichage.html
new file mode 100755 (executable)
index 0000000..6bd81cc
--- /dev/null
@@ -0,0 +1,28 @@
+<!-- descriptif=\r
+<h4>\r
+Configuration du plugin Beespip.\r
+</h4>\r
+<:beespip:version:>[(#VAL{beespip}|beespip_info_version)]\r
+-->\r
+\r
+<!-- titre=Configuration de Beespip-->\r
+<!-- icone=images/config/beespipconfig-24.gif-->\r
+<!-- boite=<:beespip:beespip_options_affichage:> -->\r
+\r
+<!-- liens*=beespip:beespip_config -->\r
+<!-- liens*=beespip:beespip_options_affichage -->\r
+<!-- liens*=beespip:beespip_couleur -->\r
+\r
+<!-- onglet=beespip_config -->\r
+\r
+<!-- nom=BeeSpip -->\r
+<!-- casier=affichage -->\r
+<style type="text/css" media="screen">\r
+.formulaire_spip fieldset {padding: 0 10px;}\r
+</style>\r
+#CACHE{0}\r
+<div class="ajax">\r
+#FORMULAIRE_CONFIGURER_BEESPIP_OPTIONS_AFFICHAGE\r
+</div>\r
+\r
+\r
diff --git a/www/plugins/beespip/formulaires/calendrier_mini.html b/www/plugins/beespip/formulaires/calendrier_mini.html
new file mode 100755 (executable)
index 0000000..4c8a1d6
--- /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">
+       <h4 class="menu-titre"><:icone_calendrier:></h4>
+       <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>
diff --git a/www/plugins/beespip/formulaires/configurer_beespip.html b/www/plugins/beespip/formulaires/configurer_beespip.html
new file mode 100755 (executable)
index 0000000..c5b3493
--- /dev/null
@@ -0,0 +1,60 @@
+<div class="formulaire_spip formulaire_cfg formulaire_#FORM">\r
+\r
+<h3 class='titrem'>[(#CHEMIN{prive/themes/spip/images/beespip_config-24.png}|image_reduire{24}|inserer_attribut{class,cadre-icone}|inserer_attribut{alt,''})] Configuration de Beespip</h3>\r
+\r
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]\r
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]\r
+\r
+<form method="post" action="#ENV{action}">\r
+<div>\r
+#ACTION_FORMULAIRE{#ENV{action}}\r
+\r
+       \r
+       <fieldset><legend><img src="[(#CHEMIN{prive/themes/spip/images/page_accueil.png})]" style="margin-bottom:-8px;" /> <strong><:beespip:beespip_choix_page_accueil:></strong></legend>\r
+                       #SET{erreurs,#ENV**{erreurs}|table_valeur{page_accueil}}\r
+                       <label for="beespip_accueil"><input type="radio" name="page_accueil" id="beespip_accueil" value="accueil"[ checked="(#ENV{page_accueil,accueil}|=={accueil}|?{checked})"]>2 colonnes avec des articles en Une.</label><br />\r
+                       <label for="beespip_accueil_slide"><input type="radio" name="page_accueil" id="beespip_accueil_slide" value="slide"[ checked="(#ENV{page_accueil,accueil}|=={slide}|?{checked})"]>2 colonnes avec des articles en "slide" en Une.</label><br />\r
+                       <label for="beespip_accueil_slide2"><input type="radio" name="page_accueil" id="beespip_accueil_slide2" value="slide2"[ checked="(#ENV{page_accueil,accueil}|=={slide2}|?{checked})"]>3 colonnes avec des articles en "slide" en Une.</label></fieldset>\r
+       <p />\r
+       [(#PLUGIN{agenda}|oui)<fieldset><legend><strong><:beespip:beespip_calendrier_public:></strong></legend>\r
+               #SET{erreurs,#ENV**{erreurs}|table_valeur{calendrier_public}}\r
+               <label for="beespip_calendrier_public_oui"><input type="radio" name="calendrier_public" id="beespip_calendrier_public_oui" value="oui"[ checked="(#ENV{calendrier_public,non}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+               <label for="beespip_calendrier_public_non"><input type="radio" name="calendrier_public" id="beespip_calendrier_public_non" value="non"[ checked="(#ENV{calendrier_public,non}|=={non}|?{checked})"]><:beespip:beespip_non:></label></fieldset>\r
+       <p />]\r
+       <fieldset><legend><strong>Option de la page d'accueil</strong></legend>\r
+               #SET{erreurs,#ENV**{erreurs}|table_valeur{nb_article_une}}\r
+               <label for="beespip_nb_article_une">Nombre d'articles en "Une"</label><br />\r
+               <input type="text" name="nb_article_une" id="beespip_nb_article_une" value="#ENV{nb_article_une,6}" size="7" class="fondl" />\r
+               <br style="margin-bottom:15px;" />\r
+               #SET{erreurs,#ENV**{erreurs}|table_valeur{nb_ligne_sousune}}\r
+               <label for="beespip_nb_ligne_sousune">Nombre de ligne d'articles en "Sous une". Une ligne contenant 3 articles, il vous faudra pr&eacute;voir un multiple de 3 lors de l'affectation des mots cl&eacute;s.</label><br />\r
+               <input type="text" name="nb_ligne_sousune" id="beespip_nb_ligne_sousune" value="#ENV{nb_ligne_sousune,1}" size="7" class="fondl" />\r
+               <br style="margin-bottom:15px;" />\r
+               #SET{erreurs,#ENV**{erreurs}|table_valeur{nb_article_col_droite}}\r
+               <label for="beespip_nb_article_col_droite">Nombre d'articles dans la colonne de droite</label><br />\r
+               <input type="text" name="nb_article_col_droite" id="beespip_nb_article_col_droite" value="#ENV{nb_article_col_droite,2}" size="7" class="fondl" />\r
+\r
+               [(#PLUGIN{agenda}|oui)[(#CONFIG{BeeSpip/configuration/calendrier_public}|=={'oui'}|oui)\r
+               <br style="margin-bottom:15px;" />\r
+               #SET{erreurs,#ENV**{erreurs}|table_valeur{nb_evenement_accueil}}\r
+               <label for="beespip_nb_evenement_accueil">Nombre d'événements à afficher</label><br />\r
+               <input type="text" name="nb_evenement_accueil" id="beespip_nb_evenement_accueil" value="#ENV{nb_evenement_accueil,5}" size="7" class="fondl" />\r
+               ]]\r
+               <br style="margin-bottom:15px;" />\r
+               #SET{erreurs,#ENV**{erreurs}|table_valeur{autres_articles}}\r
+               Afficher les autres articles en bas de page<br />\r
+               <label for="beespip_autres_articles_oui"><input type="radio" name="autres_articles" id="beespip_autres_articles_oui" value="oui"[ checked="(#ENV{autres_articles,non}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+               <label for="beespip_autres_articles_non"><input type="radio" name="autres_articles" id="beespip_autres_articles_non" value="non"[ checked="(#ENV{autres_articles,non}|=={non}|?{checked})"]><:beespip:beespip_non:></label>\r
+               <br style="margin-bottom:15px;" />\r
+               #SET{erreurs,#ENV**{erreurs}|table_valeur{articles_populaires}}\r
+               Afficher les articles les plus consultés<br />\r
+               <label for="beespip_articles_populaires_oui"><input type="radio" name="articles_populaires" id="beespip_articles_populaires_oui" value="oui"[ checked="(#ENV{articles_populaires,non}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+               <label for="beespip_articles_populaires_non"><input type="radio" name="articles_populaires" id="beespip_articles_populaires_non" value="non"[ checked="(#ENV{articles_populaires,non}|=={non}|?{checked})"]><:beespip:beespip_non:></label></fieldset>\r
+       </fieldset>\r
+       <input type="hidden" name="_meta_casier" value="BeeSpip/configuration" />\r
+       <p class="boutons">\r
+               <input type="submit" name="_cfg_ok" value="<:bouton_enregistrer:>" class="submit" />\r
+       </p>\r
+</div>\r
+</form>\r
+</div>\r
diff --git a/www/plugins/beespip/formulaires/configurer_beespip_couleur.html b/www/plugins/beespip/formulaires/configurer_beespip_couleur.html
new file mode 100755 (executable)
index 0000000..9d0c2f6
--- /dev/null
@@ -0,0 +1,117 @@
+<div class="formulaire_spip formulaire_cfg formulaire_#FORM">\r
+\r
+<h3 class='titrem'>[(#CHEMIN{images/config/beespip_config-24.png}|image_reduire{24}|inserer_attribut{class,cadre-icone}|inserer_attribut{alt,''})] Configuration de Beespip</h3>\r
+\r
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]\r
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]\r
+\r
+<form method="post" action="#ENV{action}">\r
+<div>\r
+#ACTION_FORMULAIRE{#ENV{action}}\r
+\r
+Vous pouvez sélectionner un thème parmi ceux proposés ci-dessous puis valider ensuite.<ul>\r
+<li><a href="[(#SELF|parametre_url{couleur_principale,#b83233}|parametre_url{couleur_secondaire_foncee,#8b0b00}|parametre_url{couleur_secondaire_claire,#ff645b}|parametre_url{couleur_fond_page,#ffffff}|parametre_url{couleur_liens,#0070a7}|parametre_url{couleur_liens_survol,#b83233}|parametre_url{couleur_menu_fond,#f5f4f3}|parametre_url{couleur_menu_liens,#666666}|parametre_url{couleur_menu_liens_survol,#000000}|parametre_url{couleur_filets_titres,#ebebeb}|parametre_url{couleur_filets_colonnes,#e8e8e8}|parametre_url{couleur_cadres,#ebebeb}|parametre_url{couleur_fond_formulaires,#f8f8f8})]">Thème bordeaux</a></li>\r
+<li><a href="[(#SELF|parametre_url{couleur_principale,#a8d5a8}|parametre_url{couleur_secondaire_foncee,#3c5e3c}|parametre_url{couleur_secondaire_claire,#6a9746}|parametre_url{couleur_fond_page,#ffffff}|parametre_url{couleur_liens,#d92141}|parametre_url{couleur_liens_survol,#3c5e3c}|parametre_url{couleur_menu_fond,#f5f4f3}|parametre_url{couleur_menu_liens,#666666}|parametre_url{couleur_menu_liens_survol,#000000}|parametre_url{couleur_filets_titres,#ebebeb}|parametre_url{couleur_filets_colonnes,#e8e8e8}|parametre_url{couleur_cadres,#ebebeb}|parametre_url{couleur_fond_formulaires,#f8f8f8})]">Thème vert</a></li>\r
+<li><a href="[(#SELF|parametre_url{couleur_principale,#0078a0}|parametre_url{couleur_secondaire_foncee,#005873}|parametre_url{couleur_secondaire_claire,#4da7c5}|parametre_url{couleur_fond_page,#ffffff}|parametre_url{couleur_liens,#ff9410}|parametre_url{couleur_liens_survol,#df3c00}|parametre_url{couleur_menu_fond,#f5f4f3}|parametre_url{couleur_menu_liens,#666666}|parametre_url{couleur_menu_liens_survol,#000000}|parametre_url{couleur_filets_titres,#ebebeb}|parametre_url{couleur_filets_colonnes,#e8e8e8}|parametre_url{couleur_cadres,#ebebeb}|parametre_url{couleur_fond_formulaires,#f8f8f8})]">Thème bleu</a></li>\r
+<li><a href="[(#SELF|parametre_url{couleur_principale,#e76e06}|parametre_url{couleur_secondaire_foncee,#9f5d00}|parametre_url{couleur_secondaire_claire,#eb7b1b}|parametre_url{couleur_fond_page,#ffffff}|parametre_url{couleur_liens,#6b2b01}|parametre_url{couleur_liens_survol,#0094d3}|parametre_url{couleur_menu_fond,#f5f4f3}|parametre_url{couleur_menu_liens,#666666}|parametre_url{couleur_menu_liens_survol,#000000}|parametre_url{couleur_filets_titres,#ebebeb}|parametre_url{couleur_filets_colonnes,#e8e8e8}|parametre_url{couleur_cadres,#ebebeb}|parametre_url{couleur_fond_formulaires,#f8f8f8})]">Thème orange</a></li></ul>\r
+#SET{couleur_principale,#EVAL{$_GET['couleur_principale']}|sinon{#ENV{couleur_principale}}}\r
+#SET{couleur_secondaire_foncee,#EVAL{$_GET['couleur_secondaire_foncee']}|sinon{#ENV{couleur_secondaire_foncee}}}\r
+#SET{couleur_secondaire_claire,#EVAL{$_GET['couleur_secondaire_claire']}|sinon{#ENV{couleur_secondaire_claire}}}\r
+#SET{couleur_fond_page,#EVAL{$_GET['couleur_fond_page']}|sinon{#ENV{couleur_fond_page}}}\r
+#SET{couleur_principale_texte,#EVAL{$_GET['couleur_principale_texte']}|sinon{#ENV{couleur_principale_texte}}}\r
+#SET{couleur_titres,#EVAL{$_GET['couleur_titres']}|sinon{#ENV{couleur_titres}}}\r
+#SET{couleur_liens,#EVAL{$_GET['couleur_liens']}|sinon{#ENV{couleur_liens}}}\r
+#SET{couleur_liens_survol,#EVAL{$_GET['couleur_liens_survol']}|sinon{#ENV{couleur_liens_survol}}}\r
+#SET{couleur_menu_fond,#EVAL{$_GET['couleur_menu_fond']}|sinon{#ENV{couleur_menu_fond}}}\r
+#SET{couleur_menu_liens,#EVAL{$_GET['couleur_menu_liens']}|sinon{#ENV{couleur_menu_liens}}}\r
+#SET{couleur_menu_liens_survol,#EVAL{$_GET['couleur_menu_liens_survol']}|sinon{#ENV{couleur_menu_liens_survol}}}\r
+#SET{couleur_filets_titres,#EVAL{$_GET['couleur_filets_titres']}|sinon{#ENV{couleur_filets_titres}}}\r
+#SET{couleur_filets_colonnes,#EVAL{$_GET['couleur_filets_colonnes']}|sinon{#ENV{couleur_filets_colonnes}}}\r
+#SET{couleur_cadres,#EVAL{$_GET['couleur_cadres']}|sinon{#ENV{couleur_cadres}}}\r
+#SET{couleur_fond_formulaires,#EVAL{$_GET['couleur_fond_formulaires']}|sinon{#ENV{couleur_fond_formulaires}}}\r
+Vous pouvez aussi sélectionner vos propres couleurs.<p />\r
+<fieldset><legend><img src="[(#CHEMIN{prive/themes/spip/images/couleur.png})]" style="margin-bottom:-8px;" /> <strong>Choix des couleurs principales des aplats et certains textes</strong></legend>\r
+       <label for="beespip_couleur_principale">Couleur principale du site</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_principale}}\r
+       <input type="text" name="couleur_principale" id="beespip_couleur_principale" value="#GET{couleur_principale,#b83233}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_secondaire_foncee">Couleur secondaire (plus foncée)</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_secondaire_foncee}}\r
+       <input type="text" name="couleur_secondaire_foncee" id="beespip_couleur_secondaire_foncee" value="#GET{couleur_secondaire_foncee,#8b0b00}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_secondaire_claire">Couleur secondaire (plus claire)</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_secondaire_claire}}\r
+       <input type="text" name="couleur_secondaire_claire" id="beespip_couleur_secondaire_claire" value="#GET{couleur_secondaire_claire,#ff645b}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_fond_page">Couleur de fond de page</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_fond_page}}\r
+       <input type="text" name="couleur_fond_page" id="beespip_couleur_fond_page" value="#GET{couleur_fond_page,#ffffff}" data-hex="true" size="7" class="beestyle" />\r
+</fieldset>\r
+\r
+<fieldset><legend><strong>Choix des couleurs des textes et liens</strong></legend>\r
+       <label for="beespip_couleur_principale_texte">Couleur principale du texte</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_principale_texte}}\r
+       <input type="text" name="couleur_principale_texte" id="beespip_couleur_principale_texte" value="#GET{couleur_principale_texte,#666666}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_titres">Couleur des titres (balises h1, h2, ...)</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_titres}}\r
+       <input type="text" name="couleur_titres" id="beespip_couleur_titres" value="#GET{couleur_titres,#444444}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_typo_titre_lien"><strong>Typographie des titres (balises h1, h2, ...)</strong></label><br />Vous pouvez définir une police spécifique pour vos titres. Pour cela accéder au répertoire <a href="http://www.google.com/webfonts" title="Google WebFonts" onclick="window.open(this.href); return false;">Google WebFonts</a> et identifier une police qui vous convient, et cliquez sur "Quick-use".<br />\r
+       Copier dans le champ ci-dessous le contenu du bloc : "3. Add this code to your website:" qui doit ressembler à<br />\r
+       <code>&lt;link href='http://fonts.googleapis.com/css?family=Electrolize' rel='stylesheet' type='text/css'&gt;</code><br />\r
+       <input type="text" name="typo_titre_lien" id="beespip_typo_titre_lien" value="#ENV{typo_titre_lien}" data-hex="true" size="44" class="fondl" /><br />\r
+       Ensuite copier ci-dessous la partie 4, qui doit ressembler à<br />\r
+       <code>font-family: 'Electrolize', sans-serif;</code><br />\r
+       <input type="text" name="typo_titre" id="beespip_typo_titre" value="#ENV{typo_titre}" data-hex="true" size="44" class="fondl" />\r
+       <p />\r
+       <label for="beespip_couleur_liens">Couleur des liens</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_liens}}\r
+       <input type="text" name="couleur_liens" id="beespip_couleur_liens" value="#GET{couleur_liens,#0070a7}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_liens_survol">Couleur des liens survolés</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_liens_survol}}\r
+       <input type="text" name="couleur_liens_survol" id="beespip_couleur_liens_survol" value="#GET{couleur_liens_survol,#0070a7}" data-hex="true" size="7" class="beestyle" />\r
+</fieldset>\r
+\r
+<fieldset><legend><strong>Choix des couleurs du menu</strong></legend>\r
+       <label for="beespip_couleur_menu_fond">Couleur de fond du menu</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_menu_fond}}\r
+       <input type="text" name="couleur_menu_fond" id="beespip_couleur_menu_fond" value="#GET{couleur_menu_fond,#f5f4f3}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_menu__liens">Couleur des liens du menu</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_menu_liens}}\r
+       <input type="text" name="couleur_menu_liens" id="beespip_couleur_menu__liens" value="#GET{couleur_menu_liens,#666666}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_menu__liens_survol">Couleur des liens survolés du menu</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_menu_liens_survol}}\r
+       <input type="text" name="couleur_menu_liens_survol" id="beespip_couleur_menu__liens_survol" value="#GET{couleur_menu_liens_survol,#000000}" data-hex="true" size="7" class="beestyle" />\r
+\r
+</fieldset>\r
+\r
+<fieldset><legend><strong>Autres couleurs</strong></legend>\r
+       <label for="beespip_couleur_fond_formulaires">Couleur de fond des formulaires</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_fond_formulaires}}\r
+       <input type="text" name="couleur_fond_formulaires" id="beespip_couleur_fond_formulaires" value="#GET{couleur_fond_formulaires,#f8f8f8}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_filets_titres">Couleur des filets de titre</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_filets_titres}}\r
+       <input type="text" name="couleur_filets_titres" id="beespip_couleur_filets_titres" value="#GET{couleur_filets_titres,#ebebeb}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_filets_colonnes">Couleur des filets de séparation de colonne</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_filets_colonnes}}\r
+       <input type="text" name="couleur_filets_colonnes" id="beespip_couleur_filets_colonnes" value="#GET{couleur_filets_colonnes,#e8e8e8}" data-hex="true" size="7" class="beestyle" />\r
+       <p />\r
+       <label for="beespip_couleur_cadres">Couleur des cadres</label>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{couleur_cadres}}\r
+       <input type="text" name="couleur_cadres" id="beespip_couleur_cadres" value="#GET{couleur_cadres,#ebebeb}" data-hex="true" size="7" class="beestyle" />\r
+</fieldset>\r
+<p />\r
+\r
+       <input type="hidden" name="_meta_casier" value="BeeSpip/couleur" />\r
+       <p class="boutons">\r
+               <input type="submit" name="_cfg_ok" value="<:bouton_enregistrer:>" class="submit" />\r
+       </p>\r
+</div>\r
+</form>\r
+</div>\r
diff --git a/www/plugins/beespip/formulaires/configurer_beespip_options_affichage.html b/www/plugins/beespip/formulaires/configurer_beespip_options_affichage.html
new file mode 100755 (executable)
index 0000000..ab17cd3
--- /dev/null
@@ -0,0 +1,95 @@
+<div class="formulaire_spip formulaire_cfg formulaire_#FORM">\r
+\r
+<h3 class='titrem'>[(#CHEMIN{prive/themes/spip/images/beespip_config-24.png}|image_reduire{24}|inserer_attribut{class,cadre-icone}|inserer_attribut{alt,''})] Configuration de Beespip</h3>\r
+\r
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]\r
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]\r
+\r
+<form method="post" action="#ENV{action}">\r
+<div>\r
+#ACTION_FORMULAIRE{#ENV{action}}\r
+\r
+       <fieldset><legend><img src="[(#CHEMIN{prive/themes/spip/images/entete.png})]" style="margin-bottom:-8px;" /> <:beespip:beespip_gestion_entete:></legend>\r
+       <strong>Nom du site</strong><br />Afficher le nom et le slogan du site<br />\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{nom_site}}\r
+       <label for="beespip_nom_site_oui"><input type="radio" name="nom_site" id="beespip_nom_site_oui" value="oui"[ checked="(#ENV{nom_site,oui}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+       <label for="beespip_nom_site_non"><input type="radio" name="nom_site" id="beespip_nom_site_non" value="non"[ checked="(#ENV{nom_site,oui}|=={non}|?{checked})"]><:beespip:beespip_non:></label>\r
+       <p />\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{hauteur_entete}}\r
+       <label for="beespip_hauteur_entete"><strong>Hauteur de l'entête</strong><br />Fixer la hauteur en pixel de l'entête.<br />Cette valeur ne peut pas être inférieure à 55.<br />La valeur par défaut est de 275.<br />\r
+       Hauteur en px</label>\r
+       <input type="text" name="hauteur_entete" id="beespip_hauteur_entete" value="#ENV{hauteur_entete,275}" size="7" class="fondl"  />\r
+       <p />\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{hauteur_menu}}\r
+       <label for="beespip_hauteur_menu"><strong>Position du menu</strong><br />Fixer la position en pixel du menu.<br />Le menu ayant une hauteur de 45px, cette valeur doit tenir compte de la hauteur de l'entête définie ci-dessus.<br />La valeur par défaut est de 5.<br />\r
+       Hauteur en px</label>\r
+       <input type="text" name="hauteur_menu" id="beespip_hauteur_menu" value="#ENV{hauteur_menu,5}" size="7" class="fondl"  />\r
+       <p />\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{nb_items_menu}}\r
+       <label for="beespip_nb_items_menu"><strong>Nombre d'éléments dans le menu</strong><br />Définir le nombre d'entrées visibles dans le menu.<br />Cette valeur est utilisée pour le menu par défaut, qui est constitué des rubriques racines triées par numéro de titre (ou par titre). De plus, si le nombre d'items définis via le plugin "Menu" est inférieur à ce nombre, il sera alors complété par les rubriques racines, suivant la méthode décrite précédemment.<br />La valeur par défaut est de 5.<br /></label>\r
+       <input type="text" name="nb_items_menu" id="beespip_nb_items_menu" value="#ENV{nb_items_menu,5}" size="7" class="fondl"  />\r
+       <p />\r
+       [(#PLUGIN{menus}|oui)#SET{erreurs,#ENV**{erreurs}|table_valeur{menu_debut}}\r
+       <strong>Complément du menu</strong><br />Si le nombre d'&eacute;l&eacute;ments d&eacute;finis par le plugin "Menu"\r
+       est inf&eacute;rieur &agrave; la valeur d&eacute;finie ci-dessus, pr&eacute;cisez ou se positionneront les rubriques racines compl&eacute;mentaires.<br />\r
+       <label for="beespip_menu_debut_oui"><input type="radio" name="menu_debut" id="beespip_menu_debut_oui" value="oui"[ checked="(#ENV{menu_debut,oui}|=={oui}|?{checked})"]>Avant les &eacute;l&eacute;ments du plugin "Menu"</label><br />\r
+       <label for="beespip_menu_debut_non"><input type="radio" name="menu_debut" id="beespip_menu_debut_non" value="non"[ checked="(#ENV{menu_debut,oui}|=={non}|?{checked})"]>Apr&egrave;s les &eacute;l&eacute;ments du plugin "Menu"</label>\r
+       <p />]\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{largeur_items_menu}}\r
+       <label for="beespip_largeur_items_menu"><strong>Largeur du bloc des items de premier niveau</strong><br />La valeur 0 permet d'avoir une largeur automatique<br />\r
+       Largeur en px</label>\r
+       <input type="text" name="largeur_items_menu" id="beespip_largeur_items_menu" value="#ENV{largeur_items_menu,0}" size="7" class="fondl"  />\r
+       <p />\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{taille_typo_menu}}\r
+       <label for="beespip_taille_typo_menu"><strong>Taille des items de premier niveau</strong><br />Définir la taille de la police du menu.<br />La valeur par défaut est de 1.1.<br />\r
+       Taille en em</label>\r
+       <input type="text" name="taille_typo_menu" id="beespip_taille_typo_menu" value="#ENV{taille_typo_menu,1.1}" size="7" class="fondl"  />\r
+\r
+</fieldset>\r
+<p />\r
+<fieldset><legend><strong><:beespip:beespip_emplacement_recherche:></strong></legend>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{emplacement_recherche}}\r
+       <label for="beespip_emplacement_recherche_haut"><input type="radio" name="emplacement_recherche" id="beespip_emplacement_recherche_haut" value="haut"[ checked="(#ENV{emplacement_recherche,haut}|=={haut}|?{checked})"]>Dans le menu horizontal</label><br />\r
+       <label for="beespip_emplacement_recherche_bas"><input type="radio" name="emplacement_recherche" id="beespip_emplacement_recherche_bas" value="bas"[ checked="(#ENV{emplacement_recherche,haut}|=={bas}|?{checked})"]>Au niveau du "fil d'ariane"</label></fieldset>\r
+<p />\r
+<fieldset><legend><strong>Afficher les textes "articles" et "sous-rubriques" dans les pages de rubrique.</strong></legend>\r
+#SET{erreurs,#ENV**{erreurs}|table_valeur{libelle_rubrique_article}}\r
+       <label for="beespip_libelle_rubrique_article_oui"><input type="radio" name="libelle_rubrique_article" id="beespip_libelle_rubrique_article_oui" value="oui"[ checked="(#ENV{libelle_rubrique_article,oui}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+       <label for="beespip_libelle_rubrique_article_non"><input type="radio" name="libelle_rubrique_article" id="beespip_libelle_rubrique_article_non" value="non"[ checked="(#ENV{libelle_rubrique_article,oui}|=={non}|?{checked})"]><:beespip:beespip_non:></label></fieldset>\r
+<p />\r
+<fieldset><legend><strong>Modèle de pagination</strong></legend>\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{modele_pagination}}\r
+       <label for="beespip_modele_pagination_defaut"><input type="radio" name="modele_pagination" id="beespip_modele_pagination_defaut" value=""[ checked="(#ENV{modele_pagination,''}|=={''}|?{checked})"]>Par défaut.<br />Affiche le nombre d'article sous la forme  0 | 10 | 20 | 30 | 40 | ...</label><br />\r
+       <label for="beespip_modele_pagination_precedent_suivant"><input type="radio" name="modele_pagination" id="beespip_modele_pagination_precedent_suivant" value="precedent_suivant"[ checked="(#ENV{modele_pagination,''}|=={precedent_suivant}|?{checked})"]>Précédent suivant.<br />Affiche les liens sous la forme page précédente | page suivante</label><br />\r
+       <label for="beespip_modele_pagination_page"><input type="radio" name="modele_pagination" id="beespip_modele_pagination_page" value="page"[ checked="(#ENV{modele_pagination,''}|=={page}|?{checked})"]>Page.<br />Affiche le nombre de page sous la forme 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ...</label><br />\r
+       <label for="beespip_modele_pagination_page_precedent_suivant"><input type="radio" name="modele_pagination" id="beespip_modele_pagination_page_precedent_suivant" value="page_precedent_suivant"[ checked="(#ENV{modele_pagination,''}|=={page_precedent_suivant}|?{checked})"]>Page avec précédent suivant.<br />Affiche le nombre de page sous la forme &lt; 1 | 2 | 3 | 4 | 5 | 6 &gt;</label></fieldset>\r
+<p />\r
+<fieldset><legend><strong><:beespip:beespip_dates:></strong></legend>\r
+       <:beespip:beespip_dates_articles:><br />\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{dates_articles}}\r
+       <label for="beespip_dates_articles_oui"><input type="radio" name="dates_articles" id="beespip_dates_articles_oui" value="oui"[ checked="(#ENV{dates_articles,oui}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+       <label for="beespip_dates_articles_non"><input type="radio" name="dates_articles" id="beespip_dates_articles_non" value="non"[ checked="(#ENV{dates_articles,oui}|=={non}|?{checked})"]><:beespip:beespip_non:></label><br />\r
+       <:beespip:beespip_dates_breves:><br />\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{dates_breves}}\r
+       <label for="beespip_dates_breves_oui"><input type="radio" name="dates_breves" id="beespip_dates_breves_oui" value="oui"[ checked="(#ENV{dates_breves,oui}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+       <label for="beespip_dates_breves_non"><input type="radio" name="dates_breves" id="beespip_dates_breves_non" value="non"[ checked="(#ENV{dates_breves,oui}|=={non}|?{checked})"]><:beespip:beespip_non:></label></fieldset>\r
+<p />\r
+<fieldset><legend><strong><:beespip:beespip_auteurs_articles:></strong></legend>\r
+       <label for="beespip_auteurs_articles_oui"><input type="radio" name="auteurs_articles" id="beespip_auteurs_articles_oui" value="oui"[ checked="(#ENV{auteurs_articles,oui}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+       <label for="beespip_auteurs_articles_non"><input type="radio" name="auteurs_articles" id="beespip_auteurs_articles_non" value="non"[ checked="(#ENV{auteurs_articles,oui}|=={non}|?{checked})"]><:beespip:beespip_non:></label></fieldset>\r
+<p />\r
+<fieldset><legend><strong><:beespip:beespip_derniere_date_publication:></strong></legend>\r
+       <:beespip:beespip_derniere_date_publication_descr:><br />\r
+       #SET{erreurs,#ENV**{erreurs}|table_valeur{derniere_date_publication}}\r
+       <label for="beespip_derniere_date_publication_oui"><input type="radio" name="derniere_date_publication" id="beespip_derniere_date_publication_oui" value="oui"[ checked="(#ENV{derniere_date_publication,non}|=={oui}|?{checked})"]><:beespip:beespip_oui:></label>\r
+       <label for="beespip_derniere_date_publication_non"><input type="radio" name="derniere_date_publication" id="beespip_derniere_date_publication_non" value="non"[ checked="(#ENV{derniere_date_publication,non}|=={non}|?{checked})"]><:beespip:beespip_non:></label></fieldset>\r
+\r
+       <input type="hidden" name="_meta_casier" value="BeeSpip/affichage" />\r
+       <p class="boutons">\r
+               <input type="submit" name="_cfg_ok" value="<:bouton_enregistrer:>" class="submit" />\r
+       </p>\r
+</div>\r
+</form>\r
+</div>\r
+\r
+\r
diff --git a/www/plugins/beespip/formulaires/recherche.html b/www/plugins/beespip/formulaires/recherche.html
new file mode 100755 (executable)
index 0000000..98f790f
--- /dev/null
@@ -0,0 +1,9 @@
+<div class="formulaire_spip formulaire_recherche" id="formulaire_recherche">
+<form action="[(#ENV{action})]" method="get"><div>
+       [(#ENV{action}|form_hidden)]
+       [<input type="hidden" name="lang" value="(#ENV{lang})" />]
+       <label for="recherche"><:info_rechercher_02:></label>
+       <input type="text" class="saisie" size="10" name="recherche" id="recherche"[ value="(#ENV{recherche, Rechercher})"] accesskey="4" />
+       <input type="submit" class="submit" value="&gt;&gt;" title="<:info_rechercher:>" />
+</div></form>
+</div>
diff --git a/www/plugins/beespip/head/page-agenda.html b/www/plugins/beespip/head/page-agenda.html
new file mode 100755 (executable)
index 0000000..38efc17
--- /dev/null
@@ -0,0 +1,6 @@
+<meta name="robots" content="none" />
+<title><:icone_agenda:> - [(#NOM_SITE_SPIP|textebrut)]</title>
+<link rel="stylesheet" href="#CHEMIN{agenda.css}" type="text/css" /> 
+<script type="text/javascript" src="#EVAL{_DIR_JAVASCRIPT}layer.js"> </script> 
+<script type="text/javascript" src="#EVAL{_DIR_JAVASCRIPT}presentation.js"> </script> 
+
diff --git a/www/plugins/beespip/images/article_une0.png b/www/plugins/beespip/images/article_une0.png
new file mode 100755 (executable)
index 0000000..ba55fa4
Binary files /dev/null and b/www/plugins/beespip/images/article_une0.png differ
diff --git a/www/plugins/beespip/images/article_une1.png b/www/plugins/beespip/images/article_une1.png
new file mode 100755 (executable)
index 0000000..ca76135
Binary files /dev/null and b/www/plugins/beespip/images/article_une1.png differ
diff --git a/www/plugins/beespip/images/article_une2.png b/www/plugins/beespip/images/article_une2.png
new file mode 100755 (executable)
index 0000000..714bc54
Binary files /dev/null and b/www/plugins/beespip/images/article_une2.png differ
diff --git a/www/plugins/beespip/images/article_une3.png b/www/plugins/beespip/images/article_une3.png
new file mode 100755 (executable)
index 0000000..943b1bc
Binary files /dev/null and b/www/plugins/beespip/images/article_une3.png differ
diff --git a/www/plugins/beespip/images/article_une4.png b/www/plugins/beespip/images/article_une4.png
new file mode 100755 (executable)
index 0000000..d7f7f23
Binary files /dev/null and b/www/plugins/beespip/images/article_une4.png differ
diff --git a/www/plugins/beespip/images/bg_sous_menu.png b/www/plugins/beespip/images/bg_sous_menu.png
new file mode 100755 (executable)
index 0000000..c846d6a
Binary files /dev/null and b/www/plugins/beespip/images/bg_sous_menu.png differ
diff --git a/www/plugins/beespip/images/blocune_accroche.png b/www/plugins/beespip/images/blocune_accroche.png
new file mode 100755 (executable)
index 0000000..479eaa0
Binary files /dev/null and b/www/plugins/beespip/images/blocune_accroche.png differ
diff --git a/www/plugins/beespip/images/blocune_accroche_ie.png b/www/plugins/beespip/images/blocune_accroche_ie.png
new file mode 100755 (executable)
index 0000000..698b5f9
Binary files /dev/null and b/www/plugins/beespip/images/blocune_accroche_ie.png differ
diff --git a/www/plugins/beespip/images/entete.png b/www/plugins/beespip/images/entete.png
new file mode 100755 (executable)
index 0000000..e9d20c5
Binary files /dev/null and b/www/plugins/beespip/images/entete.png differ
diff --git a/www/plugins/beespip/images/fond_pour_puce_niv1.png b/www/plugins/beespip/images/fond_pour_puce_niv1.png
new file mode 100755 (executable)
index 0000000..94b48b2
Binary files /dev/null and b/www/plugins/beespip/images/fond_pour_puce_niv1.png differ
diff --git a/www/plugins/beespip/images/fond_pour_puce_niv2.png b/www/plugins/beespip/images/fond_pour_puce_niv2.png
new file mode 100755 (executable)
index 0000000..b1384da
Binary files /dev/null and b/www/plugins/beespip/images/fond_pour_puce_niv2.png differ
diff --git a/www/plugins/beespip/images/fond_pour_puce_niv3.png b/www/plugins/beespip/images/fond_pour_puce_niv3.png
new file mode 100755 (executable)
index 0000000..fe7e258
Binary files /dev/null and b/www/plugins/beespip/images/fond_pour_puce_niv3.png differ
diff --git a/www/plugins/beespip/images/fond_pour_puce_niv4.png b/www/plugins/beespip/images/fond_pour_puce_niv4.png
new file mode 100755 (executable)
index 0000000..230f552
Binary files /dev/null and b/www/plugins/beespip/images/fond_pour_puce_niv4.png differ
diff --git a/www/plugins/beespip/images/fond_vide_pour_puce.gif b/www/plugins/beespip/images/fond_vide_pour_puce.gif
new file mode 100755 (executable)
index 0000000..b9f1859
Binary files /dev/null and b/www/plugins/beespip/images/fond_vide_pour_puce.gif differ
diff --git a/www/plugins/beespip/images/gravatar.jpg b/www/plugins/beespip/images/gravatar.jpg
new file mode 100755 (executable)
index 0000000..626e5a1
Binary files /dev/null and b/www/plugins/beespip/images/gravatar.jpg differ
diff --git a/www/plugins/beespip/images/liste1_niv1.png b/www/plugins/beespip/images/liste1_niv1.png
new file mode 100755 (executable)
index 0000000..3f11bb8
Binary files /dev/null and b/www/plugins/beespip/images/liste1_niv1.png differ
diff --git a/www/plugins/beespip/images/liste1_niv2.png b/www/plugins/beespip/images/liste1_niv2.png
new file mode 100755 (executable)
index 0000000..c373ab1
Binary files /dev/null and b/www/plugins/beespip/images/liste1_niv2.png differ
diff --git a/www/plugins/beespip/images/liste1_niv3.png b/www/plugins/beespip/images/liste1_niv3.png
new file mode 100755 (executable)
index 0000000..2e95824
Binary files /dev/null and b/www/plugins/beespip/images/liste1_niv3.png differ
diff --git a/www/plugins/beespip/images/liste1_niv4.png b/www/plugins/beespip/images/liste1_niv4.png
new file mode 100755 (executable)
index 0000000..2e95824
Binary files /dev/null and b/www/plugins/beespip/images/liste1_niv4.png differ
diff --git a/www/plugins/beespip/images/recherche.gif b/www/plugins/beespip/images/recherche.gif
new file mode 100755 (executable)
index 0000000..e6f888a
Binary files /dev/null and b/www/plugins/beespip/images/recherche.gif differ
diff --git a/www/plugins/beespip/images/recherche.png b/www/plugins/beespip/images/recherche.png
new file mode 100755 (executable)
index 0000000..28d1cbe
Binary files /dev/null and b/www/plugins/beespip/images/recherche.png differ
diff --git a/www/plugins/beespip/images/transp.gif b/www/plugins/beespip/images/transp.gif
new file mode 100755 (executable)
index 0000000..673cf38
Binary files /dev/null and b/www/plugins/beespip/images/transp.gif differ
diff --git a/www/plugins/beespip/inclure/agenda.html b/www/plugins/beespip/inclure/agenda.html
new file mode 100755 (executable)
index 0000000..a2d92c2
--- /dev/null
@@ -0,0 +1,15 @@
+[(#PLUGIN{calendriermini}|oui)#CALENDRIER_MINI{#ENV{date},'date',#URL_PAGE{agenda}, #URL_PAGE{calendrier_mini_event.json}}]\r
+[(#PLUGIN{calendriermini}|non)#CALENDRIER_MINI{#ENV{date},'date',#SELF}]\r
+calendriermini\r
+[(#SET{date,#ENV{date}})]\r
+[(#REM) On teste si la date à afficher est la date du mois en cours, si c'est le cas, on fixe la date au jour précis]\r
+[(#ENV{date}|=={[(#VAL{Y-m}|date)]-01}|oui)[(#SET{date,#VAL{Y-m-d}|date})]]\r
+<div class="clear">&nbsp;</div>\r
+<B_evenements>\r
+       <ul class="liste-items evenements" style="margin-top:-10px;">\r
+       <BOUCLE_evenements(EVENEMENTS){!evenement_passe #ENV{date_debut,#GET{date}}}{!evenement_a_venir #ENV{date_debut,#GET{date}}|agenda_moisdecal{1,'Y-m-d H:i:00'}}{par date_debut}{0,#CONFIG{BeeSpip/configuration/nb_evenement_accueil}}>\r
+               <li class="item"><span class="date dtstart" title="[(#DATE_DEBUT|agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE,'hcal'})]">[(#DATE_DEBUT|agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE,'hcal'})]</span>\r
+               <p class="summary"><a href="[(#URL_ARTICLE|parametre_url{date,[(#DATE_DEBUT|affdate{'Y-m-d'})]})]">#TITRE</a></p></li>\r
+       </BOUCLE_evenements>\r
+       </ul>\r
+</B_evenements>\r
diff --git a/www/plugins/beespip/inclure/articles_liste.html b/www/plugins/beespip/inclure/articles_liste.html
new file mode 100755 (executable)
index 0000000..5276ce5
--- /dev/null
@@ -0,0 +1,17 @@
+<B_articles_rubrique>\r
+[(#ENV{bloc}|=={pagination}|non)#ANCRE_PAGINATION\r
+[(#CONFIG{BeeSpip/affichage/libelle_rubrique_article}|=={'oui'}|oui)<h2><:articles:></h2>]]\r
+<BOUCLE_articles_rubrique(ARTICLES){id_rubrique?}{id_article?}{id_mot?}{id_auteur?}{par #ENV{tri,titre}}{inverse #ENV{ordre,0}}{lang}{doublons}{pagination #ENV{nbpages,5}}>\r
+       [(#ENV{bloc}|=={pagination}|?{<h2 class="sommaire">,<h3>})]<a href="#URL_ARTICLE" title="[(#INTRODUCTION|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a>[(#ENV{bloc}|=={sommaire}|?{</h2>,</h3>})]\r
+       [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article})]\r
+       <p>[(#LOGO_ARTICLE_RUBRIQUE||image_reduire{120,120}|inserer_attribut{class,float-left})][(#INTRODUCTION|PtoBR|image_reduire{#ENV{largeur,200},0})]</p>\r
+       <p class="info-publi">          \r
+       <a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]" class="lire_la_suite">Lire la suite</a>\r
+       <BOUCLE_nb_commentaires(FORUMS) {id_article}{plat} />   [(#TOTAL_BOUCLE|oui)\r
+               | <a[ href="(#URL_ARTICLE|ancre_url{forum})"] class="nb_commentaires">[(#TOTAL_BOUCLE|=={1}|?{<:zpip:commentaire:>,<:zpip:commentaires:>})]&nbsp;([(#TOTAL_BOUCLE)])</a>\r
+               ]\r
+       <//B_nb_commentaires>\r
+       </p>\r
+</BOUCLE_articles_rubrique>\r
+[(#ENV{bloc}|=={pagination}|non)[<div class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</div>]]\r
+</B_articles_rubrique>\r
diff --git a/www/plugins/beespip/inclure/articles_populaires.html b/www/plugins/beespip/inclure/articles_populaires.html
new file mode 100755 (executable)
index 0000000..2ed9ecb
--- /dev/null
@@ -0,0 +1,10 @@
+<B_articles_populaires>\r
+<div class="liste syndic">\r
+       <h4>Articles populaires</h4>\r
+       <ul class="liste-items">\r
+               <BOUCLE_articles_populaires(ARTICLES) {!par popularite} {doublons} {0,5}{lang}>\r
+               <li class="item"><a href="#URL_ARTICLE" title="[(#INTRODUCTION|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a></li>\r
+               </BOUCLE_articles_populaires>\r
+       </ul>\r
+</div>\r
+</B_articles_populaires>\r
diff --git a/www/plugins/beespip/inclure/articles_une_colonne_droite.html b/www/plugins/beespip/inclure/articles_une_colonne_droite.html
new file mode 100755 (executable)
index 0000000..ffd70a8
--- /dev/null
@@ -0,0 +1,14 @@
+       <BOUCLE_article_colonne_droite(ARTICLES){titre_mot=actualites_colonne_droite}{!par date}{lang}{doublons}{0,#CONFIG{BeeSpip/configuration/nb_article_col_droite}}>\r
+       <h4><a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a></h4>\r
+       [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article}{affichage=court})]\r
+       [<div style="text-align:center">(#LOGO_ARTICLE_RUBRIQUE||image_reduire{190,120}|inserer_attribut{alt,#TITRE|texte_backend})</div>][(#DESCRIPTIF|sinon{<p>[(#INTRODUCTION|couper{150}|PtoBR)]</p>}|image_reduire{190,120})]\r
+       <p><a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]" class="lire_la_suite">Lire la suite</a></p>\r
+       </BOUCLE_article_colonne_droite>\r
+               <BOUCLE_article_colonne_droite_sansmotscles(ARTICLES){!par date}{lang}{doublons}{0,#CONFIG{BeeSpip/configuration/nb_article_col_droite}}>\r
+               <h4><a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a></h4>\r
+               [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article}{affichage=court})]\r
+               [<div style="text-align:center">(#LOGO_ARTICLE_RUBRIQUE||image_reduire{190,120}|inserer_attribut{alt,#TITRE|texte_backend})</div>][(#DESCRIPTIF|sinon{<p>[(#INTRODUCTION|couper{150}|PtoBR)]</p>}|image_reduire{190,120})]\r
+               <p><a href="#URL_ARTICLE" title="[(#TITRE|textebrut|entites_html)]" class="lire_la_suite">Lire la suite</a></p>\r
+               </BOUCLE_article_colonne_droite_sansmotscles>\r
+       <//B_article_colonne_droite>\r
+\r
diff --git a/www/plugins/beespip/inclure/articles_une_recents.html b/www/plugins/beespip/inclure/articles_une_recents.html
new file mode 100755 (executable)
index 0000000..f19655c
--- /dev/null
@@ -0,0 +1,25 @@
+[(#REM) On exclu les articles affichés en colonne de droite]<BOUCLE_article_colonne_droite(ARTICLES){titre_mot=actualites_colonne_droite}{!par date}{lang}{doublons}{0,#CONFIG{BeeSpip/configuration/nb_article_col_droite}}>\r
+</BOUCLE_article_colonne_droite>\r
+<BOUCLE_article_colonne_droite_sansmotscles(ARTICLES){!par date}{lang}{doublons}{0,#CONFIG{BeeSpip/configuration/nb_article_col_droite}}>\r
+</BOUCLE_article_colonne_droite_sansmotscles><//B_article_colonne_droite>\r
+#SET{affiche_article,#ARRAY}\r
+<B_articles>\r
+#ANCRE_PAGINATION\r
+#SET{compteur_boucle,0}\r
+<div class="grid_6 alpha filet_droit"><BOUCLE_articles(ARTICLES){!par date}{doublons}{pagination 10}{lang}>\r
+       #SET{affiche_article, #GET{affiche_article}|push{#ID_ARTICLE}}</BOUCLE_articles>\r
+\r
+       <B_calcul_articles>\r
+       [(#REM) Si le nombre d'articles de la rubrique est inférieur à 10, on calcule la valeur pour répartir les articles en 2 colonnes]\r
+               #SET{rupture,#TOTAL_BOUCLE|div{2}|ceil}\r
+               #SET{col2,#GET{rupture}|plus{1}}\r
+       <BOUCLE_calcul_articles(ARTICLES){!par date}{id_article IN #GET{affiche_article}}{lang}> </BOUCLE_calcul_articles>\r
+\r
+       <BOUCLE_lesarticles(ARTICLES) {!par date}{id_article IN #GET{affiche_article}}{lang}>#SET{compteur_boucle,#GET{compteur_boucle}|plus{1}}\r
+       [(#GET{compteur_boucle}|=={#GET{col2}}|oui)</div><div class="grid_6 omega">]\r
+       <h5 class="recents"><a href="#URL_ARTICLE"[ title="(#TITRE|texte_backend)"]>[(#TITRE|texte_backend)]</a></h5>\r
+       [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article}{affichage=court})]\r
+       </BOUCLE_lesarticles>\r
+       <div class="clear">&nbsp;</div>[<div class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</div>]\r
+</div>\r
+</B_articles>\r
diff --git a/www/plugins/beespip/inclure/articles_une_slide.html b/www/plugins/beespip/inclure/articles_une_slide.html
new file mode 100755 (executable)
index 0000000..cb59f58
--- /dev/null
@@ -0,0 +1,19 @@
+<BOUCLE_articles_rubrique(ARTICLES){id_rubrique?}{id_article?}{id_mot?}{id_auteur?}{par #ENV{tri,titre}}{inverse #ENV{ordre,0}}{lang}{doublons}>\r
+       <li><a href="#URL_ARTICLE"[ title="(#TITRE|attribut_html)"]>\r
+       #SET{img,#ENV{nb_articles_une_encours}|modulo{5}}\r
+       [(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide'}|oui)\r
+               [(#LOGO_ARTICLE||image_reduire{680,0}|image_recadre{682,432,center}|inserer_attribut{alt,#TITRE|attribut_html})]\r
+               [(#LOGO_ARTICLE|=={''}|oui)<img src="#CHEMIN{images/article_une#GET{img}.png}" style="height:432px;width:682px;" alt="[(#TITRE|attribut_html)]" />]\r
+       ][(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide2'}|oui)\r
+               [(#LOGO_ARTICLE||image_reduire{440,0}|image_recadre{442,302,center}|inserer_attribut{alt,#TITRE|attribut_html})]\r
+               [(#LOGO_ARTICLE|=={''}|oui)<img src="#CHEMIN{images/article_une#GET{img}.png}" style="height:302px;width:442px;" alt="[(#TITRE|attribut_html)]" />]\r
+       ]</a>\r
+       <div class="accroche">\r
+       <h2 id="bouton_actu#ENV{nb_articles_une_encours}" style="display:none;">[(#TITRE|attribut_html)]</h2><h2><a href="#URL_ARTICLE"[ title="(#TITRE|attribut_html)"]>[(#TITRE|texte_backend)]</a></h2>\r
+       [(#INCLURE{fond=inclure/infos_auteurs_dates}{id_article}{affichage=court})]\r
+       [(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide'}|oui)\r
+               <p><a href="#URL_ARTICLE"[ title="(#TITRE|attribut_html)"]>[(#INTRODUCTION|supprimer_tags|texte_backend)]</a></p>\r
+       ][(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide2'}|oui)\r
+               <p><a href="#URL_ARTICLE"[ title="(#TITRE|attribut_html)"]>[(#INTRODUCTION|supprimer_tags|texte_backend|couper{280})]</a></p>\r
+       ]</div></li>\r
+</BOUCLE_articles_rubrique>\r
diff --git a/www/plugins/beespip/inclure/documents.html b/www/plugins/beespip/inclure/documents.html
new file mode 100755 (executable)
index 0000000..e67fea1
--- /dev/null
@@ -0,0 +1,32 @@
+[(#REM) Portfolio : album d'images ]
+<B_documents_portfolio>
+<div class="liste documents documents_portfolio">
+       <h4><:info_portfolio:></h4>
+       <BOUCLE_documents_portfolio(DOCUMENTS) {id_article?}{id_rubrique?} {mode=document}{extension IN png,jpg,gif} {par num titre, date}{vu=non}>[
+       <a href="(#URL_DOCUMENT)"
+                type="#MIME_TYPE"
+                rel="documents_portfolio[-a(#ID_ARTICLE)][-r(#ID_RUBRIQUE)]"
+       [ title="(#TITRE|attribut_html|couper{80})"]>[(#FICHIER
+               |image_reduire{200,100}
+               |inserer_attribut{class,spip_logos}
+               |inserer_attribut{alt,[(#TITRE|attribut_html|couper{80})]})]</a>
+       ]</BOUCLE_documents_portfolio>
+</div>
+</B_documents_portfolio>
+
+
+[(#REM)
+       Liste des autres documents joints
+]
+<B_documents_joints>
+       <div class="liste documents documents_joints">
+       <h4><:titre_documents_joints:></h4>
+               <BOUCLE_documents_joints(DOCUMENTS) {id_article?}{id_rubrique?} {extension !IN gif,jpg,png} {vu=non}{par num titre, date}>[
+               <div class="item grid_4[(#ENV{compteur}|=={1}|oui) alpha][(#COMPTEUR_BOUCLE|modulo{#ENV{compteur,3}}|=={1}|oui) alpha][(#COMPTEUR_BOUCLE|modulo{#ENV{compteur,3}}|=={0}|oui) omega]">[(#LOGO_DOCUMENT|#URL_DOCUMENT||image_reduire{200,100})<br />]
+                       <strong><a href="(#URL_DOCUMENT)" title="<:bouton_telecharger:>" type="#MIME_TYPE">[(#TITRE|sinon{<:info_document:>})]</a></strong>
+                       <br /><span class="small">(<span>#TYPE_DOCUMENT[ &ndash; (#TAILLE|taille_en_octets)]</span>)</span>
+                       #DESCRIPTIF
+               ]</div>[(#COMPTEUR_BOUCLE|modulo{#ENV{compteur,3}}|=={0}|oui)<div class="clear">&nbsp;</div>]
+               </BOUCLE_documents_joints>
+       </div><div class="clear">&nbsp;</div>
+</B_documents_joints>
diff --git a/www/plugins/beespip/inclure/entete.html b/www/plugins/beespip/inclure/entete.html
new file mode 100755 (executable)
index 0000000..b2b8d0e
--- /dev/null
@@ -0,0 +1,26 @@
+#SET{hauteur_entete,#CONFIG{BeeSpip/affichage/hauteur_entete}}
+#SET{hauteur_menu,#CONFIG{BeeSpip/affichage/hauteur_menu}}
+[(#REM)On vérifie si la position du menu est possible, sinon on la fixe en bas de l'entete]
+#SET{hauteur_menu_max,#GET{hauteur_entete}|moins{45}}
+[(#GET{hauteur_menu}|>{#GET{hauteur_menu_max}}|oui)#SET{hauteur_menu,#GET{hauteur_menu_max}}]
+<div id="entete" class="container_16" style="height:#GET{hauteur_entete}px;">
+       <INCLURE{fond=inclure/liens_evitement,env}>
+       [(#REM) Faut-il afficher le nom du site et le slogan]
+       [(#CONFIG{BeeSpip/affichage/nom_site}|=={'oui'}|oui)
+       <div id="entete-image" style="height:#GET{hauteur_entete}px;background: url([(#LOGO_SITE_SPIP|sinon{#CHEMIN{images/entete.png}}|image_reduire{1000,0}|image_recadre{960,#GET{hauteur_entete},right}|extraire_attribut{src})]) right bottom no-repeat;">
+               [(#REM)On essai de définir l'emplacement du texte si il doit d'afficher en fonction de la position du menu]
+               [(#GET{hauteur_menu}|>{#GET{hauteur_entete}|div{2}}|oui)#SET{position_nom_site,20}]
+               <h1 id="logo-text"><a style="top:#GET{position_nom_site,90}px;" rel="start home" href="#URL_SITE_SPIP/" title="<:accueil_site:>">#NOM_SITE_SPIP</a></h1>
+               [<p id="intro" style="top:[(#GET{position_nom_site,90}|plus{70})]px;">(#SLOGAN_SITE_SPIP|PtoBR)</p>]
+       </div>]
+       [(#REM) Sinon on affiche une image cliquable]
+       [(#CONFIG{BeeSpip/affichage/nom_site}|=={'oui'}|non)
+       <div id="entete-image" style="height:#GET{hauteur_entete}px;">
+               <a rel="start home" href="#URL_SITE_SPIP/" title="<:accueil_site:>"><img src="[(#LOGO_SITE_SPIP|sinon{#CHEMIN{images/entete.png}}image_reduire{1000,0}|image_recadre{960,#GET{hauteur_entete},right}|extraire_attribut{src})]" style="height:#GET{hauteur_entete}px;width:960px;" alt="Logo du site" /></a>
+       </div>]
+
+       <div id="nav" style="top:#GET{hauteur_menu}px;">
+               #INCLURE{fond=inclure/menu_standard, env}
+               [(#CONFIG{BeeSpip/affichage/emplacement_recherche}|=={'haut'}|oui)#FORMULAIRE_RECHERCHE]
+       </div>
+</div>
diff --git a/www/plugins/beespip/inclure/evenements.html b/www/plugins/beespip/inclure/evenements.html
new file mode 100755 (executable)
index 0000000..f144159
--- /dev/null
@@ -0,0 +1,15 @@
+<B_lesevenements>\r
+<div class="liste evenements[(#ENV{bandeau}|=={oui}|oui) liste_bloc_bandeau]">\r
+       <h4>Ev&egrave;nements associ&eacute;s</h4>\r
+       <ul class="liste-items">\r
+               <BOUCLE_lesevenements(EVENEMENTS) {par date} {id_article}{age<180}>\r
+               <li class="item"><span class="date dtstart" title="[(#DATE_DEBUT|agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE,'hcal'})]"><strong>[(#DATE_DEBUT|agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE,'hcal'})]</strong></span> #TITRE\r
+                       [<p class="description  #EDIT{descriptif}">(#DESCRIPTIF)</p>]\r
+                       [<p class="lieu"><span class="location #EDIT{lieu}">(#LIEU)</span>[<span class="adresse #EDIT{adresse}">(#ADRESSE|PtoBR)</span>]</p>]\r
+                       <B_mots><p class='category'><BOUCLE_mots(MOTS){id_evenement}{par num titre,titre}{', '}>#TITRE</BOUCLE_mots></p></B_mots>\r
+                       [<div class='ajax'>(#FORMULAIRE_PARTICIPER_EVENEMENT{#ID_EVENEMENT})</div>]\r
+               </li>\r
+               </BOUCLE_lesevenements>\r
+       </ul>\r
+</div>\r
+</B_lesevenements>\r
diff --git a/www/plugins/beespip/inclure/forum.html b/www/plugins/beespip/inclure/forum.html
new file mode 100755 (executable)
index 0000000..3798e2b
--- /dev/null
@@ -0,0 +1,84 @@
+[(#REM) Cette balise (invisible) provoque le recalcul du forum
+la premiere fois qu'un message est poste (cf. inc/invalideur). ]
+[(#PARAMETRES_FORUM|?{''})]
+
+<div class="comments" id="comments">
+       [(#REM) Nombre total de messages ]
+       <BOUCLE_decompte(FORUMS) {id_rubrique ?}{id_article ?}{id_breve ?}{id_syndic ?} {plat} />[<h4>(#TOTAL_BOUCLE|>{0}|?{#TOTAL_BOUCLE,''})
+       [(#TOTAL_BOUCLE|=={1}|?{<:message:>,<:messages_forum:>})]</h4>]<//B_decompte>
+
+       [(#REM) Messages du forum ]
+       <B_forums>
+
+       <BOUCLE_forums(FORUMS) {id_rubrique ?}{id_article ?}{id_breve ?}{id_syndic ?} {par date}>
+       <ul class="forum comments-list">
+               <li class="forum-fil comment odd[ (#COMPTEUR_BOUCLE|=={1}|oui)first][ (#EXPOSE)]">
+                       <div class="comment-message forum-message">
+                               <div class="comment-meta forum-chapo">
+                                       <a href="#forum#ID_FORUM" title="#ID_FORUM" class="ancre permalink comment-number">#</a>
+                                       [(#LOGO_AUTEUR|image_reduire{40,0}|image_recadre{40,40,center}|sinon{<img alt="" src="[(#CHEMIN{images/gravatar.jpg})]" class="avatar" height="40" width="40" />})]<strong class="#EDIT{titre} forum-titre"><a href="#forum#ID_FORUM" name="forum#ID_FORUM" id="forum#ID_FORUM">#TITRE</a></strong>
+                                       [<span class="comment-author vcard">, <:par_auteur:> <strong class="fn n #EDIT{qui}">(#NOM)</strong></span><br />]
+                                       [<span class="comment-data">(#DATE|oui)<abbr class="date"[ title="(#DATE|date_iso)"]>
+                                               [(#SET{date,[(#DATE|affdate_jourcourt)]})]
+                                               [(#SET{heure,[(#DATE|heures)][:(#DATE|minutes)]})]
+                                               <:zpip:date_forum{date=#GET{date},heure=#GET{heure}}:></abbr></span>]
+                               </div>
+                               <div class="comment-content forum-texte">
+       
+                                       [<div class="#EDIT{texte} comment-texte">(#TEXTE|lignes_longues)</div>]
+                                       [<div class="comment-notes">(#NOTES|safehtml|lignes_longues)</div>]
+                                       [<p class="#EDIT{hyperlien} comment-external-link hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+                                       <BOUCLE_doc(DOCUMENTS){id_forum}>
+                                       [(#EXTENSION|match{'^(gif|jpg|png)$'}|?{
+                                               [(#EMBED_DOCUMENT|image_reduire{300})]
+                                       ,
+                                               [(#LOGO_DOCUMENT|#URL_DOCUMENT)]
+                                       })]
+                                       </BOUCLE_doc>
+
+                               </div>
+                       </div>
+               </li>
+
+                       <B_forums_fils>
+                               <BOUCLE_forums_fils(FORUMS) {id_parent} {par date}>
+
+                               <li class="forum-fil comment even[ (#EXPOSE)]">
+                                       <div class="comment-message forum-message">
+                                               <div class="comment-meta forum-chapo">
+                                                       <a href="#forum#ID_FORUM" title="#ID_FORUM" class="ancre permalink comment-number">#</a>
+                                                       [(#LOGO_AUTEUR|image_reduire{40,0}|image_recadre{40,40,center}|sinon{<img alt="" src="[(#CHEMIN{images/gravatar.jpg})]" class="avatar" height="40" width="40" />})]<strong class="#EDIT{titre} forum-titre"><a href="#forum#ID_FORUM" name="forum#ID_FORUM" id="forum#ID_FORUM">#TITRE</a></strong>
+                                                       [<span class="comment-author vcard">, <:par_auteur:> <strong class="fn n #EDIT{qui}">(#NOM)</strong></span><br />]
+                                                       [<span class="comment-data">(#DATE|oui)<abbr class="date"[ title="(#DATE|date_iso)"]>
+                                                               [(#SET{date,[(#DATE|affdate_jourcourt)]})]
+                                                               [(#SET{heure,[(#DATE|heures)][:(#DATE|minutes)]})]
+                                                               <:zpip:date_forum{date=#GET{date},heure=#GET{heure}}:></abbr></span>]
+                                               </div>
+                                               <div class="comment-content forum-texte">
+                                                       [<div class="#EDIT{texte} comment-texte">(#TEXTE|lignes_longues)</div>]
+                                                       [<div class="comment-notes">(#NOTES|safehtml|lignes_longues)</div>]
+                                                       [<p class="#EDIT{hyperlien} comment-external-link hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+
+                                                       <BOUCLE_doc2(DOCUMENTS){id_forum}>
+                                                       [(#EXTENSION|match{'^(gif|jpg|png)$'}|?{
+                                                               [(#EMBED_DOCUMENT|image_reduire{300})]
+                                                       ,
+                                                               [(#LOGO_DOCUMENT|#URL_DOCUMENT)]
+                                                       })]
+                                                       </BOUCLE_doc2>
+
+                                               </div>
+                                       </div>
+                               </li>
+
+                                       <BOUCLE_forums_boucle(boucle_forums_fils)></BOUCLE_forums_boucle>
+
+
+                               </BOUCLE_forums_fils>
+                       </B_forums_fils>
+       </ul>
+       [<p class="comment-reply repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:beespip:repondre_message:></a></p>]
+
+       </BOUCLE_forums>
+       </B_forums>
+</div>
diff --git a/www/plugins/beespip/inclure/head.html b/www/plugins/beespip/inclure/head.html
new file mode 100755 (executable)
index 0000000..fbea725
--- /dev/null
@@ -0,0 +1,103 @@
+[(#REM)
+       Head standard de toutes les pages ; les elements specifiques
+       (title, description) figurent dans le squelette article.html
+]
+[(#REM) Preciser le charset ]
+<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
+
+[(#REM) Fierement fabrique avec SPIP ]
+<meta name="generator" content="SPIP[ (#SPIP_VERSION)]" />
+
+[(#REM) Lien vers le flux RSS du site ]
+[<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>" href="(#URL_PAGE{backend})" />]
+
+[(#REM) Feuille de style Beespip]
+[<link rel="stylesheet" href="(#CHEMIN{css/reset.css}|direction_css|url_absolue_css|compacte)" type="text/css" media="all" />]
+[<link rel="stylesheet" href="(#CHEMIN{css/960.css}|direction_css|url_absolue_css|compacte)" type="text/css" media="all" />]
+[<link rel="stylesheet" href="(#PRODUIRE{fond=css/structure.css}|direction_css|url_absolue_css|compacte)" type="text/css" media="all" />]
+[<link rel="stylesheet" href="(#PRODUIRE{fond=css/styles.css}|direction_css|url_absolue_css|compacte)" type="text/css" media="all" />]
+[<link rel="stylesheet" href="(#PRODUIRE{fond=css/superfish.css}|direction_css|url_absolue_css|compacte)" type="text/css" media="all" />]
+
+[(#REM) Feuille de style par defaut pour le code genere par SPIP 
+[<link rel="stylesheet" href="(#CHEMIN{spip_style.css}|direction_css)" type="text/css" media="all" />]]
+
+[(#REM) Feuille de style par defaut pour les formulaires de SPIP 
+[<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css}|direction_css)" type="text/css" media="projection, screen, tv" />]]
+
+[(#REM) Balise permettant aux plugins d'inserer des fichiers CSS ]
+#INSERT_HEAD_CSS
+
+[(#REM) Feuille de style CSS pour l'impression ]
+[<link rel="stylesheet" href="(#CHEMIN{impression.css}|direction_css)" type="text/css" media="print" />]
+
+[(#CHEMIN{inc-theme-head.html}|oui)
+#INCLURE{fond=inc-theme-head,env}
+]
+
+[(#REM) Balise permettant aux plugins d'inserer des appels javascript ou css ;
+       C'est ici que SPIP va inserer l'appel de la librairie jQuery
+       Et appeler a la fin compacte_head pour agreger et compacter tout le head dans des fichiers statiques
+       si l'option est cochee dans Configuration
+]
+#INSERT_HEAD
+<script type="text/javascript">
+       var field = '#formulaire_recherche input#recherche';
+       $(document).ready(function(){
+               $(field).focus(function(){
+                       title = 'Rechercher';
+                       $(this).val($(this).val() == title ? '' : $(this).val());
+               });
+               $(field).focusout(function(){
+                       title = 'Rechercher';
+                       $(this).val($(this).val() == '' ? title : $(this).val());
+               });
+       });
+</script>
+
+<script type="text/javascript" src="#CHEMIN{js/superfish.js}"></script>
+<script type="text/javascript">
+// initialise plugins
+jQuery(function(){
+       jQuery('ul.sf-menu').superfish();
+});
+
+$(document).ready(function(){
+
+       $(".ul.sf-menu")
+       .superfish({
+               animation : { opacity:"show",height:"show"}
+       })
+       .find(">li:has(ul)")
+               .mouseover(function(){
+                       $("ul", this).bgIframe({opacity:false});
+               })
+               .find("a")
+                       .focus(function(){
+                               $("ul", $(".ul.sf-menu>li:has(ul)")).bgIframe({opacity:false});
+               });     
+});
+</script>
+
+[(#CONFIG{BeeSpip/configuration/page_accueil}|match{'slide'}|oui)
+       <script type="text/javascript" src="#CHEMIN{js/easySlider1.7.js}"></script>
+       <script type="text/javascript">
+               $(document).ready(function(){   
+                       $("#slider").easySlider({
+                               auto: true, 
+                               continuous: true,
+                               numeric: true,
+                               pause:7000
+                       });
+               });     
+       </script>
+       [(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide'}|oui)<link rel="stylesheet" type="text/css" media="all" href="[(#PRODUIRE{fond=css/easyslider.css}|direction_css|url_absolue_css|compacte)]" />]
+       [(#CONFIG{BeeSpip/configuration/page_accueil}|=={'slide2'}|oui)<link rel="stylesheet" type="text/css" media="all" href="[(#PRODUIRE{fond=css/easyslider2.css}|direction_css|url_absolue_css|compacte)]" />]
+]
+<!--[if lte IE 7]>
+<style type="text/css" media="all">.accroche {position:static;}</style>
+<![endif]-->
+[(#CONFIG{BeeSpip/couleur/typo_titre_lien})][
+(#REM) Feuille de style personnalisee pour surcharger les precedentes
+       A noter par defaut cette css n'existe pas
+][(#CHEMIN{css/perso.css.html}|oui)[<link rel="stylesheet" href="(#PRODUIRE{fond=css/perso.css}|direction_css|url_absolue_css|compacte)" type="text/css" media="projection, screen, tv" />
+]]
diff --git a/www/plugins/beespip/inclure/infos_auteurs_dates.html b/www/plugins/beespip/inclure/infos_auteurs_dates.html
new file mode 100755 (executable)
index 0000000..4be9a53
--- /dev/null
@@ -0,0 +1,24 @@
+<BOUCLE_contenu_article(ARTICLES){id_article}>
+       [(#REM) Il y a soit l'affichage des dates, soit l'affichage des auteurs, soit les 2
+       L'affichage court est utilisé sur le sommaire
+       ]
+       [(#CONFIG{BeeSpip/affichage/dates_articles}|ou{#CONFIG{BeeSpip/affichage/auteurs_articles}})
+       <p class="post-info">
+               [(#ENV{affichage}|=={'court'}|non)
+                       [(#CONFIG{BeeSpip/affichage/auteurs_articles}|=={'oui'}|oui)[Publi&eacute; par (#LESAUTEURS)]]
+                       [(#CONFIG{BeeSpip/affichage/dates_articles}|=={'oui'}|oui)
+                               [(#CONFIG{BeeSpip/affichage/auteurs_articles}|=={'non'}|?{"Publi&eacute; "," | "})]
+                               <abbr class="date" title="[(#DATE|date_iso)]">[(#DATE|nom_jour)] [(#DATE|affdate)]</abbr>
+                               [(#DATE_MODIF|affdate|!=={[(#DATE|affdate)]}|?{[ | <:beespip:mis_a_jour:> <abbr class="date" title="[(#DATE_MODIF|date_iso)]">(#DATE_MODIF|nom_jour)] [(#DATE_MODIF|affdate)]</abbr>,''})]
+                       ]
+               ]
+               [(#ENV{affichage}|=={'court'}|oui)
+                       [(#CONFIG{BeeSpip/affichage/auteurs_articles}|=={'oui'}|oui)[Par (#LESAUTEURS)]]
+                       [(#CONFIG{BeeSpip/affichage/dates_articles}|=={'oui'}|oui)
+                               [(#CONFIG{BeeSpip/affichage/auteurs_articles}|=={'non'}|?{""," | "})]
+                               <abbr class="date" title="[(#DATE|date_iso)]">[(#DATE|affdate{'d/m/Y'})]</abbr>
+                       ]
+               ]
+       </p>
+       ]
+</BOUCLE_contenu_article>
diff --git a/www/plugins/beespip/inclure/liens_evitement.html b/www/plugins/beespip/inclure/liens_evitement.html
new file mode 100755 (executable)
index 0000000..1eef855
--- /dev/null
@@ -0,0 +1,3 @@
+<p class="evitement" id="evitement"><a href="#contenu" accesskey="s"><:beespip:evitement_contenu:></a>
+<a href="#nav" accesskey="n"><:beespip:evitement_navigation:></a>
+<a href="#recherche" accesskey="4"><:beespip:evitement_recherche:></a></p>
diff --git a/www/plugins/beespip/inclure/menu.html b/www/plugins/beespip/inclure/menu.html
new file mode 100755 (executable)
index 0000000..9450e19
--- /dev/null
@@ -0,0 +1,21 @@
+#SET{englobant,non}
+<BOUCLE_menu(MENUS){id_menu?}{identifiant?}>
+       <BOUCLE_entrees_test(MENUS_ENTREES){id_menu}{par rang}>[(#MENUS_AFFICHER_ENTREE|trim|oui)#SET{englobant,oui}]</BOUCLE_entrees_test>
+       <B_entrees>
+       [(#GET{englobant}|=={'oui'}|oui)<ul class="menu-liste menu-items[ (#CHAMP_SQL{css})]">]
+               <BOUCLE_entrees(MENUS_ENTREES){id_menu}{par rang}>
+               #MENUS_AFFICHER_ENTREE
+                       <BOUCLE_sous_menu(MENUS){id_menus_entree}>
+                               #INCLURE{fond=inclure/menu, env, id_menu, identifiant}
+                       </BOUCLE_sous_menu>
+               [(#REM)
+                       On ferme le li si le type d'entrée accepte des sous-menus
+                       et si on a bien quelque chose dans le li (cas des menus sur #SESSION)
+               ][(#TYPE_ENTREE|menus_type_refuser_sous_menu|non)
+                       [(#MENUS_AFFICHER_ENTREE|trim|oui)</li>]
+               ]
+               </BOUCLE_entrees>
+       [(#GET{englobant}|=={'oui'}|oui)</ul>]
+       </B_entrees>
+       
+</BOUCLE_menu>
diff --git a/www/plugins/beespip/inclure/menu_rubrique.html b/www/plugins/beespip/inclure/menu_rubrique.html
new file mode 100755 (executable)
index 0000000..3275384
--- /dev/null
@@ -0,0 +1,8 @@
+<BOUCLE_rubriques_menu(RUBRIQUES) {racine} {par num titre, titre}{0,#ENV{reste_a_afficher}}{lang}>
+       <li class="menu-entree[ (#EXPOSE)]"><a href="#URL_RUBRIQUE" title="[(#TITRE|textebrut|entites_html)]">[(#TITRE|couper{60})]</a>
+               <B_sousrubriques_menu><ul class="menu-liste menu-items"><BOUCLE_sousrubriques_menu(RUBRIQUES) {id_parent} {par num titre, titre}{0,10}{lang}>
+               <li class="menu-entree item rub#ID_RUBRIQUE"><a href="#URL_RUBRIQUE" title="[(#TITRE|textebrut|entites_html)]">[(#TITRE)]</a>
+               <BOUCLE_recursive_sousrubriques_menu(BOUCLE_sousrubriques_menu)></BOUCLE_recursive_sousrubriques_menu></li>
+               </BOUCLE_sousrubriques_menu></ul></B_sousrubriques_menu>
+       </li>
+</BOUCLE_rubriques_menu>
diff --git a/www/plugins/beespip/inclure/menu_standard.html b/www/plugins/beespip/inclure/menu_standard.html
new file mode 100755 (executable)
index 0000000..464b245
--- /dev/null
@@ -0,0 +1,32 @@
+<BOUCLE_exclus_rubriques(RUBRIQUES){titre_mot=exclu}{doublons}{lang}></BOUCLE_exclus_rubriques>
+[(#REM) On mémorise le nombre d'item à afficher]
+#SET{reste_a_afficher,#CONFIG{BeeSpip/affichage/nb_items_menu}}
+
+<ul class="menu-liste menu-items sf-menu">
+[(#REM) On teste si il existe un menu défini par le plugin ayant l'identifiant "menu"]
+<BOUCLE_menu(MENUS?){identifiant=menu}>
+       <B_entrees>
+       #SET{reste_a_afficher,#CONFIG{BeeSpip/affichage/nb_items_menu}|moins{#TOTAL_BOUCLE}}
+       [(#REM) On complète avec les rubriques racines si besoin]
+       [(#CONFIG{BeeSpip/affichage/menu_debut}|=={'oui'}|oui)<INCLURE{fond=inclure/menu_rubrique}{reste_a_afficher=#GET{reste_a_afficher}}{env}>]
+
+       <BOUCLE_entrees(MENUS_ENTREES?){id_menu}{par rang}>
+       #MENUS_AFFICHER_ENTREE
+               <BOUCLE_sous_menu(MENUS?){id_menus_entree}>
+                       #INCLURE{fond=inclure/menu, env, id_menu, identifiant}
+               </BOUCLE_sous_menu>
+       [(#REM)
+               On ferme le li si le type d'entrée accepte des sous-menus
+               et si on a bien quelque chose dans le li (cas des menus sur #SESSION)
+       ][(#TYPE_ENTREE|menus_type_refuser_sous_menu|non)
+               [(#MENUS_AFFICHER_ENTREE|trim|oui)</li>]
+       ]
+       </BOUCLE_entrees>
+       
+       [(#CONFIG{BeeSpip/affichage/menu_debut}|=={'non'}|oui)<INCLURE{fond=inclure/menu_rubrique}{reste_a_afficher=#GET{reste_a_afficher}}{env}>]
+</BOUCLE_menu>
+       [(#REM) Il n'existe pas de menu, on affiche les rubriques racines]
+       <INCLURE{fond=inclure/menu_rubrique}{reste_a_afficher=#GET{reste_a_afficher}}{env}>
+<//B_menu>
+</ul>
+       
diff --git a/www/plugins/beespip/inclure/mot_breves.html b/www/plugins/beespip/inclure/mot_breves.html
new file mode 100755 (executable)
index 0000000..115a44d
--- /dev/null
@@ -0,0 +1,9 @@
+<B_breves><div class="menu breves">#ANCRE_PAGINATION\r
+<h2><:breves:></h2>\r
+<ul class="menu-liste">\r
+<BOUCLE_breves(BREVES) {id_mot} {!par date} {lang}{pagination #ENV{nbpages,5}}{exclus}>\r
+       <li class="menu-entree">[(#CONFIG{BeeSpip/affichage/dates_breves}|=={'oui'}|oui)[(#DATE|affdate_jourcourt) &ndash; ]]<a href="#URL_BREVE" title="[(#TITRE|supprimer_numero)]">[(#TITRE|supprimer_numero)]</a></li>\r
+</BOUCLE_breves>\r
+</ul>\r
+[<div class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</div>]</div>\r
+</B_breves>\r
diff --git a/www/plugins/beespip/inclure/mot_rubriques.html b/www/plugins/beespip/inclure/mot_rubriques.html
new file mode 100755 (executable)
index 0000000..c902d52
--- /dev/null
@@ -0,0 +1,9 @@
+<B_rubriques><div class="menu rubriques">#ANCRE_PAGINATION\r
+<h2><:rubriques:></h2>\r
+<ul class="menu-liste">\r
+<BOUCLE_rubriques(RUBRIQUES) {id_mot} {!par date} {lang}{pagination #ENV{nbpages,5}}{exclus}>\r
+       <li class="menu-entree">[(#CONFIG{BeeSpip/affichage/dates_articles}|=={'oui'}|oui)[(#DATE|affdate_jourcourt) &ndash; ]]<a href="#URL_RUBRIQUE" title="[(#DESCRIPTIF|textebrut|entites_html)]">[(#TITRE|supprimer_numero)]</a></li>\r
+</BOUCLE_rubriques>\r
+</ul>\r
+[<div class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</div>]</div>\r
+</B_rubriques>\r
diff --git a/www/plugins/beespip/inclure/mot_sites.html b/www/plugins/beespip/inclure/mot_sites.html
new file mode 100755 (executable)
index 0000000..f6996ba
--- /dev/null
@@ -0,0 +1,9 @@
+<B_sites><div class="menu sites">#ANCRE_PAGINATION\r
+<h2><:sites_web:></h2>\r
+<ul class="menu-liste">\r
+<BOUCLE_sites(SITES) {id_mot} {!par date} {pagination #ENV{nbpages,5}}{exclus}>\r
+       <li class="menu-entree"><em>[(#DATE|affdate_court)]</em> : <a href="#URL_SITE" title="[(#DESCRIPTIF|textebrut|entites_html)]" onclick="window.open(this.href); return false;">#NOM_SITE</a></li>\r
+</BOUCLE_sites>\r
+</ul>\r
+[<div class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</div>]</div>\r
+</B_sites>\r
diff --git a/www/plugins/beespip/inclure/page_lessites.html b/www/plugins/beespip/inclure/page_lessites.html
new file mode 100755 (executable)
index 0000000..01c99f9
--- /dev/null
@@ -0,0 +1,7 @@
+<B_articles_syndic>#ANCRE_PAGINATION<strong><:beespip:les_derniers_articles:></strong><br />\r
+<BOUCLE_articles_syndic(SYNDIC_ARTICLES){id_syndic}{!par date}{pagination #ENV{nbpages}}>\r
+       <p>#PUCE <strong><a href="#URL_ARTICLE" title="[(#DESCRIPTIF|textebrut|entites_html)]">[(#TITRE*|supprimer_numero)]</a></strong>\r
+       <br /><span class="post-info">[Publi&eacute; par (#LESAUTEURS) | ]\r
+       <abbr class="date" title="[(#DATE|date_iso)]">[(#DATE|nom_jour)] [(#DATE|affdate)]</abbr></span>\r
+       [<br />(#DESCRIPTIF)]</p>\r
+</BOUCLE_articles_syndic>[<div class="pagination">(#PAGINATION)</div>]</B_articles_syndic>\r
diff --git a/www/plugins/beespip/inclure/petition.html b/www/plugins/beespip/inclure/petition.html
new file mode 100755 (executable)
index 0000000..c8a7460
--- /dev/null
@@ -0,0 +1,45 @@
+[(#REM) Signer la petition ]
+#FORMULAIRE_SIGNATURE
+
+[(#REM) Signatures de la petition ]
+<B_signatures>
+<div id="signatures">
+       [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+       <table class="spip">
+       <caption><h4>#GRAND_TOTAL <:signatures_petition:></h4></caption>
+               <thead>
+                       <tr class="row_first">
+                               <th class="signature-date"><a href='[(#SELF|parametre_url{tri,date_time}|parametre_url{tri_inverse,''})]#signatures' title="<:lien_trier_date:>"><:date:></a></th>
+                               <th class="signature-nom"><a href='[(#SELF|parametre_url{tri,nom_email}|parametre_url{tri_inverse,''})]#signatures' title="<:lien_trier_nom:>"><:nom:></a></th>
+                               [(#REM) Afficher la colonne des messages si autorises ]
+                               <BOUCLE_signature-message-th(PETITIONS){id_article}{message=oui}>
+                               <th class="signature-message"><:message:></th>
+                               </BOUCLE_signature-message-th>
+                       </tr>
+               </thead>
+               <tbody>
+               <BOUCLE_signatures(SIGNATURES) {id_article} {pagination #ENV{pagination, 15} } {recherche ?#ENV{recherche_signatures}} {!par #ENV{tri}}{par #ENV{tri_inverse}} {!par #ENV{tri,#ENV{tri_inverse}}|?{'',date_time}}>
+               <tr [class="(#COMPTEUR_BOUCLE|alterner{row_even,row_odd})" ]id='id_signature#ID_SIGNATURE'>
+                       <td class="signature-date">[(#DATE|affdate_jourcourt)]</td>
+                       <td class="signature-nom"><strong class="#EDIT{qui}">#NOM</strong>[ <div class="small #EDIT{hyperlien}"><a href="(#URL_SITE)"[ title="(#NOM_SITE|attribut_html|couper{80})"] class="spip_out"><:site_web:></a></div>]</td>
+                       [(#REM) Afficher la colonne des messages si autorises ]
+                       <BOUCLE_signature-message-td(PETITIONS){id_article}{message=oui}> </BOUCLE_signature-message-td>
+                       <td class="signature-message #EDIT{message}">[(#MESSAGE|PtoBR)]</td>
+                       </B_signature-message-td>
+               </tr>
+               </BOUCLE_signatures>
+       </tbody>
+       </table>
+       [<p class="pagination">(#PAGINATION{#CONFIG{BeeSpip/affichage/modele_pagination}})</p>]
+
+       [(#REM) Afficher un moteur de recherche si plus de 30 signatures
+       ou s'il etait deja present au coup d'avant]
+       [(#ENV{recherche_signatures}|?{31,#_signatures:GRAND_TOTAL}|>{3}|oui)
+       <div class="formulaire_spip formulaire_recherche" id="formulaire_recherche_signatures">
+               <form method='get' action='#SELF'><div>[(#SELF|form_hidden)]
+               <label for="recherche_signatures"><:info_rechercher:></label> <input type="text" class="text" size="10" name="recherche_signatures" id="recherche_signatures" style='font-style: italic;' value=" <:entree_signature:>"/> <input type="submit" class="submit" value="<:info_rechercher:>" />
+               </div></form>
+       </div>
+       ]
+</div><!--#signatures-->
+</B_signatures>
diff --git a/www/plugins/beespip/inclure/pied.html b/www/plugins/beespip/inclure/pied.html
new file mode 100755 (executable)
index 0000000..8718ecf
--- /dev/null
@@ -0,0 +1,28 @@
+               <div id="pied-bottom">
+                       [(#REM) on teste si le menu "pied" du plugin "Menu" existe
+                                       Sinon on appelle le menu par défaut]
+                       <BOUCLE_menu(MENUS?){identifiant=pied}>
+                               #INCLURE{fond=inclure/menu, env, identifiant=pied}
+                       </BOUCLE_menu>
+                       <ul class="bottom-left menu-liste">
+                               <li><a href="#URL_SITE_SPIP/" title="<:accueil_site:>"><:beespip:accueil:></a></li>
+                               [(#ENV{intranet}|=={'oui'}|non)<li>| <a href='#URL_PAGE{backend}' title="<:beespip:consulter_syndic:>"><:beespip:syndic:></a></li>]
+                               <li>| <a href="#URL_PAGE{plan}" title="<:plan_site:>"><:plan_site:></a></li>
+                               <li>| <a href="#URL_SITE_SPIP/ecrire/" title="<:beespip:espace_prive:>"><:beespip:espace_prive:></a></li>
+                               [(#SESSION{id_auteur}|oui)
+                               <li>| <a href='#URL_LOGOUT' title="<:beespip:se_deconnecter:>"><:beespip:se_deconnecter:></a></li>
+                               ]
+                               [(#SESSION{id_auteur}|non)
+                               <li>| 
+                               <a href="[(#URL_PAGE{login}|parametre_url{url,#SELF})]" rel="nofollow" target="_blank" onclick="if (jQuery.modalbox) {jQuery.modalbox('[(#URL_PAGE{login}|parametre_url{url,#SELF}|parametre_url{var_zajax,contenu})]');return false;}" title="<:beespip:se_connecter:>"><:beespip:se_connecter:></a></li>
+                               ]
+                       </ul>
+                       <//B_menu>
+
+                       <p class="bottom-right" >
+                               <a href="http://www.spip.net/fr" onclick="window.open(this.href); return false;" title="<:site_realise_avec_spip:>">SPIP #SPIP_VERSION</a> |
+                               <a href="http://www.beespip.org" onclick="window.open(this.href); return false;" title="<:beespip:squelette_beespip:>"><:beespip:squelette_beespip:> <:beespip:version:>[(#VAL{beespip}|beespip_info_version)]
+</a>
+                       </p>
+                       <BOUCLE_maj(RUBRIQUES){age>=0}{!par date}{0,1}>[(#CONFIG{BeeSpip/affichage/derniere_date_publication}|=={'oui'}|oui)<div class="pieddate"><:beespip:mis_a_jour:> [(#DATE|nom_jour)] [(#DATE|affdate)]</div>]</BOUCLE_maj>
+               </div>
diff --git a/www/plugins/beespip/js/easySlider1.7.js b/www/plugins/beespip/js/easySlider1.7.js
new file mode 100755 (executable)
index 0000000..f63223f
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ *     Easy Slider 1.7 - jQuery plugin
+ *     written by Alen Grakalic        
+ *     http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
+ *
+ *     Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
+ *     Dual licensed under the MIT (MIT-LICENSE.txt)
+ *     and GPL (GPL-LICENSE.txt) licenses.
+ *
+ *     Built for jQuery library
+ *     http://jquery.com
+ *
+ */
+/*
+ *     markup example for $("#slider").easySlider();
+ *     
+ *     <div id="slider">
+ *             <ul>
+ *                     <li><img src="images/01.jpg" alt="" /></li>
+ *                     <li><img src="images/02.jpg" alt="" /></li>
+ *                     <li><img src="images/03.jpg" alt="" /></li>
+ *                     <li><img src="images/04.jpg" alt="" /></li>
+ *                     <li><img src="images/05.jpg" alt="" /></li>
+ *             </ul>
+ *     </div>
+ *
+ */
+
+(function($) {
+
+       $.fn.easySlider = function(options){
+         
+               // default configuration properties
+               var defaults = {                        
+                       prevId:                 'prevBtn',
+                       prevText:               'Previous',
+                       nextId:                 'nextBtn',      
+                       nextText:               'Next',
+                       controlsShow:   true,
+                       controlsBefore: '',
+                       controlsAfter:  '',     
+                       controlsFade:   true,
+                       firstId:                'firstBtn',
+                       firstText:              'First',
+                       firstShow:              false,
+                       lastId:                 'lastBtn',      
+                       lastText:               'Last',
+                       lastShow:               false,                          
+                       vertical:               false,
+                       speed:                  800,
+                       auto:                   false,
+                       pause:                  2000,
+                       continuous:             false, 
+                       numeric:                false,
+                       numericId:              'controls'
+               }; 
+               
+               var options = $.extend(defaults, options);  
+                               
+               this.each(function() {  
+                       var obj = $(this);                              
+                       var s = $("li", obj).length;
+                       var w = $("li", obj).width(); 
+                       var h = $("li", obj).height(); 
+                       var clickable = true;
+                       obj.width(w); 
+                       obj.height(h); 
+                       obj.css("overflow","hidden");
+                       var ts = s-1;
+                       var t = 0;
+                       $("ul", obj).css('width',s*w);                  
+                       
+                       if(options.continuous){
+                               $("ul", obj).prepend($("ul li:last-child", obj).clone().css("margin-left","-"+ w +"px"));
+                               $("ul", obj).append($("ul li:nth-child(2)", obj).clone());
+                               $("ul", obj).css('width',(s+1)*w);
+                       };                              
+                       
+                       if(!options.vertical) $("li", obj).css('float','left');
+                                                               
+                       if(options.controlsShow){
+                               var html = options.controlsBefore;                              
+                               if(options.numeric){
+                                       html += '<ol id="'+ options.numericId +'"></ol>';
+                               } else {
+                                       if(options.firstShow) html += '<span id="'+ options.firstId +'"><a href=\"javascript:void(0);\">'+ options.firstText +'</a></span>';
+                                       html += ' <span id="'+ options.prevId +'"><a href=\"javascript:void(0);\">'+ options.prevText +'</a></span>';
+                                       html += ' <span id="'+ options.nextId +'"><a href=\"javascript:void(0);\">'+ options.nextText +'</a></span>';
+                                       if(options.lastShow) html += ' <span id="'+ options.lastId +'"><a href=\"javascript:void(0);\">'+ options.lastText +'</a></span>';                              
+                               };
+                               
+                               html += options.controlsAfter;                                          
+                               $(obj).after(html);                                                                             
+                       };
+                       
+                       if(options.numeric){
+                               for(var i=0;i<s;i++){
+                                       /* Ajout pour récupérer le texte de la balise h2 */
+                                       var elem = document.getElementById ("bouton_actu"+ (i+1)); 
+                                       var texte_bouton = "";
+                                       if (elem.textContent === undefined) {
+                                               texte_bouton +=  elem.innerText;
+                                       }
+                                       else {
+                                               texte_bouton +=  elem.textContent;
+                                       }
+
+                                       $(document.createElement("li"))
+                                               .attr('id',options.numericId + (i+1))
+                                               //.html('<a rel='+ i +' href=\"javascript:void(0);\">'+ (i+1) +'</a>')
+                                               .html('<a rel='+ i +' href=\"javascript:void(0);\" title=\"'+texte_bouton+'\">'+ (i+1)  +'</a>')
+                                               .appendTo($("#"+ options.numericId))
+                                               .click(function(){                                                      
+                                                       animate($("a",$(this)).attr('rel'),true);
+                                               });                                                                                             
+                               };                                                      
+                       } else {
+                               $("a","#"+options.nextId).click(function(){             
+                                       animate("next",true);
+                               });
+                               $("a","#"+options.prevId).click(function(){             
+                                       animate("prev",true);                           
+                               });     
+                               $("a","#"+options.firstId).click(function(){            
+                                       animate("first",true);
+                               });                             
+                               $("a","#"+options.lastId).click(function(){             
+                                       animate("last",true);                           
+                               });                             
+                       };
+                       
+                       function setCurrent(i){
+                               i = parseInt(i)+1;
+                               $("li", "#" + options.numericId).removeClass("current");
+                               $("li#" + options.numericId + i).addClass("current");
+                       };
+                       
+                       function adjust(){
+                               if(t>ts) t=0;           
+                               if(t<0) t=ts;   
+                               if(!options.vertical) {
+                                       $("ul",obj).css("margin-left",(t*w*-1));
+                               } else {
+                                       $("ul",obj).css("margin-left",(t*h*-1));
+                               }
+                               clickable = true;
+                               if(options.numeric) setCurrent(t);
+                       };
+                       
+                       function animate(dir,clicked){
+                               if (clickable){
+                                       clickable = false;
+                                       var ot = t;                             
+                                       switch(dir){
+                                               case "next":
+                                                       t = (ot>=ts) ? (options.continuous ? t+1 : ts) : t+1;                                           
+                                                       break; 
+                                               case "prev":
+                                                       t = (t<=0) ? (options.continuous ? t-1 : 0) : t-1;
+                                                       break; 
+                                               case "first":
+                                                       t = 0;
+                                                       break; 
+                                               case "last":
+                                                       t = ts;
+                                                       break; 
+                                               default:
+                                                       t = dir;
+                                                       break; 
+                                       };      
+                                       var diff = Math.abs(ot-t);
+                                       var speed = diff*options.speed;                                         
+                                       if(!options.vertical) {
+                                               p = (t*w*-1);
+                                               $("ul",obj).animate(
+                                                       { marginLeft: p }, 
+                                                       { queue:false, duration:speed, complete:adjust }
+                                               );                              
+                                       } else {
+                                               p = (t*h*-1);
+                                               $("ul",obj).animate(
+                                                       { marginTop: p }, 
+                                                       { queue:false, duration:speed, complete:adjust }
+                                               );                                      
+                                       };
+                                       
+                                       if(!options.continuous && options.controlsFade){                                        
+                                               if(t==ts){
+                                                       $("a","#"+options.nextId).hide();
+                                                       $("a","#"+options.lastId).hide();
+                                               } else {
+                                                       $("a","#"+options.nextId).show();
+                                                       $("a","#"+options.lastId).show();                                       
+                                               };
+                                               if(t==0){
+                                                       $("a","#"+options.prevId).hide();
+                                                       $("a","#"+options.firstId).hide();
+                                               } else {
+                                                       $("a","#"+options.prevId).show();
+                                                       $("a","#"+options.firstId).show();
+                                               };                                      
+                                       };                              
+                                       
+                                       if(clicked) clearTimeout(timeout);
+                                       if(options.auto && dir=="next" && !clicked){;
+                                               timeout = setTimeout(function(){
+                                                       animate("next",false);
+                                               },diff*options.speed+options.pause);
+                                       };
+                       
+                               };
+                               
+                       };
+                       // init
+                       var timeout;
+                       if(options.auto){;
+                               timeout = setTimeout(function(){
+                                       animate("next",false);
+                               },options.pause);
+                       };              
+                       
+                       if(options.numeric) setCurrent(0);
+               
+                       if(!options.continuous && options.controlsFade){                                        
+                               $("a","#"+options.prevId).hide();
+                               $("a","#"+options.firstId).hide();                              
+                       };                              
+                       
+               });
+         
+       };
+
+})(jQuery);
+
+
+
diff --git a/www/plugins/beespip/js/mColorPicker.min.js b/www/plugins/beespip/js/mColorPicker.min.js
new file mode 100755 (executable)
index 0000000..e9e052c
--- /dev/null
@@ -0,0 +1,12 @@
+/*\r
+  mColorPicker\r
+  Version: 1.0 r38\r
+  \r
+  Copyright (c) 2010 Meta100 LLC.\r
+  http://www.meta100.com/\r
+  \r
+  Licensed under the MIT license \r
+  http://www.opensource.org/licenses/mit-license.php \r
+*/\r
+\r
+(function($){var b,e,g,j,i=$(document),h=$("<div>"),n=$("<div>"),o=$("<div>"),p=$("<input>"),q=/^rgb[a]?\((\d+),\s*(\d+),\s*(\d+)(,\s*(\d+\.\d+)*)?\)/,r=/([a-f0-9])([a-f0-9])([a-f0-9])/,s=/#[a-f0-9]{3}/,t=/#[a-f0-9]{6}/;$.fn.mColorPicker=function(a){var c=$.fn.mColorPicker.getCookie("swatches");b=$.extend($.fn.mColorPicker.defaults,a);$.fn.mColorPicker.defaults.swatches.concat(b.swatches).slice(-10);if(e.enhancedSwatches&&c)b.swatches=c.split("||").concat(b.swatches).slice(0,10)||b.swatches;$("div#mColorPicker").length||$.fn.mColorPicker.drawPicker();$("#css_disabled_color_picker").length||$("head").prepend('<meta data-remove-me="true"/><style id="css_disabled_color_picker" type="text/css">.mColorPicker[disabled] + span, .mColorPicker[disabled="disabled"] + span, .mColorPicker[disabled="true"] + span {filter:alpha(opacity=50);-moz-opacity:0.5;-webkit-opacity:0.5;-khtml-opacity: 0.5;opacity: 0.5;cursor:default;}</style>');$("meta[data-remove-me=true]").remove();this.each($.fn.mColorPicker.drawPickerTriggers);return this};$.fn.mColorPicker.init={replace:"[type=color]",index:0,enhancedSwatches:true,allowTransparency:true,slogan:"Meta100 - Designing Fun",showLogo:true};$.fn.mColorPicker.defaults={currentId:false,currentInput:false,currentColor:false,changeColor:false,color:false,imageFolder:"images/",swatches:"#ffffff,#ffff00,#00ff00,#00ffff,#0000ff,#ff00ff,#ff0000,#4c2b11,#3b3b3b,#000000".split(",")};$.fn.mColorPicker.start=function(){$('input[data-mcolorpicker!="true"]').filter(function(){return e.replace=="[type=color]"?this.getAttribute("type")=="color":$(this).is(e.replace)}).mColorPicker()};$.fn.mColorPicker.events=function(){$("#mColorPickerBg").live("click",$.fn.mColorPicker.closePicker);$(".mColorPicker").live("keyup",function(){try{$(this).css({"background-color":$(this).val()}).css({color:$.fn.mColorPicker.textColor($(this).css("background-color"))}).trigger("change")}catch(a){}});$(".mColorPickerTrigger").live("click",$.fn.mColorPicker.colorShow);$(".mColor, .mPastColor").live("mousemove",function(a){if(!b.changeColor)return false;var c=$(this),f=c.offset(),d=b.currentInput,d=d.attr("data-hex")||d.attr("hex");b.color=c.css("background-color");if(c.hasClass("mPastColor"))b.color=$.fn.mColorPicker.setColor(b.color,d);else if(c.hasClass("mColorTransparent"))b.color="transparent";else if(!c.hasClass("mPastColor"))b.color=$.fn.mColorPicker.whichColor(a.pageX-f.left,a.pageY-f.top,d);b.currentInput.mSetInputColor(b.color)}).live("click",$.fn.mColorPicker.colorPicked);$("#mColorPickerInput").live("keyup",function(a){try{b.color=$(this).val(),b.currentInput.mSetInputColor(b.color),a.which==13&&$.fn.mColorPicker.colorPicked()}catch(c){}}).live("blur",function(){b.currentInput.mSetInputColor(b.color)});$("#mColorPickerWrapper").live("mouseleave",function(){if(!b.changeColor)return false;b.currentInput.mSetInputColor(b.currentColor)})};$.fn.mColorPicker.drawPickerTriggers=function(){var a=$(this),c=a.attr("id")||"color_"+e.index++,f=a.attr("text")=="hidden"||a.attr("data-text")=="hidden"?true:false,d=$.fn.mColorPicker.setColor(a.val(),a.attr("data-hex")||a.attr("hex")),k=a.width(),g=a.height(),h=a.css("float"),l=$("<span>"),m=$("<span>"),i="";l.attr({id:"color_work_area","class":"mColorPickerInput"}).appendTo(j);m.attr({id:"mcp_"+c,"class":"mColorPickerTrigger"}).css({display:"inline-block",cursor:"pointer"}).insertAfter(a);$("<img>").attr({src:b.imageFolder+"color.png"}).css({border:0,margin:"0 0 0 3px","vertical-align":"text-bottom"}).appendTo(m);l.append(a);i=l.html().replace(/type="color"/gi,'type="'+(f?"hidden":"text")+'"');l.html("").remove();a=$(i).attr("id",c).addClass("mColorPicker").val(d).insertBefore(m);f&&m.css({border:"1px solid black","float":h,width:k,height:g}).addClass(a.attr("class")).html("&nbsp;");a.mSetInputColor(d);return a};$.fn.mColorPicker.drawPicker=function(){var a=$("<div>"),c=$("<a>"),f=$("<div>"),d=$("<div>");n.attr({id:"mColorPickerBg"}).css({display:"none",background:"black",opacity:0.01,position:"absolute",top:0,right:0,bottom:0,left:0}).appendTo(j);h.attr({id:"mColorPicker","data-mcolorpicker":true}).css({position:"absolute",border:"1px solid #ccc",color:"#fff",width:"194px",height:"184px","font-size":"12px","font-family":"times",display:"none"}).appendTo(j);o.attr({id:"mColorPickerTest"}).css({display:"none"}).appendTo(j);d.attr({id:"mColorPickerWrapper"}).css({position:"relative",border:"solid 1px gray"}).appendTo(h);$("<div>").attr({id:"mColorPickerImg","class":"mColor"}).css({height:"136px",width:"192px",border:0,cursor:"crosshair","background-image":"url("+b.imageFolder+"picker.png)"}).appendTo(d);a.attr({id:"mColorPickerSwatches"}).css({"border-right":"1px solid #000"}).appendTo(d);$("<div>").addClass("mClear").css({clear:"both"}).appendTo(a);for(g=9;g>-1;g--)$("<div>").attr({id:"cell"+g,"class":"mPastColor"+(g>0?" mNoLeftBorder":"")}).css({"background-color":b.swatches[g].toLowerCase(),height:"18px",width:"18px",border:"1px solid #000","float":"left"}).html("&nbsp;").prependTo(a);f.attr({id:"mColorPickerFooter"}).css({"background-image":"url("+b.imageFolder+"grid.gif)",position:"relative",height:"26px"}).appendTo(d);p.attr({id:"mColorPickerInput",type:"text"}).css({border:"solid 1px gray","font-size":"10pt",margin:"3px",width:"80px"}).appendTo(f);e.allowTransparency&&$("<span>").attr({id:"mColorPickerTransparent","class":"mColor mColorTransparent"}).css({"font-size":"16px",color:"#000","padding-right":"30px","padding-top":"3px",cursor:"pointer",overflow:"hidden","float":"right"}).text("transparent").appendTo(f);e.showLogo&&c.attr({href:"http://meta100.com/",title:e.slogan,alt:e.slogan,target:"_blank"}).css({"float":"right"}).appendTo(f);$("<img>").attr({src:b.imageFolder+"meta100.png",title:e.slogan,alt:e.slogan}).css({border:0,"border-left":"1px solid #aaa",right:0,position:"absolute"}).appendTo(c);$(".mNoLeftBorder").css({"border-left":0})};$.fn.mColorPicker.closePicker=function(){n.hide();h.fadeOut()};$.fn.mColorPicker.colorShow=function(){var a=$(this),c=a.attr("id").replace("mcp_",""),f=a.offset(),d=$("#"+c),k=f.top+a.outerHeight(),e=f.left;if(d.attr("disabled"))return false;b.currentColor=d.css("background-color");b.changeColor=true;b.currentInput=d;b.currentId=c;k+h.height()>i.height()&&(k=f.top-h.height());e+h.width()>i.width()&&(e=f.left-h.width()+a.outerWidth());h.css({top:k+"px",left:e+"px"}).fadeIn("fast");n.show();b.color=$("#"+c).attr("data-text")?a.css("background-color"):d.css("background-color");b.color=$.fn.mColorPicker.setColor(b.color,d.attr("data-hex")||d.attr("hex"));p.val(b.color)};$.fn.mColorPicker.setInputColor=function(a,c){$("#"+a).mSetInputColor(c)};$.fn.mSetInputColor=function(a){var c=$(this),f={"background-color":a,"background-image":a=="transparent"?"url('"+b.imageFolder+"grid.gif')":"",color:$.fn.mColorPicker.textColor(a)};(c.attr("data-text")||c.attr("text"))&&c.next().css(f);c.val(a).css(f).trigger("change");p.val(a)};$.fn.mColorPicker.textColor=function(a){a=$.fn.mColorPicker.RGBtoHex(a);return typeof a=="undefined"||a=="transparent"?"black":parseInt(a.substr(1,2),16)+parseInt(a.substr(3,2),16)+parseInt(a.substr(5,2),16)<400?"white":"black"};$.fn.mColorPicker.setCookie=function(a,c,b){a=a+"="+escape(c);c=new Date;c.setDate(c.getDate()+b);a+="; expires="+c.toGMTString();document.cookie=a};$.fn.mColorPicker.getCookie=function(a){return(a=document.cookie.match("(^|;) ?"+a+"=([^;]*)(;|$)"))?unescape(a[2]):null};$.fn.mColorPicker.colorPicked=function(){b.changeColor=false;$.fn.mColorPicker.closePicker();$.fn.mColorPicker.addToSwatch();b.currentInput.trigger("colorpicked")};$.fn.mColorPicker.addToSwatch=function(a){if(!e.enhancedSwatches)return false;var c=[];g=0;if(typeof a=="string")b.color=a.toLowerCase();b.color!="transparent"&&(c[0]=b.color.toLowerCase());$(".mPastColor").each(function(){var a=$(this);b.color=a.css("background-color").toLowerCase();if(b.color!=c[0]&&$.fn.mColorPicker.RGBtoHex(b.color)!=c[0]&&$.fn.mColorPicker.hexToRGB(b.color)!=c[0]&&c.length<10)c[c.length]=b.color;$(this).css("background-color",c[g++])});e.enhancedSwatches&&$.fn.mColorPicker.setCookie("swatches",c.join("||"),365)};$.fn.mColorPicker.whichColor=function(a,c,b){var d=[255,255,255];a<32?(d[1]=a*8,d[2]=0):a<64?(d[0]=256-(a-32)*8,d[2]=0):a<96?(d[0]=0,d[2]=(a-64)*8):a<128?(d[0]=0,d[1]=256-(a-96)*8):a<160?(d[0]=(a-128)*8,d[1]=0):(d[1]=0,d[2]=256-(a-160)*8);for(var e=0;e<3;e++)c<64?d[e]+=(256-d[e])*(64-c)/64:c<=128?d[e]-=d[e]*(c-64)/64:c>128&&(d[e]=256-a/192*256),d[e]=Math.round(Math.min(d[e],255)),b=="true"&&(d[e]=$.fn.mColorPicker.decToHex(d[e]));return b=="true"?"#"+d.join(""):"rgb("+d.join(", ")+")"};$.fn.mColorPicker.setColor=function(a,c){return c=="true"?$.fn.mColorPicker.RGBtoHex(a):$.fn.mColorPicker.hexToRGB(a)};$.fn.mColorPicker.colorTest=function(a){o.css("background-color",a);return o.css("background-color")};$.fn.mColorPicker.decToHex=function(a){a=parseInt(a);return String("0123456789ABCDEF".charAt(Math.floor(a/16)))+String("0123456789ABCDEF".charAt(a-Math.floor(a/16)*16))};$.fn.mColorPicker.RGBtoHex=function(a){var c="#",b,a=a?a.toLowerCase():false;if(!a)return"";if(t.test(a))return a.substr(0,7);if(s.test(a))return a.replace(r,"$1$1$2$2$3$3").substr(0,7);if(b=a.match(q)){for(a=1;a<4;a++)c+=$.fn.mColorPicker.decToHex(b[a]);return c}return $.fn.mColorPicker.colorTest(a)};$.fn.mColorPicker.hexToRGB=function(a){a=a?a.toLowerCase():false;if(!a)return"";if(q.test(a))return a;return s.test(a)?(t.test(a)||(a=a.replace(r,"$1$1$2$2$3$3")),"rgb("+parseInt(a.substr(1,2),16)+", "+parseInt(a.substr(3,2),16)+", "+parseInt(a.substr(5,2),16)+")"):$.fn.mColorPicker.colorTest(a)};e=$.fn.mColorPicker.init;i.ready(function(){j=$("body");$.fn.mColorPicker.events();e.replace&&($.fn.mColorPicker.start(),typeof $.fn.livequery=="function"?$(e.replace).livequery($.fn.mColorPicker.start):$(document).live("ajaxSuccess.mColorPicker",$.fn.mColorPicker.start))})})(jQuery);
\ No newline at end of file
diff --git a/www/plugins/beespip/js/superfish.js b/www/plugins/beespip/js/superfish.js
new file mode 100755 (executable)
index 0000000..c6a9c7d
--- /dev/null
@@ -0,0 +1,121 @@
+
+/*
+ * Superfish v1.4.8 - jQuery menu widget
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *     http://www.opensource.org/licenses/mit-license.php
+ *     http://www.gnu.org/licenses/gpl.html
+ *
+ * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
+ */
+
+;(function($){
+       $.fn.superfish = function(op){
+
+               var sf = $.fn.superfish,
+                       c = sf.c,
+                       $arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
+                       over = function(){
+                               var $$ = $(this), menu = getMenu($$);
+                               clearTimeout(menu.sfTimer);
+                               $$.showSuperfishUl().siblings().hideSuperfishUl();
+                       },
+                       out = function(){
+                               var $$ = $(this), menu = getMenu($$), o = sf.op;
+                               clearTimeout(menu.sfTimer);
+                               menu.sfTimer=setTimeout(function(){
+                                       o.retainPath=($.inArray($$[0],o.$path)>-1);
+                                       $$.hideSuperfishUl();
+                                       if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
+                               },o.delay);     
+                       },
+                       getMenu = function($menu){
+                               var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
+                               sf.op = sf.o[menu.serial];
+                               return menu;
+                       },
+                       addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
+                       
+               return this.each(function() {
+                       var s = this.serial = sf.o.length;
+                       var o = $.extend({},sf.defaults,op);
+                       o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
+                               $(this).addClass([o.hoverClass,c.bcClass].join(' '))
+                                       .filter('li:has(ul)').removeClass(o.pathClass);
+                       });
+                       sf.o[s] = sf.op = o;
+                       
+                       $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
+                               if (o.autoArrows) addArrow( $('>a:first-child',this) );
+                       })
+                       .not('.'+c.bcClass)
+                               .hideSuperfishUl();
+                       
+                       var $a = $('a',this);
+                       $a.each(function(i){
+                               var $li = $a.eq(i).parents('li');
+                               $a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
+                       });
+                       o.onInit.call(this);
+                       
+               }).each(function() {
+                       var menuClasses = [c.menuClass];
+                       if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
+                       $(this).addClass(menuClasses.join(' '));
+               });
+       };
+
+       var sf = $.fn.superfish;
+       sf.o = [];
+       sf.op = {};
+       sf.IE7fix = function(){
+               var o = sf.op;
+               if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
+                       this.toggleClass(sf.c.shadowClass+'-off');
+               };
+       sf.c = {
+               bcClass     : 'sf-breadcrumb',
+               menuClass   : 'sf-js-enabled',
+               anchorClass : 'sf-with-ul',
+               arrowClass  : 'sf-sub-indicator',
+               shadowClass : 'sf-shadow'
+       };
+       sf.defaults = {
+               hoverClass      : 'sfHover',
+               pathClass       : 'overideThisToUse',
+               pathLevels      : 1,
+               delay           : 800,
+               animation       : {opacity:'show'},
+               speed           : 'normal',
+               autoArrows      : true,
+               dropShadows : true,
+               disableHI       : false,                // true disables hoverIntent detection
+               onInit          : function(){}, // callback functions
+               onBeforeShow: function(){},
+               onShow          : function(){},
+               onHide          : function(){}
+       };
+       $.fn.extend({
+               hideSuperfishUl : function(){
+                       var o = sf.op,
+                               not = (o.retainPath===true) ? o.$path : '';
+                       o.retainPath = false;
+                       var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
+                                       .find('>ul').hide().css('visibility','hidden');
+                       o.onHide.call($ul);
+                       return this;
+               },
+               showSuperfishUl : function(){
+                       var o = sf.op,
+                               sh = sf.c.shadowClass+'-off',
+                               $ul = this.addClass(o.hoverClass)
+                                       .find('>ul:hidden').css('visibility','visible');
+                       sf.IE7fix.call($ul);
+                       o.onBeforeShow.call($ul);
+                       $ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
+                       return this;
+               }
+       });
+
+})(jQuery);
diff --git a/www/plugins/beespip/lang/beespip_de.php b/www/plugins/beespip/lang/beespip_de.php
new file mode 100755 (executable)
index 0000000..abed917
--- /dev/null
@@ -0,0 +1,120 @@
+<?php\r
+\r
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP - Dies ist eine Sprachdatei von SPIP\r
+\r
+$GLOBALS[$GLOBALS['idx_lang']] = array(\r
+\r
+\r
+// A\r
+'acces_restreint' => 'Dieser Teil hat eingeschränkten Zugang',\r
+'accueil' => 'Startseite',\r
+'actualites' => 'Aktuelles',\r
+'afficher_breves' => 'Zeigen Sie Kurzmeldungen',\r
+'afficher_sites' => 'Zeigen Sie Seiten',\r
+'article_pdf' => 'Artikel im PDF-Format',\r
+'article_min' => 'Artikel',\r
+'articles_min' => 'Artikel',\r
+'articles2' => '(mehrere) Artikel',\r
+'aucun_article' => 'Kein Artikel',\r
+'aucun_message' => 'Keine Mitteilung',\r
+\r
+\r
+// C\r
+'ce_lien_rss' => 'Mit diesem Link können Sie über eine Informationsleitung (rss-Leitung) Ihre Webseite und die dem Theme korrespondierenden Artikel bekanntmachen',\r
+'commentaire' => 'Kommentar',\r
+'commentaires' => 'Kommentare',\r
+'consulter_detail_auteur' => 'Die Angaben zu diesem Autoren einsehen',\r
+'consulter_detail_syndic' => 'Die Details dieser Seite einsehen',\r
+'consulter_syndic' => 'Die Organisationsdateien einsehen',\r
+'contributions_forums' => 'Diese Seite umfasst alle Beiträge zu den Foren über die Artikel und Meldungen der Webseite und verweist auf die letzten eingegangenen Mitteilungen. Die Titel der Artikel und Meldungen, auf die sich die Beiträge beziehen, ermöglichen es, zum Nachlesen die Seiten zu öffnen.',\r
+\r
+\r
+// D\r
+'meme_rubrique' => 'In der gleichen Rubrik',\r
+'dernieres_publi' => 'Letzte Veröffentlichung am',\r
+'derniers_messages' => 'Letzte Mitteilungen',\r
+\r
+\r
+// E\r
+'elle_contient' => 'Sie enthält',\r
+'erreur' => 'Fehler',\r
+'erreur404' => 'Die gewünschte Seite existiert nicht.',\r
+'espace_prive' => 'Redaktionsbereich',\r
+'evitement_contenu' => 'Zum Inhalt',\r
+'evitement_navigation' => 'Zum Men&uuml;',\r
+'evitement_recherche' => 'Zur Suche',\r
+\r
+// F\r
+'fermer_fenetre' => 'Schließen Sie das Fenster',\r
+'forums' => 'Foren',\r
+\r
+\r
+// I\r
+'il_y_a' => 'Dazu gibt es',\r
+'index' => 'Index',\r
+\r
+\r
+// L\r
+'lactu_en_bref' => 'Aktualität in Kürze',\r
+'lactu_web' => 'Aktualität im Internet',\r
+'lactu_web_descriptif' => 'Diese Seite umfasst alle Links zu den kürzlich auf den von Ihnen abonnierten Webseiten unter der Verbindung ("fils rss") veröffentlichten Artikeln',\r
+'les_derniers_articles' => 'Die letzten Artikel der Webseite:',\r
+'les_auteurs' => 'Die Autoren',\r
+'les_autres_articles' => 'Die anderen Artikel dieser Rubrik:',\r
+'elements_similaires' => 'Elemente, die ähnliche Themen berühren:',\r
+'lire_la_breve' => 'Die Kurzmeldung lesen',\r
+'lire_l_article' => 'Den Artikel lesen',\r
+'liste_sites_par' => 'Komplette Liste der Seiten von',\r
+'login' => 'Login',\r
+\r
+\r
+// M\r
+'masquer_breves' => 'Die Kurzmeldungen verdecken',\r
+'masquer_sites' => 'Die Seiten verdecken',\r
+'messages_forums' => 'Mitteilungem in den Foren',\r
+'messages_forum' => 'Mitteilung des Forums',\r
+'mis_a_jour' => 'Auf den neuesten Stand gebracht',\r
+'mot_clef' => 'Schlüsselwort',\r
+\r
+\r
+// N\r
+'newsletter' => 'Newsletter',\r
+\r
+\r
+// O\r
+'ordre_alphabetique' => 'Alphabetische Reihenfolge',\r
+'ordre_alphabetique2' => 'Alphabetische Reihenfolge',\r
+\r
+\r
+// P\r
+'page_reservee' => 'Dieser Teil ist nur beschränkt zugänglich',\r
+'portfolio' => 'Mappe',\r
+'presentation_des' => 'Vorstellung der',\r
+'publie_le' => 'Veröffentlicht am',\r
+\r
+\r
+// R\r
+'recherche' => 'Suche',\r
+'recherche_mots' => 'Suche nach Schlüsselwörter',\r
+'repondre_article' => 'Auf diesen Artikel antworten',\r
+'repondre_breve' => 'Auf diese Meldung antworten',\r
+\r
+\r
+// S\r
+'se_connecter' => 'Verbinden',\r
+'se_deconnecter' => 'Ausschalten',\r
+'selection_des' => 'Auswahl von',\r
+'sites_associes' => 'Mit dem Schlüsslwort verbundene Seiten:',\r
+'sites_par' => 'Seiten nach:',\r
+'sites_references' => 'Referenzseiten',\r
+'squelette_beespip' => 'BeeSpip-Seitengestaltung',\r
+'syndic' => 'Syndikation/Organisieren',\r
+\r
+\r
+// V\r
+'version' => 'Version',\r
+'voir_article_syndic' => 'Den gesamten Artikel konsultieren'\r
+);\r
+\r
+\r
+?>\r
diff --git a/www/plugins/beespip/lang/beespip_en.php b/www/plugins/beespip/lang/beespip_en.php
new file mode 100755 (executable)
index 0000000..7aba806
--- /dev/null
@@ -0,0 +1,119 @@
+<?php\r
+\r
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP\r
+\r
+$GLOBALS[$GLOBALS['idx_lang']] = array(\r
+\r
+\r
+// A\r
+'acces_restreint' => 'This area is in restricted access',\r
+'accueil' => 'Home',\r
+'actualites' => 'News',\r
+'afficher_breves' => 'Show news items',\r
+'afficher_sites' => 'Show sites',\r
+'article_pdf' => 'Article in PDF format',\r
+'article_min' => 'article',\r
+'articles_min' => 'articles',\r
+'articles2' => 'Article(s)',\r
+'aucun_article' => 'No article',\r
+'aucun_message' => 'No message',\r
+\r
+\r
+// C\r
+'ce_lien_rss' => 'This link enables you to announce on your site, the articles relating to the topic corresponding, through information feed (rss feed)',\r
+'commentaire' => 'comment',\r
+'commentaires' => 'comments',\r
+'consulter_detail_auteur' => 'Show the author details',\r
+'consulter_detail_syndic' => 'Show the site details',\r
+'consulter_syndic' => 'Show the syndication\'s files',\r
+'contributions_forums' => 'This page gathers all the contributions to the forums of the articles and news items of the site and indicates the lastest posted messages. The titles of the articles and news items to which the contributions are referred to, are links to the contents pages.',\r
+\r
+\r
+// D\r
+'dernieres_publi' => 'Date of latest publication',\r
+'derniers_messages' => 'Lastest messages',\r
+\r
+\r
+// E\r
+'elle_contient' => 'it contains',\r
+'erreur' => 'Error',\r
+'erreur404' => 'The requested page doesn\'t exists',\r
+'espace_prive' => 'Editors area',\r
+'evitement_contenu' => 'Skip to content',\r
+'evitement_navigation' => 'Skip to menu',\r
+'evitement_recherche' => 'Skip to search',\r
+\r
+// F\r
+'fermer_fenetre' => 'Close the window',\r
+'forums' => 'Forums',\r
+\r
+\r
+// I\r
+'il_y_a' => 'There is',\r
+'index' => 'Index',\r
+\r
+\r
+// L\r
+'lactu_en_bref' => 'News in short',\r
+'lactu_web' => 'What\'s new on the Web',\r
+'lactu_web_descriptif' => 'This page gathers links towards articles published recently in information feed ("rss feed") resulting from sites to which the site that you consult is subscribed.',\r
+'les_derniers_articles' => 'Latest articles :',\r
+'les_auteurs' => 'The authors',\r
+'les_autres_articles' => 'The others articles in the same section :',\r
+'elements_similaires' => 'Elements treating of similar subjects :',\r
+'lire_la_breve' => 'Read this news item',\r
+'lire_l_article' => 'Read this article',\r
+'liste_sites_par' => 'Complete site list presented by',\r
+'login' => 'Login',\r
+\r
+\r
+// M\r
+'masquer_breves' => 'Hide news items',\r
+'masquer_sites' => 'Hide sites',\r
+'messages_forums' => 'Forum messages',\r
+'messages_forum' => 'Forum messages',\r
+'mis_a_jour' => 'Update',\r
+'mot_clef' => 'Key word',\r
+\r
+\r
+// N\r
+'newsletter' => 'Newsletter',\r
+\r
+\r
+// O\r
+'ordre_alphabetique' => 'alphabetical order',\r
+'ordre_alphabetique2' => 'Alphabetical order',\r
+\r
+\r
+// P\r
+'page_reservee' => 'This area is in restricted access',\r
+'portfolio' => 'Portfolio',\r
+'presentation_des' => 'presentation of',\r
+'publie_le' => 'Published on',\r
+\r
+\r
+// R\r
+'recherche' => 'Search',\r
+'recherche_mots' => 'Search by key words',\r
+'repondre_article' => 'Reply to this article',\r
+'repondre_breve' => 'Reply to this news item',\r
+\r
+\r
+// S\r
+'se_connecter' => 'Login',\r
+'se_deconnecter' => 'Logout',\r
+'selection_des' => 'Selection of',\r
+'sites_associes' => 'sites associated to key word :',\r
+'sites_par' => 'sites by :',\r
+'sites_references' => 'referenced sites',\r
+'squelette_beespip' => 'Template BeeSpip',\r
+'syndic' => 'Syndication',\r
+\r
+\r
+// V\r
+'version' => 'v.',\r
+'voir_article_syndic' => 'Read the complete article'\r
+);\r
+\r
+\r
+?>\r
diff --git a/www/plugins/beespip/lang/beespip_fr.php b/www/plugins/beespip/lang/beespip_fr.php
new file mode 100755 (executable)
index 0000000..7294ab7
--- /dev/null
@@ -0,0 +1,232 @@
+<?php\r
+\r
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP\r
+\r
+$GLOBALS[$GLOBALS['idx_lang']] = array(\r
+\r
+\r
+// A\r
+'acces_restreint' => 'Cette partie est en acc&egrave;s restreint',\r
+'accueil' => 'Accueil',\r
+'actualites' => 'Actualit&eacute;s',\r
+'afficher_breves' => 'Afficher les br&egrave;ves',\r
+'afficher_sites' => 'Afficher les sites',\r
+'annuaire' => 'Annuaire',\r
+'annuaire_adresse' => 'Adresse',\r
+'annuaire_adresse1' => 'Adresse ligne 1',\r
+'annuaire_adresse2' => 'Adresse ligne 2',\r
+'annuaire_affectations' => 'Affectations',\r
+'annuaire_aucune' => 'Aucune',\r
+'annuaire_details' => 'D&eacute;tails',\r
+'annuaire_categorie' => 'Cat&eacute;gorie',\r
+'annuaire_categories' => 'Cat&eacute;gories',\r
+'annuaire_civilite' => 'Civilit&eacute;',\r
+'annuaire_commentaire' => 'Commentaires',\r
+'annuaire_cp' => 'Code postal',\r
+'annuaire_creer_categorie' => 'Cr&eacute;er une cat&eacute;gorie',\r
+'annuaire_creer_individu' => 'Cr&eacute;er un individu',\r
+'annuaire_creer_organisation' => 'Cr&eacute;er une organisation',\r
+'annuaire_date_debut' => 'Date de d&eacute;but',\r
+'annuaire_date_fin' => 'Date de fin',\r
+'annuaire_dependant_de' => 'D&eacute;pendant de',\r
+'annuaire_fax' => 'Fax',\r
+'annuaire_fonction' => 'Fonction',\r
+'annuaire_individu' => 'Individu',\r
+'annuaire_individus' => 'Individus',\r
+'annuaire_mail' => 'Courriel',\r
+'annuaire_nb_entrees' => 'Nombre d\'entr&eacute;es',\r
+'annuaire_nom' => 'Nom',\r
+'annuaire_organisation' => 'Organisation',\r
+'annuaire_organisations' => 'Organisations',\r
+'annuaire_portable' => 'Portable',\r
+'annuaire_prenom' => 'Pr&eacute;nom',\r
+'annuaire_sigle' => 'Sigle',\r
+'annuaire_tel' => 'T&eacute;l&eacute;phone',\r
+'annuaire_tel_dom' => 'T&eacute;l&eacute;phone dom.',\r
+'annuaire_tel_pro' => 'T&eacute;l&eacute;phone pro.',\r
+'annuaire_tout' => 'Tout',\r
+'annuaire_txt_explication_categorie_racine' => 'Cette cat&eacute;gorie contient des sous cat&eacute;gories. Elle ne peut donc pas devenir sous-cat&eacute;gorie.',\r
+'annuaire_url' => 'Adresse internet',\r
+'annuaire_ville' => 'Ville',\r
+'article_pdf' => 'Article au format PDF',\r
+'article_min' => 'article',\r
+'articles_min' => 'articles',\r
+'articles2' => 'Article(s)',\r
+'aucun_article' => 'Aucun article',\r
+'aucun_message' => 'Aucun message',\r
+\r
+\r
+// B\r
+'beespip_affichage_des_menus' => 'Affichage des menus',\r
+'beespip_affichage_portfolio_menug' => 'Au dessous du menu gauche',\r
+'beespip_affichage_portfolio_services' => 'A la place du cartouche Services<br /><em>(Si celui-ci est n\'est pas affich&eacute;)</em>',\r
+'beespip_articles_pdf' => 'Convertir les articles au format "Acrobat PDF"',\r
+'beespip_auteurs_articles' => 'Afficher les auteurs des articles',\r
+'beespip_calendrier_public' => 'Utiliser le calendrier public',\r
+'beespip_cartouche_services' => 'Cartouche services.',\r
+'beespip_cartouche_services_descr' => 'Afficher le cartouche "Services" dans l\'ent&ecirc;te.',\r
+'beespip_chemin_acces_logo' => 'Chemin d\'acc&egrave;s au logo',\r
+'beespip_choix_page_accueil' => 'Choix de la page d\'accueil du site',\r
+'beespip_config' => 'Configuration',\r
+'beespip_couleur' => 'Gestion des couleurs',\r
+'beespip_dates' =>'Date de publication/modification',\r
+'beespip_dates_articles' => 'Afficher les dates de publication et modification des articles',\r
+'beespip_dates_breves' => 'Afficher les dates de publication et modification des br&egrave;ves',\r
+'beespip_derniere_date_publication' => 'Afficher la date de derni&egrave;re publication.',\r
+'beespip_derniere_date_publication_descr' => 'Afficher en pied de page la date de derni&egrave;re publication sur le site',\r
+'beespip_emplacement_date' => 'Emplacement de la date',\r
+'beespip_emplacement_date_menug' => 'Au dessus du menu gauche',\r
+'beespip_emplacement_date_entete' => 'Au dessus du cartouche Services<br /><em>(Si celui-ci est affich&eacute;)</em>',\r
+'beespip_emplacement_recherche' => 'Emplacement de la recherche',\r
+'beespip_emplacement_recherche_bas' => 'Au dessous du menu gauche',\r
+'beespip_emplacement_recherche_haut' => 'Au dessus du menu gauche',\r
+'beespip_espace_discussion' => 'Utiliser l\'espace de discussion de type phpBB',\r
+'beespip_fils_rss' => 'Fils RSS th&eacute;matiques',\r
+'beespip_fils_rss_descr' => 'Afficher les liens vers les fils RSS g&eacute;n&eacute;r&eacute;s &agrave; partir des mots cl&eacute;s sur la page "Recherche par mots-cl&eacute;s" et un lien en pied de page permettant l\'acc&egrave;s.<br /> Pour pouvoir utiliser la syndication s&eacute;lective, vous devez avoir un dossier "backend" &agrave; la racine de votre site (au m&ecirc;me niveau que "ecrire" ou "IMG") et autoriser l\'acc&egrave;s en &eacute;criture de ce dossier.',\r
+'beespip_fond_entete' => 'Valeur par d&eacute;faut : "pixel_couleur1.gif"<br />Vous pouvez modifier cette valeur en la remplacant par une image qui sera affich&eacute;e en fond et sur toute la largeur de la page. L\'image doit se trouver dans le dossier "themes/nom_du_theme/images-interface" du plugin beespip.',\r
+'beespip_gestion_entete' => 'Gestion de l\'ent&ecirc;te du site.',\r
+'beespip_gestion_menu' => 'Gestion des menus',\r
+'beespip_hauteur_largeur_logo' => 'Hauteur et largeur du logo en pixels',\r
+'beespip_hauteur_largeur_logo_descr' => 'Hauteur maximum de 135px &agrave; ne pas d&eacute;passer pour respecter la mise en page du site, et largeur maximum de 600px pour rester compatible 800x600.',\r
+'beespip_hauteur_logo' => 'Hauteur ',\r
+'beespip_image_fond' => 'Image de fond.',\r
+'beespip_index_mots_cles' => 'Afficher le lien vers la page "Recherche par mots-cl&eacute;s"',\r
+'beespip_index_mots_cles_descr' => 'Cette page affiche les diff&eacute;rents groupes et mots cl&eacute;s d&eacute;finis sauf ceux pr&eacute;c&eacute;d&eacute;s par le sigle ~',\r
+'beespip_intranet' => 'Intranet',\r
+'beespip_intranet_descr' => 'Permet de restreindre l\'acc&egrave;s au site aux seuls auteurs r&eacute;f&eacute;renc&eacute;s.',\r
+'beespip_largeur_logo' => 'Largeur ',\r
+'beespip_liens_des_menus' => 'Liens dans le bloc sous le menu gauche',\r
+'beespip_liens_des_menus_descr' => 'Pour modifier les intitul&eacute;s, il faut &eacute;diter le fichier de langue se trouvant dans le dossier "plugins/beespip/lang".<br /><em>Par exemple le fichier fran&ccedil;ais se nomme "beespipmenu_fr.php".</em>',\r
+'beespip_lien_actu_web' => 'Afficher le lien vers la page "L\'actualit&eacute; sur le web"',\r
+'beespip_lien_agenda' => 'Afficher le lien vers la page "Agenda"',\r
+'beespip_lien_affichebloc' => 'Afficher le cartouche des liens vers les pages suppl&eacute;mentaires',\r
+'beespip_lien_annuaire' => 'Afficher le lien vers l\'annuaire',\r
+'beespip_lien_espace_redacteur' => 'Afficher le lien vers l\'"Espace r&eacute;dacteur"',\r
+'beespip_lien_plan' => 'Afficher le lien vers la page "Plan du site"',\r
+'beespip_lien_newsletter' => 'Afficher le lien vers la page d\'inscription aux newsletters',\r
+'beespip_lien_portfolio' => 'Afficher le lien vers la page regroupant les portfolios',\r
+'beespip_lien_reactions' => 'Afficher le lien vers la page "R&eacute;actions aux articles"',\r
+'beespip_lien_usagers' => 'Afficher le lien vers la page "Usagers et auteurs"',\r
+'beespip_logo' => 'Si vous affichez une image en fond sur toute la largeur c.f. ci-dessus, utilisez pour le logo la valeur : "transp.gif".',\r
+'beespip_menu_articles' => 'Afficher les articles dans chaque rubrique du menu de gauche',\r
+'beespip_menu_horizontal' => 'Afficher le menu horizontal',\r
+'beespip_menu_liens_deplier_replier' => 'Afficher des liens "Tout deplier" "Tout replier"',\r
+'beespip_menu_vertical' => 'Afficher le menu vertical',\r
+'beespip_motscles_plugin' => 'Mots cl&eacute;s du plugin',\r
+'beespip_non' => 'Non',\r
+'beespip_options_affichage' => 'Options d\'affichage',\r
+'beespip_oui' => 'Oui',\r
+'beespip_reglages' => 'R&eacute;glages',\r
+'beespip_site_ombre' => 'Site ombr&eacute;.',\r
+'beespip_site_ombre_descr' => 'Afficher le site centr&eacute; entour&eacute; d\'une ombre port&eacute;e',\r
+'beespip_themes' => 'Choix du sch&eacute;ma de couleur du site',\r
+'beespip_themes_alternates' => 'Alternates',\r
+'beespip_themes_classiques' => 'Classiques',\r
+'beespip_themes_inspiration' => 'Inspirations',\r
+'beespip_themes_perso' => 'Personnalisations',\r
+'beespip_themes_variantes' => 'Variantes',\r
+'beespip_vignette_portfolio' => 'Affichage d\'une vignette issue du portfolio',\r
+'beespip_vignette_portfolio_descr' => 'Afficher al&eacute;atoirement une image du dernier article ayant le mot cl&eacute; "portfolio_vignette".',\r
+\r
+\r
+// C\r
+'ce_lien_rss' => 'Ce lien vous permet d\'annoncer sur votre site, les articles relatifs au th&egrave;me correspondant, via un fil d\'information (fil rss)',\r
+'commentaire' => 'commentaire',\r
+'commentaires' => 'commentaires',\r
+'consulter_detail_auteur' => 'Consulter la fiche de cet auteur',\r
+'consulter_detail_syndic' => 'Consulter les d&eacute;tails de ce site',\r
+'consulter_syndic' => 'Consulter les fichiers de syndication',\r
+'contributions_forums' => 'Cette page regroupe toutes les contributions aux forums des articles et br&egrave;ves du site et indique les derniers messages post&eacute;s. Les titres des articles et br&egrave;ves auxquels se rapportent les contributions permettent d\'en afficher les pages pour en relire le contenu.',\r
+\r
+\r
+// D\r
+'dernieres_publi' => 'Derni&egrave;re publication le',\r
+'derniers_messages' => 'Derniers messages',\r
+\r
+\r
+// E\r
+'elle_contient' => 'Elle contient',\r
+'erreur' => 'Erreur',\r
+'erreur404' => 'La page demand&eacute;e n\'existe pas.',\r
+'espace_prive' => 'Espace r&eacute;dacteurs',\r
+'evitement_contenu' => 'Aller au contenu',\r
+'evitement_navigation' => 'Aller au menu',\r
+'evitement_recherche' => 'Aller &agrave; la recherche',\r
+\r
+// F\r
+'fermer_fenetre' => 'Fermer la fen&ecirc;tre',\r
+'forums' => 'Forums',\r
+\r
+\r
+// I\r
+'il_y_a' => 'Il y a',\r
+'index' => 'Index',\r
+\r
+\r
+// L\r
+'lactu_en_bref' => 'L\'actualit&eacute; en bref',\r
+'lactu_web' => 'L\'actualit&eacute; sur le web',\r
+'lactu_web_descriptif' => 'Cette page regroupe des liens vers des articles publi&eacute;s r&eacute;cemment dans des fils d\'informations ("fils rss") issus de sites auxquels le site que vous consultez s\'est abonn&eacute;.',\r
+'les_derniers_articles' => 'Les derniers articles du site :',\r
+'les_auteurs' => 'Les auteurs',\r
+'les_autres_articles' => 'Les autres articles de cette rubrique :',\r
+'elements_similaires' => 'Les &eacute;l&eacute;ments traitant de sujets similaires :',\r
+'lire_la_breve' => 'Lire la br&egrave;ve',\r
+'lire_l_article' => 'Lire l\'article',\r
+'liste_sites_par' => 'Liste compl&egrave;te des sites pr&eacute;sent&eacute;e par',\r
+'liste_afficher_triant_par' => 'Afficher la liste en s&eacute;lectionnant et en triant les sites par :',\r
+'login' => 'Login',\r
+\r
+\r
+// M\r
+'masquer_breves' => 'Masquer les br&egrave;ves',\r
+'masquer_sites' => 'Masquer les sites',\r
+'messages_forums' => 'messages dans les forums',\r
+'messages_forum' => 'Messages du forum',\r
+'mis_a_jour' => 'Mis &agrave; jour le',\r
+'mot_clef' => 'Mot-cl&eacute;',\r
+\r
+\r
+// N\r
+'newsletter' => 'Newsletter',\r
+\r
+\r
+// O\r
+'ordre_alphabetique' => 'ordre alphab&eacute;tique',\r
+'ordre_alphabetique2' => 'Ordre alphab&eacute;tique',\r
+\r
+\r
+// P\r
+'page_reservee' => 'Cette partie est en acc&egrave;s restreint',\r
+'portfolio' => 'Portfolio',\r
+'presentation_des' => 'Pr&eacute;sentation des',\r
+'publie_le' => 'Publi&eacute; le',\r
+\r
+\r
+// R\r
+'recherche' => 'Recherche',\r
+'recherche_mots' => 'Recherche par mots-cl&eacute;s',\r
+'repondre_article' => 'R&eacute;agir &agrave; cet article',\r
+'repondre_breve' => 'R&eacute;agir &agrave; cette br&egrave;ve',\r
+'repondre_message' => 'R&eacute;pondre &agrave; ce message',\r
+\r
+\r
+// S\r
+'se_connecter' => 'Se connecter',\r
+'se_deconnecter' => 'Se d&eacute;connecter',\r
+'selection_des' => 'S&eacute;lection des',\r
+'sites_associes' => 'sites associ&eacute;s au mot cl&eacute; :',\r
+'sites_par' => 'sites par :',\r
+'sites_references' => 'sites r&eacute;f&eacute;renc&eacute;s',\r
+'squelette_beespip' => 'Squelette BeeSpip',\r
+'supprimer' => 'Supprimer',\r
+'syndic' => 'Syndication',\r
+\r
+\r
+// V\r
+'version' => 'v.',\r
+'voir_article_syndic' => 'Consulter l\'article int&eacute;gral',\r
+);\r
+\r
+\r
+?>\r
diff --git a/www/plugins/beespip/lang/beespip_it.php b/www/plugins/beespip/lang/beespip_it.php
new file mode 100755 (executable)
index 0000000..d98f3d2
--- /dev/null
@@ -0,0 +1 @@
+<?php\r\r// This is a SPIP language file  --  Ceci est un fichier langue de SPIP\r\r$GLOBALS[$GLOBALS['idx_lang']] = array(\r\r\r// A\r'acces_restreint' => 'Questa parte &egrave; in accesso ristretto',\r'accueil' => 'Homepage',\r'actualites' => 'Notizie;',\r'afficher_breves' => 'Visualizzare il notiziario',\r'afficher_sites' => 'Visualizzare i siti',\r'article_pdf' => 'Articolo in formato PDF',\r'article_min' => 'articolo',\r'articles_min' => 'articoli',\r'articles2' => 'Articolo(i)',\r'aucun_article' => 'Nessun articolo',\r'aucun_message' => 'Nessun messaggio',\r\r\r// C \r'ce_lien_rss' => 'Questo link le permette di annunciare sul suo sito, le notizie relative al tema corrispondente via informazioni in continuo (feed rss)',\r'commentaire' => 'commento', \r'commentaires' => 'commenti', \r'consulter_detail_auteur' => 'Consultare la scheda di quest\'autore',\r'consulter_detail_syndic' => 'Consultare i dettagli di questo sito',\r'consulter_syndic' => 'Consultare i files di syndication',\r'contributions_forums' => 'Questa pagine raggruppa tutte le contribuzioni ai forum degli articoli e notiziari del sito e indicare gli ultimi messaggi inviati. I titoli degli articoli e notiziari ai quali si rimandano le contribuzioni permettono di visualizzarne le pagine per rilegerne il contenuto',\r\r// D\r'dernieres_publi' => 'Ultime pubblicazioni il',\r'derniers_messages' => 'Ultimi messaggi',\r\r\r// E\r'elle_contient' => 'Contiene',\r'erreur' => 'Errore',\r'erreur404' => 'La pagina chiesta non esiste.',\r'espace_prive' => 'Spazi redattori',\r'evitement_contenu' => 'Vai ai messaggi',\r'evitement_navigation' => 'Vai al menu',\r'evitement_recherche' => 'Vai  a ricerca',\r\r// F\r'fermer_fenetre' => 'Chiudere la finestra',\r'forums' => 'Forum',\r\r\r// I\r'il_y_a' => 'C\'&egrave;',\r'index' => 'Indice',\r\r\r// L\r'lactu_en_bref' => 'Le notizie in breve',\r'lactu_web' => 'Le notizie sul web', \r'lactu_web_descriptif' => 'Questa pagina raggruppa degli links che portano a degli articoli pubblicati recentement nei feed rss tratti da siti ai quali il sito che consulta si &egrave; abbonato.',\r'les_derniers_articles' => 'Gli ultimi articoli del sito :',\r'les_auteurs' => 'Gli autori',\r'les_autres_articles' => 'Gli altri articoli di questa rubrica :',\r'elements_similaires' => 'Gli elementi che portano su soggetti simili :',\r'lire_la_breve' => 'Legere il notiziario',\r'lire_l_article' => 'Leggere l\'articolo',\r'liste_sites_par' => 'Elenco completo dei siti presentati da',\r'login' => 'Login',\r\r\r// M\r'masquer_breves' => 'Nascondere il notiziario',\r'masquer_sites' => 'Nascondere i siti',\r'messages_forums' => 'messaggi nei forum',\r'messages_forum' => 'Messaggi del forum',\r'mis_a_jour' => 'Aggiornato il',\r'mot_clef' => 'Parola chiave',\r\r\r// N\r'newsletter' => 'Newsletter',\r\r\r// O\r'ordre_alphabetique' => 'ordine alfabetico',\r'ordre_alphabetique2' => 'Ordine alfabetico',\r\r\r// P\r'page_reservee' => 'Questa parte è in acesso ristretto',\r'portfolio' => 'Portfolio',\r'presentation_des' => 'Presentazione di',\r'publie_le' => 'Pubblicato il',\r\r\r// R\r'recherche' => 'Ricerca',\r'recherche_mots' => 'Ricerca con parole chiave',\r'repondre_article' => 'Reagire a quest\'articolo',\r'repondre_breve' => 'Reagire a questa notizia',\r\r\r// S\r'se_connecter' => 'Entrare',\r'se_deconnecter' => 'Uscire',\r'selection_des' => 'Selezione di',\r'sites_associes' => 'siti associati a parole chiave :',\r'sites_par' => 'siti da :',\r'sites_references' => 'siti acclusi',\r'squelette_beespip' => 'Squelettro BeeSpip',\r'syndic' => 'Syndication',\r\r\r// V\r'version' => 'v.', \r'voir_article_syndic' => 'Consultare l\'articolo integrale',\r);\r\r\r?>\r
\ No newline at end of file
diff --git a/www/plugins/beespip/lang/paquet-beespip_fr.php b/www/plugins/beespip/lang/paquet-beespip_fr.php
new file mode 100755 (executable)
index 0000000..cad7c03
--- /dev/null
@@ -0,0 +1,21 @@
+<?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_/compositions/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'beespip_description' => 'Ce plugin active ou d&eacute;sactive le squelette BeeSpip. Fonctionne avec Spip 3 et Spip 2.1.
+_ Ce plugin n&#233;cessite l\'activation du plugin Zpip version 1.7.10 ou plus.
+_ Les plugins suivants sont gérés par les squelettes
+- Accès restreint 3.6.0
+- Agenda 3.6.0
+- Article PDF 0.4.5
+- Crayons 1.13.8
+- Compositions 3.1.0
+- Menus 0.9.2.',
+       'beespip_nom' => 'Squelette Beespip',
+       'beespip_slogan' => 'Ce plugin active ou d&eacute;sactive le squelette BeeSpip. Fonctionne avec Spip 3 et Spip 2.1'
+);
+?>
diff --git a/www/plugins/beespip/modeles/image.html b/www/plugins/beespip/modeles/image.html
new file mode 100755 (executable)
index 0000000..992e0fe
--- /dev/null
@@ -0,0 +1,47 @@
+<BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}>[
+
+(#REM) Cas <imageXX>   : equivalent a <imgXX> pour une image en mode image
+
+][(#INCLUS|=={image}|et{#ENV{emb,''}|non}|oui)
+<span class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[
+        style='float:(#ENV{align}|match{left|right});']>[
+       <a href="(#ENV{lien})"[
+               class="(#ENV{lien_class})"]>]<img src='#URL_DOCUMENT'
+               [ width="(#LARGEUR)"][ height="(#HAUTEUR)"][
+                       title="(#TITRE|attribut_html)"]
+                       alt="[(#TITRE|attribut_html)]" />[(#ENV{lien}|?{</a>})]</span>
+][
+
+(#REM) Cas <embXX> : on est appele ici avec emb=' ' : on veut la legende
+equivalent a un <docXX> pour une image en mode image
+
+][(#INCLUS|=={image}|et{#ENV{emb,''}|oui}|oui)
+#SET{fichier,#URL_DOCUMENT}
+#SET{width,#LARGEUR}
+#SET{height,#HAUTEUR}
+#SET{url,#ENV{lien}}
+<dl class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[ style='float:(#ENV{align}|match{left|right});[width:(#GET{width})]px;']>
+<dt>[<a href="(#GET{url})"[ class="(#ENV{lien_class})"] title='#TYPE_DOCUMENT - [(#TAILLE|taille_en_octets|texte_backend)]'[ type="(#ENV{lien}|?{#ENV{lien_mime},#MIME_TYPE})"]>]<img src='#GET{fichier}' width='#GET{width}' height='#GET{height}' alt='#TYPE_DOCUMENT - [(#TAILLE|taille_en_octets|texte_backend)]' />[(#GET{url}|?{</a>})]</dt>[
+<dt class='#EDIT{titre} spip_doc_titre'[ style='width:(#GET{width})px;']><strong>(#TITRE)</strong></dt>][
+<dd class='#EDIT{descriptif} spip_doc_descriptif'[ style='width:(#GET{width})px;']>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</dd>]
+</dl>
+][
+
+(#REM) Cas des images qu'il faut embed (svg)
+][
+(#INCLUS|=={embed}|oui)
+<div class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})]'[
+style='[(#ENV{align}|match{^(left|right)$}|?{' '})float:#ENV{align};] (#ENV{align,center}|=={center}|?{'',' '})']>
+<object        data='#URL_DOCUMENT' 
+       type='#MIME_TYPE'[
+       width='(#ENV{largeur}?{'', #LARGEUR})'][
+       height='(#ENV{hauteur}?{'', #HAUTEUR})']
+       [(#ENV*|env_to_attributs)] >
+       <param name='src' value='#URL_DOCUMENT' />
+       [(#ID_DOCUMENT|appliquer_filtre{#MIME_TYPE})]
+</object>[
+<div class='spip_doc_titre'><strong>(#TITRE)</strong></div>
+][
+<div class='spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>
+]</div>]
+</BOUCLE_tous>
diff --git a/www/plugins/beespip/modeles/img.html b/www/plugins/beespip/modeles/img.html
new file mode 100755 (executable)
index 0000000..fd770d7
--- /dev/null
@@ -0,0 +1,34 @@
+<BOUCLE_document (DOCUMENTS) {id_document} {mode?} {tout}>
+[(#REM)
+
+       Modele pour <img>
+
+       Si on est en mode "image" ou "vignette", ou appele avec embed=oui,
+       on affiche l'image complete ; sinon le logo
+
+       Si un lien est passe #ENV{lien} on ajoute le a href
+       ou on truque le #URL_DOCUMENT
+
+]
+[(#SET{
+       image,
+               #MODE|match{'image|vignette'}
+               |sinon{#ENV{embed}}
+               |?{' '}
+})][
+
+       (#REM) image complete ?
+
+][(#GET{image}|oui)
+<span class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[ style='float:(#ENV{align}|match{left|right});']>
+[<a href="(#ENV{lien})"[ class="(#ENV{lien_class})"]>]<img src='#URL_DOCUMENT'[ width="(#LARGEUR)"][ height="(#HAUTEUR)"] alt="[(#TITRE|texte_backend)]"[ title="(#TITRE|texte_backend)"] />[(#ENV{lien}|?{</a>})]</span>
+][
+
+       (#REM) sinon logo document + lien + alt + title etc
+
+][(#GET{image}|non)
+       [(#SET{fichier,[(#LOGO_DOCUMENT|extraire_attribut{src})]})]
+       [(#SET{width,[(#LOGO_DOCUMENT|extraire_attribut{width})]})]
+       [(#SET{height,[(#LOGO_DOCUMENT|extraire_attribut{height})]})]
+<span class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[ style='float:(#ENV{align}|match{left|right});']><a href="[(#ENV{lien}|sinon{#URL_DOCUMENT})]"[ (#ENV{lien}|?{'',type="#MIME_TYPE"})][ title="(#TITRE|texte_backend)"]><img src='#GET{fichier}' width='#GET{width}' height='#GET{height}' alt='[(#TITRE|strlen|?{#TITRE {#TYPE_DOCUMENT},#TYPE_DOCUMENT}|attribut_html)]' /></a></span>
+]</BOUCLE_document>
diff --git a/www/plugins/beespip/modeles/lessites.html b/www/plugins/beespip/modeles/lessites.html
new file mode 100755 (executable)
index 0000000..2a5eb5e
--- /dev/null
@@ -0,0 +1,11 @@
+[(#REM) Modele permettant l'affichage des sites avec syndication]
+<BOUCLE_exclus(SITES){syndication=oui}{tout}{doublons}{titre_mot=exclu}></BOUCLE_exclus>
+<B_principale>
+      <BOUCLE_principale(SITES){syndication=oui}{tout}{doublons}{par nom_site}{id_syndic?}>
+                 <div class="liste_bloc"><h3><a href="[(#ID_SYNDIC|generer_url_entite{site})]" title="<:beespip:consulter_detail_syndic:>">#NOM_SITE</a></h3>
+                 [<div class="chapo">(#DESCRIPTIF)</div>]
+                 <INCLURE{fond=inclure/page_lessites}{lang}{id_syndic}{ajax}{doublons}{nbpages=5}></div>
+      </BOUCLE_principale>
+<div class="clear">&nbsp;</div>
+</B_principale>
+
diff --git a/www/plugins/beespip/paquet.xml b/www/plugins/beespip/paquet.xml
new file mode 100755 (executable)
index 0000000..83575f7
--- /dev/null
@@ -0,0 +1,32 @@
+<paquet
+       prefix="beespip"
+       categorie="squelette"
+       version="3.1.0"
+       etat="test"
+       compatibilite="[3.0.1;["
+       logo="prive/themes/spip/images/beespip-32.png"
+       schema="0.50"
+       documentation="http://www.beespip.org"
+>      
+
+       <nom>Squelette Beespip</nom>
+       <!-- Gestion de zones d'acces restreint -->
+
+       <auteur lien="http://www.contingences.com" mail="cgindro@contingences.com">Christophe Gindro - Contingences</auteur>
+
+       <copyright>2004-2012</copyright>
+
+       <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL</licence>
+
+       <pipeline nom="header_prive" inclure="beespip_headline.php" />
+
+       <necessite nom="Z" compatibilite="[1.7;[" />
+       <utilise nom="accesrestreint" compatibilite="[3.6;[" />
+       <utilise nom="agenda" compatibilite="[3.6;[" />
+       <utilise nom="article_pdf" compatibilite="[0.4;[" />
+       <utilise nom="compositions" compatibilite="[3.1;[" />
+       <utilise nom="Crayons" compatibilite="[1.13;[" />
+       <utilise nom="menus" compatibilite="[0.9;[" />
+
+       <menu nom="configurer_beespip" titre="Configurer BeeSpip" parent="menu_squelette" icone="images/beespip_config-16.png" />
+</paquet>
diff --git a/www/plugins/beespip/plugin.xml b/www/plugins/beespip/plugin.xml
new file mode 100755 (executable)
index 0000000..1980e0d
--- /dev/null
@@ -0,0 +1,64 @@
+<plugin>\r
+       <nom>Squelette Beespip</nom>\r
+       <auteur>Christophe Gindro - Contingences - Distribu&eacute; sous licence GNU/GPL</auteur>\r
+       <licence>GNU/GLP</licence>\r
+       <version>3.1.0</version>\r
+       <etat>stable</etat>\r
+       <icon>prive/themes/spip/images/beespip-32.png</icon>\r
+    <description>\r
+       Ce plugin active ou d&eacute;sactive le squelette BeeSpip. Fonctionne avec Spip 3 et Spip 2.1.\r
+_ {{Ce plugin n&#233;cessite l'activation du plugin Zpip version 1.7 ou plus et du plugin CFG version 1.16.0 ou plus}}\r
+_ Les plugins suivants sont gérés par les squelettes\r
+- Accès restreint 3.3\r
+- Agenda 2.3.0\r
+- Article PDF 0.4.5\r
+- Crayons 1.13.1\r
+- Compositions 2.1.6\r
+- Menus 0.9\r
+    </description>\r
+       <options>beespip_options.php</options>\r
+       <prefix>beespip</prefix>\r
+       <version_base>0.50</version_base>\r
+       <install>beespip_administrations.php</install>\r
+<!-- on débranche l'annuaire\r
+       <pipeline>\r
+               <nom>declarer_tables_interfaces</nom>\r
+               <inclure>base/beespip.php</inclure>\r
+       </pipeline>\r
+       <pipeline>\r
+               <nom>declarer_tables_principales</nom>\r
+               <inclure>base/beespip.php</inclure>\r
+       </pipeline>\r
+       <pipeline>\r
+               <nom>declarer_tables_auxiliaires</nom>\r
+               <inclure>base/beespip.php</inclure>\r
+       </pipeline>\r
+       <pipeline>\r
+               <nom>rechercher_liste_des_champs</nom>\r
+               <inclure>base/beespip.php</inclure>\r
+       </pipeline>\r
+-->\r
+    <pipeline>\r
+               <nom>header_prive</nom>\r
+               <action>header_prive</action>\r
+               <inclure>beespip_headline.php</inclure>\r
+       </pipeline>\r
+       <bouton id="beespip" parent="configuration">\r
+               <icone>prive/themes/spip/images/images/beespip_config-24.png</icone>\r
+               <titre>Configurer BeeSpip</titre>\r
+               <url>cfg</url>\r
+               <args>cfg=beespip_config</args>\r
+       </bouton>\r
+       <necessite id="SPIP" version="[2.1;]" />\r
+       <necessite id="cfg" version="[1.16;]" />\r
+       <necessite id="spip_bonux" version="[2.3;]" />\r
+       <necessite id="Z" version="[1.7;]" />\r
+       <utilise id="accesrestreint" version="[3.3;]" />\r
+       <utilise id="agenda" version="[2.3;]" />\r
+       <utilise id="article_pdf" version="[0.4;]" />\r
+       <utilise id="compositions" version="[2.1.6;]" />\r
+       <utilise id="Crayons" version="[1.13;]" />\r
+       <utilise id="mediabox" version="[0.6;]" />\r
+       <utilise id="menus" version="[0.9;]" />\r
+       <chemin dir='' />\r
+</plugin>\r
diff --git a/www/plugins/beespip/prive/squelettes/contenu/configurer_beespip.html b/www/plugins/beespip/prive/squelettes/contenu/configurer_beespip.html
new file mode 100755 (executable)
index 0000000..abb9e21
--- /dev/null
@@ -0,0 +1,7 @@
+<h1 class="grostitre">Configurer Beespip</h1>
+<div class="ajax">
+       [(#ENV{mode}|=={options_affichage}|oui)#FORMULAIRE_CONFIGURER_BEESPIP_OPTIONS_AFFICHAGE]
+       [(#ENV{mode}|=={couleur}|oui)#FORMULAIRE_CONFIGURER_BEESPIP_COULEUR]
+       [(#ENV{mode}|=={''}|oui)#FORMULAIRE_CONFIGURER_BEESPIP]
+</div>
+
diff --git a/www/plugins/beespip/prive/squelettes/navigation/configurer_beespip.html b/www/plugins/beespip/prive/squelettes/navigation/configurer_beespip.html
new file mode 100755 (executable)
index 0000000..fae4cfb
--- /dev/null
@@ -0,0 +1,11 @@
+#BOITE_OUVRIR{'','raccourcis'}
+<h4>Configuration du plugin Beespip.</h4>
+<:beespip:version:>[(#VAL{beespip}|beespip_info_version)]
+
+#BOITE_FERMER
+
+#BOITE_OUVRIR{'','raccourcis'}
+               <ul>[<li><a href="(#URL_ECRIRE{configurer_beespip})"><:beespip:beespip_config:></a></li>]
+               [<li><a href="(#SELF|parametre_url{mode,options_affichage})"><:beespip:beespip_options_affichage:></a></li>]
+               [<li><a href="(#SELF|parametre_url{mode,couleur})"><:beespip:beespip_couleur:></a></li>]</ul>
+#BOITE_FERMER
diff --git a/www/plugins/beespip/prive/themes/spip/images/beespip-16.png b/www/plugins/beespip/prive/themes/spip/images/beespip-16.png
new file mode 100755 (executable)
index 0000000..05408f9
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/beespip-16.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/beespip-24.png b/www/plugins/beespip/prive/themes/spip/images/beespip-24.png
new file mode 100755 (executable)
index 0000000..5d58f02
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/beespip-24.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/beespip-32.png b/www/plugins/beespip/prive/themes/spip/images/beespip-32.png
new file mode 100755 (executable)
index 0000000..33c7b55
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/beespip-32.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/beespip-64.png b/www/plugins/beespip/prive/themes/spip/images/beespip-64.png
new file mode 100755 (executable)
index 0000000..727c0d6
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/beespip-64.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/beespip_config-16.png b/www/plugins/beespip/prive/themes/spip/images/beespip_config-16.png
new file mode 100755 (executable)
index 0000000..6e5975d
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/beespip_config-16.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/beespip_config-24.png b/www/plugins/beespip/prive/themes/spip/images/beespip_config-24.png
new file mode 100755 (executable)
index 0000000..67a26b3
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/beespip_config-24.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/beespip_config-32.png b/www/plugins/beespip/prive/themes/spip/images/beespip_config-32.png
new file mode 100755 (executable)
index 0000000..054088d
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/beespip_config-32.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/beespip_config-64.png b/www/plugins/beespip/prive/themes/spip/images/beespip_config-64.png
new file mode 100755 (executable)
index 0000000..67fa6d0
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/beespip_config-64.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/color.png b/www/plugins/beespip/prive/themes/spip/images/color.png
new file mode 100755 (executable)
index 0000000..809fb00
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/color.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/couleur.png b/www/plugins/beespip/prive/themes/spip/images/couleur.png
new file mode 100755 (executable)
index 0000000..2784c56
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/couleur.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/entete.png b/www/plugins/beespip/prive/themes/spip/images/entete.png
new file mode 100755 (executable)
index 0000000..4815f62
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/entete.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/grid.gif b/www/plugins/beespip/prive/themes/spip/images/grid.gif
new file mode 100755 (executable)
index 0000000..78b54c0
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/grid.gif differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/meta100.png b/www/plugins/beespip/prive/themes/spip/images/meta100.png
new file mode 100755 (executable)
index 0000000..72bea40
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/meta100.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/options.png b/www/plugins/beespip/prive/themes/spip/images/options.png
new file mode 100755 (executable)
index 0000000..62af41a
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/options.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/page_accueil.png b/www/plugins/beespip/prive/themes/spip/images/page_accueil.png
new file mode 100755 (executable)
index 0000000..973b409
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/page_accueil.png differ
diff --git a/www/plugins/beespip/prive/themes/spip/images/picker.png b/www/plugins/beespip/prive/themes/spip/images/picker.png
new file mode 100755 (executable)
index 0000000..de0127b
Binary files /dev/null and b/www/plugins/beespip/prive/themes/spip/images/picker.png differ
diff --git a/www/plugins/beespip/structure.html b/www/plugins/beespip/structure.html
new file mode 100755 (executable)
index 0000000..82352d9
--- /dev/null
@@ -0,0 +1,20 @@
+#SET{intranet,non}<BOUCLE_zones(ZONES?){publique=oui}><BOUCLE_intranet(ZONES zones_rubriques?){id_zone}{id_rubrique=0}{0,1}>#SET{intranet,oui}</BOUCLE_intranet></BOUCLE_zones>[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+<INCLURE{fond=head/#ENV{type},env}>
+<INCLURE{fond=inclure/head}>
+</head>
+<body class="page_#ENV{type,page}[ #ENV{type,page}_(#ENV{composition,''})]">
+[(#SESSION{id_auteur}|oui|ou{#GET{intranet}|=={'non'}|oui})<INCLURE{fond=body,env}{intranet=#GET{intranet}}>]
+[(#SESSION{id_auteur}|non|et{#GET{intranet}|=={'oui'}|oui})
+       [(#ENV{composition}|=={'spip_pass'}|oui)<INCLURE{fond=body,env}{acces=reserve}>]
+       [(#ENV{composition}|=={'spip_pass'}|non)[(#INCLURE{fond=body,env}{type=page}{composition=login}{url=#SELF}{acces=reserve})]]
+]
+
+#SPIP_CRON
+</body>
+</html>
+(#EVAL{#VAL{var_zajax}|_request}|non)][
+<INCLURE{fond=#VAL{var_zajax}|_request|concat{'/',#ENV{type}},env}>
+(#EVAL{#VAL{var_zajax}|_request}|oui)]
+
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
diff --git a/www/plugins/menus_1/action/editer_menu.php b/www/plugins/menus_1/action/editer_menu.php
new file mode 100644 (file)
index 0000000..b93b43e
--- /dev/null
@@ -0,0 +1,144 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Action de création / Modification d'un menu
+ * @param unknown_type $arg
+ * @return unknown_type
+ */
+function action_editer_menu_dist($arg=null) {
+
+       if (is_null($arg)){
+               $securiser_action = charger_fonction('securiser_action', 'inc');
+               $arg = $securiser_action();
+       }
+
+       // si id_menu n'est pas un nombre, c'est une creation
+       if (!$id_menu = intval($arg)) {
+               $id_menu = insert_menu();
+       }
+
+       // Enregistre l'envoi dans la BD
+       if ($id_menu > 0) $err = menu_set($id_menu);
+
+       // S'il y a un fichier on tente d'importer son contenu
+       if ($_FILES['import']){
+               $fichier = $_FILES['import']['tmp_name'];
+               $yaml = '';
+               lire_fichier($fichier, $yaml);
+               // Si on a bien recupere une chaine on tente de la decoder
+               if ($yaml){
+                       include_spip('inc/yaml');
+                       $entrees = yaml_decode($yaml);
+                       // Si le decodage marche on importe alors le contenu
+                       if (is_array($entrees)){
+                               menus_importer($entrees, $id_menu);
+                       }
+               }
+       }
+
+       if (_request('redirect')) {
+               $redirect = parametre_url(urldecode(_request('redirect')),
+                       'id_menu', $id_menu, '&') . $err;
+
+               include_spip('inc/headers');
+               redirige_par_entete($redirect);
+       }
+       else
+               return array($id_menu,$err);
+}
+
+/**
+ * Appelle la fonction de modification d'un menu
+ *
+ * @param int $id_menu
+ * @param unknown_type $set
+ * @return $err
+ */
+function menu_set($id_menu, $set=null) {
+       $err = '';
+
+       $c = array();
+       foreach (array(
+               'titre',
+               'identifiant',
+               'css'
+       ) as $champ)
+               $c[$champ] = _request($champ,$set);
+
+       include_spip('inc/modifier');
+       revision_menu($id_menu, $c);
+
+       return $err;
+}
+
+/**
+ * Crée un nouveau menu et retourne son ID
+ *
+ * @return int id_menu
+ */
+function insert_menu() {
+       $champs = array('titre'=>''); // eviter le bug de req/sqlite < 2.1.3
+       // Envoyer aux plugins
+       $champs = pipeline('pre_insertion',
+               array(
+                       'args' => array(
+                               'table' => 'spip_menus',
+                       ),
+                       'data' => $champs
+               )
+       );
+       $id_menu = sql_insertq("spip_menus");
+
+       return $id_menu;
+}
+
+/**
+ * Enregistre une révision de menu
+ *
+ * @param int $id_menu
+ * @param array $c
+ * @return
+ */
+function revision_menu ($id_menu, $c=false) {
+       $invalideur = "id='id_menu/$id_menu'";
+
+       modifier_contenu('menu', $id_menu,
+               array(
+                       'nonvide' => array('titre' => _T('info_sans_titre')),
+                       'invalideur' => $invalideur
+               ),
+               $c);
+
+       return ''; // pas d'erreur
+}
+
+function menus_importer($entrees, $id_menu){
+       // On lit chaque entree de premier niveau
+       foreach ($entrees as $cle => $entree){
+               // On ajoute cette entree
+               $id_menus_entree = sql_insertq(
+                       'spip_menus_entrees',
+                       array(
+                               'id_menu' => $id_menu,
+                               'rang' => ($cle+1),     // les entrees sont dans l'ordre des rangs
+                               'type_entree' => $entree['type_entree'],
+                               'parametres' => serialize($entree['parametres'])
+                       )
+               );
+
+               // S'il existe un sous-menu pour cette entree on le cree
+               if (is_array($entree['sous_menu'])){
+                       $id_sous_menu = sql_insertq(
+                               'spip_menus',
+                               array(
+                                       'id_menus_entree' => $id_menus_entree
+                               )
+                       );
+                       // Puis dedans on importe les entrees correspondantes
+                       menus_importer($entree['sous_menu'], $id_sous_menu);
+               }
+       }
+}
+?>
\ No newline at end of file
diff --git a/www/plugins/menus_1/action/editer_menus_entree.php b/www/plugins/menus_1/action/editer_menus_entree.php
new file mode 100644 (file)
index 0000000..8219c83
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Action de création / Modification d'une entrée de menu
+ * @param unknown_type $arg
+ * @return unknown_type
+ */
+function action_editer_menus_entree_dist($arg=null) {
+
+       $securiser_action = charger_fonction('securiser_action', 'inc');
+       $arg = $securiser_action();
+
+       // si id_menus_entree n'est pas un nombre, c'est une creation
+       if (!$id_menus_entree = intval($arg)) {
+               $id_menu = _request('id_menu_nouvelle_entree') ? _request('id_menu_nouvelle_entree') : _request('id_menu');
+               if(intval($id_menu)){
+                       $id_menus_entree = insert_menus_entree($id_menu);
+               }
+       }
+
+       // Enregistre l'envoi dans la BD
+       if ($id_menus_entree > 0)
+               $err = menus_entree_set($id_menus_entree);
+
+       if (_request('redirect')) {
+               $redirect = parametre_url(urldecode(_request('redirect')),
+                       'id_menus_entree', $id_menus_entree, '&') . $err;
+
+               include_spip('inc/headers');
+               redirige_par_entete($redirect);
+       }
+       else
+               return array($id_menus_entree,$err);
+}
+
+/**
+ * Crée une nouvelle entree de menu et retourne son ID
+ *
+ * @return int id_menus_entree
+ */
+function insert_menus_entree($id_menu) {
+       // Envoyer aux plugins
+       $champs = pipeline('pre_insertion',
+               array(
+                       'args' => array(
+                               'table' => 'spip_menus_entrees',
+                       ),
+                       'data' => $champs
+               )
+       );
+
+       $id_menus_entree = sql_insertq("spip_menus_entrees",array('id_menu'=>$id_menu));
+
+       return $id_menus_entree;
+}
+
+/**
+ * Appelle la fonction de modification d'une entrée de menu
+ *
+ * @param int $id_menu_entree
+ * @param unknown_type $set
+ * @return $err
+ */
+function menus_entree_set($id_menus_entree, $set=null) {
+       $err = '';
+
+       $c = array();
+       $c['id_menu'] = _request('id_menu_nouvelle_entree');
+
+       foreach (array(
+               'rang',
+               'type_entree',
+               'parametres'
+       ) as $champ)
+               $c[$champ] = _request($champ, $set);
+
+       $c['parametres'] = is_array($c['parametres']) ? $c['parametres'] : array();
+       $c['parametres'] = serialize($c['parametres']);
+
+       include_spip('inc/menus');
+       $entrees = menus_lister_disponibles();
+       $infos = $entrees[$c['type_entree']];
+
+       include_spip('inc/modifier');
+       revision_menus_entree($id_menus_entree, $c);
+
+       return $err;
+}
+
+/**
+ * Enregistre une révision d'entree de menu
+ *
+ * @param int $id_menus_entree
+ * @param array $c
+ * @return
+ */
+function revision_menus_entree ($id_menus_entree, $c=false) {
+       $invalideur = "id='id_menus_entree/$id_menus_entree'";
+
+       modifier_contenu('menus_entree', $id_menus_entree,
+               array(
+                       'invalideur' => $invalideur
+               ),
+               $c);
+
+       return ''; // pas d'erreur
+}
+?>
\ No newline at end of file
diff --git a/www/plugins/menus_1/action/exporter_menu.php b/www/plugins/menus_1/action/exporter_menu.php
new file mode 100644 (file)
index 0000000..b24f21a
--- /dev/null
@@ -0,0 +1,72 @@
+<?php 
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function action_exporter_menu_dist(){
+       
+       $securiser_action = charger_fonction('securiser_action', 'inc');
+       $arg = $securiser_action();
+       $id_menu = intval($arg);
+       $export = '';
+       
+       if ($id_menu > 0){
+               include_spip('base/abstract_sql');
+               include_spip('inc/yaml');
+               
+               // On récupère l'identifiant du menu pour le nom de fichier
+               $identifiant = sql_getfetsel(
+                       'identifiant',
+                       'spip_menus',
+                       'id_menu = '.$id_menu
+               );
+               
+               // On calcule le tableau des entrees
+               $entrees = exporter_menu_recursif($id_menu);
+               
+               // On envode en yaml
+               $export = yaml_encode($entrees);
+       }
+       
+       Header("Content-Type: text/x-yaml;");
+       Header("Content-Disposition: attachment; filename=menu-$identifiant.yaml");
+       Header("Content-Length: ".strlen($export));
+       echo $export;
+       exit();
+       
+}
+
+function exporter_menu_recursif($id_menu){
+       $entrees = sql_allfetsel(
+               'id_menus_entree, type_entree, parametres',
+               'spip_menus_entrees',
+               'id_menu = '.$id_menu,
+               '',
+               'rang'
+       );
+       
+       // Pour chaque entree on nettoie et on ajoute le sous-menu eventuel
+       foreach ($entrees as $cle => $entree){
+               // On remet au propre les parametres
+               $entrees[$cle]['parametres'] = unserialize($entree['parametres']);
+               
+               // On regarde s'il existe un sous-menu
+               $id_sous_menu = intval(sql_getfetsel(
+                       'id_menu',
+                       'spip_menus',
+                       'id_menus_entree = '.$entree['id_menus_entree']
+               ));
+               
+               // Si le menu existe, il faut l'ajouter au tableau
+               if ($id_sous_menu > 0){
+                       $entrees[$cle]['sous_menu'] = exporter_menu_recursif($id_sous_menu);
+               }
+               
+               // On enleve id_menus_entree car on en a pas besoin
+               unset($entrees[$cle]['id_menus_entree']);
+       }
+       
+       return $entrees;
+}
+
+?>
diff --git a/www/plugins/menus_1/action/supprimer_menu.php b/www/plugins/menus_1/action/supprimer_menu.php
new file mode 100644 (file)
index 0000000..086fea4
--- /dev/null
@@ -0,0 +1,19 @@
+<?php 
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function action_supprimer_menu_dist(){
+       
+       $securiser_action = charger_fonction('securiser_action', 'inc');
+       $arg = $securiser_action();
+       $id_menu = intval($arg);
+       
+       if ($id_menu > 0){
+               include_spip('inc/menus');
+               menus_supprimer_menu($id_menu);
+       }
+       
+}
+
+?>
\ No newline at end of file
diff --git a/www/plugins/menus_1/balise/menus_afficher_entree.php b/www/plugins/menus_1/balise/menus_afficher_entree.php
new file mode 100644 (file)
index 0000000..81ac857
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function balise_MENUS_AFFICHER_ENTREE_dist($p) {
+       
+       $contexte = interprete_argument_balise(1,$p);
+       $id_menus_entree = champ_sql('id_menus_entree', $p);
+       $type_entree = champ_sql('type_entree', $p);
+       $parametres = champ_sql('parametres', $p);
+       
+       // Par défaut ça affiche le mode du menu public
+       if ($contexte != "'appel_formulaire'")
+               $contexte = "'appel_menu'";
+       
+       $p->code =  "(!$id_menus_entree) ? _T('zbug_champ_hors_motif', array('champ'=>'AFFICHER_ENTREE', 'motif'=>'MENUS_ENTREES')) : recuperer_fond(
+               'menus/'.$type_entree,
+               array_merge(unserialize($parametres), array($contexte=>true, env=>\$Pile[0]))
+       )";
+       
+       return $p;
+    
+}
+
+?>
diff --git a/www/plugins/menus_1/base/menus_tables.php b/www/plugins/menus_1/base/menus_tables.php
new file mode 100644 (file)
index 0000000..0bca5d4
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function menus_declarer_tables_interfaces($interface){
+       // 'spip_' dans l'index de $tables_principales
+       $interface['table_des_tables']['menus']='menus';
+       $interface['table_des_tables']['menus_entrees']='menus_entrees';
+       
+       // Titres
+       $interface['table_titre']['menus'] = 'titre, "" as lang';
+       
+       return $interface;
+}
+
+function menus_declarer_tables_principales($tables_principales){
+       //-- Table menus -----------------------------------------------------------
+       $menus = array(
+               "id_menu" => "bigint(21) NOT NULL",
+               "id_menus_entree" => "bigint(21) DEFAULT '0' NOT NULL",
+               "titre" => "text DEFAULT '' NOT NULL",
+               "identifiant" => "varchar(255) default '' not null",
+               "css" => "tinytext DEFAULT '' NOT NULL"
+       );
+       
+       $menus_cles = array(
+               "PRIMARY KEY" => "id_menu",
+               "KEY id_menus_entree" => "id_menus_entree"
+       );
+       
+       $tables_principales['spip_menus'] = array(
+               'field' => &$menus,
+               'key' => &$menus_cles
+       );
+       
+       // Table menus_elements ----------------------------------------------------
+       $menus_entrees = array(
+               "id_menus_entree" => "bigint(21) NOT NULL",
+               "id_menu" => "bigint(21) DEFAULT '0' NOT NULL",
+               "rang" => "smallint DEFAULT '1' NOT NULL",
+               "type_entree" => "tinytext DEFAULT '' NOT NULL",
+               "parametres" => "text DEFAULT '' NOT NULL"
+       );
+       
+       $menus_entrees_cles = array(
+               "PRIMARY KEY" => "id_menus_entree",
+               "KEY id_menu" => "id_menu"
+       );
+       
+       $tables_principales['spip_menus_entrees'] = array(
+               'field' => &$menus_entrees,
+               'key' => &$menus_entrees_cles
+       );
+
+       return $tables_principales;
+}
+
+?>
diff --git a/www/plugins/menus_1/css/menuspip.css b/www/plugins/menus_1/css/menuspip.css
new file mode 100644 (file)
index 0000000..eeaa285
--- /dev/null
@@ -0,0 +1,58 @@
+
+.formulaire_editer_menu_entrees{
+       position:relative;
+}
+.formulaire_editer_menu_entrees .image_loading{
+       position:absolute;
+       top:50%;
+       left:50%;
+}
+
+.formulaire_spip ul.menus_entrees{
+       clear:both;
+}
+.formulaire_spip ul.menus_entrees ul.menus_entrees{
+       border-left:1px solid #ccc;
+       border-top:1px solid #ccc;
+}
+
+.formulaire_spip ul.menus_entrees li.entree{
+       clear:both;
+       padding-left : 34px;
+       padding-right:0;
+       padding-bottom:0;
+       background-position:5px 10px;
+       background-repeat:no-repeat;
+       border-bottom:1px solid #ccc;
+}
+
+.formulaire_spip ul.menus_entrees .ligne{
+       position:relative;
+}
+
+.formulaire_spip ul.menus_entrees .actions{
+       position:absolute;
+       right:5px;
+       top:5px;
+       text-align:right;
+}
+
+.formulaire_spip ul.menus_entrees .titre{
+       font-weight:bold;
+       line-height:29px;
+}
+.formulaire_spip ul.menus_entrees .infos{
+       font-size:0.9em;
+       margin-bottom:5px;
+}
+
+.formulaire_spip ul.menus_entrees .actions button{
+       border:none;
+       padding:0;
+       margin:0;
+       cursor:pointer;
+
+}
+.formulaire_spip ul.menus_entrees img{
+       vertical-align:middle;
+}
diff --git a/www/plugins/menus_1/formulaires/configurer_menus.html b/www/plugins/menus_1/formulaires/configurer_menus.html
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/www/plugins/menus_1/formulaires/configurer_menus.php b/www/plugins/menus_1/formulaires/configurer_menus.php
new file mode 100644 (file)
index 0000000..7c82054
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+function formulaires_configurer_menus_saisies_dist(){
+       include_spip('inc/menus');
+       include_spip('inc/config');
+       
+       // Récupérer les entrées existantes
+       $entrees = menus_lister_disponibles();
+       
+       // Trier les entrées par rang
+       uasort($entrees, create_function('$a, $b', '$a = $a["rang"]; $b = $b["rang"]; return ($a==$b)?0:($a<$b?-1:1);'));
+       
+       // Remplir la liste des cases
+       $data = array();
+       foreach ($entrees as $type_entree=>$entree){
+               $data[$type_entree] = '<img src="'.$entree['icone'].'" /> '.$entree['nom'];
+       }
+       
+       $saisies = array(
+               array(
+                       'saisie' => 'checkbox',
+                       'options' => array(
+                               'nom' => 'entrees_masquees',
+                               'explication' => 'Cochez les entrées que vous voulez <strong>masquer</strong> lors de la création d\'un menu.',
+                               'datas' => $data,
+                               'li_class' => 'pleine_largeur',
+                               'defaut' => lire_config('menus/entrees_masquees',array())
+                       )
+               )
+       );
+       
+       return $saisies;
+}
+
+?>
diff --git a/www/plugins/menus_1/formulaires/editer_menu.html b/www/plugins/menus_1/formulaires/editer_menu.html
new file mode 100644 (file)
index 0000000..55e1a0c
--- /dev/null
@@ -0,0 +1,74 @@
+<div class="formulaire_spip formulaire_editer [formulaire_(#ENV{form})][ formulaire_(#ENV{form})-#ENV{id_menu,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}}
+
+                       <ul>
+                               <li class="fieldset">
+                                       <fieldset>
+                                               <h3 class="legend"><:menus:formulaire_partie_identification:></h3>
+                                               <ul>
+                                                       #SET{obli,'obligatoire'}
+                                                       #SET{name,titre}
+                                                       #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                                                       <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                                                               <label for="#GET{name}"><:menus:formulaire_titre:></label>
+                                                               [<span class='erreur_message'>(#GET{erreurs})</span>]
+                                                               <input type="text" class="text multilang" name="#GET{name}" id="#GET{name}" size="40" value="#ENV{#GET{name}}" />
+                                                       </li>
+
+                                                       #SET{name,identifiant}
+                                                       #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                                                       <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
+                                                               <label for="#GET{name}"><:menus:formulaire_identifiant:></label>
+                                                               <div class="explication"><:menus:formulaire_identifiant_explication:></div>
+                                                               [<span class='erreur_message'>(#GET{erreurs})</span>]
+                                                               <input type="text" class="text" name="#GET{name}" id="#GET{name}" size="40" value="#ENV{#GET{name}}" />
+                                                       </li>
+
+                                                       #SET{name,css}
+                                                       #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                                                       <li class="editer editer_[(#GET{name})][ (#GET{erreurs}|oui)erreur]">
+                                                               <label for="#GET{name}"><:menus:formulaire_css:></label>
+                                                               <div class="explication"><:menus:formulaire_css_explication:></div>
+                                                               [<span class='erreur_message'>(#GET{erreurs})</span>]
+                                                               <input type="text" class="text" name="#GET{name}" id="#GET{name}" size="40" value="#ENV{#GET{name}}" />
+                                                       </li>
+
+                                                       [(#REM) Seulement si c'est un nouveau et qu'il y a le plugin YAML)]
+                                                       [(#ENV{nouveau}|oui)
+                                                               [(#PLUGIN{yaml}|oui)
+                                                                       #SET{name,import}
+                                                                       #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+                                                                       <li class="editer editer_[(#GET{name})][ (#GET{erreurs}|oui)erreur]">
+                                                                               <label for="#GET{name}"><:menus:formulaire_importer:></label>
+                                                                               <div class="explication"><:menus:formulaire_importer_explication:></div>
+                                                                               [<span class='erreur_message'>(#GET{erreurs})</span>]
+                                                                               <input type="file" class="file" name="#GET{name}" id="#GET{name}" size="20" value="#ENV{#GET{name}}" />
+                                                                       </li>
+                                                               ]
+                                                       ]
+                                               </ul>
+
+                                               <p class='boutons'>
+                                                       <input type='submit' class='submit' value='<:bouton_enregistrer:>' />
+                                               </p>
+                                       </fieldset>
+                               </li>
+                       </ul>
+               </div></form>
+               ]
+</div>
+<script type="text/javascript">
+       $(function(){
+               $('.formulaire_#ENV{form}'+' .boutons').hide();
+               $('.formulaire_#ENV{form}'+' input')
+                       .change(function(){$('.formulaire_#ENV{form}'+' .boutons').slideDown();})
+                       .keydown(function(){$('.formulaire_#ENV{form}'+' .boutons').slideDown();});
+       });
+</script>
\ No newline at end of file
diff --git a/www/plugins/menus_1/formulaires/editer_menu.php b/www/plugins/menus_1/formulaires/editer_menu.php
new file mode 100644 (file)
index 0000000..66e43b7
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/editer');
+
+function formulaires_editer_menu_charger($id_menu, $nouveau){
+       include_spip('base/abstract_sql');
+       include_spip('inc/autoriser');
+       $contexte = array();
+       $contexte['editable'] = true;
+
+       // Seulement si on a le droit de modifier les menus
+       if (autoriser('modifier', 'menu')){
+               $nouveau = ($nouveau == 'oui') ? true : false;
+               $id_menu = intval($id_menu) ? intval($id_menu) : false;
+
+               // Si on demande un id_menu
+               if ($id_menu){
+                       // On désactive de toute façon le nouveau
+                       $nouveau = false;
+
+                       // On teste si le menu existe bien dans les menus principaux
+                       $id_menu_ok = intval(sql_getfetsel(
+                               'id_menu',
+                               'spip_menus',
+                               array(
+                                       array('=', 'id_menu', $id_menu),
+                                       array('=', 'id_menus_entree', 0)
+                               )
+                       ));
+
+                       // S'il n'existe pas
+                       if (!$id_menu_ok){
+                               $contexte['editable'] = false;
+                               $contexte['message_erreur'] = _T('menus:erreur_menu_inexistant', array('id'=>$id_menu));
+                       }
+               }
+               elseif (!$nouveau){
+                       $contexte['editable'] = false;
+                       $contexte['message_erreur'] = _T('menus:erreur_parametres');
+               }
+
+               // Si on peut bien éditer le menu, on déclare ce qu'il faut
+               if ($contexte['editable']){
+                       $contexte['id_menu'] = $id_menu;
+                       $contexte['nouveau'] = $nouveau;
+
+                       // Les champs du menu principal
+                       $contexte['titre'] = '';
+                       $contexte['identifiant'] = '';
+                       $contexte['css'] = '';
+                       $contexte['import'] = '';
+
+                       $valeurs = formulaires_editer_objet_charger('menu',$id_menu,0,0,'', '', '', '');
+
+                       $contexte = array_merge($contexte, $valeurs);
+
+                       // Déclarer l'action pour SPIP 2.0
+                       $contexte['_action'] = array('editer_menu', $id_menu);
+                       // On sait toujours si on est sur un menu déjà créé ou pas
+                       $contexte['_hidden'] .= '<input type="hidden" name="id_menu" value="'.$id_menu.'" />';
+               }
+       }
+       else{
+               $contexte['editable'] = false;
+               $contexte['message_erreur'] = _T('menus:erreur_autorisation');
+       }
+
+       return $contexte;
+}
+
+function formulaires_editer_menu_verifier($id_menu, $nouveau){
+       include_spip('base/abstract_sql');
+       $erreurs = array();
+
+       $oblis = array('titre','identifiant');
+       $erreurs = formulaires_editer_objet_verifier('menu',$id_menu,$oblis);
+
+       $identifiant = _request('identifiant');
+
+       // On vérifie que l'identifiant est bon
+       if (!$erreurs['identifiant'] and !preg_match('/^[\w]+$/', $identifiant))
+               $erreurs['identifiant'] = _T('menus:erreur_identifiant_forme');
+       // On vérifie que l'identifiant n'est pas déjà utilisé
+       if (!$erreurs['identifiant']){
+               $deja = sql_getfetsel(
+                       'id_menu',
+                       'spip_menus',
+                       array(
+                               'identifiant = '.sql_quote($identifiant),
+                               'id_menu > 0',
+                               'id_menu !='.intval(_request('id_menu'))
+                       )
+               );
+               if ($deja)
+                       $erreurs['identifiant'] = _T('menus:erreur_identifiant_deja');
+       }
+
+       return $erreurs;
+}
+
+function formulaires_editer_menu_traiter($id_menu, $nouveau){
+       $res = formulaires_editer_objet_traiter('menu', $id_menu, 0, 0, '', '', '', '');
+
+       // Si ça va pas on errorise
+       if (!$res['id_menu']){
+               $res['message_erreur'] = _T('menus:erreur_mise_a_jour');
+       }
+       else{
+               // Si on est dans l'espace privé on force la redirection
+               if (_request('exec') == 'menus_editer')
+                       $res['redirect'] = generer_url_ecrire('menus_editer', "id_menu=".$res['id_menu']);
+       }
+       // Dans tous les cas le formulaire est toujours éditable
+       $res['editable'] = true;
+
+       return $res;
+}
+
+?>
diff --git a/www/plugins/menus_1/formulaires/editer_menus_entree.html b/www/plugins/menus_1/formulaires/editer_menus_entree.html
new file mode 100644 (file)
index 0000000..5c5b3a1
--- /dev/null
@@ -0,0 +1,40 @@
+<div class="formulaire_spip formulaire_editer [formulaire_(#ENV{form})][ formulaire_(#ENV{form})-#ENV{id_menu,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}}
+
+               <ul>
+                       <li class="fieldset">
+                               <fieldset>
+                                       <h3 class="legend"><:menus:formulaire_partie_construction:></h3>
+                                       <input style="display:none;" type="submit" class="submit" name="enregistrer" value="<:bouton_enregistrer:>" />
+
+                                       #INCLURE{fond=formulaires/inc-menus_entrees, env}
+                               </fieldset>
+                       </li>
+               </ul>
+       </div></form>
+
+       ]
+</div>
+
+<script type="text/javascript">
+       $(function(){
+               $('.entree .actions').hide();
+               $('.entree .ligne')
+                       .hover(
+                               function(){
+                                       $(this).find('.actions').show();
+                               },
+                               function(){
+                                       $(this).find('.actions').hide();
+                               }
+                       );
+       });
+</script>
\ No newline at end of file
diff --git a/www/plugins/menus_1/formulaires/editer_menus_entree.php b/www/plugins/menus_1/formulaires/editer_menus_entree.php
new file mode 100644 (file)
index 0000000..474976c
--- /dev/null
@@ -0,0 +1,252 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/menus');
+include_spip('inc/editer');
+include_spip('inc/actions');
+
+function formulaires_editer_menus_entree_charger($id_menu,$id_menus_entree='new'){
+       /**
+        * On vérifie si nous ne sommes pas dans une modification
+        * Sinon c'est une création
+        */
+       $id_menus_entree = intval(_request('modifier_entree')) ? _request('modifier_entree') : $id_menus_entree;
+
+       $valeurs = formulaires_editer_objet_charger('menus_entree',$id_menus_entree,0,0,'', '', '', '');
+
+       $valeurs['id_menu'] = $id_menu;
+
+       // Les champs pour les entrées
+
+       $valeurs['parametres'] = array();
+
+       // Des champs pour controler le formulaire
+       $valeurs['demander_nouvelle_entree'] = '';
+       $valeurs['id_menu_nouvelle_entree'] = '';
+       $valeurs['enregistrer'] = '';
+
+       // On a en permanence accès aux infos des types
+       $valeurs['types_entrees'] = menus_lister_disponibles();
+
+       // On sait toujours si on est sur un menu déjà créé ou pas
+       $valeurs['_hidden'] .= '<input type="hidden" name="id_menu" value="'.$id_menu.'" />';
+
+       return $valeurs;
+}
+
+function formulaires_editer_menus_entree_verifier($id_menu,$id_menus_entree='new'){
+       $erreurs = formulaires_editer_objet_verifier('menus_entree',$id_menus_entree,array());
+
+       // Si on demande une nouvelle entree pour un menu --------------------------
+
+       if ($id_menu = intval(_request('demander_nouvelle_entree'))){
+               // S'il n'y a pas encore de type d'entree de choisi
+               if (!($type_entree = _request('type_entree'))){
+                       include_spip('inc/config');
+                       $erreurs['id_menu_nouvelle_entree'] = $id_menu;
+                       // On charge les différents types d'entrées disponibles
+                       $masque = array_flip(lire_config('menus/entrees_masquees', array()));
+                       $erreurs['entrees'] = array_diff_key(menus_lister_disponibles(), $masque);
+                       if (_request('suivant'))
+                               $erreurs['type'] = _T('menus:erreur_type_menu');
+               }
+               // Si on a choisi un type d'entree
+               else{
+                       $erreurs['id_menu_nouvelle_entree'] = $id_menu;
+                       $erreurs['type_entree'] = $type_entree;
+                       // On charge les infos du type choisi
+                       $entrees = menus_lister_disponibles();
+                       $erreurs['infos_'.$type_entree] = $entrees[$type_entree];
+               }
+       }
+
+       // Si on veut modifier une entrée ------------------------------------------
+
+       if ($id_menus_entree = intval(_request('modifier_entree'))){
+               // On va chercher l'existant de cette entrée
+               $entree = sql_fetsel(
+                       'type_entree, parametres',
+                       'spip_menus_entrees',
+                       'id_menus_entree = '.$id_menus_entree
+               );
+               $type_entree = $entree['type_entree'];
+               $parametres = unserialize($entree['parametres']);
+
+               $erreurs = array_merge($erreurs, $parametres);
+               $erreurs['id_menus_entree'] = $id_menus_entree;
+               $erreurs['type_entree'] = $type_entree;
+               // On charge les infos du type choisi
+               $entrees = menus_lister_disponibles();
+               $erreurs['infos_'.$type_entree] = $entrees[$type_entree];
+       }
+
+       // Si on valide une entree pour un menu ------------------------------------
+
+       if (($id_menu = intval(_request('id_menu_nouvelle_entree')) or $id_menus_entree = intval(_request('id_menus_entree'))) and _request('enregistrer')){
+               $type_entree = _request('type_entree');
+               $parametres_envoyes = _request('parametres');
+               $entrees = menus_lister_disponibles();
+               $infos = $entrees[$type_entree];
+               // On teste que chaque paramètre obligatoire est bien renseigné
+               foreach ($infos['parametres'] as $nom=>$parametre){
+                       if ($parametre['obligatoire']){
+                               if (!$parametres_envoyes[$nom]){
+                                       if ($id_menu)
+                                               $erreurs['id_menu_nouvelle_entree'] = $id_menu;
+                                       if ($id_menus_entree)
+                                               $erreurs['id_menus_entree'] = $id_menus_entree;
+                                       $erreurs['type_entree'] = $type_entree;
+                                       $erreurs['infos_'.$type_entree] = $infos;
+                                       $erreurs['parametres'][$nom] = _T('info_obligatoire');
+                               }
+                       }
+               }
+       }
+
+       return $erreurs;
+}
+
+function formulaires_editer_menus_entree_traiter($id_menu,$id_menus_entree='new'){
+       $retours = array();
+
+       // Si on valide une entree pour un menu ------------------------------------
+
+       if (($id_menu = intval(_request('id_menu_nouvelle_entree')) or $id_menus_entree = intval(_request('id_menus_entree'))) and _request('enregistrer')){
+               $res = formulaires_editer_objet_traiter('menus_entree', $id_menus_entree, 0, 0, '', '', '', '');
+               if (!$res['id_menus_entree'])
+                       $retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
+       }
+
+       // Si on demande la supression d'une entrée --------------------------------
+
+       if ($id_menus_entree = intval(_request('supprimer_entree'))){
+               $ok = menus_supprimer_entree($id_menus_entree);
+               if (!$ok)
+                       $retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
+       }
+
+       // Si on demande à déplacer une entrée -------------------------------------
+
+       if ($params = _request('deplacer_entree')){
+               preg_match('/^([\d]+)-(bas|haut)$/', $params, $params);
+               array_shift($params);
+               list($id_menus_entree, $sens) = $params;
+               $id_menus_entree = intval($id_menus_entree);
+
+               // On récupère des infos sur le placement actuel
+               $entree = sql_fetsel(
+                       'id_menu, rang',
+                       'spip_menus_entrees',
+                       'id_menus_entree = '.$id_menus_entree
+               );
+               $id_menu = intval($entree['id_menu']);
+               $rang_actuel = intval($entree['rang']);
+
+               // On teste si ya une entrée suivante
+               $dernier_rang = intval(sql_getfetsel(
+                       'rang',
+                       'spip_menus_entrees',
+                       'id_menu = '.$id_menu,
+                       '',
+                       'rang desc',
+                       '0,1'
+               ));
+
+               // Tant qu'on ne veut pas faire de tour complet
+               if (!($sens == 'bas' and $rang_actuel == $dernier_rang) and !($sens == 'haut' and $rang_actuel == 1)){
+                       // Alors on ne fait qu'échanger deux entrées
+                       $rang_echange = ($sens == 'bas') ? ($rang_actuel + 1) : ($rang_actuel - 1);
+                       $ok = sql_updateq(
+                               'spip_menus_entrees',
+                               array(
+                                       'rang' => $rang_actuel
+                               ),
+                               'id_menu = '.$id_menu.' and rang = '.$rang_echange
+                       );
+                       if ($ok)
+                               $ok = sql_updateq(
+                                       'spip_menus_entrees',
+                                       array(
+                                               'rang' => $rang_echange
+                                       ),
+                                       'id_menus_entree = '.$id_menus_entree
+                               );
+               }
+               // Sinon on fait un tour complet en déplaçant tout
+               else{
+                       if ($sens == 'bas'){
+                               // Tout le monde descend d'un rang
+                               $ok = sql_update(
+                                       'spip_menus_entrees',
+                                       array(
+                                               'rang' => 'rang + 1'
+                                       ),
+                                       'id_menu = '.$id_menu
+                               );
+                               // L'entrée passe tout en haut
+                               if ($ok)
+                                       $ok = sql_updateq(
+                                               'spip_menus_entrees',
+                                               array(
+                                                       'rang' => 1
+                                               ),
+                                               'id_menus_entree = '.$id_menus_entree
+                                       );
+                       }
+                       else{
+                               // Tout le monde monte d'un rang
+                               $ok = sql_update(
+                                       'spip_menus_entrees',
+                                       array(
+                                               'rang' => 'rang - 1'
+                                       ),
+                                       'id_menu = '.$id_menu
+                               );
+                               // L'entrée passe tout en bas
+                               if ($ok)
+                                       $ok = sql_updateq(
+                                               'spip_menus_entrees',
+                                               array(
+                                                       'rang' => $dernier_rang
+                                               ),
+                                               'id_menus_entree = '.$id_menus_entree
+                                       );
+                       }
+               }
+               if (!$ok) $retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
+       }
+
+       // Si on veut faire un sous-menu -------------------------------------------
+
+       if ($id_menus_entree = intval(_request('demander_sous_menu'))){
+               $id_menu = sql_insertq(
+                       'spip_menus',
+                       array(
+                               'id_menus_entree' => $id_menus_entree
+                       )
+               );
+               if (!$id_menu) $retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
+       }
+
+       // Si on veut supprimer un menu --------------------------------------------
+
+       if ($id_menu = intval(_request('supprimer_menu'))){
+               // Est-ce un menu ou un sous-menu ?
+               $sous_menu = intval(sql_getfetsel(
+                       'id_menus_entree',
+                       'spip_menus',
+                       'id_menu = '.$id_menu
+               ));
+               $ok = menus_supprimer_menu($id_menu);
+               if (!$ok) $retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
+               if ($ok and !$sous_menu) $retours['redirect'] = generer_url_ecrire('menus_tous');
+       }
+
+       $retours['editable'] = true;
+
+       return $retours;
+}
+
+?>
diff --git a/www/plugins/menus_1/formulaires/inc-menus_entrees.html b/www/plugins/menus_1/formulaires/inc-menus_entrees.html
new file mode 100644 (file)
index 0000000..c1a4008
--- /dev/null
@@ -0,0 +1,83 @@
+#SET{rang_suivant,1}\r
+<ul id="menu-#ENV{id_menu}" class="menus_entrees">\r
+       <BOUCLE_entrees(MENUS_ENTREES){id_menu}{par rang}>\r
+       <li class="entree"[ style="background-repeat:no-repeat;background-position:5px 10px;background-image:url((#ENV{types_entrees}|table_valeur{#TYPE_ENTREE}|table_valeur{icone}|image_reduire{24}|extraire_attribut{src}))"]>\r
+               <BOUCLE_test_modifier(CONDITION){si #ENV{erreurs}|table_valeur{id_menus_entree}|=={#ID_MENUS_ENTREE}|non}>\r
+               <div class="ligne">\r
+                       <div class="description arial2">\r
+                               #SET{supprimer_seulement,non}\r
+                               [(#CHEMIN{menus/#TYPE_ENTREE.html}|oui)\r
+                               #MENUS_AFFICHER_ENTREE{appel_formulaire}]\r
+                               [(#CHEMIN{menus/#TYPE_ENTREE.html}|non)\r
+                               #SET{supprimer_seulement,oui}\r
+                               #INCLURE{fond=formulaires/inc-menus_entrees_inexistantes,appel_formulaire=oui,titre=#TYPE_ENTREE}\r
+                               ]\r
+                       </div>\r
+                       <div class="actions">\r
+                               [(#REM) S'il y a déjà un sous-menu on ne l'affiche pas ?)]\r
+                               <BOUCLE_sous_menu_test(MENUS){id_menus_entree}>\r
+                               [(#REM) Rien]\r
+                               </BOUCLE_sous_menu_test>\r
+                               [(#GET{supprimer_seulement}|=={non}|oui)\r
+                               [(#ENV{types_entrees}|table_valeur{#TYPE_ENTREE}|table_valeur{refuser_sous_menu}|non)\r
+                               <button name="demander_sous_menu" value="#ID_MENUS_ENTREE" title="<:menus:formulaire_ajouter_sous_menu:>">\r
+                                       [<img height="24" width="24" src="(#CHEMIN{images/menus-24.png})" alt="" />]\r
+                               </button>\r
+                               ]]\r
+                               <//B_sous_menu_test>\r
+                               [(#GET{supprimer_seulement}|=={non}|oui)\r
+                               <button name="modifier_entree" value="#ID_MENUS_ENTREE" title="<:menus:formulaire_modifier_entree:>">\r
+                                       [<img height="24" width="24" src="(#CHEMIN{images/menus_action_modifier.png})" alt="" />]\r
+                               </button>]\r
+                               <button name="supprimer_entree" value="#ID_MENUS_ENTREE" title="<:menus:formulaire_supprimer_entree:>"\r
+                               onclick="return confirm('<:menus:confirmer_supprimer_entree:>')">\r
+                                       [<img height="24" width="24" src="(#CHEMIN{images/menus_action_supprimer.png})" alt="" />]\r
+                               </button>\r
+                               [(#GET{supprimer_seulement}|=={non}|oui)\r
+                               <button name="deplacer_entree" value="#ID_MENUS_ENTREE-bas" title="<:menus:formulaire_deplacer_bas:>">\r
+                                       [<img height="24" width="24" src="(#CHEMIN{images/menus_action_bas.png})" alt="" />]\r
+                               </button>]\r
+                               [(#GET{supprimer_seulement}|=={non}|oui)\r
+                               <button name="deplacer_entree" value="#ID_MENUS_ENTREE-haut" title="<:menus:formulaire_deplacer_haut:>">\r
+                                       [<img height="24" width="24" src="(#CHEMIN{images/menus_action_haut.png})" alt="" />]\r
+                               </button>]\r
+                       </div>\r
+                       <div class="nettoyeur"></div>\r
+               </div>\r
+               </BOUCLE_test_modifier>\r
+               #INCLURE{fond=formulaires/inc-nouvelle_entree-2, env, id_menus_entree=#ID_MENUS_ENTREE}\r
+               <//B_test_modifier>\r
+\r
+               [(#REM) Est-ce qu'il y a un sous-menu ?)]\r
+               <BOUCLE_sous_menu(MENUS){id_menus_entree}>\r
+                       #INCLURE{fond=formulaires/inc-menus_entrees, env, id_menu, sous_menu=oui}\r
+               </BOUCLE_sous_menu>\r
+       </li>\r
+       #SET{rang_suivant,(#RANG|plus{1})}\r
+       </BOUCLE_entrees>\r
+       <li class="editer_entree fieldset">\r
+               #SET{id_menu_nouvelle_entree, (#ENV{erreurs}|table_valeur{id_menu_nouvelle_entree})}\r
+               #SET{type_entree, (#ENV{erreurs}|table_valeur{type_entree})}\r
+\r
+               <BOUCLE_pas_demande_entree(CONDITION){si #GET{id_menu_nouvelle_entree}|=={#ENV{id_menu}}|non}>\r
+                       <div class="boutons">\r
+                       [(#ENV{sous_menu}|non)<span class="image_loading"></span>]\r
+                       [<button type="submit" class="submit link" name="supprimer_menu" value="#ENV{id_menu}">\r
+                               [<img src="(#CHEMIN{images/menus_action_supprimer.png})" alt="" />]\r
+                               (#ENV{sous_menu}|?{<:menus:formulaire_supprimer_sous_menu:>,''})\r
+                       </button>]\r
+                       <button type="submit" class="submit" name="demander_nouvelle_entree" value="#ENV{id_menu}">\r
+                               [<img src="(#CHEMIN{images/menus_action_ajouter.png})" alt="" />]\r
+                               <:menus:formulaire_ajouter_entree:>\r
+                       </button>\r
+                       </div>\r
+               </BOUCLE_pas_demande_entree>\r
+                       [(#GET{type_entree}|non)\r
+                               #INCLURE{fond=formulaires/inc-nouvelle_entree-1, env, id_menu_nouvelle_entree=#GET{id_menu_nouvelle_entree}}\r
+                       ]\r
+                       [(#GET{type_entree}|oui)\r
+                               #INCLURE{fond=formulaires/inc-nouvelle_entree-2, env, id_menu_nouvelle_entree=#GET{id_menu_nouvelle_entree}, rang_suivant=#GET{rang_suivant}}\r
+                       ]\r
+               <//B_pas_demande_entree>\r
+       </li>\r
+</ul>\r
diff --git a/www/plugins/menus_1/formulaires/inc-menus_entrees_inexistantes.html b/www/plugins/menus_1/formulaires/inc-menus_entrees_inexistantes.html
new file mode 100644 (file)
index 0000000..a3aeac3
--- /dev/null
@@ -0,0 +1,11 @@
+[(#SET{titre, <:menus:formulaire_supprimer_entree:>})]
+[(#ENV{titre}|oui)
+       #SET{titre, #ENV*{titre}|typo}
+]
+
+[(#ENV{appel_formulaire}|oui)
+       <div class="erreur_message">
+       <div class="titre">#GET{titre}</div>
+       <div class="infos"><:menus:erreur_type_menu_inexistant:></div>
+       </div>
+]
diff --git a/www/plugins/menus_1/formulaires/inc-nouvelle_entree-1.html b/www/plugins/menus_1/formulaires/inc-nouvelle_entree-1.html
new file mode 100644 (file)
index 0000000..5e47a9f
--- /dev/null
@@ -0,0 +1,23 @@
+
+<ul>
+       <li class="editer pleine_largeur editer_type[(#ENV**{erreurs}|table_valeur{type}|oui)erreur]">
+               <label><:menus:entree_choisir:></label>
+               [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{type})</span>]
+               <BOUCLE_types_entrees(POUR){tableau #ENV{erreurs}|table_valeur{entrees}}{par rang}>
+               <div class="choix menu_#CLE" id="choix_menu_#CLE" style="padding:3px;border-bottom:1px solid #eee;">
+                       [(#VALEUR|table_valeur{icone}|image_reduire{24})]
+                       <input type="radio" class="radio" name="type_entree" id="#CLE" value="#CLE" style="vertical-align:top;" />
+                       <label for="#CLE">[(#VALEUR|table_valeur{nom})]</label>
+               </div>
+               </BOUCLE_types_entrees>
+               <span class='erreur_message'><:menus:erreur_aucun_type:></span>
+               <//B_types_entrees>
+       </li>
+</ul>
+
+<p class='boutons'>
+       <span class='image_loading'></span>
+       <input type="hidden" name="demander_nouvelle_entree" value="#ENV{id_menu_nouvelle_entree}" />
+       <input type="submit" class="submit link" name="demander_nouvelle_entree" value="<:icone_retour:>" />
+       <input type="submit" class="submit" name="suivant" value="<:bouton_suivant:>" />
+</p>
diff --git a/www/plugins/menus_1/formulaires/inc-nouvelle_entree-2.html b/www/plugins/menus_1/formulaires/inc-nouvelle_entree-2.html
new file mode 100644 (file)
index 0000000..5c20913
--- /dev/null
@@ -0,0 +1,38 @@
+
+#SET{type_entree, (#ENV{erreurs}|table_valeur{type_entree})}
+#SET{infos, (#ENV{erreurs}|table_valeur{infos_#GET{type_entree}})}
+<fieldset>
+<legend class="legend">
+       [(#ENV{id_menus_entree}|non)
+               [(#GET{infos}|table_valeur{icone}|image_reduire{24})]
+       ]
+       [<span style="vertical-align:middle;">(#GET{infos}|table_valeur{nom})</span>]
+</legend>
+<div class="explication">[(#GET{infos}|table_valeur{description})]</div>
+<B_parametres>
+<ul>
+       <BOUCLE_parametres(POUR){tableau #GET{infos}|table_valeur{parametres}}>
+       #SET{erreurs,(#ENV**{erreurs}|table_valeur{parametres}|table_valeur{#CLE})}
+       <li class="editer editer_texte[ (#GET{erreurs}|oui)erreur]">
+               <label for="#CLE">[(#VALEUR|table_valeur{label})] [(#VALEUR|table_valeur{obligatoire}|non)&#91;<:menus:formulaire_facultatif:>&#93;]</label>
+               [<span class='erreur_message'>(#GET{erreurs})</span>]
+               <input type="text" class="text[ (#VALEUR|table_valeur{class})]" name="parametres[#CLE]" value="[(#ENV{parametres}|table_valeur{#CLE}|sinon{#ENV{erreurs}|table_valeur{#CLE}}|entites_html)]" />
+       </li>
+       </BOUCLE_parametres>
+</ul>
+</B_parametres>
+
+<p class='boutons'>
+       <span class='image_loading'></span>
+       [(#ENV{id_menu_nouvelle_entree}|oui)
+               <input type="hidden" name="id_menu_nouvelle_entree" value="#ENV{id_menu_nouvelle_entree}" />
+               <input type="hidden" name="rang" value="#ENV{rang_suivant}" />
+       ]
+       [(#ENV{id_menus_entree}|oui)
+               <input type="hidden" name="id_menus_entree" value="#ENV{id_menus_entree}" />
+       ]
+       <input type="hidden" name="type_entree" value="#GET{type_entree}" />
+       <input type="submit" class="submit link" value="<:bouton_annuler:>" />
+       <input type="submit" class="submit" name="enregistrer" value="<:bouton_enregistrer:>" />
+</p>
+</fieldset>
diff --git a/www/plugins/menus_1/images/export.png b/www/plugins/menus_1/images/export.png
new file mode 100644 (file)
index 0000000..22b6ae3
Binary files /dev/null and b/www/plugins/menus_1/images/export.png differ
diff --git a/www/plugins/menus_1/images/menus-16.png b/www/plugins/menus_1/images/menus-16.png
new file mode 100644 (file)
index 0000000..5ead8f7
Binary files /dev/null and b/www/plugins/menus_1/images/menus-16.png differ
diff --git a/www/plugins/menus_1/images/menus-24.png b/www/plugins/menus_1/images/menus-24.png
new file mode 100644 (file)
index 0000000..563d388
Binary files /dev/null and b/www/plugins/menus_1/images/menus-24.png differ
diff --git a/www/plugins/menus_1/images/menus-48.png b/www/plugins/menus_1/images/menus-48.png
new file mode 100644 (file)
index 0000000..a1bc9f9
Binary files /dev/null and b/www/plugins/menus_1/images/menus-48.png differ
diff --git a/www/plugins/menus_1/images/menus-nouveau-24.png b/www/plugins/menus_1/images/menus-nouveau-24.png
new file mode 100644 (file)
index 0000000..544f450
Binary files /dev/null and b/www/plugins/menus_1/images/menus-nouveau-24.png differ
diff --git a/www/plugins/menus_1/images/menus-nouveau-48.png b/www/plugins/menus_1/images/menus-nouveau-48.png
new file mode 100644 (file)
index 0000000..45cae0b
Binary files /dev/null and b/www/plugins/menus_1/images/menus-nouveau-48.png differ
diff --git a/www/plugins/menus_1/images/menus_accueil.png b/www/plugins/menus_1/images/menus_accueil.png
new file mode 100644 (file)
index 0000000..a2ecb16
Binary files /dev/null and b/www/plugins/menus_1/images/menus_accueil.png differ
diff --git a/www/plugins/menus_1/images/menus_action_ajouter.png b/www/plugins/menus_1/images/menus_action_ajouter.png
new file mode 100644 (file)
index 0000000..8aef295
Binary files /dev/null and b/www/plugins/menus_1/images/menus_action_ajouter.png differ
diff --git a/www/plugins/menus_1/images/menus_action_bas.png b/www/plugins/menus_1/images/menus_action_bas.png
new file mode 100644 (file)
index 0000000..d6df4f6
Binary files /dev/null and b/www/plugins/menus_1/images/menus_action_bas.png differ
diff --git a/www/plugins/menus_1/images/menus_action_haut.png b/www/plugins/menus_1/images/menus_action_haut.png
new file mode 100644 (file)
index 0000000..cff387d
Binary files /dev/null and b/www/plugins/menus_1/images/menus_action_haut.png differ
diff --git a/www/plugins/menus_1/images/menus_action_modifier.png b/www/plugins/menus_1/images/menus_action_modifier.png
new file mode 100644 (file)
index 0000000..a3bbd76
Binary files /dev/null and b/www/plugins/menus_1/images/menus_action_modifier.png differ
diff --git a/www/plugins/menus_1/images/menus_action_supprimer.png b/www/plugins/menus_1/images/menus_action_supprimer.png
new file mode 100644 (file)
index 0000000..cd92b1d
Binary files /dev/null and b/www/plugins/menus_1/images/menus_action_supprimer.png differ
diff --git a/www/plugins/menus_1/images/menus_articles_rubrique.png b/www/plugins/menus_1/images/menus_articles_rubrique.png
new file mode 100644 (file)
index 0000000..c131e9b
Binary files /dev/null and b/www/plugins/menus_1/images/menus_articles_rubrique.png differ
diff --git a/www/plugins/menus_1/images/menus_groupes_mots.png b/www/plugins/menus_1/images/menus_groupes_mots.png
new file mode 100644 (file)
index 0000000..f5388cc
Binary files /dev/null and b/www/plugins/menus_1/images/menus_groupes_mots.png differ
diff --git a/www/plugins/menus_1/images/menus_lien.png b/www/plugins/menus_1/images/menus_lien.png
new file mode 100755 (executable)
index 0000000..60d0d02
Binary files /dev/null and b/www/plugins/menus_1/images/menus_lien.png differ
diff --git a/www/plugins/menus_1/images/menus_logout.png b/www/plugins/menus_1/images/menus_logout.png
new file mode 100644 (file)
index 0000000..4ee9cff
Binary files /dev/null and b/www/plugins/menus_1/images/menus_logout.png differ
diff --git a/www/plugins/menus_1/images/menus_mapage.png b/www/plugins/menus_1/images/menus_mapage.png
new file mode 100644 (file)
index 0000000..5d836e6
Binary files /dev/null and b/www/plugins/menus_1/images/menus_mapage.png differ
diff --git a/www/plugins/menus_1/images/menus_mots.png b/www/plugins/menus_1/images/menus_mots.png
new file mode 100644 (file)
index 0000000..f7988df
Binary files /dev/null and b/www/plugins/menus_1/images/menus_mots.png differ
diff --git a/www/plugins/menus_1/images/menus_objet.png b/www/plugins/menus_1/images/menus_objet.png
new file mode 100644 (file)
index 0000000..8b1f432
Binary files /dev/null and b/www/plugins/menus_1/images/menus_objet.png differ
diff --git a/www/plugins/menus_1/images/menus_page_speciale.png b/www/plugins/menus_1/images/menus_page_speciale.png
new file mode 100644 (file)
index 0000000..74b109b
Binary files /dev/null and b/www/plugins/menus_1/images/menus_page_speciale.png differ
diff --git a/www/plugins/menus_1/images/menus_rubriques.png b/www/plugins/menus_1/images/menus_rubriques.png
new file mode 100644 (file)
index 0000000..3033e6e
Binary files /dev/null and b/www/plugins/menus_1/images/menus_rubriques.png differ
diff --git a/www/plugins/menus_1/images/menus_secteurlangue.png b/www/plugins/menus_1/images/menus_secteurlangue.png
new file mode 100644 (file)
index 0000000..90d1d85
Binary files /dev/null and b/www/plugins/menus_1/images/menus_secteurlangue.png differ
diff --git a/www/plugins/menus_1/images/menus_texte_libre.png b/www/plugins/menus_1/images/menus_texte_libre.png
new file mode 100644 (file)
index 0000000..59e60f7
Binary files /dev/null and b/www/plugins/menus_1/images/menus_texte_libre.png differ
diff --git a/www/plugins/menus_1/inc/menus.php b/www/plugins/menus_1/inc/menus.php
new file mode 100644 (file)
index 0000000..ac7e6ad
--- /dev/null
@@ -0,0 +1,184 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Lister les types d'entrée de menus disponibles dans les dossiers menus/
+ *
+ * @staticvar array $resultats
+ * @param bool $informer
+ * @return array
+ */
+function menus_lister_disponibles($informer=true){
+       static $resultats = null;
+       
+       $plugins_actifs = unserialize($GLOBALS['meta']['plugin']);
+
+       if (is_null($resultats[$informer])){
+               $resultats[$informer] = array();
+               // rechercher les skel du type truc.html
+               $match = ".+[.]html$";
+
+               // lister les entrées disponibles
+               $liste = find_all_in_path('menus/', $match);
+               if (count($liste)){
+                       foreach($liste as $squelette=>$chemin) {
+                               $type = preg_replace(',[.]html$,i', '', $squelette);
+                               $dossier = str_replace($squelette, '', $chemin);
+                               // On ne garde que les squelettes ayant un XML de config
+                               if (file_exists("$dossier$type.xml")
+                                       AND (
+                                               $entree = !$informer OR ($entree = menus_charger_infos($dossier.$type))
+                                       )){
+                                           //on ne garde que les menus repondants aux necessites
+                                       $necessite = true;
+                                           if (! empty($entree['necessites']['plugin'])) {
+                                               /* la globale $plugins liste tout en majuscule */
+                                               $entree['necessites']['plugin'] = array_map("strtoupper", $entree['necessites']['plugin']);
+                                               foreach($entree['necessites']['plugin'] as $plugin) {
+                                                   if ( ! array_key_exists($plugin,$plugins_actifs) )
+                                                       $necessite = false;
+                                               }
+                                           }
+                                           if ($necessite)
+                            $resultats[$informer][$type] = $entree;
+                               }
+                       }
+               }
+               $resultats[$informer] = pipeline('menus_lister_disponibles',array(
+                       'args' => array(),
+                       'data' => $resultats[$informer]
+                       )
+               );
+       }
+       return $resultats[$informer];
+}
+
+/**
+ * Decrire un type de menu
+ *
+ * @staticvar array $infos
+ * @param string $type
+ * @return array
+ */
+function menus_informer($type){
+       static $infos = array();
+       if (!isset($infos[$type])){
+               $fichier = find_in_path("menus/$type.html");
+               $infos[$type] = menus_charger_infos($fichier);
+       }
+       return $infos[$type];
+}
+
+/**
+ * Charger les informations contenues dans le xml d'une entrée de menu
+ *
+ * @param string $type
+ * @param string $info
+ * @return array
+ */
+function menus_charger_infos($type, $info=""){
+               // on peut appeler avec le nom du squelette
+               $fichier = preg_replace(',[.]html$,i','',$type).".xml";
+               include_spip('inc/xml');
+               include_spip('inc/texte');
+               $entree = array();
+               if ($xml = spip_xml_load($fichier, false)){
+                       if (count($xml['entree'])){
+                               $xml = reset($xml['entree']);
+                               $entree['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom']));
+                               $entree['rang'] = intval(trim(spip_xml_aplatit($xml['rang'])));
+                               $entree['rang'] = ($entree['rang'] ? $entree['rang'] : 1000);
+                               $entree['description'] = isset($xml['description']) ? _T_ou_typo(spip_xml_aplatit($xml['description'])) : '';
+                               $entree['icone'] = isset($xml['icone']) ? find_in_path(reset($xml['icone'])) : '';
+                               $entree['refuser_sous_menu'] = isset($xml['refuser_sous_menu']);
+                               // Décomposition des paramètres
+                               $entree['parametres'] = array();
+                               if (spip_xml_match_nodes(',^parametre,', $xml, $parametres)){
+                                       foreach (array_keys($parametres) as $parametre){
+                                               list($balise, $attributs) = spip_xml_decompose_tag($parametre);
+                                               $entree['parametres'][$attributs['nom']] = array(
+                                                       'label' => (isset($attributs['label']) && $attributs['label']) ? _T($attributs['label']) : $attributs['nom'],
+                                                       'obligatoire' => (isset($attributs['obligatoire']) && $attributs['obligatoire'] == 'oui') ? true : false,
+                                                       'class' => (isset($attributs['class']) && $attributs['class']) ? $attributs['class'] : ''
+                                               );
+                                       }
+                               }
+                               //Décomposition des necessites
+                               if (spip_xml_match_nodes(',^necessite,', $xml, $necessites)){
+                               $entree['necessites']['plugin'] = array();
+                                       foreach (array_keys($necessites) as $necessite){
+                                               list($balise, $attributs) = spip_xml_decompose_tag($necessite);
+                                               array_push($entree['necessites'][$attributs['type']] , $attributs['nom']);
+                                       }
+                               }
+                               
+                       }
+               }
+               if (!$info)
+                       return $entree;
+               else 
+                       return isset($entree[$info]) ? $entree[$info] : "";
+}
+
+// Suprrimer une entrée (et les éventuels sous-menus en cascade)
+function menus_supprimer_entree($id_menus_entree){
+       include_spip('base/abstract_sql');
+       $id_menus_entree = intval($id_menus_entree);
+       
+       // On regarde d'abord s'il y a un sous-menu
+       $id_menu = intval(sql_getfetsel(
+               'id_menu',
+               'spip_menus',
+               'id_menus_entree = '.$id_menus_entree
+       ));
+       
+       // Dans ce cas on le supprime d'abord
+       $ok = true;
+       if ($id_menu)
+               $ok = menus_supprimer_menu($id_menu);
+       
+       // Si c'est bon, on peut alors supprimer l'entrée
+       if ($ok)
+               $ok = sql_delete(
+                       'spip_menus_entrees',
+                       'id_menus_entree = '.$id_menus_entree
+               );
+       
+       return $ok;
+}
+
+// Supprimer un menu (et donc toutes ses entrées aussi)
+function menus_supprimer_menu($id_menu){
+       include_spip('base/abstract_sql');
+       $id_menu = intval($id_menu);
+       
+       // On récupère toutes les entrées
+       $entrees = sql_allfetsel(
+               'id_menus_entree',
+               'spip_menus_entrees',
+               'id_menu = '.$id_menu
+       );
+       if (is_array($entrees))
+               $entrees = array_map('reset', $entrees);
+       
+       // On les supprime
+       $ok = true;
+       if (is_array($entrees))
+               foreach ($entrees as $id_menus_entree){
+                       if ($ok)
+                               $ok = menus_supprimer_entree($id_menus_entree);
+               }
+       
+       // Si tout s'est bien passé on peut enfin supprimer le menu
+       if ($ok)
+               $ok = sql_delete(
+                       'spip_menus',
+                       'id_menu = '.$id_menu
+               );
+       
+       return $ok;
+}
+
+?>
diff --git a/www/plugins/menus_1/inc/menus_autoriser.php b/www/plugins/menus_1/inc/menus_autoriser.php
new file mode 100644 (file)
index 0000000..93afbdd
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function menus_autoriser(){}
+
+function autoriser_menu_modifier_dist($faire, $type, $id, $qui, $opt) {
+       if ($qui['statut'] == '0minirezo' and !$qui['restreint'])
+               return true;
+       else
+               return false;
+}
+
+function autoriser_menus_tous_dist($faire, $type, $id, $qui, $opt) {
+       return autoriser('modifier', 'menu', $id, $qui, $opt);
+}
+
+?>
diff --git a/www/plugins/menus_1/inclure/barre-nav.html b/www/plugins/menus_1/inclure/barre-nav.html
new file mode 100644 (file)
index 0000000..b1d83ab
--- /dev/null
@@ -0,0 +1,7 @@
+[(#REM) 
+       
+       ZPIP 1.x
+       
+]<div class="menu-conteneur navbar-inner">
+#INCLURE{fond=inclure/menu, env, identifiant=barrenav}
+</div>
diff --git a/www/plugins/menus_1/inclure/menu.html b/www/plugins/menus_1/inclure/menu.html
new file mode 100644 (file)
index 0000000..47c755f
--- /dev/null
@@ -0,0 +1,21 @@
+
+<BOUCLE_menu(MENUS){id_menu?}{identifiant?}>
+       
+       <B_entrees>
+       <ul class="menu-liste menu-items nav[ (#CHAMP_SQL{css})]">
+               <BOUCLE_entrees(MENUS_ENTREES){id_menu}{par rang}>
+               #MENUS_AFFICHER_ENTREE
+                       <BOUCLE_sous_menu(MENUS){id_menus_entree}>
+                               #INCLURE{fond=inclure/menu, env, id_menu, identifiant}
+                       </BOUCLE_sous_menu>
+               [(#REM)
+                       On ferme le li si le type d'entrée accepte des sous-menus
+                       et si on a bien quelque chose dans le li (cas des menus sur Balise SESSION)
+               ][(#TYPE_ENTREE|menus_type_refuser_sous_menu|non)
+                       [(#MENUS_AFFICHER_ENTREE|trim|oui)</li>]
+               ]
+               </BOUCLE_entrees>
+       </ul>
+       </B_entrees>
+       
+</BOUCLE_menu>
diff --git a/www/plugins/menus_1/inclure/nav.html b/www/plugins/menus_1/inclure/nav.html
new file mode 100644 (file)
index 0000000..6d39144
--- /dev/null
@@ -0,0 +1,7 @@
+[(#REM) 
+       
+       ZPIP 2.x
+       
+]<div class="menu-conteneur navbar-inner">
+#INCLURE{fond=inclure/menu, env, identifiant=barrenav}
+</div>
diff --git a/www/plugins/menus_1/lang/menus.xml b/www/plugins/menus_1/lang/menus.xml
new file mode 100644 (file)
index 0000000..a497978
--- /dev/null
@@ -0,0 +1,28 @@
+<traduction module="menus" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/menus/trunk/lang/" reference="fr">
+       <langue code="ar" url="http://trad.spip.net/tradlang_module/menus?lang_cible=ar">
+               <traducteur nom="George" lien="http://trad.spip.net/auteur/جورج-قندلفت" />
+       </langue>
+       <langue code="ca" />
+       <langue code="de" url="http://trad.spip.net/tradlang_module/menus?lang_cible=de">
+               <traducteur nom="klaus++" lien="http://trad.spip.net/auteur/klaus" />
+       </langue>
+       <langue code="en" url="http://trad.spip.net/tradlang_module/menus?lang_cible=en">
+               <traducteur nom="kent1" lien="" />
+               <traducteur nom="Mark" lien="http://trad.spip.net/auteur/mark" />
+               <traducteur nom="RastaPopoulos" lien="" />
+               <traducteur nom="Suske" lien="http://trad.spip.net/auteur/suske" />
+       </langue>
+       <langue code="es" url="http://trad.spip.net/tradlang_module/menus?lang_cible=es">
+               <traducteur nom="dani" lien="http://trad.spip.net/auteur/dani" />
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+               <traducteur nom="tin" lien="http://trad.spip.net/auteur/tin" />
+       </langue>
+       <langue code="fa" url="http://trad.spip.net/tradlang_module/menus?lang_cible=fa">
+               <traducteur nom="Davood Hossein" lien="http://trad.spip.net/auteur/davood-hossein" />
+       </langue>
+       <langue code="fr" />
+       <langue code="it" />
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/menus?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/menus_1/lang/menus_ar.php b/www/plugins/menus_1/lang/menus_ar.php
new file mode 100644 (file)
index 0000000..c278df2
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/menus?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'هل تريد فعلاً حذف هذا البند؟',
+
+       // D
+       'description_menu_accueil' => 'رابط الى الصفحة الأساسية في الموقع.',
+       'description_menu_articles_rubrique' => 'عرض لائحة المقالات في قسم.',
+       'description_menu_deconnecter' => 'اذا كان هناك زائر متصل، يضيف بنداً يعرض عليه الخروج.',
+       'description_menu_espace_prive' => 'Lien permettant de se connecter au site si on ne l\'est pas déjà, puis d\'aller dans l\'espace privé si l\'on y est autorisé.', # NEW
+       'description_menu_groupes_mots' => 'Affiche automatiquement un menu listant les mots du groupe et les articles liés. Par défaut, affiche la liste des groupes de mots et les mots liés. Si un squelette groupes_mots.html existe, le lien vers le groupe est utilisé.', # NEW
+       'description_menu_lien' => 'Ajoute un lien arbitraire, en interne (URL relative) ou externe (http://...).', # NEW
+       'description_menu_mapage' => 'Si le visiteur est connecté, ajoute un lien vers sa page auteur.', # NEW
+       'description_menu_mots' => 'Affiche automatiquement un menu listant les articles liés au mot clé.', # NEW
+       'description_menu_objet' => 'Crée un lien vers un objet de SPIP : article, rubrique ou autre. Par défaut, l\'entrée aura le titre de l\'objet.', # NEW
+       'description_menu_page_speciale' => 'Ajoute un lien vers un squelette page accessible par une url du type <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Ces pages sont souvent fournies par des plugins.', # NEW
+       'description_menu_page_speciale_zajax' => 'Ajoute un lien vers un bloc d\'une page accessible par une url du type <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Ceci nécéssite une squelette de type Z et le plugin <a href="http://www.spip-contrib.net/MediaBox">médiabox</a>.', # NEW
+       'description_menu_rubriques_articles' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques et les articles sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement). Les articles sont placés systématiquement après les rubriques.', # NEW
+       'description_menu_rubriques_completes' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).', # NEW
+       'description_menu_secteurlangue' => 'Cette entrée est spécifique aux sites utilisant un secteur par langue. Elle affiche automatiquement un menu listant les rubriques du secteur correspondant à la langue de la page et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).', # NEW
+       'description_menu_texte_libre' => 'Simplement le texte que vous souhaitez, ou un code de langue SPIP (<:...:>)', # NEW
+
+       // E
+       'editer_menus_editer' => 'تعديل هذه القائمة',
+       'editer_menus_explication' => 'إنشاء قوائم الموقع وإعدادها.',
+       'editer_menus_exporter' => 'نقل هذه القائمة',
+       'editer_menus_nouveau' => 'إنشاء قائمة جديدة',
+       'editer_menus_titre' => 'قوائم الموقع',
+       'entree_afficher_articles' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)', # NEW
+       'entree_afficher_item_suite' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)', # NEW
+       'entree_articles_max' => 'Si oui, afficher les articles seulement si la rubrique contient au maximum xx articles ? (mettre le nombre maximum d\'articles, laissez vide pour afficher tous les articles)', # NEW
+       'entree_articles_max_affiches' => 'Si oui, limiter le nombre d\'articles listés à xx maximum (suivis d\'un item "... Tous les articles" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum d\'articles, laissez vide pour afficher tous les articles)', # NEW
+       'entree_aucun' => 'بدون',
+       'entree_bloc' => 'كتلة Zpip',
+       'entree_choisir' => 'اختر نوع البند الذي تريد إضافته:',
+       'entree_classe_parent' => 'Classe des liens des éléments parents. Cette classe sera rajoutée aux li>a ayant une suite ul/li. Par exemple, si vous saisissez "daddy", cela vous permet d\'utiliser le plugin menu deroulant 2 pour la mise en forme du menu.', # NEW
+       'entree_connexion_objet' => 'Obliger à être connecté (mettre "session") ou déconnecté (mettre "nosession") pour voir l\'objet', # NEW
+       'entree_contenu' => 'المحتوى',
+       'entree_css' => 'Classes CSS de l\'entrée (du conteneur)', # NEW
+       'entree_css_lien' => 'Classes CSS du lien', # NEW
+       'entree_id_groupe' => 'رقم مجموعة المفاتيح',
+       'entree_id_mot' => 'رقم المفتاح',
+       'entree_id_objet' => 'رقم',
+       'entree_id_rubrique' => 'رقم القسم الحاوي',
+       'entree_id_rubrique_ou_courante' => 'Numéro de la rubrique parente ou "courante" si la rubrique parente est la rubrique courante du contexte', # NEW
+       'entree_id_rubriques_exclues' => 'Numéros des rubriques à exclure, séparés par des virgules', # NEW
+       'entree_id_secteur_exclus' => 'Numéros des secteurs à exclure, séparés par des virgules', # NEW
+       'entree_infini' => 'الى ما لا نهاية',
+       'entree_mapage' => 'صفحتي الشخصية',
+       'entree_masquer_articles_uniques' => 'Si oui et si une rubrique contient un seul article, le masquer ? (mettre "oui" pour cela)', # NEW
+       'entree_niveau' => 'مستوى القوائم الفرعية',
+       'entree_nombre_articles' => 'العدد الأقصى للمقالات (صفر افتراضياً)',
+       'entree_page' => 'اسم الصفحة',
+       'entree_parametres' => 'لائحة المتغيرات',
+       'entree_rubriques_max_affichees' => 'Si oui, limiter le nombre de rubriques listés à xx maximum (suivis d\'un item "... Toutes les rubriques" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum de rubriques, laissez vide pour afficher toutes les rubriques)', # NEW
+       'entree_sousrub_cond' => 'N\'afficher que les sous-rubriques de la rubrique en cours (mettre "oui", sinon laisser vide)', # NEW
+       'entree_suivant_connexion' => 'Restreindre cette entrée suivant la connexion (mettre "connecte" pour afficher seulement si le visiteur est connecté, "deconnecte" pour le cas contraire, ou laisser vide pour toujours afficher)', # NEW
+       'entree_suivant_connexion_connecte' => 'اذا متصل فقط',
+       'entree_suivant_connexion_deconnecte' => 'اذا غير متصل فقط',
+       'entree_sur_n_articles' => '@n@ مقال معروض',
+       'entree_sur_n_mots' => '@n@ مفتاح معروض',
+       'entree_sur_n_niveaux' => 'على @n@ مستوى',
+       'entree_titre' => 'العنوان',
+       'entree_titre_connecter' => 'العنوان للوصول الى استمارة التعريف',
+       'entree_titre_prive' => 'العنوان للدخول الى المجال الخاص',
+       'entree_traduction_articles_rubriques' => 'Dans la mesure du possible, afficher les articles de la rubrique dans la langue du contexte (mettre "trad" pour cela)', # NEW
+       'entree_traduction_objet' => 'Dans le cas d\'un article, choisir la traduction en fonction du contexte (mettre "trad" pour cela)', # NEW
+       'entree_tri_alpha' => 'Critère de tri des rubriques (alphabétique). Si vous saisissez "date", le critère ajouté sera {par date} et les rubriques seront triées par date', # NEW
+       'entree_tri_alpha_articles' => 'Critère de tri des articles (alphabétique). Si vous saisissez "date", le critère ajouté sera {par date} et les articles seront triés par date', # NEW
+       'entree_tri_alpha_articles_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_alpha_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_num' => 'Critère de tri des rubriques (numérique). Si vous saisissez "titre", le critère ajouté sera {par num titre} et les rubriques seront triées par numéro de titre', # NEW
+       'entree_tri_num_articles' => 'Critère de tri des articles (numérique). Si vous saisissez "titre", le critère ajouté sera {par num titre} et les articles seront triés par numéro de titre', # NEW
+       'entree_tri_num_articles_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_num_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)', # NEW
+       'entree_type_objet' => 'نوع العنصر',
+       'entree_url' => 'العنوان',
+       'entree_url_public' => 'Adresse de retour après la connexion', # NEW
+       'erreur_aucun_type' => 'لم يتم العثور على اي نوع بنود.',
+       'erreur_autorisation' => 'غير مسموح لك تعديل القوائم.',
+       'erreur_identifiant_deja' => 'Cet identifiant est déjà utilisé par un menu.', # NEW
+       'erreur_identifiant_forme' => 'L\'identifiant ne doit contenir que des lettres, des chiffres ou le caractère souligné.', # NEW
+       'erreur_menu_inexistant' => 'لا وجود للقائمة رقم @id@ المطلوبة.',
+       'erreur_mise_a_jour' => 'Une erreur s\'est produite pendant la mise à jour de la base de donnée.', # NEW
+       'erreur_parametres' => 'Il y a une erreur dans les paramètres de la page', # NEW
+       'erreur_type_menu' => 'يجب اختيار نوع قوائم',
+       'erreur_type_menu_inexistant' => 'Ce type de menu n\'est pas/plus disponible', # NEW
+
+       // F
+       'formulaire_ajouter_entree' => 'إضافة بند',
+       'formulaire_ajouter_sous_menu' => 'إنشاء قائمة فرعية',
+       'formulaire_css' => 'Classes CSS', # NEW
+       'formulaire_css_explication' => 'Vous pouvez ajouter au menu d\'éventuelles classes CSS supplémentaires.', # NEW
+       'formulaire_deplacer_bas' => 'نقل الى الأسفل',
+       'formulaire_deplacer_haut' => 'نقل الى الأعلى',
+       'formulaire_facultatif' => 'اختياري',
+       'formulaire_identifiant' => 'المعرف',
+       'formulaire_identifiant_explication' => 'Donnez un mot-clé unique qui vous permettra d\'appeler votre menu facilement.', # NEW
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Choisissez quel(s) menu(s) vous souhaitez importer.', # NEW
+       'formulaire_ieconfig_importer' => 'جلب',
+       'formulaire_ieconfig_menu_meme_identifiant' => 'ATTENTION : un menu avec le même identifiant existe déjà sur votre votre site !', # NEW
+       'formulaire_ieconfig_menus_a_exporter' => 'قوائم للنقل:',
+       'formulaire_ieconfig_ne_pas_importer' => 'عدم الجلب',
+       'formulaire_ieconfig_remplacer' => 'Remplacer le menu actuel par le menu importé', # NEW
+       'formulaire_ieconfig_renommer' => 'إعادة تسمية هذه القائمة قبل جلبها',
+       'formulaire_importer' => 'جلب قائمة',
+       'formulaire_importer_explication' => 'Si vous avez exporté un menu dans un fichier, vous pouvez l\'importer maintenant.', # NEW
+       'formulaire_modifier_entree' => 'تعديل هذا البند',
+       'formulaire_modifier_menu' => 'تعديل القائمة',
+       'formulaire_nouveau' => 'قائمة جديدة',
+       'formulaire_partie_construction' => 'بناء قائمة',
+       'formulaire_partie_identification' => 'تعريف القائمة',
+       'formulaire_supprimer_entree' => 'حذف هذا البند',
+       'formulaire_supprimer_menu' => 'حذف القائمة',
+       'formulaire_supprimer_sous_menu' => 'حذف هذه القائمة الفرعية',
+       'formulaire_titre' => 'العنوان',
+
+       // I
+       'info_afficher_articles' => 'Les articles seront inclus dans le menu.', # NEW
+       'info_articles_max' => 'Seulement si la rubrique contient au plus @max@ articles', # NEW
+       'info_articles_max_affiches' => 'Affichage limité à @max@ articles', # NEW
+       'info_classe_parent' => 'Classe des éléments parents : ', # NEW
+       'info_connexion_obligatoire' => 'Connexion obligatoire', # NEW
+       'info_deconnexion_obligatoire' => 'Uniquement déconnecté', # NEW
+       'info_masquer_articles_uniques' => 'Articles uniques masqués', # NEW
+       'info_numero_menu' => 'قائمة رقم:',
+       'info_page_speciale' => 'Lien vers la page « @page@ »', # NEW
+       'info_page_speciale_zajax' => 'Modalbox de la page « @page@ » pour le bloc « @bloc@ &#187', # NEW
+       'info_rubrique_courante' => 'القسم الحالي',
+       'info_rubriques_exclues' => ' / sauf rubrique(s) @id_rubriques@', # NEW
+       'info_rubriques_max_affichees' => 'Affichage limité à @max@ rubriques', # NEW
+       'info_secteur_exclus' => ' / sauf secteur(s) @id_secteur@', # NEW
+       'info_sousrub_cond' => 'Seules les sous-rubriques de la rubriques en cours sont affichées.', # NEW
+       'info_tous_groupes_mots' => 'Tous les groupes de mots', # NEW
+       'info_traduction_recuperee' => 'Le contexte décidera de la traduction choisie', # NEW
+       'info_tri' => 'فرز الأقسام:',
+       'info_tri_alpha' => '(أبجدي)',
+       'info_tri_articles' => 'فرز المقالات:',
+       'info_tri_num' => '(رقمي)',
+
+       // N
+       'noisette_description' => 'Insère un menu défini avec le plugin Menus.', # NEW
+       'noisette_label_afficher_titre_menu' => 'عرض عنوان القائمة؟',
+       'noisette_label_identifiant' => 'Menu à afficher :', # NEW
+       'noisette_nom_noisette' => 'القائمة',
+       'nom_menu_accueil' => 'Accueil', # NEW
+       'nom_menu_articles_rubrique' => 'مقالات قسم',
+       'nom_menu_deconnecter' => 'خروج',
+       'nom_menu_espace_prive' => 'Se connecter / lien vers espace privé', # NEW
+       'nom_menu_groupes_mots' => 'Mots-clés et Articles d\'un Groupes de mots', # NEW
+       'nom_menu_lien' => 'رابط اعتباطي',
+       'nom_menu_mapage' => 'صفحتي',
+       'nom_menu_mots' => 'مقالات مفتاح',
+       'nom_menu_objet' => 'مقال، قسم او أحد عناصر SPIP الأخرى ',
+       'nom_menu_page_speciale' => 'رابط الى صفحة نموذجية',
+       'nom_menu_page_speciale_zajax' => 'Un bloc d\'une page Zpip', # NEW
+       'nom_menu_rubriques_completes' => 'Liste ou arborescence de rubriques et d\'articles (avec beaucoup d\'options)', # NEW
+       'nom_menu_rubriques_evenements' => 'Événements de rubriques', # NEW
+       'nom_menu_secteurlangue' => 'أقسام اللغات',
+       'nom_menu_texte_libre' => 'نص حرّ',
+
+       // T
+       'tous_les_articles' => 'كل المقالات',
+       'toutes_les_rubriques' => 'كل الأقسام'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_ca.php b/www/plugins/menus_1/lang/menus_ca.php
new file mode 100644 (file)
index 0000000..53f4403
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/menus?lang_cible=ca
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'Voulez-vous vraiment supprimer cette entrée ?', # NEW
+
+       // D
+       'description_menu_accueil' => 'Enllaç cap a la pàgina d\'inici del lloc.',
+       'description_menu_articles_rubrique' => 'Mostra la llista d\'articles d\'una secció.',
+       'description_menu_deconnecter' => 'Si el visitant està connectat, afegeix una entrada proposant-li la desconnexió.',
+       'description_menu_espace_prive' => 'Enllaç que permet connectar-se al lloc, si encara no ho estem, i després anar a l\'espai privat sempre i quan estiguem autoritzats a fer-ho.',
+       'description_menu_groupes_mots' => 'Mostra automàticament un menú que llista les paraules del grup i els articles lligats. Per defecte, mostra la llista dels grups de paraules i les paraules lligades. Si un esquelet grups_paraules.html existeix, s\'utilitzarà l\'enllaç cap al grup.',
+       'description_menu_lien' => 'Afegeix un enllaç arbitrari, intern (URL relativa) o extern (http://...).',
+       'description_menu_mapage' => 'Si el visitant està connectat, afegeix un enllaç cap a la pàgina de l\'autor.',
+       'description_menu_mots' => 'Mostra automàticament un menú que llista els articles lligats a la paraula clau.',
+       'description_menu_objet' => 'Crea un enllaç cap a un objecte d\'SPIP: article, secció o un altre. Per defecte, l\'entrada tindrà el títol de l\'objecte.',
+       'description_menu_page_speciale' => 'Afegeix un enllaç cap a un esquelet accessible per un URL del tipus <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Aquestes pàgines sovint són subministrades per connectors.',
+       'description_menu_page_speciale_zajax' => 'Ajoute un lien vers un bloc d\'une page accessible par une url du type <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Ceci nécéssite une squelette de type Z et le plugin <a href="http://www.spip-contrib.net/MediaBox">médiabox</a>.', # NEW
+       'description_menu_rubriques_articles' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques et les articles sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement). Les articles sont placés systématiquement après les rubriques.', # NEW
+       'description_menu_rubriques_completes' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).', # NEW
+       'description_menu_secteurlangue' => 'Aquesta entrada és específica pels llocs que utilitzen un sector per llengua. Mostra automàticament un menú que llista les seccions del sector corresponent a la llengua de la pàgina i, si es vol, les subseccions a diferents nivells. Per defecte, mostra totes les seccions des de l\'arrel, ordenades per títol (numèricament i després alfabèticament).',
+       'description_menu_texte_libre' => 'Simplement le texte que vous souhaitez, ou un code de langue SPIP (<:...:>)', # NEW
+
+       // E
+       'editer_menus_editer' => 'Modificar aquest menú',
+       'editer_menus_explication' => 'Creeu i configureu els menús del vostre lloc.',
+       'editer_menus_exporter' => 'Exportar aquest menú',
+       'editer_menus_nouveau' => 'Creeu un nou menú',
+       'editer_menus_titre' => 'Menús del lloc',
+       'entree_afficher_articles' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)', # NEW
+       'entree_afficher_item_suite' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)', # NEW
+       'entree_articles_max' => 'Si oui, afficher les articles seulement si la rubrique contient au maximum xx articles ? (mettre le nombre maximum d\'articles, laissez vide pour afficher tous les articles)', # NEW
+       'entree_articles_max_affiches' => 'Si oui, limiter le nombre d\'articles listés à xx maximum (suivis d\'un item "... Tous les articles" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum d\'articles, laissez vide pour afficher tous les articles)', # NEW
+       'entree_aucun' => 'Cap',
+       'entree_bloc' => 'Bloc Zpip', # NEW
+       'entree_choisir' => 'Escolliu el tipus d\'entrada que voleu afegir:',
+       'entree_classe_parent' => 'Classe des liens des éléments parents. Cette classe sera rajoutée aux li>a ayant une suite ul/li. Par exemple, si vous saisissez "daddy", cela vous permet d\'utiliser le plugin menu deroulant 2 pour la mise en forme du menu.', # NEW
+       'entree_connexion_objet' => 'Obliger à être connecté (mettre "session") ou déconnecté (mettre "nosession") pour voir l\'objet', # NEW
+       'entree_contenu' => 'Contenu', # NEW
+       'entree_css' => 'Classes CSS de l\'entrada', # MODIF
+       'entree_css_lien' => 'Classes CSS du lien', # NEW
+       'entree_id_groupe' => 'Número del grup de paraula clau',
+       'entree_id_mot' => 'Número de la paraula clau',
+       'entree_id_objet' => 'Número',
+       'entree_id_rubrique' => 'Número de la secció pare',
+       'entree_id_rubrique_ou_courante' => 'Numéro de la rubrique parente ou "courante" si la rubrique parente est la rubrique courante du contexte', # NEW
+       'entree_id_rubriques_exclues' => 'Numéros des rubriques à exclure, séparés par des virgules', # NEW
+       'entree_id_secteur_exclus' => 'Numéros des secteurs à exclure, séparés par des virgules', # NEW
+       'entree_infini' => 'Fins l\'infinit',
+       'entree_mapage' => 'La meva pàgina personal',
+       'entree_masquer_articles_uniques' => 'Si oui et si une rubrique contient un seul article, le masquer ? (mettre "oui" pour cela)', # NEW
+       'entree_niveau' => 'Nivell de les subseccions',
+       'entree_nombre_articles' => 'Número d\'articles com a màxim (0 per defecte)',
+       'entree_page' => 'Nom de la pàgina',
+       'entree_parametres' => 'Llista dels paràmetres',
+       'entree_rubriques_max_affichees' => 'Si oui, limiter le nombre de rubriques listés à xx maximum (suivis d\'un item "... Toutes les rubriques" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum de rubriques, laissez vide pour afficher toutes les rubriques)', # NEW
+       'entree_sousrub_cond' => 'N\'afficher que les sous-rubriques de la rubrique en cours (mettre "oui", sinon laisser vide)', # NEW
+       'entree_suivant_connexion' => 'Restreindre cette entrée suivant la connexion (mettre "connecte" pour afficher seulement si le visiteur est connecté, "deconnecte" pour le cas contraire, ou laisser vide pour toujours afficher)', # NEW
+       'entree_suivant_connexion_connecte' => 'seulement si connecté', # NEW
+       'entree_suivant_connexion_deconnecte' => 'seulement si déconnecté', # NEW
+       'entree_sur_n_articles' => '@n@ articles mostrat(s)',
+       'entree_sur_n_mots' => '@n@ paraules mostrada(es)',
+       'entree_sur_n_niveaux' => 'A @n@ nivell(s)',
+       'entree_titre' => 'Títol',
+       'entree_titre_connecter' => 'Títol per l\'accés al formulari d\'identificació',
+       'entree_titre_prive' => 'Títol per accedir a l\'espai privat',
+       'entree_traduction_articles_rubriques' => 'Dans la mesure du possible, afficher les articles de la rubrique dans la langue du contexte (mettre "trad" pour cela)', # NEW
+       'entree_traduction_objet' => 'Dans le cas d\'un article, choisir la traduction en fonction du contexte (mettre "trad" pour cela)', # NEW
+       'entree_tri_alpha' => 'Criteri d\'ordenació (alfabètic)', # MODIF
+       'entree_tri_alpha_articles' => 'Critère de tri des articles (alphabétique). Si vous saisissez "date", le critère ajouté sera {par date} et les articles seront triés par date', # NEW
+       'entree_tri_alpha_articles_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_alpha_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_num' => 'Criteri d\'ordenació (numèric)', # MODIF
+       'entree_tri_num_articles' => 'Critère de tri des articles (numérique). Si vous saisissez "titre", le critère ajouté sera {par num titre} et les articles seront triés par numéro de titre', # NEW
+       'entree_tri_num_articles_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_num_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)', # NEW
+       'entree_type_objet' => 'Tipus d\'objecte',
+       'entree_url' => 'Adreça',
+       'entree_url_public' => 'Adresse de retour après la connexion', # NEW
+       'erreur_aucun_type' => 'No s\'ha trobat cap entrada.',
+       'erreur_autorisation' => 'No estàs autoritzat per modificar els menús.',
+       'erreur_identifiant_deja' => 'Aquest identificador ja es utilitzat per un menú.',
+       'erreur_identifiant_forme' => 'L\'identificador només pot contenir lletres, xifres o el caràcter subratllat.',
+       'erreur_menu_inexistant' => 'El menú demanat número @id@ no existeix.',
+       'erreur_mise_a_jour' => 'S\'ha produït un error durant l\'actualització de la base de dades .',
+       'erreur_parametres' => 'Hi ha un error en els paràmetres de la pàgina',
+       'erreur_type_menu' => 'Has d\'escollir un tipus de menú',
+       'erreur_type_menu_inexistant' => 'Ce type de menu n\'est pas/plus disponible', # NEW
+
+       // F
+       'formulaire_ajouter_entree' => 'Afegir una entrada',
+       'formulaire_ajouter_sous_menu' => 'Crear un submenú',
+       'formulaire_css' => 'Classes CSS',
+       'formulaire_css_explication' => 'Podeu afegir al menú eventuals classes CSS suplementàries.',
+       'formulaire_deplacer_bas' => 'Desplaçar avall',
+       'formulaire_deplacer_haut' => 'Desplaçar amunt',
+       'formulaire_facultatif' => 'Facultatiu',
+       'formulaire_identifiant' => 'Identificador',
+       'formulaire_identifiant_explication' => 'Doneu una paraula clau única que us permetrà cridar fàcilment el vostre menú.',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Choisissez quel(s) menu(s) vous souhaitez importer.', # NEW
+       'formulaire_ieconfig_importer' => 'Importer', # NEW
+       'formulaire_ieconfig_menu_meme_identifiant' => 'ATTENTION : un menu avec le même identifiant existe déjà sur votre votre site !', # NEW
+       'formulaire_ieconfig_menus_a_exporter' => 'Menus à exporter :', # NEW
+       'formulaire_ieconfig_ne_pas_importer' => 'Ne pas importer', # NEW
+       'formulaire_ieconfig_remplacer' => 'Remplacer le menu actuel par le menu importé', # NEW
+       'formulaire_ieconfig_renommer' => 'Renommer ce menu avant import', # NEW
+       'formulaire_importer' => 'Importar un menú',
+       'formulaire_importer_explication' => 'Si heu exportar un menú a dins d\'un fitxer, ara el podreu importar.',
+       'formulaire_modifier_entree' => 'Modificar aquesta entrada',
+       'formulaire_modifier_menu' => 'Modificar el menú:',
+       'formulaire_nouveau' => 'Nou menú',
+       'formulaire_partie_construction' => 'Construcció del menú',
+       'formulaire_partie_identification' => 'Identificació del menú',
+       'formulaire_supprimer_entree' => 'Suprimir aquesta entrada',
+       'formulaire_supprimer_menu' => 'Suprimir el menú',
+       'formulaire_supprimer_sous_menu' => 'Suprimir aquest submenú',
+       'formulaire_titre' => 'Títol',
+
+       // I
+       'info_afficher_articles' => 'Les articles seront inclus dans le menu.', # NEW
+       'info_articles_max' => 'Seulement si la rubrique contient au plus @max@ articles', # NEW
+       'info_articles_max_affiches' => 'Affichage limité à @max@ articles', # NEW
+       'info_classe_parent' => 'Classe des éléments parents : ', # NEW
+       'info_connexion_obligatoire' => 'Connexion obligatoire', # NEW
+       'info_deconnexion_obligatoire' => 'Uniquement déconnecté', # NEW
+       'info_masquer_articles_uniques' => 'Articles uniques masqués', # NEW
+       'info_numero_menu' => 'MENÚ NÚMERO:',
+       'info_page_speciale' => 'Enllaç cap a la pàgina «@page@»',
+       'info_page_speciale_zajax' => 'Modalbox de la page « @page@ » pour le bloc « @bloc@ &#187', # NEW
+       'info_rubrique_courante' => 'Rubrique courante', # NEW
+       'info_rubriques_exclues' => ' / sauf rubrique(s) @id_rubriques@', # NEW
+       'info_rubriques_max_affichees' => 'Affichage limité à @max@ rubriques', # NEW
+       'info_secteur_exclus' => ' / sauf secteur(s) @id_secteur@', # NEW
+       'info_sousrub_cond' => 'Seules les sous-rubriques de la rubriques en cours sont affichées.', # NEW
+       'info_tous_groupes_mots' => 'Tots els grups de paraules',
+       'info_traduction_recuperee' => 'Le contexte décidera de la traduction choisie', # NEW
+       'info_tri' => 'Ordena:', # MODIF
+       'info_tri_alpha' => '(alfabètica)',
+       'info_tri_articles' => 'Tri des articles :', # NEW
+       'info_tri_num' => '(numèrica)',
+
+       // N
+       'noisette_description' => 'Insère un menu défini avec le plugin Menus.', # NEW
+       'noisette_label_afficher_titre_menu' => 'Afficher le titre du menu ?', # NEW
+       'noisette_label_identifiant' => 'Menu à afficher :', # NEW
+       'noisette_nom_noisette' => 'Menu', # NEW
+       'nom_menu_accueil' => 'Inici',
+       'nom_menu_articles_rubrique' => 'Articles d\'una secció',
+       'nom_menu_deconnecter' => 'Desconnectar-se',
+       'nom_menu_espace_prive' => 'Connectar-se / enllaç cap a l\'espai privat',
+       'nom_menu_groupes_mots' => 'Paraules clau i Articles d\'un Grup de paraules',
+       'nom_menu_lien' => 'Enllaç arbitrari',
+       'nom_menu_mapage' => 'La meva pàgina',
+       'nom_menu_mots' => 'Articles d\'una Paraula clau',
+       'nom_menu_objet' => 'Article, secció o un altre objecte SPIP',
+       'nom_menu_page_speciale' => 'Enllaç cap a una pàgina esquelet',
+       'nom_menu_page_speciale_zajax' => 'Un bloc d\'une page Zpip', # NEW
+       'nom_menu_rubriques_completes' => 'Liste ou arborescence de rubriques et d\'articles (avec beaucoup d\'options)', # NEW
+       'nom_menu_rubriques_evenements' => 'Esdeveniments de les seccions',
+       'nom_menu_secteurlangue' => 'Sectors de llengua',
+       'nom_menu_texte_libre' => 'Texte libre', # NEW
+
+       // T
+       'tous_les_articles' => '... Tous les articles', # NEW
+       'toutes_les_rubriques' => '... Toutes les rubriques' # NEW
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_de.php b/www/plugins/menus_1/lang/menus_de.php
new file mode 100644 (file)
index 0000000..2a21d00
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/menus?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'Wollen sie diesen Eintrag wirklich löschen?',
+
+       // D
+       'description_menu_accueil' => 'Link zur Startseite.',
+       'description_menu_articles_rubrique' => 'Artikelliste einer Rubrik anzeigen',
+       'description_menu_deconnecter' => 'Wenn eine Leser angemeldet ist, zeige ihm einen Abmelde-Link.',
+       'description_menu_espace_prive' => 'Link zum Login und zum Redaktionssystem',
+       'description_menu_groupes_mots' => 'Zeige automatisch ein Menü aus Schlagworten und zugehörigen Artikeln. In der Grundeinstellung werden die Schlagwortgruppen mit ihren Schlagworten angezeigt. Wenn ein Skelett mit der Bezeichnung groupes_mots.html existiert, wird der Link zur Schlagwortguppe verwendet.',
+       'description_menu_lien' => 'Fügt eine beliebigen Link hinzu, der entweder intern (rekative URL)oder extern (http://...) sein kann.',
+       'description_menu_mapage' => 'Wenn der Besucher angemeldet ist, füge einen Link zu seiner persönlichen Seite hinzu.',
+       'description_menu_mots' => 'Zeigt automatisch ein Menü, das die Artikel zum Schlagwort anzeigt.',
+       'description_menu_objet' => 'Link zu einem SPIP-Objekt anlegen: Artikel, Rubrik, usw. In der Grundeinstellung trägt der Eintrag den Namen des Objekts.',
+       'description_menu_page_speciale' => 'Fügt einen URL zu einer Skelettseite im Format  <code>spip.php?page=nom&param1=xx&param2=yyy...</code> hinzu. Diese Skelette werden von Plugins bereitgestellt',
+       'description_menu_page_speciale_zajax' => 'Fügt einen Link zu einem Block auf einer Seite hinzu, die über einen URL mit der Syntax <code>spip.php?page=nom¶m1=xx¶m2=yyy...</code> erreichbar ist. Dazu sind ein Skelett des Typs Z und das Plugin <a href="http://www.spip-contrib.net/MediaBox">médiabox</a> Voraussetzung.',
+       'description_menu_rubriques_articles' => 'Zeigt einen Liste der Rubriken und auf Wunsch der Unterrubriken und Artikel als Hierarchie an. In der Grundeinstellung werden alle Rubriken von der obersten Ebene an dargestellt. Sie werden nach Titeln (zuerst numerisch und dann alphabetisch) sortiert. Artikel werden immer hinter den Rubriken angezeigt.',
+       'description_menu_rubriques_completes' => 'Zeigt eine Liste der Rubriken und, wenn gewünscht, der Unterrubriken auf mehreren Ebenen an. Die Standardeinstellung zeigt alle Rubriken sortiert nach Titel an (mit Ordnungszahl nummerierte zuerst).',
+       'description_menu_secteurlangue' => 'Dieser Eintrag bezieht sich aud die Sites, welche pro Sprache ein Hauptrubrik verwenden. Er zeigt ein Menü mit allen Rubriken des Sektors, die mit der Sprache übereinstimmen, wenn erfordelich auf über mehrere Niveaus. In der Grundeinstelung werden alle Rubriken ab der obersten Ebene nach Titel (numerisch und anschließend alphanumerisch) sortiert angezeigt.',
+       'description_menu_texte_libre' => 'Ein beliebiger Text oder ein Sprachcode von SPIP im Format <:...:>',
+
+       // E
+       'editer_menus_editer' => 'Menü bearbeiten',
+       'editer_menus_explication' => 'Gestalten und konfigurieren sie hier die Menüs ihrer Website.',
+       'editer_menus_exporter' => 'Menü exportieren',
+       'editer_menus_nouveau' => 'Neues Menü anlegen',
+       'editer_menus_titre' => 'Menüs der Website',
+       'entree_afficher_articles' => 'Artikel in das Menü einbeziehen? ("oui" eintragen wenn gewünscht)',
+       'entree_afficher_item_suite' => 'Artikel in das Menü einbeziehen? ("oui" eintragen wenn gewünscht)',
+       'entree_articles_max' => 'Wenn ja, Artikel nur anzeigen, wenn die Rubrik maximal xx Artikel enthält. (Obergrenze eintragen, leer lassen um alle anzuzeigen)',
+       'entree_articles_max_affiches' => 'Wenn ja, Anzahl der angezeigten Artikel auf xx begrenzen; weitere werden durch den Eintrag "... alle Artikel" ersetzt. (Obergrenze eintragen, leer lassen um alle anzuzeigen)',
+       'entree_aucun' => 'Keiner',
+       'entree_bloc' => 'ZPIP Block',
+       'entree_choisir' => 'Wählen sie die Art EIntrag, die sie hinzufügen wollen:',
+       'entree_classe_parent' => 'Klasse der Links zu übergeordneten Objekten. Diese Klasse wird den li>a hinzugefügt, die sich mit ul/li fortsetezn. Wenn Sie z.B. "daddy" erfassen, können Sie das Plugin menu deroulant 2 zur Formatierung des Menüs einsetzen.',
+       'entree_connexion_objet' => 'Objekt wird nur angezeigt, wenn man entweder eingelogt ("session" eintragen) oder nicht eingelogt ist ("nosession" eintragen)',
+       'entree_contenu' => 'Inhalt',
+       'entree_css' => 'CSS-Klassen des Eintrags (des Containers)',
+       'entree_css_lien' => 'CSS-Klassen des Links',
+       'entree_id_groupe' => 'Nummer der Schlagwortgruppe',
+       'entree_id_mot' => 'Nummer des Schlagworts',
+       'entree_id_objet' => 'Nummer',
+       'entree_id_rubrique' => 'Nummer der übergeordeneten Rubrik',
+       'entree_id_rubrique_ou_courante' => 'Nummer der "Elternrubrik" oder der "aktuellen" Rubrik, wenn die Elternrubrik die aktuelle Rubrik des Kontext ist.',
+       'entree_id_rubriques_exclues' => 'Nummern der auszuschließenden Rubriken, getrennt durch Semikolons.',
+       'entree_id_secteur_exclus' => 'Nummern der auszuschließenden Sektoren, getrennt mit Kommata',
+       'entree_infini' => 'Unendlich',
+       'entree_mapage' => 'Meine eigene Seite',
+       'entree_masquer_articles_uniques' => 'Wenn ja und falls die Rubrik nur einen Artikel enthält wird dieser maskiert ("oui" eintragen wenn gewünscht).',
+       'entree_niveau' => 'Tiefe der Unterrubriken',
+       'entree_nombre_articles' => 'Maximale Anzahl Artikel (Standardwert 0)',
+       'entree_page' => 'Name der Seite',
+       'entree_parametres' => 'Parameterliste',
+       'entree_rubriques_max_affichees' => 'Wenn definiert, dann wird die Zahl der gelisteten Rubriken auf xx begrenzt und von einem Eintrag "... alle Rubriken" abgeschlossen. Obergrenze eintragen oder leer lassen, wenn alle angezeigt werden sollen.',
+       'entree_sousrub_cond' => 'Nur Unterrubriken der aktuellen Rubrik anzeigen ("oui" eintragen, falls nicht gewünscht leer lassen)',
+       'entree_suivant_connexion' => 'Verhalten des Eintrags in Abhängigkeit vom Verbindungsstatus: "Verbinden" wird nur angezeigt, wenn der Besucher nicht eingelogt ist, anderenfalls wird "Log-Out" angezeit. Freilassen, um den Eintrag immer anzuzeigen.', # MODIF
+       'entree_suivant_connexion_connecte' => 'nur wenn verbunden',
+       'entree_suivant_connexion_deconnecte' => 'nur wenn nicht verbunden',
+       'entree_sur_n_articles' => '@n@ Artikel angezeigt',
+       'entree_sur_n_mots' => '@n@ Worte angezeigt',
+       'entree_sur_n_niveaux' => 'Auf @n@ Niveau(s)',
+       'entree_titre' => 'Titel',
+       'entree_titre_connecter' => 'Titel für den Zugang zum Anmeldeformular',
+       'entree_titre_prive' => 'Titel für den Redaktionszugang',
+       'entree_traduction_articles_rubriques' => 'Wenn möglich Artikel der Rubrik in der Sprache des Kontext anzeigen ("oui" eintragen wenn gewünscht)',
+       'entree_traduction_objet' => 'Übersetzung von Artikeln in Abhängigkeit vom Sprachkontext auswählen (für diese EInstellung "trad" eintragen)',
+       'entree_tri_alpha' => 'Sortierung der Rubriken (alphanumerisch). Wenn Sie ein Datum angeben, wird das Kriterium {par date} hinzugefügt. und die Rubriken weden nach Datum sortiert.',
+       'entree_tri_alpha_articles' => 'Sortierung der Artikel (alphanumerisch). Wenn Sie ein Datum angeben, wird das Kriterium {par date} hinzugefügt. und die Artikel weden nach Datum sortiert.',
+       'entree_tri_alpha_articles_inverse' => 'Aplphabetische Sortierung umkehren  (dazu "oui" eingeben) ?',
+       'entree_tri_alpha_inverse' => 'Aplphabetische Sortierung umkehren  (dazu "oui" eingeben) ?',
+       'entree_tri_num' => 'Sortierung der Rubriken (numerisch). Wenn Sie einen Titel angeben, wird das Kriterium {par titre} hinzugefügt und die Rubrieken werden nach Titel sortiert angezeigt.',
+       'entree_tri_num_articles' => 'Sortierung der Rubriken (numerisch). Wenn Sie einen Titel angeben, wird das Kriterium {par titre} hinzugefügt und die Rubrieken werden nach Titel sortiert angezeigt.',
+       'entree_tri_num_articles_inverse' => 'Numerische Reihenfolge umkehren (dazu "oui" eingeben) ?',
+       'entree_tri_num_inverse' => 'Numerische Reihenfolge umkehren (dazu "oui" eingeben) ?',
+       'entree_type_objet' => 'Objekttyp',
+       'entree_url' => 'Adresse',
+       'entree_url_public' => 'Zieladresse nach der Anmeldung',
+       'erreur_aucun_type' => 'Kein Eintragstyp gefunden.',
+       'erreur_autorisation' => 'Sie dürfen Menüs nicht ändern.',
+       'erreur_identifiant_deja' => 'Deise Bezeichnung wird bereits von einem Menü verwendet.',
+       'erreur_identifiant_forme' => 'Die Bezeichnung darf nur Buchstaben, Ziffern und den Unterstrich enthalten.',
+       'erreur_menu_inexistant' => 'Das angeforderte Menü existiert nicht.',
+       'erreur_mise_a_jour' => 'Beim Aktualisieren der Datenbank ist ein Fehler aufgetreten.',
+       'erreur_parametres' => 'Fehler in den Seitenparametern',
+       'erreur_type_menu' => 'Sie müssen einen Menütyp wählen',
+       'erreur_type_menu_inexistant' => 'Dieser Menütyp ist nicht verfügbar.',
+
+       // F
+       'formulaire_ajouter_entree' => 'Eintrag hinzufügen',
+       'formulaire_ajouter_sous_menu' => 'Untermenü hinzufügen',
+       'formulaire_css' => 'CSS-Klassen',
+       'formulaire_css_explication' => 'Sie können dem Menü eventuell vorhandene zusätzliche CSS-Klassen zuordnen.',
+       'formulaire_deplacer_bas' => 'Nach unten verschieben',
+       'formulaire_deplacer_haut' => 'Nach oben verschieben',
+       'formulaire_facultatif' => 'Fakultatif',
+       'formulaire_identifiant' => 'Bezeichnung',
+       'formulaire_identifiant_explication' => 'Vergeben sie ein Schlagwort, mit dem sie das Menü leicht aufrufen können..',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Wählen Sie die die zu importierenden Menüs',
+       'formulaire_ieconfig_importer' => 'Importieren',
+       'formulaire_ieconfig_menu_meme_identifiant' => 'ACHTUNG: Ihre Website enthält bereits ein Menü mit der selben ID!',
+       'formulaire_ieconfig_menus_a_exporter' => 'Zu exportierende Menüs:',
+       'formulaire_ieconfig_ne_pas_importer' => 'Nicht importieren',
+       'formulaire_ieconfig_remplacer' => 'Aktuelles Menü durch das zu importierende ersetzen',
+       'formulaire_ieconfig_renommer' => 'Menü vor Import umbenennen',
+       'formulaire_importer' => 'Menü importieren',
+       'formulaire_importer_explication' => 'Wenn sie ein Menü in eine Datei exportiert haben, können sie es jetzt importieren.',
+       'formulaire_modifier_entree' => 'Eintrag bearbeiten',
+       'formulaire_modifier_menu' => 'Menü bearbeiten:',
+       'formulaire_nouveau' => 'Neues Menü',
+       'formulaire_partie_construction' => 'Aufbau des Menüs',
+       'formulaire_partie_identification' => 'Bezeichnung des Menüs',
+       'formulaire_supprimer_entree' => 'Eintrag löschen',
+       'formulaire_supprimer_menu' => 'Menü löschen',
+       'formulaire_supprimer_sous_menu' => 'Untermenü löschen',
+       'formulaire_titre' => 'Titel',
+
+       // I
+       'info_afficher_articles' => 'Artikel werden im Menü angezeigt',
+       'info_articles_max' => 'Nur wenn die Rubrik maximal @max@ Artikel enthält.',
+       'info_articles_max_affiches' => 'Anzeige ist begrenst auf maximal @max@  Artikel.',
+       'info_classe_parent' => 'Klasse der übergeordneten Objekte:',
+       'info_connexion_obligatoire' => 'Login obligatorisch',
+       'info_deconnexion_obligatoire' => 'Nur wenn nicht eingelogt',
+       'info_masquer_articles_uniques' => 'Einzelne Artikel maskieren.',
+       'info_numero_menu' => 'MENÜ NUMMER:',
+       'info_page_speciale' => 'Link zu Seite « @page@ »',
+       'info_page_speciale_zajax' => 'Modale Box der Seite « @page@ » für den Block « @bloc@ »',
+       'info_rubrique_courante' => 'Aktuelle Rubrik',
+       'info_rubriques_exclues' => ' / außer Rubrik(en) @id_rubriques@',
+       'info_rubriques_max_affichees' => 'Auf @max@ Rubriken begrenzen',
+       'info_secteur_exclus' => ' / außer Sektor(en) @id_secteur@',
+       'info_sousrub_cond' => 'Nur die Unterrubriken der aktuellen Rubrik werden angezeigt',
+       'info_tous_groupes_mots' => 'Alle Schlagwortgruppen',
+       'info_traduction_recuperee' => 'Die angezeigte Übersetzung wird je nach Sprachkontext gewählt.',
+       'info_tri' => 'Sortierung der Rubriken:',
+       'info_tri_alpha' => '(alphabetisch)',
+       'info_tri_articles' => 'Sortierung der Artikel',
+       'info_tri_num' => '(numerische)',
+
+       // N
+       'noisette_description' => 'Fügt ein mit dem Plugin "Menus" generiertes Menü ein',
+       'noisette_label_afficher_titre_menu' => 'Titel des Menüs anzeigen?',
+       'noisette_label_identifiant' => 'Dieses Menü anzeigen:',
+       'noisette_nom_noisette' => 'Menü',
+       'nom_menu_accueil' => 'Startseite',
+       'nom_menu_articles_rubrique' => 'Artikel einer Rubrik',
+       'nom_menu_deconnecter' => 'Abmelden',
+       'nom_menu_espace_prive' => 'Einloggen / zum Redaktionssystem',
+       'nom_menu_groupes_mots' => 'Schlagworte und Artikel einer Schlagwortgruppe',
+       'nom_menu_lien' => 'Beliebiger Link',
+       'nom_menu_mapage' => 'Meine Seite',
+       'nom_menu_mots' => 'Artikel eines Schlagworts',
+       'nom_menu_objet' => 'Artikel, Rubrik oder anderes SPIP-Objekt',
+       'nom_menu_page_speciale' => 'Link zu einer HTML-Vorlage',
+       'nom_menu_page_speciale_zajax' => 'Block einer ZPIP-Seite',
+       'nom_menu_rubriques_completes' => 'Listen- oder Baumansicht von Rubriken und Artikeln mit zahlreichen Optionen',
+       'nom_menu_rubriques_evenements' => 'Ereignisse der Rubriken',
+       'nom_menu_secteurlangue' => 'Hauptrubriken nach Sprache',
+       'nom_menu_texte_libre' => 'Freitext',
+
+       // T
+       'tous_les_articles' => '... alle Artikel',
+       'toutes_les_rubriques' => '... alle Rubriken'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_en.php b/www/plugins/menus_1/lang/menus_en.php
new file mode 100644 (file)
index 0000000..ee8adad
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/menus?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'Do you really want delete this entry?',
+
+       // D
+       'description_menu_accueil' => 'Link to website\'s home page.',
+       'description_menu_articles_rubrique' => 'Display the list of articles in a section.',
+       'description_menu_deconnecter' => 'If the visitor is connected, add an entry offering disconnection.',
+       'description_menu_espace_prive' => 'Link enabling the connection to the site if you aren\'t already connected, and then to enter the private space if you are authorised to do so.',
+       'description_menu_groupes_mots' => 'Automatically show a menu listing the keyword of the group and the linked articles. By default it shows the list of keyword groups and the keywords within them. If a groupes_mots.html template exists, the link to the group is used.',
+       'description_menu_lien' => 'Adds an individually specified link, either an internal one (relative URL), or an external one (http://...).',
+       'description_menu_mapage' => 'If visitors are connected, add a link to their author page.',
+       'description_menu_mots' => 'Automatically shows a menu listing the articles linked to a keyword.',
+       'description_menu_objet' => 'Creates a link to s SPIP object: article, section or other. By default, the entry will bear the the title of the object.',
+       'description_menu_page_speciale' => 'Adds a link to a page template using a URL of the form <code>spip.php?page=name&param1=xx&param2=yyy...</code> Such pages are often used by plugins.',
+       'description_menu_page_speciale_zajax' => 'Add a link to a block in a page accessible by a URL of the type <code>spip.php?page=name&param1=xx&param2=yyy...</code> This requires a Z type template and the <a href="http://www.spip-contrib.net/MediaBox">médiabox</a> plugin.',
+       'description_menu_rubriques_articles' => 'Display a list of sections, optionally including sub-sections and articles nested to several levels. By default, all sections will be displayed starting from the site root and sorted by title (numerically then alphabetically).Articles in a given section will always be listed after any sub-sections.',
+       'description_menu_rubriques_completes' => 'Displays a list of topics and, if you want, sub-sections on many levels. By default, displays all entries from the root, sorted by title (alphabetically and numerically).',
+       'description_menu_secteurlangue' => 'This entry can be used by sites which have one language per sector. It displays a menu which lists the sections of the sector corresponding to the language of the page, and if desired the subsections to several levels. By default, all sections are shown from the site root, sorted by title (numerically then alphabetically).',
+       'description_menu_texte_libre' => 'Just the text that you would like, or a SPIP language code (<:...:>)',
+
+       // E
+       'editer_menus_editer' => 'Edit this menu',
+       'editer_menus_explication' => 'Create and configure menus for your site.',
+       'editer_menus_exporter' => 'Export this menu',
+       'editer_menus_nouveau' => 'Create a new menu',
+       'editer_menus_titre' => 'Site menus',
+       'entree_afficher_articles' => 'Include articles in the menu? (put "oui" for this)',
+       'entree_afficher_item_suite' => 'Include articles in the menu? (put "oui" for this)',
+       'entree_articles_max' => 'If so, show the articles only if the section contains a maximum of xx articles? (put the maximum number of articles, leave blank to display all articles)',
+       'entree_articles_max_affiches' => 'If so, limit the number of articles listed to a maximum of  xx (followed by an item "... All the articles" with a link to the parent section)? (indicate the maximum number of articles, leave blank to display all of them)',
+       'entree_aucun' => 'None',
+       'entree_bloc' => 'Zpip block',
+       'entree_choisir' => 'Choose the type of item you want to add:',
+       'entree_classe_parent' => 'CSS class of the links of the parent elements. This class will be added to the li>a having a subsequent ul / li. For example, if you type "daddy", it allows you to use the plugin "menu deroulant 2" to format the menu.',
+       'entree_connexion_objet' => 'Requires being connected (insert "session") or disconnected (insert "nosession") in order to see the object',
+       'entree_contenu' => 'Content',
+       'entree_css' => 'CSS classes of this (container) item',
+       'entree_css_lien' => 'CSS classes of the link',
+       'entree_id_groupe' => 'Number of the keyword group',
+       'entree_id_mot' => 'Number of the keyword',
+       'entree_id_objet' => 'Number',
+       'entree_id_rubrique' => 'Number of the parent section',
+       'entree_id_rubrique_ou_courante' => 'Parent or "current" section number if the parent section is the current section of the context',
+       'entree_id_rubriques_exclues' => 'Numbers of the sections to be excluded, separated by commas',
+       'entree_id_secteur_exclus' => 'Numbers of the sectors to be excluded, separated by commas',
+       'entree_infini' => 'To infinity',
+       'entree_mapage' => 'My page',
+       'entree_masquer_articles_uniques' => 'If so and if a section contains a only one article, hide it? (put "oui" for this)',
+       'entree_niveau' => 'Sub-sections level',
+       'entree_nombre_articles' => 'Maximum number of articles (0 by default)',
+       'entree_page' => 'Name of the page',
+       'entree_parametres' => 'List of parameters',
+       'entree_rubriques_max_affichees' => 'If so, limit the number of sections listed to a maximum of xx (followed by an item "... All sections" with a link to the parent section)? (indicate the maximum number of sections, leave blank to show all of them)',
+       'entree_sousrub_cond' => 'Only display the subsections for the current section (enter "oui" (yes), otherwise leave it empty)',
+       'entree_suivant_connexion' => 'Restrict this entry according to the connection (put "connecte" to display it only if the visitor is connected, "deconnecte" in the opposite case, put "admin" if the author is administrator or leave blank to always display it)',
+       'entree_suivant_connexion_connecte' => 'only if connected',
+       'entree_suivant_connexion_deconnecte' => 'only if disconnected',
+       'entree_sur_n_articles' => '@n@ article(s) shown',
+       'entree_sur_n_mots' => '@n@ keyword(s) shown',
+       'entree_sur_n_niveaux' => 'On @n@ level(s)',
+       'entree_titre' => 'Title',
+       'entree_titre_connecter' => 'The title for accessing the identification form',
+       'entree_titre_prive' => 'The title for accessing the private zone',
+       'entree_traduction_articles_rubriques' => 'If possible, show the articles of the section in the language of the context (put "trad" for this)',
+       'entree_traduction_objet' => 'For an article, select the translation depending on the context (insert "trad" to accomplish this)',
+       'entree_tri_alpha' => 'Sort criterion of the sections (alphabetical). If you type "date", the added criterion will be {par date} (by date) and the sections will be sorted by date',
+       'entree_tri_alpha_articles' => 'Sort criterion of the articles (alphabetical). If you type "date", the added criterion will be {par date} and the article will be sorted by date',
+       'entree_tri_alpha_articles_inverse' => 'Reverse the sorting alphabetically? (put "oui" for this)',
+       'entree_tri_alpha_inverse' => 'Reverse the alphabetical sorting? (put "oui" for this)',
+       'entree_tri_num' => 'Sort criterion of the sections (digital). If you type "titre" (title), the added criterion will be {par num titre} and the sections will be number of the titles',
+       'entree_tri_num_articles' => 'Sort criterion of the articles (digital). If you type "titre" (title), the added criterion will be {par num titre} and the articles will be sorted by number of title',
+       'entree_tri_num_articles_inverse' => 'Reverse the digital sort order? (put "oui" for this)',
+       'entree_tri_num_inverse' => 'Reverse the digital sort order? (put "oui" for this)',
+       'entree_type_objet' => 'Object type',
+       'entree_url' => 'URL',
+       'entree_url_public' => 'Return address after logging in',
+       'erreur_aucun_type' => 'No item type was found.',
+       'erreur_autorisation' => 'You are not allowed to modify menus.',
+       'erreur_identifiant_deja' => 'This identifier is already used by another menu.',
+       'erreur_identifiant_forme' => 'Identifier must contain only letters, digits or underscores.',
+       'erreur_menu_inexistant' => 'Menu number @id@ doesn\'t exist.',
+       'erreur_mise_a_jour' => 'An error occured during database update.',
+       'erreur_parametres' => 'There is an error in the parameters of the page',
+       'erreur_type_menu' => 'You need to choose a type of menu',
+       'erreur_type_menu_inexistant' => 'This kind of menu is not / no longer available',
+
+       // F
+       'formulaire_ajouter_entree' => 'Add a menu item',
+       'formulaire_ajouter_sous_menu' => 'Create a sub-menu',
+       'formulaire_css' => 'CSS classes',
+       'formulaire_css_explication' => 'You can add to your menu additional CSS classes.',
+       'formulaire_deplacer_bas' => 'Move down',
+       'formulaire_deplacer_haut' => 'Move up',
+       'formulaire_facultatif' => 'Optional',
+       'formulaire_identifiant' => 'Identifier',
+       'formulaire_identifiant_explication' => 'Give a unique keyword which let you call your menu easly.',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Select which menu(s) you would like to import.',
+       'formulaire_ieconfig_importer' => 'Import',
+       'formulaire_ieconfig_menu_meme_identifiant' => 'WARNING: there is already a menu with the same name on your site!',
+       'formulaire_ieconfig_menus_a_exporter' => 'Menus to export:',
+       'formulaire_ieconfig_ne_pas_importer' => 'Do not import',
+       'formulaire_ieconfig_remplacer' => 'Overwrite the current menu with the imported menu',
+       'formulaire_ieconfig_renommer' => 'Rename this menu before importing',
+       'formulaire_importer' => 'Import menu',
+       'formulaire_importer_explication' => 'If you exported a menu in a file, you can import now.',
+       'formulaire_modifier_entree' => 'Modify this menu item',
+       'formulaire_modifier_menu' => 'Modify menu:',
+       'formulaire_nouveau' => 'New menu',
+       'formulaire_partie_construction' => 'Menu construction',
+       'formulaire_partie_identification' => 'Menu identification',
+       'formulaire_supprimer_entree' => 'Delete this menu item',
+       'formulaire_supprimer_menu' => 'Delete the menu',
+       'formulaire_supprimer_sous_menu' => 'Delete this sub-menu',
+       'formulaire_titre' => 'Title',
+
+       // I
+       'info_afficher_articles' => 'The articles will be included in the menu.',
+       'info_articles_max' => 'Only if the section contains more than @max@ articles',
+       'info_articles_max_affiches' => 'Display limited to @max@ articles',
+       'info_classe_parent' => 'Class of the parent elements:',
+       'info_connexion_obligatoire' => 'Connection required',
+       'info_deconnexion_obligatoire' => 'Only when disconnected',
+       'info_masquer_articles_uniques' => 'Unique articles hidden',
+       'info_numero_menu' => 'MENU NUMBER:',
+       'info_page_speciale' => 'Link to the page « @page@ »',
+       'info_page_speciale_zajax' => 'Modalbox for the "@page@" page for the "@bloc@" block',
+       'info_rubrique_courante' => 'Current section',
+       'info_rubriques_exclues' => ' / except section(s) @id_rubriques@',
+       'info_rubriques_max_affichees' => 'Display limited to @max@ sections',
+       'info_secteur_exclus' => ' / except sector(s) @id_secteur@',
+       'info_sousrub_cond' => 'Only the subsections of the current section are displayed.',
+       'info_tous_groupes_mots' => 'All keyword groups',
+       'info_traduction_recuperee' => 'The context will determine the selected translation',
+       'info_tri' => 'Sort sections:',
+       'info_tri_alpha' => '(alphabetical)',
+       'info_tri_articles' => 'Sort articles:',
+       'info_tri_num' => '(numerical)',
+
+       // N
+       'noisette_description' => 'Insert a menu defined with the Menus plugin.',
+       'noisette_label_afficher_titre_menu' => 'Show the menu title?',
+       'noisette_label_identifiant' => 'Menu to display:',
+       'noisette_nom_noisette' => 'Menu',
+       'nom_menu_accueil' => 'Home Page',
+       'nom_menu_articles_rubrique' => 'Articles of a section',
+       'nom_menu_deconnecter' => 'Disconnect',
+       'nom_menu_espace_prive' => 'Login / link to the private zone',
+       'nom_menu_groupes_mots' => 'Keywords and Articles of a group of keywords',
+       'nom_menu_lien' => 'Individual link',
+       'nom_menu_mapage' => 'My page',
+       'nom_menu_mots' => 'Articles of a keyword',
+       'nom_menu_objet' => 'Article, section or other SPIP object',
+       'nom_menu_page_speciale' => 'Link to a page template',
+       'nom_menu_page_speciale_zajax' => 'A block in a Zpip page',
+       'nom_menu_rubriques_completes' => 'List or tree of sections and articles (with many options)',
+       'nom_menu_rubriques_evenements' => 'Section-related events',
+       'nom_menu_secteurlangue' => 'Language sectors',
+       'nom_menu_texte_libre' => 'Free text',
+
+       // T
+       'tous_les_articles' => '... All articles',
+       'toutes_les_rubriques' => '... All sections'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_es.php b/www/plugins/menus_1/lang/menus_es.php
new file mode 100644 (file)
index 0000000..dbcaca0
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/menus?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => '¿Quiere realmente eliminar esta entrada?',
+
+       // D
+       'description_menu_accueil' => 'Enlace a la portada del sitio.',
+       'description_menu_articles_rubrique' => 'Muestra una lista de artículos de una sección.',
+       'description_menu_deconnecter' => 'Si el visitante se conecta, se añade una entrada que propone la desconexión.',
+       'description_menu_espace_prive' => 'Enlace para conectarse al sitio si no está ya conectado, y luego ir a la zona privada, si se tiene autorización.',
+       'description_menu_groupes_mots' => 'Muestra automáticamente un menú con las palabras del grupo y artículos relacionados. De manera predeterminada, muestra la lista de frases y palabras. Si un esqueleto groupes_mots.html existe, el enlace con el grupo es utilizado.',
+       'description_menu_lien' => 'Añade un enlace arbitrario interno (URL relativa) o externo (http://...).',
+       'description_menu_mapage' => 'Si el visitante se conecta, añade un enlace a su página de autor.',
+       'description_menu_mots' => 'Muestra automáticamente un menú que enumera los artículos relacionados con la palabra clave.',
+       'description_menu_objet' => 'Crea un enlace a un objeto de SPIP: artículo, sección u otro. De manera predeterminada, la entrada será el título del objeto.',
+       'description_menu_page_speciale' => 'Añade un enlace a un esqueleto página accesible para una url del tipo <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Estas páginas se proporcionan a menudo por los plugins.',
+       'description_menu_page_speciale_zajax' => 'Añadir un enlace a un bloque de una página accesible por una url del tipo <code>spip.php?page=nom¶m1=xx¶m2=yyy...</code> Esto requiere un esqueleto de tipo Z y el plugin <a href="http://www.spip-contrib.net/MediaBox"> Mediabox</ a>.',
+       'description_menu_rubriques_articles' => 'Muestra una lista de secciones y, si se quiere, subsecciones y artículos en varios niveles. De manera predeterminada, muestra todas las secciones de la raíz, ordenados por título (en orden alfabético y numérico). Los artículos se colocan automáticamente después de las secciones.',
+       'description_menu_rubriques_completes' => 'Muestra una lista de secciones y, si se quiere, las subsecciones en varios niveles. Por defecto, muestra todas las secciones desde la raíz, ordenadas por título (numéricamente, y luego alfabéticamente).',
+       'description_menu_secteurlangue' => 'Esta entrada es específica de los sitios que utilizan un sector para cada idioma. Se muestra automáticamente un menú con las secciones de la zona correspondiente al idioma de la página y, si se quiere, las sub-secciones en varios niveles. De manera predeterminada, muestra todas las secciones de la raíz, ordenados por título (en orden alfabético y numérico).',
+       'description_menu_texte_libre' => 'Simplemente el texto que deseas, o un código de idiomas SPIP (<:...:>)',
+
+       // E
+       'editer_menus_editer' => 'Modificar el menú',
+       'editer_menus_explication' => 'Crear y configurar aquí los menús de su sitio',
+       'editer_menus_exporter' => 'Exportar el menú',
+       'editer_menus_nouveau' => 'Crear un nuevo menú',
+       'editer_menus_titre' => 'Menús del sitio',
+       'entree_afficher_articles' => 'Incluir los artículos en en el menú  ? (escribe "oui" para para que ocurra)',
+       'entree_afficher_item_suite' => 'Incluir los artículos en el menu ? (escribe "oui" para esto)',
+       'entree_articles_max' => 'Si es así, ¿ver los artículos sólo si la sección contiene como máximo xx artículos? (indicar el máximo número de artículos, o bien dejar en blanco para mostrar todos los artículos)',
+       'entree_articles_max_affiches' => 'Si es así, ¿limitar el número de artículos listados en xx máximo (seguidos de un ítem "... Todos los artículos", con un enlace a la sección padre)? (Indique el número máximo de artículos, dejar en blanco para mostrar todos los artículos)',
+       'entree_aucun' => 'Ninguno',
+       'entree_bloc' => 'Bloquear Zpip',
+       'entree_choisir' => 'Seleccione el tipo de entrada que desea añadir:',
+       'entree_classe_parent' => 'Clase de vínculos de elementos primarios. Esta clase se añadirá a li>a asociados a ul/li. Por ejemplo, si escribe "papá", lo que le permite utilizar el plugin "menu deroulant 2" para este menú.',
+       'entree_connexion_objet' => 'Obligar  a estar conectado (poner "session") o desconectado (poner "nosession") para ver el objeto',
+       'entree_contenu' => 'Contenido',
+       'entree_css' => 'Clases css de la entrada (contenedor)',
+       'entree_css_lien' => 'Clases CSS del link',
+       'entree_id_groupe' => 'Número del grupo de palabras clave',
+       'entree_id_mot' => 'Número de palabra clave',
+       'entree_id_objet' => 'Número',
+       'entree_id_rubrique' => 'Número de la sección padre',
+       'entree_id_rubrique_ou_courante' => 'Número de la sección madre o "corriente" si la sección padre es la sección corriente del contexto',
+       'entree_id_rubriques_exclues' => 'Números de secciones a excluir, separadas por coma',
+       'entree_id_secteur_exclus' => 'Números de sectores a excluir, separados por coma',
+       'entree_infini' => 'Al infinito',
+       'entree_mapage' => 'Mi página personal',
+       'entree_masquer_articles_uniques' => 'Si es así y si una sección contiene un solo elemento, se esconde? (Poner "oui" para esto)',
+       'entree_niveau' => 'Niveles de sub-secciones',
+       'entree_nombre_articles' => 'Número de artículos como máximo (0 por defecto)',
+       'entree_page' => 'Nombre de la página',
+       'entree_parametres' => 'Lista de parámetros',
+       'entree_rubriques_max_affichees' => 'Si es así, limitar el número de secciones listadas a xx máximo (seguido por una entrada "... Todos las secciones" con un enlace a la sección padre)? (Especifique el número máximo de secciones, dejar en blanco para mostrarlas todas)',
+       'entree_sousrub_cond' => 'Mostrar sólo subcategorías de la sección actual (poner "oui", de lo contrario dejar en blanco)',
+       'entree_suivant_connexion' => 'Restringir esta entrada según el estado de conexión (poner "connecte" para mostrar sólo si el visitante está conectado, "deconnecte" para el caso contrario, poner "admin" si el autor es administrador o dejar en blanco para mostrar siempre)',
+       'entree_suivant_connexion_connecte' => 'sólo si conectado',
+       'entree_suivant_connexion_deconnecte' => 'sólo si desconectado',
+       'entree_sur_n_articles' => '@n@ artículo(s) mostrado(s)',
+       'entree_sur_n_mots' => '@n@ palabra(s) mostrada(s)',
+       'entree_sur_n_niveaux' => 'En @n@ nivel(es)',
+       'entree_titre' => 'Título',
+       'entree_titre_connecter' => 'Título para acceder al formulario de identificación',
+       'entree_titre_prive' => 'Título para acceder al espacio privado',
+       'entree_traduction_articles_rubriques' => 'Siempre que sea posible, ver los artículos en la categoría en el idioma del contexto (poner "trad" para esto)',
+       'entree_traduction_objet' => 'En el caso de un artículo, seleccione la traducción en función del contexto (poner "trad" para esto)',
+       'entree_tri_alpha' => 'Criterio de orden de secciones (alfabético). Si escribe "date", el criterio será {par date} y los artículos serán ordenados por fecha',
+       'entree_tri_alpha_articles' => 'Criterio de orden de los artículos (alfabético). Si escribe "date", el criterio será {par date} y los artículos serán ordenados por fecha',
+       'entree_tri_alpha_articles_inverse' => 'Invertir el criterio de orden alfabético ? (poner "oui" para esto)',
+       'entree_tri_alpha_inverse' => 'Invertir el criterio de orden alfabético? (poner "oui" para esto)',
+       'entree_tri_num' => 'Criterio de orden de las secciones (numérico). Si escribe "titre", el criterio será {par num titre} y las secciones serán ordenados por fecha',
+       'entree_tri_num_articles' => 'Criterio de orden de los artículos (numérico). Si escribe "titre", el criterio será {par num titre} y los artículos serán ordenados por fecha',
+       'entree_tri_num_articles_inverse' => '¿Invertir el criterio de orden numérico ? (poner "oui" poara esto)',
+       'entree_tri_num_inverse' => '¿Invertir el criterio de orden numérico ? (poner "oui" poara esto)',
+       'entree_type_objet' => 'Tipo de objeto',
+       'entree_url' => 'Dirección',
+       'entree_url_public' => 'Dirección de retorno luego de la conexión',
+       'erreur_aucun_type' => 'Ningún tipo de entrada se encontró.',
+       'erreur_autorisation' => 'No estás autorizado a modificar los menús.',
+       'erreur_identifiant_deja' => 'Este identificador ya es utilizado por un menú.',
+       'erreur_identifiant_forme' => 'El identificador debe contener sólo letras, números o guión bajo.',
+       'erreur_menu_inexistant' => 'El menú con numéro @id@  solicitado no existe.',
+       'erreur_mise_a_jour' => 'Se produjo un error durante la actualización de la base de datos.',
+       'erreur_parametres' => 'Hubo un error en los parámetros de la página',
+       'erreur_type_menu' => 'Debes elegir un tipo de menú',
+       'erreur_type_menu_inexistant' => 'Este tipo de menu no está, o ya no está disponible',
+
+       // F
+       'formulaire_ajouter_entree' => 'Añadir una entrada',
+       'formulaire_ajouter_sous_menu' => 'Crear un submenú',
+       'formulaire_css' => 'Clases CSS',
+       'formulaire_css_explication' => 'Puedes agregar al menú eventuales clases CSS suplementarias.',
+       'formulaire_deplacer_bas' => 'Bajar',
+       'formulaire_deplacer_haut' => 'Subir',
+       'formulaire_facultatif' => 'Opcional',
+       'formulaire_identifiant' => 'Identificador',
+       'formulaire_identifiant_explication' => 'Indique una palabra clave única que le permita nombrar a su menú fácilmente.',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Elija el(los) menú(s) que desea importar.',
+       'formulaire_ieconfig_importer' => 'Importar',
+       'formulaire_ieconfig_menu_meme_identifiant' => 'ATENCION : un menú con el mismo identificador ya existe en tu sitio !',
+       'formulaire_ieconfig_menus_a_exporter' => 'Menús a exportar :',
+       'formulaire_ieconfig_ne_pas_importer' => 'No importar',
+       'formulaire_ieconfig_remplacer' => 'Reemplazar el menú actual por el menú importado',
+       'formulaire_ieconfig_renommer' => 'Renombrar el menú antes de importar',
+       'formulaire_importer' => 'Importar un menú',
+       'formulaire_importer_explication' => 'Si ha exportado un menú en un archivo, puede importarlo ahora.',
+       'formulaire_modifier_entree' => 'Modificar esta entrada',
+       'formulaire_modifier_menu' => 'Modificar el menú :',
+       'formulaire_nouveau' => 'Nuevo menú',
+       'formulaire_partie_construction' => 'Construcción del menú',
+       'formulaire_partie_identification' => 'Identificación del menú',
+       'formulaire_supprimer_entree' => 'Eliminar esta entrada',
+       'formulaire_supprimer_menu' => 'Eliminar el menú',
+       'formulaire_supprimer_sous_menu' => 'Eliminar el submenú',
+       'formulaire_titre' => 'Título',
+
+       // I
+       'info_afficher_articles' => 'Los artículos serán incluídos en el menú',
+       'info_articles_max' => 'Sólo si la sección contiene como máximo @max@ artículos',
+       'info_articles_max_affiches' => 'Visualización limitada a un máximo de @max@ artículos',
+       'info_classe_parent' => 'Clase de elementos padre : ',
+       'info_connexion_obligatoire' => 'Conexión obligatoria',
+       'info_deconnexion_obligatoire' => 'Únicamente desconectado',
+       'info_masquer_articles_uniques' => 'Artículos únicos ocultos',
+       'info_numero_menu' => 'MENU NÚMERO :',
+       'info_page_speciale' => 'Link a la página « @page@ »',
+       'info_page_speciale_zajax' => 'Modalbox de la página «@page@» para el bloque «@bloc@» ',
+       'info_rubrique_courante' => 'Sección en curso',
+       'info_rubriques_exclues' => ' / salvo la(s) sección(es) @id_rubriques@',
+       'info_rubriques_max_affichees' => 'Limitado a @max@ secciones',
+       'info_secteur_exclus' => ' / salvo el/los sector(es) @id_secteur@',
+       'info_sousrub_cond' => 'Sólo las subsecciones de las secciones que se muestran.',
+       'info_tous_groupes_mots' => 'Todos los grupos de palabras',
+       'info_traduction_recuperee' => 'El contexto decidirá la traducción elegida',
+       'info_tri' => 'Orden de secciones:',
+       'info_tri_alpha' => '(alfabético)',
+       'info_tri_articles' => 'Orden de artículos :',
+       'info_tri_num' => '(numérico)',
+
+       // N
+       'noisette_description' => 'Inserta un menú definido con el plugin Menús',
+       'noisette_label_afficher_titre_menu' => 'Mostrar el título del menú ?',
+       'noisette_label_identifiant' => 'Menú a mostrar  :',
+       'noisette_nom_noisette' => 'Menú',
+       'nom_menu_accueil' => 'Inicio',
+       'nom_menu_articles_rubrique' => 'Artículos de una sección',
+       'nom_menu_deconnecter' => 'Desconectarse',
+       'nom_menu_espace_prive' => 'Conectarse / link al espacio privado',
+       'nom_menu_groupes_mots' => 'Palabras claves y artículos de un grupo de palabras clave',
+       'nom_menu_lien' => 'Link arbitrario',
+       'nom_menu_mapage' => 'Mi página',
+       'nom_menu_mots' => 'Artículos de una palabra clave',
+       'nom_menu_objet' => 'Artículo, sección u otro objeto de SPIP',
+       'nom_menu_page_speciale' => 'Link a un esqueleto de página',
+       'nom_menu_page_speciale_zajax' => 'Un bloque de una página Zpip',
+       'nom_menu_rubriques_completes' => 'Lista o arborescencia de secciones y de artículos (con varias opciones)',
+       'nom_menu_rubriques_evenements' => 'Eventos de secciones',
+       'nom_menu_secteurlangue' => 'Sectores de idioma',
+       'nom_menu_texte_libre' => 'Texto libre',
+
+       // T
+       'tous_les_articles' => '... Todos los artículos',
+       'toutes_les_rubriques' => '... Todas las secciones'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_fa.php b/www/plugins/menus_1/lang/menus_fa.php
new file mode 100644 (file)
index 0000000..6b9a8b5
--- /dev/null
@@ -0,0 +1,190 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/menus?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'واقعاً مي‌خواهيد اين مدخل را حذف كنيد؟',
+
+       // D
+       'description_menu_accueil' => 'پيوند به صفحه‌ي پذيرش سايت.',
+       'description_menu_articles_rubrique' => 'نمايش فهرست مقالات يك بخش ',
+       'description_menu_deconnecter' => 'اگر بازديد كننده وصل شد، يك مدخل اضافه كنيد تا قطع شدن را به او ارايه دهد.',
+       'description_menu_espace_prive' => 'پيوندي كه ارتباط با سايت را فعال مي‌كند در صورتي كه قبلاً به سايت وصل نشده باشيد، و بعد وارد قسمت شخصي سايت شويد البته اگر مجاز باشيد.  ',
+       'description_menu_groupes_mots' => 'به طور خودكار گروه‌واژه‌ها و مقالات مرتبط با آن‌ها را فهرست مي‌كند. اين فهرست به صورت پيش‌ گزيده گروه‌‌واژه‌ها و كليدواژه‌هاي تحت آن‌ها را نشان مي‌دهد. اگر اسكلت يك groupes_mots.html وجود داشته باشد، پيوند به آن گروه‌واژه فعال مي‌شود. ',
+       'description_menu_lien' => 'افزودن يك پيوند فرداً تعيين شده، هم دروني (يوآرال نسبي) و هم بروني (http://...)',
+       'description_menu_mapage' => 'اگر بازديد‌كننده متصل است، يك پيوند به صفحه‌ي نويسنده‌‌‌اش اضافه كن.',
+       'description_menu_mots' => 'خودكار يك منوي فهرست تمام مقالات مرتبط با كليدواژه را نشان بده.',
+       'description_menu_objet' => 'ايجاد پيوند به چيزهاي اسپيپي: مقاله، بخش يا چيزهاي ديگر. پيش‌گزيده، هر مدخل تيتر آن چيز را داراست.',
+       'description_menu_page_speciale' => 'افزودن پيوند به صفحه‌ي اسكلت با استفاده از يوآرال اين فرم <code>spip.php?page=nom&param1=xx&param2=yyy...</code>. چنين صفحه‌هايي اغلب توسط پلاگين‌ها استفاده مي‌شوند.  ',
+       'description_menu_page_speciale_zajax' => 'افزودن يك پيوند به يك بلوك در صفحه‌اي قابل دسترس به وسيله‌ي يك يوآرال از نوع <code>spip.php?page=nom&param1=xx&param2=yyy...</code>. اين مستلزم يك استكلت نوع z و يك پلاگين <a href="http://www.spip-contrib.net/MediaBox">médiabox</a> خواهد بود.  ',
+       'description_menu_rubriques_articles' => 'نمايش يك فهرست از بخش‌ها، و اگر مي‌خواهيد، زيربخش‌ها و مقاله‌ها در چندين سطح. 
+به صورت پيش‌گزيده، نمايش تمام بخش‌ها ريشه، مرتب شده بر اساس تيتر(شماره‌اي و بعد الفبايي). مقاله‌ها به طور نظام‌مند بعد از بخش‌ها قرار مي‌گيرند. 
+',
+       'description_menu_rubriques_completes' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).', # NEW
+       'description_menu_secteurlangue' => 'اين مدخل به سايت‌هايي اختصاص دارد كه يك بخش براي زبان دارند. اين مدخل به صورت خودكار منيويي را نشان مي‌دهد كه بخش‌ها آن قسمت منطبق با آن زبان و صفحه، و اگر بخواهند زيربخش‌ها را تا چندين سطح، را فهرست مي‌كنند. به صورت پيش‌گزيده، تمام بخش‌هاي عد از ريشه را، به ترتيب تيتر (طبق شماره و بعد طبق الفا) نشان مي‌دهد. 
+',
+       'description_menu_texte_libre' => 'فقط متني كه دوست داريد، يا يك كد زباني اسپيپ  (<:...:>)',
+
+       // E
+       'editer_menus_editer' => 'اصلاح اين منيو',
+       'editer_menus_explication' => 'منيوهاي سايتتان را اينجا ايجاد و پيكربندي كنيد.',
+       'editer_menus_exporter' => 'صادر سازي اين منيو',
+       'editer_menus_nouveau' => 'ايجاد يك منيوي جديد',
+       'editer_menus_titre' => 'منيوهاي سايت',
+       'entree_afficher_articles' => 'مقاله‌ها در منيو‌ گنجانده شود؟ (براي اين بگذاريد «بله»)',
+       'entree_afficher_item_suite' => 'گنجاندن مقاله‌ها در منيو؟ (براي اين بگذاريد «بله»)',
+       'entree_articles_max' => 'اگر بله، نمايش مقاله‌ها فقط اگر بخش شامل حداكثر ايكس ايكس مقاله است؟ (عدد مربوط به حداكثر مقاله را بگذاريد، براي نمايش تمام مقاله‌ها، خالي بگذاريد)
+',
+       'entree_articles_max_affiches' => 'در اين صورت، تعداد مقاله‌هاي فهرست شده تا حداكثر xx  محدود شود(بعد از يك فقره «...تمام مقاله‌ها» با يك لينك به بخش‌ والد)؟ (تعداد حداكثر مقاله‌ها را مشخص كنيد ، يا خالي بگذاريد تا تمام مقاله‌ها نشان داده شوند)
+',
+       'entree_aucun' => 'هيچي',
+       'entree_bloc' => 'بلاك ازپيپ (Bloc Zpip)',
+       'entree_choisir' => 'نوع مدخلي را كه مي‌خواهيد اضافه كنيد انتخاب نماييد.',
+       'entree_classe_parent' => 'طبقه‌ي پيوند‌هاي عناصر والد. اين طبقه دو باره به li>داراي پيامد  ul / lاضافه خواهد كرد. 
+به عنوان نمونه، اگر شما «ددي» را تايپ كنيد، اين به شما اجازه مي‌دهد تا پلاگين« منيو طوماري 2»» را براي فرمت بخشي به منيو مورد استفاده قرار دهيد. 
+',
+       'entree_connexion_objet' => 'براي ديدن اوبژه وصل بودن («session»وارد كنيد) يا قطع بودن («nosession»وارد كنيد) لازم است',
+       'entree_contenu' => 'محتوا',
+       'entree_css' => 'كلاش‌هاي سي.اس.اس (حامل) مدخل',
+       'entree_css_lien' => 'كلاس‌هاي سي.اس.اس پيوند',
+       'entree_id_groupe' => 'تعداد گروه واژه‌ها',
+       'entree_id_mot' => 'تعداد كليدواژه‌ها',
+       'entree_id_objet' => 'تعداد',
+       'entree_id_rubrique' => 'تعداد بخش‌هاي والد',
+       'entree_id_rubrique_ou_courante' => 'تعداد بخش‌ والد يا «فعلي» اگر بخش‌ والد در متن بخش فعلي باشد.',
+       'entree_id_rubriques_exclues' => 'تعداد بخش‌ها براي كنارگذاري، جداشده با ويرگول',
+       'entree_id_secteur_exclus' => 'تعداد بخش‌ها براي داخل‌ گذاري، جداشده با ويرگول',
+       'entree_infini' => 'تا بي‌نهايت',
+       'entree_mapage' => 'صفحه‌ي شخصي من',
+       'entree_masquer_articles_uniques' => 'در اين صورت و اگر يك بخش فقط يك مقاله دارد، آن را مخفي كند؟ (براي اين كار بگذاريد «بله»)',
+       'entree_niveau' => 'سطح زيربخش‌ها',
+       'entree_nombre_articles' => 'تعداد حداكثر مقاله‌ها (پيش گزيده صفر)',
+       'entree_page' => 'نام صفحه',
+       'entree_parametres' => 'فهرست پارامترها',
+       'entree_rubriques_max_affichees' => 'در اين صورت، تعداد بخش‌هاي فهرست شده تا حداكثر xx محدود شئذ (در پي فقره‌‌ي . . . «تمام بخش‌ها» با پيوند به بخش والد)؟
+(حداكثر تعداد بخش‌ها را تعيين كنيد، براي نشان دادن تمام آن‌ها خالي بگذاريد)
+',
+       'entree_sousrub_cond' => 'فقط نمايش زيربخش‌هاي بخش فعلي (بگذاريد «بله»، در غيراينصورت خالي بگذاريد)',
+       'entree_suivant_connexion' => 'منحصر سازي مدخل بعدي به اتصال (بگذاريد «اتصال» براي نمايش فقط اگر بازديد كننده متصل باشد، بگذاريد «قطع» براي مورد عكس، يا خالي بگذاريد تا هميشه نشان داده شود).
+', # MODIF
+       'entree_suivant_connexion_connecte' => 'فقط اگر متصل باشد',
+       'entree_suivant_connexion_deconnecte' => 'فقط اگر قطع باشد',
+       'entree_sur_n_articles' => '@n@ مقاله‌ي منتشره',
+       'entree_sur_n_mots' => '@n@ كلمه‌هاي منتشره ',
+       'entree_sur_n_niveaux' => 'تحت @n@ سطح',
+       'entree_titre' => 'تيتر',
+       'entree_titre_connecter' => 'تيتر براي دستيابي به فرم شناسايي',
+       'entree_titre_prive' => 'تيتر براي دسترسي به قسمت شخصي',
+       'entree_traduction_articles_rubriques' => 'در صورت امكان، نمايش مقاله‌هاي اين بخش به زبان متن («ترجمه» (trad) را براي اينكار بگذاريد)',
+       'entree_traduction_objet' => 'در مور مقاله، ترجمه را در ارتباط با آن متن انتخاب كنيد (براي آن trad را بگذاريد)',
+       'entree_tri_alpha' => ' معيار مرتب كردن بخش‌ها (الفبايي). اگر «تاريخ»"date" را تايپ كنيد، معيار اضافه شده (طبق تاريخ)‌ {par date}خواهد بدو بخش‌ها طبق ترايخ مرتب خواهند شد
+',
+       'entree_tri_alpha_articles' => 'مرتب‌ سازي معيارهاي مقاله‌ها (الفبايي). اگر «تاريخ» را تايپ كنيد، معيار افزوده شده {طبق تاريخ}خواهد بودو مقاله بر اساس تاريخ مرتب خواهد شد
+
+',
+       'entree_tri_alpha_articles_inverse' => 'معكس سازي مرتب‌سازي الفبايي؟ («بله» را براي آن بگذاريد)',
+       'entree_tri_alpha_inverse' => 'معكوس سازي مرتب‌سازي الفبايي؟ (براي آن «بله» بگذاريد)',
+       'entree_tri_num' => 'معيار مرتب كردن بخش‌ها (رقم). اگر «تيتر» را تايپ كنيد، معيار افزوده شده (طبق تيتر) {par num titre}خواهد بود و بخش‌ها بر اساس شماره تيتر‌ها مرتب خواهند شد
+',
+       'entree_tri_num_articles' => 'مرتب‌سازي مقاله‌ها (شماره‌اي). اگر «تيتر» را تايپ كنيد، معيار افزوده شده {طبق تيتر} خواهد بود و مقاله‌ها طبق شماره‌ي تيتر مرتب خواهند شد',
+       'entree_tri_num_articles_inverse' => 'معكوس سازي مرتب‌سازي بخش‌؟ (براي آن «بله» بگذاريد)',
+       'entree_tri_num_inverse' => 'معكوس سازي مرتب‌سازي شماره‌اي؟ (براي آن «بله» بگذاريد)',
+       'entree_type_objet' => 'نوع اوبژه',
+       'entree_url' => 'نشاني (يو.آر.ال) سايت شما',
+       'entree_url_public' => 'نشاني بازگشت بعد از اتصال ',
+       'erreur_aucun_type' => 'هيچ نوع مدخلي يافت نشد.',
+       'erreur_autorisation' => 'شما مجاز به اصلاح منيوي سايت نيستيد.',
+       'erreur_identifiant_deja' => 'از اين شناسه يك منيوي ديگر استفاده مي‌كند',
+       'erreur_identifiant_forme' => 'شناسه بايد فقط از حروف، رقم، و خط‌ زير تركيب شده باشد.',
+       'erreur_menu_inexistant' => 'منيوي درخواستي شماره @id@ موجود نيست.',
+       'erreur_mise_a_jour' => 'هنگام به هنگام سازي پايگاه داده‌ها خطايي رخ داده است.',
+       'erreur_parametres' => 'در پارامتر‌هاي صفحه خطايي وجود دارد',
+       'erreur_type_menu' => 'بايد نوعي از منيو را انتخاب كنيد',
+       'erreur_type_menu_inexistant' => 'اين نوع مينو فعلا/ديگر در دسترس نيست',
+
+       // F
+       'formulaire_ajouter_entree' => 'يك مدخل اضافه كنيد',
+       'formulaire_ajouter_sous_menu' => 'ايجاد يك زيرمنيو',
+       'formulaire_css' => 'سي.اس.اس طبقات',
+       'formulaire_css_explication' => 'مي‌توانيد به منيوي خود طبقات سي.اس.اس تكميلي اضافه كنيد.',
+       'formulaire_deplacer_bas' => 'حركت به پائين',
+       'formulaire_deplacer_haut' => 'حركت به بالا',
+       'formulaire_facultatif' => 'دلبخواهي ',
+       'formulaire_identifiant' => 'شناسه',
+       'formulaire_identifiant_explication' => 'يك كليدواژه‌ي منحصر به فرد بدهيد تا بتوانيد منيوي خود را به راحتي فرابخوانيد.',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'منيو‌هايي را كه مي‌خواهيد صادر كنيد انخاب كنيد',
+       'formulaire_ieconfig_importer' => 'واردات',
+       'formulaire_ieconfig_menu_meme_identifiant' => 'توجه: يك منيو با همين شناسه در سايت شما موجود است!',
+       'formulaire_ieconfig_menus_a_exporter' => 'منيو‌هاي صادراتي:',
+       'formulaire_ieconfig_ne_pas_importer' => 'وارد نكردن',
+       'formulaire_ieconfig_remplacer' => 'جايگزين سازي منيوي موجود با منوي وارداتي',
+       'formulaire_ieconfig_renommer' => 'تجديد نام اين منيو پيش از واردات',
+       'formulaire_importer' => 'واردسازي يك منيو',
+       'formulaire_importer_explication' => 'اگر يك منيو را داخل يك پرونده صادر كرده باشيد، مي‌توانيد آن را اكنون وارد كنيد.',
+       'formulaire_modifier_entree' => 'اصلاح اين مدخل',
+       'formulaire_modifier_menu' => 'اصلاح منيو:',
+       'formulaire_nouveau' => 'منيوي جديد',
+       'formulaire_partie_construction' => 'ساخت منيو',
+       'formulaire_partie_identification' => 'شناسه‌ي منيو',
+       'formulaire_supprimer_entree' => 'حذف اين مدخل
+
+',
+       'formulaire_supprimer_menu' => 'حذف منيو',
+       'formulaire_supprimer_sous_menu' => 'حذف اين زيرمنيو',
+       'formulaire_titre' => 'تيتر',
+
+       // I
+       'info_afficher_articles' => 'مقاله‌ها در منيو گنجانده خواهند شد',
+       'info_articles_max' => 'فقط اگر بخش بيش از @max@مقاله داشته باشد',
+       'info_articles_max_affiches' => 'نمايش محدود به @max@ مقاله ',
+       'info_classe_parent' => 'طبقه‌ي عناصر والد‌:',
+       'info_connexion_obligatoire' => 'اتصال اجباري',
+       'info_deconnexion_obligatoire' => 'فقط هنگام قطعي',
+       'info_masquer_articles_uniques' => 'منحصراً مقاله‌هاي پنهان',
+       'info_numero_menu' => 'منيوي شماره‌ي: ',
+       'info_page_speciale' => 'پيوند به صفحه‌ي  «@page@»',
+       'info_page_speciale_zajax' => 'مدال باكس صفحه‌ي  «@page@» براي بلوك «@bloc@»   ',
+       'info_rubrique_courante' => 'بخش فعلي',
+       'info_rubriques_exclues' => '/به جز بخش‌(هاي)@id_rubriques@ ',
+       'info_rubriques_max_affichees' => 'نمايش محدود به @max@ بخش‌ها',
+       'info_secteur_exclus' => '/به جز بخ‌ش (هاي) @id_secteur@',
+       'info_sousrub_cond' => 'فقط زيربخش‌هاي بخش‌هاي فعلي نمايش داده مي‌شوند.',
+       'info_tous_groupes_mots' => 'تمام گروه‌ واژه‌ها',
+       'info_traduction_recuperee' => 'متن ترجمه‌ي منتخب را تعيين خواهد كرد',
+       'info_tri' => 'ترتيب بخش‌ها:‌',
+       'info_tri_alpha' => '(الفبايي)',
+       'info_tri_articles' => 'مرتب‌ سازي مقاله‌ها:',
+       'info_tri_num' => '(شماره‌اي)',
+
+       // N
+       'noisette_description' => 'گنجاندن منيوي تعريف شده با پلاگين منو‌ها.',
+       'noisette_label_afficher_titre_menu' => 'نمايش تيتر منيو؟',
+       'noisette_label_identifiant' => 'منيو براي نمايش: ',
+       'noisette_nom_noisette' => 'منيو',
+       'nom_menu_accueil' => 'پذيرش',
+       'nom_menu_articles_rubrique' => 'مقاله‌هاي يك بخش',
+       'nom_menu_deconnecter' => 'قطع شدن',
+       'nom_menu_espace_prive' => 'اتصال/ پيوند به قسمت شخصي',
+       'nom_menu_groupes_mots' => 'كليدواژه‌ها و مقاله‌هاي يك گروه‌ واژه',
+       'nom_menu_lien' => 'پيوند دلبخواهي',
+       'nom_menu_mapage' => 'صفحه‌ من',
+       'nom_menu_mots' => 'مقاله‌هاي يك كليد واژه',
+       'nom_menu_objet' => 'مقاله، بخش يا ساير چيزهاي اسپيپي ',
+       'nom_menu_page_speciale' => 'پيوند به يك صفحه‌ي اسكلت',
+       'nom_menu_page_speciale_zajax' => 'يك بلوك از صفحه‌ي ازپيپ',
+       'nom_menu_rubriques_completes' => 'Liste ou arborescence de rubriques et d\'articles (avec beaucoup d\'options)', # NEW
+       'nom_menu_rubriques_evenements' => 'برنامه‌هاي مربوط به بخش‌ها',
+       'nom_menu_secteurlangue' => 'بخش‌هاي زباني ',
+       'nom_menu_texte_libre' => 'متن آزاد',
+
+       // T
+       'tous_les_articles' => '...تمام مقاله‌ها',
+       'toutes_les_rubriques' => '...تمام بخش‌ها'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_fr.php b/www/plugins/menus_1/lang/menus_fr.php
new file mode 100644 (file)
index 0000000..66a59d2
--- /dev/null
@@ -0,0 +1,172 @@
+<?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_/menus/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'Voulez-vous vraiment supprimer cette entrée ?',
+
+       // D
+       'description_menu_accueil' => 'Lien vers la page d\'accueil du site.',
+       'description_menu_articles_rubrique' => 'Affiche la liste des articles d\'une rubrique.',
+       'description_menu_deconnecter' => 'Si le visiteur est connecté, ajoute une entrée lui proposant la déconnexion.',
+       'description_menu_espace_prive' => 'Lien permettant de se connecter au site si on ne l\'est pas déjà, puis d\'aller dans l\'espace privé si l\'on y est autorisé.',
+       'description_menu_groupes_mots' => 'Affiche automatiquement un menu listant les mots du groupe et les articles liés. Par défaut, affiche la liste des groupes de mots et les mots liés. Si un squelette groupes_mots.html existe, le lien vers le groupe est utilisé.',
+       'description_menu_lien' => 'Ajoute un lien arbitraire, en interne (URL relative) ou externe (http://...).',
+       'description_menu_mapage' => 'Si le visiteur est connecté, ajoute un lien vers sa page auteur.',
+       'description_menu_mots' => 'Affiche automatiquement un menu listant les articles liés au mot clé.',
+       'description_menu_objet' => 'Crée un lien vers un objet de SPIP : article, rubrique ou autre. Par défaut, l\'entrée aura le titre de l\'objet.',
+       'description_menu_page_speciale' => 'Ajoute un lien vers un squelette page accessible par une url du type <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Ces pages sont souvent fournies par des plugins.',
+       'description_menu_page_speciale_zajax' => 'Ajoute un lien vers un bloc d\'une page accessible par une url du type <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Ceci nécéssite une squelette de type Z et le plugin <a href="http://www.spip-contrib.net/MediaBox">médiabox</a>.',
+       'description_menu_rubriques_articles' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques et les articles sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement). Les articles sont placés systématiquement après les rubriques.',
+       'description_menu_rubriques_completes' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).',
+       'description_menu_secteurlangue' => 'Cette entrée est spécifique aux sites utilisant un secteur par langue. Elle affiche automatiquement un menu listant les rubriques du secteur correspondant à la langue de la page et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).',
+       'description_menu_texte_libre' => 'Simplement le texte que vous souhaitez, ou un code de langue SPIP (<:...:>)',
+
+       // E
+       'editer_menus_editer' => 'Modifier ce menu',
+       'editer_menus_explication' => 'Créez et configurez ici les menus de votre site.',
+       'editer_menus_exporter' => 'Exporter ce menu',
+       'editer_menus_nouveau' => 'Créer un nouveau menu',
+       'editer_menus_titre' => 'Menus du site',
+       'entree_afficher_articles' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)',
+       'entree_afficher_item_suite' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)',
+       'entree_articles_max' => 'Si oui, afficher les articles seulement si la rubrique contient au maximum xx articles ? (mettre le nombre maximum d\'articles, laissez vide pour afficher tous les articles)',
+       'entree_articles_max_affiches' => 'Si oui, limiter le nombre d\'articles listés à xx maximum (suivis d\'un item "... Tous les articles" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum d\'articles, laissez vide pour afficher tous les articles)',
+       'entree_aucun' => 'Aucun',
+       'entree_bloc' => 'Bloc Zpip',
+       'entree_choisir' => 'Choisissez le type d\'entrée que vous voulez ajouter :',
+       'entree_classe_parent' => 'Classe des liens des éléments parents. Cette classe sera rajoutée aux li>a ayant une suite ul/li. Par exemple, si vous saisissez "daddy", cela vous permet d\'utiliser le plugin menu deroulant 2 pour la mise en forme du menu.',
+       'entree_connexion_objet' => 'Obliger à être connecté (mettre "session") ou déconnecté (mettre "nosession") pour voir l\'objet',
+       'entree_contenu' => 'Contenu',
+       'entree_css' => 'Classes CSS de l\'entrée (du conteneur)',
+       'entree_css_lien' => 'Classes CSS du lien',
+       'entree_id_groupe' => 'Numéro du groupe de mot clé',
+       'entree_id_mot' => 'Numéro du mot clé',
+       'entree_id_objet' => 'Numéro',
+       'entree_id_rubrique' => 'Numéro de la rubrique parente',
+       'entree_id_rubrique_ou_courante' => 'Numéro de la rubrique parente ou "courante" si la rubrique parente est la rubrique courante du contexte',
+       'entree_id_rubriques_exclues' => 'Numéros des rubriques à exclure, séparés par des virgules',
+       'entree_id_secteur_exclus' => 'Numéros des secteurs à exclure, séparés par des virgules',
+       'entree_infini' => 'À l\'infini',
+       'entree_mapage' => 'Ma page perso',
+       'entree_masquer_articles_uniques' => 'Si oui et si une rubrique contient un seul article, le masquer ? (mettre "oui" pour cela)',
+       'entree_niveau' => 'Niveau des sous-rubriques',
+       'entree_nombre_articles' => 'Nombre d\'articles au maximum (0 par défaut)',
+       'entree_page' => 'Nom de la page',
+       'entree_parametres' => 'Liste des paramètres',
+       'entree_rubriques_max_affichees' => 'Si oui, limiter le nombre de rubriques listés à xx maximum (suivis d\'un item "... Toutes les rubriques" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum de rubriques, laissez vide pour afficher toutes les rubriques)',
+       'entree_sousrub_cond' => 'N\'afficher que les sous-rubriques de la rubrique en cours (mettre "oui", sinon laisser vide)',
+       'entree_suivant_connexion' => 'Restreindre cette entrée suivant la connexion (mettre "connecte" pour afficher seulement si le visiteur est connecté, "deconnecte" pour le cas contraire, mettre "admin" si l\'auteur est administrateur ou laisser vide pour toujours afficher)',
+       'entree_suivant_connexion_connecte' => 'seulement si connecté',
+       'entree_suivant_connexion_deconnecte' => 'seulement si déconnecté',
+       'entree_sur_n_articles' => '@n@ articles affiché(s)',
+       'entree_sur_n_mots' => '@n@ mots affiché(s)',
+       'entree_sur_n_niveaux' => 'Sur @n@ niveau(x)',
+       'entree_titre' => 'Titre',
+       'entree_titre_connecter' => 'Titre pour l\'accès au formulaire d\'identification',
+       'entree_titre_prive' => 'Titre pour accéder à l\'espace privé',
+       'entree_traduction_articles_rubriques' => 'Dans la mesure du possible, afficher les articles de la rubrique dans la langue du contexte (mettre "trad" pour cela)',
+       'entree_traduction_objet' => 'Dans le cas d\'un article, choisir la traduction en fonction du contexte (mettre "trad" pour cela)',
+       'entree_tri_alpha' => 'Critère de tri des rubriques (alphabétique). Si vous saisissez "date", le critère ajouté sera {par date} et les rubriques seront triées par date',
+       'entree_tri_alpha_articles' => 'Critère de tri des articles (alphabétique). Si vous saisissez "date", le critère ajouté sera {par date} et les articles seront triés par date',
+       'entree_tri_alpha_articles_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)',
+       'entree_tri_alpha_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)',
+       'entree_tri_num' => 'Critère de tri des rubriques (numérique). Si vous saisissez "titre", le critère ajouté sera {par num titre} et les rubriques seront triées par numéro de titre',
+       'entree_tri_num_articles' => 'Critère de tri des articles (numérique). Si vous saisissez "titre", le critère ajouté sera {par num titre} et les articles seront triés par numéro de titre',
+       'entree_tri_num_articles_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)',
+       'entree_tri_num_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)',
+       'entree_type_objet' => 'Type de l\'objet',
+       'entree_url' => 'Adresse',
+       'entree_url_public' => 'Adresse de retour après la connexion',
+       'erreur_aucun_type' => 'Aucun type d\'entrée n\'a été trouvé.',
+       'erreur_autorisation' => 'Vous n\'êtes pas autorisé à modifier les menus.',
+       'erreur_identifiant_deja' => 'Cet identifiant est déjà utilisé par un menu.',
+       'erreur_identifiant_forme' => 'L\'identifiant ne doit contenir que des lettres, des chiffres ou le caractère souligné.',
+       'erreur_menu_inexistant' => 'Le menu demandé numéro @id@ n\'existe pas.',
+       'erreur_mise_a_jour' => 'Une erreur s\'est produite pendant la mise à jour de la base de donnée.',
+       'erreur_parametres' => 'Il y a une erreur dans les paramètres de la page',
+       'erreur_type_menu' => 'Vous devez choisir un type de menu',
+       'erreur_type_menu_inexistant' => 'Ce type de menu n\'est pas/plus disponible',
+
+       // F
+       'formulaire_ajouter_entree' => 'Ajouter une entrée',
+       'formulaire_ajouter_sous_menu' => 'Créer un sous-menu',
+       'formulaire_css' => 'Classes CSS',
+       'formulaire_css_explication' => 'Vous pouvez ajouter au menu d\'éventuelles classes CSS supplémentaires.',
+       'formulaire_deplacer_bas' => 'Déplacer vers le bas',
+       'formulaire_deplacer_haut' => 'Déplacer vers le haut',
+       'formulaire_facultatif' => 'Facultatif',
+       'formulaire_identifiant' => 'Identifiant',
+       'formulaire_identifiant_explication' => 'Donnez un mot-clé unique qui vous permettra d\'appeler votre menu facilement.',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Choisissez quel(s) menu(s) vous souhaitez importer.',
+       'formulaire_ieconfig_importer' => 'Importer',
+       'formulaire_ieconfig_menu_meme_identifiant' => 'ATTENTION : un menu avec le même identifiant existe déjà sur votre votre site !',
+       'formulaire_ieconfig_menus_a_exporter' => 'Menus à exporter :',
+       'formulaire_ieconfig_ne_pas_importer' => 'Ne pas importer',
+       'formulaire_ieconfig_remplacer' => 'Remplacer le menu actuel par le menu importé',
+       'formulaire_ieconfig_renommer' => 'Renommer ce menu avant import',
+       'formulaire_importer' => 'Importer un menu',
+       'formulaire_importer_explication' => 'Si vous avez exporté un menu dans un fichier, vous pouvez l\'importer maintenant.',
+       'formulaire_modifier_entree' => 'Modifier cette entrée',
+       'formulaire_modifier_menu' => 'Modifier le menu :',
+       'formulaire_nouveau' => 'Nouveau menu',
+       'formulaire_partie_construction' => 'Construction du menu',
+       'formulaire_partie_identification' => 'Identification du menu',
+       'formulaire_supprimer_entree' => 'Supprimer cette entrée',
+       'formulaire_supprimer_menu' => 'Supprimer le menu',
+       'formulaire_supprimer_sous_menu' => 'Supprimer ce sous-menu',
+       'formulaire_titre' => 'Titre',
+
+       // I
+       'info_afficher_articles' => 'Les articles seront inclus dans le menu.',
+       'info_articles_max' => 'Seulement si la rubrique contient au plus @max@ articles',
+       'info_articles_max_affiches' => 'Affichage limité à @max@ articles',
+       'info_classe_parent' => 'Classe des éléments parents : ',
+       'info_connexion_obligatoire' => 'Connexion obligatoire',
+       'info_deconnexion_obligatoire' => 'Uniquement déconnecté',
+       'info_masquer_articles_uniques' => 'Articles uniques masqués',
+       'info_numero_menu' => 'MENU NUMÉRO :',
+       'info_page_speciale' => 'Lien vers la page « @page@ »',
+       'info_page_speciale_zajax' => 'Modalbox de la page « @page@ » pour le bloc « @bloc@ &#187',
+       'info_rubrique_courante' => 'Rubrique courante',
+       'info_rubriques_exclues' => ' / sauf rubrique(s) @id_rubriques@',
+       'info_rubriques_max_affichees' => 'Affichage limité à @max@ rubriques',
+       'info_secteur_exclus' => ' / sauf secteur(s) @id_secteur@',
+       'info_sousrub_cond' => 'Seules les sous-rubriques de la rubriques en cours sont affichées.',
+       'info_tous_groupes_mots' => 'Tous les groupes de mots',
+       'info_traduction_recuperee' => 'Le contexte décidera de la traduction choisie',
+       'info_tri' => 'Tri des rubriques :',
+       'info_tri_alpha' => '(alphabétique)',
+       'info_tri_articles' => 'Tri des articles :',
+       'info_tri_num' => '(numérique)',
+
+       // N
+       'noisette_description' => 'Insère un menu défini avec le plugin Menus.',
+       'noisette_label_afficher_titre_menu' => 'Afficher le titre du menu ?',
+       'noisette_label_identifiant' => 'Menu à afficher :',
+       'noisette_nom_noisette' => 'Menu',
+       'nom_menu_accueil' => 'Accueil',
+       'nom_menu_articles_rubrique' => 'Articles d\'une rubrique',
+       'nom_menu_deconnecter' => 'Se déconnecter',
+       'nom_menu_espace_prive' => 'Se connecter / lien vers espace privé',
+       'nom_menu_groupes_mots' => 'Mots-clés et Articles d\'un Groupes de mots',
+       'nom_menu_lien' => 'Lien arbitraire',
+       'nom_menu_mapage' => 'Ma page',
+       'nom_menu_mots' => 'Articles d\'un Mot-clé',
+       'nom_menu_objet' => 'Article, rubrique ou autre objet SPIP',
+       'nom_menu_page_speciale' => 'Lien vers un squelette page',
+       'nom_menu_page_speciale_zajax' => 'Un bloc d\'une page Zpip',
+       'nom_menu_rubriques_completes' => 'Liste ou arborescence de rubriques et d\'articles (avec beaucoup d\'options)',
+       'nom_menu_rubriques_evenements' => 'Événements de rubriques',
+       'nom_menu_secteurlangue' => 'Secteurs de langue',
+       'nom_menu_texte_libre' => 'Texte libre',
+
+       // T
+       'tous_les_articles' => '... Tous les articles',
+       'toutes_les_rubriques' => '... Toutes les rubriques'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_it.php b/www/plugins/menus_1/lang/menus_it.php
new file mode 100644 (file)
index 0000000..a317d1b
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/menus?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'Voulez-vous vraiment supprimer cette entrée ?', # NEW
+
+       // D
+       'description_menu_accueil' => 'Link verso il pannello di controllo del sito.',
+       'description_menu_articles_rubrique' => 'Mostra la lista degli articoli di una rubrica.',
+       'description_menu_deconnecter' => 'Se il visitatore è connesso, aggiungi un link per proporgli la disconnessione.',
+       'description_menu_espace_prive' => 'Link che permette di connettersi al sito se non lo si è già, e poi di andare in redazione se si è autorizzati.',
+       'description_menu_groupes_mots' => 'Mostra automaticamente un menu che elenca le parole chiave di un gruppo e gli articoli collegati. Normalmente, mostra la lista dei gruppi di parole chiave e le parole collegate. Se un modello groupes_mots.html esiste, il link verso il gruppo verrà utilizzato',
+       'description_menu_lien' => 'Aggiunge un link arbitrario, interno (URL relativo) o esterno (http://...).',
+       'description_menu_mapage' => 'Se il visitatore è connesso, aggiunge un link verso la sua pagina autore.',
+       'description_menu_mots' => 'Mostra automaticamente un menù che elenca gli articoli collegati alla parola chiave.',
+       'description_menu_objet' => 'Crea un link verso un oggetto di SPIP: articolo, rubrica o altro. In maniera predefinita, il link avrà il titolo dell\'oggetto.',
+       'description_menu_page_speciale' => 'Aggiunge un link verso un modello accessibile con un url del tipo <code>spip.php?page=nome&param1=xx&param2=yyy...</code> Queste pagina sono spesso fornite dai plugin.',
+       'description_menu_page_speciale_zajax' => 'Ajoute un lien vers un bloc d\'une page accessible par une url du type <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Ceci nécéssite une squelette de type Z et le plugin <a href="http://www.spip-contrib.net/MediaBox">médiabox</a>.', # NEW
+       'description_menu_rubriques_articles' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques et les articles sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement). Les articles sont placés systématiquement après les rubriques.', # NEW
+       'description_menu_rubriques_completes' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).', # NEW
+       'description_menu_secteurlangue' => 'Questa voce è specifica per i siti che utilizzano un settore per lingua. Mostra automaticamente un menù che elenca le rubriche del settore corrispondente alla lingua della pagina e, se si vuole, le sotto rubriche su più livelli. Normalmente, mostra tutte le rubriche dalla radice, ordinate per titolo (numericamente e poi alfabeticamente).',
+       'description_menu_texte_libre' => 'Simplement le texte que vous souhaitez, ou un code de langue SPIP (<:...:>)', # NEW
+
+       // E
+       'editer_menus_editer' => 'Modifica questo menù',
+       'editer_menus_explication' => 'Crea e configura qui i menù del tuo sito',
+       'editer_menus_exporter' => 'Esporta questo menù',
+       'editer_menus_nouveau' => 'Crea un nuovo menù',
+       'editer_menus_titre' => 'Menù del sito',
+       'entree_afficher_articles' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)', # NEW
+       'entree_afficher_item_suite' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)', # NEW
+       'entree_articles_max' => 'Si oui, afficher les articles seulement si la rubrique contient au maximum xx articles ? (mettre le nombre maximum d\'articles, laissez vide pour afficher tous les articles)', # NEW
+       'entree_articles_max_affiches' => 'Si oui, limiter le nombre d\'articles listés à xx maximum (suivis d\'un item "... Tous les articles" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum d\'articles, laissez vide pour afficher tous les articles)', # NEW
+       'entree_aucun' => 'Nessun',
+       'entree_bloc' => 'Bloc Zpip', # NEW
+       'entree_choisir' => 'Scegli il tipo di voce che vuoi aggiungere:',
+       'entree_classe_parent' => 'Classe des liens des éléments parents. Cette classe sera rajoutée aux li>a ayant une suite ul/li. Par exemple, si vous saisissez "daddy", cela vous permet d\'utiliser le plugin menu deroulant 2 pour la mise en forme du menu.', # NEW
+       'entree_connexion_objet' => 'Obliger à être connecté (mettre "session") ou déconnecté (mettre "nosession") pour voir l\'objet', # NEW
+       'entree_contenu' => 'Contenu', # NEW
+       'entree_css' => 'Classi CSS della voce', # MODIF
+       'entree_css_lien' => 'Classes CSS du lien', # NEW
+       'entree_id_groupe' => 'Numero di gruppo della parola chiave',
+       'entree_id_mot' => 'Numero della parola chiave',
+       'entree_id_objet' => 'Numero',
+       'entree_id_rubrique' => 'Numero della rubrica padre',
+       'entree_id_rubrique_ou_courante' => 'Numéro de la rubrique parente ou "courante" si la rubrique parente est la rubrique courante du contexte', # NEW
+       'entree_id_rubriques_exclues' => 'Numéros des rubriques à exclure, séparés par des virgules', # NEW
+       'entree_id_secteur_exclus' => 'Numéros des secteurs à exclure, séparés par des virgules', # NEW
+       'entree_infini' => 'All\'infinito',
+       'entree_mapage' => 'La mia pagina personale',
+       'entree_masquer_articles_uniques' => 'Si oui et si une rubrique contient un seul article, le masquer ? (mettre "oui" pour cela)', # NEW
+       'entree_niveau' => 'Livelli di sotto rubriche',
+       'entree_nombre_articles' => 'Numero massimo di articoli (0 predefinito)',
+       'entree_page' => 'Nome della pagina',
+       'entree_parametres' => 'Lista dei parametri',
+       'entree_rubriques_max_affichees' => 'Si oui, limiter le nombre de rubriques listés à xx maximum (suivis d\'un item "... Toutes les rubriques" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum de rubriques, laissez vide pour afficher toutes les rubriques)', # NEW
+       'entree_sousrub_cond' => 'N\'afficher que les sous-rubriques de la rubrique en cours (mettre "oui", sinon laisser vide)', # NEW
+       'entree_suivant_connexion' => 'Restreindre cette entrée suivant la connexion (mettre "connecte" pour afficher seulement si le visiteur est connecté, "deconnecte" pour le cas contraire, ou laisser vide pour toujours afficher)', # NEW
+       'entree_suivant_connexion_connecte' => 'seulement si connecté', # NEW
+       'entree_suivant_connexion_deconnecte' => 'seulement si déconnecté', # NEW
+       'entree_sur_n_articles' => '@n@ articoli mostrati',
+       'entree_sur_n_mots' => '@n@ parole chiave mostrate',
+       'entree_sur_n_niveaux' => 'Su @n@ livelli',
+       'entree_titre' => 'Titolo',
+       'entree_titre_connecter' => 'Titolo per l\'accesso al form di login',
+       'entree_titre_prive' => 'Titolo per accedere alla redazione',
+       'entree_traduction_articles_rubriques' => 'Dans la mesure du possible, afficher les articles de la rubrique dans la langue du contexte (mettre "trad" pour cela)', # NEW
+       'entree_traduction_objet' => 'Dans le cas d\'un article, choisir la traduction en fonction du contexte (mettre "trad" pour cela)', # NEW
+       'entree_tri_alpha' => 'Criterio di ordinamento (alfabetico)', # MODIF
+       'entree_tri_alpha_articles' => 'Critère de tri des articles (alphabétique). Si vous saisissez "date", le critère ajouté sera {par date} et les articles seront triés par date', # NEW
+       'entree_tri_alpha_articles_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_alpha_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_num' => 'Criterio di ordinamento (numerico)', # MODIF
+       'entree_tri_num_articles' => 'Critère de tri des articles (numérique). Si vous saisissez "titre", le critère ajouté sera {par num titre} et les articles seront triés par numéro de titre', # NEW
+       'entree_tri_num_articles_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_num_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)', # NEW
+       'entree_type_objet' => 'Tipo di oggetto',
+       'entree_url' => 'Indirizzo',
+       'entree_url_public' => 'Adresse de retour après la connexion', # NEW
+       'erreur_aucun_type' => 'Nessun tipo di voce trovata.',
+       'erreur_autorisation' => 'Non sei autorizzato a modificare i menù.',
+       'erreur_identifiant_deja' => 'Questo identificativo è già utilizzato da un menù.',
+       'erreur_identifiant_forme' => 'L\'identificativo deve contenere solo lettere, cifre o il trattino basso.',
+       'erreur_menu_inexistant' => 'Il menù richiesto numero @id@ non esiste.',
+       'erreur_mise_a_jour' => 'Si è verificato un errore durante l\'aggiornamento del database.',
+       'erreur_parametres' => 'C\'è un errore nei parametri della pagina',
+       'erreur_type_menu' => 'Devi scegliere un tipo di menù',
+       'erreur_type_menu_inexistant' => 'Ce type de menu n\'est pas/plus disponible', # NEW
+
+       // F
+       'formulaire_ajouter_entree' => 'Aggiungi una voce',
+       'formulaire_ajouter_sous_menu' => 'Crea un sotto menù',
+       'formulaire_css' => 'Classi CSS',
+       'formulaire_css_explication' => 'Puoi aggiungere al menù delle eventuali classi CSS supplmentari.',
+       'formulaire_deplacer_bas' => 'Sposta verso il basso',
+       'formulaire_deplacer_haut' => 'Sposta verso l\'alto',
+       'formulaire_facultatif' => 'Facoltativo',
+       'formulaire_identifiant' => 'Identificativo',
+       'formulaire_identifiant_explication' => 'Inserisci una parola chiave unica che ti permetterà di richiamare il tuo menù facilmente.',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Choisissez quel(s) menu(s) vous souhaitez importer.', # NEW
+       'formulaire_ieconfig_importer' => 'Importer', # NEW
+       'formulaire_ieconfig_menu_meme_identifiant' => 'ATTENTION : un menu avec le même identifiant existe déjà sur votre votre site !', # NEW
+       'formulaire_ieconfig_menus_a_exporter' => 'Menus à exporter :', # NEW
+       'formulaire_ieconfig_ne_pas_importer' => 'Ne pas importer', # NEW
+       'formulaire_ieconfig_remplacer' => 'Remplacer le menu actuel par le menu importé', # NEW
+       'formulaire_ieconfig_renommer' => 'Renommer ce menu avant import', # NEW
+       'formulaire_importer' => 'Importa un menù',
+       'formulaire_importer_explication' => 'Se hai esportato un menù in un file, ora lo puoi importare.',
+       'formulaire_modifier_entree' => 'Modifica questa voce',
+       'formulaire_modifier_menu' => 'Modifica il menù:',
+       'formulaire_nouveau' => 'Nuovo menù',
+       'formulaire_partie_construction' => 'Costruzione del menù',
+       'formulaire_partie_identification' => 'Identificativo del menù',
+       'formulaire_supprimer_entree' => 'Elimina questa voce',
+       'formulaire_supprimer_menu' => 'Elimina il menù',
+       'formulaire_supprimer_sous_menu' => 'Elimina il sotto menù',
+       'formulaire_titre' => 'Titolo',
+
+       // I
+       'info_afficher_articles' => 'Les articles seront inclus dans le menu.', # NEW
+       'info_articles_max' => 'Seulement si la rubrique contient au plus @max@ articles', # NEW
+       'info_articles_max_affiches' => 'Affichage limité à @max@ articles', # NEW
+       'info_classe_parent' => 'Classe des éléments parents : ', # NEW
+       'info_connexion_obligatoire' => 'Connexion obligatoire', # NEW
+       'info_deconnexion_obligatoire' => 'Uniquement déconnecté', # NEW
+       'info_masquer_articles_uniques' => 'Articles uniques masqués', # NEW
+       'info_numero_menu' => 'MENU NUMERO:',
+       'info_page_speciale' => 'Link verso la pagina "@page@"',
+       'info_page_speciale_zajax' => 'Modalbox de la page « @page@ » pour le bloc « @bloc@ &#187', # NEW
+       'info_rubrique_courante' => 'Rubrique courante', # NEW
+       'info_rubriques_exclues' => ' / sauf rubrique(s) @id_rubriques@', # NEW
+       'info_rubriques_max_affichees' => 'Affichage limité à @max@ rubriques', # NEW
+       'info_secteur_exclus' => ' / sauf secteur(s) @id_secteur@', # NEW
+       'info_sousrub_cond' => 'Seules les sous-rubriques de la rubriques en cours sont affichées.', # NEW
+       'info_tous_groupes_mots' => 'Tutti i gruppi di parole chiave',
+       'info_traduction_recuperee' => 'Le contexte décidera de la traduction choisie', # NEW
+       'info_tri' => 'Ordina:', # MODIF
+       'info_tri_alpha' => '(alfabetico)',
+       'info_tri_articles' => 'Tri des articles :', # NEW
+       'info_tri_num' => '(numerico)',
+
+       // N
+       'noisette_description' => 'Insère un menu défini avec le plugin Menus.', # NEW
+       'noisette_label_afficher_titre_menu' => 'Afficher le titre du menu ?', # NEW
+       'noisette_label_identifiant' => 'Menu à afficher :', # NEW
+       'noisette_nom_noisette' => 'Menu', # NEW
+       'nom_menu_accueil' => 'Pannello di controllo',
+       'nom_menu_articles_rubrique' => 'Articoli di una rubrica',
+       'nom_menu_deconnecter' => 'Disconnettersi',
+       'nom_menu_espace_prive' => 'Connettersi / link alla redazione',
+       'nom_menu_groupes_mots' => 'Parole chiave e articoli di un gruppo di parole chiave',
+       'nom_menu_lien' => 'Link arbitrario',
+       'nom_menu_mapage' => 'La mia pagina',
+       'nom_menu_mots' => 'Articoli di un a parola chiave',
+       'nom_menu_objet' => 'Articolo, rubrica o altro oggetto SPIP',
+       'nom_menu_page_speciale' => 'Link verso una pagina di modello',
+       'nom_menu_page_speciale_zajax' => 'Un bloc d\'une page Zpip', # NEW
+       'nom_menu_rubriques_completes' => 'Liste ou arborescence de rubriques et d\'articles (avec beaucoup d\'options)', # NEW
+       'nom_menu_rubriques_evenements' => 'Eventi delle rubriche',
+       'nom_menu_secteurlangue' => 'Settore di lingua',
+       'nom_menu_texte_libre' => 'Texte libre', # NEW
+
+       // T
+       'tous_les_articles' => '... Tous les articles', # NEW
+       'toutes_les_rubriques' => '... Toutes les rubriques' # NEW
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_ru.php b/www/plugins/menus_1/lang/menus_ru.php
new file mode 100644 (file)
index 0000000..eb3441f
--- /dev/null
@@ -0,0 +1,171 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://www.spip.net/trad-lang/
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'Voulez-vous vraiment supprimer cette entrée ?', # NEW
+
+       // D
+       'description_menu_accueil' => 'Ссылка на главную страницу.',
+       'description_menu_articles_rubrique' => 'Affiche la liste des articles d\'une rubrique.', # NEW
+       'description_menu_deconnecter' => 'Si le visiteur est connecté, ajoute une entrée lui proposant la déconnexion.', # NEW
+       'description_menu_espace_prive' => 'Lien permettant de se connecter au site si on ne l\'est pas déjà, puis d\'aller dans l\'espace privé si l\'on y est autorisé.', # NEW
+       'description_menu_groupes_mots' => 'Affiche automatiquement un menu listant les mots du groupe et les articles liés. Par d&eacute;faut, affiche la liste des groupes de mots et les mots li&eacute;s. Si un squelette groupes_mots.html existe, le lien vers le groupe est utilis&eacute;.', # NEW
+       'description_menu_lien' => 'Ajoute un lien arbitraire, en interne (URL relative) ou externe (http://...).', # NEW
+       'description_menu_mapage' => 'Si le visiteur est connecté, ajoute un lien vers sa page auteur.', # NEW
+       'description_menu_mots' => 'Affiche automatiquement un menu listant les articles liés au mot clé.', # NEW
+       'description_menu_objet' => 'Crée un lien vers un objet de SPIP : article, rubrique ou autre. Par défaut, l\'entrée aura le titre de l\'objet.', # NEW
+       'description_menu_page_speciale' => 'Ajoute un lien vers un squelette page accessible par une url du type <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Ces pages sont souvent fournies par des plugins.', # NEW
+       'description_menu_page_speciale_zajax' => 'Ajoute un lien vers un bloc d\'une page accessible par une url du type <code>spip.php?page=nom&param1=xx&param2=yyy...</code> Ceci nécéssite une squelette de type Z et le plugin <a href="http://www.spip-contrib.net/MediaBox">médiabox</a>.', # NEW
+       'description_menu_rubriques' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).', # NEW
+       'description_menu_rubriques_articles' => 'Affiche une liste de rubriques et, si on veut, les sous-rubriques et les articles sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement). Les articles sont placés systématiquement après les rubriques.', # NEW
+       'description_menu_secteurlangue' => 'Cette entrée est spécifique aux sites utilisant un secteur par langue. Elle affiche automatiquement un menu listant les rubriques du secteur correspondant à la langue de la page et, si on veut, les sous-rubriques sur plusieurs niveaux. Par défaut, affiche toutes les rubriques depuis la racine, triées par titre (numériquement puis alphabétiquement).', # NEW
+       'description_menu_texte_libre' => 'Simplement le texte que vous souhaitez, ou un code de langue SPIP (<:...:>)', # NEW
+
+       // E
+       'editer_menus_editer' => 'Редактировать это меню',
+       'editer_menus_explication' => 'Создать и настроить меню для сайта',
+       'editer_menus_exporter' => 'Экспортировать меню',
+       'editer_menus_nouveau' => 'Создать новое меню',
+       'editer_menus_titre' => 'Меню сайта',
+       'entree_afficher_articles' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)', # NEW
+       'entree_afficher_item_suite' => 'Inclure les articles dans le menu ? (mettre "oui" pour cela)', # NEW
+       'entree_articles_max' => 'Si oui, afficher les articles seulement si la rubrique contient au maximum xx articles ? (mettre le nombre maximum d\'articles, laissez vide pour afficher tous les articles)', # NEW
+       'entree_articles_max_affiches' => 'Si oui, limiter le nombre d\'articles list&eacute;s &agrave; xx maximum (suivis d\'un item "... Tous les articles" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum d\'articles, laissez vide pour afficher tous les articles)', # NEW
+       'entree_aucun' => 'Aucun', # NEW
+       'entree_bloc' => 'Bloc Zpip', # NEW
+       'entree_choisir' => 'Выбрать тип пункта меню:',
+       'entree_classe_parent' => 'Classe des liens des éléments parents. Cette classe sera rajoutée aux li>a ayant une suite ul/li. Par exemple, si vous saisissez "daddy", cela vous permet d\'utiliser le plugin menu deroulant 2 pour la mise en forme du menu.', # NEW
+       'entree_connexion_objet' => 'Obliger à être connecté (mettre "session") ou déconnecté (mettre "nosession") pour voir l\'objet', # NEW
+       'entree_contenu' => 'Contenu', # NEW
+       'entree_css' => 'CSS класс', # MODIF
+       'entree_css_lien' => 'Classes CSS du lien', # NEW
+       'entree_id_groupe' => 'Numéro du groupe de mot clé', # NEW
+       'entree_id_mot' => 'Numéro du mot clé', # NEW
+       'entree_id_objet' => 'Номер',
+       'entree_id_rubrique' => 'Номер родительского раздела',
+       'entree_id_rubrique_ou_courante' => 'Numéro de la rubrique parente ou "courante" si la rubrique parente est la rubrique courante du contexte', # NEW
+       'entree_id_rubriques_exclues' => 'Numéros des rubriques à exclure, séparés par des virgules', # NEW
+       'entree_id_secteur_exclus' => 'Numéros des secteurs à exclure, séparés par des virgules', # NEW
+       'entree_infini' => 'Бесконечность',
+       'entree_mapage' => 'Моя страница',
+       'entree_masquer_articles_uniques' => 'Si oui et si une rubrique contient un seul article, le masquer ? (mettre "oui" pour cela)', # NEW
+       'entree_niveau' => 'Уровень подразделов',
+       'entree_nombre_articles' => 'Nombre d\'articles au maximum (0 par défaut)', # NEW
+       'entree_page' => 'Nom de la page', # NEW
+       'entree_parametres' => 'Liste des paramètres', # NEW
+       'entree_rubriques_max_affichees' => 'Si oui, limiter le nombre de rubriques list&eacute;s &agrave; xx maximum (suivis d\'un item "... Toutes les rubriques" comportant un lien vers la rubrique parente) ? (indiquer le nombre maximum de rubriques, laissez vide pour afficher toutes les rubriques)', # NEW
+       'entree_sousrub_cond' => 'N\'afficher que les sous-rubriques de la rubrique en cours (mettre "oui", sinon laisser vide)', # NEW
+       'entree_sur_n_articles' => '@n@ articles affiché(s)', # NEW
+       'entree_sur_n_mots' => '@n@ mots affiché(s)', # NEW
+       'entree_sur_n_niveaux' => 'На @n@ уровне',
+       'entree_titre' => 'Название',
+       'entree_titre_connecter' => 'Titre pour l\'accès au formulaire d\'identification', # NEW
+       'entree_titre_prive' => 'Titre pour accéder à l\'espace privé', # NEW
+       'entree_traduction_articles_rubriques' => 'Dans la mesure du possible, afficher les articles de la rubrique dans la langue du contexte (mettre "trad" pour cela)', # NEW
+       'entree_traduction_objet' => 'Dans le cas d\'un article, choisir la traduction en fonction du contexte (mettre "trad" pour cela)', # NEW
+       'entree_tri_alpha' => 'Critère de tri (alphabétique)', # MODIF
+       'entree_tri_alpha_articles' => 'Critère de tri des articles (alphabétique). Si vous saisissez "date", le critère ajouté sera {par date} et les articles seront triés par date', # NEW
+       'entree_tri_alpha_articles_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_alpha_inverse' => 'Inverser le critère de tri alphabétique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_num' => 'Critère de tri (numérique)', # MODIF
+       'entree_tri_num_articles' => 'Critère de tri des articles (numérique). Si vous saisissez "titre", le critère ajouté sera {par num titre} et les articles seront triés par numéro de titre', # NEW
+       'entree_tri_num_articles_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)', # NEW
+       'entree_tri_num_inverse' => 'Inverser le critère de tri numérique ? (mettre "oui" pour cela)', # NEW
+       'entree_type_objet' => 'Тип объекта',
+       'entree_url' => 'Ссылка (URL)',
+       'entree_url_public' => 'Adresse de retour après la connexion', # NEW
+       'erreur_aucun_type' => 'Ничего не найдено.',
+       'erreur_autorisation' => 'У вас нет прав для редактирования этого меню.',
+       'erreur_identifiant_deja' => 'Этот идентификатор уже используется в другом меню.',
+       'erreur_identifiant_forme' => 'Идентификатор может состоять из латинских букв, цифр и подчеркиваний.',
+       'erreur_menu_inexistant' => 'Меню номер @id@ не существует.',
+       'erreur_mise_a_jour' => 'Произошла ошибка при обновлении базы.',
+       'erreur_parametres' => 'Il y a une erreur dans les paramètres de la page', # NEW
+       'erreur_type_menu' => 'Vous devez choisir un type de menu', # NEW
+       'erreur_type_menu_inexistant' => 'Ce type de menu n\'est pas/plus disponible', # NEW
+
+       // F
+       'formulaire_ajouter_entree' => 'Добавить пункт меню',
+       'formulaire_ajouter_sous_menu' => 'Создать подменю',
+       'formulaire_css' => 'CSS классы',
+       'formulaire_css_explication' => 'Вы можете добавить дополнительный классы CSS к вашему меню.',
+       'formulaire_deplacer_bas' => 'Вниз',
+       'formulaire_deplacer_haut' => 'Вверх',
+       'formulaire_facultatif' => 'Не обязательно',
+       'formulaire_identifiant' => 'Идентификатор',
+       'formulaire_identifiant_explication' => 'Назначьте меню уникальное ключевое слово, которое позволит в дальнейшем легко его вызывать.',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Choisissez quel(s) menu(s) vous souhaitez importer.', # NEW
+       'formulaire_ieconfig_importer' => 'Importer', # NEW
+       'formulaire_ieconfig_menu_meme_identifiant' => 'ATTENTION : un menu avec le même identifiant existe déjà sur votre votre site !', # NEW
+       'formulaire_ieconfig_menus_a_exporter' => 'Menus à exporter :', # NEW
+       'formulaire_ieconfig_ne_pas_importer' => 'Ne pas importer', # NEW
+       'formulaire_ieconfig_remplacer' => 'Remplacer le menu actuel par le menu importé', # NEW
+       'formulaire_ieconfig_renommer' => 'Renommer ce menu avant import', # NEW
+       'formulaire_importer' => 'Импортировать меню',
+       'formulaire_importer_explication' => 'Если вы экспортировали меню в файл, вы можете импортировать его сейчас.',
+       'formulaire_modifier_entree' => 'Редактировать этот пункт меню',
+       'formulaire_modifier_menu' => 'Редактировать меню:',
+       'formulaire_nouveau' => 'Новое меню',
+       'formulaire_partie_construction' => 'Создание меню',
+       'formulaire_partie_identification' => 'Идентификатор меню',
+       'formulaire_supprimer_entree' => 'Удалить этот пункт меню',
+       'formulaire_supprimer_menu' => 'Удалить меню',
+       'formulaire_supprimer_sous_menu' => 'Удалить подменю',
+       'formulaire_titre' => 'Название',
+
+       // I
+       'info_afficher_articles' => 'Les articles seront inclus dans le menu.', # NEW
+       'info_articles_max' => 'Seulement si la rubrique contient au plus @max@ articles', # NEW
+       'info_articles_max_affiches' => 'Affichage limit&eacute; &agrave; @max@ articles', # NEW
+       'info_classe_parent' => 'Classe des éléments parents : ', # NEW
+       'info_connexion_obligatoire' => 'Connexion obligatoire', # NEW
+       'info_deconnexion_obligatoire' => 'Uniquement déconnecté', # NEW
+       'info_masquer_articles_uniques' => 'Articles uniques masqu&eacute;s', # NEW
+       'info_numero_menu' => 'НОМЕР МЕНЮ:',
+       'info_page_speciale' => 'Lien vers la page « @page@ »', # NEW
+       'info_page_speciale_zajax' => 'Modalbox de la page « @page@ » pour le bloc « @bloc@ &#187', # NEW
+       'info_rubrique_courante' => 'Rubrique courante', # NEW
+       'info_rubriques_exclues' => ' / sauf rubrique(s) @id_rubriques@', # NEW
+       'info_rubriques_max_affichees' => 'Affichage limit&eacute; &agrave; @max@ rubriques', # NEW
+       'info_secteur_exclus' => ' / sauf secteur(s) @id_secteur@', # NEW
+       'info_sousrub_cond' => 'Seules les sous-rubriques de la rubriques en cours sont affichées.', # NEW
+       'info_tous_groupes_mots' => 'Tous les groupes de mots', # NEW
+       'info_traduction_recuperee' => 'Le contexte décidera de la traduction choisie', # NEW
+       'info_tri' => 'Tri :', # MODIF
+       'info_tri_alpha' => '(alphabétique)', # NEW
+       'info_tri_articles' => 'Tri des articles :', # NEW
+       'info_tri_num' => '(numérique)', # NEW
+
+       // N
+       'noisette_description' => 'Insère un menu défini avec le plugin Menus.', # NEW
+       'noisette_label_afficher_titre_menu' => 'Afficher le titre du menu ?', # NEW
+       'noisette_label_identifiant' => 'Menu à afficher :', # NEW
+       'noisette_nom_noisette' => 'Menu', # NEW
+       'nom_menu_accueil' => 'Главная страница',
+       'nom_menu_articles_rubrique' => 'Articles d\'une rubrique', # NEW
+       'nom_menu_deconnecter' => 'Se déconnecter', # NEW
+       'nom_menu_espace_prive' => 'Se connecter / lien vers espace privé', # NEW
+       'nom_menu_groupes_mots' => 'Mots-clés et Articles d\'un Groupes de mots', # NEW
+       'nom_menu_lien' => 'Lien arbitraire', # NEW
+       'nom_menu_mapage' => 'Ma page', # NEW
+       'nom_menu_mots' => 'Articles d\'un Mot-clé', # NEW
+       'nom_menu_objet' => 'Article, rubrique ou autre objet SPIP', # NEW
+       'nom_menu_page_speciale' => 'Lien vers un squelette page', # NEW
+       'nom_menu_page_speciale_zajax' => 'Un bloc d\'une page Zpip', # NEW
+       'nom_menu_rubriques' => 'Liste ou arborescence de rubriques', # MODIF
+       'nom_menu_rubriques_evenements' => 'Événements de rubriques', # NEW
+       'nom_menu_secteurlangue' => 'Secteurs de langue', # NEW
+       'nom_menu_texte_libre' => 'Texte libre', # NEW
+
+       // T
+       'tous_les_articles' => '... Tous les articles', # NEW
+       'toutes_les_rubriques' => '... Toutes les rubriques' # NEW
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/menus_sk.php b/www/plugins/menus_1/lang/menus_sk.php
new file mode 100644 (file)
index 0000000..03a5e23
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/menus?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'confirmer_supprimer_entree' => 'Chcete odstrániť tento záznam?',
+
+       // D
+       'description_menu_accueil' => 'Odkaz na úvodnú stránku webu.',
+       'description_menu_articles_rubrique' => 'Zobraziť zoznam článkov v rubrike.',
+       'description_menu_deconnecter' => 'Ak je návštevník online, pridať možnosť odpojenia.',
+       'description_menu_espace_prive' => 'Odkaz umožňujúci prihlásenie na stránku, ak ste sa ešte neprihlásili a potom na vstup do súkromnej zóny, ak na to máte oprávnenie.',
+       'description_menu_groupes_mots' => 'Automaticky vypíše skupiny kľúčových slov a články, ktoré sú k ním priradené. Podľa predvolených nastavení sa zobrazia skupiny kľúčových slov a kľúčové slová v rámci nich. Ak existuje súbor šablóny groupes_mots.html, použije sa odkaz na skupinu kľúčových slov.',
+       'description_menu_lien' => 'Pridá samostatne zadaný odkaz, a to buď interný (relatívna adresa), alebo externý(http://...).',
+       'description_menu_mapage' => 'Ak je návštevník prihlásený, pridá odkaz na jeho autorskú stránku.',
+       'description_menu_mots' => 'Automaticky zobrazí menu so zoznamom článkov prepojených s kľúčovým slovom.',
+       'description_menu_objet' => 'Vytvorí odkaz na objekt SPIPu: článok, rubriku alebo iný. Podľa predvolených nastavení bude niesť názov objektu.',
+       'description_menu_page_speciale' => 'Pridá odkaz na stránku šablóny pomocou adresy formulára <code>spip.php?page=name&param1=xx&param2=yyy...</code> Takéto stránky často využívajú zásuvné moduly.',
+       'description_menu_page_speciale_zajax' => 'Pridať odkaz do bolu na stránke, na ktorú sa dá dostať progredníctvom adresy typu <code>spip.php?page=name&param1=xx&param2=yyy...</code> Na to treba šablónu typu Z a zásuvný modul <a href="http://www.spip-contrib.net/MediaBox">médiabox.</a>',
+       'description_menu_rubriques_articles' => 'Zobrazí zoznam rubrík, v ktorom môžu byť podrubriky a články včlenené do rôznych úrovní. Podľa predvolených nastavení sa zobrazia všetky rubriky počnúc koreňovým adresárom stránky a budú zotriedené podľa názvu (najprv čísla, potom písmená). Články v danej rubrike budú vždy uvedené po jej podrubrikách.',
+       'description_menu_rubriques_completes' => 'Zobrazí zoznam rubrík a ak existujú, aj podrubrík na mnohých úrovniach. Podľa predvolených nastavení zobrazí všetky rubriky od koreňového adresára zotriedené podľa názvu (najprv podľa čísel potom podľa abecedy).',
+       'description_menu_secteurlangue' => 'This entry can be used by sites which have one language per sector. It displays a menu which lists the sections of the sector corresponding to the language of the page, and if desired the subsections to several levels. By default, all sections are shown from the site root, sorted by title (numerically then alphabetically).',
+       'description_menu_texte_libre' => 'Jednoducho text, ktorý chcete, alebo kód jazyka SPIP (<:...:>)',
+
+       // E
+       'editer_menus_editer' => 'Upraviť toto menu',
+       'editer_menus_explication' => 'Vytvorte a nastavte ponky menu pre svoju stránku.',
+       'editer_menus_exporter' => 'Exportovať toto menu',
+       'editer_menus_nouveau' => 'Vytvoriť nové menu',
+       'editer_menus_titre' => 'Ponuky menu stránky',
+       'entree_afficher_articles' => 'Zaradiť články do menu? (na to využite možnosť "áno")',
+       'entree_afficher_item_suite' => 'Zaradiť články do menu? (použite na to možnosť "áno")',
+       'entree_articles_max' => 'Ak áno, zobraziť články, len ak je v rubrike maximálne xx článkov? (zadajte maximálny počet článkov; ak chcete zobraziť všetky články, nechajte toto pole prázdne)',
+       'entree_articles_max_affiches' => 'Ak áno, obmedziť počet článkov v zozname na maximálne xx (za položkou "...Všetky články" s odkazom na nadradenú rubriku)? (zadajte maximálny počet článkov; ak chcete zobraziť všetky články, nechajte toto pole prázdne)',
+       'entree_aucun' => 'Žiadny',
+       'entree_bloc' => 'Blok Zpipu',
+       'entree_choisir' => 'Vyberte typ položky, ktorú chcete pridať:',
+       'entree_classe_parent' => 'Trieda odkazov nadradených prvkov. Táto trieda bude pridaná na  li>v postupnosit ul/li. Napríklad, ak zadáte "daddy", umožní vám to využiť na formátovanie menu rozbaľovacie menu zásuvného modulu 2.',
+       'entree_connexion_objet' => 'Na zobrazenie objektu sa vyžaduje prihlásenie (vloženie "session") alebo odhlásenie (vloženie "nosession")',
+       'entree_contenu' => 'Obsah',
+       'entree_css' => 'CSS triedy tejto položky (objektu)',
+       'entree_css_lien' => 'Triedy CSS pre odkazy',
+       'entree_id_groupe' => 'Číslo skupiny kľúčových slov',
+       'entree_id_mot' => 'Číslo kľúčového slova',
+       'entree_id_objet' => 'Číslo',
+       'entree_id_rubrique' => 'Číslo nadradenej rubriky',
+       'entree_id_rubrique_ou_courante' => 'Číslo nadradenej alebo "aktuálnej" rubriky, ak nadradená rubrika je aktuálnou rubrikou kontextu',
+       'entree_id_rubriques_exclues' => 'Čísla rubrík, ktoré majú byť vylúčené, oddelené čiarkami',
+       'entree_id_secteur_exclus' => 'Čísla sektorov, ktoré majú byť vylúčené, oddelené čiarkami',
+       'entree_infini' => 'Do nekonečna',
+       'entree_mapage' => 'Moja stránka',
+       'entree_masquer_articles_uniques' => 'Ak áno a ak je v rubrike jeden článok, schovať ju? (ak to tak chcete, označte možnosť "áno")',
+       'entree_niveau' => 'Úroveň podrubrík',
+       'entree_nombre_articles' => 'Maximálny počet článkov (predvolené 0)',
+       'entree_page' => 'Názov stránky',
+       'entree_parametres' => 'Zoznam parametrov',
+       'entree_rubriques_max_affichees' => 'Ak áno, obmedziť počet rubrík v zozname na maximálne xx (po položke "...Všetky rubriky" s odkazom na nadradenú rubriku)? (zadajte maximálny počet rubrík; ak chcete zobraziť všetky rubriky, nechajte toto pole prázdne)',
+       'entree_sousrub_cond' => 'Zobrazovať len podrubriky aktuálnej rubriky (zadajte "oui" (áno), v opačnom prípade nevypĺňajte)',
+       'entree_suivant_connexion' => 'Obmedziť toto pole podľa prihlásenia  (nastavte "prihlásený" ak chcete zobraziť len návštevníka, ktorý je online; možnosť "odhlásený" v opačnom prípade;  ak autor riadi nejakú rubriku, nastavte pole "administrátor"; ak ho chcete zobraziť v každom prípade, toto pole nevypĺňajte)',
+       'entree_suivant_connexion_connecte' => 'len ak je online',
+       'entree_suivant_connexion_deconnecte' => 'len ak je offline',
+       'entree_sur_n_articles' => '@n@ zobrazených článkov',
+       'entree_sur_n_mots' => '@n@ zobrazených kľúčových slov',
+       'entree_sur_n_niveaux' => 'Na @n@ úrovni(ach)',
+       'entree_titre' => 'Nadpis',
+       'entree_titre_connecter' => 'Nadpis pre prístup do prihlasovacieho formulára',
+       'entree_titre_prive' => 'Nadpis pre prístup do súkromnej zóny',
+       'entree_traduction_articles_rubriques' => 'Ak je to možné, zobraziť články rubriky v jazyku textu (na aktiváciu tejto možnosti zadajte "trad")',
+       'entree_traduction_objet' => 'Pri článku vyberajte preklad v závislosti od kontextu (na to, aby se to dosiahli, vložte "trad")',
+       'entree_tri_alpha' => 'Kritérium triedenia (abecedné)',
+       'entree_tri_alpha_articles' => 'Kritérium triedenia článkov(abecedné). Ak zadáte "dátum", bude pridané kritérium {podľa dátumu} a články budú zotriedené podľa dátumu',
+       'entree_tri_alpha_articles_inverse' => 'Obrátiť poradie abecedného triedenia? (použite na to možnosť "áno")',
+       'entree_tri_alpha_inverse' => 'Obrátiť poradie abecedného triedenia? (použite na to možnosť "áno")',
+       'entree_tri_num' => 'Kritérium triedenia (číselné)',
+       'entree_tri_num_articles' => 'Kritérium triedenia článkov (číselné). Ak zadáte "nadpis", bude pridané kritérium {podľa čísla nadpisu} a články budú zotriedené podľa čísla nadpisu',
+       'entree_tri_num_articles_inverse' => 'Obrátiť poradie číselného triedenia? (použite na to možnosť "áno")',
+       'entree_tri_num_inverse' => 'Obrátiť poradie číselného triedenia? (použite na to možnosť "áno")',
+       'entree_type_objet' => 'Typ objektu',
+       'entree_url' => 'Internetová adresa',
+       'entree_url_public' => 'Po prihlásení vypísať adresu',
+       'erreur_aucun_type' => 'Žiaden typ položky sa nenašiel.',
+       'erreur_autorisation' => 'Nemáte povolené upravovať menu.',
+       'erreur_identifiant_deja' => 'Tento identifikátor už využíva iné menu.',
+       'erreur_identifiant_forme' => 'Identifikátor musí obsahovať len písmená, čísla alebo podčiarkovníky.',
+       'erreur_menu_inexistant' => 'Menu číslo @id@ neexistuje.',
+       'erreur_mise_a_jour' => 'Počas aktualizácie databázy došlo k chybe.',
+       'erreur_parametres' => 'V parametroch stránky je chyba',
+       'erreur_type_menu' => 'Musíte si vybrať typ menu',
+       'erreur_type_menu_inexistant' => 'Tento typ menu (už viac) nie je dostupný',
+
+       // F
+       'formulaire_ajouter_entree' => 'Pridať položku menu',
+       'formulaire_ajouter_sous_menu' => 'Vytvoriť podmenu',
+       'formulaire_css' => 'Triedy CSS',
+       'formulaire_css_explication' => 'K svojmu menu môžete pridať ďalšie triedy CSS.',
+       'formulaire_deplacer_bas' => 'Posunúť nadol',
+       'formulaire_deplacer_haut' => 'Posunúť nahor',
+       'formulaire_facultatif' => 'Nepovinné',
+       'formulaire_identifiant' => 'Identifikátor',
+       'formulaire_identifiant_explication' => 'Priraďte mu unikátne kľúčové slovo, ktoré vám umožní ľahko zavolať svoje menu.',
+       'formulaire_ieconfig_choisir_menus_a_importer' => 'Vyberte, ktoré menu chcete nahrať.',
+       'formulaire_ieconfig_importer' => 'Nahrať',
+       'formulaire_ieconfig_menu_meme_identifiant' => 'UPOZORNENIE: na vašej stránke je už menu s rovnakým názvom!',
+       'formulaire_ieconfig_menus_a_exporter' => 'Menu na export:',
+       'formulaire_ieconfig_ne_pas_importer' => 'Nenahrávať',
+       'formulaire_ieconfig_remplacer' => 'Prepísať súčasné menu nahratým menu',
+       'formulaire_ieconfig_renommer' => 'Premenovať toto menu pred nahrávaním',
+       'formulaire_importer' => 'Nahrať menu',
+       'formulaire_importer_explication' => 'Ak ste exportovali menu do súboru, môžete ho teraz nahrať.',
+       'formulaire_modifier_entree' => 'Upraviť túto položku menu',
+       'formulaire_modifier_menu' => 'Upraviť menu:',
+       'formulaire_nouveau' => 'Nové menu',
+       'formulaire_partie_construction' => 'Vytvorenie menu',
+       'formulaire_partie_identification' => 'Identifikácia menu',
+       'formulaire_supprimer_entree' => 'Odstrániť túto položku menu',
+       'formulaire_supprimer_menu' => 'Odstrániť menu',
+       'formulaire_supprimer_sous_menu' => 'Odstrániť toto podmenu',
+       'formulaire_titre' => 'Nadpis',
+
+       // I
+       'info_afficher_articles' => 'Články budú zaradené do menu.',
+       'info_articles_max' => 'Iba ak v rubrike nie je viac ako @max@ článkov',
+       'info_articles_max_affiches' => 'Zobrazenie obmedzené na @max@ článkov',
+       'info_classe_parent' => 'Trieda nadradených prvkov: ',
+       'info_connexion_obligatoire' => 'Vyžaduje sa prihlásenie',
+       'info_deconnexion_obligatoire' => 'Iba keď ste odhlásený',
+       'info_masquer_articles_uniques' => 'Unikátne články skryté',
+       'info_numero_menu' => 'MENU ČÍSLO:',
+       'info_page_speciale' => 'Odkaz na stránku "@page@"',
+       'info_page_speciale_zajax' => 'Modalbox pre stránku "@page@" bloku "@bloc@" ',
+       'info_rubrique_courante' => 'Aktuálna rubrika',
+       'info_rubriques_exclues' => ' /okrem rubriky (-ík) @id_rubriques@',
+       'info_rubriques_max_affichees' => 'Zobrazenie obmedzené na @max@ rubrík',
+       'info_secteur_exclus' => ' /okrem sektora (-ov) @id_secteur@',
+       'info_sousrub_cond' => 'Sú zobrazené iba podrubriky aktuálnej rubriky.',
+       'info_tous_groupes_mots' => 'Všetky skupiny kľúčových slov',
+       'info_traduction_recuperee' => 'Kontext určí vybraný preklad',
+       'info_tri' => 'Triedenie:',
+       'info_tri_alpha' => '(abecedné)',
+       'info_tri_articles' => 'Roztriediť články:',
+       'info_tri_num' => '(číselné)',
+
+       // N
+       'noisette_description' => 'Vkladanie menu definované v zásuvnom module Menus.',
+       'noisette_label_afficher_titre_menu' => 'Zobraziť názov menu?',
+       'noisette_label_identifiant' => 'Menu, ktoré sa má zobraziť:',
+       'noisette_nom_noisette' => 'Menu',
+       'nom_menu_accueil' => 'Úvodná stránka',
+       'nom_menu_articles_rubrique' => 'Články v rubrike',
+       'nom_menu_deconnecter' => 'Odhlásiť sa',
+       'nom_menu_espace_prive' => 'Prihlásenie/odkaz na súkromnú zónu',
+       'nom_menu_groupes_mots' => 'Kľúčové slová a články skupiny kľúčových slov',
+       'nom_menu_lien' => 'Samostatný odkaz',
+       'nom_menu_mapage' => 'Moja stránka',
+       'nom_menu_mots' => 'Články s kľúčovým slovom',
+       'nom_menu_objet' => 'Článok, rubrika alebo iný objekt SPIPU',
+       'nom_menu_page_speciale' => 'Odkaz na šablónu stránky',
+       'nom_menu_page_speciale_zajax' => 'Blok na stránke v SPIPe',
+       'nom_menu_rubriques_completes' => 'Zoznam alebo stromová štruktúra  rubrík a článkov (s mnohými možnosťami)',
+       'nom_menu_rubriques_evenements' => 'Udalosti, ktoré sa týkajú rubriky',
+       'nom_menu_secteurlangue' => 'Jazykové sektory',
+       'nom_menu_texte_libre' => 'Potvrdený text',
+
+       // T
+       'tous_les_articles' => '... Všetky články',
+       'toutes_les_rubriques' => '... Všetky rubriky'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/paquet-menus.xml b/www/plugins/menus_1/lang/paquet-menus.xml
new file mode 100644 (file)
index 0000000..e74acae
--- /dev/null
@@ -0,0 +1,21 @@
+<traduction module="paquet-menus" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/menus/trunk/lang/" reference="fr">
+       <langue code="ar" url="http://trad.spip.net/tradlang_module/paquet-menus?lang_cible=ar">
+               <traducteur nom="George" lien="http://trad.spip.net/auteur/جورج-قندلفت" />
+       </langue>
+       <langue code="de" url="http://trad.spip.net/tradlang_module/paquet-menus?lang_cible=de">
+               <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
+       </langue>
+       <langue code="en" url="http://trad.spip.net/tradlang_module/paquet-menus?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-menus?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fr" />
+       <langue code="it" url="http://trad.spip.net/tradlang_module/paquet-menus?lang_cible=it">
+               <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
+       </langue>
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-menus?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/menus_1/lang/paquet-menus_ar.php b/www/plugins/menus_1/lang/paquet-menus_ar.php
new file mode 100644 (file)
index 0000000..9370c82
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-menus?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'menus_description' => 'عندما لا نستخدم ملحق {{القوائم}}، نضطر لتعريف كل قوائم الموقع في الصفحات النموذجية،
+       مما يؤدي الى ان مدراء الموقع لا يمكنهم التحكم مباشرة بهذه القوائم، وعندما يرغبون في تعديل اي شيء فيها، يضطرون الى 
+       الطلب من مطور الصفحات النموذجية إدخال التعديلات. إضافة الى ذلك، اذا اردنا وضع روابط ثابتة (مثلاً رابط الى مقال محدد او صفحة محددة او موقع آخر) يجب ادخال هذه الروابط كما هي في صفحة القوائم النموذجية.
+
+       الهدف من ملحق {{القوائم}} هو السماح بإنشاء قوائم بسهولة من خلال واجهة تفاعلية في المجال الخاص.
+       {{تنبيه!}} لا يتحكم هذا الملحق بالطريقة التي ستعرض فيها هذه القوائم في الموقع العمومي. يكتفي بإنشاء القوائم بسهولة وإنتاج علامات html الخاصة بها. ',
+       'menus_nom' => 'القوائم',
+       'menus_slogan' => 'إنشاء قوائم شخصية',
+       'menus_titre' => 'القوائم'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/paquet-menus_de.php b/www/plugins/menus_1/lang/paquet-menus_de.php
new file mode 100644 (file)
index 0000000..87b6f95
--- /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-menus?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'menus_description' => 'Menüs bequem im Redaktionssystem gestalten.', # MODIF
+       'menus_nom' => 'Menus', # NEW
+       'menus_slogan' => 'Menüs bequem im Redaktionssystem gestalten.',
+       'menus_titre' => 'Menüs'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/paquet-menus_en.php b/www/plugins/menus_1/lang/paquet-menus_en.php
new file mode 100644 (file)
index 0000000..e5cde92
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-menus?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'menus_description' => 'When you are not using the plugin {{menus}}, you have to define all the menus in your templates, so that site administrators do not have direct hands on it and when they want to change something in it, they are forced to make a request to the person in charge of the templates.
+
+In addition, when you want static links (a link to a specific article, to a specific page or to an external site) they should be hard written in the template of the menu.
+
+The purpose of the plugin {{Menus}} is to allow you to create easily menus using an intuitive interface, directly into the private area.
+
+{{Warning}} This plugin does not deal with the way menus are displayed. It allows their easy creation and to generate the HTML code.',
+       'menus_nom' => 'Menus',
+       'menus_slogan' => 'Create your own custom menus.',
+       'menus_titre' => 'Menus'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/paquet-menus_es.php b/www/plugins/menus_1/lang/paquet-menus_es.php
new file mode 100644 (file)
index 0000000..42a00c4
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-menus?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'menus_description' => 'Cuando no se usa el plugin {{Menús}}, es necesario definir todos los menús en los esqueletos, lo que hace los administradores del sitio no puedan cambiar algo a su antojo, sino que deban solicitar a la persona modificar los esqueletos. Además, cuando vea los enlaces estáticos (un enlace a un artículo específico, o a una página determinada, o a un sitio externo)  deberá escribirlos en duro en el esqueleto del menú.
+       El propósito del plugin {{Menús}} es entonces permitir elaborar fácilmente menús mediante una interfaz sencilla directamente en la parte privada. 
+       {{¡Atención!}} Este plugin no se ocupa de cómo se mostrarán los menús. Permite crearlos fácilmente y generar el código HTML.',
+       'menus_nom' => 'Menús',
+       'menus_slogan' => 'Cree sus menús personalizados.',
+       'menus_titre' => 'Menús'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/paquet-menus_fr.php b/www/plugins/menus_1/lang/paquet-menus_fr.php
new file mode 100644 (file)
index 0000000..46d3bcc
--- /dev/null
@@ -0,0 +1,21 @@
+<?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_/menus/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'menus_description' => 'Lorsqu\'on ne se sert pas du plugin {{Menus}}, on est obligé de définir tous ses menus dans les squelettes,
+       ce qui fait que les administrateurs du site n\'ont pas directement la main dessus et que lorsqu\'ils veulent y changer quelque chose, ils sont obligés
+       d\'en faire la demande à la personne en charge des squelettes. De plus, lorsqu\'on veut des liens statiques (un lien vers un article précis,
+       ou vers une page précise, ou vers un site externe) il faut les écrire en dur dans le squelette du menu.
+
+       Le but du plugin {{Menus}} est donc de permettre de facilement élaborer des menus au moyen d\'une interface conviviale, directement dans la partie privée.
+       {{Attention !}} Ce plugin ne s\'occupe pas de la manière dont seront affichés les menus. Il permet de les créer facilement et d\'en générer le code HTML.',
+       'menus_nom' => 'Menus',
+       'menus_slogan' => 'Créez vos menus personnalisés.',
+       'menus_titre' => 'Menus'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/paquet-menus_it.php b/www/plugins/menus_1/lang/paquet-menus_it.php
new file mode 100644 (file)
index 0000000..9a6975f
--- /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-menus?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'menus_description' => 'Crea i tuoi menù in redazione.', # MODIF
+       'menus_nom' => 'Menus', # NEW
+       'menus_slogan' => 'Crea i tuoi menù in redazione.',
+       'menus_titre' => 'Menù'
+);
+
+?>
diff --git a/www/plugins/menus_1/lang/paquet-menus_sk.php b/www/plugins/menus_1/lang/paquet-menus_sk.php
new file mode 100644 (file)
index 0000000..6a87678
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-menus?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'menus_description' => 'Keď sa nepoužíva zásuvný modul{{Menus,}} všetky šablóny musia byť definované v ich menu,
+       čiže administrátori stránky to nemajú úplne pod kontrolou a ak chcú niečo zmeniť, musia sa obrátiť 
+       na človeka, ktorý je zodpovedný za šablóny. Okrem toho ak chcete pridať statické odkazy (odkaz na konkrétny článok
+       alebo na konkrétnu stránku, alebo na externú stránku), tie musia byť zapísané do šablóny menu.
+
+       Cieľom zásuvného modulu {{Menus}} je umožniť vám ľahko vytvárať menu pomocou intuitívneho rozhrania priamo do súkromnej zóny.
+       {{Pozor!}} Tento zásuvný modul sa nezaoberá tým, ako sa položky menu zobrazia. Umožňuje  ľahké vytváranie menu a vygenerovanie kódu HTML.',
+       'menus_nom' => 'Ponuky menu',
+       'menus_slogan' => 'Vytvorte svoje vlastné ponuky menu.',
+       'menus_titre' => 'Ponuky menu'
+);
+
+?>
diff --git a/www/plugins/menus_1/menu.html b/www/plugins/menus_1/menu.html
new file mode 100644 (file)
index 0000000..b6581eb
--- /dev/null
@@ -0,0 +1,11 @@
+<BOUCLE_menu_principal(MENUS){id_menu}>
+<html>
+       <head>
+               [<title>(#TITRE|textebrut)</title>]
+       </head>
+       <body>
+               <h1>#TITRE</h1>
+               #INCLURE{fond=inclure/menu, env}
+       </body>
+</html>
+</BOUCLE_menu_principal>
diff --git a/www/plugins/menus_1/menus/accueil.html b/www/plugins/menus_1/menus/accueil.html
new file mode 100644 (file)
index 0000000..95ae86e
--- /dev/null
@@ -0,0 +1,9 @@
+[(#SET{titre,[(#ENV*{titre}|typo|sinon{<:accueil_site:>})]})]
+[(#ENV{appel_formulaire}|oui)
+       <div class="titre">#GET{titre}</div>
+       <div class="infos"><:info_racine_site:></div>
+]
+[(#ENV{appel_menu}|oui)
+       <li class="menu-entree item[ (#ENV{css})][(#ENV{env/type}|=={page}|et{#ENV{env/composition}|=={sommaire}}|ou{#ENV{env/type-page}|=={sommaire}|oui}|oui)on active]">
+               <a href="#URL_SITE_SPIP/">#GET{titre}</a>
+]
diff --git a/www/plugins/menus_1/menus/accueil.xml b/www/plugins/menus_1/menus/accueil.xml
new file mode 100644 (file)
index 0000000..bf77651
--- /dev/null
@@ -0,0 +1,8 @@
+<entree>
+       <nom><:menus:nom_menu_accueil:></nom>
+       <rang>01</rang>
+       <description><:menus:description_menu_accueil:></description>
+       <icone>images/menus_accueil.png</icone>
+       <parametre nom="titre" class="multilang" label="menus:entree_titre" />
+       <parametre nom="css" label="menus:entree_css" />
+</entree>
diff --git a/www/plugins/menus_1/menus/articles_rubrique.html b/www/plugins/menus_1/menus/articles_rubrique.html
new file mode 100644 (file)
index 0000000..f2339ea
--- /dev/null
@@ -0,0 +1,47 @@
+[(#SET{id_rubrique, #ENV{id_rubrique}|intval})]\r
+[(#SET{tri_num, #ENV{tri_num}|ou{#ENV{tri_alpha}}|?{#ENV{tri_num},'titre'}})]\r
+[(#SET{tri_alpha, #ENV{tri_num}|ou{#ENV{tri_alpha}}|?{#ENV{tri_alpha},'titre'}})]\r
+[(#SET{articles_max_affiches, #ENV{articles_max_affiches}|intval|?{#ENV{articles_max_affiches},10000}})]\r
+\r
+[(#ENV{appel_formulaire}|oui)\r
+       [(#SET{titre, #GET{id_rubrique}|?{#INFO_TITRE{rubrique, #GET{id_rubrique}}, <:info_racine_site:>}})]\r
+       <div class="titre">#GET{titre}</div>\r
+       <div class="infos">\r
+               <:menus:info_tri:> [(#GET{tri_num}) <:menus:info_tri_num:>][(#GET{tri_num}|et{GET{tri_alpha}}), ][(#GET{tri_alpha}) <:menus:info_tri_alpha:>]\r
+       </div>\r
+]\r
+<BOUCLE_appel(CONDITION){si #ENV{appel_menu}|oui}>\r
+       <BOUCLE_env_trad(CONDITION){si #ENV{trad}|=={trad}}>\r
+       #SET{cpt,0}\r
+       <BOUCLE_cpt_articles_orig(ARTICLES){id_rubrique=#GET{id_rubrique}}{origine_traduction}> </BOUCLE_cpt_articles_orig>#SET{cpt,#TOTAL_BOUCLE}</B_cpt_articles_orig>\r
+       <BOUCLE_articles_orig(ARTICLES){id_rubrique=#GET{id_rubrique}}{par num #GET{tri_num}}{par #GET{tri_alpha}}{origine_traduction}{0,#GET{articles_max_affiches}}>\r
+               <BOUCLE_trad(ARTICLES){traduction}{id_rubrique=#GET{id_rubrique}}{lang=#ENV{lang}}>\r
+               <li class="menu-entree item[ (#ID_ARTICLE|menus_exposer{article,#ENV*{env}})]">\r
+                       <a href="#URL_ARTICLE">#TITRE</a>\r
+               </li>\r
+               </BOUCLE_trad>\r
+               </B_trad>\r
+               <li class="menu-entree item[ (#ID_ARTICLE|menus_exposer{article,#ENV*{env}})]">\r
+                       <a href="#URL_ARTICLE">#TITRE</a>\r
+               </li>\r
+               <//B_trad>\r
+       </BOUCLE_articles_orig>\r
+       [(#GET{cpt}|>{#GET{articles_max_affiches}}|oui)\r
+       <li><a class="suite" href="[(#URL_RUBRIQUE|parametre_url{connect,''})]"><:menus:tous_les_articles:></a></li>    \r
+    ]\r
+       </B_articles_orig>\r
+       </BOUCLE_env_trad>\r
+       </B_env_trad>\r
+       #SET{cpt,0}\r
+       <BOUCLE_cpt_articles(ARTICLES){id_rubrique=#GET{id_rubrique}}> </BOUCLE_cpt_articles>#SET{cpt,#TOTAL_BOUCLE}</B_cpt_articles>\r
+       <BOUCLE_articles(ARTICLES){id_rubrique=#GET{id_rubrique}}{par num #GET{tri_num}}{par #GET{tri_alpha}}{0,#GET{articles_max_affiches}}>\r
+               <li class="menu-entree item[ (#ID_ARTICLE|menus_exposer{article,#ENV*{env}})]">\r
+                       <a href="#URL_ARTICLE">#TITRE</a>\r
+               </li>\r
+       </BOUCLE_articles>\r
+       [(#GET{cpt}|>{#GET{articles_max_affiches}}|oui)\r
+       <li><a class="suite" href="[(#URL_RUBRIQUE|parametre_url{connect,''})]"><:menus:tous_les_articles:></a></li>    \r
+    ]\r
+       </B_articles>\r
+       <//B_env_trad>\r
+</BOUCLE_appel>
\ No newline at end of file
diff --git a/www/plugins/menus_1/menus/articles_rubrique.xml b/www/plugins/menus_1/menus/articles_rubrique.xml
new file mode 100644 (file)
index 0000000..3a18591
--- /dev/null
@@ -0,0 +1,12 @@
+<entree>
+       <nom><:menus:nom_menu_articles_rubrique:></nom>
+       <rang>04</rang>
+       <description><:menus:description_menu_articles_rubrique:></description>
+       <icone>images/menus_articles_rubrique.png</icone>
+       <parametre nom="id_rubrique" label="menus:entree_id_rubrique" />
+       <parametre nom="tri_num" label="menus:entree_tri_num_articles" />
+       <parametre nom="tri_alpha" label="menus:entree_tri_alpha_articles" />
+       <parametre nom="articles_max_affiches" label="menus:entree_articles_max_affiches" />
+       <parametre nom="trad" label="menus:entree_traduction_articles_rubriques" />
+       <refuser_sous_menu/>
+</entree>
diff --git a/www/plugins/menus_1/menus/deconnecter.html b/www/plugins/menus_1/menus/deconnecter.html
new file mode 100644 (file)
index 0000000..f045569
--- /dev/null
@@ -0,0 +1,9 @@
+[(#SET{titre,[(#ENV*{titre}|typo|sinon{<:icone_deconnecter:>})]})]
+[(#ENV{appel_formulaire}|oui)
+       <div class="titre">#GET{titre}</div>
+       <div class="infos"> </div>
+]
+[(#ENV{appel_menu}|et{#SESSION{id_auteur}|>{0}|oui}|oui)
+       <li class="menu-entree item[ (#ENV{css})]">
+               <a href="#URL_LOGOUT">#GET{titre}</a>
+]
diff --git a/www/plugins/menus_1/menus/deconnecter.xml b/www/plugins/menus_1/menus/deconnecter.xml
new file mode 100644 (file)
index 0000000..5b0869c
--- /dev/null
@@ -0,0 +1,8 @@
+<entree>
+       <nom><:menus:nom_menu_deconnecter:></nom>
+       <rang>21</rang>
+       <description><:menus:description_menu_deconnecter:></description>
+       <icone>images/menus_logout.png</icone>
+       <parametre nom="titre" class="multilang" label="menus:entree_titre" />
+       <parametre nom="css" label="menus:entree_css" />
+</entree>
diff --git a/www/plugins/menus_1/menus/espace_prive.html b/www/plugins/menus_1/menus/espace_prive.html
new file mode 100644 (file)
index 0000000..f4281c6
--- /dev/null
@@ -0,0 +1,17 @@
+[(#SET{titre,[(#ENV*{titre}|typo|sinon{<:espace_prive:>})]})]\r
+[(#SET{titre_connecter,[(#ENV*{titre_connecter}|typo|sinon{<:lien_connecter:>})]})]\r
+\r
+[(#ENV{appel_formulaire}|oui)\r
+       <div class="titre">#GET{titre}</div>\r
+       <div class="infos"> </div>\r
+]\r
+[(#ENV{appel_menu}|oui)\r
+       [(#AUTORISER{ecrire})\r
+               <li class="menu-entree item[ (#ENV{css})]">\r
+                       <a href="#EVAL{_DIR_RESTREINT_ABS}">#GET{titre}</a>\r
+       ]\r
+       [(#SESSION{id_auteur}|>{0}|non)\r
+               <li class="menu-entree item[ (#ENV{css})]">\r
+                       <a href="[(#URL_PAGE{login}|parametre_url{url,#ENV{url,#SELF}})]" rel="nofollow">#GET{titre_connecter}</a>\r
+       ]\r
+]\r
diff --git a/www/plugins/menus_1/menus/espace_prive.xml b/www/plugins/menus_1/menus/espace_prive.xml
new file mode 100644 (file)
index 0000000..4439350
--- /dev/null
@@ -0,0 +1,10 @@
+<entree>\r
+       <nom><:menus:nom_menu_espace_prive:></nom>\r
+       <rang>10</rang>\r
+       <description><:menus:description_menu_espace_prive:></description>\r
+       <icone>images/menus_logout.png</icone>\r
+       <parametre nom="titre" class="multilang" label="menus:entree_titre_prive" />\r
+       <parametre nom="titre_connecter" class="multilang" label="menus:entree_titre_connecter" />\r
+       <parametre nom="css" label="menus:entree_css" />\r
+       <parametre nom="url" label="menus:entree_url_public" />\r
+</entree>\r
diff --git a/www/plugins/menus_1/menus/groupe_mots.html b/www/plugins/menus_1/menus/groupe_mots.html
new file mode 100644 (file)
index 0000000..7d7d1a1
--- /dev/null
@@ -0,0 +1,61 @@
+[(#SET{id_groupe, #ENV{id_groupe}|intval})]
+[(#SET{nombre_articles_mot, #ENV{nombre_articles_mot}|intval|?{#ENV{nombre_articles_mot},0}})]
+[(#SET{tri_num, #ENV{tri_num}|ou{#ENV{tri_alpha}}|?{#ENV{tri_num},'titre'}})]
+[(#SET{tri_alpha, #ENV{tri_num}|ou{#ENV{tri_alpha}}|?{#ENV{tri_alpha},'titre'}})]
+
+[(#ENV{appel_formulaire}|oui)
+       [(#SET{titre, #GET{id_groupe}|?{#INFO_TITRE{groupes_mots, #GET{id_groupe}}, <:menus:info_tous_groupes_mots:>}})]
+       <div class="titre">#GET{titre}</div>
+       <div class="infos">
+               [(#GET{nombre_articles_mot}|=={0}|non)
+                       <:menus:entree_sur_n_articles{n=#GET{nombre_articles_mot}}:>
+               ]
+               [(#GET{nombre_articles_mot}|=={0}|oui)
+                       <:menus:entree_aucun:>
+               ]
+               <br />
+       <:menus:info_tri:> [(#GET{tri_num}) <:menus:info_tri_num:>][(#GET{tri_num}|et{GET{tri_alpha}}), ][(#GET{tri_alpha}) <:menus:info_tri_alpha:>]
+       </div>
+]
+
+<BOUCLE_appel(CONDITION){si #ENV{appel_menu}|oui}>
+<BOUCLE_mots(MOTS){id_groupe=#GET{id_groupe}}{par num #GET{tri_num}}{par #GET{tri_alpha}}>
+       <li class="menu-entree item">
+               <a href="#URL_MOT">#TITRE</a>
+               <B_articles_mots>
+                       <ul class="menu-liste menu-items">
+                               <BOUCLE_articles_mots(ARTICLES){id_mot=#ID_MOT}{par num #GET{tri_num}}{par #GET{tri_alpha}}{0,#GET{nombre_articles_mot}}>
+                               <li class="menu-entree item">
+                                       <a href="#URL_ARTICLE">#TITRE</a>
+                               </li>
+                               </BOUCLE_articles_mots>
+                       </ul>
+               </B_articles_mots>
+       </li>
+</BOUCLE_mots>
+</B_mots>
+       <BOUCLE_groupe_mots(GROUPES_MOTS){par num #GET{tri_num}}{par #GET{tri_alpha}}>
+       <li class="menu-entree item">
+               <a[(#CHEMIN{groupes_mot.html}|oui) href="#URL_PAGE{groupes_mot,id_groupe=#ID_GROUPE}"][(#CHEMIN{groupes_mot.html}|non) href="#"] title="[(#TITRE|attribut_html)]">#TITRE</a>
+               <B_mots_tous>
+                       <ul class="menu-liste menu-items">
+                               <BOUCLE_mots_tous(MOTS){id_groupe}{par num #GET{tri_num}}{par #GET{tri_alpha}}>
+                               <li class="menu-entree item">
+                                       <a href="#URL_MOT">#TITRE</a>
+                                               <B_mots_articles_mots>
+                                                       <ul class="menu-liste menu-items">
+                                                               <BOUCLE_mots_articles_mots(ARTICLES){id_mot=#ID_MOT}{par num #GET{tri_num}}{par #GET{tri_alpha}}{0,#GET{nombre_articles_mot}}>
+                                                                       <li class="menu-entree item">
+                                                                       <a href="#URL_ARTICLE">#TITRE</a>
+                                                                       </li>
+                                                               </BOUCLE_mots_articles_mots>
+                                                       </ul>
+                                               </B_mots_articles_mots>
+                               </li>
+                               </BOUCLE_mots_tous>
+                       </ul>
+               </B_mots_tous>
+       </li>
+       </BOUCLE_groupe_mots>
+<//B_mots>
+</BOUCLE_appel>
\ No newline at end of file
diff --git a/www/plugins/menus_1/menus/groupe_mots.xml b/www/plugins/menus_1/menus/groupe_mots.xml
new file mode 100644 (file)
index 0000000..f43eabd
--- /dev/null
@@ -0,0 +1,11 @@
+<entree>
+       <nom><:menus:nom_menu_groupes_mots:></nom>
+       <rang>05</rang>
+       <description><:menus:description_menu_groupes_mots:></description>
+       <icone>images/menus_groupes_mots.png</icone>
+       <parametre nom="id_groupe" label="menus:entree_id_groupe" />
+       <parametre nom="tri_num" label="menus:entree_tri_num" />
+       <parametre nom="tri_alpha" label="menus:entree_tri_alpha" />
+       <parametre nom="nombre_articles_mot" label="menus:entree_nombre_articles" />
+       <refuser_sous_menu/>
+</entree>
diff --git a/www/plugins/menus_1/menus/lien.html b/www/plugins/menus_1/menus/lien.html
new file mode 100644 (file)
index 0000000..ab348b8
--- /dev/null
@@ -0,0 +1,10 @@
+#SET{titre, #ENV*{titre}|typo}
+
+[(#ENV{appel_formulaire}|oui)
+       <div class="titre">#GET{titre}</div>
+       <div class="infos">[(#ENV*{url}|extraire_multi)]</div>
+]
+[(#ENV{appel_menu}|oui)
+       <li class="menu-entree item[ (#ENV{css})]">
+               <a href="[(#ENV*{url}|extraire_multi)]"[ class="(#ENV{css_lien})"]>#GET{titre}</a>
+]
diff --git a/www/plugins/menus_1/menus/lien.xml b/www/plugins/menus_1/menus/lien.xml
new file mode 100644 (file)
index 0000000..476e237
--- /dev/null
@@ -0,0 +1,10 @@
+<entree>
+       <nom><:menus:nom_menu_lien:></nom>
+       <rang>11</rang>
+       <description><:menus:description_menu_lien:></description>
+       <icone>images/menus_lien.png</icone>
+       <parametre nom="titre" class="multilang" label="menus:entree_titre" obligatoire="oui" />
+       <parametre nom="url" label="menus:entree_url" obligatoire="oui" />
+       <parametre nom="css" label="menus:entree_css" />
+       <parametre nom="css_lien" label="menus:entree_css_lien" />
+</entree>
diff --git a/www/plugins/menus_1/menus/mapage.html b/www/plugins/menus_1/menus/mapage.html
new file mode 100644 (file)
index 0000000..d4940ee
--- /dev/null
@@ -0,0 +1,9 @@
+[(#SET{titre,[(#ENV*{titre}|typo|sinon{<:menus:entree_mapage:>})]})]
+[(#ENV{appel_formulaire}|oui)
+       <div class="titre">#GET{titre}</div>
+       <div class="infos"> </div>
+]
+[(#ENV{appel_menu}|et{#SESSION{id_auteur}|>{0}|oui}|oui)
+       <li class="menu-entree item[ (#ENV{css})][(#ENV{env/type}|=={auteur}|ou{#ENV{env/type-page}|=={auteur}}|et{#ENV{env/id_auteur}|=={#SESSION{id_auteur}}}) on active]">
+               <a href="#URL_AUTEUR{#SESSION{id_auteur}}">#GET{titre}</a>
+]
diff --git a/www/plugins/menus_1/menus/mapage.xml b/www/plugins/menus_1/menus/mapage.xml
new file mode 100644 (file)
index 0000000..492ca43
--- /dev/null
@@ -0,0 +1,8 @@
+<entree>
+       <nom><:menus:nom_menu_mapage:></nom>
+       <rang>20</rang>
+       <description><:menus:description_menu_mapage:></description>
+       <icone>images/menus_mapage.png</icone>
+       <parametre nom="titre" class="multilang" label="menus:entree_titre" />
+       <parametre nom="css" label="menus:entree_css" />
+</entree>
diff --git a/www/plugins/menus_1/menus/mots.html b/www/plugins/menus_1/menus/mots.html
new file mode 100644 (file)
index 0000000..ac3a5f5
--- /dev/null
@@ -0,0 +1,47 @@
+[(#SET{id_mot, #ENV{id_mot}|intval})]
+[(#SET{nombre, #ENV{nombre}|intval|?{#ENV{nombre},0}})]
+[(#SET{tri_num, #ENV{tri_num}|ou{#ENV{tri_alpha}}|?{#ENV{tri_num},'titre'}})]
+[(#SET{tri_alpha, #ENV{tri_num}|ou{#ENV{tri_alpha}}|?{#ENV{tri_alpha},'titre'}})]
+
+[(#ENV{appel_formulaire}|oui)
+       [(#SET{titre, #GET{id_mot}|?{#INFO_TITRE{mots, #GET{id_mot}}, <:info_racine_site:>}})]
+       <div class="titre">#GET{titre}</div>
+       <div class="infos">
+               [(#GET{nombre}|=={0}|non)
+                       <:menus:entree_sur_n_mots{n=#GET{nombre}}:>
+               ]
+               [(#GET{nombre}|=={0}|oui)
+                       <:menus:entree_infini:>
+               ]
+               <br /><:menus:info_tri:> [(#GET{tri_num}) <:menus:info_tri_num:>][(#GET{tri_num}|et{GET{tri_alpha}}), ][(#GET{tri_alpha}) <:menus:info_tri_alpha:>]
+       </div>
+]
+<BOUCLE_appel(CONDITION){si #ENV{appel_menu}|oui}>
+       <BOUCLE_mot(MOTS){id_mot=#GET{id_mot}}>
+               <li class="menu-entree item[ (#ID_MOT|menus_exposer{mot,#ENV*{env}})]">
+                       <a href="#URL_MOT" title="[(#TITRE|attribut_html)]">#TITRE</a>
+                       <BOUCLE_infini(CONDITION){si #GET{nombre}|=={0}}>
+                               <B_articles_infini>
+                               <ul class="menu-liste menu-items">
+                                       <BOUCLE_articles_infini(ARTICLES){id_mot}{par num #GET{tri_num}}{par #GET{tri_alpha}}>
+                                               <li class="menu-entree item[ (#ID_ARTICLE|menus_exposer{rubrique,#ENV*{env}})]">
+                                                       <a href="#URL_ARTICLE">#TITRE</a>
+                                               </li>
+                                       </BOUCLE_articles_infini>
+                               </ul>
+                               </B_articles_infini>
+                       </BOUCLE_infini>
+                       <BOUCLE_limite(CONDITION){si #GET{nombre}|>{0}}>
+                       <B_articles_limite>
+                               <ul class="menu-liste menu-items">
+                                       <BOUCLE_articles_limite(ARTICLES){id_mot}{par num #GET{tri_num}}{par #GET{tri_alpha}}{0,#GET{nombre}}>
+                                               <li class="menu-entree item[ (#ID_ARTICLE|menus_exposer{rubrique,#ENV*{env}})]">
+                                                       <a href="#URL_ARTICLE">#TITRE</a>
+                                               </li>
+                                       </BOUCLE_articles_limite>
+                               </ul>
+                               </B_articles_limite>
+                       </BOUCLE_limite>
+               </li>
+       </BOUCLE_mot>
+</BOUCLE_appel>
diff --git a/www/plugins/menus_1/menus/mots.xml b/www/plugins/menus_1/menus/mots.xml
new file mode 100644 (file)
index 0000000..1d32e0c
--- /dev/null
@@ -0,0 +1,11 @@
+<entree>
+       <nom><:menus:nom_menu_mots:></nom>
+       <rang>04</rang>
+       <description><:menus:description_menu_mots:></description>
+       <icone>images/menus_mots.png</icone>
+       <parametre nom="id_mot" label="menus:entree_id_mot" obligatoire="oui" />
+       <parametre nom="nombre" label="menus:entree_nombre_articles" />
+       <parametre nom="tri_num" label="menus:entree_tri_num_articles" />
+       <parametre nom="tri_alpha" label="menus:entree_tri_alpha_articles" />
+       <refuser_sous_menu/>
+</entree>
diff --git a/www/plugins/menus_1/menus/objet.html b/www/plugins/menus_1/menus/objet.html
new file mode 100644 (file)
index 0000000..9301da6
--- /dev/null
@@ -0,0 +1,36 @@
+#SET{id_objet,#ENV{id_objet}}
+<BOUCLE_si_art(CONDITION){si #ENV{type_objet}|=={article}|et{#ENV{trad}|=={trad}}}>
+<BOUCLE_art_orig(ARTICLES){id_article=#ENV{id_objet}}{origine_traduction}>
+<BOUCLE_art_lang(ARTICLES){traduction}{lang=#ENV{lang}}>
+#SET{id_objet,#ID_ARTICLE}
+</BOUCLE_art_lang>
+#SET{id_objet,#ID_ARTICLE}
+<//B_art_lang>
+</BOUCLE_art_orig>
+</BOUCLE_si_art>
+
+[(#SET{titre, #ENV*{titre}|typo|sinon{#INFO_TITRE{#ENV{type_objet}, #GET{id_objet}}}|sinon{<:info_sans_titre:>}})]
+
+[(#ENV{trad}|=={trad}|et{#ENV{type_objet}|=={article}}|oui)#SET{info_trad,#VAL{menus:info_traduction_recuperee}|_T}]
+
+#SET{visible,oui}
+[(#ENV{connexion}|=={session}|oui)
+       [(#SESSION{statut}|non)
+               #SET{visible,non}]
+       #SET{info_session,#VAL{menus:info_connexion_obligatoire}|_T}
+]
+[(#ENV{connexion}|=={nosession}|oui)
+       [(#SESSION{statut}|oui)
+               #SET{visible,non}]
+       #SET{info_session,#VAL{menus:info_deconnexion_obligatoire}|_T}
+]
+
+[(#ENV{appel_formulaire}|oui)
+       <div class="titre">#GET{titre}</div>
+       <div class="infos">#ENV{type_objet}-#GET{id_objet}[-(#GET{info_session})][-(#GET{info_trad})]</div>
+]
+
+[(#ENV{appel_menu}|et{#GET{visible}|=={oui}}|oui)
+       <li class="menu-entree item[ (#ENV{css})][ (#ENV{id_objet}|menus_exposer{#ENV{type_objet},#ENV*{env}})]">
+               <a href="#INFO_URL{#ENV{type_objet}, #GET{id_objet}}">#GET{titre}</a>
+]
diff --git a/www/plugins/menus_1/menus/objet.xml b/www/plugins/menus_1/menus/objet.xml
new file mode 100644 (file)
index 0000000..2f716a6
--- /dev/null
@@ -0,0 +1,12 @@
+<entree>
+       <nom><:menus:nom_menu_objet:></nom>
+       <rang>02</rang>
+       <description><:menus:description_menu_objet:></description>
+       <icone>images/menus_objet.png</icone>
+       <parametre nom="type_objet" label="menus:entree_type_objet" obligatoire="oui" />
+       <parametre nom="id_objet" label="menus:entree_id_objet" obligatoire="oui" />
+       <parametre nom="titre" class="multilang" label="menus:entree_titre" />
+       <parametre nom="css" label="menus:entree_css" />
+       <parametre nom="connexion" label="menus:entree_connexion_objet" />
+       <parametre nom="trad" label="menus:entree_traduction_objet" />
+</entree>
diff --git a/www/plugins/menus_1/menus/page_speciale.html b/www/plugins/menus_1/menus/page_speciale.html
new file mode 100644 (file)
index 0000000..c592781
--- /dev/null
@@ -0,0 +1,25 @@
+#SET{titre, #ENV*{titre}|typo}
+
+[(#REM) Par défaut on affiche toujours l'entrée ]
+#SET{afficher_entree,oui}
+[(#REM) Si le champ est rempli on désactive l'entrée si ça ne correspond pas aux attentes ]
+[(#ENV{suivant_connexion}|oui)
+       [(#ENV{suivant_connexion}|=={connecte}|et{#SESSION{id_auteur}|non})
+               #SET{afficher_entree,''}
+       ]
+       [(#ENV{suivant_connexion}|=={deconnecte}|et{#SESSION{id_auteur}|oui})
+               #SET{afficher_entree,''}
+       ]
+       [(#ENV{suivant_connexion}|=={admin}|et{#SESSION{statut}|!={"0minirezo"}})
+               #SET{afficher_entree,''}
+       ]
+]
+
+[(#ENV{appel_formulaire}|oui)
+       <div class="titre">#GET{titre}</div>
+       <div class="infos"><:menus:info_page_speciale{page=#ENV{nom}}:>[ ((#ENV{suivant_connexion}|?{[(#VAL{menus:entree_suivant_connexion_}|concat{#ENV{suivant_connexion}}|_T)]}))]</div>
+]
+[(#ENV{appel_menu}|et{#GET{afficher_entree}})
+       <li class="menu-entree item[ (#ENV{css})][(#ENV{env/type-page}|=={#ENV{nom}}|ou{#ENV{env/type}|=={page}|et{#ENV{env/composition}|=={#ENV{nom}}}}) on active]">
+               <a href="#URL_PAGE{#ENV{nom}, #ENV{parametres}}">#GET{titre}</a>
+]
diff --git a/www/plugins/menus_1/menus/page_speciale.xml b/www/plugins/menus_1/menus/page_speciale.xml
new file mode 100644 (file)
index 0000000..0eebfdd
--- /dev/null
@@ -0,0 +1,11 @@
+<entree>
+       <nom><:menus:nom_menu_page_speciale:></nom>
+       <rang>10</rang>
+       <description><:menus:description_menu_page_speciale:></description>
+       <icone>images/menus_page_speciale.png</icone>
+       <parametre nom="titre" class="multilang" label="menus:entree_titre" obligatoire="oui" />
+       <parametre nom="nom" label="menus:entree_page" obligatoire="oui" />
+       <parametre nom="parametres" label="menus:entree_parametres" />
+       <parametre nom="css" label="menus:entree_css" />
+       <parametre nom="suivant_connexion" label="menus:entree_suivant_connexion" />
+</entree>
diff --git a/www/plugins/menus_1/menus/page_speciale_zajax.html b/www/plugins/menus_1/menus/page_speciale_zajax.html
new file mode 100644 (file)
index 0000000..13119d8
--- /dev/null
@@ -0,0 +1,10 @@
+#SET{titre, #ENV*{titre}|typo}
+
+[(#ENV{appel_formulaire}|oui)
+       <div class="titre">#GET{titre}</div>
+       <div class="infos"><:menus:info_page_speciale_zajax{page=#ENV{nom},bloc=#ENV{bloc}}:></div>
+]
+[(#ENV{appel_menu}|oui)
+       <li class="menu-entree item[ (#ENV{css})][(#ENV{env/type-page}|=={#ENV{nom}}|ou{#ENV{env/type}|=={page}|et{#ENV{env/composition}|=={#ENV{nom}}}}) on active]">
+               <a href="#URL_PAGE{#ENV{nom}, #ENV{parametres}}" onclick="jQuery.modalbox('[(#URL_PAGE{#ENV{nom}, #ENV{parametres}}|parametre_url{var_zajax,#ENV{bloc},'&'})]');return false;">#GET{titre}</a>
+]
diff --git a/www/plugins/menus_1/menus/page_speciale_zajax.xml b/www/plugins/menus_1/menus/page_speciale_zajax.xml
new file mode 100644 (file)
index 0000000..ede0ad3
--- /dev/null
@@ -0,0 +1,13 @@
+<entree>
+       <nom><:menus:nom_menu_page_speciale_zajax:></nom>
+       <rang>10</rang>
+       <description><:menus:description_menu_page_speciale_zajax:></description>
+       <icone>images/menus_page_speciale.png</icone>
+       <parametre nom="titre" class="multilang" label="menus:entree_titre" obligatoire="oui" />
+       <parametre nom="nom" label="menus:entree_page" obligatoire="oui" />
+       <parametre nom="bloc" label="menus:entree_bloc" obligatoire="oui" />
+       <parametre nom="parametres" label="menus:entree_parametres" />
+       <parametre nom="css" label="menus:entree_css" />
+       <necessite type="plugin" nom="mediabox" />
+       <necessite type="plugin" nom="Z" />
+</entree>
diff --git a/www/plugins/menus_1/menus/rubriques_completes.html b/www/plugins/menus_1/menus/rubriques_completes.html
new file mode 100644 (file)
index 0000000..0790dca
--- /dev/null
@@ -0,0 +1,217 @@
+[(#REM)        Rubrique de depart :\r
+                       Si l'id_rubrique saisi vaut "courante" on va chercher l'id de la rubrique courante => env{env{id_rubrique}}\r
+                       sinon, on utilise l'id saisi ]\r
+[(#SET{id_rubrique, #ENV{id_rubrique}|=={courante}|?{#ENV**|unserialize|table_valeur{env}|table_valeur{id_rubrique},#ENV{id_rubrique}|intval}})]\r
+\r
+[(#SET{id_secteur_exclus, #ENV{id_secteur_exclus}|?{#ENV{id_secteur_exclus}|explode{','},#ARRAY}})]\r
+[(#SET{niveau_max_txt, #ENV{niveau}|intval|?{#ENV{niveau},infini}})]\r
+[(#SET{niveau_max, #ENV{niveau}|intval|?{#ENV{niveau},1000}})]\r
+[(#SET{sousrub_cond, #ENV{sousrub_cond}|=={oui}|?{'on',''}})]\r
+[(#SET{rubriques_max_affichees, #ENV{rubriques_max_affichees}|intval|?{#ENV{rubriques_max_affichees},10000}})]\r
+[(#SET{id_rubriques_exclues, #ENV{id_rubriques_exclues}|?{#ENV{id_rubriques_exclues}|explode{','},#ARRAY}})]\r
+[(#SET{classe_parent, #ENV{classe_parent}})]\r
+\r
+[(#SET{afficher_articles, #ENV{afficher_articles}|=={oui}|?{'on',''}})]\r
+[(#SET{masquer_articles_uniques, #ENV{masquer_articles_uniques}|=={oui}|?{'on',''}})]\r
+[(#SET{articles_max, #ENV{articles_max}|intval|?{#ENV{articles_max},10000}})]\r
+[(#SET{articles_max_plus_un, #GET{articles_max}|plus{1}})]\r
+[(#SET{articles_max_affiches, #ENV{articles_max_affiches}|intval|?{#ENV{articles_max_affiches},10000}})]\r
+\r
+[(#REM) Tri des rubriques ]\r
+[(#SET{tri_num, #ENV{tri_num}|ou{#ENV{tri_alpha}}|?{#ENV{tri_num},'titre'}})]\r
+[(#SET{tri_alpha, #ENV{tri_num}|ou{#ENV{tri_alpha}}|?{#ENV{tri_alpha},'titre'}})]\r
+[(#SET{tri_num_inverse, #ENV{tri_num_inverse}|=={oui}|?{'1','0'}})]\r
+[(#SET{tri_alpha_inverse, #ENV{tri_alpha_inverse}|=={oui}|?{'1','0'}})]\r
+\r
+[(#REM) Tri des articles ]\r
+[(#SET{tri_num_articles, #ENV{tri_num_articles}|ou{#ENV{tri_alpha_articles}}|?{#ENV{tri_num_articles},'titre'}})]\r
+[(#SET{tri_alpha_articles, #ENV{tri_num_articles}|ou{#ENV{tri_alpha_articles}}|?{#ENV{tri_alpha_articles},'titre'}})]\r
+[(#SET{tri_num_articles_inverse, #ENV{tri_num_articles_inverse}|=={oui}|?{'1','0'}})]\r
+[(#SET{tri_alpha_articles_inverse, #ENV{tri_alpha_articles_inverse}|=={oui}|?{'1','0'}})]\r
+\r
+[(#ENV{appel_formulaire}|oui)\r
+       [(#SET{titre, #ENV{id_rubrique}|?{#ENV{id_rubrique}|=={courante}|?{<:menus:info_rubrique_courante:>,#INFO_TITRE{rubrique, #GET{id_rubrique}}}, <:info_racine_site:>}})]\r
+       [(#ENV{secteurlangue}non)<div class="titre">#GET{titre}</div>]\r
+       [(#ENV{secteurlangue}oui)<div class="titre"><:menus:nom_menu_secteurlangue:></div>]\r
+       <div class="infos">\r
+               [(#GET{niveau_max_txt}|=={infini}|non)\r
+                       <:menus:entree_sur_n_niveaux{n=#GET{niveau_max_txt}}:>\r
+               ]\r
+               [(#GET{niveau_max_txt}|=={infini}|oui)\r
+                       <:menus:entree_infini:>\r
+               ]\r
+               [(#GET{id_secteur_exclus}|oui)\r
+                       <:menus:info_secteur_exclus{id_secteur=#ENV{id_secteur_exclus}}:>\r
+               ]\r
+               [(#GET{id_rubriques_exclues}|oui)\r
+                       <:menus:info_rubriques_exclues{id_rubriques=#ENV{id_rubriques_exclues}}:>\r
+               ]\r
+               [(#GET{sousrub_cond}|oui)\r
+                       <br /><:menus:info_sousrub_cond:>\r
+               ]\r
+               [(#GET{rubriques_max_affichees}|<{10000}|oui) / <:menus:info_rubriques_max_affichees{max=#GET{rubriques_max_affichees}}:>]\r
+               <br /><:menus:info_tri:> [(#GET{tri_num}) [(#GET{tri_num_inverse}|=={1}|oui) inverse] <:menus:info_tri_num:>][(#GET{tri_num}|et{GET{tri_alpha}}), ][(#GET{tri_alpha}) [(#GET{tri_alpha_inverse}|=={1}|oui) inverse] <:menus:info_tri_alpha:>]\r
+               [<br /><:menus:info_classe_parent:>(#GET{classe_parent})]\r
+\r
+               [(#GET{afficher_articles}|oui)\r
+                       <br /><:menus:info_afficher_articles:>\r
+                       [(#GET{articles_max}|<{10000}|oui) / <:menus:info_articles_max{max=#GET{articles_max}}:>]\r
+                       [(#GET{articles_max_affiches}|<{10000}|oui) / <:menus:info_articles_max_affiches{max=#GET{articles_max_affiches}}:>]\r
+                       [(#GET{masquer_articles_uniques}|oui) / <:menus:info_masquer_articles_uniques:>]\r
+               ]\r
+               <br /><:menus:info_tri_articles:> [(#GET{tri_num_articles}) [(#GET{tri_num__articles_inverse}|=={1}|oui) inverse] <:menus:info_tri_num:>][(#GET{tri_num_articles}|et{GET{tri_alpha_articles}}), ][(#GET{tri_alpha_articles}) [(#GET{tri_alpha_articles_inverse}|=={1}|oui) inverse] <:menus:info_tri_alpha:>]\r
+       </div>\r
+]\r
+<BOUCLE_appel(CONDITION){si #ENV{appel_menu}|oui}>\r
+       <BOUCLE_rubriques(RUBRIQUES){id_parent=#GET{id_rubrique}}{id_secteur !IN #GET{id_secteur_exclus}}{id_rubrique !IN #GET{id_rubriques_exclues}}{par num #GET{tri_num}}{inverse #GET{tri_num_inverse}}{par #GET{tri_alpha}}{inverse #GET{tri_alpha_inverse}}{0,#GET{rubriques_max_affichees}}>\r
+               #SET{niveau_actuel,#EVAL{1}|intval}\r
+               <li class="menu-entree item[ (#ID_RUBRIQUE|menus_exposer{rubrique,#ENV*{env}})] rub#ID_RUBRIQUE">\r
+                       <a href="#URL_RUBRIQUE">#TITRE</a>\r
+\r
+                       [(#REM) Doit-on descendre plus loin ? ]\r
+                       [(#SET{cond,#GET{niveau_max}|>{#GET{niveau_actuel}}|et{#GET{sousrub_cond}|?{#ID_RUBRIQUE|menus_exposer{rubrique,#ENV*{env}},'on'}}})]\r
+\r
+                       <BOUCLE_test_niveau(CONDITION){si #GET{cond}}>\r
+                               [(#REM) On commence par compter le nombre total de sous-rubriques (servira pour l'item "Toutes les rubriques")]\r
+                               #SET{cpt_sousrub,0}\r
+                               <BOUCLE_cpt_sousrub(RUBRIQUES){id_parent}{id_rubrique !IN #GET{id_rubriques_exclues}}> </BOUCLE_cpt_sousrub>#SET{cpt_sousrub,#TOTAL_BOUCLE}</B_cpt_sousrub>\r
+\r
+                               <B_sous_rubriques>\r
+                                       <ul class="menu-liste menu-items">\r
+                               <BOUCLE_sous_rubriques(RUBRIQUES){id_parent}{id_rubrique !IN #GET{id_rubriques_exclues}}{par num #GET{tri_num}}{inverse #GET{tri_num_inverse}}{par #GET{tri_alpha}}{inverse #GET{tri_alpha_inverse}}{0,#GET{rubriques_max_affichees}}>\r
+                                       #SET{niveau_actuel,#GET{niveau_actuel}|plus{1}}\r
+                                       [(#REM) Doit-on descendre recursivement plus loin ? ]\r
+                                       [(#SET{cond,#GET{niveau_max}|>{#GET{niveau_actuel}}|et{#GET{sousrub_cond}|?{#ID_RUBRIQUE|menus_exposer{rubrique,#ENV*{env}},'on'}}})]\r
+                                       <li class="menu-entree item[ (#ID_RUBRIQUE|menus_exposer{rubrique,#ENV*{env}})] rub#ID_RUBRIQUE">\r
+\r
+                                               [(#REM) ------------------------------------------------\r
+                                                               Positionnement de la classe daddy sur le lien pour indiquer qu'il a un ul a suivre, un autre sous-menu a ouvrir\r
+                                                               si on doit descendre plus loin et\r
+                                                                               - qu'il y a des sous-rubriques a afficher\r
+                                                                               - ou qu'il y a des articles a afficher et qu'on l'a demande ]\r
+                  #SET{class,""}\r
+                                               <BOUCLE_test_classe_parent(CONDITION){si #GET{classe_parent}}>\r
+                     [(#REM) On commence par compter le nombre de sous-rubriques ]\r
+                     #SET{cpt_sousrub_asuivre,0}\r
+                     <BOUCLE_cpt_sousrub_asuivre(RUBRIQUES){id_parent}{id_rubrique !IN #GET{id_rubriques_exclues}}> </BOUCLE_cpt_sousrub_asuivre>#SET{cpt_sousrub_asuivre,#TOTAL_BOUCLE}</B_cpt_sousrub_asuivre>\r
+                     [(#REM) Puis on compte le nombre d'articles ]\r
+                     #SET{cpt_articles_asuivre,0}\r
+                     <BOUCLE_cpt_articles_asuivre(ARTICLES){id_rubrique}{lang}> </BOUCLE_cpt_articles_asuivre>#SET{cpt_articles_asuivre,#TOTAL_BOUCLE}</B_cpt_articles_asuivre>\r
+                     [(#GET{cond}|oui)\r
+                        [(#GET{cpt_sousrub_asuivre}|oui) #SET{class,#GET{classe_parent}}]\r
+                        [(#GET{afficher_articles}|et{#GET{cpt_articles_asuivre}|<={#GET{articles_max}}|oui|et{#GET{cpt_articles_asuivre}|>{1}|ou{#GET{masquer_articles_uniques}|=={'on'}|non}}}) #SET{class,#GET{classe_parent}}]\r
+                     ]\r
+                  </BOUCLE_test_classe_parent>\r
+                                               [(#REM) --------------------------- Fin Positionnement de la classe daddy ]\r
+\r
+                                               <a href="#URL_RUBRIQUE"[ class="(#GET{class})"]>#TITRE</a>\r
+                                               <BOUCLE_test_niveau2(CONDITION){si #GET{cond}}>\r
+                                               <BOUCLE_sous_sous(BOUCLE_sous_rubriques)></BOUCLE_sous_sous>\r
+                                               </BOUCLE_test_niveau2>\r
+                                       </li>\r
+                               </BOUCLE_sous_rubriques>\r
+                                       [(#REM) On affiche le lien vers le reste si on a d�pass� le quota ]\r
+                                       [(#GET{cpt_sousrub}|>{#GET{rubriques_max_affichees}}|oui)\r
+                                               <li class="menu-entree item"><a class="suite" href="#URL_RUBRIQUE"><:menus:toutes_les_rubriques:></a></li>]\r
+\r
+                                       [(#REM) ------------------------------------------------\r
+                                                       Premier cas de gestion de l'affichage des articles \r
+                                                       Ce code est dupliqu� dans les 2e et 3e cas, voir ci dessous (a un ul pres)\r
+                                                       Il n'est pas possible en spip 2 d'utiliser inclure pour eviter la duplication\r
+                                                       Cf http://comments.gmane.org/gmane.comp.web.spip.devel/60475\r
+                                                       Ce doit etre le meme soucis qui fait que #URL_RUBRIQUE est trasnforme en\r
+                                                       spip.php?page=rubrique&id_rubrique=2&connect=condition qu'on enleve avec le filtre parametre_url ]\r
+\r
+                                       <BOUCLE_test_articles_si_sousrub(CONDITION){si #GET{afficher_articles}}>\r
+                                               [(#REM) On commence par compter le nombre d'articles de la rubrique (servira pour l'item "Tous les articles") ]\r
+                                               #SET{cpt,0}\r
+                                               <BOUCLE_cpt_si_sousrub(ARTICLES){id_rubrique}{lang}> </BOUCLE_cpt_si_sousrub>#SET{cpt,#TOTAL_BOUCLE}</B_cpt_si_sousrub>\r
+                       \r
+                                               [(#REM) On affiche les articles :\r
+                                                                       - S'il y en a moins que le max demand� \r
+                                                                       - ET    - si on n'a pas demand� de masquage des articles uniques\r
+                                                                                       - OU si le masquage des articles uniques est demand� et qu'il y en a plus d'un ]\r
+                                               #SET{afficher,non}\r
+                                               [(#GET{cpt}|<={#GET{articles_max}}|oui|et{#GET{cpt}|>{1}|ou{#GET{masquer_articles_uniques}|=={'on'}|non}})\r
+                                                       #SET{afficher,oui}]\r
+\r
+                                               <BOUCLE_test_afficher_si_sousrub(CONDITION){si #GET{afficher}|=={oui}|oui}>\r
+                                                       <BOUCLE_articles_si_sousrub(ARTICLES){id_rubrique}{lang}{par num #GET{tri_num_articles}}{inverse #GET{tri_num_articles_inverse}}{par #GET{tri_alpha_articles}}{inverse #GET{tri_alpha_articles_inverse}}{0,#GET{articles_max_affiches}}>\r
+                                                               <li class="menu-entree item[ (#ID_ARTICLE|menus_exposer{article,#ENV*{env}})]">\r
+                                                                       <a href="#URL_ARTICLE">#TITRE</a>\r
+                                                               </li>\r
+                                                       </BOUCLE_articles_si_sousrub>\r
+                                                       [(#GET{cpt}|>{#GET{articles_max_affiches}}|oui)\r
+                                                               <li class="menu-entree item"><a class="suite" href="[(#URL_RUBRIQUE|parametre_url{connect,''})]"><:menus:tous_les_articles:></a></li>]\r
+                                                       </B_articles_si_sousrub>\r
+                                               </BOUCLE_test_afficher_si_sousrub>\r
+                                       </BOUCLE_test_articles_si_sousrub>\r
+                                       [(#REM) --------------------------- Fin Premier cas ]\r
+                                       </ul>\r
+                               </B_sous_rubriques>\r
+\r
+                                       [(#REM) ---------------------------------- \r
+                                                       Second cas de gestion de l'affichage des articles ]\r
+                                       <BOUCLE_test_articles_pas_de_sousrub(CONDITION){si #GET{afficher_articles}}>\r
+                                               [(#REM) On commence par compter le nombre d'articles de la rubrique (servira pour l'item "Tous les articles") ]\r
+                                               #SET{cpt,0}\r
+                                               <BOUCLE_cpt_pas_de_sousrub(ARTICLES){id_rubrique}{lang}> </BOUCLE_cpt_pas_de_sousrub>#SET{cpt,#TOTAL_BOUCLE}</B_cpt_pas_de_sousrub>\r
+\r
+                                               [(#REM) On affiche les articles :\r
+                                                                       - S'il y en a moins que le max demand� \r
+                                                                       - ET    - si on n'a pas demand� de masquage des articles uniques\r
+                                                                                       - OU si le masquage des articles uniques est demand� et qu'il y en a plus d'un ]\r
+                                               #SET{afficher,non}\r
+                                               [(#GET{cpt}|<={#GET{articles_max}}|oui|et{#GET{cpt}|>{1}|ou{#GET{masquer_articles_uniques}|=={'on'}|non}})              \r
+                                                       #SET{afficher,oui}]\r
+\r
+                                               <BOUCLE_test_afficher_pas_de_sousrub(CONDITION){si #GET{afficher}|=={oui}|oui}>\r
+                                                       <B_articles_pas_de_sousrub>\r
+                                                               <ul class="menu-liste menu-items">\r
+                                                       <BOUCLE_articles_pas_de_sousrub(ARTICLES){id_rubrique}{lang}{par num #GET{tri_num_articles}}{inverse #GET{tri_num_articles_inverse}}{par #GET{tri_alpha_articles}}{inverse #GET{tri_alpha_articles_inverse}}{0,#GET{articles_max_affiches}}>\r
+                                                               <li class="menu-entree item[ (#ID_ARTICLE|menus_exposer{article,#ENV*{env}})]">\r
+                                                                               <a href="#URL_ARTICLE">#TITRE</a>\r
+                                                               </li>\r
+                                                       </BOUCLE_articles_pas_de_sousrub>\r
+                                                               [(#GET{cpt}|>{#GET{articles_max_affiches}}|oui)\r
+                                                                       <li class="menu-entree item"><a class="suite" href="[(#URL_RUBRIQUE|parametre_url{connect,''})]"><:menus:tous_les_articles:></a></li>]\r
+                                                               </ul>\r
+                                                       </B_articles_pas_de_sousrub>\r
+                                               </BOUCLE_test_afficher_pas_de_sousrub>\r
+                                       </BOUCLE_test_articles_pas_de_sousrub>\r
+                                       [(#REM) --------------------------- Fin Second cas ]\r
+\r
+                               <//B_sous_rubriques>\r
+                       </BOUCLE_test_niveau>\r
+               </li>\r
+       </BOUCLE_rubriques>\r
+\r
+   [(#REM) ---------------------------------- \r
+         troisieme cas de gestion de l'affichage des articles : les articles de la rubriques de d�part ]\r
+   <BOUCLE_test_articles_pas_de_rub(CONDITION){si #GET{afficher_articles}}>\r
+      [(#REM) On commence par compter le nombre d'articles de la rubrique (servira pour l'item "Tous les articles") ]\r
+      #SET{cpt,0}\r
+      <BOUCLE_cpt_pas_de_rub(ARTICLES){id_rubrique=#GET{id_rubrique}}{lang}> </BOUCLE_cpt_pas_de_rub>#SET{cpt,#TOTAL_BOUCLE}</B_cpt_pas_de_rub>\r
+\r
+      [(#REM) On affiche les articles :\r
+               - S'il y en a moins que le max demand� \r
+               - ET    - si on n'a pas demand� de masquage des articles uniques\r
+                     - OU si le masquage des articles uniques est demand� et qu'il y en a plus d'un ]\r
+      #SET{afficher,non}\r
+      [(#GET{cpt}|<={#GET{articles_max}}|oui|et{#GET{cpt}|>{1}|ou{#GET{masquer_articles_uniques}|=={'on'}|non}})               \r
+         #SET{afficher,oui}]\r
+      <BOUCLE_test_afficher_pas_de_rub(CONDITION){si #GET{afficher}|=={oui}|oui}>\r
+         <B_articles_pas_de_rub>\r
+         <BOUCLE_articles_pas_de_rub(ARTICLES){id_rubrique=#GET{id_rubrique}}{lang}{par num #GET{tri_num_articles}}{inverse #GET{tri_num_articles_inverse}}{par #GET{tri_alpha_articles}}{inverse #GET{tri_alpha_articles_inverse}}{0,#GET{articles_max_affiches}}>\r
+            <li class="menu-entree item[ (#ID_ARTICLE|menus_exposer{article,#ENV*{env}})]">\r
+               <a href="#URL_ARTICLE">#TITRE</a>\r
+            </li>\r
+         </BOUCLE_articles_pas_de_rub>\r
+            [(#GET{cpt}|>{#GET{articles_max_affiches}}|oui)\r
+               <li class="menu-entree item"><a class="suite" href="[(#URL_RUBRIQUE|parametre_url{connect,''})]"><:menus:tous_les_articles:></a></li>]\r
+         </B_articles_pas_de_rub>\r
+      </BOUCLE_test_afficher_pas_de_rub>\r
+   </BOUCLE_test_articles_pas_de_rub>\r
+   [(#REM) --------------------------- Fin troisieme cas ]\r
+\r
+</BOUCLE_appel>\r
diff --git a/www/plugins/menus_1/menus/rubriques_completes.xml b/www/plugins/menus_1/menus/rubriques_completes.xml
new file mode 100644 (file)
index 0000000..60c185a
--- /dev/null
@@ -0,0 +1,26 @@
+<entree>\r
+       <nom><:menus:nom_menu_rubriques_completes:></nom>\r
+       <rang>04</rang>\r
+       <description><:menus:description_menu_rubriques_completes:></description>\r
+       <icone>images/menus_rubriques.png</icone>\r
+       <parametre nom="id_rubrique" label="menus:entree_id_rubrique_ou_courante" />\r
+       <parametre nom="id_secteur_exclus" label="menus:entree_id_secteur_exclus" />\r
+       <parametre nom="niveau" label="menus:entree_niveau" />\r
+       <parametre nom="id_rubriques_exclues" label="menus:entree_id_rubriques_exclues" />\r
+       <parametre nom="rubriques_max_affichees" label="menus:entree_rubriques_max_affichees" />\r
+       <parametre nom="sousrub_cond" label="menus:entree_sousrub_cond" />\r
+       <parametre nom="classe_parent" label="menus:entree_classe_parent" />\r
+       <parametre nom="tri_num" label="menus:entree_tri_num" />\r
+       <parametre nom="tri_num_inverse" label="menus:entree_tri_num_inverse" />\r
+       <parametre nom="tri_alpha" label="menus:entree_tri_alpha" />\r
+       <parametre nom="tri_alpha_inverse" label="menus:entree_tri_alpha_inverse" />\r
+       <parametre nom="afficher_articles" label="menus:entree_afficher_articles" />\r
+       <parametre nom="masquer_articles_uniques" label="menus:entree_masquer_articles_uniques" />\r
+       <parametre nom="articles_max" label="menus:entree_articles_max" />\r
+       <parametre nom="articles_max_affiches" label="menus:entree_articles_max_affiches" />\r
+       <parametre nom="tri_num_articles" label="menus:entree_tri_num_articles" />\r
+       <parametre nom="tri_num_articles_inverse" label="menus:entree_tri_num_articles_inverse" />\r
+       <parametre nom="tri_alpha_articles" label="menus:entree_tri_alpha_articles" />\r
+       <parametre nom="tri_alpha_articles_inverse" label="menus:entree_tri_alpha_articles_inverse" />\r
+       <refuser_sous_menu/>\r
+</entree>\r
diff --git a/www/plugins/menus_1/menus/secteurlangue.html b/www/plugins/menus_1/menus/secteurlangue.html
new file mode 100644 (file)
index 0000000..aa50e85
--- /dev/null
@@ -0,0 +1,2 @@
+<BOUCLE_appel(CONDITION){si #ENV{appel_menu}|oui}><BOUCLE_secteur(RUBRIQUES){racine}{lang}{0,1}>#SET{id_rubrique,#ID_RUBRIQUE}</BOUCLE_secteur></BOUCLE_appel>
+#INCLURE{fond=menus/rubriques_completes,id_rubrique=#GET{id_rubrique},secteurlangue=oui,env}
diff --git a/www/plugins/menus_1/menus/secteurlangue.xml b/www/plugins/menus_1/menus/secteurlangue.xml
new file mode 100644 (file)
index 0000000..3ae2299
--- /dev/null
@@ -0,0 +1,21 @@
+<entree>\r
+       <nom><:menus:nom_menu_secteurlangue:></nom>\r
+       <description><:menus:description_menu_secteurlangue:></description>\r
+       <icone>images/menus_secteurlangue.png</icone>\r
+       <parametre nom="niveau" label="menus:entree_niveau" />\r
+       <parametre nom="sousrub_cond" label="menus:entree_sousrub_cond" />\r
+       <parametre nom="classe_parent" label="menus:entree_classe_parent" />\r
+       <parametre nom="tri_num" label="menus:entree_tri_num" />\r
+       <parametre nom="tri_num_inverse" label="menus:entree_tri_num_inverse" />\r
+       <parametre nom="tri_alpha" label="menus:entree_tri_alpha" />\r
+       <parametre nom="tri_alpha_inverse" label="menus:entree_tri_alpha_inverse" />\r
+       <parametre nom="afficher_articles" label="menus:entree_afficher_articles" />\r
+       <parametre nom="masquer_articles_uniques" label="menus:entree_masquer_articles_uniques" />\r
+       <parametre nom="articles_max" label="menus:entree_articles_max" />\r
+       <parametre nom="articles_max_affiches" label="menus:entree_articles_max_affiches" />\r
+       <parametre nom="tri_num_articles" label="menus:entree_tri_num_articles" />\r
+       <parametre nom="tri_num_articles_inverse" label="menus:entree_tri_num_articles_inverse" />\r
+       <parametre nom="tri_alpha_articles" label="menus:entree_tri_alpha_articles" />\r
+       <parametre nom="tri_alpha_articles_inverse" label="menus:entree_tri_alpha_articles_inverse" />\r
+       <refuser_sous_menu/>\r
+</entree>\r
diff --git a/www/plugins/menus_1/menus/texte_libre.html b/www/plugins/menus_1/menus/texte_libre.html
new file mode 100644 (file)
index 0000000..596a6a2
--- /dev/null
@@ -0,0 +1,10 @@
+#SET{contenu, #ENV*{contenu}|_T_ou_typo}
+
+[(#ENV{appel_formulaire}|oui)
+       <div class="titre">[(#GET{contenu}|expanser_liens)]</div>
+       <div class="infos"></div>
+]
+[(#ENV{appel_menu}|oui)
+       <li class="menu-entree item[ (#ENV{css})]">
+               <span class="texte_libre">[(#GET{contenu}|expanser_liens)]</span>
+]
diff --git a/www/plugins/menus_1/menus/texte_libre.xml b/www/plugins/menus_1/menus/texte_libre.xml
new file mode 100644 (file)
index 0000000..309526d
--- /dev/null
@@ -0,0 +1,8 @@
+<entree>
+       <nom><:menus:nom_menu_texte_libre:></nom>
+       <rang>2</rang>
+       <description><:menus:description_menu_texte_libre:></description>
+       <icone>images/menus_texte_libre.png</icone>
+       <parametre nom="contenu" label="menus:entree_contenu" class="multilang" obligatoire="oui" />
+       <parametre nom="css" label="menus:entree_css" />
+</entree>
diff --git a/www/plugins/menus_1/menus_administrations.php b/www/plugins/menus_1/menus_administrations.php
new file mode 100644 (file)
index 0000000..963514b
--- /dev/null
@@ -0,0 +1,43 @@
+<?php\r
+\r
+// Sécurité\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+include_spip('inc/meta');\r
+\r
+// Installation et mise à jour\r
+function menus_upgrade($nom_meta_version_base, $version_cible){\r
+       $maj = array();\r
+       \r
+       $maj['create'] = array(\r
+               array('creer_base'),\r
+               array('ecrire_config', 'menus/entrees_masquees', array('rubriques', 'groupe_mots', 'mapage', 'deconnecter', 'secteurlangue')),\r
+       );\r
+       \r
+       $maj['0.5.0'] = array(\r
+               array('sql_alter', "TABLE spip_menus ADD COLUMN css tinytext DEFAULT '' NOT NULL"),\r
+       );\r
+       \r
+       $maj['0.5.1'] = array(\r
+               array('sql_updateq', 'spip_menus_entrees', array('type_entree'=>'rubriques_completes'), 'type_entree = '.sql_quote('rubriques')),\r
+       );\r
+       \r
+       include_spip('base/upgrade');\r
+       maj_plugin($nom_meta_version_base, $version_cible, $maj);\r
+}\r
+\r
+// Désinstallation\r
+function menus_vider_tables($nom_meta_version_base){\r
+       include_spip('base/abstract_sql');\r
+       \r
+       // On efface les tables du plugin\r
+       sql_drop_table('spip_menus');\r
+       sql_drop_table('spip_menus_entrees');\r
+               \r
+       // On efface la version enregistrée\r
+       effacer_meta($nom_meta_version_base);\r
+       // On efface la config\r
+       effacer_meta('menus');\r
+}\r
+\r
+?>\r
diff --git a/www/plugins/menus_1/menus_fonctions.php b/www/plugins/menus_1/menus_fonctions.php
new file mode 100644 (file)
index 0000000..1d84cdf
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function menus_type_entree($nom){
+       include_spip('inc/menus');
+       $infos = menus_informer($nom);
+       return $infos['nom'];
+}
+
+function menus_type_refuser_sous_menu($nom){
+       include_spip('inc/menus');
+       $infos = menus_informer($nom);
+       return $infos['refuser_sous_menu'];
+}
+
+function menus_exposer($id_objet, $objet, $env, $on='on active', $off=''){
+       if (is_string($env))
+               $env = unserialize($env);
+       $primary = id_table_objet($objet);
+       include_spip('public/quete');
+       return calcul_exposer($id_objet, $primary, $env, '', $primary) ? $on : $off;
+}
+?>
diff --git a/www/plugins/menus_1/menus_ieconfig.php b/www/plugins/menus_1/menus_ieconfig.php
new file mode 100644 (file)
index 0000000..f94656f
--- /dev/null
@@ -0,0 +1,139 @@
+<?php\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+/**\r
+ * Pipeline ieconfig pour l'import/export de configuration\r
+ *\r
+ * @param array $flux\r
+ * @return array\r
+ */\r
+function menus_ieconfig($flux){\r
+       include_spip('inc/texte');\r
+       $action = $flux['args']['action'];\r
+       \r
+       // Formulaire d'export\r
+       if ($action=='form_export') {\r
+               $saisies = array(\r
+                       array(\r
+                               'saisie' => 'fieldset',\r
+                               'options' => array(\r
+                                       'nom' => 'menus_export',\r
+                                       'label' => '<:menus:editer_menus_titre:>',\r
+                                       'icone' => 'menu-16.png'\r
+                               ),\r
+                               'saisies' => array(\r
+                                       array(\r
+                                               'saisie' => 'menus_multiple',\r
+                                               'options' => array(\r
+                                                       'nom' => 'menus_a_exporter',\r
+                                                       'label' => '<:menus:formulaire_ieconfig_menus_a_exporter:>',\r
+                                                       'cacher_option_intro' => 'oui'\r
+                                               )\r
+                                       )\r
+                               )\r
+                       )\r
+               );\r
+               $flux['data'] = array_merge($flux['data'],$saisies);\r
+       }\r
+       \r
+       // Tableau d'export\r
+       if ($action=='export' && is_array(_request('menus_a_exporter')) && count(_request('menus_a_exporter'))>0) {\r
+               $flux['data']['menus'] = array();\r
+               include_spip('base/abstract_sql');\r
+               include_spip('action/exporter_menu');\r
+               foreach (_request('menus_a_exporter') as $identifiant) {\r
+                       $menu = sql_fetsel(array('id_menu','titre','css'),'spip_menus','identifiant = '.sql_quote($identifiant));\r
+                       $id_menu = $menu['id_menu'];\r
+                       unset($menu['id_menu']);\r
+                       $menu['entrees'] = exporter_menu_recursif($id_menu);\r
+                       $flux['data']['menus'][$identifiant] = $menu;\r
+               }\r
+       }\r
+       \r
+       // Formulaire d'import\r
+       if ($action=='form_import' && isset($flux['args']['config']['menus']) && is_array($flux['args']['config']['menus']) && count($flux['args']['config']['menus'])>0) {\r
+               $saisies = array(\r
+                       array(\r
+                               'saisie' => 'fieldset',\r
+                               'options' => array(\r
+                                       'nom' => 'menus_import',\r
+                                       'label' => '<:menus:editer_menus_titre:>',\r
+                                       'icone' => 'menu-16.png'\r
+                               ),\r
+                               'saisies' => array(\r
+                                       array(\r
+                                               'saisie' => 'explication',\r
+                                               'options' => array(\r
+                                                       'nom' => 'menus_import_explication',\r
+                                                       'texte' => '<:menus:formulaire_ieconfig_choisir_menus_a_importer:>'\r
+                                               )\r
+                                       )\r
+                               )\r
+                       )\r
+               );\r
+               foreach ($flux['args']['config']['menus'] as $identifiant => $menu) {\r
+                       if (sql_countsel('spip_menus','identifiant = '.sql_quote($identifiant))>0) {\r
+                               $saisies[0]['saisies'][] = array(\r
+                                       'saisie' => 'selection',\r
+                                       'options' => array(\r
+                                               'nom' => 'menus_importer_'.$identifiant,\r
+                                               'label' => $identifiant.(isset($menu['titre']) ? ' ('.typo($menu['titre']).')' : ''),\r
+                                               'cacher_option_intro' => 'oui',\r
+                                               'attention' => '<:menus:formulaire_ieconfig_menu_meme_identifiant:>',\r
+                                               'datas' => array(\r
+                                                       'non' => '<:menus:formulaire_ieconfig_ne_pas_importer:>',\r
+                                                       'renommer' => '<:menus:formulaire_ieconfig_renommer:>',\r
+                                                       'remplacer' => '<:menus:formulaire_ieconfig_remplacer:>'\r
+                                               )\r
+                                       )\r
+                               );\r
+                       } else {\r
+                               $saisies[0]['saisies'][] = array(\r
+                                       'saisie' => 'selection',\r
+                                       'options' => array(\r
+                                               'nom' => 'menus_importer_'.$identifiant,\r
+                                               'label' => $identifiant.(isset($menu['titre']) ? ' ('.typo($menu['titre']).')' : ''),\r
+                                               'cacher_option_intro' => 'oui',\r
+                                               'datas' => array(\r
+                                                       'non' => '<:menus:formulaire_ieconfig_ne_pas_importer:>',\r
+                                                       'importer' => '<:menus:formulaire_ieconfig_importer:>'\r
+                                               )\r
+                                       )\r
+                               );\r
+                       }\r
+               }\r
+               $flux['data'] = array_merge($flux['data'],$saisies);\r
+       }\r
+       \r
+       // Import de la configuration\r
+       if ($action=='import' && isset($flux['args']['config']['menus']) && is_array($flux['args']['config']['menus']) && count($flux['args']['config']['menus'])>0) {\r
+               foreach ($flux['args']['config']['menus'] as $identifiant => $menu) {\r
+                       $choix = _request('menus_importer_'.$identifiant);\r
+                       include_spip('base/abstract_sql');\r
+                       include_spip('inc/menus');\r
+                       include_spip('action/editer_menu');\r
+                       if ($choix == 'remplacer') {\r
+                               $id_menu = intval(sql_getfetsel('id_menu','spip_menus','identifiant = '.sql_quote($identifiant)));\r
+                               menus_supprimer_menu($id_menu);\r
+                       }\r
+                       if ($choix == 'renommer')\r
+                               $identifiant = $identifiant.'_'.time();\r
+                       if (in_array($choix,array('importer','remplacer','renommer'))) {\r
+                               $titre = isset($menu['titre']) ? $menu['titre'] : '';\r
+                               $css = isset($menu['css']) ? $menu['css'] : '';\r
+                               $id_menu = sql_insertq('spip_menus',array(\r
+                                       'identifiant' => $identifiant,\r
+                                       'titre' => $titre,\r
+                                       'css' => $css\r
+                               ));\r
+                               if (isset($menu['entrees']))\r
+                                       menus_importer($menu['entrees'], $id_menu);\r
+                       }\r
+               }\r
+       }\r
+       \r
+       return($flux);\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/www/plugins/menus_1/menus_pipelines.php b/www/plugins/menus_1/menus_pipelines.php
new file mode 100644 (file)
index 0000000..ada042a
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function menus_header_prive($flux){
+       $css = find_in_path('css/menuspip.css');
+       $flux .= "\n<link rel='stylesheet' href='$css' type='text/css' />\n";
+       return $flux;
+}
+
+function menus_pre_boucle($boucle){
+       if ($boucle->type_requete == 'menus') {
+               $id_table = $boucle->id_table;
+               $id_menus_entree = "$id_table.id_menus_entree";
+               if (!isset($boucle->modificateur['criteres']['id_menus_entree']) and !isset($boucle->modificateur['criteres']['id_menu']) and !isset($boucle->modificateur['criteres']['identifiant'])){
+                       $boucle->where[] = array(sql_quote('='), sql_quote($id_menus_entree), 0);
+               }
+       }
+       return $boucle;
+}
+
+function menus_menus_lister_disponibles($flux){
+       return $flux;
+}
+
+function menus_declarer_url_objets($array){
+    $array[] = 'menu';
+    return $array;
+}
+?>
diff --git a/www/plugins/menus_1/noisettes/menu-preview.html b/www/plugins/menus_1/noisettes/menu-preview.html
new file mode 100644 (file)
index 0000000..b29517a
--- /dev/null
@@ -0,0 +1 @@
+<BOUCLE_menu(MENUS){identifiant=#ENV{identifiant}}>[<a href="#URL_ECRIRE{menus_editer,id_menu=#ID_MENU}">(#TITRE)</a>]</BOUCLE_menu>
\ No newline at end of file
diff --git a/www/plugins/menus_1/noisettes/menu.html b/www/plugins/menus_1/noisettes/menu.html
new file mode 100644 (file)
index 0000000..d183a3b
--- /dev/null
@@ -0,0 +1,6 @@
+<BOUCLE_menu(MENUS){identifiant=#ENV{identifiant}}>\r
+       <div class="menu">\r
+               [(#ENV{afficher_titre_menu}|oui)[<h2 class="h2">(#TITRE|typo)</h2>]]\r
+               #INCLURE{fond=inclure/menu, env, identifiant=#IDENTIFIANT}\r
+       </div>\r
+</BOUCLE_menu>
\ No newline at end of file
diff --git a/www/plugins/menus_1/noisettes/menu.yaml b/www/plugins/menus_1/noisettes/menu.yaml
new file mode 100644 (file)
index 0000000..62dc23a
--- /dev/null
@@ -0,0 +1,16 @@
+nom: '<:menus:noisette_nom_noisette:>'\r
+description: '<:menus:noisette_description:>'\r
+icon: 'menu-24.png'\r
+parametres:\r
+  -\r
+    saisie: 'menu'\r
+    options:\r
+      nom: 'identifiant'\r
+      label: '<:menus:noisette_label_identifiant:>'\r
+      cacher_option_intro: 'oui'\r
+  -\r
+    saisie: 'oui_non'\r
+    options:\r
+      nom: 'afficher_titre_menu'\r
+      label: '<:menus:noisette_label_afficher_titre_menu:>'\r
+      defaut: 'on'
\ No newline at end of file
diff --git a/www/plugins/menus_1/paquet.xml b/www/plugins/menus_1/paquet.xml
new file mode 100644 (file)
index 0000000..e766ca3
--- /dev/null
@@ -0,0 +1,39 @@
+<paquet\r
+       prefix="menus"\r
+       categorie="navigation"\r
+       version="1.4.5"\r
+       etat="test"\r
+       compatibilite="[3.0.0;3.0.*]"\r
+       logo="prive/themes/spip/images/menu-32.png"\r
+       documentation="http://www.spip-contrib.net/Plugin-Menus"\r
+       schema="0.5.1"\r
+>\r
+       <nom>Menus</nom>\r
+\r
+       <auteur>RastaPopoulos</auteur>\r
+       <auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>\r
+       <licence>GPL v3</licence>\r
+\r
+       <traduire module="menus" reference="fr" gestionnaire="salvatore" />\r
+\r
+       <pipeline nom="declarer_tables_principales" inclure="base/menus_tables.php" />\r
+       <pipeline nom="declarer_tables_interfaces" inclure="base/menus_tables.php" />\r
+       <pipeline nom="header_prive" inclure="menus_pipelines.php" />\r
+       <pipeline nom="pre_boucle" inclure="menus_pipelines.php" />\r
+       <pipeline nom="menus_lister_disponibles" inclure="menus_pipelines.php" />\r
+       <pipeline nom="declarer_url_objets" inclure="menus_pipelines.php" />\r
+       <pipeline nom="autoriser" inclure="inc/menus_autoriser.php" />\r
+       <pipeline nom="ieconfig" inclure="menus_ieconfig.php" />\r
+\r
+       <menu nom="menus_tous" titre="menus:editer_menus_titre" parent="menu_squelette" icone="images/menu-16.png" />\r
+\r
+       <!-- pour _T_ou_typo -->\r
+       <necessite nom="saisies" compatibilite="[1.9.10;]" />\r
+       \r
+       <utilise nom="Z" />\r
+       <utilise nom="Zpip" />\r
+       <utilise nom="spipr" />\r
+       <utilise nom="spipr_blog" />\r
+       <utilise nom="spipr_dist" />\r
+       <utilise nom="spipr_doc" />\r
+</paquet>\r
diff --git a/www/plugins/menus_1/prive/squelettes/contenu/configurer_menus.html b/www/plugins/menus_1/prive/squelettes/contenu/configurer_menus.html
new file mode 100644 (file)
index 0000000..b9143b1
--- /dev/null
@@ -0,0 +1,2 @@
+<h1>Configurer les entrées du plugin Menus</h1>
+<div class="ajax">#FORMULAIRE_CONFIGURER_MENUS</div>
diff --git a/www/plugins/menus_1/prive/squelettes/contenu/menus_editer.html b/www/plugins/menus_1/prive/squelettes/contenu/menus_editer.html
new file mode 100644 (file)
index 0000000..aedf9f0
--- /dev/null
@@ -0,0 +1,25 @@
+
+<div class="cadre-formulaire-editer">
+       <div class="entete-formulaire">
+               [(#URL_ECRIRE{menus_tous}|icone_verticale{<:retour:>,menus-24,'',left})]
+               <:menus:formulaire_modifier_menu:>
+               <h1>
+                       <BOUCLE_menu(MENUS){id_menu=#VAL{id_menu}|_request}>
+                       #TITRE
+                       </BOUCLE_menu>
+                       [(#ENV{nouveau}|=={oui}|?{<:menus:formulaire_nouveau:>,#VAL{id_menu}|_request})]
+                       <//B_menu>
+               </h1>
+       </div>
+       #FORMULAIRE_EDITER_MENU{#ENV{id_menu,0}, #ENV{nouveau,''}}
+       [(#ENV{id_menu,0}|intval|oui)
+               <div class="ajax">#FORMULAIRE_EDITER_MENUS_ENTREE{#ENV{id_menu}}</div>
+       ]
+
+</div>
+
+[(#ENV{id_menu,0}|intval|oui)
+[<div class="actions">
+(#URL_ACTION_AUTEUR{supprimer_menu,#ENV{id_menu},#URL_ECRIRE{menus_tous}}|icone_verticale{<:menus:formulaire_supprimer_menu:>,menus-24.png,del})
+</div>]
+]
diff --git a/www/plugins/menus_1/prive/squelettes/contenu/menus_tous.html b/www/plugins/menus_1/prive/squelettes/contenu/menus_tous.html
new file mode 100644 (file)
index 0000000..32c51a6
--- /dev/null
@@ -0,0 +1,20 @@
+
+<h1 class="grostitre"><:menus:editer_menus_titre:></h1>
+<p><:menus:editer_menus_explication:></p>
+
+<B_menus_principaux>
+<ul class="liste_items">
+       <BOUCLE_menus_principaux(MENUS){par titre}>
+       <li class="item">#SET{auth,#AUTORISER{modifier,menu,#ID_MENU}}
+               [(#GET{auth}|oui)<a href="[(#URL_ECRIRE{menus_editer,id_menu=#ID_MENU})]">]#TITRE (#IDENTIFIANT)[(#GET{auth}|oui)</a>]
+               <p class='actions'>
+                       [(#AUTORISER{modifier,menu,#ID_MENU})   <span class='lien_modifier'>&#91;<a href='[(#URL_ECRIRE{menus_editer,id_menu=#ID_MENU})]'><:menus:editer_menus_editer:></a>&#93;</span>]
+               </p>
+       </li>
+       </BOUCLE_menus_principaux>
+</ul>
+</B_menus_principaux>
+
+[(#URL_ECRIRE{menus_editer}|parametre_url{nouveau,oui}|icone_verticale{<:menus:editer_menus_nouveau:>,menus-24.png,new,right})]
+
+<div class="nettoyeur"></div>
diff --git a/www/plugins/menus_1/prive/squelettes/navigation/menus_editer.html b/www/plugins/menus_1/prive/squelettes/navigation/menus_editer.html
new file mode 100644 (file)
index 0000000..9456afb
--- /dev/null
@@ -0,0 +1,19 @@
+[(#ENV{id_menu,0}|intval|oui)
+[(#BOITE_OUVRIR{'','info'})]
+       <div class="infos">
+               <div class="numero">
+                       <:menus:info_numero_menu:>
+                       <p>[(#ENV{id_menu})]</p>
+               </div>
+               [(#VAL{redirect}
+                       |generer_url_action{type=menu&id=#ENV{id_menu}}
+                       |parametre_url{var_mode,calcul}
+                       |icone_horizontale{<:icone_voir_en_ligne:>,racine})]
+
+               [(#PLUGIN{yaml}|oui)
+                       [(#URL_ACTION_AUTEUR{exporter_menu,#ENV{id_menu}}
+                               |icone_horizontale{<:menus:editer_menus_exporter:>,menu-export-24.png})]
+               ]
+       </div>
+#BOITE_FERMER
+]
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-16.png b/www/plugins/menus_1/prive/themes/spip/images/menu-16.png
new file mode 100644 (file)
index 0000000..dafabc8
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-16.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-24.png b/www/plugins/menus_1/prive/themes/spip/images/menu-24.png
new file mode 100644 (file)
index 0000000..841aec5
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-24.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-32.png b/www/plugins/menus_1/prive/themes/spip/images/menu-32.png
new file mode 100644 (file)
index 0000000..e719a85
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-32.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-add-16.png b/www/plugins/menus_1/prive/themes/spip/images/menu-add-16.png
new file mode 100644 (file)
index 0000000..5b75b15
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-add-16.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-add-24.png b/www/plugins/menus_1/prive/themes/spip/images/menu-add-24.png
new file mode 100644 (file)
index 0000000..2a652c5
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-add-24.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-add-32.png b/www/plugins/menus_1/prive/themes/spip/images/menu-add-32.png
new file mode 100644 (file)
index 0000000..6399f30
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-add-32.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-del-16.png b/www/plugins/menus_1/prive/themes/spip/images/menu-del-16.png
new file mode 100644 (file)
index 0000000..5acfd8c
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-del-16.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-del-24.png b/www/plugins/menus_1/prive/themes/spip/images/menu-del-24.png
new file mode 100644 (file)
index 0000000..fb5bffd
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-del-24.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-del-32.png b/www/plugins/menus_1/prive/themes/spip/images/menu-del-32.png
new file mode 100644 (file)
index 0000000..62be59a
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-del-32.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-export-24.png b/www/plugins/menus_1/prive/themes/spip/images/menu-export-24.png
new file mode 100644 (file)
index 0000000..046697e
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-export-24.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menu-exporter-24.png b/www/plugins/menus_1/prive/themes/spip/images/menu-exporter-24.png
new file mode 100644 (file)
index 0000000..22b6ae3
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menu-exporter-24.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menus-16.png b/www/plugins/menus_1/prive/themes/spip/images/menus-16.png
new file mode 100644 (file)
index 0000000..4807b53
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menus-16.png differ
diff --git a/www/plugins/menus_1/prive/themes/spip/images/menus-24.png b/www/plugins/menus_1/prive/themes/spip/images/menus-24.png
new file mode 100644 (file)
index 0000000..563d388
Binary files /dev/null and b/www/plugins/menus_1/prive/themes/spip/images/menus-24.png differ
diff --git a/www/plugins/menus_1/saisies-vues/menu.html b/www/plugins/menus_1/saisies-vues/menu.html
new file mode 100644 (file)
index 0000000..0b4cb5e
--- /dev/null
@@ -0,0 +1,5 @@
+<BOUCLE_menu(MENUS){identifiant=#ENV{valeur}}>
+<p>[(#TITRE|typo)] (#IDENTIFIANT)</p>
+</BOUCLE_menu>
+<p><:saisies:vue_sans_reponse:></p>
+<//B_menu>
\ No newline at end of file
diff --git a/www/plugins/menus_1/saisies-vues/menus_multiple.html b/www/plugins/menus_1/saisies-vues/menus_multiple.html
new file mode 100644 (file)
index 0000000..31252e6
--- /dev/null
@@ -0,0 +1,9 @@
+<B_choix>
+<ul>
+       <BOUCLE_choix(MENUS){identifiant IN #ENV**{valeur}}>
+       <li class="choix">[(#TITRE|typo)] (#IDENTIFIANT)</li>
+       </BOUCLE_choix>
+</ul>
+</B_choix>
+<p>#ENV{sans_reponse}</p>
+<//B_choix>
\ No newline at end of file
diff --git a/www/plugins/menus_1/saisies/menu.html b/www/plugins/menus_1/saisies/menu.html
new file mode 100644 (file)
index 0000000..ca0bc4e
--- /dev/null
@@ -0,0 +1,20 @@
+[(#REM) 
+  Saisie permettant de sélectionner un menu par son identifiant
+       
+  Parametres :
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  
+  Exemple d'appel :
+       [(#SAISIE{menu,nom,
+               label=<:plugin:label:>,
+       })] 
+]
+
+<select name="#ENV{nom}" id="champ_#ENV{nom}"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_selection(MENUS){par titre}>
+       <option value="#IDENTIFIANT" [(#IDENTIFIANT|=={#ENV{valeur,#ENV{defaut}}}|oui) selected="selected"]>[(#TITRE|typo)] (#IDENTIFIANT)</option>
+</BOUCLE_selection>
+</select>
diff --git a/www/plugins/menus_1/saisies/menus_multiple.html b/www/plugins/menus_1/saisies/menus_multiple.html
new file mode 100644 (file)
index 0000000..564a8c1
--- /dev/null
@@ -0,0 +1,24 @@
+[(#REM) 
+  Saisie permettant de sélectionner plusieurs menus par leur identifiant
+       
+  Parametres :
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  
+  Exemple d'appel :
+       [(#SAISIE{menus_multiple,nom,
+               label=<:plugin:label:>,
+       })] 
+]
+
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}}
+#SET{defaut, #GET{defaut}|is_string|?{(#GET{defaut}|saisies_chaine2tableau), (#GET{defaut}|sinon{#ARRAY})}}
+
+<select name="#ENV{nom}[]" id="champ_#ENV{nom}" multiple="multiple"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_selection(MENUS){par titre}>
+       <option value="#IDENTIFIANT" [(#IDENTIFIANT|in_array{#ENV{valeur,#GET{defaut}}}|oui) selected="selected"]>[(#TITRE|typo)] (#IDENTIFIANT)</option>
+</BOUCLE_selection>
+</select>
diff --git a/www/plugins/menus_1/svn.revision b/www/plugins/menus_1/svn.revision
new file mode 100644 (file)
index 0000000..9a2fabc
--- /dev/null
@@ -0,0 +1,10 @@
+<svn_revision>
+<text_version>
+Origine: file:///home/svn/repository/spip-zone/_plugins_/menus/trunk
+Revision: 73250
+Dernier commit: 2013-06-04 14:42:03 +0200 
+</text_version>
+<origine>file:///home/svn/repository/spip-zone/_plugins_/menus/trunk</origine>
+<revision>73250</revision>
+<commit>2013-06-04 14:42:03 +0200 </commit>
+</svn_revision>
\ No newline at end of file
diff --git a/www/plugins/saisies/action/deplacer_saisie.php b/www/plugins/saisies/action/deplacer_saisie.php
new file mode 100644 (file)
index 0000000..a28e532
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function action_deplacer_saisie_dist() {
+       include_spip('inc/session');
+       
+       $session         = _request('session');
+       $identifiant = _request('saisie');
+       $ou          = _request('ou');
+
+       // On récupère le formulaire à son état actuel
+       $formulaire_actuel = session_get($session);
+
+       if (!$formulaire_actuel) {
+               return "";
+       }
+
+       include_spip('inc/saisies');
+       
+       $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
+       if (!isset($saisies_actuelles[$identifiant])) {
+               return "";
+       }
+
+       // tester @id et [@id] (fieldset)
+       if ($ou and !isset($saisies_actuelles[$ou]) and !isset($saisies_actuelles[ substr($ou,1,-1) ])) {
+               return "";
+       }
+
+       // on deplace ou c'est demande...
+       $formulaire_actuel = saisies_deplacer($formulaire_actuel, $identifiant, $ou);
+
+       // On sauve tout ca
+       $formulaire_actuel = session_set($session, $formulaire_actuel);
+}
+
+?>
diff --git a/www/plugins/saisies/aide/saisies.html b/www/plugins/saisies/aide/saisies.html
new file mode 100644 (file)
index 0000000..9b07f38
--- /dev/null
@@ -0,0 +1,5 @@
+<h1>Références complètes des saisies</h1>
+
+[(#ENV{format}|=={brut}|oui)<textarea style="width:100%; height:100%;">]
+[(#VAL|saisies_generer_aide)]
+[(#ENV{format}|=={brut}|oui)</textarea>]
diff --git a/www/plugins/saisies/balise/configurer_saisie.php b/www/plugins/saisies/balise/configurer_saisie.php
new file mode 100644 (file)
index 0000000..33902c1
--- /dev/null
@@ -0,0 +1,28 @@
+<?php 
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function balise_CONFIGURER_SAISIE_dist($p){
+
+       // On recupere le premier argument : le nom de la saisie
+       $saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+       
+       // On ajoute le squelette a inclure dans les parametres
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/configurer_saisie');
+       
+       // On ajoute l'environnement
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'env');
+       
+       // On ajoute le nom recupere
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'saisie', $saisie);
+       
+       // On redirige vers la balise INCLURE
+       if(function_exists('balise_INCLURE'))
+               return balise_INCLURE($p);
+       else
+               return balise_INCLURE_dist($p); 
+
+}
+
+?>
diff --git a/www/plugins/saisies/balise/generer_saisies.php b/www/plugins/saisies/balise/generer_saisies.php
new file mode 100644 (file)
index 0000000..83e4401
--- /dev/null
@@ -0,0 +1,49 @@
+<?php 
+
+/**
+ * Gestion de la balise GENERER_SAISIES
+ *
+ * @package SPIP\Saisies\Balises
+ */
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Compile la balise GENERER_SAISIES
+ *
+ * La balise accepte 1 paramètre qui est une liste de descriptions de saisies
+ * dont on veut générer le HTML affichant les champs du formulaires
+ *
+ * Cette balise est un raccourcis :
+ * - #GENERER_SAISIES{#TABLEAU_DE_SAISIES} est équivalent à
+ * - #INCLURE{fond=generer_saisies,env,saisies=#TABLEAU_DE_SAISIES}
+ *
+ * @param Champ $p
+ *     Pile au niveau de la balise
+ * @return Champ
+ *     Pile complété du code à générer
+**/
+function balise_GENERER_SAISIES_dist($p){
+
+       // On recupere le premier (et seul) argument : le tableau decrivant ce qu'on veut generer
+       $config = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+       
+       // On ajoute le squelette a inclure dans les parametres
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/generer_saisies');
+       
+       // On ajoute l'environnement
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'env');
+       
+       // On ajoute le tableau recupere
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'saisies', $config);
+       
+       // On redirige vers la balise INCLURE
+       if(function_exists('balise_INCLURE'))
+               return balise_INCLURE($p);
+       else
+               return balise_INCLURE_dist($p); 
+
+}
+
+?>
diff --git a/www/plugins/saisies/balise/saisie.php b/www/plugins/saisies/balise/saisie.php
new file mode 100644 (file)
index 0000000..c891e55
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// pour ne pas interferer avec d'eventuelles futures fonctions du core
+// on met le tout dans un namespace ; les fonctions sont autonomes.
+
+class Pile {
+
+
+       // les arguments sont dans l'entree 0 du tableau param.
+       // param[0][0] vaut toujours '' (ou presque ?)
+       static function recuperer_argument_balise($pos, $p) {
+               if (!isset($p->param[0])) {
+                       return null;
+               }
+               if (!isset($p->param[0][$pos])) {
+                       return null;
+               }       
+               return $p->param[0][$pos];
+       }
+       
+       
+       
+       // les arguments sont dans l'entree 0 du tableau param.
+       // param[0][0] vaut toujours '' (ou presque ?)
+       static function supprimer_argument_balise($pos, $p) {
+               if (!isset($p->param[0])) {
+                       return null;
+               }
+               if (!isset($p->param[0][$pos])) {
+                       return null;
+               }       
+               if ($pos == 0) {
+                       array_shift($p->param[0]);
+               } else {
+                       $debut = array_slice($p->param[0], 0, $pos);
+                       $fin   = array_slice($p->param[0], $pos+1);
+                       $p->param[0] = array_merge($debut, $fin);
+               }               
+               return $p;
+       }       
+       
+       
+       
+       static function recuperer_et_supprimer_argument_balise($pos, &$p) {
+               $arg = Pile::recuperer_argument_balise($pos, $p);
+               $p   = Pile::supprimer_argument_balise($pos, $p);
+               return $arg;
+       }
+       
+       
+       
+       
+       // les arguments sont dans l'entree 0 du tableau param.
+       // param[0][0] vaut toujours '' (ou presque ?)
+       static function ajouter_argument_balise($element, $p) {
+               if (isset($p->param[0][0])) {
+                       $zero = array_shift($p->param[0]);
+                       array_unshift($p->param[0], $element);
+                       array_unshift($p->param[0], $zero);
+               } else {
+                       if (!is_array($p->param[0])) {
+                               $p->param[0] = array();
+                       }
+                       array_unshift($p->param[0], $element);
+               }
+               return $p;
+       }
+       
+       
+       
+       // creer_argument_balise(nom) = {nom}
+       // creer_argument_balise(nom, 'coucou') = {nom=coucou}
+       // creer_argument_balise(nom, $balise) = {nom=#BALISE}
+       static function creer_argument_balise($nom, $valeur = null) {
+               include_spip('public/interfaces');
+               $s = new Texte;
+               $s->texte = $nom;
+               $s->ligne=0;
+               
+               // si #BALISE cree avec Pile::creer_balise(), le mettre en array, comme les autres
+               if (is_object($valeur)) {
+                       $valeur = array($valeur);
+               }
+               
+               $res = null;
+               
+               // {nom}
+               if (is_null($valeur)) {
+                       $res = array($s);
+               } 
+               // {nom=coucou}
+               elseif (is_string($valeur)) {                   
+                       $s->texte .= "=$valeur";
+                       $res = array($s);
+               }
+               // {nom=#BALISE}
+               elseif (is_array($valeur)) {
+                       $s->texte .= "="; // /!\ sans cette toute petite chose, ça ne fait pas d'egalite :)
+                       $res = array_merge(array($s), $valeur);
+               }
+
+               return $res;
+       }
+       
+       
+       
+       static function creer_et_ajouter_argument_balise($p, $nom, $valeur = null) {
+               $new = Pile::creer_argument_balise($nom, $valeur); 
+               return Pile::ajouter_argument_balise($new, $p);
+       }
+
+
+
+       // creer une balise
+       static function creer_balise($nom, $opt) {
+               include_spip('public/interfaces');
+               $b = new Champ;
+               $b->nom_champ = strtoupper($nom);
+               $vars = get_class_vars('Champ'); // property_exists($b, $o); est en php 5
+               foreach ($opt as $o=>$val) {
+                       #if (property_exists($b,$o)) {
+                       if (array_key_exists($o, $vars)) {
+                               if ($o == 'param') {
+                                       array_unshift($val, '');
+                                       $b->$o = array($val);
+                               } else {
+                                       $b->$o = $val;
+                               }
+                       }
+               }
+               return $b;
+       }
+}
+
+
+
+/* 
+ * #saisie{type,nom} : champs obligatoires
+ * 
+ * collecte des arguments en fonctions du parametre "nom"
+ * ajoute des arguments
+ * appelle #INCLURE avec les arguments collectes en plus
+ * 
+ * il faudrait en faire une balise dynamique (?)
+ * pour avoir un code plus propre
+ * mais je n'ai pas reussi a trouver comment recuperer "valeur=#ENV{$nom}"
+ * 
+ */
+function balise_SAISIE_dist ($p) {
+
+       // on recupere les parametres sans les traduire en code d'execution php
+       $type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $type
+       $titre       = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $titre
+
+       // creer #ENV*{$titre} (* pour les cas de tableau serialises par exemple, que l'on veut reutiliser)
+       $env_titre   = Pile::creer_balise('ENV', array('param' => array($titre), 'etoile' => '*')); // #ENV*{titre}
+
+       // on modifie $p pour ajouter des arguments
+       // {nom=$titre, valeur=#ENV{$titre}, erreurs, type_saisie=$type, fond=saisies/_base}
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'nom', $titre);
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'valeur', $env_titre);
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'type_saisie', $type_saisie);
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'erreurs');
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'saisies/_base');
+
+       // on appelle la balise #INCLURE
+       // avec les arguments ajoutes
+       if(function_exists('balise_INCLURE'))
+               return balise_INCLURE($p);
+       else
+               return balise_INCLURE_dist($p); 
+               
+}
+
+
+
+
+?>
diff --git a/www/plugins/saisies/balise/voir_saisie.php b/www/plugins/saisies/balise/voir_saisie.php
new file mode 100644 (file)
index 0000000..3498901
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/* 
+ * #VOIR_SAISIE{type,nom} : champs obligatoires
+ * 
+ * collecte des arguments en fonctions du parametre "nom"
+ * ajoute des arguments
+ * appelle #INCLURE avec les arguments collectes en plus
+ * 
+ */
+function balise_VOIR_SAISIE_dist ($p) {
+
+       // on recupere les parametres sans les traduire en code d'execution php
+       $type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+       $nom       = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+
+       // creer #ENV*{$titre} (* pour les cas de tableau serialises par exemple, que l'on veut reutiliser)
+       $env_nom   = Pile::creer_balise('ENV', array('param' => array($nom), 'etoile' => '*')); // #ENV*{nom}
+
+       // on modifie $p pour ajouter des arguments
+       // {nom=$nom, valeur=#ENV{$nom}, type_saisie=$type, fond=saisies/_base}
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'nom', $nom);
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'valeur', $env_nom);
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'type_saisie', $type_saisie);
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'saisies-vues/_base');
+
+       // on appelle la balise #INCLURE
+       // avec les arguments ajoutes
+       if(function_exists('balise_INCLURE'))
+               return balise_INCLURE($p);
+       else
+               return balise_INCLURE_dist($p); 
+               
+}
+
+?>
diff --git a/www/plugins/saisies/balise/voir_saisies.php b/www/plugins/saisies/balise/voir_saisies.php
new file mode 100644 (file)
index 0000000..609742d
--- /dev/null
@@ -0,0 +1,30 @@
+<?php 
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function balise_VOIR_SAISIES_dist($p){
+
+       // On recupere les arguments : les tableaux decrivant ce qu'on veut generer + les reponses
+       $saisies = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+       $valeurs = Pile::recuperer_et_supprimer_argument_balise(1, $p);
+       
+       // On ajoute le squelette a inclure dans les parametres
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'inclure/voir_saisies');
+       
+       // On ajoute l'environnement
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'env');
+       
+       // On ajoute les tableaux recuperes
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'saisies', $saisies);
+       $p = Pile::creer_et_ajouter_argument_balise($p, 'valeurs', $valeurs);
+       
+       // On redirige vers la balise INCLURE
+       if(function_exists('balise_INCLURE'))
+               return balise_INCLURE($p);
+       else
+               return balise_INCLURE_dist($p); 
+
+}
+
+?>
diff --git a/www/plugins/saisies/contenu/page-saisies_cvt.html b/www/plugins/saisies/contenu/page-saisies_cvt.html
new file mode 100644 (file)
index 0000000..0d7a487
--- /dev/null
@@ -0,0 +1,4 @@
+<h1>CVT automatique avec Saisies</h1>
+<p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
+
+#FORMULAIRE_SAISIES_CVT
diff --git a/www/plugins/saisies/css/formulaires_constructeur.css b/www/plugins/saisies/css/formulaires_constructeur.css
new file mode 100644 (file)
index 0000000..94415fa
--- /dev/null
@@ -0,0 +1,181 @@
+
+.formulaire_spip .formulaire_spip{
+       border:none;
+       background:transparent;
+}
+#deplacable .ui-state-highlight { height: 5em; line-height: 1.2em; }
+#deplacable .ui-sortable {min-height:3em;}
+/*
+.formulaire_construire_formulaire{
+       padding:1em;
+}
+.formulaire_construire_formulaire ul li label{
+       display:block;
+       margin:0;
+       width:auto;
+       float:none;
+       clear:both;
+       line-height:1.7em;
+}
+.formulaire_construire_formulaire input.text, .formulaire_construire_formulaire input.password, .formulaire_construire_formulaire textarea, .formulaire_construire_formulaire select{
+       width:auto;
+}
+*/
+.formulaire_construire_formulaire li.actions_formulaire{
+       margin:0;
+       padding:1em;
+       text-align:center;
+       border:0;
+}
+.formulaire_construire_formulaire li.actions_formulaire img{
+       vertical-align:middle;
+}
+/*
+.formulaire_construire_formulaire li.configurable{
+       position:relative;
+       padding:1em;
+       margin:0.5em 0;
+       background:transparent;
+       border:1px dashed transparent;
+       border-radius:5px;
+       -moz-border-radius:5px;
+       -webkit-border-radius:5px;
+}
+.formulaire_construire_formulaire li.configurable.hover{
+       border-color:#999;
+}
+*/
+.formulaire_construire_formulaire li.en_configuration{
+       border:5px solid #999;
+       border-radius:5px;
+       margin:.5em;
+}
+.formulaire_construire_formulaire li.fieldset.configurable>fieldset>ul {margin-left:30px;}
+/*
+.formulaire_construire_formulaire li.fieldset.configurable{
+       padding:0;
+}
+.formulaire_construire_formulaire li.fieldset h3.legend{
+       margin:0;
+}
+.formulaire_construire_formulaire li.fieldset.configurable > fieldset{
+       border:1px solid #ddd;
+       padding:0;
+}
+.formulaire_construire_formulaire li.fieldset.configurable > fieldset > ul{
+       padding:0 1em;
+}
+*/
+.formulaire_construire_formulaire .formulaire_configurer{
+       border-top:3px dashed #999;
+       margin: 1em -8px 0 -138px;
+    padding: 1em .5em .5em .5em;
+    background:white;
+}
+.formulaire_construire_formulaire .fieldset > .formulaire_configurer{
+       margin: 1em -8px 0;
+}
+
+/*
+.formulaire_construire_formulaire li.fieldset.configurable > .formulaire_configurer{
+       margin:1em 0 0 0;
+}
+.formulaire_construire_formulaire .formulaire_configurer fieldset{
+       border:0;
+       padding:0;
+}
+.formulaire_construire_formulaire .formulaire_configurer-contenus li.editer{
+       border:0;
+       margin:0.5em 0;
+       padding:0.5em 1em;
+}
+.formulaire_construire_formulaire .formulaire_configurer li.formulaire_configurer-contenu{
+       background:white;
+       border-top:1px solid #ddd;
+       border-radius:0 0 5px 5px;
+       -moz-border-radius:0 0 5px 5px;
+       -webkit-border-radius:0 0 5px 5px;
+}
+*/
+.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets {
+       overflow:auto;
+}
+.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li{
+       float:left;
+       width:auto;
+       clear:none;
+       padding:0;
+       background:#eee;
+       border:1px solid #ddd;
+       margin-right:1px;
+       -moz-border-radius:5px 5px 0 0;
+       -webkit-border-radius:5px 5px 0 0;
+       -o-border-radius:5px 5px 0 0;
+       border-radius:5px 5px 0 0;
+}
+.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li.actif{
+       background:white;
+       border-bottom:1px solid white;
+}
+.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li.erreur a{
+       color:#CC3300;
+}
+.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li a{
+       display:block;
+       padding:.5em;
+}
+.formulaire_construire_formulaire .formulaire_configurer .boutons { margin-bottom: -20px; }
+
+.formulaire_configurer-contenus > .fieldset > fieldset:first-child {border-top:0;}
+
+.formulaire_construire_formulaire li.editer,
+.formulaire_construire_formulaire li.explication,
+.formulaire_construire_formulaire li.fieldset {padding-top:30px; position:relative;}
+.formulaire_construire_formulaire li.explication { padding-left:140px; background:transparent; }
+.formulaire_construire_formulaire li.explication > p { margin-left:-130px; }
+.formulaire_construire_formulaire .formulaire_configurer li.fieldset {padding-top:0px;}
+.formulaire_construire_formulaire .formulaire_configurer fieldset fieldset>ul>li.editer:first-child {padding-top:0px;}
+
+.formulaire_construire_formulaire li.hover {background-color:transparent;}
+
+.formulaire_construire_formulaire .actions{
+       position:absolute;
+       right:5px;
+       top:5px;
+}
+
+.formulaire_construire_formulaire .actions button{
+       cursor:pointer;
+       background:none;
+       border:none;
+       opacity:0.7;
+}
+.formulaire_construire_formulaire .actions button:hover{
+       opacity:1;
+}
+.formulaire_construire_formulaire .actions .move {
+       cursor:move;
+}
+
+
+
+.formulaire_construire_formulaire li.saisies_disponibles {
+       /*padding:1em;*/
+}
+
+.formulaire_construire_formulaire .ajouter_saisie{
+       width:45%;
+       margin:5px;
+       padding:0.5em 8px 0.5em 36px;
+       font-size:1em;
+       text-align:left;
+       color:black;
+       cursor:pointer;
+       background:white url() 8px center no-repeat;
+       border:1px solid #ccc;
+}
+
+.formulaire_construire_formulaire .ajouter_saisie img{
+       vertical-align:middle;
+}
+
diff --git a/www/plugins/saisies/extra-vues/pays.html b/www/plugins/saisies/extra-vues/pays.html
new file mode 100644 (file)
index 0000000..f45fbd1
--- /dev/null
@@ -0,0 +1,8 @@
+<B_pays>
+<div class="#ENV{champ_extra}">
+       <strong>#ENV{label_extra}</strong>
+       <BOUCLE_pays(GEO_PAYS){id_pays=#ENV*{valeur_extra}}>
+               #NOM
+       </BOUCLE_pays>
+</div>
+</B_pays>
\ No newline at end of file
diff --git a/www/plugins/saisies/formulaires/construire_formulaire.html b/www/plugins/saisies/formulaires/construire_formulaire.html
new file mode 100644 (file)
index 0000000..9fda49d
--- /dev/null
@@ -0,0 +1,217 @@
+[(#ENV{erreurs}|table_valeur{positionner}|oui)
+       <a name="ajax_ancre" href="[(#ENV{erreurs}|table_valeur{positionner})]"></a>
+]
+<div class="formulaire_spip formulaire_editer formulaire_#ENV{form}">
+       [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+       <p id="message_attention" class="reponse_formulaire reponse_formulaire_ok[ (#ENV{formulaire_modifie}|non) invisible]">#ENV*{_message_attention}</p>
+       [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+       
+       <BOUCLE_editable(CONDITION){si #ENV{editable}|oui}>
+       <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 style="display:none;" type="submit" class="submit" name="enregistrer" value="<:bouton_enregistrer:>" />
+
+               <ul id="deplacable">
+                       
+                       <li id="reinitialiser" class="actions_formulaire[ (#ENV{formulaire_modifie}|non) invisible]">
+                               <button type="submit" class="submit" name="reinitialiser" value="oui" onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')">
+                                       <img src="#CHEMIN{images/formulaire-reinitialiser-24.png}" alt="" />
+                                       <:saisies:construire_reinitialiser:>
+                               </button>
+                       </li>
+
+                       <BOUCLE_contenu(POUR){tableau #ENV{_contenu}}>
+                       [(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
+                               [(#VALEUR**|formidable_generer_saisie_configurable{#ENV**|unserialize})]
+                       ]
+                       </BOUCLE_contenu>
+                       <li class="aucun"><em class="attention"><:saisies:construire_aucun_champs:></em></li>
+                       <//B_contenu>
+                       
+                       <B_saisies_disponibles>
+                       <li class="editer haut saisies_disponibles" id="attrapable">
+                               <label><:saisies:construire_ajouter_champ:></label>
+                               <BOUCLE_saisies_disponibles(POUR){tableau #ENV{_saisies_disponibles}}>
+                               <button type="submit" name="ajouter_saisie" value="#CLE" class="submit ajouter_saisie"[ title="(#VALEUR|table_valeur{description})"] [style="background-image:url((#VALEUR|table_valeur{icone}|sinon{#CHEMIN{images/formulaire-saisie-defaut.png}}))"]>
+                                       <span>[(#VALEUR|table_valeur{titre})]</span>
+                               </button>
+                               </BOUCLE_saisies_disponibles>
+                       </li>
+                       </B_saisies_disponibles>
+               </ul>
+
+               
+               [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
+               <!--extra-->
+               
+               <span class='image_loading'></span>
+       </div></form>
+
+       <script type="text/javascript">
+               jQuery(function(){
+                       jQuery('.formulaire_construire_formulaire li.configurable')
+                               .hover(
+                                       function(){
+                                               jQuery(this)
+                                                       .addClass('hover')
+                                                       .find('> .actions')
+                                                               .show()
+                                                       .end()
+                                                       .parents('li.configurable:not(.en_configuration)')
+                                                               .mouseout();
+                                       },
+                                       function(){
+                                               if (!jQuery(this).is('.en_configuration'))
+                                                       jQuery(this)
+                                                               .removeClass('hover')
+                                                               .find('> .actions')
+                                                                       .hide()
+                                                               .end()
+                                                               .parents('li.configurable').eq('0')
+                                                                       .mouseover();
+                                       }
+                               )
+                               .filter(':not(.en_configuration)')
+                                       .find('> .actions')
+                                               .hide()
+                                       .end()
+                               .end();
+                       
+                       // On lance la création des onglets
+                       formulaire_configurer_onglets();
+                       
+                       // Gérer la liste des vérifications
+                       jQuery('.liste_verifications')
+                               .each(function(){
+                                       var options = jQuery(this).siblings('.options_verifier').hide();
+                                       var select = jQuery(this).find('select');
+                                       
+                                       select
+                                               .change(function(){
+                                                       var montrer = jQuery(this).val() ? jQuery(this).val() : 'soigfeg';
+                                                       options.hide().filter('.'+montrer).show();
+                                               })
+                                               .change();
+                               });
+                       
+                       // On déplie toujours les fieldsets plés par défaut
+                       jQuery('li.fieldset.plie')
+                               .each(function(){
+                                       jQuery(this)
+                                               .removeClass('plie')
+                                               .find('> fieldset > ul').show();
+                               });
+                               
+                       [(#ENV{erreurs}|non|et{#ENV{_chemin_ui}})
+                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.core.js}", function(){
+                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.widget.js}", function(){
+                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.mouse.js}", function(){
+                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.sortable.js}", function(){
+                                       if ($.fn.sortable) {
+                                               jQuery( "#deplacable, #deplacable ul" ).sortable({
+                                                       revert: true,
+                                                       containment: '#deplacable',
+                                                       connectWith: "#deplacable, #deplacable ul",
+                                                       placeholder: "ui-state-highlight",
+                                                       handle: '>.actions .deplacer_saisie',
+                                                       start: function(event, ui) {
+                                                               jQuery('.ui-state-highlight')
+                                                                       .css('height', ui.item.css('height'))
+                                                                       .css('height', '+=20px');
+                                                       },
+                                                       update: function(event, ui) {
+                                                               id = ui.item.data('id');
+                                                               ou = ui.item.next().data('id');
+                                                               // avant le suivant
+                                                               if (!ou) {
+                                                                       // sinon dans le parent
+                                                                       ou = ui.item.closest('.fieldset').data('id');
+                                                                       if (ou) {
+                                                                               ou = '[(#VAL{91}|chr)]' + ou + '[(#VAL{93}|chr)]';
+                                                                       }
+                                                               }
+                                                               url = "#URL_ECRIRE";
+                                                               $.get(url, {
+                                                                       session: '#ENV{_identifiant_session}',
+                                                                       action: 'deplacer_saisie',
+                                                                       saisie: id,
+                                                                       ou: ou
+                                                               }, function() {
+                                                                       //jQuery('input.vide').submit();
+                                                                       jQuery('#reinitialiser').removeClass('invisible');
+                                                                       jQuery('#message_attention').removeClass('invisible');
+                                                               });
+                                                       }
+                                               });
+                                       }
+                               });});});});
+                               
+                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.core.js}", function(){
+                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.widget.js}", function(){
+                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.mouse.js}", function(){
+                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.draggable.js}", function(){
+                                       if ($.fn.draggable) {
+                                               jQuery( "#attrapable" ).draggable({
+                                                       connectToSortable: "#deplacable, #deplacable ul",
+                                                       helper: "clone"
+                                               });
+                                       }
+                               });});});});
+                       ]
+               });
+               
+               function formulaire_configurer_onglets(){
+                       var formulaire_configurer = jQuery('.formulaire_configurer');
+                       var onglets = jQuery('<ul class="formulaire_configurer-onglets"></ul>');
+                       var contenus = formulaire_configurer.find('> ul > li.fieldset');
+                       
+                       // On ajoute le conteneur des onglets
+                       formulaire_configurer
+                               .prepend(onglets);
+                       
+                       // On parcourt les contenus pour générer les onglets
+                       contenus
+                               .each(function(i){
+                                       // On ajoute un identifiant et une classe
+                                       jQuery(this)
+                                               .attr('id', 'formulaire_configurer-contenu-'+i)
+                                               .addClass('formulaire_configurer-contenu');
+                                       // On récupère le titre (en le cachant au passage)
+                                       var titre = jQuery(this).find('h3').eq(0).hide().text();
+                                       // On crée un onglet
+                                       var onglet = jQuery('<li><a href="#formulaire_configurer-contenu-'+i+'">'+titre+'</a></li>');
+                                       onglet
+                                               .click(function(){
+                                                       contenus.hide();
+                                                       jQuery(
+                                                               jQuery(this)
+                                                                       .siblings()
+                                                                               .removeClass('actif')
+                                                                       .end()
+                                                                       .addClass('actif')
+                                                                       .find('a')
+                                                                               .attr('href')
+                                                       ).show();
+                                                       return false;
+                                               });
+                                       
+                                       // On active le premier onglet au démarrage
+                                       if (i == 0) onglet.addClass('actif');
+                                       
+                                       // S'il y a des erreurs dans cette partie du contenu, on met une classe "erreurs" à l'onglet aussi
+                                       if (jQuery(this).find('li.erreur').length > 0)
+                                               onglet.addClass('erreur');
+                                       
+                                       // On ajoute l'onglet
+                                       onglets
+                                               .append(onglet);
+                               })
+                               .hide()
+                               .eq(0)
+                                       .show();
+               }
+       </script>
+       </BOUCLE_editable>
+</div>
diff --git a/www/plugins/saisies/formulaires/construire_formulaire.php b/www/plugins/saisies/formulaires/construire_formulaire.php
new file mode 100644 (file)
index 0000000..6255abb
--- /dev/null
@@ -0,0 +1,533 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function formulaires_construire_formulaire_charger($identifiant, $formulaire_initial=array(), $options=array()){
+       include_spip('inc/saisies');
+       $contexte = array();
+       
+       // On ajoute un préfixe devant l'identifiant, pour être sûr
+       $identifiant = 'constructeur_formulaire_'.$identifiant;
+       $contexte['_identifiant_session'] = $identifiant;
+       
+       // On vérifie ce qui a été passé en paramètre 
+       if (!is_array($formulaire_initial)) $formulaire_initial = array();
+       
+       // On initialise la session si elle est vide
+       if (is_null($formulaire_actuel = session_get($identifiant))){
+               session_set($identifiant, $formulaire_initial);
+               $formulaire_actuel = $formulaire_initial;
+       }
+       
+       // Si le formulaire actuel est différent du formulaire initial on agite un drapeau pour le dire
+       if ($formulaire_actuel != $formulaire_initial){
+               $contexte['formulaire_modifie'] = true;
+       }
+       $contexte['_message_attention'] = _T('saisies:construire_attention_modifie');
+       
+       // On passe ça pour l'affichage
+       $contexte['_contenu'] = $formulaire_actuel;
+
+       // On passe ça pour la récup plus facile des champs
+       $contexte['_saisies_par_nom'] = saisies_lister_par_nom($formulaire_actuel);
+       // Pour déclarer les champs modifiables à CVT
+       foreach(array_keys($contexte['_saisies_par_nom']) as $nom){
+               $contexte["saisie_modifiee_$nom"] = array();
+       }
+       
+       // La liste des saisies
+       $saisies_disponibles = saisies_lister_disponibles();
+       $contexte['_saisies_disponibles'] = $saisies_disponibles;
+       
+       $contexte['fond_generer'] = 'formulaires/inc-generer_saisies_configurables';
+       
+       // On cherche jquery UI pour savoir si on pourra glisser-déplacer
+       // SPIP 3 - jquery_ui
+       if (find_in_path('javascript/ui/jquery.ui.sortable.js') and find_in_path('javascript/ui/jquery.ui.draggable.js')){
+               $contexte['_chemin_ui'] = 'javascript/ui/';
+       }
+       // plugin jquery_ui >= 1.8
+       elseif (find_in_path('javascript/jquery-ui/ui/jquery.ui.sortable.js') and find_in_path('javascript/jquery-ui/ui/jquery.ui.draggable.js')){
+               $contexte['_chemin_ui'] = 'javascript/jquery-ui/ui/';
+       }
+       // plugin jquery_ui < 1.8
+       elseif (find_in_path('javascript/jquery-ui-1.8.16/ui/jquery.ui.sortable.js') and find_in_path('javascript/jquery-ui-1.8.16/ui/jquery.ui.draggable.js')){
+               $contexte['_chemin_ui'] = 'javascript/jquery-ui-1.8.16/ui/';
+       }
+       else{
+               $contexte['_chemin_ui'] = false;
+       }
+       
+       return $contexte;
+}
+
+function formulaires_construire_formulaire_verifier($identifiant, $formulaire_initial=array(), $options=array()){
+       include_spip('inc/saisies');
+       $erreurs = array();
+       // l'une ou l'autre sera presente
+       $configurer_saisie = $enregistrer_saisie = '';
+
+       // Pas d'erreur si l'on ne demande rien
+       if (!($nom_ou_id = $configurer_saisie  = _request('configurer_saisie')
+       OR    $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie'))) {
+               return $erreurs;
+       }
+
+       // On ajoute un préfixe devant l'identifiant
+       $identifiant = 'constructeur_formulaire_'.$identifiant;
+       // On récupère le formulaire à son état actuel
+       $formulaire_actuel = session_get($identifiant);
+
+       // On récupère les saisies actuelles, par identifiant ou par nom
+       if ($nom_ou_id[0] == '@') {
+               $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
+               $nom = $saisies_actuelles[$nom_ou_id]['options']['nom'];
+       } else {
+               $saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
+               $nom = $nom_ou_id;
+       }
+       $noms_autorises = array_keys($saisies_actuelles);
+
+       // le nom (ou identifiant) doit exister
+       if (!in_array($nom_ou_id, $noms_autorises)) {
+               return $erreurs;
+       }
+       
+       // La liste des saisies
+       $saisies_disponibles = saisies_lister_disponibles();
+       
+       $saisie = $saisies_actuelles[$nom_ou_id];
+       $formulaire_config = $saisies_disponibles[$saisie['saisie']]['options'];
+       array_walk_recursive($formulaire_config, 'formidable_transformer_nom', "saisie_modifiee_${nom}[options][@valeur@]");
+       $formulaire_config = saisie_identifier(array('saisies'=>$formulaire_config));
+       $formulaire_config = $formulaire_config['saisies'];
+       
+       // Si la saisie possede un identifiant, on l'ajoute
+       // au formulaire de configuration pour ne pas le perdre en route
+       if (isset($saisie['identifiant']) and $saisie['identifiant']) {
+               $formulaire_config = saisies_inserer(
+                       $formulaire_config,
+                       array(
+                               'saisie' => 'hidden',
+                               'options' => array(
+                                       'nom' => "saisie_modifiee_${nom}[identifiant]",
+                                       'defaut' => $saisie['identifiant']
+                               ),
+                       )
+               );
+       }
+       
+       // S'il y a l'option adéquat, on ajoute le champ pour modifier le nom
+       if (isset($options['modifier_nom']) and $options['modifier_nom']
+         and $chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true))
+       {
+               $chemin_nom[] = 'saisies';
+               $chemin_nom[] = '0';
+
+               $formulaire_config = saisies_inserer(
+                       $formulaire_config,
+                       array(
+                               'saisie' => 'input',
+                               'options' => array(
+                                       'nom' => "saisie_modifiee_${nom}[options][nom]",
+                                       'label' => _T('saisies:option_nom_label'),
+                                       'explication' => _T('saisies:option_nom_explication'),
+                                       'obligatoire' => 'oui',
+                                       'size' => 50
+                               ),
+                               'verifier' => array(
+                                       'type' => 'regex',
+                                       'options' => array(
+                                               'modele' => '/^[\w]+$/'
+                                       )
+                               )
+                       ),
+                       $chemin_nom
+               );
+       }
+
+       // liste des options de vérification
+       $verif_options = array();
+
+       // S'il y a un groupe "validation" alors on va construire le formulaire des vérifications
+       if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][validation]", true)){
+               include_spip('inc/verifier');
+               $liste_verifications = verifier_lister_disponibles();
+               $chemin_validation[] = 'saisies';
+               $chemin_validation[] = 1000000; // à la fin
+               
+               // On construit la saisie à insérer et les fieldset des options
+               $saisie_liste_verif = array(
+                       'saisie' => 'selection',
+                       'options' => array(
+                               'nom' => "saisie_modifiee_${nom}[verifier][type]",
+                               'label' => _T('saisies:construire_verifications_label'),
+                               'option_intro' => _T('saisies:construire_verifications_aucune'),
+                               'li_class' => 'liste_verifications',
+                               'datas' => array()
+                       )
+               );
+
+               foreach ($liste_verifications as $type_verif => $verif){
+                       $saisie_liste_verif['options']['datas'][$type_verif] = $verif['titre'];
+                       // Si le type de vérif a des options, on ajoute un fieldset
+                       if (isset($verif['options']) and $verif['options'] and is_array($verif['options'])){
+                               $groupe = array(
+                                       'saisie' => 'fieldset',
+                                       'options' => array(
+                                               'nom' => 'options',
+                                               'label' => $verif['titre'],
+                                               'li_class' => "$type_verif options_verifier"
+                                       ),
+                                       'saisies' => $verif['options']
+                               );
+                               array_walk_recursive($groupe, 'formidable_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]");
+                               $verif_options[$type_verif] = $groupe;
+                       }
+               }
+               $verif_options = array_merge(array($saisie_liste_verif), $verif_options);
+       }
+       
+       
+       if ($enregistrer_saisie){
+               // La saisie modifié
+               $saisie_modifiee = _request("saisie_modifiee_${nom}");
+               // On cherche les erreurs de la configuration
+               $vraies_erreurs = saisies_verifier($formulaire_config);
+               // Si on autorise à modifier le nom ET qu'il doit être unique : on vérifie
+               if (isset($options['modifier_nom']) and $options['modifier_nom']
+                 and isset($options['nom_unique']) and $options['nom_unique'])
+               {
+                       $nom_modifie = $saisie_modifiee['options']['nom'];
+                       if ($nom_modifie != $enregistrer_saisie and saisies_chercher($formulaire_actuel, $nom_modifie))
+                               $vraies_erreurs["saisie_modifiee_${nom}[options][nom]"] = _T('saisies:erreur_option_nom_unique');
+               }
+               // On regarde s'il a été demandé un type de vérif
+               if (isset($saisie_modifiee['verifier']['type'])
+                 and (($type_verif = $saisie_modifiee['verifier']['type']) != '')
+                 and $verif_options[$type_verif])
+               {
+                       // On ne vérifie que les options du type demandé
+                       $vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options[$type_verif]['saisies']));
+               }
+       }
+       
+       // On insère chaque saisie des options de verification
+       if ($verif_options){
+               foreach ($verif_options as $saisie_verif){
+                       $formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation);
+               }
+       }
+       $erreurs['configurer_'.$nom] = $formulaire_config;
+       $erreurs['positionner'] = '#configurer_'.$nom;
+       
+       if ($enregistrer_saisie) {
+               if ($vraies_erreurs)
+                       $erreurs = array_merge($erreurs, $vraies_erreurs);
+               else
+                       $erreurs = array();
+       }
+       
+       return $erreurs;
+}
+
+function formulaires_construire_formulaire_traiter($identifiant, $formulaire_initial=array(), $options=array()){
+       include_spip('inc/saisies');
+       $retours = array();
+       $saisies_disponibles = saisies_lister_disponibles();
+       
+       // On ajoute un préfixe devant l'identifiant
+       $identifiant = 'constructeur_formulaire_'.$identifiant;
+       // On récupère le formulaire à son état actuel
+       $formulaire_actuel = session_get($identifiant);
+       
+       // Si on demande à ajouter une saisie
+       if ($ajouter_saisie = _request('ajouter_saisie')){
+               $nom = saisies_generer_nom($formulaire_actuel, $ajouter_saisie);
+               $saisie = array(
+                       'saisie' => $ajouter_saisie,
+                       'options' => array(
+                               'nom' => $nom
+                       )
+               );
+               // S'il y a des valeurs par défaut pour ce type de saisie, on les ajoute
+               if (($defaut = $saisies_disponibles[$ajouter_saisie]['defaut']) and is_array($defaut)){
+                       $defaut = _T_ou_typo($defaut, 'multi');
+
+                       //Compatibilite PHP<5.3.0 
+                       //source : http://www.php.net/manual/en/function.array-replace-recursive.php#92574
+                       if (!function_exists('array_replace_recursive'))
+                       {
+                               function array_replace_recursive($array, $array1)
+                               {
+                                       function recurse($array, $array1)
+                                       {
+                                               foreach ($array1 as $key => $value)
+                                               {
+                                                       // create new key in $array, if it is empty or not an array
+                                                       if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key])))
+                                                       {
+                                                               $array[$key] = array();
+                                                       }
+                                                       // overwrite the value in the base array
+                                                       if (is_array($value))
+                                                       {
+                                                               $value = recurse($array[$key], $value);
+                                                       }
+                                                       $array[$key] = $value;
+                                               }
+                                               return $array;
+                                       }
+                                       // handle the arguments, merge one by one
+                                       $args = func_get_args();
+                                       $array = $args[0];
+                                       if (!is_array($array))
+                                       {
+                                               return $array;
+                                       }
+                                       for ($i = 1; $i < count($args); $i++)
+                                       {
+                                               if (is_array($args[$i]))
+                                               {
+                                                       $array = recurse($array, $args[$i]);
+                                               }
+                                       }
+                               return $array;
+                               }
+                       }
+                       $saisie = array_replace_recursive($saisie, $defaut);
+               }
+               $formulaire_actuel = saisies_inserer($formulaire_actuel, $saisie);
+       }
+
+       // Si on demande à dupliquer une saisie
+       if ($dupliquer_saisie = _request('dupliquer_saisie')) {
+               $formulaire_actuel = saisies_dupliquer($formulaire_actuel, $dupliquer_saisie);  
+       }
+       
+       // Si on demande à supprimer une saisie
+       if ($supprimer_saisie = _request('supprimer_saisie')){
+               $formulaire_actuel = saisies_supprimer($formulaire_actuel, $supprimer_saisie);
+       }
+       
+       // Si on enregistre la conf d'une saisie
+       if ($nom = _request('enregistrer_saisie')){
+               // On récupère ce qui a été modifié
+               $saisie_modifiee = _request("saisie_modifiee_$nom");
+               
+               // On regarde s'il y a une position à modifier
+               if (isset($saisie_modifiee['position'])){
+                       $position = $saisie_modifiee['position'];
+                       unset($saisie_modifiee['position']);
+                       // On ne déplace que si ce n'est pas la même chose
+                       if ($position != $nom)
+                               $formulaire_actuel = saisies_deplacer($formulaire_actuel, $nom, $position);
+               }
+               
+               // On regarde s'il y a des options de vérification à modifier
+               if (isset($saisie_modifiee['verifier']['type'])
+                 and ($type_verif = $saisie_modifiee['verifier']['type']) != '')
+               {
+                       $saisie_modifiee['verifier'] = array(
+                               'type' => $type_verif,
+                               'options' => $saisie_modifiee['verifier'][$type_verif]
+                       );
+               }
+               else {
+                       unset($saisie_modifiee['verifier']);
+               }
+
+               // On récupère les options postées en enlevant les chaines vides
+               $saisie_modifiee['options'] = array_filter($saisie_modifiee['options'], 'saisie_option_contenu_vide');
+               if (isset($saisie_modifiee['verifier']['options']) and $saisie_modifiee['verifier']['options']) {
+                       $saisie_modifiee['verifier']['options'] = array_filter($saisie_modifiee['verifier']['options'], 'saisie_option_contenu_vide');
+               }
+               
+               // On désinfecte à la main
+               if (is_array($saisie_modifiee['options']))
+                       spip_desinfecte($saisie_modifiee['options']);
+               
+               // On modifie enfin
+               $formulaire_actuel = saisies_modifier($formulaire_actuel, $nom, $saisie_modifiee);
+       }
+       
+       // Si on demande à réinitialiser
+       if (_request('reinitialiser') == 'oui'){
+               $formulaire_actuel = $formulaire_initial;
+       }
+       
+       // On enregistre en session la nouvelle version du formulaire
+       session_set($identifiant, $formulaire_actuel);
+       
+       // Le formulaire reste éditable
+       $retours['editable'] = true;
+       
+       return $retours;
+}
+
+// À utiliser avec un array_walk_recursive()
+// Applique une transformation à la @valeur@ de tous les champs "nom" d'un formulaire, y compris loin dans l'arbo
+function formidable_transformer_nom(&$valeur, $cle, $transformation){
+       if ($cle == 'nom' and is_string($valeur)){
+               $valeur = str_replace('@valeur@', $valeur, $transformation);
+       }
+}
+
+// Préparer une saisie pour la transformer en truc configurable
+function formidable_generer_saisie_configurable($saisie, $env){
+       // On récupère le nom
+       $nom = $saisie['options']['nom'];
+       $identifiant = $saisie['identifiant'];
+       // On cherche si ya un formulaire de config
+       $formulaire_config = isset($env['erreurs']['configurer_'.$nom]) ? $env['erreurs']['configurer_'.$nom] : "";
+       // On ajoute une classe
+       if (!isset($saisie['options']['li_class'])) {
+               $saisie['options']['li_class'] = ''; // initialisation
+       }
+       $saisie['options']['li_class'] .= ' configurable';
+       // On ajoute l'option "tout_afficher"
+       $saisie['options']['tout_afficher'] = 'oui';
+       
+       // On ajoute les boutons d'actions, mais seulement s'il n'y a pas de configuration de lancée
+       if (!$env['erreurs']) {
+               $saisie = saisies_inserer_html(
+                       $saisie,
+                       recuperer_fond(
+                               'formulaires/inc-construire_formulaire-actions',
+                               array(
+                                       'nom' => $nom,
+                                       'identifiant' => $identifiant, 
+                                       'formulaire_config' => $formulaire_config,
+                                       'deplacable' => $env['_chemin_ui']
+                               )
+                       ),
+                       'debut'
+               );
+       }
+       
+       // On ajoute une ancre pour s'y déplacer
+       $saisie = saisies_inserer_html(
+               $saisie,
+               "\n<a id=\"configurer_$nom\"></a>\n",
+               'debut'
+       );
+       
+       // Si ya un form de config on l'ajoute à la fin
+       if (is_array($formulaire_config)){
+               // On double l'environnement
+               $env2 = $env;
+               // On ajoute une classe
+               $saisie['options']['li_class'] .= ' en_configuration';
+               
+               // Si possible on met en readonly
+               $saisie['options']['readonly'] = 'oui';
+               
+               // On vire les sous-saisies s'il y en a
+               if (isset($saisie['saisies']) and $saisie['saisies'] and is_array($saisie['saisies'])){
+                       $nb_champs_masques = count(saisies_lister_champs($saisie['saisies']));
+                       $saisie['saisies'] = array(
+                               array(
+                                       'saisie' => 'explication',
+                                       'options' => array(
+                                               'nom' => 'truc',
+                                               'texte' => _T('saisies:construire_info_nb_champs_masques', array('nb'=>$nb_champs_masques)),
+                                       )
+                               )
+                       );
+               }
+               
+               // On va ajouter le champ pour la position
+               if (!($chemin_description = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true))){
+                       $chemin_description = array(0);
+                       $formulaire_config = saisies_inserer(
+                               $formulaire_config,
+                               array(
+                                       'saisie' => 'fieldset',
+                                       'options' => array(
+                                               'nom' => "saisie_modifiee_${nom}[options][description]",
+                                               'label' => _T('saisies:option_groupe_description')
+                                       ),
+                                       'saisies' => array()
+                               ),
+                               0
+                       );
+               }
+               $chemin_description[] = 'saisies';
+               $chemin_description[] = '0'; // tout au début
+               $formulaire_config = saisies_inserer(
+                       $formulaire_config,
+                       array(
+                               'saisie' => 'position_construire_formulaire',
+                               'options' => array(
+                                       'nom' => "saisie_modifiee_${nom}[position]",
+                                       'label' => _T('saisies:construire_position_label'),
+                                       'explication' => _T('saisies:construire_position_explication'),
+                                       'formulaire' => $env['_contenu'],
+                                       'saisie_a_positionner' => $nom
+                               )
+                       ),
+                       $chemin_description
+               );
+               
+               $env2['saisies'] = $formulaire_config;
+               
+               // Un test pour savoir si on prend le _request ou bien
+               $erreurs_test = $env['erreurs'];
+               unset($erreurs_test['configurer_'.$nom]);
+               unset($erreurs_test['positionner']);
+               if ($erreurs_test){
+                       // Là aussi on désinfecte à la main
+                       if (is_array($env2["saisie_modifiee_$nom"]['options']))
+                               spip_desinfecte($env2["saisie_modifiee_$nom"]['options']);
+               }
+               else{
+                       $env2["saisie_modifiee_$nom"] = $env2['_saisies_par_nom'][$nom];
+                       // il n'y a pas toujours de verification...
+                       if (isset($env2["saisie_modifiee_$nom"]['verifier'])) {
+                               $env2["saisie_modifiee_$nom"]['verifier'][ $env2["saisie_modifiee_$nom"]['verifier']['type'] ]
+                                       = $env2["saisie_modifiee_$nom"]['verifier']['options'];
+                       }
+               }
+               
+               $env2['fond_generer'] = 'inclure/generer_saisies';
+               $saisie = saisies_inserer_html(
+                       $saisie,
+                       '<div class="formulaire_configurer"><ul class="formulaire_configurer-contenus">'
+                       .recuperer_fond(
+                               'inclure/generer_saisies',
+                               $env2
+                       )
+                       .'<li class="boutons">
+                               <input type="hidden" name="enregistrer_saisie" value="'.$nom.'" />
+                               <button type="submit" class="submit link" name="enregistrer_saisie" value="">'._T('bouton_annuler').'</button>
+                               <input type="submit" class="submit" name="enregistrer" value="'._T('bouton_valider').'" />
+                       </li>'
+                       .'</ul></div>',
+                       'fin'
+               );
+       }
+       // On génère le HTML de la saisie
+       $html = saisies_generer_html($saisie, $env);
+       return $html;
+}
+
+/**
+ * Callback d'array_filter()
+ * Permet de retourner tout ce qui n'est pas un contenu vide.
+ * La valeur '0' est par contre retournée.
+ *
+ * @param $var La variable a tester
+ * @return bool L'accepte-t-on ?
+**/
+function saisie_option_contenu_vide($var) {
+       if (!$var) {
+               if (is_string($var) AND strlen($var)) {
+                       return true;
+               }
+               return false;
+       }
+       return true;
+}
+?>
diff --git a/www/plugins/saisies/formulaires/inc-construire_formulaire-actions.html b/www/plugins/saisies/formulaires/inc-construire_formulaire-actions.html
new file mode 100644 (file)
index 0000000..faaedc4
--- /dev/null
@@ -0,0 +1,27 @@
+<div class="actions">
+       #SET{nom,#ENV{identifiant,#ENV{nom}}}
+       [(#ENV{formulaire_config}|is_array|non)
+       [(#ENV{deplacable}|oui)
+       <span class="move deplacer_saisie" title="<:saisies:construire_action_deplacer:>">
+               <img src="[(#CHEMIN{images/formulaire-deplacer-16.png})]" alt="<:saisies:construire_action_deplacer:>"/>
+       </span>
+       ]
+       <button type="submit" class="submit configurer_saisie" name="configurer_saisie" value="#GET{nom}" title="<:saisies:construire_action_configurer:>">
+               <img src="[(#CHEMIN{images/formulaire-configurer-16.png})]" alt="<:saisies:construire_action_configurer:>"/>
+       </button>
+       <button type="submit" class="submit dupliquer_saisie" name="dupliquer_saisie" value="#GET{nom}" title="<:saisies:construire_action_dupliquer:>">
+               <img src="[(#CHEMIN{images/formulaire-dupliquer-16.png})]" alt="<:saisies:construire_action_dupliquer:>"/>
+       </button>
+       <button type="submit" class="submit supprimer_saisie" name="supprimer_saisie" value="#GET{nom}" title="<:saisies:construire_action_supprimer:>" onclick="javascript:return confirm('<:saisies:construire_confirmer_supprimer_champ:>');">
+               <img src="[(#CHEMIN{images/formulaire-supprimer-16.png})]" alt="<:saisies:construire_action_supprimer:>"/>
+       </button>
+       ]
+       [(#ENV{formulaire_config}|is_array|oui)
+       <button type="submit" class="submit enregistrer_saisie" name="enregistrer_saisie" value="#GET{nom}" title="<:bouton_enregistrer:>">
+               <img src="[(#CHEMIN{images/formulaire-enregistrer-16.png})]" alt="<:bouton_enregistrer:>"/>
+       </button>
+       <button type="submit" class="submit annuler" name="enregistrer_saisie" value="" title="<:saisies:construire_action_annuler:>">
+               <img src="[(#CHEMIN{images/formulaire-annuler-16.png})]" alt="<:saisies:construire_action_annuler:>"/>
+       </button>
+       ]
+</div>
diff --git a/www/plugins/saisies/formulaires/inc-generer_saisies_configurables.html b/www/plugins/saisies/formulaires/inc-generer_saisies_configurables.html
new file mode 100644 (file)
index 0000000..fbb0c00
--- /dev/null
@@ -0,0 +1,9 @@
+[(#REM) 
+  Exemple d'appel :
+    #INCLURE{fond=formulaires/inc-generer_saisies_configurables, env, fond_generer=formulaires/inc-generer_saisies_configurables, saisies=#ENV{tableau}}
+]
+<BOUCLE_contenu(POUR){tableau #ENV{saisies}}>
+[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
+       [(#VALEUR**|formidable_generer_saisie_configurable{#ENV{_env}|sinon{#ENV**|unserialize}})]
+]
+</BOUCLE_contenu>
diff --git a/www/plugins/saisies/formulaires/inc-saisies-cvt.html b/www/plugins/saisies/formulaires/inc-saisies-cvt.html
new file mode 100644 (file)
index 0000000..b87cb54
--- /dev/null
@@ -0,0 +1,24 @@
+<div class="formulaire_spip formulaire_#ENV{form}">\r
+       [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]\r
+       [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>]\r
+       \r
+       [(#ENV{editable}|oui)\r
+       <form method="post" action="#ENV{action}" enctype="multipart/form-data"><div>\r
+               [(#REM) declarer les hidden qui declencheront le service du formulaire \r
+               parametre : url d'action ]\r
+               #ACTION_FORMULAIRE{#ENV{action}}\r
+               \r
+               <ul>\r
+                       #GENERER_SAISIES{#ENV{_saisies}}\r
+               </ul>\r
+               \r
+               [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]\r
+               <!--extra-->\r
+               \r
+               <p class="boutons">\r
+                       <span class="image_loading"></span>\r
+                       <input type="submit" class="submit" value="[(#ENV{saisies_texte_submit}|sinon{<:bouton_enregistrer:>})]" />\r
+               </p>\r
+       </div></form>\r
+       ]\r
+</div>\r
diff --git a/www/plugins/saisies/formulaires/saisies_cvt.html b/www/plugins/saisies/formulaires/saisies_cvt.html
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/www/plugins/saisies/formulaires/saisies_cvt.php b/www/plugins/saisies/formulaires/saisies_cvt.php
new file mode 100644 (file)
index 0000000..582fa56
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+function formulaires_saisies_cvt_saisies_dist(){
+       return array(
+               array(
+                       'saisie' => 'input',
+                       'options' => array(
+                               'nom' => 'nom',
+                               'label' => 'Nom'
+                       )
+               ),
+               array(
+                       'saisie' => 'input',
+                       'options' => array(
+                               'nom' => 'email',
+                               'obligatoire' => 'oui',
+                               'label' => 'E-mail'
+                       ),
+                       'verifier' => array(
+                               'type' => 'email'
+                       )
+               ),
+               array(
+                       'saisie' => 'textarea',
+                       'options' => array(
+                               'nom' => 'message',
+                               'obligatoire' => 'oui',
+                               'label' => 'Un message'
+                       ),
+                       'verifier' => array(
+                               'type' => 'taille',
+                               'options' => array('min' => 10)
+                       )
+               )
+       );
+}
+
+?>
diff --git a/www/plugins/saisies/images/formulaire-annuler-16.png b/www/plugins/saisies/images/formulaire-annuler-16.png
new file mode 100644 (file)
index 0000000..1af591c
Binary files /dev/null and b/www/plugins/saisies/images/formulaire-annuler-16.png differ
diff --git a/www/plugins/saisies/images/formulaire-configurer-16.png b/www/plugins/saisies/images/formulaire-configurer-16.png
new file mode 100644 (file)
index 0000000..36a909b
Binary files /dev/null and b/www/plugins/saisies/images/formulaire-configurer-16.png differ
diff --git a/www/plugins/saisies/images/formulaire-deplacer-16.png b/www/plugins/saisies/images/formulaire-deplacer-16.png
new file mode 100644 (file)
index 0000000..6e13dd3
Binary files /dev/null and b/www/plugins/saisies/images/formulaire-deplacer-16.png differ
diff --git a/www/plugins/saisies/images/formulaire-dupliquer-16.png b/www/plugins/saisies/images/formulaire-dupliquer-16.png
new file mode 100644 (file)
index 0000000..f9f4e9b
Binary files /dev/null and b/www/plugins/saisies/images/formulaire-dupliquer-16.png differ
diff --git a/www/plugins/saisies/images/formulaire-enregistrer-16.png b/www/plugins/saisies/images/formulaire-enregistrer-16.png
new file mode 100644 (file)
index 0000000..06b2491
Binary files /dev/null and b/www/plugins/saisies/images/formulaire-enregistrer-16.png differ
diff --git a/www/plugins/saisies/images/formulaire-reinitialiser-24.png b/www/plugins/saisies/images/formulaire-reinitialiser-24.png
new file mode 100644 (file)
index 0000000..5dce298
Binary files /dev/null and b/www/plugins/saisies/images/formulaire-reinitialiser-24.png differ
diff --git a/www/plugins/saisies/images/formulaire-saisie-defaut.png b/www/plugins/saisies/images/formulaire-saisie-defaut.png
new file mode 100644 (file)
index 0000000..6a0e70a
Binary files /dev/null and b/www/plugins/saisies/images/formulaire-saisie-defaut.png differ
diff --git a/www/plugins/saisies/images/formulaire-supprimer-16.png b/www/plugins/saisies/images/formulaire-supprimer-16.png
new file mode 100644 (file)
index 0000000..6f4a6a6
Binary files /dev/null and b/www/plugins/saisies/images/formulaire-supprimer-16.png differ
diff --git a/www/plugins/saisies/images/logo_saisie_48.png b/www/plugins/saisies/images/logo_saisie_48.png
new file mode 100644 (file)
index 0000000..e1e6f37
Binary files /dev/null and b/www/plugins/saisies/images/logo_saisie_48.png differ
diff --git a/www/plugins/saisies/images/saisies_auteurs.png b/www/plugins/saisies/images/saisies_auteurs.png
new file mode 100644 (file)
index 0000000..6fdf70d
Binary files /dev/null and b/www/plugins/saisies/images/saisies_auteurs.png differ
diff --git a/www/plugins/saisies/images/saisies_case.png b/www/plugins/saisies/images/saisies_case.png
new file mode 100644 (file)
index 0000000..71565b0
Binary files /dev/null and b/www/plugins/saisies/images/saisies_case.png differ
diff --git a/www/plugins/saisies/images/saisies_checkbox.png b/www/plugins/saisies/images/saisies_checkbox.png
new file mode 100644 (file)
index 0000000..8f0a9bf
Binary files /dev/null and b/www/plugins/saisies/images/saisies_checkbox.png differ
diff --git a/www/plugins/saisies/images/saisies_date.png b/www/plugins/saisies/images/saisies_date.png
new file mode 100644 (file)
index 0000000..96ef9a4
Binary files /dev/null and b/www/plugins/saisies/images/saisies_date.png differ
diff --git a/www/plugins/saisies/images/saisies_explication.png b/www/plugins/saisies/images/saisies_explication.png
new file mode 100644 (file)
index 0000000..be5c134
Binary files /dev/null and b/www/plugins/saisies/images/saisies_explication.png differ
diff --git a/www/plugins/saisies/images/saisies_fieldset.png b/www/plugins/saisies/images/saisies_fieldset.png
new file mode 100644 (file)
index 0000000..f9efaca
Binary files /dev/null and b/www/plugins/saisies/images/saisies_fieldset.png differ
diff --git a/www/plugins/saisies/images/saisies_hidden.png b/www/plugins/saisies/images/saisies_hidden.png
new file mode 100644 (file)
index 0000000..cb552bf
Binary files /dev/null and b/www/plugins/saisies/images/saisies_hidden.png differ
diff --git a/www/plugins/saisies/images/saisies_input.png b/www/plugins/saisies/images/saisies_input.png
new file mode 100644 (file)
index 0000000..ccaa722
Binary files /dev/null and b/www/plugins/saisies/images/saisies_input.png differ
diff --git a/www/plugins/saisies/images/saisies_oui_non.png b/www/plugins/saisies/images/saisies_oui_non.png
new file mode 100644 (file)
index 0000000..a32b607
Binary files /dev/null and b/www/plugins/saisies/images/saisies_oui_non.png differ
diff --git a/www/plugins/saisies/images/saisies_radio.png b/www/plugins/saisies/images/saisies_radio.png
new file mode 100644 (file)
index 0000000..c85d949
Binary files /dev/null and b/www/plugins/saisies/images/saisies_radio.png differ
diff --git a/www/plugins/saisies/images/saisies_selecteur_article.png b/www/plugins/saisies/images/saisies_selecteur_article.png
new file mode 100644 (file)
index 0000000..24eece2
Binary files /dev/null and b/www/plugins/saisies/images/saisies_selecteur_article.png differ
diff --git a/www/plugins/saisies/images/saisies_selecteur_rubrique.png b/www/plugins/saisies/images/saisies_selecteur_rubrique.png
new file mode 100644 (file)
index 0000000..026a114
Binary files /dev/null and b/www/plugins/saisies/images/saisies_selecteur_rubrique.png differ
diff --git a/www/plugins/saisies/images/saisies_selecteur_rubrique_article.png b/www/plugins/saisies/images/saisies_selecteur_rubrique_article.png
new file mode 100644 (file)
index 0000000..77acfe3
Binary files /dev/null and b/www/plugins/saisies/images/saisies_selecteur_rubrique_article.png differ
diff --git a/www/plugins/saisies/images/saisies_selection.png b/www/plugins/saisies/images/saisies_selection.png
new file mode 100644 (file)
index 0000000..dab25d3
Binary files /dev/null and b/www/plugins/saisies/images/saisies_selection.png differ
diff --git a/www/plugins/saisies/images/saisies_selection_multiple.png b/www/plugins/saisies/images/saisies_selection_multiple.png
new file mode 100644 (file)
index 0000000..d682108
Binary files /dev/null and b/www/plugins/saisies/images/saisies_selection_multiple.png differ
diff --git a/www/plugins/saisies/images/saisies_textarea.png b/www/plugins/saisies/images/saisies_textarea.png
new file mode 100644 (file)
index 0000000..84277b8
Binary files /dev/null and b/www/plugins/saisies/images/saisies_textarea.png differ
diff --git a/www/plugins/saisies/inc/saisies.php b/www/plugins/saisies/inc/saisies.php
new file mode 100644 (file)
index 0000000..4a713a5
--- /dev/null
@@ -0,0 +1,406 @@
+<?php\r
+\r
+/**\r
+ * Gestion de l'affichage des saisies\r
+ *\r
+ * @return SPIP\Saisies\Saisies\r
+**/\r
+\r
+// Sécurité\r
+if (!defined('_ECRIRE_INC_VERSION')) return;\r
+\r
+/*\r
+ * Une librairie pour manipuler ou obtenir des infos sur un tableau de saisies\r
+ *\r
+ * saisies_lister_par_nom()\r
+ * saisies_lister_champs()\r
+ * saisies_lister_valeurs_defaut()\r
+ * saisies_charger_champs()\r
+ * saisies_chercher()\r
+ * saisies_supprimer()\r
+ * saisies_inserer()\r
+ * saisies_deplacer()\r
+ * saisies_modifier()\r
+ * saisies_verifier()\r
+ * saisies_comparer()\r
+ * saisies_generer_html()\r
+ * saisies_generer_vue()\r
+ * saisies_generer_nom()\r
+ * saisies_inserer_html()\r
+ * saisies_lister_disponibles()\r
+ * saisies_autonomes()\r
+ */\r
+\r
+// Différentes méthodes pour trouver les saisies\r
+include_spip('inc/saisies_lister');\r
+\r
+// Différentes méthodes pour manipuler une liste de saisies\r
+include_spip('inc/saisies_manipuler');\r
+\r
+// Les outils pour afficher les saisies et leur vue\r
+include_spip('inc/saisies_afficher');\r
+\r
+/*\r
+ * Cherche la description des saisies d'un formulaire CVT dont on donne le nom\r
+ *\r
+ * @param string $form Nom du formulaire dont on cherche les saisies\r
+ * @return array Retourne les saisies du formulaire sinon false\r
+ */\r
+function saisies_chercher_formulaire($form, $args){\r
+       if ($fonction_saisies = charger_fonction('saisies', 'formulaires/'.$form, true)\r
+               and $saisies = call_user_func_array($fonction_saisies, $args)\r
+               and is_array($saisies)\r
+               // On passe les saisies dans un pipeline normé comme pour CVT\r
+               and $saisies = pipeline(\r
+                       'formulaire_saisies',\r
+                       array(\r
+                               'args' => array('form' => $form, 'args' => $args),\r
+                               'data' => $saisies\r
+                       )\r
+               )\r
+               // Si c'est toujours un tableau après le pipeline\r
+               and is_array($saisies)\r
+       ){\r
+               return $saisies;\r
+       }\r
+       else{\r
+               return false;\r
+       }\r
+}\r
+\r
+/*\r
+ * Cherche une saisie par son id, son nom ou son chemin et renvoie soit la saisie, soit son chemin\r
+ *\r
+ * @param array $saisies Un tableau décrivant les saisies\r
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant ou le nom de la saisie à chercher ou le chemin sous forme d'une liste de clés\r
+ * @param bool $retourner_chemin Indique si on retourne non pas la saisie mais son chemin\r
+ * @return array Retourne soit la saisie, soit son chemin, soit null\r
+ */\r
+function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin=false){\r
+\r
+       if (is_array($saisies) and $id_ou_nom_ou_chemin){\r
+               if (is_string($id_ou_nom_ou_chemin)){\r
+                       $nom = $id_ou_nom_ou_chemin;\r
+                       // identifiant ? premier caractere @\r
+                       $id = ($nom[0] == '@');\r
+\r
+                       foreach($saisies as $cle => $saisie){\r
+                               $chemin = array($cle);\r
+                               // notre saisie est la bonne ?\r
+                               if ($nom == ($id ? $saisie['identifiant'] : $saisie['options']['nom'])) {\r
+                                       return $retourner_chemin ? $chemin : $saisie;\r
+                               // sinon a telle des enfants ? et si c'est le cas, cherchons dedans\r
+                               } elseif (isset($saisie['saisies']) and is_array($saisie['saisies']) and $saisie['saisies']\r
+                                       and ($retour = saisies_chercher($saisie['saisies'], $nom, $retourner_chemin))) {\r
+                                               return $retourner_chemin ? array_merge($chemin, array('saisies'), $retour) : $retour;\r
+                               }\r
+\r
+                       }\r
+               }\r
+               elseif (is_array($id_ou_nom_ou_chemin)){\r
+                       $chemin = $id_ou_nom_ou_chemin;\r
+                       $saisie = $saisies;\r
+                       // On vérifie l'existence quand même\r
+                       foreach ($chemin as $cle){\r
+                               if (isset($saisie[$cle])) $saisie = $saisie[$cle];\r
+                               else return null;\r
+                       }\r
+                       // Si c'est une vraie saisie\r
+                       if ($saisie['saisie'] and $saisie['options']['nom'])\r
+                               return $retourner_chemin ? $chemin : $saisie;\r
+               }\r
+       }\r
+       \r
+       return null;\r
+}\r
+\r
+/**\r
+ * Génère un nom unique pour un champ d'un formulaire donné\r
+ *\r
+ * @param array $formulaire\r
+ *     Le formulaire à analyser \r
+ * @param string $type_saisie\r
+ *     Le type de champ dont on veut un identifiant \r
+ * @return string\r
+ *     Un nom unique par rapport aux autres champs du formulaire\r
+ */\r
+function saisies_generer_nom($formulaire, $type_saisie){\r
+       $champs = saisies_lister_champs($formulaire);\r
+       \r
+       // Tant que type_numero existe, on incrémente le compteur\r
+       $compteur = 1;\r
+       while (array_search($type_saisie.'_'.$compteur, $champs) !== false)\r
+               $compteur++;\r
+       \r
+       // On a alors un compteur unique pour ce formulaire\r
+       return $type_saisie.'_'.$compteur;\r
+}\r
+\r
+/*\r
+ * Crée un identifiant Unique\r
+ * pour toutes les saisies donnees qui n'en ont pas \r
+ *\r
+ * @param Array $saisies Tableau de saisies\r
+ * @param Bool $regenerer_id Régénère un nouvel identifiant pour toutes les saisies ?\r
+ * @return Array Tableau de saisies complété des identifiants\r
+ */\r
+function saisies_identifier($saisies, $regenerer = false) {\r
+       if (!is_array($saisies)) {\r
+               return array();\r
+       }\r
+       foreach ($saisies as $k => $saisie) {\r
+               $saisies[$k] = saisie_identifier($saisie, $regenerer);\r
+       }\r
+       return $saisies;\r
+}\r
+\r
+/**\r
+ * Crée un identifiant Unique\r
+ * pour la saisie donnee si elle n'en a pas\r
+ * (et pour ses sous saisies éventuels)\r
+ *\r
+ * @param Array $saisie Tableau d'une saisie\r
+ * @param Bool $regenerer_id Régénère un nouvel identifiant pour la saisie ?\r
+ * @return Array Tableau de la saisie complété de l'identifiant\r
+**/\r
+function saisie_identifier($saisie, $regenerer = false) {\r
+       if (!isset($saisie['identifiant']) OR !$saisie['identifiant']) {\r
+               $saisie['identifiant'] = uniqid('@');\r
+       } elseif ($regenerer) {\r
+               $saisie['identifiant'] = uniqid('@');\r
+       }\r
+       if (isset($saisie['saisies']) AND is_array($saisie['saisies'])) {\r
+               $saisie['saisies'] = saisies_identifier($saisie['saisies'], $regenerer);\r
+       }\r
+       return $saisie;\r
+}\r
+\r
+/*\r
+ * Vérifier tout un formulaire tel que décrit avec les Saisies\r
+ *\r
+ * @param array $formulaire Le contenu d'un formulaire décrit dans un tableau de Saisies\r
+ * @param bool $saisies_masquees_nulles Si TRUE, les saisies masquées selon afficher_si ne seront pas verifiées, leur valeur étant forcée a NULL. Cette valeur NULL est transmise à traiter (via set_request).\r
+ * @return array Retourne un tableau d'erreurs\r
+ */\r
+function saisies_verifier($formulaire, $saisies_masquees_nulles=true){\r
+       include_spip('inc/verifier');\r
+       $erreurs = array();\r
+       $verif_fonction = charger_fonction('verifier','inc',true);\r
+\r
+       if ($saisies_masquees_nulles)\r
+               $formulaire = saisies_verifier_afficher_si($formulaire);\r
+       \r
+       $saisies = saisies_lister_par_nom($formulaire);\r
+       foreach ($saisies as $saisie){\r
+               $obligatoire = isset($saisie['options']['obligatoire']) ? $saisie['options']['obligatoire'] : '';\r
+               $champ = $saisie['options']['nom'];\r
+               $file = ($saisie['saisie'] == 'input' and isset($saisie['options']['type']) and $saisie['options']['type'] == 'file');\r
+               $verifier = isset($saisie['verifier']) ? $saisie['verifier'] : false;\r
+\r
+               // Si le nom du champ est un tableau indexé, il faut parser !\r
+               if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)){\r
+                       $valeur = _request($separe[1]);\r
+                       preg_match_all('/\[([\w]+)\]/', $separe[2], $index);\r
+                       // On va chercher au fond du tableau\r
+                       foreach($index[1] as $cle){\r
+                               $valeur = isset($valeur[$cle]) ? $valeur[$cle] : null;\r
+                       }\r
+               }\r
+               // Sinon la valeur est juste celle du nom\r
+               else\r
+                       $valeur = _request($champ);\r
+               \r
+               // On regarde d'abord si le champ est obligatoire\r
+               if ($obligatoire\r
+                       and $obligatoire != 'non'\r
+                       and (\r
+                               ($file and !$_FILES[$champ]['name'])\r
+                               or (!$file and (\r
+                                       is_null($valeur)\r
+                                       or (is_string($valeur) and trim($valeur) == '')\r
+                                       or (is_array($valeur) and count($valeur) == 0)\r
+                               ))\r
+                       )\r
+               ) {\r
+                       $erreurs[$champ] =\r
+                               (isset($saisie['options']['erreur_obligatoire']) and $saisie['options']['erreur_obligatoire'])\r
+                               ? $saisie['options']['erreur_obligatoire']\r
+                               : _T('info_obligatoire');\r
+               }\r
+\r
+               // On continue seulement si ya pas d'erreur d'obligation et qu'il y a une demande de verif\r
+               if ((!isset($erreurs[$champ]) or !$erreurs[$champ]) and is_array($verifier) and $verif_fonction){\r
+                       $normaliser = null;\r
+                       // Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur\r
+                       $options = isset($verifier['options']) ? $verifier['options'] : array();\r
+                       if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $options, $normaliser)) {\r
+                               $erreurs[$champ] = $erreur_eventuelle;\r
+                       // S'il n'y a pas d'erreur et que la variable de normalisation a été remplie, on l'injecte dans le POST\r
+                       } elseif (!is_null($normaliser)) {\r
+                               set_request($champ, $normaliser);\r
+                       }\r
+               }\r
+       }\r
+       \r
+       return $erreurs;\r
+}\r
+\r
+/*\r
+ * Transforme une chaine en tableau avec comme principe :\r
+ * - une ligne devient une case\r
+ * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur\r
+ *\r
+ * @param string $chaine Une chaine à transformer\r
+ * @return array Retourne un tableau PHP\r
+ */\r
+function saisies_chaine2tableau($chaine, $separateur="\n"){\r
+       if ($chaine and is_string($chaine)){\r
+               $tableau = array();\r
+               // On découpe d'abord en lignes\r
+               $lignes = explode($separateur, $chaine);\r
+               foreach ($lignes as $i=>$ligne){\r
+                       $ligne = trim(trim($ligne), '|');\r
+                       // Si ce n'est pas une ligne sans rien\r
+                       if ($ligne !== ''){\r
+                               // Si on trouve un découpage dans la ligne on fait cle|valeur\r
+                               if (strpos($ligne, '|') !== false){\r
+                                       list($cle,$valeur) = explode('|', $ligne, 2);\r
+                                       // permettre les traductions de valeurs au passage\r
+                                       $tableau[$cle] = _T_ou_typo($valeur, 'multi');\r
+                               }\r
+                               // Sinon on génère la clé\r
+                               else{\r
+                                       $tableau[$i] = $ligne;\r
+                               }\r
+                       }\r
+               }\r
+               return $tableau;\r
+       }\r
+       // Si c'est déjà un tableau on lui applique _T_ou_typo (qui fonctionne de manière récursive avant de le renvoyer\r
+       elseif (is_array($chaine)){\r
+               return _T_ou_typo($chaine, 'multi');\r
+       }\r
+       else{\r
+               return array();\r
+       }\r
+}\r
+\r
+/*\r
+ * Transforme un tableau en chaine de caractères avec comme principe :\r
+ * - une case de vient une ligne de la chaine\r
+ * - chaque ligne est générée avec la forme cle|valeur\r
+ */\r
+function saisies_tableau2chaine($tableau){\r
+       if ($tableau and is_array($tableau)){\r
+               $chaine = '';\r
+       \r
+               foreach($tableau as $cle=>$valeur){\r
+                       $ligne = trim("$cle|$valeur");\r
+                       $chaine .= "$ligne\n";\r
+               }\r
+               $chaine = trim($chaine);\r
+       \r
+               return $chaine;\r
+       }\r
+       // Si c'est déjà une chaine on la renvoie telle quelle\r
+       elseif (is_string($tableau)){\r
+               return $tableau;\r
+       }\r
+       else{\r
+               return '';\r
+       }\r
+}\r
+\r
+\r
+\r
+\r
+/**\r
+ * Passe une valeur en tableau d'élements si ce n'en est pas une\r
+ *\r
+ * entrée :\r
+ * cle|valeur\r
+ * cle|valeur\r
+ *\r
+ * Sinon :\r
+ * valeur,valeur\r
+ *\r
+ * @param mixed $valeur\r
+ * @return array Tableau de valeurs\r
+**/\r
+function saisies_valeur2tableau($valeur, $sinon_separateur="") {\r
+       if (is_array($valeur)) {\r
+               return $valeur;\r
+       }\r
+       \r
+       if (!strlen($valeur)) {\r
+               return array();\r
+       }\r
+       \r
+       $t = saisies_chaine2tableau($valeur);\r
+       if (count($t) > 1) {\r
+               return $t;\r
+       }\r
+\r
+       // qu'une seule valeur, c'est qu'elle a peut etre un separateur a virgule\r
+       // et a donc une cle est 0 dans ce cas la d'ailleurs\r
+       if (isset($t[0])) {\r
+               $t = saisies_chaine2tableau($t[0], ',');\r
+       }\r
+       \r
+       return $t;\r
+}\r
+\r
+\r
+\r
+\r
+/*\r
+ * Génère une page d'aide listant toutes les saisies et leurs options\r
+ */\r
+function saisies_generer_aide(){\r
+       // On a déjà la liste par saisie\r
+       $saisies = saisies_lister_disponibles();\r
+       \r
+       // On construit une liste par options\r
+       $options = array();\r
+       foreach ($saisies as $type_saisie=>$saisie){\r
+               $options_saisie = saisies_lister_par_nom($saisie['options'], false);\r
+               foreach ($options_saisie as $nom=>$option){\r
+                       // Si l'option n'existe pas encore\r
+                       if (!isset($options[$nom])){\r
+                               $options[$nom] = _T_ou_typo($option['options']);\r
+                       }\r
+                       // On ajoute toujours par qui c'est utilisé\r
+                       $options[$nom]['utilisee_par'][] = $type_saisie;\r
+               }\r
+               ksort($options_saisie);\r
+               $saisies[$type_saisie]['options'] = $options_saisie;\r
+       }\r
+       ksort($options);\r
+       \r
+       return recuperer_fond(\r
+               'inclure/saisies_aide',\r
+               array(\r
+                       'saisies' => $saisies,\r
+                       'options' => $options\r
+               )\r
+       );\r
+}\r
+\r
+/*\r
+ * Le tableau de saisies a-t-il une option afficher_si ?\r
+ *\r
+ * @param array $saisies Un tableau de saisies\r
+ * @return boolean\r
+ */\r
+\r
+function saisies_afficher_si($saisies) {\r
+       $saisies = saisies_lister_par_nom($saisies,true);\r
+       // Dès qu'il y a au moins une option afficher_si, on l'active\r
+       foreach ($saisies as $saisie) {\r
+               if (isset($saisie['options']['afficher_si']))\r
+                       return true;\r
+       }\r
+       return false;\r
+}\r
+\r
+?>\r
diff --git a/www/plugins/saisies/inc/saisies_afficher.php b/www/plugins/saisies/inc/saisies_afficher.php
new file mode 100644 (file)
index 0000000..eb02b78
--- /dev/null
@@ -0,0 +1,421 @@
+<?php\r
+\r
+/**\r
+ * Gestion de l'affichage des saisies\r
+ *\r
+ * @return SPIP\Saisies\Afficher\r
+**/\r
+\r
+// Sécurité\r
+if (!defined('_ECRIRE_INC_VERSION')) return;\r
+\r
+/**\r
+ * Indique si une saisie peut être affichée.\r
+ * \r
+ * On s'appuie sur l'éventuelle clé "editable" du $champ.\r
+ * Si editable vaut :\r
+ *    - absent : le champ est éditable\r
+ *    - 1, le champ est éditable\r
+ *    - 0, le champ n'est pas éditable\r
+ *    - -1, le champ est éditable s'il y a du contenu dans le champ (l'environnement)\r
+ *         ou dans un de ses enfants (fieldsets)\r
+ *\r
+ * @param array $champ\r
+ *     Tableau de description de la saisie\r
+ * @param array $env\r
+ *     Environnement transmis à la saisie, certainement l'environnement du formulaire\r
+ * @param bool $utiliser_editable\r
+ *     - false pour juste tester le cas -1\r
+ * \r
+ * @return bool\r
+ *     Retourne un booléen indiquant l'état éditable ou pas :\r
+ *     - true si la saisie est éditable (peut être affichée)\r
+ *     - false sinon\r
+ */\r
+function saisie_editable($champ, $env, $utiliser_editable=true) {\r
+       if ($utiliser_editable) {\r
+               // si le champ n'est pas éditable, on sort.\r
+               if (!isset($champ['editable'])) {\r
+                       return true;\r
+               }\r
+               $editable = $champ['editable'];\r
+\r
+               if ($editable > 0) {\r
+                       return true;\r
+               }\r
+               if ($editable == 0) {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       // cas -1\r
+       // name de la saisie\r
+       if (isset($champ['options']['nom'])) {\r
+               // si on a le name dans l'environnement, on le teste\r
+               $nom = $champ['options']['nom'];\r
+               if (isset($env[$nom])) {\r
+                       return $env[$nom] ? true : false ;\r
+               }\r
+       }\r
+       // sinon, si on a des sous saisies\r
+       if (isset($champ['saisies']) and is_array($champ['saisies'])) {\r
+               foreach($champ['saisies'] as $saisie) {\r
+                       if (saisie_editable($saisie, $env, false)) {\r
+                               return true;\r
+                       }\r
+               }\r
+       }\r
+       \r
+       // aucun des paramètres demandés n'avait de contenu\r
+       return false;\r
+}\r
+\r
+/**\r
+ * Génère une saisie à partir d'un tableau la décrivant et de l'environnement\r
+ *\r
+ * @param array $champ\r
+ *     Description de la saisie.\r
+ *     Le tableau doit être de la forme suivante :\r
+ *     array(\r
+ *                     'saisie' => 'input',\r
+ *                     'options' => array(\r
+ *                             'nom' => 'le_name',\r
+ *                             'label' => 'Un titre plus joli',\r
+ *                             'obligatoire' => 'oui',\r
+ *                             'explication' => 'Remplissez ce champ en utilisant votre clavier.'\r
+ *                     )\r
+ *     )\r
+ * @param array $env\r
+ *     Environnement du formulaire\r
+ *     Permet de savoir les valeurs actuelles des contenus des saisies,\r
+ *     les erreurs eventuelles présentes...\r
+ * @return string\r
+ *     Code HTML des saisies de formulaire\r
+ */\r
+function saisies_generer_html($champ, $env=array()){\r
+       // Si le parametre n'est pas bon, on genere du vide\r
+       if (!is_array($champ))\r
+               return '';\r
+\r
+       // Si la saisie n'est pas editable, on sort aussi.\r
+       if (!saisie_editable($champ, $env)) {\r
+               return '';\r
+       }\r
+       \r
+       $contexte = array();\r
+       \r
+       // On sélectionne le type de saisie\r
+       $contexte['type_saisie'] = $champ['saisie'];\r
+       // Identifiant unique de saisie, si present\r
+       if (isset($champ['identifiant'])) {\r
+               $contexte['id_saisie'] = $champ['identifiant'];\r
+       }\r
+\r
+       // Peut-être des transformations à faire sur les options textuelles\r
+       $options = $champ['options'];\r
+       foreach ($options as $option => $valeur){\r
+               if ($option == 'datas') {\r
+                       // exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)\r
+                       $options[$option] = saisies_chaine2tableau($valeur);\r
+               } else {\r
+                       $options[$option] = _T_ou_typo($valeur, 'multi');\r
+               }\r
+       }\r
+       \r
+       // On ajoute les options propres à la saisie\r
+       $contexte = array_merge($contexte, $options);\r
+\r
+       // Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement\r
+       if (isset($contexte['env']) or (isset($champ['saisies']) AND is_array($champ['saisies']))) {\r
+               unset($contexte['env']);\r
+\r
+               // on sauve l'ancien environnement\r
+               // car les sous-saisies ne doivent pas être affectees\r
+               // par les modification sur l'environnement servant à generer la saisie mère\r
+               $contexte['_env'] = $env;\r
+               \r
+               // À partir du moment où on passe tout l'environnement, il faut enlever certains éléments qui ne doivent absolument provenir que des options\r
+               unset($env['inserer_debut']);\r
+               unset($env['inserer_fin']);\r
+               $saisies_disponibles = saisies_lister_disponibles();\r
+               if (isset($saisies_disponibles[$contexte['type_saisie']]) and is_array($saisies_disponibles[$contexte['type_saisie']]['options'])) {\r
+                       $options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);\r
+                       foreach ($options_a_supprimer as $option_a_supprimer){\r
+                               unset($env[$option_a_supprimer]);\r
+                       }\r
+               }\r
+               \r
+               $contexte = array_merge($env, $contexte);\r
+       }\r
+       // Sinon on ne sélectionne que quelques éléments importants\r
+       else{\r
+               // On récupère la liste des erreurs\r
+               $contexte['erreurs'] = $env['erreurs'];\r
+               // On ajoute toujours le bon self\r
+               $contexte['self'] = self();\r
+       }\r
+\r
+       // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ\r
+       // Si le nom du champ est un tableau indexé, il faut parser !\r
+       if (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)){\r
+               $contexte['valeur'] = $env[$separe[1]];\r
+               preg_match_all('/\[([\w]+)\]/', $separe[2], $index);\r
+               // On va chercher au fond du tableau\r
+               foreach($index[1] as $cle){\r
+                       $contexte['valeur'] = isset($contexte['valeur'][$cle]) ? $contexte['valeur'][$cle] : null;\r
+               }\r
+       }\r
+       // Sinon la valeur est juste celle du nom\r
+       else {\r
+               $contexte['valeur'] = (isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : null);\r
+       }\r
+\r
+       // Si ya des enfants on les remonte dans le contexte\r
+       if (isset($champ['saisies']) and is_array($champ['saisies']))\r
+               $contexte['saisies'] = $champ['saisies'];\r
+       \r
+       // On génère la saisie\r
+       return recuperer_fond(\r
+               'saisies/_base',\r
+               $contexte\r
+       );\r
+}\r
+\r
+/**\r
+ * Génère une vue d'une saisie à partir d'un tableau la décrivant\r
+ *\r
+ * @see saisies_generer_html()\r
+ * @param array $saisie\r
+ *     Tableau de description d'une saisie\r
+ * @param array $env\r
+ *     L'environnement, contenant normalement la réponse à la saisie\r
+ * @param array $env_obligatoire\r
+ *     ???\r
+ * @return string\r
+ *     Code HTML de la vue de la saisie\r
+ */\r
+function saisies_generer_vue($saisie, $env=array(), $env_obligatoire=array()){\r
+       // Si le paramètre n'est pas bon, on génère du vide\r
+       if (!is_array($saisie))\r
+               return '';\r
+\r
+       $contexte = array();\r
+               \r
+       // On sélectionne le type de saisie\r
+       $contexte['type_saisie'] = $saisie['saisie'];\r
+       \r
+       // Peut-être des transformations à faire sur les options textuelles\r
+       $options = $saisie['options'];\r
+       foreach ($options as $option => $valeur){\r
+               if ($option == 'datas') {\r
+                       // exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)\r
+                       $options[$option] = saisies_chaine2tableau($valeur);\r
+               } else {\r
+                       $options[$option] = _T_ou_typo($valeur, 'multi');\r
+               }\r
+       }\r
+       \r
+       // On ajoute les options propres à la saisie\r
+       $contexte = array_merge($contexte, $options);\r
+\r
+       // Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement\r
+       if (isset($contexte['env']) or (isset($saisie['saisies']) AND is_array($saisie['saisies']))){\r
+               unset($contexte['env']);\r
+\r
+               // on sauve l'ancien environnement\r
+               // car les sous-saisies ne doivent pas être affectees\r
+               // par les modification sur l'environnement servant à generer la saisie mère\r
+               $contexte['_env'] = $env;\r
+\r
+               // À partir du moment où on passe tout l'environnement, il faut enlever \r
+               // certains éléments qui ne doivent absolument provenir que des options\r
+               $saisies_disponibles = saisies_lister_disponibles();\r
+               if (is_array($saisies_disponibles[$contexte['type_saisie']]['options'])){\r
+                       $options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);\r
+                       foreach ($options_a_supprimer as $option_a_supprimer){\r
+                               unset($env[$option_a_supprimer]);\r
+                       }\r
+               }\r
+               \r
+               $contexte = array_merge($env, $contexte);\r
+       }\r
+\r
+       // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ\r
+       \r
+       // On regarde en priorité s'il y a un tableau listant toutes les valeurs\r
+       if ($env['valeurs'] and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])){\r
+               $contexte['valeur'] = $env['valeurs'][$contexte['nom']];\r
+       }\r
+       // Si le nom du champ est un tableau indexé, il faut parser !\r
+       elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)){\r
+               $contexte['valeur'] = $env[$separe[1]];\r
+               preg_match_all('/\[([\w]+)\]/', $separe[2], $index);\r
+               // On va chercher au fond du tableau\r
+               foreach($index[1] as $cle){\r
+                       $contexte['valeur'] = $contexte['valeur'][$cle];\r
+               }\r
+       }\r
+       // Sinon la valeur est juste celle du nom\r
+       else {\r
+               // certains n'ont pas de nom (fieldset)\r
+               $contexte['valeur'] = isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : '';\r
+       }\r
+\r
+       // Si ya des enfants on les remonte dans le contexte\r
+       if (isset($saisie['saisies']) AND is_array($saisie['saisies']))\r
+               $contexte['saisies'] = $saisie['saisies'];\r
+\r
+       if (is_array($env_obligatoire)) {\r
+               $contexte = array_merge($contexte, $env_obligatoire);\r
+       }\r
+\r
+       // On génère la saisie\r
+       return recuperer_fond(\r
+               'saisies-vues/_base',\r
+               $contexte\r
+       );\r
+}\r
+\r
+/**\r
+ * Génère, à partir d'un tableau de saisie le code javascript ajouté à la fin de #GENERER_SAISIES\r
+ * pour produire un affichage conditionnel des saisies ayant une option afficher_si.\r
+ *\r
+ * @param array $saisies\r
+ *     Tableau de descriptions des saisies\r
+ * @param string $id_form\r
+ *     Identifiant unique pour le formulaire\r
+ * @return text\r
+ *     Code javascript\r
+ */\r
+function saisies_generer_js_afficher_si($saisies,$id_form){\r
+       $i = 0;\r
+       $saisies = saisies_lister_par_nom($saisies,true);\r
+       $code = '';\r
+       $code .= '(function($){';\r
+       $code .= '$(document).ready(function(){';\r
+               $code .= 'verifier_saisies_'.$id_form.' = function(form){';\r
+                               foreach ($saisies as $saisie) {\r
+                                       // on utilise comme selecteur l'identifiant de saisie en priorite s'il est connu\r
+                                       // parce que li_class = 'tableau[nom][option]' ne fonctionne evidement pas\r
+                                       // lorsque le name est un tableau\r
+                                       if (isset($saisie['options']['afficher_si'])) {\r
+                                               $i++;\r
+                                               // retrouver la classe css probable\r
+                                               switch ($saisie['saisie']) {\r
+                                                       case 'fieldset':\r
+                                                               $class_li = 'fieldset_'.$saisie['options']['nom'];\r
+                                                               break;\r
+                                                       case 'explication':\r
+                                                               $class_li = 'explication_'.$saisie['options']['nom'];\r
+                                                               break;\r
+                                                       default:\r
+                                                               $class_li = 'editer_'.$saisie['options']['nom'];\r
+                                               }\r
+                                               $condition = $saisie['options']['afficher_si'];\r
+                                               // retrouver l'identifiant\r
+                                               $identifiant = '';\r
+                                               if (isset($saisie['identifiant']) and $saisie['identifiant']) {\r
+                                                       $identifiant = $saisie['identifiant'];\r
+                                               }\r
+                                               // On gère le cas @plugin:non_plugin@\r
+                                               preg_match_all('#@plugin:(.+)@#U', $condition, $matches);\r
+                                               foreach ($matches[1] as $plug) {\r
+                                                       if (defined('_DIR_PLUGIN_'.strtoupper($plug)))\r
+                                                               $condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);\r
+                                                       else\r
+                                                               $condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);\r
+                                               }\r
+                                               // On gère le cas @config:plugin:meta@ suivi d'un test\r
+                                               preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);\r
+                                               foreach ($matches[1] as $plugin) {\r
+                                                       $config = lire_config($plugin);\r
+                                                       $condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);\r
+                                               }\r
+                                               // On transforme en une condition valide\r
+                                               preg_match_all('#@(.+)@#U', $condition, $matches);\r
+                                               foreach ($matches[1] as $nom) {\r
+                                                       switch($saisies[$nom]['saisie']) {\r
+                                                               case 'radio':\r
+                                                               case 'oui_non':\r
+                                                                       $condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']:checked").val()', $condition);\r
+                                                                       break;\r
+                                                               case 'case':\r
+                                                                       $condition = preg_replace('#@'.preg_quote($nom).'@#U', '($(form).find("[name=\''.$nom.'\']").is(":checked") ? $(form).find("[name=\''.$nom.'\']").val() : "")', $condition);\r
+                                                                       break;\r
+                                                               default:\r
+                                                                       $condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']").val()', $condition);\r
+                                                       }\r
+                                               }\r
+                                               if ($identifiant) {\r
+                                                       $sel = "li[data-id='$identifiant']";\r
+                                               } else {\r
+                                                       $sel = "li.$class_li";\r
+                                               }\r
+                                               $code .= 'if ('.$condition.') {$(form).find("'.$sel.'").show(400);} ';\r
+                                               $code .= 'else {$(form).find("'.$sel.'").hide(400).css("display", "none");} ';\r
+                                       }\r
+                               }\r
+               $code .= '};';\r
+               $code .= '$("li#afficher_si_'.$id_form.'").parents("form").each(function(){verifier_saisies_'.$id_form.'(this);});';\r
+               $code .= '$("li#afficher_si_'.$id_form.'").parents("form").change(function(){verifier_saisies_'.$id_form.'(this);});';\r
+       $code .= '});';\r
+       $code .= '})(jQuery);';\r
+       return $i>0 ? $code : '';\r
+}\r
+\r
+/**\r
+ * Lorsque l'on affiche les saisies (#VOIR_SAISIES), les saisies ayant une option afficher_si\r
+ * et dont les conditions ne sont pas remplies doivent être retirées du tableau de saisies.\r
+ * \r
+ * Cette fonction sert aussi lors de la vérification des saisies avec saisies_verifier().\r
+ * À ce moment là, les saisies non affichées sont retirées de _request\r
+ * (on passe leur valeur à NULL).\r
+ *\r
+ * @param array $saisies\r
+ *     Tableau de descriptions de saisies\r
+ * @param array|null $env\r
+ *     Tableau d'environnement transmis dans inclure/voi_saisies.html,\r
+ *     NULL si on doit rechercher dans _request (pour saisies_verifier()).\r
+ * @return array\r
+ *     Tableau de descriptions de saisies\r
+ */\r
+function saisies_verifier_afficher_si($saisies, $env=NULL) {\r
+       // eviter une erreur par maladresse d'appel :)\r
+       if (!is_array($saisies)) {\r
+               return array();\r
+       }\r
+       foreach ($saisies as $cle => $saisie) {\r
+               if (isset($saisie['options']['afficher_si'])) {\r
+                       $condition = $saisie['options']['afficher_si'];\r
+                       // On gère le cas @plugin:non_plugin@\r
+                       preg_match_all('#@plugin:(.+)@#U', $condition, $matches);\r
+                       foreach ($matches[1] as $plug) {\r
+                               if (defined('_DIR_PLUGIN_'.strtoupper($plug)))\r
+                                       $condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);\r
+                               else\r
+                                       $condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);\r
+                       }\r
+                       // On gère le cas @config:plugin:meta@ suivi d'un test\r
+                       preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);\r
+                       foreach ($matches[1] as $plugin) {\r
+                               $config = lire_config($plugin);\r
+                               $condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);\r
+                       }\r
+                       // On transforme en une condition valide\r
+                       if (is_null($env))\r
+                               $condition = preg_replace('#@(.+)@#U', '_request(\'$1\')', $condition);\r
+                       else\r
+                               $condition = preg_replace('#@(.+)@#U', '$env["valeurs"][\'$1\']', $condition);\r
+                       eval('$ok = '.$condition.';');\r
+                       if (!$ok) {\r
+                               unset($saisies[$cle]);\r
+                               if (is_null($env)) set_request($saisie['options']['nom'],NULL);\r
+                       }\r
+               }\r
+               if (isset($saisies[$cle]['saisies'])) // S'il s'agit d'un fieldset ou equivalent, verifier les sous-saisies\r
+                       $saisies[$cle]['saisies'] = saisies_verifier_afficher_si($saisies[$cle]['saisies'], $env);\r
+       }\r
+       return $saisies;\r
+}\r
+\r
+?>\r
diff --git a/www/plugins/saisies/inc/saisies_lister.php b/www/plugins/saisies/inc/saisies_lister.php
new file mode 100644 (file)
index 0000000..f924bd1
--- /dev/null
@@ -0,0 +1,321 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+/*
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * les saisies "à plat" classées par identifiant unique.
+ *
+ * @param array $contenu Le contenu d'un formulaire
+ * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldsets
+ * @return array Un tableau avec uniquement les saisies
+ */
+function saisies_lister_par_identifiant($contenu, $avec_conteneur=true){
+       $saisies = array();
+       
+       if (is_array($contenu)){
+               foreach ($contenu as $ligne){
+                       if (is_array($ligne)) {
+                               $enfants_presents = (isset($ligne['saisies']) and is_array($ligne['saisies']));
+                               if (array_key_exists('saisie', $ligne) and (!$enfants_presents or $avec_conteneur)){
+                                       $saisies[$ligne['identifiant']] = $ligne;
+                               }
+                               if ($enfants_presents) {
+                                       $saisies = array_merge($saisies, saisies_lister_par_identifiant($ligne['saisies']));
+                               }
+                       }
+               }
+       }
+       
+       return $saisies;
+}
+
+/*
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * les saisies "à plat" classées par nom.
+ *
+ * @param array $contenu Le contenu d'un formulaire
+ * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
+ * @return array Un tableau avec uniquement les saisies
+ */
+function saisies_lister_par_nom($contenu, $avec_conteneur=true){
+       $saisies = array();
+       
+       if (is_array($contenu)){
+               foreach ($contenu as $ligne){
+                       if (is_array($ligne)){
+                               if (array_key_exists('saisie', $ligne) and (!isset($ligne['saisies']) OR !is_array($ligne['saisies']) or $avec_conteneur)){
+                                       $saisies[$ligne['options']['nom']] = $ligne;
+                               }
+                               if (isset($ligne['saisies']) AND is_array($ligne['saisies'])){
+                                       $saisies = array_merge($saisies, saisies_lister_par_nom($ligne['saisies']));
+                               }
+                       }
+               }
+       }
+       
+       return $saisies;
+}
+
+/*
+ * Liste les saisies ayant une option X
+ * # saisies_lister_avec_option('sql', $saisies);
+ *  
+ *
+ * @param String $option Nom de l'option cherchée
+ * @param Array $saisies Liste de saisies
+ * @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
+ * @return liste de ces saisies triees par nom ayant une option X définie
+ */
+function saisies_lister_avec_option($option, $saisies, $tri = 'nom') {
+       $saisies_option = array();
+       // tri par nom si ce n'est pas le cas
+       $s = array_keys($saisies);
+       if (is_int(array_shift($s))) {
+               $trier = 'saisies_lister_par_' . $tri;
+               $saisies = $trier($saisies);
+       }
+       foreach ($saisies as $nom_ou_id => $saisie) {
+               if (isset($saisie['options'][$option]) and $saisie['options'][$option]) {
+                       $saisies_option[$nom_ou_id] = $saisie;
+               }
+       }
+
+       return $saisies_option;
+}
+
+/*
+ * Liste les saisies ayant une definition SQL
+ *
+ * @param Array $saisies liste de saisies
+ * @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
+ * @return liste de ces saisies triees par nom ayant une option sql définie
+ */
+function saisies_lister_avec_sql($saisies, $tri = 'nom') {
+       return saisies_lister_avec_option('sql', $saisies, $tri);
+}
+
+/*
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * les saisies "à plat" classées par type de saisie.
+ * $saisie['input']['input_1'] = $saisie
+ *
+ * @param array $contenu Le contenu d'un formulaire
+ * @return array Un tableau avec uniquement les saisies
+ */
+function saisies_lister_par_type($contenu) {
+       $saisies = array();
+       
+       if (is_array($contenu)){
+               foreach ($contenu as $ligne){
+                       if (is_array($ligne)){
+                               if (array_key_exists('saisie', $ligne) and (!is_array($ligne['saisies']))){
+                                       $saisies[ $ligne['saisie'] ][ $ligne['options']['nom'] ] = $ligne;
+                               }
+                               if (is_array($ligne['saisies'])){
+                                       $saisies = array_merge($saisies, saisies_lister_par_type($ligne['saisies']));
+                               }
+                       }
+               }
+       }
+       
+       return $saisies;
+}
+
+/*
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * une liste des noms des champs du formulaire.
+ *
+ * @param array $contenu Le contenu d'un formulaire
+ * @return array Un tableau listant les noms des champs
+ */
+function saisies_lister_champs($contenu, $avec_conteneur=true){
+       $saisies = saisies_lister_par_nom($contenu, $avec_conteneur);
+       return array_keys($saisies);
+}
+
+/*
+ * A utiliser dans une fonction charger d'un formulaire CVT,
+ * cette fonction renvoie le tableau de contexte correspondant
+ * de la forme $contexte['nom_champ'] = ''
+ *
+ * @param array $contenu Le contenu d'un formulaire (un tableau de saisies)
+ * @return array Un tableau de contexte
+ */
+function saisies_charger_champs($contenu) {
+       // array_fill_keys est disponible uniquement avec PHP >= 5.2.0
+       // return array_fill_keys(saisies_lister_champs($contenu, false), '');
+       $champs = array();
+       foreach (saisies_lister_champs($contenu, false) as $champ)
+               $champs[$champ] = '';
+       return $champs;
+}
+
+/*
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * une liste des valeurs par défaut des champs du formulaire.
+ *
+ * @param array $contenu Le contenu d'un formulaire
+ * @return array Un tableau renvoyant la valeur par défaut de chaque champs
+ */
+function saisies_lister_valeurs_defaut($contenu){
+       $contenu = saisies_lister_par_nom($contenu, false);
+       $defauts = array();
+       foreach ($contenu as $nom => $saisie){
+               // Si le nom du champ est un tableau indexé, il faut parser !
+               if (preg_match('/([\w]+)((\[[\w]+\])+)/', $nom, $separe)){
+                       $nom = $separe[1];
+                       // Dans ce cas on ne récupère que le nom, la valeur par défaut du tableau devra être renseigné autre part
+                       $defauts[$nom] = array();
+               }
+               else{
+                       $defauts[$nom] = isset($saisie['options']['defaut']) ? $saisie['options']['defaut'] : '';
+               }
+       }
+       return $defauts;
+}
+
+/*
+ * Compare deux tableaux de saisies pour connaitre les différences
+ * @param array $saisies_anciennes Un tableau décrivant des saisies
+ * @param array $saisies_nouvelles Un autre tableau décrivant des saisies
+ * @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
+ * @param string $tri Comparer selon quel tri ? 'nom' / 'identifiant'
+ * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
+ */
+function saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true, $tri = 'nom') {
+       $trier = "saisies_lister_par_$tri";
+       $saisies_anciennes = $trier($saisies_anciennes, $avec_conteneur);
+       $saisies_nouvelles = $trier($saisies_nouvelles, $avec_conteneur);
+       
+       // Les saisies supprimées sont celles qui restent dans les anciennes quand on a enlevé toutes les nouvelles
+       $saisies_supprimees = array_diff_key($saisies_anciennes, $saisies_nouvelles);
+       // Les saisies ajoutées, c'est le contraire
+       $saisies_ajoutees = array_diff_key($saisies_nouvelles, $saisies_anciennes);
+       // Il reste alors les saisies qui ont le même nom
+       $saisies_restantes = array_intersect_key($saisies_anciennes, $saisies_nouvelles);
+       // Dans celles-ci, celles qui sont modifiées sont celles dont la valeurs est différentes
+       $saisies_modifiees = array_udiff(array_diff_key($saisies_nouvelles, $saisies_ajoutees), $saisies_restantes, 'saisies_comparer_rappel');
+       #$saisies_modifiees = array_udiff($saisies_nouvelles, $saisies_restantes, 'saisies_comparer_rappel');
+       // Et enfin les saisies qui ont le même nom et la même valeur
+       $saisies_identiques = array_diff_key($saisies_restantes, $saisies_modifiees);
+       
+       return array(
+               'supprimees' => $saisies_supprimees,
+               'ajoutees' => $saisies_ajoutees,
+               'modifiees' => $saisies_modifiees,
+               'identiques' => $saisies_identiques
+       );
+}
+
+/*
+ * Compare deux saisies et indique si elles sont égales ou pas
+ */
+function saisies_comparer_rappel($a, $b){
+       if ($a === $b) return 0;
+       else return 1;
+}
+
+/*
+ * Compare deux tableaux de saisies pour connaitre les différences
+ * en s'appuyant sur les identifiants de saisies
+ *
+ * @see saisies_comparer()
+ * @param array $saisies_anciennes Un tableau décrivant des saisies
+ * @param array $saisies_nouvelles Un autre tableau décrivant des saisies
+ * @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
+ * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
+ */
+function saisies_comparer_par_identifiant($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true) {
+       return saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur, $tri = 'identifiant');
+}
+
+/*
+ * Liste toutes les saisies configurables (ayant une description)
+ *
+ * @return array Un tableau listant des saisies et leurs options
+ */
+function saisies_lister_disponibles(){
+       static $saisies = null;
+       
+       if (is_null($saisies)){
+               $saisies = array();
+               $liste = find_all_in_path('saisies/', '.+[.]yaml$');
+               
+               if (count($liste)){
+                       foreach ($liste as $fichier=>$chemin){
+                               $type_saisie = preg_replace(',[.]yaml$,i', '', $fichier);
+                               $dossier = str_replace($fichier, '', $chemin);
+                               // On ne garde que les saisies qui ont bien le HTML avec !
+                               if (file_exists("$dossier$type_saisie.html")
+                                       and (
+                                               is_array($saisie = saisies_charger_infos($type_saisie))
+                                       )
+                               ){
+                                       $saisies[$type_saisie] = $saisie;
+                               }
+                       }
+               }
+       }
+       
+       return $saisies;
+}
+
+/*
+ * Lister les saisies existantes ayant une définition SQL 
+ *
+ * @return array Un tableau listant des saisies et leurs options
+ */
+function saisies_lister_disponibles_sql() {
+       $saisies = array();
+       $saisies_disponibles = saisies_lister_disponibles();
+       foreach ($saisies_disponibles as $type=>$saisie) {
+               if (isset($saisie['defaut']['options']['sql']) and $saisie['defaut']['options']['sql']) {
+                       $saisies[$type] = $saisie;
+               }
+       }
+       return $saisies;
+}
+
+/*
+ * Charger les informations contenues dans le YAML d'une saisie
+ *
+ * @param string $type_saisie Le type de la saisie
+ * @return array Un tableau contenant le YAML décodé
+ */
+function saisies_charger_infos($type_saisie){
+       include_spip('inc/yaml');
+       $fichier = find_in_path("saisies/$type_saisie.yaml");
+       $saisie = yaml_decode_file($fichier);
+       if (is_array($saisie)){
+               $saisie['titre'] = (isset($saisie['titre']) AND $saisie['titre'])
+                       ? _T_ou_typo($saisie['titre']) : $type_saisie;
+               $saisie['description'] = (isset($saisie['description']) AND $saisie['description'])
+                       ? _T_ou_typo($saisie['description']) : '';
+               $saisie['icone'] = (isset($saisie['icone']) AND $saisie['icone'])
+                       ? find_in_path($saisie['icone']) : '';
+       }
+       return $saisie;
+}
+
+/*
+ * Quelles sont les saisies qui se débrouillent toutes seules, sans le _base commun
+ *
+ * @return array Retourne un tableau contenant les types de saisies qui ne doivent pas utiliser le _base.html commun
+ */
+function saisies_autonomes(){
+       $saisies_autonomes = pipeline(
+               'saisies_autonomes',
+               array(
+                       'fieldset',
+                       'hidden',
+                       'destinataires', 
+                       'explication'
+               )
+       );
+       
+       return $saisies_autonomes;
+}
+
+?>
diff --git a/www/plugins/saisies/inc/saisies_manipuler.php b/www/plugins/saisies/inc/saisies_manipuler.php
new file mode 100644 (file)
index 0000000..9ccffda
--- /dev/null
@@ -0,0 +1,303 @@
+<?php
+
+/**
+ * Gestion de l'affichage des saisies
+ *
+ * @return SPIP\Saisies\Manipuler
+**/
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+/**
+ * Supprimer une saisie dont on donne l'identifiant, le nom ou le chemin
+ *
+ * @param array $saisies
+ *     Tableau des descriptions de saisies
+ * @param string|array $id_ou_nom_ou_chemin
+ *     L'identifiant unique
+ *     ou le nom de la saisie à supprimer
+ *     ou son chemin sous forme d'une liste de clés
+ * @return array
+ *     Tableau modifié décrivant les saisies
+ */
+function saisies_supprimer($saisies, $id_ou_nom_ou_chemin){
+       // Si la saisie n'existe pas, on ne fait rien
+       if ($chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true)){
+               // La position finale de la saisie
+               $position = array_pop($chemin);
+       
+               // On va chercher le parent par référence pour pouvoir le modifier
+               $parent =& $saisies;
+               foreach($chemin as $cle){
+                       $parent =& $parent[$cle];
+               }
+               
+               // On supprime et réordonne
+               unset($parent[$position]);
+               $parent = array_values($parent);
+       }
+       
+       return $saisies;
+}
+
+/**
+ * Insère une saisie à une position donnée
+ *
+ * @param array $saisies
+ *     Tableau des descriptions de saisies
+ * @param array $saisie
+ *     Description de la saisie à insérer
+ * @param array $chemin
+ *     Position complète où insérer la saisie.
+ *     En absence, insère la saisie à la fin.
+ * @return array
+ *     Tableau des saisies complété de la saisie insérée
+ */
+function saisies_inserer($saisies, $saisie, $chemin=array()){
+       // On vérifie quand même que ce qu'on veut insérer est correct
+       if ($saisie['saisie'] and $saisie['options']['nom']){
+               // ajouter un identifiant
+               $saisie = saisie_identifier($saisie);
+               
+               // Par défaut le parent c'est la racine
+               $parent =& $saisies;
+               // S'il n'y a pas de position, on va insérer à la fin du formulaire
+               if (!$chemin){
+                       $position = count($parent);
+               }
+               elseif (is_array($chemin)){
+                       $position = array_pop($chemin);
+                       foreach ($chemin as $cle){
+                               // Si la clé est un conteneur de saisies "saisies" et qu'elle n'existe pas encore, on la crée
+                               if ($cle == 'saisies' and !isset($parent[$cle]))
+                                       $parent[$cle] = array();
+                               $parent =& $parent[$cle];
+                       }
+                       // On vérifie maintenant que la position est cohérente avec le parent
+                       if ($position < 0) $position = 0;
+                       elseif ($position > count($parent)) $position = count($parent);
+               }
+               // Et enfin on insère
+               array_splice($parent, $position, 0, array($saisie));
+       }
+       
+       return $saisies;
+}
+
+/*
+ * Duplique une saisie (ou groupe de saisies)
+ * en placant la copie à la suite de la saisie d'origine.
+ * Modifie automatiquement les identifiants des saisies
+ *
+ * @param array $saisies Un tableau décrivant les saisies
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie a dupliquer
+ * @return array Retourne le tableau modifié des saisies
+ */
+function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin){
+       // On récupère le contenu de la saisie à déplacer
+       $saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
+       if ($saisie) {
+               list($clone) = saisies_transformer_noms_auto($saisies, array($saisie));
+               // insertion apres quoi ?
+               $chemin_validation = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
+               // 1 de plus pour mettre APRES le champ trouve
+               $chemin_validation[count($chemin_validation)-1]++;
+               // On ajoute "copie" après le label du champs
+               $clone['options']['label'] .= ' '._T('saisies:construire_action_dupliquer_copie');
+
+               // Création de nouveau identifiants pour le clone
+               $clone = saisie_identifier($clone, true);
+               
+               $saisies = saisies_inserer($saisies, $clone, $chemin_validation);
+       }
+
+       return $saisies;
+}
+
+/*
+ * Déplace une saisie existante autre part
+ *
+ * @param array $saisies Un tableau décrivant les saisies
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à déplacer
+ * @param string $ou Le nom de la saisie devant laquelle on déplacera OU le nom d'un conteneur entre crochets [conteneur]
+ * @return array Retourne le tableau modifié des saisies
+ */
+function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou){
+       // On récupère le contenu de la saisie à déplacer
+       $saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
+
+       // Si on l'a bien trouvé
+       if ($saisie){
+               // On cherche l'endroit où la déplacer
+               // Si $ou est vide, c'est à la fin de la racine
+               if (!$ou){
+                       $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
+                       $chemin = array(count($saisies));
+               }
+               // Si l'endroit est entre crochet, c'est un conteneur
+               elseif (preg_match('/^\[(@?[\w]*)\]$/', $ou, $match)){
+                       $parent = $match[1];
+                       // Si dans les crochets il n'y a rien, on met à la fin du formulaire
+                       if (!$parent){
+                               $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
+                               $chemin = array(count($saisies));
+                       }
+                       // Sinon on vérifie que ce conteneur existe
+                       elseif (saisies_chercher($saisies, $parent, true)){
+                               // S'il existe on supprime la saisie et on recherche la nouvelle position
+                               $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
+                               $parent = saisies_chercher($saisies, $parent, true);
+                               $chemin = array_merge($parent, array('saisies', 1000000));
+                       }
+                       else
+                               $chemin = false;
+               }
+               // Sinon ça sera devant un champ
+               else{
+                       // On vérifie que le champ existe
+                       if (saisies_chercher($saisies, $ou, true)){
+                               // S'il existe on supprime la saisie
+                               $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
+                               // Et on recherche la nouvelle position qui n'est plus forcément la même maintenant qu'on a supprimé une saisie
+                               $chemin = saisies_chercher($saisies, $ou, true);
+                       }
+                       else
+                               $chemin = false;
+               }
+               
+               // Si seulement on a bien trouvé un nouvel endroit où la placer, alors on déplace
+               if ($chemin)
+                       $saisies = saisies_inserer($saisies, $saisie, $chemin);
+       }
+       
+       return $saisies;
+}
+
+/*
+ * Modifie une saisie
+ *
+ * @param array $saisies Un tableau décrivant les saisies
+ * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à modifier
+ * @param array $modifs Le tableau des modifications à apporter à la saisie
+ * @return Retourne le tableau décrivant les saisies, mais modifié
+ */
+function saisies_modifier($saisies, $id_ou_nom_ou_chemin, $modifs){
+       $chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
+       $position = array_pop($chemin);
+       $parent =& $saisies;
+       foreach ($chemin as $cle){
+               $parent =& $parent[$cle];
+       }
+       
+       // On récupère le type tel quel
+       $modifs['saisie'] = $parent[$position]['saisie'];
+       // On récupère le nom s'il n'y est pas
+       if (!isset($modifs['options']['nom'])){
+               $modifs['options']['nom'] = $parent[$position]['options']['nom'];
+       }
+       // On récupère les enfants tels quels s'il n'y a pas des enfants dans la modif
+       if (
+               !isset($modifs['saisies'])
+               and isset($parent[$position]['saisies'])
+               and is_array($parent[$position]['saisies'])
+       ){
+               $modifs['saisies'] = $parent[$position]['saisies'];
+       }
+
+       // Si une option 'nouveau_type_saisie' est donnee, c'est que l'on souhaite
+       // peut être changer le type de saisie !
+       if (isset($modifs['options']['nouveau_type_saisie']) and $type = $modifs['options']['nouveau_type_saisie']) {
+               $modifs['saisie'] = $type;
+               unset($modifs['options']['nouveau_type_saisie']);
+       }
+                       
+       // On remplace tout
+       $parent[$position] = $modifs;
+       
+       // Cette méthode ne marche pas trop
+       //$parent[$position] = array_replace_recursive($parent[$position], $modifs);
+       
+       return $saisies;
+}
+
+/**
+ * Transforme tous les noms du formulaire avec un preg_replace
+ *
+ * @param array $saisies
+ *     Un tableau décrivant les saisies
+ * @param string $masque
+ *     Ce que l'on doit chercher dans le nom
+ * @param string $remplacement
+ *     Ce par quoi on doit remplacer
+ * @return array
+ *     Retourne le tableau modifié des saisies
+ */
+function saisies_transformer_noms($saisies, $masque, $remplacement){
+       if (is_array($saisies)){
+               foreach ($saisies as $cle => $saisie){
+                       $saisies[$cle]['options']['nom'] = preg_replace($masque, $remplacement, $saisie['options']['nom']);
+                       if (isset($saisie['saisies']) and is_array($saisie['saisies'])) {
+                               $saisies[$cle]['saisies'] = saisies_transformer_noms($saisie['saisies'], $masque, $remplacement);
+                       }
+               }
+       }
+       
+       return $saisies;
+}
+
+/**
+ * Transforme les noms d'une liste de saisies pour qu'ils soient
+ * uniques dans le formulaire donné.
+ *
+ * @param array $formulaire
+ *     Le formulaire à analyser 
+ * @param array $saisies
+ *     Un tableau décrivant les saisies.
+ * @return array
+ *     Retourne le tableau modifié des saisies
+ */
+function saisies_transformer_noms_auto($formulaire, $saisies){
+
+       if (is_array($saisies)){
+               foreach ($saisies as $cle => $saisie){
+                       $saisies[$cle]['options']['nom'] = saisies_generer_nom($formulaire, $saisie['saisie']);
+                       // il faut prendre en compte dans $formulaire les saisies modifiees
+                       // sinon on aurait potentiellement 2 champs successifs avec le meme nom.
+                       // on n'ajoute pas les saisies dont les noms ne sont pas encore calculees.
+                       $new = $saisies[$cle];
+                       unset($new['saisies']);
+                       $formulaire[] = $new;
+                       
+                       if (is_array($saisie['saisies']))
+                               $saisies[$cle]['saisies'] = saisies_transformer_noms_auto($formulaire, $saisie['saisies']);
+               }
+       }
+
+       return $saisies;
+}
+
+/*
+ * Insère du HTML au début ou à la fin d'une saisie
+ *
+ * @param array $saisie La description d'une seule saisie
+ * @param string $insertion Du code HTML à insérer dans la saisie 
+ * @param string $ou L'endroit où insérer le HTML : "debut" ou "fin"
+ * @return array Retourne la description de la saisie modifiée
+ */
+function saisies_inserer_html($saisie, $insertion, $ou='fin'){
+       if (!in_array($ou, array('debut', 'fin')))
+               $ou = 'fin';
+       
+       if ($ou == 'debut') {
+               $saisie['options']['inserer_debut'] =
+                       $insertion . (isset($saisie['options']['inserer_debut']) ? $saisie['options']['inserer_debut'] : '');
+       } elseif ($ou == 'fin') {
+               $saisie['options']['inserer_fin'] =
+                       (isset($saisie['options']['inserer_fin']) ? $saisie['options']['inserer_fin'] : '') . $insertion;
+       }
+       
+       return $saisie;
+}
+
+?>
diff --git a/www/plugins/saisies/inclure/configurer_saisie.html b/www/plugins/saisies/inclure/configurer_saisie.html
new file mode 100644 (file)
index 0000000..70991bb
--- /dev/null
@@ -0,0 +1,19 @@
+[(#REM) 
+  
+  ### /!\ necessite le plugin YAML ###
+  
+  Genere l'intérieur d'un formulaire permettant de configurer une saisie.
+  
+  Par defaut, ne permet pas de configurer le "name" de la saisie car dans la
+  plupart des cas c'est une valeur qui sera automatique. On utilise le parametre
+  "avec_nom=oui" pour forcer le champ.
+  
+  Exemples d'appels :
+    #INCLURE{fond=inclure/configurer_saisie, env, saisie=input}
+    #INCLURE{fond=inclure/configurer_saisie, env, saisie=input, avec_nom=oui}
+
+]
+
+[(#SET{config, #ENV{saisie}|construire_configuration_saisie{#ENV{avec_nom}}})]
+
+#GENERER_SAISIES{#GET{config}}
diff --git a/www/plugins/saisies/inclure/configurer_saisie_fonctions.php b/www/plugins/saisies/inclure/configurer_saisie_fonctions.php
new file mode 100644 (file)
index 0000000..5285b93
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function construire_configuration_saisie($saisie, $avec_nom='non'){
+       include_spip('inc/yaml');
+       $configuration_saisie = yaml_decode_file(find_in_path('saisies/'.$saisie.'.yaml'));
+       
+       if (is_array($configuration_saisie)){
+               $configuration_saisie = $configuration_saisie['options'];
+               // On ne met le premier champ permettant de configurer le "name" seulement si on le demande explicitement
+               if ($avec_nom == 'oui')
+                       array_unshift($configuration_saisie[0]['contenu'],
+                               array(
+                                       'saisie' => 'input',
+                                       'options' => array(
+                                               'nom' => 'nom',
+                                               'label' => '<:saisies:option_nom_label:>',
+                                               'explication' => '<:saisies:option_nom_explication:>',
+                                               'obligatoire' => 'oui'
+                                       ),
+                                       'verifier' => array(
+                                               'type' => 'regex',
+                                               'options' => array(
+                                                       'modele' => '/^[\w]+$/'
+                                               )
+                                       )
+                               )
+                       );
+       }
+       else
+               $configuration_saisie = array();
+       
+       return $configuration_saisie;
+}
+
+?>
diff --git a/www/plugins/saisies/inclure/generer_saisies.html b/www/plugins/saisies/inclure/generer_saisies.html
new file mode 100644 (file)
index 0000000..5380e0f
--- /dev/null
@@ -0,0 +1,46 @@
+[(#REM) 
+  
+  ### /!\ boucle POUR (spip Bonux) ###
+  
+  Génère le contenu (l'intérieur) d'un formulaire, à partir d'une description dans un tableau PHP.
+  Le tableau doit être de la forme suivante :
+  
+  // Chaque ligne est elle-même un tableau
+  array(
+       // Ligne de type "explication"
+       array(
+               'explication' => 'Ceci est un bloc d'explication général.'
+       ),
+       // Ligne classique, cad un champ de formulaire
+       array(
+               'saisie' => 'input',
+               'options => array(
+                       'nom' => 'mon_champ',
+                       'label' => 'Un joli titre',
+                       'obligatoire' => 'oui'
+               )
+       ),
+       // Ligne contenant un fieldset
+       array(
+               'groupe' => 'Ceci est le titre du groupe de champs (fieldset)',
+               'css' => 'eventuelles classes css',
+               'contenu' => array(
+                       // On recommence ici suivant le même formalisme que le tableau général.
+               )
+       )
+  )
+  
+  
+  Exemples d'appels :
+    # INCLURE{fond=inclure/generer_saisies, env, saisies=#ENV{tableau}}
+
+]
+
+<BOUCLE_contenu(POUR){tableau #ENV{saisies}}>
+[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
+[(#VALEUR**|saisies_generer_html{#ENV{_env}|sinon{#ENV**|unserialize}})]
+]
+</BOUCLE_contenu>
+
+[(#REM) Ajout du script js pour l'option si des saisies ]
+[(#ENV{from_fieldset}|non|et{#ENV{saisies}|saisies_afficher_si}) #INCLURE{fond=inclure/js_afficher_si,env}]
diff --git a/www/plugins/saisies/inclure/js_afficher_si.html b/www/plugins/saisies/inclure/js_afficher_si.html
new file mode 100644 (file)
index 0000000..6866cbe
--- /dev/null
@@ -0,0 +1,7 @@
+[(#REM) Ajout d'un marqueur unique pour identifier le formulaire]\r
+[(#SET{id_unique,#EVAL{'rand();'}})]\r
+<li id="afficher_si_#GET{id_unique}" style="display:none;" >\r
+<script type="text/javascript">// <![CDATA[\r
+[(#ENV**{saisies}|saisies_generer_js_afficher_si{#GET{id_unique}})]\r
+ //]]></script>\r
+ </li>
\ No newline at end of file
diff --git a/www/plugins/saisies/inclure/saisies_aide.html b/www/plugins/saisies/inclure/saisies_aide.html
new file mode 100644 (file)
index 0000000..4f3363b
--- /dev/null
@@ -0,0 +1,65 @@
+
+Sauter à : <a href="#liste_saisies">Toutes les saisies</a>, <a href="#liste_options_saisies">Toutes les options</a>
+
+<h2 class="h2 spip">Utilisation des options</h2>
+<B_options_tableau>
+<div style="overflow:auto;">
+<table class="spip">
+<thead>
+       <tr class="first_row">
+               <th>Options \ Saisies</th>
+               <BOUCLE_saisies_tableau_th(POUR){tableau #ENV{saisies}}>
+               <th><a href="#saisie_#CLE">#CLE</a></th>
+               </BOUCLE_saisies_tableau_th>
+       </tr>
+</thead>
+<tbody>
+       <BOUCLE_options_tableau(POUR){tableau #ENV{options}}>
+       <tr class="tr_liste [(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
+               <th><a href="#option_#CLE">#CLE</a></th>
+               <BOUCLE_saisies_tableau(POUR){tableau #ENV{saisies}}>
+               <td>[(#CLE|in_array{[(#_options_tableau:VALEUR|table_valeur{utilisee_par})]}|?{'X','-'})]</td>
+               </BOUCLE_saisies_tableau>
+       </tr>
+       </BOUCLE_options_tableau>
+</tbody>
+</table>
+</div>
+</B_options_tableau>
+
+<h2 class="h2 spip" id="liste_saisies">Toutes les saisies</h2>
+<BOUCLE_saisies(POUR){tableau #ENV{saisies}}>
+<h3 class="h3 spip" id="saisie_#CLE">[(#VALEUR|table_valeur{titre})] (#CLE)</h3>
+<p class="description">
+       <strong>Description :</strong> [(#VALEUR|table_valeur{description})]
+</p>
+<p class="options">
+       <strong>Options :</strong>
+       <BOUCLE_options_saisie(POUR){tableau #VALEUR|table_valeur{options}}{", "}><a href="#option_#CLE">#CLE</a></BOUCLE_options_saisie>
+</p>
+</BOUCLE_saisies>
+
+<h2 class="h2 spip" id="liste_options_saisies">Toutes les options</h2>
+<BOUCLE_options(POUR){tableau #ENV{options}}>
+[(#SET{label, [(#VALEUR|table_valeur{label}|sinon{[(#VALEUR|table_valeur{label_case})]})]})]
+<h3 class="h3 spip" id="option_#CLE">[(#GET{label}|?{#GET{label} [ ((#CLE))], #CLE})]</h3>
+[<p class="description">
+       <strong>Description :</strong> (#VALEUR|table_valeur{explication}|sinon{[(#VALEUR|table_valeur{label}|?{[(#VALEUR|table_valeur{label_case})]})]})
+</p>]
+<B_utilisee_par>
+<p class="utilisee_par">
+       <strong>Utilisée par :</strong>
+       <BOUCLE_utilisee_par(POUR){tableau #VALEUR|table_valeur{utilisee_par}}{", "}><a href="#saisie_#VALEUR">#VALEUR</a></BOUCLE_utilisee_par>
+</p>
+</B_utilisee_par>
+<B_choix>
+<p class="choix_possibles">
+       <strong>Choix possibles :</strong>
+       <ul class="spip">
+               <BOUCLE_choix(POUR){tableau #VALEUR|table_valeur{datas}}>
+               <li>"#CLE" : #VALEUR</li>
+               </BOUCLE_choix>
+       </ul>
+</p>
+</B_choix>
+</BOUCLE_options>
diff --git a/www/plugins/saisies/inclure/voir_saisies.html b/www/plugins/saisies/inclure/voir_saisies.html
new file mode 100644 (file)
index 0000000..7a77eee
--- /dev/null
@@ -0,0 +1,7 @@
+[(#REM) S'il y a des options afficher_si, il faut vérifier que les conditions sont remplies ]
+[(#SET{saisies,#ENV{saisies}|saisies_verifier_afficher_si{#ENV**|unserialize}})]
+<BOUCLE_saisies(POUR){tableau #GET{saisies}}>
+[(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
+       [(#VALEUR|saisies_generer_vue{#ENV{_env}|sinon{#ENV**|unserialize}})]
+]
+</BOUCLE_saisies>
diff --git a/www/plugins/saisies/javascript/saisies.js b/www/plugins/saisies/javascript/saisies.js
new file mode 100644 (file)
index 0000000..4a588ee
--- /dev/null
@@ -0,0 +1,31 @@
+$(function(){
+       saisies_fieldset_pliable();
+       onAjaxLoad(saisies_fieldset_pliable);
+});
+
+function saisies_fieldset_pliable(){
+       // On cherche les groupes de champs pliables
+       $('li.fieldset.pliable')
+               .each(function(){
+                       var li = $(this);
+                       var ul = $(this).find('> fieldset > ul');
+                       var legend = $(this).find('> fieldset > .legend');
+                       
+                       // S'il est déjà plié on cache le contenu
+                       if (li.is('.plie'))
+                               ul.hide();
+                       
+                       // Ensuite on ajoute une action sur le titre
+                       legend
+                               .unbind('click')
+                               .click(
+                                       function(){
+                                               li.toggleClass('plie');
+                                               if (ul.is(':hidden'))
+                                                       ul.show();
+                                               else
+                                                       ul.hide();
+                                       }
+                               );
+               });
+};
diff --git a/www/plugins/saisies/lang/paquet-saisies.xml b/www/plugins/saisies/lang/paquet-saisies.xml
new file mode 100644 (file)
index 0000000..48b9aa8
--- /dev/null
@@ -0,0 +1,16 @@
+<traduction module="paquet-saisies" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/saisies/lang/" reference="fr">
+       <langue code="de" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=de">
+               <traducteur nom="klaus++" lien="http://trad.spip.net/auteur/klaus" />
+       </langue>
+       <langue code="en" />
+       <langue code="es" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fr" />
+       <langue code="ru" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ru">
+               <traducteur nom="Serge Markitanenko" lien="http://trad.spip.net/auteur/serge-markitanenko" />
+       </langue>
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/saisies/lang/paquet-saisies_de.php b/www/plugins/saisies/lang/paquet-saisies_de.php
new file mode 100644 (file)
index 0000000..4fb90f5
--- /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-saisies?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'Dieses Plugin erleichtert die Erstellung von Eingabefeldern für Formulare und bietet einen Tag #SAISIE. Das erzeugte HTML ist mit der Nomenklatur der von SPIP > 2.0 und dem Plugin CFG kompatibel.',
+       'saisies_nom' => 'Eingabefelder für Formulare',
+       'saisies_slogan' => 'Unkompliziertes Erstellen von Eingabefeldern für Formulare.',
+       'saisies_titre' => 'Eingabefelder für Formulare'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/paquet-saisies_en.php b/www/plugins/saisies/lang/paquet-saisies_en.php
new file mode 100644 (file)
index 0000000..ac252f3
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'This plugin makes it easier to write form fields by providing a #SAISIE tag. 
+               The generated HTML is compatible with the classification of forms
+               proposed by SPIP > 2.0 and with the configuration plugin CFG.',
+       'saisies_nom' => 'Entries for forms',
+       'saisies_slogan' => 'Create easily forms fields.',
+       'saisies_titre' => 'Entries for forms'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/paquet-saisies_es.php b/www/plugins/saisies/lang/paquet-saisies_es.php
new file mode 100644 (file)
index 0000000..eb06ed8
--- /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-saisies?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'Este plugin permite facilitar la redacción de campos de formularios proponiendo una etiqueta #SAISIE. El HTML generado es compatible con la nomenclatura de los formularios propuestos por SPIP > 2.0 y con el plugin de configuración CFG.',
+       'saisies_nom' => 'Entradas para formularios',
+       'saisies_slogan' => 'Escribir fácilmente los campos de formularios.',
+       'saisies_titre' => 'Entradas para formularios'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/paquet-saisies_fr.php b/www/plugins/saisies/lang/paquet-saisies_fr.php
new file mode 100644 (file)
index 0000000..2edcbf9
--- /dev/null
@@ -0,0 +1,17 @@
+<?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_/saisies/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'Ce plugin permet de faciliter l\'écriture de champs de formulaires en proposant une
+               balise #SAISIE. Le HTML généré est compatible avec la nomenclature des formulaires
+               proposée par SPIP > 2.0 et avec le plugin de configuration CFG.',
+       'saisies_nom' => 'Saisies pour formulaires',
+       'saisies_slogan' => 'Écrire facilement des champs de formulaires.',
+       'saisies_titre' => 'Saisies pour formulaires'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/paquet-saisies_ru.php b/www/plugins/saisies/lang/paquet-saisies_ru.php
new file mode 100644 (file)
index 0000000..1fc60c0
--- /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-saisies?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'Этот плагин облегчает работу по созданию форм. Вам предоставляется возможность создавать поля (input,textarea) в форме при помощи тега #SAISIE. Полученная форма полностью совместима со стандартом  SPIP 2.0+ и c плагином CFG.',
+       'saisies_nom' => 'Поля для форм (saises)',
+       'saisies_slogan' => 'Упрощение работы по созданию форм',
+       'saisies_titre' => 'Поля для форм (saises)'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/paquet-saisies_sk.php b/www/plugins/saisies/lang/paquet-saisies_sk.php
new file mode 100644 (file)
index 0000000..406bad6
--- /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-saisies?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'Tento zásuvný modul uľahčuje zápis polí formulára ponúknutím tagu #INPUT. Vytvorený kód HTML je kompatibilný s klasifikáciou formulárov, ktorú ponúka SPIP > 2.0 a so zásuvným modulom na konfiguráciu – CFG.',
+       'saisies_nom' => 'Vstupy pre formuláre',
+       'saisies_slogan' => 'Jednoduchý zápis polí formulárov.',
+       'saisies_titre' => 'Vstupy pre formuláre'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies.xml b/www/plugins/saisies/lang/saisies.xml
new file mode 100644 (file)
index 0000000..5fb936b
--- /dev/null
@@ -0,0 +1,28 @@
+<traduction module="saisies" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/saisies/lang/" reference="fr">
+       <langue code="ca" />
+       <langue code="de" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=de">
+               <traducteur nom="klaus++" lien="http://trad.spip.net/auteur/klaus" />
+       </langue>
+       <langue code="en" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=en">
+               <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
+               <traducteur nom="Paolo" lien="http://trad.spip.net/auteur/paolo" />
+       </langue>
+       <langue code="es" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fa" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=fa">
+               <traducteur nom="Davood Hossein" lien="http://trad.spip.net/auteur/davood-hossein" />
+       </langue>
+       <langue code="fr" />
+       <langue code="fr_tu" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=fr_tu">
+               <traducteur nom="beatnick" lien="http://trad.spip.net/auteur/beatnick" />
+       </langue>
+       <langue code="it" />
+       <langue code="ru" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=ru">
+               <traducteur nom="nazar" lien="http://trad.spip.net/auteur/nazar" />
+               <traducteur nom="Serge Markitanenko" lien="http://trad.spip.net/auteur/serge-markitanenko" />
+       </langue>
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/saisies/lang/saisies_ca.php b/www/plugins/saisies/lang/saisies_ca.php
new file mode 100644 (file)
index 0000000..9579db8
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=ca
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Fullejar l\'article',
+       'bouton_parcourir_docs_breve' => 'Fullejar la breu',
+       'bouton_parcourir_docs_rubrique' => 'Fullejar la secció',
+       'bouton_parcourir_mediatheque' => 'Fullejar la mediateca',
+
+       // C
+       'construire_action_annuler' => 'Annuler', # NEW
+       'construire_action_configurer' => 'Configurer', # NEW
+       'construire_action_deplacer' => 'Déplacer', # NEW
+       'construire_action_dupliquer' => 'Dupliquer', # NEW
+       'construire_action_dupliquer_copie' => '(copie)', # NEW
+       'construire_action_supprimer' => 'Supprimer', # NEW
+       'construire_ajouter_champ' => 'Ajouter un champ', # NEW
+       'construire_attention_enregistrer' => 'N\'oubliez pas d\'enregistrer vos modifications !', # NEW
+       'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.', # NEW
+       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l\'enregistrement de cette nouvelle version du formulaire.', # NEW
+       'construire_aucun_champs' => 'Il n\'y a pour l\'instant aucun champ dans ce formulaire.', # NEW
+       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?', # NEW
+       'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.', # NEW
+       'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.', # NEW
+       'construire_position_fin_formulaire' => 'À la fin du formulaire', # NEW
+       'construire_position_fin_groupe' => 'À la fin du groupe @groupe@', # NEW
+       'construire_position_label' => 'Position du champ', # NEW
+       'construire_reinitialiser' => 'Réinitialiser le formulaire', # NEW
+       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?', # NEW
+       'construire_verifications_aucune' => 'Aucune', # NEW
+       'construire_verifications_label' => 'Type de vérification à effectuer', # NEW
+
+       // E
+       'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies', # NEW
+       'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.', # NEW
+
+       // I
+       'info_configurer_saisies' => 'Page de test des Saisies', # NEW
+
+       // L
+       'label_annee' => 'Any',
+       'label_jour' => 'Dia',
+       'label_mois' => 'Mes',
+
+       // O
+       'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de l\'utilisateur', # NEW
+       'option_aff_art_interface_label' => 'Affichage multilingue', # NEW
+       'option_aff_langue_explication' => 'Affiche la langue de l\'article ou rubrique sélectionné devant le titre', # NEW
+       'option_aff_langue_label' => 'Afficher la langue', # NEW
+       'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de l\'utilisateur', # NEW
+       'option_aff_rub_interface_label' => 'Affichage multilingue', # NEW
+       'option_attention_explication' => 'Un missatge més important que l\'explicació.',
+       'option_attention_label' => 'Advertència',
+       'option_autocomplete_defaut' => 'Laisser par défaut', # NEW
+       'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique', # NEW
+       'option_autocomplete_label' => 'Pré-remplissage du champ', # NEW
+       'option_autocomplete_off' => 'Désactiver', # NEW
+       'option_autocomplete_on' => 'Activer', # NEW
+       'option_cacher_option_intro_label' => 'Amagar la primera elecció buida',
+       'option_choix_destinataires_explication' => 'Un o diversos autors, d\'entre els quals hi ha l\'usuari, podrà fer la seva tria. Si no hi ha res seleccionat, és l\'autor que ha instal·lat el lloc el que serà escollit.',
+       'option_choix_destinataires_label' => 'Possibles destinataris',
+       'option_class_label' => 'Classes CSS suplementàries',
+       'option_cols_explication' => 'Amplada del bloc en número de caràcters. Aquesta opció no s\'aplica sempre ja que els estils CSS del vostre lloc el poden anul·lar.', # MODIF
+       'option_cols_label' => 'Amplada',
+       'option_datas_explication' => 'Heu d\'especificar una opció per línia en la forma "cle|Label du choix"',
+       'option_datas_label' => 'Llista d\'eleccions possibles',
+       'option_defaut_label' => 'Valor per defecte',
+       'option_disable_avec_post_explication' => 'Idèntic que l\'opció anterior però tanmateix envia el valor dins d\'un camps amagat.',
+       'option_disable_avec_post_label' => 'Desactivar però enviar',
+       'option_disable_explication' => 'El camp no pot obtenir el focus.',
+       'option_disable_label' => 'Desactivar el camp',
+       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).', # NEW
+       'option_erreur_obligatoire_label' => 'Message d\'obligation', # NEW
+       'option_explication_explication' => 'Si és necessari, una frase curta descriu l\'objecte del camp.',
+       'option_explication_label' => 'Explicació',
+       'option_groupe_affichage' => 'Visualització',
+       'option_groupe_description' => 'Descripció',
+       'option_groupe_utilisation' => 'Utilització',
+       'option_groupe_validation' => 'Validació',
+       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
+       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
+       'option_horaire_label' => 'Horaire', # NEW
+       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
+       'option_info_obligatoire_explication' => 'Podeu, per defecte, modificar la indicació d\'obligació: <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'Indicació d\'obligació',
+       'option_inserer_barre_choix_edition' => 'barra d\'edició completa',
+       'option_inserer_barre_choix_forum' => 'barra dels fòrums',
+       'option_inserer_barre_explication' => 'Insereix una barra d\'eines del portaplomes si aquest està activat.',
+       'option_inserer_barre_label' => 'Inserir una barra d\'eines',
+       'option_label_case_label' => 'Etiqueta situada al costat de la casella',
+       'option_label_explication' => 'El títol que es mostrarà.',
+       'option_label_label' => 'Etiqueta',
+       'option_maxlength_explication' => 'L\'usuari no podrà escriure més caràcters que aquest nombre.',
+       'option_maxlength_label' => 'Número màxim de caràcters',
+       'option_multiple_explication' => 'L\'utilisateur pourra sélectionner plusieurs valeurs', # NEW
+       'option_multiple_label' => 'Sélection multiple', # NEW
+       'option_nom_explication' => 'Un nom informàtic que identificarà el camp. Ha de contenir només caràcters alfanumèrics minúsculs o el caràcter "_".', # MODIF
+       'option_nom_label' => 'Nom del camp',
+       'option_obligatoire_label' => 'Camp obligatori',
+       'option_option_intro_label' => 'Etiqueta de la primera elecció buida',
+       'option_option_statut_label' => 'Afficher les statuts', # NEW
+       'option_pliable_label' => 'Plegable',
+       'option_pliable_label_case' => 'El grup de camps es podrà replegar.',
+       'option_plie_label' => 'Ja plegat',
+       'option_plie_label_case' => 'Si el grup de camps és plegable, ja estarà plegat a la visualització del formulari.',
+       'option_previsualisation_explication' => 'Si el portaplomes està activat, afegit una pestanya per fer una visualització prèvia del text introduït. ',
+       'option_previsualisation_label' => 'Activar la visualització prèvia',
+       'option_readonly_explication' => 'El camp es pot llegir, seleccionar, però no modificar.',
+       'option_readonly_label' => 'Només lectura',
+       'option_rows_explication' => 'Alçada del bloc en número de línies. Aquesta opció no es pot aplicar sempre ja que els estils CSS del vostre lloc el poden anul·lar.',
+       'option_rows_label' => 'Número de línies',
+       'option_size_explication' => 'Amplada del camp en número de caràcters. Aquesta opció no es pot aplicar sempre ja que els estils CSS del vostre lloc el poden anul·lar. ',
+       'option_size_label' => 'Mida del camp',
+       'option_type_choix_plusieurs' => 'Permetrà a l\'usuari escollir <strong>diversos</strong> destinataris.', # MODIF
+       'option_type_choix_tous' => 'Posar <strong>tots</strong> aquests autors com a destinataris. L\'usuari no tindrà cap tria.',
+       'option_type_choix_un' => 'Permetre a l\'usuari escollir <strong>un únic</strong> destinatari.', # MODIF
+       'option_type_explication' => 'En mode "amagat", el contingut del camp no serà visible.',
+       'option_type_label' => 'Tipus del camp',
+       'option_type_password' => 'Amagat',
+       'option_type_text' => 'Normal',
+
+       // S
+       'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs', # NEW
+       'saisie_auteurs_titre' => 'Auteurs', # NEW
+       'saisie_case_explication' => 'Permet activar o desactivar alguna cosa.',
+       'saisie_case_titre' => 'Casella única',
+       'saisie_checkbox_explication' => 'Permet escollir diverses opcions amb caselles.',
+       'saisie_checkbox_titre' => 'Caselles a marcar', # MODIF
+       'saisie_date_explication' => 'Permet de saisir une date ? l\'aide d\'un calendrier', # NEW
+       'saisie_date_titre' => 'Date', # NEW
+       'saisie_destinataires_explication' => 'Permet escollir un o diversos destinataris entre els autors seleccionats prèviament.',
+       'saisie_destinataires_titre' => 'Destinataris',
+       'saisie_explication_explication' => 'Un text explicatiu general.',
+       'saisie_explication_titre' => 'Explicació',
+       'saisie_fieldset_explication' => 'Un quadre que podrà englobar diversos camps.',
+       'saisie_fieldset_titre' => 'Grup de camps',
+       'saisie_file_explication' => 'Enviament d\'un arxiu ',
+       'saisie_file_titre' => 'Arxiu',
+       'saisie_hidden_explication' => 'Un camp omplert prèviament que l\'usuari no podrà veure.',
+       'saisie_hidden_titre' => 'Camp amagat',
+       'saisie_input_explication' => 'Una simple línia de text, que podrà ser visible o estar amagada (contrasenya).',
+       'saisie_input_titre' => 'Línia de text',
+       'saisie_oui_non_explication' => 'Si o no, està clar? :)',
+       'saisie_oui_non_titre' => 'Si o no ',
+       'saisie_radio_defaut_choix1' => 'Un',
+       'saisie_radio_defaut_choix2' => 'Dos',
+       'saisie_radio_defaut_choix3' => 'Tres',
+       'saisie_radio_explication' => 'Permet escollir una opció entre les diverses disponibles.',
+       'saisie_radio_titre' => 'Botons ràdios',
+       'saisie_selecteur_article' => 'Affiche un navigateur de sélection d\'article', # NEW
+       'saisie_selecteur_article_titre' => 'Sélecteur d\'article', # NEW
+       'saisie_selecteur_rubrique' => 'Affiche un navigateur de sélection de rubrique', # NEW
+       'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection d\'article ou de rubrique', # NEW
+       'saisie_selecteur_rubrique_article_titre' => 'Sélecteur d\'article ou rubrique', # NEW
+       'saisie_selecteur_rubrique_titre' => 'Sélecteur de rubrique', # NEW
+       'saisie_selection_explication' => 'Escollir una opció en una llista desplegable.', # MODIF
+       'saisie_selection_multiple_explication' => 'Permet escollir diverses opcions amb una llista.',
+       'saisie_selection_multiple_titre' => 'Selecció múltiple',
+       'saisie_selection_titre' => 'Llista desplegable',
+       'saisie_textarea_explication' => 'Un camp de text en diverses línies.',
+       'saisie_textarea_titre' => 'Bloc de text',
+
+       // T
+       'tous_visiteurs' => 'Tots els visitants (fins i tot els no registrats)',
+       'tout_selectionner' => 'Tout sélectionner', # NEW
+
+       // V
+       'vue_sans_reponse' => '<i>Sense resposta</i>', # MODIF
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_de.php b/www/plugins/saisies/lang/saisies_de.php
new file mode 100644 (file)
index 0000000..c55a121
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Artikel durchsuchen',
+       'bouton_parcourir_docs_breve' => 'Meldung durchsuchen',
+       'bouton_parcourir_docs_rubrique' => 'Rubrik durchsuchen',
+       'bouton_parcourir_mediatheque' => 'Mediathek durchsuchen',
+
+       // C
+       'construire_action_annuler' => 'Abbrechen',
+       'construire_action_configurer' => 'Konfigurieren',
+       'construire_action_deplacer' => 'Verschieben',
+       'construire_action_dupliquer' => 'Duplizieren',
+       'construire_action_dupliquer_copie' => '(Kopie)',
+       'construire_action_supprimer' => 'Löschen',
+       'construire_ajouter_champ' => 'Feld hinzufügen',
+       'construire_attention_enregistrer' => 'Vergessen Sie nicht, Ihre Änderungen zu speichern.',
+       'construire_attention_modifie' => 'Das untere Formular unterscheidet sich vom ursprünglichen. Sie können es in den Zustand vor den Änderungen zurücksetzen.',
+       'construire_attention_supprime' => 'Ihre Änderungen umfassen das Löschen von Feldern. Bitte bestätigen das Speichern dieser neuen Version des Formulars.',
+       'construire_aucun_champs' => 'Dieses Formular enthält noch keine Felder.',
+       'construire_confirmer_supprimer_champ' => 'Wollen Sie dieses Feld wirklich löschen?',
+       'construire_info_nb_champs_masques' => '@nb@ Feld/er während der Konfiguration der Gruppe ausgeblendet.',
+       'construire_position_explication' => 'Geben Sie an, vor welchem anderen Feld dieses erscheinen soll.',
+       'construire_position_fin_formulaire' => 'Am Ende des Formulars',
+       'construire_position_fin_groupe' => 'Am Ende der Gruppe @groupe@',
+       'construire_position_label' => 'Feldposition',
+       'construire_reinitialiser' => 'Formular neu initialisieren',
+       'construire_reinitialiser_confirmer' => 'Alle Ihre Änderungen werden verlorengehen. Wollen Sie wirklich das ursprüngliche Formular wieder herstellen?',
+       'construire_verifications_aucune' => 'Keine',
+       'construire_verifications_label' => 'Art der Überprüfung',
+
+       // E
+       'erreur_generique' => 'Fehler im folgenden Feld. Bitte überprüfen Sie Ihre Eingabe.',
+       'erreur_option_nom_unique' => 'Dieser Name wird bereits für ein anderes Feld verwendet; er kann in diesem Formular nur einmal verwendet werden.',
+
+       // I
+       'info_configurer_saisies' => 'Testseite der Eingabefelder.',
+
+       // L
+       'label_annee' => 'Jahr',
+       'label_jour' => 'Tag',
+       'label_mois' => 'Monat',
+
+       // O
+       'option_aff_art_interface_explication' => 'Ausschließlich Artikel in der Sprache des Nutzers anzeigen',
+       'option_aff_art_interface_label' => 'Mehrsprachige Anzeige',
+       'option_aff_langue_explication' => 'Sprache des ausgewählten Artikels oder der Rubrik vor dem Titel anzeigen',
+       'option_aff_langue_label' => 'Sprache anzeigen',
+       'option_aff_rub_interface_explication' => 'Ausschließlich Rubriken in der Sprache des Nutzers anzeigen',
+       'option_aff_rub_interface_label' => 'Mehrsprachige Anzeige',
+       'option_attention_explication' => 'Nachricht wichtiger als Meldung',
+       'option_attention_label' => 'Achtung',
+       'option_autocomplete_defaut' => 'Standardeinstellung belassen',
+       'option_autocomplete_explication' => 'Beim Laden der Seite kann Ihr Browser das Feld mit bereits verwendeten Werten vorausfüllen.',
+       'option_autocomplete_label' => 'Feld vorausfüllen',
+       'option_autocomplete_off' => 'Deaktivieren',
+       'option_autocomplete_on' => 'Aktivieren',
+       'option_cacher_option_intro_label' => 'Erste leere Auswahl ausblenden',
+       'option_choix_destinataires_explication' => 'Einer oder mehrere Empfänger, welche der Besucher auswählen kann. Wenn er keine Auswahl trifft, geht die Nachricht an den ersten Administrator (Autor 1).',
+       'option_choix_destinataires_label' => 'Mögliche Empfänger',
+       'option_class_label' => 'Zusätzliche CSS-Klassen',
+       'option_cols_explication' => 'Breite des Blocks in Zeichen. Diese Option kann durch ihre CSS-Stile unwirksam grmacht werden.',
+       'option_cols_label' => 'Breite',
+       'option_datas_explication' => 'Sie müssen in jeder Zeile eine Option im Format "Schlüssel|Bezeichnung" angeben.',
+       'option_datas_label' => 'Mögliche Angaben',
+       'option_defaut_label' => 'Standardwert',
+       'option_disable_avec_post_explication' => 'Identisch mit voriger Option, jedoch wird der Wert in ein verstecktes Feld eingefügt.',
+       'option_disable_avec_post_label' => 'Senden trotz Deaktivierung',
+       'option_disable_explication' => 'Das Feld erhält keinen Fokus.',
+       'option_disable_label' => 'Feld deaktivieren',
+       'option_erreur_obligatoire_explication' => 'Sie können eine eigene Fehlermeldung bei nicht ausgefüllten Pflichtfeldern eingeben oder darauf verzichten.',
+       'option_erreur_obligatoire_label' => 'Hinweis Pflichtfeld',
+       'option_explication_explication' => 'Falls erforderlich kurze Beschreibung des Feldobjekts',
+       'option_explication_label' => 'Erläuterung',
+       'option_groupe_affichage' => 'Anzeige',
+       'option_groupe_description' => 'Beschreibung',
+       'option_groupe_utilisation' => 'Verwendung',
+       'option_groupe_validation' => 'Bestätigung',
+       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
+       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
+       'option_horaire_label' => 'Horaire', # NEW
+       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
+       'option_info_obligatoire_explication' => 'Sie können die Standardbezeichnung für Pflichtfelder ändern:<i>[Pflichtfeld]</i>.',
+       'option_info_obligatoire_label' => 'Pflichtfeld-Anzeige',
+       'option_inserer_barre_choix_edition' => 'Vollständige Symbolleiste "Bearbeiten"',
+       'option_inserer_barre_choix_forum' => 'Symbolleiste "Foren"',
+       'option_inserer_barre_explication' => 'Eine Symbolleiste hinzufügen, wenn das Plugin Porte-Plume aktiviert ist.',
+       'option_inserer_barre_label' => 'Symbolleiste einfügen',
+       'option_label_case_label' => 'Bezeichnung neben dem Feld',
+       'option_label_explication' => 'Anzeigetitel',
+       'option_label_label' => 'Bezeichnung',
+       'option_maxlength_explication' => 'Der Besucher kann maximal diese Anzahl Zeichen eingeben',
+       'option_maxlength_label' => 'Zeichen maximal',
+       'option_multiple_explication' => 'Der Nutzer kann mehrere Optionen auswählen',
+       'option_multiple_label' => 'Mehrfachauswahl',
+       'option_nom_explication' => 'Reserviertes Wort für das Feld. Darf nur alphanumerische klein geschriebene und das Zeichen "_" (Unterstrich) enthalten.',
+       'option_nom_label' => 'Feldname',
+       'option_obligatoire_label' => 'Pflichtfeld',
+       'option_option_intro_label' => 'Bezeichnung der ersten leeren Auswahl',
+       'option_option_statut_label' => 'Status anzeigen',
+       'option_pliable_label' => 'Klappbar',
+       'option_pliable_label_case' => 'Die Feldgruppe kann zugeklappt werden',
+       'option_plie_label' => 'Bereits zugeklappt',
+       'option_plie_label_case' => 'Wen die Feldgruppe klappbar ist, wird sie beim Anzeigen des Formulars zunächst zugeklappt angezeigt.',
+       'option_previsualisation_explication' => 'Reiter "Vorschau" hinzufügen, wenn das Plugin Porte-Plume aktiviert ist.',
+       'option_previsualisation_label' => 'Vorschau aktivieren',
+       'option_readonly_explication' => 'Dieses Feld kann angezeigt aber nicht bearbeitet werden.',
+       'option_readonly_label' => 'Nur Lesen',
+       'option_rows_explication' => 'Höhe des Blocks in Zeilen. Diese Option ist nicht immer wirksam, da sie von individuellen CSS-Stilen abgeschaltet werden kann.',
+       'option_rows_label' => 'Anzahl Zeilen',
+       'option_size_explication' => 'Breite des Felds in Zeichen. Diese Option ist nicht immer wirksam, da sie durch individuelle CSS.Stile abgeschaltet werden kann.',
+       'option_size_label' => 'Feldgröße',
+       'option_type_choix_plusieurs' => 'Auswahl <strong>mehrerer</strong> Empfänger erlauben',
+       'option_type_choix_tous' => '<strong>Alle</strong> diese Autoren als Empfänger hinzufügen. Der Besucher kann keine Auswahl treffen.',
+       'option_type_choix_un' => 'Der Besucher kann nur <strong>einen einzigen</strong> Empfänger auswählen.',
+       'option_type_explication' => 'Im "versteckten" Modus wird der Inhalt dieses Felds nicht angezeigt.',
+       'option_type_label' => 'Feldtyp',
+       'option_type_password' => 'Versteckt',
+       'option_type_text' => 'Normal',
+
+       // S
+       'saisie_auteurs_explication' => 'Ermöglicht einen oder mehrere Autoren auszuwählen',
+       'saisie_auteurs_titre' => 'Autoren',
+       'saisie_case_explication' => 'Ermöglicht Dinge zu aktivieren und deaktivieren',
+       'saisie_case_titre' => 'Nur eine Option',
+       'saisie_checkbox_explication' => 'Erlaubt mehrer Optionen auszuwählen',
+       'saisie_checkbox_titre' => 'Kästchen zum Abhaken',
+       'saisie_date_explication' => 'Datum aus Kalendarium auswählen',
+       'saisie_date_titre' => 'Datum',
+       'saisie_destinataires_explication' => 'Ermöglicht mehrere Empfänger aus den vorgeschlagenen Autoren auszuwählen',
+       'saisie_destinataires_titre' => 'Empfänger',
+       'saisie_explication_explication' => 'Allgemeine Beschreibung',
+       'saisie_explication_titre' => 'Beschreibung',
+       'saisie_fieldset_explication' => 'Ein Rahmen, der mehrere Felder enthalten kann',
+       'saisie_fieldset_titre' => 'Feldgruppe',
+       'saisie_file_explication' => 'Datei senden',
+       'saisie_file_titre' => 'Datei',
+       'saisie_hidden_explication' => 'Ein für den Nutzer unsichtbares, vorab ausgefülltes Feld',
+       'saisie_hidden_titre' => 'Verborgenes Feld',
+       'saisie_input_explication' => 'Eine einfache Textzeile, kann angezeigt oder ausgeblendet werden (Passwort)',
+       'saisie_input_titre' => 'Textzeile',
+       'saisie_oui_non_explication' => 'Ja oder nein, alle klar ? :)',
+       'saisie_oui_non_titre' => 'Ja oder nein',
+       'saisie_radio_defaut_choix1' => 'Eins',
+       'saisie_radio_defaut_choix2' => 'Zwei',
+       'saisie_radio_defaut_choix3' => 'Drei',
+       'saisie_radio_explication' => 'Ermöglicht eine Option aus mehreren verfügbaren auszuwählen',
+       'saisie_radio_titre' => 'Radioknöpfe',
+       'saisie_selecteur_article' => 'Werkzeug zur Auswahl eines Artikels anzeigen',
+       'saisie_selecteur_article_titre' => 'Artikelwahl',
+       'saisie_selecteur_rubrique' => 'Werkzeug zur Auswahl einer Rubrik anzeigen',
+       'saisie_selecteur_rubrique_article' => 'Werkzeug zur Auswahl einer Rubrik oder eines Artikels anzeigen',
+       'saisie_selecteur_rubrique_article_titre' => 'Rubrik- oder Artikelwahl',
+       'saisie_selecteur_rubrique_titre' => 'Rubrikwahl',
+       'saisie_selection_explication' => 'Eine Option aus einer Drop-Down-Liste auswählen.',
+       'saisie_selection_multiple_explication' => 'Mehrere Optionen aus einer Liste auswählen',
+       'saisie_selection_multiple_titre' => 'Mehrfachauswahl',
+       'saisie_selection_titre' => 'Drop-Down-Liste',
+       'saisie_textarea_explication' => 'Mehrzeiliges Textfeld',
+       'saisie_textarea_titre' => 'Textblock',
+
+       // T
+       'tous_visiteurs' => 'Alle Besucher (auch nicht eingeschriebene)',
+       'tout_selectionner' => 'Alles auswählen',
+
+       // V
+       'vue_sans_reponse' => '<i>Ohne Antwort</i>',
+
+       // Z
+       'z' => 'Zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_en.php b/www/plugins/saisies/lang/saisies_en.php
new file mode 100644 (file)
index 0000000..dddd5e0
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Browse through the article',
+       'bouton_parcourir_docs_breve' => 'Browse through the news item',
+       'bouton_parcourir_docs_rubrique' => 'Browse through the section',
+       'bouton_parcourir_mediatheque' => 'Browse through the multimedia library',
+
+       // C
+       'construire_action_annuler' => 'Cancel',
+       'construire_action_configurer' => 'Set up',
+       'construire_action_deplacer' => 'Move',
+       'construire_action_dupliquer' => 'Duplicate',
+       'construire_action_dupliquer_copie' => '(copy)',
+       'construire_action_supprimer' => 'Delete',
+       'construire_ajouter_champ' => 'Add a field',
+       'construire_attention_enregistrer' => 'Remember to save your changes!',
+       'construire_attention_modifie' => 'The form below is different from the initial form. You can reset it to the state before the changes.',
+       'construire_attention_supprime' => 'Your changes include deletions of fields. Please confirm the registration of the new version of the form.',
+       'construire_aucun_champs' => 'There is currently no field in this form.',
+       'construire_confirmer_supprimer_champ' => 'Do you really want to delete this field?',
+       'construire_info_nb_champs_masques' => '@nb@ hidden field(s) the time to set up the group.',
+       'construire_position_explication' => 'Specify before which other field this one should be placed.',
+       'construire_position_fin_formulaire' => 'At the end of the form',
+       'construire_position_fin_groupe' => 'At the end of the group @groupe@',
+       'construire_position_label' => 'Position of the field',
+       'construire_reinitialiser' => 'Reset form',
+       'construire_reinitialiser_confirmer' => 'You will lose all your changes. Are you sure you want to go back to the original form?',
+       'construire_verifications_aucune' => 'None',
+       'construire_verifications_label' => 'Type of verification to be performed',
+
+       // E
+       'erreur_generique' => 'There are errors in the fields below, please check your inputs',
+       'erreur_option_nom_unique' => 'This name is already used by another field and it must be unique in this form.',
+
+       // I
+       'info_configurer_saisies' => 'Test page for Entries',
+
+       // L
+       'label_annee' => 'Year',
+       'label_jour' => 'Day',
+       'label_mois' => 'Month',
+
+       // O
+       'option_aff_art_interface_explication' => 'Display only the articles in the user\'s language',
+       'option_aff_art_interface_label' => 'Multilingual display',
+       'option_aff_langue_explication' => 'Display the selected language of the article or section before the title',
+       'option_aff_langue_label' => 'Display the language',
+       'option_aff_rub_interface_explication' => 'Display only the sections in the user\'s language',
+       'option_aff_rub_interface_label' => 'Multilingual display',
+       'option_attention_explication' => 'A message more important than the explanation.',
+       'option_attention_label' => 'Warning',
+       'option_autocomplete_defaut' => 'Leave the default',
+       'option_autocomplete_explication' => 'At page load, your browser may pre-fill the field based on its history',
+       'option_autocomplete_label' => 'Pre-fill the field',
+       'option_autocomplete_off' => 'Disable',
+       'option_autocomplete_on' => 'Enable',
+       'option_cacher_option_intro_label' => 'Hide the first empty choice',
+       'option_choix_destinataires_explication' => 'One or several authors among which the user can make his choice. If nothing selected, it will be the author who installed the site to be chosen.',
+       'option_choix_destinataires_label' => 'Possible recipients',
+       'option_class_label' => 'Additional CSS Classes',
+       'option_cols_explication' => 'Field width in characters. This option is not always applied/used because the CSS styles of your site may override it.',
+       'option_cols_label' => 'Width',
+       'option_datas_explication' => 'You need to specify a choice for each row in the form of "key|label of the choice"',
+       'option_datas_label' => 'List of the available choices',
+       'option_defaut_label' => 'Default value',
+       'option_disable_avec_post_explication' => 'Same as previous option position but still post value in a hidden field.',
+       'option_disable_avec_post_label' => 'Disabled but posted.',
+       'option_disable_explication' => 'The field can not get the focus.',
+       'option_disable_label' => 'Disable the field',
+       'option_erreur_obligatoire_explication' => 'You can customize the error message displayed to show an obligation (otherwise leave blank).',
+       'option_erreur_obligatoire_label' => 'Obligation message',
+       'option_explication_explication' => 'If necessary, a short sentence describing the subject field.',
+       'option_explication_label' => 'Explanation',
+       'option_groupe_affichage' => 'Display',
+       'option_groupe_description' => 'Description',
+       'option_groupe_utilisation' => 'Usage',
+       'option_groupe_validation' => 'Validation',
+       'option_heure_pas_explication' => 'When using the schedule, a menu is displayed to help enter hours and minutes. Here you can choose the time interval between each option (default 30 minutes).',
+       'option_heure_pas_label' => 'Interval of the minutes in the help menu of the input',
+       'option_horaire_label' => 'Schedule',
+       'option_horaire_label_case' => 'Allow to fill in the time',
+       'option_info_obligatoire_explication' => 'You can modify the default indication of obligation: <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'Indication of obligation',
+       'option_inserer_barre_choix_edition' => 'complete editing toolbar',
+       'option_inserer_barre_choix_forum' => 'forums toolbar',
+       'option_inserer_barre_explication' => 'Insert a porte-plume toolbar if that tool is activated.',
+       'option_inserer_barre_label' => 'Insert a toolbar',
+       'option_label_case_label' => 'Label located beside the check box',
+       'option_label_explication' => 'The title that will be displayed.',
+       'option_label_label' => 'Label',
+       'option_maxlength_explication' => 'The user can not type more characters than this number.',
+       'option_maxlength_label' => 'Maximum number of characters',
+       'option_multiple_explication' => 'The user will be able to select several values',
+       'option_multiple_label' => 'Multiple selection',
+       'option_nom_explication' => 'A computer ID name that identifies the field. It may only contain lowercase alphanumeric characters or the underscore character "_".',
+       'option_nom_label' => 'Field name',
+       'option_obligatoire_label' => 'Required field',
+       'option_option_intro_label' => 'Label for the first empty choice',
+       'option_option_statut_label' => 'Show the status',
+       'option_pliable_label' => 'Expandable',
+       'option_pliable_label_case' => 'The group of fields can be expanded or shrunk.',
+       'option_plie_label' => 'Already shrunk',
+       'option_plie_label_case' => 'If the group of fields can be expanded and shrunk, then this option will make it already shrink with the form displays.',
+       'option_previsualisation_explication' => 'If porte-plume is activated, add a tab to preview the appearance of the text entered.',
+       'option_previsualisation_label' => 'Activate previews',
+       'option_readonly_explication' => 'The field can be viewed, selected, but not modified.',
+       'option_readonly_label' => 'Read only',
+       'option_rows_explication' => 'Field height in lines. This option is not always applied/used because the CSS styles of your site can cancel it.',
+       'option_rows_label' => 'Lines number',
+       'option_size_explication' => 'Field width in characters. This option is not always applied/used because the CSS styles of your site can cancel it.',
+       'option_size_label' => 'Field size',
+       'option_type_choix_plusieurs' => 'Allow the user to choose <strong>several</ strong> message recipients.',
+       'option_type_choix_tous' => 'Make <strong>all</ strong> these authors as recipients. The user will not have choice.',
+       'option_type_choix_un' => 'Allow the user to choose <strong>only one</strong> message recipient.',
+       'option_type_explication' => 'In "disguised" mode, the field contents as typed will be replaced with asterisks.',
+       'option_type_label' => 'Field type',
+       'option_type_password' => 'Disguised',
+       'option_type_text' => 'Normal',
+
+       // S
+       'saisie_auteurs_explication' => 'Allows you to select one or more authors',
+       'saisie_auteurs_titre' => 'Autors',
+       'saisie_case_explication' => 'Used to activate or deactivate a particular option.',
+       'saisie_case_titre' => 'Single check box',
+       'saisie_checkbox_explication' => 'Used to select several options using check boxes.',
+       'saisie_checkbox_titre' => 'Check boxes',
+       'saisie_date_explication' => 'Used to enter a date using a calendar tool',
+       'saisie_date_titre' => 'Date',
+       'saisie_destinataires_explication' => 'Used to select one or more recipients from among the pre-selected authors.',
+       'saisie_destinataires_titre' => 'Recipients',
+       'saisie_explication_explication' => 'A general explanatory description.',
+       'saisie_explication_titre' => 'Explanation',
+       'saisie_fieldset_explication' => 'A frame which may include several fields.',
+       'saisie_fieldset_titre' => 'Fieldset',
+       'saisie_file_explication' => 'Send a file',
+       'saisie_file_titre' => 'File',
+       'saisie_hidden_explication' => 'A pre-filled field that the user will never see.',
+       'saisie_hidden_titre' => 'Hidden field',
+       'saisie_input_explication' => 'A simple line of text that can be visible or hidden (password).',
+       'saisie_input_titre' => 'Textfield',
+       'saisie_oui_non_explication' => 'Either a Yes or No response',
+       'saisie_oui_non_titre' => 'Yes or No',
+       'saisie_radio_defaut_choix1' => 'One',
+       'saisie_radio_defaut_choix2' => 'Two',
+       'saisie_radio_defaut_choix3' => 'Three',
+       'saisie_radio_explication' => 'Used to select one single option from several possibilities.',
+       'saisie_radio_titre' => 'Radio buttons',
+       'saisie_selecteur_article' => 'Display an article selection browser',
+       'saisie_selecteur_article_titre' => 'Article selector',
+       'saisie_selecteur_rubrique' => 'Display a section selector browser',
+       'saisie_selecteur_rubrique_article' => 'Display an article or section selector browser',
+       'saisie_selecteur_rubrique_article_titre' => 'Article or section selector',
+       'saisie_selecteur_rubrique_titre' => 'Section selector',
+       'saisie_selection_explication' => 'Select an option from a dropdown list box.',
+       'saisie_selection_multiple_explication' => 'Used for selecting several options from a list.',
+       'saisie_selection_multiple_titre' => 'Multiple selection',
+       'saisie_selection_titre' => 'Dropdown list box',
+       'saisie_textarea_explication' => 'A multilines text field.',
+       'saisie_textarea_titre' => 'Textarea',
+
+       // T
+       'tous_visiteurs' => 'All visitors (even if not registered)',
+       'tout_selectionner' => 'Select all',
+
+       // V
+       'vue_sans_reponse' => '<i>(no data entered)</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_es.php b/www/plugins/saisies/lang/saisies_es.php
new file mode 100644 (file)
index 0000000..3e099c5
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Buscar artículo',
+       'bouton_parcourir_docs_breve' => 'Buscar breve',
+       'bouton_parcourir_docs_rubrique' => 'Buscar la sección',
+       'bouton_parcourir_mediatheque' => 'Buscar mediateca',
+
+       // C
+       'construire_action_annuler' => 'Anular',
+       'construire_action_configurer' => 'Configurar',
+       'construire_action_deplacer' => 'Mover',
+       'construire_action_dupliquer' => 'Duplicar',
+       'construire_action_dupliquer_copie' => '(copia)',
+       'construire_action_supprimer' => 'Eliminar',
+       'construire_ajouter_champ' => 'Añadir un campo',
+       'construire_attention_enregistrer' => '¡No olvide guardar sus cambios!',
+       'construire_attention_modifie' => 'Este formulario es diferente al original. Tiene la posibilidad de restablecerlo conforme a su estado inical. ',
+       'construire_attention_supprime' => 'Sus cambios implican suprimir campos. Confirme por favor esta nueva versión del formulario. ',
+       'construire_aucun_champs' => 'Actualmente no existen campos en este formulario. ',
+       'construire_confirmer_supprimer_champ' => '¿Desea eliminar realmente este campo?',
+       'construire_info_nb_champs_masques' => '@nb@ campo(s) oculto(s) el tiempo de configurar el grupo.',
+       'construire_position_explication' => 'Indique delante de qué otro campo se cololocará.',
+       'construire_position_fin_formulaire' => 'Al final del formulario',
+       'construire_position_fin_groupe' => 'Al final del grupo @groupe@',
+       'construire_position_label' => 'Posición del campo',
+       'construire_reinitialiser' => 'Restablecer el formulario',
+       'construire_reinitialiser_confirmer' => 'Va a perder todos los cambios. ¿Está seguro de volver al formulario original?',
+       'construire_verifications_aucune' => 'Ninguna',
+       'construire_verifications_label' => 'Tipo de verificación a efectuar',
+
+       // E
+       'erreur_generique' => 'Hay errores en los siguientes campos, revise por favor sus entradas',
+       'erreur_option_nom_unique' => 'Este nombre ya ha sido utilizado en otro campo, y ha de ser único en el formulario.',
+
+       // I
+       'info_configurer_saisies' => 'Página de prueba de las entradas',
+
+       // L
+       'label_annee' => 'Año',
+       'label_jour' => 'Día',
+       'label_mois' => 'Mes',
+
+       // O
+       'option_aff_art_interface_explication' => 'Mostrar sólo los artículos en el idioma del usuario',
+       'option_aff_art_interface_label' => 'Aparencia multilingüe',
+       'option_aff_langue_explication' => 'Muestra el idioma del artículo o de la sección enfrente de su título',
+       'option_aff_langue_label' => 'Mostrar el idioma',
+       'option_aff_rub_interface_explication' => 'Mostrar sólo las secciones en el idioma del usuario',
+       'option_aff_rub_interface_label' => 'Aparencia multilingüe',
+       'option_attention_explication' => 'Un mensaje más importante que la explicación.',
+       'option_attention_label' => 'Aviso',
+       'option_autocomplete_defaut' => 'Dejar por defecto',
+       'option_autocomplete_explication' => 'Al cargar la página, su navegador puede rellenar el campo en función de sus historial',
+       'option_autocomplete_label' => 'Pre-relleno del campo',
+       'option_autocomplete_off' => 'Desactivar',
+       'option_autocomplete_on' => 'Activar',
+       'option_cacher_option_intro_label' => 'Esconder la primera opción vacía',
+       'option_choix_destinataires_explication' => 'Una lista de autoras o autores de SPIP. Se podrán elegir los destinatorios dentro de esta lista. Si no se selecciona nadie, la elección será la persona que instaló el sitio.',
+       'option_choix_destinataires_label' => 'Destinaciones posibles',
+       'option_class_label' => 'Clases CSS adicionales',
+       'option_cols_explication' => 'Ancho del bloque (en número de carácteres). Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de tu sitio.',
+       'option_cols_label' => 'Ancho',
+       'option_datas_explication' => 'Tiene que dar una opción por línea bajo la forma "clave|Etiqueta de la opción"',
+       'option_datas_label' => 'Lista de opciones posibles',
+       'option_defaut_label' => 'Valor por defecto',
+       'option_disable_avec_post_explication' => 'Como la opción anterior, pero igual envía el valor en un campo escondido.',
+       'option_disable_avec_post_label' => 'Deactivar pero enviar',
+       'option_disable_explication' => 'El campo ya no puede obtener el foco.',
+       'option_disable_label' => 'Deactivar el campo',
+       'option_erreur_obligatoire_explication' => 'Puede personalizar el mensaje de error mostrado para indicar una obligación (sino dejar en blanco).',
+       'option_erreur_obligatoire_label' => 'Mensaje de obligación',
+       'option_explication_explication' => 'Si hace falta, una frase corta que describe el campo',
+       'option_explication_label' => 'Explicación',
+       'option_groupe_affichage' => 'Aparencia',
+       'option_groupe_description' => 'Descripción',
+       'option_groupe_utilisation' => 'Uso',
+       'option_groupe_validation' => 'Validación',
+       'option_heure_pas_explication' => 'Cuando usa el horario, se muestra un menú para ayudar a introducir horas y minutos. Aquí puede elegir el intervalo de tiempo entre cada opción (por defecto 30 minutos).',
+       'option_heure_pas_label' => 'Intervalo de minutos en el menú de ayuda a la entrada',
+       'option_horaire_label' => 'Horario',
+       'option_horaire_label_case' => 'Permite introducir también la hora',
+       'option_info_obligatoire_explication' => 'Puede modificar la indicación de campo obligatoria: <i>[Obligatorio</i>.',
+       'option_info_obligatoire_label' => 'Indicación de campo obligatorio',
+       'option_inserer_barre_choix_edition' => 'Barra de edición completa',
+       'option_inserer_barre_choix_forum' => 'barra de los foros',
+       'option_inserer_barre_explication' => 'Integra una barra tipográfica si ésta es activa.',
+       'option_inserer_barre_label' => 'Integrar una barra de herramientas',
+       'option_label_case_label' => 'Etiqueta posicionada al lado de la checkbox',
+       'option_label_explication' => 'El título que se enseñará',
+       'option_label_label' => 'Etiqueta',
+       'option_maxlength_explication' => 'El campo no podrá contener más carácteres que este número.',
+       'option_maxlength_label' => 'Número máximo de carácteres',
+       'option_multiple_explication' => 'Se podrán seleccionar varias opciones',
+       'option_multiple_label' => 'Selección múltiple',
+       'option_nom_explication' => 'Un nombre informático que identificará el campo. Sólo puede contener carácteres alfanuméricos minúsculos o el carácter "_".',
+       'option_nom_label' => 'Nombre del campo',
+       'option_obligatoire_label' => 'Campo obligatorio',
+       'option_option_intro_label' => 'Label de la primera opción vacía',
+       'option_option_statut_label' => 'Mostrar el estatus',
+       'option_pliable_label' => 'Desplegable',
+       'option_pliable_label_case' => 'El grupo de campos se podrá contraer y desplegar.',
+       'option_plie_label' => 'Ya está contraido',
+       'option_plie_label_case' => 'Si el grupo de campos se puede contraer, ya estará contraido cuando se enseñe el formulario.',
+       'option_previsualisation_explication' => 'Si la barra tipográfica es activa, añade una pestaña de previsualización del texto.',
+       'option_previsualisation_label' => 'Activar la previsualización',
+       'option_readonly_explication' => 'El campo se puede leer, seleccionar, pero no se puede modificar.',
+       'option_readonly_label' => 'Sólo lectura',
+       'option_rows_explication' => 'Altura del bloque en número de líneas. Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de su sitio.',
+       'option_rows_label' => 'Número de líneas',
+       'option_size_explication' => 'Ancho del campo (número de carácteres). Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de su sitio.',
+       'option_size_label' => 'Tamaño del campo',
+       'option_type_choix_plusieurs' => 'Permitirle al usuario elegir <strong>varias</strong> personas destinatorias.',
+       'option_type_choix_tous' => 'Poner a <strong>todos/as</strong> estas autoras como destinatorias. El usuario no tendrá ninguna opción.',
+       'option_type_choix_un' => 'Permitirle al usuario elegir <strong>sólo una</strong> persona destinatoria.',
+       'option_type_explication' => 'En modo "escondido", el contenido del campo no será visible.',
+       'option_type_label' => 'Tipo del campo',
+       'option_type_password' => 'Escondido',
+       'option_type_text' => 'Normal',
+
+       // S
+       'saisie_auteurs_explication' => 'Permite seleccionar uno o más autores',
+       'saisie_auteurs_titre' => 'Autores',
+       'saisie_case_explication' => 'Permite activar o deactivar algo.',
+       'saisie_case_titre' => 'Checkbox único',
+       'saisie_checkbox_explication' => 'Permite elegir varias opciones con checkboxes',
+       'saisie_checkbox_titre' => 'Checkboxes',
+       'saisie_date_explication' => '¿Permitir introducir una fecha? Ayuda de calendario',
+       'saisie_date_titre' => 'Fecha',
+       'saisie_destinataires_explication' => 'Permite elegir una o varias personas destinatorias dentro de las autoras seleccionadas.',
+       'saisie_destinataires_titre' => 'Personas destinatorias',
+       'saisie_explication_explication' => 'Una explicación general.',
+       'saisie_explication_titre' => 'Explicación',
+       'saisie_fieldset_explication' => 'Un marco que podrá englobar varios campos.',
+       'saisie_fieldset_titre' => 'Grupo de campos',
+       'saisie_file_explication' => 'Mandar un archivo',
+       'saisie_file_titre' => 'Archivo',
+       'saisie_hidden_explication' => 'Un campo invisible, que ya contiene un valor',
+       'saisie_hidden_titre' => 'Campo escondido',
+       'saisie_input_explication' => 'Una sola línea de texto, que puede ser visible u ocultada (contraseña).',
+       'saisie_input_titre' => 'Línea de texto',
+       'saisie_oui_non_explication' => 'Sí o no. ¿Está claro? :)',
+       'saisie_oui_non_titre' => 'Sí o no',
+       'saisie_radio_defaut_choix1' => 'Uno',
+       'saisie_radio_defaut_choix2' => 'Dos',
+       'saisie_radio_defaut_choix3' => 'Tres',
+       'saisie_radio_explication' => 'Permite elegir una opción dentro de varias opciones disponibles.',
+       'saisie_radio_titre' => 'Botones de opción',
+       'saisie_selecteur_article' => 'Muestra un navegador de selección de artículo',
+       'saisie_selecteur_article_titre' => 'Selector de artículo',
+       'saisie_selecteur_rubrique' => 'Muestra un navegador de selección de sección',
+       'saisie_selecteur_rubrique_article' => 'Muestra un navegador de selección de artículo o de sección',
+       'saisie_selecteur_rubrique_article_titre' => 'Selector de artículo o de sección',
+       'saisie_selecteur_rubrique_titre' => 'Selector de sección',
+       'saisie_selection_explication' => 'Elegir una opción dentro de una lista desplegable.',
+       'saisie_selection_multiple_explication' => 'Permite elegir varias opciones con una lista.',
+       'saisie_selection_multiple_titre' => 'Selección multiple',
+       'saisie_selection_titre' => 'Lista desplegable',
+       'saisie_textarea_explication' => 'Un campo de texto sobre varias líneas.',
+       'saisie_textarea_titre' => 'Bloque de texto',
+
+       // T
+       'tous_visiteurs' => 'Todos los visitantes (incluso no registrados)',
+       'tout_selectionner' => 'Seleccionar todo',
+
+       // V
+       'vue_sans_reponse' => '<i>Sin respuesta</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_fa.php b/www/plugins/saisies/lang/saisies_fa.php
new file mode 100644 (file)
index 0000000..e9de88d
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'مرور مقاله',
+       'bouton_parcourir_docs_breve' => 'مرور خبر',
+       'bouton_parcourir_docs_rubrique' => 'مرور بخش',
+       'bouton_parcourir_mediatheque' => 'مرور كتابخانه چندرسانه‌اي',
+
+       // C
+       'construire_action_annuler' => 'Annuler', # NEW
+       'construire_action_configurer' => 'Configurer', # NEW
+       'construire_action_deplacer' => 'Déplacer', # NEW
+       'construire_action_dupliquer' => 'Dupliquer', # NEW
+       'construire_action_dupliquer_copie' => '(copie)', # NEW
+       'construire_action_supprimer' => 'Supprimer', # NEW
+       'construire_ajouter_champ' => 'Ajouter un champ', # NEW
+       'construire_attention_enregistrer' => 'N\'oubliez pas d\'enregistrer vos modifications !', # NEW
+       'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.', # NEW
+       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l\'enregistrement de cette nouvelle version du formulaire.', # NEW
+       'construire_aucun_champs' => 'Il n\'y a pour l\'instant aucun champ dans ce formulaire.', # NEW
+       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?', # NEW
+       'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.', # NEW
+       'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.', # NEW
+       'construire_position_fin_formulaire' => 'À la fin du formulaire', # NEW
+       'construire_position_fin_groupe' => 'À la fin du groupe @groupe@', # NEW
+       'construire_position_label' => 'Position du champ', # NEW
+       'construire_reinitialiser' => 'Réinitialiser le formulaire', # NEW
+       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?', # NEW
+       'construire_verifications_aucune' => 'Aucune', # NEW
+       'construire_verifications_label' => 'Type de vérification à effectuer', # NEW
+
+       // E
+       'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies', # NEW
+       'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.', # NEW
+
+       // I
+       'info_configurer_saisies' => 'Page de test des Saisies', # NEW
+
+       // L
+       'label_annee' => 'سال',
+       'label_jour' => 'روز',
+       'label_mois' => 'ماه',
+
+       // O
+       'option_aff_art_interface_explication' => 'نمايش مقالات فقط به زبان كاربر',
+       'option_aff_art_interface_label' => 'نمايش چندزبانه',
+       'option_aff_langue_explication' => 'نمايش زبان مقاله يا بخش انتخاب شده‌ پيش از تيتر',
+       'option_aff_langue_label' => 'نمايش زبان',
+       'option_aff_rub_interface_explication' => 'نمايش بخش‌ها فقط به زبان كاربر',
+       'option_aff_rub_interface_label' => 'نمايش چندزبانه',
+       'option_attention_explication' => 'پيامي مهم‌تر از توضيح.',
+       'option_attention_label' => 'هشدار',
+       'option_autocomplete_defaut' => 'Laisser par défaut', # NEW
+       'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique', # NEW
+       'option_autocomplete_label' => 'Pré-remplissage du champ', # NEW
+       'option_autocomplete_off' => 'Désactiver', # NEW
+       'option_autocomplete_on' => 'Activer', # NEW
+       'option_cacher_option_intro_label' => 'پنهان‌سازي نخستين انتخاب خالي ',
+       'option_choix_destinataires_explication' => 'يك يا چند نويسنده كه كاربر مي‌تواند از ميانشان انتخاب كند. اگر كسي انتخاب نشود،‌ نويسنده‌اي كه سايت را نصب كرده انتخاب خواهد شد.<NEW>Un ou plusieurs auteurs parmis lesquels l\'utilisateur pourra faire son choix. Si rien n\'est sélectionné, c\'est l\'auteur qui a installé le site qui sera choisi.',
+       'option_choix_destinataires_label' => '<دريافت‌ كنندگان محتمل',
+       'option_class_label' => 'كلاس‌هاي سي.اس.اس اضافي ',
+       'option_cols_explication' => 'پهناي بلوك به تعداد كارآكترها. اين گزينه هميشه كاربرد ندارد چرا كه شيوه‌هاي سي.اس.اس سايت شما مي‌تواند آن را منتفي سازد.',
+       'option_cols_label' => 'پهنا',
+       'option_datas_explication' => 'لازم است براي هر رديف يك گزينه در قالب «گزينه‌ي كليد|برچسبِ» انتخاب كنيد.',
+       'option_datas_label' => 'فهرست گزينه‌هاي ممكن ',
+       'option_defaut_label' => 'مقدار پيش‌ گزيده',
+       'option_disable_avec_post_explication' => 'همانند وضعيت گزينه‌ي قبلي اما هنوز مقدار در ميدان مخفي پست شود.',
+       'option_disable_avec_post_label' => 'غيرفعال اما پست شده',
+       'option_disable_explication' => 'ميدان نمي‌‌تواند تمركز بيشتري بگيرد.',
+       'option_disable_label' => 'غيرفعال سازي ميدن',
+       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).', # NEW
+       'option_erreur_obligatoire_label' => 'Message d\'obligation', # NEW
+       'option_explication_explication' => 'در هنگام نياز، يك عبارت كوتاه موضوع ميدان را بيان كند.',
+       'option_explication_label' => 'توضيح',
+       'option_groupe_affichage' => 'نمايش ',
+       'option_groupe_description' => 'توصيف',
+       'option_groupe_utilisation' => 'كاربرد',
+       'option_groupe_validation' => 'ارزش‌گذاري',
+       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
+       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
+       'option_horaire_label' => 'Horaire', # NEW
+       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
+       'option_info_obligatoire_explication' => 'مي‌توانيد كاربرد پيش‌ گزيده‌ي الزامي را اصلاح كنيد: <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'نشان الزام',
+       'option_inserer_barre_choix_edition' => 'ميل‌ابزار ويرايش كامل ',
+       'option_inserer_barre_choix_forum' => 'ميل‌ابزار سخنگاه‌ها',
+       'option_inserer_barre_explication' => 'گنجاندن يك ميل‌‌ابزار «چوب قلم» «porte-plume» اگر آن ابزار فعال باشد.',
+       'option_inserer_barre_label' => 'گنجاندن يك ميل‌ابزار',
+       'option_label_case_label' => 'برچسب كنار چك باكس ',
+       'option_label_explication' => 'تيتري كه نمايش داده خواهد شد.',
+       'option_label_label' => 'برچسب',
+       'option_maxlength_explication' => 'كاربر نمي‌تواند كارآكترهايي بيش از اين تعداد تايپ كند.',
+       'option_maxlength_label' => 'تعداد بيشترين كارآكتر',
+       'option_multiple_explication' => 'توانايي كاربر در انتخاب چند مقدار',
+       'option_multiple_label' => 'چندگزينه‌اي',
+       'option_nom_explication' => 'يك اسم انفورماتيك كه اين ميدان را معرفي كند. اين اسم فقط بايد مركب از حروف كوچك و يا آندر لاين «_» باشد. ',
+       'option_nom_label' => 'اسم ميدان',
+       'option_obligatoire_label' => 'ميدان الزامي',
+       'option_option_intro_label' => 'برچسب نخستين گزينه‌ي خالي ',
+       'option_option_statut_label' => 'Afficher les statuts', # NEW
+       'option_pliable_label' => 'گسترشي ',
+       'option_pliable_label_case' => 'گروه‌ ميدان‌هاي چين خور.',
+       'option_plie_label' => 'چين خورده',
+       'option_plie_label_case' => 'اگر گروه ميدان‌ها چين خور باشد، اين گزينه آن‌ها را در نمايش فرم چين خور كرده است. ',
+       'option_previsualisation_explication' => 'اگر چوب قلم فعال باشد، يك تب براي پيش‌ نمايش متن ورودي اضافه كن.',
+       'option_previsualisation_label' => 'فعال سازي پيش نمايش ',
+       'option_readonly_explication' => 'ميدان قابل مشاهده و گزينش، اما ناويرايشي.',
+       'option_readonly_label' => 'فقط خوانداني',
+       'option_rows_explication' => 'بلندي ميدان در پيوند‌ها. اين گزينه كاربردي/كاربستي نيست زيرا سي.اس.اس سايت شما آن را رد مي‌كند.',
+       'option_rows_label' => 'تعداد پيوندها',
+       'option_size_explication' => 'پهناي ميدان بر اساس تعدا كارآكتر. اين گزينه هميشه كاربردي/كاربستي نيست زيرا سي.اس.اس سايت شما آن را رد مي‌كند.',
+       'option_size_label' => 'اندازه‌ي ميدان',
+       'option_type_choix_plusieurs' => 'اجازه به كاربر در انتخاب <strong> چند</strong> دريافت كننده‌ي ايميل.',
+       'option_type_choix_tous' => '<strong>تمام</strong> مؤلفان دريافت‌كننده شوند. كاربر گزينه‌اي نخواهد داشت.',
+       'option_type_choix_un' => 'اجازه به كاربر براي گزينش <strong> فقط يك </strong> دريافت‌كننده ',
+       'option_type_explication' => 'در حالت «پوشيده»، محتواي ميدان قابل رؤيت نخواهد بود. ',
+       'option_type_label' => 'نوع ميدان',
+       'option_type_password' => 'پوشيده',
+       'option_type_text' => 'عادي',
+
+       // S
+       'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs', # NEW
+       'saisie_auteurs_titre' => 'Auteurs', # NEW
+       'saisie_case_explication' => 'فعال يا غيرفعال‌سازي يك گزينه‌ي مشخص.',
+       'saisie_case_titre' => 'تك چك‌ باكش',
+       'saisie_checkbox_explication' => 'اجازه‌ي گزينش چك‌ باكس چندگزينه‌اي.',
+       'saisie_checkbox_titre' => 'چك باكس‌ها',
+       'saisie_date_explication' => 'اجازه واردسازي داده با كمك تقويم',
+       'saisie_date_titre' => 'تاريخ',
+       'saisie_destinataires_explication' => 'اجازه‌ي گزينش يك يا چند دريافت كننده از ميان نويسندگان پيش‌ گزيده.',
+       'saisie_destinataires_titre' => 'دريافت‌ كنندگان',
+       'saisie_explication_explication' => 'يك متن توصيفي كلي.',
+       'saisie_explication_titre' => 'توصيف',
+       'saisie_fieldset_explication' => 'كادري كه ممكن است چند ميدان داشته باشد.',
+       'saisie_fieldset_titre' => 'گروه ميدان',
+       'saisie_file_explication' => 'ارسال پرونده',
+       'saisie_file_titre' => 'پرونده',
+       'saisie_hidden_explication' => 'ميدان از‌پيش‌‌ پُري كه بازديدكننده هرگز نخواهد ديد.',
+       'saisie_hidden_titre' => 'ميدان پوشيده',
+       'saisie_input_explication' => 'خط ساده‌اي از متن كه مي‌تواند پوشيده يا آشكار باشد (گذرواژه)',
+       'saisie_input_titre' => 'ميدان متني',
+       'saisie_oui_non_explication' => 'بله يا نه، روشن است؟ :)',
+       'saisie_oui_non_titre' => 'بله يا نه',
+       'saisie_radio_defaut_choix1' => 'يك ',
+       'saisie_radio_defaut_choix2' => 'دو',
+       'saisie_radio_defaut_choix3' => 'سه',
+       'saisie_radio_explication' => 'اجازه‌ي گزينش يك تك گزينه‌اي از ميان چند امكان.',
+       'saisie_radio_titre' => 'دكمه راديويي',
+       'saisie_selecteur_article' => 'نمايش يك مرورگر گزينش مقاله',
+       'saisie_selecteur_article_titre' => 'گزينشگر مقاله',
+       'saisie_selecteur_rubrique' => 'نمايش مرورگر گزينشگر مقاله',
+       'saisie_selecteur_rubrique_article' => 'نمايش مرورگر گزينشگر يك مقاله يا يك بخش',
+       'saisie_selecteur_rubrique_article_titre' => 'گزينشگر مقاله يا بخش',
+       'saisie_selecteur_rubrique_titre' => 'گزينشگر بخش',
+       'saisie_selection_explication' => 'گزينش يك گزينه از فهرست آبشاري.',
+       'saisie_selection_multiple_explication' => 'اجازه‌ي گزينش چند گزينه با يك فهرست.',
+       'saisie_selection_multiple_titre' => 'چندگزينه‌اي',
+       'saisie_selection_titre' => 'فهرست‌دان آبشاري ',
+       'saisie_textarea_explication' => 'ميدان متن چندخطي.',
+       'saisie_textarea_titre' => 'بلوك‌متن',
+
+       // T
+       'tous_visiteurs' => 'تمام بازديدكنندگان (حتي ثبت ‌نام ناشدگان)',
+       'tout_selectionner' => 'Tout sélectionner', # NEW
+
+       // V
+       'vue_sans_reponse' => '<i>بي‌ پاسخ</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_fr.php b/www/plugins/saisies/lang/saisies_fr.php
new file mode 100644 (file)
index 0000000..f6e55a2
--- /dev/null
@@ -0,0 +1,178 @@
+<?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_/saisies/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Parcourir l\'article',
+       'bouton_parcourir_docs_breve' => 'Parcourir la brève',
+       'bouton_parcourir_docs_rubrique' => 'Parcourir la rubrique',
+       'bouton_parcourir_mediatheque' => 'Parcourir la médiathèque',
+
+       // C
+       'construire_action_annuler' => 'Annuler',
+       'construire_action_configurer' => 'Configurer',
+       'construire_action_deplacer' => 'Déplacer',
+       'construire_action_dupliquer' => 'Dupliquer',
+       'construire_action_dupliquer_copie' => '(copie)',
+       'construire_action_supprimer' => 'Supprimer',
+       'construire_ajouter_champ' => 'Ajouter un champ',
+       'construire_attention_enregistrer' => 'N\'oubliez pas d\'enregistrer vos modifications !',
+       'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.',
+       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l\'enregistrement de cette nouvelle version du formulaire.',
+       'construire_aucun_champs' => 'Il n\'y a pour l\'instant aucun champ dans ce formulaire.',
+       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?',
+       'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.',
+       'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.',
+       'construire_position_fin_formulaire' => 'À la fin du formulaire',
+       'construire_position_fin_groupe' => 'À la fin du groupe @groupe@',
+       'construire_position_label' => 'Position du champ',
+       'construire_reinitialiser' => 'Réinitialiser le formulaire',
+       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?',
+       'construire_verifications_aucune' => 'Aucune',
+       'construire_verifications_label' => 'Type de vérification à effectuer',
+
+       // E
+       'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies',
+       'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.',
+
+       // I
+       'info_configurer_saisies' => 'Page de test des Saisies',
+
+       // L
+       'label_annee' => 'Année',
+       'label_jour' => 'Jour',
+       'label_mois' => 'Mois',
+
+       // O
+       'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de l\'utilisateur',
+       'option_aff_art_interface_label' => 'Affichage multilingue',
+       'option_aff_langue_explication' => 'Affiche la langue de l\'article ou rubrique sélectionné devant le titre',
+       'option_aff_langue_label' => 'Afficher la langue',
+       'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de l\'utilisateur',
+       'option_aff_rub_interface_label' => 'Affichage multilingue',
+       'option_attention_explication' => 'Un message plus important que l\'explication.',
+       'option_attention_label' => 'Avertissement',
+       'option_autocomplete_defaut' => 'Laisser par défaut',
+       'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique',
+       'option_autocomplete_label' => 'Pré-remplissage du champ',
+       'option_autocomplete_off' => 'Désactiver',
+       'option_autocomplete_on' => 'Activer',
+       'option_cacher_option_intro_label' => 'Cacher le premier choix vide',
+       'option_choix_destinataires_explication' => 'Un ou plusieurs auteurs parmis lesquels l\'utilisateur pourra faire son choix. Si rien n\'est sélectionné, c\'est l\'auteur qui a installé le site qui sera choisi.',
+       'option_choix_destinataires_label' => 'Destinataires possibles',
+       'option_class_label' => 'Classes CSS supplémentaires',
+       'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n\'est pas toujours appliquée car les styles CSS de votre site peuvent l\'annuler.',
+       'option_cols_label' => 'Largeur',
+       'option_datas_explication' => 'Vous devez indiquez un choix par ligne sous la forme "cle|Label du choix"',
+       'option_datas_label' => 'Liste des choix possibles',
+       'option_defaut_label' => 'Valeur par défaut',
+       'option_disable_avec_post_explication' => 'Identique à l\'option précédente mais poste quand même la valeur dans un champ caché.',
+       'option_disable_avec_post_label' => 'Désactiver mais poster',
+       'option_disable_explication' => 'Le champ ne peut plus obtenir le focus.',
+       'option_disable_label' => 'Désactiver le champ',
+       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).',
+       'option_erreur_obligatoire_label' => 'Message d\'obligation',
+       'option_explication_explication' => 'Si besoin, une courte phrase décrivant l\'objet du champ.',
+       'option_explication_label' => 'Explication',
+       'option_groupe_affichage' => 'Affichage',
+       'option_groupe_description' => 'Description',
+       'option_groupe_utilisation' => 'Utilisation',
+       'option_groupe_validation' => 'Validation',
+       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).',
+       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie',
+       'option_horaire_label' => 'Horaire',
+       'option_horaire_label_case' => 'Permettre de saisir aussi l’horaire',
+       'option_info_obligatoire_explication' => 'Vous pouvez modifier l\'indication d\'obligation par défaut : <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'Indication d\'obligation',
+       'option_inserer_barre_choix_edition' => 'barre d\'édition complète',
+       'option_inserer_barre_choix_forum' => 'barre des forums',
+       'option_inserer_barre_explication' => 'Insère une barre d\'outils du porte-plume si ce dernier est activé.',
+       'option_inserer_barre_label' => 'Insérer une barre d\'outils',
+       'option_label_case_label' => 'Label placé à côté de la case',
+       'option_label_explication' => 'Le titre qui sera affiché.',
+       'option_label_label' => 'Label',
+       'option_maxlength_explication' => 'L\'utilisateur ne pourra pas taper plus de caractères que ce nombre.',
+       'option_maxlength_label' => 'Nombre de caractères maximum',
+       'option_multiple_explication' => 'L\'utilisateur pourra sélectionner plusieurs valeurs',
+       'option_multiple_label' => 'Sélection multiple',
+       'option_nom_explication' => 'Un nom informatique qui identifiera le champ. Il ne doit contenir que des caractères alpha-numériques minuscules ou le caractère "_".',
+       'option_nom_label' => 'Nom du champ',
+       'option_obligatoire_label' => 'Champ obligatoire',
+       'option_option_intro_label' => 'Label du premier choix vide',
+       'option_option_statut_label' => 'Afficher les statuts',
+       'option_pliable_label' => 'Pliable',
+       'option_pliable_label_case' => 'Le groupe de champs pourra être replié.',
+       'option_plie_label' => 'Déjà plié',
+       'option_plie_label_case' => 'Si le groupe de champs est pliable, il sera déjà plié à l\'affichage du formulaire.',
+       'option_previsualisation_explication' => 'Si le porte-plume est activé, ajoute un onglet pour prévisualiser le rendu du texte saisi.',
+       'option_previsualisation_label' => 'Activer la prévisualisation',
+       'option_readonly_explication' => 'Le champ peut être lu, sélectionné, mais pas modifié.',
+       'option_readonly_label' => 'Lecture seule',
+       'option_rows_explication' => 'Hauteur du bloc en nombre de ligne. Cette option n\'est pas toujours appliquée car les styles CSS de votre site peuvent l\'annuler.',
+       'option_rows_label' => 'Nombre de lignes',
+       'option_size_explication' => 'Largeur du champ en nombre de caractères. Cette option n\'est pas toujours appliquée car les styles CSS de votre site peuvent l\'annuler.',
+       'option_size_label' => 'Taille du champ',
+       'option_type_choix_plusieurs' => 'Permettre à l\'utilisateur de choisir <strong>plusieurs</strong> destinataires.',
+       'option_type_choix_tous' => 'Mettre <strong>tous</strong> ces auteurs en destinataires. L\'utilisateur n\'aura aucun choix.',
+       'option_type_choix_un' => 'Permettre à l\'utilisateur de choisir <strong>un seul</strong> destinataire.',
+       'option_type_explication' => 'En mode "masqué", le contenu du champ ne sera pas visible.',
+       'option_type_label' => 'Type du champ',
+       'option_type_password' => 'Masqué',
+       'option_type_text' => 'Normal',
+
+       // S
+       'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs',
+       'saisie_auteurs_titre' => 'Auteurs',
+       'saisie_case_explication' => 'Permet d\'activer ou de désactiver quelque chose.',
+       'saisie_case_titre' => 'Case unique',
+       'saisie_checkbox_explication' => 'Permet de choisir plusieurs options avec des cases.',
+       'saisie_checkbox_titre' => 'Cases à cocher',
+       'saisie_date_explication' => 'Permet de saisir une date ? l\'aide d\'un calendrier',
+       'saisie_date_titre' => 'Date',
+       'saisie_destinataires_explication' => 'Permet de choisir un ou plusieurs destinataires parmis des auteurs pré-sélectionné.',
+       'saisie_destinataires_titre' => 'Destinataires',
+       'saisie_explication_explication' => 'Un texte explicatif général.',
+       'saisie_explication_titre' => 'Explication',
+       'saisie_fieldset_explication' => 'Un cadre qui pourra englober plusieurs champs.',
+       'saisie_fieldset_titre' => 'Groupe de champs',
+       'saisie_file_explication' => 'Envoi d\'un fichier',
+       'saisie_file_titre' => 'Fichier',
+       'saisie_hidden_explication' => 'Un champ pré-rempli que l\'utilisateur ne pourra pas voir.',
+       'saisie_hidden_titre' => 'Champ caché',
+       'saisie_input_explication' => 'Une simple ligne de texte, pouvant être visible ou masquée (mot de passe).',
+       'saisie_input_titre' => 'Ligne de texte',
+       'saisie_oui_non_explication' => 'Oui ou non, c\'est clair ? :)',
+       'saisie_oui_non_titre' => 'Oui ou non',
+       'saisie_radio_defaut_choix1' => 'Un',
+       'saisie_radio_defaut_choix2' => 'Deux',
+       'saisie_radio_defaut_choix3' => 'Trois',
+       'saisie_radio_explication' => 'Permet de choisir une option parmis plusieurs disponibles.',
+       'saisie_radio_titre' => 'Boutons radios',
+       'saisie_selecteur_article' => 'Affiche un navigateur de sélection d\'article',
+       'saisie_selecteur_article_titre' => 'Sélecteur d\'article',
+       'saisie_selecteur_rubrique' => 'Affiche un navigateur de sélection de rubrique',
+       'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection d\'article ou de rubrique',
+       'saisie_selecteur_rubrique_article_titre' => 'Sélecteur d\'article ou rubrique',
+       'saisie_selecteur_rubrique_titre' => 'Sélecteur de rubrique',
+       'saisie_selection_explication' => 'Choisir une option dans une liste déroulante.',
+       'saisie_selection_multiple_explication' => 'Permet de choisir plusieurs options avec une liste.',
+       'saisie_selection_multiple_titre' => 'Sélection multiple',
+       'saisie_selection_titre' => 'Liste déroulante',
+       'saisie_textarea_explication' => 'Un champ de texte sur plusieurs lignes.',
+       'saisie_textarea_titre' => 'Bloc de texte',
+
+       // T
+       'tous_visiteurs' => 'Tous les visiteurs (même non enregistrés)',
+       'tout_selectionner' => 'Tout sélectionner',
+
+       // V
+       'vue_sans_reponse' => '<i>Sans réponse</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_fr_tu.php b/www/plugins/saisies/lang/saisies_fr_tu.php
new file mode 100644 (file)
index 0000000..9380d49
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Parcourir l\'article',
+       'bouton_parcourir_docs_breve' => 'Parcourir la brève',
+       'bouton_parcourir_docs_rubrique' => 'Parcourir la rubrique',
+       'bouton_parcourir_mediatheque' => 'Parcourir la médiathèque',
+
+       // C
+       'construire_action_annuler' => 'Annuler', # NEW
+       'construire_action_configurer' => 'Configurer', # NEW
+       'construire_action_deplacer' => 'Déplacer', # NEW
+       'construire_action_dupliquer' => 'Dupliquer', # NEW
+       'construire_action_dupliquer_copie' => '(copie)', # NEW
+       'construire_action_supprimer' => 'Supprimer', # NEW
+       'construire_ajouter_champ' => 'Ajouter un champ', # NEW
+       'construire_attention_enregistrer' => 'N\'oubliez pas d\'enregistrer vos modifications !', # NEW
+       'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.', # NEW
+       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l\'enregistrement de cette nouvelle version du formulaire.', # NEW
+       'construire_aucun_champs' => 'Il n\'y a pour l\'instant aucun champ dans ce formulaire.', # NEW
+       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?', # NEW
+       'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.', # NEW
+       'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.', # NEW
+       'construire_position_fin_formulaire' => 'À la fin du formulaire', # NEW
+       'construire_position_fin_groupe' => 'À la fin du groupe @groupe@', # NEW
+       'construire_position_label' => 'Position du champ', # NEW
+       'construire_reinitialiser' => 'Réinitialiser le formulaire', # NEW
+       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?', # NEW
+       'construire_verifications_aucune' => 'Aucune', # NEW
+       'construire_verifications_label' => 'Type de vérification à effectuer', # NEW
+
+       // E
+       'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies', # NEW
+       'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.', # NEW
+
+       // I
+       'info_configurer_saisies' => 'Page de test des Saisies', # NEW
+
+       // L
+       'label_annee' => 'Année',
+       'label_jour' => 'Jour',
+       'label_mois' => 'Mois',
+
+       // O
+       'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de l\'utilisateur',
+       'option_aff_art_interface_label' => 'Affichage multilingue',
+       'option_aff_langue_explication' => 'Affiche la langue de l\'article ou rubrique sélectionné devant le titre',
+       'option_aff_langue_label' => 'Afficher la langue',
+       'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de l\'utilisateur',
+       'option_aff_rub_interface_label' => 'Affichage multilingue',
+       'option_attention_explication' => 'Un message plus important que l\'explication.',
+       'option_attention_label' => 'Avertissement',
+       'option_autocomplete_defaut' => 'Laisser par défaut', # NEW
+       'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique', # NEW
+       'option_autocomplete_label' => 'Pré-remplissage du champ', # NEW
+       'option_autocomplete_off' => 'Désactiver', # NEW
+       'option_autocomplete_on' => 'Activer', # NEW
+       'option_cacher_option_intro_label' => 'Cacher le premier choix vide',
+       'option_choix_destinataires_explication' => 'Un ou plusieurs auteurs parmis lesquels l\'utilisateur pourra faire son choix. Si rien n\'est sélectionné, c\'est l\'auteur qui a installé le site qui sera choisi.',
+       'option_choix_destinataires_label' => 'Destinataires possibles',
+       'option_class_label' => 'Classes CSS supplémentaires',
+       'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n\'est pas toujours appliquée car les styles CSS de ton site peuvent l\'annuler.',
+       'option_cols_label' => 'Largeur',
+       'option_datas_explication' => 'Tu dois indiquez un choix par ligne sous la forme "cle|Label du choix"',
+       'option_datas_label' => 'Liste des choix possibles',
+       'option_defaut_label' => 'Valeur par défaut',
+       'option_disable_avec_post_explication' => 'Identique à l\'option précédente mais poste quand même la valeur dans un champ caché.',
+       'option_disable_avec_post_label' => 'Désactiver mais poster',
+       'option_disable_explication' => 'Le champ ne peut plus obtenir le focus.',
+       'option_disable_label' => 'Désactiver le champ',
+       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).', # NEW
+       'option_erreur_obligatoire_label' => 'Message d\'obligation', # NEW
+       'option_explication_explication' => 'Si besoin, une courte phrase décrivant l\'objet du champ.',
+       'option_explication_label' => 'Explication',
+       'option_groupe_affichage' => 'Affichage',
+       'option_groupe_description' => 'Description',
+       'option_groupe_utilisation' => 'Utilisation',
+       'option_groupe_validation' => 'Validation',
+       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
+       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
+       'option_horaire_label' => 'Horaire', # NEW
+       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
+       'option_info_obligatoire_explication' => 'Tu peux modifier l\'indication d\'obligation par défaut : <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'Indication d\'obligation',
+       'option_inserer_barre_choix_edition' => 'barre d\'édition complète',
+       'option_inserer_barre_choix_forum' => 'barre des forums',
+       'option_inserer_barre_explication' => 'Insère une barre d\'outils du porte-plume si ce dernier est activé.',
+       'option_inserer_barre_label' => 'Insérer une barre d\'outils',
+       'option_label_case_label' => 'Label placé à côté de la case',
+       'option_label_explication' => 'Le titre qui sera affiché.',
+       'option_label_label' => 'Label',
+       'option_maxlength_explication' => 'L\'utilisateur ne pourra pas taper plus de caractères que ce nombre.',
+       'option_maxlength_label' => 'Nombre de caractères maximum',
+       'option_multiple_explication' => 'L\'utilisateur pourra sélectionner plusieurs valeurs',
+       'option_multiple_label' => 'Sélection multiple',
+       'option_nom_explication' => 'Un nom informatique qui identifiera le champ. Il ne doit contenir que des caractères alpha-numériques minuscules ou le caractère "_".',
+       'option_nom_label' => 'Nom du champ',
+       'option_obligatoire_label' => 'Champ obligatoire',
+       'option_option_intro_label' => 'Label du premier choix vide',
+       'option_option_statut_label' => 'Afficher les statuts', # NEW
+       'option_pliable_label' => 'Pliable',
+       'option_pliable_label_case' => 'Le groupe de champs pourra être replié.',
+       'option_plie_label' => 'Déjà plié',
+       'option_plie_label_case' => 'Si le groupe de champs est pliable, il sera déjà plié à l\'affichage du formulaire.',
+       'option_previsualisation_explication' => 'Si le porte-plume est activé, ajoute un onglet pour prévisualiser le rendu du texte saisi.',
+       'option_previsualisation_label' => 'Activer la prévisualisation',
+       'option_readonly_explication' => 'Le champ peut être lu, sélectionné, mais pas modifié.',
+       'option_readonly_label' => 'Lecture seule',
+       'option_rows_explication' => 'Hauteur du bloc en nombre de ligne. Cette option n\'est pas toujours appliquée car les styles CSS de votre site peuvent l\'annuler.',
+       'option_rows_label' => 'Nombre de lignes',
+       'option_size_explication' => 'Largeur du champ en nombre de caractères. Cette option n\'est pas toujours appliquée car les styles CSS de ton site peuvent l\'annuler.',
+       'option_size_label' => 'Taille du champ',
+       'option_type_choix_plusieurs' => 'Permettre à l\'utilisateur de choisir <strong>plusieurs</strong> destinataires.',
+       'option_type_choix_tous' => 'Mettre <strong>tous</strong> ces auteurs en destinataires. L\'utilisateur n\'aura aucun choix.',
+       'option_type_choix_un' => 'Permettre à l\'utilisateur de choisir <strong>un seul</strong> destinataire.',
+       'option_type_explication' => 'En mode "masqué", le contenu du champ ne sera pas visible.',
+       'option_type_label' => 'Type du champ',
+       'option_type_password' => 'Masqué',
+       'option_type_text' => 'Normal',
+
+       // S
+       'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs', # NEW
+       'saisie_auteurs_titre' => 'Auteurs', # NEW
+       'saisie_case_explication' => 'Permet d\'activer ou de désactiver quelque chose.',
+       'saisie_case_titre' => 'Case unique',
+       'saisie_checkbox_explication' => 'Permet de choisir plusieurs options avec des cases.',
+       'saisie_checkbox_titre' => 'Cases à cocher',
+       'saisie_date_explication' => 'Permet de saisir une date ? l\'aide d\'un calendrier',
+       'saisie_date_titre' => 'Date',
+       'saisie_destinataires_explication' => 'Permet de choisir un ou plusieurs destinataires parmis des auteurs pré-sélectionné.',
+       'saisie_destinataires_titre' => 'Destinataires',
+       'saisie_explication_explication' => 'Un texte explicatif général.',
+       'saisie_explication_titre' => 'Explication',
+       'saisie_fieldset_explication' => 'Un cadre qui pourra englober plusieurs champs.',
+       'saisie_fieldset_titre' => 'Groupe de champs',
+       'saisie_file_explication' => 'Envoi d\'un fichier',
+       'saisie_file_titre' => 'Fichier',
+       'saisie_hidden_explication' => 'Un champ pré-rempli que l\'utilisateur ne pourra pas voir.',
+       'saisie_hidden_titre' => 'Champ caché',
+       'saisie_input_explication' => 'Une simple ligne de texte, pouvant être visible ou masquée (mot de passe).',
+       'saisie_input_titre' => 'Ligne de texte',
+       'saisie_oui_non_explication' => 'Oui ou non, c\'est clair ? :)',
+       'saisie_oui_non_titre' => 'Oui ou non',
+       'saisie_radio_defaut_choix1' => 'Un',
+       'saisie_radio_defaut_choix2' => 'Deux',
+       'saisie_radio_defaut_choix3' => 'Trois',
+       'saisie_radio_explication' => 'Permet de choisir une option parmis plusieurs disponibles.',
+       'saisie_radio_titre' => 'Boutons radios',
+       'saisie_selecteur_article' => 'Affiche un navigateur de sélection d\'article',
+       'saisie_selecteur_article_titre' => 'Sélecteur d\'article',
+       'saisie_selecteur_rubrique' => 'Affiche un navigateur de sélection de rubrique',
+       'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection d\'article ou de rubrique',
+       'saisie_selecteur_rubrique_article_titre' => 'Sélecteur d\'article ou rubrique',
+       'saisie_selecteur_rubrique_titre' => 'Sélecteur de rubrique',
+       'saisie_selection_explication' => 'Choisir une option dans une liste déroulante.',
+       'saisie_selection_multiple_explication' => 'Permet de choisir plusieurs options avec une liste.',
+       'saisie_selection_multiple_titre' => 'Sélection multiple',
+       'saisie_selection_titre' => 'Liste déroulante',
+       'saisie_textarea_explication' => 'Un champ de texte sur plusieurs lignes.',
+       'saisie_textarea_titre' => 'Bloc de texte',
+
+       // T
+       'tous_visiteurs' => 'Tous les visiteurs (même non enregistrés)',
+       'tout_selectionner' => 'Tout sélectionner', # NEW
+
+       // V
+       'vue_sans_reponse' => '<i>Sans réponse</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_it.php b/www/plugins/saisies/lang/saisies_it.php
new file mode 100644 (file)
index 0000000..81f69d5
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Sfoglia l\'articolo',
+       'bouton_parcourir_docs_breve' => 'Sfoglia la breve',
+       'bouton_parcourir_docs_rubrique' => 'Sfoglia la rubrica',
+       'bouton_parcourir_mediatheque' => 'Sfoglia la mediateca',
+
+       // C
+       'construire_action_annuler' => 'Annulla',
+       'construire_action_configurer' => 'Configura',
+       'construire_action_deplacer' => 'Sposta',
+       'construire_action_dupliquer' => 'Duplica',
+       'construire_action_dupliquer_copie' => '(copia)',
+       'construire_action_supprimer' => 'Elimina',
+       'construire_ajouter_champ' => 'Aggiungi un campo',
+       'construire_attention_enregistrer' => 'Non dimenticare di salvare le tue modifiche!',
+       'construire_attention_modifie' => 'Il modulo in oggetto è diverso dal modulo iniziale. Hai la possibilità di reinizializzare il suo stato a quello precedente alle modifiche.',
+       'construire_attention_supprime' => 'Le modifiche includono l\'eliminazione di alcuni campi. Conferma il salvataggio di questa nuova versione del modulo.',
+       'construire_aucun_champs' => 'Al momento non è presente alcun campo in questo modulo.',
+       'construire_confirmer_supprimer_champ' => 'Vuoi veramente eliminare questo campo?',
+       'construire_info_nb_champs_masques' => '@nb@ campo(i) con maschera. Configura il gruppo.',
+       'construire_position_explication' => 'Indica prima di quale altro campo sarà spostato quello corrente.',
+       'construire_position_fin_formulaire' => 'Alla fine del modulo',
+       'construire_position_fin_groupe' => 'Alla fine del gruppo @groupe@',
+       'construire_position_label' => 'Posizione del campo',
+       'construire_reinitialiser' => 'Reinizializza il modulo',
+       'construire_reinitialiser_confirmer' => 'Perderai tutte le modifiche. Sei sicuro di voler tornare al modulo iniziale?',
+       'construire_verifications_aucune' => 'Nessuna',
+       'construire_verifications_label' => 'Tipo di verifica da effettuare',
+
+       // E
+       'erreur_generique' => 'Ci sono degli errori nei campi di seguito, si prega di verificare gli inserimenti',
+       'erreur_option_nom_unique' => 'Questo nome è già utilizzato da un altro campo e deve essere univoco all\'interno del modulo.',
+
+       // I
+       'info_configurer_saisies' => 'Pagina di test di Saisies',
+
+       // L
+       'label_annee' => 'Anno',
+       'label_jour' => 'Giorno',
+       'label_mois' => 'Mese',
+
+       // O
+       'option_aff_art_interface_explication' => 'Mostra unicamente gli articoli della lingua dell\'utente',
+       'option_aff_art_interface_label' => 'Visualizzazione multilingua',
+       'option_aff_langue_explication' => 'Mostra la lingua dell\'articolo o della rubrica selezionata davanti al titolo',
+       'option_aff_langue_label' => 'Mostra la lingua',
+       'option_aff_rub_interface_explication' => 'Mostra unicamente le rubriche della lingua dell\'utente',
+       'option_aff_rub_interface_label' => 'Visualizzazione multilingua',
+       'option_attention_explication' => 'Un messaggio più importante dei una spiegazione.',
+       'option_attention_label' => 'Avvertimento',
+       'option_autocomplete_defaut' => 'Lascia predefinito',
+       'option_autocomplete_explication' => 'Al caricamento della pagina, il tuo navigatore può preimpostare il campo in funzione della sua storia',
+       'option_autocomplete_label' => 'Preimpostazione del campo',
+       'option_autocomplete_off' => 'Disattiva',
+       'option_autocomplete_on' => 'Attiva',
+       'option_cacher_option_intro_label' => 'Nascondi la prima scelta vuota',
+       'option_choix_destinataires_explication' => 'Uno o più autori tra i quali l\'utente potrà fare una scelta. Se non si seleziona niente, è l\'autore che ha installato il sito che sarà scelto.',
+       'option_choix_destinataires_label' => 'Possibili destinatari',
+       'option_class_label' => 'Classi CSS supplementari',
+       'option_cols_explication' => 'Larghezza del blocco in numero di caratteri. Questa opzione non è sempre applicata poichè gli stili CSS la possono annullare.',
+       'option_cols_label' => 'Larghezza',
+       'option_datas_explication' => 'Indica una scelta per riga con il formato "chiave|Etichetta della scelta"',
+       'option_datas_label' => 'Elenco delle scelte possibili',
+       'option_defaut_label' => 'Valore predefinito',
+       'option_disable_avec_post_explication' => 'Identica all\'opzione precedente ma invia lo stesso il valore in un campo nascosto.',
+       'option_disable_avec_post_label' => 'Disattiva ma invia',
+       'option_disable_explication' => 'Il campo non può ottenere il focus.',
+       'option_disable_label' => 'Disattiva il campo',
+       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).', # NEW
+       'option_erreur_obligatoire_label' => 'Message d\'obligation', # NEW
+       'option_explication_explication' => 'Se necessario, una frase breve che descrive il campo.',
+       'option_explication_label' => 'Spiegazione',
+       'option_groupe_affichage' => 'Visualizzazione',
+       'option_groupe_description' => 'Descrizione',
+       'option_groupe_utilisation' => 'Utilizzazione',
+       'option_groupe_validation' => 'Validazione',
+       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
+       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
+       'option_horaire_label' => 'Horaire', # NEW
+       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
+       'option_info_obligatoire_explication' => 'Puoi modificare l\'indicazione predefinita per i campi obbligatori : <i>[Obbligatorio]</i>.',
+       'option_info_obligatoire_label' => 'Indicazione obbligatorio',
+       'option_inserer_barre_choix_edition' => 'barra del testo completa',
+       'option_inserer_barre_choix_forum' => 'barra dei forum',
+       'option_inserer_barre_explication' => 'Inserisci una barra del testo se disponibile (porte-plume attivo).',
+       'option_inserer_barre_label' => 'Inserisci una barra di utility',
+       'option_label_case_label' => 'Etichetta a lato della casella',
+       'option_label_explication' => 'Il titolo che sarà mostrato.',
+       'option_label_label' => 'Etichetta',
+       'option_maxlength_explication' => 'L\'utente non può digiatare più caratteri del numero qui indicato.',
+       'option_maxlength_label' => 'Numero massimo di caratteri',
+       'option_multiple_explication' => 'L\'utente può selezionare più valori',
+       'option_multiple_label' => 'Scelta multipla',
+       'option_nom_explication' => 'Un nome informatico che indentifica il campo. Deve contentere solo caratteri alfanumerici minuscoli o il carattere "_".',
+       'option_nom_label' => 'Nome del campo',
+       'option_obligatoire_label' => 'Campo obbligatorio',
+       'option_option_intro_label' => 'Etichetta del primo campo vuoto',
+       'option_option_statut_label' => 'Mostra gli stati',
+       'option_pliable_label' => 'Richiudibile',
+       'option_pliable_label_case' => 'Il gruppo di campi può essere chiuso.',
+       'option_plie_label' => 'Già chiuso',
+       'option_plie_label_case' => 'Se il gruppo di campi è richiudibile, sarà già chiuso alla visualizzazione del modulo.',
+       'option_previsualisation_explication' => 'Se porte-plume è attivo, aggiungi una scheda per previsualizzare la resa del testo inserito.',
+       'option_previsualisation_label' => 'Attiva la previsualizzazione',
+       'option_readonly_explication' => 'Il campo può essere letto, selezionato, ma non modificato.',
+       'option_readonly_label' => 'Sola lettura',
+       'option_rows_explication' => 'Altezza del blocco in numero ri righe. Questa opzione non è sempre applicata poichè gli stili CSS del sito potrebbero annullarla.',
+       'option_rows_label' => 'Numero di righe',
+       'option_size_explication' => 'Larghezza del campo in numero di caratteri. Questa opzione non è sempre applicata poich%egrave; gli stili CSS del sito potrebbero annullarla.',
+       'option_size_label' => 'Dimensione del campo',
+       'option_type_choix_plusieurs' => 'Consenti all\'utente di scegliere <strong>più</strong> destinatari.',
+       'option_type_choix_tous' => 'Imposta <strong>tutti</strong> questi autori come destinatari. L\'utente non avrà alcuna scelta.',
+       'option_type_choix_un' => 'Consenti all\'utente di scegliere <strong>un solo</strong> destinatario.',
+       'option_type_explication' => 'In modalità "mascherata", il contenuto del campo non sarà visibile.',
+       'option_type_label' => 'Tipo del campo',
+       'option_type_password' => 'Mascherato',
+       'option_type_text' => 'Normale',
+
+       // S
+       'saisie_auteurs_explication' => 'Consente di selezionare uno o più autori',
+       'saisie_auteurs_titre' => 'Autori',
+       'saisie_case_explication' => 'Consente di attivare o disattivare qualcosa.',
+       'saisie_case_titre' => 'Casella di spunta',
+       'saisie_checkbox_explication' => 'Consente di scegliere più opzioni da spuntare.',
+       'saisie_checkbox_titre' => 'Caselle di spunta',
+       'saisie_date_explication' => 'Consente di inserire una data con l\'aiuto di un calendario',
+       'saisie_date_titre' => 'Data',
+       'saisie_destinataires_explication' => 'Consente di scegliere uno o più destinatari tra gli autore selezionati.',
+       'saisie_destinataires_titre' => 'Destinatari',
+       'saisie_explication_explication' => 'Un testo esplicativo generale.',
+       'saisie_explication_titre' => 'Spiegazione',
+       'saisie_fieldset_explication' => 'Un blocco che può contenere più campi.',
+       'saisie_fieldset_titre' => 'Gruppo di campi',
+       'saisie_file_explication' => 'Invio di un file',
+       'saisie_file_titre' => 'File',
+       'saisie_hidden_explication' => 'Un campo preimpostato che l\'utente non potrà vedere.',
+       'saisie_hidden_titre' => 'Campo nascosto',
+       'saisie_input_explication' => 'Una semplice riga di testo, che può essere visibile o mascherata (password).',
+       'saisie_input_titre' => 'Riga di testo',
+       'saisie_oui_non_explication' => 'Si o no',
+       'saisie_oui_non_titre' => 'Si o no',
+       'saisie_radio_defaut_choix1' => 'Uno',
+       'saisie_radio_defaut_choix2' => 'Due',
+       'saisie_radio_defaut_choix3' => 'Tre',
+       'saisie_radio_explication' => 'Consente di scegliere un\'opzione tra più disponibili.',
+       'saisie_radio_titre' => 'Scelta unica',
+       'saisie_selecteur_article' => 'Mostra un navigatore per la selezione di un articolo',
+       'saisie_selecteur_article_titre' => 'Selettore d\'articolo',
+       'saisie_selecteur_rubrique' => 'Mostra un navigatore per la selezione di una rubrica',
+       'saisie_selecteur_rubrique_article' => 'Mostra un navigatore per la selezione di un articolo o di una rubrica',
+       'saisie_selecteur_rubrique_article_titre' => 'Selettore d\'articolo o rubrica',
+       'saisie_selecteur_rubrique_titre' => 'Selettore di rubrica',
+       'saisie_selection_explication' => 'Scegli una opzione nel menu a tendina.',
+       'saisie_selection_multiple_explication' => 'Consente di scegliere più opzioni con un elenco.',
+       'saisie_selection_multiple_titre' => 'Scelta multipla',
+       'saisie_selection_titre' => 'Menu a tendina',
+       'saisie_textarea_explication' => 'Un campo di testo su più linee.',
+       'saisie_textarea_titre' => 'Blocco di testo',
+
+       // T
+       'tous_visiteurs' => 'Tutti gli utenti (anche non registrati)',
+       'tout_selectionner' => 'Tout sélectionner', # NEW
+
+       // V
+       'vue_sans_reponse' => '<i>Senza risposta</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_ru.php b/www/plugins/saisies/lang/saisies_ru.php
new file mode 100644 (file)
index 0000000..7778323
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Посмотреть статью',
+       'bouton_parcourir_docs_breve' => 'Посмотреть новость',
+       'bouton_parcourir_docs_rubrique' => 'Посмотреть раздел',
+       'bouton_parcourir_mediatheque' => 'Изменить библиотеку мультимедиа',
+
+       // C
+       'construire_action_annuler' => 'Отменить',
+       'construire_action_configurer' => 'Настройки',
+       'construire_action_deplacer' => 'Переместить',
+       'construire_action_dupliquer' => 'Сделать копию',
+       'construire_action_dupliquer_copie' => '(копия)',
+       'construire_action_supprimer' => 'Удалить',
+       'construire_ajouter_champ' => 'Добавить поле',
+       'construire_attention_enregistrer' => 'Не забудьте сохранить внесенные изменения!',
+       'construire_attention_modifie' => 'На этой странице у вас есть возможность редактировать форму. Для того, чтобы вернуться к списку выбора форм, нажмите на кнопку ниже',
+       'construire_attention_supprime' => 'Изменения включают удаление полей. Пожалуйста, подтвердите регистрацию новой формы.',
+       'construire_aucun_champs' => 'На данный момент поля в форме отсутствуют',
+       'construire_confirmer_supprimer_champ' => 'Вы действительно хотите удалить это поле??',
+       'construire_info_nb_champs_masques' => '@nb@ скрытых полей',
+       'construire_position_explication' => 'На какое поле заменить?',
+       'construire_position_fin_formulaire' => 'В конце формы',
+       'construire_position_fin_groupe' => 'В конце группы @groupe@',
+       'construire_position_label' => 'Замена поля',
+       'construire_reinitialiser' => 'Вернуться назад',
+       'construire_reinitialiser_confirmer' => 'Вы действительно хотите вернуться назад?',
+       'construire_verifications_aucune' => 'Не проверять',
+       'construire_verifications_label' => 'Тип проверки',
+
+       // E
+       'erreur_generique' => 'Вы допустили ошибку! Проверьте введенную Вами информацию.',
+       'erreur_option_nom_unique' => 'Такое название поля уже используется.',
+
+       // I
+       'info_configurer_saisies' => 'Тестовая страница формы',
+
+       // L
+       'label_annee' => 'Год',
+       'label_jour' => 'День',
+       'label_mois' => 'Месяц',
+
+       // O
+       'option_aff_art_interface_explication' => 'Отображать только статьи в настройках языка пользователя',
+       'option_aff_art_interface_label' => 'Многоязычное отображение',
+       'option_aff_langue_explication' => 'Показать выбранный язык статьи или раздела перед названием',
+       'option_aff_langue_label' => 'Показать текущий язык',
+       'option_aff_rub_interface_explication' => 'Отображать только разделы в языковых настройках пользователя.',
+       'option_aff_rub_interface_label' => 'Многоязычное отображение',
+       'option_attention_explication' => 'Сообщение, которое является более важным нежели комментарий.',
+       'option_attention_label' => 'Примечание!',
+       'option_autocomplete_defaut' => 'По умолчанию',
+       'option_autocomplete_explication' => 'При загрузке страницы браузер может предварительно заполнить поля на основании истории',
+       'option_autocomplete_label' => 'Предварительное заполнение поля',
+       'option_autocomplete_off' => 'Отключить',
+       'option_autocomplete_on' => 'Включить',
+       'option_cacher_option_intro_label' => 'Не отображать первый пустой вариант',
+       'option_choix_destinataires_explication' => 'Один или несколько авторов, среди которых пользователь может сделать свой ​​выбор. Если ничего не выбрано, то то будет выбран автор, который сейчас на сайте.',
+       'option_choix_destinataires_label' => 'Возможные получатели',
+       'option_class_label' => 'Дополнительные CSS классы',
+       'option_cols_explication' => 'Длина поля в символах. С помощью CSS возможно переопределить значение данного поля.',
+       'option_cols_label' => 'Ширина',
+       'option_datas_explication' => 'Укажите возможные варианты в формате: ключ|вариант',
+       'option_datas_label' => 'Список возможных вариантов',
+       'option_defaut_label' => 'Выводить по умолчанию',
+       'option_disable_avec_post_explication' => 'Такой же вариант как и предыдущий, но вносит значение в скрытое поле.',
+       'option_disable_avec_post_label' => 'Отключено, но опубликовано.',
+       'option_disable_explication' => 'Поле не может получить фокус',
+       'option_disable_label' => 'Сделать поле неактивным',
+       'option_erreur_obligatoire_explication' => 'Настройте сообщения об ошибке для обязательных полей (в противном случае - оставьте пустым) ',
+       'option_erreur_obligatoire_label' => 'Обязательное сообщение',
+       'option_explication_explication' => 'Краткое описание (по необходимости)',
+       'option_explication_label' => 'Комментарий',
+       'option_groupe_affichage' => 'Показать',
+       'option_groupe_description' => 'Описание',
+       'option_groupe_utilisation' => 'Использование',
+       'option_groupe_validation' => 'Валидация',
+       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
+       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
+       'option_horaire_label' => 'Horaire', # NEW
+       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
+       'option_info_obligatoire_explication' => 'Вы можете изменить стандартные настройки обязательного заполнения полей.. ',
+       'option_info_obligatoire_label' => 'Обязательное заполнение полей',
+       'option_inserer_barre_choix_edition' => 'Да',
+       'option_inserer_barre_choix_forum' => 'Только форум',
+       'option_inserer_barre_explication' => 'Вставить porte-plume?',
+       'option_inserer_barre_label' => 'Панель управления',
+       'option_label_case_label' => 'Позиция чекбокса',
+       'option_label_explication' => 'Название поля',
+       'option_label_label' => 'Название',
+       'option_maxlength_explication' => 'Пользователь не может ввести больше знаков чем:',
+       'option_maxlength_label' => 'Максимальное к-во символов',
+       'option_multiple_explication' => 'Пользователю предоставляется возможность выбрать несколько вариантов',
+       'option_multiple_label' => 'Множественный выбор',
+       'option_nom_explication' => 'ID компьютера , который идентифицирует поле. Он может содержать только строчные буквы и цифры и символ подчеркивания "_".',
+       'option_nom_label' => 'Название поля',
+       'option_obligatoire_label' => 'Поле обязательное для заполнения',
+       'option_option_intro_label' => 'Обозначение для пустого выбора',
+       'option_option_statut_label' => 'Показать статус',
+       'option_pliable_label' => 'Расширяемая',
+       'option_pliable_label_case' => 'Группы полей могут быть расширены или сжаты.',
+       'option_plie_label' => 'Сжато.',
+       'option_plie_label_case' => 'Если группу полей можно расширить или сжать, тогда эта опция их сожмет с отображением полей.',
+       'option_previsualisation_explication' => 'Создать вкладку для просмотра введенного текста?',
+       'option_previsualisation_label' => 'Просмотр',
+       'option_readonly_explication' => 'Поле можно просмотреть, выбрать, но изменить нельзя.',
+       'option_readonly_label' => 'Только чтение',
+       'option_rows_explication' => 'Высота поля в строках.',
+       'option_rows_label' => 'Высота',
+       'option_size_explication' => 'Длина поля в символах.',
+       'option_size_label' => 'Размер поля',
+       'option_type_choix_plusieurs' => 'Позволяет выбрать <strong>несколько</strong> получателей.',
+       'option_type_choix_tous' => 'Отметить <strong>всех</strong> авторов как получателей. Пользователю выбор не предоставляется.',
+       'option_type_choix_un' => 'Сделать возможным выбор только одного получателя.',
+       'option_type_explication' => 'В "скрытом" режиме содержимое поля будет отображаться в виде звездочек.',
+       'option_type_label' => 'Тип поля',
+       'option_type_password' => 'Скрытый',
+       'option_type_text' => 'Нормальный',
+
+       // S
+       'saisie_auteurs_explication' => 'Позволяет выбрать одного или несколько авторов.',
+       'saisie_auteurs_titre' => 'Автора',
+       'saisie_case_explication' => 'Используется для включения/отключения определенной опции.',
+       'saisie_case_titre' => 'Единичный выбор ',
+       'saisie_checkbox_explication' => 'Используется для выбора нескольких вариантов при помощи check-box.',
+       'saisie_checkbox_titre' => 'Чекбокс',
+       'saisie_date_explication' => 'Используется для ввода даты при помощи календаря.',
+       'saisie_date_titre' => 'Дата',
+       'saisie_destinataires_explication' => 'Используется для выбора одного или нескольких получателей из числа предварительно выбранных авторов.',
+       'saisie_destinataires_titre' => 'Получатели',
+       'saisie_explication_explication' => 'Многострочное поле input',
+       'saisie_explication_titre' => 'Информация',
+       'saisie_fieldset_explication' => 'Форма, которая содержит несколько полей.',
+       'saisie_fieldset_titre' => 'Филдсет',
+       'saisie_file_explication' => 'Отправить файл',
+       'saisie_file_titre' => 'Файл',
+       'saisie_hidden_explication' => 'Предварительно заполненные поля, которые недоступны пользователю.',
+       'saisie_hidden_titre' => 'Скрытое поле',
+       'saisie_input_explication' => 'Строчка текста, которая может быть как скрытой так и видимой (пароль).',
+       'saisie_input_titre' => 'Текстовое поле',
+       'saisie_oui_non_explication' => 'Или ДА или НЕТ ',
+       'saisie_oui_non_titre' => 'Да или нет',
+       'saisie_radio_defaut_choix1' => 'Один',
+       'saisie_radio_defaut_choix2' => 'Два',
+       'saisie_radio_defaut_choix3' => 'Три',
+       'saisie_radio_explication' => 'Используется для выбора одной опции из нескольких.',
+       'saisie_radio_titre' => 'Радио кнопка',
+       'saisie_selecteur_article' => 'Отобразить браузер выбора статьи',
+       'saisie_selecteur_article_titre' => 'Селектор статьи',
+       'saisie_selecteur_rubrique' => 'Отобразить браузер выбора раздела',
+       'saisie_selecteur_rubrique_article' => 'Отобразить браузер выбора статьи или раздела',
+       'saisie_selecteur_rubrique_article_titre' => 'Селектор статьи или раздела.',
+       'saisie_selecteur_rubrique_titre' => 'Селектор раздела.',
+       'saisie_selection_explication' => 'Выбрать пункт из выпадающего списка.',
+       'saisie_selection_multiple_explication' => 'Используется для выбора нескольких вариантов из списка.',
+       'saisie_selection_multiple_titre' => 'Множественный выбор',
+       'saisie_selection_titre' => 'Выпадающий список',
+       'saisie_textarea_explication' => 'Многострочное текстовое поле',
+       'saisie_textarea_titre' => 'Текстовое поле',
+
+       // T
+       'tous_visiteurs' => 'Все посетители (в том числе не зарегистрированы)',
+       'tout_selectionner' => 'Tout sélectionner', # NEW
+
+       // V
+       'vue_sans_reponse' => '<i>Без ответа</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/saisies_sk.php b/www/plugins/saisies/lang/saisies_sk.php
new file mode 100644 (file)
index 0000000..27c54ab
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Prehľadať článok',
+       'bouton_parcourir_docs_breve' => 'Prehľadať novinku',
+       'bouton_parcourir_docs_rubrique' => 'Prehľadať rubriku',
+       'bouton_parcourir_mediatheque' => 'Prehľadať knižnicu multimédií',
+
+       // C
+       'construire_action_annuler' => 'Zrušiť',
+       'construire_action_configurer' => 'Nastaviť',
+       'construire_action_deplacer' => 'Presunúť',
+       'construire_action_dupliquer' => 'Duplikovať',
+       'construire_action_dupliquer_copie' => '(kópia)',
+       'construire_action_supprimer' => 'Odstrániť',
+       'construire_ajouter_champ' => 'Pridať pole',
+       'construire_attention_enregistrer' => 'Nezabudnite uložiť zmeny!',
+       'construire_attention_modifie' => 'Tento formulár sa odlišuje od pôvodného. Máte možnosť ho obnoviť do stavu pred svojimi zmenami.',
+       'construire_attention_supprime' => 'Medzi vašimi zmenami je vymazanie niekoľkých polí. Potvrďte, prosím, registráciu tejto verzie formulára.',
+       'construire_aucun_champs' => 'V tomto formulári nie je momentálne žiadne pole',
+       'construire_confirmer_supprimer_champ' => 'Chcete odstrániť toto pole?',
+       'construire_info_nb_champs_masques' => '@nb@ skryté (-ých) pole (-í/-ia) času na nastavenie skupiny.',
+       'construire_position_explication' => 'Uveďte akékoľvek ďalšie pole predtým, ako sa vloží.',
+       'construire_position_fin_formulaire' => 'Na koniec formulára',
+       'construire_position_fin_groupe' => 'Na koniec skupiny @groupe@',
+       'construire_position_label' => 'Umiestnenie poľa',
+       'construire_reinitialiser' => 'Znova načítať formulár',
+       'construire_reinitialiser_confirmer' => 'Stratíte všetky svoje zmeny. Určite sa chcete vrátiť na pôvodný formulár?',
+       'construire_verifications_aucune' => 'Žiadne',
+       'construire_verifications_label' => 'Typ overenia, ktorý sa má vykonať',
+
+       // E
+       'erreur_generique' => 'V poliach sú chyby; prosím, skontrolujte údaje, ktoré ste zadali',
+       'erreur_option_nom_unique' => 'Tento názov už používa iné pole, a v tomto formulári musí byť jedinečný.',
+
+       // I
+       'info_configurer_saisies' => 'Testovacia stránka Saisies',
+
+       // L
+       'label_annee' => 'Rok',
+       'label_jour' => 'Deň',
+       'label_mois' => 'Mesiac',
+
+       // O
+       'option_aff_art_interface_explication' => 'Zobrazovať len články v jazyku používateľa',
+       'option_aff_art_interface_label' => 'Viacjazyčné zobrazenie',
+       'option_aff_langue_explication' => 'Pred názvom zobraziť vybratý jazyk článku alebo rubriky',
+       'option_aff_langue_label' => 'Zobraziť jazyk',
+       'option_aff_rub_interface_explication' => 'Zobraziť len rubriky v jazyku používateľa',
+       'option_aff_rub_interface_label' => 'Viacjazyčné zobrazenie',
+       'option_attention_explication' => 'Správa je dôležitejšia ako vysvetlivka.',
+       'option_attention_label' => 'Varovanie',
+       'option_autocomplete_defaut' => 'Nechať ako predvolené',
+       'option_autocomplete_explication' => 'Pri nahrávaní stránky môže váš prehliadač automaticky vyplniť polia podľa histórie',
+       'option_autocomplete_label' => 'Automaticky vyplniť pole',
+       'option_autocomplete_off' => 'Deaktivovať',
+       'option_autocomplete_on' => 'Aktivovať',
+       'option_cacher_option_intro_label' => 'Skryť prvý prázdny výber',
+       'option_choix_destinataires_explication' => 'Jeden autor alebo viacerí, z ktorých si používateľ môže vybrať. Ak nie je vybratý žiaden, vyberie sa autor, ktorý nainštaloval stránku.',
+       'option_choix_destinataires_label' => 'Možní príjemcovia',
+       'option_class_label' => 'Ďalšie triedy CSS',
+       'option_cols_explication' => 'Šírka poľa v znakoch. Táto možnosť sa vždy nepoužíva, lebo štýly CSS na vašej stránke ju môžu prepísať.',
+       'option_cols_label' => 'Šírka',
+       'option_datas_explication' => 'Musíte definovať výber pre každý riadok vo formulári "kľúč|označenie výberu"',
+       'option_datas_label' => 'Zoznam dostupných možností',
+       'option_defaut_label' => 'Predvolená hodnota',
+       'option_disable_avec_post_explication' => 'Rovnaká ako predošlá možnosť, ale hodnotu pošle v skrytom poli.',
+       'option_disable_avec_post_label' => 'Deaktivovať ale poslať.',
+       'option_disable_explication' => 'Na pole sa nedá zacieliť.',
+       'option_disable_label' => 'Deaktivovať pole',
+       'option_erreur_obligatoire_explication' => 'Zobrazovanú chybovú správu môžete upraviť tak, aby označovala povinnosť',
+       'option_erreur_obligatoire_label' => 'Správa s povinnosťou',
+       'option_explication_explication' => 'Ak je to potrebné, krátka veta popisujúca zmysel daného poľa.',
+       'option_explication_label' => 'Vysvetlenie',
+       'option_groupe_affichage' => 'Zobraziť',
+       'option_groupe_description' => 'Popis',
+       'option_groupe_utilisation' => 'Použitie',
+       'option_groupe_validation' => 'Overenie',
+       'option_heure_pas_explication' => 'Pri používaní diára sa zobrazí menu, ktoré vám pomôže zadať hodiny a minúty. Tak môžete vybrať časový interval pre každý údaj (predvolený – 30 min).',
+       'option_heure_pas_label' => 'Interval v minútach v menu pomocníka k zápisu do poľa',
+       'option_horaire_label' => 'Diár',
+       'option_horaire_label_case' => 'Povoliť zápis do diára',
+       'option_info_obligatoire_explication' => 'Môžete zmeniť predvolenú povinnosť vyplniť polia: <i>[Povinné]</i>.',
+       'option_info_obligatoire_label' => 'Označenie povinnosti',
+       'option_inserer_barre_choix_edition' => 'celý editovací panel s nástrojmi',
+       'option_inserer_barre_choix_forum' => 'panel s nástrojmi pre diskusné fóra',
+       'option_inserer_barre_explication' => 'Vložiť panel s nástrojmi porte-plume, ak je tento nástroj aktivovaný.',
+       'option_inserer_barre_label' => 'Vložiť panel s nástrojmi',
+       'option_label_case_label' => 'Označenie sa nachádza pod zaškrtávacím políčkom',
+       'option_label_explication' => 'Zobrazí sa nadpis.',
+       'option_label_label' => 'Označenie',
+       'option_maxlength_explication' => 'Používateľ nemôže napísať viac znakov ako určuje toto číslo.',
+       'option_maxlength_label' => 'Maximálny počet znakov',
+       'option_multiple_explication' => 'Používateľ si bude môcť vybrať niekoľko hodnôt',
+       'option_multiple_label' => 'Výber z viacerých možností',
+       'option_nom_explication' => 'Počítačový názov, ktorý pomenúva pole. Môžu v ňom byť malé písmená abecedy alebo podčiarkovník "_".',
+       'option_nom_label' => 'Názov poľa',
+       'option_obligatoire_label' => 'Povinné pole',
+       'option_option_intro_label' => 'Označenie prvého prázdneho výberu',
+       'option_option_statut_label' => 'Zobraziť stav',
+       'option_pliable_label' => 'Roztiahnuteľné',
+       'option_pliable_label_case' => 'Skupina polí sa dá roztiahnuť alebo stiahnuť.',
+       'option_plie_label' => 'Už stiahnutá',
+       'option_plie_label_case' => 'Ak sa dá skupina polí stiahnuť a roztiahnuť, táto možnosť ju v zobrazeniach formulára nastaví ako už stiahnutú.',
+       'option_previsualisation_explication' => 'Ak je aktivovaný porte-plume, pridať kartu do ukážky vzhľadu zadaného textu.',
+       'option_previsualisation_label' => 'Aktivovať ukážky',
+       'option_readonly_explication' => 'Toto pole môžete zobraziť, vybrať, ale nie upravovať.',
+       'option_readonly_label' => 'Len na čítanie',
+       'option_rows_explication' => 'Výška poľa v riadkoch. Táto možnosť sa nepoužije vždy, pretože  štýly CSS na vašej stránke ju môžu zmeniť.',
+       'option_rows_label' => 'Počet riadkov',
+       'option_size_explication' => 'Šírka poľa v riadkoch. Táto možnosť sa nepoužije vždy, pretože štýly CSS na vašej stránke ju môžu zmeniť.',
+       'option_size_label' => 'Veľkosť poľa',
+       'option_type_choix_plusieurs' => 'Umožní používateľovi vybrať si <strong>mnohých</ strong> príjemcov.',
+       'option_type_choix_tous' => 'Urobiť príjemcov zo <strong>všetkých</ strong> týchto autorov. Používateľ nebude mať na výber.',
+       'option_type_choix_un' => 'Povoliť používateľovi vybrať si <strong>jedného</ strong> príjemcu.',
+       'option_type_explication' => 'V režime hesla sa obsah napísaný do poľa nahradí hviezdičkami.',
+       'option_type_label' => 'Typ poľa',
+       'option_type_password' => 'Maskované',
+       'option_type_text' => 'Normálny',
+
+       // S
+       'saisie_auteurs_explication' => 'Umožňuje vám vybrať jedného alebo viacerých autorov',
+       'saisie_auteurs_titre' => 'Autori',
+       'saisie_case_explication' => 'Používa sa na aktivovanie alebo deaktivovanie konkrétnej možnosti.',
+       'saisie_case_titre' => 'Jedno zaškrtávacie políčko',
+       'saisie_checkbox_explication' => 'Používa sa na výber niekoľkých možností pomocou zaškrtávacích políčok.',
+       'saisie_checkbox_titre' => 'Zaškrtávacie políčka',
+       'saisie_date_explication' => 'Používa sa na zadávanie dátumu pomocou nástroja kalendára',
+       'saisie_date_titre' => 'Dátum',
+       'saisie_destinataires_explication' => 'Používa sa na výber jedného príjemcu alebo viacerých z dopredu vybraných autorov.',
+       'saisie_destinataires_titre' => 'Príjemcovia',
+       'saisie_explication_explication' => 'Všeobecný vysvetľujúci popis.',
+       'saisie_explication_titre' => 'Vysvetlenie',
+       'saisie_fieldset_explication' => 'Rám, v ktorom môže byť niekoľko polí.',
+       'saisie_fieldset_titre' => 'Skupina polí',
+       'saisie_file_explication' => 'Poslať súbor',
+       'saisie_file_titre' => 'Súbor',
+       'saisie_hidden_explication' => 'Predvyplnené pole, ktoré používateľ nikdy neuvidí.',
+       'saisie_hidden_titre' => 'Skryté pole',
+       'saisie_input_explication' => 'Jednoduchý riadok s textom, ktorý môže byť viditeľný alebo skrytý (heslo).',
+       'saisie_input_titre' => 'Textové pole',
+       'saisie_oui_non_explication' => 'Odpoveď buď Áno alebo Nie',
+       'saisie_oui_non_titre' => 'Áno alebo Nie',
+       'saisie_radio_defaut_choix1' => 'Jeden',
+       'saisie_radio_defaut_choix2' => 'Dva',
+       'saisie_radio_defaut_choix3' => 'Tri',
+       'saisie_radio_explication' => 'Používa sa na výber jednej možnosti z viacerých dostupných.',
+       'saisie_radio_titre' => 'Rádiové gombíky',
+       'saisie_selecteur_article' => 'Zobraziť prehliadač výberu článku',
+       'saisie_selecteur_article_titre' => 'Výber článku',
+       'saisie_selecteur_rubrique' => 'Zobraziť prehliadač výberu rubriky',
+       'saisie_selecteur_rubrique_article' => 'Zobraziť prehliadač výberu článku alebo rubriky',
+       'saisie_selecteur_rubrique_article_titre' => 'Výber článku alebo rubriky',
+       'saisie_selecteur_rubrique_titre' => 'Výber rubriky',
+       'saisie_selection_explication' => 'Vyberte možnosť z rozbaľovacieho zoznamu.',
+       'saisie_selection_multiple_explication' => 'Používa sa na výber niekoľkých možností zo zoznamu.',
+       'saisie_selection_multiple_titre' => 'Výber z viacerých možností',
+       'saisie_selection_titre' => 'Rozbaľovací zoznam',
+       'saisie_textarea_explication' => 'Textové pole s viacerými riadkami.',
+       'saisie_textarea_titre' => 'Blok textu',
+
+       // T
+       'tous_visiteurs' => 'Všetci návštevníci (aj ne­za­re­gis­tro­va­ní)',
+       'tout_selectionner' => 'Vybrať všetko',
+
+       // V
+       'vue_sans_reponse' => '<i>Bez reakcie</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
diff --git a/www/plugins/saisies/paquet.xml b/www/plugins/saisies/paquet.xml
new file mode 100644 (file)
index 0000000..dd2aae2
--- /dev/null
@@ -0,0 +1,29 @@
+<paquet\r
+       prefix="saisies"\r
+       categorie="outil"\r
+       version="1.31.4"\r
+       etat="test"\r
+       compatibilite="[2.0.0;3.0.*]"\r
+       logo="images/logo_saisie_48.png"\r
+       documentation="http://www.spip-contrib.net/Saisies"\r
+>\r
+       <nom>Saisies</nom>\r
+       <auteur lien="http://contrib.spip.net/Matthieu-Marcillaud">Matthieu Marcillaud</auteur>\r
+       <auteur lien="http://contrib.spip.net/RastaPopoulos">RastaPopoulos</auteur>\r
+       <auteur lien="http://contrib.spip.net/Joseph">Joseph</auteur>\r
+       <auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>\r
+       <licence>GNU/GPL</licence>\r
+       \r
+       <traduire module="saisies" reference="fr" gestionnaire="salvatore" />\r
+\r
+       <pipeline nom="header_prive" inclure="saisies_pipelines.php" />\r
+       <pipeline nom="affichage_final" inclure="saisies_pipelines.php" />\r
+       <pipeline nom="saisies_autonomes" inclure="saisies_pipelines.php" />\r
+       <pipeline nom="formulaire_saisies" inclure="saisies_pipelines.php" />\r
+       <pipeline nom="formulaire_charger" inclure="saisies_pipelines.php" />\r
+       <pipeline nom="formulaire_verifier" inclure="saisies_pipelines.php" />\r
+       <pipeline nom="styliser" inclure="saisies_pipelines.php" />\r
+\r
+       <utilise nom="verifier" />\r
+       <utilise nom="spip_bonux" />\r
+</paquet>\r
diff --git a/www/plugins/saisies/plugin.xml b/www/plugins/saisies/plugin.xml
new file mode 100644 (file)
index 0000000..cc84caa
--- /dev/null
@@ -0,0 +1,65 @@
+<plugin>\r
+    <nom><multi>[fr]Saisies pour formulaires[en]Entries for forms</multi></nom>\r
+       <slogan>Ecrire facilement des champs de formulaires</slogan>\r
+    <auteur>Matthieu Marcillaud - RastaPopoulos - Joseph</auteur>\r
+    <licence>&#169; 2009-2012 GNU/GPL</licence>\r
+    <version>1.31.4</version>\r
+    <etat>test</etat>\r
+    <categorie>outil</categorie>\r
+    \r
+       <description>\r
+               <multi>\r
+               [fr]\r
+               Ce plugin permet de faciliter l'&#233;criture de champs de formulaires en proposant une\r
+               balise #SAISIE. Le HTML g&#233;n&#233;r&#233; est compatible avec la nomenclature des formulaires\r
+               propos&#233;e par SPIP > 2.0 et avec le plugin de configuration CFG.\r
+               [en]\r
+               This plugin makes it easier to write form fields by providing a #SAISIE tag. \r
+               The generated HTML is compatible with the classification of forms\r
+               proposed by SPIP > 2.0 and with the configuration plugin CFG.\r
+               </multi>\r
+       </description>\r
+    \r
+    <lien>http://www.spip-contrib.net/Saisies</lien>\r
+    <prefix>saisies</prefix>\r
+    <icon>images/logo_saisie_48.png</icon>\r
+    \r
+    <fonctions>balise/saisie.php</fonctions>\r
+    <fonctions>inc/saisies.php</fonctions>\r
+    <fonctions>saisies_fonctions.php</fonctions>\r
+    <options>saisies_options.php</options>\r
+\r
+    <pipeline>\r
+       <nom>header_prive</nom>\r
+       <inclure>saisies_pipelines.php</inclure>\r
+    </pipeline>\r
+    <pipeline>\r
+       <nom>affichage_final</nom>\r
+       <inclure>saisies_pipelines.php</inclure>\r
+    </pipeline>\r
+       <pipeline>\r
+               <nom>saisies_autonomes</nom>\r
+               <inclure>saisies_pipelines.php</inclure>\r
+       </pipeline>\r
+       <pipeline>\r
+               <nom>formulaire_saisies</nom>\r
+               <inclure>saisies_pipelines.php</inclure>\r
+       </pipeline>\r
+       <pipeline>\r
+               <nom>formulaire_charger</nom>\r
+               <inclure>saisies_pipelines.php</inclure>\r
+       </pipeline>\r
+       <pipeline>\r
+               <nom>formulaire_verifier</nom>\r
+               <inclure>saisies_pipelines.php</inclure>\r
+       </pipeline>\r
+       <pipeline>\r
+               <nom>styliser</nom>\r
+               <inclure>saisies_pipelines.php</inclure>\r
+       </pipeline>\r
+    \r
+       <necessite id="SPIP" version="[2.0.0;3.0.99]" />\r
+       <utilise id="verifier" />\r
+       <utilise id="spip_bonux" />\r
+       <traduire gestionnaire="salvatore" module="saisies" reference="fr" />\r
+</plugin>\r
diff --git a/www/plugins/saisies/prive/exec/construire_formulaire.html b/www/plugins/saisies/prive/exec/construire_formulaire.html
new file mode 100644 (file)
index 0000000..5cd0537
--- /dev/null
@@ -0,0 +1,3 @@
+<h1><:saisies:info_configurer_saisies:></h1>
+
+<div class="ajax">#FORMULAIRE_CONSTRUIRE_FORMULAIRE{test,#ARRAY,#ARRAY{modifier_nom,oui,nom_unique,oui}}</div>
diff --git a/www/plugins/saisies/prive/listes/articles_originaux_recursifs.html b/www/plugins/saisies/prive/listes/articles_originaux_recursifs.html
new file mode 100644 (file)
index 0000000..c62602e
--- /dev/null
@@ -0,0 +1,14 @@
+[(#SET{iteration,#ENV{iteration,1}})]
+[(#SET{separateur,[(#ENV{separateur}|concat{&nbsp;&rsaquo;&nbsp;})]})]
+<BOUCLE_rubriques(RUBRIQUES){id_parent}{tout}>
+       <optgroup label="#GET{separateur}#TITRE">
+               <BOUCLE_articles_originaux(ARTICLES){id_rubrique}{origine_traduction}>
+               [(#ENV{multiple}|oui)
+               <option value="#ID_ARTICLE"[(#ID_ARTICLE|in_array{#ENV{valeur,#ENV{defaut,#ARRAY}}}|oui) selected="selected"]>#GET{separateur}#TITRE</option>]
+               [(#ENV{multiple}|non)
+               <option value="#ID_ARTICLE"[(#ID_ARTICLE|=={#ENV{valeur,#ENV{defaut}}}|oui) selected="selected"]>#GET{separateur}#TITRE</option>]
+               <INCLURE{fond=prive/listes/articles_originaux_recursifs}{valeur=#ENV{valeur}}{id_rubrique=#ID_RUBRIQUE}{iteration=(#GET{iteration}|plus{1})}{separateur=#GET{separateur}}{_multiple}{defaut} />
+               </BOUCLE_articles_originaux>
+               <BOUCLE_ssrubriques(BOUCLE_rubriques)> </BOUCLE_ssrubriques>
+       </optgroup>
+</BOUCLE_rubriques>
diff --git a/www/plugins/saisies/prive/listes/rubriques_recursives.html b/www/plugins/saisies/prive/listes/rubriques_recursives.html
new file mode 100644 (file)
index 0000000..368e56b
--- /dev/null
@@ -0,0 +1,8 @@
+[(#SET{separateur,[(#ENV{separateur}|concat{&nbsp;&rsaquo;&nbsp;})]})]
+<BOUCLE_rubriques(RUBRIQUES){id_parent=#ENV{id_parent,#ENV{id_rubrique}}}{tout}>
+       [(#ENV{multiple}|oui)
+       <option value="#ID_RUBRIQUE"[(#ID_RUBRIQUE|in_array{#ENV{valeur,#ENV{defaut,#ARRAY}}}|oui) selected="selected"]>#GET{separateur}#TITRE</option>]
+       [(#ENV{multiple}|non)
+       <option value="#ID_RUBRIQUE"[(#ID_RUBRIQUE|=={#ENV{valeur,#ENV{defaut}}}|oui) selected="selected"]>#GET{separateur}#TITRE</option>]
+       <INCLURE{fond=prive/listes/rubriques_recursives,env,id_rubrique=#ID_RUBRIQUE,separateur=#GET{separateur}} />
+</BOUCLE_rubriques>
diff --git a/www/plugins/saisies/saisies-vues/_base.html b/www/plugins/saisies/saisies-vues/_base.html
new file mode 100644 (file)
index 0000000..53d3d6d
--- /dev/null
@@ -0,0 +1,43 @@
+[(#ENV{sans_reponse}|is_null|oui) [(#SET{sans_reponse,<:saisies:vue_sans_reponse:>})] ]\r
+[(#ENV{sans_reponse}|is_null|non) [(#SET{sans_reponse,#ENV{sans_reponse}})] ]\r
+\r
+#SET{valeur_uniquement,#ENV{valeur_uniquement}|et{#ENV{valeur_uniquement}|!={non}}|?{' ',''}}\r
+#SET{enfants,#ENV*{saisies}|et{#ENV*{saisies}|is_array}}\r
+\r
+[(#REM) On génère la réponse et on l'enregistre dans une variable. Doit être VIDE s'il n'y a pas de réponse. ]\r
+       #SET{reponse,''}\r
+       [(#CHEMIN{saisies-vues/#ENV{type_saisie}.html}|oui)\r
+               #SET{reponse,#INCLURE{fond=saisies-vues/#ENV{type_saisie},env,sans_reponse=#GET{sans_reponse}}|trim}\r
+       ]\r
+       [(#CHEMIN{saisies-vues/#ENV{type_saisie}.html}|non)\r
+               #SET{reponse,#ENV*{valeur}|trim}\r
+       ]\r
+\r
+[(#REM) Maintenant on affiche en encapsulant ou pas ]\r
+\r
+[(#REM) Cas normal avec présentation ]\r
+[(#GET{valeur_uniquement}|non)\r
+<div class="afficher[ afficher_(#ENV{nom})][ saisie_(#ENV{type_saisie})][ (#ENV{li_class})][ (#GET{reponse}|non)sans_reponse]">\r
+       [(#REM) S'il y a des enfants on n'inclut que la vue ]\r
+       [(#GET{enfants}|oui)\r
+               #GET{reponse}\r
+       ]\r
+       [(#GET{enfants}|non|et{#ENV{type_saisie}|!={explication}})\r
+               [<strong class="label">(#ENV{label_case,#ENV{label,#ENV{nom}}})</strong>]\r
+               <div class="valeur">\r
+               [(#GET{reponse}|sinon{#GET{sans_reponse}}|propre)]\r
+               </div>\r
+       ]\r
+</div>\r
+]\r
+\r
+[(#REM) Cas où on demande uniquement la valeur ]\r
+[(#GET{valeur_uniquement}|oui)\r
+       [(#REM) S'il y a des enfants on inclut que la vue ]\r
+       [(#GET{enfants}|oui)\r
+               #GET{reponse}\r
+       ]\r
+       [(#GET{enfants}|non)\r
+               [(#GET{reponse}|sinon{#GET{sans_reponse}}|propre)]\r
+       ]\r
+]\r
diff --git a/www/plugins/saisies/saisies-vues/auteurs.html b/www/plugins/saisies/saisies-vues/auteurs.html
new file mode 100644 (file)
index 0000000..e46baf5
--- /dev/null
@@ -0,0 +1,16 @@
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>
+       [(#SET{valeur,[(#ENV*{valeur}|is_array|?{[(#ENV*{valeur})],[(#ENV*{valeur}|explode{','})]})]})]
+       <B_auteurs_selectionnes>
+       <ul>
+       <BOUCLE_auteurs_selectionnes(AUTEURS){id_auteur IN #GET*{valeur}}
+               {par num nom, nom}{statut ?}{statut != 5poubelle}{tout}>
+               <li class="choix">#NOM (#ID_AUTEUR)</li>
+       </BOUCLE_auteurs_selectionnes>
+       </ul>
+       </B_auteurs_selectionnes>
+</BOUCLE_test_multiple>
+       <BOUCLE_auteur_selectionne(AUTEURS){id_auteur=#ENV{valeur}}
+               {statut ?}{statut != 5poubelle}{tout}>
+               <p>#NOM (#ID_AUTEUR)</p>
+       </BOUCLE_auteur_selectionne>
+<//B_test_multiple>
diff --git a/www/plugins/saisies/saisies-vues/case.html b/www/plugins/saisies/saisies-vues/case.html
new file mode 100644 (file)
index 0000000..12a6e3e
--- /dev/null
@@ -0,0 +1 @@
+[<p>(#ENV*{valeur}|?{<:item_oui:>,<:item_non:>})</p>]
diff --git a/www/plugins/saisies/saisies-vues/checkbox.html b/www/plugins/saisies/saisies-vues/checkbox.html
new file mode 100644 (file)
index 0000000..c313025
--- /dev/null
@@ -0,0 +1,11 @@
+[(#REM) datas peut être une chaine qu'on sait décomposer ]\r
+#SET{datas, #ENV{datas}|saisies_chaine2tableau}\r
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau}\r
+\r
+<B_choix>\r
+<ul>\r
+       <BOUCLE_choix(POUR){tableau #GET{valeur}}>\r
+       <li class="choix">[(#GET{datas}|table_valeur{#VALEUR})]</li>\r
+       </BOUCLE_choix>\r
+</ul>\r
+</B_choix>\r
diff --git a/www/plugins/saisies/saisies-vues/date.html b/www/plugins/saisies/saisies-vues/date.html
new file mode 100644 (file)
index 0000000..d0173b9
--- /dev/null
@@ -0,0 +1,10 @@
+#SET{valeur,#ENV{valeur}|vider_date}
+#SET{date_mysql,([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])}
+[(#GET{valeur}|match{#GET{date_mysql}}|oui)
+       [(#ENV{horaire}|?{      
+               #SET{valeur,#ENV{valeur}|affdate{'d/m/Y H:i:s'}}
+               ,
+               #SET{valeur,#ENV{valeur}|affdate{'d/m/Y'}}
+       })]
+]
+[<p class="date">(#GET{valeur})</p>]
diff --git a/www/plugins/saisies/saisies-vues/destinataires.html b/www/plugins/saisies/saisies-vues/destinataires.html
new file mode 100644 (file)
index 0000000..705e459
--- /dev/null
@@ -0,0 +1,7 @@
+<B_destinataires>\r
+<ul>\r
+       <BOUCLE_destinataires(AUTEURS){tous}{id_auteur IN #ENV*{valeur}}>\r
+       <li class="choix">#NOM</li>\r
+       </BOUCLE_destinataires>\r
+</ul>\r
+</B_destinataires>\r
diff --git a/www/plugins/saisies/saisies-vues/explication.html b/www/plugins/saisies/saisies-vues/explication.html
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/www/plugins/saisies/saisies-vues/fieldset.html b/www/plugins/saisies/saisies-vues/fieldset.html
new file mode 100644 (file)
index 0000000..253044e
--- /dev/null
@@ -0,0 +1,5 @@
+[<h3 class="legend">(#ENV{label})</h3>]
+
+[(#ENV{saisies}|is_array|oui)
+       #INCLURE{fond=inclure/voir_saisies, env, from_fieldset='on'}
+]
diff --git a/www/plugins/saisies/saisies-vues/groupe_mots.html b/www/plugins/saisies/saisies-vues/groupe_mots.html
new file mode 100644 (file)
index 0000000..a820b0b
--- /dev/null
@@ -0,0 +1,9 @@
+[(#SET{valeurs,[(#ENV{multiple}|oui|?{#ENV*{valeur},#ARRAY{0,#ENV{valeur}}})]})]
+
+<B_choix>
+<ul>
+       <BOUCLE_choix(GROUPES_MOTS){id_groupe IN #GET{valeurs}}{par titre}>
+       <li class="choix">#TITRE</li>
+       </BOUCLE_choix>
+</ul>
+</B_choix>
diff --git a/www/plugins/saisies/saisies-vues/oui_non.html b/www/plugins/saisies/saisies-vues/oui_non.html
new file mode 100644 (file)
index 0000000..12a6e3e
--- /dev/null
@@ -0,0 +1 @@
+[<p>(#ENV*{valeur}|?{<:item_oui:>,<:item_non:>})</p>]
diff --git a/www/plugins/saisies/saisies-vues/radio.html b/www/plugins/saisies/saisies-vues/radio.html
new file mode 100644 (file)
index 0000000..b3c9c55
--- /dev/null
@@ -0,0 +1,4 @@
+[(#REM) datas peut être une chaine qu'on sait décomposer ]\r
+#SET{datas, #ENV{datas}|saisies_chaine2tableau}\r
+\r
+[<p>(#GET{datas}|table_valeur{#ENV{valeur}})</p>]\r
diff --git a/www/plugins/saisies/saisies-vues/secteur.html b/www/plugins/saisies/saisies-vues/secteur.html
new file mode 100644 (file)
index 0000000..626572c
--- /dev/null
@@ -0,0 +1,10 @@
+[(#REM) valeur peut être une chaine qu'on sait décomposer ]\r
+#SET{valeur, #ENV{valeur}|saisies_chaine2tableau}\r
+\r
+<B_choix>\r
+<ul>\r
+       <BOUCLE_choix(RUBRIQUES){id_rubrique IN #GET*{valeur}}>\r
+       <li class="choix">#TITRE</li>\r
+       </BOUCLE_choix>\r
+</ul>\r
+</B_choix>\r
diff --git a/www/plugins/saisies/saisies-vues/selecteur.html b/www/plugins/saisies/saisies-vues/selecteur.html
new file mode 100644 (file)
index 0000000..419acb6
--- /dev/null
@@ -0,0 +1,30 @@
+[(#REM) 
+         
+  ### /!\ selecteur (spip Bonux) ###
+         Attention, ce qui est retourne est un tableau :
+         _request($name) = array('rubrique|3', 'rubrique|9', 'rubrique|10');
+         Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :
+         [(#CHAMP|picker_selected{article})]
+         Cette fonction peut etre pratique dans une boucle en utilisant le critere IN
+         
+]
+
+
+[(#SET{selection,#VALEUR|picker_selected_par_objet})]
+
+<BOUCLE_au_moins_un(CONDITION){si #GET{selection}}>
+       <BOUCLE_un(DATA){source table,#GET{selection}}{si (#GET{selection}|count|=={1})}>
+               <p>
+                       [(#OBJET|objet_info{texte_objet}|_T)] #ID_OBJET&nbsp;: #INFO_TITRE{#OBJET,#ID_OBJET}
+               </p>
+       </BOUCLE_un>
+       <B_plusieurs>
+               <ul>
+       <BOUCLE_plusieurs(DATA){source table,#GET{selection}}{si (#GET{selection}|count|>{1})}>
+                       <li class="choix">
+                               [(#OBJET|objet_info{texte_objet}|_T)] #ID_OBJET&nbsp;: #INFO_TITRE{#OBJET,#ID_OBJET}
+                       </li>
+       </BOUCLE_plusieurs>
+               </ul>
+       </B_plusieurs>
+</BOUCLE_au_moins_un>
diff --git a/www/plugins/saisies/saisies-vues/selecteur_article.html b/www/plugins/saisies/saisies-vues/selecteur_article.html
new file mode 100644 (file)
index 0000000..d7341bb
--- /dev/null
@@ -0,0 +1,23 @@
+[(#REM) \r
+         \r
+  ### /!\ selecteur (spip Bonux) ###\r
+         Attention, ce qui est retourne est un tableau :\r
+         _request($name) = array('article|3', 'article|9', 'article|10');\r
+         Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :\r
+         [(#CHAMP|picker_selected{article})]\r
+         Cette fonction peut etre pratique dans une boucle en utilisant le critere IN\r
+         \r
+]\r
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>\r
+       <B_articles_selectionnes>\r
+       <ul>\r
+       <BOUCLE_articles_selectionnes(ARTICLES){id_article IN #ENV*{valeur}|picker_selected{article}}>\r
+               <li class="choix">#TITRE (<:article:> #ID_ARTICLE) - #STATUT</li>\r
+       </BOUCLE_articles_selectionnes>\r
+       </ul>\r
+       </B_articles_selectionnes>\r
+</BOUCLE_test_multiple>\r
+       <BOUCLE_article_selectionne(ARTICLES){id_article IN #ENV*{valeur}|picker_selected{article}}>\r
+               <p>#TITRE (<:article:> #ID_ARTICLE) - #STATUT</p>\r
+       </BOUCLE_article_selectionne>\r
+<//B_test_multiple>\r
diff --git a/www/plugins/saisies/saisies-vues/selecteur_article_fonctions.php b/www/plugins/saisies/saisies-vues/selecteur_article_fonctions.php
new file mode 100644 (file)
index 0000000..ba76acb
--- /dev/null
@@ -0,0 +1,5 @@
+<?php
+
+include_spip('prive/formulaires/selecteur/selecteur_fonctions');
+
+?>
diff --git a/www/plugins/saisies/saisies-vues/selecteur_document.html b/www/plugins/saisies/saisies-vues/selecteur_document.html
new file mode 100644 (file)
index 0000000..1e4ba7d
--- /dev/null
@@ -0,0 +1,3 @@
+<BOUCLE_doc(DOCUMENTS){id_document=#ENV{valeur}}>\r
+<p>#ID_DOCUMENT - #TITRE (#TYPE_DOCUMENT [(#TAILLE|taille_en_octets)])</p>\r
+</BOUCLE_doc>\r
diff --git a/www/plugins/saisies/saisies-vues/selecteur_rubrique.html b/www/plugins/saisies/saisies-vues/selecteur_rubrique.html
new file mode 100644 (file)
index 0000000..2bf9b24
--- /dev/null
@@ -0,0 +1,24 @@
+[(#REM) \r
+         \r
+  ### /!\ selecteur (spip Bonux) ###\r
+         Attention, ce qui est retourne est un tableau :\r
+         _request($name) = array('rubrique|3', 'rubrique|9', 'rubrique|10');\r
+         Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :\r
+         [(#CHAMP|picker_selected{article})]\r
+         Cette fonction peut etre pratique dans une boucle en utilisant le critere IN\r
+         \r
+]\r
+\r
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>\r
+       <B_rubriques_selectionnees>\r
+       <ul>\r
+       <BOUCLE_rubriques_selectionnees(RUBRIQUES){tout}{id_rubrique IN #ENV*{valeur}|picker_selected{rubrique}}>\r
+               <li class="choix">#TITRE (<:rubrique:> #ID_RUBRIQUE) - #STATUT</li>\r
+       </BOUCLE_rubriques_selectionnees>\r
+       </ul>\r
+       </B_rubriques_selectionnees>\r
+</BOUCLE_test_multiple>\r
+       <BOUCLE_rubrique_selectionnee(RUBRIQUES){tout}{id_rubrique IN #ENV*{valeur}|picker_selected{rubrique}}>\r
+               <p>#TITRE (<:rubrique:> #ID_RUBRIQUE) - #STATUT</p>\r
+       </BOUCLE_rubrique_selectionnee>\r
+<//B_test_multiple>\r
diff --git a/www/plugins/saisies/saisies-vues/selecteur_rubrique_article.html b/www/plugins/saisies/saisies-vues/selecteur_rubrique_article.html
new file mode 100644 (file)
index 0000000..c4d9724
--- /dev/null
@@ -0,0 +1,38 @@
+[(#REM) \r
+         \r
+  ### /!\ selecteur (spip Bonux) ###\r
+         Attention, ce qui est retourne est un tableau :\r
+         _request($name) = array('article|3', 'article|9', 'rubrique|10');\r
+         Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :\r
+         [(#CHAMP|picker_selected{article})]\r
+         Cette fonction peut etre pratique dans une boucle en utilisant le critere IN\r
+         \r
+]\r
+#SET{reponse,""}\r
+\r
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>\r
+       <B_rubriques_selectionnees>\r
+       <ul>\r
+       <BOUCLE_rubriques_selectionnees(RUBRIQUES){tout}{id_rubrique IN #ENV*{valeur}|picker_selected{rubrique}}>\r
+               <li class="choix">#TITRE (<:rubrique:> #ID_RUBRIQUE) - #STATUT</li>\r
+       </BOUCLE_rubriques_selectionnees>\r
+       </ul>\r
+       </B_rubriques_selectionnees>\r
+\r
+       <B_articles_selectionnes>\r
+       <ul>\r
+       <BOUCLE_articles_selectionnes(ARTICLES){id_article IN #ENV*{valeur}|picker_selected{article}}>\r
+               <li class="choix">#TITRE (<:article:> #ID_ARTICLE) - #STATUT</li>\r
+       </BOUCLE_articles_selectionnes>\r
+       </ul>\r
+       </B_articles_selectionnes>\r
+   \r
+</BOUCLE_test_multiple>\r
+       <BOUCLE_rubrique_selectionnee(RUBRIQUES){tout}{id_rubrique IN #ENV*{valeur}|picker_selected{rubrique}}>\r
+               <p>#TITRE (<:rubrique:> #ID_RUBRIQUE) - #STATUT</p>\r
+       </BOUCLE_rubrique_selectionnee>\r
+   \r
+   <BOUCLE_article_selectionne(ARTICLES){id_article IN #ENV*{valeur}|picker_selected{article}}>\r
+               <p>#TITRE (<:article:> #ID_ARTICLE) - #STATUT</p>\r
+       </BOUCLE_article_selectionne>\r
+<//B_test_multiple>\r
diff --git a/www/plugins/saisies/saisies-vues/selecteur_site.html b/www/plugins/saisies/saisies-vues/selecteur_site.html
new file mode 100644 (file)
index 0000000..1c5eca6
--- /dev/null
@@ -0,0 +1,13 @@
+<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|oui}>\r
+       <B_sites_selectionnes>\r
+       <ul>\r
+       <BOUCLE_sites_selectionnes(SITES){id_syndic IN #ENV*{valeur}}>\r
+               <li class="choix">#NOM SITE (#ID_SYNDIC)</li>\r
+       </BOUCLE_sites_selectionnes>\r
+       </ul>\r
+       </B_sites_selectionnes>\r
+</BOUCLE_test_multiple>\r
+       <BOUCLE_site_selectionne(SITES){id_syndic=#ENV{valeur}}>\r
+               <p>#NOM_SITE (#ID_SYNDIC)</p>\r
+       </BOUCLE_site_selectionne>\r
+<//B_test_multiple>\r
diff --git a/www/plugins/saisies/saisies-vues/selection.html b/www/plugins/saisies/saisies-vues/selection.html
new file mode 100644 (file)
index 0000000..b3c9c55
--- /dev/null
@@ -0,0 +1,4 @@
+[(#REM) datas peut être une chaine qu'on sait décomposer ]\r
+#SET{datas, #ENV{datas}|saisies_chaine2tableau}\r
+\r
+[<p>(#GET{datas}|table_valeur{#ENV{valeur}})</p>]\r
diff --git a/www/plugins/saisies/saisies-vues/selection_multiple.html b/www/plugins/saisies/saisies-vues/selection_multiple.html
new file mode 100644 (file)
index 0000000..2925716
--- /dev/null
@@ -0,0 +1,10 @@
+[(#REM) datas peut être une chaine qu'on sait décomposer ]\r
+#SET{datas, #ENV{datas}|saisies_chaine2tableau}\r
+#SET{valeur, #ENV*{valeur}|saisies_valeur2tableau}\r
+<B_choix>\r
+<ul>\r
+       <BOUCLE_choix(POUR){tableau #GET{valeur}}>\r
+       <li class="choix">[(#GET{datas}|table_valeur{#VALEUR})]</li>\r
+       </BOUCLE_choix>\r
+</ul>\r
+</B_choix>\r
diff --git a/www/plugins/saisies/saisies.css.html b/www/plugins/saisies/saisies.css.html
new file mode 100644 (file)
index 0000000..1686610
--- /dev/null
@@ -0,0 +1,48 @@
+#CACHE{3600*100,cache-client}\r
+[(#REM)<style>]\r
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}\r
+#HTTP_HEADER{Vary: Accept-Encoding}\r
+\r
+#SET{left,#LANG_DIR|choixsiegal{ltr,left,right}}\r
+#SET{right,#LANG_DIR|choixsiegal{ltr,right,left}}\r
+#SET{fleche,#LANG_DIR|choixsiegal{ltr,#CHEMIN{images/deplierhaut.gif},#CHEMIN{images/deplierhaut_rtl.gif}}}\r
+\r
+/* Dans l'espace privé, afficher les labels des vues de Saisies */\r
+#wysiwyg .afficher .label{ display:block; }\r
+\r
+li.fieldset.pliable > fieldset > .legend{\r
+       cursor:pointer;\r
+}\r
+\r
+li.fieldset.pliable > fieldset > .legend span{\r
+       padding-#GET{left}:15px;\r
+       background:transparent url(#CHEMIN{images/deplierbas.gif}) [(#GET{left}) ]center no-repeat;\r
+}\r
+\r
+li.fieldset.plie > fieldset > .legend span{\r
+       background-image:url(#GET{fleche});\r
+}\r
+/*[(#REM) date triple champs...\r
+       jour    mois    annee\r
+       /12/    /10/    /2010/\r
+]*/\r
+.saisie_date_jour_mois_annee .choix {float:left;}\r
+.saisie_date_jour_mois_annee .choix+.choix {margin-left:1em;}\r
+.saisie_date_jour_mois_annee .choix label{display:block; width:auto;}\r
+.saisie_date_jour_mois_annee .choix .text{width:auto;}\r
+\r
+/*[(#REM) Styles prives de bonux pour la mise en forme du selecteur d'article et/ou de rubrique si bonux disponible]*/\r
+[(#CHEMIN{prive/style_prive_plugin_bonux.html}|oui) \r
+  [(#INCLURE{fond=prive/style_prive_plugin_bonux,ltr=#LANG_LEFT})]\r
+]\r
+\r
+/*[(#REM) On ecrase le style de bonux qui met tous les labels a droite (ou gauche).\r
+        Sinon le p.explication du selecteur ne va pas a la ligne ]*/\r
+.formulaire_spip li.selecteur_item > label {\r
+       float:none;\r
+}\r
+\r
+.formulaire_spip li.selecteur_item div.choix label {\r
+       float:none;\r
+   display:inline;\r
+}\r
diff --git a/www/plugins/saisies/saisies/_base.html b/www/plugins/saisies/saisies/_base.html
new file mode 100644 (file)
index 0000000..e8ab81d
--- /dev/null
@@ -0,0 +1,54 @@
+[(#REM) \r
+\r
+  Parametres :\r
+  ** : obligatoire\r
+  * : fortement conseille\r
+  \r
+  - ** nom : nom du parametre\r
+  - * label : nom joli\r
+  (- * erreurs : tableau des erreurs) (transmis par defaut avec SAISIE)\r
+  (- * valeur : valeur actuelle du parametre) (transmis par defaut avec SAISIE : valeur=#ENV{nom du parametre}})\r
+  - defaut : valeur par defaut du parametre\r
+  - obligatoire : est-ce un parametre obligatoire ? (defaut: non, valeurs : null/"non"/autre=oui )\r
+  - info_obligatoire : si obligatoire, ajoute ce contenu apres le label (defaut : "")\r
+  - explication : texte d'explication suppplementaire\r
+  - attention : texte pour les cas graves !\r
+  - disable : est-ce que le champ est desactive ? (pas de saisie possible, selection impossible, contenus non postes)\r
+              (defaut: non, valeurs : null/"non"/autre=oui ) n'est peut etre pas valable pour toutes les saisies.\r
+  - disable_avec_post : idem disable, mais en envoyant en hidden le champ tout de meme.\r
+  - readonly : est-ce que le champ est non modifiable ? (pas de saisie possible, selection possible, contenus postes)\r
+              (defaut: non, valeurs : null/"non"/autre=oui ) n'est peut etre pas valable pour toutes les saisies.\r
+\r
+  \r
+  Exemples d'appels :\r
+    [(#SAISIE{input, couleur_foncee,\r
+               label=<:spa:couleur_foncee:>,\r
+               obligatoire=oui})]\r
+\r
+]\r
+\r
+[(#ENV{nom}|oui)\r
+       #SET{obligatoire,#ENV{obligatoire}|et{#ENV{obligatoire}|!={non}}|?{obligatoire,''}}\r
+       #SET{disable,#ENV{disable,#ENV{disable_avec_post}}|et{#ENV{disable,#ENV{disable_avec_post}}|!={non}}|?{#ENV{disable}|is_array|?{#ENV{disable,#ARRAY},disabled},''}}\r
+       #SET{readonly,#ENV{readonly}|et{#ENV{readonly}!={non}}|?{readonly,''}}\r
+       #SET{saisies_autonomes,#VAL|saisies_autonomes}\r
+       \r
+       [(#ENV{type_saisie}|in_array{#GET{saisies_autonomes}}|oui)\r
+               [(#INCLURE{fond=saisies/#ENV{type_saisie},env,obligatoire=#GET{obligatoire},disable=#GET{disable},readonly=#GET{readonly}})]\r
+       ]\r
+       [(#ENV{type_saisie}|in_array{#GET{saisies_autonomes}}|non)\r
+               #SET{erreurs,#ENV**{erreurs}|table_valeur{#ENV{nom}}}\r
+               #SET{li_class,#ENV{type_saisie}|substr{0,9}|=={selecteur}|?{selecteur_item,''}}\r
+               <!--!inserer_saisie_editer-->\r
+               <li class="editer editer_[(#ENV{nom}|saisie_nom2classe)][ (#GET{obligatoire})][ (#GET{erreurs}|oui)erreur][ (#GET{li_class})][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]"[ data-id="(#ENV{id_saisie})"]>\r
+                       #ENV*{inserer_debut}\r
+                       [<label[(#ENV{type_saisie}|match{oui_non|radio|checkbox}|non) for="champ_#ENV{nom}"]>(#ENV*{label})[<span class='obligatoire'>(#GET{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]\r
+                       [<span class='erreur_message'>(#GET{erreurs})</span>]\r
+                       [<p class='explication'>(#ENV*{explication})</p>]\r
+                       [<em class='attention'>(#ENV*{attention})</em>]\r
+                       [(#INCLURE{fond=saisies/#ENV{type_saisie},env,nom=[(#ENV{nom}|saisie_nom2name)], disable=#GET{disable},readonly=#GET{readonly}})]\r
+                       [(#ENV{disable_avec_post}|et{#ENV{disable_avec_post}|!={non}}|oui)<input type='hidden' name='[(#ENV{nom}|saisie_nom2name)]' value="#ENV{valeur,#ENV{defaut}}" />]\r
+                       #ENV**{inserer_fin}\r
+               </li>\r
+       ]\r
+]\r
diff --git a/www/plugins/saisies/saisies/articles_originaux.html b/www/plugins/saisies/saisies/articles_originaux.html
new file mode 100644 (file)
index 0000000..bf38d6e
--- /dev/null
@@ -0,0 +1,51 @@
+[(#REM)\r
+\r
+Saisies qui liste les articles originaux (origine_traduction) du site\r
+Par défaut ne liste que ceux des rubriques à la racine (secteurs)\r
+\r
+  Parametres :\r
+  - class : classe(s) css ajoutes au select\r
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple\r
+       Dans le cas multiple, defaut et valeur doivent etre un array, sinon un int\r
+  - recursif : si oui liste les articles des rubriques de facon recursive, et pas uniquement les secteurs\r
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")\r
+    (seulement si non multiple)\r
+  - cacher_option_intro : pas de premier option vide  (defaut:"")\r
+  - defaut : valeur par defaut si pas présente dans l'environnement\r
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
+\r
+  Exemple d'appel :\r
+       [(#SAISIE{articles_originaux,articles,\r
+               label=<:plugin:label_articles:>,\r
+               multiple=oui})]\r
+]\r
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ (#ENV*{attributs})]>\r
+       [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)\r
+               <option value="0">[(#ENV{option_intro})]</option>]\r
+               <BOUCLE_articles_originaux_racine(ARTICLES){id_rubrique}{origine_traduction}>\r
+               [(#ENV{multiple}|oui)\r
+               <option value="#ID_ARTICLE"[(#ID_ARTICLE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]\r
+               [(#ENV{multiple}|non)\r
+               <option value="#ID_ARTICLE"[(#ID_ARTICLE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]\r
+               </BOUCLE_articles_originaux_racine>\r
+       <BOUCLE_articles_page(ARTICLES){id_secteur<1}{origine_traduction}>\r
+       [(#ENV{multiple}|oui)\r
+               <option value="#ID_ARTICLE"[(#ID_ARTICLE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]\r
+               [(#ENV{multiple}|non)\r
+               <option value="#ID_ARTICLE"[(#ID_ARTICLE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]\r
+       </BOUCLE_articles_page>\r
+       <BOUCLE_secteurs(RUBRIQUES){id_parent = #ENV{id_rubrique,0}}{par num titre, titre}{tout}>\r
+       <optgroup label="#TITRE">\r
+               <B_articles_originaux>\r
+               <BOUCLE_articles_originaux(ARTICLES){id_rubrique}{origine_traduction}>\r
+               [(#ENV{multiple}|oui)\r
+               <option value="#ID_ARTICLE"[(#ID_ARTICLE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]\r
+               [(#ENV{multiple}|non)\r
+               <option value="#ID_ARTICLE"[(#ID_ARTICLE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]\r
+               </BOUCLE_articles_originaux>\r
+               </B_articles_originaux>\r
+               [(#ENV{recursif}|oui)\r
+               <INCLURE{fond=prive/listes/articles_originaux_recursifs,valeur=#ENV{valeur_forcee,#ENV{valeur}},id_rubrique,multiple} />]\r
+       </optgroup>             \r
+       </BOUCLE_secteurs>\r
+</select>\r
diff --git a/www/plugins/saisies/saisies/auteurs.html b/www/plugins/saisies/saisies/auteurs.html
new file mode 100644 (file)
index 0000000..759b97c
--- /dev/null
@@ -0,0 +1,43 @@
+[(#REM)\r
+\r
+       Todo:\r
+                       Faire fonctionner les images de statut avec SPIP 3...\r
+                       Elles sont dans [(#CHEMIN_IMAGE{auteur-1comite-16.png})]\r
+       \r
+  Parametres :\r
+  - class : classe(s) css ajoutes au select\r
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple\r
+       Dans le cas multiple, defaut et valeur doivent etre un array, sinon un int\r
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")\r
+    (seulement si non multiple)\r
+  - option_statut: si quelque chose est passe on insere un bonhomme de statut a cote du nom, sinon rien\r
+    (defaut = rien)\r
+  - cacher_option_intro : pas de premier option vide  (defaut:"")\r
+  - defaut : valeur par defaut si pas présente dans l'environnement\r
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
+  - webmestre : si oui, ne selectionne que les webmestres\r
+  \r
+  Exemple d'appel :\r
+       [(#SAISIE{auteurs,auteurs_site,\r
+               label=<:plugin:auteurs_du_site:>,\r
+               multiple=oui\r
+               statut=0minirezo})]\r
+]\r
+#SET{bonhomme_statut,#ARRAY}\r
+[(#ENV{option_statut}|oui)\r
+       #SET{bonhomme_statut, #ARRAY{0minirezo, admin-12.gif, 1comite, redac-12.gif, 6forum, visit-12.gif}}\r
+]\r
+[(#ENV{multiple}|oui)\r
+       [(#SET{valeur,[(#ENV*{valeur}|is_array|?{[(#ENV*{valeur})],[(#ENV*{valeur}|explode{','})]})]})]\r
+]\r
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>\r
+       [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)\r
+               <option value="">[(#ENV{option_intro})]</option>]\r
+       <BOUCLE_auteurs(AUTEURS){par num nom, nom}{statut ?}{statut != 5poubelle}{webmestre ?}{tout}>\r
+               #SET{image_statut, #GET{bonhomme_statut}|table_valeur{#STATUT}}\r
+               [(#ENV{multiple}|oui)\r
+               <option value="#ID_AUTEUR"[(#ID_AUTEUR|in_array{#ENV{valeur_forcee,#GET{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"][(#GET{image_statut}|oui)[style="background:url((#CHEMIN{prive/images/#GET{image_statut}})) no-repeat left; padding-left: 20px;"]]>#NOM</option>]\r
+               [(#ENV{multiple}|non)\r
+               <option value="#ID_AUTEUR"[(#ID_AUTEUR|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"][(#GET{image_statut}|oui)[style="background:url((#CHEMIN{prive/images/#GET{image_statut}})) no-repeat left; padding-left: 20px;"]]>#NOM</option>]\r
+       </BOUCLE_auteurs>\r
+</select>\r
diff --git a/www/plugins/saisies/saisies/auteurs.yaml b/www/plugins/saisies/saisies/auteurs.yaml
new file mode 100644 (file)
index 0000000..7438f14
--- /dev/null
@@ -0,0 +1,122 @@
+
+titre: '<:saisies:saisie_auteurs_titre:>'
+description: '<:saisies:saisie_auteurs_explication:>'
+icone: 'images/saisies_auteurs.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'multiple'
+          label: '<:saisies:option_multiple_label:>'
+          explication: '<:saisies:option_multiple_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'option_statut'
+          label: '<:saisies:option_option_statut_label:>'      
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_intro_label:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'cacher_option_intro'
+          label_case: '<:saisies:option_cacher_option_intro_label:>'
+          defaut: 'on'
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'obligatoire'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_auteurs_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/case.html b/www/plugins/saisies/saisies/case.html
new file mode 100644 (file)
index 0000000..5411e12
--- /dev/null
@@ -0,0 +1,20 @@
+[(#REM) 
+
+  Action :
+    - Rempli "on" si oui, "" si non.
+  
+  Parametres :
+    - label_case : pour un label a cote de la case (defaut:"")
+       - defaut : valeur par defaut si pas présente dans l'environnement
+    - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{case, afficher_liste,
+               label=<:plugin:afficher_liste:>,
+               label_case=<:plugin:activer:>,
+               explication=<:plugin:explication_afficher_liste:>})]
+]#SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
+<div class="choix">
+       <input type="checkbox" name="#ENV{nom}" class="checkbox" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ (#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)checked="checked"] value="#ENV{valeur_oui,on}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ (#ENV*{attributs})]/>
+       [<label for="champ_[(#ENV{nom}|saisie_nom2classe)]">[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)<strong>](#ENV*{label_case})[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)</strong>]</label>]
+</div>
diff --git a/www/plugins/saisies/saisies/case.yaml b/www/plugins/saisies/saisies/case.yaml
new file mode 100644 (file)
index 0000000..13af035
--- /dev/null
@@ -0,0 +1,102 @@
+
+titre: '<:saisies:saisie_case_titre:>'
+description: '<:saisies:saisie_case_explication:>'
+icone: 'images/saisies_case.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'label_case'
+          label: '<:saisies:option_label_case_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'obligatoire'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_case_titre:>'
+    label_case: '<:saisies:saisie_case_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "varchar(3) DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/checkbox.html b/www/plugins/saisies/saisies/checkbox.html
new file mode 100644 (file)
index 0000000..d8df21e
--- /dev/null
@@ -0,0 +1,52 @@
+[(#REM) 
+
+  ### /!\ boucle POUR (spip Bonux) ###
+  
+  Parametres :
+  - datas : tableau de donnees cle=>valeur
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{checkbox, criteres,
+               label=<:plugin:choisir_criteres:>,
+               defaut=#ARRAY{0,cle1,1,cle3}, 
+               defaut=cle2,
+               datas=#ARRAY{
+                       cle1,valeur1,
+                       cle2,valeur2,
+                       cle3,valeur3}})]
+]
+
+[(#REM) datas peut être une chaine qu'on sait décomposer ]
+#SET{datas, #ENV*{datas}|saisies_chaine2tableau}
+
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+
+[(#REM) valeur doit être un tableau ! ]
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau}
+
+
+[(#REM) lorsque qu'on donne un 'disabled' qui est une chaine,
+       il faut la transformer en tableau. Ce tableau est vide si la chaine valait ''
+       sinon une clé 0 serait considérée disabled à tord
+]
+#SET{disabled,#ENV{disable}}
+[(#GET{disabled}|is_string|oui)
+       [(#GET{disabled}|strlen|non) #SET{disabled,#ARRAY} ]
+       [(#GET{disabled}|oui) #SET{disabled,#ARRAY|push{#GET{disabled}}} ]
+]
+[(#ENV{tout_selectionner}|oui)
+       <div class="[(#ENV{choix,choix})] none-nojs">
+               <input type="checkbox" name="#ENV{nom}_tout" class="checkbox" id="champ_[(#ENV{nom}|saisie_nom2classe)]_tout" value="on" onChange="if (jQuery(this).attr('checked')=='checked') jQuery(this).parent('div').parent().find('input').attr('checked','checked'); else jQuery(this).parent('div').parent().find('input').removeAttr('checked');"/>
+               <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_tout"><:saisies:tout_selectionner:></label>
+       </div>
+]
+
+<BOUCLE_checkbox(POUR){tableau #GET{datas}}>
+<div class="#ENV{choix,choix}[ (#ENV{choix,choix})_#CLE]">
+       <input type="checkbox" name="#ENV{nom}[]" class="checkbox" id="champ_[(#ENV{nom}|saisie_nom2classe)]_#COMPTEUR_BOUCLE"[ (#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)checked="checked"] value="#CLE"[(#CLE|in_array{#GET{disabled}}|oui) disabled="disabled"][ (#ENV*{attributs})] />
+       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_#COMPTEUR_BOUCLE">[(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)<strong>]#VALEUR[(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)</strong>]</label>
+</div>
+</BOUCLE_checkbox>
diff --git a/www/plugins/saisies/saisies/checkbox.yaml b/www/plugins/saisies/saisies/checkbox.yaml
new file mode 100644 (file)
index 0000000..0be055d
--- /dev/null
@@ -0,0 +1,109 @@
+
+titre: '<:saisies:saisie_checkbox_titre:>'
+description: '<:saisies:saisie_checkbox_explication:>'
+icone: 'images/saisies_checkbox.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'datas'
+          label: '<:saisies:option_datas_label:>'
+          explication: '<:saisies:option_datas_explication:>'
+          rows: 10
+          cols: 50
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          rows: 10
+          cols: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'obligatoire'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_checkbox_titre:>'
+    datas:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/choisir_objet.html b/www/plugins/saisies/saisies/choisir_objet.html
new file mode 100644 (file)
index 0000000..d773e69
--- /dev/null
@@ -0,0 +1,23 @@
+[(#REM)
+       Saisie spécifique à SPIP 3
+       qui permet de choisir un objet parmis les
+       objets éditoriaux éditables de SPIP,
+       les affichant dans un sélecteur
+
+
+  Exemple d'appel :
+       [(#SAISIE{choisir_objet, mon_objet,
+               label=<:plugin:quel_objet:>})]
+
+]
+
+[(#REM) Attention, la valeur ou la valeur forcée peut être une chaine vide. On doit donc tester avec is_null. ]
+#SET{valeur,#ENV{valeur_forcee}|is_null|?{#ENV{valeur}|is_null|?{#ENV{defaut},#ENV{valeur}},#ENV{valeur_forcee}}}
+
+<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size})"][ (#ENV*{attributs})]>
+       [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_objets(POUR){tableau #REM|lister_tables_objets_sql}{cle !IN #ENV{exclus,''}}>[(#VALEUR{editable}|oui)
+       <option value="#CLE"[(#CLE|=={#GET{valeur}}|oui)selected="selected"]>[(#VALEUR{texte_objets}|_T)]</option>
+]</BOUCLE_objets>
+</select>
+
diff --git a/www/plugins/saisies/saisies/choisir_objets.html b/www/plugins/saisies/saisies/choisir_objets.html
new file mode 100644 (file)
index 0000000..5caa781
--- /dev/null
@@ -0,0 +1,21 @@
+[(#REM)
+       Saisie spécifique à SPIP 3
+       qui permet de choisir parmis des
+       objets éditoriaux éditables de SPIP,
+       les affichant avec des checkbox
+
+
+  Exemple d'appel :
+       [(#SAISIE{choisir_objets, gis_objets,
+               label=<:gis:cfg_lbl_activer_objets:>,
+               exclus=spip_gis})]
+
+]
+
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+
+[(#REM) valeur doit être un tableau ! ]
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau}
+
+#INCLURE{fond=formulaires/inc-choisir-objets,name=#ENV{nom},selected=#GET{valeur},exclus=#ENV{exclus}}
diff --git a/www/plugins/saisies/saisies/couleur.html b/www/plugins/saisies/saisies/couleur.html
new file mode 100644 (file)
index 0000000..40b4d2d
--- /dev/null
@@ -0,0 +1,12 @@
+[(#REM)\r
+\r
+    ### /!\ En Couleur si plugin Palette ###\r
+       \r
+       Memes parametres que saisies/input, mais redefinit\r
+       size et class.\r
+]\r
+[(#INCLURE{fond=saisies/input,\r
+                       env,\r
+            type=#HTML5|?{color,text},\r
+            size=7,\r
+            class=[(#ENV{readonly}|?{[(#ENV{class}) ]text,[(#ENV{class}) ]palette})]})]\r
diff --git a/www/plugins/saisies/saisies/date.html b/www/plugins/saisies/saisies/date.html
new file mode 100644 (file)
index 0000000..392a817
--- /dev/null
@@ -0,0 +1,65 @@
+[(#REM) \r
+       Zone de saisie de date utilsant le dateur de Bonux si présent.\r
+       Sur les sites en HTML5, utilise type="date"\r
+       sur le input, et type="text" par défaut pour les autres.\r
+       Pour tous on utilise class="date" et class="heure" pour activer le dateur.\r
+       \r
+       La valeur fournie peut être :\r
+       - au format spip jj/mm/aaaa (date uniquement)\r
+       - au format SQL aaaa-mm-jj (date uniquement)\r
+       - au format SQL aaaa-mm-jj hh:mm:ss (date et heure)\r
+       - un tableau avec une entrée "date" et une entrée "heure" séparée, au format SQL (date et heure obligatoire)\r
+       \r
+       Pour utiliser les heures, il faut utiliser l'option "horaire=oui".\r
+       \r
+       La date est proposée à l'affichage au format jj/mm/aaaa.\r
+]\r
+\r
+[(#REM) Initialisation de la valeur ]\r
+#SET{valeur,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}\r
+\r
+[(#REM) Regex de date SQL ]\r
+#SET{date_sql,"[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?"}\r
+\r
+[(#REM) Si la valeur est un tableau, on considère que c'est date et heure dans un format déjà reconnu (j/m/a ou SQL) ]\r
+[(#GET{valeur}|is_array|oui)\r
+       #SET{date, #GET{valeur}|table_valeur{date}}\r
+       #SET{heure, #GET{valeur}|table_valeur{heure}}\r
+]\r
+\r
+[(#REM) Si la valeur est une chaîne, on regarde si SQL ]\r
+[(#GET{valeur}|is_string|oui)\r
+       [(#REM) Par défaut (date uniquement au format SPIP) la date c'est toute la valeur ]\r
+       #SET{date, #GET{valeur}}\r
+       #SET{heure, ''}\r
+       \r
+       [(#REM) Si c'est bien une date SQL ]\r
+       [(#GET{valeur}|match{#GET{date_sql}}|oui)\r
+               [(#REM) Si la date est complètement 0, on met des valeurs vides ]\r
+               [(#GET{valeur}|=={0000-00-00 00:00:00}|oui)\r
+                       #SET{date, ''}\r
+                       #SET{heure, ''}\r
+               ]\r
+               [(#GET{valeur}|=={0000-00-00 00:00:00}|non)\r
+                       #SET{date, #GET{valeur}|affdate{d/m/Y}}\r
+                       #SET{heure, #GET{valeur}|affdate{H:i}}\r
+               ]\r
+       ]\r
+]\r
+\r
+[(#INCLURE{fond=saisies/input,\r
+       env,\r
+       nom=#ENV{nom}[(#ENV{horaire}|?{&#91;date&#93;})],\r
+       valeur=#GET{date},\r
+       type=#HTML5|?{date,text},\r
+       class=[(#ENV{class}) ]date})]\r
+[(#ENV{horaire}|oui)\r
+[(#INCLURE{fond=saisies/input,\r
+       env,\r
+       nom=#ENV{nom}&#91;heure&#93;,\r
+       valeur=#GET{heure},\r
+       size=4,\r
+       maxlength=5,\r
+       class=[(#ENV{class}) ]heure})]\r
+]\r
+[(#ENV{disable}|non|et{#ENV{readonly}|non})[(#INCLURE{fond=formulaires/dateur/inc-dateur, heure_pas=#ENV{heure_pas,30}})]]\r
diff --git a/www/plugins/saisies/saisies/date.yaml b/www/plugins/saisies/saisies/date.yaml
new file mode 100644 (file)
index 0000000..1c7cef4
--- /dev/null
@@ -0,0 +1,132 @@
+\r
+titre: '<:saisies:saisie_date_titre:>'\r
+description: '<:saisies:saisie_date_explication:>'\r
+icone: 'images/saisies_date.png'\r
+options:\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'description'\r
+      label: '<:saisies:option_groupe_description:>'\r
+    saisies:\r
+      -\r
+        saisie: 'case'\r
+        options:\r
+          nom: 'horaire'\r
+          label: '<:saisies:option_horaire_label:>'\r
+          label_case: '<:saisies:option_horaire_label_case:>'\r
+          valeur_oui: 'oui'\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'label'\r
+          label: '<:saisies:option_label_label:>'\r
+          explication: '<:saisies:option_label_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'defaut'\r
+          label: '<:saisies:option_defaut_label:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'explication'\r
+          label: '<:saisies:option_explication_label:>'\r
+          explication: '<:saisies:option_explication_explication:>'\r
+          size: 50\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'utilisation'\r
+      label: '<:saisies:option_groupe_utilisation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'selection'\r
+        options:\r
+          nom: 'heure_pas'\r
+          label: '<:saisies:option_heure_pas_label:>'\r
+          explication: '<:saisies:option_heure_pas_explication:>'\r
+          datas:\r
+            1: '1 minute'\r
+            2: '2 minutes'\r
+            5: '5 minutes'\r
+            15: '15 minutes'\r
+            30: '30 minutes'\r
+          defaut: 30\r
+        verifier:\r
+          type: 'entier'\r
+          options:\r
+            min: 1\r
+            max: 30\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable'\r
+          label: '<:saisies:option_disable_label:>'\r
+          explication: '<:saisies:option_disable_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable_avec_post'\r
+          label: '<:saisies:option_disable_avec_post_label:>'\r
+          explication: '<:saisies:option_disable_avec_post_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'readonly'\r
+          label: '<:saisies:option_readonly_label:>'\r
+          explication: '<:saisies:option_readonly_explication:>'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'affichage'\r
+      label: '<:saisies:option_groupe_affichage:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'attention'\r
+          label: '<:saisies:option_attention_label:>'\r
+          explication: '<:saisies:option_attention_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'info_obligatoire'\r
+          label: '<:saisies:option_info_obligatoire_label:>'\r
+          explication: '<:saisies:option_info_obligatoire_explication:>'\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'class'\r
+          label: '<:saisies:option_class_label:>'\r
+          size: 50\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'validation'\r
+      label: '<:saisies:option_groupe_validation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'obligatoire'\r
+          label: '<:saisies:option_obligatoire_label:>'\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'erreur_obligatoire'\r
+          label: '<:saisies:option_erreur_obligatoire_label:>'\r
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'\r
+defaut:\r
+  options:\r
+    label: '<:saisies:saisie_date_titre:>'\r
+    size: 40\r
+    # champs extras (definition du champ sql)\r
+    sql: "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"\r
+  verifier:\r
+    type: 'date'\r
+    options:\r
+      normaliser: 'datetime'\r
diff --git a/www/plugins/saisies/saisies/date_jour_mois_annee.html b/www/plugins/saisies/saisies/date_jour_mois_annee.html
new file mode 100644 (file)
index 0000000..d16e97f
--- /dev/null
@@ -0,0 +1,69 @@
+[(#REM)
+
+       /!\ Cette saisie nécessite du javascript pour fonctionner.
+               En absence de JS, seul un champ de saisie texte est affiché.
+       
+       Cette saisie cree 3 champs a partir d'une date au format datetime mysql.
+       A chaque modification, un champ cache est modifie, contenant la date au format datetime.
+
+       Options :
+       - label_(jour|mois|annee)
+       - size_(jour|mois|annee)
+       - maxlength_(jour|mois|annee)
+       
+       [(#SAISIE{date_jour_mois_annee, date_naissance,
+               label=Date de naissance
+       })]
+]
+#SET{valeur,#ENV{valeur,#ENV{defaut}}}
+[(#SET{id,[(#ENV**|md5|substr{0,6})]})]
+<input type='text' name="#ENV{nom}" id="#GET{id}" value="[(#GET{valeur}|sinon{0000-00-00 00:00:00})]" class='datetime' />
+
+                         
+<script type='text/javascript'>
+function activer_dateur_#GET{id}() {
+       jour = '\
+               <div class="choix">\
+                       [<label for="champ_#ENV{nom}_jour">(#ENV{label_jour,<:saisies:label_jour:>})</label>]\
+                       <input type="text" name="#ENV{nom}_jour" class="text date_jour[ (#ENV{class})]" id="champ_#ENV{nom}_jour"[ value="(#GET{valeur}|journum)"][ size="(#ENV{size_jour, 2})"][ maxlength="(#ENV{maxlength_jour, 2})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] onChange="changer_la_date(this);" />\
+               </div>\
+       ';
+               
+       mois = '\
+               <div class="choix">\
+                       [<label for="champ_#ENV{nom}_mois">(#ENV{label_mois,<:saisies:label_mois:>})</label>]\
+                       <input type="text" name="#ENV{nom}_mois" class="text date_mois[ (#ENV{class})]" id="champ_#ENV{nom}_mois"[ value="(#GET{valeur}|mois)"][ size="(#ENV{size_mois, 2})"][ maxlength="(#ENV{maxlength_mois, 2})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] onChange="changer_la_date(this);" />\
+               </div>\
+       ';
+       
+       annee = '\
+               <div class="choix">\
+                       [<label for="champ_#ENV{nom}_annee">(#ENV{label_annee,<:saisies:label_annee:>})</label>]\
+                       <input type="text" name="#ENV{nom}_annee" class="text date_annee[ (#ENV{class})]" id="champ_#ENV{nom}_annee"[ value="(#GET{valeur}|annee)"][ size="(#ENV{size_annee, 4})"][ maxlength="(#ENV{maxlength_annee, 4})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] onChange="changer_la_date(this);" />\
+               </div>\
+       ';
+
+       if(!$.browser.msie || parseInt($.browser.version) >= 9)
+               jQuery('##GET{id}')[0].type = 'hidden';
+       else
+               jQuery('##GET{id}').css({'height':'0px','width':'0px','border':'none'});
+       jQuery('##GET{id}').after(jour + mois + annee);
+}
+
+function changer_la_date(me) {
+       var li = jQuery(me).parents('li'),
+               jour = jQuery.trim(li.find('.date_jour').val()),
+               mois = jQuery.trim(li.find('.date_mois').val()),
+               annee = jQuery.trim(li.find('.date_annee').val()),
+               date = jQuery.trim(li.find('.datetime').val());
+       while(jour.length < 2) {jour = '0' + jour;}
+       while(mois.length < 2) {mois = '0' + mois;}
+       while(annee.length < 4) {annee = '0' + annee;}
+       date = annee + '-' + mois + '-' + jour + date.substring(10);
+       li.find('.datetime').attr('value',date);
+}
+
+jQuery(document).ready(function(){
+       activer_dateur_#GET{id}();
+});
+</script>
diff --git a/www/plugins/saisies/saisies/destinataires.html b/www/plugins/saisies/saisies/destinataires.html
new file mode 100644 (file)
index 0000000..f8d3900
--- /dev/null
@@ -0,0 +1,63 @@
+#SET{type_choix, #ENV{type_choix,tous}}
+#SET{choix_destinataires, #ENV*{choix_destinataires,#ARRAY}}
+#SET{erreurs,#ENV**{erreurs}|table_valeur{#ENV{nom}}}
+<BOUCLE_choix(CONDITION){si #GET{choix_destinataires}|count|<{2}|ou{#GET{type_choix}|=={tous}}}>
+<li class="editer editer_[(#ENV{nom})][ (#ENV{obligatoire})][ (#GET{erreurs}|oui)erreur][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]" [(#ENV{tout_afficher}|!={oui}|?{style="display:none;"})][ data-id="(#ENV{id_saisie})"]>
+       #ENV*{inserer_debut}
+       [<label for="champ_#ENV{nom}">(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+       [<span class='erreur_message'>(#GET{erreurs})</span>]
+       [<p class='explication'>(#ENV*{explication})</p>]
+       [<em class='attention'>(#ENV*{attention})</em>]
+       [(#REM) Si 0 ou 1 destinataire possible ou si c'est tous, le destinataire est défini automatiquement ]
+       <BOUCLE_tous(AUTEURS){tous}{id_auteur IN #GET*{choix_destinataires}}{par num nom,nom}>
+       [(#ENV{tout_afficher}|!={oui}|oui)
+       <input type="hidden" name="#ENV{nom}&#91;&#93;" value="#ID_AUTEUR" />
+       ]
+       [(#ENV{tout_afficher}|!={oui}|non)
+       <div class="choix">
+               <input type="checkbox" name="#ENV{nom}&#91;&#93;" class="checkbox"
+                       readonly="readonly" checked="checked"
+                       id="champ_[(#ENV{nom}|saisie_nom2classe)]_destinataire#ID_AUTEUR"
+                       value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)checked="checked"]
+               />
+               <label for="champ_#ENV{nom}_destinataire#ID_AUTEUR">#NOM</label>
+       </div>
+       ]
+       </BOUCLE_tous>
+       <input [(#ENV{tout_afficher}|!={oui}|?{type="hidden",type="text" readonly="readonly"})] name="#ENV{nom}[]" value="1" />
+       <//B_tous>
+       #ENV*{inserer_fin}
+</li>
+</BOUCLE_choix>
+<li class="editer editer_[(#ENV{nom})][ (#ENV{obligatoire})][ (#GET{erreurs}|oui)erreur][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]">
+       #ENV*{inserer_debut}
+       [<label[(#GET{type_choix}|=={un}|oui)for="champ_#ENV{nom}"]>(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+       [<span class='erreur_message'>(#GET{erreurs})</span>]
+       [<p class='explication'>(#ENV*{explication})</p>]
+       [<em class='attention'>(#ENV*{attention})</em>]
+       [(#REM) Sinon on propose le choix, en select ou en checkbox suivant l'option "type_choix" ]
+       <B_destinataires>
+               [(#GET{type_choix}|=={un}|oui)
+                       <select name="#ENV{nom}&#91;&#93;" id="champ_[(#ENV{nom}|saisie_nom2classe)]">
+               ]
+               <BOUCLE_destinataires(AUTEURS){tous}{id_auteur IN #GET*{choix_destinataires}}{par num nom,nom}>
+                       [(#GET{type_choix}|=={plusieurs}|oui)
+                               <div class="choix">
+                                       <input type="checkbox" name="#ENV{nom}&#91;&#93;" class="checkbox"
+                                               id="champ_[(#ENV{nom}|saisie_nom2classe)]_destinataire#ID_AUTEUR"
+                                               value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)checked="checked"]
+                                       />
+                                       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_destinataire#ID_AUTEUR">[(#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)<strong>]#NOM[(#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)</strong>]</label>
+                               </div>
+                       ]
+                       [(#GET{type_choix}|=={un}|oui)
+                               <option value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)selected="selected"]>#NOM</option>
+                       ]
+               </BOUCLE_destinataires>
+               [(#GET{type_choix}|=={un}|oui)
+                       </select>
+               ]
+       </B_destinataires>
+       #ENV*{inserer_fin}
+</li>
+<//B_choix>
diff --git a/www/plugins/saisies/saisies/destinataires.yaml b/www/plugins/saisies/saisies/destinataires.yaml
new file mode 100644 (file)
index 0000000..b23103e
--- /dev/null
@@ -0,0 +1,83 @@
+
+titre: '<:saisies:saisie_destinataires_titre:>'
+description: '<:saisies:saisie_destinataires_explication:>'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'auteurs'
+        options:
+          nom: 'choix_destinataires'
+          label: '<:saisies:option_choix_destinataires_label:>'
+          explication: '<:saisies:option_choix_destinataires_explication:>'
+          multiple: 'oui'
+          option_statut: 'oui'
+      -
+        saisie: 'radio'
+        options:
+          nom: 'type_choix'
+          datas:
+            tous: '<:saisies:option_type_choix_tous:>'
+            un: '<:saisies:option_type_choix_un:>'
+            plusieurs: '<:saisies:option_type_choix_plusieurs:>'
+          defaut: 'tous'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_destinataires_titre:>'
+    choix_destinataires: [1,2,3,4]
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/email.html b/www/plugins/saisies/saisies/email.html
new file mode 100644 (file)
index 0000000..35109c0
--- /dev/null
@@ -0,0 +1,10 @@
+[(#REM) \r
+               \r
+               Zone de saisie d'adresse mail. Sur les sites en HTML5, utilise type="email"\r
+               sur le input, et type="text" par défaut pour les autres.\r
+               Dans ce dernier cas, on renseigne quand même class="email".\r
+               \r
+][(#INCLURE{fond=saisies/input,\r
+                       env,\r
+            type=#HTML5|?{email,text},\r
+            class=[(#HTML5|?{[(#ENV{class}) ],[(#ENV{class}) ]email})]})]\r
diff --git a/www/plugins/saisies/saisies/explication.html b/www/plugins/saisies/saisies/explication.html
new file mode 100644 (file)
index 0000000..868fa0b
--- /dev/null
@@ -0,0 +1,5 @@
+<li class="explication[ explication_(#ENV{nom})][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]"[ data-id="(#ENV{id_saisie})"]>
+       #ENV*{inserer_debut}
+       [(#ENV*{texte}|propre)]
+       #ENV*{inserer_fin}
+</li>
diff --git a/www/plugins/saisies/saisies/explication.yaml b/www/plugins/saisies/saisies/explication.yaml
new file mode 100644 (file)
index 0000000..64d1e93
--- /dev/null
@@ -0,0 +1,38 @@
+
+titre: '<:saisies:saisie_explication_titre:>'
+description: '<:saisies:saisie_explication_explication:>'
+icone: 'images/saisies_explication.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'texte'
+          label: '<:saisies:saisie_explication_titre:>'
+          explication: '<:saisies:saisie_explication_explication:>'
+          class: 'inserer_barre_edition'
+          cols: 40
+          rows: 5
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'li_class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+defaut:
+  options:
+    texte: '<:saisies:saisie_explication_titre:>'
+    # champs extras (definition du champ sql)
+    # Non, cette saisie n'a rien à saisir en bdd !
+    # sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/fieldset.html b/www/plugins/saisies/saisies/fieldset.html
new file mode 100644 (file)
index 0000000..83c600a
--- /dev/null
@@ -0,0 +1,34 @@
+#SET{pliable,#ENV{pliable}|et{#ENV{pliable}|!={non}}|?{'pliable', ''}}
+#SET{plie,#ENV{plie}|et{#ENV{plie}|!={non}}|?{'plie', ''}}
+
+[(#REM) S'il y a des erreurs pour au moins un des champs internes, on ne plie pas ! ]
+#SET{champs_internes, #ENV{saisies}|saisies_lister_par_nom}
+#SET{erreurs, #ENV**{erreurs}|sinon{#ARRAY}}
+#SET{erreurs_fieldset, #GET{erreurs}|array_intersect_key{#GET{champs_internes}}}
+[(#GET{erreurs_fieldset}|oui)
+       #SET{plie, ''}
+]
+#SET{erreur_ici,#ENV**{erreurs}|table_valeur{#ENV{nom}}}
+
+<li class="fieldset[ fieldset_(#ENV{nom})][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})][ (#GET{pliable})[ (#GET{plie})]]"[ data-id="(#ENV{id_saisie})"]> 
+       #ENV*{inserer_debut}
+       <fieldset>
+               [[(#GLOBALS{debut_intertitre,<h3>}|inserer_attribut{class,legend})]
+                       [(#ENV{icone}|oui)
+                               [(#REM) en SPIP 3 on cherche avant tout dans le chemin des images
+                               ]#SET{icone,''}[(#SPIP_VERSION|version_compare{2.9, >}|oui)#SET{icone,#CHEMIN_IMAGE{#ENV{icone}}]
+                               [<img src="(#GET{icone}|sinon{#CHEMIN{#ENV{icone}}}
+                                       |image_reduire{#ENV{taille_icone}|sinon{16}}
+                                       |extraire_attribut{src})" alt="#ENV*{label}" /> ]
+                       ]
+                       <span>(#ENV*{label})</span>#GLOBALS{fin_intertitre,</h3>}]
+               [<span class='erreur_message'>(#GET{erreur_ici})</span>]
+               [<p class='explication'>(#ENV*{explication})</p>]
+               [(#ENV{saisies}|is_array|oui)
+               <ul>
+                       #INCLURE{fond=#ENV{fond_generer,"inclure/generer_saisies"}, env, saisies=#ENV{saisies}, from_fieldset='on'}
+               </ul>
+               ]
+       </fieldset>
+       #ENV*{inserer_fin}
+</li>
diff --git a/www/plugins/saisies/saisies/fieldset.yaml b/www/plugins/saisies/saisies/fieldset.yaml
new file mode 100644 (file)
index 0000000..d2f9607
--- /dev/null
@@ -0,0 +1,56 @@
+
+titre: '<:saisies:saisie_fieldset_titre:>'
+description: '<:saisies:saisie_fieldset_explication:>'
+icone: 'images/saisies_fieldset.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'case'
+        options:
+          nom: 'pliable'
+          label: '<:saisies:option_pliable_label:>'
+          label_case: '<:saisies:option_pliable_label_case:>'
+      -
+        saisie: 'case'
+        options:
+          nom: 'plie'
+          label: '<:saisies:option_plie_label:>'
+          label_case: '<:saisies:option_plie_label_case:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'li_class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+defaut:
+  options:
+    label: '<:saisies:saisie_fieldset_titre:>'
+    # champs extras (definition du champ sql)
+    # Non, cette saisie n'a rien à saisir en bdd !
+    # sql: "text DEFAULT '' NOT NULL"
+  saisies: []
diff --git a/www/plugins/saisies/saisies/groupe_mots.html b/www/plugins/saisies/saisies/groupe_mots.html
new file mode 100644 (file)
index 0000000..f5cb85a
--- /dev/null
@@ -0,0 +1,31 @@
+[(#REM) 
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple
+       Dans le cas multiple, defaut et valeur doivent être un array, sinon un int
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+    (seulement si non multiple)
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - table_liaison : permet de ne lister que les groupes de mots liés à une table en particulier
+    (champs tables_liees de spip_groupes_mots)
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - groupes_exclus : tableau de groupes exclus
+  
+  Exemple d'appel :
+       [(#SAISIE{groupe_mots,groupes,
+               label=<:plugin:secteur_region:>,
+               multiple=oui,
+               table_liaison=articles})] 
+]
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+       [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
+               <option value="0">[(#ENV{option_intro})]</option>]
+       <BOUCLE_groupes(GROUPES_MOTS){id_groupe !IN #ENV{groupes_exclus,#ARRAY}}{par num titre, titre}{tables_liees==#VAL{'(^|,)'}|concat{#ENV{table_liaison,.*},'($|,)'}}{tout}>
+               [(#ENV{multiple}|oui)
+               <option value="#ID_GROUPE"[(#ID_GROUPE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]
+               [(#ENV{multiple}|non)
+               <option value="#ID_GROUPE"[(#ID_GROUPE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]
+       </BOUCLE_groupes>
+</select>
diff --git a/www/plugins/saisies/saisies/hidden.html b/www/plugins/saisies/saisies/hidden.html
new file mode 100644 (file)
index 0000000..866c70a
--- /dev/null
@@ -0,0 +1,12 @@
+<li class="editer editer_[(#ENV{nom})][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]" [(#ENV{tout_afficher}|!={oui}|?{style="display:none;"})][ data-id="(#ENV{id_saisie})"]>
+       #ENV*{inserer_debut}
+       [(#ENV{tout_afficher}|!={oui}|oui)
+       <input type="hidden" name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]" value="#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}"[ (#ENV*{attributs})] />
+       ]
+       [(#ENV{tout_afficher}|!={oui}|non)
+       [<label for="champ_[(#ENV{nom}|saisie_nom2classe)]">(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+       <input type="text" name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]" value="#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}" readonly="readonly" />
+       ]
+       
+       #ENV*{inserer_fin}
+</li>
diff --git a/www/plugins/saisies/saisies/hidden.yaml b/www/plugins/saisies/saisies/hidden.yaml
new file mode 100644 (file)
index 0000000..2120917
--- /dev/null
@@ -0,0 +1,29 @@
+
+titre: '<:saisies:saisie_hidden_titre:>'
+description: '<:saisies:saisie_hidden_explication:>'
+icone: 'images/saisies_hidden.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+defaut:
+  options:
+    label: '<:saisies:saisie_hidden_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/input.html b/www/plugins/saisies/saisies/input.html
new file mode 100644 (file)
index 0000000..376618d
--- /dev/null
@@ -0,0 +1,48 @@
+[(#REM) \r
+\r
+  Parametres supplementaire :\r
+  - ** datas : tableau de donnees indice=>valeur\r
+  - defaut : valeur par defaut du parametre\r
+  - type : type de l'input (defaut: text)\r
+  - class : classe(s) css ajoutes a l'input\r
+  - size : taille du champ\r
+  - maxlength : nombre de caracteres maximum\r
+  - disable : champ insaisissable ? 'oui' (defaut : '')\r
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
+  - autofocus : indique si le champ prend le focus a l'affichage (HTML5 requis)\r
+  \r
+  Exemple d'appel :\r
+       [(#SAISIE{input,couleur_foncee,\r
+               label=<:spa:couleur_foncee:>,\r
+               size=7,\r
+               datas=#ARRAY{\r
+                               0,valeur0,\r
+                               1,valeur1,\r
+                               2,valeur2}})]\r
+]\r
+\r
+#SET{type,#ENV{type,text}}\r
+\r
+[(#REM) datas peut être une chaine qu'on sait décomposer ]\r
+#SET{datas, #ENV*{datas}}\r
+#SET{datas, #GET{datas}|is_string|?{(#GET{datas}|saisies_chaine2tableau), #GET{datas}}}\r
+\r
+[(#REM) Pas de HTML5, pas de datas]\r
+#SET{datas, #HTML5|?{#GET{datas}}}\r
+\r
+[(#REM)  l'attribut autocomplete ne peut avoir pour valeur que on ou off ]\r
+#SET{val_autocomplete, #ARRAY}\r
+#SET{val_autocomplete, #GET{val_autocomplete}|push{on}}\r
+#SET{val_autocomplete, #GET{val_autocomplete}|push{off}}\r
+\r
+[(#REM) permettre de donner un identifiant de list specifique en option de la saisie\r
+]#SET{list_id,#ENV{list}}\r
+<B_selection>\r
+[(#SET{list_id,[(#GET{list_id,[champ_(#ENV{nom})_datas]})]})]\r
+<datalist id="#GET{list_id}">\r
+<BOUCLE_selection(POUR){tableau #GET{datas}}\r
+>[     <option value="(#VALEUR|attribut_html)"></option>\r
+]</BOUCLE_selection>\r
+</datalist>\r
+</B_selection>\r
+<input type="#GET{type}" name="#ENV{nom}" class="#GET{type}[ (#ENV{class})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ list="(#GET{list_id})"][ value="(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}})"][ size="(#ENV{size})"][ maxlength="(#ENV{maxlength})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ placeholder="(#ENV{placeholder})"][(#ENV{obligatoire}|et{#ENV{obligatoire}!={non}}|et{#HTML5}|oui) required="required"][(#ENV{autofocus}|et{#ENV{autofocus}!={non}}|et{#HTML5}|oui) autofocus="autofocus"][(#GET{val_autocomplete}|find{#ENV{autocomplete}}|oui) autocomplete="#ENV{autocomplete}"][ (#ENV*{attributs})] />\r
diff --git a/www/plugins/saisies/saisies/input.yaml b/www/plugins/saisies/saisies/input.yaml
new file mode 100644 (file)
index 0000000..cda5ffd
--- /dev/null
@@ -0,0 +1,144 @@
+\r
+titre: '<:saisies:saisie_input_titre:>'\r
+description: '<:saisies:saisie_input_explication:>'\r
+icone: 'images/saisies_input.png'\r
+options:\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'description'\r
+      label: '<:saisies:option_groupe_description:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'label'\r
+          label: '<:saisies:option_label_label:>'\r
+          explication: '<:saisies:option_label_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'defaut'\r
+          label: '<:saisies:option_defaut_label:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'explication'\r
+          label: '<:saisies:option_explication_label:>'\r
+          explication: '<:saisies:option_explication_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'radio'\r
+        options:\r
+          nom: 'type'\r
+          label: '<:saisies:option_type_label:>'\r
+          explication: '<:saisies:option_type_explication:>'\r
+          datas:\r
+            text: '<:saisies:option_type_text:>'\r
+            password: '<:saisies:option_type_password:>'\r
+          defaut: 'text'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'utilisation'\r
+      label: '<:saisies:option_groupe_utilisation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'maxlength'\r
+          label: '<:saisies:option_maxlength_label:>'\r
+          explication: '<:saisies:option_maxlength_explication:>'\r
+        verifier:\r
+          type: 'entier'\r
+          options:\r
+            min: 1\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable'\r
+          label: '<:saisies:option_disable_label:>'\r
+          explication: '<:saisies:option_disable_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable_avec_post'\r
+          label: '<:saisies:option_disable_avec_post_label:>'\r
+          explication: '<:saisies:option_disable_avec_post_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'readonly'\r
+          label: '<:saisies:option_readonly_label:>'\r
+          explication: '<:saisies:option_readonly_explication:>'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'affichage'\r
+      label: '<:saisies:option_groupe_affichage:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'attention'\r
+          label: '<:saisies:option_attention_label:>'\r
+          explication: '<:saisies:option_attention_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'info_obligatoire'\r
+          label: '<:saisies:option_info_obligatoire_label:>'\r
+          explication: '<:saisies:option_info_obligatoire_explication:>'\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'class'\r
+          label: '<:saisies:option_class_label:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'size'\r
+          label: '<:saisies:option_size_label:>'\r
+          explication: '<:saisies:option_size_explication:>'\r
+        verifier:\r
+          type: 'entier'\r
+          options:\r
+            min: 1\r
+      -\r
+        saisie: 'radio'\r
+        options:\r
+          nom: 'autocomplete'\r
+          label: '<:saisies:option_autocomplete_label:>'\r
+          explication: '<:saisies:option_autocomplete_explication:>' \r
+          datas:\r
+            defaut: '<:saisies:option_autocomplete_defaut:>'\r
+            on: '<:saisies:option_autocomplete_on:>'\r
+            off: '<:saisies:option_autocomplete_off:>'\r
+          defaut: 'defaut'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'validation'\r
+      label: '<:saisies:option_groupe_validation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'obligatoire'\r
+          label: '<:saisies:option_obligatoire_label:>'\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'erreur_obligatoire'\r
+          label: '<:saisies:option_erreur_obligatoire_label:>'\r
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'\r
+defaut:\r
+  options:\r
+    label: '<:saisies:saisie_input_titre:>'\r
+    size: 40\r
+    # champs extras (definition du champ sql)\r
+    sql: "text DEFAULT '' NOT NULL"\r
diff --git a/www/plugins/saisies/saisies/mot.html b/www/plugins/saisies/saisies/mot.html
new file mode 100644 (file)
index 0000000..c8b6191
--- /dev/null
@@ -0,0 +1,23 @@
+[(#REM) 
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - id_groupe : groupe des mots clés à afficher
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{mot, en_region,
+               label=<:plugin:en_region:>})]
+]
+
+<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ value="(#ENV{valeur_forcee,#ENV{valeur}})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)
+       <option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_mots(MOTS){par id_groupe, num titre, titre}{id_groupe ?}>
+       [<optgroup label="(#TYPE|unique|attribut_html)" />]
+       <option value="#ID_MOT" [(#ID_MOT|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>
+</BOUCLE_mots>
+</select>
diff --git a/www/plugins/saisies/saisies/oui_non.html b/www/plugins/saisies/saisies/oui_non.html
new file mode 100644 (file)
index 0000000..8d7281f
--- /dev/null
@@ -0,0 +1,23 @@
+[(#REM) 
+
+  Action :
+  - Rempli "on" si oui, "" si non.
+  
+  Parametres :
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{oui_non, afficher_liste,
+               label=<:plugin:afficher_liste:>,
+               explication=<:plugin:explication_afficher_liste:>})]
+]
+#SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
+<div class="choix">
+       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{nom}|saisie_nom2classe)]_oui"[ (#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)checked="checked"] value="#ENV{valeur_oui,on}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_oui">[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)<strong>]<:item_oui:>[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)</strong>]</label>
+</div>
+<div class="choix">
+       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{nom}|saisie_nom2classe)]_non"[ (#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})checked="checked"] value="#ENV{valeur_non,''}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_non">[(#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})<strong>]<:item_non:>[(#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})</strong>]</label>
+</div>
diff --git a/www/plugins/saisies/saisies/oui_non.yaml b/www/plugins/saisies/saisies/oui_non.yaml
new file mode 100644 (file)
index 0000000..6f11db1
--- /dev/null
@@ -0,0 +1,95 @@
+
+titre: '<:saisies:saisie_oui_non_titre:>'
+description: '<:saisies:saisie_oui_non_explication:>'
+icone: 'images/saisies_oui_non.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'obligatoire'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_oui_non_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "varchar(3) DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/pays.html b/www/plugins/saisies/saisies/pays.html
new file mode 100644 (file)
index 0000000..e5d2976
--- /dev/null
@@ -0,0 +1,21 @@
+[(#REM) 
+
+  ### /!\ table GEO_PAYS (geographie) ###
+       
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{pays, pays,
+               label=<:plugin:info_pays:>})] 
+]
+<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_pays(GEO_PAYS){par multi nom}>
+       <option value="#ID_PAYS"[(#ID_PAYS|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#NOM</option>
+</BOUCLE_pays>
+</select>
diff --git a/www/plugins/saisies/saisies/police.html b/www/plugins/saisies/saisies/police.html
new file mode 100644 (file)
index 0000000..8cfbf51
--- /dev/null
@@ -0,0 +1,22 @@
+[(#REM) 
+
+  ### /!\ boucle POUR ###
+  
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{police, couleur_foncee, 
+               label=<:spa:couleur_foncee:>, 
+               obligatoire=non})] 
+]
+<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+       [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+       <BOUCLE_police(POUR){tableau #VAL{polices/}|find_all_in_path{\w+\.ttf}}{par cle}>
+               <option value="#CLE"[ (#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)selected="selected"]>#CLE</option>
+       </BOUCLE_police>
+</select>
diff --git a/www/plugins/saisies/saisies/position_construire_formulaire.html b/www/plugins/saisies/saisies/position_construire_formulaire.html
new file mode 100644 (file)
index 0000000..5801fc0
--- /dev/null
@@ -0,0 +1,46 @@
+<select name="#ENV{nom}" id="champ_#ENV{nom}">
+       #SET{tab,#ENV{formulaire}}
+       #SET{tab_par_nom,#ENV{formulaire}|saisies_lister_par_nom}
+       #SET{padding,0}
+       #SET{liste_parents,#ARRAY{0,''}}
+       <BOUCLE_parcours(POUR){tableau #GET{tab}}>
+       #SET{saisie,#VALEUR}
+       <option value="[(#GET{saisie}|table_valeur{options}|table_valeur{nom})]" style="padding-left:#GET{padding}px" [(#ENV{valeur,#ENV{saisie_a_positionner}}|=={#GET{saisie}|table_valeur{options}|table_valeur{nom}}|oui)selected="selected"]>
+               [(#GET{saisie}|table_valeur{options}|table_valeur{label}
+                       |sinon{#GET{saisie}|table_valeur{options}|table_valeur{nom}}
+                       |couper{60})]
+       </option>
+               <BOUCLE_test_enfants(CONDITION){si #GET{saisie}|table_valeur{options}|table_valeur{nom}|!={#ENV{saisie_a_positionner}}|et{#GET{saisie}|table_valeur{saisies}|is_array}}>
+               #SET{tab,#GET{saisie}|table_valeur{saisies}}
+               #SET{padding,#GET{padding}|plus{20}}
+               #SET_PUSH{liste_parents,#GET{saisie}|table_valeur{options}|table_valeur{nom}}
+               <BOUCLE_parcours_recursif(BOUCLE_parcours)/>
+               #SET{padding,#GET{padding}|moins{20}}
+               #SET{liste_parents,#GET{liste_parents}|array_slice{0,-1}}
+               </BOUCLE_test_enfants>
+       </BOUCLE_parcours>
+       #SET{parent, #GET{liste_parents}|table_valeur{#GET{liste_parents}|count|moins{1}}}
+       <option value="[#GET{parent}]" style="padding-left:#GET{padding}px; font-style:italic;">
+               [(#GET{parent}|non)
+                       <:saisies:construire_position_fin_formulaire:>
+               ]
+               [(#GET{parent}|oui)
+                       #SET{groupe,#GET{tab_par_nom}|table_valeur{#GET{parent}}}
+                       #SET{groupe,#GET{groupe}|table_valeur{options}|table_valeur{label}|sinon{#GET{groupe}|table_valeur{options}|table_valeur{nom}}|couper{60}}
+                       <:saisies:construire_position_fin_groupe{groupe=#GET{groupe}}:>
+               ]
+       </option>
+       </B_parcours>
+       #SET{parent, #GET{liste_parents}|table_valeur{#GET{liste_parents}|count|moins{1}}}
+       <option value="[#GET{parent}]" style="padding-left:#GET{padding}px; font-style:italic;">
+               [(#GET{parent}|non)
+                       <:saisies:construire_position_fin_formulaire:>
+               ]
+               [(#GET{parent}|oui)
+                       #SET{groupe,#GET{tab_par_nom}|table_valeur{#GET{parent}}}
+                       #SET{groupe,#GET{groupe}|table_valeur{options}|table_valeur{label}|sinon{#GET{groupe}|table_valeur{options}|table_valeur{nom}}|couper{60}}
+                       <:saisies:construire_position_fin_groupe{groupe=#GET{groupe}}:>
+               ]
+       </option>
+       <//B_parcours>
+</select>
diff --git a/www/plugins/saisies/saisies/radio.html b/www/plugins/saisies/saisies/radio.html
new file mode 100644 (file)
index 0000000..a8fdb47
--- /dev/null
@@ -0,0 +1,29 @@
+[(#REM) 
+
+  ### /!\ boucle POUR (spip Bonux) ###
+  
+  Parametres :
+  - datas : tableau de donnees cle=>valeur
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{radio, afficher_liste,
+               label=<:plugin:afficher_liste:>,
+               explication=<:plugin:explication_afficher_liste:>,
+               datas=#ARRAY{
+                       cle1,valeur1,
+                       cle2,valeur2,
+                       cle3,valeur3}})]
+]
+
+[(#REM) datas peut être une chaine qu'on sait décomposer ]
+#SET{datas, #ENV*{datas}}
+#SET{datas, #GET{datas}|is_string|?{(#GET{datas}|saisies_chaine2tableau), #GET{datas}}}
+
+<BOUCLE_radio(POUR){tableau #GET{datas}}>
+<div class="#ENV{choix,choix}[ (#ENV{choix,choix})_#CLE]">
+       <input type="radio" name="#ENV{nom}" class="radio" id='champ_[(#ENV{nom}|saisie_nom2classe)]_#COMPTEUR_BOUCLE'[ (#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)checked='checked'] value='#CLE' [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_#COMPTEUR_BOUCLE">[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)<strong>]#VALEUR[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)</strong>]</label>
+</div>
+</BOUCLE_radio>
diff --git a/www/plugins/saisies/saisies/radio.yaml b/www/plugins/saisies/saisies/radio.yaml
new file mode 100644 (file)
index 0000000..c898090
--- /dev/null
@@ -0,0 +1,108 @@
+
+titre: '<:saisies:saisie_radio_titre:>'
+description: '<:saisies:saisie_radio_explication:>'
+icone: 'images/saisies_radio.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'datas'
+          label: '<:saisies:option_datas_label:>'
+          explication: '<:saisies:option_datas_explication:>'
+          rows: 10
+          cols: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'obligatoire'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_radio_titre:>'
+    datas:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/recherche.html b/www/plugins/saisies/saisies/recherche.html
new file mode 100644 (file)
index 0000000..5ccf0d9
--- /dev/null
@@ -0,0 +1,10 @@
+[(#REM) \r
+               Zone de recherche. Sur les sites en HTML5, utilise type="search"\r
+               sur le input, et type="text" par défaut pour les autres.\r
+               Dans ce dernier cas, on renseigne quand même class="search"\r
+               ("recherche" serait mieux, mais la saisie input utilise automatiquement\r
+               la valeur de #ENV{type}).\r
+][(#INCLURE{fond=saisies/input,\r
+                       env,\r
+            type=#HTML5|?{search,text},\r
+            class=[(#HTML5|?{[(#ENV{class})],[(#ENV{class}) ]search})]})]\r
diff --git a/www/plugins/saisies/saisies/secteur.html b/www/plugins/saisies/saisies/secteur.html
new file mode 100644 (file)
index 0000000..824e3db
--- /dev/null
@@ -0,0 +1,30 @@
+[(#REM) \r
+\r
+  Parametres :\r
+  - class : classe(s) css ajoutes au select\r
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple\r
+       Dans le cas multiple, defaut et valeur doivent etre un array, sinon un int\r
+  - recursif : si oui liste les rubriques de facon recursive, et pas uniquement les secteurs\r
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")\r
+    (seulement si non multiple)\r
+  - cacher_option_intro : pas de premier option vide  (defaut:"")\r
+  - defaut : valeur par defaut si pas présente dans l'environnement\r
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
+        \r
+  Exemple d'appel :\r
+       [(#SAISIE{secteur,secteur_region,\r
+               label=<:plugin:secteur_region:>,\r
+               multiple=oui})] \r
+]\r
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>\r
+       [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)\r
+               <option value="">[(#ENV{option_intro})]</option>]\r
+       <BOUCLE_secteurs(RUBRIQUES){racine}{par num titre, titre}{tout}>\r
+               [(#ENV{multiple}|oui)\r
+               <option value="#ID_RUBRIQUE"[(#ID_RUBRIQUE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]\r
+               [(#ENV{multiple}|non)\r
+               <option value="#ID_RUBRIQUE"[(#ID_RUBRIQUE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]\r
+               [(#ENV{recursif}|oui)\r
+               <INCLURE{fond=prive/listes/rubriques_recursives,valeur=#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}},id_rubrique=#ID_RUBRIQUE,multiple} />]\r
+       </BOUCLE_secteurs>\r
+</select>\r
diff --git a/www/plugins/saisies/saisies/selecteur.html b/www/plugins/saisies/saisies/selecteur.html
new file mode 100644 (file)
index 0000000..01d8e89
--- /dev/null
@@ -0,0 +1,16 @@
+
+[(#REM) Attention ! Nécessite SPIP 3 ! ]
+
+[(#SET{val,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}})]
+
+[(#INCLURE{fond=formulaires/selecteur/generique,
+       selected=#GET{val},
+       name=#ENV{nom},
+       afficher_langue=#ENV{afficher_langue,''},
+       select=[(#ENV{multiple}|?{'',' '})],
+       whitelist=#ENV{whitelist,#ARRAY},
+       blacklist=#ENV{blacklist,#ARRAY},
+       racine=#ENV{racine},
+       objet=#ENV{objet,racine},
+       id_objet=#ENV{id_objet,0},
+       env})]
diff --git a/www/plugins/saisies/saisies/selecteur_article.html b/www/plugins/saisies/saisies/selecteur_article.html
new file mode 100644 (file)
index 0000000..dc4a183
--- /dev/null
@@ -0,0 +1,41 @@
+[(#REM) \r
+         \r
+  ### /!\ selecteur (spip Bonux) ###\r
+         Attention, ce qui est retourne est un tableau :\r
+         _request($name) = array('article|3', 'article|9', 'rubrique|10');\r
+         Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet "picker_selected" :\r
+         (picker_selected est dans prive/formulaires/selecteur/generique_fonctions.php de SPIP 3)\r
+         Cette fonction peut etre pratique dans une boucle en utilisant le critere IN\r
+         \r
+  Parametres :\r
+  - multiple : si oui, on peut selectionner plusieurs articles\r
+  - afficher_langue : si oui, on affiche la langue de l'objet selectionne\r
+  - afficher_art_dans_langue_interface : si oui, on n'affiche que les articles de la langue de l'interface\r
+  - limite_branche : branche dans laquelle on limite le selecteur\r
+  - defaut : valeur par defaut si pas présente dans l'environnement\r
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
+        \r
+  Exemple d'appel :\r
+       [(#SAISIE{selecteur_article,id_article,\r
+               label=<:plugin:article_en_une:>})] \r
+]\r
+[(#SET{val,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}})]\r
+\r
+[(#SET{filtrer_langue_article,[(#ENV{afficher_art_dans_langue_interface,0}|oui) #ENV{lang}]})]\r
+\r
+[(#REM) input necessaire au tag label for \r
+       Mais si on le garde, la saisie enregistree en base, n'est pas correcte\r
+   On pourrait rajouter l'id dans le input cree par Bonux, mais du coup manque la chaine "champ_"\r
+   Comme ca a l'air un peu tordu tout ca, tant pis pour l'erreur HTML\r
+   Yffic\r
+]\r
+[(#REM) Donner a manger a CFG ou CVT-configurer si aucune valeur definie ]\r
+<!--keepme: <input type="hidden" name="[(#ENV{nom,id_item})][]" value="" />-->\r
+[(#INCLURE{fond=formulaires/selecteur/articles,\r
+       selected=#GET{val},\r
+       name=#ENV{nom},\r
+       afficher_langue=#ENV{afficher_langue,''},\r
+       filtrer_langue_article=#GET{filtrer_langue_article,''},\r
+       select=[(#ENV{multiple}|?{0,1})],\r
+       limite_branche=#ENV{limite_branche,''},\r
+       rubriques=0})]\r
diff --git a/www/plugins/saisies/saisies/selecteur_article.yaml b/www/plugins/saisies/saisies/selecteur_article.yaml
new file mode 100644 (file)
index 0000000..4efb105
--- /dev/null
@@ -0,0 +1,108 @@
+\r
+titre: '<:saisies:saisie_selecteur_article_titre:>'\r
+description: '<:saisies:saisie_selecteur_article:>'\r
+icone: 'images/saisies_selecteur_article.png'\r
+options:\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'description'\r
+      label: '<:saisies:option_groupe_description:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'label'\r
+          label: '<:saisies:option_label_label:>'\r
+          explication: '<:saisies:option_label_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'explication'\r
+          label: '<:saisies:option_explication_label:>'\r
+          explication: '<:saisies:option_explication_explication:>'\r
+          size: 50\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'utilisation'\r
+      label: '<:saisies:option_groupe_utilisation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'multiple'\r
+          label: '<:saisies:option_multiple_label:>'\r
+          explication: '<:saisies:option_multiple_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'afficher_langue'\r
+          label: '<:saisies:option_aff_langue_label:>'\r
+          explication: '<:saisies:option_aff_langue_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'afficher_art_dans_langue_interface'\r
+          label: '<:saisies:option_aff_art_interface_label:>'\r
+          explication: '<:saisies:option_aff_art_interface_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable'\r
+          label: '<:saisies:option_disable_label:>'\r
+          explication: '<:saisies:option_disable_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable_avec_post'\r
+          label: '<:saisies:option_disable_avec_post_label:>'\r
+          explication: '<:saisies:option_disable_avec_post_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'readonly'\r
+          label: '<:saisies:option_readonly_label:>'\r
+          explication: '<:saisies:option_readonly_explication:>'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'affichage'\r
+      label: '<:saisies:option_groupe_affichage:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'attention'\r
+          label: '<:saisies:option_attention_label:>'\r
+          explication: '<:saisies:option_attention_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'info_obligatoire'\r
+          label: '<:saisies:option_info_obligatoire_label:>'\r
+          explication: '<:saisies:option_info_obligatoire_explication:>'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'obligatoire'\r
+      label: '<:saisies:option_groupe_validation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'obligatoire'\r
+          label: '<:saisies:option_obligatoire_label:>'\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'erreur_obligatoire'\r
+          label: '<:saisies:option_erreur_obligatoire_label:>'\r
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'\r
+defaut:\r
+  options:\r
+    label: '<:saisies:saisie_selecteur_article_titre:>'\r
+    # champs extras (definition du champ sql)\r
+    sql: "text DEFAULT '' NOT NULL"\r
diff --git a/www/plugins/saisies/saisies/selecteur_document.html b/www/plugins/saisies/saisies/selecteur_document.html
new file mode 100644 (file)
index 0000000..51dbc28
--- /dev/null
@@ -0,0 +1,83 @@
+[(#REM) 
+
+  Parametres supplementaire :
+  - defaut : valeur par defaut du parametre
+  - class : classe(s) css ajoutes a l'input
+  - size : taille du champ
+  - maxlength : nombre de caracteres maximum
+  - disable : champ insaisissable ? 'oui' (defaut : '')
+  - media : pour restreindre la modalboxe a un type de media particulier
+  - extension : pour restreindre a un type de fichier
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Note : dans les options, il faut definir 'env' a 'oui' pour que le selecteur puisse recuperer id_article, id_rubrique ou id_breve.
+  Note 2 : si on appelle le selecteur depuis une modalbox, il faut alors lui passer _modalbox_retour qui correspond a l'url de retour
+  apres selection du document. L'id du document sera alors passe par URL.
+]
+
+<input type="text" name="#ENV{nom}" class="text[ (#ENV{class})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ value="(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}})"][ size="(#ENV{size})"][ maxlength="(#ENV{maxlength})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] />
+
+[(#REM) Si la mediatheque est presente ]
+[(#PLUGIN{medias}|oui)
+
+[(#SET{exec,[(#PLUGIN{medias,version}|<{2}|?{'portfolio','popin-choisir_document'})]})]
+[(#SET{zajax,[(#PLUGIN{medias,version}|<{2}|?{'','var_zajax=contenu&'})]})]
+[(#SET{mod_fn,#ENV{_modalbox_retour}|?{'2','1'}})]
+
+[(#REM) Parcourir les documents de l'article ]
+[(#ENV{id_article}|oui)
+<p class='boutons'><input class='submit' type="button" name="parcourir" value="<:saisies:bouton_parcourir_docs_article:>"
+       onclick="jQuery.modalboxload(
+               '[(#URL_ECRIRE{#GET{exec},#GET{zajax}selectfunc=mediaselect#GET{mod_fn}_#ENV{nom}&id_article=#ENV{id_article}[&media=(#ENV{media})][&extension=(#ENV{extension})]})]',
+               {autoResize: true}
+       );"
+/></p>
+]
+
+[(#REM) Parcourir les documents de la rubrique ]
+[(#ENV{id_rubrique}|oui)
+<p class='boutons'><input class='submit' type="button" name="parcourir" value="<:saisies:bouton_parcourir_docs_rubrique:>"
+       onclick="jQuery.modalboxload(
+               '[(#URL_ECRIRE{#GET{exec},#GET{zajax}selectfunc=mediaselect#GET{mod_fn}_#ENV{nom}&id_rubrique=#ENV{id_rubrique}[&media=(#ENV{media})][&extension=(#ENV{extension})]})]',
+               {autoResize: true}
+       );"
+/></p>
+]
+
+[(#REM) Parcourir les documents de la breve ]
+[(#ENV{id_breve}|oui)
+<p class='boutons'><input class='submit' type="button" name="parcourir" value="<:saisies:bouton_parcourir_docs_breve:>"
+       onclick="jQuery.modalboxload(
+               '[(#URL_ECRIRE{#GET{exec},#GET{zajax}selectfunc=mediaselect#GET{mod_fn}_#ENV{nom}&id_breve=#ENV{id_breve}[&media=(#ENV{media})][&extension=(#ENV{extension})]})]',
+               {autoResize: true}
+       );"
+/></p>
+]
+
+[(#REM) Parcourir toute la mediatheque ]
+<p class='boutons'><input class='submit' type="button" name="parcourir" value="<:saisies:bouton_parcourir_mediatheque:>"
+       onclick="jQuery.modalboxload(
+               '[(#URL_ECRIRE{#GET{exec},#GET{zajax}selectfunc=mediaselect#GET{mod_fn}_#ENV{nom}[&media=(#ENV{media})][&extension=(#ENV{extension})]})]',
+               {autoResize: true}
+       );"
+/></p>
+
+[(#ENV{_modalbox_retour}|non)
+<script type="text/javascript">
+       function mediaselect1_#ENV{nom}(id){
+               jQuery.modalboxclose();
+               jQuery("#champ_#ENV{nom}").attr('value',id).focus();
+       };
+</script>
+]
+
+[(#ENV{_modalbox_retour}|oui)
+<script type="text/javascript">
+       function mediaselect2_#ENV{nom}(id){
+               jQuery.modalboxload('#ENV**{_modalbox_retour}&#ENV{nom}='+id);
+       };
+</script>
+]
+
+]
diff --git a/www/plugins/saisies/saisies/selecteur_langue.html b/www/plugins/saisies/saisies/selecteur_langue.html
new file mode 100644 (file)
index 0000000..aedaa47
--- /dev/null
@@ -0,0 +1,20 @@
+[(#REM) 
+       
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{selecteur_langue,lang,
+               label=<:plugin:info_langue:>})] 
+]
+[(#SET{valeur,[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,''}}})]})]
+[(#SET{langues,[(#VAL{changer_lang}|liste_options_langues{#GET{valeur}})]})]
+<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+<BOUCLE_si_spip2(CONDITION){si (#GET{langues}|is_array|non)}>
+#GET{langues}
+</BOUCLE_si_spip2>
+[(#INCLURE{fond=prive/formulaires/inc-options-langues,name=changer_lang,default=#GET{valeur,#LANG}})]
+<//B_si_spip2>
+</select>
diff --git a/www/plugins/saisies/saisies/selecteur_rubrique.html b/www/plugins/saisies/saisies/selecteur_rubrique.html
new file mode 100644 (file)
index 0000000..1590ab2
--- /dev/null
@@ -0,0 +1,40 @@
+[(#REM) \r
+         \r
+  ### /!\ selecteur (spip Bonux) ###\r
+         Attention, ce qui est retourne est un tableau :\r
+         _request($name) = array('article|3', 'article|9', 'rubrique|10');\r
+         Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :\r
+         [(#CHAMP|picker_selected{article})]\r
+         Cette fonction peut etre pratique dans une boucle en utilisant le critere IN\r
+         \r
+  Parametres :\r
+  - multiple : si oui, on peut selectionner plusieurs rubriques\r
+  - afficher_langue : si oui, on affiche la langue de l'objet selectionne\r
+  - afficher_rub_dans_langue_interface : si oui, on n'affiche que les rubriques de la langue de l'interface\r
+  - defaut : valeur par defaut si pas présente dans l'environnement\r
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
+  \r
+  Exemple d'appel :\r
+       [(#SAISIE{selecteur_rubrique,rubriques_menu,\r
+               multiple=oui,\r
+               label=<:plugin:article_en_une:>})] \r
+]\r
+\r
+[(#SET{val,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}})]\r
+\r
+[(#SET{filtrer_langue_rubrique,[(#ENV{afficher_rub_dans_langue_interface,0}|oui) #ENV{lang}]})]\r
+\r
+[(#REM) input necessaire au tag label for \r
+       Mais si on le garde, la saisie enregistree en base, n'est pas correcte\r
+   On pourrait rajouter l'id dans le input cree par Bonux, mais du coup manque la chaine "champ_"\r
+   Comme ca a l'air un peu tordu tout ca, tant pis pour l'erreur HTML\r
+   Yffic\r
+]\r
+[(#REM) Donner a manger a CFG ou CVT-configurer si aucune valeur definie ]\r
+<!--keepme: <input type="hidden" name="[(#ENV{nom,id_item})][]" id="[champ_(#ENV{nom,id_item})]" value="" />-->\r
+[(#INCLURE{fond=formulaires/selecteur/rubriques,\r
+       selected=#GET{val},\r
+       name=#ENV{nom},\r
+       afficher_langue=#ENV{afficher_langue,''},\r
+       filtrer_langue_rubrique=#GET{filtrer_langue_rubrique,''},\r
+       select=[(#ENV{multiple}|?{0,1})]})]\r
diff --git a/www/plugins/saisies/saisies/selecteur_rubrique.yaml b/www/plugins/saisies/saisies/selecteur_rubrique.yaml
new file mode 100644 (file)
index 0000000..304b103
--- /dev/null
@@ -0,0 +1,108 @@
+\r
+titre: '<:saisies:saisie_selecteur_rubrique_titre:>'\r
+description: '<:saisies:saisie_selecteur_rubrique:>'\r
+icone: 'images/saisies_selecteur_rubrique.png'\r
+options:\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'description'\r
+      label: '<:saisies:option_groupe_description:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'label'\r
+          label: '<:saisies:option_label_label:>'\r
+          explication: '<:saisies:option_label_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'explication'\r
+          label: '<:saisies:option_explication_label:>'\r
+          explication: '<:saisies:option_explication_explication:>'\r
+          size: 50\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'utilisation'\r
+      label: '<:saisies:option_groupe_utilisation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'multiple'\r
+          label: '<:saisies:option_multiple_label:>'\r
+          explication: '<:saisies:option_multiple_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'afficher_langue'\r
+          label: '<:saisies:option_aff_langue_label:>'\r
+          explication: '<:saisies:option_aff_langue_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'afficher_rub_dans_langue_interface'\r
+          label: '<:saisies:option_aff_rub_interface_label:>'\r
+          explication: '<:saisies:option_aff_rub_interface_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable'\r
+          label: '<:saisies:option_disable_label:>'\r
+          explication: '<:saisies:option_disable_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable_avec_post'\r
+          label: '<:saisies:option_disable_avec_post_label:>'\r
+          explication: '<:saisies:option_disable_avec_post_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'readonly'\r
+          label: '<:saisies:option_readonly_label:>'\r
+          explication: '<:saisies:option_readonly_explication:>'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'affichage'\r
+      label: '<:saisies:option_groupe_affichage:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'attention'\r
+          label: '<:saisies:option_attention_label:>'\r
+          explication: '<:saisies:option_attention_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'info_obligatoire'\r
+          label: '<:saisies:option_info_obligatoire_label:>'\r
+          explication: '<:saisies:option_info_obligatoire_explication:>'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'obligatoire'\r
+      label: '<:saisies:option_groupe_validation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'obligatoire'\r
+          label: '<:saisies:option_obligatoire_label:>'\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'erreur_obligatoire'\r
+          label: '<:saisies:option_erreur_obligatoire_label:>'\r
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'\r
+defaut:\r
+  options:\r
+    label: '<:saisies:saisie_selecteur_rubrique_titre:>'\r
+    # champs extras (definition du champ sql)\r
+    sql: "text DEFAULT '' NOT NULL"\r
diff --git a/www/plugins/saisies/saisies/selecteur_rubrique_article.html b/www/plugins/saisies/saisies/selecteur_rubrique_article.html
new file mode 100644 (file)
index 0000000..16607d9
--- /dev/null
@@ -0,0 +1,45 @@
+[(#REM) \r
+         \r
+  ### /!\ selecteur (spip Bonux) ###\r
+         Attention, ce qui est retourne est un tableau :\r
+         _request($name) = array('article|3', 'article|9', 'rubrique|10');\r
+         Une fonction de SPIP Bonux permet de récupérer un tableau d'identifiants par type d'objet :\r
+         [(#CHAMP|picker_selected{article})]\r
+         Cette fonction peut etre pratique dans une boucle en utilisant le critere IN\r
+         \r
+  Parametres :\r
+  - multiple : si oui, on peut selectionner plusieurs rubriques\r
+  - afficher_langue : si oui, on affiche la langue de l'objet selectionne\r
+  - afficher_art_dans_langue_interface : si oui, on n'affiche que les articles de la langue de l'interface\r
+  - afficher_rub_dans_langue_interface : si oui, on n'affiche que les rubriques de la langue de l'interface\r
+  - defaut : valeur par defaut si pas présente dans l'environnement\r
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
+        \r
+  Exemple d'appel :\r
+       [(#SAISIE{selecteur_rubrique_article,menu,\r
+               multiple=1,\r
+               label=<:plugin:choisir_le_menu:>})] \r
+]\r
+[(#SET{val,#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}})]\r
+\r
+[(#SET{filtrer_langue_article,[(#ENV{afficher_art_dans_langue_interface,0}|oui) #ENV{lang}]})]\r
+[(#SET{filtrer_langue_rubrique,[(#ENV{afficher_rub_dans_langue_interface,0}|oui) #ENV{lang}]})]\r
+\r
+[(#REM) input necessaire au tag label for \r
+       Mais si on le garde, la saisie enregistree en base, n'est pas correcte\r
+   On pourrait rajouter l'id dans le input cree par Bonux, mais du coup manque la chaine "champ_"\r
+   Comme ca a l'air un peu tordu tout ca, tant pis pour l'erreur HTML\r
+   Yffic\r
+]\r
+[(#REM) Donner a manger a CFG ou CVT-configurer si aucune valeur definie ]\r
+<!--keepme: <input type="hidden" name="[(#ENV{nom,id_item})][]" id="[champ_(#ENV{nom,id_item})]" value="" /> -->\r
+\r
+[(#INCLURE{fond=formulaires/selecteur/articles,\r
+       selected=#GET{val},\r
+       name=#ENV{nom},\r
+       afficher_langue=#ENV{afficher_langue,''},\r
+       filtrer_langue_article=#GET{filtrer_langue_article,''},\r
+       filtrer_langue_rubrique=#GET{filtrer_langue_rubrique,''},\r
+       select=[(#ENV{multiple}|?{0,1})],\r
+       rubriques=1})]\r
+\r
diff --git a/www/plugins/saisies/saisies/selecteur_rubrique_article.yaml b/www/plugins/saisies/saisies/selecteur_rubrique_article.yaml
new file mode 100644 (file)
index 0000000..79dafc2
--- /dev/null
@@ -0,0 +1,114 @@
+\r
+titre: '<:saisies:saisie_selecteur_rubrique_article_titre:>'\r
+description: '<:saisies:saisie_selecteur_rubrique_article:>'\r
+icone: 'images/saisies_selecteur_rubrique_article.png'\r
+options:\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'description'\r
+      label: '<:saisies:option_groupe_description:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'label'\r
+          label: '<:saisies:option_label_label:>'\r
+          explication: '<:saisies:option_label_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'explication'\r
+          label: '<:saisies:option_explication_label:>'\r
+          explication: '<:saisies:option_explication_explication:>'\r
+          size: 50\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'utilisation'\r
+      label: '<:saisies:option_groupe_utilisation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'multiple'\r
+          label: '<:saisies:option_multiple_label:>'\r
+          explication: '<:saisies:option_multiple_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'afficher_langue'\r
+          label: '<:saisies:option_aff_langue_label:>'\r
+          explication: '<:saisies:option_aff_langue_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'afficher_art_dans_langue_interface'\r
+          label: '<:saisies:option_aff_art_interface_label:>'\r
+          explication: '<:saisies:option_aff_art_interface_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'afficher_rub_dans_langue_interface'\r
+          label: '<:saisies:option_aff_rub_interface_label:>'\r
+          explication: '<:saisies:option_aff_rub_interface_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable'\r
+          label: '<:saisies:option_disable_label:>'\r
+          explication: '<:saisies:option_disable_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'disable_avec_post'\r
+          label: '<:saisies:option_disable_avec_post_label:>'\r
+          explication: '<:saisies:option_disable_avec_post_explication:>'\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'readonly'\r
+          label: '<:saisies:option_readonly_label:>'\r
+          explication: '<:saisies:option_readonly_explication:>'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'affichage'\r
+      label: '<:saisies:option_groupe_affichage:>'\r
+    saisies:\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'attention'\r
+          label: '<:saisies:option_attention_label:>'\r
+          explication: '<:saisies:option_attention_explication:>'\r
+          size: 50\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'info_obligatoire'\r
+          label: '<:saisies:option_info_obligatoire_label:>'\r
+          explication: '<:saisies:option_info_obligatoire_explication:>'\r
+  -\r
+    saisie: 'fieldset'\r
+    options:\r
+      nom: 'obligatoire'\r
+      label: '<:saisies:option_groupe_validation:>'\r
+    saisies:\r
+      -\r
+        saisie: 'oui_non'\r
+        options:\r
+          nom: 'obligatoire'\r
+          label: '<:saisies:option_obligatoire_label:>'\r
+      -\r
+        saisie: 'input'\r
+        options:\r
+          nom: 'erreur_obligatoire'\r
+          label: '<:saisies:option_erreur_obligatoire_label:>'\r
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'\r
+defaut:\r
+  options:\r
+    label: '<:saisies:saisie_selecteur_rubrique_article_titre:>'\r
+    # champs extras (definition du champ sql)\r
+    sql: "text DEFAULT '' NOT NULL"\r
diff --git a/www/plugins/saisies/saisies/selecteur_site.html b/www/plugins/saisies/saisies/selecteur_site.html
new file mode 100644 (file)
index 0000000..371bf5c
--- /dev/null
@@ -0,0 +1,33 @@
+[(#REM)\r
+\r
+Saisies qui liste les sites syndiques\r
+Par défaut ne liste que ceux des rubriques à la racine (secteurs)\r
+\r
+  Parametres :\r
+  - class : classe(s) css ajoutes au select\r
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple\r
+    Dans le cas multiple, defaut et valeur doivent etre un array, sinon un int\r
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")\r
+    (seulement si non multiple)\r
+  - cacher_option_intro : pas de premier option vide  (defaut:"")\r
+  - syndication : 'oui' ou 'non' (sélectionner uniquement les sites avec ou sans syndication)\r
+  - defaut : valeur par defaut si pas présente dans l'environnement\r
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
+\r
+]\r
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ (#ENV*{attributs})]>\r
+       [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)\r
+               <option value="0">[(#ENV{option_intro})]</option>]\r
+       <BOUCLE_secteurs(RUBRIQUES){racine}{par num titre, titre}{tout}>\r
+       <B_sites>\r
+       <optgroup label="#TITRE">\r
+               <BOUCLE_sites(SITES){id_secteur}{par nom_site}{syndication ?}>\r
+               [(#ENV{multiple}|oui)\r
+               <option value="#ID_SYNDIC"[(#ID_SYNDIC|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#NOM_SITE</option>]\r
+               [(#ENV{multiple}|non)\r
+               <option value="#ID_SYNDIC"[(#ID_SYNDIC|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#NOM_SITE</option>]\r
+               </BOUCLE_sites>\r
+       </optgroup>\r
+       </B_sites>\r
+       </BOUCLE_secteurs>\r
+</select>\r
diff --git a/www/plugins/saisies/saisies/selection.html b/www/plugins/saisies/saisies/selection.html
new file mode 100644 (file)
index 0000000..ff466e3
--- /dev/null
@@ -0,0 +1,54 @@
+[(#REM) 
+
+  ### /!\ boucle POUR (spip Bonux) ###
+       
+  Parametres :
+  - ** datas : tableau de donnees
+               liste simple : cle=>valeur
+               liste avec groupes :  cle=> tableau (cle=>valeur)
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemples d'appels
+  pour une liste simple :
+       [(#SAISIE{selection,produits,
+               label=<:plugin:info_produits:>,
+               datas=#ARRAY{
+                       cle1,valeur1,
+                       cle2,valeur2,
+                       cle3,valeur3}})]
+  pour une liste avec groupes :
+       [(#SAISIE{selection,produits,
+               label=<:plugin:info_produits:>,
+               datas=#ARRAY{
+                       cle1,#ARRAY{
+                               cle1,valeur1,
+                               cle2,valeur2},
+                       cle2,#ARRAY{
+                               cle1,valeur1,
+                               cle2,valeur2}}})] 
+]
+
+[(#REM) datas peut être une chaine qu'on sait décomposer ]
+#SET{datas, #ENV*{datas}}
+#SET{datas, #GET{datas}|is_string|?{(#GET{datas}|saisies_chaine2tableau), #GET{datas}}}
+[(#REM) Attention, la valeur ou la valeur forcée peut être une chaine vide. On doit donc tester avec is_null. ]
+#SET{valeur,#ENV{valeur_forcee}|is_null|?{#ENV{valeur}|is_null|?{#ENV{defaut},#ENV{valeur}},#ENV{valeur_forcee}}}
+
+<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_selection(POUR){tableau #GET{datas}}>
+       <B_cond>
+       <optgroup label="#CLE">
+       <BOUCLE_cond(CONDITION){si #VALEUR|is_array}><BOUCLE_optgroup(POUR){tableau #VALEUR}>
+               <option value="#CLE"[(#CLE|=={#GET{valeur}}|oui)selected="selected"]>#VALEUR</option>
+       </BOUCLE_optgroup></BOUCLE_cond>
+       </optgroup>
+       </B_cond>
+       <option value="#CLE"[(#CLE|=={#GET{valeur}}|oui)selected="selected"]>#VALEUR</option>
+       <//B_cond>
+</BOUCLE_selection>
+</select>
diff --git a/www/plugins/saisies/saisies/selection.yaml b/www/plugins/saisies/saisies/selection.yaml
new file mode 100644 (file)
index 0000000..9a79b32
--- /dev/null
@@ -0,0 +1,123 @@
+
+titre: '<:saisies:saisie_selection_titre:>'
+description: '<:saisies:saisie_selection_explication:>'
+icone: 'images/saisies_selection.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'datas'
+          label: '<:saisies:option_datas_label:>'
+          explication: '<:saisies:option_datas_explication:>'
+          rows: 10
+          cols: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_intro_label:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'cacher_option_intro'
+          label_case: '<:saisies:option_cacher_option_intro_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'obligatoire'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_selection_titre:>'
+    datas:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/selection_multiple.html b/www/plugins/saisies/saisies/selection_multiple.html
new file mode 100755 (executable)
index 0000000..3121495
--- /dev/null
@@ -0,0 +1,36 @@
+[(#REM) 
+
+  ### /!\ boucle POUR (spip Bonux) ###
+       
+  Parametres :
+  - datas : tableau de donnees cle=>valeur
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{selection_multiple,produits,
+               label=<:plugin:info_produits:>,
+               datas=#ARRAY{
+                       cle1,valeur1,
+                       cle2,valeur2,
+                       cle3,valeur3}})] 
+]
+
+[(#REM) datas peut être une chaine qu'on sait décomposer ]
+#SET{datas, #ENV{datas}|saisies_chaine2tableau}
+
+[(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+
+[(#REM) valeur peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau}
+
+<select name="#ENV{nom}[]" id="champ_[(#ENV{nom}|saisie_nom2classe)]" multiple="multiple"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size,10})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_selection(POUR){tableau #GET{datas}}>
+       <option value="#CLE" [(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui) selected="selected"]>#VALEUR</option>
+</BOUCLE_selection>
+</select>
diff --git a/www/plugins/saisies/saisies/selection_multiple.yaml b/www/plugins/saisies/saisies/selection_multiple.yaml
new file mode 100644 (file)
index 0000000..ecaa51d
--- /dev/null
@@ -0,0 +1,125 @@
+
+titre: '<:saisies:saisie_selection_multiple_titre:>'
+description: '<:saisies:saisie_selection_multiple_explication:>'
+icone: 'images/saisies_selection_multiple.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'datas'
+          label: '<:saisies:option_datas_label:>'
+          explication: '<:saisies:option_datas_explication:>'
+          rows: 10
+          cols: 50
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          rows: 10
+          cols: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_intro_label:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'cacher_option_intro'
+          label_case: '<:saisies:option_cacher_option_intro_label:>'
+          defaut: 'on'
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'obligatoire'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_selection_multiple_titre:>'
+    datas:
+      choix1: '<:saisies:saisie_radio_defaut_choix1:>'
+      choix2: '<:saisies:saisie_radio_defaut_choix2:>'
+      choix3: '<:saisies:saisie_radio_defaut_choix3:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/selection_par_groupe.html b/www/plugins/saisies/saisies/selection_par_groupe.html
new file mode 100644 (file)
index 0000000..d87d60b
--- /dev/null
@@ -0,0 +1,35 @@
+[(#REM) 
+
+  ### /!\ boucle POUR (spip Bonux) ###
+       
+  Parametres :
+  - ** datas : tableau de donnees groupe=>array(cle=>valeur)
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - class : classe(s) css ajoutes au select
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{selection_par_groupe,produits,
+               label=<:plugin:info_produits:>,
+               datas=#ARRAY{
+                       groupe 1,#ARRAY{
+                               cle1,valeur1,
+                               cle2,valeur2,
+                               cle3,valeur3},
+                       groupe 2,#ARRAY{
+                               cle4,valeur1,
+                               cle5,valeur2,
+                               cle6,valeur3}}})] 
+]
+<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+[(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
+<BOUCLE_groupes(POUR){tableau #ENV{datas}}>
+       <optgroup label="[(#CLE|attribut_html)]">
+               <BOUCLE_selection(POUR){tableau #VALEUR}>
+                       <option value="#CLE" [(#CLE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#VALEUR</option>
+               </BOUCLE_selection>
+       </optgroup>
+</BOUCLE_groupes>
+</select>
diff --git a/www/plugins/saisies/saisies/statuts_auteurs.html b/www/plugins/saisies/saisies/statuts_auteurs.html
new file mode 100644 (file)
index 0000000..56a84c6
--- /dev/null
@@ -0,0 +1,43 @@
+[(#REM)
+
+  Parametres :
+  - class : classe(s) css ajoutes au select
+  - multiple : si quelquechose est passe, le select est multiple, sinon, c'est un select simple
+       Dans le cas multiple, defaut et valeur doivent être un array, sinon un int
+  - option_intro : chaine de langue de la premiere ligne vide ? (defaut:"")
+    (seulement si non multiple)
+  - cacher_option_intro : pas de premier option vide  (defaut:"")
+  - afficher_tous : permet d'afficher une option de valeur "tous" correspondant à tous les utilisateurs
+  - poubelle : permet d'afficher le statut poubelle
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  - size : dans le cas d'un select multiple, limite le nombre de lignes au chiffre passé
+  
+  Exemple d'appel :
+       [(#SAISIE{statuts_auteurs,statuts,
+               label=<:plugin:statuts_des_auteurs:>,
+               multiple=oui})]
+]
+
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="[(#ENV{size,#ENV{afficher_tous}|?{4,3}})]"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+       [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
+               <option value="">[(#ENV{option_intro})]</option>]
+       [(#ENV{multiple}|oui)
+               <option value="0minirezo"[(#VAL{0minirezo}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:info_administrateurs:></option>
+               <option value="1comite"[(#VAL{1comite}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:info_redacteurs:></option>
+               <option value="6forum"[(#VAL{6forum}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:info_visiteurs:></option>
+               [(#ENV{poubelle}|oui)
+               <option value="5poubelle"[(#VAL{5poubelle}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:texte_statut_poubelle:></option>]
+               [(#ENV{afficher_tous}|oui)
+               <option value="tous"[(#VAL{tous}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:saisies:tous_visiteurs:></option>]  ]
+       [(#ENV{multiple}|non)
+               <option value="0minirezo"[(#VAL{0minirezo}|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]><:info_administrateurs:></option>
+               <option value="1comite"[(#VAL{1comite}|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]><:info_redacteurs:></option>
+               <option value="6forum"[(#VAL{6forum}|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]><:info_visiteurs:></option>
+               [(#ENV{poubelle}|oui)
+                       <option value="5poubelle"[(#VAL{5poubelle}|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]><:texte_statut_poubelle:></option>]
+               [(#ENV{afficher_tous}|oui)
+               <option value="tous"[(#VAL{tous}|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]><:saisies:tous_visiteurs:></option>]
+       ]
+</select>
+
diff --git a/www/plugins/saisies/saisies/telephone.html b/www/plugins/saisies/saisies/telephone.html
new file mode 100644 (file)
index 0000000..2c52797
--- /dev/null
@@ -0,0 +1,12 @@
+[(#REM) \r
+\r
+               Zone de saisie de numero de telephone. Sur les sites en HTML5,\r
+               utilise type="tel" sur le input (et donc class="tel"); et\r
+               type="text" par défaut pour les autres (et donc class="text").\r
+               Dans ce dernier cas, on renseigne quand même class="tel" pour\r
+               avoir une classe cohérente avec ou sans HTML5.\r
+\r
+][(#INCLURE{fond=saisies/input,\r
+                       env,\r
+            type=#HTML5|?{tel,text},\r
+            class=[(#HTML5|?{[(#ENV{class})],[(#ENV{class}) ]tel})]})]\r
diff --git a/www/plugins/saisies/saisies/textarea.html b/www/plugins/saisies/saisies/textarea.html
new file mode 100644 (file)
index 0000000..182b2cd
--- /dev/null
@@ -0,0 +1,21 @@
+[(#REM)
+
+  Parametres :
+  - class : classe(s) css ajoutes au textarea
+  - rows : nombre de ligne, par defaut : 20 
+  - cols : nombre de caracteres de large, par defaut : 40 (cela depend aussi et surtout du CSS)
+  - inserer_barre : barre d'outils du porte plume à insérer (forum ou edition par défaut)
+  - previsualisation : si égale à 'oui', ajoute l'onglet de prévisualisation
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+
+  Exemple d'appel :
+       [(#SAISIE{textarea, couleur_foncee,
+               label=<:spa:couleur_foncee:>,
+               obligatoire=non})]
+]
+
+[(#REM) Si la valeur est un tableau, le plugin sait le transformer en chaine, plutôt que d'afficher "Array" ]
+#SET{valeur, #ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}
+#SET{valeur, #GET{valeur}|is_array|?{(#GET{valeur}|saisies_tableau2chaine), #GET{valeur}}}
+<textarea name="#ENV{nom}" class="[(#ENV{class}) ][inserer_barre_(#ENV{inserer_barre}) ][(#ENV{previsualisation}|oui)inserer_previsualisation]" id="champ_[(#ENV{nom}|saisie_nom2classe)]" rows="[(#ENV{rows,20})]" cols="[(#ENV{cols,40})]"[ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#ENV{obligatoire}!={non}}|et{#HTML5}|oui) required="required"][ (#ENV*{attributs})]>#GET{valeur}</textarea>
diff --git a/www/plugins/saisies/saisies/textarea.yaml b/www/plugins/saisies/saisies/textarea.yaml
new file mode 100644 (file)
index 0000000..e0cd046
--- /dev/null
@@ -0,0 +1,140 @@
+
+titre: '<:saisies:saisie_textarea_titre:>'
+description: '<:saisies:saisie_textarea_explication:>'
+icone: 'images/saisies_textarea.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          rows: 4
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'readonly'
+          label: '<:saisies:option_readonly_label:>'
+          explication: '<:saisies:option_readonly_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'class'
+          label: '<:saisies:option_class_label:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'rows'
+          label: '<:saisies:option_rows_label:>'
+          explication: '<:saisies:option_rows_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'input'
+        options:
+          nom: 'cols'
+          label: '<:saisies:option_cols_label:>'
+          explication: '<:saisies:option_cols_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'selection'
+        options:
+          nom: 'inserer_barre'
+          label: '<:saisies:option_inserer_barre_label:>'
+          explication: '<:saisies:option_inserer_barre_explication:>'
+          option_intro: <:item_non:>
+          datas:
+            edition: '<:saisies:option_inserer_barre_choix_edition:>'
+            forum: '<:saisies:option_inserer_barre_choix_forum:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'previsualisation'
+          label: '<:saisies:option_previsualisation_label:>'
+          explication: '<:saisies:option_previsualisation_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'validation'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_textarea_titre:>'
+    cols: 40
+    rows: 5
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
diff --git a/www/plugins/saisies/saisies/true_false.html b/www/plugins/saisies/saisies/true_false.html
new file mode 100644 (file)
index 0000000..ebb3496
--- /dev/null
@@ -0,0 +1,23 @@
+[(#REM) 
+
+  Action :
+  - Rempli "true" si oui, "false" si non.
+  
+  Parametres :
+  - defaut : valeur par defaut si pas présente dans l'environnement
+  - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
+  
+  Exemple d'appel :
+       [(#SAISIE{true_false, afficher_liste,
+               label=<:plugin:afficher_liste:>,
+               explication=<:plugin:explication_afficher_liste:>})]
+]
+#SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
+<div class="choix">
+       <input type="radio" name="#ENV{nom}" class="radio" id='champ_[(#ENV{nom}|saisie_nom2classe)]_true'[ (#GET{valeur}|=={true}|oui)checked='checked'] value='true' [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_true">[(#GET{valeur}|=={true}|oui)<strong>]<:item_oui:>[(#GET{valeur}|=={true}|oui)</strong>]</label>
+</div>
+<div class="choix">
+       <input type="radio" name="#ENV{nom}" class="radio" id='champ_[(#ENV{nom}|saisie_nom2classe)]_false'[ (#GET{valeur}|=={false}|oui)checked='checked'] value='false' [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_false">[(#GET{valeur}|=={false}|oui)<strong>]<:item_non:>[(#GET{valeur}|=={false}|oui)</strong>]</label>
+</div>
diff --git a/www/plugins/saisies/saisies/url.html b/www/plugins/saisies/saisies/url.html
new file mode 100644 (file)
index 0000000..6ec595a
--- /dev/null
@@ -0,0 +1,12 @@
+[(#REM) \r
+               \r
+               Zone de saisie d'URL. Sur les sites en HTML5, utilise type="url"\r
+               sur le input (et donc class="url"), et type="text" par défaut\r
+               pour les autres (et donc class="text"). Dans ce dernier cas, on\r
+               renseigne quand même class="url" pour avoir une classe cohérente\r
+               avec ou sans HTML5.\r
+               \r
+][(#INCLURE{fond=saisies/input,\r
+                       env,\r
+            type=#HTML5|?{url,text},\r
+            class=[(#HTML5|?{[(#ENV{class}) ],[(#ENV{class}) ]url})]})]\r
diff --git a/www/plugins/saisies/saisies_fonctions.php b/www/plugins/saisies/saisies_fonctions.php
new file mode 100644 (file)
index 0000000..b022955
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+include_spip('inc/saisies');
+include_spip('balise/saisie');
+// picker_selected (spip 3)
+include_spip('formulaires/selecteur/generique_fonctions');
+
+
+/**
+ * Passer un nom en une valeur compatible avec une classe css
+ * toto => toto,
+ * toto/truc => toto_truc,
+ * toto[truc] => toto_truc,
+**/
+function saisie_nom2classe($nom) {
+       return str_replace(array('/', '[', ']', '&#91;', '&#93;'), array('_', '_', '', '_', ''), $nom);
+}
+
+/**
+ * Passer un nom en une valeur compatible avec un name de formulaire
+ * toto => toto,
+ * toto/truc => toto[truc],
+ * toto[truc] => toto[truc],
+**/
+function saisie_nom2name($nom) {
+       if (false === strpos($nom, '/')) {
+               return $nom;
+       }
+       $nom = explode('/', $nom);
+       $premier = array_shift($nom);
+       $nom = implode('][', $nom);
+       return $premier . '[' . $nom . ']';
+}
+
+/**
+ * Balise beurk #GLOBALS{debut_intertitre}
+ * qui retourne la globale PHP du même nom si elle existe
+ *
+ * @param array $p
+ *             Pile au niveau de la balise
+ * @return array
+ *             Pile complétée du code php de la balise.
+**/
+function balise_GLOBALS_dist($p) {
+       if (function_exists('balise_ENV'))
+               return balise_ENV($p, '$GLOBALS');
+       else
+               return balise_ENV_dist($p, '$GLOBALS');
+}
+
+/**
+ * Liste les éléments du sélecteur générique triés
+ *
+ * Les éléments sont triés par objets puis par identifiants
+ * 
+ * @example
+ *     L'entrée :
+ *     'rubrique|3,rubrique|5,article|2'
+ *     Retourne :
+ *     array(
+ *        0 => array('objet'=>'article', 'id_objet' => 2),
+ *        1 => array('objet'=>'rubrique', 'id_objet' => 3),
+ *        2 => array('objet'=>'rubrique', 'id_objet' => 5),
+ *     )
+ *
+ * @param string $selected
+ *     Liste des objets sélectionnés
+ * @return array
+ *     Liste des objets triés
+**/
+function picker_selected_par_objet($selected) {
+       $res = array();
+       $liste = picker_selected($selected);
+       // $liste : la sortie dans le désordre
+       if (!$liste) {
+               return $res;
+       }
+
+       foreach ($liste as $l) {
+               if (!isset($res[ $l['objet'] ])) {
+                       $res[ $l['objet'] ] = array();
+               }
+               $res[$l['objet']][] = $l['id_objet'];
+       }
+       // $res est trié par objet, puis par identifiant
+       ksort($res);
+       foreach ($res as $objet => $ids) {
+               sort($res[$objet]);
+       }
+
+       // on remet tout en file
+       $liste = array();
+       foreach ($res as $objet=>$ids) {
+               foreach ($ids as $id) {
+                       $liste[] = array('objet' => $objet, 'id_objet' => $id);
+               }
+       }
+
+       return $liste;
+}
+?>
diff --git a/www/plugins/saisies/saisies_options.php b/www/plugins/saisies/saisies_options.php
new file mode 100644 (file)
index 0000000..fa2590f
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+/*
+ * une fonction qui regarde si $texte est une chaine de langue
+ * de la forme <:qqch:>
+ * si oui applique _T()
+ * si non applique typo() suivant le mode choisi
+ *
+ * @param mixed $valeur
+ *     Une valeur à tester. Si c'est un tableau, la fonction s'appliquera récursivement dessus.
+ * @param string $mode_typo
+ *     Le mode d'application de la fonction typo(), avec trois valeurs possibles "toujours", "jamais" ou "multi".
+ * @return mixed
+ *     Retourne la valeur éventuellement modifiée.
+ */
+if (!function_exists('_T_ou_typo')){
+       function _T_ou_typo($valeur, $mode_typo='toujours') {
+               // Si la valeur est bien une chaine (et pas non plus un entier déguisé)
+               if (is_string($valeur) and !intval($valeur)){
+                       // Si la chaine est du type <:truc:> on passe à _T()
+                       if (preg_match('/^\<:(.*?):\>$/', $valeur, $match)) 
+                               $valeur = _T($match[1]);
+                       // Sinon on la passe a typo()
+                       else {
+                               if (!in_array($mode_typo, array('toujours', 'multi', 'jamais')))
+                                       $mode_typo = 'toujours';
+                       
+                               if ($mode_typo == 'toujours' or ($mode_typo == 'multi' and strpos($valeur, '<multi>') !== false)){
+                                       include_spip('inc/texte');
+                                       $valeur = typo($valeur);
+                               }
+                       }
+               }
+               // Si c'est un tableau, on reapplique la fonction récursivement
+               elseif (is_array($valeur)){
+                       foreach ($valeur as $cle => $valeur2){
+                               $valeur[$cle] = _T_ou_typo($valeur2, $mode_typo);
+                       }
+               }
+
+               return $valeur;
+       }
+}
+
+?>
diff --git a/www/plugins/saisies/saisies_pipelines.php b/www/plugins/saisies/saisies_pipelines.php
new file mode 100644 (file)
index 0000000..bccdea0
--- /dev/null
@@ -0,0 +1,92 @@
+<?php\r
+\r
+// Sécurité\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+function saisies_header_prive($flux){\r
+       $js = find_in_path('javascript/saisies.js');\r
+       $flux .= "\n<script type='text/javascript' src='$js'></script>\n";\r
+       $css = generer_url_public('saisies.css');\r
+       $flux .= "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";\r
+       $css_constructeur = find_in_path('css/formulaires_constructeur.css');\r
+       $flux .= "\n<link rel='stylesheet' href='$css_constructeur' type='text/css' />\n";\r
+       return $flux;\r
+}\r
+\r
+function saisies_affichage_final($flux){\r
+       if (($p = strpos($flux,"<!--!inserer_saisie_editer-->"))!==false){\r
+               // On insère la CSS devant le premier <link> trouvé\r
+               if (!$pi = strpos($flux, "<link") AND !$pi=strpos($flux, '</head'))\r
+                       $pi = $p; // si pas de <link inserer comme un goret entre 2 <li> de saisies\r
+               $css = generer_url_public('saisies.css');\r
+               $ins_css = "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";\r
+               $flux = substr_replace($flux, $ins_css, $pi, 0);\r
+               \r
+               // On insère le JS à la fin du <head>\r
+               $pos_head = strpos($flux, '</head');\r
+               $js = find_in_path('javascript/saisies.js');\r
+               $ins_js = "\n<script type='text/javascript' src='$js'></script>\n";\r
+               $flux = substr_replace($flux, $ins_js, $pos_head, 0);\r
+       }\r
+       return $flux;\r
+}\r
+\r
+// Déclaration des pipelines\r
+function saisies_saisies_autonomes($flux) { return $flux; }\r
+function saisies_formulaire_saisies($flux) { return $flux; }\r
+\r
+// Déclarer automatiquement les champs d'un CVT si on les trouve dans un tableau de saisies et s'ils ne sont pas déjà déclarés\r
+function saisies_formulaire_charger($flux){\r
+       // Si le flux data est inexistant, on quitte : Le CVT d'origine a décidé de ne pas continuer\r
+       if (!is_array($flux['data'])){\r
+               return $flux;\r
+       }\r
+       \r
+       // Il faut que la fonction existe et qu'elle retourne bien un tableau\r
+       if (include_spip('inc/saisies')\r
+               and $saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args'])\r
+       ){\r
+               // On ajoute au contexte les champs à déclarer\r
+               $contexte = saisies_lister_valeurs_defaut($saisies);\r
+               $flux['data'] = array_merge($contexte, $flux['data']);\r
+\r
+               // On ajoute le tableau complet des saisies\r
+               $flux['data']['_saisies'] = $saisies;\r
+       }\r
+       return $flux;\r
+}\r
+\r
+// Aiguiller CVT vers un squelette propre à Saisies lorsqu'on a déclaré des saisies et qu'il n'y a pas déjà un HTML\r
+function saisies_styliser($flux){\r
+       // Si on cherche un squelette de formulaire\r
+       if (strncmp($flux['args']['fond'],'formulaires/',12)==0\r
+               // Et qu'il y a des saisies dans le contexte\r
+               and isset($flux['args']['contexte']['_saisies'])\r
+               // Et que le fichier choisi est vide ou n'existe pas\r
+               and include_spip('inc/flock')\r
+               and $ext = $flux['args']['ext']\r
+               and lire_fichier($flux['data'].'.'.$ext, $contenu_squelette)\r
+               and !trim($contenu_squelette)\r
+       ){\r
+               $flux['data'] = preg_replace("/\.$ext$/", '', find_in_path("formulaires/inc-saisies-cvt.$ext"));\r
+       }\r
+       \r
+       return $flux;\r
+}\r
+\r
+// Ajouter les vérifications déclarées dans la fonction "saisies" du CVT\r
+function saisies_formulaire_verifier($flux){\r
+       // Il faut que la fonction existe et qu'elle retourne bien un tableau\r
+       if (include_spip('inc/saisies') and $saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args'])){\r
+               // On ajoute au contexte les champs à déclarer\r
+               $erreurs = saisies_verifier($saisies);\r
+               if ($erreurs and !isset($erreurs['message_erreur']))\r
+                       $erreurs['message_erreur'] = _T('saisies:erreur_generique');\r
+               $flux['data'] = array_merge($erreurs, $flux['data']);\r
+       }\r
+\r
+\r
+       return $flux;\r
+}\r
+\r
+?>\r
diff --git a/www/plugins/saisies/svn.revision b/www/plugins/saisies/svn.revision
new file mode 100644 (file)
index 0000000..87cc17d
--- /dev/null
@@ -0,0 +1,10 @@
+<svn_revision>
+<text_version>
+Origine: file:///home/svn/repository/spip-zone/_plugins_/saisies
+Revision: 73152
+Dernier commit: 2013-06-01 05:45:11 +0200 
+</text_version>
+<origine>file:///home/svn/repository/spip-zone/_plugins_/saisies</origine>
+<revision>73152</revision>
+<commit>2013-06-01 05:45:11 +0200 </commit>
+</svn_revision>
\ No newline at end of file
diff --git a/www/plugins/saisies/test/configurer_saisie.html b/www/plugins/saisies/test/configurer_saisie.html
new file mode 100644 (file)
index 0000000..aa3cb37
--- /dev/null
@@ -0,0 +1,51 @@
+<html>
+<head>
+       <title>Test de configuration de saisie</title>
+       [<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css})" type="text/css" media="all" title="formulaires" charset="utf-8" />]
+       <style type="text/css">
+               .formulaire_spip{
+                       width:40%;
+                       border:1px solid black;
+                       -moz-border-radius:10px;
+                       -webkit-border-radius:10px;
+                       border-radius:10px;
+               }
+               .formulaire_spip ul li{
+                       padding:0.5em;
+               }
+               .formulaire_spip li.fieldset{
+                       padding:0;
+               }
+               .formulaire_spip li.obligatoire{
+                       background:#ffcfcf;
+               }
+               .formulaire_spip .fieldset .legend{
+                       margin:0;
+                       font-style:italic;
+               }
+       </style>
+</head>
+<body>
+       <h1>Test pour générer le formulaire de configuration d'une saisie</h1>
+       
+       <h2>Par defaut, sans configuration du nom du champ</h2>
+       <form class="formulaire_spip" action="#SELF" method="post">
+               <ul>
+                       #CONFIGURER_SAISIE{#ENV{saisie, input}}
+                       <li class="boutons">
+                               <input type="submit" class="submit" />
+                       </li>
+               </ul>
+       </form>
+       
+       <h2>En forçant la configuration du nom</h2>
+       <form class="formulaire_spip" action="#SELF" method="post">
+               <ul>
+                       #CONFIGURER_SAISIE{#ENV{saisie, input}, avec_nom=oui}
+                       <li class="boutons">
+                               <input type="submit" class="submit" />
+                       </li>
+               </ul>
+       </form>
+</body>
+</html>
diff --git a/www/plugins/saisies/test/generer_saisies.html b/www/plugins/saisies/test/generer_saisies.html
new file mode 100644 (file)
index 0000000..4398eb6
--- /dev/null
@@ -0,0 +1,152 @@
+<html>
+<head>
+       <title>Test de génération de saisies</title>
+       [<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css})" type="text/css" media="all" title="formulaires" charset="utf-8" />]
+       <style type="text/css">
+               .formulaire_spip{
+                       width:40%;
+                       border:1px solid black;
+                       -moz-border-radius:10px;
+                       -webkit-border-radius:10px;
+                       border-radius:10px;
+               }
+               .formulaire_spip ul li{
+                       padding:0.5em;
+               }
+               .formulaire_spip li.fieldset{
+                       padding:0;
+               }
+               .formulaire_spip li.obligatoire{
+                       background:#ffcfcf;
+               }
+               .formulaire_spip .fieldset .legend{
+                       margin:0;
+                       font-style:italic;
+               }
+       </style>
+</head>
+<body>
+       <h1>Test pour générer des saisies à partir d'une description</h1>
+
+       <h2>Génération d'une seule saisie</h2>
+       #SET{champ,
+               #ARRAY{
+                       saisie, input,
+                       options, #ARRAY{
+                               nom, test,
+                               label, Une sorte de titre,
+                               explication, Un sorte d'explication,
+                               obligatoire, oui
+                       }
+               }
+       }
+       <form class="formulaire_spip" action="#SELF" method="post">
+               <ul>
+                       [(#GET{champ}|saisies_generer_html{#ENV**|unserialize})]
+                       <li class="boutons">
+                               <input type="submit" class="submit" />
+                       </li>
+               </ul>
+       </form>
+
+       <h2>Génération complète du contenu (l'intérieur) d'un formulaire</h2>
+       #SET{saisies,
+               #ARRAY{
+                       0,#ARRAY{
+                               saisie, destinataires,
+                               options, #ARRAY{
+                                       nom, destinataires,
+                                       label, Destinataires,
+                                       choix_destinataires, #ARRAY{0,1,1,2},
+                                       type_choix, plusieurs,
+                                       obligatoire, oui
+                               }
+                       },
+                       1,#ARRAY{
+                               saisie, input,
+                               options, #ARRAY{
+                                       nom, prenom,
+                                       label, Prénom,
+                               }
+                       },
+                       2,#ARRAY{
+                               saisie, input,
+                               options, #ARRAY{
+                                       nom, nom,
+                                       label, Nom,
+                                       obligatoire, oui
+                               }
+                       },
+                       3,#ARRAY{
+                               saisie, input,
+                               options, #ARRAY{
+                                       nom, courriel,
+                                       label, Courriel,
+                                       obligatoire, oui
+                               },
+                               verifier, #ARRAY{
+                                       type, email
+                               }
+                       },
+                       4,#ARRAY{
+                               saisie, case,
+                               options, #ARRAY{
+                                       nom, case,
+                                       label, Une sorte de case à cocher,
+                                       label_case, Check la vibes
+                               }
+                       },
+                       5,#ARRAY{
+                               saisie, fieldset,
+                               options, #ARRAY{
+                                       nom, adresse,
+                                       label, Adresse
+                               },
+                               saisies, #ARRAY{
+                                       1,#ARRAY{
+                                               saisie, textarea,
+                                               options, #ARRAY{
+                                                       nom, voie,
+                                                       label, Voie,
+                                                       obligatoire, non,
+                                               }
+                                       },
+                                       2,#ARRAY{
+                                               saisie, input,
+                                               options, #ARRAY{
+                                                       nom, code_postal,
+                                                       label, Code postal,
+                                                       obligatoire, oui
+                                               }
+                                       },
+                                       3,#ARRAY{
+                                               saisie, input,
+                                               options, #ARRAY{
+                                                       nom, ville,
+                                                       label, Ville,
+                                                       obligatoire, oui
+                                               }
+                                       }
+                               }
+                       },
+                       6,#ARRAY{
+                               saisie, oui_non,
+                               options, #ARRAY{
+                                       nom, peutetre,
+                                       label, Tu veux ou tu veux pas ?,
+                                       obligatoire, oui,
+                                       info_obligatoire, " / obligatoire"
+                               }
+                       },
+               }
+       }
+       <form class="formulaire_spip" action="#SELF" method="post">
+               <ul>
+                       #GENERER_SAISIES{#GET{saisies}}
+                       <li class="boutons">
+                               <input type="submit" class="submit" />
+                       </li>
+               </ul>
+       </form>
+</body>
+</html>
diff --git a/www/plugins/saisies/test/saisie.html b/www/plugins/saisies/test/saisie.html
new file mode 100644 (file)
index 0000000..899d81a
--- /dev/null
@@ -0,0 +1,11 @@
+Version PHP : <?php echo phpversion(); ?>
+
+
+<h1>Input</h1>
+[(#SAISIE{input,titre})]
+
+<h1>Textarea</h1>
+[(#SAISIE{textarea,texte})]
+
+<h1>Input obligatoire et label</h1>
+[(#SAISIE{input,titre,obligatoire=oui,label=Un vrai titre})]
diff --git a/www/plugins/saisies/test/voir_saisie.html b/www/plugins/saisies/test/voir_saisie.html
new file mode 100644 (file)
index 0000000..d72f830
--- /dev/null
@@ -0,0 +1,10 @@
+<h1>Input et label</h1>
+[(#VOIR_SAISIE{input,titre,label=Un vrai titre,valeur=TRUC})]
+
+<h1>Textarea</h1>
+[(#VOIR_SAISIE{textarea,texte,valeur=Un super long texte<br/>sur plusieurs ligne})]
+
+<h1>Destinataires</h1>
+[(#VOIR_SAISIE{destinataires,destinataires, label=Destinataires,valeur=#ARRAY{0,1,1,2}})]
+
+
diff --git a/www/plugins/saisies/test/voir_saisies.html b/www/plugins/saisies/test/voir_saisies.html
new file mode 100644 (file)
index 0000000..3d7c50f
--- /dev/null
@@ -0,0 +1,147 @@
+<html>
+<head>
+       <title>Test de génération des vues de saisies</title>
+       [<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css})" type="text/css" media="all" title="formulaires" charset="utf-8" />]
+       <style type="text/css">
+               .formulaire_spip{
+                       width:40%;
+                       border:1px solid black;
+                       -moz-border-radius:10px;
+                       -webkit-border-radius:10px;
+                       border-radius:10px;
+               }
+               .formulaire_spip ul li{
+                       padding:0.5em;
+               }
+               .formulaire_spip li.fieldset{
+                       padding:0;
+               }
+               .formulaire_spip li.obligatoire{
+                       background:#ffcfcf;
+               }
+               .formulaire_spip .fieldset .legend{
+                       margin:0;
+                       font-style:italic;
+               }
+       </style>
+</head>
+<body>
+       <h1>Générer des vues de saisie</h1>
+
+       #SET{saisies,
+               #ARRAY{
+                       0,#ARRAY{
+                               saisie, destinataires,
+                               options, #ARRAY{
+                                       nom, destinataires,
+                                       label, Destinataires,
+                                       choix_destinataires, #ARRAY{0,1,1,2},
+                                       type_choix, plusieurs,
+                                       obligatoire, oui
+                               }
+                       },
+                       1,#ARRAY{
+                               saisie, input,
+                               options, #ARRAY{
+                                       nom, prenom,
+                                       label, Prénom,
+                               }
+                       },
+                       2,#ARRAY{
+                               saisie, input,
+                               options, #ARRAY{
+                                       nom, nom,
+                                       label, Nom,
+                                       obligatoire, oui
+                               }
+                       },
+                       3,#ARRAY{
+                               saisie, input,
+                               options, #ARRAY{
+                                       nom, courriel,
+                                       label, Courriel,
+                                       obligatoire, oui
+                               },
+                               verifier, #ARRAY{
+                                       type, email
+                               }
+                       },
+                       4,#ARRAY{
+                               saisie, case,
+                               options, #ARRAY{
+                                       nom, case,
+                                       label, Une sorte de case à cocher,
+                                       label_case, Check la vibes
+                               }
+                       },
+                       5,#ARRAY{
+                               saisie, fieldset,
+                               options, #ARRAY{
+                                       nom, adresse,
+                                       label, Adresse
+                               },
+                               saisies, #ARRAY{
+                                       1,#ARRAY{
+                                               saisie, textarea,
+                                               options, #ARRAY{
+                                                       nom, voie,
+                                                       label, Voie,
+                                                       obligatoire, non,
+                                               }
+                                       },
+                                       2,#ARRAY{
+                                               saisie, input,
+                                               options, #ARRAY{
+                                                       nom, code_postal,
+                                                       label, Code postal,
+                                                       obligatoire, oui
+                                               }
+                                       },
+                                       3,#ARRAY{
+                                               saisie, input,
+                                               options, #ARRAY{
+                                                       nom, ville,
+                                                       label, Ville,
+                                                       obligatoire, oui
+                                               }
+                                       }
+                               }
+                       },
+                       6,#ARRAY{
+                               saisie, oui_non,
+                               options, #ARRAY{
+                                       nom, peutetre,
+                                       label, Tu veux ou tu veux pas ?,
+                                       obligatoire, oui,
+                                       info_obligatoire, " / obligatoire"
+                               }
+                       },
+               }
+       }
+
+       <h2>Formulaire auquel on doit répondre</h2>
+       <div class="formulaire_spip">
+       <ul>
+       #GENERER_SAISIES{#GET{saisies}}
+       </ul>
+       </div>
+
+
+       #SET{valeurs,
+               #ARRAY{
+                       case, on,
+                       peutetre, '',
+                       prenom, Jean-Paul,
+                       code_postal, 22222,
+                       nom, Fitousi,
+                       ville, Deuville,
+                       courriel, robert@menard.com,
+                       destinataires, #ARRAY{1,1},
+                       voie, 2 rue du Deux,
+               }
+       }
+
+       <h2>Réponse à ce formulaire</h2>
+       #VOIR_SAISIES{#GET{saisies}, #GET{valeurs}}
+</body>
+</html>
diff --git a/www/plugins/zpip_v1/404.html b/www/plugins/zpip_v1/404.html
new file mode 100644 (file)
index 0000000..4ebccac
--- /dev/null
@@ -0,0 +1,4 @@
+#HTTP_HEADER{#VAL{"HTTP/1.0 "}|concat{#ENV{code,"404 Not Found"}}}
+#HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}
+#HTTP_HEADER{Pragma: no-cache}
+<INCLURE{fond=structure}{env}{type=page}{composition=#ENV{status,404}} />
diff --git a/www/plugins/zpip_v1/article.html b/www/plugins/zpip_v1/article.html
new file mode 100644 (file)
index 0000000..0ef7ea0
--- /dev/null
@@ -0,0 +1,3 @@
+<BOUCLE_principale_article(ARTICLES){id_article}>
+<INCLURE{fond=structure}{env}{id_rubrique=#ENV{id_rubrique,#ID_RUBRIQUE}}{id_secteur=#ID_SECTEUR}{type=article}{composition=#COMPOSITION} />
+</BOUCLE_principale_article>
diff --git a/www/plugins/zpip_v1/auteur.html b/www/plugins/zpip_v1/auteur.html
new file mode 100644 (file)
index 0000000..bd18e58
--- /dev/null
@@ -0,0 +1,3 @@
+<BOUCLE_principale_auteur(AUTEURS){id_auteur}>
+<INCLURE{fond=structure}{env}{type=auteur}{composition=#COMPOSITION} />
+</BOUCLE_principale_auteur>
diff --git a/www/plugins/zpip_v1/backend.html b/www/plugins/zpip_v1/backend.html
new file mode 100644 (file)
index 0000000..803ef9c
--- /dev/null
@@ -0,0 +1,43 @@
+[(#REM)
+       Ce fichier sert à créer les flux RSS
+       qui permettent aux visiteurs de suivre l'actualité
+       de votre site depuis un lecteur de news.
+
+       Cette page génère un code XML/RSS adapté
+
+][(#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/"
+       xmlns:atom="http://www.w3.org/2005/Atom"
+>
+
+<channel[ xml:lang="(#LANG)"]>
+       <title>[(#NOM_SITE_SPIP|textebrut|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>
+       <atom:link href="[(#SELF|url_absolue)]" rel="self" type="application/rss+xml" />
+
+[      <image>
+               <title>[(#NOM_SITE_SPIP|texte_backend)]</title>
+               <url>(#LOGO_SITE_SPIP||image_reduire{144,400}|extraire_attribut{src}|url_absolue|texte_backend)</url>
+               <link>#URL_SITE_SPIP/</link>
+               [<height>(#LOGO_SITE_SPIP||image_reduire{144,400}|extraire_attribut{height})</height>]
+               [<width>(#LOGO_SITE_SPIP||image_reduire{144,400}|extraire_attribut{width})</width>]
+       </image>
+]
+
+<BOUCLE_10recents(ARTICLES) {lang ?}{branche ?}{id_mot ?}{id_auteur ?} {par date}{inverse}{0,10}{unique}>
+<INCLURE{fond=inclure/rss-item}{id_article}>
+</BOUCLE_10recents>
+
+<BOUCLE_tres_recents(ARTICLES){lang ?}{branche ?}{id_mot ?}{id_auteur ?} {par date}{inverse}{age<3}{unique}>
+<INCLURE{fond=inclure/rss-item}{id_article}>
+</BOUCLE_tres_recents>
+
+</channel>
+
+</rss>
diff --git a/www/plugins/zpip_v1/body.html b/www/plugins/zpip_v1/body.html
new file mode 100644 (file)
index 0000000..539de2a
--- /dev/null
@@ -0,0 +1,23 @@
+<div id="page">
+       <div id="entete">
+               <INCLURE{fond=inclure/entete,env}>
+       </div>
+       <div id="nav">
+               <INCLURE{fond=inclure/barre-nav,env}>
+       </div>
+       
+       <div id="conteneur">    
+               <div id="contenu">
+                       <INCLURE{fond=contenu/#ENV{type},env}>
+               </div>
+
+               <div id="navigation">
+                       <INCLURE{fond=navigation/#ENV{type},env}>
+                       <INCLURE{fond=extra/#ENV{type},env}>
+               </div>
+       </div>
+
+       <div id="pied">
+               <INCLURE{fond=inclure/pied,env}>
+       </div>
+</div>
diff --git a/www/plugins/zpip_v1/breve.html b/www/plugins/zpip_v1/breve.html
new file mode 100644 (file)
index 0000000..cf9ec45
--- /dev/null
@@ -0,0 +1,3 @@
+<BOUCLE_breve_principal(BREVES) {id_breve}>
+<INCLURE{fond=structure}{env}{id_rubrique=#ENV{id_rubrique,#ID_RUBRIQUE}}{type=breve}{composition=#COMPOSITION} />
+</BOUCLE_breve_principal>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contact.html b/www/plugins/zpip_v1/contact.html
new file mode 100644 (file)
index 0000000..7b5b214
--- /dev/null
@@ -0,0 +1 @@
+<INCLURE{fond=structure}{env}{type=page}{composition=contact} />
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/article.html b/www/plugins/zpip_v1/contenu/article.html
new file mode 100644 (file)
index 0000000..049eb05
--- /dev/null
@@ -0,0 +1,46 @@
+<BOUCLE_contenu_article(ARTICLES){id_article}>
+[(#REM) Fil d'Ariane ]
+<p 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; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+
+<div class="contenu-principal">
+       <div class="cartouche">
+               [(#LOGO_ARTICLE||image_reduire{200,200})]
+               [<p class="#EDIT{surtitre} surtitre">(#SURTITRE)</p>]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>]
+
+               <p class="info-publi"><abbr class="published" title="[(#DATE|date_iso)]">[(#DATE|nom_jour) ][(#DATE|affdate)]</abbr>[, <span class="auteurs"><:par_auteur:> (#LESAUTEURS)</span>]</p>
+               [(#REM) Inclure le modele des liens de traductions ]
+               #MODELE{article_traductions}
+       </div>
+
+       <div class="surlignable">
+               [<div class="#EDIT{chapo} chapo">(#CHAPO|image_reduire{500,0})</div>]
+               [<div class="#EDIT{texte} texte">(#TEXTE|image_reduire{500,0})</div>]
+       </div>
+
+       [<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+
+       [<div class="ps">
+               <h2 class="h2"><:info_ps:></h2>
+               <div class="#EDIT{ps} surlignable">(#PS|image_reduire{500,0})</div>
+       </div>]
+
+[(#REM) Gestion du portfolio et des documents ]
+[(#INCLURE{fond=inclure/documents}{id_article})]
+
+</div>
+
+[(#REM) Petition :
+La petition ayant une PAGINATION il faut absolument {env}
+et pourquoi pas ajax
+][(#PETITION|oui)<INCLURE{fond=inclure/petition}{id_article}{env}{ajax}>]
+
+[<div class="notes surlignable"><h2 class="h2 pas_surlignable"><:info_notes:></h2>(#NOTES)</div>]
+
+[(#REM) Forum de l'article ]
+<a href="#forum" name="forum" id="forum"></a>
+<INCLURE{fond=inclure/forum}{id_article} />
+[<p class="repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:repondre_article:></a></p>]
+
+</BOUCLE_contenu_article>
diff --git a/www/plugins/zpip_v1/contenu/auteur.html b/www/plugins/zpip_v1/contenu/auteur.html
new file mode 100644 (file)
index 0000000..da0f11e
--- /dev/null
@@ -0,0 +1,37 @@
+<BOUCLE_contenu_auteur(AUTEURS){id_auteur}>
+    
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <:info_auteurs:>[ &gt; <strong class="on">(#NOM|couper{80})</strong>]</p>
+
+<div class="contenu-principal">
+       <div class="vcard">[(#REM) microformat vcard]
+       <div class="cartouche">
+               [(#LOGO_AUTEUR||image_reduire{200,200})]
+               <h1 class="h1 #EDIT{qui} fn">#NOM</h1>
+       </div>
+
+       [<div class="#EDIT{bio} texte note">(#BIO)</div>]
+       [<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="url spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+       </div>[(#REM) / vcard]
+
+       [(#REM) Articles de l'auteur ]
+       <B_articles>
+       <div class="liste articles">
+               #ANCRE_PAGINATION
+               <h2 class="h2"><:articles_auteur:> (#GRAND_TOTAL)</h2>
+               <ul class="liste-items">
+                       <BOUCLE_articles(ARTICLES) {id_auteur} {!par popularite} {pagination 10}>
+                       <li class="item"><a href="#URL_ARTICLE">#TITRE</a></li>
+                       </BOUCLE_articles>
+               </ul>
+               [<p class="pagination">(#PAGINATION)</p>]
+       </div>
+       </B_articles>
+
+</div>
+
+#FORMULAIRE_ECRIRE_AUTEUR
+
+[<div class="notes"><h2 class="h2"><:info_notes:></h2>(#NOTES)</div>]
+
+</BOUCLE_contenu_auteur>
diff --git a/www/plugins/zpip_v1/contenu/breve.html b/www/plugins/zpip_v1/contenu/breve.html
new file mode 100644 (file)
index 0000000..a7f38cd
--- /dev/null
@@ -0,0 +1,22 @@
+<BOUCLE_breve_principal(BREVES) {id_breve}>
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/" ><:accueil_site:></a><BOUCLE_ariane(RUBRIQUES){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+
+<div class="contenu-principal">
+
+  <div class="cartouche">
+      [(#LOGO_BREVE||image_reduire{200,200})]
+      <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+      <p class="info-publi"><abbr class="published" title="[(#DATE|date_iso)]">[(#DATE|nom_jour) ][(#DATE|affdate)]</abbr></p>
+  </div>
+  
+  [<div class="#EDIT{texte} texte">(#TEXTE)</div>]
+  [<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+  [<div class="notes"><h2 class="h2"><:info_notes:></h2>(#NOTES)</div>]
+</div>
+[(#REM) Forum de la breve
+NB : pour desactiver les forums de breve, supprimez simplement les lignes ci-dessous ]
+<a href="#forum" name="forum" id="forum"></a>
+<INCLURE{fond=inclure/forum}{id_breve}>
+[<p class="repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:repondre_breve:></a></p>]
+</BOUCLE_breve_principal>
diff --git a/www/plugins/zpip_v1/contenu/mot.html b/www/plugins/zpip_v1/contenu/mot.html
new file mode 100644 (file)
index 0000000..fb48887
--- /dev/null
@@ -0,0 +1,80 @@
+<BOUCLE_principale(MOTS) {id_mot} {doublons}>
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <:mots_clefs:><BOUCLE_ariane(GROUPES_MOTS){id_groupe}> &gt; [(#TITRE|couper{80})]</BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+
+<div class="contenu-principal">
+
+  <div class="cartouche">
+      [(#LOGO_MOT||image_reduire{200,200})]
+      <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+  </div>
+
+  [<div class="#EDIT{texte} chapo">(#TEXTE)</div>]
+
+  [(#REM) Articles lies au mot-cle ]
+  <B_articles>
+  <div class="liste articles">
+      #ANCRE_PAGINATION
+      <h2 class="h2"><:articles:></h2>
+      <ul class="liste-items">
+          <BOUCLE_articles(ARTICLES) {id_mot} {par popularite}{inverse} {pagination 10}>
+          <li class="item">
+          <h3 class="h3"><a href="#URL_ARTICLE">#TITRE</a></h3>
+          <div class="small">[(#DATE|affdate_jourcourt)][, <:par_auteur:> (#LESAUTEURS)]</div></li>
+          </BOUCLE_articles>
+      </ul>
+      [<p class="pagination">(#PAGINATION)</p>]
+  </div>
+  </B_articles>
+
+  [(#REM) Rubriques liees au mot-cle ]
+  <B_rubriques>
+  <div class="liste rubriques">
+      <h2 class="h2"><:rubriques:></h2>
+      <ul class="liste-items">
+          <BOUCLE_rubriques(RUBRIQUES) {id_mot} {par titre}>
+          <li class="item"><a href="#URL_RUBRIQUE">#TITRE</a></li>
+          </BOUCLE_rubriques>
+      </ul>
+  </div>
+  </B_rubriques>
+
+  [(#REM) Breves liees au mot-cle ]
+  <B_breves>
+  <div class="liste breves">
+      <h2 class="h2"><:breves:></h2>
+      <ul class="liste-items">
+          <BOUCLE_breves(BREVES) {id_mot} {par titre}>
+          <li class="item"><a href="#URL_BREVE">#TITRE</a></li>
+          </BOUCLE_breves>
+      </ul>
+  </div>
+  </B_breves>
+
+  [(#REM) Liens des forums ]
+  <B_forums_liens>
+  <div class="liste forums">
+      <h2 class="h2"><:messages_forum:></h2>
+      <ul class="liste-items">
+          <BOUCLE_forums_liens(FORUMS) {id_mot} {plat} {par date}{inverse}>
+          <li class="item">[(#DATE|affdate_jourcourt) &ndash; ]<a href="#URL_FORUM">[(#TEXTE|couper{80})]</a></li>
+          </BOUCLE_forums_liens>
+      </ul>
+  </div>
+  </B_forums_liens>
+
+  [(#REM) Sites web lies au mot-cle ]
+  <B_sites>
+  <div class="liste sites">
+      <h2 class="h2"><:sites_web:></h2>
+      <ul class="liste-items">
+          <BOUCLE_sites(SITES) {id_mot} {par nom_site}>
+                                       <li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]">#NOM_SITE</a></li>
+                                       </BOUCLE_sites>
+      </ul>
+  </div>
+  </B_sites>
+</div>
+
+[<div class="notes"><h2 class="h2"><:info_notes:></h2>(#NOTES)</div>]
+</BOUCLE_principale>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/page-401.html b/www/plugins/zpip_v1/contenu/page-401.html
new file mode 100644 (file)
index 0000000..e16575b
--- /dev/null
@@ -0,0 +1,10 @@
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <strong class="on"><:pass_erreur:>[ (#ENV{status})]</strong></p>
+
+<div class="contenu-principal">
+       <div class="cartouche">
+               <h1 class="h1"><:pass_erreur:>[ (#ENV{status})]</h1>
+       </div>
+       [<div class="chapo">(#ENV*{erreur}|propre)</div>]
+       #FORMULAIRE_LOGIN{#ENV{cible},'',0}
+</div>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/page-404.html b/www/plugins/zpip_v1/contenu/page-404.html
new file mode 100644 (file)
index 0000000..754951d
--- /dev/null
@@ -0,0 +1,9 @@
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <strong class="on"><:pass_erreur:> 404</strong></p>
+
+<div class="contenu-principal">
+       <div class="cartouche">
+               <h1 class="h1"><:pass_erreur:> 404</h1>
+       </div>
+       [<div class="chapo">(#ENV{erreur})</div>]
+</div>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/page-forum.html b/www/plugins/zpip_v1/contenu/page-forum.html
new file mode 100644 (file)
index 0000000..38792d8
--- /dev/null
@@ -0,0 +1,89 @@
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a>
+
+    <BOUCLE_contexte_article(ARTICLES) {id_article}>
+    <BOUCLE_ariane_article(HIERARCHIE) {id_article}>
+    &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+    </BOUCLE_ariane_article>
+    &gt; <a href="#URL_ARTICLE">[(#TITRE|couper{80})]</a>
+    </BOUCLE_contexte_article>
+    </B_contexte_article>
+
+    <BOUCLE_contexte_breve(BREVES) {id_breve}>
+    <BOUCLE_ariane_breve(RUBRIQUES) {id_rubrique}>
+    &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+    </BOUCLE_ariane_breve>
+    &gt; <a href="#URL_BREVE">[(#TITRE|couper{80})]</a>
+    </BOUCLE_contexte_breve>
+
+    <BOUCLE_contexte_rubrique(RUBRIQUES) {id_rubrique}>
+    <BOUCLE_ariane_rubrique(HIERARCHIE) {id_rubrique}>
+    &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+    </BOUCLE_ariane_rubrique>
+    &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+    </BOUCLE_contexte_rubrique>
+
+    <BOUCLE_contexte_site(SITES) {id_syndic}>
+    <BOUCLE_ariane_site(HIERARCHIE) {id_rubrique}>
+    &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+    </BOUCLE_ariane_site>
+    &gt; <a href="[(#ID_SYNDIC|generer_url_entite{'site'})]">[(#TITRE|couper{80})]</a>
+    </BOUCLE_contexte_site>
+
+    <//B_contexte_site>
+    <//B_contexte_rubrique>
+    <//B_contexte_breve>
+    <//B_contexte_article>
+
+    <BOUCLE_contexte_forum(FORUMS) {id_forum}>
+    &gt; <a href="#URL_FORUM">[(#TITRE|couper{80})]</a>
+    </BOUCLE_contexte_forum>
+
+    &gt; <strong class="on"><:poster_message:></strong>
+    
+</p><!--#hierarchie-->
+
+<div class="contenu-principal">
+
+<div class="cartouche">
+    <h1 class="h1"><:poster_message:></h1>
+</div>
+
+<div class="resume articles">
+    <h2 class="h2"><:en_reponse:></h2>
+
+    <BOUCLE_forum_parent(FORUMS) {id_forum}>
+    <h3 class="h3"><a href="#URL_FORUM">#TITRE</a></h3>
+               <div class="info-publi">[<abbr class="published" title="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)[&nbsp;(#DATE|heures)][:(#DATE|minutes)]</abbr>][<span class="sep">, </span><span class="auteurs"><:par_auteur:> (#NOM)</span>]</div>
+    [<div class="introduction">(#INTRODUCTION|lignes_longues)</div>]
+    </BOUCLE_forum_parent>
+    
+    <BOUCLE_article(ARTICLES) {id_article}>
+               <ul class="liste-items">
+               #INCLURE{fond=inclure/article-resume,id_article}
+               </ul>
+    </BOUCLE_article>
+    
+    <BOUCLE_breve(BREVES) {id_breve}>
+    [(#LOGO_BREVE||image_reduire{150,100})]
+    <h3 class="h3"><a href="#URL_BREVE">#TITRE</a></h3>
+               <div class="info-publi">[<abbr class="published" title="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</abbr>]</div>
+    [<div class="introduction">(#INTRODUCTION)</div>]
+    </BOUCLE_breve>
+    
+    <BOUCLE_rubrique(RUBRIQUES) {id_rubrique}>
+    <h3 class="h3"><a href="#URL_RUBRIQUE">#TITRE</a></h3>
+    [<div class="texte">(#TEXTE)</div>]
+    </BOUCLE_rubrique>
+    
+    <BOUCLE_syndic(SITES) {id_syndic}>
+    <h3 class="h3"><a href="[(#ID_SYNDIC|generer_url_entite{'site'})]">#NOM_SITE</a></h3>
+    [<div class="texte">(#DESCRIPTIF)</div>]
+    </BOUCLE_syndic>
+    
+    <//B_forum_parent>
+
+</div>
+
+#FORMULAIRE_FORUM
+</div>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/page-login.html b/www/plugins/zpip_v1/contenu/page-login.html
new file mode 100644 (file)
index 0000000..4e386aa
--- /dev/null
@@ -0,0 +1,18 @@
+[(#REM)
+       Est-ce qu'on se connecte a l'espace prive ou pas ?
+]#SET{prive,''}
+[(#ENV{url}|=={''}|?{#SET{prive,' '}})]
+[(#ENV{url}|match{^#EVAL{_DIR_RESTREINT_ABS}}|?{#SET{prive,' '}})]
+
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a>[ &gt; <strong class="on">(#GET{prive}|?{<:login_acces_prive:>,<:lien_connecter:>})</strong>]</p>
+
+<div class="contenu-principal">
+       <div class="cartouche">
+               [<h1 class="h1">(#GET{prive}|?{<:login_acces_prive:>,<:lien_connecter:>})</h1>]
+               <p class="soustitre">#NOM_SITE_SPIP</p>
+       </div>
+       #MENU_LANG_ECRIRE
+       
+       [(#FORMULAIRE_LOGIN{#ENV{url}|sinon{#URL_ECRIRE{accueil}}})]
+</div>
diff --git a/www/plugins/zpip_v1/contenu/page-plan.html b/www/plugins/zpip_v1/contenu/page-plan.html
new file mode 100644 (file)
index 0000000..4d532d7
--- /dev/null
@@ -0,0 +1,45 @@
+      
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <strong class="on"><:plan_site:></strong></p>
+
+<div class="contenu-principal">
+<div class="cartouche">
+       <h1 class="h1"><:plan_site:></h1>
+</div>
+
+<BOUCLE_secteurs(RUBRIQUES) {racine} {par titre}>
+
+       <h2 class="h2"><a href="#URL_RUBRIQUE">#TITRE</a></h2>
+
+       [(#REM) Articles et sous-rubriques ]
+       <B_articles_racine>
+       <h3 class="h3"><:articles:></h3>
+       <ul class="plan">
+               <BOUCLE_articles_racine(ARTICLES) {id_rubrique} {par titre}>
+               <li><a href="#URL_ARTICLE">#TITRE</a></li>
+               </BOUCLE_articles_racine>
+       </ul>
+       </B_articles_racine>
+
+       <B_rubriques>
+       <ul class="plan">
+               <BOUCLE_rubriques(RUBRIQUES) {id_parent} {par titre}>
+               <li>
+                       <strong><a href="#URL_RUBRIQUE">#TITRE</a></strong>
+                       
+                       <B_articles>
+                       <ul>
+                               <BOUCLE_articles(ARTICLES) {id_rubrique} {par titre}>
+                               <li><a href="#URL_ARTICLE">#TITRE</a></li>
+                               </BOUCLE_articles>
+                       </ul>
+                       </B_articles>
+                       
+                       <BOUCLE_sous_rubriques(BOUCLE_rubriques)></BOUCLE_sous_rubriques>
+               </li>
+               </BOUCLE_rubriques>
+       </ul>
+       </B_rubriques>
+
+</BOUCLE_secteurs>
+</div>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/page-recherche.html b/www/plugins/zpip_v1/contenu/page-recherche.html
new file mode 100644 (file)
index 0000000..06950cb
--- /dev/null
@@ -0,0 +1,38 @@
+               
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <:info_rechercher:>[ &gt; <strong class="on">(#RECHERCHE)</strong>]</p>
+
+<div class="contenu-principal">
+       [<div class="cartouche">
+               <h1 class="h1"><:resultats_recherche:></h1>
+               <p class="soustitre">&#171;&nbsp;(#RECHERCHE)&nbsp;&#187;</p>
+       </div>]
+
+       [(#REM) Articles trouves ]
+       <B_articles>
+       <div class="liste resultats articles">
+               #ANCRE_PAGINATION
+               <h2 class="h2"><:articles:> (#GRAND_TOTAL)</h2>
+               <ul class="liste-items">
+                       <BOUCLE_articles(ARTICLES) {recherche} {par points}{inverse} {pagination}>
+                       <li class="item"><a href="#URL_ARTICLE">#TITRE</a></li>
+                       </BOUCLE_articles>
+               </ul>
+               [<p class="pagination">(#PAGINATION)</p>]
+       </div>
+       </B_articles>
+
+       [(#REM) Rubriques trouvees ]
+       <B_rubriques>
+       <div class="liste resultats rubriques">
+               #ANCRE_PAGINATION
+               <h2 class="h2"><:rubriques:> (#GRAND_TOTAL)</h2>
+               <ul class="liste-items">
+                       <BOUCLE_rubriques(RUBRIQUES) {recherche} {par points}{inverse} {pagination 5}>
+                       <li class="item"><a href="#URL_RUBRIQUE">#TITRE</a></li>
+                       </BOUCLE_rubriques>
+               </ul>
+               [<p class="pagination">(#PAGINATION)</p>]
+       </div>
+       </B_rubriques>
+</div>
diff --git a/www/plugins/zpip_v1/contenu/page-sommaire.html b/www/plugins/zpip_v1/contenu/page-sommaire.html
new file mode 100644 (file)
index 0000000..90c7afe
--- /dev/null
@@ -0,0 +1,20 @@
+<div class="contenu-principal">
+       <div class="cartouche invisible">
+               <h1 class="h1 invisible">#NOM_SITE_SPIP</h1>
+       </div>
+
+       [<div id="descriptif_site_spip">(#DESCRIPTIF_SITE_SPIP)</div>]
+</div>
+
+<B_articles>
+<div class="liste articles sommaire">
+       #ANCRE_PAGINATION
+       <h2 class="h2"><:derniers_articles:></h2>
+       <ul class="liste-items">
+               <BOUCLE_articles(ARTICLES) {!par date} {pagination 5}>
+               #INCLURE{fond=inclure/article-resume,id_article}
+               </BOUCLE_articles>
+       </ul>
+       [<p class="pagination">(#PAGINATION)</p>]
+</div>
+</B_articles>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/page-spip_pass.html b/www/plugins/zpip_v1/contenu/page-spip_pass.html
new file mode 100644 (file)
index 0000000..70a2d8b
--- /dev/null
@@ -0,0 +1,12 @@
+<div class="contenu-principal">
+       <h1 class="h1 spip">#NOM_SITE_SPIP</h1>
+
+       <div class="pass">
+               [(#ENV{p}|non)
+                       #FORMULAIRE_OUBLI
+               ]
+               [(#ENV{p}|oui)
+                       #FORMULAIRE_MOT_DE_PASSE
+               ]
+       </div>
+</div>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/page.html b/www/plugins/zpip_v1/contenu/page.html
new file mode 100644 (file)
index 0000000..03c6f7b
--- /dev/null
@@ -0,0 +1,5 @@
+[(#REM)
+ Ce squelette n'est necessaire que pour SPIP 2.0
+ A partir de SPIP 2.1, le compilateur trouve directement contenu/page-xxx
+]<INCLURE{fond=contenu/page-#ENV{composition,sommaire}}{env}>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/rubrique.html b/www/plugins/zpip_v1/contenu/rubrique.html
new file mode 100644 (file)
index 0000000..5f82e2b
--- /dev/null
@@ -0,0 +1,99 @@
+<BOUCLE_contenu_rubrique(RUBRIQUES){id_rubrique}>
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_rubrique}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#TITRE|couper{80})</strong>]</p>
+
+<div class="contenu-principal">
+
+       <div class="cartouche">
+               [(#LOGO_RUBRIQUE||image_reduire{200,200})]
+               <h1 class="h1 #EDIT{titre}">#TITRE</h1>
+               [<p class="info-publi"><span class="published"><:dernier_ajout:> : (#DATE|affdate_jourcourt).</span></p>]
+       </div>
+
+       [<div class="#EDIT{texte} chapo">(#TEXTE)</div>]
+</div>
+
+<B_articles>
+<div class="liste articles">
+       #ANCRE_PAGINATION
+       <h2 class="h2"><:articles_rubrique:></h2>
+       <ul class="liste-items">
+               <BOUCLE_articles(ARTICLES){id_rubrique} {!par date} {pagination 5}>
+               #INCLURE{fond=inclure/article-resume,id_article}
+               </BOUCLE_articles>
+       </ul>
+       [<p class="pagination">(#PAGINATION)</p>]
+</div>
+</B_articles>
+
+       [(#REM) Si aucun article, affiche un plan de la rubrique ]
+       <B_sous_rubriques>
+       <div class="menu rubriques">
+               <h2 class="h2"><:sous_rubriques:></h2>
+               <ul class="menu-liste">
+                       <BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}>
+                       <li class="menu-entree">
+                               <a href="#URL_RUBRIQUE">[(#TITRE)]</a>
+
+                               [(#REM) Une boucle recursive pour le mini plan]
+                               <B_miniplan>
+                               <ul class="menu-liste">
+                                       <BOUCLE_miniplan(RUBRIQUES) {id_parent} {par num titre, titre}>
+                                       <li class="menu-entree">
+                                               <a href="#URL_RUBRIQUE">[(#TITRE)]</a>
+                                               <BOUCLE_m2(BOUCLE_miniplan)></BOUCLE_m2>
+                                       </li>
+                                       </BOUCLE_miniplan>
+                               </ul>
+                               </B_miniplan>
+
+                       </li>
+                       </BOUCLE_sous_rubriques>
+               </ul>
+               </div>
+       </B_sous_rubriques>
+<//B_articles>
+
+[(#REM) Gestion du portfolio et des documents ]
+[(#INCLURE{fond=inclure/documents}{id_rubrique})]      
+
+[(#REM) Breves du secteur ]
+<B_breves>
+<div class="liste breves">
+               #ANCRE_PAGINATION
+               <h2 class="h2"><:breves:></h2>
+               <ul class="liste-items">
+                               <BOUCLE_breves(BREVES) {id_rubrique} {par date}{inverse} {pagination 5}>
+                               <li class="item">[(#DATE|affdate_jourcourt) &ndash; ]<a href="#URL_BREVE">#TITRE</a></li>
+                               </BOUCLE_breves>
+               </ul>
+               [<p class="pagination">(#PAGINATION)</p>]
+</div>
+</B_breves>
+
+[(#REM) Sites de la rubrique ]
+<B_sites>
+<div class="liste sites">
+               <h2 class="h2"><:sur_web:></h2>
+               <ul class="liste-items">
+                               <BOUCLE_sites(SITES) {id_rubrique} {par nom_site}>
+                               <li class="item">
+       <a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]">#NOM_SITE</a>
+                                               <B_syndic>
+                                               <ul>
+                                                               <BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,3}>
+                                                               <li><a href="#URL_ARTICLE" class="spip_out">#TITRE</a></li>
+                                                               </BOUCLE_syndic>
+                                               </ul>
+                                               </B_syndic>
+                               </li>
+                               </BOUCLE_sites>
+               </ul>
+</div>
+</B_sites>
+
+[(#REM) Proposer un site ]
+#FORMULAIRE_SITE
+
+[<div class="notes"><h2 class="h2"><:info_notes:></h2>(#NOTES)</div>]
+</BOUCLE_contenu_rubrique>
diff --git a/www/plugins/zpip_v1/contenu/site.html b/www/plugins/zpip_v1/contenu/site.html
new file mode 100644 (file)
index 0000000..97650b3
--- /dev/null
@@ -0,0 +1,36 @@
+<BOUCLE_site(SITES){id_syndic}>
+[(#REM) Fil d'Ariane ]
+<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_syndic}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; <strong class="on">(#NOM_SITE|couper{80})</strong>]</p>
+
+<div class="contenu-principal">
+
+  <div class="cartouche">
+      <a href="#URL_SITE">[(#LOGO_SITE||image_reduire{150,100})]</a>
+      <h1 class="h1 #EDIT{nom_site}">#NOM_SITE</h1>
+  </div>
+
+  [<div class="#EDIT{descriptif} chapo">(#DESCRIPTIF)</div>]
+  [<p class="#EDIT{url_site} hyperlien"><a href="#URL_SITE" class="spip_out">(#URL_SITE|couper{80})</a></p>]
+</div>
+
+  [(#REM) Articles issus de la syndication ]
+  <B_articles>
+  <div class="liste articles syndic">
+      #ANCRE_PAGINATION
+      <h2 class="h2"><:articles:></h2>
+      <ul class="liste-items">
+          <BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {pagination 5}>
+          <li class="item">
+              <h3 class="h3"><a href="#URL_ARTICLE" class="spip_out">#TITRE</a></h3>
+              [<div class="enclosures">(#TAGS|afficher_enclosures)</div>]
+              <div class="small">[(#DATE|affdate_jourcourt)][, <:par_auteur:> (#LESAUTEURS)][ &mdash; <em>(#TAGS|afficher_tags)</em>]</div>
+              [<div class="introduction">(#DESCRIPTIF|image_reduire{300})</div>]
+          </li>
+          </BOUCLE_articles>
+      </ul>
+      [<p class="pagination">(#PAGINATION)</p>]
+  </div>
+  </B_articles>
+
+  [<div class="notes"><h2 class="h2"><:info_notes:></h2>(#NOTES)</div>]
+</BOUCLE_site>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/contenu/z_apl.html b/www/plugins/zpip_v1/contenu/z_apl.html
new file mode 100644 (file)
index 0000000..2ba4dc1
--- /dev/null
@@ -0,0 +1,10 @@
+[(#REM)
+
+  Squelette Big_Pipe
+       http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919
+
+  (c) 2010 Cedric Morin
+  Distribue sous licence GPL
+
+]#CACHE{0}
+#INCLURE{fond=inclure/ajax_parallel_load,bloc=#SQUELETTE}
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/conventions.txt b/www/plugins/zpip_v1/conventions.txt
new file mode 100644 (file)
index 0000000..083938e
--- /dev/null
@@ -0,0 +1,160 @@
+Le layout intègre 6 entités logiques de contenu qui structure dans le html a sa guise.
+Les 6 entités sont nommées ici selon la convention ci-dessous, eu égard à leur contenu informationnel
+et sans préjuger d'une quelconque structure définie par le theme :
+
+entete fournit la présentation de la page et d'identité
+barre-nav      constitue la navigation principale du site - peut être vide
+contenu        contient l'information principale de la page
+navigation     fournit des élements de navigation secondaire
+extra fournit des eléments d'information connexes
+pied   fournit des éléments de repérages et de rappels secondaires
+
+
+entete
+
+- un lien bloc .accueil contenant
+       - le logo eventuel [x], encadré par un element a
+       - le nom du site
+               dans un #nom_site_spip, qui peut être porté par toute balise. Il appartient au theme de fixer si il doit se comporter comme un block ou comme un inline
+               qui peut contenir un element a
+       - le slogan du site
+               dans un #slogan_site_spip
+
+Peut contenir
+- .formulaire_menu_lang  le formulaire de changement de langue qui n'apparaitra que sur les sites multilingues
+
+barre-nav
+       si elle est non vide, est structurée d'éléments imbriqués de classes
+       .menu-liste
+               encadre un lot de .menu-entree
+               contient exlusivement des elements .menu-entree
+       .menu-entree doit etre dans un element .menu-liste
+               contient un unique element a
+               peut contenir un unique element .sep contenant un separateur textuel
+               peut contenir des sous groupes .menu-entree
+
+       cette convention permet par exemple
+               une navigation hierarchisée de type ul.menu-liste/li.menu-entree a un ou plusieurs niveau
+               une navigation plate constituée d'une suite de liens
+
+       le theme devra prendre en charge au moins l'affichage du premier niveau de navigation
+       le theme pourra prendre en charge l'affichage d'un eventuel menu déroulant a 1 ou plusieurs niveaux si le squelette les fournit
+
+contenu
+
+       #hierarchie le fil d'ariane,
+               des liens 'a'
+               des elements separateurs '.sep'
+               un element en exergue '.on'
+
+       .cartouche      le cartouche de présentation du contenu
+               .titre  le titre
+               .spip_logos le logo
+               .surtitre
+               .soustitre
+               .traductions
+               .info-publi     Infos de publication
+                       .published      date de publication
+                       .auteurs        auteur de publication, avec seperateurs .sep eventuels
+                       .past-published date de publication anterieure
+
+       .postmeta cartouche de présentation des réactions
+               .date
+               a.comments
+               a.readmore
+
+               .post-info
+               .post-info a
+
+       .introduction
+       .descriptif
+       .chapo
+       .texte
+       .hyperlien
+       .ps
+       .notes
+
+       Portfolios :
+       .documents_portfolio (classe et pas id car il pourrait en avoir plusieurs)
+
+       Forums :
+               garder la structure de la dist ?
+
+       Petitions :
+               garder la structure de la dist ?
+
+
+navigation
+
+Peut contenir
+- une navigation de second niveau, structurée comme barre-nav, par .menu-liste, .menu-entree, .sep et a
+- Le formulaire de recherche. Les themes qui voudront le placer visuellement dans le bandeau supérieur procèderont par un positionnement absolu
+
+des intertitres .hx
+des listes d'items
+...
+
+extra
+...
+
+
+
+pied
+       peut contenir
+               TBD des registres horizontaux
+               TBD des colonnes verticales
+
+
+
+
+Elements généraux
+
+les intertitrages
+       .h1, .h2, .h3, .h4, .h5, .h6
+la pagination
+       .pagination contient a, .on et .separateur
+
+les listes d'items (liste d'articles, de breves, de rubriques ...)
+       .liste  : bloc englobant
+               peut contenir des p, .hx, .pagination ...
+               contient au moins un ul.liste-items
+                       qui contient un ou des li.item
+
+les formulaires
+       selon convention décrite dans http://www.spip.net/fr_article3791.html
+
+les tableaux de données
+       tables.spip
+               tr
+               tr.row_odd
+               tr.row_even
+                       th, td
+
+les liens :
+       a
+       a.spip_note /* liens vers notes de bas de page */
+       a.spip_ancre /* liens internes a la page */
+       a.spip_in /* liens internes */
+       a.spip_out /* liens sortants */
+a.external ?
+       a.spip_url /* liens url sortants */
+       a.spip_glossaire /* liens vers encyclopedie */
+
+
+les documents :
+       .spip_documents, .spip_documents_right, .spip_documents_left
+               img, peut etre dans un 'a'
+               .spip_doc_titre
+               .spip_doc_descriptif
+
+la "typo" (cf spip_styles.css)
+       .spip_code du code inline
+       .spip_cadre du code en block
+       acronym
+       abbr
+       blockquote.spip
+       blockquote.spip_poesie
+
+hr.spip
+.nettoyeur { clear: both; height: 0; margin: 0; padding: 0; border: 0; line-height: 1px; font-size: 1px; }
+.invisible { position: absolute; top: -3000em; height: 1%; }
diff --git a/www/plugins/zpip_v1/extra/article.html b/www/plugins/zpip_v1/extra/article.html
new file mode 100644 (file)
index 0000000..710d715
--- /dev/null
@@ -0,0 +1,26 @@
+<BOUCLE_extra_article(ARTICLES){id_article}>
+       [(#REM) Articles dans la meme rubrique ]
+       <B_articles_rubrique>
+       <div class="liste articles">
+               <h2 class="h2"><a href="#URL_RUBRIQUE"><:meme_rubrique:></a></h2>
+               <ul class="liste-items">
+                       <BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {par date}{inverse} {0,10}>
+                       <li class="item"><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="liste mots">
+      <h2 class="h2"><:mots_clefs:></h2>
+      <ul class="liste-items">
+      <BOUCLE_mots(MOTS) {id_article} {par titre}>
+          <li class="item"><a href="#URL_MOT" rel="tag">#TITRE</a></li>
+      </BOUCLE_mots>
+      </ul>
+  </div>
+  </B_mots>
+
+</BOUCLE_extra_article>
diff --git a/www/plugins/zpip_v1/extra/auteur.html b/www/plugins/zpip_v1/extra/auteur.html
new file mode 100644 (file)
index 0000000..7a351ce
--- /dev/null
@@ -0,0 +1,15 @@
+<BOUCLE_extra_auteur(AUTEURS){id_auteur}>
+       [(#REM) Autres auteurs ]
+       <B_auteurs>
+       <div class="liste auteurs">
+               #ANCRE_PAGINATION
+               <h2 class="h2"><:info_auteurs:></h2>
+               <ul class="liste-items">
+                       <BOUCLE_auteurs(AUTEURS) {par nom} {pagination 20}>
+                       <li class="item"><a href="#URL_AUTEUR"[ class="(#EXPOSE)"]>[(#NOM|couper{80})]</a></li>
+                       </BOUCLE_auteurs>
+               </ul>
+               [<p class="pagination">(#PAGINATION)</p>]
+       </div>
+       </B_auteurs>
+</BOUCLE_extra_auteur>
diff --git a/www/plugins/zpip_v1/extra/breve.html b/www/plugins/zpip_v1/extra/breve.html
new file mode 100644 (file)
index 0000000..f2f4227
--- /dev/null
@@ -0,0 +1,25 @@
+<BOUCLE_breve_principal(BREVES) {id_breve}>
+  [(#REM) Breves dans la meme rubrique ]
+  <B_breves>
+  <div class="liste breves">
+      <h2 class="h2"><:autres_breves:></h2>
+      <ul class="liste-items">
+          <BOUCLE_breves(BREVES) {id_rubrique} {par date}{inverse} {0,10}>
+          <li class="item">[(#DATE|affdate_jourcourt) &ndash; ]<a href="#URL_BREVE"[ class="(#EXPOSE)"]>#TITRE</a></li>
+          </BOUCLE_breves>
+      </ul>
+  </div>
+  </B_breves>
+
+  [(#REM) Menu de navigation mots-cles ]
+  <B_mots>
+  <div class="liste mots">
+      <h2 class="h2"><:mots_clefs:></h2>
+      <ul class="liste-items">
+      <BOUCLE_mots(MOTS) {id_breve} {par titre}>
+          <li class="item"><a href="#URL_MOT" rel="tag">#TITRE</a></li>
+      </BOUCLE_mots>
+      </ul>
+  </div>
+  </B_mots>
+</BOUCLE_breve_principal>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/extra/dist.html b/www/plugins/zpip_v1/extra/dist.html
new file mode 100644 (file)
index 0000000..0242055
--- /dev/null
@@ -0,0 +1,2 @@
+[(#REM) Inscription au site ]
+#FORMULAIRE_INSCRIPTION
diff --git a/www/plugins/zpip_v1/extra/mot.html b/www/plugins/zpip_v1/extra/mot.html
new file mode 100644 (file)
index 0000000..55327fa
--- /dev/null
@@ -0,0 +1,29 @@
+<BOUCLE_principale(MOTS) {id_mot} {doublons}>
+       [(#REM) Menu de navigation mots-cles : les autres mots cles du meme groupe ]
+  <B_mots_freres>
+  <div class="liste mots">
+      #ANCRE_PAGINATION
+      <h2 class="h2"><:mots_clefs_meme_groupe:></h2>
+      <ul class="liste-items">
+          <BOUCLE_mots_freres(MOTS) {type} {par titre} {pagination 20}>
+          <li class="item"><a href="#URL_MOT"[ class="(#EXPOSE)"]>#TITRE</a></li>
+          </BOUCLE_mots_freres>
+      </ul>
+      [<p class="pagination">(#PAGINATION)</p>]
+  </div>
+  </B_mots_freres>
+
+  [(#REM) Menu de navigation mots-cles : les autres groupes avec un lien sur le premier mot du groupe ]
+  <B_groupes_freres>
+  <div class="liste groupes_mots">
+      <h2 class="h2"><:autres_groupes_mots_clefs:></h2>
+      <ul class="liste-items">
+          <BOUCLE_groupes_freres(GROUPES_MOTS) {!id_groupe} {par titre} {doublons}>
+          <BOUCLE_mot_cousin(MOTS) {id_groupe} {par titre} {0,1}>
+          <li class="item"><a href="#URL_MOT">#TYPE</a></li>
+          </BOUCLE_mot_cousin>
+          </BOUCLE_groupes_freres>
+      </ul>
+  </div>
+  </B_groupes_freres>
+</BOUCLE_principale>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/extra/page-sommaire.html b/www/plugins/zpip_v1/extra/page-sommaire.html
new file mode 100644 (file)
index 0000000..633646c
--- /dev/null
@@ -0,0 +1,27 @@
+[(#REM) Inscription au site ]
+#FORMULAIRE_INSCRIPTION
+
+[(#REM) Liens des forums ]
+<B_forums_liens>
+<div class="liste forums">
+       <h2 class="h2"><:derniers_commentaires:></h2>
+       <ul class="liste-items">
+               <BOUCLE_forums_liens(FORUMS?) {plat} {par date}{inverse} {0,8}>
+               <li class="item">[(#DATE|affdate_jourcourt) &ndash; ]<a href="#URL_FORUM"[ title="(#TITRE|attribut_html|couper{80})"]>[(#TEXTE|couper{80})]</a></li>
+               </BOUCLE_forums_liens>
+       </ul>
+</div>
+</B_forums_liens>
+
+
+[(#REM) Sur le Web ]
+<B_syndic>
+<div class="liste syndic_articles">
+       <h2 class="h2"><:nouveautes_web:></h2>
+       <ul class="liste-items">
+               <BOUCLE_syndic(SYNDIC_ARTICLES) {age<180} {par date}{inverse} {0,6}>
+               <li class="item">[(#DATE|affdate_jourcourt) &ndash; ]<a href="#URL_ARTICLE"[ title="(#NOM_SITE|attribut_html|couper{80})"] class="spip_out">#TITRE</a></li>
+               </BOUCLE_syndic>
+       </ul>
+</div>
+</B_syndic>
diff --git a/www/plugins/zpip_v1/extra/page.html b/www/plugins/zpip_v1/extra/page.html
new file mode 100644 (file)
index 0000000..9b1db02
--- /dev/null
@@ -0,0 +1,6 @@
+[(#REM)
+ Ce squelette n'est necessaire que pour SPIP 2.0
+ A partir de SPIP 2.1, le compilateur trouve directement extra/page-xxx
+
+]#SET{composition,#CHEMIN{extra/page-#ENV{composition}|concat{.html}}|?{page-#ENV{composition},dist}}
+<INCLURE{fond=extra/#GET{composition}}{env}>
diff --git a/www/plugins/zpip_v1/extra/rubrique.html b/www/plugins/zpip_v1/extra/rubrique.html
new file mode 100644 (file)
index 0000000..dce6eed
--- /dev/null
@@ -0,0 +1,13 @@
+<BOUCLE_extra_rubrique(RUBRIQUES){id_rubrique}>
+       [(#REM) Menu de navigation mots-cles ]
+       <B_mots>
+       <div class="liste mots">
+               <h2 class="h2"><:mots_clefs:></h2>
+               <ul class="liste-items">
+                       <BOUCLE_mots(MOTS) {id_rubrique} {par titre}>
+                       <li class="item"><a href="#URL_MOT" rel="tag">#TITRE</a></li>
+                       </BOUCLE_mots>
+               </ul>
+       </div>
+       </B_mots>
+</BOUCLE_extra_rubrique>
diff --git a/www/plugins/zpip_v1/extra/site.html b/www/plugins/zpip_v1/extra/site.html
new file mode 100644 (file)
index 0000000..d045f66
--- /dev/null
@@ -0,0 +1,25 @@
+[(#REM) Autres sites web ]
+<B_sites>
+<div class="liste sites">
+    #ANCRE_PAGINATION
+    <h2 class="h2"><:sites_web:></h2>
+    <ul class="liste-items">
+        <BOUCLE_sites(SITES) {par nom_site} {pagination 20}>
+        <li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]"[ class="(#EXPOSE)"]>#NOM_SITE</a></li>
+        </BOUCLE_sites>
+    </ul>
+    [<p class="pagination">(#PAGINATION)</p>]
+</div>
+</B_sites>
+
+[(#REM) Menu de navigation mots-cles ]
+<B_mots>
+<div class="liste mots">
+    <h2 class="h2"><:mots_clefs:></h2>
+    <ul class="liste-items">
+        <BOUCLE_mots(MOTS) {id_syndic} {par titre}>
+        <li class="item"><a href="#URL_MOT" rel="tag">#TITRE</a></li>
+        </BOUCLE_mots>
+    </ul>
+</div>
+</B_mots>
diff --git a/www/plugins/zpip_v1/extra/z_apl.html b/www/plugins/zpip_v1/extra/z_apl.html
new file mode 100644 (file)
index 0000000..2ba4dc1
--- /dev/null
@@ -0,0 +1,10 @@
+[(#REM)
+
+  Squelette Big_Pipe
+       http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919
+
+  (c) 2010 Cedric Morin
+  Distribue sous licence GPL
+
+]#CACHE{0}
+#INCLURE{fond=inclure/ajax_parallel_load,bloc=#SQUELETTE}
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/feed.png b/www/plugins/zpip_v1/feed.png
new file mode 100644 (file)
index 0000000..eb47e19
Binary files /dev/null and b/www/plugins/zpip_v1/feed.png differ
diff --git a/www/plugins/zpip_v1/forum.html b/www/plugins/zpip_v1/forum.html
new file mode 100644 (file)
index 0000000..11ecd8b
--- /dev/null
@@ -0,0 +1,25 @@
+[(#REM)
+
+       La page d'accueil est la première page du site.
+       Elle s'affiche lorsque l'on ecrit l'adresse du site
+       dans la barre du navigateur.
+
+       Pour toutes les pages appelées par SPIP
+       (article, rubrique, sommaire, ...),
+       nous choisissons d'inclure la structure de la page
+       avec une balise INCLURE. De cette façon, un seul fichier
+       décrit l'organisation des blocs de la page, le fichier structure.html.
+
+       Nous passons en argument via le critere {env}
+       tout ce qui arrive dans l'environnement de SPIP,
+       comme les variables d'URL (spip.php?page=sommaire&variable=valeur).
+
+       Enfin, nous ajoutons une variable {type=sommaire} pour indiquer de
+       quel type de page il s'agit et afficher alors du contenu en conséquence.
+
+       Allez découvrir ce fameux fichier structure.html.
+       
+]
+<INCLURE{fond=structure}{env}{type=page}{composition=forum} />
+
+
diff --git a/www/plugins/zpip_v1/habillage.css b/www/plugins/zpip_v1/habillage.css
new file mode 100755 (executable)
index 0000000..0ba91d7
--- /dev/null
@@ -0,0 +1,295 @@
+/* ----------------------------------------------------------- */
+/* Feuille de style des squelettes par defaut de Zpip-dist v1  */
+/* ----------------------------------------------------------- */
+
+/* couleurs utilisees
+ *
+ * - #46839B
+ * - #f9f9f9
+ * - #ddd
+ * - #f63
+ */
+
+
+/* ------------------------------------------
+/* Typographie generale (style transversaux)
+/* ------------------------------------------ */
+html { font-size: 100%; } /* Cf.: http://pompage.net/pompe/definir-des-tailles-de-polices-en-CSS/ */
+body { font-size: 0.8125em; font-family: "Luxi sans", "Lucida Grande", Lucida, "Lucida Sans Unicode", sans-serif; color: #333; }
+
+/* Titraille / Intertitres */
+h1,h2,h3,h4,h5,h6,
+.h1,.h2,.h3,.h4,.h5,.h6 { margin: 0; padding: 0; font-weight: normal; font-size: 1em; font-family: Georgia, Times, serif; }
+h1,.h1 { font-size: 1.70em; color: #000; }
+h2,.h2 { font-size: 1.40em; font-weight: normal; }
+h2, h2 a, h2 a:focus, h2 a:hover, h2 a:active { color: #70617E; }
+.h2, .h2 a, .h2 a:focus, .h2 a:hover, .h2 a:active { color: #70617E; }
+h3,.h3 { font-size: 1.20em; font-weight: bold; }
+h3.spip {} /* Cf.: spip_style.css */
+hr.spip {} /* Cf.: spip_style.css */
+
+/* Autres enrichissements typo */
+strong { font-weight: bold; }
+em { font-style: italic; }
+abbr, acronym { border-bottom: 1px dotted; cursor: help; }
+small { font-size: 0.90em; color: #666; }
+dfn { font-weight: bold; color: #666; }
+del { text-decoration: line-through; }
+ins { color: red !important; text-decoration: none; }
+sup, sub { font-size: .8em; font-variant: normal; }
+
+/* Listes */
+ul.spip {} /* Cf.: spip_style.css */
+ol.spip {} /* Cf.: spip_style.css */
+dl {}
+dt {}
+dd {}
+
+/* Citations, code et poesie */
+cite {}
+q {}
+blockquote {}
+blockquote.spip {} /* Cf.: spip_style.css */
+blockquote.spip_poesie {} /* Cf.: spip_style.css */
+/* Cf.: spip_style.css */
+.spip_code {color:#8B2703;}
+.spip_cadre {color:#444; background-color: #fff; border: 1px solid #ddd; font-size:1em; padding:0.5em;width:90%; }
+address {}
+
+/* Tableaux */
+/* Cf.: spip_style.css */
+table.spip { width: 99%; }
+table.spip tr.row_first { background: #46839B; color:white;}
+table.spip td, table.spip th {border:white 2px solid;}
+
+/* Logos, documents et images */
+img { margin: 0; padding: 0; border: 0; }
+.spip_logos {} /* Cf.: spip_style.css */
+.spip_documents {} /* Cf.: spip_style.css */
+.spip_documents_center {} /* Cf.: spip_style.css */
+.spip_documents_left {} /* Cf.: spip_style.css */
+.spip_documents_right {} /* Cf.: spip_style.css */
+.spip_doc_titre {} /* Cf.: spip_style.css */
+.spip_doc_descriptif {} /* Cf.: spip_style.css */
+
+
+/* ------------------------------------------
+/* Disposition a l'ecran des blocs principaux
+/* ------------------------------------------ */
+body { background: #f9f9f9; margin: 0; padding: 0; text-align: center; }
+
+#page { position: relative; background: #fff; width: 58em; margin: 1em auto; padding:1em 2em; text-align: left; border:3px solid #ddd; }
+
+#entete { width: 100%; margin: 0; padding-top: 1.60em; padding-bottom: 1.60em; margin-bottom:1em; border-bottom: 2px solid #46839B;}
+#entete .accueil { display: block; width: 67%; }
+#entete .accueil .spip_logos { vertical-align: bottom; line-height: 1em; }
+#entete .accueil #nom_site_spip { vertical-align: bottom; font-size: 2.2em; font-family: Georgia, Times, serif; font-weight: normal; }
+#entete .formulaire_menu_lang { position: absolute; right: 0; top: 0.90em; display: block; width: 30%; } /*Cf.: spip_formulaires.css*/
+
+#conteneur { clear: both; overflow: hidden; }
+#contenu { padding-top: 0.30em; float:left; width:65%;}
+
+#navigation { float: right; width: 30%; margin-top: 1em; overflow: hidden; }
+
+#pied { clear: both; width: 100%; margin: 1em 0 0 0; padding: 0.60em 0; border: 2px solid #ddd; background:#f9f9f9; text-align: center; font-size: 0.90em; }
+#pied a { /*color:#666;*/ } /* ne pas utiliser de selecteur trop precis, et eviter de toucher aux liens */
+#pied img { vertical-align: middle; }
+
+
+/* ------------------------------------------
+/* Habillage des elements du contenu
+/* ------------------------------------------ */
+
+#hierarchie { clear: both; margin-bottom: 2em; font-size: 0.84em; }
+#hierarchie, #hierarchie a { color: #666; }
+
+.cartouche { margin-bottom: 2em; }
+.cartouche .spip_logos { float: right; margin-left: 16px; margin-bottom: 4px; }
+.cartouche .info-publi { margin: 0; padding: 0; clear: left; }
+
+.chapo { margin-bottom: 1.50em; line-height: 1.40em; font-size:1.1em; }
+.texte { line-height: 1.60em; }
+.ps, .notes { margin-bottom: 2em; line-height: 1.40em; }
+.notes { clear: both; font-size: 0.90em; }
+
+
+/* Portfolio */
+.documents_portfolio { clear: both; margin: 2em auto; text-align: center; }
+.documents_portfolio .spip_logos { margin: 6px 3px 0 3px; border: 4px solid #DDD; }
+.documents_portfolio a.on .spip_logos { border-color: #f63; }
+.documents_portfolio a:focus .spip_logos,
+.documents_portfolio a:hover .spip_logos,
+.documents_portfolio a:active .spip_logos { border-color: #46839B; }
+
+
+/* ------------------------------------------
+/* Sous-navigation et autres menus
+/* ------------------------------------------ */
+
+/* Habillage general des menus de navigation */
+
+.menu { clear: both; margin-bottom: 2em; text-align: left; }
+.menu p { margin: 0.20em 0; padding: 0.20em 0.10em; }
+.menu-liste { margin: 0; padding: 0; list-style: none; border-bottom: 1px solid #ddd; }
+.menu-liste .menu-entree { margin: 0.20em 0; padding: 0.20em;}
+.menu-liste .menu-entree .menu-liste { margin-left: 1em; border: 0; }
+.menu-liste .menu-entree .menu-entree { padding: 0; border: 0; }
+#nav .menu-liste .menu-entree {        display: inline;padding:0;margin:0 0 0 10px; }
+
+#navigation .menu {background:#fcfcfc; padding:0.5em; border: 1px solid #ddd;}
+#navigation .menu a {/*color:#666;*/} /* ne pas utiliser de selecteur trop precis, et eviter de toucher aux liens */
+#navigation .menu-liste {border-bottom:0;}
+#navigation .menu-liste .menu-entree {list-style:square; margin-left:15px; padding:0; color:#f63;}
+#navigation .menu-liste .menu-entree .menu-liste {margin-left:0;}
+#navigation .liste .h2 {margin-top:1em;}
+#navigation .formulaire_recherche{margin-bottom:2em;}
+
+/* Pagination */
+.pagination { clear: both; text-align: right; font-size: 0.90em; color: #666; }
+.pagination .on { font-weight: bold; color: #666; }
+
+/* Rubriques */
+/*
+.rubriques ul { border: 0; }
+.rubriques ul li { background: #EEE; border: 0; }
+*/
+
+
+/* Listes d'articles et extraits introductifs */
+.liste-items {margin: 0; padding: 0; list-style: none; border-bottom:0;}
+.liste-items .item {list-style:square; margin-left:0; padding:2px 0; clear:both; overflow:hidden;}
+#contenu .liste-items .item {margin-bottom:2em;}
+.liste-items .item .h3 { margin: 0.30em 0; border-bottom:1px solid #46839B;}
+.liste-items .item .h3 a:hover { text-decoration:none;}
+.liste-items .item .info-publi {  display:block; float:right; margin-top:0.6em; margin-left:.3em; padding:.3em; background:#ddd;}
+
+.liste.articles .spip_logos { float: right; clear: right; margin: .8em 0 4px 16px; }
+.liste .articles .item .introduction { margin-top: 0.30em; line-height: 1.40em; padding: 0.5em 0 1.5em 1em;}
+
+
+/* Couleurs des liens
+---------------------------------------------- */
+a { color: #3996BB; text-decoration: none; }
+a:focus,a:hover,a:active { color: #46839B; text-decoration: underline; }
+a.spip_out, a.spip_glossaire {
+       color: #46839B;
+       background:transparent url(img/out.gif) no-repeat scroll right center;
+       padding-right:12px;
+}
+
+
+/*  ------------------------------------------
+/*  Habillage des formulaires
+/*  ------------------------------------------ */
+input, select, textarea { font-size: 100%; font-family: inherit; }
+
+
+/* Structure generale des formulaires
+----------------------------------------------- */
+.formulaire_spip { clear: both; margin-bottom: 2em; padding: 0; border: 0; text-align: left; font-size: 1em; }
+.formulaire_spip form { margin: 0; padding: 0; } /* Bug IE/Win */
+
+/* Fieldset */
+.formulaire_spip fieldset { clear: both; margin: 0 0 1em 0; padding: 0; border: 0; }
+.formulaire_spip fieldset legend { margin: 0; padding: 0; font-size: 1.05em; font-weight: bold; background-color: #fff; color: #333; } /* Preciser la couleur des legend et du fond pour IE/Win */
+.formulaire_spip fieldset fieldset { margin-top: 1em; }
+.formulaire_spip fieldset fieldset legend { font-size: 1em; font-weight: normal; }
+
+/* Explications */
+.formulaire_spip .explication { margin: 0.50em 0; color: #444; }
+
+/* Lignes */
+.formulaire_spip ul { margin: 0; padding: 0; list-style: none; }
+.formulaire_spip ul li { clear: both; margin: 0; padding: 0.50em 0; }
+
+/* Labels */
+.formulaire_spip label { display: block; text-align: left; color: #444; font-weight: bold; /* pour IE/Win */ position: relative;  }
+.formulaire_spip li p { margin-top: 0; margin-bottom: 0; }
+
+.formulaire_spip .choix label{display:inline;font-weight:normal;}
+.formulaire_spip .choix input.radio,
+.formulaire_spip .choix input.checkbox {width:auto;}
+
+
+/* Champs de saisie */
+.formulaire_spip input.text { width: 15em; border: 1px inset; }
+.formulaire_spip textarea { width: 99%; border: 1px inset; }
+.formulaire_spip select { width: 99%; }
+
+/* Boutons */
+.formulaire_spip .boutons { clear: both; margin: 0; padding: 0; text-align: right; }
+.formulaire_spip .boutons input { margin-left: 1em; }
+.formulaire_spip .boutons input, input.submit {}
+
+
+/* Reponses, previsu et erreurs
+----------------------------------------------- */
+
+/* Champs obligatoires */
+.formulaire_spip li.obligatoire {}
+.formulaire_spip li.obligatoire label {}
+
+/* Previsualisation du message */
+.formulaire_spip fieldset.previsu { margin-bottom: 2em; padding: 1em; border: 2px dashed #F57900; }
+.formulaire_spip fieldset.previsu legend { padding: 0 0.50em; font-weight: bold; color: #F57900; }
+.formulaire_spip fieldset.previsu li { padding: 3px; border: none; }
+.formulaire_spip fieldset.previsu p { margin: 1em 0; } 
+
+/* Reponse du formulaire */
+.reponse_formulaire { font-weight: bold; color: #e86519; font-size: 1.20em; }
+fieldset.reponse_formulaire { border-color: #e86519; font-weight: normal; }
+fieldset.reponse_formulaire.reponse_formulaire legend { color: #F57900; } /* Preciser la couleur des legend et du fond pour IE/Win */
+
+/* * Erreurs */
+.formulaire_spip li.erreur .erreur_message { display: block; color: #C30; font-weight: bold; }
+.formulaire_spip li.erreur input.text, .formulaire_spip li.erreur textarea { background-color: #FCC; border-style: solid; border-color: #C30; }
+.reponse_formulaire_erreur { margin: 0; color: #C30; font-weight: bold; }
+
+/* * OK */
+.reponse_formulaire_ok { margin: 0; color: #53AD20; font-weight: bold; }
+
+
+/* Variantes et cas particuliers
+----------------------------------------------- */
+
+/* Barre de raccourcis typographiques */
+table.spip_barre { width: 100%; }
+table.spip_barre a img { background: #FDA; padding: 3px; border: 1px outset #CC9; }
+table.spip_barre a:focus img,
+table.spip_barre a:hover img,
+table.spip_barre a:active img { background: #FFF; border: 1px solid #CC9; }
+table.spip_barre input.barre { width: 99%; background: transparent; border: 0; }
+
+/* Formulaire de forum */
+.formulaire_forum .saisie_titre input.text, .formulaire_forum .saisie_titre textarea { width: 98%; }
+.forum {margin:1em 0 0 0; padding:1em; border:#888 1px solid; background:#f6f6f6; list-style-type:none;}
+.forum .forum-fil {margin-bottom:2em;}
+.forum .forum-fil .forum-chapo {background:#666; padding:.5em; color:white;}
+.forum .forum-fil .forum-chapo a {color:white;}
+.forum .ancre {float:left; margin-right:0.5em;}
+.forum .spip_logos {float:right; margin: 0 2px 4px 10px;}
+
+/* Selection des langues */
+.formulaire_menu_lang { padding: 0; background: none; }
+
+/* Formulaires de recherche (site / petitions) */
+.formulaire_recherche { margin: 0; padding: 0; background: none; }
+.formulaire_recherche * { display: inline; vertical-align: middle; }
+.formulaire_recherche label {}
+.formulaire_recherche input.text { width: 10em; }
+.formulaire_recherche input.submit {}
+
+/* Choix des mots-clefs */
+ul.choix_mots { display: block; margin: 0; padding: 0; list-style: none; }
+ul.choix_mots li { clear: none; float: left; display: block; width: 30%; padding: 1%; }
+ul.choix_mots li label { display: inline; font-weight: normal; }
+
+.formulaire_spip .bugajaxie { display: none; } /* Bug IE/Win */
+
+/* Formulaire de login dans une page */
+.formulaire_login ul li {clear:left;}
+.formulaire_login ul li input.password { width: 15em; border: 1px inset; }
+.formulaire_login .editer_password .details {display:block;}
+.formulaire_login #spip_logo_auteur {float:right;}
+
+/* end */
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/head/article.html b/www/plugins/zpip_v1/head/article.html
new file mode 100644 (file)
index 0000000..2d5bb4a
--- /dev/null
@@ -0,0 +1,5 @@
+<BOUCLE_article_head(ARTICLES) {id_article}>
+<title>[(#TITRE|textebrut) - ][(#NOM_SITE_SPIP|textebrut)]</title>
+[<meta name="description" content="(#INTRODUCTION{150}|attribut_html)" />]
+[<link rel="canonical" href="(#URL_ARTICLE|url_absolue)" />]
+</BOUCLE_article_head>
diff --git a/www/plugins/zpip_v1/head/auteur.html b/www/plugins/zpip_v1/head/auteur.html
new file mode 100644 (file)
index 0000000..15c1d4c
--- /dev/null
@@ -0,0 +1,11 @@
+<BOUCLE_auteur_head(AUTEURS) {id_auteur}>
+<title>[(#NOM|textebrut) - ][(#NOM_SITE_SPIP|textebrut)]</title>
+[<meta name="description" content="(#BIO|couper{150}|attribut_html)" />]
+[<link rel="canonical" href="(#URL_AUTEUR|url_absolue)" />]
+
+[(#REM) Favicon personnalisee a partir du logo (si filtres d'image) ]
+[(#MODELE{favicon}{favicon=#LOGO_AUTEUR})]
+
+[(#REM) Lien vers le flux RSS des articles de l'auteur ]
+<link rel="alternate" type="application/rss+xml" title="[(#NOM|textebrut)]" href="[(#URL_PAGE{backend}|parametre_url{id_auteur,#ID_AUTEUR})]" />
+</BOUCLE_auteur_head>
diff --git a/www/plugins/zpip_v1/head/breve.html b/www/plugins/zpip_v1/head/breve.html
new file mode 100644 (file)
index 0000000..999c3ad
--- /dev/null
@@ -0,0 +1,5 @@
+<BOUCLE_breve_principal(BREVES) {id_breve}>
+<title>[(#TITRE|textebrut) - ][(#NOM_SITE_SPIP|textebrut)]</title>
+[<meta name="description" content="(#INTRODUCTION{150}|attribut_html)" />]
+[<link rel="canonical" href="(#URL_BREVE|url_absolue)" />]
+</BOUCLE_breve_principal>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/head/dist.html b/www/plugins/zpip_v1/head/dist.html
new file mode 100644 (file)
index 0000000..039affe
--- /dev/null
@@ -0,0 +1,26 @@
+[(#REM)
+  Cette inclusion est celle utilisee par defaut lorsqu'un head/xxx demande
+       n'existe pas
+
+       Ces deux balises #NOM_SITE_SPIP et #DESCRIPTIF_SITE_SPIP
+       permettent de récupérer des informations de configuration de SPIP
+       que l'on renseigne dans l'espace privé.
+
+       Ces enregistrements sont stockés en base de donnée dans une
+       table appelée "spip_meta". Les champs de la table peuvent aussi
+       être récupérés en utilisant la balise #CONFIG{nom de la configuration}
+       ce qui donnerait ici : #CONFIG{nom_site_spip}
+
+       Les |mot suivants les #BALISE indique qu'on applique certains traitements
+       au texte retourné par la balise.
+
+       |textebrut supprime toute balise HTML, |couper{150} coupe le texte
+       retourné à 150 caractères. Ces "filtres" peuvent se chaîner
+       |filtreA|filtreB ...
+
+       Ces deux lignes permettent au bout du compte de renseigner le titre
+       de la page affiché tout en haut du navigateur ainsi que la description du site
+       (utile aux moteurs de recherche)
+]
+<title>[(#NOM_SITE_SPIP|textebrut)]</title>
+[<meta name="description" content="(#DESCRIPTIF_SITE_SPIP|couper{150}|textebrut)" />]
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/head/mot.html b/www/plugins/zpip_v1/head/mot.html
new file mode 100644 (file)
index 0000000..216cdc6
--- /dev/null
@@ -0,0 +1,6 @@
+<BOUCLE_principale(MOTS) {id_mot} >
+<title>[(#TITRE|textebrut) - ][(#NOM_SITE_SPIP|textebrut)]</title>
+[<meta name="description" content="(#DESCRIPTIF|couper{150}|attribut_html)" />]
+[(#REM) Lien vers le flux RSS des articles du mot cle ]
+<link rel="alternate" type="application/rss+xml"[ title="(#TITRE|attribut_html)"] href="[(#URL_PAGE{backend}|parametre_url{id_mot,#ID_MOT})]" />
+</BOUCLE_principale>
diff --git a/www/plugins/zpip_v1/head/page-404.html b/www/plugins/zpip_v1/head/page-404.html
new file mode 100644 (file)
index 0000000..2536830
--- /dev/null
@@ -0,0 +1,2 @@
+<title><:pass_erreur:> 404 - [(#NOM_SITE_SPIP|textebrut)]</title>
+<meta name="robots" content="none" />
diff --git a/www/plugins/zpip_v1/head/page-plan.html b/www/plugins/zpip_v1/head/page-plan.html
new file mode 100644 (file)
index 0000000..0cfa210
--- /dev/null
@@ -0,0 +1,3 @@
+<title><:plan_site:> - [(#NOM_SITE_SPIP|textebrut)]</title>
+[<meta name="description" content="(#DESCRIPTIF_SITE_SPIP|couper{150}|attribut_html)" />]
+<meta name="robots" content="none" />
diff --git a/www/plugins/zpip_v1/head/page-recherche.html b/www/plugins/zpip_v1/head/page-recherche.html
new file mode 100644 (file)
index 0000000..ae92aac
--- /dev/null
@@ -0,0 +1,2 @@
+<title><:resultats_recherche:> - [(#NOM_SITE_SPIP|textebrut)]</title>
+<meta name="robots" content="none" />
diff --git a/www/plugins/zpip_v1/head/page-sommaire.html b/www/plugins/zpip_v1/head/page-sommaire.html
new file mode 100644 (file)
index 0000000..d97b5af
--- /dev/null
@@ -0,0 +1,23 @@
+[(#REM)
+       Ces deux balises #NOM_SITE_SPIP et #DESCRIPTIF_SITE_SPIP
+       permettent de récupérer des informations de configuration de SPIP
+       que l'on renseigne dans l'espace privé.
+
+       Ces enregistrements sont stockés en base de donnée dans une
+       table appelée "spip_meta". Les champs de la table peuvent aussi
+       être récupérés en utilisant la balise #CONFIG{nom de la configuration}
+       ce qui donnerait ici : #CONFIG{nom_site_spip}
+
+       Les |mot suivants les #BALISE indique qu'on applique certains traitements
+       au texte retourné par la balise.
+
+       |textebrut supprime toute balise HTML, |couper{150} coupe le texte
+       retourné à 150 caractères. Ces "filtres" peuvent se chaîner
+       |filtreA|filtreB ...
+
+       Ces deux lignes permettent au bout du compte de renseigner le titre
+       de la page affiché tout en haut du navigateur ainsi que la description du site
+       (utile aux moteurs de recherche)
+]
+<title>[(#NOM_SITE_SPIP|typo|textebrut)][ - (#SLOGAN_SITE_SPIP|typo|textebrut)]</title>
+[<meta name="description" content="(#DESCRIPTIF_SITE_SPIP|couper{150}|textebrut)" />]
diff --git a/www/plugins/zpip_v1/head/page.html b/www/plugins/zpip_v1/head/page.html
new file mode 100644 (file)
index 0000000..b394001
--- /dev/null
@@ -0,0 +1,6 @@
+[(#REM)
+ Ce squelette n'est necessaire que pour SPIP 2.0
+ A partir de SPIP 2.1, le compilateur trouve directement head/page-xxx
+
+]#SET{composition,#CHEMIN{head/page-#ENV{composition}|concat{.html}}|?{page-#ENV{composition},dist}}
+<INCLURE{fond=head/#GET{composition}}{env}>
diff --git a/www/plugins/zpip_v1/head/rubrique.html b/www/plugins/zpip_v1/head/rubrique.html
new file mode 100644 (file)
index 0000000..683e1cf
--- /dev/null
@@ -0,0 +1,7 @@
+<BOUCLE_rubrique_head(RUBRIQUES) {id_rubrique}>
+<title>[(#TITRE|textebrut) - ][(#NOM_SITE_SPIP|textebrut)]</title>
+[<meta name="description" content="(#INTRODUCTION{150}|textebrut)" />]
+[<link rel="canonical" href="(#URL_RUBRIQUE|url_absolue)" />]
+[(#REM) Lien vers le flux RSS de la rubrique ]
+<link rel="alternate" type="application/rss+xml" title="<:syndiquer_rubrique:>" href="[(#URL_PAGE{backend}|parametre_url{id_rubrique,#ID_RUBRIQUE})]" />
+</BOUCLE_rubrique_head>
diff --git a/www/plugins/zpip_v1/head/site.html b/www/plugins/zpip_v1/head/site.html
new file mode 100644 (file)
index 0000000..6619884
--- /dev/null
@@ -0,0 +1,5 @@
+<BOUCLE_site(SITES){id_syndic}>
+<title>[(#NOM_SITE|textebrut) - ][(#NOM_SITE_SPIP|textebrut)]</title>
+[<meta name="description" content="(#DESCRIPTIF|couper{150}|textebrut)" />]
+<meta name="robots" content="none" />
+</BOUCLE_site>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/img/out.gif b/www/plugins/zpip_v1/img/out.gif
new file mode 100644 (file)
index 0000000..d93105c
Binary files /dev/null and b/www/plugins/zpip_v1/img/out.gif differ
diff --git a/www/plugins/zpip_v1/img/zpip-128.png b/www/plugins/zpip_v1/img/zpip-128.png
new file mode 100644 (file)
index 0000000..b9d42d0
Binary files /dev/null and b/www/plugins/zpip_v1/img/zpip-128.png differ
diff --git a/www/plugins/zpip_v1/img/zpip-16.png b/www/plugins/zpip_v1/img/zpip-16.png
new file mode 100644 (file)
index 0000000..55cb907
Binary files /dev/null and b/www/plugins/zpip_v1/img/zpip-16.png differ
diff --git a/www/plugins/zpip_v1/img/zpip-32.png b/www/plugins/zpip_v1/img/zpip-32.png
new file mode 100644 (file)
index 0000000..609d81b
Binary files /dev/null and b/www/plugins/zpip_v1/img/zpip-32.png differ
diff --git a/www/plugins/zpip_v1/img/zpip-48.png b/www/plugins/zpip_v1/img/zpip-48.png
new file mode 100644 (file)
index 0000000..b86dbd1
Binary files /dev/null and b/www/plugins/zpip_v1/img/zpip-48.png differ
diff --git a/www/plugins/zpip_v1/img/zpip-64.png b/www/plugins/zpip_v1/img/zpip-64.png
new file mode 100644 (file)
index 0000000..0f5c6ef
Binary files /dev/null and b/www/plugins/zpip_v1/img/zpip-64.png differ
diff --git a/www/plugins/zpip_v1/inclure/ajax_parallel_load.html b/www/plugins/zpip_v1/inclure/ajax_parallel_load.html
new file mode 100644 (file)
index 0000000..46588aa
--- /dev/null
@@ -0,0 +1,27 @@
+[(#REM)
+
+  Squelette Big_Pipe
+       http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919
+
+  (c) 2010 Cedric Morin
+  Distribue sous licence GPL
+
+]
+#SET{bloc,#ENV{bloc}|dirname|basename}
+<div id="zapl-#GET{bloc}" class="zapl-loading"><:zpip:zapl_loading:></div>
+<script type="text/javascript">
+       var myurl = window.location + "";
+       myurl = myurl.split('#');
+       myurl = myurl[0] + ((myurl[0].indexOf("?")>0)?"&":"?") + "var_zajax=#GET{bloc}";
+       $.get(myurl, function(data) {
+               jQuery('document').ready(function(){
+                       jQuery("#zapl-#GET{bloc}").replaceWith(data);
+                       var h = window.location.hash;
+                       if (h && jQuery("<div></div>").html(data).find(h).length>0) jQuery(h).positionner(true);
+               });
+       });
+</script>
+<noscript>
+       <meta http-equiv="refresh" content="2;url=<?php echo ($url=parametre_url(self(),'var_zapl','non'));?>" />
+       <a href="<?php echo $url ?>"><:zpip:zapl_reload_off:></a>
+</noscript>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/inclure/article-resume.html b/www/plugins/zpip_v1/inclure/article-resume.html
new file mode 100644 (file)
index 0000000..db010c8
--- /dev/null
@@ -0,0 +1,22 @@
+[(#REM)\r
+\r
+  Squelette Presentation d'un article dans une liste\r
+  (c) 2009 Zpip\r
+  Distribue sous licence GPL\r
+\r
+]\r
+<BOUCLE_articles(ARTICLES) {id_article} {statut?}>\r
+<li class="item hentry">\r
+       <h3 class="h3 entry-title"><a href="#URL_ARTICLE" rel="bookmark">[(#LOGO_ARTICLE_RUBRIQUE||image_reduire{150,100})]#TITRE</a></h3>\r
+       <div class="info-publi">[<abbr class="published" title="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</abbr>][<span class="sep">, </span><span class="auteurs"><:par_auteur:> (#LESAUTEURS)</span>]</div>\r
+       [<div class="#EDIT{intro} introduction entry-content">(#INTRODUCTION)</div>]\r
+       <div class="meta-publi">\r
+       <a class="lire-la-suite" href="#URL_ARTICLE"><:zpip:lire_la_suite:><span class="lire-la-suite-titre"><:zpip:lire_la_suite_de:> <em>#TITRE</em></span></a>\r
+       <BOUCLE_nb_commentaires(FORUMS) {id_article}{plat} />   [(#TOTAL_BOUCLE|oui)\r
+               <span class="sep">|</span>\r
+               <a[ href="(#URL_ARTICLE|ancre_url{forum})"] class="nb_commentaires">[(#TOTAL_BOUCLE)]&nbsp;[(#TOTAL_BOUCLE|=={1}|?{<:zpip:commentaire:>,<:zpip:commentaires:>})]</a>\r
+               ]\r
+       <//B_nb_commentaires>\r
+       </div>\r
+</li>\r
+</BOUCLE_articles>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/inclure/barre-nav-secteurs.html b/www/plugins/zpip_v1/inclure/barre-nav-secteurs.html
new file mode 100644 (file)
index 0000000..ceed968
--- /dev/null
@@ -0,0 +1,11 @@
+<B_rubriques>
+  <div class="menu-conteneur">
+        <ul class="menu-liste">
+        <BOUCLE_rubriques(RUBRIQUES) {racine} {par num titre, titre}>
+               <li class="menu-entree[ (#EXPOSE)]">
+                       <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
+               </li>
+        </BOUCLE_rubriques>
+        </ul>
+  </div>
+</B_rubriques>
diff --git a/www/plugins/zpip_v1/inclure/barre-nav.html b/www/plugins/zpip_v1/inclure/barre-nav.html
new file mode 100644 (file)
index 0000000..66fdeb5
--- /dev/null
@@ -0,0 +1,4 @@
+[(#SESSION{statut}|=={0minirezo}|oui)
+<ul class="menu-liste">
+       <li class="menu-entree"><a href="http://www.spip-contrib.net/?article3344" target="_blank"><:zpip:personaliser_nav:></a></li>
+</ul>]
diff --git a/www/plugins/zpip_v1/inclure/documents.html b/www/plugins/zpip_v1/inclure/documents.html
new file mode 100644 (file)
index 0000000..1a37f92
--- /dev/null
@@ -0,0 +1,34 @@
+[(#REM) Portfolio : album d'images ]
+<B_documents_portfolio>
+<div class="documents documents_portfolio">
+       <h2 class="h2"><:info_portfolio:></h2>
+       <BOUCLE_documents_portfolio(DOCUMENTS) {id_article?}{id_rubrique?} {mode=document}{extension IN png,jpg,gif} {par num titre, date}{vu=non}>[
+       <a href="(#URL_DOCUMENT)"
+                type="#MIME_TYPE"
+                rel="documents_portfolio[-a(#ID_ARTICLE)][-r(#ID_RUBRIQUE)]"
+       [ title="(#TITRE|attribut_html|couper{80})"]>[(#FICHIER
+               |image_reduire{0,100}
+               |inserer_attribut{class,spip_logos}
+               |inserer_attribut{alt,[(#TITRE|attribut_html|couper{80})]})]</a>
+       ]</BOUCLE_documents_portfolio>
+</div>
+</B_documents_portfolio>
+
+
+[(#REM)
+       Liste des autres documents joints
+]
+<B_documents_joints>
+       <div class="liste documents documents_joints">
+       <h2 class="h2"><:titre_documents_joints:></h2>
+       <ul class="liste-items">
+               <BOUCLE_documents_joints(DOCUMENTS) {id_article?}{id_rubrique?} {extension !IN gif,jpg,png} {vu=non}{par num titre, date}>[
+               <li class="item">
+                       <strong><a href="(#URL_DOCUMENT)" title="<:bouton_telecharger:>" type="#MIME_TYPE">[(#TITRE|sinon{<:info_document:>})]</a></strong>
+                       <span class="small">(<span>#TYPE_DOCUMENT[ &ndash; (#TAILLE|taille_en_octets)]</span>)</span>
+                       #DESCRIPTIF
+               ]</li>
+               </BOUCLE_documents_joints>
+       </ul>
+       </div>
+</B_documents_joints>
diff --git a/www/plugins/zpip_v1/inclure/entete.html b/www/plugins/zpip_v1/inclure/entete.html
new file mode 100644 (file)
index 0000000..6d9125b
--- /dev/null
@@ -0,0 +1,7 @@
+<div class="accueil">
+       [<a rel="start home" href="#URL_SITE_SPIP/" title="<:accueil_site:>">(#LOGO_SITE_SPIP||image_reduire{300,100})</a>]
+       <strong id="nom_site_spip"><a rel="start home" href="#URL_SITE_SPIP/" title="<:accueil_site:>">#NOM_SITE_SPIP</a></strong>
+       [<div id='slogan_site_spip'>(#SLOGAN_SITE_SPIP|PtoBR)</div>]
+</div>
+#MENU_LANG
+
diff --git a/www/plugins/zpip_v1/inclure/forum.html b/www/plugins/zpip_v1/inclure/forum.html
new file mode 100644 (file)
index 0000000..6ededd1
--- /dev/null
@@ -0,0 +1,88 @@
+[(#REM) Cette balise (invisible) provoque le recalcul du forum
+la premiere fois qu'un message est poste (cf. inc/invalideur). ]
+[(#PARAMETRES_FORUM|?{''})]
+
+<div class="comments" id="comments">
+       [(#REM) Nombre total de messages ]
+       <BOUCLE_decompte(FORUMS) {id_rubrique ?}{id_article ?}{id_breve ?}{id_syndic ?} {plat} />[<h2 class="h2">(#TOTAL_BOUCLE|>{0}|?{#TOTAL_BOUCLE,''})
+       [(#TOTAL_BOUCLE|=={1}|?{<:message:>,<:messages_forum:>})]</h2>]<//B_decompte>
+
+       [(#REM) Messages du forum ]
+       <B_forums>
+       <ul class="forum comments-list">
+
+               <BOUCLE_forums(FORUMS) {id_rubrique ?}{id_article ?}{id_breve ?}{id_syndic ?} {par date}>
+
+               <li class="forum-fil comment[ (#COMPTEUR_BOUCLE|alterner{'odd','even'})][ (#COMPTEUR_BOUCLE|=={1}|oui)first][ (#EXPOSE)]">
+                       <div class="comment-message forum-message">
+                               <div class="comment-meta forum-chapo">
+                                       <a href="#forum#ID_FORUM" title="#ID_FORUM" class="ancre permalink comment-number">#</a>
+                                       <strong class="#EDIT{titre} forum-titre"><a href="#forum#ID_FORUM" name="forum#ID_FORUM" id="forum#ID_FORUM">#TITRE</a></strong>
+                                       [(#DATE|oui)<abbr class="date"[ title="(#DATE|date_iso)"]>
+                                               [(#SET{date,[(#DATE|affdate_jourcourt)]})]
+                                               [(#SET{heure,[(#DATE|heures)][:(#DATE|minutes)]})]
+                                               <:zpip:date_forum{date=#GET{date},heure=#GET{heure}}:></abbr>][<span class="comment-author vcard">, <:par_auteur:> <strong class="fn n #EDIT{qui}">(#NOM)</strong></span>]
+                               </div>
+                               <div class="comment-content forum-texte">
+                                       #LOGO_AUTEUR
+                                       [<div class="#EDIT{texte} comment-texte">(#TEXTE|lignes_longues)</div>]
+                                       [<div class="comment-notes">(#NOTES|safehtml|lignes_longues)</div>]
+                                       [<p class="#EDIT{hyperlien} comment-external-link hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+                                       <BOUCLE_doc(DOCUMENTS){id_forum}>
+                                       [(#EXTENSION|match{'^(gif|jpg|png)$'}|?{
+                                               [(#EMBED_DOCUMENT|image_reduire{300})]
+                                       ,
+                                               [(#LOGO_DOCUMENT|#URL_DOCUMENT)]
+                                       })]
+                                       </BOUCLE_doc>
+
+                                       [<p class="comment-reply repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:lien_repondre_message:></a></p>]
+                               </div>
+                       </div>
+
+                       <B_forums_fils>
+                       <ul>
+                               <BOUCLE_forums_fils(FORUMS) {id_parent} {par date}>
+
+                               <li class="forum-fil comment[ (#COMPTEUR_BOUCLE|alterner{'odd','even'})][ (#COMPTEUR_BOUCLE|=={1}|oui)first][ (#EXPOSE)]">
+                                       <div class="comment-message forum-message">
+                                               <div class="comment-meta forum-chapo">
+                                                       <a href="#forum#ID_FORUM" title="#ID_FORUM" class="ancre permalink comment-number">#</a>
+                                                       <strong class="#EDIT{titre} forum-titre"><a href="#forum#ID_FORUM" name="forum#ID_FORUM" id="forum#ID_FORUM">#TITRE</a></strong>
+                                                       [(#DATE|oui)<abbr class="date"[ title="(#DATE|date_iso)"]>
+                                                               [(#SET{date,[(#DATE|affdate_jourcourt)]})]
+                                                               [(#SET{heure,[(#DATE|heures)][:(#DATE|minutes)]})]
+                                                               <:zpip:date_forum{date=#GET{date},heure=#GET{heure}}:></abbr>][<span class="comment-author vcard">, <:par_auteur:> <strong class="fn n #EDIT{qui}">(#NOM)</strong></span>]
+                                               </div>
+                                               <div class="comment-content forum-texte">
+                                                       #LOGO_AUTEUR
+                                                       [<div class="#EDIT{texte} comment-texte">(#TEXTE|lignes_longues)</div>]
+                                                       [<div class="comment-notes">(#NOTES|safehtml|lignes_longues)</div>]
+                                                       [<p class="#EDIT{hyperlien} comment-external-link hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
+
+                                                       <BOUCLE_doc2(DOCUMENTS){id_forum}>
+                                                       [(#EXTENSION|match{'^(gif|jpg|png)$'}|?{
+                                                               [(#EMBED_DOCUMENT|image_reduire{300})]
+                                                       ,
+                                                               [(#LOGO_DOCUMENT|#URL_DOCUMENT)]
+                                                       })]
+                                                       </BOUCLE_doc2>
+
+                                                       [<p class="comment-reply repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" rel="noindex nofollow"><:lien_repondre_message:></a></p>]
+                                               </div>
+                                       </div>
+
+                                       <BOUCLE_forums_boucle(boucle_forums_fils)></BOUCLE_forums_boucle>
+
+                               </li>
+
+                               </BOUCLE_forums_fils>
+                       </ul>
+                       </B_forums_fils>
+
+               </li>
+               </BOUCLE_forums>
+
+       </ul>
+       </B_forums>
+</div>
diff --git a/www/plugins/zpip_v1/inclure/head.html b/www/plugins/zpip_v1/inclure/head.html
new file mode 100644 (file)
index 0000000..62331c9
--- /dev/null
@@ -0,0 +1,43 @@
+[(#REM)\r
+       Head standard de toutes les pages ; les elements specifiques\r
+       (title, description) figurent dans les fichiers du dossier head/\r
+]\r
+[(#REM) Preciser le charset ]\r
+<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />\r
+\r
+[(#REM) Fierement fabrique avec SPIP ]\r
+<meta name="generator" content="SPIP[ (#SPIP_VERSION)]" />\r
+\r
+[(#REM) Lien vers le flux RSS du site ]\r
+[<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>" href="(#URL_PAGE{backend})" />]\r
+\r
+[(#REM) Feuille de style par defaut pour le code genere par SPIP ]\r
+[<link rel="stylesheet" href="(#CHEMIN{spip_style.css}|direction_css)" type="text/css" media="all" />]\r
+\r
+[(#REM) Feuille de style par defaut pour les formulaires de SPIP ]\r
+[<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css}|direction_css)" type="text/css" media="projection, screen, tv" />]\r
+\r
+[(#REM) Balise permettant aux plugins d'inserer des fichiers CSS ]\r
+#INSERT_HEAD_CSS\r
+\r
+[(#REM) Feuille de style CSS pour l'affichage du site a l'ecran ]\r
+[<link rel="stylesheet" href="(#CHEMIN{habillage.css}|direction_css)" type="text/css" media="projection, screen, tv" />]\r
+\r
+[(#REM) Feuille de style CSS pour l'impression ]\r
+[<link rel="stylesheet" href="(#CHEMIN{impression.css}|direction_css)" type="text/css" media="print" />]\r
+\r
+[(#CHEMIN{inc-theme-head.html}|oui)\r
+#INCLURE{fond=inc-theme-head,env}\r
+]\r
+\r
+[(#REM) Feuille de style personnalisee pour surcharger les precedentes\r
+       A noter par defaut cette css n'existe pas\r
+]\r
+[<link rel="stylesheet" href="(#CHEMIN{perso.css}|direction_css)" type="text/css" media="projection, screen, tv" />]\r
+\r
+[(#REM) Balise permettant aux plugins d'inserer des appels javascript ou css ;\r
+       C'est ici que SPIP va inserer l'appel de la librairie jQuery\r
+       Et appeler a la fin compacte_head pour agreger et compacter tout le head dans des fichiers statiques\r
+       si l'option est cochee dans Configuration\r
+]\r
+#INSERT_HEAD\r
diff --git a/www/plugins/zpip_v1/inclure/petition.html b/www/plugins/zpip_v1/inclure/petition.html
new file mode 100644 (file)
index 0000000..c689785
--- /dev/null
@@ -0,0 +1,45 @@
+[(#REM) Signer la petition ]
+#FORMULAIRE_SIGNATURE
+
+[(#REM) Signatures de la petition ]
+<B_signatures>
+<div id="signatures">
+       [<p class="pagination">(#PAGINATION)</p>]
+       <table class="spip">
+       <caption><h2 class="h2">#GRAND_TOTAL <:signatures_petition:></h2></caption>
+               <thead>
+                       <tr class="row_first">
+                               <th class="signature-date"><a href='[(#SELF|parametre_url{tri,date_time}|parametre_url{tri_inverse,''})]#signatures' title="<:lien_trier_date:>"><:date:></a></th>
+                               <th class="signature-nom"><a href='[(#SELF|parametre_url{tri,nom_email}|parametre_url{tri_inverse,''})]#signatures' title="<:lien_trier_nom:>"><:nom:></a></th>
+                               [(#REM) Afficher la colonne des messages si autorises ]
+                               <BOUCLE_signature-message-th(PETITIONS){id_article}{message=oui}>
+                               <th class="signature-message"><:message:></th>
+                               </BOUCLE_signature-message-th>
+                       </tr>
+               </thead>
+               <tbody>
+               <BOUCLE_signatures(SIGNATURES) {id_article} {pagination #ENV{pagination, 15} } {recherche ?#ENV{recherche_signatures}} {!par #ENV{tri}}{par #ENV{tri_inverse}} {!par #ENV{tri,#ENV{tri_inverse}}|?{'',date_time}}>
+               <tr [class="(#COMPTEUR_BOUCLE|alterner{row_even,row_odd})" ]id='id_signature#ID_SIGNATURE'>
+                       <td class="signature-date">[(#DATE|affdate_jourcourt)]</td>
+                       <td class="signature-nom"><strong class="#EDIT{qui}">#NOM</strong>[ <div class="small #EDIT{hyperlien}"><a href="(#URL_SITE)"[ title="(#NOM_SITE|attribut_html|couper{80})"] class="spip_out"><:site_web:></a></div>]</td>
+                       [(#REM) Afficher la colonne des messages si autorises ]
+                       <BOUCLE_signature-message-td(PETITIONS){id_article}{message=oui}> </BOUCLE_signature-message-td>
+                       <td class="signature-message #EDIT{message}">[(#MESSAGE|PtoBR)]</td>
+                       </B_signature-message-td>
+               </tr>
+               </BOUCLE_signatures>
+       </tbody>
+       </table>
+       [<p class="pagination">(#PAGINATION)</p>]
+
+       [(#REM) Afficher un moteur de recherche si plus de 30 signatures
+       ou s'il etait deja present au coup d'avant]
+       [(#ENV{recherche_signatures}|?{31,#_signatures:GRAND_TOTAL}|>{3}|oui)
+       <div class="formulaire_spip formulaire_recherche" id="formulaire_recherche_signatures">
+               <form method='get' action='#SELF'><div>[(#SELF|form_hidden)]
+               <label for="recherche_signatures"><:info_rechercher:></label> <input type="text" class="text" size="10" name="recherche_signatures" id="recherche_signatures" style='font-style: italic;' value=" <:entree_signature:>"/> <input type="submit" class="submit" value="<:info_rechercher:>" />
+               </div></form>
+       </div>
+       ]
+</div><!--#signatures-->
+</B_signatures>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/inclure/pied.html b/www/plugins/zpip_v1/inclure/pied.html
new file mode 100644 (file)
index 0000000..e35f0d1
--- /dev/null
@@ -0,0 +1,10 @@
+
+<a href="http://www.spip.net/" title="<:site_realise_avec_spip:>"><img src="#CHEMIN{spip.png}" alt="SPIP" width="48" height="16" /></a>
+<?php if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) { ?>
+| <a href="#URL_LOGOUT" rel="nofollow"><:icone_deconnecter:></a>
+       <?php if (include_spip('inc/autoriser') AND autoriser('ecrire')){ ?>| <a href="#EVAL{_DIR_RESTREINT_ABS}"><:espace_prive:></a><?php } ?>
+<?php } else { ?>
+| <a href="[(#URL_PAGE{login}|parametre_url{url,#SELF|parametre_url{url,''}})]" rel="nofollow" class='login_modal'><:lien_connecter:></a>
+<?php } ?>
+| <a rel="contents" href="#URL_PAGE{plan}"><:plan_site:></a> |
+<a href="#URL_PAGE{backend}" rel="alternate" title="<:syndiquer_site:>"><img src="#CHEMIN{feed.png}" alt="<:icone_suivi_activite:>" width="16" height="16" />&nbsp;RSS&nbsp;2.0</a>
diff --git a/www/plugins/zpip_v1/inclure/rss-item.html b/www/plugins/zpip_v1/inclure/rss-item.html
new file mode 100644 (file)
index 0000000..c6e1020
--- /dev/null
@@ -0,0 +1,58 @@
+[(#REM)
+       Cette page génère le contenu d'un article
+       pour un flux RSS, appelé depuis backend.html
+
+]<BOUCLE_un_article(ARTICLES){id_article} {statut?}>
+       <item[ xml:lang="(#LANG)"]>
+               <title>[(#TITRE|supprimer_tags|texte_backend)]</title>
+               <link>[(#URL_ARTICLE|url_absolue)]</link>
+               [<guid isPermaLink="true">(#URL_ARTICLE|url_absolue)</guid>]
+               [<dc:date>(#DATE|date_iso)</dc:date>]
+               <dc:format>text/html</dc:format>
+               [<dc:language>(#LANG)</dc:language>]
+               [<dc:creator>(#LESAUTEURS|supprimer_tags|texte_backend)</dc:creator>]
+
+[(#REM)
+       Le bloc qui suit diffuse les mots-cles a la mode RSS
+
+]<BOUCLE_mots_rss(MOTS){id_article}>
+               [<dc:subject>(#TITRE|texte_backend)</dc:subject>]</BOUCLE_mots_rss>
+
+               <description>[(#INTRODUCTION|texte_backend)]
+
+[(#REM)
+       Le bloc qui suit diffuse la rubrique et les mots-cles
+       sous forme de "microformats"
+
+]<BOUCLE_rubrique_mf(RUBRIQUES){id_rubrique}{statut?}>-
+[&lt;a href="[(#URL_RUBRIQUE|url_absolue)]" rel="directory"&gt;(#TITRE|supprimer_tags|texte_backend)&lt;/a&gt;]
+</BOUCLE_rubrique_mf><B_mots_mf>
+/ <BOUCLE_mots_mf(MOTS){id_article}{", "}>
+[&lt;a href="[(#URL_MOT|url_absolue)]" rel="tag"&gt;(#TITRE|texte_backend)&lt;/a&gt;]</BOUCLE_mots_mf>
+
+               </description>
+
+[(#REM)
+       Le bloc qui suit diffuse aussi le texte integral de l'article,
+       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_chapo'&gt;(#CHAPO|texte_backend)&lt;/div&gt;
+               ][&lt;div class='rss_texte'&gt;(#TEXTE|
+                       image_reduire{500,0}|texte_backend)&lt;/div&gt;
+               ][&lt;hr /&gt;
+               &lt;div class='rss_notes'&gt;(#NOTES|texte_backend)&lt;/div&gt;
+               ][&lt;div class='rss_ps'&gt;(#PS|texte_backend)&lt;/div&gt;]
+               </content:encoded>
+]
+
+[(#REM)
+       Le bloc qui suit diffuse l'adresse des documents associes aux articles ;
+       ajouter par ex. {extension=mp3} pour limiter a un certain type de document.
+]              <BOUCLE_documents(DOCUMENTS){id_article}{mode=document}{doublons}>[
+               <enclosure url="(#URL_DOCUMENT|url_absolue|unique)"[ length="(#TAILLE)"][ type="(#MIME_TYPE)"] />]
+               </BOUCLE_documents>
+
+       </item>
+</BOUCLE_un_article>
diff --git a/www/plugins/zpip_v1/inclure/rubriques.html b/www/plugins/zpip_v1/inclure/rubriques.html
new file mode 100644 (file)
index 0000000..20eb3c3
--- /dev/null
@@ -0,0 +1,27 @@
+[(#REM)
+       Barre de navigation, ouverte sur la hierarchie courante
+
+       On fait un plan, et, quand on avance vers une rubrique,
+       on l'affiche si son parent est expose ou est la racine du site. ]
+<B_rubriques>
+<div class="menu rubriques">
+       <h2 class="h2"><:rubriques:></h2>
+       <ul class="menu-liste">
+       <BOUCLE_rubriques(RUBRIQUES) {racine} {par num titre, titre}>
+               <li class="menu-entree">
+                       <a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|couper{80})]</a>
+
+                       <B_sous_rubriques>
+                       <ul class="menu-liste">
+                               <BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
+                                       <li class="menu-entree"><a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|couper{80})]</a><BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>     </li>
+                               </B_test_expose></BOUCLE_sous_rubriques>
+                       </ul>
+                       </B_sous_rubriques>
+
+               </li>
+       </BOUCLE_rubriques>
+
+       </ul>
+</div>
+</B_rubriques>
diff --git a/www/plugins/zpip_v1/lang/zpip_de.php b/www/plugins/zpip_v1/lang/zpip_de.php
new file mode 100644 (file)
index 0000000..8af2eb9
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/_stable_/acces_restreint/lang/
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'adapte_de' => 'auf Grundlage von',
+       // B
+
+       // C
+       'conception_graphique_par' => 'Design von (c)',
+       'commentaire' => 'Kommentar',
+       'commentaires' => 'Kommentare',
+
+       // D
+
+       // I
+
+       // L
+       'lire_la_suite' => 'Ganzer Text',
+       'lire_la_suite_de' => ' von ',
+
+       // M
+
+       // P
+       'personaliser_nav' => 'Men&uuml; anpassen',
+
+       // R
+
+       // S
+       'sous_licence' => 'Lizenz: ',
+
+       // T
+
+       // V
+
+       // Z
+);
+
+?>
diff --git a/www/plugins/zpip_v1/lang/zpip_en.php b/www/plugins/zpip_v1/lang/zpip_en.php
new file mode 100644 (file)
index 0000000..e0f5934
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/_stable_/acces_restreint/lang/
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'adapte_de' => 'adapted from',
+
+       // B
+
+       // C
+       'conception_graphique_par' => 'Graphic design (c)',
+       'commentaire' => 'comment',
+       'commentaires' => 'comments',
+
+       // D
+       'date_forum' => '@date@ at @heure@',
+
+       // I
+
+       // L
+       'lire_la_suite' => 'Read more',
+       'lire_la_suite_de' => ' of ',
+
+       // M
+
+       // P
+       'personaliser_nav' => 'Customize this menu',
+
+       // R
+
+       // S
+       'sous_licence' => 'under License',
+
+       // T
+
+       // V
+
+       // Z
+       'zapl_loading' => 'Loading...',
+       'zapl_reload_off' => 'Click here if this page remains empty (or activate javascript in your browser)',
+);
+
+?>
diff --git a/www/plugins/zpip_v1/lang/zpip_es.php b/www/plugins/zpip_v1/lang/zpip_es.php
new file mode 100644 (file)
index 0000000..5b2ec13
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+
+       // B
+
+       // C
+       'conception_graphique_par' => 'Dise&ntilde;o gr&aacute;fico (c)',
+       'commentaire' => 'comentario',
+       'commentaires' => 'comentarios',
+
+       // D
+
+       // I
+
+       // L
+       'lire_la_suite' => 'Seguir leyendo',
+       'lire_la_suite_de' => '',
+
+       // M
+
+       // P
+
+       // R
+
+       // S
+       'sous_licence' => 'bajo Licencia',
+
+       // T
+
+       // V
+
+       // Z
+);
+
+?>
diff --git a/www/plugins/zpip_v1/lang/zpip_fr.php b/www/plugins/zpip_v1/lang/zpip_fr.php
new file mode 100644 (file)
index 0000000..c04da08
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/_stable_/acces_restreint/lang/
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+       'adapte_de' => 'adapt&eacute; de',
+       // B
+
+       // C
+       'conception_graphique_par' => 'Habillage visuel &copy;',
+       'commentaire' => 'commentaire',
+       'commentaires' => 'commentaires',
+
+       // D
+       'date_forum' => 'Le @date@ &agrave; @heure@',
+
+       // I
+
+       // L
+       'lire_la_suite' => 'Lire la suite',
+       'lire_la_suite_de' => ' de ',
+
+       // M
+
+       // P
+       'personaliser_nav' => 'Personnaliser ce menu',
+
+       // R
+
+       // S
+       'sous_licence' => 'sous Licence',
+
+       // T
+
+       // V
+
+       // Z
+       'zapl_loading' => 'Chargement en cours...',
+       'zapl_reload_off' => 'Cliquer ici si la page reste incompl&egrave;te (ou activer le javascript dans votre navigateur)',
+);
+
+?>
diff --git a/www/plugins/zpip_v1/lang/zpip_nl.php b/www/plugins/zpip_v1/lang/zpip_nl.php
new file mode 100644 (file)
index 0000000..8b84871
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/_stable_/acces_restreint/lang/
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+       // A
+
+       // B
+
+       // C
+       'conception_graphique_par' => 'Ontwerp (c)',
+       'commentaire' => 'reactie',
+       'commentaires' => 'reacties ',
+
+       // D
+
+       // I
+
+       // L
+       'lire_la_suite' => 'Lees meer',
+       'lire_la_suite_de' => ' over ',
+
+       // M
+
+       // P
+       'personaliser_nav' => 'Personaliseer dit menu',
+
+       // R
+
+       // S
+       'sous_licence' => 'onder licensie',
+
+       // T
+
+       // V
+
+       // Z
+);
+
+?>
diff --git a/www/plugins/zpip_v1/lang/zpip_pt.php b/www/plugins/zpip_v1/lang/zpip_pt.php
new file mode 100644 (file)
index 0000000..36f18c4
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/_stable_/acces_restreint/lang/
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+
+       // B
+
+       // C
+
+// C
+       'conception_graphique_par' => 'Design (c)',
+       'commentaire' => 'coment&aacute;rio',
+       'commentaires' => 'coment&aacute;rios',
+
+       // D
+
+       // I
+
+       // L
+       'lire_la_suite' => 'l&ecirc; mais',
+       'lire_la_suite_de' => ' sobre ',
+
+       // M
+
+       // P
+       'personaliser_nav' => 'personalisar este menu',
+
+       // R
+
+       // S
+       'sous_licence' => 'sob licença',
+
+       // T
+
+       // V
+
+       // Z
+);
+
+?>
diff --git a/www/plugins/zpip_v1/lang/zpip_sv.php b/www/plugins/zpip_v1/lang/zpip_sv.php
new file mode 100644 (file)
index 0000000..908188a
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/_stable_/acces_restreint/lang/
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // A
+
+       // B
+
+       // C
+
+       'conception_graphique_par' => 'Design (c)',
+       'commentaire' => 'kommentar',
+       'commentaires' => 'kommentarer ',
+
+       // D
+
+       // I
+
+       // L
+       'lire_la_suite' => 'L&auml;s mer',
+       'lire_la_suite_de' => ' om ',
+
+       // M
+
+       // P
+       'personaliser_nav' => 'Skr&auml;ddarsy denna meny',
+
+       // R
+
+       // S
+       'sous_licence' => 'under licens',
+
+       // T
+
+       // V
+
+       // Z
+);
+
+?>
diff --git a/www/plugins/zpip_v1/login.html b/www/plugins/zpip_v1/login.html
new file mode 100644 (file)
index 0000000..65f776b
--- /dev/null
@@ -0,0 +1,25 @@
+[(#REM)
+
+       La page d'accueil est la première page du site.
+       Elle s'affiche lorsque l'on ecrit l'adresse du site
+       dans la barre du navigateur.
+
+       Pour toutes les pages appelées par SPIP
+       (article, rubrique, sommaire, ...),
+       nous choisissons d'inclure la structure de la page
+       avec une balise INCLURE. De cette façon, un seul fichier
+       décrit l'organisation des blocs de la page, le fichier structure.html.
+
+       Nous passons en argument via le critere {env}
+       tout ce qui arrive dans l'environnement de SPIP,
+       comme les variables d'URL (spip.php?page=sommaire&variable=valeur).
+
+       Enfin, nous ajoutons une variable {type=sommaire} pour indiquer de
+       quel type de page il s'agit et afficher alors du contenu en conséquence.
+
+       Allez découvrir ce fameux fichier structure.html.
+       
+]
+<INCLURE{fond=structure}{env}{type=page}{composition=login} />
+
+
diff --git a/www/plugins/zpip_v1/mot.html b/www/plugins/zpip_v1/mot.html
new file mode 100644 (file)
index 0000000..fcfbcbb
--- /dev/null
@@ -0,0 +1,3 @@
+<BOUCLE_principale(MOTS) {id_mot} >
+<INCLURE{fond=structure}{env}{type=mot}{composition=#COMPOSITION} />
+</BOUCLE_principale>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/navigation/dist.html b/www/plugins/zpip_v1/navigation/dist.html
new file mode 100644 (file)
index 0000000..e2b4727
--- /dev/null
@@ -0,0 +1,4 @@
+[(#REM) Menu de navigation par rubriques ]
+<INCLURE{fond=inclure/rubriques}{id_rubrique}>
+
+#FORMULAIRE_RECHERCHE
diff --git a/www/plugins/zpip_v1/navigation/page.html b/www/plugins/zpip_v1/navigation/page.html
new file mode 100644 (file)
index 0000000..bd03c17
--- /dev/null
@@ -0,0 +1,6 @@
+[(#REM)
+ Ce squelette n'est necessaire que pour SPIP 2.0
+ A partir de SPIP 2.1, le compilateur trouve directement navigation/page-xxx
+
+]#SET{composition,#CHEMIN{navigation/page-#ENV{composition}|concat{.html}}|?{page-#ENV{composition},dist}}
+<INCLURE{fond=navigation/#GET{composition}}{env}>
diff --git a/www/plugins/zpip_v1/navigation/z_apl.html b/www/plugins/zpip_v1/navigation/z_apl.html
new file mode 100644 (file)
index 0000000..2ba4dc1
--- /dev/null
@@ -0,0 +1,10 @@
+[(#REM)
+
+  Squelette Big_Pipe
+       http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919
+
+  (c) 2010 Cedric Morin
+  Distribue sous licence GPL
+
+]#CACHE{0}
+#INCLURE{fond=inclure/ajax_parallel_load,bloc=#SQUELETTE}
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/objet.html b/www/plugins/zpip_v1/objet.html
new file mode 100644 (file)
index 0000000..af1afcd
--- /dev/null
@@ -0,0 +1 @@
+<INCLURE{fond=structure}{env}{type=#ENV{page,#ENV{type}}}{composition=#ENV{composition,''}}>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/page.html b/www/plugins/zpip_v1/page.html
new file mode 100644 (file)
index 0000000..af1c884
--- /dev/null
@@ -0,0 +1 @@
+<INCLURE{fond=structure}{env}{type=page}{composition=#ENV{composition,#ENV{page}}}>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/plan.html b/www/plugins/zpip_v1/plan.html
new file mode 100644 (file)
index 0000000..bdff33a
--- /dev/null
@@ -0,0 +1 @@
+<INCLURE{fond=structure}{env}{type=page}{composition=plan} />
diff --git a/www/plugins/zpip_v1/plugin.xml b/www/plugins/zpip_v1/plugin.xml
new file mode 100644 (file)
index 0000000..3ff6562
--- /dev/null
@@ -0,0 +1,43 @@
+<plugin>
+       <nom>Zpip-dist v1</nom>
+       <slogan>Squelette r&#233;utilisable, modulaire et th&#232;mable</slogan>
+       <auteur>Matthieu Marcillaud, C&#233;dric Morin, Romy T&#234;tue, Collectif SPIP</auteur>
+       <icon>img/zpip-128.png</icon>
+       <licence>GNU/GPL</licence>
+       <version>1.7.21</version>
+       <etat>stable</etat>
+       <description>
+Zpip est issu d'une fusion des projets Zesty et SPIP-Zen. Zpip-dist est la version de base de ce mod&#232;le de squelette, que vous pouvez utiliser telle quelle ou personnaliser et enrichir selon vos besoins.
+
+Plus qu'un squelette, Zpip est un exemple d'un syst&#232;me de squelette qui met en application les id&#233;es expos&#233;es dans [Mod&#232;le de squelette r&#233;utilisable->http://www.spip-contrib.net/Modele-de-squelette-reutilisable]. Il propose une organisation des squelettes visant &#224; le rendre :
+-* {{habillable}} par des th&#232;mes ind&#233;pendants du squelette
+-* {{maintenable}} dans le temps, par une duplication minimale du code
+-* {{rapidement d&#233;ployable}}, au prix d'un petit apprentissage initial sur son organisation
+
+Zpip s'adresse aussi bien aux d&#233;butants qui veulent profiter d'une galerie de th&#232;mes pr&#234;ts &#224; l'emploi, qu'aux webmestres avanc&#233;s auxquels il propose un fonctionnement et des m&#233;canismes productifs.
+
+Toute l'organisation et le fonctionnement de Zpip peuvent &#234;tre r&#233;utilis&#233;s pour construire de nouveaux squelettes qui b&#233;n&#233;ficieront des m&#234;mes avantages.
+       </description>
+       <prefix>Z</prefix>
+       <lien>http://www.spip-contrib.net/Le-Squelette-Zpip-dist</lien>
+       <fonctions>z_pipelines.php</fonctions>
+       <options>z_options.php</options>
+       <pipeline>
+               <nom>declarer_url_objets</nom>
+               <inclure>z_pipelines.php</inclure>
+       </pipeline>
+       <pipeline>
+               <nom>styliser</nom>
+               <inclure>z_pipelines.php</inclure>
+       </pipeline>
+       <pipeline>
+               <nom>insert_head</nom>
+               <inclure>z_pipelines.php</inclure>
+       </pipeline>
+       <pipeline>
+               <nom>pre_propre</nom>
+               <inclure>z_pipelines.php</inclure>
+       </pipeline>
+       <categorie>squelette</categorie>
+       <necessite id="SPIP" version="[2.0.10;3.0.99]" />
+</plugin>
diff --git a/www/plugins/zpip_v1/recherche.html b/www/plugins/zpip_v1/recherche.html
new file mode 100644 (file)
index 0000000..6199d4a
--- /dev/null
@@ -0,0 +1 @@
+<INCLURE{fond=structure}{env}{type=page}{composition=recherche} />
diff --git a/www/plugins/zpip_v1/rechercher.gif b/www/plugins/zpip_v1/rechercher.gif
new file mode 100644 (file)
index 0000000..e7861df
Binary files /dev/null and b/www/plugins/zpip_v1/rechercher.gif differ
diff --git a/www/plugins/zpip_v1/rubrique.html b/www/plugins/zpip_v1/rubrique.html
new file mode 100644 (file)
index 0000000..2103694
--- /dev/null
@@ -0,0 +1,3 @@
+<BOUCLE_principale_rubrique(RUBRIQUES){id_rubrique}>
+<INCLURE{fond=structure}{env}{id_secteur=#ID_SECTEUR}{type=rubrique}{composition=#COMPOSITION} />
+</BOUCLE_principale_rubrique>
diff --git a/www/plugins/zpip_v1/site.html b/www/plugins/zpip_v1/site.html
new file mode 100644 (file)
index 0000000..2c3e6b6
--- /dev/null
@@ -0,0 +1,6 @@
+[(#REM)
+       Un cache plus court, pour la boucle syndic_articles
+]#CACHE{3600}
+<BOUCLE_site(SITES){id_syndic}>
+<INCLURE{fond=structure}{env}{id_rubrique=#ENV{id_rubrique,#ID_RUBRIQUE}}{type=site}{composition=#COMPOSITION} />
+</BOUCLE_site>
diff --git a/www/plugins/zpip_v1/sommaire.html b/www/plugins/zpip_v1/sommaire.html
new file mode 100644 (file)
index 0000000..4a475f2
--- /dev/null
@@ -0,0 +1,25 @@
+[(#REM)
+
+       La page d'accueil est la première page du site.
+       Elle s'affiche lorsque l'on ecrit l'adresse du site
+       dans la barre du navigateur.
+
+       Pour toutes les pages appelées par SPIP
+       (article, rubrique, sommaire, ...),
+       nous choisissons d'inclure la structure de la page
+       avec une balise INCLURE. De cette façon, un seul fichier
+       décrit l'organisation des blocs de la page, le fichier structure.html.
+
+       Nous passons en argument via le critere {env}
+       tout ce qui arrive dans l'environnement de SPIP,
+       comme les variables d'URL (spip.php?page=sommaire&variable=valeur).
+
+       Enfin, nous ajoutons une variable {type=sommaire} pour indiquer de
+       quel type de page il s'agit et afficher alors du contenu en conséquence.
+
+       Allez découvrir ce fameux fichier structure.html.
+       
+]
+<INCLURE{fond=structure}{env}{type=page}{composition=sommaire} />
+
+
diff --git a/www/plugins/zpip_v1/spip.png b/www/plugins/zpip_v1/spip.png
new file mode 100644 (file)
index 0000000..1b0c4db
Binary files /dev/null and b/www/plugins/zpip_v1/spip.png differ
diff --git a/www/plugins/zpip_v1/spip_formulaires.css b/www/plugins/zpip_v1/spip_formulaires.css
new file mode 100644 (file)
index 0000000..a05cee6
--- /dev/null
@@ -0,0 +1,108 @@
+/*  ------------------------------------------
+/*  Habillage des formulaires
+/*  ------------------------------------------ */
+input, select, textarea { font-size: 100%; font-family: inherit; }
+
+
+/* Structure generale des formulaires
+----------------------------------------------- */
+.formulaire_spip { clear: both; margin-bottom: 2em; padding: 0; border: 0; text-align: left; font-size: 1em; }
+.formulaire_spip form { margin: 0; padding: 0; } /* Bug IE/Win */
+
+/* Fieldset */
+.formulaire_spip fieldset { clear: both; margin: 0 0 1em 0; padding: 0; border: 0; }
+.formulaire_spip fieldset legend { margin: 0; padding: 0; font-size: 1.05em; font-weight: bold; background-color: #fff; color: #333; } /* Preciser la couleur des legend et du fond pour IE/Win */
+.formulaire_spip fieldset fieldset { margin-top: 1em; }
+.formulaire_spip fieldset fieldset legend { font-size: 1em; font-weight: normal; }
+
+/* Explications */
+.formulaire_spip .explication { margin: 0.50em 0; color: #444; }
+
+/* Lignes */
+.formulaire_spip ul { margin: 0; padding: 0; list-style: none; }
+.formulaire_spip ul li { clear: both; margin: 0; padding: 0.50em 0; }
+
+/* Labels */
+.formulaire_spip label { display: block; text-align: left; color: #444; font-weight: bold; /* pour IE/Win */ position: relative;  }
+.formulaire_spip li p { margin-top: 0; margin-bottom: 0; }
+
+.formulaire_spip .choix label{display:inline;font-weight:normal;}
+.formulaire_spip .choix input.radio,
+.formulaire_spip .choix input.checkbox {width:auto;}
+
+
+/* Champs de saisie */
+.formulaire_spip input.text { width: 15em; border: 1px inset; }
+.formulaire_spip textarea { width: 99%; border: 1px inset; }
+.formulaire_spip select { width: 99%; }
+
+/* Boutons */
+.formulaire_spip .boutons { clear: both; margin: 0; padding: 0; text-align: right; }
+.formulaire_spip .boutons input { margin-left: 1em; }
+.formulaire_spip .boutons input, input.submit {}
+
+
+/* Reponses, previsu et erreurs
+----------------------------------------------- */
+
+/* Champs obligatoires */
+.formulaire_spip li.obligatoire {}
+.formulaire_spip li.obligatoire label {}
+
+/* Previsualisation du message */
+.formulaire_spip fieldset.previsu { margin-bottom: 2em; padding: 1em; border: 2px dashed #F57900; }
+.formulaire_spip fieldset.previsu legend { padding: 0 0.50em; font-weight: bold; color: #F57900; }
+.formulaire_spip fieldset.previsu li { padding: 3px; border: none; }
+.formulaire_spip fieldset.previsu p { margin: 1em 0; } 
+
+/* Reponse du formulaire */
+.reponse_formulaire { font-weight: bold; color: #e86519; font-size: 1.20em; }
+fieldset.reponse_formulaire { border-color: #e86519; font-weight: normal; }
+fieldset.reponse_formulaire.reponse_formulaire legend { color: #F57900; } /* Preciser la couleur des legend et du fond pour IE/Win */
+
+/* * Erreurs */
+.formulaire_spip li.erreur .erreur_message { display: block; color: #C30; font-weight: bold; }
+.formulaire_spip li.erreur input.text, .formulaire_spip li.erreur textarea { background-color: #FCC; border-style: solid; border-color: #C30; }
+.reponse_formulaire_erreur { margin: 0; color: #C30; font-weight: bold; }
+
+/* * OK */
+.reponse_formulaire_ok { margin: 0; color: #53AD20; font-weight: bold; }
+
+
+/* Variantes et cas particuliers
+----------------------------------------------- */
+
+/* Barre de raccourcis typographiques */
+table.spip_barre { width: 100%; }
+table.spip_barre a img { background: #FDA; padding: 3px; border: 1px outset #CC9; }
+table.spip_barre a:focus img,
+table.spip_barre a:hover img,
+table.spip_barre a:active img { background: #FFF; border: 1px solid #CC9; }
+table.spip_barre input.barre { width: 99%; background: transparent; border: 0; color:inherit; }
+
+/* Formulaire de forum */
+.formulaire_forum .saisie_titre input.text, .formulaire_forum .saisie_titre textarea { width: 98%; }
+
+/* Selection des langues */
+.formulaire_menu_lang { margin: 0; padding: 0; background: none; }
+
+/* Formulaires de recherche (site / petitions) */
+.formulaire_recherche { margin: 0; padding: 0; background: none; }
+.formulaire_recherche * { display: inline; vertical-align: middle; }
+.formulaire_recherche label {}
+.formulaire_recherche input.text { width: 10em; padding-left: 25px; background: #FFF url(rechercher.gif) no-repeat left center; }
+.formulaire_recherche input.submit {}
+
+.spip_surligne {} /* Cf.: spip_style.css */
+
+/* Choix des mots-clefs */
+ul.choix_mots { display: block; margin: 0; padding: 0; list-style: none; }
+ul.choix_mots li { clear: none; float: left; display: block; width: 30%; padding: 1%; }
+ul.choix_mots li label { display: inline; font-weight: normal; }
+
+.formulaire_spip .bugajaxie { display: none; } /* Bug IE/Win */
+
+/* Formulaire de login dans une page */
+.formulaire_login ul li {clear:left;}
+.formulaire_login .editer_password .details {display:block;}
+.formulaire_login #spip_logo_auteur {float:right;}
diff --git a/www/plugins/zpip_v1/spip_pass.html b/www/plugins/zpip_v1/spip_pass.html
new file mode 100644 (file)
index 0000000..8fbc02c
--- /dev/null
@@ -0,0 +1 @@
+<INCLURE{fond=structure}{env}{type=page}{composition=spip_pass} />
diff --git a/www/plugins/zpip_v1/spip_style.css b/www/plugins/zpip_v1/spip_style.css
new file mode 100644 (file)
index 0000000..db1bc63
--- /dev/null
@@ -0,0 +1,65 @@
+/* SPIP-STYLE                                                           */
+/* Cette feuille contient les styles associes au code genere par SPIP.  */
+/* Ces styles sont indispensables et doivent necessairement etre        */
+/* definis pour le bon fonctionnement de vos squelettes.                */
+
+
+/* Intertitre */
+h3.spip { /* text-align: center; margin-top: 2em; margin-bottom: 1.4em; font-size: 1.15em; font-weight: bold;*/ }
+hr.spip { margin: 2em auto; }
+
+/* Listes SPIP */
+ul.spip {}
+ol.spip { list-style: decimal; }
+
+/* Citations, code et poesie */
+blockquote.spip { margin: 2em 0; padding-left: 1em; border-left: 0.30em solid; }
+blockquote.spip_poesie { margin: 2em 0; padding-left: 1em; border-left: 1px solid; font-family: Garamond, Georgia, Times, serif; font-size:120%; }
+blockquote.spip_poesie div { text-indent: -3em; margin-left: 3em; }
+
+.spip_code, .spip_cadre { font-family: Courier, "Courier New", monospace; color: #009; }
+.spip_cadre {  background-color: #F4F8F8; border: 1px inset; }
+div.spip_code, .spip_cadre { margin-bottom: 1em;  }
+
+.spip_surligne { background: #FF6; }
+
+/* Tableaux */
+table.spip { margin-right: auto; margin-left: auto; margin-bottom: 1em; border-collapse: collapse; border-spacing: 0; line-height: normal; }
+table.spip caption { caption-side: top; /* bottom pas pris en compte par IE */ text-align: center; margin-right: auto; margin-left: auto; font-weight: bold; }
+table.spip tr.row_first { background: #FFC; }
+table.spip tr.row_odd { background: #EEE; }
+table.spip tr.row_even { background: #DDD; }
+table.spip th, table.spip td { padding: 0.20em 0.40em; text-align: left; border: 1px solid; }
+table.spip th { vertical-align: bottom; font-weight: bold; }
+table.spip td { vertical-align: top; }
+
+/* Logos, documents et images */
+img, .spip_logos { margin: 0; padding: 0; border: 0; }
+.spip_documents { text-align: center; line-height: normal; }
+.spip_documents p { margin: 0.10em; padding: 0; }
+.spip_documents_center { display: block;display: table; clear: both; margin: 1em auto; }
+.spip_documents_left { float: left; margin-right: 15px; margin-bottom: 5px; }
+.spip_documents_right { float: right; margin-left: 15px; margin-bottom: 5px; }
+.spip_doc_titre { margin-right: auto; margin-left: auto; font-weight: bold; font-size: 0.90em; }
+.spip_doc_descriptif { clear: both; margin-right: auto; margin-left: auto; font-size: 0.90em; }
+
+/* modeles par defaut */
+.spip_modele { float: right; display: block; padding: 1em; border: 1px solid; width: 180px; }
+
+/* Couleurs des liens de SPIP */
+a.spip_note {} /* liens vers notes de bas de page */
+a.spip_ancre {} /* liens internes a la page */
+a.spip_in { color: #900; } /* liens internes */
+a.spip_out { color: #009;  } /* liens sortants */
+a.spip_url { color: #009; } /* liens url sortants */
+a.spip_glossaire { color: #060;  } /* liens vers encyclopedie */
+a.spip_glossaire:hover { text-decoration: underline overline; }
+.on,.on a,a.on { font-weight: bold; } /* liens exposes */ 
+
+.small {font-size:90%;}
+
+/* Espaceur de blocs */
+.nettoyeur { clear: both; height: 0; margin: 0; padding: 0; border: 0; line-height: 1px; font-size: 1px; }
+
+/* Non visible a l'ecran */
+.invisible { position: absolute; top: -3000em; height: 1%; }
diff --git a/www/plugins/zpip_v1/structure.html b/www/plugins/zpip_v1/structure.html
new file mode 100644 (file)
index 0000000..af1e5ab
--- /dev/null
@@ -0,0 +1,14 @@
+[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
+<head>
+<INCLURE{fond=head/#ENV{type},env}>
+<INCLURE{fond=inclure/head}>
+</head>
+<body class="page_#ENV{type,page}[ #ENV{type,page}_(#ENV{composition,''})]">
+<INCLURE{fond=body,env}>
+#SPIP_CRON
+</body>
+</html>
+(#EVAL{#VAL{var_zajax}|_request}|non)][
+<INCLURE{fond=#VAL{var_zajax}|_request|concat{'/',#ENV{type}},env}>
+(#EVAL{#VAL{var_zajax}|_request}|oui)]
diff --git a/www/plugins/zpip_v1/svn.revision b/www/plugins/zpip_v1/svn.revision
new file mode 100644 (file)
index 0000000..da586be
--- /dev/null
@@ -0,0 +1,10 @@
+<svn_revision>
+<text_version>
+Origine: file:///home/svn/repository/spip-zone/_squelettes_/zpip-dist/branches/zpip_v1
+Revision: 68933
+Dernier commit: 2013-01-10 19:00:04 +0100 
+</text_version>
+<origine>file:///home/svn/repository/spip-zone/_squelettes_/zpip-dist/branches/zpip_v1</origine>
+<revision>68933</revision>
+<commit>2013-01-10 19:00:04 +0100 </commit>
+</svn_revision>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/tests/z_scaffoldable.php b/www/plugins/zpip_v1/tests/z_scaffoldable.php
new file mode 100644 (file)
index 0000000..0545d09
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Test unitaire de la fonction z_scaffoldable
+ * du fichier ../plugins/zpip/z_pipelines.php
+ *
+ * genere automatiquement par TestBuilder
+ * le 2010-03-04 22:02
+ */
+
+       $test = 'z_scaffoldable';
+       $remonte = "../";
+       while (!is_dir($remonte."ecrire"))
+               $remonte = "../$remonte";
+       require $remonte.'tests/test.inc';
+       find_in_path("../plugins/zpip/z_pipelines.php",'',true);
+
+       //
+       // hop ! on y va
+       //
+       $err = tester_fun('test_z_scaffoldable', essais_z_scaffoldable());
+       
+       // si le tableau $err est pas vide ca va pas
+       if ($err) {
+               die ('<dl>' . join('', $err) . '</dl>');
+       }
+
+       echo "OK";
+
+       function test_z_scaffoldable(){
+               $args = func_get_args();
+               $res = call_user_func_array('z_scaffoldable', $args);
+               return is_array($res)?count($res):false;
+       }
+
+       function essais_z_scaffoldable(){
+               $essais = array (
+  1 => 
+  array (
+    0 => false,
+    1 => 'articles',
+  ),
+  2 => 
+  array (
+    0 => false,
+    1 => 'rubriques',
+  ),
+  3 => 
+  array (
+    0 => false,
+    1 => 'sites',
+  ),
+  4 => 
+  array (
+    0 => 3,
+    1 => 'article',
+  ),
+);
+               return $essais;
+       }
+
+
+
+
+
+
+
+
+
+?>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/z_options.php b/www/plugins/zpip_v1/z_options.php
new file mode 100644 (file)
index 0000000..0a3da6c
--- /dev/null
@@ -0,0 +1,20 @@
+<?php\r
+/*\r
+ * Plugin Zpip\r
+ * (c) 2008-2010 Cedric MORIN Yterium.net\r
+ * Distribue sous licence GPL\r
+ *\r
+ */\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+if ($z = _request('var_zajax')) {\r
+       if ($z_blocs = isset($GLOBALS['z_blocs'])?$GLOBALS['z_blocs']:array('contenu','navigation','extra','head')\r
+         AND in_array($z,$z_blocs)) {\r
+               $GLOBALS['marqueur'] .= "$z:";\r
+               $GLOBALS['flag_preserver'] = true;\r
+       }\r
+       else\r
+               set_request('var_zajax'); // enlever cette demande incongrue\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/www/plugins/zpip_v1/z_pipelines.php b/www/plugins/zpip_v1/z_pipelines.php
new file mode 100644 (file)
index 0000000..784fceb
--- /dev/null
@@ -0,0 +1,323 @@
+<?php
+/*
+ * Plugin Zpip
+ * (c) 2008-2010 Cedric MORIN Yterium.net
+ * Distribue sous licence GPL
+ *
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// demander a SPIP de definir 'type' dans le contexte du premier squelette
+define('_DEFINIR_CONTEXTE_TYPE',true);
+// verifier une seule fois que l'on peut utiliser APL si demande
+if (defined('_Z_AJAX_PARALLEL_LOAD')) {
+       if (_request('var_zapl')=='non') {
+               include_spip('inc/cookie');
+               spip_setcookie('no_zapl',$_COOKIE['no_zapl']='no_zapl');
+       }
+       if (!isset($_COOKIE['no_zapl'])
+        AND !_IS_BOT
+        AND !_request('var_zajax')
+        AND _request('var_mode')!=="debug"
+        AND $_SERVER['REQUEST_METHOD'] == 'GET'
+        ) {
+               define('_Z_AJAX_PARALLEL_LOAD_OK',true);
+               $GLOBALS['marqueur'] .= ":Zapl";
+       }
+}
+
+/**
+ * Inutilise mais permet le chargement de ce fichier avant le decodage des urls
+ * et l'utilisation de _DEFINIR_CONTEXTE_TYPE
+ * @param array $flux
+ * @return array
+ */
+function Z_declarer_url_objets($flux){
+       return $flux;
+}
+
+/**
+ * Fonction Page automatique a partir de contenu/page-xx
+ *
+ * @param array $flux
+ * @return array
+ */
+function Z_styliser($flux){
+       $z_blocs = isset($GLOBALS['z_blocs'])?$GLOBALS['z_blocs']:array('contenu','navigation','extra','head');
+       $z_contenu = reset($z_blocs); // contenu par defaut
+
+       $squelette = $flux['data'];
+       $fond = $flux['args']['fond'];
+       $ext = $flux['args']['ext'];
+
+       // Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera an ajax
+       if (defined('_Z_AJAX_PARALLEL_LOAD_OK')
+         AND $dir = explode('/',$fond)
+         AND count($dir)==2 // pas un sous repertoire
+         AND $dir = reset($dir)
+         AND in_array($dir,$z_blocs) // verifier deja qu'on est dans un bloc Z
+         AND in_array($dir,explode(',',_Z_AJAX_PARALLEL_LOAD)) // et dans un demande en APL
+         AND $pipe = find_in_path("$dir/z_apl.$ext") // et qui contient le squelette APL
+         ){
+               $flux['data'] = substr($pipe, 0, - strlen(".$ext"));
+               return $flux;
+       }
+
+       // gerer les squelettes non trouves
+       // -> router vers les /dist.html
+       // ou scaffolding ou page automatique les contenus
+       if (!$squelette){
+
+               // Cas de figure où on a déclaré type-composition.html dans un bloc, mais où type.html n'existe pas
+               if (isset($flux['args']['contexte']['composition'])
+                 AND $dir = explode('/',$fond)
+                 AND $dir = reset($dir)
+                 AND in_array($dir,$z_blocs)
+                 AND $f=find_in_path($fond."-".$flux['args']['contexte']['composition'].".$ext")){
+                       $flux['data'] = substr($f,0,-strlen(".$ext"));
+               }
+
+               // si on est sur un ?page=XX non trouve
+               elseif ($flux['args']['contexte'][_SPIP_PAGE] == $fond OR $flux['args']['contexte']['type'] == $fond) {
+                       // si c'est un objet spip, associe a une table, utiliser le fond homonyme
+                       if (z_scaffoldable($fond)){
+                               $flux['data'] = substr(find_in_path("objet.$ext"), 0, - strlen(".$ext"));
+                       }
+                       // sinon, brancher sur contenu/page-xx si elle existe
+                       // si on est sur un ?page=XX non trouve
+                       elseif ($flux['args']['contexte'][_SPIP_PAGE] == $fond) {
+                               $base = "$z_contenu/page-".$fond.".".$ext;
+                               if ($base = find_in_path($base)){
+                                       $flux['data'] = substr(find_in_path("page.$ext"), 0, - strlen(".$ext"));
+                               }
+                       }
+               }
+
+               // scaffolding :
+               // si c'est un fond de contenu d'un objet en base
+               // generer un fond automatique a la volee pour les webmestres
+               elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu)+1)==0
+                 AND include_spip('inc/autoriser')
+                 AND isset($GLOBALS['visiteur_session']['id_auteur']) // performance
+                 AND autoriser('webmestre')){
+                 $type = substr($fond,strlen($z_contenu)+1);
+                       if ($is = z_scaffoldable($type))
+                               $flux['data'] = z_scaffolding($type,$is[0],$is[1],$is[2],$ext);
+               }
+               
+               // sinon, si on demande un fond non trouve dans un des autres blocs
+               // et si il y a bien un contenu correspondant ou scaffoldable
+               // se rabbatre sur le dist.html du bloc concerne
+               else{
+                       if ( $dir = explode('/',$fond)
+                         AND $dir = reset($dir)
+                         AND $dir !== $z_contenu
+                         AND in_array($dir,$z_blocs)){
+                               $type = substr($fond,strlen("$dir/"));
+                               if (find_in_path("$z_contenu/$type.$ext") OR z_scaffoldable($type))
+                                       $flux['data'] = substr(find_in_path("$dir/dist.$ext"), 0, - strlen(".$ext"));
+                       }
+               }
+               $squelette = $flux['data'];
+       }
+       if ($fond=='body' AND substr($squelette,-strlen($fond))==$fond){
+               if (isset($flux['args']['contexte']['type'])
+                 AND (
+                       (isset($flux['args']['contexte']['composition'])
+                       AND file_exists(($f=$squelette."-".$flux['args']['contexte']['type']."-".$flux['args']['contexte']['composition']).".$ext"))
+                       OR
+                       file_exists(($f=$squelette."-".$flux['args']['contexte']['type']).".$ext")
+                 ))
+                       $flux['data'] = $f;
+       }
+       // chercher le fond correspondant a la composition
+       elseif (isset($flux['args']['contexte']['composition'])
+         AND substr($squelette,-strlen($fond))==$fond
+         AND $dir = explode('/',$fond)
+         AND $dir = reset($dir)
+         AND in_array($dir,$z_blocs)
+         AND $f=find_in_path($fond."-".$flux['args']['contexte']['composition'].".$ext")){
+               $flux['data'] = substr($f,0,-strlen(".$ext"));
+       }
+       return $flux;
+}
+
+
+/**
+ * Tester si un type est scaffoldable
+ * cad si il correspond bien a un objet en base
+ * 
+ * @staticvar array $scaffoldable
+ * @param string $type
+ * @return bool
+ */
+function z_scaffoldable($type){
+       static $scaffoldable = array();
+       if (isset($scaffoldable[$type]))
+               return $scaffoldable[$type];
+       if (preg_match(',[^\w],',$type))
+               return $scaffoldable[$type] = false;
+       if ($table = table_objet($type)
+         AND $type == objet_type($table)
+         AND $trouver_table = charger_fonction('trouver_table','base')
+         AND
+               ($desc = $trouver_table($table)
+               OR $desc = $trouver_table($table_sql = $GLOBALS['table_prefix']."_$table"))
+               )
+               return $scaffoldable[$type] = array($table,$desc['table'],$desc);
+       else
+               return $scaffoldable[$type] = false;
+}
+
+
+/**
+ * Generer a la volee un fond a partir d'une table de contenu
+ *
+ * @param string $type
+ * @param string $table
+ * @param string $table_sql
+ * @param array $desc
+ * @param string $ext
+ * @return string
+ */
+function z_scaffolding($type,$table,$table_sql,$desc,$ext){
+       include_spip('public/interfaces');
+       $primary = id_table_objet($type);
+       if (!$primary AND isset($desc['key']["PRIMARY KEY"])){
+               $primary = $desc['key']["PRIMARY KEY"];
+       }
+
+       // reperer un titre
+       $titre = 'titre';
+       if (isset($GLOBALS['table_titre'][$table])){
+               $titre = explode(' ',$GLOBALS['table_titre'][$table]);
+               $titre = explode(',',reset($titre));
+               $titre = reset($titre);
+       }
+       if (isset($desc['field'][$titre])){
+               unset($desc['field'][$titre]);
+               $titre="<h1 class='h1 #EDIT{titre}'>#".strtoupper($titre)."</h1>";
+       }
+       else $titre="";
+
+       // reperer une date
+       $date = "date";
+       if (isset($GLOBALS['table_date'][$table]))
+               $date = $GLOBALS['table_date'][$table];
+       if (isset($desc['field'][$date])){
+               unset($desc['field'][$date]);
+               $date = strtoupper($date);
+               $date="<p class='info-publi'>[(#$date|nom_jour) ][(#$date|affdate)][, <span class='auteurs'><:par_auteur:> (#LESAUTEURS)</span>]</p>";
+       }
+       else $date = "";
+
+       $content = array();
+       foreach($desc['field'] as $champ=>$z){
+               if (!in_array($champ,array('maj','statut','idx',$primary))){
+                       $content[] = "[<div><strong>$champ</strong><div class='#EDIT{".$champ."} $champ'>(#".strtoupper($champ)."|image_reduire{500,0})</div></div>]";
+               }
+       }
+       $content = implode("\n\t",$content);
+
+       $scaffold = "#CACHE{0}
+<BOUCLE_contenu($table_sql){".$primary."}>
+[(#REM) Fil d'Ariane ]
+<p id='hierarchie'><a href='#URL_SITE_SPIP/'><:accueil_site:></a>[ &gt; <strong class='on'>(#TITRE|couper{80})</strong>]</p>
+
+<div class='contenu-principal'>
+       <div class='cartouche'>
+               $titre
+               $date
+       </div>
+
+       $content
+
+</div>
+
+[<div class='notes surlignable'><h2 class='h2 pas_surlignable'><:info_notes:></h2>(#NOTES)</div>]
+</BOUCLE_contenu>";
+
+       $dir = sous_repertoire(_DIR_CACHE,"scaffold",false);
+       $dir = sous_repertoire($dir,"contenu",false);
+       $f = $dir."$type";
+       ecrire_fichier("$f.$ext",$scaffold);
+       return $f;
+}
+
+
+
+/**
+ * Surcharger les intertires avant que le core ne les utilise
+ * pour y mettre la class h3
+ * une seule fois suffit !
+ *
+ * @param string $flux
+ * @return string
+ */
+function Z_pre_propre($flux){
+       static $init = false;
+       if (!$init){
+               if (isset($GLOBALS['debut_intertitre']) and $GLOBALS['debut_intertitre']){
+                       $intertitre = $GLOBALS['debut_intertitre'];
+                       $class = extraire_attribut($GLOBALS['debut_intertitre'],'class');
+                       $class = ($class ? " $class":"");
+                       $GLOBALS['debut_intertitre'] = inserer_attribut($GLOBALS['debut_intertitre'], 'class', "h3$class");
+                       foreach($GLOBALS['spip_raccourcis_typo'] as $k=>$v){
+                               $GLOBALS['spip_raccourcis_typo'][$k] = str_replace($intertitre,$GLOBALS['debut_intertitre'],$GLOBALS['spip_raccourcis_typo'][$k]);
+                       }
+               }
+               else {
+                       $GLOBALS['debut_intertitre'] = '<h3 class="h3 spip">';
+                       $GLOBALS['fin_intertitre'] = '</h3>';
+               }
+               $init = true;
+       }
+       return $flux;
+}
+
+/**
+ * Ajouter le inc-insert-head du theme si il existe
+ *
+ * @param string $flux
+ * @return string
+ */
+function Z_insert_head($flux){
+       if (find_in_path('inc-insert-head.html')){
+               $flux .= recuperer_fond('inc-insert-head',array());
+       }
+       return $flux;
+}
+
+//
+// fonction standard de calcul de la balise #INTRODUCTION
+// mais retourne toujours dans un <p> comme propre
+//
+// http://doc.spip.org/@filtre_introduction_dist
+if (!function_exists('filtre_introduction')){ // securite
+function filtre_introduction($descriptif, $texte, $longueur, $connect) {
+       include_spip('public/composer');
+       $texte = filtre_introduction_dist($descriptif, $texte, $longueur, $connect);
+
+       if ($GLOBALS['toujours_paragrapher'] AND strpos($texte,"</p>")===FALSE)
+               // Fermer les paragraphes ; mais ne pas en creer si un seul
+               $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
+
+       return $texte;
+}
+}
+
+/**
+ * Tester la presence sur une page
+ * @param object $p
+ * @return object
+ */
+if (!function_exists('balise_SI_PAGE_dist')){
+function balise_SI_PAGE_dist($p) {
+       $_page = interprete_argument_balise(1,$p);
+       $p->code = "(((\$Pile[0][_SPIP_PAGE]==(\$zp=$_page)) OR (\$Pile[0]['composition']==\$zp AND \$Pile[0]['type']=='page'))?' ':'')";
+       $p->interdire_scripts = false;
+       return $p;
+}
+}
+?>