{"id":2305,"date":"2025-07-03T03:06:29","date_gmt":"2025-07-03T03:06:29","guid":{"rendered":"https:\/\/godsgalaxygame.com\/GGG\/?page_id=2305"},"modified":"2026-07-24T01:00:59","modified_gmt":"2026-07-24T01:00:59","slug":"cancer","status":"publish","type":"page","link":"https:\/\/godsgalaxygame.com\/GGG\/cancer\/","title":{"rendered":"Cancer"},"content":{"rendered":"\r\n<!-- BLOQUE 2 - Cancer Cube V19 Completo + Mapa Circular + Tutorial con Im\u00e1genes -->\r\n<style>\r\n  @media (max-width: 768px) {\r\n    #glowMapContainer { margin-top: -55px !important; }\r\n  }\r\n  \/* Replay (Tutorial) button *\/\r\n  #ctReplay{\r\n    position:fixed; right:14px; bottom:14px; z-index:10000;\r\n    border:1px solid rgba(0,255,255,.45); background:rgba(0,255,255,.10);\r\n    color:#cfffff; padding:10px 12px; border-radius:12px; cursor:pointer;\r\n    backdrop-filter:blur(6px) saturate(130%); font-size:14px;\r\n    display:inline-flex;\r\n  }\r\n  #ctReplay.show{ display:inline-flex; }\r\n  #ctReplay:hover{ background:rgba(0,255,255,.18); box-shadow:0 0 14px rgba(0,255,255,.25); }\r\n<\/style>\r\n\r\n<div id=\"cancerCubeContainer\" 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=\"cancerCube\" 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;\">\u264b<\/div>\r\n        <div style=\"font-size:16px; color:white; font-weight:bold; text-shadow:0 0 10px white; margin-top:6px;\">Cancer<\/div>\r\n      <\/div>\r\n\r\n      <!-- BACK -->\r\n      <div class=\"face back\" style=\"width:180px; height:180px; background:black; border:2px solid orange; box-shadow:0 0 20px orange; position:absolute; transform:rotateY(180deg) translateZ(90px); font-family:Orbitron;\">\r\n        <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); width:75px; height:75px; border-radius:50%; overflow:hidden; box-shadow:0 0 25px orange;\">\r\n          <img decoding=\"async\" src=\"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/1000065346-scaled.jpg\" style=\"width:100%; height:100%; object-fit:cover;\">\r\n        <\/div>\r\n        <a href=\"#\" id=\"hostWebsiteBtn\" title=\"Go to Host Website\" target=\"_blank\" style=\"position:absolute; top:10px; left:10px; width:38px; height:38px; border-radius:50%; background:rgba(0,0,0,0.7); box-shadow:0 0 10px cyan; display:flex; justify-content:center; align-items:center;\">\r\n          <img decoding=\"async\" src=\"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240108-225358_Chrome-scaled.jpg\" style=\"width:70%; height:70%; border-radius:50%; object-fit:cover;\">\r\n        <\/a>\r\n        <a href=\"https:\/\/godsgalaxygame.com\/GGG\/responsable-reservations\/\" title=\"Reserve with Us\" target=\"_blank\" style=\"position:absolute; top:10px; right:10px; width:38px; height:38px; border-radius:50%; background:rgba(0,0,0,0.7); box-shadow:0 0 10px lightgreen; display:flex; justify-content:center; align-items:center;\">\r\n          <img decoding=\"async\" src=\"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240108-225452_Chrome-scaled.jpg\" style=\"width:70%; height:70%; border-radius:50%; object-fit:cover;\">\r\n        <\/a>\r\n        <a href=\"https:\/\/luxus2.godaddysites.com\/\" title=\"Become a Host\" target=\"_blank\" style=\"position:absolute; bottom:10px; left:10px; width:38px; height:38px; border-radius:50%; background:rgba(0,0,0,0.7); box-shadow:0 0 10px #ff33cc; display:flex; justify-content:center; align-items:center;\">\r\n          <img decoding=\"async\" src=\"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240108-224514_Chrome-scaled.jpg\" style=\"width:70%; height:70%; border-radius:50%; object-fit:cover;\">\r\n        <\/a>\r\n        <a href=\"https:\/\/godsgalaxygame.com\/GGG\/discounts-gift\/\" title=\"Get Coupons\" target=\"_blank\"\r\n           style=\"position:absolute; bottom:10px; right:10px; width:38px; height:38px; border-radius:50%; background:rgba(0,0,0,0.7); box-shadow:0 0 10px cyan; display:flex; justify-content:center; align-items:center;\">\r\n          <img decoding=\"async\" src=\"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240108-225546_Chrome.jpg\" \r\n               style=\"width:70%; height:70%; border-radius:50%; object-fit:cover;\">\r\n        <\/a>\r\n      <\/div>\r\n\r\n      <!-- RIGHT (Nite) -->\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('nite-accommodations')\" style=\"position:absolute; top:8px; left:27px; width:126px; height:17px; border:1px solid beige; color:white; background:transparent;\">Accommodations<\/button>\r\n        <button onclick=\"showHostButtons('nite-restaurants')\" style=\"position:absolute; bottom:8px; left:27px; width:126px; height:17px; border:1px solid beige; color:white; background:transparent;\">Restaurants<\/button>\r\n        <button onclick=\"showHostButtons('nite-entertainment')\" style=\"position:absolute; top:27px; left:8px; height:126px; width:17px; border:1px solid beige; color:white; writing-mode:vertical-rl; background:transparent;\">Entertainment<\/button>\r\n        <button onclick=\"showHostButtons('nite-vip')\" style=\"position:absolute; top:27px; right:8px; height:126px; width:17px; border:1px solid beige; color:white; writing-mode:vertical-lr; background:transparent;\">VIP<\/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;\">Nite<\/div>\r\n          <img decoding=\"async\" src=\"https:\/\/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 (Relax) -->\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('relax-accommodations')\" style=\"position:absolute; top:8px; left:27px; width:126px; height:17px; border:1px solid #00ccff; color:white; background:transparent;\">Accommodations<\/button>\r\n        <button onclick=\"showHostButtons('relax-restaurants')\" style=\"position:absolute; bottom:8px; left:27px; width:126px; height:17px; border:1px solid #00ccff; color:white; background:transparent;\">Restaurants<\/button>\r\n        <button onclick=\"showHostButtons('relax-entertainment')\" style=\"position:absolute; top:27px; left:8px; height:126px; width:17px; border:1px solid #00ccff; color:white; writing-mode:vertical-rl; background:transparent;\">Entertainment<\/button>\r\n        <button onclick=\"showHostButtons('relax-vip')\" style=\"position:absolute; top:27px; right:8px; height:126px; width:17px; border:1px solid #00ccff; color:white; writing-mode:vertical-lr; background:transparent;\">VIP<\/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;\">Relax<\/div>\r\n          <img decoding=\"async\" src=\"https:\/\/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 (Elegant) -->\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('elegant-accommodations')\" style=\"position:absolute; top:8px; left:27px; width:126px; height:17px; border:1px solid green; color:white; background:transparent;\">Accommodations<\/button>\r\n        <button onclick=\"showHostButtons('elegant-restaurants')\" style=\"position:absolute; bottom:8px; left:27px; width:126px; height:17px; border:1px solid green; color:white; background:transparent;\">Restaurants<\/button>\r\n        <button onclick=\"showHostButtons('elegant-entertainment')\" style=\"position:absolute; top:27px; left:8px; height:126px; width:17px; border:1px solid green; color:white; writing-mode:vertical-rl; background:transparent;\">Entertainment<\/button>\r\n        <button onclick=\"showHostButtons('elegant-vip')\" style=\"position:absolute; top:27px; right:8px; height:126px; width:17px; border:1px solid green; color:white; writing-mode:vertical-lr; background:transparent;\">VIP<\/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;\">Elegant<\/div>\r\n          <img decoding=\"async\" src=\"https:\/\/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 (Nature) -->\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('nature-accommodations')\" style=\"position:absolute; top:8px; left:27px; width:126px; height:17px; border:1px solid red; color:white; background:transparent;\">Accommodations<\/button>\r\n        <button onclick=\"showHostButtons('nature-restaurants')\" style=\"position:absolute; bottom:8px; left:27px; width:126px; height:17px; border:1px solid red; color:white; background:transparent;\">Restaurants<\/button>\r\n        <button onclick=\"showHostButtons('nature-entertainment')\" style=\"position:absolute; top:27px; left:8px; height:126px; width:17px; border:1px solid red; color:white; writing-mode:vertical-rl; background:transparent;\">Entertainment<\/button>\r\n        <button onclick=\"showHostButtons('nature-vip')\" style=\"position:absolute; top:27px; right:8px; height:126px; width:17px; border:1px solid red; color:white; writing-mode:vertical-lr; background:transparent;\">VIP<\/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;\">Nature<\/div>\r\n          <img decoding=\"async\" src=\"https:\/\/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 -->\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 initMap() {\r\n    const location = { lat: 6.2333, lng: -75.5905 };\r\n    window.ggMap = new google.maps.Map(document.getElementById(\"googleMap\"), {\r\n      zoom: 12,\r\n      center: location,\r\n      disableDefaultUI: true\r\n    });\r\n    new google.maps.Marker({ position: location, map: window.ggMap });\r\n  }\r\n  function focusOnHost(lat, lng) {\r\n    if (window.ggMap) {\r\n      const newCenter = new google.maps.LatLng(lat, lng);\r\n      window.ggMap.setCenter(newCenter);\r\n      new google.maps.Marker({ position: newCenter, map: window.ggMap });\r\n    } else {\r\n      console.log(\"Google Map not ready yet.\");\r\n    }\r\n  }\r\n<\/script>\r\n\r\n<!-- Activaci\u00f3n Cancer + tutorial trigger -->\r\n<script>\r\n  function activateCancerCube() {\r\n    const zs = document.getElementById(\"zodiacSelector\");\r\n    if (zs) { zs.style.opacity = \"0\"; zs.style.pointerEvents = \"none\"; }\r\n\r\n    const cancer = document.getElementById(\"cancerCubeContainer\");\r\n    const map    = document.getElementById(\"glowMapContainer\");\r\n    const swipe  = document.getElementById(\"swipeImage\");\r\n\r\n    if (cancer) { cancer.style.opacity = \"1\"; cancer.style.pointerEvents = \"auto\"; }\r\n    if (map)    { map.style.opacity    = \"1\"; map.style.pointerEvents    = \"auto\"; }\r\n\r\n    if (swipe) {\r\n      swipe.style.display = \"block\";\r\n      setTimeout(() => { swipe.style.display = \"none\"; }, 3500);\r\n    }\r\n\r\n    \/\/ Abre el tutorial 2s despu\u00e9s de activar Cancer\r\n    if (window.__cancerTutorTimer) clearTimeout(window.__cancerTutorTimer);\r\n    window.__cancerTutorTimer = setTimeout(() => {\r\n      if (window.CubeTutor) CubeTutor.open(0);\r\n    }, 2000);\r\n  }\r\n  \/\/ Alias por si llamas con min\u00fasculas\r\n  function activatecancerCube(){ activateCancerCube(); }\r\n<\/script>\r\n\r\n<!-- ===== Cube Help Tutorial (con im\u00e1genes) ===== -->\r\n<style>\r\n  #cubeTutor { position:fixed; inset:0; display:none; place-items:center; z-index:9999; }\r\n  #cubeTutor.is-open { display:grid; }\r\n  #cubeTutor .ct-overlay {\r\n    position:absolute; inset:0;\r\n    background:linear-gradient(180deg, rgba(0,0,0,.45), rgba(0,0,0,.65));\r\n    backdrop-filter:blur(2px);\r\n  }\r\n  #cubeTutor .ct-card{\r\n    position:relative; width:min(720px,96vw); padding:16px; border-radius:16px;\r\n    background:rgba(10,14,22,.78); color:#e9f8ff; border:1px solid rgba(0,255,255,.28);\r\n    box-shadow:0 8px 28px rgba(0,255,255,.25), inset 0 0 28px rgba(255,255,255,.05);\r\n    backdrop-filter:blur(10px) saturate(130%);\r\n  }\r\n  #cubeTutor .ct-top   { font-size:11px; letter-spacing:.22em; text-transform:uppercase; color:#9fe7ff; opacity:.9; margin-bottom:6px; }\r\n  #cubeTutor .ct-title { margin:0 0 6px; font:700 20px\/1.2 system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif; }\r\n  #cubeTutor .ct-desc  { margin:0 8px 10px 0; font:15px\/1.45 system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif; color:#d9f0ff; }\r\n  #cubeTutor .ct-media { margin:8px 0 10px; border-radius:12px; overflow:hidden; border:1px solid rgba(255,255,255,.12); background:#0b111a; }\r\n  #cubeTutor .ct-media img { display:block; width:100%; height:280px; object-fit:contain; background:#0b111a; }\r\n  @media (min-width: 768px){ #cubeTutor .ct-media img { height:340px; } }\r\n  #cubeTutor .ct-actions{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-top:10px; }\r\n  #cubeTutor .ct-left{ display:flex; gap:8px; align-items:center; }\r\n  #cubeTutor .ct-right{ display:flex; gap:8px; align-items:center; }\r\n  #cubeTutor .ct-btn{\r\n    appearance:none; border:1px solid rgba(0,255,255,.35); background:rgba(0,255,255,.08);\r\n    color:#cfffff; padding:9px 12px; border-radius:12px; cursor:pointer; font-size:14px;\r\n  }\r\n  #cubeTutor .ct-btn[disabled]{ opacity:.4; pointer-events:none; }\r\n  #cubeTutor .ct-close{\r\n    position:absolute; top:8px; right:10px; width:34px; height:34px; border-radius:10px;\r\n    border:1px solid rgba(255,255,255,.35); background:rgba(255,255,255,.06); color:#fff;\r\n    font-size:18px; display:grid; place-items:center; cursor:pointer;\r\n  }\r\n  #cubeTutor .ct-close:hover{ background:rgba(255,255,255,.10); }\r\n  #cubeTutor .ct-progress{ font-size:12px; opacity:.75; }\r\n<\/style>\r\n\r\n<div id=\"cubeTutor\" aria-hidden=\"true\">\r\n  <div class=\"ct-overlay\" onclick=\"CubeTutor.close()\"><\/div>\r\n  <div class=\"ct-card\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ctTitle\" aria-describedby=\"ctDesc\">\r\n    <button class=\"ct-close\" type=\"button\" aria-label=\"Close\" onclick=\"CubeTutor.close()\">\u00d7<\/button>\r\n\r\n    <div class=\"ct-top\" id=\"ctTop\">How it works<\/div>\r\n    <h3 class=\"ct-title\" id=\"ctTitle\">Rotate the Cube<\/h3>\r\n    <p class=\"ct-desc\" id=\"ctDesc\">Drag with one finger (touch) or click-and-drag (mouse) to rotate. Swipe for a quick spin.<\/p>\r\n\r\n    <div class=\"ct-media\"><img decoding=\"async\" id=\"ctImg\" src=\"\" alt=\"\"><\/div>\r\n\r\n    <div class=\"ct-actions\">\r\n      <div class=\"ct-left\">\r\n        <button id=\"ctPrev\" class=\"ct-btn\" type=\"button\">\u2190 Prev<\/button>\r\n        <span id=\"ctProg\" class=\"ct-progress\">1 \/ 7<\/span>\r\n      <\/div>\r\n      <div class=\"ct-right\">\r\n        <button id=\"ctSkip\" class=\"ct-btn\" type=\"button\">Skip<\/button>\r\n        <button id=\"ctNext\" class=\"ct-btn\" type=\"button\">Next \u2192<\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Bot\u00f3n Replay -->\r\n<button id=\"ctReplay\" type=\"button\" title=\"Open tutorial\">Tutorial<\/button>\r\n\r\n<script>\r\n(function(){\r\n  \/* Timing: ajusta a tu gusto *\/\r\n  const OPEN_AFTER_MS   = -1;  \/\/ abre solo 2s tras cargar la p\u00e1gina\r\n  const REPLAY_AFTER_MS = -1;     \/\/ 0 = mostrar bot\u00f3n inmediatamente (p.ej. 12000 = 12s)\r\n  const AUTO_CLOSE_MS   = 0;     \/\/ 0 = sin auto avance\/cierre; pon 5000 para 5s por paso\r\n\r\n  \/* Im\u00e1genes del tutorial (mismas que Aries) *\/\r\n  const IMG_MOVE        = \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/09\/Screenshot_20250907_233457_Chrome.jpg\";\r\n  const IMG_FOUR_SIDES  = \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/09\/Screenshot_20250907_233921_Chrome.jpg\";\r\n  const IMG_OPEN_PLACE  = \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/09\/20250715_202059-scaled.jpg\";\r\n  const IMG_DOUBLE_TAP  = \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/09\/20250715_202156-scaled.jpg\";\r\n  const IMG_FAVORITES   = \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/09\/20250715_202221-scaled.jpg\";\r\n  const IMG_BACK_ACTION = \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/09\/Screenshot_20250907_234036_Chrome.jpg\";\r\n\r\n  const steps = [\r\n    { top:\"How it works\", title:\"Rotate the Cube\",        desc:\"Drag with one finger (touch) or click-and-drag (mouse) to rotate. Swipe for a quick spin.\", img: IMG_MOVE },\r\n    { top:\"Explore\",      title:\"Open the Four Sides\",    desc:\"Each face has four options. Tap any option to explore nearby places and services.\",          img: IMG_FOUR_SIDES },\r\n    { top:\"Map\",          title:\"Open a Place\",           desc:\"Tap a circle on the map to view details, photos, and available actions.\",                  img: IMG_OPEN_PLACE },\r\n    { top:\"Favorites\",    title:\"Save with a Double-Tap\", desc:\"Double-tap any circle to add it to Favorites. A star confirms it\u2019s saved.\",                 img: IMG_DOUBLE_TAP },\r\n    { top:\"Favorites\",    title:\"View Your Favorites\",    desc:\"Tap the Favorites (\u2605) button to see all saved places in one list.\",                        img: IMG_FAVORITES },\r\n    { top:\"Review\",       title:\"Back of the Cube\",       desc:\"Keep the favorite selected and use action buttons to get directions, call, share, or book.\", img: IMG_BACK_ACTION },\r\n    { top:\"Tips\",         title:\"Close or Skip\",          desc:\"Use the \u00d7 at top-right or the Skip button to close this tutorial at any time.\",            img: IMG_BACK_ACTION }\r\n  ];\r\n\r\n  \/\/ Preload images\r\n  steps.forEach(s => { if (s.img) { const im = new Image(); im.src = s.img; } });\r\n\r\n  const root   = document.getElementById('cubeTutor');\r\n  const title  = root.querySelector('#ctTitle');\r\n  const desc   = root.querySelector('#ctDesc');\r\n  const topEl  = root.querySelector('#ctTop');\r\n  const prev   = root.querySelector('#ctPrev');\r\n  const next   = root.querySelector('#ctNext');\r\n  const skip   = root.querySelector('#ctSkip');\r\n  const prog   = root.querySelector('#ctProg');\r\n  const imgEl  = root.querySelector('#ctImg');\r\n  const media  = root.querySelector('.ct-media');\r\n  const replay = document.getElementById('ctReplay');\r\n\r\n  let i = 0, autoTimer = null, armed = false;\r\n\r\n  function render(){\r\n    const s = steps[i];\r\n    topEl.textContent   = s.top;\r\n    title.textContent   = s.title;\r\n    desc.textContent    = s.desc;\r\n    prog.textContent    = (i+1) + \" \/ \" + steps.length;\r\n    prev.disabled       = (i === 0);\r\n    next.textContent    = (i === steps.length - 1) ? 'Finish' : 'Next \u2192';\r\n\r\n    if (s.img) {\r\n      media.style.display = 'block';\r\n      imgEl.src = s.img;\r\n      imgEl.alt = s.title;\r\n      imgEl.loading = 'eager';\r\n      imgEl.decoding = 'async';\r\n    } else {\r\n      media.style.display = 'none';\r\n      imgEl.removeAttribute('src');\r\n      imgEl.alt = '';\r\n    }\r\n\r\n    if (AUTO_CLOSE_MS > 0) {\r\n      clearTimeout(autoTimer);\r\n      autoTimer = setTimeout(() => {\r\n        if (i < steps.length - 1) { i++; render(); } else { CubeTutor.close(); }\r\n      }, AUTO_CLOSE_MS);\r\n    }\r\n  }\r\n\r\n  const CubeTutor = {\r\n    open(idx=0){\r\n      i = Math.max(0, Math.min(idx, steps.length - 1));\r\n      render();\r\n      root.classList.add('is-open');\r\n      root.setAttribute('aria-hidden','false');\r\n    },\r\n    close(){\r\n      root.classList.remove('is-open');\r\n      root.setAttribute('aria-hidden','true');\r\n      clearTimeout(autoTimer);\r\n    },\r\n    next(){ if (i < steps.length - 1) { i++; render(); } else { CubeTutor.close(); } },\r\n    prev(){ if (i > 0) { i--; render(); } }\r\n  };\r\n  window.CubeTutor = CubeTutor;\r\n\r\n  \/\/ Controles\r\n  prev.addEventListener('click', CubeTutor.prev);\r\n  next.addEventListener('click', CubeTutor.next);\r\n  skip.addEventListener('click', CubeTutor.close);\r\n  root.querySelector('.ct-overlay').addEventListener('click', CubeTutor.close);\r\n  document.addEventListener('keydown', (e)=>{ if (e.key === 'Escape') CubeTutor.close(); });\r\n\r\n  \/\/ Auto-open en Carga (por si entras directo a Cancer)\r\n  function boot(){\r\n    if (armed) return; armed = true;\r\n    if (OPEN_AFTER_MS >= 0) {\r\n  setTimeout(() => { CubeTutor.open(0); }, OPEN_AFTER_MS);\r\n}\r\n\r\nif (REPLAY_AFTER_MS >= 0) {\r\n  setTimeout(() => { replay.classList.add('show'); }, REPLAY_AFTER_MS);\r\n}\r\n\r\n    replay.addEventListener('click', () => CubeTutor.open(0));\r\n  }\r\n  if (document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', boot); }\r\n  else { boot(); }\r\n\r\n  \/\/ Cierra el tutorial si el usuario interact\u00faa con el cube\/map\r\n  document.addEventListener('click', (e) => {\r\n    if (e.target.closest('.pyramid-cube') || e.target.closest('.cube') || e.target.closest('#googleMap')) {\r\n      CubeTutor.close();\r\n    }\r\n  });\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n<!-- =========================================================\r\nGGG BLOCK 3 \u2014 UNIVERSAL\r\nUse this same block on every page.\r\nONLY change:\r\n1) PAGE_KEY\r\n2) CUBE_ID\r\n3) optional URLs\r\nExample:\r\n- Aries   => PAGE_KEY = \"aries\"   \/ CUBE_ID = \"ariesCube\"\r\n- Taurus  => PAGE_KEY = \"taurus\"  \/ CUBE_ID = \"taurusCube\"\r\n========================================================= -->\r\n\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, system-ui, sans-serif;\r\n  }\r\n\r\n  #favoritesBtn:hover::after {\r\n    content: ' Double click a Host to add or remove \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\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;\r\n    display: flex;\r\n    justify-content: center;\r\n    align-items: center;\r\n    font-size: 20px;\r\n    cursor: pointer;\r\n    margin-top: 2px;\r\n  }\r\n\r\n  \/* ===== FAVORITES PANEL ===== *\/\r\n  #favoritesPanel {\r\n    position: fixed;\r\n    top: 64px;\r\n    right: 14px;\r\n    width: min(92vw, 340px);\r\n    max-height: 68vh;\r\n    overflow-y: auto;\r\n    display: none;\r\n    z-index: 3200;\r\n    border-radius: 18px;\r\n    padding: 12px;\r\n    background: linear-gradient(180deg, rgba(8,12,24,.96), rgba(4,7,18,.98));\r\n    border: 1px solid rgba(255,255,255,.12);\r\n    box-shadow:\r\n      0 0 20px rgba(0,255,255,.18),\r\n      0 0 60px rgba(0,0,0,.45);\r\n    color: #fff;\r\n    font-family: Orbitron, system-ui, sans-serif;\r\n  }\r\n\r\n  #favoritesPanel.show {\r\n    display: block;\r\n  }\r\n\r\n  .favorites-header {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 10px;\r\n    margin-bottom: 10px;\r\n  }\r\n\r\n  .favorites-title {\r\n    font-size: 12px;\r\n    letter-spacing: .14em;\r\n    text-transform: uppercase;\r\n    color: rgba(255,255,255,.85);\r\n  }\r\n\r\n  .favorites-close {\r\n    border: 1px solid rgba(255,255,255,.16);\r\n    background: rgba(255,255,255,.06);\r\n    color: #fff;\r\n    border-radius: 999px;\r\n    padding: 6px 10px;\r\n    cursor: pointer;\r\n    font-size: 11px;\r\n    text-transform: uppercase;\r\n  }\r\n\r\n  .favorites-actions {\r\n    display: flex;\r\n    gap: 8px;\r\n    margin-bottom: 12px;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .favorites-action-btn {\r\n    border: 1px solid rgba(0,255,255,.35);\r\n    background: rgba(0,255,255,.08);\r\n    color: #fff;\r\n    border-radius: 999px;\r\n    padding: 8px 10px;\r\n    cursor: pointer;\r\n    font-size: 11px;\r\n    text-transform: uppercase;\r\n    font-family: inherit;\r\n  }\r\n\r\n  .favorites-empty {\r\n    font-size: 12px;\r\n    color: rgba(255,255,255,.72);\r\n    line-height: 1.6;\r\n  }\r\n\r\n  .favorite-card {\r\n    display: grid;\r\n    grid-template-columns: 58px 1fr;\r\n    gap: 10px;\r\n    align-items: center;\r\n    padding: 10px;\r\n    border-radius: 14px;\r\n    margin-bottom: 10px;\r\n    background: rgba(255,255,255,.04);\r\n    border: 1px solid rgba(255,255,255,.08);\r\n  }\r\n\r\n  .favorite-thumb {\r\n    width: 58px;\r\n    height: 58px;\r\n    border-radius: 50%;\r\n    background-size: cover;\r\n    background-position: center;\r\n    border: 2px solid rgba(255,255,255,.8);\r\n    box-shadow: 0 0 12px cyan;\r\n  }\r\n\r\n  .favorite-info {\r\n    min-width: 0;\r\n  }\r\n\r\n  .favorite-name {\r\n    font-size: 11px;\r\n    line-height: 1.35;\r\n    word-break: break-word;\r\n    color: #fff;\r\n  }\r\n\r\n  .favorite-meta {\r\n    margin-top: 4px;\r\n    font-size: 10px;\r\n    color: rgba(255,255,255,.64);\r\n    text-transform: uppercase;\r\n    letter-spacing: .08em;\r\n  }\r\n\r\n  .favorite-row {\r\n    display: flex;\r\n    gap: 8px;\r\n    margin-top: 8px;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .favorite-btn {\r\n    border: 1px solid rgba(255,255,255,.14);\r\n    background: rgba(255,255,255,.06);\r\n    color: #fff;\r\n    border-radius: 999px;\r\n    padding: 6px 9px;\r\n    cursor: pointer;\r\n    font-size: 10px;\r\n    font-family: inherit;\r\n    text-transform: uppercase;\r\n  }\r\n\r\n  \/* ===== BACK BUTTON GLOW ===== *\/\r\n  #hostWebsiteBtn,\r\n  #reserveBtn,\r\n  #hostBtn,\r\n  #couponBtn {\r\n    transition: box-shadow 0.18s ease, opacity 0.18s ease;\r\n    box-shadow:\r\n      0 0 10px rgba(0,255,255,0.35),\r\n      0 0 18px rgba(0,255,255,0.16);\r\n  }\r\n\r\n  .glow-pulse {\r\n    animation: gggPulseGlow 1.2s infinite ease-in-out;\r\n  }\r\n\r\n  .glow-pulse-strong {\r\n    animation: gggPulseGlowStrong 1s infinite ease-in-out;\r\n  }\r\n\r\n  #hostWebsiteBtn:hover,\r\n  #reserveBtn:hover,\r\n  #hostBtn:hover,\r\n  #couponBtn:hover {\r\n    box-shadow:\r\n      0 0 14px rgba(0,255,255,0.75),\r\n      0 0 26px rgba(0,255,255,0.30);\r\n  }\r\n\r\n  @keyframes gggPulseGlow {\r\n    0% {\r\n      box-shadow:\r\n        0 0 12px rgba(0,255,255,0.45),\r\n        0 0 22px rgba(0,255,255,0.20);\r\n    }\r\n    50% {\r\n      box-shadow:\r\n        0 0 24px rgba(0,255,255,1),\r\n        0 0 44px rgba(0,255,255,0.75),\r\n        0 0 64px rgba(0,255,255,0.45);\r\n    }\r\n    100% {\r\n      box-shadow:\r\n        0 0 12px rgba(0,255,255,0.45),\r\n        0 0 22px rgba(0,255,255,0.20);\r\n    }\r\n  }\r\n\r\n  @keyframes gggPulseGlowStrong {\r\n    0% {\r\n      box-shadow:\r\n        0 0 10px rgba(0,255,255,0.45),\r\n        0 0 18px rgba(0,255,255,0.16);\r\n    }\r\n    50% {\r\n      box-shadow:\r\n        0 0 20px rgba(0,255,255,1),\r\n        0 0 38px rgba(0,255,255,0.42);\r\n    }\r\n    100% {\r\n      box-shadow:\r\n        0 0 10px rgba(0,255,255,0.45),\r\n        0 0 18px rgba(0,255,255,0.16);\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\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<!-- FAVORITES PANEL -->\r\n<div id=\"favoritesPanel\">\r\n  <div class=\"favorites-header\">\r\n    <div class=\"favorites-title\">My Favorites<\/div>\r\n    <button class=\"favorites-close\" type=\"button\" onclick=\"gggCloseFavoritesPanel()\">Close<\/button>\r\n  <\/div>\r\n\r\n  <div class=\"favorites-actions\">\r\n    <button class=\"favorites-action-btn\" type=\"button\" onclick=\"gggShowCurrentPageFavorites()\">Show on Map<\/button>\r\n    <button class=\"favorites-action-btn\" type=\"button\" onclick=\"gggClearFavoritesWithConfirm()\">Clear All<\/button>\r\n  <\/div>\r\n\r\n  <div id=\"favoritesPanelContent\" class=\"favorites-empty\">No favorites saved yet.<\/div>\r\n<\/div>\r\n\r\n<script>\r\n  \/* ========================================================\r\n     PAGE SETTINGS \u2014 CHANGE THESE ONLY WHEN COPYING TO ANOTHER PAGE\r\n  ======================================================== *\/\r\n  const PAGE_KEY = \"cancer\";\r\n  const CUBE_ID = \"cancerCube\";\r\n  const AJAX_URL = \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n  const ACCOUNT_URL = \"https:\/\/godsgalaxygame.com\/account\/\";\r\n  const LOGIN_URL = \"https:\/\/godsgalaxygame.com\/login\/\";\r\n  const PYRAMID_URL = \"https:\/\/godsgalaxygame.com\/GGG\/medayork-pyramid-2\/\";\r\n\r\n  \/* ========================================================\r\n     CUBE ROTATION\r\n  ======================================================== *\/\r\n  let isDragging = false, startX, startY, rotateX = 0, rotateY = 10;\r\n  let autoRotate = true;\r\n  let autoRotateFrame = null;\r\n\r\n  const cube = document.getElementById(CUBE_ID);\r\n  const cubeContainer = document.querySelector('.cube-scene');\r\n\r\n  function updateRotation(x, y) {\r\n    if (!cube) return;\r\n    cube.style.transform = `rotateX(${x}deg) rotateY(${y}deg)`;\r\n  }\r\n\r\n  function startAutoRotate() {\r\n    stopAutoRotate();\r\n    autoRotate = true;\r\n\r\n    function animate() {\r\n      if (!autoRotate) return;\r\n      rotateY -= 0.4;\r\n      updateRotation(rotateX, rotateY);\r\n      autoRotateFrame = requestAnimationFrame(animate);\r\n    }\r\n\r\n    animate();\r\n  }\r\n\r\n  function stopAutoRotate() {\r\n    autoRotate = false;\r\n    if (autoRotateFrame) {\r\n      cancelAnimationFrame(autoRotateFrame);\r\n      autoRotateFrame = null;\r\n    }\r\n  }\r\n\r\n  function onMouseDown(e) {\r\n    stopGuidePulse();\r\n    stopAutoRotate();\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    stopGuidePulse();\r\n    stopAutoRotate();\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  if (cubeContainer && cube) {\r\n    updateRotation(rotateX, rotateY);\r\n    startAutoRotate();\r\n\r\n    cubeContainer.addEventListener('mousedown', onMouseDown);\r\n    window.addEventListener('mousemove', onMouseMove);\r\n    window.addEventListener('mouseup', onMouseUp);\r\n\r\n    cubeContainer.addEventListener('touchstart', onTouchStart, { passive: true });\r\n    window.addEventListener('touchmove', onTouchMove, { passive: true });\r\n    window.addEventListener('touchend', onTouchEnd);\r\n  }\r\n\r\n  \/* ========================================================\r\n     USER STATUS\r\n  ======================================================== *\/\r\n  let gggUserStatus = {\r\n    logged_in: false,\r\n    user_id: 0,\r\n    display_name: \"\",\r\n    email: \"\",\r\n    account_url: ACCOUNT_URL,\r\n    login_url: LOGIN_URL\r\n  };\r\n\r\n  function gggUpdateSignInButton() {\r\n    const btn = document.getElementById(\"signinBtn\");\r\n    if (!btn) return;\r\n\r\n    if (gggUserStatus.logged_in) {\r\n      btn.textContent = \"My Account\";\r\n      btn.onclick = function () {\r\n        window.location.href = gggUserStatus.account_url || ACCOUNT_URL;\r\n      };\r\n    } else {\r\n      btn.textContent = \"Sign In \/ Sign Up\";\r\n      btn.onclick = function () {\r\n        window.location.href = gggUserStatus.login_url || LOGIN_URL;\r\n      };\r\n    }\r\n  }\r\n\r\n  function gggLoadUserStatus() {\r\n    const formData = new FormData();\r\n    formData.append(\"action\", \"ggg_get_current_user_status\");\r\n\r\n    return fetch(AJAX_URL, {\r\n      method: \"POST\",\r\n      credentials: \"same-origin\",\r\n      body: formData\r\n    })\r\n    .then(r => r.json())\r\n    .then(data => {\r\n      if (data && data.success && data.data) {\r\n        gggUserStatus = data.data;\r\n      }\r\n      gggUpdateSignInButton();\r\n    })\r\n    .catch(() => {\r\n      gggUpdateSignInButton();\r\n    });\r\n  }\r\n\r\n  \/* ========================================================\r\n     GUIDE GLOW\r\n  ======================================================== *\/\r\n  let guidePulseInterval = null;\r\n  let guidePulseTimeout = null;\r\n  let tutorialStopped = false;\r\n\r\n  function clearGuideGlow() {\r\n    document.querySelectorAll('.glow-pulse, .glow-pulse-strong').forEach(el => {\r\n      el.classList.remove('glow-pulse', 'glow-pulse-strong');\r\n    });\r\n  }\r\n\r\n  function stopGuidePulse() {\r\n    tutorialStopped = true;\r\n    clearGuideGlow();\r\n    if (guidePulseInterval) clearInterval(guidePulseInterval);\r\n    if (guidePulseTimeout) clearTimeout(guidePulseTimeout);\r\n    guidePulseInterval = null;\r\n    guidePulseTimeout = null;\r\n  }\r\n\r\n  function startGuidePulse() {\r\n    tutorialStopped = false;\r\n\r\n    const buttons = [\r\n      document.getElementById('hostWebsiteBtn'),\r\n      document.getElementById('reserveBtn'),\r\n      document.getElementById('hostBtn'),\r\n      document.getElementById('couponBtn')\r\n    ];\r\n\r\n    buttons.forEach(btn => {\r\n      if (btn) btn.classList.add('glow-pulse');\r\n    });\r\n  }\r\n\r\n  window.addEventListener('load', function () {\r\n    startGuidePulse();\r\n  });\r\n\r\n  \/* ========================================================\r\n     FAVORITES\r\n  ======================================================== *\/\r\n  let favorites = [];\r\n\r\n  function gggUpdateFavoritesButton() {\r\n    const btn = document.getElementById(\"favoritesBtn\");\r\n    if (!btn) return;\r\n    btn.textContent = favorites.length > 0 ? \"\ud83d\udc98\" : \"\ud83d\udc96\";\r\n  }\r\n\r\n  function gggLoadFavorites() {\r\n    const formData = new FormData();\r\n    formData.append(\"action\", \"ggg_get_favorites\");\r\n\r\n    return fetch(AJAX_URL, {\r\n      method: \"POST\",\r\n      credentials: \"same-origin\",\r\n      body: formData\r\n    })\r\n    .then(r => r.json())\r\n    .then(data => {\r\n      if (data && data.success && data.data) {\r\n        favorites = Array.isArray(data.data.favorites) ? data.data.favorites : [];\r\n      } else {\r\n        favorites = [];\r\n      }\r\n      gggUpdateFavoritesButton();\r\n      gggRenderFavoritesPanel();\r\n    })\r\n    .catch(() => {\r\n      favorites = [];\r\n      gggUpdateFavoritesButton();\r\n      gggRenderFavoritesPanel();\r\n    });\r\n  }\r\n\r\n  function gggRenderFavoritesPanel() {\r\n    const panelContent = document.getElementById(\"favoritesPanelContent\");\r\n    if (!panelContent) return;\r\n\r\n    if (!favorites.length) {\r\n      panelContent.innerHTML = `<div class=\"favorites-empty\">No favorites saved yet.<\/div>`;\r\n      return;\r\n    }\r\n\r\n    panelContent.innerHTML = favorites.map(fav => {\r\n      const title = fav.id ? String(fav.id).replace(\/-\/g, ' ') : 'Favorite';\r\n      const pageLabel = fav.pageKey ? String(fav.pageKey).toUpperCase() : 'PAGE';\r\n\r\n      return `\r\n        <div class=\"favorite-card\">\r\n          <div class=\"favorite-thumb\" style=\"background-image:url('${fav.imgUrl || ''}')\"><\/div>\r\n          <div class=\"favorite-info\">\r\n            <div class=\"favorite-name\">${title}<\/div>\r\n            <div class=\"favorite-meta\">${pageLabel}<\/div>\r\n            <div class=\"favorite-row\">\r\n              ${fav.pageKey === PAGE_KEY ? `<button class=\"favorite-btn\" type=\"button\" onclick=\"gggFocusFavoriteOnPage('${fav.id}')\">Show<\/button>` : ``}\r\n              ${(fav.lat && fav.lng) ? `<button class=\"favorite-btn\" type=\"button\" onclick=\"focusOnHost(${parseFloat(fav.lat)}, ${parseFloat(fav.lng)})\">Map<\/button>` : ``}\r\n              <button class=\"favorite-btn\" type=\"button\" onclick=\"gggRemoveFavoriteById('${fav.id}')\">Remove<\/button>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n    }).join('');\r\n  }\r\n\r\n  function gggOpenFavoritesPanel() {\r\n    const panel = document.getElementById(\"favoritesPanel\");\r\n    if (!panel) return;\r\n    panel.classList.add(\"show\");\r\n  }\r\n\r\n  function gggCloseFavoritesPanel() {\r\n    const panel = document.getElementById(\"favoritesPanel\");\r\n    if (!panel) return;\r\n    panel.classList.remove(\"show\");\r\n  }\r\n\r\n  function gggShowCurrentPageFavorites() {\r\n    const currentPageFavorites = favorites.filter(f => f.pageKey === PAGE_KEY);\r\n\r\n    if (!currentPageFavorites.length) return;\r\n\r\n    document.querySelectorAll('.host-circle').forEach(btn => btn.style.display = 'none');\r\n\r\n    currentPageFavorites.forEach(fav => {\r\n      const matches = document.querySelectorAll(`.${fav.id}`);\r\n      matches.forEach(el => el.style.display = 'inline-block');\r\n    });\r\n\r\n    gggCloseFavoritesPanel();\r\n  }\r\n\r\n  function gggFocusFavoriteOnPage(id) {\r\n    document.querySelectorAll('.host-circle').forEach(btn => btn.style.display = 'none');\r\n\r\n    const matches = document.querySelectorAll(`.${id}`);\r\n    matches.forEach(el => el.style.display = 'inline-block');\r\n\r\n    gggCloseFavoritesPanel();\r\n  }\r\n\r\n  function toggleFavorite(id, imgUrl, mapLat, mapLng) {\r\n    if (!gggUserStatus.logged_in) {\r\n      alert(\"Please sign in first to save favorites.\");\r\n      window.location.href = gggUserStatus.login_url || LOGIN_URL;\r\n      return;\r\n    }\r\n\r\n    const alreadySaved = favorites.some(f => f.id === id);\r\n\r\n    if (alreadySaved) {\r\n      return gggRemoveFavoriteById(id);\r\n    }\r\n\r\n    const formData = new FormData();\r\n    formData.append(\"action\", \"ggg_add_favorite\");\r\n    formData.append(\"id\", id);\r\n    formData.append(\"imgUrl\", imgUrl || \"\");\r\n    formData.append(\"mapLat\", mapLat || \"\");\r\n    formData.append(\"mapLng\", mapLng || \"\");\r\n    formData.append(\"pageKey\", PAGE_KEY);\r\n\r\n    fetch(AJAX_URL, {\r\n      method: \"POST\",\r\n      credentials: \"same-origin\",\r\n      body: formData\r\n    })\r\n    .then(r => r.json())\r\n    .then(data => {\r\n      if (data && data.success && data.data) {\r\n        favorites = Array.isArray(data.data.favorites) ? data.data.favorites : [];\r\n        gggUpdateFavoritesButton();\r\n        gggRenderFavoritesPanel();\r\n        console.log(\"Favorito agregado:\", id);\r\n      }\r\n    });\r\n  }\r\n\r\n  function gggRemoveFavoriteById(id) {\r\n    if (!gggUserStatus.logged_in) return;\r\n\r\n    const formData = new FormData();\r\n    formData.append(\"action\", \"ggg_remove_favorite\");\r\n    formData.append(\"id\", id);\r\n\r\n    fetch(AJAX_URL, {\r\n      method: \"POST\",\r\n      credentials: \"same-origin\",\r\n      body: formData\r\n    })\r\n    .then(r => r.json())\r\n    .then(data => {\r\n      if (data && data.success && data.data) {\r\n        favorites = Array.isArray(data.data.favorites) ? data.data.favorites : [];\r\n        gggUpdateFavoritesButton();\r\n        gggRenderFavoritesPanel();\r\n        console.log(\"Favorito removido:\", id);\r\n      }\r\n    });\r\n  }\r\n\r\n  function clearFavorites() {\r\n    if (!gggUserStatus.logged_in) return;\r\n\r\n    const formData = new FormData();\r\n    formData.append(\"action\", \"ggg_clear_favorites\");\r\n\r\n    fetch(AJAX_URL, {\r\n      method: \"POST\",\r\n      credentials: \"same-origin\",\r\n      body: formData\r\n    })\r\n    .then(r => r.json())\r\n    .then(data => {\r\n      if (data && data.success && data.data) {\r\n        favorites = Array.isArray(data.data.favorites) ? data.data.favorites : [];\r\n        gggUpdateFavoritesButton();\r\n        gggRenderFavoritesPanel();\r\n      }\r\n    });\r\n  }\r\n\r\n  function gggClearFavoritesWithConfirm() {\r\n    if (!favorites.length) return;\r\n    const ok = confirm(\"Clear all saved favorites?\");\r\n    if (!ok) return;\r\n    clearFavorites();\r\n  }\r\n\r\n  \/* ========================================================\r\n     MAP FOCUS\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  \/* ========================================================\r\n     BUTTON EVENTS\r\n  ======================================================== *\/\r\n  document.getElementById(\"favoritesBtn\").addEventListener(\"click\", () => {\r\n    gggOpenFavoritesPanel();\r\n  });\r\n\r\n  \/* ========================================================\r\n     INIT\r\n  ======================================================== *\/\r\n  document.addEventListener(\"DOMContentLoaded\", function () {\r\n    Promise.all([\r\n      gggLoadUserStatus(),\r\n      gggLoadFavorites()\r\n    ]).then(() => {\r\n      gggUpdateSignInButton();\r\n      gggUpdateFavoritesButton();\r\n      gggRenderFavoritesPanel();\r\n    });\r\n  });\r\n<\/script>\r\n\r\n\r\n\r\n<!-- HOST CIRCLES \u2014 CSS -->\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;\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 .accommodations{ top:0%;    left:10%; }\r\n  #hostButtons .restaurants   { top:71%;   right:10%; }\r\n  #hostButtons .entertainment { bottom:12%; left:10%; }\r\n  #hostButtons .vip           { bottom:84%; right:10%; }\r\n\r\n  \/* phone: turn into one row under the map (WITH -35px) *\/\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 (ONE copy only) -->\r\n<div id=\"hostButtons\">\r\n  <!-- EXOTIC \u2192 your data stays exactly as provided -->\r\n  <button class=\"host-circle nature-accommodations accommodations\"\r\n    data-lat=\"6.229207382552868\" data-lng=\"-75.2117591207473\"\r\n    style=\"border-color:red; box-shadow:0 0 14px red; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/07\/Screenshot_20231228-201616_PowerPoint.jpg');\"\r\n    title=\"Nature Accommodations\"><\/button>\r\n\r\n  <button class=\"host-circle nature-restaurants restaurants\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"border-color:red; box-shadow:0 0 14px red; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240821_175227_Instagram.jpg');\"\r\n    title=\"Nature Restaurants\"><\/button>\r\n\r\n  <button class=\"host-circle nature-entertainment entertainment\"\r\n    data-lat=\"6.235198708713395\" data-lng=\"-75.1606220569532\"\r\n    style=\"border-color:red; box-shadow:0 0 14px red; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/07\/Screenshot_20240824_083244_Chrome.jpg');\"\r\n    title=\"Nature Entertainment\"><\/button>\r\n\r\n  <button class=\"host-circle nature-vip vip\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"border-color:red; box-shadow:0 0 14px red; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240821_175227_Instagram.jpg');\"\r\n    title=\"Nature VIP\"><\/button>\r\n\r\n  <!-- ROMANTIC -->\r\n  <button class=\"host-circle nite-accommodations accommodations\"\r\n    data-lat=\"6.241568778606768\" data-lng=\"-75.22695655776336\"\r\n    style=\"border-color:beige; box-shadow:0 0 14px beige; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/07\/Screenshot_20250713_165526_Instagram.jpg');\"\r\n    title=\"Nite Accommodations\"><\/button>\r\n\r\n  <button class=\"host-circle nite-restaurants restaurants\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"border-color:beige; box-shadow:0 0 14px beige; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240821_175227_Instagram.jpg');\"\r\n    title=\"Nite Restaurants\"><\/button>\r\n\r\n  <button class=\"host-circle nite-entertainment entertainment\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"border-color:beige; box-shadow:0 0 14px beige; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240821_175227_Instagram.jpg');\"\r\n    title=\"Nite Entertainment\"><\/button>\r\n\r\n  <button class=\"host-circle nite-vip vip\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"border-color:beige; box-shadow:0 0 14px beige; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240821_175227_Instagram.jpg');\"\r\n    title=\"Nite VIP\"><\/button>\r\n\r\n  <!-- VIEWS -->\r\n  <button class=\"host-circle relax-accommodations accommodations\"\r\n    data-lat=\"6.241494121928165\" data-lng=\"-75.22691364242144\"\r\n    style=\"border-color:#00ccff; box-shadow:0 0 14px #00ccff; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/07\/Screenshot_20250713_165340_Instagram.jpg');\"\r\n    title=\"Relax Accommodations\"><\/button>\r\n\r\n  <button class=\"host-circle relax-restaurants restaurants\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"border-color:#00ccff; box-shadow:0 0 14px #00ccff; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240821_175227_Instagram.jpg');\"\r\n    title=\"Relax Restaurants\"><\/button>\r\n\r\n  <button class=\"host-circle relax-entertainment entertainment\"\r\n    data-lat=\"6.226811407957847\" data-lng=\"-75.18043927472152\"\r\n    style=\"border-color:#00ccff; box-shadow:0 0 14px #00ccff; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240824_002752_Instagram.jpg');\"\r\n    title=\"Relax Entertainment\"><\/button>\r\n\r\n  <button class=\"host-circle relax-vip vip\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"border-color:#00ccff; box-shadow:0 0 14px #00ccff; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240821_175227_Instagram.jpg');\"\r\n    title=\"Relax VIP\"><\/button>\r\n\r\n  <!-- WILD -->\r\n  <button class=\"host-circle elegant-accommodations accommodations\"\r\n    data-lat=\"6.229207382552868\" data-lng=\"-75.2117591207473\"\r\n    style=\"border-color:green; box-shadow:0 0 14px green; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/07\/Screenshot_20231228-201616_PowerPoint.jpg');\"\r\n    title=\"Elegant Accommodations\"><\/button>\r\n\r\n  <button class=\"host-circle elegant-restaurants restaurants\"\r\n    data-lat=\"6.2416642680497265\" data-lng=\"-75.1885753054052\"\r\n    style=\"border-color:green; box-shadow:0 0 14px green; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20250622_070009_Chrome.jpg');\"\r\n    title=\"Elegant Restaurants\"><\/button>\r\n\r\n  <button class=\"host-circle elegant-entertainment entertainment\"\r\n    data-lat=\"6.226854070112602\" data-lng=\"-75.18043927472152\"\r\n    style=\"border-color:green; box-shadow:0 0 14px green; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240823_233326_Chrome.jpg');\"\r\n    title=\"Elegant Entertainment\"><\/button>\r\n\r\n  <button class=\"host-circle elegant-vip vip\"\r\n    data-lat=\"6.244462832205367\" data-lng=\"-75.21507856307613\"\r\n    style=\"border-color:green; box-shadow:0 0 14px green; background-image:url('http:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2025\/06\/Screenshot_20240824_022932_PowerPoint.jpg');\"\r\n    title=\"Elegant VIP\"><\/button>\r\n<\/div>\r\n\r\n<!-- HOST CIRCLES \u2014 JS -->\r\n<script>\r\n  \/\/ If there are duplicate #hostButtons by mistake, remove extras.\r\n  document.addEventListener('DOMContentLoaded', () => {\r\n    const boxes = document.querySelectorAll('#hostButtons');\r\n    if (boxes.length > 1) boxes.forEach((b,i)=>{ if(i>0) b.remove(); });\r\n  });\r\n\r\n  \/\/ \ud83d\udd27 Adapter so cube-side names match your circle classes.\r\n  \/\/ romantic\u2192nite, views\u2192relax, wild\u2192elegant, exotic\u2192nature\r\n  (function(){\r\n    const MAP = { romantic:'nite', views:'relax', wild:'elegant', exotic:'nature' };\r\n\r\n    window.showHostButtons = function(suboption){\r\n      \/\/ translate e.g. \"romantic-accommodations\" \u2192 \"nite-accommodations\"\r\n      const m = suboption.match(\/^(romantic|views|wild|exotic)-(accommodations|restaurants|entertainment|vip)$\/);\r\n      if (m) suboption = MAP[m[1]] + '-' + m[2];\r\n\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      \/\/ show only requested group\r\n      const group = wrap.querySelectorAll('.' + suboption);\r\n      group.forEach(el => el.style.display = 'inline-block');\r\n\r\n      \/\/ reveal only if we found something\r\n      wrap.style.display = group.length ? 'flex' : 'none';\r\n      wrap.style.pointerEvents = group.length ? 'auto' : 'none';\r\n    };\r\n  })();\r\n\r\n  \/\/ Double-tap to favorite (unchanged)\r\n  document.addEventListener('DOMContentLoaded', () => {\r\n    document.querySelectorAll('#hostButtons .host-circle').forEach(btn => {\r\n      btn.addEventListener('dblclick', () => {\r\n        const id  = btn.classList[1];\r\n        const img = (btn.style.backgroundImage || '').slice(5, -2);\r\n        const lat = parseFloat(btn.dataset.lat);\r\n        const lng = parseFloat(btn.dataset.lng);\r\n        if (typeof toggleFavorite === 'function') toggleFavorite(id, img, lat, lng);\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    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<script>\r\n  \/\/ Mapeo de ID \u00fanico \u2192 Enlace real actualizado por categor\u00eda y elemento\r\n  const hostLinks = {\r\n    \/\/ ROMANTIC - Aire\r\n    \"nite-accommodations\": \"https:\/\/www.instagram.com\/reel\/C3_YCV7t0_Q\/?igsh=MWk2djNsYjhhYTlwag%3D%3D\",\r\n    \"nite-restaurants\": \"https:\/\/www.instagram.com\/blisscluboficial\/\",\r\n    \"nite-vip\": \"https:\/\/www.instagram.com\/blisscluboficial\/\",\r\n    \"nite-entertainment\": \"https:\/\/www.instagram.com\/blisscluboficial\/\",\r\n\r\n    \/\/ VIEWS - Agua\r\n    \"relax-accommodations\": \"https:\/\/www.instagram.com\/reel\/C5cTFfJR7v1\/?igsh=cG9vN2tuOGJ5b2ds\",\r\n    \"relax-restaurants\": \"https:\/\/www.instagram.com\/blisscluboficial\/\",\r\n    \"relax-vip\": \"https:\/\/www.instagram.com\/blisscluboficial\/\",\r\n    \"relax-entertainment\": \"https:\/\/www.instagram.com\/yatemajestic\/\",\r\n\r\n    \/\/ WILD - Tierra\r\n    \"elegant-accommodations\": \"https:\/\/atmavillas.com\/alojamientos-de-lujo\/\",\r\n    \"elegant-restaurants\": \"https:\/\/luxecolombia.com\/wp-content\/uploads\/2022\/08\/ALIMENTOS-PRAIA.pdf\",\r\n    \"elegant-vip\": \"https:\/\/www.instagram.com\/blisscluboficial\/\",\r\n    \"elegant-entertainment\": \"https:\/\/www.instagram.com\/yatemajestic\/\",\r\n\r\n    \/\/ EXOTIC - Fuego\r\n    \"nature-accommodations\": \"https:\/\/atmavillas.com\/en\/inicio-english\/\",\r\n    \"nature-restaurants\": \"https:\/\/www.instagram.com\/blisscluboficial\/\",\r\n    \"nature-vip\": \"https:\/\/www.instagram.com\/blisscluboficial\/\",\r\n    \"nature-entertainment\": \"https:\/\/guatapemagictour.com\/tienda\/caballos-guatape\/\"\r\n  };\r\n\r\n  \/\/ Conectar favorito con bot\u00f3n trasero\r\n  function activateHostLink(hostId) {\r\n    const btn = document.getElementById('hostWebsiteBtn');\r\n    const url = hostLinks[hostId];\r\n    if (btn && url) {\r\n      btn.href = url;\r\n      btn.style.boxShadow = '0 0 20px cyan';\r\n      setTimeout(() => btn.style.boxShadow = '0 0 10px cyan', 500);\r\n    }\r\n  }\r\n\r\n  \/\/ Al hacer clic en cualquier c\u00edrculo\r\n  document.addEventListener('click', function (e) {\r\n    if (e.target.classList.contains('host-circle')) {\r\n      const idMatch = [...e.target.classList].find(c => hostLinks[c]);\r\n      if (idMatch) activateHostLink(idMatch);\r\n    }\r\n  });\r\n\r\n  \/\/ Tooltip en desktop\r\n  document.addEventListener('mouseover', function (e) {\r\n    if (e.target.classList.contains('host-circle')) {\r\n      e.target.setAttribute('title', 'Click to activate link');\r\n    }\r\n  });\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS CONCIERGE COMMAND CENTER \u2014 HIDDEN PAGE V1\r\nOpen with: ?journeyops=1\r\nAdmin only, requires the PHP snippet above.\r\n========================================================= -->\r\n\r\n<style>\r\n#blissJourneyOpsOverlay,\r\n#blissJourneyOpsOverlay *{\r\n  box-sizing:border-box;\r\n}\r\n\r\n#blissJourneyOpsOverlay{\r\n  position:fixed;\r\n  inset:0;\r\n  width:100vw;\r\n  height:100vh;\r\n  display:none;\r\n  z-index:2147483000;\r\n  overflow:auto;\r\n  padding:18px;\r\n  background:\r\n    radial-gradient(circle at 12% 10%,rgba(56,232,255,.12),transparent 28%),\r\n    radial-gradient(circle at 85% 14%,rgba(139,92,246,.18),transparent 30%),\r\n    radial-gradient(circle at 50% 90%,rgba(52,211,153,.08),transparent 30%),\r\n    linear-gradient(180deg,#02030b,#050817 45%,#02030b);\r\n  color:#f5f7ff;\r\n  font-family:Arial,Helvetica,sans-serif;\r\n}\r\n\r\nbody.bliss-journey-ops-active{\r\n  overflow:hidden !important;\r\n}\r\n\r\nbody.bliss-journey-ops-active > *{\r\n  visibility:hidden !important;\r\n}\r\n\r\nbody.bliss-journey-ops-active #blissJourneyOpsOverlay,\r\nbody.bliss-journey-ops-active #blissJourneyOpsOverlay *{\r\n  visibility:visible !important;\r\n}\r\n\r\n.bjo-shell{\r\n  width:min(100%,1380px);\r\n  margin:0 auto;\r\n}\r\n\r\n.bjo-top{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:flex-start;\r\n  gap:14px;\r\n  flex-wrap:wrap;\r\n  margin-bottom:16px;\r\n  padding:22px;\r\n  border:1px solid rgba(255,255,255,.09);\r\n  border-radius:30px;\r\n  background:\r\n    radial-gradient(circle at top right,rgba(56,232,255,.11),transparent 36%),\r\n    rgba(6,10,26,.88);\r\n  box-shadow:0 20px 70px rgba(0,0,0,.34);\r\n}\r\n\r\n.bjo-kicker{\r\n  color:#38e8ff;\r\n  font-size:11px;\r\n  font-weight:900;\r\n  letter-spacing:.18em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-title{\r\n  margin:7px 0 8px;\r\n  font-size:clamp(32px,5vw,68px);\r\n  line-height:.95;\r\n  font-weight:900;\r\n  letter-spacing:-.045em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-sub{\r\n  max-width:820px;\r\n  margin:0;\r\n  color:rgba(245,247,255,.68);\r\n  line-height:1.65;\r\n  font-size:14px;\r\n}\r\n\r\n.bjo-close{\r\n  min-height:46px;\r\n  padding:0 18px;\r\n  border:none;\r\n  border-radius:999px;\r\n  cursor:pointer;\r\n  color:#031018;\r\n  background:linear-gradient(90deg,#38e8ff,#8b5cf6,#ff3db8);\r\n  font-size:12px;\r\n  font-weight:900;\r\n  letter-spacing:.13em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-status{\r\n  margin-bottom:14px;\r\n  padding:13px 15px;\r\n  border:1px solid rgba(56,232,255,.18);\r\n  border-radius:16px;\r\n  background:rgba(56,232,255,.055);\r\n  color:#dffcff;\r\n  font-size:13px;\r\n  line-height:1.5;\r\n}\r\n\r\n.bjo-status.error{\r\n  border-color:rgba(255,107,138,.30);\r\n  background:rgba(255,107,138,.08);\r\n  color:#ffd7df;\r\n}\r\n\r\n.bjo-metrics{\r\n  display:grid;\r\n  grid-template-columns:repeat(6,minmax(0,1fr));\r\n  gap:10px;\r\n  margin-bottom:14px;\r\n}\r\n\r\n.bjo-metric{\r\n  min-height:96px;\r\n  padding:16px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:22px;\r\n  background:linear-gradient(180deg,rgba(11,18,40,.92),rgba(5,8,19,.96));\r\n}\r\n\r\n.bjo-metric span{\r\n  display:block;\r\n  color:rgba(245,247,255,.52);\r\n  font-size:10px;\r\n  font-weight:900;\r\n  letter-spacing:.13em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-metric strong{\r\n  display:block;\r\n  margin-top:9px;\r\n  font-size:clamp(26px,4vw,44px);\r\n  line-height:1;\r\n}\r\n\r\n.bjo-grid{\r\n  display:grid;\r\n  grid-template-columns:360px minmax(0,1fr);\r\n  gap:14px;\r\n}\r\n\r\n.bjo-panel{\r\n  min-width:0;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:26px;\r\n  background:rgba(7,11,27,.88);\r\n  box-shadow:0 18px 55px rgba(0,0,0,.24);\r\n}\r\n\r\n.bjo-panelHead{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:10px;\r\n  padding:16px;\r\n  border-bottom:1px solid rgba(255,255,255,.07);\r\n}\r\n\r\n.bjo-panelTitle{\r\n  margin:0;\r\n  color:#fff;\r\n  font-size:13px;\r\n  font-weight:900;\r\n  letter-spacing:.16em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-panelBody{\r\n  padding:16px;\r\n}\r\n\r\n.bjo-search{\r\n  width:100%;\r\n  min-height:44px;\r\n  margin-bottom:12px;\r\n  padding:0 13px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  border-radius:15px;\r\n  outline:none;\r\n  background:rgba(255,255,255,.055);\r\n  color:#fff;\r\n}\r\n\r\n.bjo-queue{\r\n  display:grid;\r\n  gap:9px;\r\n  max-height:640px;\r\n  overflow:auto;\r\n  padding-right:3px;\r\n}\r\n\r\n.bjo-traveler{\r\n  width:100%;\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) auto;\r\n  gap:8px;\r\n  padding:13px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:18px;\r\n  background:rgba(255,255,255,.035);\r\n  color:#fff;\r\n  text-align:left;\r\n  cursor:pointer;\r\n}\r\n\r\n.bjo-traveler:hover,\r\n.bjo-traveler.active{\r\n  border-color:rgba(56,232,255,.32);\r\n  background:rgba(56,232,255,.075);\r\n}\r\n\r\n.bjo-traveler strong{\r\n  display:block;\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n  white-space:nowrap;\r\n  font-size:14px;\r\n}\r\n\r\n.bjo-traveler span{\r\n  display:block;\r\n  margin-top:4px;\r\n  color:rgba(245,247,255,.55);\r\n  font-size:12px;\r\n}\r\n\r\n.bjo-pill{\r\n  align-self:start;\r\n  padding:6px 9px;\r\n  border:1px solid rgba(56,232,255,.22);\r\n  border-radius:999px;\r\n  color:#dffcff;\r\n  background:rgba(56,232,255,.07);\r\n  font-size:10px;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-pill.requested{\r\n  border-color:rgba(247,201,72,.26);\r\n  background:rgba(247,201,72,.09);\r\n  color:#fff1b8;\r\n}\r\n\r\n.bjo-pill.confirmed{\r\n  border-color:rgba(52,211,153,.26);\r\n  background:rgba(52,211,153,.09);\r\n  color:#dffdf3;\r\n}\r\n\r\n.bjo-profile{\r\n  display:grid;\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n  gap:10px;\r\n  margin-bottom:14px;\r\n}\r\n\r\n.bjo-info{\r\n  padding:13px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:16px;\r\n  background:rgba(255,255,255,.035);\r\n}\r\n\r\n.bjo-info span{\r\n  display:block;\r\n  color:rgba(245,247,255,.48);\r\n  font-size:10px;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-info strong{\r\n  display:block;\r\n  margin-top:7px;\r\n  overflow:hidden;\r\n  color:#fff;\r\n  text-overflow:ellipsis;\r\n  white-space:nowrap;\r\n}\r\n\r\n.bjo-tabs{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:8px;\r\n  margin-bottom:14px;\r\n}\r\n\r\n.bjo-tab{\r\n  min-height:38px;\r\n  padding:0 13px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.045);\r\n  color:rgba(245,247,255,.70);\r\n  font-size:11px;\r\n  font-weight:900;\r\n  letter-spacing:.08em;\r\n  text-transform:uppercase;\r\n  cursor:pointer;\r\n}\r\n\r\n.bjo-tab.active{\r\n  border-color:rgba(56,232,255,.32);\r\n  background:rgba(56,232,255,.10);\r\n  color:#fff;\r\n}\r\n\r\n.bjo-work{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.15fr) minmax(320px,.85fr);\r\n  gap:14px;\r\n}\r\n\r\n.bjo-items{\r\n  display:grid;\r\n  gap:10px;\r\n  max-height:690px;\r\n  overflow:auto;\r\n  padding-right:3px;\r\n}\r\n\r\n.bjo-item{\r\n  display:grid;\r\n  grid-template-columns:104px minmax(0,1fr);\r\n  overflow:hidden;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:19px;\r\n  background:rgba(255,255,255,.035);\r\n  cursor:pointer;\r\n}\r\n\r\n.bjo-item.active{\r\n  border-color:rgba(56,232,255,.35);\r\n  box-shadow:0 0 0 1px rgba(56,232,255,.15);\r\n}\r\n\r\n.bjo-img{\r\n  min-height:126px;\r\n  background-size:cover;\r\n  background-position:center;\r\n  background-color:#0a1020;\r\n}\r\n\r\n.bjo-itemBody{\r\n  min-width:0;\r\n  padding:13px;\r\n}\r\n\r\n.bjo-itemTop{\r\n  display:flex;\r\n  align-items:flex-start;\r\n  justify-content:space-between;\r\n  gap:8px;\r\n  margin-bottom:6px;\r\n}\r\n\r\n.bjo-itemType{\r\n  color:#38e8ff;\r\n  font-size:10px;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-item h4{\r\n  margin:0 0 6px;\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n  white-space:nowrap;\r\n  font-size:16px;\r\n}\r\n\r\n.bjo-item p{\r\n  display:-webkit-box;\r\n  -webkit-line-clamp:2;\r\n  -webkit-box-orient:vertical;\r\n  overflow:hidden;\r\n  margin:0;\r\n  color:rgba(245,247,255,.56);\r\n  line-height:1.45;\r\n  font-size:12px;\r\n}\r\n\r\n.bjo-editor{\r\n  display:grid;\r\n  gap:10px;\r\n}\r\n\r\n.bjo-empty{\r\n  min-height:360px;\r\n  display:grid;\r\n  place-items:center;\r\n  padding:28px;\r\n  border:1px dashed rgba(56,232,255,.18);\r\n  border-radius:22px;\r\n  text-align:center;\r\n  color:rgba(245,247,255,.62);\r\n}\r\n\r\n.bjo-field{\r\n  display:grid;\r\n  gap:6px;\r\n}\r\n\r\n.bjo-label{\r\n  color:rgba(245,247,255,.62);\r\n  font-size:10px;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-input,\r\n.bjo-select,\r\n.bjo-textarea{\r\n  width:100%;\r\n  min-height:44px;\r\n  padding:10px 12px;\r\n  border:1px solid rgba(255,255,255,.10);\r\n  border-radius:14px;\r\n  outline:none;\r\n  background:rgba(255,255,255,.055);\r\n  color:#fff;\r\n  font-size:13px;\r\n}\r\n\r\n.bjo-textarea{\r\n  min-height:92px;\r\n  resize:vertical;\r\n}\r\n\r\n.bjo-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:8px;\r\n  margin-top:4px;\r\n}\r\n\r\n.bjo-btn{\r\n  min-height:44px;\r\n  padding:0 14px;\r\n  border:none;\r\n  border-radius:999px;\r\n  cursor:pointer;\r\n  color:#fff;\r\n  background:rgba(255,255,255,.07);\r\n  border:1px solid rgba(255,255,255,.10);\r\n  font-size:11px;\r\n  font-weight:900;\r\n  letter-spacing:.1em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.bjo-btnPrimary{\r\n  color:#031018;\r\n  background:linear-gradient(90deg,#38e8ff,#8b5cf6);\r\n  border:none;\r\n}\r\n\r\n.bjo-btnGold{\r\n  color:#1c1201;\r\n  background:linear-gradient(90deg,#f7c948,#ffb86b);\r\n  border:none;\r\n}\r\n\r\n.bjo-btnDanger{\r\n  color:#fff;\r\n  border-color:rgba(251,113,133,.28);\r\n  background:rgba(251,113,133,.12);\r\n}\r\n\r\n.bjo-messages{\r\n  display:grid;\r\n  gap:8px;\r\n  max-height:260px;\r\n  overflow:auto;\r\n}\r\n\r\n.bjo-message{\r\n  padding:11px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:14px;\r\n  background:rgba(255,255,255,.035);\r\n}\r\n\r\n.bjo-message strong{\r\n  display:block;\r\n  margin-bottom:4px;\r\n  color:#fff;\r\n  font-size:12px;\r\n}\r\n\r\n.bjo-message p{\r\n  margin:0;\r\n  color:rgba(245,247,255,.65);\r\n  line-height:1.45;\r\n  font-size:12px;\r\n}\r\n\r\n@media(max-width:1100px){\r\n  .bjo-metrics{\r\n    grid-template-columns:repeat(3,minmax(0,1fr));\r\n  }\r\n\r\n  .bjo-grid,\r\n  .bjo-work{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .bjo-queue,\r\n  .bjo-items{\r\n    max-height:none;\r\n  }\r\n}\r\n\r\n@media(max-width:680px){\r\n  #blissJourneyOpsOverlay{\r\n    padding:10px;\r\n  }\r\n\r\n  .bjo-metrics,\r\n  .bjo-profile{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n\r\n  .bjo-item{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .bjo-img{\r\n    min-height:180px;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div id=\"blissJourneyOpsOverlay\" aria-hidden=\"true\">\r\n  <div class=\"bjo-shell\">\r\n\r\n    <header class=\"bjo-top\">\r\n      <div>\r\n        <div class=\"bjo-kicker\">BLISS OPERATIONS<\/div>\r\n        <h1 class=\"bjo-title\">Concierge Command Center<\/h1>\r\n        <p class=\"bjo-sub\">\r\n          Operations dashboard for traveler requests, reservation status,\r\n          Journey items, concierge notes, and confirmations.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <button class=\"bjo-close\" type=\"button\" onclick=\"BlissJourneyOps.close()\">\r\n        Close\r\n      <\/button>\r\n    <\/header>\r\n\r\n    <div id=\"bjoStatus\" class=\"bjo-status\">\r\n      Waiting to load Journey Operations.\r\n    <\/div>\r\n\r\n    <section class=\"bjo-metrics\">\r\n      <article class=\"bjo-metric\">\r\n        <span>Travelers<\/span>\r\n        <strong id=\"bjoMetricTravelers\">0<\/strong>\r\n      <\/article>\r\n      <article class=\"bjo-metric\">\r\n        <span>Total Ops<\/span>\r\n        <strong id=\"bjoMetricTotal\">0<\/strong>\r\n      <\/article>\r\n      <article class=\"bjo-metric\">\r\n        <span>Requested<\/span>\r\n        <strong id=\"bjoMetricRequested\">0<\/strong>\r\n      <\/article>\r\n      <article class=\"bjo-metric\">\r\n        <span>Working<\/span>\r\n        <strong id=\"bjoMetricWorking\">0<\/strong>\r\n      <\/article>\r\n      <article class=\"bjo-metric\">\r\n        <span>Need Info<\/span>\r\n        <strong id=\"bjoMetricNeedInfo\">0<\/strong>\r\n      <\/article>\r\n      <article class=\"bjo-metric\">\r\n        <span>Confirmed<\/span>\r\n        <strong id=\"bjoMetricConfirmed\">0<\/strong>\r\n      <\/article>\r\n    <\/section>\r\n\r\n    <div class=\"bjo-grid\">\r\n\r\n      <aside class=\"bjo-panel\">\r\n        <div class=\"bjo-panelHead\">\r\n          <h2 class=\"bjo-panelTitle\">Operations Queue<\/h2>\r\n          <button class=\"bjo-btn\" type=\"button\" onclick=\"BlissJourneyOps.refresh()\">\r\n            Refresh\r\n          <\/button>\r\n        <\/div>\r\n\r\n        <div class=\"bjo-panelBody\">\r\n          <input\r\n            id=\"bjoSearch\"\r\n            class=\"bjo-search\"\r\n            type=\"text\"\r\n            placeholder=\"Search traveler, email, status...\"\r\n            oninput=\"BlissJourneyOps.renderQueue()\">\r\n\r\n          <div id=\"bjoQueue\" class=\"bjo-queue\"><\/div>\r\n        <\/div>\r\n      <\/aside>\r\n\r\n      <main class=\"bjo-panel\">\r\n        <div class=\"bjo-panelHead\">\r\n          <h2 class=\"bjo-panelTitle\">Traveler Operations<\/h2>\r\n          <div id=\"bjoActiveTraveler\" class=\"bjo-pill\">No Traveler<\/div>\r\n        <\/div>\r\n\r\n        <div class=\"bjo-panelBody\">\r\n\r\n          <section class=\"bjo-profile\">\r\n            <div class=\"bjo-info\">\r\n              <span>Name<\/span>\r\n              <strong id=\"bjoInfoName\">\u2014<\/strong>\r\n            <\/div>\r\n            <div class=\"bjo-info\">\r\n              <span>Email<\/span>\r\n              <strong id=\"bjoInfoEmail\">\u2014<\/strong>\r\n            <\/div>\r\n            <div class=\"bjo-info\">\r\n              <span>Levels<\/span>\r\n              <strong id=\"bjoInfoLevels\">\u2014<\/strong>\r\n            <\/div>\r\n            <div class=\"bjo-info\">\r\n              <span>Travel Profile<\/span>\r\n              <strong id=\"bjoInfoProfile\">\u2014<\/strong>\r\n            <\/div>\r\n          <\/section>\r\n\r\n          <div class=\"bjo-tabs\">\r\n            <button class=\"bjo-tab active\" data-bjo-filter=\"all\" type=\"button\">All<\/button>\r\n            <button class=\"bjo-tab\" data-bjo-filter=\"Requested\" type=\"button\">Requested<\/button>\r\n            <button class=\"bjo-tab\" data-bjo-filter=\"Bliss Working\" type=\"button\">Working<\/button>\r\n            <button class=\"bjo-tab\" data-bjo-filter=\"Need Information\" type=\"button\">Need Info<\/button>\r\n            <button class=\"bjo-tab\" data-bjo-filter=\"Confirmed\" type=\"button\">Confirmed<\/button>\r\n            <button class=\"bjo-tab\" data-bjo-filter=\"Completed\" type=\"button\">Completed<\/button>\r\n          <\/div>\r\n\r\n          <section class=\"bjo-work\">\r\n            <div>\r\n              <div id=\"bjoItems\" class=\"bjo-items\">\r\n                <div class=\"bjo-empty\">Select a traveler from the queue.<\/div>\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <aside id=\"bjoEditor\" class=\"bjo-editor\">\r\n              <div class=\"bjo-empty\">\r\n                Select an operation to update status, confirmation details,\r\n                admin notes, or send a concierge message.\r\n              <\/div>\r\n            <\/aside>\r\n          <\/section>\r\n\r\n        <\/div>\r\n      <\/main>\r\n\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 DEFAULT_IMAGE =\r\n    \"https:\/\/godsgalaxygame.com\/GGG\/wp-content\/uploads\/2026\/04\/ChatGPT-Image-Apr-21-2026-02_13_54-PM.png\";\r\n\r\n  const WHATSAPP_NUMBER =\r\n    \"573147629693\";\r\n\r\n  const STATUS_OPTIONS = [\r\n    \"Saved\",\r\n    \"Requested\",\r\n    \"Bliss Working\",\r\n    \"Need Information\",\r\n    \"Confirmed\",\r\n    \"Completed\",\r\n    \"Cancelled\"\r\n  ];\r\n\r\n  const state = {\r\n    overview:null,\r\n    travelers:[],\r\n    currentUserId:\"\",\r\n    currentUser:null,\r\n    currentItems:[],\r\n    currentMessages:[],\r\n    currentItemId:\"\",\r\n    filter:\"all\"\r\n  };\r\n\r\n  function config(){\r\n    return window.BlissJourneyOpsConfig || {};\r\n  }\r\n\r\n  function ajaxUrl(){\r\n    return config().ajaxUrl || \"\/GGG\/wp-admin\/admin-ajax.php\";\r\n  }\r\n\r\n  function nonce(){\r\n    return config().nonce || \"\";\r\n  }\r\n\r\n  function el(id){\r\n    return document.getElementById(id);\r\n  }\r\n\r\n  function esc(value){\r\n    return String(value == null ? \"\" : value)\r\n      .replace(\/[&<>\"']\/g,function(character){\r\n        return {\r\n          \"&\":\"&amp;\",\r\n          \"<\":\"&lt;\",\r\n          \">\":\"&gt;\",\r\n          '\"':\"&quot;\",\r\n          \"'\":\"&#039;\"\r\n        }[character];\r\n      });\r\n  }\r\n\r\n  function text(value,fallback){\r\n    const finalValue =\r\n      value == null || value === \"\"\r\n        ? fallback || \"\"\r\n        : value;\r\n\r\n    return String(finalValue);\r\n  }\r\n\r\n  function statusClass(status){\r\n    const clean = String(status || \"\").toLowerCase();\r\n\r\n    if(clean.indexOf(\"confirm\") !== -1){\r\n      return \"confirmed\";\r\n    }\r\n\r\n    if(\r\n      clean.indexOf(\"request\") !== -1 ||\r\n      clean.indexOf(\"working\") !== -1 ||\r\n      clean.indexOf(\"need\") !== -1\r\n    ){\r\n      return \"requested\";\r\n    }\r\n\r\n    return \"\";\r\n  }\r\n\r\n  function setStatus(message,isError){\r\n    const box = el(\"bjoStatus\");\r\n\r\n    if(!box){\r\n      return;\r\n    }\r\n\r\n    box.textContent = message;\r\n    box.classList.toggle(\"error\",Boolean(isError));\r\n  }\r\n\r\n  function post(action,payload){\r\n    const formData = new FormData();\r\n\r\n    formData.append(\"action\",action);\r\n    formData.append(\"nonce\",nonce());\r\n\r\n    Object.keys(payload || {}).forEach(function(key){\r\n      formData.append(key,payload[key]);\r\n    });\r\n\r\n    return fetch(ajaxUrl(),{\r\n      method:\"POST\",\r\n      credentials:\"same-origin\",\r\n      body:formData\r\n    }).then(function(response){\r\n      return response.json();\r\n    }).then(function(data){\r\n      if(!data || !data.success){\r\n        const message =\r\n          data &&\r\n          data.data &&\r\n          data.data.message\r\n            ? data.data.message\r\n            : \"Command Center request failed.\";\r\n\r\n        throw new Error(message);\r\n      }\r\n\r\n      return data.data;\r\n    });\r\n  }\r\n\r\n  function open(){\r\n    const overlay = el(\"blissJourneyOpsOverlay\");\r\n\r\n    if(!overlay){\r\n      return;\r\n    }\r\n\r\n    overlay.style.display = \"block\";\r\n    overlay.setAttribute(\"aria-hidden\",\"false\");\r\n    document.body.classList.add(\"bliss-journey-ops-active\");\r\n\r\n    refresh();\r\n  }\r\n\r\n  function close(){\r\n    const overlay = el(\"blissJourneyOpsOverlay\");\r\n\r\n    if(!overlay){\r\n      return;\r\n    }\r\n\r\n    overlay.style.display = \"none\";\r\n    overlay.setAttribute(\"aria-hidden\",\"true\");\r\n    document.body.classList.remove(\"bliss-journey-ops-active\");\r\n  }\r\n\r\n  function metric(id,value){\r\n    const node = el(id);\r\n\r\n    if(node){\r\n      node.textContent = value;\r\n    }\r\n  }\r\n\r\n  function refresh(){\r\n    if(config().isAdmin === false){\r\n      setStatus(\"Admin access is required for Journey Operations.\",true);\r\n      return;\r\n    }\r\n\r\n    setStatus(\"Loading Journey Operations\u2026\",false);\r\n\r\n    post(\"bliss_journey_ops_overview\",{})\r\n      .then(function(data){\r\n        state.overview = data;\r\n        state.travelers = data.operations || [];\r\n\r\n        renderMetrics(data.totals || {});\r\n        renderQueue();\r\n\r\n        setStatus(\"Journey Operations loaded.\",false);\r\n      })\r\n      .catch(function(error){\r\n        setStatus(error.message || \"Could not load operations.\",true);\r\n      });\r\n  }\r\n\r\n  function renderMetrics(totals){\r\n    metric(\"bjoMetricTravelers\",totals.travelers || 0);\r\n    metric(\"bjoMetricTotal\",totals.total || 0);\r\n    metric(\"bjoMetricRequested\",totals.requested || 0);\r\n    metric(\"bjoMetricWorking\",totals.working || 0);\r\n    metric(\"bjoMetricNeedInfo\",totals.needInfo || 0);\r\n    metric(\"bjoMetricConfirmed\",totals.confirmed || 0);\r\n  }\r\n\r\n  function travelerSearchMatch(operation,query){\r\n    if(!query){\r\n      return true;\r\n    }\r\n\r\n    const user = operation.user || {};\r\n    const counts = operation.counts || {};\r\n    const haystack = [\r\n      user.display_name,\r\n      user.email,\r\n      user.login,\r\n      (operation.latest || {}).title,\r\n      (operation.latest || {}).status,\r\n      JSON.stringify(counts)\r\n    ].join(\" \").toLowerCase();\r\n\r\n    return haystack.indexOf(query.toLowerCase()) !== -1;\r\n  }\r\n\r\n  function renderQueue(){\r\n    const box = el(\"bjoQueue\");\r\n\r\n    if(!box){\r\n      return;\r\n    }\r\n\r\n    const query =\r\n      el(\"bjoSearch\")\r\n        ? el(\"bjoSearch\").value.trim()\r\n        : \"\";\r\n\r\n    const rows = state.travelers\r\n      .filter(function(operation){\r\n        return travelerSearchMatch(operation,query);\r\n      })\r\n      .sort(function(a,b){\r\n        return (\r\n          Number(b.activeOperations || 0) -\r\n          Number(a.activeOperations || 0)\r\n        );\r\n      });\r\n\r\n    if(!rows.length){\r\n      box.innerHTML =\r\n        '<div class=\"bjo-empty\">No Level 2+ traveler operations found yet.<\/div>';\r\n      return;\r\n    }\r\n\r\n    box.innerHTML = rows.map(function(operation){\r\n      const user = operation.user || {};\r\n      const counts = operation.counts || {};\r\n      const active = String(user.id) === String(state.currentUserId);\r\n      const activeOps = Number(operation.activeOperations || 0);\r\n      const status =\r\n        activeOps\r\n          ? activeOps + \" Active\"\r\n          : counts.total\r\n            ? counts.total + \" Saved\"\r\n            : \"Level 2\";\r\n\r\n      return `\r\n        <button\r\n          class=\"bjo-traveler ${active ? \"active\" : \"\"}\"\r\n          data-bjo-user=\"${esc(user.id)}\"\r\n          type=\"button\">\r\n          <span>\r\n            <strong>${esc(user.display_name || user.login || \"Traveler\")}<\/strong>\r\n            <span>${esc(user.email || \"\")}<\/span>\r\n          <\/span>\r\n\r\n          <em class=\"bjo-pill ${activeOps ? \"requested\" : \"\"}\">\r\n            ${esc(status)}\r\n          <\/em>\r\n        <\/button>\r\n      `;\r\n    }).join(\"\");\r\n  }\r\n\r\n  function loadUser(userId){\r\n    if(!userId){\r\n      return;\r\n    }\r\n\r\n    state.currentUserId = String(userId);\r\n    state.currentItemId = \"\";\r\n\r\n    setStatus(\"Loading traveler Journey\u2026\",false);\r\n\r\n    post(\"bliss_journey_ops_get_user\",{\r\n      user_id:userId\r\n    }).then(function(data){\r\n      state.currentUser = data.summary || {};\r\n      state.currentItems = data.items || [];\r\n      state.currentMessages = data.messages || [];\r\n\r\n      renderQueue();\r\n      renderTraveler();\r\n      renderItems();\r\n      renderEditor();\r\n\r\n      setStatus(\"Traveler Journey loaded.\",false);\r\n    }).catch(function(error){\r\n      setStatus(error.message || \"Could not load traveler.\",true);\r\n    });\r\n  }\r\n\r\n  function profileSummary(profile){\r\n    if(!profile || typeof profile !== \"object\"){\r\n      return \"Not completed\";\r\n    }\r\n\r\n    const values = [\r\n      profile.travelStyle,\r\n      profile.travelingWith,\r\n      profile.budget,\r\n      profile.tripLength,\r\n      profile.transportation\r\n    ].filter(Boolean);\r\n\r\n    return values.length\r\n      ? values.slice(0,3).join(\" \u00b7 \")\r\n      : \"Not completed\";\r\n  }\r\n\r\n  function renderTraveler(){\r\n    const summary = state.currentUser || {};\r\n    const user = summary.user || {};\r\n\r\n    const active = el(\"bjoActiveTraveler\");\r\n    if(active){\r\n      active.textContent =\r\n        user.display_name || \"Traveler Loaded\";\r\n    }\r\n\r\n    if(el(\"bjoInfoName\")){\r\n      el(\"bjoInfoName\").textContent =\r\n        user.display_name || user.login || \"\u2014\";\r\n    }\r\n\r\n    if(el(\"bjoInfoEmail\")){\r\n      el(\"bjoInfoEmail\").textContent =\r\n        user.email || \"\u2014\";\r\n    }\r\n\r\n    if(el(\"bjoInfoLevels\")){\r\n      el(\"bjoInfoLevels\").textContent =\r\n        Array.isArray(user.owned_levels)\r\n          ? user.owned_levels.join(\", \")\r\n          : \"\u2014\";\r\n    }\r\n\r\n    if(el(\"bjoInfoProfile\")){\r\n      el(\"bjoInfoProfile\").textContent =\r\n        profileSummary(summary.profile || {});\r\n    }\r\n  }\r\n\r\n  function itemId(item){\r\n    return String(\r\n      item.journeyId ||\r\n      item.id ||\r\n      item.hostId ||\r\n      [\r\n        item.type,\r\n        item.title,\r\n        item.location,\r\n        item.time\r\n      ].join(\"|\")\r\n    );\r\n  }\r\n\r\n  function itemCategory(item){\r\n    return String(item.category || item.type || \"Journey Item\");\r\n  }\r\n\r\n  function itemStatus(item){\r\n    return String(item.status || \"Saved\");\r\n  }\r\n\r\n  function filteredItems(){\r\n    if(state.filter === \"all\"){\r\n      return state.currentItems;\r\n    }\r\n\r\n    return state.currentItems.filter(function(item){\r\n      return itemStatus(item) === state.filter;\r\n    });\r\n  }\r\n\r\n  function renderItems(){\r\n    const box = el(\"bjoItems\");\r\n\r\n    if(!box){\r\n      return;\r\n    }\r\n\r\n    const items = filteredItems();\r\n\r\n    if(!state.currentUserId){\r\n      box.innerHTML =\r\n        '<div class=\"bjo-empty\">Select a traveler from the queue.<\/div>';\r\n      return;\r\n    }\r\n\r\n    if(!items.length){\r\n      box.innerHTML =\r\n        '<div class=\"bjo-empty\">No operations in this filter.<\/div>';\r\n      return;\r\n    }\r\n\r\n    box.innerHTML = items.map(function(item){\r\n      const id = itemId(item);\r\n      const active = id === state.currentItemId;\r\n      const status = itemStatus(item);\r\n      const image =\r\n        item.image ||\r\n        (\r\n          Array.isArray(item.images) &&\r\n          item.images[0]\r\n        ) ||\r\n        DEFAULT_IMAGE;\r\n\r\n      return `\r\n        <article\r\n          class=\"bjo-item ${active ? \"active\" : \"\"}\"\r\n          data-bjo-item=\"${esc(id)}\">\r\n          <div\r\n            class=\"bjo-img\"\r\n            style=\"background-image:url('${esc(image)}')\">\r\n          <\/div>\r\n\r\n          <div class=\"bjo-itemBody\">\r\n            <div class=\"bjo-itemTop\">\r\n              <span class=\"bjo-itemType\">\r\n                ${esc(itemCategory(item))}\r\n              <\/span>\r\n\r\n              <span class=\"bjo-pill ${statusClass(status)}\">\r\n                ${esc(status)}\r\n              <\/span>\r\n            <\/div>\r\n\r\n            <h4>${esc(item.title || \"Journey Item\")}<\/h4>\r\n            <p>${esc(item.description || item.location || \"No description added yet.\")}<\/p>\r\n          <\/div>\r\n        <\/article>\r\n      `;\r\n    }).join(\"\");\r\n  }\r\n\r\n  function currentItem(){\r\n    return state.currentItems.find(function(item){\r\n      return itemId(item) === state.currentItemId;\r\n    }) || null;\r\n  }\r\n\r\n  function statusOptionsHTML(current){\r\n    return STATUS_OPTIONS.map(function(status){\r\n      return `\r\n        <option\r\n          value=\"${esc(status)}\"\r\n          ${status === current ? \"selected\" : \"\"}>\r\n          ${esc(status)}\r\n        <\/option>\r\n      `;\r\n    }).join(\"\");\r\n  }\r\n\r\n  function itemMessages(journeyId){\r\n    return state.currentMessages.filter(function(message){\r\n      return String(message.journeyId || \"\") === String(journeyId || \"\");\r\n    });\r\n  }\r\n\r\n  function renderEditor(){\r\n    const box = el(\"bjoEditor\");\r\n\r\n    if(!box){\r\n      return;\r\n    }\r\n\r\n    const item = currentItem();\r\n\r\n    if(!item){\r\n      box.innerHTML = `\r\n        <div class=\"bjo-empty\">\r\n          Select an operation to update status, confirmation details,\r\n          admin notes, or send a concierge message.\r\n        <\/div>\r\n      `;\r\n      return;\r\n    }\r\n\r\n    const id = itemId(item);\r\n    const messages = itemMessages(id);\r\n\r\n    box.innerHTML = `\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Operation Title<\/label>\r\n        <input id=\"bjoEditTitle\" class=\"bjo-input\" value=\"${esc(item.title || \"\")}\">\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Category<\/label>\r\n        <input id=\"bjoEditCategory\" class=\"bjo-input\" value=\"${esc(item.category || itemCategory(item))}\">\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Status<\/label>\r\n        <select id=\"bjoEditStatus\" class=\"bjo-select\">\r\n          ${statusOptionsHTML(itemStatus(item))}\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Date \/ Time<\/label>\r\n        <input id=\"bjoEditTime\" class=\"bjo-input\" value=\"${esc(item.time || \"\")}\">\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Location \/ Pickup<\/label>\r\n        <input id=\"bjoEditLocation\" class=\"bjo-input\" value=\"${esc(item.location || \"\")}\">\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Confirmation Number<\/label>\r\n        <input id=\"bjoEditConfirmation\" class=\"bjo-input\" value=\"${esc(item.confirmationNumber || \"\")}\">\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Assigned To<\/label>\r\n        <input id=\"bjoEditAssigned\" class=\"bjo-input\" value=\"${esc(item.assignedTo || \"\")}\" placeholder=\"Example: Edward \/ Bliss Concierge\">\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Admin Notes<\/label>\r\n        <textarea id=\"bjoEditAdminNotes\" class=\"bjo-textarea\">${esc(item.adminNotes || \"\")}<\/textarea>\r\n      <\/div>\r\n\r\n      <div class=\"bjo-actions\">\r\n        <button class=\"bjo-btn bjo-btnPrimary\" type=\"button\" onclick=\"BlissJourneyOps.saveCurrentItem()\">\r\n          Save Operation\r\n        <\/button>\r\n\r\n        <button class=\"bjo-btn bjo-btnGold\" type=\"button\" onclick=\"BlissJourneyOps.whatsAppCurrentItem()\">\r\n          WhatsApp Traveler\r\n        <\/button>\r\n\r\n        <button class=\"bjo-btn bjo-btnDanger\" type=\"button\" onclick=\"BlissJourneyOps.removeCurrentItem()\">\r\n          Remove\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Concierge Message \/ Internal Update<\/label>\r\n        <textarea id=\"bjoNewMessage\" class=\"bjo-textarea\" placeholder=\"Write an update about this operation...\"><\/textarea>\r\n      <\/div>\r\n\r\n      <div class=\"bjo-actions\">\r\n        <button class=\"bjo-btn\" type=\"button\" onclick=\"BlissJourneyOps.addMessage()\">\r\n          Add Message\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <div class=\"bjo-field\">\r\n        <label class=\"bjo-label\">Operation Timeline<\/label>\r\n        <div class=\"bjo-messages\">\r\n          ${\r\n            messages.length\r\n              ? messages.map(function(message){\r\n                  return `\r\n                    <div class=\"bjo-message\">\r\n                      <strong>${esc(message.createdAt || \"Update\")}<\/strong>\r\n                      <p>${esc(message.message || \"\")}<\/p>\r\n                    <\/div>\r\n                  `;\r\n                }).join(\"\")\r\n              : '<div class=\"bjo-message\"><p>No messages for this operation yet.<\/p><\/div>'\r\n          }\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function collectEditedItem(){\r\n    const item = Object.assign({}, currentItem() || {});\r\n\r\n    item.journeyId = state.currentItemId;\r\n    item.title = el(\"bjoEditTitle\") ? el(\"bjoEditTitle\").value.trim() : item.title;\r\n    item.category = el(\"bjoEditCategory\") ? el(\"bjoEditCategory\").value.trim() : item.category;\r\n    item.status = el(\"bjoEditStatus\") ? el(\"bjoEditStatus\").value : item.status;\r\n    item.time = el(\"bjoEditTime\") ? el(\"bjoEditTime\").value.trim() : item.time;\r\n    item.location = el(\"bjoEditLocation\") ? el(\"bjoEditLocation\").value.trim() : item.location;\r\n    item.confirmationNumber = el(\"bjoEditConfirmation\") ? el(\"bjoEditConfirmation\").value.trim() : item.confirmationNumber;\r\n    item.assignedTo = el(\"bjoEditAssigned\") ? el(\"bjoEditAssigned\").value.trim() : item.assignedTo;\r\n    item.adminNotes = el(\"bjoEditAdminNotes\") ? el(\"bjoEditAdminNotes\").value.trim() : item.adminNotes;\r\n\r\n    return item;\r\n  }\r\n\r\n  function saveCurrentItem(){\r\n    if(!state.currentUserId || !state.currentItemId){\r\n      setStatus(\"Select an operation first.\",true);\r\n      return;\r\n    }\r\n\r\n    const item = collectEditedItem();\r\n\r\n    setStatus(\"Saving operation\u2026\",false);\r\n\r\n    post(\"bliss_journey_ops_save_item\",{\r\n      user_id:state.currentUserId,\r\n      item:JSON.stringify(item)\r\n    }).then(function(){\r\n      return post(\"bliss_journey_ops_get_user\",{\r\n        user_id:state.currentUserId\r\n      });\r\n    }).then(function(data){\r\n      state.currentUser = data.summary || {};\r\n      state.currentItems = data.items || [];\r\n      state.currentMessages = data.messages || [];\r\n\r\n      renderTraveler();\r\n      renderItems();\r\n      renderEditor();\r\n      refresh();\r\n\r\n      setStatus(\"Operation saved.\",false);\r\n    }).catch(function(error){\r\n      setStatus(error.message || \"Could not save operation.\",true);\r\n    });\r\n  }\r\n\r\n  function addMessage(){\r\n    if(!state.currentUserId || !state.currentItemId){\r\n      setStatus(\"Select an operation first.\",true);\r\n      return;\r\n    }\r\n\r\n    const messageBox = el(\"bjoNewMessage\");\r\n    const message = messageBox\r\n      ? messageBox.value.trim()\r\n      : \"\";\r\n\r\n    if(!message){\r\n      setStatus(\"Write a message first.\",true);\r\n      return;\r\n    }\r\n\r\n    post(\"bliss_journey_ops_add_message\",{\r\n      user_id:state.currentUserId,\r\n      journey_id:state.currentItemId,\r\n      message:message\r\n    }).then(function(data){\r\n      state.currentMessages = data.messages || [];\r\n      if(messageBox) messageBox.value = \"\";\r\n      renderEditor();\r\n      setStatus(\"Message added to operation timeline.\",false);\r\n    }).catch(function(error){\r\n      setStatus(error.message || \"Could not add message.\",true);\r\n    });\r\n  }\r\n\r\n  function removeCurrentItem(){\r\n    if(!state.currentUserId || !state.currentItemId){\r\n      return;\r\n    }\r\n\r\n    const confirmed = confirm(\r\n      \"Remove this operation from the traveler Journey?\"\r\n    );\r\n\r\n    if(!confirmed){\r\n      return;\r\n    }\r\n\r\n    post(\"bliss_journey_ops_remove_item\",{\r\n      user_id:state.currentUserId,\r\n      journey_id:state.currentItemId\r\n    }).then(function(){\r\n      state.currentItemId = \"\";\r\n      return post(\"bliss_journey_ops_get_user\",{\r\n        user_id:state.currentUserId\r\n      });\r\n    }).then(function(data){\r\n      state.currentUser = data.summary || {};\r\n      state.currentItems = data.items || [];\r\n      state.currentMessages = data.messages || [];\r\n      renderTraveler();\r\n      renderItems();\r\n      renderEditor();\r\n      refresh();\r\n      setStatus(\"Operation removed.\",false);\r\n    }).catch(function(error){\r\n      setStatus(error.message || \"Could not remove operation.\",true);\r\n    });\r\n  }\r\n\r\n  function whatsAppCurrentItem(){\r\n    const item = currentItem();\r\n    const user =\r\n      state.currentUser &&\r\n      state.currentUser.user\r\n        ? state.currentUser.user\r\n        : {};\r\n\r\n    if(!item){\r\n      return;\r\n    }\r\n\r\n    const lines = [\r\n      \"Hello \" + (user.display_name || \"traveler\") + \",\",\r\n      \"\",\r\n      \"Bliss Travel Club update:\",\r\n      \"\",\r\n      \"Operation: \" + (item.title || \"Journey Item\"),\r\n      \"Status: \" + itemStatus(item),\r\n      item.confirmationNumber\r\n        ? \"Confirmation: \" + item.confirmationNumber\r\n        : \"\",\r\n      item.time\r\n        ? \"Schedule: \" + item.time\r\n        : \"\",\r\n      item.location\r\n        ? \"Location: \" + item.location\r\n        : \"\",\r\n      \"\",\r\n      item.adminNotes\r\n        ? item.adminNotes\r\n        : \"We are reviewing this Journey item and will keep you updated.\"\r\n    ].filter(Boolean);\r\n\r\n    window.open(\r\n      \"https:\/\/wa.me\/\" + WHATSAPP_NUMBER +\r\n      \"?text=\" + encodeURIComponent(lines.join(\"\\n\")),\r\n      \"_blank\",\r\n      \"noopener\"\r\n    );\r\n  }\r\n\r\n  document.addEventListener(\"click\",function(event){\r\n    const userButton =\r\n      event.target.closest(\"[data-bjo-user]\");\r\n\r\n    if(userButton){\r\n      event.preventDefault();\r\n      loadUser(userButton.getAttribute(\"data-bjo-user\"));\r\n      return;\r\n    }\r\n\r\n    const itemCard =\r\n      event.target.closest(\"[data-bjo-item]\");\r\n\r\n    if(itemCard){\r\n      event.preventDefault();\r\n      state.currentItemId =\r\n        itemCard.getAttribute(\"data-bjo-item\");\r\n\r\n      renderItems();\r\n      renderEditor();\r\n      return;\r\n    }\r\n\r\n    const tab =\r\n      event.target.closest(\"[data-bjo-filter]\");\r\n\r\n    if(tab){\r\n      event.preventDefault();\r\n\r\n      state.filter =\r\n        tab.getAttribute(\"data-bjo-filter\") ||\r\n        \"all\";\r\n\r\n      document\r\n        .querySelectorAll(\"[data-bjo-filter]\")\r\n        .forEach(function(button){\r\n          button.classList.toggle(\r\n            \"active\",\r\n            button === tab\r\n          );\r\n        });\r\n\r\n      renderItems();\r\n      return;\r\n    }\r\n  });\r\n\r\n  document.addEventListener(\"DOMContentLoaded\",function(){\r\n    const params = new URLSearchParams(window.location.search);\r\n\r\n    if(params.get(\"journeyops\") === \"1\"){\r\n      open();\r\n    }\r\n  });\r\n\r\n  window.BlissJourneyOps = {\r\n    open:open,\r\n    close:close,\r\n    refresh:refresh,\r\n    renderQueue:renderQueue,\r\n    loadUser:loadUser,\r\n    saveCurrentItem:saveCurrentItem,\r\n    addMessage:addMessage,\r\n    removeCurrentItem:removeCurrentItem,\r\n    whatsAppCurrentItem:whatsAppCurrentItem\r\n  };\r\n})();\r\n<\/script>\r\n\r\n<!-- =========================================================\r\nBLISS JOURNEY OPERATIONS \u2014 TRUE FULLSCREEN REPAIR V1\r\nADD AT THE VERY BOTTOM OF THE CONTROL PANEL CODE\r\n========================================================= -->\r\n\r\n<style>\r\n\/* Lock the complete browser window while Command Center is open *\/\r\nhtml.bliss-journey-ops-active,\r\nbody.bliss-journey-ops-active{\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n  width:100% !important;\r\n  min-width:100% !important;\r\n  max-width:none !important;\r\n  height:100% !important;\r\n  min-height:100% !important;\r\n  overflow:hidden !important;\r\n  background:#02030b !important;\r\n}\r\n\r\n\/* Hide the normal WordPress page *\/\r\nbody.bliss-journey-ops-active > *:not(#blissJourneyOpsOverlay){\r\n  display:none !important;\r\n}\r\n\r\n\/* Force the hidden Command Center over the entire screen *\/\r\nbody.bliss-journey-ops-active #blissJourneyOpsOverlay{\r\n  display:block !important;\r\n  visibility:visible !important;\r\n\r\n  position:fixed !important;\r\n  inset:0 !important;\r\n  top:0 !important;\r\n  right:0 !important;\r\n  bottom:0 !important;\r\n  left:0 !important;\r\n\r\n  width:100vw !important;\r\n  min-width:100vw !important;\r\n  max-width:none !important;\r\n\r\n  height:100vh !important;\r\n  min-height:100vh !important;\r\n  max-height:none !important;\r\n\r\n  margin:0 !important;\r\n  padding:18px !important;\r\n\r\n  overflow-x:hidden !important;\r\n  overflow-y:auto !important;\r\n  overscroll-behavior:contain;\r\n\r\n  z-index:2147483647 !important;\r\n\r\n  opacity:1 !important;\r\n  pointer-events:auto !important;\r\n  transform:none !important;\r\n}\r\n\r\n\/* Keep every part of the Command Center visible *\/\r\nbody.bliss-journey-ops-active #blissJourneyOpsOverlay,\r\nbody.bliss-journey-ops-active #blissJourneyOpsOverlay *{\r\n  visibility:visible !important;\r\n}\r\n\r\n\/* Remove the old 1380px limit *\/\r\nbody.bliss-journey-ops-active #blissJourneyOpsOverlay .bjo-shell{\r\n  width:100% !important;\r\n  min-width:0 !important;\r\n  max-width:none !important;\r\n  margin:0 !important;\r\n}\r\n\r\n\/* Make the main dashboard use the available screen *\/\r\nbody.bliss-journey-ops-active #blissJourneyOpsOverlay .bjo-layout{\r\n  width:100% !important;\r\n  max-width:none !important;\r\n}\r\n\r\n\/* Prevent WordPress theme wrappers from constraining it *\/\r\nbody.bliss-journey-ops-active .site,\r\nbody.bliss-journey-ops-active .site-content,\r\nbody.bliss-journey-ops-active .entry-content,\r\nbody.bliss-journey-ops-active .wp-site-blocks{\r\n  max-width:none !important;\r\n  width:100% !important;\r\n  margin:0 !important;\r\n  padding:0 !important;\r\n}\r\n\r\n\/* Mobile fullscreen *\/\r\n@media(max-width:680px){\r\n  body.bliss-journey-ops-active #blissJourneyOpsOverlay{\r\n    width:100dvw !important;\r\n    min-width:100dvw !important;\r\n    height:100dvh !important;\r\n    min-height:100dvh !important;\r\n    padding:10px !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n\r\n  \"use strict\";\r\n\r\n  function getOverlay(){\r\n    return document.getElementById(\r\n      \"blissJourneyOpsOverlay\"\r\n    );\r\n  }\r\n\r\n  function activateTrueFullscreen(){\r\n    const overlay = getOverlay();\r\n\r\n    if(!overlay){\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * Move the overlay directly into body so no WordPress\r\n     * container can crop, resize, or hide the Command Center.\r\n     *\/\r\n    if(overlay.parentElement !== document.body){\r\n      document.body.appendChild(overlay);\r\n    }\r\n\r\n    document.documentElement.classList.add(\r\n      \"bliss-journey-ops-active\"\r\n    );\r\n\r\n    document.body.classList.add(\r\n      \"bliss-journey-ops-active\"\r\n    );\r\n\r\n    overlay.style.setProperty(\r\n      \"display\",\r\n      \"block\",\r\n      \"important\"\r\n    );\r\n\r\n    overlay.setAttribute(\r\n      \"aria-hidden\",\r\n      \"false\"\r\n    );\r\n\r\n    overlay.scrollTop = 0;\r\n  }\r\n\r\n  function deactivateTrueFullscreen(){\r\n    const overlay = getOverlay();\r\n\r\n    document.documentElement.classList.remove(\r\n      \"bliss-journey-ops-active\"\r\n    );\r\n\r\n    document.body.classList.remove(\r\n      \"bliss-journey-ops-active\"\r\n    );\r\n\r\n    if(overlay){\r\n      overlay.style.setProperty(\r\n        \"display\",\r\n        \"none\",\r\n        \"important\"\r\n      );\r\n\r\n      overlay.setAttribute(\r\n        \"aria-hidden\",\r\n        \"true\"\r\n      );\r\n    }\r\n  }\r\n\r\n  function connectFullscreenRepair(){\r\n    const overlay = getOverlay();\r\n\r\n    if(!overlay){\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * Keep it outside all WordPress content wrappers.\r\n     *\/\r\n    if(overlay.parentElement !== document.body){\r\n      document.body.appendChild(overlay);\r\n    }\r\n\r\n    \/*\r\n     * Preserve all existing BlissJourneyOps functions.\r\n     * Only strengthen open() and close().\r\n     *\/\r\n    if(\r\n      window.BlissJourneyOps &&\r\n      window.BlissJourneyOps.__trueFullscreen !== true\r\n    ){\r\n      const originalOpen =\r\n        typeof window.BlissJourneyOps.open === \"function\"\r\n          ? window.BlissJourneyOps.open.bind(\r\n              window.BlissJourneyOps\r\n            )\r\n          : null;\r\n\r\n      const originalClose =\r\n        typeof window.BlissJourneyOps.close === \"function\"\r\n          ? window.BlissJourneyOps.close.bind(\r\n              window.BlissJourneyOps\r\n            )\r\n          : null;\r\n\r\n      window.BlissJourneyOps.open = function(){\r\n        activateTrueFullscreen();\r\n\r\n        if(originalOpen){\r\n          originalOpen();\r\n        }\r\n\r\n        activateTrueFullscreen();\r\n      };\r\n\r\n      window.BlissJourneyOps.close = function(){\r\n        if(originalClose){\r\n          originalClose();\r\n        }\r\n\r\n        deactivateTrueFullscreen();\r\n      };\r\n\r\n      window.BlissJourneyOps.__trueFullscreen =\r\n        true;\r\n    }\r\n\r\n    \/*\r\n     * When entering directly with ?journeyops=1,\r\n     * make sure the fullscreen state is applied.\r\n     *\/\r\n    const params =\r\n      new URLSearchParams(\r\n        window.location.search\r\n      );\r\n\r\n    if(params.get(\"journeyops\") === \"1\"){\r\n      activateTrueFullscreen();\r\n    }\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      connectFullscreenRepair,\r\n      {once:true}\r\n    );\r\n  }else{\r\n    connectFullscreenRepair();\r\n  }\r\n\r\n  \/*\r\n   * Recheck because the original Command Center script\r\n   * may initialize after this repair.\r\n   *\/\r\n  setTimeout(\r\n    connectFullscreenRepair,\r\n    300\r\n  );\r\n\r\n  setTimeout(\r\n    connectFullscreenRepair,\r\n    1000\r\n  );\r\n\r\n})();\r\n<\/script>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>\u264b Cancer Accommodations Restaurants Entertainment VIP Nite Accommodations Restaurants Entertainment VIP Relax Accommodations Restaurants Entertainment VIP Elegant Accommodations Restaurants Entertainment VIP Nature \u00d7 How it works Rotate the Cube Drag with one finger (touch) or click-and-drag (mouse) to rotate. Swipe for a quick spin. \u2190 Prev 1 \/ 7 Skip Next \u2192 Tutorial \ud83e\uddca \ud83d\udc96 [&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-2305","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/2305","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=2305"}],"version-history":[{"count":24,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/2305\/revisions"}],"predecessor-version":[{"id":9627,"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/pages\/2305\/revisions\/9627"}],"wp:attachment":[{"href":"https:\/\/godsgalaxygame.com\/GGG\/wp-json\/wp\/v2\/media?parent=2305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}