{"id":2414,"date":"2025-07-03T20:08:12","date_gmt":"2025-07-03T20:08:12","guid":{"rendered":"https:\/\/godsgalaxygame.com\/GGG\/?page_id=2414"},"modified":"2026-08-28T07:47:08","modified_gmt":"2026-08-28T07:47:08","slug":"apps","status":"publish","type":"page","link":"https:\/\/godsgalaxygame.com\/GGG\/apps\/","title":{"rendered":"APPS"},"content":{"rendered":"\r\n<!-- =====================\r\nPOP-UP BEFORE RESERVATION (LEVEL 2)\r\n===================== -->\r\n\r\n<style>\r\n  #reservePopupOverlay {\r\n    position: fixed;\r\n    top: 0; left: 0;\r\n    width: 100%; height: 100%;\r\n    background: rgba(0,0,0,0.85);\r\n    display: none;\r\n    justify-content: center;\r\n    align-items: center;\r\n    z-index: 999999;\r\n  }\r\n\r\n  #reservePopup {\r\n    background: #111;\r\n    border: 2px solid #ffffff55;\r\n    padding: 30px 35px;\r\n    border-radius: 18px;\r\n    text-align: center;\r\n    width: 300px;\r\n    box-shadow: 0 0 25px #ffffff88;\r\n  }\r\n\r\n  #reservePopup h2 {\r\n    color: white;\r\n    font-size: 20px;\r\n    margin-bottom: 25px;\r\n  }\r\n\r\n  .reserve-btn {\r\n    padding: 10px 20px;\r\n    margin: 8px;\r\n    border-radius: 10px;\r\n    border: none;\r\n    cursor: pointer;\r\n    font-weight: bold;\r\n    font-size: 15px;\r\n  }\r\n\r\n  .yes-tours {\r\n    background: #6a00ff;\r\n    color: white;\r\n    box-shadow: 0 0 12px #6a00ff;\r\n  }\r\n\r\n  .no-continue {\r\n    background: #ff0066;\r\n    color: white;\r\n    box-shadow: 0 0 12px #ff0066;\r\n  }\r\n<\/style>\r\n\r\n<div id=\"reservePopupOverlay\">\r\n  <div id=\"reservePopup\">\r\n    <h2>Would you like to see Thematic Tours of the area?<\/h2>\r\n    <button class=\"reserve-btn yes-tours\" onclick=\"goToThematic()\">Yes<\/button>\r\n    <button class=\"reserve-btn no-continue\" onclick=\"handleReserveClick()\">No<\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n  const THEMATIC_URL = \"\/GGG\/thematic-tours\/\"; \r\n  const ELEMENTS_URL = \"https:\/\/godsgalaxygame.com\/GGG\/medayork-pyramid-2\/?travelclub=1\";\r\n\r\n  function openReservePopup() {\r\n    document.getElementById(\"reservePopupOverlay\").style.display = \"flex\";\r\n  }\r\n\r\n  function goToThematic() {\r\n  if (window.gggOpenThematicGate) {\r\n    window.gggOpenThematicGate(THEMATIC_URL); \/\/ opens popup from footer\r\n  } else {\r\n    window.location.href = THEMATIC_URL; \/\/ fallback if footer missing\r\n  }\r\n}\r\n\r\n\r\n  function continueReservation() {\r\n    window.location.href = ELEMENTS_URL;\r\n  }\r\n<\/script>\r\n\r\n\r\n\r\n<!-- BLOQUE 2 - APPS Cube V19 Completo + Mapa Circular + API -->\r\n<style>\r\n  @media (max-width: 768px) {\r\n    #glowMapContainer {\r\n      margin-top: -55px !important;\r\n    }\r\n  }\r\n<\/style>\r\n<div id=\"appsCubeContainer\" style=\"opacity:1; pointer-events: auto; transition: opacity 0.6s ease;\">\r\n  <!-- ESCENA CUBO -->\r\n  <div class=\"cube-scene\" style=\"width:180px; height:180px; perspective:1000px; position:fixed; bottom:20px; left:20px; z-index:1000;\">\r\n    <div class=\"cube\" id=\"appsCube\" style=\"width:100%; height:100%; position:relative; transform-style:preserve-3d; transform:rotateX(0deg) rotateY(0deg); transition:transform 0.3s ease;\">\r\n   <!-- FRONT -->\r\n      <div class=\"face front\" style=\"width:180px; height:180px; background:transparent; border:2px solid white; box-shadow:0 0 20px white; position:absolute; transform:rotateY(0deg) translateZ(90px); display:flex; flex-direction:column; justify-content:center; align-items:center; font-family:Orbitron;\">\r\n        <div style=\"font-size:42px; color:white; text-shadow:0 0 15px white;\">\ud83d\udcf1<\/div>\r\n        <div style=\"font-size:16px; color:white; font-weight:bold; text-shadow:0 0 10px white; margin-top:6px;\">APPS<\/div>\r\n      <\/div>\r\n\r\n      <!-- Cara Trasera del Cubo: APPS -->\r\n<!-- Back Face - APPS Cube - Nuevo Dise\u00f1o con Botones Circulares -->\r\n<div class=\"face back\" style=\"width:180px; height:180px; background:#000; border:2px solid white; box-shadow:0 0 15px white; position:absolute; transform:rotateY(180deg) translateZ(90px); font-family:Orbitron,sans-serif;\">\r\n\r\n  <!-- Sol central -->\r\n  <img decoding=\"async\" src=\"http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/1000065346-scaled.jpg\"\r\n       style=\"width:70px; height:70px; border-radius:50%; position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); box-shadow:0 0 20px white;\" \/>\r\n\r\n  <!-- Reserve -->\r\n <a onclick=\"openReservePopup()\" \r\n   style=\"position:absolute; top:8px; left:8px; width:44px; height:44px; border-radius:50%; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240108-225452_Chrome-scaled.jpg'); background-size:cover; box-shadow:0 0 12px cyan; cursor:pointer;\"\r\n   title=\"Reserve\"><\/a>\r\n\r\n\r\n  <!-- Bliss Coin -->\r\n  <div onclick=\"openBlissCoinPopup()\"\r\n       style=\"position:absolute; top:8px; right:8px; width:44px; height:44px; border-radius:50%; background:#222; font-size:40px; display:flex; justify-content:center; align-items:center; color:white; box-shadow:0 0 10px cyan; cursor:pointer;\"\r\n       title=\"Pay with Bliss Coin\">\ud83d\udcb3<\/div>\r\n\r\n  <!-- Coupon Button (Bottom-Left Corner) -->\r\n<a href=\"https:\/\/godsgalaxygame.com\/GGG\/discounts-gift\/\"\r\n   target=\"_blank\"\r\n   style=\"position: absolute;\r\n          bottom: 8px;\r\n          left: 8px;\r\n          width: 44px;\r\n          height: 44px;\r\n          border-radius: 50%;\r\n          background-image: url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240108-225546_Chrome.jpg');\r\n          background-size: cover;\r\n          box-shadow: 0 0 12px cyan;\r\n          cursor: pointer;\"\r\n   title=\"Get Coupons\">\r\n<\/a>\r\n\r\n\r\n  <!-- Become a Host -->\r\n  <a href=\"https:\/\/luxus2.godaddysites.com\/\" target=\"_blank\"\r\n     style=\"position:absolute; bottom:8px; right:8px; width:44px; height:44px; border-radius:50%; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240108-224514_Chrome-scaled.jpg'); background-size:cover; box-shadow:0 0 12px cyan;\"\r\n     title=\"Become a Host\"><\/a>\r\n<\/div>\r\n\r\n\r\n\r\n      <!-- RIGHT (CO2) -->\r\n      <div class=\"face right\" style=\"width:180px; height:180px; background:#000; border:2px solid beige; box-shadow:0 0 15px beige; position:absolute; transform:rotateY(90deg) translateZ(90px); font-family:Orbitron;\">\r\n        <button onclick=\"showHostButtons('co2-current')\" style=\"position:absolute; top:8px; left:27px; width:126px; height:17px; border:1px solid beige; color:white; background:transparent;\">Current<\/button>\r\n        <button onclick=\"showHostButtons('co2-onv')\" style=\"position:absolute; bottom:8px; left:27px; width:126px; height:17px; border:1px solid beige; color:white; background:transparent;\">On Vacation<\/button>\r\n        <button onclick=\"showHostButtons('co2-rec')\" style=\"position:absolute; top:27px; left:8px; height:126px; width:17px; border:1px solid beige; color:white; writing-mode:vertical-rl; background:transparent;\">Recommendation<\/button>\r\n        <button onclick=\"showHostButtons('co2-app')\" style=\"position:absolute; top:27px; right:8px; height:126px; width:17px; border:1px solid beige; color:white; writing-mode:vertical-lr; background:transparent;\">APP<\/button>\r\n        <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); text-align:center;\">\r\n          <div style=\"color:beige; font-size:16px; font-weight:bold;\">CO2<\/div>\r\n          <img decoding=\"async\" src=\"http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20250612_075245_Gallery.jpg\" style=\"width:65px; height:65px; border-radius:50%; box-shadow:0 0 12px beige;\">\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- LEFT (H2O) -->\r\n      <div class=\"face left\" style=\"width:180px; height:180px; background:#000; border:2px solid #00ccff; box-shadow:0 0 15px #00ccff; position:absolute; transform:rotateY(-90deg) translateZ(90px); font-family:Orbitron;\">\r\n        <button onclick=\"showHostButtons('h20-current')\" style=\"position:absolute; top:8px; left:27px; width:126px; height:17px; border:1px solid #00ccff; color:white; background:transparent;\">Current<\/button>\r\n        <button onclick=\"showHostButtons('h20-onv')\" style=\"position:absolute; bottom:8px; left:27px; width:126px; height:17px; border:1px solid #00ccff; color:white; background:transparent;\">On Vacation<\/button>\r\n        <button onclick=\"showHostButtons('h20-rec')\" style=\"position:absolute; top:27px; left:8px; height:126px; width:17px; border:1px solid #00ccff; color:white; writing-mode:vertical-rl; background:transparent;\">Recommendation<\/button>\r\n        <button onclick=\"showHostButtons('h20-app')\" style=\"position:absolute; top:27px; right:8px; height:126px; width:17px; border:1px solid #00ccff; color:white; writing-mode:vertical-lr; background:transparent;\">APP<\/button>\r\n        <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); text-align:center;\">\r\n          <div style=\"color:#00ccff; font-size:16px; font-weight:bold;\">H20<\/div>\r\n          <img decoding=\"async\" src=\"http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20250612_075344_Gallery.jpg\" style=\"width:65px; height:65px; border-radius:50%; box-shadow:0 0 12px #00ccff;\">\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- TOP (BMI) -->\r\n      <div class=\"face top\" style=\"width:180px; height:180px; background:#000; border:2px solid green; box-shadow:0 0 15px #33ff33; position:absolute; transform:rotateX(90deg) translateZ(90px); font-family:Orbitron;\">\r\n        <button onclick=\"showHostButtons('bmi-current')\" style=\"position:absolute; top:8px; left:27px; width:126px; height:17px; border:1px solid green; color:white; background:transparent;\">Current<\/button>\r\n        <button onclick=\"showHostButtons('bmi-onv')\" style=\"position:absolute; bottom:8px; left:27px; width:126px; height:17px; border:1px solid green; color:white; background:transparent;\">On Vacation<\/button>\r\n        <button onclick=\"showHostButtons('bmi-rec')\" style=\"position:absolute; top:27px; left:8px; height:126px; width:17px; border:1px solid green; color:white; writing-mode:vertical-rl; background:transparent;\">Recommendation<\/button>\r\n        <button onclick=\"showHostButtons('bmi-app')\" style=\"position:absolute; top:27px; right:8px; height:126px; width:17px; border:1px solid green; color:white; writing-mode:vertical-lr; background:transparent;\">APP<\/button>\r\n        <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); text-align:center;\">\r\n          <div style=\"color:#33ff33; font-size:16px; font-weight:bold;\">BMI<\/div>\r\n          <img decoding=\"async\" src=\"http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20250612_075305_Gallery.jpg\" style=\"width:65px; height:65px; border-radius:50%; box-shadow:0 0 12px #33ff33;\">\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- BOTTOM (DNA) -->\r\n      <div class=\"face bottom\" style=\"width:180px; height:180px; background:#000; border:2px solid red; box-shadow:0 0 15px red; position:absolute; transform:rotateX(-90deg) translateZ(90px); font-family:Orbitron;\">\r\n        <button onclick=\"showHostButtons('dna-current')\" style=\"position:absolute; top:8px; left:27px; width:126px; height:17px; border:1px solid red; color:white; background:transparent;\">Current<\/button>\r\n        <button onclick=\"showHostButtons('dna-onv')\" style=\"position:absolute; bottom:8px; left:27px; width:126px; height:17px; border:1px solid red; color:white; background:transparent;\">On Vacation<\/button>\r\n        <button onclick=\"showHostButtons('dna-rec')\" style=\"position:absolute; top:27px; left:8px; height:126px; width:17px; border:1px solid red; color:white; writing-mode:vertical-rl; background:transparent;\">Recommendation<\/button>\r\n        <button onclick=\"showHostButtons('dna-app')\" style=\"position:absolute; top:27px; right:8px; height:126px; width:17px; border:1px solid red; color:white; writing-mode:vertical-lr; background:transparent;\">APP<\/button>\r\n        <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); text-align:center;\">\r\n          <div style=\"color:red; font-size:16px; font-weight:bold;\">DNA<\/div>\r\n          <img decoding=\"async\" src=\"http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20250612_075325_Gallery.jpg\" style=\"width:65px; height:65px; border-radius:50%; box-shadow:0 0 12px red;\">\r\n        <\/div>\r\n      <\/div>\r\n\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- MAPA CIRCULAR -->\r\n  <div id=\"glowMapContainer\" style=\"opacity:1; pointer-events:auto; transition: opacity 0.6s ease; margin: 0 auto; margin-top: -95px; margin-bottom: 40px; width: 320px; height: 320px; border-radius: 50%; overflow: hidden; border: 6px solid rgba(0,255,255,0.6); box-shadow: 0 0 25px cyan; position: relative; z-index: 900;\">\r\n    <div id=\"googleMap\" style=\"width:100%; height:100%;\"><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Google Maps API (clave v\u00e1lida y correcta) -->\r\n<script src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=AIzaSyDLPhx98z9AgoqXS6VeoESE9NV6URuOhiE&#038;callback=initMap\" async defer><\/script>\r\n\r\n<script>\r\n  function activateappsCube() {\r\n    \/\/ Oculta el grid de opciones\r\n    const rrGrid = document.getElementById(\"rrGrid\");\r\n    if (rrGrid) {\r\n      rrGrid.style.display = \"none\";\r\n    }\r\n\r\n    \/\/ Muestra el contenedor del cubo\r\n    const container = document.getElementById(\"appsCubeContainer\");\r\n    if (container) {\r\n      container.style.opacity = \"1\";\r\n      container.style.pointerEvents = \"auto\";\r\n    }\r\n\r\n    \/\/ Muestra el mapa\r\n    const map = document.getElementById(\"glowMapContainer\");\r\n    if (map) {\r\n      map.style.opacity = \"1\";\r\n      map.style.pointerEvents = \"auto\";\r\n    }\r\n\r\n    \/\/ Reinicia el mapa si es necesario\r\n    if (typeof initMap === \"function\") {\r\n      initMap();\r\n    }\r\n  }\r\n<\/script>\r\n<script>\r\n function initMap() {\r\n  const map = new google.maps.Map(document.getElementById(\"googleMap\"), {\r\n    center: { lat: 6.2414088, lng: -75.22951 },  \/\/ Bliss Glamping\r\n    zoom: 15,\r\n    disableDefaultUI: true,\r\n    gestureHandling: \"greedy\"\r\n  });\r\n\r\n  \/\/ \ud83d\udfe2 Add this to show the marker\r\n  const marker = new google.maps.Marker({\r\n    position: { lat: 6.2414088, lng: -75.22951 },\r\n    map: map,\r\n    title: \"Bliss Glamping\"\r\n  });\r\n\r\n  \/\/ Optional: save the map to global variable if needed later\r\n  window.ggMap = map;\r\n}\r\n<\/script>\r\n<!-- POP-UP para Bliss Coin -->\r\n<div id=\"blissCoinPopup\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.9); z-index:9999; justify-content:center; align-items:center; font-family:Orbitron;\">\r\n  <div style=\"background:#111; padding:30px 20px; border:2px solid cyan; border-radius:20px; color:white; width:300px; text-align:center; box-shadow:0 0 20px cyan;\">\r\n    <h3 style=\"font-size:18px;\">\ud83d\udcb3 Pay with Bliss Coin<\/h3>\r\n    <p style=\"font-size:14px;\">Enter your digital wallet #:<\/p>\r\n    <input type=\"text\" placeholder=\"Your Wallet #\" style=\"width:90%; padding:8px; border-radius:10px; border:1px solid white; background:#000; color:white; margin-top:8px;\" \/>\r\n    <p style=\"margin-top:14px;\">Send payment to:<\/p>\r\n    <div style=\"margin:8px auto; padding:6px; background:#222; border:1px solid cyan; border-radius:8px;\">\r\n      <code style=\"font-size:13px;\">HOST-WALLET-ADDRESS-123<\/code>\r\n    <\/div>\r\n    <button onclick=\"closeBlissCoinPopup()\" style=\"margin-top:12px; padding:6px 16px; border-radius:10px; background:cyan; border:none; color:#000; font-weight:bold; cursor:pointer;\">\r\n      Close\r\n    <\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n  function openBlissCoinPopup() {\r\n    document.getElementById('blissCoinPopup').style.display = 'flex';\r\n  }\r\n  function closeBlissCoinPopup() {\r\n    document.getElementById('blissCoinPopup').style.display = 'none';\r\n  }\r\n<\/script>\r\n\r\n\r\n\r\n<!-- =========================================\r\nAPPS \u2014 PREVIEW ON MAP (ONE-BLOCK VERSION)\r\nTargets:\r\n  - Map wrapper: #glowMapContainer\r\n  - Circles wrap: #hostButtons\r\n  - Circles: .host-circle with classes like:\r\n      co2-current | co2-onvacation | co2-reccomendation | co2-app\r\n      h20-current | h20-onvacation | h20-reccomendation | h20-app\r\n      bmi-current | bmi-onvacation | bmi-reccomendation | bmi-app\r\n      dna-current | dna-onvacation | dna-reccomendation | dna-app\r\n========================================= -->\r\n<script>\r\n(() => {\r\n  \/* ============ 1) YOUR MEDIA (optional) ============ *\/\r\n  \/\/ If a key isn\u2019t here, the preview uses the circle\u2019s background-image.\r\n  \/\/ Keys must match a class on the button, e.g. \"co2-current\", \"h20-app\", etc.\r\n  const PREVIEW_MEDIA = {\r\n    \/\/ examples \u2014 replace or leave empty:\r\n    \/\/ \"co2-current\":  { type:\"image\", src:\"http:\/\/your-cdn\/image.jpg\" },\r\n    \/\/ \"h20-app\":      { type:\"video\", src:\"https:\/\/youtube.com\/watch?v=XXXXX\" },\r\n  };\r\n\r\n  \/* ============ 2) INTERNALS (no edits needed) ============ *\/\r\n  let state = { key:null, type:null, src:null, title:null };\r\n\r\n  const until = (fn, timeout=8000, every=120) => new Promise((res, rej) => {\r\n    const t0 = performance.now();\r\n    const tick = () => {\r\n      const out = fn();\r\n      if (out) return res(out);\r\n      if (performance.now() - t0 > timeout) return rej(new Error('timeout'));\r\n      setTimeout(tick, every);\r\n    };\r\n    tick();\r\n  });\r\n\r\n  const getBgURL = (el) => {\r\n    const bg = (getComputedStyle(el).backgroundImage || '').trim();\r\n    return bg.replace(\/^url\\((['\"]?)(.*)\\1\\)$\/, '$2');\r\n  };\r\n\r\n  const make = (tag, attrs={}, html='') => {\r\n    const el = document.createElement(tag);\r\n    Object.entries(attrs).forEach(([k,v]) => el.setAttribute(k, v));\r\n    if (html) el.innerHTML = html;\r\n    return el;\r\n  };\r\n\r\n  const embedFrom = (url) => {\r\n    const yt = url.match(\/(?:youtu\\.be\\\/|youtube\\.com\\\/watch\\?v=)([\\w\\-]+)\/i);\r\n    const vm = url.match(\/vimeo\\.com\\\/(\\d+)\/i);\r\n    if (yt) return `<iframe src=\"https:\/\/www.youtube.com\/embed\/${yt[1]}?rel=0&#038;playsinline=1\"\r\n      allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\r\n      allowfullscreen><\/iframe>`;\r\n    if (vm) return `<iframe src=\"https:\/\/player.vimeo.com\/video\/${vm[1]}\"\r\n      allow=\"autoplay; fullscreen; picture-in-picture; clipboard-write\" allowfullscreen><\/iframe>`;\r\n    return `<a href=\"${url}\" target=\"_blank\" style=\"color:#00ffff; font-weight:900; text-decoration:underline;\">Open video<\/a>`;\r\n  };\r\n\r\n  function injectStyles(){\r\n    if (document.getElementById('apps-preview-styles')) return;\r\n    const css = `\r\n#glowMapContainer{ position:relative; }\r\n#appsSeePreview{ position:absolute; left:50%; bottom:10px; transform:translateX(-50%); padding:8px 14px;\r\n  border-radius:999px; border:2px solid rgba(0,255,255,.7); background:rgba(0,0,0,.65); color:#eafcff;\r\n  font-family:Orbitron,system-ui,sans-serif; font-weight:900; letter-spacing:.2px; box-shadow:0 0 16px rgba(0,255,255,.45);\r\n  cursor:pointer; z-index:1200; display:none; }\r\n#appsSeePreview:hover{ box-shadow:0 0 22px rgba(0,255,255,.85); }\r\n#appsPreviewOverlay{ position:absolute; inset:0; display:none; place-items:center;\r\n  background: radial-gradient(ellipse at 50% 50%, rgba(0,0,0,.30), rgba(0,0,0,.65) 70%);\r\n  z-index:1300; }\r\n.apps-preview-circle{ width: clamp(200px, 62%, 300px); aspect-ratio:1\/1; border-radius:50%; border:4px solid rgba(0,255,255,.75);\r\n  box-shadow: 0 0 28px rgba(0,255,255,.6), inset 0 0 22px rgba(0,255,255,.25); background:#000; overflow:hidden; position:relative;\r\n  display:grid; place-items:center; }\r\n.apps-closeX{ position:absolute; top:6px; right:8px; z-index:2; border:0; background:rgba(0,0,0,.55); color:#9fefff;\r\n  font-size:20px; font-weight:900; width:28px; height:28px; border-radius:50%; cursor:pointer; line-height:26px; box-shadow:0 0 10px rgba(0,255,255,.35); }\r\n#appsPreviewMedia{ width:92%; height:92%; display:grid; place-items:center; }\r\n#appsPreviewMedia img{ width:100%; height:100%; object-fit:cover; border-radius:50%; display:block; }\r\n#appsPreviewMedia iframe{ width:100%; height:100%; border:0; border-radius:50%; }`;\r\n    const style = make('style', { id:'apps-preview-styles' }, css);\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  function mountUI(mapWrap){\r\n    if (document.getElementById('appsSeePreview')) return;\r\n    const btn = make('button', { id:'appsSeePreview', 'aria-haspopup':'dialog' }, '\ud83d\udc41\ufe0f See Preview');\r\n    const overlay = make('div', { id:'appsPreviewOverlay', 'aria-hidden':'true' });\r\n    overlay.innerHTML = `\r\n      <div class=\"apps-preview-circle\" role=\"dialog\" aria-label=\"Map preview\">\r\n        <button class=\"apps-closeX\" aria-label=\"Close preview\">\u00d7<\/button>\r\n        <div id=\"appsPreviewMedia\"><\/div>\r\n      <\/div>`;\r\n    mapWrap.appendChild(btn);\r\n    mapWrap.appendChild(overlay);\r\n\r\n    const media = document.getElementById('appsPreviewMedia');\r\n    const closeBtn = overlay.querySelector('.apps-closeX');\r\n\r\n    btn.addEventListener('click', () => {\r\n      media.innerHTML = state.type === 'video'\r\n        ? embedFrom(state.src)\r\n        : `<img decoding=\"async\" src=\"${state.src}\" alt=\"${state.title || 'Preview'}\">`;\r\n      overlay.style.display = 'grid';\r\n      overlay.setAttribute('aria-hidden','false');\r\n    });\r\n\r\n    const close = () => {\r\n      overlay.style.display = 'none';\r\n      overlay.setAttribute('aria-hidden','true');\r\n      media.innerHTML = '';\r\n    };\r\n    closeBtn.addEventListener('click', close);\r\n    overlay.addEventListener('click', (e)=>{ if(e.target === overlay) close(); });\r\n    window.addEventListener('keydown', (e)=>{ if(e.key==='Escape') close(); }, { passive:true });\r\n\r\n    return { btn, overlay, media };\r\n  }\r\n\r\n  \/\/ Prefer exact APPS keys first; else fall back to any PREVIEW_MEDIA key present on the element\r\n  function keyFromClasses(el){\r\n    const classes = [...el.classList];\r\n\r\n    \/\/ exact APPS pattern (includes the \"reccomendation\" spelling you use)\r\n    const match = classes.find(c =>\r\n      \/^(co2|h20|bmi|dna)-(current|onv|rec|app)$\/i.test(c)\r\n    );\r\n    if (match) return match;\r\n\r\n    \/\/ or any explicit PREVIEW_MEDIA key\r\n    const anyKnown = classes.find(c => Object.prototype.hasOwnProperty.call(PREVIEW_MEDIA, c));\r\n    return anyKnown || null;\r\n  }\r\n\r\n  function hookCircles(btnRef){\r\n    const wrap = document.getElementById('hostButtons');\r\n    if (!wrap) return;\r\n\r\n    wrap.addEventListener('click', (e) => {\r\n      const el = e.target.closest('.host-circle');\r\n      if (!el) return;\r\n\r\n      const key = keyFromClasses(el);\r\n      const title = el.getAttribute('title') || '';\r\nconst fallbackImg = getBgURL(el);\r\n\r\n\/\/ ALWAYS use the circle's background image for the preview\r\nstate = {\r\n  key,\r\n  type: 'image',\r\n  src: fallbackImg,\r\n  title\r\n};\r\n\r\n\r\n      \/\/ show CTA\r\n      if (btnRef) btnRef.style.display = 'block';\r\n\r\n      \/\/ recenter the map (plays nice with focusOnHost)\r\n      const lat = parseFloat(el.dataset.lat);\r\n      const lng = parseFloat(el.dataset.lng);\r\n      if (Number.isFinite(lat) && Number.isFinite(lng)) {\r\n        if (typeof window.focusOnHost === 'function') {\r\n          window.focusOnHost(lat, lng);\r\n        } else if (window.ggMap && window.google) {\r\n          const pos = new google.maps.LatLng(lat, lng);\r\n          ggMap.setCenter(pos);\r\n          ggMap.setZoom(15);\r\n          new google.maps.Marker({ position: pos, map: ggMap });\r\n        }\r\n      }\r\n    }, { passive:true });\r\n  }\r\n\r\n  async function boot(){\r\n    try{\r\n      injectStyles();\r\n\r\n      const mapWrap = await until(() => document.getElementById('glowMapContainer'));\r\n      const refs = mountUI(mapWrap);\r\n\r\n      await until(() => document.getElementById('hostButtons'));\r\n      hookCircles(refs?.btn);\r\n\r\n      \/\/ re-mount if DOM re-renders\r\n      new MutationObserver(() => {\r\n        if (!document.getElementById('appsSeePreview') && document.getElementById('glowMapContainer')) {\r\n          const nrefs = mountUI(document.getElementById('glowMapContainer'));\r\n          hookCircles(nrefs?.btn);\r\n        }\r\n      }).observe(document.body, { childList:true, subtree:true });\r\n\r\n      console.log('%c[apps Preview] Ready','color:#0ff');\r\n    }catch(e){\r\n      console.warn('[apps Preview] init failed:', e);\r\n    }\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', boot);\r\n  } else {\r\n    boot();\r\n  }\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n<!-- ESTILOS -->\r\n<style>\r\n  #floatingButtons {\r\n    position: fixed;\r\n    top: 14px;\r\n    right: 14px;\r\n    display: flex;\r\n    flex-direction: row;\r\n    gap: 10px;\r\n    z-index: 3000;\r\n  }\r\n\r\n  #favoritesBtn, #signinBtn {\r\n    font-size: 15px;\r\n    padding: 6px 10px;\r\n    border-radius: 8px;\r\n    border: 2px solid white;\r\n    color: white;\r\n    background: rgba(0, 0, 0, 0.6);\r\n    cursor: pointer;\r\n    box-shadow: 0 0 8px cyan;\r\n    font-family: Orbitron;\r\n  }\r\n\r\n  #favoritesBtn:hover::after {\r\n    content: ' Double click a Host to add \ud83d\udc98';\r\n    font-size: 10px;\r\n    margin-left: 8px;\r\n    color: cyan;\r\n  }\r\n\r\n  #signinBtn:hover::after {\r\n    content: ' Sign in to save your Favorites';\r\n    font-size: 10px;\r\n    margin-left: 8px;\r\n    color: cyan;\r\n  }\r\n  #pyramidBtn {\r\n    width: 38px;\r\n    height: 38px;\r\n    background-color: black;\r\n    border: 2px solid white;\r\n    border-radius: 50%;\r\n    box-shadow: 0 0 10px cyan; \/* glow *\/\r\n    display: flex;\r\n    justify-content: center;\r\n    align-items: center;\r\n    font-size: 20px; \/* emoji size *\/\r\n    cursor: pointer;\r\n    margin-top: 2px; \/* align with rose *\/\r\n  }\r\n\r\n  #swipeImage {\r\n    position: fixed;\r\n    top: 0;\r\n    left: 50%;\r\n    transform: translateX(-50%);\r\n    width: 160px;\r\n    z-index: 1200;\r\n    display: none;\r\n  }\r\n#swipeImage {\r\n  display: none !important;\r\n}\r\n\r\n<\/style>\r\n\r\n<!-- BOTONES FLOTANTES -->\r\n<div id=\"floatingButtons\">\r\n<button\r\n    id=\"pyramidBtn\"\r\n    title=\"Back to MedaYork Pyramid\"\r\n    onclick=\"window.location.href='https:\/\/godsgalaxygame.com\/GGG\/medayork-pyramid-2\/';\">\r\n    \ud83e\uddca\r\n  <\/button>\r\n  <button id=\"favoritesBtn\">\ud83d\udc96<\/button>\r\n  <button id=\"signinBtn\">Sign In \/ Sign Up<\/button>\r\n<\/div>\r\n\r\n<!-- IMAGEN DE SWIPE -->\r\n<img decoding=\"async\" id=\"swipeImage\" src=\"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20250627_154147_Gallery.jpg\" alt=\"Swipe\" \/>\r\n\r\n<!-- SCRIPT DE FUNCIONALIDAD -->\r\n<script>\r\n  \/\/ Movimiento del cubo APPS\r\n  let isDragging = false, startX, startY, rotateX = 0, rotateY = 0;\r\n  const cube = document.getElementById('appsCube');\r\n\r\n  function updateRotation(x, y) {\r\n    cube.style.transform = `rotateX(${x}deg) rotateY(${y}deg)`;\r\n  }\r\n\r\n  function onMouseDown(e) {\r\n    isDragging = true;\r\n    startX = e.clientX;\r\n    startY = e.clientY;\r\n  }\r\n\r\n  function onMouseMove(e) {\r\n    if (!isDragging) return;\r\n    const deltaX = e.clientX - startX;\r\n    const deltaY = e.clientY - startY;\r\n    rotateY += deltaX * 0.5;\r\n    rotateX -= deltaY * 0.5;\r\n    updateRotation(rotateX, rotateY);\r\n    startX = e.clientX;\r\n    startY = e.clientY;\r\n  }\r\n\r\n  function onMouseUp() {\r\n    isDragging = false;\r\n  }\r\n\r\n  function onTouchStart(e) {\r\n    isDragging = true;\r\n    startX = e.touches[0].clientX;\r\n    startY = e.touches[0].clientY;\r\n  }\r\n\r\n  function onTouchMove(e) {\r\n    if (!isDragging) return;\r\n    const deltaX = e.touches[0].clientX - startX;\r\n    const deltaY = e.touches[0].clientY - startY;\r\n    rotateY += deltaX * 0.5;\r\n    rotateX -= deltaY * 0.5;\r\n    updateRotation(rotateX, rotateY);\r\n    startX = e.touches[0].clientX;\r\n    startY = e.touches[0].clientY;\r\n  }\r\n\r\n  function onTouchEnd() {\r\n    isDragging = false;\r\n  }\r\n\r\n  const cubeContainer = document.querySelector('.cube-scene');\r\n  if (cubeContainer) {\r\n    cubeContainer.addEventListener('mousedown', onMouseDown);\r\n    window.addEventListener('mousemove', onMouseMove);\r\n    window.addEventListener('mouseup', onMouseUp);\r\n    cubeContainer.addEventListener('touchstart', onTouchStart);\r\n    window.addEventListener('touchmove', onTouchMove);\r\n    window.addEventListener('touchend', onTouchEnd);\r\n  }\r\n\r\n  \/\/ Mostrar swipe cuando aparece el cubo\r\n  const observer = new MutationObserver(() => {\r\n    const apps = document.getElementById('appsCubeContainer');\r\n    if (apps && apps.style.opacity === \"1\") {\r\n      const swipe = document.getElementById('swipeImage');\r\n      swipe.style.display = 'block';\r\n      setTimeout(() => {\r\n        swipe.style.display = 'none';\r\n      }, 3500);\r\n      observer.disconnect();\r\n    }\r\n  });\r\n  observer.observe(document.body, { childList: true, subtree: true });\r\n\r\n  \/\/ Sistema de favoritos \ud83d\udc96 \u2192 \ud83d\udc98\r\n  const favorites = [];\r\n\r\n  function toggleFavorite(id, imgUrl, mapLat, mapLng) {\r\n    if (!favorites.some(f => f.id === id)) {\r\n      favorites.push({ id, imgUrl, lat: mapLat, lng: mapLng });\r\n      document.getElementById(\"favoritesBtn\").textContent = \"\ud83d\udc98\";\r\n      console.log(\"Favorito agregado:\", id);\r\n    }\r\n  }\r\nfunction handleReserveClick() {\r\n  \/\/ Use favorites if they exist, otherwise empty array\r\n  const selected = Array.isArray(favorites) ? favorites : [];\r\n\r\n  \/\/ If there ARE favorites \u2192 send email\r\n  if (selected.length > 0) {\r\n    const lines = selected.map((f, i) =>\r\n      `${i + 1}. ${f.id} (${f.lat}, ${f.lng})`\r\n    );\r\n\r\n    const subject = encodeURIComponent(\"GGG \u2013 Selected Hosts\");\r\n    const body = encodeURIComponent(\r\n      \"User selected the following hosts:\\n\\n\" +\r\n      lines.join(\"\\n\")\r\n    );\r\n\r\n    \/\/ Send email\r\n    window.location.href =\r\n      `mailto:edwardraigozallc@gmail.com?subject=${subject}&body=${body}`;\r\n  }\r\n\r\n  \/\/ ALWAYS go to Travel Club (favorites or not)\r\n  setTimeout(() => {\r\n    window.location.href =\r\n      \"https:\/\/godsgalaxygame.com\/GGG\/medayork-pyramid-2\/?travelclub=1\";\r\n  }, 600);\r\n}\r\n\r\n\r\n  function clearFavorites() {\r\n    favorites.length = 0;\r\n    document.getElementById(\"favoritesBtn\").textContent = \"\ud83d\udc96\";\r\n  }\r\n\r\n  function focusOnHost(lat, lng) {\r\n    if (window.ggMap) {\r\n      window.ggMap.setCenter({ lat, lng });\r\n      window.ggMap.setZoom(15);\r\n      new google.maps.Marker({ position: { lat, lng }, map: window.ggMap });\r\n    }\r\n  }\r\n\r\n  document.getElementById(\"favoritesBtn\").addEventListener(\"click\", () => {\r\n    if (favorites.length === 0) return;\r\n    document.querySelectorAll('.host-circle').forEach(btn => btn.style.display = 'none');\r\n    favorites.forEach(fav => {\r\n      const existing = document.querySelector(`.${fav.id}`);\r\n      if (existing) existing.style.display = 'inline-block';\r\n    });\r\n  });\r\n<\/script>\r\n\r\n\r\n\r\n<!-- HOST CIRCLES \u2014 CSS (APPS) -->\r\n<style>\r\n  \/* container *\/\r\n  #hostButtons{\r\n    display:none;                 \/* hidden until a sub-option is clicked *\/\r\n    position:absolute;\r\n    top:50%; left:50%;\r\n    transform:translate(-50%,-50%);\r\n    width:100%; max-width:500px; height:500px;\r\n    pointer-events:none;          \/* turned ON in JS when shown *\/\r\n    z-index:3000;\r\n  }\r\n\r\n  \/* buttons *\/\r\n  #hostButtons .host-circle{\r\n    width:80px; height:80px; border-radius:50%;\r\n    border:2px solid #fff; box-shadow:0 0 14px #fff;\r\n    background-size:cover; background-position:center;\r\n    position:absolute; pointer-events:auto; cursor:pointer;\r\n    transition:transform .3s, box-shadow .3s;\r\n  }\r\n  #hostButtons .host-circle:hover{ transform:scale(1.15); box-shadow:0 0 20px cyan; }\r\n\r\n  \/* desktop placement (around the circle) *\/\r\n  #hostButtons .one    { top:4%;    left:10%; }\r\n  #hostButtons .five   { top:4%;    right:10%; }\r\n  #hostButtons .seven  { bottom:8%; left:10%; }\r\n  #hostButtons .month  { bottom:8%; right:10%; }\r\n\r\n  \/* color accents per family (match cube face glows) *\/\r\n  #hostButtons .co2 { border-color:beige;   box-shadow:0 0 14px beige; }\r\n  #hostButtons .h20 { border-color:#00ccff; box-shadow:0 0 14px #00ccff; }\r\n  #hostButtons .bmi  { border-color:#33ff33; box-shadow:0 0 14px #33ff33; }\r\n  #hostButtons .dna { border-color:red;     box-shadow:0 0 14px red; }\r\n\r\n  \/* phone: turn into one row under the map *\/\r\n  @media (max-width:768px){\r\n    #hostButtons{\r\n      position:relative; top:auto; left:auto; transform:none;\r\n      height:auto; margin-top:-35px;\r\n      display:none;               \/* still hidden by default *\/\r\n      flex-wrap:nowrap; justify-content:center; gap:10px;\r\n    }\r\n    #hostButtons .host-circle{ position:relative; width:75px; height:75px; margin:0 6px; }\r\n  }\r\n<\/style>\r\n\r\n<!-- HOST CIRCLES \u2014 HTML (APPS: CO2\r\n \/ H2O \/ BMI \/ DNA) -->\r\n<div id=\"hostButtons\">\r\n  <!-- co2 (beige) -->\r\n  <button class=\"host-circle co2 co2-current current\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240828_130357_Chrome.jpg');\"\r\n    title=\"co2 \u2022 current\"><\/button>\r\n\r\n  <button class=\"host-circle co2 co2-onv onv\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20251220_154102_Maps.jpg');\"\r\n    title=\"co2 \u2022 On Vacation\"><\/button>\r\n\r\n  <button class=\"host-circle co2 co2-rec rec\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20251220_152921_Chrome.jpg');\"\r\n    title=\"co2 \u2022 Recommendation\"><\/button>\r\n\r\n  <button class=\"host-circle co2 co2-app app\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_095458_One-UI-Home.jpg');\"\r\n    title=\"co2 \u2022 app\"><\/button>\r\n\r\n  <!-- H20 (cyan) -->\r\n  <button class=\"host-circle h20 h20-current current\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_095634_Chrome.jpg');\"\r\n    title=\"h20 \u2022 current\"><\/button>\r\n\r\n  <button class=\"host-circle h20 h20-onv onv\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20251220_155819_Google-Earth.jpg');\"\r\n    title=\"h20 \u2022 On Vacation\"><\/button>\r\n\r\n  <button class=\"host-circle h20 h20-rec rec\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_104725_Chrome.jpg');\"\r\n    title=\"h20 \u2022 Recommendation\"><\/button>\r\n\r\n  <button class=\"host-circle h20 h20-app app\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_100109_One-UI-Home.jpg');\"\r\n    title=\"h20 \u2022 app\"><\/button>\r\n\r\n  <!-- BMI (green) -->\r\n  <button class=\"host-circle bmi bmi-current current\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_101619_Chrome.jpg');\"\r\n    title=\"bmi \u2022 current\"><\/button>\r\n\r\n  <button class=\"host-circle bmi bmi-onv onv\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240830_100036_Chrome.jpg');\"\r\n    title=\"bmi \u2022 On Vacation\"><\/button>\r\n\r\n  <button class=\"host-circle bmi bmi-rec rec\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_111353_Chrome.jpg');\"\r\n    title=\"bmi \u2022 recommendation\"><\/button>\r\n\r\n  <button class=\"host-circle bmi bmi-app app\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_102308_Google-Play-Store.jpg');\"\r\n    title=\"bmi \u2022 app\"><\/button>\r\n\r\n  <!-- DNA (red) -->\r\n  <button class=\"host-circle dna dna-current current\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_102711_Chrome.jpg');\"\r\n    title=\"dna \u2022 current\"><\/button>\r\n\r\n  <button class=\"host-circle dna dna-onv onv\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20251220_161935_Google-Earth.jpg');\"\r\n    title=\"dna \u2022 On Vacation\"><\/button>\r\n\r\n  <button class=\"host-circle dna dna-rec rec\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_103302_One-UI-Home.jpg');\"\r\n    title=\"dna \u2022 Recommendation\"><\/button>\r\n\r\n  <button class=\"host-circle dna dna-app app\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/12\/Screenshot_20240829_103302_One-UI-Home.jpg');\"\r\n    title=\"dna \u2022 app\"><\/button>\r\n<\/div>\r\n\r\n<!-- HOST CIRCLES \u2014 JS (APPS) -->\r\n<script>\r\n  \/* Show only the requested key, e.g., 'co2-current' *\/\r\n  function showHostButtons(suboption){\r\n    const wrap = document.getElementById('hostButtons');\r\n    if(!wrap) return;\r\n\r\n    \/\/ hide all\r\n    wrap.querySelectorAll('.host-circle').forEach(el => el.style.display = 'none');\r\n\r\n    \/\/ show only requested group (class names include exact key)\r\n    wrap.querySelectorAll('.' + suboption).forEach(el => el.style.display = 'inline-block');\r\n\r\n    \/\/ reveal the container and allow clicks\r\n    wrap.style.display = 'flex';\r\n    wrap.style.pointerEvents = 'auto';\r\n  }\r\n\r\n  \/\/ dbl-tap \/ dbl-click to favorite (uses your existing toggleFavorite)\r\n  document.addEventListener('DOMContentLoaded', () => {\r\n    document.querySelectorAll('#hostButtons .host-circle').forEach(btn => {\r\n      btn.addEventListener('dblclick', (e) => {\r\n        e.preventDefault();\r\n\r\n        \/\/ \u2705 Get the specific key like \"heli-around\" \/ \"yacht-goto\"\r\n        const id = [...btn.classList].find(c =>\r\n          c.includes('-') &&\r\n          !['host-circle','around','goto','emergency','adventure'].includes(c)\r\n        );\r\n\r\n        if (!id) {\r\n          console.warn(\"No favorite id found for button:\", btn.className);\r\n          return;\r\n        }\r\n\r\n        \/\/ background-image: url(\"...\") or url('...')\r\n        const bg = btn.style.backgroundImage || '';\r\n        const img = bg.startsWith('url(')\r\n          ? bg.slice(4, -1).replace(\/^[\"']|[\"']$\/g, '')\r\n          : '';\r\n\r\n        const lat = parseFloat(btn.dataset.lat);\r\n        const lng = parseFloat(btn.dataset.lng);\r\n\r\n        if (typeof toggleFavorite === 'function') {\r\n          toggleFavorite(id, img, lat, lng);\r\n        } else {\r\n          console.warn(\"toggleFavorite() is not defined yet.\");\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n\r\n  \/* Center the map when any host circle is clicked *\/\r\n  document.addEventListener('click', function (e) {\r\n    const btn = e.target.closest('#hostButtons .host-circle');\r\n    if (!btn) return;\r\n\r\n    const lat = parseFloat(btn.dataset.lat);\r\n    const lng = parseFloat(btn.dataset.lng);\r\n    if (!Number.isFinite(lat) || !Number.isFinite(lng)) return;\r\n\r\n    if (typeof window.focusOnHost === 'function') {\r\n      focusOnHost(lat, lng);\r\n      return;\r\n    }\r\n\r\n    if (window.ggMap && window.google) {\r\n      const pos = new google.maps.LatLng(lat, lng);\r\n      ggMap.setCenter(pos);\r\n      ggMap.setZoom(15);\r\n      new google.maps.Marker({ position: pos, map: ggMap });\r\n    }\r\n  });\r\n<\/script>\r\n\r\n\r\n\r\n&#8211; AVATAR &#8211;>\r\n<div id=\"avatarContainer\" onclick=\"showAvatarCloud()\" \r\n     style=\"position:fixed; bottom:80px; right:20px; z-index:9999; cursor:pointer; display:none;\">\r\n  <img decoding=\"async\" src=\"http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/07\/Screenshot_20231118-120724_Instagram-scaled.jpg\" \r\n       style=\"width:180px; height:auto; border-radius: 50% \/ 30%; object-fit: cover; box-shadow: 0 0 12px aqua; filter: invert(100%) contrast(120%) brightness(110%);\">\r\n<\/div>\r\n\r\n<!-- CLOUD BUBBLE -->\r\n<div id=\"avatarCloud\" style=\"position:fixed; bottom:310px; right:30px; max-width:250px; background:rgba(0,0,0,0.7); \r\n     color:white; font-family:Orbitron, sans-serif; font-size:12px; line-height:16px; border-radius:20px 20px 20px 0px; \r\n     padding:14px 16px; box-shadow:0 0 15px aqua; display:none; z-index:9999; text-align:center;\r\n     border: 1px solid aqua;\">\r\n  <div id=\"avatarCloudMsg\">Loading&#8230;<\/div>\r\n  <div style=\"margin-top:10px;\">\r\n    <button onclick=\"acceptAvatarSuggestion()\" style=\"background:lime; color:black; border:none; padding:6px 10px; font-weight:bold;\">Yes<\/button>\r\n    <button onclick=\"dismissAvatarCloud()\" style=\"background:aqua; color:white; border:none; padding:6px 10px; font-weight:bold;\">No<\/button>\r\n  <\/div>\r\n  <div style=\"position:absolute; bottom:-18px; right:10px; width:0; height:0; border-left:10px solid transparent; \r\n              border-right:10px solid transparent; border-top:18px solid rgba(0,255,255,0.6); filter:blur(0.5px);\">\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- MOBILE ASSISTANT BUTTON -->\r\n<div id=\"avatarMobileBtn\" onclick=\"toggleMobileAvatar()\" style=\"display:none;\">\r\n  \ud83d\udc64 Assistant\r\n<\/div>\r\n\r\n<!-- ESTILOS -->\r\n<style>\r\n  #avatarMobileBtn {\r\n    position: fixed;\r\n    bottom: 18px;\r\n    right: 18px;\r\n    z-index: 9999;\r\n    background: rgba(0, 0, 0, 0.7);\r\n    color: white;\r\n    font-family: Orbitron, sans-serif;\r\n    font-size: 13px;\r\n    padding: 10px 14px;\r\n    border: 2px solid aqua;\r\n    border-radius: 14px;\r\n    box-shadow: 0 0 12px aqua;\r\n    cursor: pointer;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }\r\n\r\n  @media (min-width: 769px) {\r\n    #avatarMobileBtn {\r\n      display: none !important;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 768px) {\r\n    #avatarContainer {\r\n      bottom: 30px !important;\r\n      right: 90px !important;\r\n      width: 100px !important;\r\n      display: none;\r\n      pointer-events: none;\r\n    }\r\n\r\n    #avatarContainer img {\r\n      width: 100%;\r\n      height: auto;\r\n      border-radius: 50% \/ 30%;\r\n      object-fit: cover;\r\n      filter: grayscale(0%) brightness(1.1) contrast(1.2);\r\n      box-shadow: 0 0 12px aqua;\r\n    }\r\n  }\r\n\r\n  @media (min-width: 769px) {\r\n    #avatarContainer {\r\n      pointer-events: auto;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<!-- L\u00d3GICA -->\r\n<script>\r\n  const entertainmentQuestions = [\r\n    \"Ready to see what\u2019s out there today?\",\r\n    \"Want entertainment options nearby?\",\r\n    \"Looking for something fun to do?\",\r\n    \"Need ideas for your free time?\",\r\n    \"Want something exciting tonight?\"\r\n  ];\r\n\r\n  const gastronomyQuestions = [\r\n    \"Want to see gastronomy options nearby?\",\r\n    \"Ready to have dinner tonight?\",\r\n    \"Would you like some brunch spots?\",\r\n    \"Hungry for something special?\",\r\n    \"Looking for restaurants around you?\"\r\n  ];\r\n\r\n  function showAvatarCloud(forcedType = null) {\r\n    const hour = new Date().getHours();\r\n    const type = forcedType || (hour % 2 === 0 ? \"gastronomy\" : \"entertainment\");\r\n    const question = (type === \"gastronomy\" ? gastronomyQuestions : entertainmentQuestions)[Math.floor(Math.random() * 5)];\r\n\r\n    document.getElementById(\"avatarCloudMsg\").innerText = question;\r\n    document.getElementById(\"avatarCloud\").style.display = \"block\";\r\n  }\r\n\r\n  function acceptAvatarSuggestion() {\r\n    dismissAvatarCloud();\r\n    alert(\"\u2705 Showing Aries recommendations near you...\");\r\n  }\r\n\r\n  function dismissAvatarCloud() {\r\n    document.getElementById(\"avatarCloud\").style.display = \"none\";\r\n  }\r\n\r\n  \/\/ \ud83d\udcbb Show avatar automatically after 3 seconds (desktop only)\r\n  function showAvatarAssistant() {\r\n    const avatar = document.getElementById(\"avatarContainer\");\r\n    if (window.innerWidth > 768) {\r\n      avatar.style.display = \"block\";\r\n      avatar.style.pointerEvents = \"auto\";\r\n    }\r\n  }\r\n  setTimeout(showAvatarAssistant, 3000);\r\n\r\n  \/\/ \ud83d\udcf1 Toggle mobile avatar on\/off\r\n  let avatarVisible = false;\r\n  function toggleMobileAvatar() {\r\n    const avatar = document.getElementById(\"avatarContainer\");\r\n    const btn = document.getElementById(\"avatarMobileBtn\");\r\n\r\n    if (!avatarVisible) {\r\n      avatar.style.display = \"block\";\r\n      avatar.style.pointerEvents = \"auto\";\r\n      showAvatarCloud();\r\n      btn.innerHTML = \"\u274c Close\";\r\n    } else {\r\n      avatar.style.display = \"none\";\r\n      avatar.style.pointerEvents = \"none\";\r\n      dismissAvatarCloud();\r\n      btn.innerHTML = \"\ud83d\udc64 Assistant\";\r\n    }\r\n\r\n    avatarVisible = !avatarVisible;\r\n  }\r\n\r\n  \/\/ \ud83d\udcf1 Show mobile button on load\r\n  window.addEventListener(\"load\", () => {\r\n    if (window.innerWidth <= 768) {\r\n      document.getElementById(\"avatarMobileBtn\").style.display = \"flex\";\r\n    }\r\n  });\r\n<\/script>\r\n\r\n\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB \u2014 FULL HIDDEN CONTROL PANEL V1\r\nFULL-SCREEN WORDPRESS HIDDEN PAGE\r\n\r\nOPEN WITH:\r\n?travelpanel=1\r\nor\r\n?tcadmin=1\r\n\r\nAJAX ACTIONS EXPECTED:\r\n- ggg_tc_get_inventory\r\n- ggg_tc_save_inventory\r\n\r\nAJAX ENDPOINT:\r\n- \/GGG\/wp-admin\/admin-ajax.php\r\n\r\nTHIS PAGE MANAGES:\r\n- Astro Travel\r\n- Explore Medell\u00edn\r\n- Local Services\r\n\r\nIMPORTANT:\r\nThe matching WordPress AJAX PHP handlers must be installed separately.\r\n========================================================= -->\r\n\r\n<style>\r\nhtml.btcp-active,\r\nbody.btcp-active{\r\n  margin:0!important;\r\n  padding:0!important;\r\n  width:100%!important;\r\n  max-width:none!important;\r\n  min-height:100%!important;\r\n  overflow:hidden!important;\r\n  background:#01030a!important;\r\n}\r\n\r\nbody.btcp-hard-hide > *:not(#btcpOverlay){\r\n  visibility:hidden!important;\r\n}\r\n\r\nbody.btcp-hard-hide #btcpOverlay,\r\nbody.btcp-hard-hide #btcpOverlay *{\r\n  visibility:visible!important;\r\n}\r\n\r\n#btcpOverlay{\r\n  --bg:#01030a;\r\n  --panel:#07101f;\r\n  --panel2:#0b1730;\r\n  --line:rgba(255,255,255,.11);\r\n  --soft:rgba(235,246,255,.72);\r\n  --white:#f8fbff;\r\n  --cyan:#53f3ff;\r\n  --cyan2:#00b8ff;\r\n  --violet:#8b5cf6;\r\n  --gold:#f4d27a;\r\n  --green:#70f7a2;\r\n  --red:#ff6b8a;\r\n  --shadow:0 25px 80px rgba(0,0,0,.55);\r\n\r\n  position:fixed!important;\r\n  inset:0!important;\r\n  width:100vw!important;\r\n  height:100vh!important;\r\n  z-index:2147483647!important;\r\n  display:none;\r\n  overflow:hidden;\r\n  color:var(--white);\r\n  font-family:Arial,Helvetica,sans-serif!important;\r\n  background:\r\n    radial-gradient(circle at 12% 10%,rgba(83,243,255,.12),transparent 24%),\r\n    radial-gradient(circle at 88% 12%,rgba(139,92,246,.14),transparent 26%),\r\n    radial-gradient(circle at 50% 100%,rgba(244,210,122,.07),transparent 30%),\r\n    linear-gradient(180deg,#01030a,#06101f 52%,#01030a);\r\n}\r\n\r\n#btcpOverlay *{box-sizing:border-box}\r\n\r\n.btcp-app{\r\n  width:100%;\r\n  height:100%;\r\n  display:grid;\r\n  grid-template-columns:280px minmax(0,1fr);\r\n}\r\n\r\n.btcp-sidebar{\r\n  min-width:0;\r\n  height:100vh;\r\n  overflow:auto;\r\n  padding:22px 16px;\r\n  border-right:1px solid var(--line);\r\n  background:\r\n    linear-gradient(180deg,rgba(7,16,31,.97),rgba(3,8,19,.98));\r\n  box-shadow:18px 0 50px rgba(0,0,0,.24);\r\n}\r\n\r\n.btcp-brand{\r\n  padding:18px;\r\n  border:1px solid rgba(83,243,255,.18);\r\n  border-radius:26px;\r\n  background:\r\n    radial-gradient(circle at top left,rgba(83,243,255,.12),transparent 40%),\r\n    rgba(255,255,255,.035);\r\n  box-shadow:0 0 28px rgba(83,243,255,.08);\r\n}\r\n\r\n.btcp-brand-kicker,\r\n.btcp-eyebrow,\r\n.btcp-label,\r\n.btcp-nav-label,\r\n.btcp-stat-label,\r\n.btcp-item-route,\r\n.btcp-status-label{\r\n  text-transform:uppercase;\r\n  letter-spacing:.16em;\r\n  font-weight:900;\r\n}\r\n\r\n.btcp-brand-kicker{\r\n  color:var(--cyan);\r\n  font-size:.66rem;\r\n}\r\n\r\n.btcp-brand h1{\r\n  margin:10px 0 0;\r\n  font-size:1.45rem;\r\n  line-height:.95;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.btcp-brand p{\r\n  margin:10px 0 0;\r\n  color:var(--soft);\r\n  line-height:1.5;\r\n  font-size:.78rem;\r\n}\r\n\r\n.btcp-server{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:9px;\r\n  margin-top:14px;\r\n  padding:9px 11px;\r\n  border-radius:999px;\r\n  border:1px solid var(--line);\r\n  background:rgba(0,0,0,.22);\r\n  font-size:.72rem;\r\n}\r\n\r\n.btcp-server-dot{\r\n  width:9px;\r\n  height:9px;\r\n  flex:0 0 9px;\r\n  border-radius:50%;\r\n  background:#94a3b8;\r\n  box-shadow:0 0 12px currentColor;\r\n}\r\n\r\n.btcp-server.loading .btcp-server-dot{background:var(--gold)}\r\n.btcp-server.ok .btcp-server-dot{background:var(--green)}\r\n.btcp-server.error .btcp-server-dot{background:var(--red)}\r\n\r\n.btcp-nav{\r\n  margin-top:18px;\r\n  display:grid;\r\n  gap:8px;\r\n}\r\n\r\n.btcp-nav-label{\r\n  padding:8px 10px 3px;\r\n  color:rgba(235,246,255,.45);\r\n  font-size:.63rem;\r\n}\r\n\r\n.btcp-nav-btn{\r\n  width:100%;\r\n  min-height:48px;\r\n  padding:0 14px;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:10px;\r\n  border:1px solid transparent;\r\n  border-radius:16px;\r\n  background:transparent;\r\n  color:#dceaff;\r\n  cursor:pointer;\r\n  text-align:left;\r\n  font-weight:800;\r\n  transition:.18s ease;\r\n}\r\n\r\n.btcp-nav-btn:hover{\r\n  background:rgba(255,255,255,.05);\r\n  border-color:var(--line);\r\n}\r\n\r\n.btcp-nav-btn.active{\r\n  background:\r\n    linear-gradient(135deg,rgba(83,243,255,.14),rgba(139,92,246,.12));\r\n  border-color:rgba(83,243,255,.28);\r\n  box-shadow:0 0 20px rgba(83,243,255,.08);\r\n  color:#fff;\r\n}\r\n\r\n.btcp-nav-count{\r\n  min-width:30px;\r\n  height:25px;\r\n  padding:0 8px;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.07);\r\n  color:#c7faff;\r\n  font-size:.7rem;\r\n}\r\n\r\n.btcp-side-actions{\r\n  margin-top:20px;\r\n  display:grid;\r\n  gap:9px;\r\n}\r\n\r\n.btcp-main{\r\n  min-width:0;\r\n  height:100vh;\r\n  overflow:auto;\r\n  padding:20px;\r\n}\r\n\r\n.btcp-topbar{\r\n  position:sticky;\r\n  top:0;\r\n  z-index:30;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:16px;\r\n  min-height:76px;\r\n  padding:14px 18px;\r\n  border:1px solid var(--line);\r\n  border-radius:24px;\r\n  background:rgba(3,8,19,.78);\r\n  backdrop-filter:blur(18px);\r\n  box-shadow:0 16px 48px rgba(0,0,0,.28);\r\n}\r\n\r\n.btcp-top-title h2{\r\n  margin:0;\r\n  font-size:clamp(1.35rem,2.4vw,2.35rem);\r\n  text-transform:uppercase;\r\n  line-height:1;\r\n}\r\n\r\n.btcp-top-title p{\r\n  margin:7px 0 0;\r\n  color:var(--soft);\r\n  font-size:.8rem;\r\n}\r\n\r\n.btcp-top-actions{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:flex-end;\r\n  flex-wrap:wrap;\r\n  gap:9px;\r\n}\r\n\r\n.btcp-btn{\r\n  min-height:42px;\r\n  padding:0 15px;\r\n  border:1px solid var(--line);\r\n  border-radius:14px;\r\n  background:rgba(255,255,255,.055);\r\n  color:#fff;\r\n  cursor:pointer;\r\n  font-size:.76rem;\r\n  font-weight:900;\r\n  letter-spacing:.08em;\r\n  text-transform:uppercase;\r\n  transition:.18s ease;\r\n}\r\n\r\n.btcp-btn:hover{\r\n  transform:translateY(-1px);\r\n  border-color:rgba(83,243,255,.34);\r\n  box-shadow:0 0 18px rgba(83,243,255,.10);\r\n}\r\n\r\n.btcp-btn.primary{\r\n  border:none;\r\n  color:#061018;\r\n  background:linear-gradient(135deg,var(--cyan),#b7fbff);\r\n  box-shadow:0 12px 28px rgba(83,243,255,.18);\r\n}\r\n\r\n.btcp-btn.gold{\r\n  border:none;\r\n  color:#171105;\r\n  background:linear-gradient(135deg,var(--gold),#fff0b4);\r\n}\r\n\r\n.btcp-btn.danger{\r\n  border-color:rgba(255,107,138,.28);\r\n  color:#ffd8e0;\r\n  background:rgba(255,107,138,.08);\r\n}\r\n\r\n.btcp-btn.small{\r\n  min-height:35px;\r\n  padding:0 11px;\r\n  border-radius:11px;\r\n  font-size:.66rem;\r\n}\r\n\r\n.btcp-content{\r\n  padding:20px 0 70px;\r\n}\r\n\r\n.btcp-view{display:none}\r\n.btcp-view.active{display:block}\r\n\r\n.btcp-dashboard-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n  gap:14px;\r\n}\r\n\r\n.btcp-stat{\r\n  min-height:140px;\r\n  padding:20px;\r\n  border:1px solid var(--line);\r\n  border-radius:26px;\r\n  background:\r\n    radial-gradient(circle at top right,rgba(83,243,255,.09),transparent 38%),\r\n    linear-gradient(180deg,rgba(11,23,48,.86),rgba(5,11,25,.94));\r\n  box-shadow:var(--shadow);\r\n}\r\n\r\n.btcp-stat-value{\r\n  margin-top:18px;\r\n  font-size:2.5rem;\r\n  line-height:1;\r\n  font-weight:900;\r\n}\r\n\r\n.btcp-stat-label{\r\n  color:var(--soft);\r\n  font-size:.67rem;\r\n}\r\n\r\n.btcp-grid-two{\r\n  margin-top:16px;\r\n  display:grid;\r\n  grid-template-columns:minmax(390px,.86fr) minmax(480px,1.14fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.btcp-panel{\r\n  min-width:0;\r\n  padding:20px;\r\n  border:1px solid var(--line);\r\n  border-radius:28px;\r\n  background:\r\n    radial-gradient(circle at top left,rgba(139,92,246,.07),transparent 30%),\r\n    linear-gradient(180deg,rgba(10,19,40,.89),rgba(4,9,21,.96));\r\n  box-shadow:var(--shadow);\r\n}\r\n\r\n.btcp-panel-head{\r\n  display:flex;\r\n  align-items:flex-start;\r\n  justify-content:space-between;\r\n  gap:14px;\r\n  margin-bottom:18px;\r\n}\r\n\r\n.btcp-panel-head h3{\r\n  margin:0;\r\n  font-size:1.2rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.btcp-panel-head p{\r\n  margin:7px 0 0;\r\n  color:var(--soft);\r\n  font-size:.78rem;\r\n  line-height:1.55;\r\n}\r\n\r\n.btcp-form-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  gap:13px;\r\n}\r\n\r\n.btcp-field{\r\n  min-width:0;\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:7px;\r\n}\r\n\r\n.btcp-field.full{grid-column:1\/-1}\r\n\r\n.btcp-label{\r\n  color:rgba(235,246,255,.58);\r\n  font-size:.63rem;\r\n}\r\n\r\n.btcp-input,\r\n.btcp-select,\r\n.btcp-textarea{\r\n  width:100%;\r\n  border:1px solid rgba(255,255,255,.12);\r\n  border-radius:14px;\r\n  background:rgba(0,0,0,.28);\r\n  color:#fff;\r\n  outline:none;\r\n  font:inherit;\r\n}\r\n\r\n.btcp-input,\r\n.btcp-select{\r\n  height:46px;\r\n  padding:0 13px;\r\n}\r\n\r\n.btcp-textarea{\r\n  min-height:110px;\r\n  padding:12px 13px;\r\n  resize:vertical;\r\n  line-height:1.55;\r\n}\r\n\r\n.btcp-input:focus,\r\n.btcp-select:focus,\r\n.btcp-textarea:focus{\r\n  border-color:rgba(83,243,255,.48);\r\n  box-shadow:0 0 0 3px rgba(83,243,255,.07);\r\n}\r\n\r\n.btcp-select option{\r\n  background:#07101f;\r\n  color:#fff;\r\n}\r\n\r\n.btcp-checks{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  gap:10px;\r\n}\r\n\r\n.btcp-check{\r\n  min-height:48px;\r\n  display:flex;\r\n  align-items:center;\r\n  gap:9px;\r\n  padding:10px 12px;\r\n  border:1px solid var(--line);\r\n  border-radius:14px;\r\n  background:rgba(255,255,255,.035);\r\n  color:#dceaff;\r\n  font-size:.78rem;\r\n  font-weight:800;\r\n}\r\n\r\n.btcp-check input{\r\n  width:17px;\r\n  height:17px;\r\n  accent-color:var(--cyan);\r\n}\r\n\r\n.btcp-form-actions{\r\n  margin-top:16px;\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:9px;\r\n}\r\n\r\n.btcp-preview{\r\n  display:grid;\r\n  grid-template-columns:150px minmax(0,1fr);\r\n  gap:14px;\r\n  margin-top:16px;\r\n  padding:14px;\r\n  border:1px solid var(--line);\r\n  border-radius:20px;\r\n  background:rgba(255,255,255,.025);\r\n}\r\n\r\n.btcp-preview-image{\r\n  min-height:115px;\r\n  border-radius:16px;\r\n  background:#02050d center\/cover no-repeat;\r\n  border:1px solid var(--line);\r\n}\r\n\r\n.btcp-preview-copy h4{\r\n  margin:0;\r\n  font-size:1.05rem;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.btcp-preview-copy p{\r\n  margin:8px 0 0;\r\n  color:var(--soft);\r\n  line-height:1.55;\r\n  font-size:.78rem;\r\n}\r\n\r\n.btcp-filterbar{\r\n  display:grid;\r\n  grid-template-columns:minmax(200px,1fr) repeat(3,minmax(145px,.34fr));\r\n  gap:10px;\r\n  margin-bottom:14px;\r\n}\r\n\r\n.btcp-list{\r\n  display:grid;\r\n  gap:11px;\r\n}\r\n\r\n.btcp-empty{\r\n  padding:34px 20px;\r\n  border:1px dashed rgba(255,255,255,.16);\r\n  border-radius:20px;\r\n  color:var(--soft);\r\n  text-align:center;\r\n  line-height:1.7;\r\n}\r\n\r\n.btcp-item{\r\n  display:grid;\r\n  grid-template-columns:88px minmax(0,1fr) auto;\r\n  gap:14px;\r\n  align-items:center;\r\n  padding:12px;\r\n  border:1px solid var(--line);\r\n  border-radius:20px;\r\n  background:\r\n    linear-gradient(180deg,rgba(255,255,255,.04),rgba(255,255,255,.02));\r\n}\r\n\r\n.btcp-item.inactive{opacity:.58}\r\n\r\n.btcp-item-image{\r\n  width:88px;\r\n  height:76px;\r\n  border-radius:15px;\r\n  background:#02050d center\/cover no-repeat;\r\n  border:1px solid var(--line);\r\n}\r\n\r\n.btcp-item-main{min-width:0}\r\n\r\n.btcp-item-name{\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n  white-space:nowrap;\r\n  font-size:1rem;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.btcp-item-route{\r\n  margin-top:6px;\r\n  color:#9eefff;\r\n  font-size:.61rem;\r\n  line-height:1.5;\r\n}\r\n\r\n.btcp-item-meta{\r\n  margin-top:7px;\r\n  color:var(--soft);\r\n  font-size:.74rem;\r\n  line-height:1.45;\r\n}\r\n\r\n.btcp-badges{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:6px;\r\n  margin-top:8px;\r\n}\r\n\r\n.btcp-badge{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  min-height:25px;\r\n  padding:0 8px;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.06);\r\n  border:1px solid var(--line);\r\n  font-size:.62rem;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n}\r\n\r\n.btcp-badge.active{\r\n  color:#d5ffe1;\r\n  border-color:rgba(112,247,162,.25);\r\n  background:rgba(112,247,162,.08);\r\n}\r\n\r\n.btcp-badge.featured{\r\n  color:#fff0bd;\r\n  border-color:rgba(244,210,122,.25);\r\n  background:rgba(244,210,122,.08);\r\n}\r\n\r\n.btcp-item-actions{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,auto);\r\n  gap:7px;\r\n}\r\n\r\n.btcp-route-help{\r\n  margin-top:13px;\r\n  padding:13px 14px;\r\n  border:1px solid rgba(83,243,255,.15);\r\n  border-radius:16px;\r\n  background:rgba(83,243,255,.055);\r\n  color:#dffcff;\r\n  font-size:.76rem;\r\n  line-height:1.55;\r\n}\r\n\r\n.btcp-toast{\r\n  position:fixed;\r\n  right:24px;\r\n  bottom:24px;\r\n  z-index:2147483647;\r\n  max-width:min(420px,calc(100vw - 40px));\r\n  padding:14px 16px;\r\n  border:1px solid var(--line);\r\n  border-radius:16px;\r\n  background:rgba(3,8,19,.94);\r\n  color:#fff;\r\n  box-shadow:0 20px 55px rgba(0,0,0,.45);\r\n  transform:translateY(20px);\r\n  opacity:0;\r\n  pointer-events:none;\r\n  transition:.2s ease;\r\n  font-size:.8rem;\r\n  line-height:1.5;\r\n}\r\n\r\n.btcp-toast.show{\r\n  transform:translateY(0);\r\n  opacity:1;\r\n}\r\n\r\n.btcp-toast.success{border-color:rgba(112,247,162,.35)}\r\n.btcp-toast.error{border-color:rgba(255,107,138,.4)}\r\n.btcp-toast.warning{border-color:rgba(244,210,122,.4)}\r\n\r\n.btcp-modal{\r\n  position:fixed;\r\n  inset:0;\r\n  z-index:2147483647;\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:20px;\r\n  background:rgba(0,0,0,.72);\r\n  backdrop-filter:blur(12px);\r\n}\r\n\r\n.btcp-modal.show{display:flex}\r\n\r\n.btcp-modal-card{\r\n  width:min(760px,94vw);\r\n  max-height:86vh;\r\n  overflow:auto;\r\n  padding:22px;\r\n  border:1px solid var(--line);\r\n  border-radius:26px;\r\n  background:linear-gradient(180deg,#0b1730,#040915);\r\n  box-shadow:0 30px 90px rgba(0,0,0,.65);\r\n}\r\n\r\n.btcp-modal-card h3{\r\n  margin:0;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.btcp-modal-card p{\r\n  color:var(--soft);\r\n  line-height:1.65;\r\n}\r\n\r\n.btcp-codebox{\r\n  width:100%;\r\n  min-height:260px;\r\n  padding:14px;\r\n  border:1px solid var(--line);\r\n  border-radius:16px;\r\n  background:#01030a;\r\n  color:#c7faff;\r\n  font:12px\/1.55 Consolas,monospace;\r\n  resize:vertical;\r\n}\r\n\r\n.btcp-mobile-open{\r\n  display:none;\r\n}\r\n\r\n@media(max-width:1180px){\r\n  .btcp-app{grid-template-columns:230px minmax(0,1fr)}\r\n  .btcp-dashboard-grid{grid-template-columns:repeat(2,minmax(0,1fr))}\r\n  .btcp-grid-two{grid-template-columns:1fr}\r\n  .btcp-filterbar{grid-template-columns:1fr 1fr}\r\n}\r\n\r\n@media(max-width:780px){\r\n  .btcp-app{display:block}\r\n  .btcp-sidebar{\r\n    position:fixed;\r\n    inset:0 auto 0 0;\r\n    z-index:80;\r\n    width:min(310px,88vw);\r\n    transform:translateX(-105%);\r\n    transition:.22s ease;\r\n  }\r\n  .btcp-sidebar.open{transform:translateX(0)}\r\n  .btcp-main{padding:10px}\r\n  .btcp-mobile-open{display:inline-flex}\r\n  .btcp-topbar{\r\n    align-items:flex-start;\r\n    flex-direction:column;\r\n    border-radius:18px;\r\n  }\r\n  .btcp-dashboard-grid{grid-template-columns:1fr}\r\n  .btcp-form-grid,\r\n  .btcp-checks,\r\n  .btcp-filterbar{grid-template-columns:1fr}\r\n  .btcp-item{\r\n    grid-template-columns:74px minmax(0,1fr);\r\n  }\r\n  .btcp-item-image{\r\n    width:74px;\r\n    height:68px;\r\n  }\r\n  .btcp-item-actions{\r\n    grid-column:1\/-1;\r\n    grid-template-columns:repeat(4,minmax(0,1fr));\r\n  }\r\n  .btcp-preview{grid-template-columns:1fr}\r\n}\r\n<\/style>\r\n\r\n<div id=\"btcpOverlay\" aria-hidden=\"true\">\r\n  <div class=\"btcp-app\">\r\n\r\n    <aside id=\"btcpSidebar\" class=\"btcp-sidebar\">\r\n      <div class=\"btcp-brand\">\r\n        <div class=\"btcp-brand-kicker\">Hidden Administration Page<\/div>\r\n        <h1>Bliss Travel Control Center<\/h1>\r\n        <p>Manage the host ecosystem used by Astro Travel, Explore Medell\u00edn, and Local Services.<\/p>\r\n\r\n        <div id=\"btcpServer\" class=\"btcp-server loading\">\r\n          <span class=\"btcp-server-dot\"><\/span>\r\n          <span id=\"btcpServerText\">Waiting to connect<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <nav class=\"btcp-nav\">\r\n        <div class=\"btcp-nav-label\">Overview<\/div>\r\n\r\n        <button class=\"btcp-nav-btn active\" type=\"button\" data-view=\"dashboard\">\r\n          <span>Dashboard<\/span>\r\n          <span id=\"btcpCountAll\" class=\"btcp-nav-count\">0<\/span>\r\n        <\/button>\r\n\r\n        <div class=\"btcp-nav-label\">Host Ecosystem<\/div>\r\n\r\n        <button class=\"btcp-nav-btn\" type=\"button\" data-view=\"astro\">\r\n          <span>Astro Travel<\/span>\r\n          <span id=\"btcpCountAstro\" class=\"btcp-nav-count\">0<\/span>\r\n        <\/button>\r\n\r\n        <button class=\"btcp-nav-btn\" type=\"button\" data-view=\"explore\">\r\n          <span>Explore Medell\u00edn<\/span>\r\n          <span id=\"btcpCountExplore\" class=\"btcp-nav-count\">0<\/span>\r\n        <\/button>\r\n\r\n        <button class=\"btcp-nav-btn\" type=\"button\" data-view=\"services\">\r\n          <span>Local Services<\/span>\r\n          <span id=\"btcpCountServices\" class=\"btcp-nav-count\">0<\/span>\r\n        <\/button>\r\n\r\n<button class=\"btcp-nav-btn\" type=\"button\" data-view=\"tiadmin\">\r\n  <span>Travel Intelligence<\/span>\r\n  <span id=\"btcpCountTIAdmin\" class=\"btcp-nav-count\">0<\/span>\r\n<\/button>\r\n\r\n        <div class=\"btcp-nav-label\">Inventory Tools<\/div>\r\n\r\n        <button class=\"btcp-nav-btn\" type=\"button\" data-view=\"inventory\">\r\n          <span>All Hosts<\/span>\r\n          <span id=\"btcpCountActive\" class=\"btcp-nav-count\">0<\/span>\r\n        <\/button>\r\n      <\/nav>\r\n\r\n      <div class=\"btcp-side-actions\">\r\n        <button id=\"btcpSaveAllSide\" class=\"btcp-btn primary\" type=\"button\">Save All to Website<\/button>\r\n        <button id=\"btcpReloadSide\" class=\"btcp-btn\" type=\"button\">Reload From Website<\/button>\r\n        <button id=\"btcpExportBtn\" class=\"btcp-btn\" type=\"button\">Export Backup<\/button>\r\n        <button id=\"btcpImportBtn\" class=\"btcp-btn\" type=\"button\">Import Backup<\/button>\r\n        <button id=\"btcpClosePanel\" class=\"btcp-btn danger\" type=\"button\">Close Control Panel<\/button>\r\n      <\/div>\r\n    <\/aside>\r\n\r\n    <main class=\"btcp-main\">\r\n      <header class=\"btcp-topbar\">\r\n        <div class=\"btcp-top-title\">\r\n          <button id=\"btcpMobileOpen\" class=\"btcp-btn small btcp-mobile-open\" type=\"button\">Menu<\/button>\r\n          <h2 id=\"btcpPageTitle\">Dashboard<\/h2>\r\n          <p id=\"btcpPageSubtitle\">Live overview of the Travel Club host inventory.<\/p>\r\n        <\/div>\r\n\r\n        <div class=\"btcp-top-actions\">\r\n          <button id=\"btcpNewHostTop\" class=\"btcp-btn gold\" type=\"button\">Add New Host<\/button>\r\n          <button id=\"btcpSaveAllTop\" class=\"btcp-btn primary\" type=\"button\">Save All to Website<\/button>\r\n        <\/div>\r\n      <\/header>\r\n\r\n      <div class=\"btcp-content\">\r\n\r\n        <section id=\"btcpViewDashboard\" class=\"btcp-view active\">\r\n          <div class=\"btcp-dashboard-grid\">\r\n            <article class=\"btcp-stat\">\r\n              <div class=\"btcp-stat-label\">Total Hosts<\/div>\r\n              <div id=\"btcpStatTotal\" class=\"btcp-stat-value\">0<\/div>\r\n            <\/article>\r\n\r\n            <article class=\"btcp-stat\">\r\n              <div class=\"btcp-stat-label\">Active Hosts<\/div>\r\n              <div id=\"btcpStatActive\" class=\"btcp-stat-value\">0<\/div>\r\n            <\/article>\r\n\r\n            <article class=\"btcp-stat\">\r\n              <div class=\"btcp-stat-label\">Featured Hosts<\/div>\r\n              <div id=\"btcpStatFeatured\" class=\"btcp-stat-value\">0<\/div>\r\n            <\/article>\r\n\r\n            <article class=\"btcp-stat\">\r\n              <div class=\"btcp-stat-label\">Hidden Hosts<\/div>\r\n              <div id=\"btcpStatHidden\" class=\"btcp-stat-value\">0<\/div>\r\n            <\/article>\r\n          <\/div>\r\n\r\n          <div class=\"btcp-grid-two\">\r\n            <div class=\"btcp-panel\">\r\n              <div class=\"btcp-panel-head\">\r\n                <div>\r\n                  <h3>Quick Add<\/h3>\r\n                  <p>Choose where the host belongs, then complete the editor.<\/p>\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <div class=\"btcp-form-grid\">\r\n                <div class=\"btcp-field full\">\r\n                  <label class=\"btcp-label\">Ecosystem Section<\/label>\r\n                  <select id=\"btcpQuickSection\" class=\"btcp-select\">\r\n                    <option value=\"astro\">Astro Travel<\/option>\r\n                    <option value=\"explore\">Explore Medell\u00edn<\/option>\r\n                    <option value=\"services\">Local Services<\/option>\r\n                  <\/select>\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <div class=\"btcp-form-actions\">\r\n                <button id=\"btcpQuickAdd\" class=\"btcp-btn primary\" type=\"button\">Open New Host Editor<\/button>\r\n              <\/div>\r\n\r\n              <div class=\"btcp-route-help\">\r\n                Astro uses Sign \u2192 Option \u2192 Suboption. Explore uses Guide \u2192 Option \u2192 Suboption. Local Services uses Service Type \u2192 Provider.\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"btcp-panel\">\r\n              <div class=\"btcp-panel-head\">\r\n                <div>\r\n                  <h3>Recent Inventory<\/h3>\r\n                  <p>The latest hosts currently loaded into this Control Panel.<\/p>\r\n                <\/div>\r\n              <\/div>\r\n              <div id=\"btcpRecentList\" class=\"btcp-list\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/section>\r\n\r\n        <section id=\"btcpViewAstro\" class=\"btcp-view\">\r\n          <div class=\"btcp-grid-two\">\r\n            <div class=\"btcp-panel\">\r\n              <div class=\"btcp-panel-head\">\r\n                <div>\r\n                  <h3>Astro Host Editor<\/h3>\r\n                  <p>Exact connection: Sign \u2192 Option \u2192 Suboption \u2192 Host.<\/p>\r\n                <\/div>\r\n                <button class=\"btcp-btn small\" type=\"button\" data-clear-form>Clear<\/button>\r\n              <\/div>\r\n              <div id=\"btcpAstroFormMount\"><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"btcp-panel\">\r\n              <div class=\"btcp-panel-head\">\r\n                <div>\r\n                  <h3>Astro Inventory<\/h3>\r\n                  <p>Hosts connected to the existing Astro paths.<\/p>\r\n                <\/div>\r\n              <\/div>\r\n              <div id=\"btcpAstroFilters\"><\/div>\r\n              <div id=\"btcpAstroList\" class=\"btcp-list\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/section>\r\n\r\n        <section id=\"btcpViewExplore\" class=\"btcp-view\">\r\n          <div class=\"btcp-grid-two\">\r\n            <div class=\"btcp-panel\">\r\n              <div class=\"btcp-panel-head\">\r\n                <div>\r\n                  <h3>Explore Medell\u00edn Host Editor<\/h3>\r\n                  <p>Guide \u2192 Option \u2192 Suboption \u2192 Host.<\/p>\r\n                <\/div>\r\n                <button class=\"btcp-btn small\" type=\"button\" data-clear-form>Clear<\/button>\r\n              <\/div>\r\n              <div id=\"btcpExploreFormMount\"><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"btcp-panel\">\r\n              <div class=\"btcp-panel-head\">\r\n                <div>\r\n                  <h3>Explore Inventory<\/h3>\r\n                  <p>Hosts connected to Explore Medell\u00edn guides.<\/p>\r\n                <\/div>\r\n              <\/div>\r\n              <div id=\"btcpExploreFilters\"><\/div>\r\n              <div id=\"btcpExploreList\" class=\"btcp-list\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/section>\r\n\r\n        <section id=\"btcpViewServices\" class=\"btcp-view\">\r\n          <div class=\"btcp-grid-two\">\r\n            <div class=\"btcp-panel\">\r\n              <div class=\"btcp-panel-head\">\r\n                <div>\r\n                  <h3>Local Service Provider Editor<\/h3>\r\n                  <p>Add unlimited drivers, concierges, translators, guides, and other providers.<\/p>\r\n                <\/div>\r\n                <button class=\"btcp-btn small\" type=\"button\" data-clear-form>Clear<\/button>\r\n              <\/div>\r\n              <div id=\"btcpServicesFormMount\"><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"btcp-panel\">\r\n              <div class=\"btcp-panel-head\">\r\n                <div>\r\n                  <h3>Service Provider Inventory<\/h3>\r\n                  <p>All providers connected to the Local Services ecosystem.<\/p>\r\n                <\/div>\r\n              <\/div>\r\n              <div id=\"btcpServicesFilters\"><\/div>\r\n              <div id=\"btcpServicesList\" class=\"btcp-list\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/section>\r\n\r\n        <section id=\"btcpViewInventory\" class=\"btcp-view\">\r\n          <div class=\"btcp-panel\">\r\n            <div class=\"btcp-panel-head\">\r\n              <div>\r\n                <h3>Complete Host Inventory<\/h3>\r\n                <p>Search, edit, duplicate, activate, hide, reorder, or delete any host.<\/p>\r\n              <\/div>\r\n            <\/div>\r\n            <div id=\"btcpAllFilters\"><\/div>\r\n            <div id=\"btcpAllList\" class=\"btcp-list\"><\/div>\r\n          <\/div>\r\n        <\/section>\r\n\r\n      <\/div>\r\n    <\/main>\r\n  <\/div>\r\n\r\n  <div id=\"btcpToast\" class=\"btcp-toast\"><\/div>\r\n\r\n  <div id=\"btcpBackupModal\" class=\"btcp-modal\" aria-hidden=\"true\">\r\n    <div class=\"btcp-modal-card\">\r\n      <h3 id=\"btcpBackupTitle\">Inventory Backup<\/h3>\r\n      <p id=\"btcpBackupCopy\">Copy or paste the complete JSON inventory below.<\/p>\r\n      <textarea id=\"btcpBackupBox\" class=\"btcp-codebox\"><\/textarea>\r\n      <div class=\"btcp-form-actions\">\r\n        <button id=\"btcpBackupApply\" class=\"btcp-btn primary\" type=\"button\">Apply Imported Inventory<\/button>\r\n        <button id=\"btcpBackupCopyBtn\" class=\"btcp-btn\" type=\"button\">Copy JSON<\/button>\r\n        <button id=\"btcpBackupClose\" class=\"btcp-btn danger\" type=\"button\">Close<\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  const AJAX_URL = \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n\r\nconst LOAD_ACTION =\r\n  \"ggg_tc_get_inventory\";\r\n\r\nconst SAVE_ACTION =\r\n  \"ggg_tc_save_inventory\";\r\n\r\nconst SAVE_SINGLE_ACTION =\r\n  \"ggg_tc_save_single_host\";\r\n\r\nconst LOCAL_SAFETY_KEY =\r\n  \"BLISS_TRAVEL_CONTROL_PANEL_SAFETY_V1\";\r\n\r\n  const ASTRO_SIGNS = [\r\n    {name:\"Aries\",suboptions:[\"Romantic\",\"Views\",\"Wild\",\"Exotic\"]},\r\n    {name:\"Taurus\",suboptions:[\"Discover\",\"Mystery\",\"Gastronomic\",\"Luxury\"]},\r\n    {name:\"Gemini\",suboptions:[\"Futuristic\",\"Relax\",\"Spa\",\"Nature\"]},\r\n    {name:\"Cancer\",suboptions:[\"Nite\",\"Relax\",\"Elegant\",\"Nature\"]},\r\n    {name:\"Leo\",suboptions:[\"Vibrant\",\"Mystery\",\"Gastronomic\",\"Nature\"]},\r\n    {name:\"Virgo\",suboptions:[\"Organized\",\"Mystery\",\"Artistic\",\"Luxury\"]},\r\n    {name:\"Libra\",suboptions:[\"Romantic\",\"Relax\",\"Organized\",\"Luxury\"]},\r\n    {name:\"Scorpio\",suboptions:[\"Discover\",\"Archeology\",\"Organized\",\"Gastronomic\"]},\r\n    {name:\"Sagittarius\",suboptions:[\"Discover\",\"Archeology\",\"Gastronomic\",\"Savage\"]},\r\n    {name:\"Capricorn\",suboptions:[\"Vibrant\",\"Relax\",\"Elegant\",\"Luxury\"]},\r\n    {name:\"Aquarius\",suboptions:[\"Futurist\",\"Memorable\",\"Elegant\",\"Luxury\"]},\r\n    {name:\"Pisces\",suboptions:[\"Artistic\",\"Relax\",\"Spa\",\"Nature\"]}\r\n  ];\r\n\r\n  const ASTRO_OPTIONS = [\r\n    \"Accommodations\",\r\n    \"Restaurants\",\r\n    \"Entertainment\",\r\n    \"VIP\"\r\n  ];\r\n\r\nconst TI_MATCH_OPTIONS = {\r\n  travelingWith:[\r\n    \"Solo\",\r\n    \"Couple\",\r\n    \"Friends\",\r\n    \"Family\",\r\n    \"Kids\",\r\n    \"Business Group\",\r\n    \"Pet\"\r\n  ],\r\n\r\n  travelStyles:[\r\n    \"Balanced\",\r\n    \"Luxury\",\r\n    \"Local & Authentic\",\r\n    \"Adventure\",\r\n    \"Relaxation\",\r\n    \"Romantic\",\r\n    \"Family\",\r\n    \"Business\",\r\n    \"Wellness\"\r\n  ],\r\n\r\n  budgets:[\r\n    \"$\",\r\n    \"$$\",\r\n    \"$$$\",\r\n    \"$$$$\",\r\n    \"Flexible\"\r\n  ],\r\n\r\n  tripLengths:[\r\n    \"1\u20133 Days\",\r\n    \"4\u20136 Days\",\r\n    \"7 Days\",\r\n    \"2 Weeks\",\r\n    \"1 Month\",\r\n    \"Long-Term\"\r\n  ],\r\n\r\n  transportation:[\r\n    \"Private Driver\",\r\n    \"Ride Share\",\r\n    \"Rental Car\",\r\n    \"Walking\",\r\n    \"Public Transportation\",\r\n    \"Luxury Transportation\",\r\n    \"Flexible\"\r\n  ],\r\n\r\n  paces:[\r\n    \"Slow & Relaxed\",\r\n    \"Balanced\",\r\n    \"Active\",\r\n    \"Full Schedule\"\r\n  ],\r\n\r\n  interests:[\r\n    \"Food\",\r\n    \"Coffee\",\r\n    \"Nature\",\r\n    \"Nightlife\",\r\n    \"Local Culture\",\r\n    \"History\",\r\n    \"Luxury\",\r\n    \"Shopping\",\r\n    \"Wellness\",\r\n    \"Medical Tourism\",\r\n    \"Entertainment\",\r\n    \"Adventure\",\r\n    \"Sustainability\",\r\n    \"Family Activities\",\r\n    \"Romantic Experiences\"\r\n  ],\r\n\r\n  foodStyle:[\r\n    \"Local Flavor\",\r\n    \"Premium Dining\",\r\n    \"Coffee\",\r\n    \"Brunch\",\r\n    \"Vegetarian\",\r\n    \"Seafood\",\r\n    \"Steak\",\r\n    \"Family Dining\",\r\n    \"Romantic Dining\",\r\n    \"Street Food\"\r\n  ],\r\n\r\n  preferredTimes:[\r\n    \"Early Morning\",\r\n    \"Morning\",\r\n    \"Afternoon\",\r\n    \"Evening\",\r\n    \"Late Night\"\r\n  ]\r\n};\r\n\r\n  const EXPLORE_GUIDES = [\r\n\r\n  \/* =====================================================\r\n     LEVEL 2\r\n  ===================================================== *\/\r\n\r\n  {\r\n  name: \"First Time Visitor\",\r\n  level: 2,\r\n  type: \"Medell\u00edn Visitor Intelligence\",\r\n  options: {\r\n    \"Live Medell\u00edn\": [\r\n      \"Weather Today\",\r\n      \"Air Quality & CO\u2082\",\r\n      \"Rain & UV\",\r\n      \"City Conditions\"\r\n    ],\r\n\r\n    \"Getting Around\": [\r\n      \"Medell\u00edn Metro\",\r\n      \"Airport Transportation\",\r\n      \"Taxis & Ride Apps\",\r\n      \"Walking & Accessibility\"\r\n    ],\r\n\r\n    \"Before You Arrive\": [\r\n      \"Arrival Checklist\",\r\n      \"Money & Payments\",\r\n      \"Phone & Internet\",\r\n      \"What to Pack\"\r\n    ],\r\n\r\n    \"My Smart Recommendations\": [\r\n  \"Featured\"\r\n]\r\n }\r\n},\r\n\r\n\r\n  {\r\n    name: \"Accommodations\",\r\n    level: 2,\r\n    type: \"Places to Stay\",\r\n    options: {\r\n      \"High-Rise\": [\r\n        \"1\u20133 Days\",\r\n        \"4\u20136 Days\",\r\n        \"7 Days\",\r\n        \"1 Month\"\r\n      ],\r\n\r\n      \"Historic\": [\r\n        \"1\u20133 Days\",\r\n        \"4\u20136 Days\",\r\n        \"7 Days\",\r\n        \"1 Month\"\r\n      ],\r\n\r\n      \"Eco-Stay\": [\r\n        \"1\u20133 Days\",\r\n        \"4\u20136 Days\",\r\n        \"7 Days\",\r\n        \"1 Month\"\r\n      ],\r\n\r\n      \"Mansions\": [\r\n        \"1\u20133 Days\",\r\n        \"4\u20136 Days\",\r\n        \"7 Days\",\r\n        \"1 Month\"\r\n      ]\r\n    }\r\n  },\r\n\r\n  {\r\n    name: \"Transportation\",\r\n    level: 2,\r\n    type: \"Mobility & Arrival\",\r\n    options: {\r\n      \"Heli\": [\r\n        \"Around\",\r\n        \"Go-To\",\r\n        \"Emergency\",\r\n        \"Adventure\"\r\n      ],\r\n\r\n      \"Yacht\": [\r\n        \"Around\",\r\n        \"Go-To\",\r\n        \"Emergency\",\r\n        \"Adventure\"\r\n      ],\r\n\r\n      \"Car\": [\r\n        \"Around\",\r\n        \"Go-To\",\r\n        \"Emergency\",\r\n        \"Adventure\"\r\n      ],\r\n\r\n      \"Driver\": [\r\n        \"Around\",\r\n        \"Go-To\",\r\n        \"Emergency\",\r\n        \"Adventure\"\r\n      ]\r\n    }\r\n  },\r\n\r\n  {\r\n    name: \"Local Culture\",\r\n    level: 2,\r\n    type: \"People & Heritage\",\r\n    options: {\r\n      \"Language & Expressions\": [\"Featured\"],\r\n      \"Neighborhood Life\": [\"Featured\"],\r\n      \"Food & Markets\": [\"Featured\"],\r\n      \"Customs & Etiquette\": [\"Featured\"]\r\n    }\r\n  },\r\n\r\n  {\r\n    name: \"Nature Guide\",\r\n    level: 2,\r\n    type: \"Nature & Outdoors\",\r\n    options: {\r\n      \"Mountain Adventures\": [\"Featured\"],\r\n      \"River Experiences\": [\"Featured\"],\r\n      \"Parks & Gardens\": [\"Featured\"],\r\n      \"Sunset Viewpoints\": [\"Featured\"]\r\n    }\r\n  },\r\n\r\n  {\r\n  name: \"Sustainability\",\r\n  level: 2,\r\n  type: \"Responsible Travel\",\r\n  options: {\r\n\r\n    \"Recycling\": [\r\n      \"Sponsor a Cleanup\",\r\n      \"Join a Cleanup\",\r\n      \"Recycling Tours\"\r\n    ],\r\n\r\n    \"Rivers & Canals\": [\r\n      \"Sponsor a Waterway Cleanup\",\r\n      \"Join a Waterway Cleanup\",\r\n      \"Water Conservation Tours\"\r\n    ],\r\n\r\n    \"Sustainable Agriculture\": [\r\n      \"Support a Farm or Garden\",\r\n      \"Join a Community Project\",\r\n      \"Farm & Composting Tours\"\r\n    ],\r\n\r\n    \"Energy & Conservation\": [\r\n      \"Support a Conservation Project\",\r\n      \"Clean Energy Tours\",\r\n      \"Learn How Energy Is Made\",\r\n      \"Energy-Saving Tips\"\r\n    ]\r\n\r\n  }\r\n},\r\n\r\n  {\r\n  name: \"Legacy\",\r\n  level: 2,\r\n  type: \"Dream \u2022 Connect \u2022 Create \u2022 Grow\",\r\n  options: {\r\n\r\n    \"Imagine\": [\r\n      \"Develop a New Idea\",\r\n      \"Find Collaborators\",\r\n      \"Create the Idea\",\r\n      \"Grow the Idea\"\r\n    ],\r\n\r\n    \"Exchange\": [\r\n      \"Exchange Ideas\",\r\n      \"Cultural, Skills or Business Exchange\",\r\n      \"Document the Exchange\",\r\n      \"Vacation Property Exchange\"\r\n    ],\r\n\r\n    \"Record\": [\r\n      \"Develop the Creative Concept\",\r\n      \"Connect With Local Creators\",\r\n      \"Produce Your Legacy\",\r\n      \"Grow Your Creation\"\r\n    ],\r\n\r\n    \"Franchise\": [\r\n      \"Imagine GGG in Your City\",\r\n      \"Connect Your City\",\r\n      \"Sponsor or Build a Stadium\",\r\n      \"Launch Gods Galaxy Game\"\r\n    ]\r\n\r\n  }\r\n},\r\n\r\n  \/* =====================================================\r\n     LEVEL 3\r\n  ===================================================== *\/\r\n\r\n  {\r\n    name: \"Discover\",\r\n    level: 3,\r\n    type: \"Premium Discovery\",\r\n    options: {\r\n      \"Adventure\": [\r\n        \"Air Adventures\",\r\n        \"Water Sports\",\r\n        \"Horseback Experiences\",\r\n        \"Extreme Adventures\"\r\n      ],\r\n\r\n      \"Ancestral\": [\r\n        \"Spiritual Heritage\",\r\n        \"Sacred Waters\",\r\n        \"Indigenous Heritage\",\r\n        \"Legends & Mysteries\"\r\n      ],\r\n\r\n      \"Cultural\": [\r\n        \"Art & Creativity\",\r\n        \"River Culture\",\r\n        \"Farms & Flavors\",\r\n        \"Medell\u00edn Identity\"\r\n      ],\r\n\r\n      \"Historic\": [\r\n        \"Antioquia Origins\",\r\n        \"City Development\",\r\n        \"Medell\u00edn Transformation\",\r\n        \"Sports History\"\r\n      ]\r\n    }\r\n  },\r\n\r\n  {\r\n  name: \"Entertainment\",\r\n  level: 3,\r\n  type: \"Events & Experiences\",\r\n  options: {\r\n    \"Concerts\": [\r\n      \"Backstage Experience\",\r\n      \"Private Concert Suite\",\r\n      \"VIP Concert Experience\",\r\n      \"On-Stage Viewing Experience\"\r\n    ],\r\n\r\n    \"Fashion\": [\r\n      \"Live Fashion Shows\",\r\n      \"Fashion & Shopping Malls\",\r\n      \"Digital Fashion Experience\",\r\n      \"Downtown Fashion District\"\r\n    ],\r\n\r\n    \"Comedy\": [\r\n      \"Live Comedy Shows\",\r\n      \"Stand-Up Comedy\",\r\n      \"Comedy City Experience\",\r\n      \"Book a Comedian\"\r\n    ],\r\n\r\n    \"Sports\": [\r\n      \"Sports Lessons & Training\",\r\n      \"Attend a Live Game\",\r\n      \"Play With Locals\",\r\n      \"Stadium & Sports Tours\"\r\n    ]\r\n  }\r\n  },\r\n\r\n {\r\n  name: \"Medical Tourism\",\r\n  level: 3,\r\n  type: \"Health, Treatment & Recovery\",\r\n  options: {\r\n\r\n    \"Vision Care\": [\r\n      \"Eye Exams & Diagnostics\",\r\n      \"Vision Correction Surgery\",\r\n      \"Eyewear & Prescriptions\",\r\n      \"Recovery & Follow-Up\"\r\n    ],\r\n\r\n    \"Dental Care\": [\r\n      \"Cleaning & Preventive Care\",\r\n      \"Oral Surgery & Dental Implants\",\r\n      \"Cosmetic Dentistry & Smile Design\",\r\n      \"Emergency Dental Care\"\r\n    ],\r\n\r\n    \"Aesthetic Care\": [\r\n      \"Pre-Surgery Evaluation\",\r\n      \"Cosmetic Surgery\",\r\n      \"First Consultation\",\r\n      \"Recovery & Aftercare\"\r\n    ],\r\n\r\n    \"Regenerative Medicine\": [\r\n      \"Health Assessment & Diagnostics\",\r\n      \"Regenerative Therapies\",\r\n      \"Recovery & Wellness Support\",\r\n      \"Follow-Up Care\"\r\n    ]\r\n  }\r\n}\r\n\r\n];\r\n\r\n\r\n  const SERVICES = [\r\n    \"Private Driver\",\r\n    \"Concierge\",\r\n    \"Translator\",\r\n    \"Local Guide\",\r\n    \"Nightlife Help\",\r\n    \"Reservations\",\r\n    \"Security Support\",\r\n    \"VIP Custom Support\"\r\n  ];\r\n\r\nconst SERVICE_REQUESTS = {\r\n\r\n  \"Private Driver\": [\r\n    \"Airport Pickup\",\r\n    \"Airport Drop-Off\",\r\n    \"Private City Driver\",\r\n    \"Full-Day Private Driver\",\r\n    \"Driver to Climbing Activity\",\r\n    \"Driver to Riverwalk\",\r\n    \"Driver to Tree-Planting Activity\",\r\n    \"Driver to Sunset Location\",\r\n    \"Driver to Art Experience\",\r\n    \"Driver to Fashion Experience\",\r\n    \"Driver to Sculpture Experience\",\r\n    \"Driver to Music Experience\",\r\n    \"Driver to Cultural Exhibition\",\r\n    \"Night Driver\",\r\n    \"VIP Chauffeur\",\r\n    \"Custom Transportation Request\"\r\n  ],\r\n\r\n  \"Concierge\": [\r\n    \"Turn On AC\",\r\n    \"Turn Off AC Reminder\",\r\n    \"AC Needs Attention\",\r\n    \"AC Recommendation\",\r\n\r\n    \"Prepare Jacuzzi\",\r\n    \"Turn Off Jacuzzi Reminder\",\r\n    \"Jacuzzi Needs Attention\",\r\n    \"Jacuzzi Recommendation\",\r\n\r\n    \"Prepare Car\",\r\n    \"Turn Off Car Reminder\",\r\n    \"Car Needs Attention\",\r\n    \"Transportation Recommendation\",\r\n\r\n    \"Turn On Lights\",\r\n    \"Turn Off Lights Reminder\",\r\n    \"Lights Need Attention\",\r\n    \"Lighting Recommendation\",\r\n\r\n    \"Arrival Preparation\",\r\n    \"Accommodation Setup\",\r\n    \"Activity Coordination\",\r\n    \"Local Recommendation\",\r\n    \"Event Coordination\",\r\n    \"Personal Assistance\",\r\n    \"Custom Concierge Request\"\r\n  ],\r\n\r\n  \"Translator\": [\r\n    \"Live Translator\",\r\n    \"Online Translator\",\r\n    \"Personalized Language Help\",\r\n    \"Local Idioms and Expressions\",\r\n    \"Cultural Interpretation\",\r\n    \"Exhibition Translation\",\r\n    \"Appointment Translation\",\r\n    \"Business Translation\",\r\n    \"Medical Appointment Translation\",\r\n    \"Custom Translation Request\"\r\n  ],\r\n\r\n  \"Local Guide\": [\r\n    \"Nature Guide\",\r\n    \"Cultural Guide\",\r\n    \"History Guide\",\r\n    \"Neighborhood Guide\",\r\n    \"Food Guide\",\r\n    \"Climbing Guide\",\r\n    \"Riverwalk Guide\",\r\n    \"Tree-Planting Guide\",\r\n    \"Sunset Guide\",\r\n    \"Art Guide\",\r\n    \"Fashion Guide\",\r\n    \"Sculpture Guide\",\r\n    \"Music Guide\",\r\n    \"Indigenous Heritage Guide\",\r\n    \"Legends and Folklore Guide\",\r\n    \"Local Idioms Guide\",\r\n    \"Private Local Guide\",\r\n    \"Custom Local Guide Request\"\r\n  ],\r\n\r\n  \"Nightlife Help\": [\r\n    \"Nightlife Guide\",\r\n    \"Club Recommendation\",\r\n    \"Table and Club Access\",\r\n    \"Live Music Night\",\r\n    \"Music Venue Help\",\r\n    \"Rooftop Experience\",\r\n    \"Fashion and Evening Event\",\r\n    \"Night Driver Coordination\",\r\n    \"Safe Night Movement\",\r\n    \"Private Nightlife Experience\",\r\n    \"Custom Nightlife Request\"\r\n  ],\r\n\r\n  \"Reservations\": [\r\n    \"Restaurant Reservation\",\r\n    \"Rooftop Reservation\",\r\n    \"Attraction Tickets\",\r\n    \"Cultural Exhibition\",\r\n    \"History Exhibition\",\r\n    \"Indigenous Culture Exhibition\",\r\n    \"Legends and Folklore Exhibition\",\r\n\r\n    \"Climbing Activity\",\r\n    \"Riverwalk Activity\",\r\n    \"Tree-Planting Experience\",\r\n    \"Sunset Experience\",\r\n\r\n    \"Live Art Lesson\",\r\n    \"Art Experience\",\r\n    \"Live Fashion Experience\",\r\n    \"Fashion Experience\",\r\n    \"Live Sculpture Lesson\",\r\n    \"Sculpture Experience\",\r\n    \"Live Music Lesson\",\r\n    \"Music Experience\",\r\n\r\n    \"Live Class or Workshop\",\r\n    \"Private Experience\",\r\n    \"Custom Reservation Request\"\r\n  ],\r\n\r\n  \"Security Support\": [\r\n    \"Discreet Escort\",\r\n    \"Personal Protection\",\r\n    \"Transportation Security\",\r\n    \"Outdoor Activity Security\",\r\n    \"Climbing Activity Security\",\r\n    \"Nightlife Security\",\r\n    \"VIP Event Security\",\r\n    \"Private Event Security\",\r\n    \"Safe Arrival Support\",\r\n    \"Custom Security Request\"\r\n  ],\r\n\r\n  \"VIP Custom Support\": [\r\n    \"VIP Climbing Experience\",\r\n    \"VIP Riverwalk Experience\",\r\n    \"VIP Tree-Planting Experience\",\r\n    \"VIP Sunset Setup\",\r\n    \"VIP Art Experience\",\r\n    \"VIP Fashion Experience\",\r\n    \"VIP Sculpture Experience\",\r\n    \"VIP Music Experience\",\r\n    \"VIP Cultural Experience\",\r\n    \"Private Celebration Setup\",\r\n    \"Surprise Experience\",\r\n    \"Romantic Setup\",\r\n    \"Private Event Coordination\",\r\n    \"Custom VIP Request\"\r\n  ]\r\n\r\n};\r\n\r\n  const VIEW_COPY = {\r\n  dashboard:[\"Dashboard\",\"Live overview of the Travel Club host inventory.\"],\r\n  astro:[\"Astro Travel\",\"Manage Sign \u2192 Option \u2192 Suboption host connections.\"],\r\n  explore:[\"Explore Medell\u00edn\",\"Manage Guide \u2192 Option \u2192 Suboption host connections.\"],\r\n  services:[\"Local Services\",\"Manage unlimited service providers in the ecosystem.\"],\r\n  inventory:[\"All Hosts\",\"Manage the complete host inventory in one place.\"]\r\n};\r\n\r\n  let inventory = [];\r\n  let currentView = \"dashboard\";\r\n  let editingId = \"\";\r\n  let serverLoaded = false;\r\n  let backupMode = \"export\";\r\n\r\n  const byId = function(id){\r\n\r\n  \/*\r\n   * The three host forms reuse several field IDs.\r\n   * Always search the currently visible Control Panel\r\n   * section before searching the complete document.\r\n   *\/\r\n  const activeView =\r\n    document.querySelector(\r\n      \".btcp-view.active\"\r\n    );\r\n\r\n  if(activeView){\r\n\r\n    const activeMatch =\r\n      activeView.querySelector(\r\n        \"#\" + CSS.escape(id)\r\n      );\r\n\r\n    if(activeMatch){\r\n      return activeMatch;\r\n    }\r\n\r\n  }\r\n\r\n  return document.getElementById(id);\r\n};\r\n\r\n  function escapeHTML(value){\r\n    return String(value == null ? \"\" : value).replace(\/[&<>\"']\/g,function(ch){\r\n      return {\r\n        \"&\":\"&amp;\",\r\n        \"<\":\"&lt;\",\r\n        \">\":\"&gt;\",\r\n        '\"':\"&quot;\",\r\n        \"'\":\"&#039;\"\r\n      }[ch];\r\n    });\r\n  }\r\n\r\n  function normalize(value){\r\n    return String(value == null ? \"\" : value).trim().toLowerCase();\r\n  }\r\n\r\nfunction btcpTIMatchGroup(label,name,options){\r\n  return `\r\n    <div class=\"btcp-field full\">\r\n      <label class=\"btcp-label\">${escapeHTML(label)}<\/label>\r\n\r\n      <div class=\"btcp-checks\">\r\n        ${options.map(function(option){\r\n          return `\r\n            <label class=\"btcp-check\">\r\n              <input\r\n                type=\"checkbox\"\r\n                name=\"${escapeHTML(name)}\"\r\n                value=\"${escapeHTML(option)}\">\r\n              ${escapeHTML(option)}\r\n            <\/label>\r\n          `;\r\n        }).join(\"\")}\r\n      <\/div>\r\n    <\/div>\r\n  `;\r\n}\r\n\r\nfunction btcpTISelected(name){\r\n  return Array.from(\r\n    document.querySelectorAll(\r\n      'input[name=\"' + name + '\"]:checked'\r\n    )\r\n  ).map(function(input){\r\n    return input.value;\r\n  });\r\n}\r\n\r\nfunction btcpTISetChecked(name,values){\r\n  const selected = Array.isArray(values)\r\n    ? values.map(normalize)\r\n    : [];\r\n\r\n  document.querySelectorAll(\r\n    'input[name=\"' + name + '\"]'\r\n  ).forEach(function(input){\r\n    input.checked = selected.includes(\r\n      normalize(input.value)\r\n    );\r\n  });\r\n}\r\n\r\n  function uniqueId(){\r\n    return \"tc_\" + Date.now() + \"_\" + Math.random().toString(36).slice(2,8);\r\n  }\r\n\r\n  function numberValue(value,fallback){\r\n    const n = Number(value);\r\n    return Number.isFinite(n) ? n : fallback;\r\n  }\r\n\r\n  function firstImage(item){\r\n    if(item.image) return item.image;\r\n    if(item.imageUrl) return item.imageUrl;\r\n\r\n    const gallery = Array.isArray(item.images)\r\n      ? item.images\r\n      : String(item.galleryUrls || \"\")\r\n          .split(\/\\n|,\/)\r\n          .map(v => v.trim())\r\n          .filter(Boolean);\r\n\r\n    return gallery[0] || \"\";\r\n  }\r\n\r\n  function getImagesFromText(value,primary){\r\n    const list = String(value || \"\")\r\n      .split(\/\\n|,\/)\r\n      .map(v => v.trim())\r\n      .filter(Boolean);\r\n\r\n    if(primary && !list.includes(primary)){\r\n      list.unshift(primary);\r\n    }\r\n\r\n    return Array.from(new Set(list));\r\n  }\r\n\r\n  function activeValue(item){\r\n    if(item.active === false) return false;\r\n    if(normalize(item.status) === \"hidden\") return false;\r\n    if(normalize(item.status) === \"inactive\") return false;\r\n    return true;\r\n  }\r\n\r\n  function featuredValue(item){\r\n    return item.featured === true || Number(item.featured || 0) === 1;\r\n  }\r\n\r\n  function canonicalSection(item){\r\n    const section = normalize(item.section);\r\n    if(section === \"astro\") return \"astro\";\r\n    if(section === \"explore\") return \"explore\";\r\n    if(section === \"services\" || section === \"service\" || section === \"local-services\") return \"services\";\r\n    return section || \"astro\";\r\n  }\r\n\r\n  function safeInventory(raw){\r\n    if(!Array.isArray(raw)) return [];\r\n\r\n    return raw\r\n      .filter(item => item && typeof item === \"object\")\r\n      .map(function(item,index){\r\n        const images = Array.isArray(item.images)\r\n          ? item.images.filter(Boolean)\r\n          : getImagesFromText(item.galleryUrls || \"\",item.image || item.imageUrl || \"\");\r\n\r\n        const section = canonicalSection(item);\r\n        const active = activeValue(item);\r\n\r\n        return {\r\n          ...item,\r\n          id:String(item.id || uniqueId()),\r\n          section:section,\r\n          name:String(item.name || item.title || \"\").trim(),\r\n          title:String(item.title || item.name || \"\").trim(),\r\n          image:String(item.image || item.imageUrl || images[0] || \"\").trim(),\r\n          imageUrl:String(item.imageUrl || item.image || images[0] || \"\").trim(),\r\n          images:images,\r\n          galleryUrls:images.join(\"\\n\"),\r\n          description:String(item.description || item.desc || \"\").trim(),\r\n          desc:String(item.desc || item.description || \"\").trim(),\r\n          websiteUrl:String(item.websiteUrl || item.url || \"\").trim(),\r\n          url:String(item.url || item.websiteUrl || \"\").trim(),\r\nvideoUrl:String(\r\n  item.videoUrl ||\r\n  item.youtubeUrl ||\r\n  item.video ||\r\n  \"\"\r\n).trim(),\r\n\r\nyoutubeUrl:String(\r\n  item.youtubeUrl ||\r\n  item.videoUrl ||\r\n  item.video ||\r\n  \"\"\r\n).trim(),\r\n          reserveUrl:String(item.reserveUrl || item.checkoutUrl || \"\").trim(),\r\n          checkoutUrl:String(item.checkoutUrl || item.reserveUrl || \"\").trim(),\r\n          active:active,\r\n          status:active ? \"active\" : \"hidden\",\r\n          featured:featuredValue(item) ? 1 : 0,\r\n          order:numberValue(item.order,index + 1)\r\n        };\r\n      });\r\n  }\r\n\r\n  function toast(message,type){\r\n    const el = byId(\"btcpToast\");\r\n    if(!el) return;\r\n\r\n    el.textContent = message;\r\n    el.className = \"btcp-toast show \" + (type || \"\");\r\n    clearTimeout(el._timer);\r\n    el._timer = setTimeout(function(){\r\n      el.className = \"btcp-toast\";\r\n    },3200);\r\n  }\r\n\r\n  function setServer(state,text){\r\n    const box = byId(\"btcpServer\");\r\n    const label = byId(\"btcpServerText\");\r\n    if(box) box.className = \"btcp-server \" + state;\r\n    if(label) label.textContent = text;\r\n  }\r\n\r\n  function saveSafetyCopy(){\r\n    try{\r\n      localStorage.setItem(LOCAL_SAFETY_KEY,JSON.stringify(inventory));\r\n    }catch(error){}\r\n  }\r\n\r\n  function restoreSafetyCopy(){\r\n    try{\r\n      const parsed = JSON.parse(localStorage.getItem(LOCAL_SAFETY_KEY) || \"[]\");\r\n      return safeInventory(parsed);\r\n    }catch(error){\r\n      return [];\r\n    }\r\n  }\r\n\r\n  function routeText(item){\r\n    const section = canonicalSection(item);\r\n\r\n    if(section === \"astro\"){\r\n      return [\r\n        \"Astro Travel\",\r\n        item.sign || \"No Sign\",\r\n        item.category || item.option || \"No Option\",\r\n        item.style || item.suboption || \"No Suboption\"\r\n      ].join(\" \u2192 \");\r\n    }\r\n\r\n    if(section === \"explore\"){\r\n      return [\r\n        \"Explore Medell\u00edn\",\r\n        item.category || item.guide || \"No Guide\",\r\n        item.option || \"No Option\",\r\n        item.suboption || \"No Suboption\"\r\n      ].filter(Boolean).join(\" \u2192 \");\r\n    }\r\n\r\n   if(section === \"services\"){\r\n\r\n  return [\r\n    \"Local Services\",\r\n\r\n    item.service ||\r\n      item.category ||\r\n      item.type ||\r\n      \"No Service\",\r\n\r\n    item.serviceRequest ||\r\n      item.request ||\r\n      item.option ||\r\n      item.suboption ||\r\n      \"No Request\"\r\n\r\n  ]\r\n  .filter(Boolean)\r\n  .join(\" \u2192 \");\r\n\r\n}\r\n\r\nreturn section;\r\n\r\n}\r\n\r\n  function sectionLabel(section){\r\n    return {\r\n      astro:\"Astro Travel\",\r\n      explore:\"Explore Medell\u00edn\",\r\n      services:\"Local Services\"\r\n    }[section] || section;\r\n  }\r\n\r\n  function renderCounts(){\r\n    const total = inventory.length;\r\n    const active = inventory.filter(activeValue).length;\r\n    const featured = inventory.filter(featuredValue).length;\r\n    const hidden = total - active;\r\n    const astro = inventory.filter(x => canonicalSection(x) === \"astro\").length;\r\n    const explore = inventory.filter(x => canonicalSection(x) === \"explore\").length;\r\n    const services = inventory.filter(x => canonicalSection(x) === \"services\").length;\r\n\r\n    const values = {\r\n      btcpCountAll:total,\r\n      btcpCountActive:active,\r\n      btcpCountAstro:astro,\r\n      btcpCountExplore:explore,\r\n      btcpCountServices:services,\r\n      btcpStatTotal:total,\r\n      btcpStatActive:active,\r\n      btcpStatFeatured:featured,\r\n      btcpStatHidden:hidden\r\n    };\r\n\r\n    Object.keys(values).forEach(function(id){\r\n      const el = byId(id);\r\n      if(el) el.textContent = values[id];\r\n    });\r\n  }\r\n\r\n  function itemHTML(item){\r\n    const image = firstImage(item);\r\n    const section = canonicalSection(item);\r\n    const active = activeValue(item);\r\n    const featured = featuredValue(item);\r\n\r\n    return `\r\n      <article class=\"btcp-item ${active ? \"\" : \"inactive\"}\" data-item-id=\"${escapeHTML(item.id)}\">\r\n        <div class=\"btcp-item-image\" style=\"background-image:url('${escapeHTML(image)}')\"><\/div>\r\n\r\n        <div class=\"btcp-item-main\">\r\n          <div class=\"btcp-item-name\">${escapeHTML(item.name || item.title || \"Unnamed Host\")}<\/div>\r\n          <div class=\"btcp-item-route\">${escapeHTML(routeText(item))}<\/div>\r\n          <div class=\"btcp-item-meta\">\r\n            ${item.location ? escapeHTML(item.location) : \"No location\"}\r\n            ${item.price ? \" \u00b7 \" + escapeHTML(item.price) : \"\"}\r\n            \u00b7 Order ${escapeHTML(item.order || 1)}\r\n          <\/div>\r\n\r\n          <div class=\"btcp-badges\">\r\n            <span class=\"btcp-badge\">${escapeHTML(sectionLabel(section))}<\/span>\r\n            <span class=\"btcp-badge ${active ? \"active\" : \"\"}\">${active ? \"Active\" : \"Hidden\"}<\/span>\r\n            ${featured ? `<span class=\"btcp-badge featured\">Featured<\/span>` : \"\"}\r\n            ${item.images && item.images.length ? `<span class=\"btcp-badge\">${item.images.length} Images<\/span>` : \"\"}\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"btcp-item-actions\">\r\n          <button class=\"btcp-btn small\" type=\"button\" data-action=\"edit\" data-id=\"${escapeHTML(item.id)}\">Edit<\/button>\r\n          <button class=\"btcp-btn small\" type=\"button\" data-action=\"duplicate\" data-id=\"${escapeHTML(item.id)}\">Duplicate<\/button>\r\n          <button class=\"btcp-btn small\" type=\"button\" data-action=\"up\" data-id=\"${escapeHTML(item.id)}\">Move Up<\/button>\r\n          <button class=\"btcp-btn small\" type=\"button\" data-action=\"down\" data-id=\"${escapeHTML(item.id)}\">Move Down<\/button>\r\n          <button class=\"btcp-btn small\" type=\"button\" data-action=\"toggle\" data-id=\"${escapeHTML(item.id)}\">${active ? \"Hide\" : \"Activate\"}<\/button>\r\n          <button class=\"btcp-btn small danger\" type=\"button\" data-action=\"delete\" data-id=\"${escapeHTML(item.id)}\">Delete<\/button>\r\n        <\/div>\r\n      <\/article>\r\n    `;\r\n  }\r\n\r\n  function filterHTML(prefix,section){\r\n    const thirdOptions = section === \"astro\"\r\n      ? ASTRO_SIGNS.map(x => `<option value=\"${escapeHTML(x.name)}\">${escapeHTML(x.name)}<\/option>`).join(\"\")\r\n      : section === \"explore\"\r\n        ? EXPLORE_GUIDES.map(x => `<option value=\"${escapeHTML(x.name)}\">${escapeHTML(x.name)}<\/option>`).join(\"\")\r\n        : section === \"services\"\r\n          ? SERVICES.map(x => `<option value=\"${escapeHTML(x)}\">${escapeHTML(x)}<\/option>`).join(\"\")\r\n          : \"\";\r\n\r\n    const thirdLabel = section === \"astro\"\r\n      ? \"All Signs\"\r\n      : section === \"explore\"\r\n        ? \"All Guides\"\r\n        : section === \"services\"\r\n          ? \"All Services\"\r\n          : \"All Routes\";\r\n\r\n    return `\r\n      <div class=\"btcp-filterbar\">\r\n        <input id=\"${prefix}Search\" class=\"btcp-input\" type=\"search\" placeholder=\"Search host, location, route, or description\">\r\n\r\n        <select id=\"${prefix}Status\" class=\"btcp-select\">\r\n          <option value=\"\">All Statuses<\/option>\r\n          <option value=\"active\">Active<\/option>\r\n          <option value=\"hidden\">Hidden<\/option>\r\n          <option value=\"featured\">Featured<\/option>\r\n        <\/select>\r\n\r\n        ${section\r\n          ? `<select id=\"${prefix}Route\" class=\"btcp-select\">\r\n               <option value=\"\">${thirdLabel}<\/option>\r\n               ${thirdOptions}\r\n             <\/select>`\r\n          : `<select id=\"${prefix}Section\" class=\"btcp-select\">\r\n               <option value=\"\">All Sections<\/option>\r\n               <option value=\"astro\">Astro Travel<\/option>\r\n               <option value=\"explore\">Explore Medell\u00edn<\/option>\r\n               <option value=\"services\">Local Services<\/option>\r\n             <\/select>`\r\n        }\r\n\r\n        <select id=\"${prefix}Sort\" class=\"btcp-select\">\r\n          <option value=\"order\">Display Order<\/option>\r\n          <option value=\"name\">Name<\/option>\r\n          <option value=\"newest\">Newest First<\/option>\r\n        <\/select>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function filteredItems(section,prefix){\r\n    const search = normalize(byId(prefix + \"Search\")?.value || \"\");\r\n    const status = normalize(byId(prefix + \"Status\")?.value || \"\");\r\n    const route = normalize(byId(prefix + \"Route\")?.value || \"\");\r\n    const selectedSection = normalize(byId(prefix + \"Section\")?.value || \"\");\r\n    const sort = normalize(byId(prefix + \"Sort\")?.value || \"order\");\r\n\r\n    let items = inventory.slice();\r\n\r\n    if(section){\r\n      items = items.filter(x => canonicalSection(x) === section);\r\n    }\r\n\r\n    if(selectedSection){\r\n      items = items.filter(x => canonicalSection(x) === selectedSection);\r\n    }\r\n\r\n    if(search){\r\n      items = items.filter(function(item){\r\n        const haystack = [\r\n          item.name,item.title,item.location,item.description,item.desc,\r\n          routeText(item),item.websiteUrl,item.price\r\n        ].join(\" \").toLowerCase();\r\n\r\n        return haystack.includes(search);\r\n      });\r\n    }\r\n\r\n    if(status === \"active\"){\r\n      items = items.filter(activeValue);\r\n    }else if(status === \"hidden\"){\r\n      items = items.filter(x => !activeValue(x));\r\n    }else if(status === \"featured\"){\r\n      items = items.filter(featuredValue);\r\n    }\r\n\r\n    if(route){\r\n      items = items.filter(function(item){\r\n        if(section === \"astro\") return normalize(item.sign) === route;\r\n        if(section === \"explore\") return normalize(item.category || item.guide) === route;\r\n        if(section === \"services\") return normalize(item.service || item.category || item.type) === route;\r\n        return true;\r\n      });\r\n    }\r\n\r\n    if(sort === \"name\"){\r\n      items.sort((a,b) => String(a.name || \"\").localeCompare(String(b.name || \"\")));\r\n    }else if(sort === \"newest\"){\r\n      items.sort((a,b) => String(b.id).localeCompare(String(a.id)));\r\n    }else{\r\n      items.sort((a,b) => numberValue(a.order,9999) - numberValue(b.order,9999));\r\n    }\r\n\r\n    return items;\r\n  }\r\n\r\n  function renderList(section,prefix,listId){\r\n    const list = byId(listId);\r\n    if(!list) return;\r\n\r\n    const items = filteredItems(section,prefix);\r\n\r\n    list.innerHTML = items.length\r\n      ? items.map(itemHTML).join(\"\")\r\n      : `<div class=\"btcp-empty\">No hosts match this view yet.<\/div>`;\r\n  }\r\n\r\n  function renderRecent(){\r\n    const list = byId(\"btcpRecentList\");\r\n    if(!list) return;\r\n\r\n    const items = inventory.slice(-5).reverse();\r\n    list.innerHTML = items.length\r\n      ? items.map(itemHTML).join(\"\")\r\n      : `<div class=\"btcp-empty\">No hosts have been loaded yet.<\/div>`;\r\n  }\r\n\r\n  function renderAll(){\r\n  renderCounts();\r\n  renderRecent();\r\n  renderList(\"astro\",\"btcpAstro\",\"btcpAstroList\");\r\n  renderList(\"explore\",\"btcpExplore\",\"btcpExploreList\");\r\n  renderList(\"services\",\"btcpServices\",\"btcpServicesList\");\r\n  renderList(\"\",\"btcpAll\",\"btcpAllList\");\r\n  saveSafetyCopy();\r\n}\r\n\r\n  function commonFieldsHTML(section){\r\n    return `\r\n      <input id=\"btcpFieldId\" type=\"hidden\">\r\n\r\n      <div class=\"btcp-form-grid\">\r\n        <div class=\"btcp-field full\">\r\n          <label class=\"btcp-label\">Host \/ Provider Name<\/label>\r\n          <input id=\"btcpFieldName\" class=\"btcp-input\" type=\"text\" placeholder=\"Business, host, driver, concierge, restaurant, hotel, or experience name\">\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Button Title<\/label>\r\n          <input id=\"btcpFieldTitle\" class=\"btcp-input\" type=\"text\" placeholder=\"Optional display title\">\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Host Type<\/label>\r\n          <input id=\"btcpFieldType\" class=\"btcp-input\" type=\"text\" placeholder=\"Hotel, Restaurant, Driver, Guide, Experience\">\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Location<\/label>\r\n          <input id=\"btcpFieldLocation\" class=\"btcp-input\" type=\"text\" placeholder=\"Medell\u00edn, Colombia\">\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Price Label<\/label>\r\n          <input id=\"btcpFieldPrice\" class=\"btcp-input\" type=\"text\" placeholder=\"From $120, Custom quote, Premium\">\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field full\">\r\n          <label class=\"btcp-label\">Primary Image URL<\/label>\r\n          <input id=\"btcpFieldImage\" class=\"btcp-input\" type=\"url\" placeholder=\"https:\/\/...\">\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field full\">\r\n          <label class=\"btcp-label\">Additional Image URLs<\/label>\r\n          <textarea id=\"btcpFieldImages\" class=\"btcp-textarea\" placeholder=\"One image URL per line\"><\/textarea>\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field full\">\r\n          <label class=\"btcp-label\">Short Explanation \/ Description<\/label>\r\n          <textarea id=\"btcpFieldDescription\" class=\"btcp-textarea\" placeholder=\"What this host offers and why it belongs in this route\"><\/textarea>\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field full\">\r\n          <label class=\"btcp-label\">Website URL<\/label>\r\n          <input id=\"btcpFieldWebsite\" class=\"btcp-input\" type=\"url\" placeholder=\"https:\/\/...\">\r\n        <\/div>\r\n\r\n<div\r\n  id=\"btcpVideoFieldWrap\"\r\n  class=\"btcp-field full\"\r\n  style=\"${section === \"explore\" ? \"\" : \"display:none;\"}\"\r\n>\r\n  <label class=\"btcp-label\">\r\n    YouTube Video URL\r\n  <\/label>\r\n\r\n  <input\r\n    id=\"btcpFieldVideo\"\r\n    class=\"btcp-input\"\r\n    type=\"url\"\r\n    placeholder=\"https:\/\/www.youtube.com\/watch?v=...\"\r\n  >\r\n\r\n  <small\r\n    style=\"\r\n      display:block;\r\n      margin-top:7px;\r\n      color:rgba(234,252,255,.62);\r\n      line-height:1.5;\r\n    \"\r\n  >\r\n    Available for Level 3 Discover, Entertainment and Medical Tourism hosts.\r\n  <\/small>\r\n<\/div>\r\n\r\n        <div class=\"btcp-field full\">\r\n          <label class=\"btcp-label\">Reserve With Bliss URL<\/label>\r\n          <input id=\"btcpFieldReserve\" class=\"btcp-input\" type=\"url\" placeholder=\"https:\/\/... or internal checkout page\">\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Required Level<\/label>\r\n          <select id=\"btcpFieldLevel\" class=\"btcp-select\">\r\n            <option value=\"1\">Level 1<\/option>\r\n            <option value=\"2\">Level 2<\/option>\r\n            <option value=\"3\">Level 3<\/option>\r\n            <option value=\"4\">Level 4<\/option>\r\n          <\/select>\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Display Order<\/label>\r\n          <input id=\"btcpFieldOrder\" class=\"btcp-input\" type=\"number\" min=\"1\" step=\"1\" value=\"10\">\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field full\">\r\n          <div class=\"btcp-checks\">\r\n            <label class=\"btcp-check\">\r\n              <input id=\"btcpFieldActive\" type=\"checkbox\" checked>\r\n              Active\r\n            <\/label>\r\n\r\n            <label class=\"btcp-check\">\r\n              <input id=\"btcpFieldFeatured\" type=\"checkbox\">\r\n              Featured\r\n            <\/label>\r\n\r\n            <label class=\"btcp-check\">\r\n              <input id=\"btcpFieldNewTab\" type=\"checkbox\" checked>\r\n              Website New Tab\r\n            <\/label>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"btcp-preview\">\r\n        <div id=\"btcpPreviewImage\" class=\"btcp-preview-image\"><\/div>\r\n        <div class=\"btcp-preview-copy\">\r\n          <h4 id=\"btcpPreviewName\">New ${escapeHTML(sectionLabel(section))} Host<\/h4>\r\n          <p id=\"btcpPreviewRoute\">Complete the route fields to preview the connection.<\/p>\r\n          <p id=\"btcpPreviewDescription\">The host description will appear here.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"btcp-form-actions\">\r\n        <button id=\"btcpSaveHost\" class=\"btcp-btn primary\" type=\"button\">Save Host to Inventory<\/button>\r\n        <button id=\"btcpSaveHostWebsite\" class=\"btcp-btn gold\" type=\"button\">Save Host and Website<\/button>\r\n        <button id=\"btcpClearHost\" class=\"btcp-btn\" type=\"button\">Clear Form<\/button>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function astroRouteHTML(){\r\n    return `\r\n      <div class=\"btcp-form-grid\">\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Zodiac Sign<\/label>\r\n          <select id=\"btcpFieldSign\" class=\"btcp-select\">\r\n            ${ASTRO_SIGNS.map(x => `<option value=\"${escapeHTML(x.name)}\">${escapeHTML(x.name)}<\/option>`).join(\"\")}\r\n          <\/select>\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Option<\/label>\r\n          <select id=\"btcpFieldCategory\" class=\"btcp-select\">\r\n            ${ASTRO_OPTIONS.map(x => `<option value=\"${escapeHTML(x)}\">${escapeHTML(x)}<\/option>`).join(\"\")}\r\n          <\/select>\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field full\">\r\n          <label class=\"btcp-label\">Suboption<\/label>\r\n          <select id=\"btcpFieldStyle\" class=\"btcp-select\"><\/select>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <details\r\n        class=\"btcp-route-help\"\r\n        style=\"margin-top:16px;\">\r\n\r\n        <summary\r\n          style=\"cursor:pointer;color:#53f3ff;font-weight:900;font-size:.82rem;\">\r\n          Travel Intelligence Matching\r\n        <\/summary>\r\n\r\n        <p style=\"margin:10px 0 16px;\">\r\n          Select every option that fits this host.\r\n          All matching active hosts can appear in the traveler\u2019s recommendations.\r\n        <\/p>\r\n\r\n        <div class=\"btcp-form-grid\">\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Traveling With\",\r\n            \"btcpTITravelingWith\",\r\n            TI_MATCH_OPTIONS.travelingWith\r\n          )}\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Travel Styles\",\r\n            \"btcpTITravelStyles\",\r\n            TI_MATCH_OPTIONS.travelStyles\r\n          )}\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Budgets\",\r\n            \"btcpTIBudgets\",\r\n            TI_MATCH_OPTIONS.budgets\r\n          )}\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Trip Lengths\",\r\n            \"btcpTITripLengths\",\r\n            TI_MATCH_OPTIONS.tripLengths\r\n          )}\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Transportation\",\r\n            \"btcpTITransportation\",\r\n            TI_MATCH_OPTIONS.transportation\r\n          )}\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Trip Paces\",\r\n            \"btcpTIPaces\",\r\n            TI_MATCH_OPTIONS.paces\r\n          )}\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Interests\",\r\n            \"btcpTIInterests\",\r\n            TI_MATCH_OPTIONS.interests\r\n          )}\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Food Preferences\",\r\n            \"btcpTIFoodStyle\",\r\n            TI_MATCH_OPTIONS.foodStyle\r\n          )}\r\n\r\n          ${btcpTIMatchGroup(\r\n            \"Preferred Times\",\r\n            \"btcpTIPreferredTimes\",\r\n            TI_MATCH_OPTIONS.preferredTimes\r\n          )}\r\n\r\n          <div class=\"btcp-field full\">\r\n            <label class=\"btcp-check\">\r\n              <input\r\n                id=\"btcpTIAccessibilityFriendly\"\r\n                type=\"checkbox\">\r\n              Accessibility-friendly host\r\n            <\/label>\r\n          <\/div>\r\n\r\n        <\/div>\r\n      <\/details>\r\n\r\n      <div class=\"btcp-route-help\">\r\n        This saves the exact compatibility fields used by Astro:\r\n        section = astro, sign = selected sign, category = selected option, style = selected suboption.\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function exploreRouteHTML(){\r\n    return `\r\n      <div class=\"btcp-form-grid\">\r\n        <div class=\"btcp-field full\">\r\n          <label class=\"btcp-label\">Explore Guide<\/label>\r\n          <select id=\"btcpFieldGuide\" class=\"btcp-select\">\r\n           ${EXPLORE_GUIDES.map(function(item){\r\n\r\n  return (\r\n    '<option value=\"' +\r\n    escapeHTML(item.name) +\r\n    '\">' +\r\n    \"Level \" +\r\n    escapeHTML(item.level) +\r\n    \" \u2014 \" +\r\n    escapeHTML(item.name) +\r\n    \"<\/option>\"\r\n  );\r\n\r\n}).join(\"\")}\r\n          <\/select>\r\n        <\/div>\r\n\r\n        <div class=\"btcp-field\">\r\n          <label class=\"btcp-label\">Option<\/label>\r\n          <select id=\"btcpFieldExploreOption\" class=\"btcp-select\"><\/select>\r\n        <\/div>\r\n\r\n       <div class=\"btcp-field\">\r\n  <label class=\"btcp-label\">Suboption<\/label>\r\n  <select id=\"btcpFieldExploreSuboption\" class=\"btcp-select\"><\/select>\r\n<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"btcp-route-help\">\r\n        Explore saves category as the guide name, option as the selected guide option, and suboption as the optional deeper route.\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function servicesRouteHTML(){\r\n\r\n  return `\r\n    <div class=\"btcp-form-grid\">\r\n\r\n      <div class=\"btcp-field full\">\r\n        <label class=\"btcp-label\">\r\n          Local Service\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"btcpFieldService\"\r\n          class=\"btcp-select\"\r\n        >\r\n          ${\r\n            SERVICES.map(function(service){\r\n              return `\r\n                <option value=\"${escapeHTML(service)}\">\r\n                  ${escapeHTML(service)}\r\n                <\/option>\r\n              `;\r\n            }).join(\"\")\r\n          }\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <div class=\"btcp-field full\">\r\n        <label class=\"btcp-label\">\r\n          Request Option\r\n        <\/label>\r\n\r\n        <select\r\n          id=\"btcpFieldServiceRequest\"\r\n          class=\"btcp-select\"\r\n        >\r\n          <option value=\"\">\r\n            Select a request\r\n          <\/option>\r\n        <\/select>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"btcp-route-help\">\r\n      Choose the Local Service and the exact request the traveler will send to Bliss.\r\n      Bliss can assign the appropriate provider after the request is received.\r\n    <\/div>\r\n  `;\r\n}\r\n\r\nfunction updateServiceRequestOptions(selectedRequest){\r\n\r\n  const serviceField =\r\n    byId(\"btcpFieldService\");\r\n\r\n  const requestField =\r\n    byId(\"btcpFieldServiceRequest\");\r\n\r\n  if(\r\n    !serviceField ||\r\n    !requestField\r\n  ){\r\n    return;\r\n  }\r\n\r\n  const service =\r\n    String(serviceField.value || \"\").trim();\r\n\r\n  const requests =\r\n    Array.isArray(SERVICE_REQUESTS[service])\r\n      ? SERVICE_REQUESTS[service]\r\n      : [];\r\n\r\n  requestField.innerHTML =\r\n    `\r\n      <option value=\"\">\r\n        Select a request\r\n      <\/option>\r\n    ` +\r\n    requests.map(function(request){\r\n      return `\r\n        <option value=\"${escapeHTML(request)}\">\r\n          ${escapeHTML(request)}\r\n        <\/option>\r\n      `;\r\n    }).join(\"\");\r\n\r\n  const requestedValue =\r\n    String(selectedRequest || \"\").trim();\r\n\r\n  if(\r\n    requestedValue &&\r\n    requests.includes(requestedValue)\r\n  ){\r\n    requestField.value =\r\n      requestedValue;\r\n  }else{\r\n    requestField.value = \"\";\r\n  }\r\n}\r\n\r\n  function mountForm(section){\r\n\r\n  const mountId =\r\n    section === \"astro\"\r\n      ? \"btcpAstroFormMount\"\r\n      : section === \"explore\"\r\n        ? \"btcpExploreFormMount\"\r\n        : \"btcpServicesFormMount\";\r\n\r\n  const mount =\r\n    byId(mountId);\r\n\r\n  if(!mount){\r\n    return;\r\n  }\r\n\r\n  mount.innerHTML = (\r\n    section === \"astro\"\r\n      ? astroRouteHTML()\r\n      : section === \"explore\"\r\n        ? exploreRouteHTML()\r\n        : servicesRouteHTML()\r\n  ) + commonFieldsHTML(section);\r\n\r\n  \/*\r\n   * The Local Services form now exists,\r\n   * so connect the Service dropdown.\r\n   *\/\r\n  if(section === \"services\"){\r\n\r\n    const serviceField =\r\n      byId(\"btcpFieldService\");\r\n\r\n    if(serviceField){\r\n\r\n      serviceField.addEventListener(\r\n        \"change\",\r\n        function(){\r\n\r\n          updateServiceRequestOptions(\"\");\r\n\r\n          updatePreview(\"services\");\r\n\r\n        }\r\n      );\r\n\r\n    }\r\n\r\n    updateServiceRequestOptions(\"\");\r\n\r\n  }\r\n\r\n  updateDependentRoutes(section);\r\n  bindFormEvents(section);\r\n  clearForm(section,false);\r\n}\r\n  function updateDependentRoutes(section){\r\n    if(section === \"astro\"){\r\n      const sign = byId(\"btcpFieldSign\")?.value || \"Aries\";\r\n      const found = ASTRO_SIGNS.find(x => x.name === sign) || ASTRO_SIGNS[0];\r\n      const style = byId(\"btcpFieldStyle\");\r\n\r\n      if(style){\r\n        const selected = style.value;\r\n        style.innerHTML = found.suboptions.map(x => `<option value=\"${escapeHTML(x)}\">${escapeHTML(x)}<\/option>`).join(\"\");\r\n        if(found.suboptions.includes(selected)) style.value = selected;\r\n      }\r\n    }\r\n\r\n    if(section === \"explore\"){\r\n  const guideSelect =\r\n    byId(\"btcpFieldGuide\");\r\n\r\n  const optionSelect =\r\n    byId(\"btcpFieldExploreOption\");\r\n\r\n  const suboptionSelect =\r\n    byId(\"btcpFieldExploreSuboption\");\r\n\r\n  const guideName =\r\n    guideSelect?.value ||\r\n    EXPLORE_GUIDES[0].name;\r\n\r\n  const guide =\r\n  EXPLORE_GUIDES.find(function(item){\r\n    return item.name === guideName;\r\n  }) ||\r\n  EXPLORE_GUIDES[0];\r\n\r\n\/*\r\n * Keep the membership level synchronized\r\n * with the selected Explore route.\r\n *\/\r\nconst levelSelect =\r\n  byId(\"btcpFieldLevel\");\r\n\r\nif(levelSelect){\r\n\r\n  levelSelect.value =\r\n    String(guide.level || 2);\r\n\r\n  \/*\r\n   * Explore levels are controlled by the route,\r\n   * not selected manually.\r\n   *\/\r\n  levelSelect.disabled = true;\r\n}\r\n\r\n  const optionNames =\r\n    Object.keys(guide.options || {});\r\n\r\n  if(optionSelect){\r\n    const previousOption =\r\n      optionSelect.value;\r\n\r\n    optionSelect.innerHTML =\r\n      optionNames.map(function(optionName){\r\n        return (\r\n          '<option value=\"' +\r\n          escapeHTML(optionName) +\r\n          '\">' +\r\n          escapeHTML(optionName) +\r\n          '<\/option>'\r\n        );\r\n      }).join(\"\");\r\n\r\n    if(optionNames.includes(previousOption)){\r\n      optionSelect.value =\r\n        previousOption;\r\n    }\r\n  }\r\n\r\n  const selectedOption =\r\n    optionSelect?.value ||\r\n    optionNames[0] ||\r\n    \"\";\r\n\r\n  const suboptions =\r\n    Array.isArray(guide.options[selectedOption])\r\n      ? guide.options[selectedOption]\r\n      : [];\r\n\r\n  if(suboptionSelect){\r\n    const previousSuboption =\r\n      suboptionSelect.value;\r\n\r\n    suboptionSelect.innerHTML =\r\n      suboptions.map(function(suboption){\r\n        return (\r\n          '<option value=\"' +\r\n          escapeHTML(suboption) +\r\n          '\">' +\r\n          escapeHTML(suboption) +\r\n          '<\/option>'\r\n        );\r\n      }).join(\"\");\r\n\r\n    if(suboptions.includes(previousSuboption)){\r\n      suboptionSelect.value =\r\n        previousSuboption;\r\n    }\r\n  }\r\n}\r\n\r\n    updatePreview(section);\r\n  }\r\n\r\nfunction updateExploreVideoField(){\r\n\r\n  const guide =\r\n    String(\r\n      byId(\"btcpFieldGuide\")?.value || \"\"\r\n    ).trim();\r\n\r\n  const wrap =\r\n    byId(\"btcpVideoFieldWrap\");\r\n\r\n  if(!wrap){\r\n    return;\r\n  }\r\n\r\n  const allowedGuides = [\r\n    \"Discover\",\r\n    \"Entertainment\",\r\n    \"Medical Tourism\"\r\n  ];\r\n\r\n  const shouldShow =\r\n    allowedGuides.includes(guide);\r\n\r\n  wrap.style.display =\r\n    shouldShow\r\n      ? \"\"\r\n      : \"none\";\r\n\r\n  \/*\r\n   * Remove a previously entered video when switching\r\n   * to a route that does not support videos.\r\n   *\/\r\n  if(!shouldShow){\r\n    const field =\r\n      byId(\"btcpFieldVideo\");\r\n\r\n    if(field){\r\n      field.value = \"\";\r\n    }\r\n  }\r\n}\r\n\r\n function bindFormEvents(section){\r\n\r\n  const mountId =\r\n    section === \"astro\"\r\n      ? \"btcpAstroFormMount\"\r\n      : section === \"explore\"\r\n        ? \"btcpExploreFormMount\"\r\n        : \"btcpServicesFormMount\";\r\n\r\n  const mount =\r\n    document.getElementById(\r\n      mountId\r\n    );\r\n\r\n  if(!mount){\r\n    return;\r\n  }\r\n\r\n  \/*\r\n   * Search only inside this specific form.\r\n   * This prevents Astro, Explore, and Services from\r\n   * attaching their events to each other's buttons.\r\n   *\/\r\n  function formElement(id){\r\n    return mount.querySelector(\r\n      \"#\" + CSS.escape(id)\r\n    );\r\n  }\r\n\r\n  const watchedFields = [\r\n    \"btcpFieldName\",\r\n    \"btcpFieldTitle\",\r\n    \"btcpFieldType\",\r\n    \"btcpFieldLocation\",\r\n    \"btcpFieldPrice\",\r\n    \"btcpFieldImage\",\r\n    \"btcpFieldImages\",\r\n    \"btcpFieldDescription\",\r\n    \"btcpFieldWebsite\",\r\n    \"btcpFieldReserve\",\r\n    \"btcpFieldLevel\",\r\n    \"btcpFieldOrder\",\r\n    \"btcpFieldActive\",\r\n    \"btcpFieldFeatured\",\r\n    \"btcpFieldNewTab\",\r\n    \"btcpFieldSign\",\r\n    \"btcpFieldCategory\",\r\n    \"btcpFieldStyle\",\r\n    \"btcpFieldGuide\",\r\n    \"btcpFieldExploreOption\",\r\n    \"btcpFieldExploreSuboption\",\r\n\"btcpFieldVideo\",\r\n\"btcpFieldService\",\r\n\"btcpFieldServiceRequest\"\r\n  ];\r\n\r\n  watchedFields.forEach(function(id){\r\n\r\n    const element =\r\n      formElement(id);\r\n\r\n    if(!element){\r\n      return;\r\n    }\r\n\r\n    element.addEventListener(\r\n      \"input\",\r\n      function(){\r\n\r\n        updatePreview(\r\n          section\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n    element.addEventListener(\r\n      \"change\",\r\n      function(){\r\n\r\n        if(\r\n  id === \"btcpFieldSign\" ||\r\n  id === \"btcpFieldGuide\" ||\r\n  id === \"btcpFieldExploreOption\"\r\n){\r\n\r\n          updateDependentRoutes(\r\n            section\r\n          );\r\n\r\n        }else{\r\n\r\n          updatePreview(\r\n            section\r\n          );\r\n\r\n        }\r\n\r\n      }\r\n    );\r\n\r\n  });\r\n\r\n\r\n  const saveInventoryButton =\r\n    formElement(\r\n      \"btcpSaveHost\"\r\n    );\r\n\r\n  if(saveInventoryButton){\r\n\r\n    saveInventoryButton.addEventListener(\r\n      \"click\",\r\n      function(event){\r\n\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        saveFormItem(\r\n          section,\r\n          false\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n  }\r\n\r\n\r\n  const saveWebsiteButton =\r\n    formElement(\r\n      \"btcpSaveHostWebsite\"\r\n    );\r\n\r\n  if(saveWebsiteButton){\r\n\r\n    saveWebsiteButton.addEventListener(\r\n      \"click\",\r\n      function(event){\r\n\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        saveFormItem(\r\n          section,\r\n          true\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n  }\r\n\r\n\r\n  const clearButton =\r\n    formElement(\r\n      \"btcpClearHost\"\r\n    );\r\n\r\n  if(clearButton){\r\n\r\n    clearButton.addEventListener(\r\n      \"click\",\r\n      function(event){\r\n\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        clearForm(\r\n          section,\r\n          true\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n  }\r\n\r\n}\r\n\r\n  function updatePreview(section){\r\n    const name = byId(\"btcpFieldName\")?.value || \"New \" + sectionLabel(section) + \" Host\";\r\n    const description = byId(\"btcpFieldDescription\")?.value || \"The host description will appear here.\";\r\n    const image = byId(\"btcpFieldImage\")?.value || \"\";\r\n    let route = \"\";\r\n\r\n    if(section === \"astro\"){\r\n      route = [\r\n        \"Astro Travel\",\r\n        byId(\"btcpFieldSign\")?.value,\r\n        byId(\"btcpFieldCategory\")?.value,\r\n        byId(\"btcpFieldStyle\")?.value\r\n      ].filter(Boolean).join(\" \u2192 \");\r\n    }else if(section === \"explore\"){\r\n      route = [\r\n        \"Explore Medell\u00edn\",\r\n        byId(\"btcpFieldGuide\")?.value,\r\n        byId(\"btcpFieldExploreOption\")?.value,\r\n        byId(\"btcpFieldExploreSuboption\")?.value\r\n      ].filter(Boolean).join(\" \u2192 \");\r\n    }else{\r\n\r\n  route = [\r\n    \"Local Services\",\r\n\r\n    byId(\"btcpFieldService\")?.value,\r\n\r\n    byId(\"btcpFieldServiceRequest\")?.value\r\n  ]\r\n  .filter(Boolean)\r\n  .join(\" \u2192 \");\r\n\r\n}\r\n\r\n    if(byId(\"btcpPreviewName\")) byId(\"btcpPreviewName\").textContent = name;\r\n    if(byId(\"btcpPreviewRoute\")) byId(\"btcpPreviewRoute\").textContent = route;\r\n    if(byId(\"btcpPreviewDescription\")) byId(\"btcpPreviewDescription\").textContent = description;\r\n    if(byId(\"btcpPreviewImage\")) byId(\"btcpPreviewImage\").style.backgroundImage = image ? `url(\"${image}\")` : \"\";\r\n  }\r\n\r\n  function formItem(section){\r\n    const id = byId(\"btcpFieldId\")?.value || uniqueId();\r\n    const name = String(byId(\"btcpFieldName\")?.value || \"\").trim();\r\n    const title = String(byId(\"btcpFieldTitle\")?.value || name).trim();\r\n    const image = String(byId(\"btcpFieldImage\")?.value || \"\").trim();\r\n    const images = getImagesFromText(byId(\"btcpFieldImages\")?.value || \"\",image);\r\n    const description = String(byId(\"btcpFieldDescription\")?.value || \"\").trim();\r\n    const website = String(byId(\"btcpFieldWebsite\")?.value || \"\").trim();\r\nconst video =\r\n  String(\r\n    byId(\"btcpFieldVideo\")?.value || \"\"\r\n  ).trim();\r\n    const reserve = String(byId(\"btcpFieldReserve\")?.value || \"\").trim();\r\n    const active = !!byId(\"btcpFieldActive\")?.checked;\r\n\r\n    const item = {\r\n      id:id,\r\n      section:section,\r\n      name:name,\r\n      title:title,\r\n      type:String(byId(\"btcpFieldType\")?.value || \"\").trim(),\r\n      location:String(byId(\"btcpFieldLocation\")?.value || \"\").trim(),\r\n      price:String(byId(\"btcpFieldPrice\")?.value || \"\").trim(),\r\n      image:image || images[0] || \"\",\r\n      imageUrl:image || images[0] || \"\",\r\n      images:images,\r\n      galleryUrls:images.join(\"\\n\"),\r\n      description:description,\r\n      desc:description,\r\n      websiteUrl:website,\r\n      url:website,\r\nvideoUrl: video,\r\nyoutubeUrl: video,\r\n      reserveUrl:reserve,\r\n      checkoutUrl:reserve,\r\n      level:numberValue(byId(\"btcpFieldLevel\")?.value,section === \"astro\" ? 1 : 2),\r\n      order:numberValue(byId(\"btcpFieldOrder\")?.value,10),\r\n      active:active,\r\n      status:active ? \"active\" : \"hidden\",\r\n      featured:byId(\"btcpFieldFeatured\")?.checked ? 1 : 0,\r\n      openNewTab:!!byId(\"btcpFieldNewTab\")?.checked,\r\n      updatedAt:new Date().toISOString()\r\n    };\r\n\r\n    if(section === \"astro\"){\r\n      const category = byId(\"btcpFieldCategory\")?.value || \"\";\r\n      const style = byId(\"btcpFieldStyle\")?.value || \"\";\r\n\r\n      item.sign = byId(\"btcpFieldSign\")?.value || \"\";\r\n      item.category = category;\r\n      item.option = category;\r\n      item.style = style;\r\n      item.suboption = style;\r\n      item.level = numberValue(byId(\"btcpFieldLevel\")?.value,1);\r\n    }\r\n\r\n      item.travelIntelligence = {\r\n        travelingWith:\r\n          btcpTISelected(\"btcpTITravelingWith\"),\r\n\r\n        travelStyles:\r\n          btcpTISelected(\"btcpTITravelStyles\"),\r\n\r\n        budgets:\r\n          btcpTISelected(\"btcpTIBudgets\"),\r\n\r\n        tripLengths:\r\n          btcpTISelected(\"btcpTITripLengths\"),\r\n\r\n        transportation:\r\n          btcpTISelected(\"btcpTITransportation\"),\r\n\r\n        paces:\r\n          btcpTISelected(\"btcpTIPaces\"),\r\n\r\n        interests:\r\n          btcpTISelected(\"btcpTIInterests\"),\r\n\r\n        foodStyle:\r\n          btcpTISelected(\"btcpTIFoodStyle\"),\r\n\r\n        preferredTimes:\r\n          btcpTISelected(\"btcpTIPreferredTimes\"),\r\n\r\n        accessibilityFriendly:\r\n          !!byId(\"btcpTIAccessibilityFriendly\")?.checked\r\n      };\r\n\r\n    if(section === \"explore\"){\r\n      const guide = byId(\"btcpFieldGuide\")?.value || \"\";\r\n      const option = byId(\"btcpFieldExploreOption\")?.value || \"\";\r\n      const suboption = String(byId(\"btcpFieldExploreSuboption\")?.value || \"\").trim();\r\n\r\n      item.guide = guide;\r\n      item.category = guide;\r\n      item.option = option;\r\n      item.suboption = suboption;\r\n      item.level = numberValue(byId(\"btcpFieldLevel\")?.value,2);\r\n    }\r\n\r\n    if(section === \"services\"){\r\n\r\n  const service =\r\n    String(\r\n      byId(\"btcpFieldService\")?.value || \"\"\r\n    ).trim();\r\n\r\n  const serviceRequest =\r\n    String(\r\n      byId(\"btcpFieldServiceRequest\")?.value || \"\"\r\n    ).trim();\r\n\r\n  item.service =\r\n    service;\r\n\r\n  item.category =\r\n    service;\r\n\r\n  item.parent =\r\n    service;\r\n\r\n  item.serviceRequest =\r\n    serviceRequest;\r\n\r\n  item.request =\r\n    serviceRequest;\r\n\r\n  item.option =\r\n    serviceRequest;\r\n\r\n  item.suboption =\r\n    serviceRequest;\r\n\r\n  item.level =\r\n    numberValue(\r\n      byId(\"btcpFieldLevel\")?.value,\r\n      2\r\n    );\r\n}\r\n\r\n    return item;\r\n  }\r\n\r\n  function validateItem(item){\r\n    if(!item.name){\r\n      toast(\"Add the host or provider name first.\",\"warning\");\r\n      byId(\"btcpFieldName\")?.focus();\r\n      return false;\r\n    }\r\n\r\n    if(item.section === \"astro\" && (!item.sign || !item.category || !item.style)){\r\n      toast(\"Astro requires a sign, option, and suboption.\",\"warning\");\r\n      return false;\r\n    }\r\n\r\n    if(item.section === \"explore\" && (!item.category || !item.option)){\r\n      toast(\"Explore requires a guide and option.\",\"warning\");\r\n      return false;\r\n    }\r\n\r\n    \r\n\r\nif(item.section === \"services\"){\r\n\r\n  if(!item.service){\r\n\r\n    toast(\r\n      \"Choose a Local Service.\",\r\n      \"warning\"\r\n    );\r\n\r\n    byId(\"btcpFieldService\")?.focus();\r\n\r\n    return false;\r\n  }\r\n\r\n  if(!item.serviceRequest){\r\n\r\n    toast(\r\n      \"Choose a request option.\",\r\n      \"warning\"\r\n    );\r\n\r\n    byId(\"btcpFieldServiceRequest\")?.focus();\r\n\r\n    return false;\r\n  }\r\n\r\n}\r\n\r\nreturn true;\r\n  }\r\n    \r\n\r\n  function saveFormItem(section,saveWebsite){\r\n    const item = formItem(section);\r\n    if(!validateItem(item)) return;\r\n\r\n    const index = inventory.findIndex(x => String(x.id) === String(item.id));\r\n\r\n    if(index >= 0){\r\n      inventory[index] = item;\r\n    }else{\r\n      inventory.push(item);\r\n    }\r\n\r\n    inventory =\r\n  safeInventory(\r\n    inventory\r\n  );\r\n\r\neditingId = \"\";\r\n\r\nrenderAll();\r\n\r\nclearForm(\r\n  section,\r\n  false\r\n);\r\n\r\ntoast(\r\n  index >= 0\r\n    ? \"Host updated in the inventory.\"\r\n    : \"Host added to the inventory.\",\r\n  \"success\"\r\n);\r\n\r\nif(saveWebsite){\r\n\r\n  saveSingleHostToWebsite(\r\n    item\r\n  ).catch(function(){});\r\n\r\n}\r\n  }\r\n\r\n  function clearForm(section,notify){\r\n    editingId = \"\";\r\n\r\n    const id = byId(\"btcpFieldId\");\r\n    if(id) id.value = \"\";\r\n\r\n    const defaults = {\r\n      btcpFieldName:\"\",\r\n      btcpFieldTitle:\"\",\r\n      btcpFieldType:\"\",\r\n      btcpFieldLocation:\"Medell\u00edn, Colombia\",\r\n      btcpFieldPrice:\"\",\r\n      btcpFieldImage:\"\",\r\n      btcpFieldImages:\"\",\r\n      btcpFieldDescription:\"\",\r\n      btcpFieldWebsite:\"\",\r\nbtcpFieldVideo:\"\",\r\nbtcpFieldReserve:\"\",\r\n      btcpFieldOrder:\"10\",\r\n      btcpFieldExploreSuboption:\"\"\r\n    };\r\n\r\n    Object.keys(defaults).forEach(function(fieldId){\r\n      const el = byId(fieldId);\r\n      if(el) el.value = defaults[fieldId];\r\n    });\r\n\r\n    if(byId(\"btcpFieldActive\")) byId(\"btcpFieldActive\").checked = true;\r\n    if(byId(\"btcpFieldFeatured\")) byId(\"btcpFieldFeatured\").checked = false;\r\n    if(byId(\"btcpFieldNewTab\")) byId(\"btcpFieldNewTab\").checked = true;\r\n    if(byId(\"btcpFieldLevel\")) byId(\"btcpFieldLevel\").value = section === \"astro\" ? \"1\" : \"2\";\r\n\r\n    if(section === \"astro\"){\r\n      if(byId(\"btcpFieldSign\")) byId(\"btcpFieldSign\").value = \"Aries\";\r\n      if(byId(\"btcpFieldCategory\")) byId(\"btcpFieldCategory\").value = \"Accommodations\";\r\n\r\n      btcpTISetChecked(\"btcpTITravelingWith\",[]);\r\n      btcpTISetChecked(\"btcpTITravelStyles\",[]);\r\n      btcpTISetChecked(\"btcpTIBudgets\",[]);\r\n      btcpTISetChecked(\"btcpTITripLengths\",[]);\r\n      btcpTISetChecked(\"btcpTITransportation\",[]);\r\n      btcpTISetChecked(\"btcpTIPaces\",[]);\r\n      btcpTISetChecked(\"btcpTIInterests\",[]);\r\n      btcpTISetChecked(\"btcpTIFoodStyle\",[]);\r\n      btcpTISetChecked(\"btcpTIPreferredTimes\",[]);\r\n\r\n      if(byId(\"btcpTIAccessibilityFriendly\")){\r\n        byId(\"btcpTIAccessibilityFriendly\").checked = false;\r\n      }\r\n\r\n    }else if(section === \"explore\"){\r\n      if(byId(\"btcpFieldGuide\")) byId(\"btcpFieldGuide\").value = \"First Time Visitor\";\r\n    }else if(section === \"services\"){\r\n\r\n  if(byId(\"btcpFieldService\")){\r\n\r\n    byId(\"btcpFieldService\").value =\r\n      \"Private Driver\";\r\n\r\n  }\r\n\r\n  updateServiceRequestOptions(\"\");\r\n\r\n}\r\n\r\n    updateDependentRoutes(section);\r\n    updatePreview(section);\r\n\r\n    if(notify) toast(\"Form cleared.\");\r\n  }\r\n\r\n  function setFormItem(item){\r\n    if(!item) return;\r\n\r\n    const section = canonicalSection(item);\r\n    showView(section);\r\n    editingId = item.id;\r\n\r\n    setTimeout(function(){\r\n      const values = {\r\n        btcpFieldId:item.id || \"\",\r\n        btcpFieldName:item.name || item.title || \"\",\r\n        btcpFieldTitle:item.title || item.name || \"\",\r\n        btcpFieldType:item.type || \"\",\r\n        btcpFieldLocation:item.location || \"\",\r\n        btcpFieldPrice:item.price || \"\",\r\n        btcpFieldImage:firstImage(item),\r\n        btcpFieldImages:(item.images || []).join(\"\\n\"),\r\n        btcpFieldDescription:item.description || item.desc || \"\",\r\n        btcpFieldWebsite:item.websiteUrl || item.url || \"\",\r\nbtcpFieldVideo:\r\n  item.videoUrl ||\r\n  item.youtubeUrl ||\r\n  item.video ||\r\n  \"\",\r\n        btcpFieldReserve:item.reserveUrl || item.checkoutUrl || \"\",\r\n        btcpFieldLevel:String(item.level || (section === \"astro\" ? 1 : 2)),\r\n        btcpFieldOrder:String(item.order || 10)\r\n      };\r\n\r\n      Object.keys(values).forEach(function(id){\r\n        const el = byId(id);\r\n        if(el) el.value = values[id];\r\n      });\r\n\r\n      if(byId(\"btcpFieldActive\")) byId(\"btcpFieldActive\").checked = activeValue(item);\r\n      if(byId(\"btcpFieldFeatured\")) byId(\"btcpFieldFeatured\").checked = featuredValue(item);\r\n      if(byId(\"btcpFieldNewTab\")) byId(\"btcpFieldNewTab\").checked = item.openNewTab !== false;\r\n\r\n      if(section === \"astro\"){\r\n        if(byId(\"btcpFieldSign\")) byId(\"btcpFieldSign\").value = item.sign || \"Aries\";\r\n        if(byId(\"btcpFieldCategory\")) byId(\"btcpFieldCategory\").value = item.category || item.option || \"Accommodations\";\r\n        updateDependentRoutes(section);\r\n        if(byId(\"btcpFieldStyle\")) byId(\"btcpFieldStyle\").value = item.style || item.suboption || \"\";\r\n      }\r\n\r\n        const ti =\r\n          item.travelIntelligence &&\r\n          typeof item.travelIntelligence === \"object\"\r\n            ? item.travelIntelligence\r\n            : {};\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTITravelingWith\",\r\n          ti.travelingWith\r\n        );\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTITravelStyles\",\r\n          ti.travelStyles\r\n        );\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTIBudgets\",\r\n          ti.budgets\r\n        );\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTITripLengths\",\r\n          ti.tripLengths\r\n        );\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTITransportation\",\r\n          ti.transportation\r\n        );\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTIPaces\",\r\n          ti.paces\r\n        );\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTIInterests\",\r\n          ti.interests\r\n        );\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTIFoodStyle\",\r\n          ti.foodStyle\r\n        );\r\n\r\n        btcpTISetChecked(\r\n          \"btcpTIPreferredTimes\",\r\n          ti.preferredTimes\r\n        );\r\n\r\n        if(byId(\"btcpTIAccessibilityFriendly\")){\r\n          byId(\"btcpTIAccessibilityFriendly\").checked =\r\n            ti.accessibilityFriendly === true;\r\n        }\r\n\r\n     if(section === \"explore\"){\r\n\r\n  if(byId(\"btcpFieldGuide\")){\r\n    byId(\"btcpFieldGuide\").value =\r\n      item.category ||\r\n      item.guide ||\r\n      \"First Time Visitor\";\r\n  }\r\n\r\n  \/*\r\n   * First create the options for the selected guide.\r\n   *\/\r\n  updateDependentRoutes(section);\r\n\r\n  if(byId(\"btcpFieldExploreOption\")){\r\n    byId(\"btcpFieldExploreOption\").value =\r\n      item.option || \"\";\r\n  }\r\n\r\n  \/*\r\n   * Rebuild the suboptions for the selected option.\r\n   *\/\r\n  updateDependentRoutes(section);\r\n\r\n  if(byId(\"btcpFieldExploreSuboption\")){\r\n    byId(\"btcpFieldExploreSuboption\").value =\r\n      item.suboption || \"\";\r\n  }\r\n\r\n  \/*\r\n   * Keep Level 2 or Level 3 synchronized.\r\n   *\/\r\n  updateDependentRoutes(section);\r\n}\r\n      if(section === \"services\"){\r\n\r\n  const savedService =\r\n    item.service ||\r\n    item.category ||\r\n    item.type ||\r\n    \"Private Driver\";\r\n\r\n  const savedRequest =\r\n    item.serviceRequest ||\r\n    item.request ||\r\n    item.option ||\r\n    item.suboption ||\r\n    \"\";\r\n\r\n  if(byId(\"btcpFieldService\")){\r\n\r\n    byId(\"btcpFieldService\").value =\r\n      savedService;\r\n\r\n  }\r\n\r\n  updateServiceRequestOptions(\r\n    savedRequest\r\n  );\r\n\r\n}\r\n\r\n      updatePreview(section);\r\n      byId(\"btcpFieldName\")?.focus();\r\n      toast(\"Editing \" + (item.name || item.title || \"host\") + \".\");\r\n    },30);\r\n  }\r\n\r\n  function duplicateItem(id){\r\n    const item = inventory.find(x => String(x.id) === String(id));\r\n    if(!item) return;\r\n\r\n    const clone = {\r\n      ...item,\r\n      id:uniqueId(),\r\n      name:(item.name || item.title || \"Host\") + \" Copy\",\r\n      title:(item.title || item.name || \"Host\") + \" Copy\",\r\n      order:numberValue(item.order,10) + 1,\r\n      featured:0,\r\n      updatedAt:new Date().toISOString()\r\n    };\r\n\r\n    inventory.push(clone);\r\n    inventory = safeInventory(inventory);\r\n    renderAll();\r\n    toast(\"Host duplicated.\",\"success\");\r\n  }\r\n\r\n  function deleteItem(id){\r\n    const item = inventory.find(x => String(x.id) === String(id));\r\n    if(!item) return;\r\n\r\n    if(!confirm('Delete \"' + (item.name || item.title || \"this host\") + '\" from the Travel Club inventory?')){\r\n      return;\r\n    }\r\n\r\n    inventory = inventory.filter(x => String(x.id) !== String(id));\r\n    renderAll();\r\n    toast(\"Host deleted from the local inventory.\",\"success\");\r\n  }\r\n\r\n  function toggleItem(id){\r\n    const item = inventory.find(x => String(x.id) === String(id));\r\n    if(!item) return;\r\n\r\n    item.active = !activeValue(item);\r\n    item.status = item.active ? \"active\" : \"hidden\";\r\n    item.updatedAt = new Date().toISOString();\r\n\r\n    renderAll();\r\n    toast(item.active ? \"Host activated.\" : \"Host hidden.\",\"success\");\r\n  }\r\n\r\n  function moveItem(id,direction){\r\n    const section = canonicalSection(inventory.find(x => String(x.id) === String(id)) || {});\r\n    const sectionItems = inventory\r\n      .filter(x => canonicalSection(x) === section)\r\n      .sort((a,b) => numberValue(a.order,9999) - numberValue(b.order,9999));\r\n\r\n    const currentIndex = sectionItems.findIndex(x => String(x.id) === String(id));\r\n    if(currentIndex < 0) return;\r\n\r\n    const targetIndex = currentIndex + direction;\r\n    if(targetIndex < 0 || targetIndex >= sectionItems.length) return;\r\n\r\n    const current = sectionItems[currentIndex];\r\n    const target = sectionItems[targetIndex];\r\n    const currentOrder = numberValue(current.order,currentIndex + 1);\r\n    const targetOrder = numberValue(target.order,targetIndex + 1);\r\n\r\n    current.order = targetOrder;\r\n    target.order = currentOrder;\r\n\r\n    renderAll();\r\n    toast(\"Display order updated.\");\r\n  }\r\n\r\n  function showView(view){\r\n    currentView = view;\r\n\r\n    document.querySelectorAll(\".btcp-view\").forEach(function(el){\r\n      el.classList.toggle(\"active\",el.id === \"btcpView\" + view.charAt(0).toUpperCase() + view.slice(1));\r\n    });\r\n\r\n    document.querySelectorAll(\".btcp-nav-btn[data-view]\").forEach(function(btn){\r\n      btn.classList.toggle(\"active\",btn.dataset.view === view);\r\n    });\r\n\r\n    const copy = VIEW_COPY[view] || VIEW_COPY.dashboard;\r\n    if(byId(\"btcpPageTitle\")) byId(\"btcpPageTitle\").textContent = copy[0];\r\n    if(byId(\"btcpPageSubtitle\")) byId(\"btcpPageSubtitle\").textContent = copy[1];\r\n\r\n    if(view === \"astro\" && !byId(\"btcpFieldSign\")) mountForm(\"astro\");\r\n    if(view === \"explore\" && !byId(\"btcpFieldGuide\")) mountForm(\"explore\");\r\n    if(view === \"services\" && !byId(\"btcpFieldService\")) mountForm(\"services\");\r\n\r\n    byId(\"btcpSidebar\")?.classList.remove(\"open\");\r\n    renderAll();\r\n  }\r\n\r\n  function newHost(section){\r\n    const target = section || (\r\n      currentView === \"astro\" || currentView === \"explore\" || currentView === \"services\"\r\n        ? currentView\r\n        : \"astro\"\r\n    );\r\n\r\n    showView(target);\r\n    setTimeout(function(){\r\n      clearForm(target,false);\r\n      byId(\"btcpFieldName\")?.focus();\r\n    },20);\r\n  }\r\n\r\n  async function parseAjaxResponse(response){\r\n    const text = await response.text();\r\n\r\n    try{\r\n      return JSON.parse(text);\r\n    }catch(error){\r\n      throw new Error(\"The server returned a non-JSON response.\");\r\n    }\r\n  }\r\n\r\n  function loadFromWebsite(){\r\n    setServer(\"loading\",\"Loading inventory from website\");\r\n\r\n    const fd = new FormData();\r\n    fd.append(\"action\",LOAD_ACTION);\r\n\r\n    fetch(AJAX_URL,{\r\n      method:\"POST\",\r\n      credentials:\"same-origin\",\r\n      body:fd\r\n    })\r\n    .then(parseAjaxResponse)\r\n    .then(function(data){\r\n      if(!data || !data.success){\r\n        throw new Error(data?.data?.message || \"The Travel Club inventory could not be loaded.\");\r\n      }\r\n\r\n      inventory = safeInventory(data?.data?.items || []);\r\n      serverLoaded = true;\r\n      setServer(\"ok\",\"Website inventory connected\");\r\n      renderAll();\r\n      toast(\"Website inventory loaded: \" + inventory.length + \" hosts.\",\"success\");\r\n    })\r\n    .catch(function(error){\r\n      const safety = restoreSafetyCopy();\r\n      if(safety.length){\r\n        inventory = safety;\r\n        renderAll();\r\n        setServer(\"error\",\"Server unavailable; safety copy loaded\");\r\n        toast(\"The AJAX action is not connected yet. A browser safety copy was loaded.\",\"warning\");\r\n      }else{\r\n        inventory = [];\r\n        renderAll();\r\n        setServer(\"error\",\"Travel Club AJAX action not connected\");\r\n        toast(error.message + \" Install the matching WordPress AJAX handler before server saving can work.\",\"error\");\r\n      }\r\n    });\r\n  }\r\n\r\nfunction saveSingleHostToWebsite(item){\r\n\r\n  if(\r\n    !item ||\r\n    !item.id\r\n  ){\r\n    toast(\r\n      \"The host could not be sent to the website.\",\r\n      \"error\"\r\n    );\r\n\r\n    return Promise.reject(\r\n      new Error(\r\n        \"Host information is missing.\"\r\n      )\r\n    );\r\n  }\r\n\r\n  setServer(\r\n    \"loading\",\r\n    \"Saving host to website\"\r\n  );\r\n\r\n  const fd =\r\n    new FormData();\r\n\r\n  fd.append(\r\n    \"action\",\r\n    SAVE_SINGLE_ACTION\r\n  );\r\n\r\n  fd.append(\r\n    \"item\",\r\n    JSON.stringify(item)\r\n  );\r\n\r\n  return fetch(\r\n    AJAX_URL,\r\n    {\r\n      method:\"POST\",\r\n      credentials:\"same-origin\",\r\n      body:fd\r\n    }\r\n  )\r\n  .then(parseAjaxResponse)\r\n  .then(function(data){\r\n\r\n    if(\r\n      !data ||\r\n      !data.success\r\n    ){\r\n      throw new Error(\r\n        data?.data?.message ||\r\n        \"Host save failed.\"\r\n      );\r\n    }\r\n\r\n    serverLoaded = true;\r\n\r\n    setServer(\r\n      \"ok\",\r\n      \"Host saved to website\"\r\n    );\r\n\r\n    saveSafetyCopy();\r\n\r\n    toast(\r\n      data?.data?.message ||\r\n      \"Host saved to the website.\",\r\n      \"success\"\r\n    );\r\n\r\n    return data;\r\n  })\r\n  .catch(function(error){\r\n\r\n    setServer(\r\n      \"error\",\r\n      \"Website host save failed\"\r\n    );\r\n\r\n    saveSafetyCopy();\r\n\r\n    toast(\r\n      error.message +\r\n      \" The browser safety copy was preserved.\",\r\n      \"error\"\r\n    );\r\n\r\n    throw error;\r\n  });\r\n}\r\n\r\n  function saveToWebsite(){\r\n    if(!Array.isArray(inventory)){\r\n      toast(\"Inventory is invalid. Save blocked.\",\"error\");\r\n      return;\r\n    }\r\n\r\n    if(!serverLoaded){\r\n      const continueSave = confirm(\r\n        \"The server inventory has not loaded successfully yet. Continue trying to save this inventory to the website?\"\r\n      );\r\n      if(!continueSave) return;\r\n    }\r\n\r\n    if(inventory.length === 0){\r\n      const confirmEmpty = confirm(\r\n        \"The inventory is empty. Saving now may remove every Travel Club host from the website. Continue?\"\r\n      );\r\n      if(!confirmEmpty) return;\r\n    }\r\n\r\n    setServer(\"loading\",\"Saving inventory to website\");\r\n\r\nconst fd = new FormData();\r\n\r\nfd.append(\r\n  \"action\",\r\n  SAVE_ACTION\r\n);\r\n\r\nfd.append(\r\n  \"items\",\r\n  inventoryJson\r\n);\r\n\r\n    fetch(AJAX_URL,{\r\n      method:\"POST\",\r\n      credentials:\"same-origin\",\r\n      body:fd\r\n    })\r\n    .then(parseAjaxResponse)\r\n    .then(function(data){\r\n      if(!data || !data.success){\r\n        throw new Error(data?.data?.message || \"Save failed.\");\r\n      }\r\n\r\n      serverLoaded = true;\r\n      setServer(\"ok\",\"Website inventory saved\");\r\n      saveSafetyCopy();\r\n\r\n      const count = data?.data?.saved_count !== undefined\r\n        ? data.data.saved_count\r\n        : inventory.length;\r\n\r\n      toast(\"Inventory saved to the website: \" + count + \" hosts.\",\"success\");\r\n    })\r\n    .catch(function(error){\r\n      setServer(\"error\",\"Website save failed\");\r\n      saveSafetyCopy();\r\n      toast(error.message + \" The browser safety copy was preserved.\",\"error\");\r\n    });\r\n  }\r\n\r\n  function openBackup(mode){\r\n    backupMode = mode;\r\n    const modal = byId(\"btcpBackupModal\");\r\n    const box = byId(\"btcpBackupBox\");\r\n\r\n    if(mode === \"export\"){\r\n      byId(\"btcpBackupTitle\").textContent = \"Export Inventory Backup\";\r\n      byId(\"btcpBackupCopy\").textContent = \"Copy and save this JSON somewhere safe.\";\r\n      byId(\"btcpBackupApply\").style.display = \"none\";\r\n      box.value = JSON.stringify(inventory,null,2);\r\n    }else{\r\n      byId(\"btcpBackupTitle\").textContent = \"Import Inventory Backup\";\r\n      byId(\"btcpBackupCopy\").textContent = \"Paste a previously exported JSON inventory, then apply it.\";\r\n      byId(\"btcpBackupApply\").style.display = \"\";\r\n      box.value = \"\";\r\n    }\r\n\r\n    modal.classList.add(\"show\");\r\n    modal.setAttribute(\"aria-hidden\",\"false\");\r\n  }\r\n\r\n  function closeBackup(){\r\n    const modal = byId(\"btcpBackupModal\");\r\n    modal?.classList.remove(\"show\");\r\n    modal?.setAttribute(\"aria-hidden\",\"true\");\r\n  }\r\n\r\n  function applyImport(){\r\n    try{\r\n      const parsed = JSON.parse(byId(\"btcpBackupBox\").value || \"[]\");\r\n      if(!Array.isArray(parsed)) throw new Error(\"The backup must contain a JSON array.\");\r\n\r\n      const incoming = safeInventory(parsed);\r\n      const replace = confirm(\r\n        \"Replace the current Control Panel inventory with \" + incoming.length + \" imported hosts?\"\r\n      );\r\n\r\n      if(!replace) return;\r\n\r\n      inventory = incoming;\r\n      renderAll();\r\n      closeBackup();\r\n      toast(\"Backup imported into the Control Panel. Press Save All to Website to publish it.\",\"success\");\r\n    }catch(error){\r\n      toast(error.message,\"error\");\r\n    }\r\n  }\r\n\r\n  function initializeFilters(){\r\n    byId(\"btcpAstroFilters\").innerHTML = filterHTML(\"btcpAstro\",\"astro\");\r\n    byId(\"btcpExploreFilters\").innerHTML = filterHTML(\"btcpExplore\",\"explore\");\r\n    byId(\"btcpServicesFilters\").innerHTML = filterHTML(\"btcpServices\",\"services\");\r\n    byId(\"btcpAllFilters\").innerHTML = filterHTML(\"btcpAll\",\"\");\r\n\r\n    [\r\n      [\"btcpAstro\",\"astro\",\"btcpAstroList\"],\r\n      [\"btcpExplore\",\"explore\",\"btcpExploreList\"],\r\n      [\"btcpServices\",\"services\",\"btcpServicesList\"],\r\n      [\"btcpAll\",\"\",\"btcpAllList\"]\r\n    ].forEach(function(config){\r\n      const prefix = config[0];\r\n\r\n      [\"Search\",\"Status\",\"Route\",\"Section\",\"Sort\"].forEach(function(suffix){\r\n        const el = byId(prefix + suffix);\r\n        if(!el) return;\r\n        el.addEventListener(\"input\",function(){\r\n          renderList(config[1],prefix,config[2]);\r\n        });\r\n        el.addEventListener(\"change\",function(){\r\n          renderList(config[1],prefix,config[2]);\r\n        });\r\n      });\r\n    });\r\n  }\r\n\r\n  function bindGlobalEvents(){\r\n    document.querySelectorAll(\".btcp-nav-btn[data-view]\").forEach(function(btn){\r\n      btn.addEventListener(\"click\",function(){\r\n        showView(btn.dataset.view);\r\n      });\r\n    });\r\n\r\n    document.querySelectorAll(\"[data-clear-form]\").forEach(function(btn){\r\n      btn.addEventListener(\"click\",function(){\r\n        const section = btn.closest(\".btcp-view\")?.id\r\n          ?.replace(\"btcpView\",\"\")\r\n          ?.toLowerCase();\r\n\r\n        if(section) clearForm(section,true);\r\n      });\r\n    });\r\n\r\n    byId(\"btcpQuickAdd\")?.addEventListener(\"click\",function(){\r\n      newHost(byId(\"btcpQuickSection\")?.value || \"astro\");\r\n    });\r\n\r\n    byId(\"btcpNewHostTop\")?.addEventListener(\"click\",function(){\r\n      newHost();\r\n    });\r\n\r\n    byId(\"btcpSaveAllTop\")?.addEventListener(\"click\",saveToWebsite);\r\n    byId(\"btcpSaveAllSide\")?.addEventListener(\"click\",saveToWebsite);\r\n    byId(\"btcpReloadSide\")?.addEventListener(\"click\",loadFromWebsite);\r\n\r\n    byId(\"btcpExportBtn\")?.addEventListener(\"click\",function(){\r\n      openBackup(\"export\");\r\n    });\r\n\r\n    byId(\"btcpImportBtn\")?.addEventListener(\"click\",function(){\r\n      openBackup(\"import\");\r\n    });\r\n\r\n    byId(\"btcpBackupApply\")?.addEventListener(\"click\",applyImport);\r\n\r\n    byId(\"btcpBackupCopyBtn\")?.addEventListener(\"click\",function(){\r\n      const box = byId(\"btcpBackupBox\");\r\n      box.select();\r\n      navigator.clipboard?.writeText(box.value).then(function(){\r\n        toast(\"Backup JSON copied.\",\"success\");\r\n      }).catch(function(){\r\n        document.execCommand(\"copy\");\r\n        toast(\"Backup JSON copied.\",\"success\");\r\n      });\r\n    });\r\n\r\n    byId(\"btcpBackupClose\")?.addEventListener(\"click\",closeBackup);\r\n\r\n    byId(\"btcpBackupModal\")?.addEventListener(\"click\",function(event){\r\n      if(event.target === byId(\"btcpBackupModal\")) closeBackup();\r\n    });\r\n\r\n    byId(\"btcpMobileOpen\")?.addEventListener(\"click\",function(){\r\n      byId(\"btcpSidebar\")?.classList.add(\"open\");\r\n    });\r\n\r\n    byId(\"btcpClosePanel\")?.addEventListener(\"click\",function(){\r\n      const clean = new URL(window.location.href);\r\n      clean.searchParams.delete(\"travelpanel\");\r\n      clean.searchParams.delete(\"tcadmin\");\r\n      window.location.href = clean.toString();\r\n    });\r\n\r\n    document.addEventListener(\"click\",function(event){\r\n      const actionBtn = event.target.closest(\"[data-action][data-id]\");\r\n      if(!actionBtn) return;\r\n\r\n      const id = actionBtn.dataset.id;\r\n      const action = actionBtn.dataset.action;\r\n\r\n      if(action === \"edit\"){\r\n        const item = inventory.find(x => String(x.id) === String(id));\r\n        setFormItem(item);\r\n      }else if(action === \"duplicate\"){\r\n        duplicateItem(id);\r\n      }else if(action === \"delete\"){\r\n        deleteItem(id);\r\n      }else if(action === \"toggle\"){\r\n        toggleItem(id);\r\n      }else if(action === \"up\"){\r\n        moveItem(id,-1);\r\n      }else if(action === \"down\"){\r\n        moveItem(id,1);\r\n      }\r\n    });\r\n\r\n    window.addEventListener(\"beforeunload\",saveSafetyCopy);\r\n  }\r\n\r\n  function activatePanel(){\r\n    const params = new URLSearchParams(window.location.search);\r\n    const open = params.get(\"travelpanel\") === \"1\" || params.get(\"tcadmin\") === \"1\";\r\n\r\n    if(!open) return false;\r\n\r\n    document.documentElement.classList.add(\"btcp-active\");\r\n    document.body.classList.add(\"btcp-active\",\"btcp-hard-hide\");\r\n\r\n    const overlay = byId(\"btcpOverlay\");\r\n    overlay.style.display = \"block\";\r\n    overlay.setAttribute(\"aria-hidden\",\"false\");\r\n\r\n    return true;\r\n  }\r\n\r\n  function initialize(){\r\n    if(!activatePanel()) return;\r\n\r\n    initializeFilters();\r\n    bindGlobalEvents();\r\n    mountForm(\"astro\");\r\n    mountForm(\"explore\");\r\n    mountForm(\"services\");\r\n    showView(\"dashboard\");\r\n    loadFromWebsite();\r\n\r\n    window.BlissTravelControlPanel = {\r\n      getInventory:function(){ return inventory.slice(); },\r\n      setInventory:function(items){\r\n        inventory = safeInventory(items);\r\n        renderAll();\r\n      },\r\n      reload:loadFromWebsite,\r\n      save:saveToWebsite,\r\n      openView:showView,\r\n      newHost:newHost\r\n    };\r\n\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\"DOMContentLoaded\",initialize);\r\n  }else{\r\n    initialize();\r\n  }\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS CONTROL PANEL \u2014 SAFE FULL-WIDTH FIX\r\nCSS ONLY \u2014 DOES NOT MOVE OR DELETE ANYTHING\r\n========================================================= -->\r\n\r\n<style>\r\n\r\n\/* Only apply while the hidden Control Panel is open *\/\r\nhtml.btcp-active,\r\nbody.btcp-active{\r\n  width:100% !important;\r\n  max-width:none !important;\r\n  height:100% !important;\r\n  min-height:100% !important;\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n  overflow:hidden !important;\r\n}\r\n\r\n\/*\r\nRelease the WordPress wrappers that are squeezing\r\nthe Control Panel into the center column.\r\n*\/\r\nbody.btcp-active #page,\r\nbody.btcp-active #content,\r\nbody.btcp-active #primary,\r\nbody.btcp-active #main,\r\nbody.btcp-active .site,\r\nbody.btcp-active .site-content,\r\nbody.btcp-active .content-area,\r\nbody.btcp-active .site-main,\r\nbody.btcp-active .entry,\r\nbody.btcp-active .entry-content,\r\nbody.btcp-active .page-content,\r\nbody.btcp-active .container,\r\nbody.btcp-active .container-fluid,\r\nbody.btcp-active .wp-site-blocks,\r\nbody.btcp-active .wp-block-post-content,\r\nbody.btcp-active .wp-block-group,\r\nbody.btcp-active .wp-block-html{\r\n  width:100% !important;\r\n  max-width:none !important;\r\n  min-width:0 !important;\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n  transform:none !important;\r\n}\r\n\r\n\/* The actual Control Panel fills the browser *\/\r\nbody.btcp-active #btcpOverlay{\r\n  position:fixed !important;\r\n  inset:0 !important;\r\n\r\n  width:100vw !important;\r\n  min-width:100vw !important;\r\n  max-width:100vw !important;\r\n\r\n  height:100vh !important;\r\n  min-height:100vh !important;\r\n  max-height:100vh !important;\r\n\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n  transform:none !important;\r\n\r\n  overflow:hidden !important;\r\n  z-index:2147483647 !important;\r\n}\r\n\r\n\/* Full desktop layout *\/\r\nbody.btcp-active #btcpOverlay .btcp-app{\r\n  width:100vw !important;\r\n  max-width:none !important;\r\n  height:100vh !important;\r\n\r\n  display:grid !important;\r\n  grid-template-columns:280px minmax(0,1fr) !important;\r\n\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n}\r\n\r\n\/* Sidebar *\/\r\nbody.btcp-active #btcpOverlay .btcp-sidebar{\r\n  width:280px !important;\r\n  min-width:280px !important;\r\n  max-width:280px !important;\r\n  height:100vh !important;\r\n}\r\n\r\n\/* Main Control Panel area *\/\r\nbody.btcp-active #btcpOverlay .btcp-main{\r\n  width:auto !important;\r\n  min-width:0 !important;\r\n  max-width:none !important;\r\n  height:100vh !important;\r\n\r\n  margin:0 !important;\r\n  overflow-x:hidden !important;\r\n  overflow-y:auto !important;\r\n}\r\n\r\n\/* Let the dashboard use the available desktop width *\/\r\nbody.btcp-active #btcpOverlay .btcp-content,\r\nbody.btcp-active #btcpOverlay .btcp-view{\r\n  width:100% !important;\r\n  max-width:none !important;\r\n}\r\n\r\n\/* Two-column editor and inventory layout *\/\r\n@media(min-width:1181px){\r\n\r\n  body.btcp-active #btcpOverlay .btcp-grid-two{\r\n    width:100% !important;\r\n    max-width:none !important;\r\n\r\n    grid-template-columns:\r\n      minmax(420px, .9fr)\r\n      minmax(560px, 1.1fr) !important;\r\n  }\r\n\r\n}\r\n\r\n\/* Medium desktop *\/\r\n@media(min-width:781px) and (max-width:1180px){\r\n\r\n  body.btcp-active #btcpOverlay .btcp-app{\r\n    grid-template-columns:230px minmax(0,1fr) !important;\r\n  }\r\n\r\n  body.btcp-active #btcpOverlay .btcp-sidebar{\r\n    width:230px !important;\r\n    min-width:230px !important;\r\n    max-width:230px !important;\r\n  }\r\n\r\n  body.btcp-active #btcpOverlay .btcp-grid-two{\r\n    grid-template-columns:1fr !important;\r\n  }\r\n\r\n}\r\n\r\n\/* Mobile behavior remains intact *\/\r\n@media(max-width:780px){\r\n\r\n  body.btcp-active #btcpOverlay .btcp-app{\r\n    display:block !important;\r\n    width:100vw !important;\r\n  }\r\n\r\n  body.btcp-active #btcpOverlay .btcp-main{\r\n    width:100vw !important;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n<!-- =========================================================\r\nPERSONAL EVOLUTION \u2014 CONTROL PANEL EXTENSION\r\nPASTE THIS AT THE VERY BOTTOM OF THE CONTROL PANEL CODE.\r\n\r\nAdds:\r\n- Personal Evolution navigation button\r\n- Stage \u2192 Option \u2192 Leaf selectors\r\n- Add \/ edit \/ hide \/ delete hosts\r\n- Save to the existing shared Travel Club inventory\r\n========================================================= -->\r\n\r\n<style id=\"btcpEvolutionExtensionStyles\">\r\n#btcpViewEvolution{display:none}\r\n#btcpViewEvolution.active{display:block}\r\n.btcp-pe-layout{\r\n  display:grid;\r\n  grid-template-columns:minmax(320px,.85fr) minmax(0,1.15fr);\r\n  gap:18px;\r\n}\r\n.btcp-pe-card{\r\n  border:1px solid rgba(255,255,255,.11);\r\n  border-radius:24px;\r\n  padding:20px;\r\n  background:rgba(255,255,255,.035);\r\n}\r\n.btcp-pe-card h3{margin:0 0 7px}\r\n.btcp-pe-card>p{color:rgba(235,246,255,.72);line-height:1.5}\r\n.btcp-pe-grid{\r\n  display:grid;\r\n  grid-template-columns:1fr 1fr;\r\n  gap:12px;\r\n}\r\n.btcp-pe-field.full{grid-column:1\/-1}\r\n.btcp-pe-field label{\r\n  display:block;\r\n  margin:0 0 7px;\r\n  color:#53f3ff;\r\n  font-size:.68rem;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n.btcp-pe-input,.btcp-pe-select,.btcp-pe-textarea{\r\n  width:100%;\r\n  padding:11px 12px;\r\n  border-radius:12px;\r\n  border:1px solid rgba(255,255,255,.13);\r\n  background:#06101f;\r\n  color:#f8fbff;\r\n}\r\n.btcp-pe-textarea{min-height:95px;resize:vertical}\r\n.btcp-pe-actions{display:flex;flex-wrap:wrap;gap:9px;margin-top:15px}\r\n.btcp-pe-list{display:grid;gap:10px;max-height:65vh;overflow:auto}\r\n.btcp-pe-item{\r\n  display:grid;\r\n  grid-template-columns:64px minmax(0,1fr) auto;\r\n  gap:12px;\r\n  align-items:center;\r\n  padding:11px;\r\n  border:1px solid rgba(255,255,255,.1);\r\n  border-radius:16px;\r\n}\r\n.btcp-pe-thumb{\r\n  width:64px;\r\n  height:64px;\r\n  border-radius:13px;\r\n  background:#07101f center\/cover no-repeat;\r\n}\r\n.btcp-pe-route{\r\n  color:#53f3ff;\r\n  font-size:.66rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.06em;\r\n}\r\n.btcp-pe-item h4{margin:5px 0 0}\r\n.btcp-pe-item-actions{display:flex;gap:6px;flex-wrap:wrap}\r\n@media(max-width:980px){\r\n  .btcp-pe-layout{grid-template-columns:1fr}\r\n}\r\n@media(max-width:620px){\r\n  .btcp-pe-grid{grid-template-columns:1fr}\r\n  .btcp-pe-field.full{grid-column:auto}\r\n  .btcp-pe-item{grid-template-columns:54px 1fr}\r\n  .btcp-pe-item-actions{grid-column:1\/-1}\r\n}\r\n<\/style>\r\n\r\n<script id=\"btcpEvolutionExtension\">\r\n(function(){\r\n  \"use strict\";\r\n\r\n  const STRUCTURE = [{\"id\": \"survival\", \"name\": \"Survival\", \"icon\": \"\ud83d\udee1\ufe0f\", \"tagline\": \"Connection and belonging\", \"options\": [{\"name\": \"Networking\", \"leaves\": [\"Social Connections\", \"Digital Networking\", \"Business Networking\", \"Influencer Connections\"]}, {\"name\": \"Dating\", \"leaves\": [\"Dating Events\", \"Online Dating\", \"Blind Dates\", \"Social Mixers\"]}, {\"name\": \"Shared Dining\", \"leaves\": [\"Restaurant Hopping\", \"Dinner Festivals\", \"Progressive Dinners\", \"City Dining\"]}, {\"name\": \"Partnership\", \"leaves\": [\"Meet the Family\", \"Wedding Planning\", \"Matchmaking\", \"Marriage Experiences\"]}]}, {\"id\": \"gastronomic\", \"name\": \"Gastronomic\", \"icon\": \"\ud83c\udf7d\ufe0f\", \"tagline\": \"Food and creativity\", \"options\": [{\"name\": \"Culinary Skills\", \"leaves\": [\"Learn to Cook\", \"Cook With Locals\", \"In-Room Cooking\", \"Shop and Cook\"]}, {\"name\": \"Culinary Experiences\", \"leaves\": [\"Culinary Camps\", \"Cooking Classes\", \"Culinary Dates\", \"Private Dining\"]}, {\"name\": \"Food Discovery\", \"leaves\": [\"Gastronomic Experiences\", \"Food-Truck Experiences\", \"Culinary Expositions\", \"Food Festivals\"]}, {\"name\": \"Food Innovation\", \"leaves\": [\"Creative Cuisine\", \"Herbal Cuisine\", \"Botanical Cuisine\", \"Medicinal Nutrition\"]}]}, {\"id\": \"conference\", \"name\": \"Conference\", \"icon\": \"\ud83d\udde3\ufe0f\", \"tagline\": \"Learning and expression\", \"options\": [{\"name\": \"Creative Learning\", \"leaves\": [\"One-Day Sessions\", \"Learning Camps\", \"Online Sessions\", \"Exclusive Sessions\"]}, {\"name\": \"Books and Writing\", \"leaves\": [\"Meet an Author\", \"Creative Writing\", \"Writing Workshops\", \"Literary Festivals\"]}, {\"name\": \"Digital Innovation\", \"leaves\": [\"Industry Conferences\", \"Innovation Camps\", \"Trading Education\", \"Youth Programs\"]}, {\"name\": \"Reinvention\", \"leaves\": [\"Trial Sessions\", \"Transformation Camps\", \"Online Programs\", \"International Programs\"]}]}, {\"id\": \"give\", \"name\": \"Give\", \"icon\": \"\ud83c\udf81\", \"tagline\": \"Compassion and service\", \"options\": [{\"name\": \"Support Children\", \"leaves\": [\"Volunteer for a Day\", \"Health Support\", \"Meaningful Gifts\", \"Educational Trips\"]}, {\"name\": \"Strengthen Families\", \"leaves\": [\"Share a Meal\", \"Support Education\", \"Family Experiences\", \"Adoption Support\"]}, {\"name\": \"Honor Older Adults\", \"leaves\": [\"Walk Together\", \"Educational Support\", \"Spend a Day Together\", \"Community Outings\"]}, {\"name\": \"Community Support\", \"leaves\": [\"Provide a Meal\", \"Community Meals\", \"Educational Support\", \"Inspire Change\"]}]}, {\"id\": \"cosmic\", \"name\": \"Cosmic\", \"icon\": \"\ud83c\udf0c\", \"tagline\": \"Healing and higher connection\", \"options\": [{\"name\": \"Celestial Travel\", \"leaves\": [\"Stargazing\", \"Meteor Experiences\", \"Eclipse Journeys\", \"Full-Moon Experiences\"]}, {\"name\": \"Universal Love\", \"leaves\": [\"Relationship Retreats\", \"Self-Love\", \"Family Connection\", \"Love Again\"]}, {\"name\": \"Healing Journey\", \"leaves\": [\"Spiritual Discovery\", \"Recovery Retreats\", \"Support and Renewal\", \"Purposeful Work\"]}, {\"name\": \"Higher Self\", \"leaves\": [\"Cosmic Awareness\", \"Past-Life Reflection\", \"Reiki Energy\", \"Astral Exploration\"]}]}, {\"id\": \"entrepreneur\", \"name\": \"Entrepreneur\", \"icon\": \"\ud83d\udcbc\", \"tagline\": \"Creation and personal power\", \"options\": [{\"name\": \"Inspiration\", \"leaves\": [\"Start-Up Experience\", \"Founder Lessons\", \"Business Bootcamp\", \"Mentor Others\"]}, {\"name\": \"Growth Mindset\", \"leaves\": [\"Level Up\", \"Share Knowledge\", \"Sustainable Growth\", \"Innovate\"]}, {\"name\": \"Creation\", \"leaves\": [\"Build Your Vision\", \"Design the Future\", \"Action Steps\", \"Creative Energy\"]}, {\"name\": \"Launch\", \"leaves\": [\"Launch Workshops\", \"Start Your Project\", \"Showcase Your Work\", \"Inspire Others\"]}]}, {\"id\": \"insight\", \"name\": \"Insight\", \"icon\": \"\ud83d\udca1\", \"tagline\": \"Awareness and inner wisdom\", \"options\": [{\"name\": \"Mindful Movement\", \"leaves\": [\"Wellness Retreats\", \"Yoga Instruction\", \"Scenic Yoga\", \"Virtual Practice\"]}, {\"name\": \"Silent Reflection\", \"leaves\": [\"Meditation Retreats\", \"Guided Learning\", \"One-Day Immersion\", \"Become a Guide\"]}, {\"name\": \"Nature Connection\", \"leaves\": [\"Forest Connection\", \"Nights in Nature\", \"Parks and Sanctuaries\", \"Ancestral Traditions\"]}, {\"name\": \"Meditation and Energy\", \"leaves\": [\"Mindful Yoga\", \"Past Reflection\", \"Reiki Wellness\", \"Astral Meditation\"]}]}];\r\n  let mounted = false;\r\n  let editingId = \"\";\r\n\r\n  const byId = id => document.getElementById(id);\r\n  const esc = value => String(value ?? \"\")\r\n    .replace(\/&\/g,\"&amp;\")\r\n    .replace(\/<\/g,\"&lt;\")\r\n    .replace(\/>\/g,\"&gt;\")\r\n    .replace(\/\"\/g,\"&quot;\")\r\n    .replace(\/'\/g,\"&#039;\");\r\n\r\n  const norm = value => String(value || \"\")\r\n    .toLowerCase()\r\n    .normalize(\"NFD\")\r\n    .replace(\/[\\u0300-\\u036f]\/g,\"\")\r\n    .replace(\/[^a-z0-9]+\/g,\" \")\r\n    .trim();\r\n\r\n  function api(){\r\n    return window.BlissTravelControlPanel || null;\r\n  }\r\n\r\n  function isEvolution(host){\r\n    const section = norm(host && (host.section || host.source || \"\"));\r\n    return section === \"evolution\" ||\r\n      section === \"personal evolution\" ||\r\n      Number(host && host.level) === 4;\r\n  }\r\n\r\n  function activeValue(host){\r\n    return host &&\r\n      host.active !== false &&\r\n      host.active !== 0 &&\r\n      norm(host.status || \"active\") !== \"hidden\";\r\n  }\r\n\r\n  function hostImage(host){\r\n    if(host.image || host.imageUrl) return host.image || host.imageUrl;\r\n    if(Array.isArray(host.images) && host.images[0]){\r\n      return typeof host.images[0] === \"string\"\r\n        ? host.images[0]\r\n        : host.images[0].url || \"\";\r\n    }\r\n    return \"\";\r\n  }\r\n\r\n  function evolutionItems(){\r\n    return api() ? (api().getInventory() || []).filter(isEvolution) : [];\r\n  }\r\n\r\n  function optionHTML(stageIndex){\r\n    return STRUCTURE[stageIndex].options.map((option,index) =>\r\n      `<option value=\"${index}\">${esc(option.name)}<\/option>`\r\n    ).join(\"\");\r\n  }\r\n\r\n  function leafHTML(stageIndex,optionIndex){\r\n    return STRUCTURE[stageIndex].options[optionIndex].leaves.map((leaf,index) =>\r\n      `<option value=\"${index}\">${esc(leaf)}<\/option>`\r\n    ).join(\"\");\r\n  }\r\n\r\n  function viewHTML(){\r\n    return `\r\n      <section id=\"btcpViewEvolution\" class=\"btcp-view\">\r\n        <div class=\"btcp-pe-layout\">\r\n          <div class=\"btcp-pe-card\">\r\n            <h3 id=\"btcpPeFormTitle\">New Personal Evolution Host<\/h3>\r\n            <p>Exact connection: Stage \u2192 Option \u2192 Leaf \u2192 Host.<\/p>\r\n\r\n            <div class=\"btcp-pe-grid\">\r\n              <div class=\"btcp-pe-field full\">\r\n                <label>Host Name<\/label>\r\n                <input id=\"btcpPeName\" class=\"btcp-pe-input\" type=\"text\">\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field\">\r\n                <label>Stage<\/label>\r\n                <select id=\"btcpPeStage\" class=\"btcp-pe-select\">\r\n                  ${STRUCTURE.map((stage,index) =>\r\n                    `<option value=\"${index}\">${index + 1}. ${esc(stage.name)}<\/option>`\r\n                  ).join(\"\")}\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field\">\r\n                <label>Option<\/label>\r\n                <select id=\"btcpPeOption\" class=\"btcp-pe-select\">\r\n                  ${optionHTML(0)}\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field full\">\r\n                <label>Leaf \/ Suboption<\/label>\r\n                <select id=\"btcpPeLeaf\" class=\"btcp-pe-select\">\r\n                  ${leafHTML(0,0)}\r\n                <\/select>\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field\">\r\n                <label>Location<\/label>\r\n                <input id=\"btcpPeLocation\" class=\"btcp-pe-input\" type=\"text\">\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field\">\r\n                <label>Price<\/label>\r\n                <input id=\"btcpPePrice\" class=\"btcp-pe-input\" type=\"text\">\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field full\">\r\n                <label>Image URL<\/label>\r\n                <input id=\"btcpPeImage\" class=\"btcp-pe-input\" type=\"url\">\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field full\">\r\n                <label>Description<\/label>\r\n                <textarea id=\"btcpPeDescription\" class=\"btcp-pe-textarea\"><\/textarea>\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field\">\r\n                <label>Website URL<\/label>\r\n                <input id=\"btcpPeWebsite\" class=\"btcp-pe-input\" type=\"url\">\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field\">\r\n                <label>Reserve URL<\/label>\r\n                <input id=\"btcpPeReserve\" class=\"btcp-pe-input\" type=\"url\">\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field\">\r\n                <label>Display Order<\/label>\r\n                <input id=\"btcpPeOrder\" class=\"btcp-pe-input\" type=\"number\" value=\"10\">\r\n              <\/div>\r\n\r\n              <div class=\"btcp-pe-field\">\r\n                <label>Status<\/label>\r\n                <select id=\"btcpPeActive\" class=\"btcp-pe-select\">\r\n                  <option value=\"1\">Active<\/option>\r\n                  <option value=\"0\">Hidden<\/option>\r\n                <\/select>\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"btcp-pe-actions\">\r\n              <button id=\"btcpPeSaveLocal\" class=\"btcp-btn primary\" type=\"button\">Add to Inventory<\/button>\r\n              <button id=\"btcpPeSaveWebsite\" class=\"btcp-btn gold\" type=\"button\">Save to Website<\/button>\r\n              <button id=\"btcpPeClear\" class=\"btcp-btn\" type=\"button\">Clear<\/button>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"btcp-pe-card\">\r\n            <h3>Personal Evolution Inventory<\/h3>\r\n            <p id=\"btcpPeCount\"><\/p>\r\n            <div id=\"btcpPeList\" class=\"btcp-pe-list\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/section>`;\r\n  }\r\n\r\n  function updateOptionSelect(){\r\n    const stageIndex = Number(byId(\"btcpPeStage\").value || 0);\r\n    byId(\"btcpPeOption\").innerHTML = optionHTML(stageIndex);\r\n    byId(\"btcpPeLeaf\").innerHTML = leafHTML(stageIndex,0);\r\n  }\r\n\r\n  function updateLeafSelect(){\r\n    const stageIndex = Number(byId(\"btcpPeStage\").value || 0);\r\n    const optionIndex = Number(byId(\"btcpPeOption\").value || 0);\r\n    byId(\"btcpPeLeaf\").innerHTML = leafHTML(stageIndex,optionIndex);\r\n  }\r\n\r\n  function clearForm(){\r\n    editingId = \"\";\r\n    byId(\"btcpPeFormTitle\").textContent = \"New Personal Evolution Host\";\r\n    [\r\n      \"btcpPeName\",\"btcpPeLocation\",\"btcpPePrice\",\"btcpPeImage\",\r\n      \"btcpPeDescription\",\"btcpPeWebsite\",\"btcpPeReserve\"\r\n    ].forEach(id => byId(id).value = \"\");\r\n    byId(\"btcpPeOrder\").value = \"10\";\r\n    byId(\"btcpPeActive\").value = \"1\";\r\n    byId(\"btcpPeStage\").value = \"0\";\r\n    updateOptionSelect();\r\n  }\r\n\r\n  function makeId(){\r\n    return \"evolution-\" + Date.now().toString(36) +\r\n      \"-\" + Math.random().toString(36).slice(2,7);\r\n  }\r\n\r\n  function formHost(){\r\n    const stageIndex = Number(byId(\"btcpPeStage\").value || 0);\r\n    const optionIndex = Number(byId(\"btcpPeOption\").value || 0);\r\n    const leafIndex = Number(byId(\"btcpPeLeaf\").value || 0);\r\n    const stage = STRUCTURE[stageIndex];\r\n    const option = stage.options[optionIndex];\r\n    const leaf = option.leaves[leafIndex];\r\n    const active = byId(\"btcpPeActive\").value === \"1\";\r\n    const name = byId(\"btcpPeName\").value.trim();\r\n    const image = byId(\"btcpPeImage\").value.trim();\r\n    const website = byId(\"btcpPeWebsite\").value.trim();\r\n    const reserve = byId(\"btcpPeReserve\").value.trim();\r\n    const description = byId(\"btcpPeDescription\").value.trim();\r\n\r\n    return {\r\n      id:editingId || makeId(),\r\n      section:\"evolution\",\r\n      source:\"personal-evolution\",\r\n      level:4,\r\n      type:\"Personal Evolution\",\r\n      name:name,\r\n      title:name,\r\n      stage:stage.name,\r\n      guide:stage.name,\r\n      category:stage.name,\r\n      option:option.name,\r\n      parent:option.name,\r\n      suboption:leaf,\r\n      style:leaf,\r\n      experience:leaf,\r\n      location:byId(\"btcpPeLocation\").value.trim(),\r\n      price:byId(\"btcpPePrice\").value.trim(),\r\n      image:image,\r\n      imageUrl:image,\r\n      images:image ? [image] : [],\r\n      description:description,\r\n      desc:description,\r\n      websiteUrl:website,\r\n      url:website,\r\n      reserveUrl:reserve,\r\n      checkoutUrl:reserve,\r\n      order:Number(byId(\"btcpPeOrder\").value || 10),\r\n      active:active,\r\n      status:active ? \"active\" : \"hidden\",\r\n      featured:0,\r\n      updatedAt:new Date().toISOString()\r\n    };\r\n  }\r\n\r\n  function renderList(){\r\n    const items = evolutionItems().sort((a,b) =>\r\n      Number(a.order || 999) - Number(b.order || 999)\r\n    );\r\n\r\n    byId(\"btcpPeCount\").textContent =\r\n      `${items.length} Personal Evolution ${items.length === 1 ? \"host\" : \"hosts\"}`;\r\n\r\n    byId(\"btcpPeList\").innerHTML = items.length ? items.map(host => {\r\n      const image = hostImage(host);\r\n      const route = [\r\n        host.stage || host.guide || host.category,\r\n        host.option || host.parent,\r\n        host.suboption || host.style || host.experience\r\n      ].filter(Boolean).join(\" \u2192 \");\r\n\r\n      return `\r\n        <article class=\"btcp-pe-item\">\r\n          <div class=\"btcp-pe-thumb\"\r\n            ${image ? `style=\"background-image:url('${esc(image)}')\"` : \"\"}><\/div>\r\n          <div>\r\n            <div class=\"btcp-pe-route\">${esc(route)}<\/div>\r\n            <h4>${esc(host.name || host.title || \"Unnamed Host\")}<\/h4>\r\n          <\/div>\r\n          <div class=\"btcp-pe-item-actions\">\r\n            <button class=\"btcp-btn small\" type=\"button\" data-pe-edit=\"${esc(host.id)}\">Edit<\/button>\r\n            <button class=\"btcp-btn small\" type=\"button\" data-pe-toggle=\"${esc(host.id)}\">\r\n              ${activeValue(host) ? \"Hide\" : \"Activate\"}\r\n            <\/button>\r\n            <button class=\"btcp-btn small danger\" type=\"button\" data-pe-delete=\"${esc(host.id)}\">Delete<\/button>\r\n          <\/div>\r\n        <\/article>`;\r\n    }).join(\"\") : '<div class=\"btcp-empty\">No Personal Evolution hosts have been added yet.<\/div>';\r\n  }\r\n\r\n  function upsert(saveWebsite){\r\n    const panel = api();\r\n    if(!panel) return alert(\"The Travel Control Panel is not ready.\");\r\n    const host = formHost();\r\n    if(!host.name) return alert(\"Please add the host name.\");\r\n\r\n    const all = panel.getInventory() || [];\r\n    const index = all.findIndex(item => String(item.id) === String(host.id));\r\n    if(index >= 0) all[index] = Object.assign({},all[index],host);\r\n    else all.push(host);\r\n\r\n    panel.setInventory(all);\r\n    renderList();\r\n    clearForm();\r\n\r\n    if(saveWebsite && typeof panel.save === \"function\"){\r\n      panel.save();\r\n    }\r\n  }\r\n\r\n  function editHost(id){\r\n    const host = evolutionItems().find(item => String(item.id) === String(id));\r\n    if(!host) return;\r\n\r\n    editingId = String(host.id);\r\n    byId(\"btcpPeFormTitle\").textContent = \"Edit Personal Evolution Host\";\r\n\r\n    const stageIndex = Math.max(0,STRUCTURE.findIndex(stage =>\r\n      norm(stage.name) === norm(host.stage || host.guide || host.category)\r\n    ));\r\n    byId(\"btcpPeStage\").value = String(stageIndex);\r\n    updateOptionSelect();\r\n\r\n    const optionIndex = Math.max(0,STRUCTURE[stageIndex].options.findIndex(option =>\r\n      norm(option.name) === norm(host.option || host.parent)\r\n    ));\r\n    byId(\"btcpPeOption\").value = String(optionIndex);\r\n    updateLeafSelect();\r\n\r\n    const leafIndex = Math.max(0,STRUCTURE[stageIndex].options[optionIndex].leaves.findIndex(leaf =>\r\n      norm(leaf) === norm(host.suboption || host.style || host.experience)\r\n    ));\r\n    byId(\"btcpPeLeaf\").value = String(leafIndex);\r\n\r\n    byId(\"btcpPeName\").value = host.name || host.title || \"\";\r\n    byId(\"btcpPeLocation\").value = host.location || \"\";\r\n    byId(\"btcpPePrice\").value = host.price || \"\";\r\n    byId(\"btcpPeImage\").value = hostImage(host);\r\n    byId(\"btcpPeDescription\").value = host.description || host.desc || \"\";\r\n    byId(\"btcpPeWebsite\").value = host.websiteUrl || host.url || \"\";\r\n    byId(\"btcpPeReserve\").value = host.reserveUrl || host.checkoutUrl || \"\";\r\n    byId(\"btcpPeOrder\").value = String(host.order || 10);\r\n    byId(\"btcpPeActive\").value = activeValue(host) ? \"1\" : \"0\";\r\n  }\r\n\r\n  function toggleHost(id){\r\n    const panel = api();\r\n    const all = panel.getInventory() || [];\r\n    const host = all.find(item => String(item.id) === String(id));\r\n    if(!host) return;\r\n    host.active = !activeValue(host);\r\n    host.status = host.active ? \"active\" : \"hidden\";\r\n    host.updatedAt = new Date().toISOString();\r\n    panel.setInventory(all);\r\n    renderList();\r\n  }\r\n\r\n  function deleteHost(id){\r\n    const panel = api();\r\n    const host = evolutionItems().find(item => String(item.id) === String(id));\r\n    if(!host) return;\r\n    if(!confirm(`Delete \"${host.name || host.title || \"this host\"}\"?`)) return;\r\n    panel.setInventory(\r\n      (panel.getInventory() || []).filter(item => String(item.id) !== String(id))\r\n    );\r\n    if(editingId === String(id)) clearForm();\r\n    renderList();\r\n  }\r\n\r\n  function showEvolutionView(){\r\n    document.querySelectorAll(\"#btcpOverlay .btcp-view\").forEach(view => {\r\n      view.classList.toggle(\"active\",view.id === \"btcpViewEvolution\");\r\n    });\r\n    document.querySelectorAll(\"#btcpOverlay .btcp-nav-btn[data-view]\").forEach(button => {\r\n      button.classList.toggle(\"active\",button.dataset.view === \"evolution\");\r\n    });\r\n    if(byId(\"btcpPageTitle\")) byId(\"btcpPageTitle\").textContent = \"Personal Evolution\";\r\n    if(byId(\"btcpPageSubtitle\")) byId(\"btcpPageSubtitle\").textContent =\r\n      \"Manage Level 4 Personal Evolution hosts by stage, option, and leaf.\";\r\n    renderList();\r\n  }\r\n\r\n  function mount(){\r\n    if(mounted || !api() || !byId(\"btcpOverlay\")) return false;\r\n\r\n    const mainBody =\r\n      document.querySelector(\"#btcpOverlay .btcp-main > div\") ||\r\n      document.querySelector(\"#btcpOverlay .btcp-main\");\r\n\r\n    if(!mainBody) return false;\r\n    mainBody.insertAdjacentHTML(\"beforeend\",viewHTML());\r\n\r\n    const nav = document.querySelector(\"#btcpOverlay .btcp-nav\");\r\n    if(nav){\r\n      const button = document.createElement(\"button\");\r\n      button.className = \"btcp-nav-btn\";\r\n      button.type = \"button\";\r\n      button.dataset.view = \"evolution\";\r\n      button.innerHTML =\r\n        '<span>Personal Evolution<\/span><span id=\"btcpCountEvolution\" class=\"btcp-nav-count\">0<\/span>';\r\n      button.addEventListener(\"click\",showEvolutionView);\r\n      nav.appendChild(button);\r\n    }\r\n\r\n    byId(\"btcpPeStage\").addEventListener(\"change\",updateOptionSelect);\r\n    byId(\"btcpPeOption\").addEventListener(\"change\",updateLeafSelect);\r\n    byId(\"btcpPeSaveLocal\").addEventListener(\"click\",function(){\r\n  upsert(true);\r\n});\r\n\r\nbyId(\"btcpPeSaveWebsite\").addEventListener(\"click\",function(){\r\n  upsert(true);\r\n});\r\n    byId(\"btcpPeClear\").addEventListener(\"click\",clearForm);\r\n\r\n    byId(\"btcpPeList\").addEventListener(\"click\",event => {\r\n      const edit = event.target.closest(\"[data-pe-edit]\");\r\n      const toggle = event.target.closest(\"[data-pe-toggle]\");\r\n      const remove = event.target.closest(\"[data-pe-delete]\");\r\n      if(edit) editHost(edit.dataset.peEdit);\r\n      if(toggle) toggleHost(toggle.dataset.peToggle);\r\n      if(remove) deleteHost(remove.dataset.peDelete);\r\n    });\r\n\r\n    const originalSet = api().setInventory;\r\n    if(!api()._peWrapped){\r\n      api().setInventory = function(items){\r\n        originalSet.call(api(),items);\r\n        if(byId(\"btcpCountEvolution\")){\r\n          byId(\"btcpCountEvolution\").textContent =\r\n            String((api().getInventory() || []).filter(isEvolution).length);\r\n        }\r\n        if(byId(\"btcpPeList\")) renderList();\r\n      };\r\n      api()._peWrapped = true;\r\n    }\r\n\r\n    mounted = true;\r\n    renderList();\r\n    byId(\"btcpCountEvolution\").textContent = String(evolutionItems().length);\r\n    return true;\r\n  }\r\n\r\n  function boot(){\r\n    if(mount()) return;\r\n    let attempts = 0;\r\n    const timer = setInterval(function(){\r\n      attempts++;\r\n      if(mount() || attempts > 100) clearInterval(timer);\r\n    },200);\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\"DOMContentLoaded\",boot,{once:true});\r\n  }else{\r\n    boot();\r\n  }\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS TRAVEL CLUB \u2014 PARTNER HOSTS CONTROL PANEL V1\r\nBOTTOM ADD-ON \u2014 KEEP INSIDE EXISTING WP:HTML BLOCK\r\n========================================================= -->\r\n\r\n<style>\r\n\r\n#btcpViewPartners{\r\n  display:none;\r\n}\r\n\r\n#btcpViewPartners.active{\r\n  display:block;\r\n}\r\n\r\n.btcp-partner-toolbar{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:10px;\r\n  align-items:center;\r\n  margin-bottom:18px;\r\n}\r\n\r\n.btcp-partner-search{\r\n  flex:1 1 280px;\r\n  min-width:220px;\r\n  padding:12px 14px;\r\n  border:1px solid rgba(255,255,255,.12);\r\n  border-radius:12px;\r\n  background:#07101f;\r\n  color:#fff;\r\n  outline:none;\r\n}\r\n\r\n.btcp-partner-search:focus{\r\n  border-color:#53f3ff;\r\n  box-shadow:0 0 0 2px rgba(83,243,255,.10);\r\n}\r\n\r\n.btcp-partner-refresh{\r\n  border:1px solid rgba(83,243,255,.28);\r\n  background:rgba(83,243,255,.08);\r\n  color:#53f3ff;\r\n  border-radius:12px;\r\n  padding:11px 15px;\r\n  cursor:pointer;\r\n  font-weight:800;\r\n}\r\n\r\n.btcp-partner-refresh:hover{\r\n  background:rgba(83,243,255,.14);\r\n}\r\n\r\n.btcp-partner-status{\r\n  margin-bottom:16px;\r\n  padding:11px 14px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  border-radius:12px;\r\n  background:rgba(255,255,255,.035);\r\n  color:rgba(235,246,255,.72);\r\n  font-size:12px;\r\n}\r\n\r\n.btcp-partner-grid{\r\n  display:grid;\r\n  grid-template-columns:\r\n    repeat(auto-fill,minmax(320px,1fr));\r\n  gap:14px;\r\n}\r\n\r\n.btcp-partner-card{\r\n  border:1px solid rgba(255,255,255,.10);\r\n  border-radius:18px;\r\n  background:\r\n    linear-gradient(\r\n      180deg,\r\n      rgba(11,23,48,.96),\r\n      rgba(5,12,27,.96)\r\n    );\r\n  overflow:hidden;\r\n}\r\n\r\n.btcp-partner-card-head{\r\n  display:flex;\r\n  gap:12px;\r\n  align-items:center;\r\n  padding:15px;\r\n  border-bottom:1px solid rgba(255,255,255,.08);\r\n}\r\n\r\n.btcp-partner-avatar{\r\n  width:52px;\r\n  height:52px;\r\n  flex:0 0 52px;\r\n  border-radius:14px;\r\n  background:#0b1730 center\/cover no-repeat;\r\n  border:1px solid rgba(83,243,255,.20);\r\n}\r\n\r\n.btcp-partner-card-title{\r\n  min-width:0;\r\n  flex:1;\r\n}\r\n\r\n.btcp-partner-card-title h3{\r\n  margin:0;\r\n  font-size:16px;\r\n  line-height:1.2;\r\n  color:#f8fbff;\r\n}\r\n\r\n.btcp-partner-card-title p{\r\n  margin:5px 0 0;\r\n  font-size:10px;\r\n  color:rgba(235,246,255,.58);\r\n  word-break:break-all;\r\n}\r\n\r\n.btcp-partner-badges{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:6px;\r\n  margin-top:8px;\r\n}\r\n\r\n.btcp-partner-badge{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  padding:5px 8px;\r\n  border-radius:999px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  background:rgba(255,255,255,.045);\r\n  color:rgba(235,246,255,.82);\r\n  font-size:9px;\r\n  font-weight:800;\r\n}\r\n\r\n.btcp-partner-badge.live{\r\n  color:#70f7a2;\r\n  border-color:rgba(112,247,162,.25);\r\n  background:rgba(112,247,162,.07);\r\n}\r\n\r\n.btcp-partner-badge.ti{\r\n  color:#53f3ff;\r\n  border-color:rgba(83,243,255,.25);\r\n  background:rgba(83,243,255,.07);\r\n}\r\n\r\n.btcp-partner-body{\r\n  padding:15px;\r\n}\r\n\r\n.btcp-partner-contact{\r\n  margin-bottom:13px;\r\n  color:rgba(235,246,255,.64);\r\n  font-size:11px;\r\n  line-height:1.6;\r\n}\r\n\r\n.btcp-partner-section-title{\r\n  margin:0 0 9px;\r\n  color:#f4d27a;\r\n  text-transform:uppercase;\r\n  letter-spacing:.13em;\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n\r\n.btcp-partner-placement{\r\n  display:grid;\r\n  grid-template-columns:42px minmax(0,1fr);\r\n  gap:10px;\r\n  padding:9px 0;\r\n  border-top:1px solid rgba(255,255,255,.07);\r\n}\r\n\r\n.btcp-partner-placement:first-of-type{\r\n  border-top:0;\r\n}\r\n\r\n.btcp-partner-placement-image{\r\n  width:42px;\r\n  height:42px;\r\n  border-radius:9px;\r\n  background:#07101f center\/cover no-repeat;\r\n}\r\n\r\n.btcp-partner-placement-route{\r\n  color:#53f3ff;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  font-size:8px;\r\n  font-weight:900;\r\n  line-height:1.45;\r\n}\r\n\r\n.btcp-partner-placement-name{\r\n  margin-top:3px;\r\n  color:#fff;\r\n  font-size:11px;\r\n  font-weight:800;\r\n}\r\n\r\n.btcp-partner-none{\r\n  padding:12px;\r\n  border:1px dashed rgba(255,255,255,.12);\r\n  border-radius:10px;\r\n  color:rgba(235,246,255,.52);\r\n  font-size:11px;\r\n}\r\n\r\n.btcp-partner-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:8px;\r\n  margin-top:13px;\r\n}\r\n\r\n.btcp-partner-action{\r\n  border:1px solid rgba(255,255,255,.12);\r\n  background:#07101f;\r\n  color:#fff;\r\n  border-radius:10px;\r\n  padding:8px 10px;\r\n  cursor:pointer;\r\n  font-size:10px;\r\n  font-weight:800;\r\n}\r\n\r\n.btcp-partner-action:hover{\r\n  border-color:#53f3ff;\r\n}\r\n\r\n@media(max-width:700px){\r\n\r\n  .btcp-partner-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n\r\n  \/* =====================================================\r\n     STATE\r\n  ===================================================== *\/\r\n\r\n  let partnerMounted = false;\r\n\r\n  let partnerAccounts = {};\r\n\r\n  let partnerLinks = {};\r\n\r\n  let partnerSearch = \"\";\r\n\r\n\r\n  \/* =====================================================\r\n     BASIC HELPERS\r\n  ===================================================== *\/\r\n\r\n  const partnerById = id =>\r\n    document.getElementById(id);\r\n\r\n\r\n  const partnerEsc = value =>\r\n    String(value == null ? \"\" : value)\r\n      .replace(\/&\/g,\"&amp;\")\r\n      .replace(\/<\/g,\"&lt;\")\r\n      .replace(\/>\/g,\"&gt;\")\r\n      .replace(\/\"\/g,\"&quot;\")\r\n      .replace(\/'\/g,\"&#039;\");\r\n\r\n\r\n  const partnerNorm = value =>\r\n    String(value || \"\")\r\n      .trim()\r\n      .toLowerCase();\r\n\r\n\r\n  function partnerPanel(){\r\n\r\n    return window.BlissTravelControlPanel || null;\r\n\r\n  }\r\n\r\n\r\n  function partnerAdmin(){\r\n\r\n    return window.BlissPartnerAdmin || null;\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     ROUTE TEXT\r\n  ===================================================== *\/\r\n\r\n  function partnerRoute(item){\r\n\r\n    if(!item){\r\n      return \"\";\r\n    }\r\n\r\n    const section =\r\n      partnerNorm(\r\n        item.section ||\r\n        item.source ||\r\n        \"\"\r\n      );\r\n\r\n\r\n    if(section === \"astro\"){\r\n\r\n      return [\r\n        \"Astro Travel\",\r\n        item.sign || \"\",\r\n        item.category ||\r\n          item.option ||\r\n          \"\",\r\n        item.style ||\r\n          item.suboption ||\r\n          \"\"\r\n      ]\r\n      .filter(Boolean)\r\n      .join(\" \u2192 \");\r\n\r\n    }\r\n\r\n\r\n    if(section === \"explore\"){\r\n\r\n      return [\r\n        \"Explore Medell\u00edn\",\r\n        item.guide ||\r\n          item.category ||\r\n          \"\",\r\n        item.option || \"\",\r\n        item.suboption || \"\"\r\n      ]\r\n      .filter(Boolean)\r\n      .join(\" \u2192 \");\r\n\r\n    }\r\n\r\n\r\n    if(\r\n      section === \"services\" ||\r\n      section === \"service\" ||\r\n      section === \"local-services\"\r\n    ){\r\n\r\n      return [\r\n        \"Local Services\",\r\n        item.service ||\r\n          item.category ||\r\n          item.type ||\r\n          \"\",\r\n        item.serviceRequest ||\r\n          item.request ||\r\n          item.option ||\r\n          item.suboption ||\r\n          \"\"\r\n      ]\r\n      .filter(Boolean)\r\n      .join(\" \u2192 \");\r\n\r\n    }\r\n\r\n\r\n    if(\r\n      section === \"evolution\" ||\r\n      section === \"personal evolution\" ||\r\n      Number(item.level || 0) === 4\r\n    ){\r\n\r\n      return [\r\n        \"Personal Evolution\",\r\n        item.stage ||\r\n          item.guide ||\r\n          item.category ||\r\n          \"\",\r\n        item.option ||\r\n          item.parent ||\r\n          \"\",\r\n        item.suboption ||\r\n          item.style ||\r\n          item.experience ||\r\n          \"\"\r\n      ]\r\n      .filter(Boolean)\r\n      .join(\" \u2192 \");\r\n\r\n    }\r\n\r\n\r\n    return [\r\n      item.section || \"Travel Club\",\r\n      item.category || \"\",\r\n      item.option || \"\",\r\n      item.suboption || \"\"\r\n    ]\r\n    .filter(Boolean)\r\n    .join(\" \u2192 \");\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     INVENTORY LOOKUP\r\n  ===================================================== *\/\r\n\r\n  function partnerInventory(){\r\n\r\n    const panel =\r\n      partnerPanel();\r\n\r\n    if(\r\n      !panel ||\r\n      typeof panel.getInventory !==\r\n        \"function\"\r\n    ){\r\n      return [];\r\n    }\r\n\r\n    return panel.getInventory() || [];\r\n\r\n  }\r\n\r\n\r\n  function partnerFindInventoryItem(id){\r\n\r\n    const wanted =\r\n      String(id || \"\");\r\n\r\n    return partnerInventory()\r\n      .find(function(item){\r\n\r\n        return String(\r\n          item.id || \"\"\r\n        ) === wanted;\r\n\r\n      }) || null;\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     PARTNER IMAGE\r\n  ===================================================== *\/\r\n\r\n  function partnerPrimaryImage(\r\n    account,\r\n    placementItems\r\n  ){\r\n\r\n    if(\r\n      Array.isArray(placementItems) &&\r\n      placementItems.length\r\n    ){\r\n\r\n      const item =\r\n        placementItems[0];\r\n\r\n      if(\r\n        item.image ||\r\n        item.imageUrl\r\n      ){\r\n        return (\r\n          item.image ||\r\n          item.imageUrl\r\n        );\r\n      }\r\n\r\n      if(\r\n        Array.isArray(item.images) &&\r\n        item.images[0]\r\n      ){\r\n        return typeof item.images[0] ===\r\n          \"string\"\r\n          ? item.images[0]\r\n          : (\r\n              item.images[0].url ||\r\n              \"\"\r\n            );\r\n      }\r\n\r\n    }\r\n\r\n    return \"\";\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     AJAX\r\n  ===================================================== *\/\r\n\r\n  function partnerPost(\r\n    action,\r\n    extra\r\n  ){\r\n\r\n    const config =\r\n      partnerAdmin();\r\n\r\n    if(\r\n      !config ||\r\n      !config.ajaxUrl ||\r\n      !config.nonce\r\n    ){\r\n\r\n      return Promise.reject(\r\n        new Error(\r\n          \"HOST PARTNER ACCOUNTS V1 is not connected.\"\r\n        )\r\n      );\r\n\r\n    }\r\n\r\n\r\n    const body =\r\n      new URLSearchParams();\r\n\r\n\r\n    body.append(\r\n      \"action\",\r\n      action\r\n    );\r\n\r\n\r\n    body.append(\r\n      \"nonce\",\r\n      config.nonce\r\n    );\r\n\r\n\r\n    Object.entries(\r\n      extra || {}\r\n    )\r\n    .forEach(function(pair){\r\n\r\n      body.append(\r\n        pair[0],\r\n        pair[1]\r\n      );\r\n\r\n    });\r\n\r\n\r\n    return fetch(\r\n      config.ajaxUrl,\r\n      {\r\n        method:\"POST\",\r\n\r\n        credentials:\r\n          \"same-origin\",\r\n\r\n        headers:{\r\n          \"Content-Type\":\r\n            \"application\/x-www-form-urlencoded; charset=UTF-8\"\r\n        },\r\n\r\n        body:\r\n          body.toString()\r\n      }\r\n    )\r\n    .then(function(response){\r\n\r\n      return response.text();\r\n\r\n    })\r\n    .then(function(text){\r\n\r\n      let json;\r\n\r\n      try{\r\n\r\n        json =\r\n          JSON.parse(text);\r\n\r\n      }catch(error){\r\n\r\n        throw new Error(\r\n          \"Partner server returned invalid data.\"\r\n        );\r\n\r\n      }\r\n\r\n\r\n      if(\r\n        !json ||\r\n        json.success !== true\r\n      ){\r\n\r\n        throw new Error(\r\n          json &&\r\n          json.data &&\r\n          json.data.message\r\n            ? json.data.message\r\n            : \"Partner request failed.\"\r\n        );\r\n\r\n      }\r\n\r\n\r\n      return json.data || {};\r\n\r\n    });\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     VIEW HTML\r\n  ===================================================== *\/\r\n\r\n  function partnerViewHTML(){\r\n\r\n    return `\r\n\r\n<section\r\n  id=\"btcpViewPartners\"\r\n  class=\"btcp-view\"\r\n>\r\n\r\n  <div class=\"btcp-panel\">\r\n\r\n    <div class=\"btcp-panel-head\">\r\n\r\n      <div>\r\n\r\n        <div class=\"btcp-eyebrow\">\r\n          Business Ecosystem\r\n        <\/div>\r\n\r\n        <h2>\r\n          Partner Hosts\r\n        <\/h2>\r\n\r\n        <p>\r\n          Businesses, commercial status,\r\n          and every Travel Club placement\r\n          connected to each Partner.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div class=\"btcp-panel-body\">\r\n\r\n      <div class=\"btcp-partner-toolbar\">\r\n\r\n        <input\r\n          id=\"btcpPartnerSearch\"\r\n          class=\"btcp-partner-search\"\r\n          type=\"search\"\r\n          placeholder=\"Search Partner Hosts...\"\r\n        >\r\n\r\n        <button\r\n          id=\"btcpPartnerRefresh\"\r\n          class=\"btcp-partner-refresh\"\r\n          type=\"button\"\r\n        >\r\n          Refresh Partners\r\n        <\/button>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div\r\n        id=\"btcpPartnerStatus\"\r\n        class=\"btcp-partner-status\"\r\n      >\r\n        Open Partner Hosts to load\r\n        commercial records.\r\n      <\/div>\r\n\r\n\r\n      <div\r\n        id=\"btcpPartnerGrid\"\r\n        class=\"btcp-partner-grid\"\r\n      ><\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n<\/section>\r\n\r\n`;\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     PARTNER ACCOUNT \u2192 PLACEMENT IDS\r\n  ===================================================== *\/\r\n\r\n  function partnerPlacementIds(\r\n    hostId\r\n  ){\r\n\r\n    const ids =\r\n      partnerLinks[\r\n        String(hostId || \"\")\r\n      ];\r\n\r\n    if(!Array.isArray(ids)){\r\n      return [];\r\n    }\r\n\r\n    return ids\r\n      .map(String)\r\n      .filter(Boolean);\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     RENDER ONE PARTNER\r\n  ===================================================== *\/\r\n\r\n  function partnerCardHTML(\r\n    hostId,\r\n    account\r\n  ){\r\n\r\n    const placementIds =\r\n      partnerPlacementIds(\r\n        hostId\r\n      );\r\n\r\n\r\n    const placementItems =\r\n      placementIds\r\n        .map(\r\n          partnerFindInventoryItem\r\n        )\r\n        .filter(Boolean);\r\n\r\n\r\n    const image =\r\n      partnerPrimaryImage(\r\n        account,\r\n        placementItems\r\n      );\r\n\r\n\r\n    const businessName =\r\n      account.business_name ||\r\n      account.host_name ||\r\n      (\r\n        placementItems[0]\r\n          ? (\r\n              placementItems[0].name ||\r\n              placementItems[0].title\r\n            )\r\n          : \"\"\r\n      ) ||\r\n      \"Unnamed Partner\";\r\n\r\n\r\n    const contactBits = [\r\n      account.contact_name || \"\",\r\n      account.email || \"\",\r\n      account.phone || \"\",\r\n      account.whatsapp\r\n        ? \"WhatsApp: \" +\r\n          account.whatsapp\r\n        : \"\"\r\n    ]\r\n    .filter(Boolean);\r\n\r\n\r\n    const placementStatus =\r\n      String(\r\n        account.placement_status ||\r\n        \"\"\r\n      );\r\n\r\n\r\n    const tiStatus =\r\n      String(\r\n        account.ti_status ||\r\n        \"\"\r\n      );\r\n\r\n\r\n    const boostStatus =\r\n      String(\r\n        account.ti_boost_status ||\r\n        \"\"\r\n      );\r\n\r\n\r\n    const plan =\r\n      String(\r\n        account.placement_plan ||\r\n        \"free_5\"\r\n      );\r\n\r\n\r\n    const limit =\r\n      Number(\r\n        account.placement_limit ||\r\n        (\r\n          plan === \"routes_20\"\r\n            ? 20\r\n            : (\r\n                plan === \"routes_10\"\r\n                  ? 10\r\n                  : 5\r\n              )\r\n        )\r\n      );\r\n\r\n\r\n    const searchable =\r\n      [\r\n        businessName,\r\n        hostId,\r\n        account.contact_name,\r\n        account.email,\r\n        account.phone,\r\n        account.whatsapp,\r\n        placementItems\r\n          .map(function(item){\r\n            return (\r\n              partnerRoute(item) +\r\n              \" \" +\r\n              (\r\n                item.name ||\r\n                item.title ||\r\n                \"\"\r\n              )\r\n            );\r\n          })\r\n          .join(\" \")\r\n      ]\r\n      .join(\" \")\r\n      .toLowerCase();\r\n\r\n\r\n    if(\r\n      partnerSearch &&\r\n      searchable.indexOf(\r\n        partnerSearch\r\n      ) === -1\r\n    ){\r\n      return \"\";\r\n    }\r\n\r\n\r\n    const placementsHTML =\r\n      placementItems.length\r\n\r\n        ? placementItems\r\n            .map(function(item){\r\n\r\n              const placementImage =\r\n                item.image ||\r\n                item.imageUrl ||\r\n                (\r\n                  Array.isArray(\r\n                    item.images\r\n                  )\r\n                    ? item.images[0]\r\n                    : \"\"\r\n                ) ||\r\n                \"\";\r\n\r\n\r\n              return `\r\n\r\n<div class=\"btcp-partner-placement\">\r\n\r\n  <div\r\n    class=\"btcp-partner-placement-image\"\r\n    ${\r\n      placementImage\r\n        ? 'style=\"background-image:url(\\'' +\r\n          partnerEsc(\r\n            typeof placementImage ===\r\n              \"string\"\r\n              ? placementImage\r\n              : (\r\n                  placementImage.url ||\r\n                  \"\"\r\n                )\r\n          ) +\r\n          '\\')\"'\r\n        : \"\"\r\n    }\r\n  ><\/div>\r\n\r\n\r\n  <div>\r\n\r\n    <div class=\"btcp-partner-placement-route\">\r\n      ${partnerEsc(\r\n        partnerRoute(item)\r\n      )}\r\n    <\/div>\r\n\r\n    <div class=\"btcp-partner-placement-name\">\r\n      ${partnerEsc(\r\n        item.name ||\r\n        item.title ||\r\n        \"Unnamed Placement\"\r\n      )}\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n`;\r\n\r\n            })\r\n            .join(\"\")\r\n\r\n        : `\r\n\r\n<div class=\"btcp-partner-none\">\r\n  No live Travel Club placement cards\r\n  are currently connected to this Partner.\r\n<\/div>\r\n\r\n`;\r\n\r\n\r\n    return `\r\n\r\n<article\r\n  class=\"btcp-partner-card\"\r\n  data-partner-id=\"${partnerEsc(hostId)}\"\r\n>\r\n\r\n  <div class=\"btcp-partner-card-head\">\r\n\r\n    <div\r\n      class=\"btcp-partner-avatar\"\r\n      ${\r\n        image\r\n          ? 'style=\"background-image:url(\\'' +\r\n            partnerEsc(image) +\r\n            '\\')\"'\r\n          : \"\"\r\n      }\r\n    ><\/div>\r\n\r\n\r\n    <div class=\"btcp-partner-card-title\">\r\n\r\n      <h3>\r\n        ${partnerEsc(\r\n          businessName\r\n        )}\r\n      <\/h3>\r\n\r\n      <p>\r\n        Partner ID:\r\n        ${partnerEsc(hostId)}\r\n      <\/p>\r\n\r\n\r\n      <div class=\"btcp-partner-badges\">\r\n\r\n        <span\r\n          class=\"btcp-partner-badge ${\r\n            placementStatus === \"active\"\r\n              ? \"live\"\r\n              : \"\"\r\n          }\"\r\n        >\r\n          Placement:\r\n          ${partnerEsc(\r\n            placementStatus ||\r\n            \"unknown\"\r\n          )}\r\n        <\/span>\r\n\r\n\r\n        <span class=\"btcp-partner-badge\">\r\n          ${partnerEsc(plan)}\r\n        <\/span>\r\n\r\n\r\n        <span class=\"btcp-partner-badge\">\r\n          ${placementItems.length}\r\n          \/\r\n          ${limit}\r\n          live\r\n        <\/span>\r\n\r\n\r\n        ${\r\n          tiStatus === \"active\"\r\n            ? `\r\n              <span\r\n                class=\"btcp-partner-badge ti\"\r\n              >\r\n                TI Active\r\n              <\/span>\r\n            `\r\n            : \"\"\r\n        }\r\n\r\n\r\n        ${\r\n          (\r\n            tiStatus === \"active\" &&\r\n            boostStatus === \"active\"\r\n          )\r\n            ? `\r\n              <span\r\n                class=\"btcp-partner-badge ti\"\r\n              >\r\n                TI Boost +2\r\n              <\/span>\r\n            `\r\n            : \"\"\r\n        }\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n\r\n  <div class=\"btcp-partner-body\">\r\n\r\n    ${\r\n      contactBits.length\r\n        ? `\r\n          <div class=\"btcp-partner-contact\">\r\n            ${contactBits\r\n              .map(partnerEsc)\r\n              .join(\"<br>\")}\r\n          <\/div>\r\n        `\r\n        : \"\"\r\n    }\r\n\r\n\r\n    <div class=\"btcp-partner-section-title\">\r\n      Live Placements\r\n    <\/div>\r\n\r\n\r\n    ${placementsHTML}\r\n\r\n\r\n    <div class=\"btcp-partner-actions\">\r\n\r\n      <button\r\n        class=\"btcp-partner-action\"\r\n        type=\"button\"\r\n        data-partner-open-inventory=\"${partnerEsc(hostId)}\"\r\n      >\r\n        View All Hosts\r\n      <\/button>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n<\/article>\r\n\r\n`;\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     RENDER PARTNERS\r\n  ===================================================== *\/\r\n\r\n  function partnerRender(){\r\n\r\n    const grid =\r\n      partnerById(\r\n        \"btcpPartnerGrid\"\r\n      );\r\n\r\n\r\n    if(!grid){\r\n      return;\r\n    }\r\n\r\n\r\n    const ids =\r\n      Object.keys(\r\n        partnerAccounts || {}\r\n      );\r\n\r\n\r\n    const html =\r\n      ids\r\n        .map(function(hostId){\r\n\r\n          return partnerCardHTML(\r\n            hostId,\r\n            partnerAccounts[hostId] || {}\r\n          );\r\n\r\n        })\r\n        .filter(Boolean)\r\n        .join(\"\");\r\n\r\n\r\n    grid.innerHTML =\r\n      html ||\r\n      `\r\n\r\n<div class=\"btcp-partner-none\">\r\n  No Partner Hosts match this view.\r\n<\/div>\r\n\r\n`;\r\n\r\n\r\n    const count =\r\n      ids.length;\r\n\r\n\r\n    const badge =\r\n      partnerById(\r\n        \"btcpCountPartners\"\r\n      );\r\n\r\n\r\n    if(badge){\r\n\r\n      badge.textContent =\r\n        String(count);\r\n\r\n    }\r\n\r\n\r\n    const status =\r\n      partnerById(\r\n        \"btcpPartnerStatus\"\r\n      );\r\n\r\n\r\n    if(status){\r\n\r\n      status.textContent =\r\n        count +\r\n        \" Partner \" +\r\n        (\r\n          count === 1\r\n            ? \"Host\"\r\n            : \"Hosts\"\r\n        ) +\r\n        \" connected \u00b7 \" +\r\n        partnerInventory().length +\r\n        \" total Travel Club cards loaded.\";\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     LOAD PARTNER BACKEND\r\n  ===================================================== *\/\r\n\r\n  function partnerLoad(){\r\n\r\n    const config =\r\n      partnerAdmin();\r\n\r\n\r\n    const status =\r\n      partnerById(\r\n        \"btcpPartnerStatus\"\r\n      );\r\n\r\n\r\n    if(status){\r\n\r\n      status.textContent =\r\n        \"Loading Partner Hosts...\";\r\n\r\n    }\r\n\r\n\r\n    if(\r\n      !config ||\r\n      !config.actions ||\r\n      !config.actions.getAll\r\n    ){\r\n\r\n      if(status){\r\n\r\n        status.textContent =\r\n          \"HOST PARTNER ACCOUNTS V1 is not connected.\";\r\n\r\n      }\r\n\r\n      return;\r\n\r\n    }\r\n\r\n\r\n    Promise.all([\r\n\r\n      partnerPost(\r\n        config.actions.getAll\r\n      ),\r\n\r\n      partnerPost(\r\n        \"bliss_partner_get_links_v1\"\r\n      )\r\n\r\n    ])\r\n\r\n    .then(function(results){\r\n\r\n      partnerAccounts =\r\n        results[0].accounts || {};\r\n\r\n\r\n      partnerLinks =\r\n        results[1].links || {};\r\n\r\n\r\n      partnerRender();\r\n\r\n    })\r\n\r\n    .catch(function(error){\r\n\r\n      if(status){\r\n\r\n        status.textContent =\r\n          error.message;\r\n\r\n      }\r\n\r\n    });\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     SHOW PARTNER VIEW\r\n  ===================================================== *\/\r\n\r\n  function partnerShowView(){\r\n\r\n    document\r\n      .querySelectorAll(\r\n        \"#btcpOverlay .btcp-view\"\r\n      )\r\n      .forEach(function(view){\r\n\r\n        view.classList.toggle(\r\n          \"active\",\r\n          view.id ===\r\n            \"btcpViewPartners\"\r\n        );\r\n\r\n      });\r\n\r\n\r\n    document\r\n      .querySelectorAll(\r\n        \"#btcpOverlay .btcp-nav-btn[data-view]\"\r\n      )\r\n      .forEach(function(button){\r\n\r\n        button.classList.toggle(\r\n          \"active\",\r\n          button.dataset.view ===\r\n            \"partners\"\r\n        );\r\n\r\n      });\r\n\r\n\r\n    const title =\r\n      partnerById(\r\n        \"btcpPageTitle\"\r\n      );\r\n\r\n\r\n    const subtitle =\r\n      partnerById(\r\n        \"btcpPageSubtitle\"\r\n      );\r\n\r\n\r\n    if(title){\r\n\r\n      title.textContent =\r\n        \"Partner Hosts\";\r\n\r\n    }\r\n\r\n\r\n    if(subtitle){\r\n\r\n      subtitle.textContent =\r\n        \"Businesses and the exact Travel Club cards connected to every purchased placement.\";\r\n\r\n    }\r\n\r\n\r\n    const sidebar =\r\n      partnerById(\r\n        \"btcpSidebar\"\r\n      );\r\n\r\n\r\n    if(sidebar){\r\n\r\n      sidebar.classList.remove(\r\n        \"open\"\r\n      );\r\n\r\n    }\r\n\r\n\r\n    partnerLoad();\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     REFRESH CONTROL PANEL + PARTNERS\r\n  ===================================================== *\/\r\n\r\n  function partnerRefreshEverything(){\r\n\r\n    const panel =\r\n      partnerPanel();\r\n\r\n\r\n    if(\r\n      !panel ||\r\n      typeof panel.reload !==\r\n        \"function\"\r\n    ){\r\n\r\n      partnerLoad();\r\n      return;\r\n\r\n    }\r\n\r\n\r\n    const status =\r\n      partnerById(\r\n        \"btcpPartnerStatus\"\r\n      );\r\n\r\n\r\n    if(status){\r\n\r\n      status.textContent =\r\n        \"Refreshing Travel Club inventory...\";\r\n\r\n    }\r\n\r\n\r\n    \/*\r\n     * Existing reload() is asynchronous internally,\r\n     * but does not return its fetch Promise.\r\n     *\r\n     * Give it a short moment to update inventory,\r\n     * then reload Partner records.\r\n     *\/\r\n\r\n    panel.reload();\r\n\r\n\r\n    setTimeout(\r\n      function(){\r\n\r\n        partnerLoad();\r\n\r\n      },\r\n      900\r\n    );\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     EVENTS\r\n  ===================================================== *\/\r\n\r\n  function partnerBindEvents(){\r\n\r\n    const search =\r\n      partnerById(\r\n        \"btcpPartnerSearch\"\r\n      );\r\n\r\n\r\n    if(search){\r\n\r\n      search.addEventListener(\r\n        \"input\",\r\n        function(){\r\n\r\n          partnerSearch =\r\n            String(\r\n              search.value ||\r\n              \"\"\r\n            )\r\n            .trim()\r\n            .toLowerCase();\r\n\r\n          partnerRender();\r\n\r\n        }\r\n      );\r\n\r\n    }\r\n\r\n\r\n    const refresh =\r\n      partnerById(\r\n        \"btcpPartnerRefresh\"\r\n      );\r\n\r\n\r\n    if(refresh){\r\n\r\n      refresh.addEventListener(\r\n        \"click\",\r\n        partnerRefreshEverything\r\n      );\r\n\r\n    }\r\n\r\n\r\n    const grid =\r\n      partnerById(\r\n        \"btcpPartnerGrid\"\r\n      );\r\n\r\n\r\n    if(grid){\r\n\r\n      grid.addEventListener(\r\n        \"click\",\r\n        function(event){\r\n\r\n          const inventoryButton =\r\n            event.target.closest(\r\n              \"[data-partner-open-inventory]\"\r\n            );\r\n\r\n\r\n          if(inventoryButton){\r\n\r\n            const panel =\r\n              partnerPanel();\r\n\r\n\r\n            if(\r\n              panel &&\r\n              typeof panel.openView ===\r\n                \"function\"\r\n            ){\r\n\r\n              panel.openView(\r\n                \"inventory\"\r\n              );\r\n\r\n            }\r\n\r\n          }\r\n\r\n        }\r\n      );\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     MOUNT\r\n  ===================================================== *\/\r\n\r\n  function partnerMount(){\r\n\r\n    if(partnerMounted){\r\n      return true;\r\n    }\r\n\r\n\r\n    const panel =\r\n      partnerPanel();\r\n\r\n\r\n    const overlay =\r\n      partnerById(\r\n        \"btcpOverlay\"\r\n      );\r\n\r\n\r\n    if(\r\n      !panel ||\r\n      !overlay\r\n    ){\r\n      return false;\r\n    }\r\n\r\n\r\n    const mainBody =\r\n      document.querySelector(\r\n        \"#btcpOverlay .btcp-main > div\"\r\n      ) ||\r\n      document.querySelector(\r\n        \"#btcpOverlay .btcp-main\"\r\n      );\r\n\r\n\r\n    const nav =\r\n      document.querySelector(\r\n        \"#btcpOverlay .btcp-nav\"\r\n      );\r\n\r\n\r\n    if(\r\n      !mainBody ||\r\n      !nav\r\n    ){\r\n      return false;\r\n    }\r\n\r\n\r\n    \/*\r\n     * Add Partner Hosts view.\r\n     *\/\r\n\r\n    if(\r\n      !partnerById(\r\n        \"btcpViewPartners\"\r\n      )\r\n    ){\r\n\r\n      mainBody.insertAdjacentHTML(\r\n        \"beforeend\",\r\n        partnerViewHTML()\r\n      );\r\n\r\n    }\r\n\r\n\r\n    \/*\r\n     * Add Business label only if\r\n     * another extension has not already added one.\r\n     *\/\r\n\r\n    if(\r\n      !partnerById(\r\n        \"btcpPartnerNavLabel\"\r\n      )\r\n    ){\r\n\r\n      const label =\r\n        document.createElement(\r\n          \"div\"\r\n        );\r\n\r\n\r\n      label.id =\r\n        \"btcpPartnerNavLabel\";\r\n\r\n\r\n      label.className =\r\n        \"btcp-nav-label\";\r\n\r\n\r\n      label.textContent =\r\n        \"Business\";\r\n\r\n\r\n      nav.appendChild(label);\r\n\r\n    }\r\n\r\n\r\n    \/*\r\n     * Add Partner Hosts button.\r\n     *\/\r\n\r\n    if(\r\n      !partnerById(\r\n        \"btcpPartnerNavButton\"\r\n      )\r\n    ){\r\n\r\n      const button =\r\n        document.createElement(\r\n          \"button\"\r\n        );\r\n\r\n\r\n      button.id =\r\n        \"btcpPartnerNavButton\";\r\n\r\n\r\n      button.className =\r\n        \"btcp-nav-btn\";\r\n\r\n\r\n      button.type =\r\n        \"button\";\r\n\r\n\r\n      button.dataset.view =\r\n        \"partners\";\r\n\r\n\r\n      button.innerHTML =\r\n\r\n        '<span>Partner Hosts<\/span>' +\r\n\r\n        '<span ' +\r\n        'id=\"btcpCountPartners\" ' +\r\n        'class=\"btcp-nav-count\">' +\r\n        '0' +\r\n        '<\/span>';\r\n\r\n\r\n      button.addEventListener(\r\n        \"click\",\r\n        partnerShowView\r\n      );\r\n\r\n\r\n      nav.appendChild(\r\n        button\r\n      );\r\n\r\n    }\r\n\r\n\r\n    partnerBindEvents();\r\n\r\n\r\n    \/*\r\n     * Keep Partner view synchronized\r\n     * whenever the existing Control Panel\r\n     * receives a fresh inventory array.\r\n     *\/\r\n\r\n    if(\r\n      !panel._partnersWrapped\r\n    ){\r\n\r\n      const originalSet =\r\n        panel.setInventory;\r\n\r\n\r\n      panel.setInventory =\r\n        function(items){\r\n\r\n          originalSet.call(\r\n            panel,\r\n            items\r\n          );\r\n\r\n\r\n          if(\r\n            partnerById(\r\n              \"btcpViewPartners\"\r\n            ) &&\r\n            partnerById(\r\n              \"btcpViewPartners\"\r\n            )\r\n            .classList\r\n            .contains(\"active\")\r\n          ){\r\n\r\n            partnerRender();\r\n\r\n          }\r\n\r\n        };\r\n\r\n\r\n      panel._partnersWrapped =\r\n        true;\r\n\r\n    }\r\n\r\n\r\n    partnerMounted =\r\n      true;\r\n\r\n\r\n    return true;\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     BOOT\r\n  ===================================================== *\/\r\n\r\n  let partnerBootAttempts =\r\n    0;\r\n\r\n\r\n  function partnerBoot(){\r\n\r\n    partnerBootAttempts++;\r\n\r\n\r\n    if(partnerMount()){\r\n      return;\r\n    }\r\n\r\n\r\n    if(\r\n      partnerBootAttempts <\r\n      80\r\n    ){\r\n\r\n      setTimeout(\r\n        partnerBoot,\r\n        150\r\n      );\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    document.readyState ===\r\n      \"loading\"\r\n  ){\r\n\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      partnerBoot,\r\n      {\r\n        once:true\r\n      }\r\n    );\r\n\r\n  }else{\r\n\r\n    partnerBoot();\r\n\r\n  }\r\n\r\n\r\n  \/* =====================================================\r\n     PUBLIC BRIDGE\r\n  ===================================================== *\/\r\n\r\n  window.BlissPartnerControlPanel = {\r\n\r\n    refresh:\r\n      partnerRefreshEverything,\r\n\r\n    render:\r\n      partnerRender,\r\n\r\n    getAccounts:\r\n      function(){\r\n\r\n        return Object.assign(\r\n          {},\r\n          partnerAccounts\r\n        );\r\n\r\n      },\r\n\r\n    getLinks:\r\n      function(){\r\n\r\n        return Object.assign(\r\n          {},\r\n          partnerLinks\r\n        );\r\n\r\n      }\r\n\r\n  };\r\n\r\n\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Would you like to see Thematic Tours of the area? Yes No \ud83d\udcf1 APPS \ud83d\udcb3 Current On Vacation Recommendation APP CO2 Current On Vacation Recommendation APP H20 Current On Vacation Recommendation APP BMI Current On Vacation Recommendation APP DNA \ud83d\udcb3 Pay with Bliss Coin Enter your digital wallet #: Send payment to: HOST-WALLET-ADDRESS-123 Close \ud83e\uddca [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2414","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/2414","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/comments?post=2414"}],"version-history":[{"count":97,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/2414\/revisions"}],"predecessor-version":[{"id":10459,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/2414\/revisions\/10459"}],"wp:attachment":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/media?parent=2414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}