{"id":6,"date":"2026-01-01T23:38:14","date_gmt":"2026-01-01T23:38:14","guid":{"rendered":"https:\/\/sospuravida.com\/gym\/?page_id=6"},"modified":"2026-04-26T22:54:02","modified_gmt":"2026-04-27T04:54:02","slug":"socios","status":"publish","type":"page","link":"https:\/\/sospuravida.com\/gym\/","title":{"rendered":"SOCIOS"},"content":{"rendered":"<div  class='flex_column av-85w6-957a97922bba40e89993d71e45643429 av_one_full  avia-builder-el-0  avia-builder-el-no-sibling  first flex_column_div  '     ><section  class='av_textblock_section av-6cai-9847578aaffdf9dfaed2c7ad8f9c1608 '   itemscope=\"itemscope\" itemtype=\"https:\/\/schema.org\/CreativeWork\" ><div class='avia_textblock'  itemprop=\"text\" >            <meta charset=\"UTF-8\">\r\n            <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover\">\r\n            \r\n            <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;700;900&display=swap\" rel=\"stylesheet\">\r\n            <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/qrious\/4.0.2\/qrious.min.js\"><\/script>\r\n            <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0\/css\/all.min.css\">\r\n            <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\r\n            <script src=\"https:\/\/code.jquery.com\/jquery-3.6.0.min.js\"><\/script>\r\n            <script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\r\n\r\n            <style>\r\n                \/* V77: LIGHT THEME VARIABLES *\/\r\n                :root { \r\n                    --primary: #0ea5e9; \r\n                    --bg: #f8fafc; \r\n                    --dark: #0f172a; \r\n                    --text: #334155; \r\n                    --card-bg: #ffffff; \r\n                    --glass: rgba(255,255,255,0.95);\r\n                    --border: rgba(0,0,0,0.05);\r\n                }\r\n                \r\n                * { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }\r\n                \r\n                html, body { \r\n                    margin: 0; padding: 0; \r\n                    font-family: 'Inter', sans-serif; \r\n                    background: var(--bg); \r\n                    color: var(--text); \r\n                    overflow-x: hidden; \r\n                    height: 100%; \r\n                    overscroll-behavior: none;\r\n                    -webkit-font-smoothing: antialiased;\r\n                }\r\n                \r\n                .app-shell { \r\n                    width: 100vw; \r\n                    max-width: 100%; \r\n                    margin: 0; \r\n                    background: var(--bg); \r\n                    min-height: 100dvh; \r\n                    position: relative; \r\n                    display: flex; \r\n                    flex-direction: column;\r\n                }\r\n                \r\n                .view-container { \r\n                    flex: 1; \r\n                    padding: 15px; \r\n                    padding-bottom: 120px; \r\n                    padding-top: calc(15px + env(safe-area-inset-top));\r\n                    overflow-y: auto; \r\n                    scroll-behavior: smooth; \r\n                }\r\n                .view-container > div { animation: fadeIn 0.4s cubic-bezier(0.2, 0.8, 0.2, 1); }\r\n                @keyframes fadeIn { from { opacity: 0; transform: translateY(15px); } to { opacity: 1; transform: translateY(0); } }\r\n                \r\n                .gym-bottom-nav { \r\n                    position: fixed !important; \r\n                    bottom: 0 !important; \r\n                    left: 0 !important; \r\n                    right: 0 !important; \r\n                    margin: 0 !important; \r\n                    width: 100% !important; \r\n                    max-width: 100% !important; \r\n                    height: calc(75px + env(safe-area-inset-bottom, 15px)) !important; \r\n                    padding-bottom: env(safe-area-inset-bottom, 15px) !important; \r\n                    background: var(--glass); \r\n                    backdrop-filter: blur(15px); \r\n                    -webkit-backdrop-filter: blur(15px); \r\n                    display: none; \r\n                    justify-content: space-evenly; \r\n                    align-items: center; \r\n                    border-radius: 20px 20px 0 0; \r\n                    box-shadow: 0 -5px 25px rgba(0,0,0,0.05) !important; \r\n                    z-index: 99999 !important; \r\n                    border-top: 1px solid var(--border); \r\n                    transition: transform 0.3s;\r\n                }\r\n                .nav-hidden { transform: translateY(100%); } \r\n                \r\n                .nav-item { flex: 1; border: none; background: none; color: #94a3b8; display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: 10px; font-weight: 900; gap: 5px; cursor: pointer; height: 100%; transition: 0.2s;}\r\n                .nav-item span { font-size: 22px; transition:0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);}\r\n                .nav-item:active span { transform:scale(0.85); }\r\n                .nav-item.active { color: var(--primary); text-shadow:0 0 10px rgba(14,165,233,0.2);}\r\n                .nav-item.active span { transform:translateY(-4px) scale(1.15); }\r\n                \r\n                .gym-card { background: var(--card-bg); border-radius: 20px; padding: 20px; box-shadow: 0 4px 15px rgba(0,0,0,0.03); margin-bottom: 15px; border:1px solid var(--border); position:relative; overflow:hidden;}\r\n                .gym-btn { width: 100%; background: var(--primary); color: #fff; border: none; padding: 16px; border-radius: 16px; font-weight: 900; font-size: 14px; cursor: pointer; transition: 0.2s; text-align:center; box-shadow: 0 4px 10px rgba(14,165,233,0.3); display:flex; justify-content:center; align-items:center; gap:8px;}\r\n                .gym-btn:active { transform: scale(0.96); }\r\n                .gym-input { width: 100%; text-align: center; font-size: 16px; font-weight: 900; border: 2px dashed #cbd5e1; border-radius: 15px; padding: 15px; margin: 10px 0; outline: none; background: transparent; transition: 0.3s; color:var(--text);}\r\n                .gym-input:focus { border-color: var(--primary); background: var(--bg); }\r\n                \r\n                .app-modal { position: fixed; top:0; left:0; width:100vw; height:100dvh; background:rgba(15,23,42,0.8); z-index:100000; display:none; justify-content:center; align-items:flex-end; backdrop-filter: blur(5px); }\r\n                .modal-content { background:var(--card-bg); width:100vw; max-width:100%; border-radius:30px 30px 0 0; padding:30px 20px calc(20px + env(safe-area-inset-bottom)); text-align:center; animation: slideUp 0.3s cubic-bezier(0.2, 0.8, 0.2, 1); max-height:90vh; overflow-y:auto; position:relative;}\r\n                @keyframes slideUp { from{transform:translateY(100%);} to{transform:translateY(0);} }\r\n                \r\n                #toast-container { position:fixed; top:40px; left:50%; transform:translateX(-50%); z-index:100000; display:flex; flex-direction:column; gap:10px; pointer-events:none; width:90%; max-width:350px;}\r\n                .toast-msg { background:var(--dark); color:white; padding:12px 20px; border-radius:30px; font-size:12px; font-weight:bold; box-shadow:0 10px 20px rgba(0,0,0,0.2); animation: toastAnim 3s forwards; text-align:center; border:1px solid var(--border);}\r\n                @keyframes toastAnim { 0%{opacity:0; transform:translateY(-20px);} 10%{opacity:1; transform:translateY(0);} 90%{opacity:1; transform:translateY(0);} 100%{opacity:0; transform:translateY(-20px);} }\r\n\r\n                .glass-chart-container { background:#ffffff; border:1px solid var(--border); border-radius:20px; padding:15px; margin-bottom:20px; box-shadow: 0 4px 15px rgba(0,0,0,0.03); }\r\n                .gym-card.overflow-visible { overflow: visible !important; margin-top:25px; }\r\n\r\n                \/* Map Controls *\/\r\n                .btn-map-control { position:absolute; z-index:900; background:var(--card-bg); border-radius:50%; display:flex; align-items:center; justify-content:center; box-shadow:0 4px 10px rgba(0,0,0,0.1); cursor:pointer; border:1px solid var(--border); transition:0.2s; color:var(--text); }\r\n                .btn-map-control:active { transform:scale(0.9); }\r\n                #btn-maximize-map { width: 50px !important; height: 50px !important; bottom: 20px !important; right: 15px !important; background: var(--primary) !important; color: #fff !important; }\r\n                #btn-center-gps { width: 40px !important; height: 40px !important; bottom: 80px !important; right: 20px !important; color: var(--primary) !important; display:none;}\r\n                #btn-topo-toggle { width: 40px !important; height: 40px !important; top: 15px !important; right: 15px !important; }\r\n                #btn-poi-toggle { width: 40px !important; height: 40px !important; top: 65px !important; right: 15px !important; }\r\n                #btn-discovery-toggle { width: 40px !important; height: 40px !important; top: 115px !important; right: 15px !important; background: #e0f2fe !important; color: #0284c7 !important; border: 1px solid #bae6fd !important; }\r\n\r\n                \/* Omni-Radar *\/\r\n                .radar-grid-v69 { display:grid; grid-template-columns:repeat(auto-fill, minmax(80px, 1fr)); gap:10px; }\r\n                .radar-btn-v69 { background:#fff; border:1px solid #bae6fd; border-radius:12px; padding:15px 5px; display:flex; flex-direction:column; align-items:center; justify-content:center; cursor:pointer; transition:all 0.2s; color:#334155; box-shadow:0 4px 6px rgba(0,0,0,0.05);}\r\n                .radar-btn-v69:active { transform:scale(0.95); box-shadow:0 1px 2px rgba(0,0,0,0.05); }\r\n                .radar-btn-v69 i { font-size:24px; margin-bottom:8px; }\r\n                .radar-btn-v69 span { font-size:9px; font-weight:900; text-transform:uppercase; text-align:center; }\r\n                \r\n                .leaflet-container { touch-action: none; }\r\n                .leaflet-control-attribution { display: none !important; }\r\n\r\n                \/* ?0?4 V77: TACTICAL SOS GRIDS AND PULSE REDESIGN *\/\r\n                .sos-grid-v74 { display:grid; grid-template-columns:1fr 1fr; gap:8px; margin-top:15px;}\r\n                .sos-tactical-btn { padding:12px 10px; font-size:10px; font-weight:900; color:white; justify-content:flex-start; border-radius:10px; border:1px solid rgba(255,255,255,0.2); box-shadow:0 2px 5px rgba(0,0,0,0.1); transition:0.2s;}\r\n                .sos-tactical-btn:active { transform:scale(0.95); }\r\n                .sos-panic-btn { background: #ef4444 !important; color: white !important; border: 2px solid #fca5a5 !important; box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.7) !important; animation: panicPulse 1.5s infinite cubic-bezier(0.66, 0, 0, 1) !important; }\r\n                @keyframes panicPulse { to { box-shadow: 0 0 0 25px rgba(239, 68, 68, 0); } }\r\n\r\n                \/* ?0?4 V77 WORKOUT UI STYLES - Dynamic Colors & Hover *\/\r\n                .workout-day-header { background: var(--card-bg); padding: 15px; border-radius: 12px; font-weight: 900; color: var(--primary); margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; border: 1px solid var(--border); cursor: pointer; box-shadow: 0 2px 5px rgba(0,0,0,0.02); transition:0.2s;}\r\n                .workout-day-header:active { transform:scale(0.98); }\r\n                .workout-card { background: var(--card-bg); border-radius: 16px; padding: 15px; margin-bottom: 12px; border: 1px solid var(--border); box-shadow: 0 4px 15px rgba(0,0,0,0.03); display: flex; flex-direction: column; gap: 10px; transition: 0.2s; }\r\n                .workout-card:hover { transform:translateY(-2px); box-shadow: 0 8px 20px rgba(0,0,0,0.06); border-color:#cbd5e1; }\r\n                .workout-card-top { display: flex; gap: 15px; align-items: flex-start; }\r\n                .workout-thumb { width: 70px; height: 70px; border-radius: 10px; object-fit: cover; background: #f1f5f9; box-shadow: 0 2px 5px rgba(0,0,0,0.1); flex-shrink: 0; cursor:pointer;}\r\n                .workout-info { flex: 1; }\r\n                .workout-title { font-size: 15px; font-weight: 900; color: var(--dark); margin: 0 0 4px 0; line-height: 1.2; }\r\n                .workout-desc { font-size: 11px; color: #64748b; margin: 0 0 8px 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\r\n                .workout-badges { display: flex; gap: 5px; flex-wrap: wrap; }\r\n                .w-badge { font-size: 9px; font-weight: 900; padding: 3px 6px; border-radius: 6px; letter-spacing: 0.5px; }\r\n                .wb-reps { background: #fee2e2; color: #b91c1c; }\r\n                .wb-rest { background: #e0f2fe; color: #0369a1; }\r\n                \r\n                \/* Dynamic Muscle Group Colors *\/\r\n                .wb-group-pecho { background: #dbeafe; color: #1e40af; }\r\n                .wb-group-espalda { background: #ede9fe; color: #86198f; }\r\n                .wb-group-pierna { background: #ffedd5; color: #a16207; }\r\n                .wb-group-hombro { background: #fee2e2; color: #b91c1c; }\r\n                .wb-group-brazo { background: #f3f4f6; color: #334155; }\r\n                .wb-group-core { background: #ecfdf5; color: #15803d; }\r\n                .wb-group-cardio { background: #cffafe; color: #0369a1; }\r\n                .wb-group-default { background: #f1f5f9; color: #475569; }\r\n\r\n                .wb-xp { background: #fefce8; color: #a16207; border: 1px solid #fde047; }\r\n                .workout-actions { display: flex; justify-content: space-between; align-items: center; border-top: 1px dashed var(--border); padding-top: 10px; margin-top: 5px; }\r\n                .btn-play-video { background: #f1f5f9; color: #334155; border: none; padding: 6px 12px; border-radius: 8px; font-size: 11px; font-weight: 900; cursor: pointer; display: flex; align-items: center; gap: 5px; transition: 0.2s; }\r\n                .btn-play-video:active { transform: scale(0.95); background: #e2e8f0; }\r\n                .workout-check { width: 26px; height: 26px; accent-color: var(--primary); cursor: pointer; }\r\n                \r\n                \/* Video Modal *\/\r\n                .video-modal-content { background: #000; width: 100vw; max-width: 100%; border-radius: 20px 20px 0 0; padding: 0; overflow: hidden; }\r\n                .video-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; width: 100%; background: #000; }\r\n                .video-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; }\r\n                .video-close-bar { display: flex; justify-content: space-between; padding: 15px; background: #111; color: white; align-items: center; }\r\n\r\n                \/* Progress Bar *\/\r\n                .progress-container { background: var(--card-bg); padding: 15px; border-radius: 15px; margin-bottom: 20px; box-shadow: 0 4px 15px rgba(0,0,0,0.03); border: 1px solid var(--border); position: sticky; top: 15px; z-index: 100; }\r\n                .progress-bar-bg { width: 100%; height: 8px; background: #f1f5f9; border-radius: 4px; overflow: hidden; margin-top: 8px; }\r\n                .progress-bar-fill { height: 100%; background: var(--primary); width: 0%; transition: width 0.5s ease-out; }\r\n            <\/style>\r\n            \r\n            <div id=\"server-status\" style=\"position:fixed; top:10px; right:10px; width:10px; height:10px; border-radius:50%; background:#10b981; z-index:99999; box-shadow:0 0 10px #10b981; pointer-events:none;\" title=\"Server Online\"><\/div>\r\n\r\n            <div class=\"app-shell\" id=\"app-shell-container\">\r\n                <div class=\"offline-banner\" id=\"offline-warning\" style=\"display:none; background:#ef4444; color:white; text-align:center; padding:5px; font-size:11px; font-weight:bold; z-index:99999; position:absolute; width:100%; top:0;\"><i class=\"fas fa-wifi\"><\/i> Sin conexi\\u00f3n. Modo Offline Activo.<\/div>\r\n                <div id=\"toast-container\"><\/div>\r\n\r\n                <header id=\"app-top-bar\" style=\"background: var(--card-bg); color: var(--text); padding: 20px 15px; border-radius: 0 0 25px 25px; box-shadow: 0 5px 15px rgba(0,0,0,0.05); display:none; position:relative; z-index:10; width:100%; box-sizing:border-box; border-bottom:1px solid var(--border);\">\r\n                    <div style=\"width: 100%; overflow: hidden; display: table;\">\r\n                        <div style=\"float: left; width: 65%; text-align: left;\">\r\n                            <span id=\"tb-level-badge\" style=\"display: inline-block; padding: 3px 10px; border-radius: 12px; font-size: 9px; font-weight: 900; background: var(--primary); color: #fff; margin-bottom: 4px; text-transform: uppercase; box-shadow:0 2px 5px rgba(14,165,233,0.3);\">ATLETA APEX<\/span>\r\n                            <div style=\"font-size:10px; color:#64748b; margin-top:2px;\" id=\"greeting-txt\">Cargando...<\/div>\r\n                            <h2 style=\"margin:0; font-size:16px; color: var(--dark); font-weight:900; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; width:100%; line-height:1.2;\" id=\"tb-name\">Atleta<\/h2>\r\n                        <\/div>\r\n\r\n                        <div style=\"float: right; width: 35%; text-align: right; padding-top: 10px;\">\r\n                            <button onclick=\"document.getElementById('sos-modal').style.display='flex'; requestWakeLock();\" style=\"color:#ef4444; background:rgba(239,68,68,0.1); border:1px solid #ef4444; font-size:13px; border-radius:50%; cursor:pointer; width:35px; height:35px; display:inline-flex; align-items:center; justify-content:center; padding:0; margin-left:4px;\" title=\"S.O.S.\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/button>\r\n                            <button onclick=\"logoutApp()\" style=\"color:#888; background:rgba(255,255,255,0.1); border:1px solid #cbd5e1; font-size:13px; border-radius:50%; cursor:pointer; width:35px; height:35px; display:inline-flex; align-items:center; justify-content:center; padding:0; margin-left:4px;\" title=\"Salir\"><i class=\"fas fa-power-off\"><\/i><\/button>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/header>\r\n\r\n                <main class=\"view-container\" id=\"gym-app-screen\">\r\n                    <div class=\"loading-state\" style=\"margin-top:50%; text-align:center;\">\r\n                        <i class=\"fas fa-circle-notch fa-spin\" style=\"font-size:40px; color:var(--primary);\"><\/i>\r\n                        <div style=\"font-weight:900; font-size:12px; margin-top:10px; color:#64748b;\">INICIALIZANDO MOTOR...<\/div>\r\n                    <\/div>\r\n                <\/main>\r\n\r\n                <nav class=\"gym-bottom-nav\" id=\"gym-nav\">\r\n                    <button class=\"nav-item active\" data-target=\"rutina\" onclick=\"switchView('rutina', this)\"><span><i class=\"fas fa-dumbbell\"><\/i><\/span>RUTINA<\/button>\r\n                    <button class=\"nav-item\" data-target=\"clases\" onclick=\"switchView('clases', this)\"><span><i class=\"fas fa-calendar-alt\"><\/i><\/span>CLASES<\/button>\r\n                    <button class=\"nav-item\" data-target=\"nutri\" onclick=\"switchView('nutri', this)\"><span><i class=\"fas fa-apple-alt\"><\/i><\/span>DIETA<\/button>\r\n                    <button class=\"nav-item\" data-target=\"rutas\" onclick=\"switchView('rutas', this)\" style=\"color:var(--primary);\"><span><i class=\"fas fa-map-marked-alt\"><\/i><\/span>GPS<\/button>\r\n                <\/nav>\r\n            <\/div>\r\n\r\n            <div id=\"sos-modal\" class=\"app-modal\" onclick=\"if(event.target===this) { this.style.display='none'; if(wakeLock !== null) wakeLock.release().then(() => { wakeLock = null; }); }\">\r\n                <div class=\"modal-content\" style=\"padding-top:15px; background:#fef2f2; border:1px solid #ef4444;\">\r\n                    <div style=\"position:absolute; top:-50%; right:-20%; width:200px; height:200px; background:radial-gradient(circle, rgba(239,68,68,0.1) 0%, transparent 70%); border-radius:50%; animation:pulse 3s infinite;\"><\/div>\r\n                    <div style=\"width:40px; height:5px; background:#fca5a5; border-radius:3px; margin:0 auto 10px;\"><\/div>\r\n                    <h3 style=\"margin:0 0 5px 0; font-weight:900; color:#dc2626; display:flex; align-items:center; justify-content:center; gap:8px;\"><i class=\"fas fa-exclamation-triangle\"><\/i> EMERGENCIA S.O.S.<\/h3>\r\n                    \r\n                    <button id=\"btn-main-sos\" class=\"gym-btn sos-panic-btn\" style=\"margin-top:20px; padding:20px; font-size:18px; font-weight:900; letter-spacing:1px;\" onclick=\"enviarAlertaSOSWA('Emergencia General S.O.S', this)\"><i class=\"fas fa-exclamation-circle fa-beat\" style=\"margin-right:8px;\"><\/i> S.O.S. ALERTA A BASE<\/button>\r\n                    \r\n                    <div style=\"margin-top: 25px; border-top: 1px dashed #fca5a5; padding-top: 15px; text-align:left;\">\r\n                        <span style=\"font-size:10px; color:#ef4444; font-weight:900;\">\\ud83d\\udea8 PROTOCOLO DE EXTRACCI\\u00d3N (12 C\\u00d3DIGOS):<\/span>\r\n                        <p style=\"font-size:10px; color:#991b1b; margin:5px 0 10px 0; font-weight:bold;\">Toca tu emergencia. El sistema adjuntar\\u00e1 tu ubicaci\\u00f3n GPS exacta v\\u00eda WhatsApp para enviar ayuda.<\/p>\r\n                        \r\n                        <div class=\"sos-grid-v74\">\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(153, 27, 27, 0.9);\" onclick=\"enviarAlertaSOSWA('Emergencia M\\u00e9dica \/ Infarto \/ Desmayo', this)\"><i class=\"fas fa-heartbeat\"><\/i> M\\u00e9dica\/Infarto<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(153, 27, 27, 0.9);\" onclick=\"enviarAlertaSOSWA('Accidente de Tr\\u00e1fico \/ Atropello', this)\"><i class=\"fas fa-car-crash\"><\/i> Accidente Tr\\u00e1fico<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(185, 28, 28, 0.9);\" onclick=\"enviarAlertaSOSWA('Lesi\\u00f3n Grave \/ Fractura \/ Ca\\u00edda', this)\"><i class=\"fas fa-crutch\"><\/i> Fractura\/Ca\\u00edda<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(185, 28, 28, 0.9);\" onclick=\"enviarAlertaSOSWA('Asalto \/ Robo \/ Peligro a la Integridad', this)\"><i class=\"fas fa-mask\"><\/i> Asalto\/Robo<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(220, 38, 38, 0.9);\" onclick=\"enviarAlertaSOSWA('Agotamiento Extremo \/ Deshidrataci\\u00f3n', this)\"><i class=\"fas fa-temperature-high\"><\/i> Golpe de Calor<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(220, 38, 38, 0.9);\" onclick=\"enviarAlertaSOSWA('Extraviado \/ Desorientado en Ruta', this)\"><i class=\"fas fa-compass\"><\/i> Extraviado\/Perdido<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(234, 88, 12, 0.9);\" onclick=\"enviarAlertaSOSWA('Ataque de Animal \/ Picadura Peligrosa', this)\"><i class=\"fas fa-bug\"><\/i> Ataque Animal<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(234, 88, 12, 0.9);\" onclick=\"enviarAlertaSOSWA('Problema Mec\\u00e1nico Grave \/ Veh\\u00edculo Inmovilizado', this)\"><i class=\"fas fa-wrench\"><\/i> Aver\\u00eda Mec\\u00e1nica<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(217, 119, 6, 0.9);\" onclick=\"enviarAlertaSOSWA('Incendio Forestal \/ Fuego Cercano', this)\"><i class=\"fas fa-fire-alt\"><\/i> Incendio Forestal<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(217, 119, 6, 0.9);\" onclick=\"enviarAlertaSOSWA('Crecida de R\\u00edo \/ Inundaci\\u00f3n \/ Cabeza de Agua', this)\"><i class=\"fas fa-water\"><\/i> Inundaci\\u00f3n\/R\\u00edo<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(14, 165, 233, 0.9);\" onclick=\"enviarAlertaSOSWA('Rescate en Desnivel \/ Atrapado', this)\"><i class=\"fas fa-mountain\"><\/i> Atrapado\/Desnivel<\/button>\r\n                            <button class=\"gym-btn sos-tactical-btn\" style=\"background:rgba(139, 92, 246, 0.9);\" onclick=\"enviarAlertaSOSWA('Solicito Contacto Urgente (Situaci\\u00f3n Desconocida)', this)\"><i class=\"fas fa-phone-alt\"><\/i> Contacto Urgente<\/button>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div id=\"discovery-modal\" class=\"app-modal\" onclick=\"if(event.target===this) this.style.display='none'\">\r\n                <div class=\"modal-content\" style=\"background:#e0f2fe; border:1px solid #bae6fd; padding-top:20px;\">\r\n                    <div style=\"width:40px; height:5px; background:#93c5fd; border-radius:3px; margin:0 auto 15px;\"><\/div>\r\n                    <h3 style=\"margin:0 0 5px 0; font-weight:900; color:#0369a1; text-align:left; display:flex; align-items:center; gap:8px;\"><i class=\"fas fa-satellite-dish\"><\/i> Mega Radar Discovery<\/h3>\r\n                    <div style=\"display:flex; gap:10px; margin-bottom:15px; align-items:center; background:rgba(255,255,255,0.7); padding:10px 15px; border-radius:12px; border:1px solid #bae6fd;\">\r\n                        <label style=\"margin:0; font-size:10px; color:#0f172a; font-weight:900;\">RADIO ESCANEO GPS:<\/label>\r\n                        <select id=\"discovery-radar-radius\" class=\"gym-input\" style=\"font-size:12px; padding:6px 10px; margin:0; width:auto; flex:1; background:#fff; color:#0f172a; border:1px solid #94a3b8; border-radius:8px;\">\r\n                            <option value=\"1\">1 km<\/option><option value=\"2\" selected>2 km<\/option><option value=\"5\">5 km<\/option>\r\n                            <option value=\"10\">10 km<\/option><option value=\"15\">15 km<\/option><option value=\"30\">30 km<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                    <div class=\"radar-grid-v69\" style=\"max-height:50vh; overflow-y:auto; padding-bottom:20px; padding-right:5px;\">\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Hospital o Clinica', this)\"><i class=\"fas fa-hospital\" style=\"color:#ef4444;\"><\/i><span style=\"color:#333;\">Urgencias<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Farmacia', this)\"><i class=\"fas fa-pills\" style=\"color:#10b981;\"><\/i><span style=\"color:#333;\">Farmacias<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Clinicas Veterinarias', this)\"><i class=\"fas fa-paw\" style=\"color:#f59e0b;\"><\/i><span style=\"color:#333;\">Veterinario<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Supermercado o Pulperia', this)\"><i class=\"fas fa-tint\" style=\"color:#0ea5e9;\"><\/i><span style=\"color:#333;\">Agua \/ Super<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Restaurantes', this)\"><i class=\"fas fa-utensils\" style=\"color:#f97316;\"><\/i><span style=\"color:#333;\">Comida<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Cafeterias', this)\"><i class=\"fas fa-coffee\" style=\"color:#78350f;\"><\/i><span style=\"color:#333;\">Caf\\u00e9<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Talleres de Bicicletas', this)\"><i class=\"fas fa-bicycle\" style=\"color:#475569;\"><\/i><span style=\"color:#333;\">Taller Bici<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Taller de Motos o Cuadras', this)\"><i class=\"fas fa-motorcycle\" style=\"color:#334155;\"><\/i><span style=\"color:#333;\">Mec\\u00e1nico<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Gasolineras', this)\"><i class=\"fas fa-gas-pump\" style=\"color:#64748b;\"><\/i><span style=\"color:#333;\">Gasolinera<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Delegaciones Policiales Fuerza Publica', this)\"><i class=\"fas fa-shield-alt\" style=\"color:#2563eb;\"><\/i><span style=\"color:#333;\">Seguridad<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Bancos y Cajeros ATM', this)\"><i class=\"fas fa-money-bill\" style=\"color:#14b8a6;\"><\/i><span style=\"color:#333;\">Cajero \/ ATM<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Zonas Wifi Gratis o Cibercafe', this)\"><i class=\"fas fa-wifi\" style=\"color:#8b5cf6;\"><\/i><span style=\"color:#333;\">Zona WiFi<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Zonas de Camping y Refugios', this)\"><i class=\"fas fa-campground\" style=\"color:#16a34a;\"><\/i><span style=\"color:#333;\">Camping<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Hoteles, Cabinas y Lodges', this)\"><i class=\"fas fa-hotel\" style=\"color:#1e293b;\"><\/i><span style=\"color:#333;\">Hospedaje<\/span><\/button>\r\n                        <button class=\"radar-btn-v69\" onclick=\"abrirRadarGoogleAtletaV70('Miradores Turisticos y Parques', this)\"><i class=\"fas fa-camera\" style=\"color:#ec4899;\"><\/i><span style=\"color:#333;\">Miradores<\/span><\/button>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div id=\"video-modal\" class=\"app-modal\" onclick=\"if(event.target===this) closeVideoModal()\">\r\n                <div class=\"modal-content video-modal-content\">\r\n                    <div class=\"video-close-bar\">\r\n                        <span style=\"font-weight:900; font-size:12px; letter-spacing:1px;\">?7?4?1?5 APEX PLAYER<\/span>\r\n                        <i class=\"fas fa-times\" style=\"font-size:20px; cursor:pointer;\" onclick=\"closeVideoModal()\"><\/i>\r\n                    <\/div>\r\n                    <div class=\"video-container\" id=\"yt-player-container\"><\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <audio id=\"tech-beep\" src=\"data:audio\/wav;base64,UklGRl9vT19XQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YU\" preload=\"auto\"><\/audio>\r\n\r\n            <script>\r\n            const apiUrl = 'https:\/\/sospuravida.com\/gym\/wp-json\/gym\/v1\/';\r\n            const ajaxUrl = 'https:\/\/sospuravida.com\/gym\/wp-admin\/admin-ajax.php';\r\n            let navHidden = false;\r\n            let lastScrollY = 0;\r\n            \r\n            window.addEventListener('scroll', () => {\r\n                let sy = window.scrollY;\r\n                let nav = document.getElementById('gym-nav');\r\n                if(!nav) return;\r\n                if(sy > lastScrollY && sy > 50) { if(!navHidden) { nav.classList.add('nav-hidden'); navHidden = true; } }\r\n                else { if(navHidden) { nav.classList.remove('nav-hidden'); navHidden = false; } }\r\n                lastScrollY = sy;\r\n            });\r\n\r\n            const ApexUX = {\r\n                haptic: (pattern) => { if(\"vibrate\" in navigator) navigator.vibrate(pattern); },\r\n                beep: () => { let a = document.getElementById('tech-beep'); if(a){ a.volume=0.2; a.currentTime=0; a.play().catch(e=>{}); } }, \r\n                toast: (msg) => {\r\n                    let t = document.createElement('div'); t.className = 'toast-msg'; t.innerHTML = msg;\r\n                    document.getElementById('toast-container').appendChild(t); setTimeout(() => { t.remove(); }, 3000);\r\n                },\r\n                scrollToTop: () => { window.scrollTo({top: 0, behavior: 'smooth'}); },\r\n                networkWatcher: () => { window.addEventListener('offline', () => { document.getElementById('offline-warning').style.display='block'; }); window.addEventListener('online', () => { document.getElementById('offline-warning').style.display='none'; }); },\r\n                setActiveNav: (btn) => { document.querySelectorAll('.nav-item').forEach(i=>i.classList.remove('active')); btn.classList.add('active'); },\r\n                setGreeting: () => {\r\n                    let h = new Date().getHours();\r\n                    let txt = \"Operaci\\u00f3n Activa\";\r\n                    if(h >= 5 && h < 12) txt = \"Buenos d\\u00edas, Atleta\";\r\n                    else if(h >= 12 && h < 19) txt = \"Buenas tardes, Atleta\";\r\n                    else txt = \"Recuperaci\\u00f3n Nocturna\";\r\n                    let g = document.getElementById('greeting-txt');\r\n                    if(g) g.innerHTML = txt;\r\n                }\r\n            };\r\n\r\n            document.addEventListener('DOMContentLoaded', function() { \r\n                ApexUX.networkWatcher(); \r\n                ApexUX.setGreeting();\r\n                checkSession(); \r\n                \r\n                let inactivityTime = function () {\r\n                    let time;\r\n                    window.onload = resetTimer; document.onmousemove = resetTimer; document.onkeypress = resetTimer; document.ontouchstart = resetTimer;\r\n                    function logout() { if(localStorage.getItem('gym_auth_token')) { localStorage.clear(); window.location.reload(); } }\r\n                    function resetTimer() { clearTimeout(time); time = setTimeout(logout, 3600000); } \r\n                };\r\n                inactivityTime();\r\n            });\r\n\r\n            function checkSession() { \r\n                const t=localStorage.getItem('gym_auth_token'); \r\n                if(t){\r\n                    document.getElementById('app-top-bar').style.display='block'; \r\n                    document.getElementById('gym-nav').style.display='flex'; \r\n                    renderRutina();\r\n                } else {\r\n                    document.getElementById('app-top-bar').style.display='none'; \r\n                    document.getElementById('gym-nav').style.display='none'; \r\n                    renderLogin();\r\n                } \r\n            }\r\n            function logoutApp() { if(confirm('\\u00bfCerrar sesi\\u00f3n?')){ localStorage.clear(); checkSession(); } }\r\n\r\n            function renderLogin() { \r\n                document.getElementById('gym-app-screen').innerHTML = `\r\n                <div style=\"display:flex; flex-direction:column; justify-content:center; min-height:80dvh; width:100%;\">\r\n                    <div style=\"text-align:center; font-size:60px; margin-bottom:20px; color:var(--primary); text-shadow:0 0 20px rgba(14,165,233,0.4);\"><i class=\"fas fa-fingerprint\"><\/i><\/div>\r\n                    <h2 style=\"text-align:center; margin-top:0; font-weight:900; color:var(--dark);\">LOGIN ATLETAS ELITE<\/h2>\r\n                    <p style=\"text-align:center; font-size:11px; color:#64748b; margin-top:-10px; margin-bottom:20px;\">Power by SOSPURAVIDA.COM<\/p>\r\n                    <form id=\"gym-login-form\" style=\"width:100%; max-width:350px; margin:0 auto;\">\r\n                        <input type=\"email\" id=\"u-email\" class=\"gym-input\" placeholder=\"Correo electr\\u00f3nico\" required>\r\n                        <input type=\"password\" id=\"u-pass\" class=\"gym-input\" placeholder=\"Contrase\\u00f1a\" required>\r\n                        <button type=\"submit\" class=\"gym-btn\" id=\"btn-login\" style=\"margin-top:20px;\">INGRESO DE ATLETA<\/button>\r\n                    <\/form>\r\n                <\/div>`; \r\n                document.getElementById('gym-login-form').addEventListener('submit', async (e) => { \r\n                    e.preventDefault(); const em=document.getElementById('u-email').value; const pa=document.getElementById('u-pass').value; \r\n                    let b = document.getElementById('btn-login'); b.innerHTML = '<i class=\"fas fa-circle-notch fa-spin\"><\/i>';\r\n                    try { \r\n                        let fd = new FormData(); fd.append('action', 'gym_app_login'); fd.append('email', em); fd.append('password', pa);\r\n                        const res=await fetch(ajaxUrl, {method:'POST', body:fd}); const data=await res.json(); \r\n                        if(data.success){ \r\n                            localStorage.setItem('gym_auth_token',data.data.token); \r\n                            localStorage.setItem('gym_user_name',data.data.socio.nombre); \r\n                            localStorage.setItem('gym_user_id',data.data.socio.id); \r\n                            checkSession(); \r\n                        } else { b.innerHTML = 'INGRESAR'; alert(data.data); } \r\n                    } catch(e){ b.innerHTML = 'INGRESAR'; alert('Error de Red'); } \r\n                }); \r\n            }\r\n\r\n            \/\/ ?0?4 V77: MOTOR T?0?9CTICO S.O.S (UNICODE SEGURO)\r\n            window.enviarAlertaSOSWA = async function(tipoAlerta, eventBtn) {\r\n                let btn = eventBtn ? eventBtn : document.getElementById('btn-main-sos');\r\n                let iconOrig = btn.innerHTML;\r\n                btn.innerHTML = '<i class=\"fas fa-satellite fa-spin\"><\/i> ENLAZANDO SAT\\u00c9LITE...';\r\n                ApexUX.haptic([500, 200, 500, 200, 1000]); \r\n\r\n                let batStr = \"Desconocida\";\r\n                try { if(navigator.getBattery) { let bat = await navigator.getBattery(); batStr = Math.round(bat.level * 100) + \"%\"; } } catch(e){}\r\n                let timeStr = new Date().toLocaleTimeString();\r\n\r\n                let procesarEnvio = (lat, lng) => {\r\n                    let mapsLink = (lat && lng) ? `https:\/\/www.google.com\/maps?q=${lat},${lng}` : 'Ubicaci\\u00f3n GPS no disponible.';\r\n                    let wazeLink = (lat && lng) ? `https:\/\/waze.com\/ul?ll=${lat},${lng}&navigate=yes` : 'No disponible.';\r\n                    \r\n                    let baseMsg = `\\uD83D\\uDEA8 *ALERTA DE EMERGENCIA S.O.S* \\uD83D\\uDEA8\\n\\nEstoy usando la App de Emergencias S.O.S. Necesito ayuda inmediata.\\n\\n*Situaci\\u00f3n Reportada:* ${tipoAlerta}\\n\\n*Mi Ubicaci\\u00f3n Exacta:* \\n\\uD83D\\uDCCD Google Maps: ${mapsLink}\\n\\uD83D\\uDE97 Waze: ${wazeLink}\\n\\n\\uD83D\\uDD52 Hora de Alerta: ${timeStr}\\n\\uD83D\\uDD0B Bater\\u00eda del M\\u00f3vil: ${batStr}\\n\\nPor favor, env\\u00eden ayuda r\\u00e1pido a estas coordenadas.`;\r\n                    \r\n                    let url = `https:\/\/wa.me\/?text=${encodeURIComponent(baseMsg)}`;\r\n                    btn.innerHTML = iconOrig;\r\n                    window.open(url, '_blank');\r\n                };\r\n\r\n                if (navigator.geolocation) {\r\n                    navigator.geolocation.getCurrentPosition(\r\n                        pos => { procesarEnvio(pos.coords.latitude, pos.coords.longitude); },\r\n                        err => {\r\n                            ApexUX.toast(\"\\u26A0\\uFE0F Error GPS de Alta Precisi\\u00f3n. Intentando modo b\\u00e1sico...\");\r\n                            navigator.geolocation.getCurrentPosition( pos2 => { procesarEnvio(pos2.coords.latitude, pos2.coords.longitude); }, err2 => { procesarEnvio(null, null); }, { enableHighAccuracy: false, timeout: 5000 } );\r\n                        },\r\n                        { enableHighAccuracy: true, timeout: 7000 }\r\n                    );\r\n                } else { procesarEnvio(null, null); }\r\n            };\r\n\r\n            let wakeLock = null;\r\n            async function requestWakeLock() { try { if ('wakeLock' in navigator) { wakeLock = await navigator.wakeLock.request('screen'); } } catch (err) { } }\r\n\r\n            \/\/ =========================================================================\r\n            \/\/ ?0?4 V77: MOTOR DE RUTINAS FULL MEDIA (MAGAZINE RENDERER)\r\n            \/\/ =========================================================================\r\n            let currentDayData = [];\r\n            let totalEjerDia = 0;\r\n            let checksDia = 0;\r\n\r\n            window.renderRutina = async function() {\r\n                document.getElementById('tb-level-badge').innerText = \"MARCAR PERSONAL TRAINER PRO\";\r\n                document.getElementById('gym-app-screen').innerHTML = `<div style=\"text-align:center; margin-top:50px;\"><i class=\"fas fa-circle-notch fa-spin\" style=\"font-size:30px; color:var(--primary);\"><\/i><br><br><span style=\"font-size:10px; color:#64748b;\">OBTENIENDO PROGRAMA...<\/span><\/div>`;\r\n                try {\r\n                    let fd = new FormData(); fd.append('action', 'gym_get_routine'); fd.append('socio_id', localStorage.getItem('gym_user_id'));\r\n                    let res = await fetch(ajaxUrl, { method: 'POST', body: fd });\r\n                    let data = await res.json();\r\n                    if(data.success) {\r\n                        \r\n                        let daysMap = ['Domingo','Lunes','Martes','Miercoles','Jueves','Viernes','Sabado'];\r\n                        let todayName = daysMap[new Date().getDay()];\r\n                        \r\n                        let meta = data.data.meta ? data.data.meta[0] : null;\r\n                        let headerHtml = '';\r\n                        if(meta) {\r\n                            headerHtml = `\r\n                                <div style=\"background:var(--card-bg); padding:15px; border-radius:15px; border:1px solid var(--border); box-shadow:0 4px 15px rgba(0,0,0,0.03); margin-bottom:15px; border-left:4px solid var(--primary);\">\r\n                                    <h3 style=\"margin:0 0 5px 0; font-size:16px; color:var(--dark); text-transform:uppercase;\">${meta.nombre}<\/h3>\r\n                                    ${meta.notas_rutina ? `<p style=\"font-size:11px; color:#64748b; margin:0;\"><i class=\"fas fa-info-circle\"><\/i> Coach: ${meta.notas_rutina}<\/p>` : ''}\r\n                                <\/div>\r\n                            `;\r\n                        }\r\n\r\n                        let trackerHtml = `\r\n                            <div class=\"progress-container\">\r\n                                <div style=\"display:flex; justify-content:space-between; font-size:11px; font-weight:900; color:#64748b;\">\r\n                                    <span>TU PROGRESO DIARIO<\/span>\r\n                                    <span id=\"tracker-text\">0 \/ 0<\/span>\r\n                                <\/div>\r\n                                <div class=\"progress-bar-bg\"><div class=\"progress-bar-fill\" id=\"tracker-fill\"><\/div><\/div>\r\n                            <\/div>\r\n                        `;\r\n\r\n                        let html = headerHtml + trackerHtml;\r\n                        totalEjerDia = 0; checksDia = 0;\r\n\r\n                        for(let dia in data.data.grupos) {\r\n                            let isToday = (dia === todayName);\r\n                            let displayStyle = isToday ? 'block' : 'none';\r\n                            let iconChevron = isToday ? 'fa-chevron-up' : 'fa-chevron-down';\r\n                            let bgDay = isToday ? 'background:linear-gradient(90deg, #e0f2fe, #f0f9ff); border-color:#bae6fd;' : '';\r\n\r\n                            html += `<div class=\"workout-day-header\" style=\"${bgDay}\" onclick=\"toggleWorkoutDay('${dia}', this)\">\r\n                                        <span>\\ud83d\\udcc5 ${dia.toUpperCase()} ${isToday ? '<span style=\"font-size:9px; background:var(--primary); color:white; padding:2px 6px; border-radius:10px; margin-left:5px;\">HOY<\/span>' : ''}<\/span>\r\n                                        <i class=\"fas ${iconChevron} day-chevron\"><\/i>\r\n                                     <\/div>`;\r\n                            \r\n                            html += `<div id=\"day-content-${dia}\" style=\"display:${displayStyle}; margin-bottom:20px;\">`;\r\n                            \r\n                            data.data.grupos[dia].forEach(e => {\r\n                                let isChecked = parseInt(e.completed) > 0;\r\n                                if(isToday) { totalEjerDia++; if(isChecked) checksDia++; }\r\n                                \r\n                                let chk = isChecked ? 'checked' : '';\r\n                                \r\n                                let thumb = e.thumbnail_url ? e.thumbnail_url : 'https:\/\/placehold.co\/100x100\/f1f5f9\/94a3b8?text=GYM';\r\n                                let videoBtn = '';\r\n                                if(e.video_url) {\r\n                                    videoBtn = `<button class=\"btn-play-video\" onclick=\"openVideoModal('${e.video_url}')\"><i class=\"fas fa-play-circle\" style=\"color:#ef4444; font-size:14px;\"><\/i> Ver Video<\/button>`;\r\n                                }\r\n\r\n                                \/\/ ?0?4 V77: Color Coding Muscular Din??mico\r\n                                let grupoClase = 'wb-group-default';\r\n                                let grp = e.grupo_muscular ? e.grupo_muscular.toLowerCase() : '';\r\n                                if(grp.includes('pecho')) grupoClase = 'wb-group-pecho';\r\n                                if(grp.includes('espalda')) grupoClase = 'wb-group-espalda';\r\n                                if(grp.includes('pierna')) grupoClase = 'wb-group-pierna';\r\n                                if(grp.includes('hombro')) grupoClase = 'wb-group-hombro';\r\n                                if(grp.includes('brazo')) grupoClase = 'wb-group-brazo';\r\n                                if(grp.includes('core')) grupoClase = 'wb-group-core';\r\n                                if(grp.includes('cardio')) grupoClase = 'wb-group-cardio';\r\n\r\n                                html += `\r\n                                <div class=\"workout-card\">\r\n                                    <div class=\"workout-card-top\">\r\n                                        <img decoding=\"async\" src=\"${thumb}\" class=\"workout-thumb\" onclick=\"if('${e.video_url}') openVideoModal('${e.video_url}')\">\r\n                                        <div class=\"workout-info\">\r\n                                            <h4 class=\"workout-title\">${e.nombre}<\/h4>\r\n                                            ${e.descripcion ? `<p class=\"workout-desc\">${e.descripcion}<\/p>` : ''}\r\n                                            <div class=\"workout-badges\">\r\n                                                <span class=\"w-badge wb-reps\"><i class=\"fas fa-sync-alt\"><\/i> ${e.series} x ${e.repeticiones}<\/span>\r\n                                                <span class=\"w-badge wb-rest\"><i class=\"fas fa-stopwatch\"><\/i> ${e.descanso_segundos}s<\/span>\r\n                                                <span class=\"w-badge ${grupoClase}\">${e.grupo_muscular}<\/span>\r\n                                            <\/div>\r\n                                        <\/div>\r\n                                    <\/div>\r\n                                    <div class=\"workout-actions\">\r\n                                        <div style=\"display:flex; align-items:center; gap:10px;\">\r\n                                            ${videoBtn}\r\n                                            <span class=\"w-badge wb-xp\" title=\"Puntos de Experiencia\"><i class=\"fas fa-star\"><\/i> 10 XP<\/span>\r\n                                        <\/div>\r\n                                        <div style=\"display:flex; align-items:center; gap:8px;\">\r\n                                            <span style=\"font-size:10px; font-weight:bold; color:#64748b;\">COMPLETADO<\/span>\r\n                                            <input type=\"checkbox\" class=\"workout-check\" ${chk} data-day=\"${dia}\" onclick=\"marcarEjercicio(${e.id}, this.checked, '${dia}')\">\r\n                                        <\/div>\r\n                                    <\/div>\r\n                                <\/div>`;\r\n                            });\r\n                            html += `<\/div>`;\r\n                        }\r\n                        \r\n                        document.getElementById('gym-app-screen').innerHTML = html;\r\n                        updateProgressTracker(); \r\n\r\n                    } else { document.getElementById('gym-app-screen').innerHTML = `<div style=\"text-align:center; color:#64748b; padding:40px; background:var(--card-bg); border-radius:15px; margin-top:50px;\">${data.data}<\/div>`; }\r\n                } catch(e) {}\r\n            }\r\n\r\n            window.toggleWorkoutDay = function(diaId, headerElement) {\r\n                ApexUX.haptic(10);\r\n                let content = document.getElementById('day-content-' + diaId);\r\n                let icon = headerElement.querySelector('.day-chevron');\r\n                if(content.style.display === 'none') {\r\n                    content.style.display = 'block';\r\n                    icon.classList.remove('fa-chevron-down'); icon.classList.add('fa-chevron-up');\r\n                } else {\r\n                    content.style.display = 'none';\r\n                    icon.classList.remove('fa-chevron-up'); icon.classList.add('fa-chevron-down');\r\n                }\r\n            }\r\n\r\n            window.marcarEjercicio = async function(id, done, dia) {\r\n                ApexUX.haptic(done ? [50] : [30,30]);\r\n                \r\n                let daysMap = ['Domingo','Lunes','Martes','Miercoles','Jueves','Viernes','Sabado'];\r\n                if(dia === daysMap[new Date().getDay()]) {\r\n                    if(done) checksDia++; else checksDia--;\r\n                    updateProgressTracker();\r\n                }\r\n\r\n                let fd = new FormData(); fd.append('action', 'gym_mark_progress'); fd.append('socio_id', localStorage.getItem('gym_user_id')); fd.append('detail_id', id); fd.append('done', done?1:0);\r\n                fetch(ajaxUrl, { method: 'POST', body: fd });\r\n            }\r\n\r\n            function updateProgressTracker() {\r\n                let text = document.getElementById('tracker-text');\r\n                let fill = document.getElementById('tracker-fill');\r\n                if(!text || !fill) return;\r\n\r\n                if(totalEjerDia === 0) {\r\n                    text.innerText = \"D\\u00eda Libre o Sin Asignar\";\r\n                    fill.style.width = \"0%\";\r\n                    return;\r\n                }\r\n\r\n                let pct = Math.round((checksDia \/ totalEjerDia) * 100);\r\n                text.innerText = `${checksDia} \/ ${totalEjerDia} Ejercicios`;\r\n                fill.style.width = `${pct}%`;\r\n\r\n                if(pct === 100 && checksDia > 0) {\r\n                    fill.style.background = \"#10b981\"; \r\n                    if(typeof confetti !== 'undefined') confetti({particleCount: 50, spread: 60, origin: { y: 0.2 }, colors:['#00E5FF', '#10b981']});\r\n                } else {\r\n                    fill.style.background = \"var(--primary)\";\r\n                }\r\n            }\r\n\r\n            window.openVideoModal = function(url) {\r\n                if(!url) return;\r\n                ApexUX.haptic(20);\r\n                \r\n                let videoId = \"\";\r\n                let regex = \/(?:youtube\\.com\\\/(?:[^\\\/]+\\\/.+\\\/|(?:v|e(?:mbed)?)\\\/|.*[?&]v=)|youtu\\.be\\\/)([^\"&?\\\/\\s]{11})\/i;\r\n                let match = url.match(regex);\r\n                if(match && match[1]) { videoId = match[1]; }\r\n                else { window.open(url, '_blank'); return; } \r\n\r\n                let embedUrl = `https:\/\/www.youtube.com\/embed\/${videoId}?autoplay=1&rel=0`;\r\n                document.getElementById('yt-player-container').innerHTML = `<iframe src=\"${embedUrl}\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>`;\r\n                document.getElementById('video-modal').style.display = 'flex';\r\n            }\r\n\r\n            window.closeVideoModal = function() {\r\n                document.getElementById('video-modal').style.display = 'none';\r\n                document.getElementById('yt-player-container').innerHTML = ''; \r\n            }\r\n\r\n            \/\/ =========================================================================\r\n            \/\/ M?0?7DULOS GPS, DIETA Y CLASES MANTENIDOS INTACTOS DE LA V76\r\n            \/\/ =========================================================================\r\n\r\n            let atletaMapInstance = null; let atletaMarker = null; let atletaWatchId = null; let atletaRouteLine = null; let atletaIsTracking = false; let startTime = null; let timerInterval = null; let atletaPoiMarkers = []; let accuracyCircle = null; window.currentMultirutas = []; window.currentMultipois = []; window.activeRouteIndex = 0;\r\n\r\n            window.renderRutas = async function() { \r\n                let s = document.getElementById('gym-app-screen');\r\n                document.getElementById('tb-level-badge').innerText = \"MISIONES GPS SATELITAL STARLINK & SOSPURAVIDA.COM\";\r\n                s.innerHTML = `<div style=\"text-align:center; margin-top:50px;\"><i class=\"fas fa-circle-notch fa-spin\" style=\"font-size:30px; color:var(--primary);\"><\/i><br><br><span style=\"font-size:10px; color:#888;\">OBTENIENDO MISIONES...<\/span><\/div>`;\r\n                try {\r\n                    let fd = new FormData(); fd.append('action', 'gym_get_my_route'); fd.append('socio_id', localStorage.getItem('gym_user_id'));\r\n                    let res = await fetch(ajaxUrl, { method: 'POST', body: fd });\r\n                    let data = await res.json();\r\n                    if(data.success) {\r\n                        window.currentMultirutas = data.data.multirutas; window.currentMultipois = data.data.multipois;\r\n                        let sliderHtml = '';\r\n                        if(window.currentMultirutas.length > 1) {\r\n                            sliderHtml = `<div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:5px;\"><span style=\"font-size:10px; color:#64748b; font-weight:bold;\"><i class=\"fas fa-tasks\"><\/i> TIENES ${window.currentMultirutas.length} MISIONES ACTIVAS<\/span><\/div><div style=\"display:flex; overflow-x:auto; gap:10px; margin-bottom:15px; padding-bottom:10px;\">`;\r\n                            window.currentMultirutas.forEach((r, i) => { let fDate = r.fecha_programada ? r.fecha_programada.substring(5,10) : ''; sliderHtml += `<button id=\"btn-mission-${i}\" onclick=\"swapSpecificMission(${i})\" class=\"gym-btn mission-carousel-btn ${i===0 ? 'active' : 'inactive'}\"><div style=\"font-size:9px; opacity:0.8;\">Misi\\u00f3n ${fDate}<\/div><div style=\"font-size:12px; font-weight:900; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:120px;\">${r.nombre}<\/div><\/button>`; });\r\n                            sliderHtml += `<\/div>`;\r\n                        }\r\n                        let route = data.data.ruta; let kcalStr = route.calorias_estimadas ? `<span style=\"color:#ef4444;\"><i class=\"fas fa-fire\"><\/i> ${route.calorias_estimadas} kcal<\/span>` : ''; let elevStr = route.desnivel_positivo ? `<span style=\"color:#8b5cf6;\"><i class=\"fas fa-mountain\"><\/i> +${route.desnivel_positivo}m<\/span>` : '';\r\n                        s.innerHTML = `<div style=\"text-align:center; font-size:9px; color:#64748b; font-weight:900; letter-spacing:1px; margin-bottom:10px;\">SISTEMA DE ENTRENAMIENTO DE ALTO RENDIMINEDTO<\/div>${sliderHtml}<button onclick=\"document.getElementById('discovery-modal').style.display='flex';\" class=\"gym-btn\" style=\"margin-bottom:15px; background:linear-gradient(90deg, #0ea5e9, #0284c7); color:white; font-size:12px; padding:12px;\"><i class=\"fas fa-radar\"><\/i> ABRIR RADAR DE RECOMENDACIONES ARCKANGEL<\/button><div class=\"gym-card glass-chart-container route-info-card\" style=\"padding:15px; margin-bottom:15px; position:relative;\"><div class=\"route-badge\"><i class=\"fas fa-check-circle\"><\/i> RUTA VERIFICADA<\/div><h3 id=\"hud-route-name\" style=\"margin:0 0 10px 0; color:var(--text); font-size:18px;\">${route.nombre}<\/h3><div style=\"display:flex; justify-content:space-between; font-size:11px; color:#888; background:rgba(0,0,0,0.05); padding:10px; border-radius:8px;\"><div style=\"display:flex; flex-direction:column; align-items:center; gap:5px;\"><span style=\"font-weight:bold; font-size:9px;\">DISTANCIA<\/span><strong style=\"color:var(--text); font-size:14px;\"><span id=\"hud-route-dist\">${route.distancia_km}<\/span> km<\/strong><\/div><div style=\"display:flex; flex-direction:column; align-items:center; gap:5px;\"><span style=\"font-weight:bold; font-size:9px;\">NIVEL<\/span><strong style=\"color:var(--text); font-size:14px;\" id=\"hud-route-diff\">${route.dificultad}<\/strong><\/div><div style=\"display:flex; flex-direction:column; align-items:center; gap:5px;\"><span style=\"font-weight:bold; font-size:9px;\">IMPACTO EST.<\/span><div style=\"display:flex; gap:5px; font-weight:900; font-size:12px;\" id=\"hud-route-impact\">${kcalStr} ${elevStr}<\/div><\/div><\/div><\/div><div style=\"height:450px; border-radius:20px; overflow:hidden; border:2px solid var(--primary); position:relative; box-shadow:0 10px 30px rgba(14,165,233,0.15);\" id=\"map-app-view\"><button onclick=\"toggleMapTopoMode()\" id=\"btn-topo-toggle\" class=\"btn-map-control\" title=\"Mapa Topogr??fico\"><i class=\"fas fa-layer-group\"><\/i><\/button><button onclick=\"togglePoiLayer()\" id=\"btn-poi-toggle\" class=\"btn-map-control\" title=\"Ocultar Patrocinadores\"><i class=\"fas fa-map-pin\"><\/i><\/button><div id=\"tactical-timer\" style=\"position:absolute; top:15px; left:15px; z-index:900; background:rgba(255,255,255,0.95); color:var(--primary); font-family:monospace; font-size:18px; font-weight:900; padding:5px 15px; border-radius:10px; border:1px solid var(--primary); display:none; box-shadow:0 4px 15px rgba(0,0,0,0.1);\">00:00:00<\/div><div style=\"position:absolute; bottom:15px; left:15px; z-index:900; background:rgba(255,255,255,0.95); color:var(--text); font-size:10px; padding:8px 12px; border-radius:12px; display:flex; gap:15px; border:1px solid var(--border); backdrop-filter:blur(5px); box-shadow:0 4px 15px rgba(0,0,0,0.1);\"><div><span style=\"color:#64748b; font-weight:bold;\">A INICIO<\/span><br><strong style=\"font-size:14px; color:#10b981;\"><span id=\"hud-dist-start\">Calculando...<\/span><\/strong><\/div><\/div><button onclick=\"iniciarNavegacionNativa()\" id=\"btn-maximize-map\" class=\"btn-map-control\" title=\"Iniciar Misi??n\"><i class=\"fas fa-play\"><\/i><\/button><button onclick=\"recentrarGPS()\" id=\"btn-center-gps\" class=\"btn-map-control\" title=\"Centrar GPS\"><i class=\"fas fa-crosshairs\"><\/i><\/button><\/div><div style=\"text-align:center; margin-top:15px;\"><button class=\"gym-btn\" style=\"background:var(--card-bg); color:var(--text); width:auto; display:inline-flex; padding:8px 15px; font-size:10px; border:1px solid var(--primary);\" onclick=\"reverseAthleteRoute()\"><i class=\"fas fa-exchange-alt\"><\/i> Invertir Sentido (Ida\/Vuelta)<\/button><\/div>`;\r\n                        setTimeout(() => {\r\n                            atletaMapInstance = L.map('map-app-view', {zoomControl: false}).setView([9.864440, -83.919530], 14);\r\n                            let layerLight = L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/rastertiles\/voyager\/{z}\/{x}\/{y}{r}.png', {maxZoom:19}); let layerTopo = L.tileLayer('https:\/\/{s}.tile.opentopomap.org\/{z}\/{x}\/{y}.png', {maxZoom:17});\r\n                            let savedLayer = localStorage.getItem('gym_map_layer') || 'light';\r\n                            if(savedLayer === 'topo') { layerTopo.addTo(atletaMapInstance); atletaMapInstance.currentLayer = 'topo'; document.getElementById('btn-topo-toggle').style.background = '#10b981'; document.getElementById('btn-topo-toggle').style.color = '#fff'; } \r\n                            else { layerLight.addTo(atletaMapInstance); atletaMapInstance.currentLayer = 'light'; }\r\n                            atletaMapInstance.layerLight = layerLight; atletaMapInstance.layerTopo = layerTopo;\r\n                            swapSpecificMission(0); startBackgroundGPS();\r\n                            atletaMapInstance.on('dragstart', function() { if(atletaIsTracking) document.getElementById('btn-center-gps').style.display = 'flex'; });\r\n                        }, 300);\r\n                    } else { s.innerHTML = `<div style=\"text-align:center; color:#64748b; padding:40px; background:var(--card-bg); border-radius:15px; margin-top:50px;\">Sin misiones asignadas.<\/div>`; }\r\n                } catch(e) {}\r\n            }\r\n\r\n            window.swapSpecificMission = function(index) {\r\n                if(!window.currentMultirutas[index]) return; window.activeRouteIndex = index; let route = window.currentMultirutas[index];\r\n                document.querySelectorAll('.mission-carousel-btn').forEach((b, i) => { if(i === index) { b.classList.remove('inactive'); b.classList.add('active'); } else { b.classList.remove('active'); b.classList.add('inactive'); } });\r\n                document.getElementById('hud-route-name').innerText = route.nombre; document.getElementById('hud-route-dist').innerText = route.distancia_km; document.getElementById('hud-route-diff').innerText = route.dificultad;\r\n                let kcalStr = route.calorias_estimadas ? `<span style=\"color:#ef4444;\"><i class=\"fas fa-fire\"><\/i> ${route.calorias_estimadas} kcal<\/span>` : ''; let elevStr = route.desnivel_positivo ? `<span style=\"color:#8b5cf6;\"><i class=\"fas fa-mountain\"><\/i> +${route.desnivel_positivo}m<\/span>` : ''; document.getElementById('hud-route-impact').innerHTML = `${kcalStr} ${elevStr}`;\r\n                if(atletaRouteLine) { atletaMapInstance.removeLayer(atletaRouteLine); } atletaPoiMarkers.forEach(m => atletaMapInstance.removeLayer(m)); atletaPoiMarkers = [];\r\n                atletaMapInstance.eachLayer(function (layer) { if (layer instanceof L.CircleMarker && layer !== accuracyCircle && layer !== atletaMarker) { atletaMapInstance.removeLayer(layer); } });\r\n                if(route.geojson_data) { let coords = JSON.parse(route.geojson_data); atletaRouteLine = L.polyline(coords, {color: '#0ea5e9', weight: 6, opacity: 0.9}).addTo(atletaMapInstance); atletaMapInstance.flyToBounds(atletaRouteLine.getBounds(), {padding:[30,30], duration: 1.5}); L.circleMarker(coords[0], {color:'#10b981', radius:6, fillOpacity:1}).bindPopup(\"INICIO\").addTo(atletaMapInstance); L.circleMarker(coords[coords.length-1], {color:'#ef4444', radius:6, fillOpacity:1}).bindPopup(\"META\").addTo(atletaMapInstance); }\r\n                let specificPois = window.currentMultipois.filter(p => p.ruta_id == route.id);\r\n                if(specificPois.length > 0) { specificPois.forEach(p => { let icoHtml = '<i class=\"fas fa-map-marker-alt\"><\/i>'; let bColor = '#f59e0b'; if(p.tipo.includes('hidratacion')) { icoHtml = '<i class=\"fas fa-tint\"><\/i>'; bColor = '#0ea5e9'; } if(p.tipo.includes('hospital') || p.tipo.includes('policia')) { icoHtml = '<i class=\"fas fa-shield-alt\"><\/i>'; bColor = '#ef4444'; } if(p.tipo.includes('sponsor')) { icoHtml = '<i class=\"fas fa-gem\"><\/i>'; bColor = '#8b5cf6'; } let icon = L.divIcon({ className: 'custom-pin', html: `<div style=\"font-size:20px; color:${bColor}; text-shadow:0 2px 5px rgba(0,0,0,0.2);\">${icoHtml}<\/div>`, iconSize: [20, 20] }); let marker = L.marker([parseFloat(p.lat), parseFloat(p.lng)], {icon: icon, interactive: true}).bindPopup(`<b>${p.nombre}<\/b><br><small>${p.tipo}<\/small>`).addTo(atletaMapInstance); atletaPoiMarkers.push(marker); }); }\r\n                if(atletaIsTracking) iniciarNavegacionNativa(); \r\n            }\r\n\r\n            window.abrirRadarGoogleAtletaV70 = function(tipo_lugar, btnElement) {\r\n                let center = null; if(atletaMarker) { center = atletaMarker.getLatLng(); } else if (atletaRouteLine && atletaRouteLine.getLatLngs().length > 0) { center = atletaRouteLine.getLatLngs()[0]; ApexUX.toast(\"Usando inicio de misi\\u00f3n. Activa GPS para mayor precisi\\u00f3n.\"); } else { if(navigator.geolocation) { let iconOrig = btnElement.innerHTML; btnElement.innerHTML = '<i class=\"fas fa-spinner fa-spin\" style=\"color:#0ea5e9; font-size:24px; margin-bottom:8px;\"><\/i><span>...<\/span>'; navigator.geolocation.getCurrentPosition(pos => { let rad = document.getElementById('discovery-radar-radius') ? document.getElementById('discovery-radar-radius').value : 2; let zl = '15z'; if(rad=='1') zl='16z'; if(rad=='5') zl='14z'; if(rad=='10') zl='12z'; if(rad=='15') zl='11z'; if(rad=='30') zl='10z'; let q = encodeURIComponent(tipo_lugar + \" cerca de mi\"); let u = `https:\/\/www.google.com\/maps\/search\/${q}\/@${pos.coords.latitude.toFixed(6)},${pos.coords.longitude.toFixed(6)},${zl}`; window.open(u, '_blank'); btnElement.innerHTML = iconOrig; }, err => { ApexUX.toast(\"?7?2?1?5 Sin ubicaci\\u00f3n GPS. Enciende tu ubicaci\\u00f3n.\"); btnElement.innerHTML = iconOrig; }, { timeout: 3000 }); return; } }\r\n                if(!center) return; let radioKm = document.getElementById('discovery-radar-radius') ? document.getElementById('discovery-radar-radius').value : 2; let zoomNivel = '15z'; if(radioKm == '1') zoomNivel = '16z'; if(radioKm == '5') zoomNivel = '14z'; if(radioKm == '10') zoomNivel = '12z'; if(radioKm == '15') zoomNivel = '11z'; if(radioKm == '30') zoomNivel = '10z'; let query = encodeURIComponent(tipo_lugar + \" cerca de mi\"); let url = `https:\/\/www.google.com\/maps\/search\/${query}\/@${center.lat.toFixed(6)},${center.lng.toFixed(6)},${zoomNivel}`; let iconOrig = btnElement.innerHTML; btnElement.innerHTML = '<i class=\"fas fa-spinner fa-spin\" style=\"color:#0ea5e9; font-size:24px; margin-bottom:8px;\"><\/i><span>...<\/span>'; ApexUX.haptic(50); setTimeout(() => { window.open(url, '_blank'); btnElement.innerHTML = iconOrig; }, 600);\r\n            }\r\n\r\n            window.toggleMapTopoMode = function() { if(!atletaMapInstance) return; ApexUX.haptic(20); if(atletaMapInstance.currentLayer === 'light') { atletaMapInstance.removeLayer(atletaMapInstance.layerLight); atletaMapInstance.layerTopo.addTo(atletaMapInstance); atletaMapInstance.currentLayer = 'topo'; localStorage.setItem('gym_map_layer', 'topo'); document.getElementById('btn-topo-toggle').style.background = '#10b981'; document.getElementById('btn-topo-toggle').style.color = '#fff'; } else { atletaMapInstance.removeLayer(atletaMapInstance.layerTopo); atletaMapInstance.layerLight.addTo(atletaMapInstance); atletaMapInstance.currentLayer = 'light'; localStorage.setItem('gym_map_layer', 'light'); document.getElementById('btn-topo-toggle').style.background = 'var(--card-bg)'; document.getElementById('btn-topo-toggle').style.color = 'var(--text)'; } }\r\n            let isPoiLayerVisible = true; window.togglePoiLayer = function() { if(!atletaMapInstance) return; ApexUX.haptic(20); isPoiLayerVisible = !isPoiLayerVisible; atletaPoiMarkers.forEach(m => { if(isPoiLayerVisible) atletaMapInstance.addLayer(m); else atletaMapInstance.removeLayer(m); }); let btn = document.getElementById('btn-poi-toggle'); if(isPoiLayerVisible) { btn.style.background = 'var(--card-bg)'; btn.style.color = 'var(--text)'; } else { btn.style.background = '#ef4444'; btn.style.color = 'white'; } }\r\n            window.reverseAthleteRoute = function() { if(!atletaRouteLine) return; ApexUX.haptic(30); let coords = atletaRouteLine.getLatLngs(); coords.reverse(); atletaRouteLine.setLatLngs(coords); ApexUX.toast(\"Sentido de ruta invertido.\"); }\r\n            function startBackgroundGPS() { if(!navigator.geolocation) { return; } atletaWatchId = navigator.geolocation.watchPosition(pos => { let lat = pos.coords.latitude; let lng = pos.coords.longitude; let acc = pos.coords.accuracy; if(!atletaMarker) { let icon = L.divIcon({ className: 'gps-pulse', html: '<div class=\"gps-pulse-marker\" style=\"width:16px; height:16px;\"><\/div>', iconSize: [16, 16] }); atletaMarker = L.marker([lat, lng], {icon: icon, zIndexOffset: 1000}).addTo(atletaMapInstance); accuracyCircle = L.circle([lat, lng], { radius: acc, color: '#0ea5e9', weight: 1, fillColor: '#0ea5e9', fillOpacity: 0.1, className: 'gps-accuracy-halo' }).addTo(atletaMapInstance); } else { atletaMarker.setLatLng([lat, lng]); if(accuracyCircle) { accuracyCircle.setLatLng([lat, lng]); accuracyCircle.setRadius(acc); } } if(atletaIsTracking) { atletaMapInstance.panTo([lat, lng]); } if(atletaRouteLine) { let startPoint = atletaRouteLine.getLatLngs()[0]; let userPoint = L.latLng(lat, lng); let distMeters = userPoint.distanceTo(startPoint); let distStr = \"\"; if(distMeters > 1000) { distStr = (distMeters\/1000).toFixed(1) + \" km\"; } else { distStr = Math.round(distMeters) + \" mts\"; } let distEl = document.getElementById('hud-dist-start'); if(distEl) distEl.innerText = distStr; } }, err => { }, { enableHighAccuracy: true, maximumAge: 5000 }); }\r\n            window.iniciarNavegacionNativa = function() { let btn = document.getElementById('btn-maximize-map'); if(!atletaIsTracking) { atletaIsTracking = true; ApexUX.haptic([50, 100, 50]); btn.innerHTML = '<i class=\"fas fa-stop\"><\/i>'; btn.style.background = '#ef4444'; btn.style.color = '#fff'; document.getElementById('tactical-timer').style.display = 'block'; startTacticalTimer(); requestWakeLock(); if(atletaMarker) { atletaMapInstance.flyTo(atletaMarker.getLatLng(), 17, {animate: true, duration: 1}); } else { ApexUX.toast(\"Buscando se\\u00f1al satelital...\"); } } else { atletaIsTracking = false; ApexUX.haptic(100); btn.innerHTML = '<i class=\"fas fa-play\"><\/i>'; btn.style.background = 'var(--primary)'; btn.style.color = '#fff'; document.getElementById('btn-center-gps').style.display = 'none'; stopTacticalTimer(); if (wakeLock !== null) { wakeLock.release().then(() => { wakeLock = null; }); } if(atletaRouteLine) { atletaMapInstance.fitBounds(atletaRouteLine.getBounds(), {padding:[30,30]}); } } }\r\n            window.recentrarGPS = function() { if(atletaMarker) { atletaMapInstance.panTo(atletaMarker.getLatLng()); document.getElementById('btn-center-gps').style.display = 'none'; ApexUX.haptic(20); } }\r\n            function startTacticalTimer() { if(startTime) return; startTime = Date.now(); let display = document.getElementById('tactical-timer'); timerInterval = setInterval(() => { let diff = Date.now() - startTime; let h = Math.floor(diff \/ 3600000); let m = Math.floor((diff % 3600000) \/ 60000); let s = Math.floor((diff % 60000) \/ 1000); h = (h < 10) ? \"0\" + h : h; m = (m < 10) ? \"0\" + m : m; s = (s < 10) ? \"0\" + s : s; display.innerText = `${h}:${m}:${s}`; }, 1000); }\r\n            function stopTacticalTimer() { clearInterval(timerInterval); startTime = null; }\r\n\r\n            window.renderClases = async function() { document.getElementById('tb-level-badge').innerText = \"RESERVA TU CLASE CON UN CLIC\"; document.getElementById('gym-app-screen').innerHTML = `<div style=\"text-align:center; margin-top:50px;\"><i class=\"fas fa-circle-notch fa-spin\" style=\"font-size:30px; color:var(--primary);\"><\/i><br><br><span style=\"font-size:10px; color:#64748b;\">BUSCANDO CLASES...<\/span><\/div>`; try { let fd = new FormData(); fd.append('action', 'gym_get_classes'); fd.append('socio_id', localStorage.getItem('gym_user_id')); let res = await fetch(ajaxUrl, { method: 'POST', body: fd }); let data = await res.json(); if(data.success && data.data.length > 0) { let html = ''; data.data.forEach(c => { let btnTxt = c.reservado ? 'RESERVADO' : (c.lleno ? 'LLENO' : 'RESERVAR'); let btnCol = c.reservado ? '#10b981' : (c.lleno ? '#ef4444' : 'var(--primary)'); html += `<div class=\"gym-card glass-chart-container\" style=\"padding:15px; margin-bottom:10px;\"><div style=\"display:flex; justify-content:space-between; align-items:center; border-bottom:1px solid var(--border); padding-bottom:10px; margin-bottom:10px;\"><div><strong style=\"color:var(--text); font-size:14px;\">${c.nombre}<\/strong><br><span style=\"font-size:10px; color:#64748b;\">${c.fecha_fmt} - ${c.hora_fmt}<\/span><\/div><div style=\"text-align:right;\"><span style=\"font-size:10px; color:var(--text); background:var(--bg); padding:3px 6px; border-radius:6px; border:1px solid var(--border);\">Cupo: ${c.ocupados}\/${c.cupo}<\/span><\/div><\/div><button onclick=\"reservarClase(${c.id}, '${c.reservado?'cancel':''}')\" class=\"gym-btn\" style=\"padding:10px; font-size:12px; background:${btnCol}; color:${c.lleno?'white':'#fff'};\" ${c.lleno&&!c.reservado?'disabled':''}>${btnTxt}<\/button><\/div>`; }); document.getElementById('gym-app-screen').innerHTML = html; } else { document.getElementById('gym-app-screen').innerHTML = `<div style=\"text-align:center; color:#64748b; padding:40px; background:var(--card-bg); border-radius:15px; margin-top:50px;\">No hay clases programadas hoy.<\/div>`; } } catch(e) {} }\r\n            window.reservarClase = async function(id, act) { ApexUX.haptic(30); let fd = new FormData(); fd.append('action', 'gym_book_class'); fd.append('socio_id', localStorage.getItem('gym_user_id')); fd.append('class_id', id); fd.append('act', act); let res = await fetch(ajaxUrl, { method: 'POST', body: fd }); let data = await res.json(); ApexUX.toast(data.data); renderClases(); }\r\n            \r\n            window.renderNutri = async function() { document.getElementById('tb-level-badge').innerText = \"NUTRICI\\u00d3N\"; document.getElementById('gym-app-screen').innerHTML = `<div style=\"text-align:center; margin-top:50px;\"><i class=\"fas fa-circle-notch fa-spin\" style=\"font-size:30px; color:var(--primary);\"><\/i><br><br><span style=\"font-size:10px; color:#64748b;\">CARGANDO DIETA...<\/span><\/div>`; try { let fd = new FormData(); fd.append('action', 'gym_get_diet'); fd.append('socio_id', localStorage.getItem('gym_user_id')); let res = await fetch(ajaxUrl, { method: 'POST', body: fd }); let data = await res.json(); if(data.success) { let html = `<div style=\"margin-bottom:20px; text-align:center;\"><h3 style=\"color:var(--text); font-weight:900; margin:0;\">${data.data.meta.nombre}<\/h3><span style=\"font-size:11px; background:var(--card-bg); padding:3px 8px; border-radius:10px; color:var(--primary); border:1px solid var(--primary);\">${data.data.meta.calorias_totales} Kcal Diarias<\/span><\/div>`; data.data.comidas.forEach(c => { html += `<div class=\"gym-card glass-chart-container\" style=\"padding:15px; margin-bottom:10px; border-left:4px solid var(--primary);\"><strong style=\"color:var(--text); font-size:14px;\">${c.comida}<\/strong><p style=\"font-size:12px; color:#64748b; margin:5px 0 0 0;\">${c.descripcion_alimentos}<\/p><\/div>`; }); document.getElementById('gym-app-screen').innerHTML = html; } else { document.getElementById('gym-app-screen').innerHTML = `<div style=\"text-align:center; color:#64748b; padding:40px; background:var(--card-bg); border-radius:15px; margin-top:50px;\">${data.data}<\/div>`; } } catch(e) {} }\r\n\r\n            window.switchView = function(view, btnElement) { \r\n                if(atletaWatchId) { navigator.geolocation.clearWatch(atletaWatchId); atletaWatchId = null; atletaMarker = null; stopTacticalTimer(); }\r\n                if(wakeLock !== null) { wakeLock.release().then(() => { wakeLock = null; }); }\r\n                \r\n                if(btnElement) { ApexUX.setActiveNav(btnElement); }\r\n                if(view==='rutina') { renderRutina(); }\r\n                else if(view==='clases') { renderClases(); }\r\n                else if(view==='nutri') { renderNutri(); }\r\n                else if(view==='rutas') { renderRutas(); }\r\n                ApexUX.scrollToTop();\r\n            };\r\n            <\/script>\r\n            \n<p><\/p>\n<\/div><\/section><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/sospuravida.com\/gym\/wp-json\/wp\/v2\/pages\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sospuravida.com\/gym\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sospuravida.com\/gym\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sospuravida.com\/gym\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sospuravida.com\/gym\/wp-json\/wp\/v2\/comments?post=6"}],"version-history":[{"count":4,"href":"https:\/\/sospuravida.com\/gym\/wp-json\/wp\/v2\/pages\/6\/revisions"}],"predecessor-version":[{"id":852,"href":"https:\/\/sospuravida.com\/gym\/wp-json\/wp\/v2\/pages\/6\/revisions\/852"}],"wp:attachment":[{"href":"https:\/\/sospuravida.com\/gym\/wp-json\/wp\/v2\/media?parent=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}