BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
CALSCALE:GREGORIAN
PRODID:-//WordPress - MECv7.33.0//EN
X-ORIGINAL-URL:https://sailon.no/
X-WR-CALNAME:Sailon.no
X-WR-CALDESC:Kunnskap til dine sjøopplevelser!
X-WR-TIMEZONE:Europe/Oslo
BEGIN:VTIMEZONE
TZID:Europe/Oslo
X-LIC-LOCATION:Europe/Oslo
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:20260329T030000
RRULE:FREQ=YEARLY;BYMONTH=03;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:20261025T020000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU
END:STANDARD
END:VTIMEZONE
REFRESH-INTERVAL;VALUE=DURATION:PT1H
X-PUBLISHED-TTL:PT1H
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
CLASS:PUBLIC
UID:MEC-34f9a343f945196b66f807e0eb6249fd@sailon.no
DTSTART;TZID=Europe/Oslo:20260522T080000
DTEND;TZID=Europe/Oslo:20260522T180000
DTSTAMP:20260522T202342Z
RDATE;TZID=Europe/Oslo:20260522T080000,20260625T090000,20260626T090000,20260627T090000,20260702T090000,20260703T090000,20260704T090000,20260709T090000,20260710T090000,20260711T090000,20260716T090000,20260717T090000,20260718T090000,20260723T090000,20260724T090000,20260725T090000,20260730T090000,20260731T090000,20260801T090000
CREATED:20260522
LAST-MODIFIED:20260601
PRIORITY:5
SEQUENCE:14
TRANSP:OPAQUE
SUMMARY:Fyrtårn-Safari fra Havna Tjøme Hotell
DESCRIPTION:\n\n\n\n\nCa. 60 minutter – Tur til Færder Fyr\nBli med på en spektakulær RiB-tur gjennom skjærgården mot det ikoniske Færder fyr. Underveis passerer vi vakre kystområder, åpne havstrekk og kjente landemerker som Verdens Ende og det karakteristiske vippefyret.\nDenne turen passer perfekt for deg som ønsker en kortere, men innholdsrik opplevelse med både fart, natur og historie.\n \nCa. 90 minutter – Færder Fyr og Fuglehuk\nOpplev to av Oslofjordens mest kjente fyr på én og samme tur. Denne utvidede RiB-opplevelsen tar deg fra fyr til fyr, med stoppunkter og spektakulære utsikter underveis.\nTuren inkluderer både Færder fyr og Fuglehuk fyr, ofte omtalt som portvokterne til Oslofjorden. Her møter du dramatisk natur, åpent hav og en del av norsk kysthistorie som må oppleves fra sjøen.\n \nViktig informasjon\nFor gjennomføring av ordinære turer kreves minimum 8 påmeldte deltakere.\nEr du usikker på om turen blir fullbooket, eller ønsker du en mer privat opplevelse? Vi tilbyr også skreddersydde turer for private grupper og bedrifter.\n \nDette er inkludert\n\nRedningsvest\nBeskyttelsesbriller til bruk under turen\nTermodresser ved kjølige forhold\nLuer og votter ved behov\n\n \nPraktisk informasjon\nVi anbefaler oppmøte minimum 15 minutter før avgang utenfor resepsjonen på Havna Tjøme Hotel.\nSelv på varme sommerdager kan det bli kjølig ute på sjøen ved høy fart. Vi anbefaler derfor:\n\nVindjakke eller ekstra ytterlag\nVarm genser\nKomfortable sko med godt grep\n\nVed dårlig vær eller lave temperaturer stiller vi med ekstra varme klær slik at opplevelsen blir komfortabel for alle.\nTuren har moderat fysisk belastning. Gravide og personer med rygg- eller nakkeproblemer bør selv vurdere om aktiviteten passer.\n\n\n\n\nDet er av sikkerhetsgrunner satt minstehøyde på 140 cm.\n    \n\n        \n            \n                60 Minutter            \n            \n        \n\n        \n            0 påmeldt\n        \n\n        \n            \n            \n        \n        \n            ▲ Minimum 8 for gjennomføring\n        \n\n        \n            ⚠️ Trenger 8 til for gjennomføring        \n    \n\n    \n    (function() {\n        const widget   = document.getElementById('boat-status-widget-60');\n        const bookedEl = widget.querySelector('.boat-booked');\n        const barEl    = widget.querySelector('.boat-progress-bar');\n        const labelEl  = widget.querySelector('.boat-status-label');\n        const dateEl   = widget.querySelector('.boat-selected-date');\n        const minimum  = parseInt(widget.dataset.minimum);\n        const ticketId = widget.dataset.ticketId;\n        const ajaxUrl  = 'https://sailon.no/wp-admin/admin-ajax.php';\n        const nonce    = 'ac5b93ffe2';\n        const visualMax = 12;\n\n        function updateWidget(booked, displayDate) {\n            const pct         = Math.min(100, (booked / visualMax) * 100);\n            const stillNeeded = minimum - booked;\n            bookedEl.textContent = booked;\n            barEl.style.width    = pct + '%';\n\n            // Show the selected date nicely formatted (2026-06-25 → 25.06.2026)\n            if (dateEl && displayDate) {\n                const parts = displayDate.split('-');\n                dateEl.textContent = parts[2] + '.' + parts[1] + '.' + parts[0];\n            }\n\n            if (booked >= minimum) {\n                barEl.style.background = '#27ae60';\n                labelEl.innerHTML = '✅ Turen gjennomføres!';\n            } else {\n                barEl.style.background = '#e67e22';\n                labelEl.innerHTML = '⚠️ Trenger ' + stillNeeded + ' til for gjennomføring';\n            }\n        }\n\n        function fetchCount(date) {\n            if (!date) return;\n            fetch(ajaxUrl, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n                body: new URLSearchParams({\n                    action: 'boat_status_get_count',\n                    nonce,\n                    date,\n                    ticket_id: ticketId\n                })\n            })\n            .then(r => r.json())\n            .then(data => {\n                if (data.success) updateWidget(data.data.booked, date);\n            })\n            .catch(err => console.error('[BoatStatus] AJAX error:', err));\n        }\n\n        // MEC value format: "1782378000:1782385200" (start:end unix timestamps)\n        function parseDate(val) {\n            const m = val.match(/^(\d+):/);\n            if (!m) return null;\n            const d = new Date(parseInt(m[1]) * 1000);\n            return d.getFullYear() + '-'\n                + String(d.getMonth() + 1).padStart(2, '0') + '-'\n                + String(d.getDate()).padStart(2, '0');\n        }\n\n        function attachToMecSelect() {\n            const sel = document.querySelector(\n                'select.mec-custom-nice-select, ' +\n                'select[name="book[date]"], ' +\n                'select[id^="mec_book_form_date"]'\n            );\n            if (!sel) return false;\n\n            sel.addEventListener('change', function() {\n                const date = parseDate(this.value);\n                if (date) fetchCount(date);\n            });\n\n            const date = parseDate(sel.value);\n            if (date) fetchCount(date);\n            return true;\n        }\n\n        let attempts = 0;\n        const iv = setInterval(() => {\n            if (attachToMecSelect() || ++attempts >= 10) clearInterval(iv);\n        }, 500);\n\n        updateWidget(0, '2026-06-25');\n    })();\n    \n        \n\n        \n            \n                90 Minutter            \n            \n        \n\n        \n            0 påmeldt\n        \n\n        \n            \n            \n        \n        \n            ▲ Minimum 8 for gjennomføring\n        \n\n        \n            ⚠️ Trenger 8 til for gjennomføring        \n    \n\n    \n    (function() {\n        const widget   = document.getElementById('boat-status-widget-90');\n        const bookedEl = widget.querySelector('.boat-booked');\n        const barEl    = widget.querySelector('.boat-progress-bar');\n        const labelEl  = widget.querySelector('.boat-status-label');\n        const dateEl   = widget.querySelector('.boat-selected-date');\n        const minimum  = parseInt(widget.dataset.minimum);\n        const ticketId = widget.dataset.ticketId;\n        const ajaxUrl  = 'https://sailon.no/wp-admin/admin-ajax.php';\n        const nonce    = 'ac5b93ffe2';\n        const visualMax = 12;\n\n        function updateWidget(booked, displayDate) {\n            const pct         = Math.min(100, (booked / visualMax) * 100);\n            const stillNeeded = minimum - booked;\n            bookedEl.textContent = booked;\n            barEl.style.width    = pct + '%';\n\n            // Show the selected date nicely formatted (2026-06-25 → 25.06.2026)\n            if (dateEl && displayDate) {\n                const parts = displayDate.split('-');\n                dateEl.textContent = parts[2] + '.' + parts[1] + '.' + parts[0];\n            }\n\n            if (booked >= minimum) {\n                barEl.style.background = '#27ae60';\n                labelEl.innerHTML = '✅ Turen gjennomføres!';\n            } else {\n                barEl.style.background = '#e67e22';\n                labelEl.innerHTML = '⚠️ Trenger ' + stillNeeded + ' til for gjennomføring';\n            }\n        }\n\n        function fetchCount(date) {\n            if (!date) return;\n            fetch(ajaxUrl, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n                body: new URLSearchParams({\n                    action: 'boat_status_get_count',\n                    nonce,\n                    date,\n                    ticket_id: ticketId\n                })\n            })\n            .then(r => r.json())\n            .then(data => {\n                if (data.success) updateWidget(data.data.booked, date);\n            })\n            .catch(err => console.error('[BoatStatus] AJAX error:', err));\n        }\n\n        // MEC value format: "1782378000:1782385200" (start:end unix timestamps)\n        function parseDate(val) {\n            const m = val.match(/^(\d+):/);\n            if (!m) return null;\n            const d = new Date(parseInt(m[1]) * 1000);\n            return d.getFullYear() + '-'\n                + String(d.getMonth() + 1).padStart(2, '0') + '-'\n                + String(d.getDate()).padStart(2, '0');\n        }\n\n        function attachToMecSelect() {\n            const sel = document.querySelector(\n                'select.mec-custom-nice-select, ' +\n                'select[name="book[date]"], ' +\n                'select[id^="mec_book_form_date"]'\n            );\n            if (!sel) return false;\n\n            sel.addEventListener('change', function() {\n                const date = parseDate(this.value);\n                if (date) fetchCount(date);\n            });\n\n            const date = parseDate(sel.value);\n            if (date) fetchCount(date);\n            return true;\n        }\n\n        let attempts = 0;\n        const iv = setInterval(() => {\n            if (attachToMecSelect() || ++attempts >= 10) clearInterval(iv);\n        }, 500);\n\n        updateWidget(0, '2026-06-25');\n    })();\n    \n    \n\n\n\n\n\n\n\n\n
URL:https://sailon.no/events/sel-safari-fra-havna-tjome-hotell/
ORGANIZER;CN=Sail On AS:MAILTO:kurs@sailon.no
CATEGORIES:Rib Sommer Eventyr
LOCATION:Havnaveien 50 3145 Tjøme, Norge
ATTACH;FMTTYPE=image/jpeg:https://sailon.no/wp-content/uploads/2026/05/292226973.jpg
END:VEVENT
END:VCALENDAR
