{"id":9,"date":"2026-03-09T17:21:39","date_gmt":"2026-03-09T17:21:39","guid":{"rendered":"https:\/\/map.scubaviz.us\/?page_id=9"},"modified":"2026-03-11T23:39:17","modified_gmt":"2026-03-11T23:39:17","slug":"map-test-page","status":"publish","type":"page","link":"https:\/\/map.scubaviz.us\/","title":{"rendered":"Map Test Page"},"content":{"rendered":"\r\n    <style>\r\n        #scubaviz-wrapper { position: relative; width: 100%; height: 75vh; border-radius: 5px; box-shadow: 0 2px 10px rgba(0,0,0,0.2); overflow: hidden; }\r\n        #scubaviz-map { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; }\r\n\r\n        \/* AI AGENT NOTE: Force Light Mode Colors to prevent Astra Dark Theme inversion *\/\r\n        .sv-control-panel {\r\n            position: absolute; top: 10px; right: 10px; z-index: 1000;\r\n            background: rgba(255, 255, 255, 0.95) !important; padding: 15px; border-radius: 5px;\r\n            box-shadow: 0 2px 10px rgba(0,0,0,0.3); font-family: Arial, sans-serif;\r\n            font-size: 14px; color: #333333 !important; width: 260px;\r\n            display: flex; flex-direction: column;\r\n        }\r\n        \r\n        .sv-control-panel h4 { margin: 0; font-size: 16px; border: none; padding: 0; color: #111111 !important; }\r\n        .sv-control-panel label { font-weight: bold; display: block; margin-top: 10px; margin-bottom: 2px; color: #333333 !important;}\r\n        \r\n        \/* Force Input and Dropdown visibilities *\/\r\n        .sv-control-panel select, \r\n        .sv-control-panel input[type=\"text\"], \r\n        .sv-control-panel input[type=\"number\"] {\r\n            width: 100%; padding: 5px; box-sizing: border-box; \r\n            border: 1px solid #999 !important; border-radius: 3px;\r\n            background-color: #ffffff !important; color: #333333 !important;\r\n        }\r\n        \r\n        .sv-control-panel .flex-row { display: flex; gap: 10px; }\r\n        .sv-btn { width: 100%; padding: 8px; border: none; border-radius: 3px; cursor: pointer; font-weight: bold; margin-top: 5px;}\r\n        .sv-btn-reset { background: #eee !important; color: #333 !important; font-size: 11px; padding: 4px; }\r\n        .sv-btn-update { background: #0073aa !important; color: #fff !important; margin-bottom: 10px; font-size: 15px; transition: background 0.3s;}\r\n        .premium-gold { background: rgba(212, 175, 55, 0.4) !important; border-color: #d4af37 !important; color: #000 !important; font-weight: bold; }\r\n        \r\n        .sv-version-block {\r\n            text-align: center; font-size: 10px; color: #777 !important; margin-top: 10px;\r\n            border-top: 1px solid #ccc; padding-top: 8px; line-height: 1.4;\r\n        }\r\n        .sv-version-block a { color: #0073aa !important; text-decoration: none; }\r\n    <\/style>\r\n\r\n    <div id=\"scubaviz-wrapper\">\r\n        <div id=\"scubaviz-map\"><\/div>\r\n        \r\n        <div id=\"sv-custom-ui\" class=\"sv-control-panel\">\r\n            <div id=\"sv-ui-header\" style=\"display:flex; justify-content:space-between; align-items:center; cursor:pointer; border-bottom: 1px solid #ccc; padding-bottom: 5px; margin-bottom: 10px;\">\r\n                <div style=\"display:flex; align-items:center; gap:8px;\">\r\n                    <h4>Map Settings<\/h4>\r\n                <\/div>\r\n                <span id=\"sv-ui-toggle\">\u25bc<\/span>\r\n            <\/div>\r\n            \r\n            <div id=\"sv-ui-body\" style=\"max-height: 55vh; overflow-y: auto; padding-right: 5px;\">\r\n                <button class=\"sv-btn sv-btn-update\" id=\"ctrl-update\">Update Map<\/button>\r\n                <label>Region:<\/label> <select id=\"ctrl-region\"><\/select>\r\n                <label>Data Layer:<\/label> <select id=\"ctrl-layer\"><\/select>\r\n                <label>Date:<\/label> <input type=\"text\" id=\"ctrl-date\" placeholder=\"Select Date\" \/>\r\n                <label>Scale Range (Min \/ Max):<\/label>\r\n                <div class=\"flex-row\">\r\n                    <input type=\"number\" id=\"ctrl-min\" step=\"0.01\" \/>\r\n                    <input type=\"number\" id=\"ctrl-max\" step=\"0.01\" \/>\r\n                <\/div>\r\n                <button class=\"sv-btn sv-btn-reset\" id=\"ctrl-reset-range\">Reset Range to Defaults<\/button>\r\n                <hr style=\"margin-top: 15px; border: 0; border-top: 1px solid #eee;\"\/>\r\n                <label>Overlays:<\/label>\r\n                <div id=\"sv-overlay-container\">\r\n                    <em style=\"font-size: 12px; color: #777;\">Loading live data...<\/em>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"sv-version-block\">\r\n                v2.12.0<br>\r\n                &copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\" target=\"_blank\">OpenStreetMap<\/a> | <a href=\"https:\/\/leafletjs.com\" target=\"_blank\">Leaflet<\/a>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n        document.addEventListener(\"DOMContentLoaded\", function () {\r\n            let inventory = {\"Volusia\":{\"SST_NN\":[\"2026-03-09\",\"2026-03-10\"],\"TSM_NN\":[\"2026-03-10\",\"2026-03-12\",\"2026-03-13\",\"2026-03-14\",\"2026-03-15\",\"2026-03-16\",\"2026-03-17\",\"2026-03-18\",\"2026-03-19\",\"2026-03-20\",\"2026-03-21\",\"2026-03-22\",\"2026-03-23\",\"2026-03-24\",\"2026-03-25\",\"2026-03-26\",\"2026-03-27\",\"2026-03-28\",\"2026-03-29\",\"2026-03-30\",\"2026-04-01\",\"2026-04-02\",\"2026-04-03\",\"2026-04-04\",\"2026-04-05\",\"2026-04-06\",\"2026-04-07\",\"2026-04-08\",\"2026-04-09\",\"2026-04-10\",\"2026-04-11\",\"2026-04-12\",\"2026-04-13\",\"2026-04-14\",\"2026-04-15\",\"2026-04-16\"],\"chlor_a\":[\"2026-03-09\",\"2026-03-10\",\"2026-03-12\",\"2026-03-13\",\"2026-03-14\",\"2026-03-15\",\"2026-03-16\",\"2026-03-17\",\"2026-03-18\",\"2026-03-19\",\"2026-03-20\",\"2026-03-21\",\"2026-03-22\",\"2026-03-23\",\"2026-03-24\",\"2026-03-25\",\"2026-03-26\",\"2026-03-27\",\"2026-03-28\",\"2026-03-29\",\"2026-03-30\",\"2026-04-01\",\"2026-04-02\",\"2026-04-03\",\"2026-04-04\",\"2026-04-05\",\"2026-04-06\",\"2026-04-07\",\"2026-04-08\",\"2026-04-09\",\"2026-04-10\",\"2026-04-11\",\"2026-04-12\",\"2026-04-13\",\"2026-04-14\",\"2026-04-15\",\"2026-04-16\"],\"kd_490\":[\"2026-03-07\",\"2026-03-08\",\"2026-03-09\",\"2026-03-10\",\"2026-03-12\",\"2026-03-13\",\"2026-03-14\",\"2026-03-15\",\"2026-03-16\",\"2026-03-17\",\"2026-03-18\",\"2026-03-19\",\"2026-03-20\",\"2026-03-21\",\"2026-03-22\",\"2026-03-23\",\"2026-03-24\",\"2026-03-25\",\"2026-03-26\",\"2026-03-27\",\"2026-03-28\",\"2026-03-29\",\"2026-03-30\",\"2026-04-01\",\"2026-04-02\",\"2026-04-03\",\"2026-04-04\",\"2026-04-05\",\"2026-04-06\",\"2026-04-07\",\"2026-04-08\",\"2026-04-09\",\"2026-04-10\",\"2026-04-11\",\"2026-04-12\",\"2026-04-13\",\"2026-04-14\",\"2026-04-15\",\"2026-04-16\"],\"sea_surface_temperature\":[\"2026-03-09\",\"2026-03-10\",\"2026-03-11\",\"2026-03-12\",\"2026-03-13\",\"2026-03-14\",\"2026-03-15\",\"2026-03-16\",\"2026-03-17\",\"2026-03-18\",\"2026-03-19\",\"2026-03-20\",\"2026-03-21\",\"2026-03-22\",\"2026-03-23\",\"2026-03-24\",\"2026-03-25\",\"2026-03-26\",\"2026-03-27\",\"2026-03-28\",\"2026-03-29\",\"2026-03-30\",\"2026-04-01\",\"2026-04-02\",\"2026-04-03\",\"2026-04-04\",\"2026-04-05\",\"2026-04-06\",\"2026-04-10\",\"2026-04-11\",\"2026-04-12\",\"2026-04-13\",\"2026-04-14\",\"2026-04-15\",\"2026-04-16\"]}}; \r\n            let layerConfigs = {}; \r\n            let overlayConfigs = {};\r\n            \r\n            const isPremiumUser = false;\r\n            const dataBaseUrl = window.location.origin + \"\/data\"; \r\n            const ajaxUrl = \"https:\/\/map.scubaviz.us\/wp-admin\/admin-ajax.php\";\r\n\r\n            let activeState = { region: '', layer: '', date: '', min: 0, max: 0, overlays: [] };\r\n            let pendingState = { region: '', layer: '', date: '', min: 0, max: 0, overlays: [] };\r\n            \r\n            let map = L.map('scubaviz-map', { attributionControl: false }).setView([28.5, -80.5], 8);\r\n            L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', { maxZoom: 18 }).addTo(map);\r\n\r\n            let currentRasterLayer = null;\r\n            let overlayGroups = {};\r\n\r\n            let uiDiv = document.getElementById('sv-custom-ui');\r\n            L.DomEvent.disableClickPropagation(uiDiv);\r\n            L.DomEvent.disableScrollPropagation(uiDiv);\r\n\r\n            document.getElementById('sv-ui-header').addEventListener('click', function() {\r\n                let body = document.getElementById('sv-ui-body');\r\n                this.querySelector('#sv-ui-toggle').textContent = (body.style.display === 'none') ? '\u25bc' : '\u25b2';\r\n                body.style.display = (body.style.display === 'none') ? 'block' : 'none';\r\n            });\r\n\r\n            let fpInstance = null;\r\n            \r\n            \/\/ Flag to check if this is the first load with zero URL parameters\r\n            let isDefaultLoad = (window.location.search.replace('?', '').length === 0);\r\n\r\n            function init() {\r\n                const urlParams = new URLSearchParams(window.location.search);\r\n                \r\n                if (isDefaultLoad) {\r\n                    \/\/ AI AGENT NOTE: Strict application defaults if no URL overrides exist\r\n                    pendingState.region = 'Volusia';\r\n                    if (!inventory['Volusia']) pendingState.region = Object.keys(inventory)[0];\r\n\r\n                    pendingState.layer = 'kd_490';\r\n                    if (!inventory[pendingState.region] || !inventory[pendingState.region]['kd_490']) {\r\n                        pendingState.layer = Object.keys(inventory[pendingState.region] || {})[0];\r\n                    }\r\n\r\n                    let availableDates = inventory[pendingState.region]?.[pendingState.layer] || [];\r\n                    pendingState.date = availableDates[0];\r\n                    pendingState.overlays = []; \/\/ populated dynamically via populateOverlays() based on isDefaultLoad\r\n                } else {\r\n                    pendingState.region = urlParams.get('region') || Object.keys(inventory)[0] || 'Volusia';\r\n                    pendingState.layer = urlParams.get('layer') || Object.keys(inventory[pendingState.region] || {})[0] || 'kd_490';\r\n                    let availableDates = inventory[pendingState.region]?.[pendingState.layer] || [];\r\n                    pendingState.date = urlParams.get('date') || availableDates[0];\r\n\r\n                    if (urlParams.get('overlays')) {\r\n                        pendingState.overlays = urlParams.get('overlays').split(',');\r\n                    }\r\n                }\r\n\r\n                populateRegionDropdown();\r\n                populateLayerDropdown();\r\n\r\n                \/\/ Values\r\n                let conf = layerConfigs[pendingState.layer] || { min: 0, max: 1 };\r\n                pendingState.min = isDefaultLoad ? conf.min : (parseFloat(urlParams.get('min')) || conf.min);\r\n                pendingState.max = isDefaultLoad ? conf.max : (parseFloat(urlParams.get('max')) || conf.max);\r\n                document.getElementById('ctrl-min').value = pendingState.min;\r\n                document.getElementById('ctrl-max').value = pendingState.max;\r\n\r\n                if (urlParams.get('lat') && urlParams.get('lng') && urlParams.get('zoom')) {\r\n                    window.scubavizInitialView = {\r\n                        lat: parseFloat(urlParams.get('lat')),\r\n                        lng: parseFloat(urlParams.get('lng')),\r\n                        zoom: parseInt(urlParams.get('zoom'))\r\n                    };\r\n                }\r\n\r\n                initFlatpickr();\r\n                Object.assign(activeState, pendingState);\r\n                if (activeState.region && activeState.layer && activeState.date) {\r\n                    executeMapUpdate();\r\n                }\r\n\r\n                \/\/ AJAX: Load live database records to overwrite static defaults\r\n                let formData = new FormData();\r\n                formData.append('action', 'get_scubaviz_inventory');\r\n\r\n                fetch(ajaxUrl, { method: 'POST', body: formData, cache: 'no-store' })\r\n                .then(r => r.json())\r\n                .then(res => {\r\n                    if(res.success && res.data) {\r\n                        if (res.data.inventory) inventory = res.data.inventory;\r\n                        if (res.data.overlays) overlayConfigs = res.data.overlays;\r\n                        if (res.data.layerConfigs) layerConfigs = res.data.layerConfigs;\r\n                        \r\n                        populateRegionDropdown();\r\n                        populateLayerDropdown();\r\n                        populateOverlays(); \r\n                        initFlatpickr();\r\n                        checkUpdateBtnState();\r\n                        syncOverlayColors();\r\n                    }\r\n                }).catch(err => console.error(\"Live fetch error:\", err));\r\n            }\r\n\r\n            function syncOverlayColors() {\r\n                activeState.overlays.forEach(fname => {\r\n                    let conf = getFuzzyConfig(fname);\r\n                    if (conf && overlayGroups[fname]) {\r\n                        overlayGroups[fname].eachLayer(layer => {\r\n                            if (layer.setStyle) layer.setStyle({ color: conf.color });\r\n                        });\r\n                    }\r\n                });\r\n            }\r\n\r\n            function getFuzzyConfig(fname) {\r\n                if (overlayConfigs[fname]) return overlayConfigs[fname];\r\n                let clean = fname.replace(\/\\s\/g, '').toLowerCase();\r\n                let matchKey = Object.keys(overlayConfigs).find(k => k.replace(\/\\s\/g, '').toLowerCase() === clean);\r\n                return matchKey ? overlayConfigs[matchKey] : null;\r\n            }\r\n\r\n            function populateRegionDropdown() {\r\n                let sel = document.getElementById('ctrl-region');\r\n                sel.innerHTML = '';\r\n                Object.keys(inventory).forEach(r => {\r\n                    let opt = document.createElement('option');\r\n                    opt.value = r; opt.textContent = r;\r\n                    sel.appendChild(opt);\r\n                });\r\n                sel.value = pendingState.region;\r\n            }\r\n\r\n            function populateLayerDropdown() {\r\n                let sel = document.getElementById('ctrl-layer');\r\n                sel.innerHTML = '';\r\n                let layers = Object.keys(inventory[pendingState.region] || {});\r\n                layers.forEach(l => {\r\n                    let opt = document.createElement('option');\r\n                    opt.value = l;\r\n                    let isPrem = layerConfigs[l]?.isPremium;\r\n                    opt.textContent = l + (isPrem ? ' \ud83d\udd12' : '');\r\n                    sel.appendChild(opt);\r\n                });\r\n                if(layers.includes(pendingState.layer)) sel.value = pendingState.layer;\r\n            }\r\n\r\n            function populateOverlays() {\r\n                let container = document.getElementById('sv-overlay-container');\r\n                container.innerHTML = '';\r\n                let hasAny = false;\r\n                \r\n                Object.keys(overlayConfigs).forEach(fname => {\r\n                    let conf = overlayConfigs[fname];\r\n                    let match = conf.regions.some(r => r.toLowerCase() === pendingState.region.toLowerCase() || r.toLowerCase() === 'all');\r\n                    \r\n                    if (match) {\r\n                        hasAny = true;\r\n\r\n                        \/\/ AI AGENT NOTE: Auto-activate all overlays on initial default load\r\n                        if (isDefaultLoad && !pendingState.overlays.includes(fname)) {\r\n                            pendingState.overlays.push(fname);\r\n                            activeState.overlays.push(fname);\r\n                            executeMapUpdate(); \/\/ Trigger visual update for newly discovered layers\r\n                        }\r\n\r\n                        let div = document.createElement('div');\r\n                        let chk = document.createElement('input');\r\n                        chk.type = 'checkbox';\r\n                        chk.id = 'chk-' + fname.replace(\/\\.\/g, '-').replace(\/\\s\/g, '_');\r\n                        chk.value = fname;\r\n                        chk.className = 'sv-overlay-chk';\r\n                        chk.checked = pendingState.overlays.includes(fname);\r\n                        \r\n                        let lbl = document.createElement('label');\r\n                        lbl.htmlFor = chk.id;\r\n                        lbl.style.display = 'inline'; lbl.style.marginLeft = '5px'; lbl.style.fontWeight = 'normal';\r\n                        lbl.textContent = conf.display_name;\r\n                        \r\n                        div.appendChild(chk); div.appendChild(lbl);\r\n                        container.appendChild(div);\r\n                    }\r\n                });\r\n                if (!hasAny) container.innerHTML = '<em style=\"font-size: 11px; color: #999;\">No overlays for this region.<\/em>';\r\n            }\r\n\r\n            function initFlatpickr() {\r\n                if (fpInstance) fpInstance.destroy();\r\n                let dates = inventory[pendingState.region]?.[pendingState.layer] || [];\r\n                fpInstance = flatpickr(\"#ctrl-date\", {\r\n                    defaultDate: pendingState.date,\r\n                    enable: dates,\r\n                    onChange: (d, str) => { pendingState.date = str; checkUpdateBtnState(); }\r\n                });\r\n            }\r\n\r\n            function checkUpdateBtnState() {\r\n                let btn = document.getElementById('ctrl-update');\r\n                \/\/ Fetch dynamically from DOM to prevent out-of-sync states\r\n                let currentLayer = document.getElementById('ctrl-layer').value;\r\n                let currentDate = document.getElementById('ctrl-date').value;\r\n                let dates = inventory[pendingState.region]?.[currentLayer] || [];\r\n                let conf = layerConfigs[currentLayer];\r\n                \r\n                if (conf?.isPremium && !isPremiumUser && dates.length > 0 && currentDate === dates[0]) {\r\n                    btn.textContent = \"Subscribe to View Latest\";\r\n                    btn.dataset.action = \"subscribe\";\r\n                } else {\r\n                    btn.textContent = \"Update Map\";\r\n                    btn.className = \"sv-btn sv-btn-update\";\r\n                    btn.dataset.action = \"update\";\r\n                }\r\n            }\r\n\r\n            document.getElementById('ctrl-region').addEventListener('change', function(e) {\r\n                pendingState.region = e.target.value;\r\n                populateLayerDropdown();\r\n                pendingState.layer = document.getElementById('ctrl-layer').value; \/\/ Sync state to fallback selection\r\n                populateOverlays();\r\n                initFlatpickr();\r\n            });\r\n\r\n            document.getElementById('ctrl-layer').addEventListener('change', function(e) {\r\n                checkUpdateBtnState();\r\n            });\r\n\r\n            document.getElementById('ctrl-reset-range').addEventListener('click', function() {\r\n                let currentLayer = document.getElementById('ctrl-layer').value;\r\n                let conf = layerConfigs[currentLayer];\r\n                if(conf) {\r\n                    document.getElementById('ctrl-min').value = conf.min;\r\n                    document.getElementById('ctrl-max').value = conf.max;\r\n                }\r\n            });\r\n\r\n            \/\/ AI AGENT NOTE: Button click strictly scrapes DOM values to absolutely prevent update desync\r\n            document.getElementById('ctrl-update').addEventListener('click', function() {\r\n                if (this.dataset.action === 'subscribe') {\r\n                    window.open('\/membership-account\/membership-levels\/', '_blank');\r\n                    return;\r\n                }\r\n                this.disabled = true; this.textContent = \"Reloading...\";\r\n                \r\n                \/\/ Read source-of-truth from DOM inputs\r\n                let selectedRegion = document.getElementById('ctrl-region').value;\r\n                let selectedLayer = document.getElementById('ctrl-layer').value;\r\n                let selectedDate = document.getElementById('ctrl-date').value;\r\n                let selectedMin = document.getElementById('ctrl-min').value;\r\n                let selectedMax = document.getElementById('ctrl-max').value;\r\n\r\n                let url = new URL(window.location.origin + window.location.pathname);\r\n                url.searchParams.set('region', selectedRegion);\r\n                url.searchParams.set('layer', selectedLayer);\r\n                url.searchParams.set('date', selectedDate);\r\n                url.searchParams.set('min', selectedMin);\r\n                url.searchParams.set('max', selectedMax);\r\n                \r\n                let checked = Array.from(document.querySelectorAll('.sv-overlay-chk:checked')).map(c => c.value);\r\n                if (checked.length) url.searchParams.set('overlays', checked.join(','));\r\n                else url.searchParams.delete('overlays');\r\n\r\n                \/\/ Preserve view bounding if region didn't jump\r\n                if (selectedRegion === activeState.region) {\r\n                    url.searchParams.set('lat', map.getCenter().lat.toFixed(4));\r\n                    url.searchParams.set('lng', map.getCenter().lng.toFixed(4));\r\n                    url.searchParams.set('zoom', map.getZoom());\r\n                }\r\n                url.searchParams.set('t', Date.now());\r\n                window.location.href = url.toString();\r\n            });\r\n\r\n            function executeMapUpdate() {\r\n                \/\/ Vector Layers\r\n                activeState.overlays.forEach(fname => {\r\n                    if (!overlayGroups[fname]) overlayGroups[fname] = L.layerGroup();\r\n                    if (overlayGroups[fname].getLayers().length === 0) {\r\n                        fetch(dataBaseUrl + '\/vectors\/' + fname)\r\n                        .then(r => r.json())\r\n                        .then(data => {\r\n                            let conf = getFuzzyConfig(fname);\r\n                            let color = conf ? conf.color : '#3388ff';\r\n                            L.geoJSON(data, { style: { color: color, weight: 2 } }).addTo(overlayGroups[fname]);\r\n                            overlayGroups[fname].addTo(map);\r\n                        }).catch(e => console.warn(\"GeoJSON load failed:\", fname));\r\n                    } else {\r\n                        overlayGroups[fname].addTo(map);\r\n                    }\r\n                });\r\n\r\n                \/\/ Raster Layer\r\n                let tiffUrl = `${dataBaseUrl}\/${activeState.region}-${activeState.layer}-${activeState.date.replace(\/-\/g,'')}.tif?v=${Date.now()}`;\r\n                parseGeoraster(tiffUrl).then(georaster => {\r\n                    if (currentRasterLayer) map.removeLayer(currentRasterLayer);\r\n                    let conf = layerConfigs[activeState.layer] || { min: 0, max: 1 };\r\n                    let colorScale = chroma.scale('Spectral').domain(conf.invertColor ? [activeState.max, activeState.min] : [activeState.min, activeState.max]);\r\n                    \r\n                    currentRasterLayer = new GeoRasterLayer({\r\n                        georaster: georaster, opacity: 0.8, resolution: 256,\r\n                        pixelValuesToColorFn: v => {\r\n                            let val = v[0];\r\n                            if (val === georaster.noDataValue || isNaN(val)) return null;\r\n                            return colorScale(Math.max(activeState.min, Math.min(activeState.max, val))).hex();\r\n                        }\r\n                    }).addTo(map);\r\n\r\n                    if (window.scubavizInitialView) {\r\n                        map.setView([window.scubavizInitialView.lat, window.scubavizInitialView.lng], window.scubavizInitialView.zoom);\r\n                        window.scubavizInitialView = null;\r\n                    } else {\r\n                        map.fitBounds(currentRasterLayer.getBounds());\r\n                    }\r\n                }).catch(e => console.error(\"COG load failed:\", e));\r\n            }\r\n\r\n            init();\r\n        });\r\n    <\/script>\r\n    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pmpro_default_level":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-9","page","type-page","status-publish","hentry","pmpro-has-access"],"_links":{"self":[{"href":"https:\/\/map.scubaviz.us\/index.php\/wp-json\/wp\/v2\/pages\/9","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/map.scubaviz.us\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/map.scubaviz.us\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/map.scubaviz.us\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/map.scubaviz.us\/index.php\/wp-json\/wp\/v2\/comments?post=9"}],"version-history":[{"count":7,"href":"https:\/\/map.scubaviz.us\/index.php\/wp-json\/wp\/v2\/pages\/9\/revisions"}],"predecessor-version":[{"id":26,"href":"https:\/\/map.scubaviz.us\/index.php\/wp-json\/wp\/v2\/pages\/9\/revisions\/26"}],"wp:attachment":[{"href":"https:\/\/map.scubaviz.us\/index.php\/wp-json\/wp\/v2\/media?parent=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}