const sidebarDivId = 'sidebar-div'; const sidebar2DivId = 'sidebar2-div'; const sidebarHeaderId = 'sidebar-header'; const sidebarCaptionId = 'sidebar-caption'; const sidebarContentDivId = 'sidebar-content-div'; const sidebarFooterButtonLeftId = 'sidebar-footer-button-left'; const sidebarButtonCloseIds = ['sidebar-button-close-touch', 'sidebar-button-close-desktop']; const sidebar2ButtonCloseIds = ['sidebar2-button-close-touch', 'sidebar2-button-close-desktop']; const formPhoneFieldId = 'form-phone'; const formLocationFieldId = 'form-location'; const formLocationEnFieldId = 'form-location-en'; const formIndoorFieldId = 'form-indoor'; const formEmergencyPhoneFieldId = 'form-emergency-phone'; let sidebarHeader = document.getElementById(sidebarHeaderId); let sidebarCaption = document.getElementById(sidebarCaptionId); let sidebarContent = document.getElementById(sidebarContentDivId); let sidebarLink = document.getElementById(sidebarFooterButtonLeftId); const accessToColourMapping = { 'yes': 'has-background-green', 'no': 'has-background-grey', 'private': 'has-background-grey', 'permissive': 'has-background-link-dark', 'default': 'has-background-grey', }; const accessToDescriptionMapping = { 'yes': 'ogólnodostępny', 'no': 'prywatny', 'private': 'prywatny', 'permissive': 'o ograniczonym dostępie', 'default': '', }; const indoorMapping = { 'yes': 'tak', 'no': 'nie', 'default': '', }; const locationMapping = { 'indoor': 'tak', 'outdoor': 'nie', 'default': '', }; // -------------------------------------------------------------------------------------- function defineColor(access) { return accessToColourMapping[access] || accessToColourMapping['default']; } function defineAccessDescription(access) { return accessToDescriptionMapping[access] || accessToDescriptionMapping['default']; } function defineIndoor(indoor) { return indoorMapping[indoor] || indoorMapping['default']; } function defineLocationIndoor(location) { return locationMapping[location] || locationMapping['default']; } function getOsmEditLink(id) { return `https://www.openstreetmap.org/edit?editor=id&node=${id}`; } function getOsmPreviewLink(id) { return `https://www.openstreetmap.org/node/${id}`; } function parseOpeningHours(openingHours) { if (openingHours) { if (openingHours.includes('24/7')) { return 'całodobowo'; } else { let hoursPrettified; try { let hours = openingHours.toString(); let oh = new opening_hours(hours, undefined, 2); isOpen = oh.getState(); hoursPrettified = oh.prettifyValue({ conf: { locale: 'pl' }, }); } catch (error) { console.log('Error when parsing opening hours'); return undefined; } return hoursPrettified; } } else { return undefined; } } function isCurrentlyOpen(openingHours) { if (openingHours) { if (openingHours.includes('24/7')) { return true; } else { let hours = openingHours.toString(); let oh = new opening_hours(hours, undefined, 2); isOpen = oh.getState(); return isOpen; } } } function renderCurrentlyOpenStatus(openingHours) { if (isCurrentlyOpen(openingHours)) { return 'Dostępny'; } else { return 'Niedostępny'; } } function renderIfIndoor(indoor, location) { let beginning = '

Wewnątrz budynku?: '; let middle = defineLocationIndoor(location) || defineIndoor(indoor) || 'brak informacji'; let end = '

'; return beginning + middle + end; } function renderLocation(properties) { let beginning = '

Dokładna lokalizacja: '; let middle = properties['defibrillator_location_pl'] || properties['defibrillator_location'] || 'brak informacji'; let end = '

'; return beginning + middle + end; } function renderDescription(properties) { let beginning = '

Opis: '; let middle = properties['description_pl'] || properties.description || 'brak informacji'; let end = '

'; return beginning + middle + end; } function renderContactNumber(phone) { let beginning = '

Numer kontaktowy: '; let middle = phone || 'brak informacji'; let end = '

'; return beginning + middle + end; } function renderAccessibleTime(openingHours) { if (openingHours) { let beginning = '

Dostępny w godzinach: '; let middle = parseOpeningHours(openingHours) || 'brak informacji '; let end = (renderCurrentlyOpenStatus(openingHours) || '') + '

'; return beginning + middle + end; } else { return ''; } } function renderNotes(properties) { if (properties.note || properties['note_pl']) { let beginning = '

Uwagi: '; let middle = properties['note_pl'] || properties.note || 'brak uwag'; let end = '

'; return beginning + middle + end; } else { return ''; } } function renderOperator(operator) { let beginning = '

Zarządzający urządzeniem: '; let middle = operator || 'brak informacji'; let end = '

'; return beginning + middle + end; } function renderSidebarContent(properties) { let content = ''; content += renderIfIndoor(properties.indoor, properties.location); content += renderLocation(properties); content += renderAccessibleTime(properties.opening_hours); content += renderDescription(properties); content += renderContactNumber(properties.phone); content += renderOperator(properties.operator); content += renderNotes(properties); return content; } function renderSidebarForm() { let content = `

Pole opcjonalne

Pole opcjonalne

Pole opcjonalne. Wypełnij tylko, jeżeli jest inny niż 112/999.

