/** * builder.js — Rosary Builder interactive logic * Depends on: window.PRAYERS_DATA (from PHP), window.EXISTING_STEPS (edit mode) */ (function () { 'use strict'; /* ───────────────────────────────────────────────────────── State ───────────────────────────────────────────────────────── */ let STEPS = []; // [{prayer_id, attribution, _prayer: {...}}] let PRAYERS = []; // full list from PHP let activeTab = 'all'; let searchQuery = ''; let editingPrayerId = null; // null = create, int = edit /* ───────────────────────────────────────────────────────── Boot ───────────────────────────────────────────────────────── */ document.addEventListener('DOMContentLoaded', function () { PRAYERS = window.PRAYERS_DATA || []; // Populate existing steps when editing a session if (window.EXISTING_STEPS && window.EXISTING_STEPS.length) { window.EXISTING_STEPS.forEach(function (s) { const prayer = PRAYERS.find(p => String(p.id) === String(s.prayer_id)); if (prayer) STEPS.push({ prayer_id: s.prayer_id, attribution: s.attribution, _prayer: prayer }); }); } renderLibrary(); renderSequence(); bindEvents(); }); /* ───────────────────────────────────────────────────────── Event bindings ───────────────────────────────────────────────────────── */ function bindEvents() { // Search document.getElementById('prayer-search').addEventListener('input', function () { searchQuery = this.value.trim().toLowerCase(); renderLibrary(); }); // Tabs document.querySelectorAll('.tab-btn').forEach(function (btn) { btn.addEventListener('click', function () { document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active')); this.classList.add('active'); activeTab = this.dataset.tab; renderLibrary(); }); }); // Create prayer button document.getElementById('btn-create-prayer').addEventListener('click', function () { openModal(null); }); // Modal cancel document.getElementById('modal-cancel').addEventListener('click', closeModal); document.getElementById('prayer-modal').addEventListener('click', function (e) { if (e.target === this) closeModal(); }); // Modal attribution radios document.querySelectorAll('input[name="modal-attr"]').forEach(function (radio) { radio.addEventListener('change', updateModalFields); }); // Modal save document.getElementById('modal-save').addEventListener('click', saveModalPrayer); // Save session document.getElementById('btn-save').addEventListener('click', saveSession); } /* ───────────────────────────────────────────────────────── Library rendering ───────────────────────────────────────────────────────── */ function filteredPrayers() { return PRAYERS.filter(function (p) { if (activeTab === 'standard' && p.source_tag !== 'standard') return false; if (activeTab === 'mine' && p.source_tag !== 'mine') return false; if (searchQuery) { const hay = (p.name + ' ' + (p.leader_text || '') + ' ' + (p.all_text || '')).toLowerCase(); return hay.includes(searchQuery); } return true; }); } function renderLibrary() { const list = document.getElementById('prayer-list'); const visible = filteredPrayers(); if (!visible.length) { list.innerHTML = '