let dropdownEl; const lastDropdownOptions = {}; window.addEventListener('message', (event) => { console.log('Parent received message:', event.data); if (event.data?.type === 'customDropdownOpen') { const iframe = document.querySelector('iframe'); const iframeRect = iframe ? iframe.getBoundingClientRect() : { top: 0, left: 0 }; const { top, left, width } = event.data.coords; const options = event.data.options || []; const elementId = event.data.elementId; if (dropdownEl) dropdownEl.remove(); dropdownEl = document.createElement('div'); dropdownEl.className = 'custom-dropdown'; dropdownEl.style.top = `${iframeRect.top + top + window.scrollY}px`; dropdownEl.style.left = `${iframeRect.left + left + window.scrollX}px`; dropdownEl.style.width = `${width}px`; lastDropdownOptions[elementId] = options; dropdownEl.innerHTML = options.map(opt => { let label; if (elementId === 'dropdown-location') { label = opt.city; } else if (elementId === 'dropdown-reasons') { // For reasons, use name label = opt.name || opt.id; } else { // Fallback for any other dropdowns label = opt.name || opt.location_name || opt.address || opt.city || opt.id; } return ``; }).join(''); dropdownEl.addEventListener('click', (e) => { let target = e.target; // If click on child span/img, get parent div while (target && !target.classList.contains('dropdown-option')) { target = target.parentElement; } if (target && target.classList.contains('dropdown-option')) { const selectedId = target.getAttribute('data-id'); event.source.postMessage({ type: 'customDropdownSelected', value: selectedId, elementId }, '*'); dropdownEl.remove(); } }); document.body.appendChild(dropdownEl); } if (event.data?.type === 'customCalendarDropdownOpen') { renderLamCalendar({ weekStart: event.data.weekStart, slots: event.data.calendarData, onSlotSelect: (slot) => { event.source.postMessage({ type: 'customDropdownSelected', value: slot, elementId: event.data.elementId }, '*'); if (window.lamCalendarEl) window.lamCalendarEl.remove(); }, onPrev: () => { event.source.postMessage({ type: 'requestWeek', weekStart: new Date(new Date(event.data.weekStart).setDate(new Date(event.data.weekStart).getDate() - 7)).toISOString() }, '*'); }, onNext: () => { event.source.postMessage({ type: 'requestWeek', weekStart: new Date(new Date(event.data.weekStart).setDate(new Date(event.data.weekStart).getDate() + 7)).toISOString() }, '*'); } }); } if (event.data?.type === 'openCalendar') { // Remove all calendar modals/loaders document.querySelectorAll('.custom-dropdown.calendar-dropdown').forEach(el => el.remove()); if (dropdownEl) dropdownEl.remove(); // Close any open dropdown if (event.data.showLoader) { console.log('Parent: Showing calendar loader'); showLamCalendarLoader(); } } if (event.data?.type === 'updateCalendar') { console.log('Parent: Rendering calendar with slots:', event.data.slots); if (window.lamCalendarEl) window.lamCalendarEl.remove(); renderLamCalendar({ weekStart: event.data.weekStart, slots: event.data.slots, onSlotSelect: (slot) => { window.frames[0].postMessage({ type: 'selectSlot', slot }, '*'); if (window.lamCalendarEl) window.lamCalendarEl.remove(); }, onPrev: () => { showLamCalendarLoader(); window.frames[0].postMessage({ type: 'requestWeek', weekStart: new Date(new Date(event.data.weekStart).setDate(new Date(event.data.weekStart).getDate() - 7)).toISOString() }, '*'); }, onNext: () => { // Show loader before requesting next week showLamCalendarLoader(); window.frames[0].postMessage({ type: 'requestWeek', weekStart: new Date(new Date(event.data.weekStart).setDate(new Date(event.data.weekStart).getDate() + 7)).toISOString() }, '*'); } }); } if (event.data?.type === 'closeCalendar') { if (window.lamCalendarEl) window.lamCalendarEl.remove(); } if (event.data?.type === 'iframeClick') { if (window.lamCalendarEl) window.lamCalendarEl.remove(); } }); document.addEventListener('click', (e) => { if (dropdownEl && !dropdownEl.contains(e.target)) { dropdownEl.remove(); } }); function getLocalDateString(date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const dayNum = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${dayNum}`; } function renderLamCalendar({ weekStart, slots, onSlotSelect, onPrev, onNext }) { document.querySelectorAll('.custom-dropdown.calendar-dropdown').forEach(el => el.remove()); console.log('Parent: renderLamCalendar called', { weekStart, slots }); if (window.lamCalendarEl) window.lamCalendarEl.remove(); const calendarEl = document.createElement('div'); calendarEl.className = 'custom-dropdown calendar-dropdown'; const iframe = document.querySelector('iframe'); if (iframe) { const iframeRect = iframe.getBoundingClientRect(); calendarEl.style.position = 'absolute'; calendarEl.style.top = (window.scrollY + iframeRect.bottom + 10) + 'px'; calendarEl.style.left = (window.scrollX + iframeRect.left) + 'px'; calendarEl.style.width = iframe.offsetWidth + 'px'; } const header = document.createElement('div'); header.className = 'dateHeader'; const prevBtn = document.createElement('button'); prevBtn.className = 'scroll-btn'; prevBtn.innerHTML = '< Prejšnji teden'; prevBtn.onclick = onPrev; const nextBtn = document.createElement('button'); nextBtn.className = 'scroll-btn'; nextBtn.innerHTML = 'Naslednji teden >'; nextBtn.onclick = onNext; const monthYear = document.createElement('span'); monthYear.id = 'month-year'; const weekStartDate = new Date(weekStart); const monthName = weekStartDate.toLocaleString('sl', { month: 'long' }); const year = weekStartDate.getFullYear(); monthYear.textContent = `${monthName.charAt(0).toUpperCase() + monthName.slice(1)} ${year}`; header.appendChild(prevBtn); header.appendChild(monthYear); header.appendChild(nextBtn); calendarEl.appendChild(header); const grid = document.createElement('div'); grid.className = 'scrollWrapper'; const dayLabels = ['Pon', 'Tor', 'Sre', 'Čet', 'Pet']; for (let i = 0; i < 5; i++) { const day = new Date(weekStartDate); day.setDate(weekStartDate.getDate() + i); const dayStr = getLocalDateString(day); const col = document.createElement('div'); col.className = 'dayColumn'; const dayLabel = document.createElement('span'); dayLabel.className = 'calendar-day-label'; dayLabel.textContent = dayLabels[i]; col.appendChild(dayLabel); const dateLabel = document.createElement('span'); dateLabel.id = `${dayLabels[i].toLowerCase()}-date`; dateLabel.className = 'calendar-date-label'; dateLabel.textContent = day.getDate(); col.appendChild(dateLabel); const timeCol = document.createElement('div'); timeCol.className = 'timeColumn'; const slotsForDay = (slots[dayStr] || []); if (slotsForDay.length > 0) { slotsForDay.forEach(slot => { if (!slot || !slot.start_datetime) return; const slotBtn = document.createElement('a'); slotBtn.className = 'slot-btn'; slotBtn.textContent = new Date(slot.start_datetime).toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit', hour12: false }); slotBtn.onclick = (e) => { e.preventDefault(); onSlotSelect(slot); }; timeCol.appendChild(slotBtn); }); } else { const noSlot = document.createElement('div'); noSlot.className = 'no-slots'; noSlot.textContent = 'Ni terminov'; col.appendChild(noSlot); } col.appendChild(timeCol); grid.appendChild(col); const sep = document.createElement('div'); sep.className = 'separator'; grid.appendChild(sep); } calendarEl.appendChild(grid); document.body.appendChild(calendarEl); window.lamCalendarEl = calendarEl; // Close calendar dropdown if user clicks anywhere else setTimeout(() => { function closeCalendarDropdown(e) { if (window.lamCalendarEl && !window.lamCalendarEl.contains(e.target)) { window.lamCalendarEl.remove(); document.removeEventListener('mousedown', closeCalendarDropdown); } } document.addEventListener('mousedown', closeCalendarDropdown); }, 0); } let lamCalendarLoaderEl = null; function showLamCalendarLoader() { // Remove all calendar modals/loaders before rendering loader document.querySelectorAll('.custom-dropdown.calendar-dropdown').forEach(el => el.remove()); // Create calendar dropdown container const calendarEl = document.createElement('div'); calendarEl.className = 'custom-dropdown calendar-dropdown'; const iframe = document.querySelector('iframe'); if (iframe) { const iframeRect = iframe.getBoundingClientRect(); calendarEl.style.position = 'absolute'; calendarEl.style.top = (window.scrollY + iframeRect.bottom + 10) + 'px'; calendarEl.style.left = (window.scrollX + iframeRect.left) + 'px'; calendarEl.style.width = iframe.offsetWidth + 'px'; calendarEl.style.height = iframe.offsetHeight + 100 + 'px'; // Ensure height matches calendar } // Add loader inside calendar dropdown const loaderContainer = document.createElement('div'); loaderContainer.className = 'loader-container'; loaderContainer.innerHTML = '
'; calendarEl.appendChild(loaderContainer); document.body.appendChild(calendarEl); window.lamCalendarEl = calendarEl; }