`; return content; } function renderEditButton(osm_id) { return ` Uzupełnij dane (iD) `; } function renderPreviewButton(osm_id) { return ` Podgląd w OSM `; } function renderSaveButton() { return `
ver. 0.1
`; } // -------------------------------------------------------------- function prepareNodeData() { let data = {}; // get coordinates let markerPosition = marker.getLngLat(); data.lng = markerPosition.lng; data.lat = markerPosition.lat; // get additional tags data.tags = {}; let formPhoneField = document.getElementById(formPhoneFieldId); let formLocationField = document.getElementById(formLocationFieldId); let formEmergencyPhoneField = document.getElementById(formEmergencyPhoneFieldId); let formLocationEnField = document.getElementById(formLocationEnFieldId); let formAccessField = document.querySelector('input[name="aedAccess"]:checked'); let formIndoorField = document.querySelector('input[name="aedIndoor"]:checked'); if (formIndoorField && formIndoorField.getAttribute('value')) data.tags[formIndoorField.getAttribute('tag')] = formIndoorField.getAttribute('value'); if (formPhoneField && formPhoneField.value.trim()) data.tags[formPhoneField.getAttribute('tag')] = formPhoneField.value.trim(); if (formLocationField && formLocationField.value.trim()) data.tags[formLocationField.getAttribute('tag')] = formLocationField.value.trim(); if (formEmergencyPhoneField && formEmergencyPhoneField.value.trim()) data.tags[formEmergencyPhoneField.getAttribute('tag')] = formEmergencyPhoneField.value.trim(); if (formLocationEnField && formLocationEnField.value.trim()) data.tags[formLocationEnField.getAttribute('tag')] = formLocationEnField.value.trim(); if (formAccessField && formAccessField.getAttribute('value')) data.tags[formAccessField.getAttribute('tag')] = formAccessField.getAttribute('value'); return data; } function removeMarkerIfExists() { if (marker !== null) { marker.remove(); marker = null; } } function closeNavBurger() { document.getElementById('navMenu').classList.remove('is-active'); document.getElementsByClassName('navbar-burger')[0].classList.remove('is-active'); } function showSidebar(properties) { let sidebar = document.getElementById(sidebarDivId); if (sidebar) { sidebar.classList.remove('is-invisible'); if (properties.action === "showDetails") { prepareSidebarShowingObjectInfo(properties.data); removeMarkerIfExists(); } else if (properties.action === "addNode") { prepareSidebarAddingNode(properties.data); } else { console.log(`Unknown action: ${properties.action}.`); } hideSidebar2(); closeNavBurger(); } else console.log('Sidebar not found.'); } function toggleSidebar2() { let sidebar = document.getElementById(sidebar2DivId); if (sidebar.classList.contains('is-invisible')) { showSidebar2(); } else { sidebar.classList.add('is-invisible'); } } function showSidebar2() { let sidebar = document.getElementById(sidebar2DivId); if (sidebar) { sidebar.classList.remove('is-invisible'); hideSidebar(); closeNavBurger(); } else console.log('Sidebar not found.'); } function hideSidebar() { let sidebar = document.getElementById(sidebarDivId); if (sidebar) { sidebar.classList.add('is-invisible'); removeMarkerIfExists(); // restore buttons let mobileButton1 = document.getElementById('addNode-mobile-1'); let mobileButton2 = document.getElementById('addNode-mobile-2'); let mobileButton3 = document.getElementById('addNode-mobile-3'); mobileButton1.classList.remove('is-hidden'); mobileButton2.classList.add('is-hidden'); mobileButton3.classList.add('is-hidden'); } else { console.log('Sidebar not found.'); } } function hideSidebar2() { let sidebar = document.getElementById(sidebar2DivId); if (sidebar) { sidebar.classList.add('is-invisible'); } else { console.log('Sidebar not found.'); } } function prepareSidebarShowingObjectInfo(properties) { sidebarHeader.classList = ['p-2']; sidebarHeader.classList.add(defineColor(properties.access)); sidebarCaption.innerHTML = `defibrylator AED ${defineAccessDescription(properties.access)}`; sidebarContent.innerHTML = renderSidebarContent(properties); sidebarLink.innerHTML = renderEditButton(properties.osm_id); sidebarLink.innerHTML += renderPreviewButton(properties.osm_id); } function prepareSidebarAddingNode(properties) { sidebarHeader.classList = ['p-2']; sidebarHeader.classList.add(defineColor('default')); sidebarCaption.innerHTML = 'Dodaj defibrylator'; sidebarContent.innerHTML = renderSidebarForm(); sidebarLink.innerHTML = renderSaveButton(); } // -------------------------------------------------------------------------------------- // Bulma controls document.addEventListener('DOMContentLoaded', () => { // Get all "navbar-burger" elements const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0); // Check if there are any navbar burgers if ($navbarBurgers.length > 0) { // Add a click event on each of them $navbarBurgers.forEach(el => { el.addEventListener('click', () => { // Get the target from the "data-target" attribute const target = el.dataset.target; const $target = document.getElementById(target); // Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu" el.classList.toggle('is-active'); $target.classList.toggle('is-active'); }); }); } // add listeners to buttons opening modals // Add a click event on buttons to open a specific modal (document.querySelectorAll('.js-modal-trigger') || []).forEach(($trigger) => { const modal = $trigger.dataset.target; const $target = document.getElementById(modal); $trigger.addEventListener('click', () => { $target.classList.add('is-active'); }); }); // Add a click event on various child elements to close the parent modal (document.querySelectorAll('.modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button') || []).forEach(($close) => { const $target = $close.closest('.modal'); $close.addEventListener('click', () => { $target.classList.remove('is-active'); }); }); if (window.innerWidth > 1024) { showSidebar2(); } }); // button listeners sidebarButtonCloseIds.forEach(id => { document.getElementById(id).addEventListener('click', hideSidebar); }); sidebar2ButtonCloseIds.forEach(id => { document.getElementById(id).addEventListener('click', hideSidebar2); });