/** * OEDB Embed Script * Script d'intégration pour afficher les événements OEDB sur des sites externes */ (function() { 'use strict'; // Configuration par défaut const defaultConfig = { apiUrl: 'https://api.openenventdatabase.org', theme: 'light', limit: 50, width: '100%', height: '400px', showMap: true, showList: true, autoRefresh: false, refreshInterval: 300000 // 5 minutes }; // Thèmes CSS const themes = { light: { background: '#ffffff', text: '#2c3e50', border: '#ecf0f1', primary: '#3498db', secondary: '#95a5a6' }, dark: { background: '#2c3e50', text: '#ecf0f1', border: '#34495e', primary: '#3498db', secondary: '#7f8c8d' } }; class OEDBEmbed { constructor(container, config) { this.container = typeof container === 'string' ? document.querySelector(container) : container; this.config = { ...defaultConfig, ...config }; this.events = []; this.isLoading = false; this.refreshTimer = null; if (!this.container) { console.error('OEDB Embed: Container not found'); return; } this.init(); } init() { this.injectStyles(); this.render(); this.loadEvents(); if (this.config.autoRefresh) { this.startAutoRefresh(); } } injectStyles() { if (document.getElementById('oedb-embed-styles')) return; const theme = themes[this.config.theme] || themes.light; const styles = ` `; document.head.insertAdjacentHTML('beforeend', styles); } render() { this.container.innerHTML = `
Événements OEDB
${this.config.showMap ? '
' : ''} ${this.config.showList ? `
` : ''}
`; } async loadEvents() { if (this.isLoading) return; this.isLoading = true; this.showLoading(); try { const params = new URLSearchParams(); if (this.config.what) params.set('what', this.config.what); if (this.config.start) params.set('start', this.config.start); if (this.config.end) params.set('end', this.config.end); if (this.config.limit) params.set('limit', this.config.limit.toString()); if (this.config.bbox) params.set('bbox', this.config.bbox); const response = await fetch(`${this.config.apiUrl}/events?${params.toString()}`); const data = await response.json(); this.events = data.features || []; this.renderEvents(); this.renderMap(); } catch (error) { console.error('OEDB Embed: Error loading events', error); this.showError('Erreur lors du chargement des événements'); } finally { this.isLoading = false; } } showLoading() { const listContainer = document.getElementById('oedb-list'); if (listContainer) { listContainer.innerHTML = '
Chargement des événements...
'; } } showError(message) { const listContainer = document.getElementById('oedb-list'); if (listContainer) { listContainer.innerHTML = `
${message}
`; } } renderEvents() { const listContainer = document.getElementById('oedb-list'); if (!listContainer) return; if (this.events.length === 0) { listContainer.innerHTML = '
Aucun événement trouvé
'; return; } const eventsHtml = this.events.map(event => { const title = event.properties?.label || event.properties?.name || 'Événement sans nom'; const date = event.properties?.start || event.properties?.when || ''; const location = event.properties?.where || ''; const type = event.properties?.what || ''; return `
${this.escapeHtml(title)}
${date ? `
📅 ${this.formatDate(date)}
` : ''} ${location ? `
📍 ${this.escapeHtml(location)}
` : ''} ${type ? `
🏷️ ${this.escapeHtml(type)}
` : ''}
`; }).join(''); listContainer.innerHTML = eventsHtml; // Ajouter les événements de clic listContainer.querySelectorAll('.oedb-event-item').forEach(item => { item.addEventListener('click', () => { const eventId = item.dataset.eventId; this.onEventClick(eventId); }); }); } renderMap() { const mapContainer = document.getElementById('oedb-map'); if (!mapContainer) return; if (this.events.length === 0) { mapContainer.innerHTML = '
Aucun événement à afficher sur la carte
'; return; } // Pour l'instant, afficher un placeholder // Dans une vraie implémentation, on utiliserait Leaflet ou une autre librairie de cartes mapContainer.innerHTML = `
Carte interactive
${this.events.length} événement(s) trouvé(s)
`; } onEventClick(eventId) { // Émettre un événement personnalisé const event = new CustomEvent('oedb-event-click', { detail: { eventId, event: this.events.find(e => e.id === eventId) } }); this.container.dispatchEvent(event); } startAutoRefresh() { if (this.refreshTimer) { clearInterval(this.refreshTimer); } this.refreshTimer = setInterval(() => { this.loadEvents(); }, this.config.refreshInterval); } stopAutoRefresh() { if (this.refreshTimer) { clearInterval(this.refreshTimer); this.refreshTimer = null; } } destroy() { this.stopAutoRefresh(); this.container.innerHTML = ''; } // Utilitaires escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } formatDate(dateString) { try { const date = new Date(dateString); return date.toLocaleDateString('fr-FR', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); } catch { return dateString; } } } // API publique window.OEDBEmbed = { init: function(config) { return new OEDBEmbed(config.container, config); } }; // Auto-initialisation si des éléments avec data-oedb-embed sont présents document.addEventListener('DOMContentLoaded', function() { const embedElements = document.querySelectorAll('[data-oedb-embed]'); embedElements.forEach(element => { const config = { container: element, ...JSON.parse(element.dataset.oedbEmbed || '{}') }; new OEDBEmbed(config.container, config); }); }); })();