{"id":21137,"date":"2026-08-07T11:09:43","date_gmt":"2026-08-07T09:09:43","guid":{"rendered":"https:\/\/thuroesejlklub.dk\/?p=21137"},"modified":"2026-08-26T13:40:39","modified_gmt":"2026-08-26T11:40:39","slug":"48-timers-vejrudsigt","status":"publish","type":"post","link":"https:\/\/thuroesejlklub.dk\/?p=21137","title":{"rendered":"48 timers vejrudsigt"},"content":{"rendered":"<p><span style=\"font-size: 24pt; color: #d10f0f;\">FCOO prognoser<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-21155\" src=\"https:\/\/thuroesejlklub.dk\/wp-content\/uploads\/2026\/08\/FCOO_logo_270x90.png\" alt=\"\" width=\"222\" height=\"74\" \/><\/p>\n<p>FCOO er en meget benyttet tjeneste hos mange sejlere.<br \/>\nNedenst\u00e5ende grafer viser prognoser for de n\u00e6ste 48 timer i Gamb\u00f8t.<br \/>\nPrognosen opdateres 4 gange i d\u00f8gnet.<br \/>\nGraferne er designet af Henrik Bo Christoffersen fra Gilleleje Sejlklub.<br \/>\nTak til Henrik for at stille koden til r\u00e5dighed for Thur\u00f8 Sejlklub.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><span style=\"font-size: 14pt; color: #d10d0d;\"><span style=\"font-size: 18pt;\">Prognose for vindstyrke og retning i Gamb\u00f8t de n\u00e6ste 48 timer:<\/span><\/span><\/p>\n<style>\r\n\/* --- WIND INFO TILES --- *\/\r\n \r\n#windInfoTiles {\r\n    display:flex;\r\n    gap:12px;\r\n    margin-bottom:14px;\r\n    flex-wrap:wrap;\r\n \r\n}\r\n \r\n\/* Core tile styling *\/\r\n \r\n.windTile {\r\n    flex: 1;\r\n    background: #e8f4ff;\r\n    border-left: 6px solid #1a73e8;\r\n    padding: 12px 16px;\r\n    border-radius: 4px;\r\n    font-family: Arial, sans-serif;\r\n    display: flex;\r\n    flex-direction: column;\r\n}\r\n \r\n\/* Typography *\/\r\n.windTileTitle       { font-size:15px; font-weight:bold; margin-bottom:4px; }\r\n.windTileValue       { font-size:20px; font-weight:bold; margin-bottom:4px; }\r\n.windTileValueActual { font-size:14px; opacity:0.8; }\r\n.windTileTime        { font-size:14px; opacity:0.8; }\r\n.windTileDir         { font-size:20px; opacity:0.8; margin-top:4px; }\r\n \r\n\/* Icons *\/\r\n.windTileArrow {\r\n    width:30px;\r\n    height:30px;\r\n    margin-top:6px;\r\n}\r\n \r\n\/* Remove theme shadows from SVGs *\/\r\n#windInfoTiles svg,\r\n#windInfoTiles svg * {\r\n    filter:none !important;\r\n    box-shadow:none !important;\r\n    stroke:#333 !important;\r\n    fill:#333 !important;\r\n}\r\n \r\n\/* --- RESPONSIVE BEHAVIOR --- *\/\r\n@media (max-width: 600px) {\r\n    .windTile {\r\n        flex:1 1 calc(50% - 12px);\r\n        min-width:calc(50% - 12px);\r\n    }\r\n}\r\n \r\n@media (max-width: 400px) {\r\n    .windTile {\r\n        flex:1 1 100%;\r\n        min-width:100%;\r\n    }\r\n}\r\n \r\n\/* Chart overlay elements *\/\r\n.wind-arrow {\r\n    position:absolute;\r\n    width:40px;\r\n    height:40px;\r\n    pointer-events:none;\r\n}\r\n \r\n.current-time-line {\r\n    position:absolute;\r\n    width:2px;\r\n    background:red;\r\n    pointer-events:none;\r\n}\r\n<\/style>\r\n \r\n<!-- INFO TILES -->\r\n<div id=\"windInfoTiles\">\r\n    <div id=\"windNowBox\" class=\"windTile\">\r\n        <div class=\"windTileTitle\">Aktuel prognose<\/div>\r\n        <div class=\"windTileValue\">\r\n            <span id=\"windNowValue\"><\/span>\r\n            <span id=\"windNowDirText\" class=\"windTileDir\"><\/span>\r\n        <\/div>\r\n        <div id=\"windNowValueActual\" class=\"windTileValueActual\"> <\/div>\r\n        <div id=\"windNowTime\" class=\"windTileTime\"><\/div>\r\n        <div id=\"windNowArrow\" class=\"windTileArrow\"><\/div>\r\n    <\/div>\r\n    <div id=\"windTrendBox\" class=\"windTile\">\r\n        <div class=\"windTileTitle\">N\u00e6ste prognose<\/div>\r\n        <div class=\"windTileValue\">\r\n            <span id=\"windTrendValue\"><\/span>\r\n            <span id=\"windTrendArrow\" class=\"windTileTrendArrow\"><\/span>\r\n            <span id=\"windTrendDirText\" class=\"windTileDir\"><\/span>\r\n        <\/div>\r\n        <div id=\"windTrendTime\" class=\"windTileTime\"><\/div>\r\n        <div id=\"windTrendArrowDir\" class=\"windTileArrow\"><\/div>\r\n    <\/div>\r\n     <div id=\"windMinBox\" class=\"windTile\">\r\n        <div class=\"windTileTitle\">Min vind<\/div>\r\n        <div class=\"windTileValue\">\r\n             <span id=\"windMinValue\"><\/span>\r\n             <span id=\"windMinDirText\" class=\"windTileDir\"><\/span>\r\n        <\/div>\r\n        <div id=\"windMinTime\" class=\"windTileTime\"><\/div>\r\n        <div id=\"windMinArrow\" class=\"windTileArrow\"><\/div>\r\n \r\n    <\/div>\r\n \r\n    <div id=\"windMaxBox\" class=\"windTile\">\r\n        <div class=\"windTileTitle\">Max vind<\/div>\r\n        <div class=\"windTileValue\">\r\n             <span id=\"windMaxValue\"><\/span>\r\n             <span id=\"windMaxDirText\" class=\"windTileDir\"><\/span>\r\n        <\/div>\r\n        <div id=\"windMaxTime\" class=\"windTileTime\"><\/div>\r\n        <div id=\"windMaxArrow\" class=\"windTileArrow\"><\/div>\r\n \r\n    <\/div>\r\n \r\n \r\n<\/div>\r\n \r\n<!-- GRAPH -->\r\n<div id=\"fcoo-wind-wrapper\" style=\"width:100%; height:400px; position:relative;\">\r\n    <div id=\"curve_chart_fcoo_wind\" style=\"width:100%; height:100%;\"><\/div>\r\n<\/div>\r\n \r\n<!-- SLIDER -->\r\n<div style=\"margin-top:12px; padding:6px 4px; background:#f7f7f7; border-radius:4px;\">\r\n    <label for=\"windSlider\" style=\"font-weight:bold; display:block; margin-bottom:6px;\">V\u00e6lg periode<\/label>\r\n    <input id=\"windSlider\" type=\"range\" min=\"6\" max=\"48\" step=\"3\" value=\"48\" style=\"width:100%;\">\r\n    <div style=\"text-align:center; margin-top:6px; font-size:16px;\">\r\n        <span id=\"windSliderValue\" style=\"font-weight:bold;\">48<\/span> timer\r\n    <\/div>\r\n<\/div>\r\n \r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n \r\n    const chartRows = [[new Date(2026, 8, 1, 5, 00),3.95000000000000017763568394002504646778106689453125],[new Date(2026, 8, 1, 6, 00),2.7599999999999997868371792719699442386627197265625],[new Date(2026, 8, 1, 7, 00),2.2599999999999997868371792719699442386627197265625],[new Date(2026, 8, 1, 8, 00),3.819999999999999840127884453977458178997039794921875],[new Date(2026, 8, 1, 9, 00),4.32000000000000028421709430404007434844970703125],[new Date(2026, 8, 1, 10, 00),5.05999999999999960920149533194489777088165283203125],[new Date(2026, 8, 1, 11, 00),5.4000000000000003552713678800500929355621337890625],[new Date(2026, 8, 1, 12, 00),5.79999999999999982236431605997495353221893310546875],[new Date(2026, 8, 1, 13, 00),6.79000000000000003552713678800500929355621337890625],[new Date(2026, 8, 1, 14, 00),6.79000000000000003552713678800500929355621337890625],[new Date(2026, 8, 1, 15, 00),6.25],[new Date(2026, 8, 1, 16, 00),5.7599999999999997868371792719699442386627197265625],[new Date(2026, 8, 1, 17, 00),6.29000000000000003552713678800500929355621337890625],[new Date(2026, 8, 1, 18, 00),6.25],[new Date(2026, 8, 1, 19, 00),5.2599999999999997868371792719699442386627197265625],[new Date(2026, 8, 1, 20, 00),3.819999999999999840127884453977458178997039794921875],[new Date(2026, 8, 1, 21, 00),5.2599999999999997868371792719699442386627197265625],[new Date(2026, 8, 1, 22, 00),4.32000000000000028421709430404007434844970703125],[new Date(2026, 8, 1, 23, 00),4.2599999999999997868371792719699442386627197265625],[new Date(2026, 8, 2, 0, 00),3.819999999999999840127884453977458178997039794921875],[new Date(2026, 8, 2, 1, 00),2.7599999999999997868371792719699442386627197265625],[new Date(2026, 8, 2, 2, 00),2.7599999999999997868371792719699442386627197265625],[new Date(2026, 8, 2, 3, 00),2.7599999999999997868371792719699442386627197265625],[new Date(2026, 8, 2, 4, 00),3.339999999999999857891452847979962825775146484375],[new Date(2026, 8, 2, 5, 00),3.689999999999999946709294817992486059665679931640625],[new Date(2026, 8, 2, 6, 00),3.54999999999999982236431605997495353221893310546875],[new Date(2026, 8, 2, 7, 00),3.689999999999999946709294817992486059665679931640625],[new Date(2026, 8, 2, 8, 00),4.5999999999999996447286321199499070644378662109375],[new Date(2026, 8, 2, 9, 00),4.6500000000000003552713678800500929355621337890625],[new Date(2026, 8, 2, 10, 00),5.3499999999999996447286321199499070644378662109375],[new Date(2026, 8, 2, 11, 00),5.6699999999999999289457264239899814128875732421875],[new Date(2026, 8, 2, 12, 00),5.3499999999999996447286321199499070644378662109375],[new Date(2026, 8, 2, 13, 00),4.80999999999999960920149533194489777088165283203125],[new Date(2026, 8, 2, 14, 00),4.6500000000000003552713678800500929355621337890625],[new Date(2026, 8, 2, 15, 00),4.95999999999999996447286321199499070644378662109375],[new Date(2026, 8, 2, 16, 00),3.95000000000000017763568394002504646778106689453125],[new Date(2026, 8, 2, 17, 00),2.37000000000000010658141036401502788066864013671875],[new Date(2026, 8, 2, 18, 00),3.95000000000000017763568394002504646778106689453125],[new Date(2026, 8, 2, 19, 00),4.80999999999999960920149533194489777088165283203125],[new Date(2026, 8, 2, 20, 00),5.7599999999999997868371792719699442386627197265625],[new Date(2026, 8, 2, 21, 00),4.7599999999999997868371792719699442386627197265625],[new Date(2026, 8, 2, 22, 00),3.2599999999999997868371792719699442386627197265625],[new Date(2026, 8, 2, 23, 00),2.7599999999999997868371792719699442386627197265625],[new Date(2026, 8, 3, 0, 00),2.37000000000000010658141036401502788066864013671875],[new Date(2026, 8, 3, 1, 00),1.770000000000000017763568394002504646778106689453125],[new Date(2026, 8, 3, 2, 00),1.899999999999999911182158029987476766109466552734375],[new Date(2026, 8, 3, 3, 00),1.770000000000000017763568394002504646778106689453125],[new Date(2026, 8, 3, 4, 00),1.770000000000000017763568394002504646778106689453125],[new Date(2026, 8, 3, 5, 00),1.45999999999999996447286321199499070644378662109375],[new Date(2026, 8, 3, 6, 00),1.060000000000000053290705182007513940334320068359375],[new Date(2026, 8, 3, 7, 00),0.34999999999999997779553950749686919152736663818359375],[new Date(2026, 8, 3, 8, 00),0.34999999999999997779553950749686919152736663818359375],[new Date(2026, 8, 3, 9, 00),1.45999999999999996447286321199499070644378662109375],[new Date(2026, 8, 3, 10, 00),2.470000000000000195399252334027551114559173583984375],[new Date(2026, 8, 3, 11, 00),2.850000000000000088817841970012523233890533447265625],[new Date(2026, 8, 3, 12, 00),2.850000000000000088817841970012523233890533447265625],[new Date(2026, 8, 3, 13, 00),2.850000000000000088817841970012523233890533447265625],[new Date(2026, 8, 3, 14, 00),3.2599999999999997868371792719699442386627197265625],[new Date(2026, 8, 3, 15, 00),2.850000000000000088817841970012523233890533447265625],[new Date(2026, 8, 3, 16, 00),2.569999999999999840127884453977458178997039794921875],[new Date(2026, 8, 3, 17, 00),3.95000000000000017763568394002504646778106689453125]];\r\n    const dirRows   = [[new Date(2026, 8, 1, 5, 00),3.95000000000000017763568394002504646778106689453125,108],[new Date(2026, 8, 1, 6, 00),2.7599999999999997868371792719699442386627197265625,95],[new Date(2026, 8, 1, 7, 00),2.2599999999999997868371792719699442386627197265625,84],[new Date(2026, 8, 1, 8, 00),3.819999999999999840127884453977458178997039794921875,79],[new Date(2026, 8, 1, 9, 00),4.32000000000000028421709430404007434844970703125,80],[new Date(2026, 8, 1, 10, 00),5.05999999999999960920149533194489777088165283203125,70],[new Date(2026, 8, 1, 11, 00),5.4000000000000003552713678800500929355621337890625,77],[new Date(2026, 8, 1, 12, 00),5.79999999999999982236431605997495353221893310546875,83],[new Date(2026, 8, 1, 13, 00),6.79000000000000003552713678800500929355621337890625,84],[new Date(2026, 8, 1, 14, 00),6.79000000000000003552713678800500929355621337890625,84],[new Date(2026, 8, 1, 15, 00),6.25,88],[new Date(2026, 8, 1, 16, 00),5.7599999999999997868371792719699442386627197265625,92],[new Date(2026, 8, 1, 17, 00),6.29000000000000003552713678800500929355621337890625,83],[new Date(2026, 8, 1, 18, 00),6.25,88],[new Date(2026, 8, 1, 19, 00),5.2599999999999997868371792719699442386627197265625,87],[new Date(2026, 8, 1, 20, 00),3.819999999999999840127884453977458178997039794921875,101],[new Date(2026, 8, 1, 21, 00),5.2599999999999997868371792719699442386627197265625,87],[new Date(2026, 8, 1, 22, 00),4.32000000000000028421709430404007434844970703125,80],[new Date(2026, 8, 1, 23, 00),4.2599999999999997868371792719699442386627197265625,93],[new Date(2026, 8, 2, 0, 00),3.819999999999999840127884453977458178997039794921875,101],[new Date(2026, 8, 2, 1, 00),2.7599999999999997868371792719699442386627197265625,95],[new Date(2026, 8, 2, 2, 00),2.7599999999999997868371792719699442386627197265625,95],[new Date(2026, 8, 2, 3, 00),2.7599999999999997868371792719699442386627197265625,85],[new Date(2026, 8, 2, 4, 00),3.339999999999999857891452847979962825775146484375,77],[new Date(2026, 8, 2, 5, 00),3.689999999999999946709294817992486059665679931640625,62],[new Date(2026, 8, 2, 6, 00),3.54999999999999982236431605997495353221893310546875,51],[new Date(2026, 8, 2, 7, 00),3.689999999999999946709294817992486059665679931640625,62],[new Date(2026, 8, 2, 8, 00),4.5999999999999996447286321199499070644378662109375,45],[new Date(2026, 8, 2, 9, 00),4.6500000000000003552713678800500929355621337890625,54],[new Date(2026, 8, 2, 10, 00),5.3499999999999996447286321199499070644378662109375,53],[new Date(2026, 8, 2, 11, 00),5.6699999999999999289457264239899814128875732421875,49],[new Date(2026, 8, 2, 12, 00),5.3499999999999996447286321199499070644378662109375,53],[new Date(2026, 8, 2, 13, 00),4.80999999999999960920149533194489777088165283203125,62],[new Date(2026, 8, 2, 14, 00),4.6500000000000003552713678800500929355621337890625,54],[new Date(2026, 8, 2, 15, 00),4.95999999999999996447286321199499070644378662109375,41],[new Date(2026, 8, 2, 16, 00),3.95000000000000017763568394002504646778106689453125,72],[new Date(2026, 8, 2, 17, 00),2.37000000000000010658141036401502788066864013671875,72],[new Date(2026, 8, 2, 18, 00),3.95000000000000017763568394002504646778106689453125,72],[new Date(2026, 8, 2, 19, 00),4.80999999999999960920149533194489777088165283203125,81],[new Date(2026, 8, 2, 20, 00),5.7599999999999997868371792719699442386627197265625,88],[new Date(2026, 8, 2, 21, 00),4.7599999999999997868371792719699442386627197265625,93],[new Date(2026, 8, 2, 22, 00),3.2599999999999997868371792719699442386627197265625,94],[new Date(2026, 8, 2, 23, 00),2.7599999999999997868371792719699442386627197265625,95],[new Date(2026, 8, 3, 0, 00),2.37000000000000010658141036401502788066864013671875,108],[new Date(2026, 8, 3, 1, 00),1.770000000000000017763568394002504646778106689453125,98],[new Date(2026, 8, 3, 2, 00),1.899999999999999911182158029987476766109466552734375,113],[new Date(2026, 8, 3, 3, 00),1.770000000000000017763568394002504646778106689453125,82],[new Date(2026, 8, 3, 4, 00),1.770000000000000017763568394002504646778106689453125,82],[new Date(2026, 8, 3, 5, 00),1.45999999999999996447286321199499070644378662109375,121],[new Date(2026, 8, 3, 6, 00),1.060000000000000053290705182007513940334320068359375,135],[new Date(2026, 8, 3, 7, 00),0.34999999999999997779553950749686919152736663818359375,135],[new Date(2026, 8, 3, 8, 00),0.34999999999999997779553950749686919152736663818359375,315],[new Date(2026, 8, 3, 9, 00),1.45999999999999996447286321199499070644378662109375,31],[new Date(2026, 8, 3, 10, 00),2.470000000000000195399252334027551114559173583984375,45],[new Date(2026, 8, 3, 11, 00),2.850000000000000088817841970012523233890533447265625,52],[new Date(2026, 8, 3, 12, 00),2.850000000000000088817841970012523233890533447265625,52],[new Date(2026, 8, 3, 13, 00),2.850000000000000088817841970012523233890533447265625,52],[new Date(2026, 8, 3, 14, 00),3.2599999999999997868371792719699442386627197265625,32],[new Date(2026, 8, 3, 15, 00),2.850000000000000088817841970012523233890533447265625,38],[new Date(2026, 8, 3, 16, 00),2.569999999999999840127884453977458178997039794921875,29],[new Date(2026, 8, 3, 17, 00),3.95000000000000017763568394002504646778106689453125,35]];\r\n    const defaultHours = 48;\r\n \r\n    function degToCompassText(dir) {\r\n        const source = (dir+180) % 360;\r\n        if (source >= 338 || source < 23) return \"N\";\r\n        if (source < 68)  return \"N\u00d8\";\r\n        if (source < 113) return \"\u00d8\";\r\n        if (source < 158) return \"S\u00d8\";\r\n        if (source < 203) return \"S\";\r\n        if (source < 248) return \"SV\";\r\n        if (source < 293) return \"V\";\r\n        return \"NV\";\r\n    }\r\n \r\n    function insertWindArrow(id, rotation) {\r\n        document.getElementById(id).innerHTML = `\r\n            <svg width=\"40\" height=\"40\" viewBox=\"0 0 100 100\"\r\n                 style=\"transform: rotate(${rotation}deg); transition:0.2s;\">\r\n                <line x1=\"50\" y1=\"95\" x2=\"50\" y2=\"28\"\r\n                      stroke=\"#333\" stroke-width=\"7\" stroke-linecap=\"round\"\/>\r\n                <polygon points=\"50,8 62,28 50,22 38,28\" fill=\"#333\"\/>\r\n            <\/svg>\r\n        `;\r\n    }\r\n \r\n    google.charts.load('current', {packages:['corechart']});\r\n    google.charts.setOnLoadCallback(() => drawChart(defaultHours));\r\n \r\n    const slider = document.getElementById(\"windSlider\");\r\n    const sliderValue = document.getElementById(\"windSliderValue\");\r\n    let sliderInitialized = false;\r\n \r\n    slider.addEventListener(\"input\", () => {\r\n        if (!sliderInitialized) return;\r\n        sliderValue.textContent = slider.value;\r\n        drawChart(parseInt(slider.value));\r\n    });\r\n \r\n    setTimeout(() => sliderInitialized = true, 50);\r\n \r\n    function fmt(dt) {\r\n        return dt.toLocaleString(\"da-DK\", {\r\n            weekday:\"short\",\r\n            hour:\"2-digit\",\r\n            minute:\"2-digit\"\r\n        });\r\n    }\r\n \r\n    function drawChart(hours) {\r\n \r\n        const rows = chartRows.slice(0, hours);\r\n        const dirs = dirRows.slice(0, hours);\r\n \r\n        const speeds = rows.map(r => r[1]);\r\n        const maxVal = Math.max(...speeds);\r\n        const minVal = Math.min(...speeds);\r\n \r\n        const maxIndex = speeds.indexOf(maxVal);\r\n        const minIndex = speeds.indexOf(minVal);\r\n \r\n        const maxTime = rows[maxIndex][0];\r\n        const minTime = rows[minIndex][0];\r\n \r\n        \/\/ MAX TILE\r\n        document.getElementById(\"windMaxValue\").textContent = maxVal.toFixed(1)+\" m\/s\";\r\n        document.getElementById(\"windMaxTime\").textContent = fmt(maxTime);\r\n        const maxDir = dirs[maxIndex][2];\r\n        insertWindArrow(\"windMaxArrow\", (maxDir + 360) % 360);\r\n        document.getElementById(\"windMaxDirText\").textContent = degToCompassText(maxDir);\r\n \r\n        \/\/ MIN TILE\r\n        document.getElementById(\"windMinValue\").textContent = minVal.toFixed(1)+\" m\/s\";\r\n        document.getElementById(\"windMinTime\").textContent = fmt(minTime);\r\n        const minDir = dirs[minIndex][2];\r\n        insertWindArrow(\"windMinArrow\", (minDir + 360) % 360);\r\n        document.getElementById(\"windMinDirText\").textContent = degToCompassText(minDir);\r\n \r\n        \/\/ CURRENT FORECAST\r\n        const now = new Date();\r\n        let nowIndex = rows.length - 1;\r\n        for (let i=0; i<rows.length; i++) {\r\n            if (rows[i][0] >= now) { nowIndex = i; break; }\r\n        }\r\n \r\n        const nowVal = rows[nowIndex][1];\r\n        const nowTime = rows[nowIndex][0];\r\n        const nowDir = dirs[nowIndex][2];\r\n \r\n        document.getElementById(\"windNowValue\").textContent = nowVal.toFixed(1)+\" m\/s\";\r\n        document.getElementById(\"windNowTime\").textContent = fmt(nowTime);\r\n        insertWindArrow(\"windNowArrow\", (nowDir + 360) % 360);\r\n        document.getElementById(\"windNowDirText\").textContent = degToCompassText(nowDir);\r\n \r\n        \/\/ NEXT FORECAST\r\n        const nextIndex = nowIndex + 1 < rows.length ? nowIndex + 1 : nowIndex;\r\n        const nextVal = rows[nextIndex][1];\r\n        const nextTime = rows[nextIndex][0];\r\n        const nextDir = dirs[nextIndex][2];\r\n \r\n        const increasing = nextVal > nowVal;\r\n        const trendArrow = increasing ? \"\u25b2\" : \"\u25bc\";\r\n        const trendColor = increasing ? \"#d11a1a\" : \"#1a8f1a\";\r\n \r\n        document.getElementById(\"windTrendValue\").textContent = nextVal.toFixed(1)+\" m\/s\";\r\n        document.getElementById(\"windTrendArrow\").textContent = trendArrow;\r\n        document.getElementById(\"windTrendArrow\").style.color = trendColor;\r\n        document.getElementById(\"windTrendValue\").style.color = trendColor;\r\n        document.getElementById(\"windTrendTime\").textContent = fmt(nextTime);\r\n \r\n        insertWindArrow(\"windTrendArrowDir\", (nextDir + 360) % 360);\r\n        document.getElementById(\"windTrendDirText\").textContent = degToCompassText(nextDir);\r\n \r\n        \/\/ DRAW CHART\r\n        const wrapper = document.getElementById(\"fcoo-wind-wrapper\");\r\n        wrapper.querySelectorAll(\".wind-arrow\").forEach(el => el.remove());\r\n        wrapper.querySelectorAll(\".current-time-line\").forEach(el => el.remove());\r\n \r\n        const data = new google.visualization.DataTable();\r\n        data.addColumn('datetime', 'Tid');\r\n        data.addColumn('number', 'Vind (m\/s)');\r\n        data.addColumn({type:'string', role:'tooltip', p:{html:true}});\r\n \r\n        rows.forEach((r,i) => {\r\n            const date = r[0];\r\n            const speed = r[1];\r\n            const dir = dirs[i][2];\r\n            const dirText = degToCompassText(dir);\r\n \r\n            const tooltip = `\r\n                <div style=\"padding:6px;\">\r\n                    <strong>${speed.toFixed(1)} m\/s<\/strong><br>\r\n                    ${dir.toFixed(0)}\u00b0 \u2013 ${dirText}\r\n                <\/div>\r\n            `;\r\n \r\n            data.addRow([date, speed, tooltip]);\r\n        });\r\n \r\n        const options = {\r\n            title: \"FCOO vindprognose (\"+hours+\" timer)\",\r\n            legend: {position:\"bottom\"},\r\n            animation: {startup:true, duration:20, easing:\"linear\"},\r\n            crosshair: {trigger:\"both\"},\r\n            series: {0:{type:\"line\", color:\"#1a73e8\", lineWidth:3}},\r\n            vAxes: {0:{title:\"Vindhastighed (m\/s)\"}},\r\n            hAxis: {\r\n                format: \"HH:mm\",     \/\/ \u2190 24\u2011timers format\r\n                gridlines: { count: -1 }\r\n            },\r\n            pointSize:5,\r\n            curveType:\"function\",\r\n            tooltip:{isHtml:true},\r\n            chartArea:{left:60, right:30, top:50, bottom:60}\r\n        };\r\n \r\n \r\n        const chart = new google.visualization.LineChart(\r\n            document.getElementById(\"curve_chart_fcoo_wind\")\r\n        );\r\n \r\n        google.visualization.events.addListener(chart, 'ready', () => {\r\n            requestAnimationFrame(() => {\r\n                requestAnimationFrame(() => {\r\n                    drawArrows(chart, dirs);\r\n                    drawNowLine(chart);\r\n                });\r\n            });\r\n        });\r\n \r\n        chart.draw(data, options);\r\n    }\r\n \r\n    function drawArrows(chart, dirs) {\r\n \r\n        const wrapper = document.getElementById(\"fcoo-wind-wrapper\");\r\n        const layout = chart.getChartLayoutInterface();\r\n \r\n        dirs.forEach(row => {\r\n \r\n            const date = row[0];\r\n            const speed = row[1];\r\n            const dir = row[2];\r\n \r\n            if (date.getHours() % 3 !== 0) return;\r\n \r\n            const x = layout.getXLocation(date);\r\n            const y = layout.getYLocation(speed);\r\n \r\n            if (isNaN(x) || isNaN(y)) return;\r\n \r\n            const arrow = document.createElement(\"div\");\r\n            arrow.className = \"wind-arrow\";\r\n \r\n            const rotation = (dir + 360) % 360;\r\n \r\n            arrow.style.left = (x - 20)+\"px\";\r\n            arrow.style.top  = (y - 20)+\"px\";\r\n            arrow.style.transform = \"rotate(\"+rotation+\"deg)\";\r\n \r\n            arrow.innerHTML = `\r\n                <svg width=\"40\" height=\"40\" viewBox=\"0 0 100 100\">\r\n                    <line x1=\"50\" y1=\"95\" x2=\"50\" y2=\"28\"\r\n                          stroke=\"#333\" stroke-width=\"7\" stroke-linecap=\"round\"\/>\r\n                    <polygon points=\"50,8 62,28 50,22 38,28\" fill=\"#333\"\/>\r\n                <\/svg>\r\n            `;\r\n \r\n            wrapper.appendChild(arrow);\r\n        });\r\n    }\r\n \r\n    function drawNowLine(chart) {\r\n \r\n        const wrapper = document.getElementById(\"fcoo-wind-wrapper\");\r\n        const layout = chart.getChartLayoutInterface();\r\n \r\n        wrapper.querySelectorAll(\".current-time-line\").forEach(el => el.remove());\r\n \r\n        const now = new Date();\r\n        const x = layout.getXLocation(now);\r\n \r\n        if (isNaN(x)) return;\r\n \r\n        const box = layout.getChartAreaBoundingBox();\r\n \r\n        const line = document.createElement(\"div\");\r\n        line.className = \"current-time-line\";\r\n        line.style.left = x+\"px\";\r\n        line.style.top = box.top+\"px\";\r\n        line.style.height = box.height+\"px\";\r\n \r\n        wrapper.appendChild(line);\r\n    }\r\n \r\n});\r\n<\/script>\r\n \r\n\n<p>&nbsp;<\/p>\n<hr \/>\n<hr \/>\n<p><span style=\"font-size: 14pt; color: #d10d0d;\"><span style=\"font-size: 18pt;\">Prognose for nedb\u00f8r i Gamb\u00f8t de n\u00e6ste 48 timer:<\/span><\/span><\/p>\n<style>\r\n.current-time-line {\r\n    position: absolute;\r\n    border-left: 2px dotted red;\r\n    pointer-events: none;\r\n}\r\n<\/style>\r\n \r\n<!-- TOTAL PRECIP BOX -->\r\n<div id=\"precipTotalBox\"\r\n     style=\"margin-bottom: 12px; padding: 10px; background: #eef6ff; border-left: 4px solid #1a73e8; border-radius: 4px; font-size: 18px; font-weight: bold;\">\r\n    Total nedb\u00f8r: 4.6 mm\r\n<\/div>\r\n \r\n<div id=\"fcoo-precip-wrapper\" style=\"width:100%; max-width:100%; height:400px; position:relative;\">\r\n    <div id=\"curve_chart_fcoo_precip\" style=\"width:100%; height:100%; position:relative;\"><\/div>\r\n<\/div>\r\n \r\n<div style=\"margin-top: 12px; padding: 6px 4px; background: #f7f7f7; border-radius: 4px;\">\r\n    <label for=\"precipSlider\" style=\"font-weight: bold; display: block; margin-bottom: 6px;\">\r\n        V\u00e6lg periode\r\n    <\/label>\r\n \r\n    <input id=\"precipSlider\" type=\"range\"\r\n           min=\"6\" max=\"48\" step=\"3\"\r\n           value=\"48\"\r\n           style=\"width:100%;\">\r\n \r\n    <div style=\"text-align:center; margin-top:6px; font-size:16px;\">\r\n        <span id=\"precipSliderValue\" style=\"font-weight:bold;\">\r\n            48        <\/span> timer\r\n    <\/div>\r\n<\/div>\r\n \r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n \r\n    const chartRows = [[new Date(2026, 8, 1, 5, 00),0],[new Date(2026, 8, 1, 6, 00),0],[new Date(2026, 8, 1, 7, 00),0],[new Date(2026, 8, 1, 8, 00),0],[new Date(2026, 8, 1, 9, 00),0],[new Date(2026, 8, 1, 10, 00),0],[new Date(2026, 8, 1, 11, 00),0],[new Date(2026, 8, 1, 12, 00),0],[new Date(2026, 8, 1, 13, 00),0],[new Date(2026, 8, 1, 14, 00),0],[new Date(2026, 8, 1, 15, 00),0],[new Date(2026, 8, 1, 16, 00),0],[new Date(2026, 8, 1, 17, 00),0],[new Date(2026, 8, 1, 18, 00),0],[new Date(2026, 8, 1, 19, 00),0.09844999999999999584776588790191453881561756134033203125],[new Date(2026, 8, 1, 20, 00),0.09844999999999999584776588790191453881561756134033203125],[new Date(2026, 8, 1, 21, 00),0.09844999999999999584776588790191453881561756134033203125],[new Date(2026, 8, 1, 22, 00),0.09844999999999999584776588790191453881561756134033203125],[new Date(2026, 8, 1, 23, 00),0],[new Date(2026, 8, 2, 0, 00),0],[new Date(2026, 8, 2, 1, 00),0],[new Date(2026, 8, 2, 2, 00),0],[new Date(2026, 8, 2, 3, 00),0],[new Date(2026, 8, 2, 4, 00),0],[new Date(2026, 8, 2, 5, 00),0],[new Date(2026, 8, 2, 6, 00),0],[new Date(2026, 8, 2, 7, 00),0],[new Date(2026, 8, 2, 8, 00),0],[new Date(2026, 8, 2, 9, 00),0],[new Date(2026, 8, 2, 10, 00),0.09844999999999999584776588790191453881561756134033203125],[new Date(2026, 8, 2, 11, 00),0.295169999999999987938537060472299344837665557861328125],[new Date(2026, 8, 2, 12, 00),0.6889600000000000168398628375143744051456451416015625],[new Date(2026, 8, 2, 13, 00),0.78759999999999996678212710321531631052494049072265625],[new Date(2026, 8, 2, 14, 00),0.1968999999999999916955317758038290776312351226806640625],[new Date(2026, 8, 2, 15, 00),0.09844999999999999584776588790191453881561756134033203125],[new Date(2026, 8, 2, 16, 00),1.0829999999999999626965063725947402417659759521484375],[new Date(2026, 8, 2, 17, 00),0.9843800000000000327560201185406185686588287353515625],[new Date(2026, 8, 2, 18, 00),0],[new Date(2026, 8, 2, 19, 00),0],[new Date(2026, 8, 2, 20, 00),0],[new Date(2026, 8, 2, 21, 00),0],[new Date(2026, 8, 2, 22, 00),0],[new Date(2026, 8, 2, 23, 00),0],[new Date(2026, 8, 3, 0, 00),0],[new Date(2026, 8, 3, 1, 00),0],[new Date(2026, 8, 3, 2, 00),0],[new Date(2026, 8, 3, 3, 00),0],[new Date(2026, 8, 3, 4, 00),0],[new Date(2026, 8, 3, 5, 00),0],[new Date(2026, 8, 3, 6, 00),0],[new Date(2026, 8, 3, 7, 00),0],[new Date(2026, 8, 3, 8, 00),0],[new Date(2026, 8, 3, 9, 00),0],[new Date(2026, 8, 3, 10, 00),0],[new Date(2026, 8, 3, 11, 00),0],[new Date(2026, 8, 3, 12, 00),0],[new Date(2026, 8, 3, 13, 00),0],[new Date(2026, 8, 3, 14, 00),0],[new Date(2026, 8, 3, 15, 00),0],[new Date(2026, 8, 3, 16, 00),0],[new Date(2026, 8, 3, 17, 00),0]];\r\n    const defaultHours = 48;\r\n \r\n    google.charts.load('current', {packages:['corechart']});\r\n    google.charts.setOnLoadCallback(() => drawChart(defaultHours));\r\n \r\n    const slider = document.getElementById(\"precipSlider\");\r\n    const sliderValue = document.getElementById(\"precipSliderValue\");\r\n    const totalBox = document.getElementById(\"precipTotalBox\");\r\n    let sliderInitialized = false;\r\n \r\n    slider.addEventListener(\"input\", () => {\r\n        if (!sliderInitialized) return;\r\n        const h = parseInt(slider.value);\r\n        sliderValue.textContent = h;\r\n        drawChart(h);\r\n    });\r\n \r\n    setTimeout(() => sliderInitialized = true, 50);\r\n \r\n    function drawChart(hours) {\r\n \r\n        const rows = chartRows.slice(0, hours);\r\n \r\n        \/\/ Calculate dynamic total precipitation\r\n        let total = 0;\r\n        rows.forEach(r => total += r[1]);\r\n        total = Math.round(total * 10) \/ 10;\r\n \r\n        \/\/ Update total box\r\n        totalBox.textContent = \"Total nedb\u00f8r de n\u00e6ste 48 timer: \" + total + \" mm\";\r\n \r\n        const data = new google.visualization.DataTable();\r\n        data.addColumn('datetime', 'Tid');\r\n        data.addColumn('number', 'Nedb\u00f8r (mm\/t)');\r\n \r\n        rows.forEach(r => {\r\n            data.addRow([r[0], r[1]]);\r\n        });\r\n \r\n        const options = {\r\n            title: \"FCOO nedb\u00f8r (\" + hours + \" timer)\",\r\n            legend: { position: \"bottom\" },\r\n            animation: { startup: true, duration: 20, easing: \"linear\" },\r\n            crosshair: { trigger: \"both\" },\r\n            vAxes: {\r\n                0: { title: \"Nedb\u00f8r (mm\/t)\" }\r\n            },\r\n            hAxis: {\r\n                format: \"HH:mm\",\r\n                gridlines: { count: -1 }\r\n            },\r\n \r\n            chartArea: { left: 60, right: 30, top: 50, bottom: 60 },\r\n            bar: { groupWidth: \"85%\" },\r\n            colors: [\"#1a73e8\"]\r\n        };\r\n \r\n        const chart = new google.visualization.ColumnChart(\r\n            document.getElementById(\"curve_chart_fcoo_precip\")\r\n        );\r\n \r\n        google.visualization.events.addListener(chart, 'ready', () => {\r\n            requestAnimationFrame(() => {\r\n                requestAnimationFrame(() => {\r\n                    drawNowLine(chart);\r\n                });\r\n            });\r\n        });\r\n \r\n        chart.draw(data, options);\r\n    }\r\n \r\n    function drawNowLine(chart) {\r\n \r\n        const wrapper = document.getElementById(\"fcoo-precip-wrapper\");\r\n        const layout = chart.getChartLayoutInterface();\r\n \r\n        wrapper.querySelectorAll(\".current-time-line\").forEach(el => el.remove());\r\n \r\n        const now = new Date();\r\n        const x = layout.getXLocation(now);\r\n \r\n        if (isNaN(x)) return;\r\n \r\n        const box = layout.getChartAreaBoundingBox();\r\n \r\n        const line = document.createElement(\"div\");\r\n        line.className = \"current-time-line\";\r\n        line.style.left = x + \"px\";\r\n        line.style.top = box.top + \"px\";\r\n        line.style.height = box.height + \"px\";\r\n \r\n        wrapper.appendChild(line);\r\n    }\r\n \r\n});\r\n<\/script>\r\n \r\n\n<p>&nbsp;<\/p>\n<hr \/>\n<hr \/>\n<p><span style=\"font-size: 14pt; color: #d10d0d;\"><span style=\"font-size: 18pt;\">Prognose for vandstand i Gamb\u00f8t de n\u00e6ste 48 timer:<\/span><\/span><\/p>\n \r\n<!-- Tiles -->\r\n<div id=\"sealevelInfoTiles\">\r\n \r\n     <!-- LATEST -->\r\n    <div id=\"sealevelNowBox\" class=\"sealevel-tile\">\r\n        <div class=\"sealevel-title\">Aktuel m\u00e5ling<\/div>\r\n        <div id=\"sealevelNowValue\" class=\"sealevel-value\"><\/div>\r\n        <div id=\"sealevelNowTime\"  class=\"sealevel-time\"><\/div>\r\n    <\/div>\r\n \r\n    <div id=\"sealevelTrendBox\" class=\"sealevel-tile\">\r\n        <div class=\"sealevel-title\">N\u00e6ste prognose<\/div>\r\n        <div class=\"sealevel-value\">\r\n            <span id=\"sealevelTrendValue\"><\/span>\r\n            <span id=\"sealevelTrendArrow\" class=\"sealevel-arrow\"><\/span>\r\n        <\/div>\r\n    <\/div>\r\n \r\n    <div id=\"sealevelMaxBox\" class=\"sealevel-tile\">\r\n        <div class=\"sealevel-title\">Max vandstand<\/div>\r\n        <div id=\"sealevelMaxValue\" class=\"sealevel-value\"><\/div>\r\n        <div id=\"sealevelMaxTime\" class=\"sealevel-time\"><\/div>\r\n    <\/div>\r\n \r\n    <div id=\"sealevelMinBox\" class=\"sealevel-tile\">\r\n        <div class=\"sealevel-title\">Min vandstand<\/div>\r\n        <div id=\"sealevelMinValue\" class=\"sealevel-value\"><\/div>\r\n        <div id=\"sealevelMinTime\" class=\"sealevel-time\"><\/div>\r\n    <\/div>\r\n \r\n<\/div>\r\n \r\n<style>\r\n.current-time-line {\r\n    position: absolute;\r\n    border-left: 2px dotted red;\r\n    pointer-events: none;\r\n}\r\n \r\n#sealevelInfoTiles {\r\n    display:flex;\r\n    gap: 12px;\r\n    margin-bottom: 14px;\r\n    flex-wrap:wrap;\r\n}\r\n \r\n.sealevel-tile {\r\n    flex: 1;\r\n    background: #e8f4ff;\r\n    border-left: 6px solid #1a73e8;\r\n    padding: 12px 16px;\r\n    border-radius: 4px;\r\n    font-family: Arial, sans-serif;\r\n    display: flex;\r\n    flex-direction: column;\r\n}\r\n \r\n.sealevel-title { font-size: 15px; font-weight: bold; margin-bottom: 4px; }\r\n.sealevel-value { font-size: 20px; font-weight: bold; margin-bottom: 4px; }\r\n.sealevel-time  { font-size: 14px; opacity: 0.8; }\r\n.sealevel-arrow { font-size: 22px; font-weight: bold; }\r\n<\/style>\r\n \r\n<div id=\"fcoo-sealevel-wrapper\" style=\"width:100%; max-width:100%; height:400px; position:relative;\">\r\n    <div id=\"curve_chart_fcoo_sealevel\" style=\"width:100%; height:100%; position:relative;\"><\/div>\r\n<\/div>\r\n \r\n<div style=\"margin-top: 12px; padding: 6px 4px; background: #f7f7f7; border-radius: 4px;\">\r\n    <label for=\"sealevelSlider\" style=\"font-weight: bold; display: block; margin-bottom: 6px;\">\r\n        V\u00e6lg periode\r\n    <\/label>\r\n \r\n    <input id=\"sealevelSlider\" type=\"range\"\r\n           min=\"6\" max=\"48\" step=\"3\"\r\n           value=\"48\"\r\n           style=\"width:100%;\">\r\n \r\n    <div style=\"text-align:center; margin-top:6px; font-size:16px;\">\r\n        <span id=\"sealevelSliderValue\" style=\"font-weight:bold;\">\r\n            48        <\/span> timer\r\n    <\/div>\r\n<\/div>\r\n \r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n \r\n    let chartRows = [[\"2026-09-01T01:00:00+02:00\",27],[\"2026-09-01T02:00:00+02:00\",35],[\"2026-09-01T03:00:00+02:00\",36],[\"2026-09-01T04:00:00+02:00\",32],[\"2026-09-01T05:00:00+02:00\",26],[\"2026-09-01T06:00:00+02:00\",22],[\"2026-09-01T07:00:00+02:00\",14],[\"2026-09-01T08:00:00+02:00\",8],[\"2026-09-01T09:00:00+02:00\",3],[\"2026-09-01T10:00:00+02:00\",1],[\"2026-09-01T11:00:00+02:00\",5],[\"2026-09-01T12:00:00+02:00\",14],[\"2026-09-01T13:00:00+02:00\",19],[\"2026-09-01T14:00:00+02:00\",25],[\"2026-09-01T15:00:00+02:00\",30],[\"2026-09-01T16:00:00+02:00\",31],[\"2026-09-01T17:00:00+02:00\",26],[\"2026-09-01T18:00:00+02:00\",24],[\"2026-09-01T19:00:00+02:00\",19],[\"2026-09-01T20:00:00+02:00\",14],[\"2026-09-01T21:00:00+02:00\",10],[\"2026-09-01T22:00:00+02:00\",7],[\"2026-09-01T23:00:00+02:00\",10],[\"2026-09-02T00:00:00+02:00\",14],[\"2026-09-02T01:00:00+02:00\",18],[\"2026-09-02T02:00:00+02:00\",23],[\"2026-09-02T03:00:00+02:00\",30],[\"2026-09-02T04:00:00+02:00\",32],[\"2026-09-02T05:00:00+02:00\",28],[\"2026-09-02T06:00:00+02:00\",26],[\"2026-09-02T07:00:00+02:00\",22],[\"2026-09-02T08:00:00+02:00\",14],[\"2026-09-02T09:00:00+02:00\",5],[\"2026-09-02T10:00:00+02:00\",0],[\"2026-09-02T11:00:00+02:00\",-1],[\"2026-09-02T12:00:00+02:00\",0],[\"2026-09-02T13:00:00+02:00\",1],[\"2026-09-02T14:00:00+02:00\",5],[\"2026-09-02T15:00:00+02:00\",13],[\"2026-09-02T16:00:00+02:00\",18],[\"2026-09-02T17:00:00+02:00\",20],[\"2026-09-02T18:00:00+02:00\",20],[\"2026-09-02T19:00:00+02:00\",15],[\"2026-09-02T20:00:00+02:00\",10],[\"2026-09-02T21:00:00+02:00\",7],[\"2026-09-02T22:00:00+02:00\",7],[\"2026-09-02T23:00:00+02:00\",10],[\"2026-09-03T00:00:00+02:00\",13],[\"2026-09-03T01:00:00+02:00\",18],[\"2026-09-03T02:00:00+02:00\",25],[\"2026-09-03T03:00:00+02:00\",34],[\"2026-09-03T04:00:00+02:00\",37],[\"2026-09-03T05:00:00+02:00\",37],[\"2026-09-03T06:00:00+02:00\",37],[\"2026-09-03T07:00:00+02:00\",36],[\"2026-09-03T08:00:00+02:00\",31]];   \/\/ [[\"2026-02-24T11:00:00+01:00\", 2], ...]\r\n    const latestValue = 0;\r\n    const latestTime = \"N\/A\";\r\n \r\n \r\n    \/\/ \u2b50 Convert ISO timestamps \u2192 real Date objects\r\n    for (let i = 0; i < chartRows.length; i++) {\r\n        chartRows[i][0] = new Date(chartRows[i][0]);\r\n    }\r\n \r\n    const defaultHours = 48;\r\n \r\n    google.charts.load('current', {packages:['corechart']});\r\n    google.charts.setOnLoadCallback(() => drawChart(defaultHours));\r\n \r\n    const slider = document.getElementById(\"sealevelSlider\");\r\n    const sliderValue = document.getElementById(\"sealevelSliderValue\");\r\n    let sliderInitialized = false;\r\n \r\n    slider.addEventListener(\"input\", () => {\r\n        if (!sliderInitialized) return;\r\n        const h = parseInt(slider.value);\r\n        sliderValue.textContent = h;\r\n        drawChart(h);\r\n    });\r\n \r\n    setTimeout(() => sliderInitialized = true, 50);\r\n \r\n    function fmt(dt) {\r\n        return dt.toLocaleString(\"da-DK\", {\r\n            weekday: \"short\",\r\n            hour: \"2-digit\",\r\n            minute: \"2-digit\"\r\n        });\r\n    }\r\n \r\n    \/\/ \u2b50 DMI LOGIC: find index of forecast row closest to NOW\r\n    function getCurrentForecastRowIndex(rows) {\r\n        const now = Date.now();\r\n \r\n        let closestIndex = 0;\r\n        let minDiff = Math.abs(rows[0][0].getTime() - now);\r\n \r\n        for (let i = 1; i < rows.length; i++) {\r\n            const diff = Math.abs(rows[i][0].getTime() - now);\r\n            if (diff < minDiff) {\r\n                minDiff = diff;\r\n                closestIndex = i;\r\n            }\r\n        }\r\n        return closestIndex;\r\n    }\r\n \r\n    function drawChart(hours) {\r\n \r\n        const rows = chartRows.slice(0, hours);\r\n \r\n        \/\/ \u2b50 Max + Min\r\n        const values = rows.map(r => r[1]);\r\n        const maxVal = Math.max(...values);\r\n        const minVal = Math.min(...values);\r\n \r\n        const maxIndex = values.indexOf(maxVal);\r\n        const minIndex = values.indexOf(minVal);\r\n \r\n        document.getElementById(\"sealevelMaxValue\").textContent = maxVal + \" cm\";\r\n        document.getElementById(\"sealevelMaxTime\").textContent = fmt(rows[maxIndex][0]);\r\n \r\n        document.getElementById(\"sealevelMinValue\").textContent = minVal + \" cm\";\r\n        document.getElementById(\"sealevelMinTime\").textContent = fmt(rows[minIndex][0]);\r\n \r\n        document.getElementById(\"sealevelNowValue\").textContent = latestValue + \" cm\";\r\n        document.getElementById(\"sealevelNowTime\").textContent =  latestTime ;\r\n \r\n \r\n        \/\/ \u2b50 TREND: use FULL dataset, not sliced rows\r\n        let trend = 0;\r\n        let arrow = \"\u2013\";\r\n        let color = \"#444\";\r\n \r\n        if (chartRows.length > 1) {\r\n \r\n            const idx = getCurrentForecastRowIndex(chartRows);\r\n \r\n            if (idx < chartRows.length - 1) {\r\n                const currentVal = chartRows[idx][1];\r\n                const nextVal    = chartRows[idx + 1][1];\r\n \r\n                trend = nextVal;\r\n                arrow = trend > currentVal ? \"\u25b2\" : trend < currentVal ? \"\u25bc\" : \"\u2013\";\r\n                color = trend > currentVal ? \"#1a8f1a\" : trend < currentVal ? \"#d11a1a\" : \"#444\";\r\n            }\r\n        }\r\n \r\n        document.getElementById(\"sealevelTrendValue\").textContent =\r\n            trend.toFixed(1).replace(\".\", \",\") + \" cm\";\r\n \r\n        document.getElementById(\"sealevelTrendArrow\").textContent = arrow;\r\n        document.getElementById(\"sealevelTrendArrow\").style.color = color;\r\n        document.getElementById(\"sealevelTrendValue\").style.color = color;\r\n \r\n        \/\/ \u2b50 Draw chart\r\n        const data = new google.visualization.DataTable();\r\n        data.addColumn('datetime', 'Tid');\r\n        data.addColumn('number', 'Vandstand (cm)');\r\n \r\n        rows.forEach(r => data.addRow([r[0], r[1]]));\r\n \r\n        const options = {\r\n            title: \"FCOO vandstandsprognose (\" + hours + \" timer)\",\r\n            legend: { position: \"bottom\" },\r\n            animation: { startup: true, duration: 20, easing: \"linear\" },\r\n            crosshair: { trigger: \"both\" },\r\n            series: {\r\n                0: { type: \"line\", color: \"#1a73e8\", lineWidth: 3 }\r\n            },\r\n            vAxes: {\r\n                0: { title: \"Vandstand (cm)\" }\r\n            },\r\n            hAxis: {\r\n                format: \"HH:mm\",\r\n                gridlines: { count: -1 }\r\n            },\r\n            pointSize: 5,\r\n            curveType: \"function\",\r\n            chartArea: { left: 60, right: 30, top: 50, bottom: 60 }\r\n        };\r\n \r\n        const chart = new google.visualization.LineChart(\r\n            document.getElementById(\"curve_chart_fcoo_sealevel\")\r\n        );\r\n \r\n        google.visualization.events.addListener(chart, 'ready', () => {\r\n            requestAnimationFrame(() => {\r\n                requestAnimationFrame(() => {\r\n                    drawNowLine(chart);\r\n                });\r\n            });\r\n        });\r\n \r\n        chart.draw(data, options);\r\n    }\r\n \r\n    function drawNowLine(chart) {\r\n \r\n        const wrapper = document.getElementById(\"fcoo-sealevel-wrapper\");\r\n        const layout = chart.getChartLayoutInterface();\r\n \r\n        wrapper.querySelectorAll(\".current-time-line\").forEach(el => el.remove());\r\n \r\n        const now = new Date();\r\n        const x = layout.getXLocation(now);\r\n \r\n        if (isNaN(x)) return;\r\n \r\n        const box = layout.getChartAreaBoundingBox();\r\n \r\n        const line = document.createElement(\"div\");\r\n        line.className = \"current-time-line\";\r\n        line.style.left = x + \"px\";\r\n        line.style.top = box.top + \"px\";\r\n        line.style.height = box.height + \"px\";\r\n \r\n        wrapper.appendChild(line);\r\n    }\r\n \r\n});\r\n<\/script>\r\n \r\n\n<p>&nbsp;<\/p>\n<hr \/>\n<hr \/>\n<p><span style=\"font-size: 14pt; color: #d10d0d;\"><span style=\"font-size: 18pt;\">Prognose for lufttemperatur i Gamb\u00f8t de n\u00e6ste 48 timer:<\/span><\/span><\/p>\n<style>\r\n.current-time-line {\r\n    position: absolute;\r\n    border-left: 2px dotted red;\r\n    pointer-events: none;\r\n}\r\n<\/style>\r\n \r\n<!-- MIN\/MAX BOX -->\r\n<div id=\"airtempMinMaxBox\"\r\n     style=\"margin-bottom: 12px; padding: 10px; background: #fff4e6; border-left: 4px solid #e67300; border-radius: 4px; font-size: 18px; font-weight: bold;\">\r\n    <!-- JS will fill this -->\r\n<\/div>\r\n \r\n<div id=\"fcoo-airtemp-wrapper\" style=\"width:100%; max-width:100%; height:400px; position:relative;\">\r\n    <div id=\"curve_chart_fcoo_airtemp\" style=\"width:100%; height:100%; position:relative;\"><\/div>\r\n<\/div>\r\n \r\n<div style=\"margin-top: 12px; padding: 6px 4px; background: #f7f7f7; border-radius: 4px;\">\r\n    <label for=\"airtempSlider\" style=\"font-weight: bold; display: block; margin-bottom: 6px;\">\r\n        V\u00e6lg periode\r\n    <\/label>\r\n \r\n    <input id=\"airtempSlider\" type=\"range\"\r\n           min=\"6\" max=\"48\" step=\"3\"\r\n           value=\"48\"\r\n           style=\"width:100%;\">\r\n \r\n    <div style=\"text-align:center; margin-top:6px; font-size:16px;\">\r\n        <span id=\"airtempSliderValue\" style=\"font-weight:bold;\">\r\n            48        <\/span> timer\r\n    <\/div>\r\n<\/div>\r\n \r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n \r\n    const chartRows = [[new Date(2026, 8, 1, 5, 00),15.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 6, 00),15.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 7, 00),15.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 8, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 9, 00),16.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 10, 00),17.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 11, 00),18.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 12, 00),17.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 13, 00),18.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 14, 00),18.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 15, 00),18.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 16, 00),18.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 17, 00),18.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 18, 00),18.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 19, 00),17.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 20, 00),16.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 21, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 22, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 1, 23, 00),15.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 0, 00),14.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 1, 00),14.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 2, 00),14.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 3, 00),14.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 4, 00),15.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 5, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 6, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 7, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 8, 00),16.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 9, 00),16.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 10, 00),17.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 11, 00),16.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 12, 00),16.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 13, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 14, 00),15.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 15, 00),17.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 16, 00),18.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 17, 00),16.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 18, 00),18.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 19, 00),17.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 20, 00),17.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 21, 00),16.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 22, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 2, 23, 00),15.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 0, 00),15.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 1, 00),15.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 2, 00),15.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 3, 00),15.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 4, 00),15.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 5, 00),15.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 6, 00),14.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 7, 00),14.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 8, 00),15.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 9, 00),16.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 10, 00),17.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 11, 00),17.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 12, 00),17.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 13, 00),17.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 14, 00),18.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 15, 00),17.300000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 16, 00),17.800000000000000710542735760100185871124267578125],[new Date(2026, 8, 3, 17, 00),18.300000000000000710542735760100185871124267578125]];\r\n    const defaultHours = 48;\r\n \r\n    const minMaxBox = document.getElementById(\"airtempMinMaxBox\");\r\n \r\n    google.charts.load('current', {packages:['corechart']});\r\n    google.charts.setOnLoadCallback(() => drawChart(defaultHours));\r\n \r\n    const slider = document.getElementById(\"airtempSlider\");\r\n    const sliderValue = document.getElementById(\"airtempSliderValue\");\r\n    let sliderInitialized = false;\r\n \r\n    slider.addEventListener(\"input\", () => {\r\n        if (!sliderInitialized) return;\r\n        const h = parseInt(slider.value);\r\n        sliderValue.textContent = h;\r\n        drawChart(h);\r\n    });\r\n \r\n    setTimeout(() => sliderInitialized = true, 50);\r\n \r\n    function drawChart(hours) {\r\n \r\n        const rows = chartRows.slice(0, hours);\r\n \r\n        \/\/ Calculate dynamic min\/max\r\n        const temps = rows.map(r => r[1]);\r\n        const minT = Math.min(...temps);\r\n        const maxT = Math.max(...temps);\r\n \r\n        minMaxBox.textContent = \"Min: \" + minT + \"\u00b0C   |   Max: \" + maxT + \"\u00b0C\";\r\n \r\n        const data = new google.visualization.DataTable();\r\n        data.addColumn('datetime', 'Tid');\r\n        data.addColumn('number', 'Lufttemperatur (\u00b0C)');\r\n \r\n        rows.forEach(r => {\r\n            data.addRow([r[0], r[1]]);\r\n        });\r\n \r\n        const options = {\r\n            title: \"FCOO lufttemperatur (\" + hours + \" timer)\",\r\n            legend: { position: \"bottom\" },\r\n            animation: { startup: true, duration: 20, easing: \"linear\" },\r\n            crosshair: { trigger: \"both\" },\r\n            series: {\r\n                0: { type: \"line\", color: \"#e67300\", lineWidth: 3 }\r\n            },\r\n            vAxes: {\r\n                0: { title: \"Lufttemperatur (\u00b0C)\" }\r\n            },\r\n            hAxis: {\r\n                format: \"HH:mm\",\r\n                gridlines: { count: -1 }\r\n            },\r\n            pointSize: 5,\r\n            curveType: \"function\",\r\n            chartArea: { left: 60, right: 30, top: 50, bottom: 60 }\r\n        };\r\n \r\n        const chart = new google.visualization.LineChart(\r\n            document.getElementById(\"curve_chart_fcoo_airtemp\")\r\n        );\r\n \r\n        google.visualization.events.addListener(chart, 'ready', () => {\r\n            requestAnimationFrame(() => {\r\n                requestAnimationFrame(() => {\r\n                    drawNowLine(chart);\r\n                });\r\n            });\r\n        });\r\n \r\n        chart.draw(data, options);\r\n    }\r\n \r\n    function drawNowLine(chart) {\r\n \r\n        const wrapper = document.getElementById(\"fcoo-airtemp-wrapper\");\r\n        const layout = chart.getChartLayoutInterface();\r\n \r\n        wrapper.querySelectorAll(\".current-time-line\").forEach(el => el.remove());\r\n \r\n        const now = new Date();\r\n        const x = layout.getXLocation(now);\r\n \r\n        if (isNaN(x)) return;\r\n \r\n        const box = layout.getChartAreaBoundingBox();\r\n \r\n        const line = document.createElement(\"div\");\r\n        line.className = \"current-time-line\";\r\n        line.style.left = x + \"px\";\r\n        line.style.top = box.top + \"px\";\r\n        line.style.height = box.height + \"px\";\r\n \r\n        wrapper.appendChild(line);\r\n    }\r\n \r\n});\r\n<\/script>\r\n \r\n\n<p>&nbsp;<\/p>\n<hr \/>\n<hr \/>\n<p><span style=\"font-size: 14pt; color: #d10d0d;\"><span style=\"font-size: 18pt;\">Prognose for lufttrykket i Gamb\u00f8t de n\u00e6ste 48 timer:<\/span><\/span><\/p>\n<style>\r\n.pressure-wrapper {\r\n    position: relative;\r\n    width: 100%;\r\n    height: 400px;\r\n}\r\n.pressure-band,\r\n.band-label,\r\n.stormrisk-band,\r\n.current-time-line {\r\n    position: absolute;\r\n    pointer-events: none;\r\n}\r\n.current-time-line {\r\n    border-left: 2px dotted red;\r\n}\r\n<\/style>\r\n \r\n<div style=\"max-width: 100%; margin: 0 auto;\">\r\n \r\n    <div class=\"pressure-wrapper\" id=\"pressureWrapper\">\r\n        <div id=\"curve_chart_fcoo_SeaLevelPressure\" style=\"width:100%; height:100%;\"><\/div>\r\n    <\/div>\r\n \r\n    <div style=\"margin-top: 12px; padding: 6px 4px; background: #f7f7f7; border-radius: 4px;\">\r\n        <label for=\"pressureSlider\" style=\"font-weight: bold; display: block; margin-bottom: 6px;\">\r\n            V\u00e6lg periode\r\n        <\/label>\r\n \r\n        <input id=\"pressureSlider\" type=\"range\"\r\n               min=\"6\" max=\"48\" step=\"3\"\r\n               value=\"44\"\r\n               style=\"width:100%;\">\r\n \r\n        <div style=\"text-align:center; margin-top:6px; font-size:16px;\">\r\n            <span id=\"pressureSliderValue\" style=\"font-weight:bold;\">\r\n                44            <\/span> timer\r\n        <\/div>\r\n    <\/div>\r\n \r\n<\/div>\r\n \r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n \r\n    const chartRows = [[new Date(2026, 8, 1, 5, 00),1010],[new Date(2026, 8, 1, 6, 00),1011],[new Date(2026, 8, 1, 7, 00),1011],[new Date(2026, 8, 1, 8, 00),1011.5],[new Date(2026, 8, 1, 9, 00),1011.5],[new Date(2026, 8, 1, 10, 00),1012.5],[new Date(2026, 8, 1, 11, 00),1012.5],[new Date(2026, 8, 1, 12, 00),1013],[new Date(2026, 8, 1, 13, 00),1013],[new Date(2026, 8, 1, 14, 00),1013],[new Date(2026, 8, 1, 15, 00),1014],[new Date(2026, 8, 1, 16, 00),1014],[new Date(2026, 8, 1, 17, 00),1014],[new Date(2026, 8, 1, 18, 00),1014],[new Date(2026, 8, 1, 19, 00),1015],[new Date(2026, 8, 1, 20, 00),1015],[new Date(2026, 8, 1, 21, 00),1015.5],[new Date(2026, 8, 1, 22, 00),1016.5],[new Date(2026, 8, 1, 23, 00),1016.5],[new Date(2026, 8, 2, 0, 00),1016.5],[new Date(2026, 8, 2, 1, 00),1017],[new Date(2026, 8, 2, 2, 00),1017],[new Date(2026, 8, 2, 3, 00),1016.5],[new Date(2026, 8, 2, 4, 00),1016.5],[new Date(2026, 8, 2, 5, 00),1017],[new Date(2026, 8, 2, 6, 00),1016.5],[new Date(2026, 8, 2, 7, 00),1016.5],[new Date(2026, 8, 2, 8, 00),1016.5],[new Date(2026, 8, 2, 9, 00),1016.5],[new Date(2026, 8, 2, 10, 00),1016.5],[new Date(2026, 8, 2, 11, 00),1016.5],[new Date(2026, 8, 2, 12, 00),1016.5],[new Date(2026, 8, 2, 13, 00),1016.5],[new Date(2026, 8, 2, 14, 00),1016.5],[new Date(2026, 8, 2, 15, 00),1015.5],[new Date(2026, 8, 2, 16, 00),1015.5],[new Date(2026, 8, 2, 17, 00),1015.5],[new Date(2026, 8, 2, 18, 00),1015.5],[new Date(2026, 8, 2, 19, 00),1015],[new Date(2026, 8, 2, 20, 00),1015.5],[new Date(2026, 8, 2, 21, 00),1015.5],[new Date(2026, 8, 2, 22, 00),1015.5],[new Date(2026, 8, 2, 23, 00),1015.5],[new Date(2026, 8, 3, 0, 00),1016.5],[new Date(2026, 8, 3, 1, 00),1016.5],[new Date(2026, 8, 3, 2, 00),1016.5],[new Date(2026, 8, 3, 3, 00),1016.5],[new Date(2026, 8, 3, 4, 00),1016.5],[new Date(2026, 8, 3, 5, 00),1015.5],[new Date(2026, 8, 3, 6, 00),1016.5],[new Date(2026, 8, 3, 7, 00),1015.5],[new Date(2026, 8, 3, 8, 00),1016.5],[new Date(2026, 8, 3, 9, 00),1015.5],[new Date(2026, 8, 3, 10, 00),1015.5],[new Date(2026, 8, 3, 11, 00),1015.5],[new Date(2026, 8, 3, 12, 00),1015],[new Date(2026, 8, 3, 13, 00),1015],[new Date(2026, 8, 3, 14, 00),1015],[new Date(2026, 8, 3, 15, 00),1014],[new Date(2026, 8, 3, 16, 00),1014],[new Date(2026, 8, 3, 17, 00),1013]];\r\n    const defaultHours = 44;\r\n \r\n    const wrapper = document.getElementById(\"pressureWrapper\");\r\n \r\n    google.charts.load(\"current\", { packages: [\"corechart\"] });\r\n    google.charts.setOnLoadCallback(() => drawChart(defaultHours));\r\n \r\n    const slider = document.getElementById(\"pressureSlider\");\r\n    const sliderValue = document.getElementById(\"pressureSliderValue\");\r\n    let sliderInitialized = false;\r\n \r\n    slider.addEventListener(\"input\", () => {\r\n        if (!sliderInitialized) return;\r\n        const h = parseInt(slider.value);\r\n        sliderValue.textContent = h;\r\n        drawChart(h);\r\n    });\r\n \r\n    setTimeout(() => sliderInitialized = true, 50);\r\n \r\n    function drawChart(hours) {\r\n \r\n        const rows = chartRows.slice(0, hours);\r\n \r\n        const dataTable = new google.visualization.DataTable();\r\n        dataTable.addColumn(\"datetime\", \"Tid\");\r\n        dataTable.addColumn(\"number\", \"Tryk (hPa)\");\r\n \r\n        rows.forEach(r => {\r\n            dataTable.addRow([r[0], r[1]]);\r\n        });\r\n \r\n        const options = {\r\n            title: \"FCOO barometer (\" + hours + \" timer)\",\r\n            curveType: \"function\",\r\n            pointSize: 5,\r\n            lineWidth: 3,\r\n            legend: { position: \"bottom\" },\r\n            crosshair: { trigger: \"both\" },\r\n            animation: { startup: true, duration: 800, easing: \"out\" },\r\n            vAxes: { 0: { title: \"Tryk (hPa)\" } },\r\n            hAxis: {\r\n                format: \"HH:mm\",\r\n                gridlines: { count: -1 }\r\n            },\r\n \r\n            chartArea: { left: 60, right: 30, top: 50, bottom: 60 }\r\n        };\r\n \r\n        const chart = new google.visualization.LineChart(\r\n            document.getElementById(\"curve_chart_fcoo_SeaLevelPressure\")\r\n        );\r\n \r\n        google.visualization.events.addListener(chart, \"ready\", () => {\r\n \r\n            wrapper.querySelectorAll(\".pressure-band, .band-label, .stormrisk-band, .current-time-line\")\r\n                   .forEach(el => el.remove());\r\n \r\n            const layout = chart.getChartLayoutInterface();\r\n            const box = layout.getChartAreaBoundingBox();\r\n \r\n            const chartTop = box.top;\r\n            const chartBottom = box.top + box.height;\r\n \r\n            function clampBand(yTop, yBottom) {\r\n                let top = Math.min(yTop, yBottom);\r\n                let bottom = Math.max(yTop, yBottom);\r\n \r\n                \/\/ clamp to chart area\r\n                if (bottom < chartTop || top > chartBottom) {\r\n                    return null; \/\/ completely outside\r\n                }\r\n                top = Math.max(top, chartTop);\r\n                bottom = Math.min(bottom, chartBottom);\r\n \r\n                return { top, bottom };\r\n            }\r\n \r\n            function addBand(yTop, yBottom, color) {\r\n                const bandCoords = clampBand(yTop, yBottom);\r\n                if (!bandCoords) return;\r\n \r\n                const band = document.createElement(\"div\");\r\n                band.className = \"pressure-band\";\r\n                band.style.top = bandCoords.top + \"px\";\r\n                band.style.height = (bandCoords.bottom - bandCoords.top) + \"px\";\r\n                band.style.left = box.left + \"px\";\r\n                band.style.width = box.width + \"px\";\r\n                band.style.background = color;\r\n                wrapper.appendChild(band);\r\n            }\r\n \r\n            function addLabel(yTop, yBottom, text) {\r\n                const bandCoords = clampBand(yTop, yBottom);\r\n                if (!bandCoords) return;\r\n \r\n                const midY = bandCoords.top + (bandCoords.bottom - bandCoords.top) \/ 2;\r\n \r\n                const label = document.createElement(\"div\");\r\n                label.className = \"band-label\";\r\n                label.style.left = (box.left + 10) + \"px\";\r\n                label.style.top = (midY - 10) + \"px\";\r\n                label.innerText = text;\r\n                wrapper.appendChild(label);\r\n            }\r\n \r\n            \/\/ Pressure bands (pixel positions in chart container coords)\r\n            const y980  = layout.getYLocation(980);\r\n            const y1000 = layout.getYLocation(1000);\r\n            const y1005 = layout.getYLocation(1005);\r\n            const y1015 = layout.getYLocation(1015);\r\n            const y1020 = layout.getYLocation(1020);\r\n            const y1025 = layout.getYLocation(1025);\r\n            const y1035 = layout.getYLocation(1035);\r\n \r\n            addBand(y1035, y1025, \"rgba(255,215,100,0.25)\");\r\n            addLabel(y1035, y1025, \"Meget stabilt vejr\");\r\n \r\n            addBand(y1025, y1020, \"rgba(255,240,150,0.22)\");\r\n            addLabel(y1025, y1020, \"Stabilt og klart vejr\");\r\n \r\n            addBand(y1020, y1015, \"rgba(150,200,255,0.18)\");\r\n            addLabel(y1020, y1015, \"Roligt og t\u00f8rt vejr\");\r\n \r\n            addBand(y1015, y1005, \"rgba(200,200,200,0.18)\");\r\n            addLabel(y1015, y1005, \"Blandet vejr\");\r\n \r\n            addBand(y1005, y980, \"rgba(255,120,120,0.20)\");\r\n            addLabel(y1005, y980, \"Ustabilt vejr\");\r\n \r\n            \/\/ Storm risk band\r\n            const stormCoords = clampBand(y1000, y980);\r\n            if (stormCoords) {\r\n                const stormBand = document.createElement(\"div\");\r\n                stormBand.className = \"stormrisk-band\";\r\n                stormBand.style.top = stormCoords.top + \"px\";\r\n                stormBand.style.height = (stormCoords.bottom - stormCoords.top) + \"px\";\r\n                stormBand.style.left = box.left + \"px\";\r\n                stormBand.style.width = box.width + \"px\";\r\n                wrapper.appendChild(stormBand);\r\n \r\n                const midY = stormCoords.top + (stormCoords.bottom - stormCoords.top) \/ 2;\r\n                const label = document.createElement(\"div\");\r\n                label.className = \"band-label\";\r\n                label.style.left = (box.left + 10) + \"px\";\r\n                label.style.top = (midY - 10) + \"px\";\r\n                label.innerText = \"Stormrisiko\";\r\n                wrapper.appendChild(label);\r\n            }\r\n \r\n            \/\/ Now line\r\n            const now = new Date();\r\n            const currentX = layout.getXLocation(now);\r\n \r\n            if (currentX >= box.left && currentX <= box.left + box.width) {\r\n                const line = document.createElement(\"div\");\r\n                line.className = \"current-time-line\";\r\n                line.style.left = currentX + \"px\";\r\n                line.style.top = box.top + \"px\";\r\n                line.style.height = box.height + \"px\";\r\n                wrapper.appendChild(line);\r\n            }\r\n        });\r\n \r\n        chart.draw(dataTable, options);\r\n    }\r\n});\r\n<\/script>\r\n \r\n\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>FCOO prognoser FCOO er en meget benyttet tjeneste hos mange sejlere. Nedenst\u00e5ende grafer viser prognoser for de n\u00e6ste 48 timer i Gamb\u00f8t. Prognosen opdateres 4 gange i d\u00f8gnet. Graferne er [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[36],"tags":[35],"class_list":["post-21137","post","type-post","status-publish","format-standard","hentry","category-xdiverse-bred","tag-ingen-mail"],"_links":{"self":[{"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=\/wp\/v2\/posts\/21137","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21137"}],"version-history":[{"count":23,"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=\/wp\/v2\/posts\/21137\/revisions"}],"predecessor-version":[{"id":21293,"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=\/wp\/v2\/posts\/21137\/revisions\/21293"}],"wp:attachment":[{"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21137"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21137"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thuroesejlklub.dk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}