{"id":6973,"date":"2026-06-27T22:06:11","date_gmt":"2026-06-27T22:06:11","guid":{"rendered":"https:\/\/clubfreestylebjj.com\/?page_id=6973"},"modified":"2026-07-13T18:39:30","modified_gmt":"2026-07-13T18:39:30","slug":"salesianos-paseo","status":"publish","type":"page","link":"https:\/\/clubfreestylebjj.com\/index.php\/salesianos-paseo\/","title":{"rendered":"Salesianos Paseo &#8211; BJJ extraescolar"},"content":{"rendered":"\n\n<div class=\"fsbjj\"><header class=\"fs-header-v3\">\n  <div class=\"fs-header-v3-inner\">\n    <a class=\"fs-header-v3-brand\" href=\"https:\/\/clubfreestylebjj.com\/\">\n      <img decoding=\"async\" src=\"https:\/\/clubfreestylebjj.com\/wp-content\/uploads\/2026\/06\/club-free-style-bjj-logo-dark-nav-transparent-1000.png\" alt=\"Club Free Style BJJ\">\n      <span>Club Free Style BJJ<\/span>\n    <\/a>\n    <details class=\"fs-header-v3-menu\">\n      <summary><span class=\"fs-header-v3-bars\" aria-hidden=\"true\"><i><\/i><i><\/i><i><\/i><\/span><span>Menu<\/span><\/summary>\n      <nav class=\"fs-header-v3-panel\" aria-label=\"Menu principal\">\n        <a href=\"https:\/\/clubfreestylebjj.com\/\">Inicio<\/a>\n        <details class=\"fs-header-v3-branch\">\n          <summary>Clases<\/summary>\n          <span class=\"fs-header-v3-label\">Colegios<\/span>\n          <a href=\"https:\/\/clubfreestylebjj.com\/index.php\/salesianos-paseo\/\">Salesianos Paseo<\/a>\n          <a href=\"https:\/\/clubfreestylebjj.com\/index.php\/san-buenaventura\/\">San Buenaventura<\/a>\n        <\/details>\n        <details class=\"fs-header-v3-branch\">\n          <summary>Proyecto<\/summary>\n          <a href=\"https:\/\/clubfreestylebjj.com\/index.php\/liga-escolar-bjj\/\">Liga escolar<\/a>\n        <\/details>\n        <a href=\"https:\/\/clubfreestylebjj.com\/index.php\/campeonatos\/\">Campeonatos<\/a>\n        <a href=\"https:\/\/clubfreestylebjj.com\/index.php\/tienda\/\">Tienda<\/a>\n        <a href=\"https:\/\/clubfreestylebjj.com\/index.php\/contacto\/\">Contacto<\/a>\n      <\/nav>\n    <\/details>\n  <\/div>\n<\/header>\n<div class=\"fs-header-v3-spacer\" aria-hidden=\"true\"><\/div><section class=\"fs-page-hero\" style=\"--fs-hero-bg:url('https:\/\/clubfreestylebjj.com\/wp-content\/uploads\/2026\/06\/club-free-style-bjj-salesianos-tatami-ultra-2400x1400-1.webp')\"><div class=\"fs-wrap\"><div class=\"fs-breadcrumb\">Salesianos Paseo<\/div><h1>BJJ en Salesianos San Miguel del Arcangel.<\/h1><p>Centro operativo del proyecto extraescolar y sede de entrenamiento para adultos, con tatami amplio y grupos diferenciados.<\/p><\/div><\/section>\n<section class=\"fs-section\" id=\"adultos-gi-nogi\"><div class=\"fs-wrap fs-split\"><div><div class=\"fs-breadcrumb\">Adultos Gi y No-Gi<\/div><h2>Adultos Gi y No-Gi en Salesianos Paseo.<\/h2><p>Programa para adultos que quieren entrenar Jiu-Jitsu brasile\u00f1o con una progresi\u00f3n seria, sostenible y adaptada al ritmo real de cada alumno. El trabajo combina kimono y no-gi para construir base t\u00e9cnica, defensa personal, control posicional, movilidad, escapes, finalizaci\u00f3nes y sparring regulado.<\/p><p>La metodolog\u00eda no busca acumular clases sin direcci\u00f3n: cada sesi\u00f3n ordena el aprendizaje por objetivos, corrige detalles concretos y desarrolla criterio para tomar mejores decisiones bajo presi\u00f3n. El kimono ense\u00f1a estructura, agarres, paciencia y gesti\u00f3n de la distancia; el no-gi aporta ritmo, transici\u00f3nes, control corporal y capacidad de adaptaci\u00f3n.<\/p><p>Salesianos Paseo permite entrenar cerca del entorno escolar, con una comunidad estable y un enfoque t\u00e9cnico que prioriza seguridad, continuidad y mejora medible sin indicar precios en la web.<\/p><div class=\"fs-actions\"><a class=\"fs-btn fs-gold\" href=\"https:\/\/clubfreestylebjj.com\/index.php\/clases-adultos-bjj-madrid\/\">Seguir leyendo<\/a><\/div><\/div><div class=\"fs-carousel\" data-carousel=\"salesianos-adultos\"><div class=\"fs-carousel-track\"><div class=\"fs-carousel-slide\"><img decoding=\"async\" loading=\"eager\" src=\"https:\/\/clubfreestylebjj.com\/wp-content\/uploads\/2026\/06\/club-free-style-bjj-adultos_tecnica-01-img-20260205-220943.jpg\" alt=\"Adultos Gi y No-Gi en Salesianos Paseo - control tecnico\"><div class=\"fs-carousel-caption\">Adultos Gi y No-Gi \u00b7 foto 1 de 3<\/div><\/div><div class=\"fs-carousel-slide\"><img decoding=\"async\" loading=\"eager\" src=\"https:\/\/clubfreestylebjj.com\/wp-content\/uploads\/2026\/06\/club-free-style-bjj-adultos_tecnica-02-img-20260205-221124.jpg\" alt=\"Adultos Gi y No-Gi en Salesianos Paseo - progresion tecnica\"><div class=\"fs-carousel-caption\">Adultos Gi y No-Gi \u00b7 foto 2 de 3<\/div><\/div><div class=\"fs-carousel-slide\"><img decoding=\"async\" loading=\"eager\" src=\"https:\/\/clubfreestylebjj.com\/wp-content\/uploads\/2026\/06\/club-free-style-bjj-adultos_tecnica-03-img-20260205-221136.jpg\" alt=\"Adultos Gi y No-Gi en Salesianos Paseo - entrenamiento supervisado\"><div class=\"fs-carousel-caption\">Adultos Gi y No-Gi \u00b7 foto 3 de 3<\/div><\/div><\/div><button class=\"fs-prev\" type=\"button\" aria-label=\"Foto anterior\">\u2039<\/button><button class=\"fs-next\" type=\"button\" aria-label=\"Foto siguiente\">\u203a<\/button><\/div><\/div><\/section>\n<section class=\"fs-section\" id=\"infantiles-salesianos\"><div class=\"fs-wrap fs-split\"><div><div class=\"fs-breadcrumb\">Primaria, ESO y Bachiller<\/div><h2>Salesianos Paseo: del colegio al tatami con continuidad.<\/h2><p>La p\u00e1gina especifica de Salesianos ordena el recorrido escolar por etapas: primaria con extraescolar y recogida en comedor, grupo infantil de tarde, y ESO y Bachiller integrados en los horarios de continuidad del tatami cuando el encaje t\u00e9cnico y familiar lo permite.<\/p><p>El objetivo es que cada alumno encuentre un grupo adecuado a su edad, madurez y disponibilidad: juego guiado en primaria, progresi\u00f3n t\u00e9cnica en infantiles y continuidad real para adolescentes que ya pueden entrenar con mas estructura.<\/p><div class=\"fs-actions\"><a class=\"fs-btn fs-gold\" href=\"https:\/\/clubfreestylebjj.com\/index.php\/salesianos-paseo-infantiles\/\">Seguir leyendo<\/a><\/div><\/div><div class=\"fs-carousel\" data-carousel=\"salesianos-infantiles\"><div class=\"fs-carousel-track\"><div class=\"fs-carousel-slide\"><img decoding=\"async\" loading=\"eager\" src=\"https:\/\/clubfreestylebjj.com\/wp-content\/uploads\/2026\/06\/club-free-style-bjj-infantiles_salesianos-01-img-20251009-180720.jpg\" alt=\"Infantiles Salesianos Paseo - clase educativa de BJJ\"><div class=\"fs-carousel-caption\">Infantiles Salesianos \u00b7 foto 1 de 3<\/div><\/div><div class=\"fs-carousel-slide\"><img decoding=\"async\" loading=\"eager\" src=\"https:\/\/clubfreestylebjj.com\/wp-content\/uploads\/2026\/06\/club-free-style-bjj-infantiles_salesianos-02-img-20251009-180730.jpg\" alt=\"Infantiles Salesianos Paseo - motricidad y disciplina\"><div class=\"fs-carousel-caption\">Infantiles Salesianos \u00b7 foto 2 de 3<\/div><\/div><div class=\"fs-carousel-slide\"><img decoding=\"async\" loading=\"eager\" src=\"https:\/\/clubfreestylebjj.com\/wp-content\/uploads\/2026\/06\/club-free-style-bjj-infantiles_salesianos-03-img-20251009-181319.jpg\" alt=\"Infantiles Salesianos Paseo - aprendizaje seguro en tatami\"><div class=\"fs-carousel-caption\">Infantiles Salesianos \u00b7 foto 3 de 3<\/div><\/div><\/div><button class=\"fs-prev\" type=\"button\" aria-label=\"Foto anterior\">\u2039<\/button><button class=\"fs-next\" type=\"button\" aria-label=\"Foto siguiente\">\u203a<\/button><\/div><\/div><\/section>\n<section class=\"fs-section\" id=\"descuentos-salesianos\"><div class=\"fs-wrap\"><div class=\"fs-breadcrumb\">Descuentos<\/div><h2>Descuentos y condici\u00f3nes de aplicaci\u00f3n.<\/h2><p>Salesianos Paseo contempla descuentos para situaci\u00f3nes familiares y vinculaci\u00f3n con el centro. La aplicaci\u00f3n debe confirmarse siempre con secretar\u00eda antes de formalizar la plaza, porque depende de la relaci\u00f3n familiar, la documentaci\u00f3n interna y la disponibilidad real del grupo.<\/p><div class=\"fs-grid fs-two\" style=\"margin-top:30px\"><article class=\"fs-panel\"><span class=\"fs-tag\">Familias<\/span><h3>M\u00e1s de un integrante inscrito<\/h3><p>Cuando hay varios integrantes de una misma familia directa entrenando en el proyecto, secretar\u00eda revisa el descuento familiar aplicable y lo deja reflejado antes de confirmar la inscripci\u00f3n.<\/p><\/article><article class=\"fs-panel\"><span class=\"fs-tag\">Colegio<\/span><h3>Personal del centro y familiares directos<\/h3><p>Los empleados del colegio y sus familiares directos pueden consultar condici\u00f3nes especiales. La validaci\u00f3n se hace por secretar\u00eda para evitar errores y mantener una gesti\u00f3n ordenada.<\/p><\/article><\/div><div class=\"fs-note\">No se publican importes en esta p\u00e1gina. Para confirmar condici\u00f3nes, descuentos, grupo disponible y forma de inscripci\u00f3n, contacta con secretar\u00eda.<\/div><\/div><\/section>\n\n\n<section class=\"fs-section fs-band\" data-structure=\"contacto-maps\"><div class=\"fs-wrap fs-split\"><div><h2>Secretar\u00eda.<\/h2><p>Secretar\u00eda del club para clase de prueba, grupos, familias, colegios y dudas de matr\u00edcula.<\/p><div class=\"fs-actions\"><a class=\"fs-btn fs-gold\" href=\"https:\/\/wa.me\/34681990446\">Hablar por WhatsApp<\/a><a class=\"fs-btn fs-ghost\" href=\"mailto:info@clubfreestylebjj.com\">Enviar email<\/a><\/div><\/div><div><h2>Maps Salesianos.<\/h2><p>Consulta la ruta de Salesianos Paseo antes de venir al centro y confirma siempre el horario con secretar\u00eda.<\/p><div class=\"fs-actions\"><a class=\"fs-btn\" href=\"https:\/\/www.google.com\/maps\/search\/?api=1&amp;query=Salesianos+San+Miguel+del+Arcangel+Paseo+Extremadura+Madrid\" target=\"_blank\" rel=\"noopener\">Abrir Google Maps<\/a><\/div><\/div><\/div><\/section>\n<footer class=\"fs-footer\">\n <div class=\"fs-wrap\">\n  <div>\n   <strong>Club Free Style BJJ<\/strong><br>\n   <span class=\"fs-muted\">Jiu-Jitsu brasile\u00f1o en Madrid para adultos, familias y colegios.<\/span>\n  <\/div>\n  <div>\n   <a href=\"tel:+34681990446\">+34 681 990 446<\/a><br>\n   <a href=\"mailto:info@clubfreestylebjj.com\">Enviar email<\/a>\n  <\/div>\n  <div>\n   <strong>Redes y mapa<\/strong><br>\n   <span class=\"fs-muted\">Canales p\u00fablicos de la escuela y perfil de Google Maps.<\/span>\n   <div class=\"fs-social\">\n    <a href=\"https:\/\/www.facebook.com\/people\/Escuela-de-Jiu-Jitsu-Brasile%C3%B1o-Puerta-del-Angel\/100090128777293\/\" target=\"_blank\" rel=\"noopener\">Facebook<\/a>\n    <a href=\"https:\/\/www.instagram.com\/explore\/locations\/462536300569539\/escuela-de-jiu-jitsu-brasileno-puerta-del-angel\/\" target=\"_blank\" rel=\"noopener\">Instagram<\/a>\n    <a href=\"https:\/\/www.google.com\/maps\/search\/?api=1&amp;query=Escuela+de+Jiu-Jitsu+Brasile%C3%B1o+Puerta+del+Angel+Calle+Cabello+Lapiedra+4+Madrid\" target=\"_blank\" rel=\"noopener\">Google Maps<\/a>\n   <\/div>\n  <\/div>\n <\/div>\n <div class=\"fs-footer-credit\">\u00a9 2026 Club Free Style BJJ<\/div>\n<\/footer>\n<\/div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<script>\n(function(){\n if (window.__fsContactRoutingV3Ordered) return;\n window.__fsContactRoutingV3Ordered = true;\n var phone = \"34681990446\";\n var programs = {\n  \"Salesianos Paseo\": [\"Extraescolar lunes y mi\u00e9rcoles de 17:00 a 18:30 - recogida en comedor\",\"Extraescolar martes y jueves de 17:00 a 18:30 - recogida en comedor\",\"Infantiles martes y jueves de 17:45 a 19:15\",\"Adultos clases ilimitadas lunes a viernes 18:30-20:00 y 21:00-22:30 - GI y No-Gi\",\"Adultos Lunes, mi\u00e9rcoles y viernes 18:30-20:00 - GI\",\"Adultos Lunes, mi\u00e9rcoles y viernes 21:00-22:30 - GI\",\"Adultos Martes y jueves 18:30-20:00 - GI\",\"Adultos Martes y jueves 21:00-22:30 - NOGI\",\"Bono flexible 10 clases - disponibilidad con secretar\u00eda\"],\n  \"San Buenaventura\": [\"Grupo 1 Lunes y mi\u00e9rcoles 17:15-18:45\",\"Grupo 2 Martes y jueves 17:15-18:45\",\"Lista de familias interesadas - pendiente de confirmaci\u00f3n\"],\n  \"Nuevo colegio interesado\": [\"Presentar proyecto al centro\",\"Solicitar informaci\u00f3n para familias\",\"Coordinar reunion con direcci\u00f3n o AMPA\"]\n };\n function fsCleanText(v){\n  v = String(v || \"\");\n  var out = \"\";\n  var lastSpace = false;\n  for (var i=0;i<v.length;i++){\n   var code = v.charCodeAt(i);\n   var ch = v.charAt(i);\n   var isSpace = false;\n   if (code === 9) isSpace = true;\n   if (code === 10) isSpace = true;\n   if (code === 13) isSpace = true;\n   if (code === 32) isSpace = true;\n   if (code === 160) isSpace = true;\n   if (isSpace) {\n    if (!lastSpace) out += \" \";\n    lastSpace = true;\n   } else {\n    out += ch;\n    lastSpace = false;\n   }\n  }\n  return out.trim();\n }\n function textOf(el){ return el ? fsCleanText(el.innerText || el.textContent || \"\") : \"\"; }\n function isContactLink(link){\n  if (!link) return false;\n  var href = link.getAttribute(\"href\") || \"\";\n  var text = textOf(link).toLowerCase();\n  if (href.indexOf(\"wa.me\/\") !== -1) return true;\n  if (href.indexOf(\"api.whatsapp.com\") !== -1) return true;\n  if (href.indexOf(\"mailto:\") === 0) return true;\n  if (text.indexOf(\"whatsapp\") !== -1) return true;\n  return false;\n }\n function field(form,name){ return form.querySelector('[name=\"' + name + '\"]'); }\n function wrap(form,name){ var el = field(form,name); return el ? el.closest(\"label\") : null; }\n function value(form,name){ var el = field(form,name); if (!el) return \"\"; if (el.type === \"checkbox\") return el.checked ? el.value : \"\"; return (el.value || \"\").trim(); }\n function hasValue(form,name){ return value(form,name) !== \"\"; }\n function isDateField(el){\n  if (!el) return false;\n  if (el.name === \"fecha_nacimiento\") return true;\n  if (el.name === \"fecha_nacimiento_menor\") return true;\n  if (el.name.indexOf(\"fecha_nacimiento_menor_\") === 0) return true;\n  return false;\n }\n function validDateParts(day,month,year){\n  var cy = (new Date()).getFullYear();\n  if (!day) return false;\n  if (!month) return false;\n  if (!year) return false;\n  if (year < 1900) return false;\n  if (year > cy) return false;\n  if (month < 1) return false;\n  if (month > 12) return false;\n  if (day < 1) return false;\n  if (day > 31) return false;\n  return true;\n }\n function onlyDigits(v){ return String(v || \"\").replace(\/[^0-9]\/g,\"\"); }\n function dateDigitsForInput(v){\n  v = String(v || \"\").trim();\n  if (v.length === 10) {\n   if (v.charAt(4) === \"-\") {\n    if (v.charAt(7) === \"-\") {\n     return onlyDigits(v.slice(8,10) + v.slice(5,7) + v.slice(0,4)).slice(0,8);\n    }\n   }\n  }\n  return onlyDigits(v).slice(0,8);\n }\n function dateCaretPosition(value,digitCount){\n  if (digitCount <= 0) return 0;\n  var seen = 0;\n  for (var i=0;i<value.length;i++){\n   if (\/[0-9]\/.test(value.charAt(i))) seen++;\n   if (seen >= digitCount) return i + 1;\n  }\n  return value.length;\n }\n function dateDigitCountBefore(value,pos){\n  value = String(value || \"\");\n  var limit = Math.max(0, pos || 0);\n  var count = 0;\n  for (var i=0;i<value.length;i++){\n   if (i >= limit) break;\n   if (\/[0-9]\/.test(value.charAt(i))) count++;\n  }\n  return count;\n }\n function formatDateInput(el){\n  if (!isDateField(el)) return;\n  var before = String(el.value || \"\");\n  var digitCursor = dateDigitCountBefore(before, el.selectionStart || before.length);\n  var d = dateDigitsForInput(before);\n  var next = d;\n  if (d.length > 2) next = d.slice(0,2) + \"\/\" + d.slice(2);\n  if (d.length > 4) next = d.slice(0,2) + \"\/\" + d.slice(2,4) + \"\/\" + d.slice(4);\n  if (before !== next) {\n   el.value = next;\n   try {\n    var pos = dateCaretPosition(next,digitCursor);\n    el.setSelectionRange(pos,pos);\n   } catch(error) {}\n  }\n }\n function isCompleteDate(v){\n  v = String(v || \"\").trim();\n  if (v.length === 10) {\n   if (v.charAt(4) === \"-\") {\n    if (v.charAt(7) === \"-\") {\n     return validDateParts(parseInt(v.slice(8,10),10), parseInt(v.slice(5,7),10), parseInt(v.slice(0,4),10));\n    }\n   }\n  }\n  var d = onlyDigits(v);\n  if (d.length !== 8) return false;\n  return validDateParts(parseInt(d.slice(0,2),10), parseInt(d.slice(2,4),10), parseInt(d.slice(4,8),10));\n }\n function ready(form,name){ var el = field(form,name); if (!el) return true; if (isDateField(el)) return isCompleteDate(el.value || \"\"); if (el.type === \"checkbox\") return el.checked; return hasValue(form,name); }\n function show(el,on){ if (!el) return; if (on) el.classList.remove(\"fs-hidden-step\"); else el.classList.add(\"fs-hidden-step\"); }\n function setLabel(form,name,text){ var w = wrap(form,name); if (!w) return; var nodes = Array.from(w.childNodes); for (var i=0;i<nodes.length;i++){ if (nodes[i].nodeType === 3) { nodes[i].nodeValue = text; return; } } w.insertBefore(document.createTextNode(text), w.firstChild); }\n function fillOptions(select,items,placeholder){ if (!select) return; var current = select.value; select.innerHTML = \"\"; var first = document.createElement(\"option\"); first.value = \"\"; first.textContent = placeholder || \"Elegir opcion\"; select.appendChild(first); for (var i=0;i<items.length;i++){ var opt = document.createElement(\"option\"); opt.value = items[i]; opt.textContent = items[i]; select.appendChild(opt); } select.value = current; }\n function modeOf(form){\n  var interest = value(form,\"tipo_interesado\");\n  if (interest === \"Quiero clases para mi\") return \"self\";\n  if (interest === \"Busco clases para mi hijo\/a\") return \"child\";\n  if (interest === \"Represento a un centro interesado\") return \"center\";\n  return \"\";\n }\n var adultCenters = [\"Salesianos Paseo\"];\n var childCenters = [\"Salesianos Paseo\",\"San Buenaventura\"];\n var adultPrograms = {\"Salesianos Paseo\":[\"Adultos clases ilimitadas lunes a viernes 18:30-20:00 y 21:00-22:30 - GI y No-Gi\",\"Adultos Lunes, miercoles y viernes 18:30-20:00 - GI\",\"Adultos Lunes, miercoles y viernes 21:00-22:30 - GI\",\"Adultos Martes y jueves 18:30-20:00 - GI\",\"Adultos Martes y jueves 21:00-22:30 - NOGI\",\"Bono flexible 10 clases - disponibilidad con secretaria\"]};\n var childPrograms = {\"Salesianos Paseo\":[\"Extraescolar lunes y miercoles de 17:00 a 18:30 - recogida en comedor\",\"Extraescolar martes y jueves de 17:00 a 18:30 - recogida en comedor\",\"Infantiles martes y jueves de 17:45 a 19:15\"],\"San Buenaventura\":[\"Grupo 1 Lunes y miercoles 17:15-18:45\",\"Grupo 2 Martes y jueves 17:15-18:45\",\"Lista de familias interesadas - pendiente de confirmacion\"]};\n function populateCenters(form,mode){\n  var select = field(form,\"centro\");\n  if (!select) return;\n  if (mode === \"self\") { fillOptions(select,adultCenters,\"Elegir centro\"); return; }\n  if (mode === \"child\") { fillOptions(select,childCenters,\"Elegir centro\"); return; }\n }\n function populatePrograms(form){\n  var center = value(form,\"centro\"); var select = field(form,\"programa\"); var mode = modeOf(form); var source = programs;\n  if (mode === \"self\") source = adultPrograms;\n  if (mode === \"child\") source = childPrograms;\n  var list = source[center] || [];\n  fillOptions(select,list,\"Elegir programa\");\n }\n function visibleField(el){ if (!el) return false; if (el.disabled) return false; if (el.type === \"hidden\") return false; var w = el.closest(\"label\") || el.closest(\".fs-minor-group\") || el; if (getComputedStyle(w).display === \"none\") return false; return true; }\n function focusField(el){ if (!el) return; if (el.focus) el.focus({preventScroll:true}); var form = el.closest(\".fs-contact-form\"); if (!form) return; var target = el.closest(\"label\") || el.closest(\".fs-minor-group\") || el; var top = target.offsetTop - Math.max(22, form.clientHeight * 0.52); form.scrollTo({top:Math.max(0,top),behavior:\"smooth\"}); }\n function nextField(form,el){ var all = Array.from(form.querySelectorAll(\"select,input,textarea,button.fs-add-minor\")); all = all.filter(visibleField); var idx = all.indexOf(el); if (idx < 0) return null; return all[idx + 1] || null; }\n function orderedNames(mode){\n  if (mode === \"self\") return [\"tipo_interesado\",\"responsable\",\"fecha_nacimiento\",\"mayor_edad\",\"genero\",\"centro\",\"programa\",\"experiencia_bjj\",\"cinturon_bjj\",\"tiempo_bjj\",\"limitaciones_fisicas\",\"detalle_limitaciones\",\"email\",\"telefono\",\"preferencia\",\"mensaje\",\"consentimiento\"];\n  if (mode === \"child\") return [\"tipo_interesado\",\"responsable\",\"relacion_tutor\",\"fecha_nacimiento\",\"mayor_edad\",\"alumno_1\",\"fecha_nacimiento_menor\",\"genero\",\"experiencia_bjj_menor_1\",\"cinturon_bjj_menor_1\",\"tiempo_bjj_menor_1\",\"limitaciones_fisicas_menor_1\",\"detalle_limitaciones_menor_1\",\"add_minor\",\"centro\",\"programa\",\"email\",\"telefono\",\"preferencia\",\"mensaje\",\"consentimiento\"];\n  if (mode === \"center\") return [\"tipo_interesado\",\"responsable\",\"fecha_nacimiento\",\"mayor_edad\",\"nombre_centro\",\"link_centro\",\"puesto_centro\",\"interes_centro\",\"preferencia\",\"mensaje\",\"consentimiento\"];\n  return [\"tipo_interesado\"];\n }\n function shouldInclude(form,name,mode){\n  if (name === \"relacion_tutor\") return mode === \"child\";\n  if (name.indexOf(\"cinturon_bjj_menor_\") === 0) { var s1 = name.replace(\"cinturon_bjj_menor_\",\"\"); return value(form,\"experiencia_bjj_menor_\" + s1) === \"Si\"; }\n  if (name.indexOf(\"tiempo_bjj_menor_\") === 0) { var s2 = name.replace(\"tiempo_bjj_menor_\",\"\"); if (value(form,\"experiencia_bjj_menor_\" + s2) !== \"Si\") return false; return hasValue(form,\"cinturon_bjj_menor_\" + s2); }\n  if (name.indexOf(\"detalle_limitaciones_menor_\") === 0) { var s3 = name.replace(\"detalle_limitaciones_menor_\",\"\"); return value(form,\"limitaciones_fisicas_menor_\" + s3) === \"Si\"; }\n  if (name === \"cinturon_bjj\") return value(form,\"experiencia_bjj\") === \"Si\";\n  if (name === \"tiempo_bjj\") return shouldInclude(form,\"cinturon_bjj\",mode) ? hasValue(form,\"cinturon_bjj\") : false;\n  if (name === \"detalle_limitaciones\") return value(form,\"limitaciones_fisicas\") === \"Si\";\n  if (name === \"add_minor\") return mode === \"child\";\n  return true;\n }\n function previousReady(form,order,index,mode){\n  for (var i=0;i<index;i++){\n   var prev = order[i];\n   if (!shouldInclude(form,prev,mode)) continue;\n   if (prev === \"add_minor\") continue;\n   if (!ready(form,prev)) return false;\n  }\n  return true;\n }\n function showByOrder(form,mode){\n  var names = [\"responsable\",\"relacion_tutor\",\"fecha_nacimiento\",\"mayor_edad\",\"genero\",\"centro\",\"programa\",\"experiencia_bjj\",\"cinturon_bjj\",\"tiempo_bjj\",\"limitaciones_fisicas\",\"detalle_limitaciones\",\"email\",\"telefono\",\"preferencia\",\"mensaje\",\"consentimiento\",\"alumno_1\",\"fecha_nacimiento_menor\",\"experiencia_bjj_menor_1\",\"cinturon_bjj_menor_1\",\"tiempo_bjj_menor_1\",\"limitaciones_fisicas_menor_1\",\"detalle_limitaciones_menor_1\",\"nombre_centro\",\"link_centro\",\"puesto_centro\",\"interes_centro\"];\n  for (var n=0;n<names.length;n++) show(wrap(form,names[n]),false);\n  show(form.querySelector(\".fs-add-minor\"),false); show(form.querySelector(\".fs-contact-actions\"),false);\n  var order = orderedNames(mode);\n  for (var i=0;i<order.length;i++){\n   var name = order[i]; if (!shouldInclude(form,name,mode)) continue; var on = previousReady(form,order,i,mode); if (name === \"add_minor\") show(form.querySelector(\".fs-add-minor\"),on); else show(wrap(form,name),on);\n  }\n  var canActions = previousReady(form,order,order.length,mode); show(form.querySelector(\".fs-contact-actions\"),canActions);\n  var submit = form.querySelector(\".fs-contact-submit\"); if (submit) submit.disabled = !ready(form,\"consentimiento\");\n }\n function refreshMinorDetails(form,mode){\n  var items = Array.from(form.querySelectorAll('[name^=\"experiencia_bjj_menor_\"]'));\n  for (var i=0;i<items.length;i++){\n   var suffix = items[i].name.replace(\"experiencia_bjj_menor_\",\"\");\n   var childMode = mode === \"child\";\n   var showBelt = false;\n   if (childMode) showBelt = value(form,\"experiencia_bjj_menor_\" + suffix) === \"Si\";\n   show(wrap(form,\"cinturon_bjj_menor_\" + suffix),showBelt);\n   var showTime = false;\n   if (showBelt) showTime = hasValue(form,\"cinturon_bjj_menor_\" + suffix);\n   show(wrap(form,\"tiempo_bjj_menor_\" + suffix),showTime);\n   var showDetail = false;\n   if (childMode) showDetail = value(form,\"limitaciones_fisicas_menor_\" + suffix) === \"Si\";\n   show(wrap(form,\"detalle_limitaciones_menor_\" + suffix),showDetail);\n  }\n }\n function refresh(form){\n  var interest = value(form,\"tipo_interesado\"); var mode = \"\";\n  if (interest === \"Quiero clases para mi\") mode = \"self\";\n  if (interest === \"Busco clases para mi hijo\/a\") mode = \"child\";\n  if (interest === \"Represento a un centro interesado\") mode = \"center\";\n  setLabel(form,\"responsable\", mode === \"child\" ? \"Nombre padre\/madre tutor\" : (mode === \"center\" ? \"Nombre y apellidos completos\" : \"Nombre y apellidos\"));\n  setLabel(form,\"fecha_nacimiento\", \"Fecha de nacimiento\"); populateCenters(form,mode); populatePrograms(form); showByOrder(form,mode); refreshMinorDetails(form,mode);\n }\n function addMinor(form){\n  var box = form.querySelector(\".fs-extra-minors\");\n  if (!box) return;\n  var count = box.querySelectorAll(\".fs-minor-group\").length + 2;\n  if (count > 5) return;\n  var group = document.createElement(\"div\");\n  group.className = \"fs-minor-group\";\n  group.innerHTML = '<label>Nombre y apellidos del menor ' + count + '<input name=\"alumno_' + count + '\" autocomplete=\"off\"><\/label><label>Fecha de nacimiento del menor ' + count + '<input type=\"text\" inputmode=\"numeric\" placeholder=\"dd\/mm\/aaaa\" maxlength=\"10\" name=\"fecha_nacimiento_menor_' + count + '\" autocomplete=\"bday\"><\/label><label>Genero del menor ' + count + '<select name=\"genero_menor_' + count + '\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Masculino<\/option><option>Femenino<\/option><\/select><\/label><label>Experiencia previa BJJ del menor ' + count + '<select name=\"experiencia_bjj_menor_' + count + '\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Si<\/option><option>No<\/option><\/select><\/label><label>Color del cinturon del menor ' + count + '<select name=\"cinturon_bjj_menor_' + count + '\"><option value=\"\">Elegir color<\/option><option>Blanco<\/option><option>Gris blanco<\/option><option>Gris<\/option><option>Gris negro<\/option><option>Amarillo blanco<\/option><option>Amarillo<\/option><option>Amarillo negro<\/option><option>Naranja blanco<\/option><option>Naranja<\/option><option>Naranja negro<\/option><option>Verde blanco<\/option><option>Verde<\/option><option>Verde negro<\/option><option>Azul<\/option><option>Morado<\/option><option>Marron<\/option><option>Negro<\/option><\/select><\/label><label>Tiempo total de experiencia del menor ' + count + '<input name=\"tiempo_bjj_menor_' + count + '\" autocomplete=\"off\"><\/label><label>Limitaci\u00f3nes o condici\u00f3nes fisicas del menor ' + count + '<select name=\"limitaciones_fisicas_menor_' + count + '\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Si<\/option><option>No<\/option><\/select><\/label><label>Detalle de limitaci\u00f3n o condici\u00f3n del menor ' + count + '<input name=\"detalle_limitaciones_menor_' + count + '\"><\/label>';\n  box.appendChild(group);\n  refresh(form);\n  focusField(group.querySelector('input'));\n }\n function buildModal(){\n  var old = document.querySelector(\".fs-contact-modal\"); if (old) old.remove();\n  var modal = document.createElement(\"div\"); modal.className = \"fs-contact-modal\";\n  modal.innerHTML = '<div class=\"fs-contact-dialog\" role=\"dialog\" aria-modal=\"true\"><div class=\"fs-contact-head\"><div><h2>Formulario de contacto<\/h2><p>Rellena los datos y prepararemos el mensaje para WhatsApp.<\/p><\/div><button class=\"fs-contact-close\" type=\"button\" aria-label=\"Cerrar\">\u00d7<\/button><\/div><form class=\"fs-contact-form\" autocomplete=\"on\"><input type=\"hidden\" name=\"origen\" value=\"web-club-free-style-bjj\"><label>Interesado<select name=\"tipo_interesado\" required><option value=\"\">Elegir opci\u00f3n<\/option><option>Quiero clases para mi<\/option><option>Busco clases para mi hijo\/a<\/option><option>Represento a un centro interesado<\/option><\/select><\/label><label>Nombre y apellidos<input name=\"responsable\" autocomplete=\"name\"><\/label><label>Indica si eres padre, madre o tutor legal<select name=\"relacion_tutor\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Padre<\/option><option>Madre<\/option><option>Tutor legal<\/option><\/select><\/label><label>Fecha de nacimiento<input type=\"text\" inputmode=\"numeric\" placeholder=\"dd\/mm\/aaaa\" maxlength=\"10\" name=\"fecha_nacimiento\" autocomplete=\"bday\"><\/label><label>Confirmo que soy mayor de edad<input type=\"checkbox\" name=\"mayor_edad\" value=\"confirmado\"><\/label><label>Nombre y apellidos del menor<input name=\"alumno_1\" autocomplete=\"off\"><\/label><label>Fecha de nacimiento del menor<input type=\"text\" inputmode=\"numeric\" placeholder=\"dd\/mm\/aaaa\" maxlength=\"10\" name=\"fecha_nacimiento_menor\" autocomplete=\"bday\"><\/label><label>Genero<select name=\"genero\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Masculino<\/option><option>Femenino<\/option><\/select><\/label><label>Experiencia previa BJJ del menor<select name=\"experiencia_bjj_menor_1\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Si<\/option><option>No<\/option><\/select><\/label><label>Color del cinturon del menor<select name=\"cinturon_bjj_menor_1\"><option value=\"\">Elegir color<\/option><option>Blanco<\/option><option>Gris blanco<\/option><option>Gris<\/option><option>Gris negro<\/option><option>Amarillo blanco<\/option><option>Amarillo<\/option><option>Amarillo negro<\/option><option>Naranja blanco<\/option><option>Naranja<\/option><option>Naranja negro<\/option><option>Verde blanco<\/option><option>Verde<\/option><option>Verde negro<\/option><option>Azul<\/option><option>Morado<\/option><option>Marron<\/option><option>Negro<\/option><\/select><\/label><label>Tiempo total de experiencia del menor<input name=\"tiempo_bjj_menor_1\" autocomplete=\"off\"><\/label><label>Limitaci\u00f3nes o condici\u00f3nes fisicas del menor<select name=\"limitaciones_fisicas_menor_1\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Si<\/option><option>No<\/option><\/select><\/label><label>Detalle de limitaci\u00f3n o condici\u00f3n del menor<input name=\"detalle_limitaciones_menor_1\"><\/label><button class=\"fs-add-minor\" type=\"button\">A\u00f1adir otro menor<\/button><div class=\"fs-extra-minors\"><\/div><label>Centro<select name=\"centro\"><option value=\"\">Elegir centro<\/option><option>Salesianos Paseo<\/option><option>San Buenaventura<\/option><\/select><\/label><label>Programas de inter\u00e9s<select name=\"programa\"><option value=\"\">Elegir programa<\/option><\/select><\/label><label>Experiencia previa BJJ<select name=\"experiencia_bjj\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Si<\/option><option>No<\/option><\/select><\/label><label>Color del cinturon<select name=\"cinturon_bjj\"><option value=\"\">Elegir color<\/option><option>Blanco<\/option><option>Azul<\/option><option>Morado<\/option><option>Marron<\/option><option>Negro<\/option><\/select><\/label><label>Tiempo total de experiencia<input name=\"tiempo_bjj\" autocomplete=\"off\"><\/label><label>Limitaci\u00f3nes o condici\u00f3nes fisicas<select name=\"limitaciones_fisicas\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Si<\/option><option>No<\/option><\/select><\/label><label>Detalle de limitaci\u00f3n o condici\u00f3n<input name=\"detalle_limitaciones\"><\/label><label>Email<input type=\"email\" name=\"email\" autocomplete=\"email\"><\/label><label>Telefono<input name=\"telefono\" autocomplete=\"tel\"><\/label><label>Nombre del centro representado<input name=\"nombre_centro\"><\/label><label>link del centro interesado<input name=\"link_centro\" inputmode=\"url\" autocomplete=\"url\"><\/label><label>Puesto ocupado en el centro<select name=\"puesto_centro\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Director<\/option><option>Coordinador de deportes<\/option><option>Profesor<\/option><option>Otro<\/option><\/select><\/label><label>Te interesa<select name=\"interes_centro\"><option value=\"\">Elegir opci\u00f3n<\/option><option>Marcar una cita con los representantes del club<\/option><option>Recibir informaci\u00f3n del proyecto<\/option><\/select><\/label><label>Como quieres que se pongan en contacto contigo<select name=\"preferencia\"><option value=\"\">Elegir opci\u00f3n<\/option><option>WhatsApp<\/option><option>Llamada<\/option><option>Email<\/option><\/select><\/label><label>Mensaje<textarea name=\"mensaje\"><\/textarea><\/label><label class=\"fs-contact-check\">Acepto que el club use estos datos solo para responder a esta solicitud. La documentaci\u00f3n de matr\u00edcula se pedira mas adelante por canal privado, no en este primer formulario p\u00fablico.<input type=\"checkbox\" name=\"consentimiento\" value=\"aceptado\"><\/label><div class=\"fs-contact-actions\"><button class=\"fs-contact-cancel\" type=\"button\">Cancelar<\/button><button class=\"fs-contact-submit\" type=\"submit\" disabled>Enviar WhatsApp<\/button><\/div><\/form><\/div>';\n  document.body.appendChild(modal); var form = modal.querySelector(\"form\"); Array.from(form.querySelectorAll(\"input,select,textarea\")).forEach(function(el){ if (el.type === \"checkbox\") el.checked = false; else if (el.type !== \"hidden\") el.value = \"\"; });\n  form.addEventListener(\"input\",function(e){ var el = e.target; if (!el) return; if (isDateField(el)) formatDateInput(el); refresh(form); },true);\n  form.addEventListener(\"change\",function(e){ refresh(form); if (ready(form,e.target.name)) { var nf = nextField(form,e.target); if (nf) focusField(nf); else if (visibleField(e.target)) focusField(e.target); } else if (visibleField(e.target)) focusField(e.target); },true);\n  form.addEventListener(\"focusout\",function(e){ refresh(form); },true);\n  form.addEventListener(\"keydown\",function(e){ var el = e.target; if (!el) return; if (e.key !== \"Tab\") { if (e.key !== \"Enter\") return; } if (isDateField(el)) { if (!isCompleteDate(el.value || \"\")) { e.preventDefault(); focusField(el); return; } } if (!ready(form,el.name)) return; refresh(form); var next = nextField(form,el); if (next) { e.preventDefault(); focusField(next); } },true);\n  form.querySelector(\".fs-add-minor\").addEventListener(\"click\",function(){ addMinor(form); });\n  form.addEventListener(\"submit\",function(e){\n   e.preventDefault();\n   if (!ready(form,\"consentimiento\")) return;\n      if (form.dataset.fsSubmitLocked === \"1\") return;\n      form.dataset.fsSubmitLocked = \"1\";\n      window.setTimeout(function(){ form.dataset.fsSubmitLocked = \"\"; },3500);\n   function clean(v){ return fsCleanText(v); }\n   function fieldValue(name){ return clean(value(form,name)); }\n      function fsStripGeneratedRequest(v){ var msg = clean(v); var marker = \"Solicitud Club Free Style BJJ\"; var pos = msg.indexOf(marker); if (pos > -1) msg = clean(msg.slice(0,pos)); return msg; }\n      function safeMessage(){ return fsStripGeneratedRequest(fieldValue(\"mensaje\")); }\n      function fsDedupeRequestBody(v){ var text = String(v || \"\").trim(); var marker = \"Solicitud Club Free Style BJJ\"; var first = text.indexOf(marker); if (first > -1) { var second = text.indexOf(marker, first + marker.length); if (second > -1) text = String(text.slice(0,second)).trim(); } return text; }\n   function formatDate(v){\n    v = clean(v);\n    if (v.length === 10 && v.charAt(4) === \"-\" && v.charAt(7) === \"-\") return v;\n    var d = String(v || \"\").replace(\/[^0-9]\/g,\"\");\n    if (d.length === 8) return d.slice(4,8) + \"-\" + d.slice(2,4) + \"-\" + d.slice(0,2);\n    return v;\n   }\n   function programLabel(v){ v = clean(v); if (v.indexOf(\" - \") !== -1) return v.split(\" - \")[0]; return v; }\n   function selfGenderLine(v){ return v === \"Femenino\" ? \"\ud83d\ude4e\u200d\u2640\ufe0f *Genero:* Mujer\" : \"\ud83d\ude4e\u200d\u2642\ufe0f *Genero:* Hombre\"; }\n   function childGenderLine(n,v){ return (v === \"Femenino\" ? \"\ud83d\udc67\" : \"\ud83d\udc66\") + \"*Genero menor \" + n + \"* : \" + clean(v); }\n   function expIcon(v){ return v === \"No\" ? \"\ud83d\udfe5\" : \"\ud83d\udfe9\"; }\n   function addLine(lines,label,name){ var v = fieldValue(name); if (v) lines.push(label + v); }\n   var lines = [];\n   var tipo = fieldValue(\"tipo_interesado\");\n   if (tipo === \"Quiero clases para mi\") {\n    lines.push(\"\ud83d\udccb *_Solicitud Club Free Style BJJ_*\");\n    lines.push(\"\ud83d\udcdd *Interesado:* Clases para mi\");\n    lines.push(\"\u2049\ufe0f *Tipo de consulta:* Clase de prueba\");\n    lines.push(\"\ud83c\udfeb *Centro:* \" + fieldValue(\"centro\"));\n    lines.push(\"\ud83d\udcc6\u23f1\ufe0f *Programa de inter\u00e9s:* \" + programLabel(fieldValue(\"programa\")));\n    lines.push(\"\ud83d\udcac *Preferencia de contacto:* \" + fieldValue(\"preferencia\"));\n    lines.push(\"\ud83d\udcdd *Nombre y apellidos:* \" + fieldValue(\"responsable\") + \" _\" + String.fromCharCode(92) + \"_ *Mayor de edad:* \" + fieldValue(\"mayor_edad\"));\n    lines.push(\"\ud83d\udc23 *Fecha de nacimiento:* \" + formatDate(fieldValue(\"fecha_nacimiento\")));\n    lines.push(selfGenderLine(fieldValue(\"genero\")));\n    lines.push(expIcon(fieldValue(\"experiencia_bjj\")) + \" *Experiencia previa BJJ:* \" + fieldValue(\"experiencia_bjj\"));\n    if (fieldValue(\"experiencia_bjj\") === \"Si\") {\n     if (fieldValue(\"cinturon_bjj\")) lines.push(\"\ud83e\udd4b *Color de cinturon:* \" + fieldValue(\"cinturon_bjj\"));\n     if (fieldValue(\"tiempo_bjj\")) lines.push(\"\ud83d\udcc6 *Tiempo de experiencia:* \" + fieldValue(\"tiempo_bjj\"));\n    }\n    lines.push(\"\ud83e\ude7c *Limitaci\u00f3nes o condici\u00f3nes especiales:* \" + fieldValue(\"limitaciones_fisicas\"));\n    if (fieldValue(\"limitaciones_fisicas\") === \"Si\") { if (fieldValue(\"detalle_limitaciones\")) lines.push(\"\ud83d\udcdd *Detalle de limitaci\u00f3n o condici\u00f3n:* \" + fieldValue(\"detalle_limitaciones\")); }\n    lines.push(\"\ud83d\udce7 *Email:* \" + fieldValue(\"email\"));\n    lines.push(\"\ud83d\udcde *Telefono:* \" + fieldValue(\"telefono\"));\n    lines.push(\"\ud83d\udce8 *Mensaje:* \" + safeMessage());\n   } else if (tipo === \"Busco clases para mi hijo\/a\") {\n    lines.push(\"\ud83d\udccb *Solicitud Club Free Style BJJ*\");\n    lines.push(\"\ud83d\udcdd *Interesado:* Clases para mi hijo\/a\");\n    var rel = fieldValue(\"relacion_tutor\");\n    lines.push(\"\ud83d\udcdd *Nombre padre\/madre tutor* _(\" + (rel || \"indicar si es padre, madre o tutor legal\") + \")_ *:* \" + fieldValue(\"responsable\"));\n    lines.push(\"\ud83d\udc23 *Fecha de nacimiento padre\/madre tutor:* \" + formatDate(fieldValue(\"fecha_nacimiento\")));\n    lines.push(\"*Mayor de edad:* \" + fieldValue(\"mayor_edad\"));\n    for (var m=1;m<=5;m++) {\n     var alumnoName = \"alumno_\" + m;\n     if (!fieldValue(alumnoName)) continue;\n     lines.push(\"\ud83e\uddd2 *Menor \" + m + \":* \" + fieldValue(alumnoName));\n     lines.push(\"\ud83d\udc23 *Fecha de nacimiento menor \" + m + \":* \" + formatDate(fieldValue(m === 1 ? \"fecha_nacimiento_menor\" : \"fecha_nacimiento_menor_\" + m)));\n     lines.push(childGenderLine(m, fieldValue(m === 1 ? \"genero\" : \"genero_menor_\" + m)));\n     var expName = \"experiencia_bjj_menor_\" + m;\n     lines.push(expIcon(fieldValue(expName)) + \" *Experiencia BJJ menor \" + m + \":* \" + fieldValue(expName));\n     if (fieldValue(expName) === \"Si\") {\n      if (fieldValue(\"cinturon_bjj_menor_\" + m)) lines.push(\"\ud83e\udd4b *Color de cinturon menor \" + m + \":* \" + fieldValue(\"cinturon_bjj_menor_\" + m));\n      if (fieldValue(\"tiempo_bjj_menor_\" + m)) lines.push(\"\ud83d\udcc6 *Tiempo de experiencia menor \" + m + \":* \" + fieldValue(\"tiempo_bjj_menor_\" + m));\n     }\n     var limName = \"limitaciones_fisicas_menor_\" + m;\n     lines.push(\"\ud83e\ude7c *Limitaciones menor \" + m + \":* \" + fieldValue(limName));\n     if (fieldValue(limName) === \"Si\") { if (fieldValue(\"detalle_limitaciones_menor_\" + m)) lines.push(\"\ud83d\udcdd *Detalle limitacion menor \" + m + \":* \" + fieldValue(\"detalle_limitaciones_menor_\" + m)); }\n    }\n    lines.push(\"\ud83c\udfeb *Centro:* \" + fieldValue(\"centro\"));\n    lines.push(\"\ud83d\udcc6\u23f1\ufe0f *Programa de interes:* \" + fieldValue(\"programa\"));\n    lines.push(\"\ud83d\udce7 *Email:* \" + fieldValue(\"email\"));\n    lines.push(\"\ud83d\udcde *Telefono:* \" + fieldValue(\"telefono\"));\n    lines.push(\"\ud83d\udcac *Preferencia de contacto:* \" + fieldValue(\"preferencia\"));\n    lines.push(\"\ud83d\udce8 *Mensaje:* \" + safeMessage());\n   } else if (tipo === \"Represento a un centro interesado\") {\n    lines.push(\"\ud83d\udccb *Solicitud Club Free Style BJJ*\");\n    lines.push(\"\ud83d\udcdd *Interesado:* Represento a un centro interesado\");\n    lines.push(\"\ud83d\udcdd *Nombre:* \" + fieldValue(\"responsable\"));\n    lines.push(\"\ud83d\udc23 *Fecha de nacimiento:* \" + formatDate(fieldValue(\"fecha_nacimiento\")));\n    lines.push(\"*Mayor de edad:* \" + fieldValue(\"mayor_edad\"));\n    lines.push(\"\ud83d\udcac *Preferencia de contacto:* \" + fieldValue(\"preferencia\"));\n    lines.push(\"\ud83c\udfeb *Centro representado:* \" + fieldValue(\"nombre_centro\"));\n    lines.push(\"\ud83c\udf10 *link del centro interesado:* \" + (fieldValue(\"link_centro\") || \"(rellenar informacion)\"));\n    lines.push(\"\ud83d\udc64 *Puesto:* \" + fieldValue(\"puesto_centro\"));\n    lines.push(\"\u2049\ufe0f *Interes:* \" + fieldValue(\"interes_centro\"));\n    lines.push(\"\ud83d\udce8 *Mensaje:* \" + safeMessage());\n   }\n   var sep = String.fromCharCode(38);\n   var body = fsDedupeRequestBody(lines.join(String.fromCharCode(10)));\n      var fsNow = Date.now ? Date.now() : new Date().getTime();\n      if (window.__fsLastContactMessage === body) {\n        if (fsNow - (window.__fsLastContactAt || 0) < 3500) return;\n      }\n      window.__fsLastContactMessage = body;\n      window.__fsLastContactAt = fsNow;\n   var submitMode = form.getAttribute(\"data-fs-submit-mode\") || \"whatsapp\";\n   if (submitMode === \"email\") {\n    window.location.href = \"mailto:info@clubfreestylebjj.com?subject=\" + encodeURIComponent(\"Solicitud Club Free Style BJJ\") + sep + \"body=\" + encodeURIComponent(body);\n   } else {\n    window.location.href = \"whatsapp:\/\/send?phone=\" + phone + sep + \"text=\" + encodeURIComponent(body);\n   }\n  });\n  modal.querySelector(\".fs-contact-close\").addEventListener(\"click\",function(){ modal.removeAttribute(\"open\"); }); modal.querySelector(\".fs-contact-cancel\").addEventListener(\"click\",function(){ modal.removeAttribute(\"open\"); }); refresh(form); return modal;\n }\n function openModal(link){ var modal = buildModal(); var form = modal.querySelector(\"form\"); var href = link ? (link.getAttribute(\"href\") || \"\") : \"\"; var emailMode = href.indexOf(\"mailto:\") === 0; if (form) { form.setAttribute(\"data-fs-submit-mode\", emailMode ? \"email\" : \"whatsapp\"); var pref = field(form,\"preferencia\"); if (emailMode) { if (pref) pref.value = \"Email\"; } } var submit = modal.querySelector(\".fs-contact-submit\"); if (submit) submit.textContent = emailMode ? \"Enviar email\" : \"Enviar WhatsApp\"; var desc = modal.querySelector(\".fs-contact-head p\"); if (desc) desc.textContent = emailMode ? \"Rellena los datos y prepararemos el email.\" : \"Rellena los datos y prepararemos el mensaje para WhatsApp.\"; modal.setAttribute(\"open\",\"\"); focusField(field(modal,\"tipo_interesado\")); }\n document.addEventListener(\"click\",function(e){ var link = e.target.closest ? e.target.closest(\"a[href]\") : null; if (!isContactLink(link)) return; e.preventDefault(); e.stopImmediatePropagation(); openModal(link); },true);\n})();\n<\/script>\n\n\n\n\n<script>\n(function(){\n if (window.__fsGlobalInteractionsSafeV2) return;\n window.__fsGlobalInteractionsSafeV2 = true;\n\n document.addEventListener(\"click\", function(event){\n  var summary = event.target && event.target.closest ? event.target.closest(\".fs-floating-menu > summary\") : null;\n  if (summary) {\n   var menu = summary.parentElement;\n   if (menu && menu.tagName === \"DETAILS\") {\n    event.preventDefault();\n    menu.open = !menu.open;\n   }\n   return;\n  }\n  var branchSummary = event.target && event.target.closest ? event.target.closest(\".fs-menu-branch > summary\") : null;\n  if (branchSummary) {\n   var branch = branchSummary.parentElement;\n   if (branch && branch.tagName === \"DETAILS\") {\n    event.preventDefault();\n    event.stopPropagation();\n    branch.open = !branch.open;\n   }\n   return;\n  }\n  var prev = event.target && event.target.closest ? event.target.closest(\"[data-carousel] .fs-prev\") : null;\n  var next = event.target && event.target.closest ? event.target.closest(\"[data-carousel] .fs-next\") : null;\n  if (!prev && !next) return;\n  var carousel = (prev || next).closest(\"[data-carousel]\");\n  var track = carousel && carousel.querySelector(\".fs-carousel-track\");\n  var slides = carousel ? carousel.querySelectorAll(\".fs-carousel-slide\") : [];\n  if (!track || !slides.length) return;\n  event.preventDefault();\n  event.stopPropagation();\n  var index = Number(carousel.dataset.fsSafeIndex || \"0\") || 0;\n  index = (index + (next ? 1 : -1) + slides.length) % slides.length;\n  carousel.dataset.fsSafeIndex = String(index);\n  track.style.transform = \"translateX(\" + (-index * 100) + \"%)\";\n }, false);\n\n function bootChampionshipSearch(){\n  var root = document.getElementById(\"buscador-campeonatos\");\n  if (!root || root.dataset.fsSafeSearch === \"true\") return;\n  var dataEl = document.getElementById(\"fs-cs-data\");\n  var grid = root.querySelector(\"[data-grid]\");\n  var pages = root.querySelector(\"[data-pages]\");\n  var count = root.querySelector(\"[data-count]\");\n  var pageState = root.querySelector(\"[data-page-state]\");\n  var empty = root.querySelector(\"[data-empty]\");\n  var loading = root.querySelector(\"[data-loading]\");\n  if (!dataEl || !grid || !pages) return;\n  var raw;\n  try { raw = JSON.parse(dataEl.textContent || \"{}\"); } catch(error) { return; }\n  var orgs = raw.orgs || {};\n  var today = new Date();\n  today = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n  var events = (raw.events || []).map(function(x){\n   var org = orgs[x[3]] || [x[3], x[2]];\n   return {t:x[0]||\"\",u:x[1]||\"#\",img:x[2]||\"\",org:x[3]||\"\",on:org[0]||x[3]||\"\",logo:org[1]||\"\",cc:x[4]||\"\",cn:x[5]||\"\",city:x[6]||\"\",prov:x[7]||\"\",loc:x[8]||\"\",start:x[9]||\"\",date:x[10]||\"\",days:x[11],status:x[12]||\"\",type:x[13]||\"\",pk:x[14]||\"unknown\",prize:x[15]||\"\",color:x[16]||\"#111\"};\n  });\n  var filters = {q:root.querySelector('[data-filter=\"q\"]'),org:root.querySelector('[data-filter=\"org\"]'),country:root.querySelector('[data-filter=\"country\"]'),province:root.querySelector('[data-filter=\"province\"]'),city:root.querySelector('[data-filter=\"city\"]'),type:root.querySelector('[data-filter=\"type\"]'),prize:root.querySelector('[data-filter=\"prize\"]'),sort:root.querySelector('[data-filter=\"sort\"]')};\n  var state = {status:\"upcoming\",page:1,pageSize:24};\n  function norm(v){return String(v||\"\").toLowerCase().normalize(\"NFD\").replace(new RegExp(\"[\" + String.fromCharCode(92) + \"u0300-\" + String.fromCharCode(92) + \"u036f]\", \"g\"), \"\").replace(new RegExp(String.fromCharCode(92) + \"s+\", \"g\"), \" \").trim();}\n  function esc(v){return String(v==null?\"\":v).replace(\/[&<>\"']\/g,function(c){return {\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#039;\"}[c];});}\n  function val(k){return filters[k]?filters[k].value:\"\";}\n  function actual(e){var p=String(e.start||\"\").split(\"-\");if(p.length===3){var d=new Date(Number(p[0]),Number(p[1])-1,Number(p[2]));return d<today?\"past\":\"upcoming\";}return e.status||\"upcoming\";}\n  function match(e){var q=norm(val(\"q\"));var text=norm([e.t,e.on,e.cn,e.cc,e.city,e.prov,e.loc,e.type,e.prize,e.pk].join(\" \"));var org=val(\"org\"),country=val(\"country\"),province=val(\"province\"),city=val(\"city\"),type=val(\"type\"),prizeVal=val(\"prize\");if(actual(e)!==state.status)return false;if(q ? text.indexOf(q)===-1 : false)return false;if(org ? e.org!==org : false)return false;if(country ? norm([e.cc,e.cn].join(\" \")).indexOf(norm(country))===-1 : false)return false;if(province ? norm(e.prov).indexOf(norm(province))===-1 : false)return false;if(city ? norm(e.city).indexOf(norm(city))===-1 : false)return false;if(type ? norm(e.type).indexOf(norm(type))===-1 : false)return false;if(prizeVal ? e.pk!==prizeVal : false)return false;return true;}\n  function sorted(list){var mode=val(\"sort\");return list.slice().sort(function(a,b){if(mode===\"name\")return a.t.localeCompare(b.t);if(mode===\"city\")return (a.city||a.loc).localeCompare(b.city||b.loc);if(mode===\"federation\")return (a.on||\"\").localeCompare(b.on||\"\");var at=a.start?Date.parse(a.start):8640000000000000,bt=b.start?Date.parse(b.start):8640000000000000;return state.status===\"past\"?bt-at:at-bt;});}\n  function days(e){if(e.days===\"\"||e.days==null||isNaN(Number(e.days)))return \"Fecha por confirmar\";var n=Number(e.days);if(actual(e)===\"past\")return Math.abs(n)+\" dias\";if(n===0)return \"hoy\";if(n===1)return \"1 dia\";return n+\" dias\";}\n  function prize(e){return e.prize || (e.pk===\"ranking\"?\"Ranking oficial. Premios no publicados en el resumen.\":\"Premios no publicados en el resumen oficial.\");}\n  function card(e){var img=e.img||e.logo||\"\";var logo=!e.img||e.img===e.logo;var bg=(logo ? e.color : false)?' style=\"background:linear-gradient(135deg,'+esc(e.color)+',#111)\"':\"\";return '<a class=\"fs-cs-event-card\" href=\"'+esc(e.u)+'\" target=\"_blank\" rel=\"noopener\"><div class=\"fs-cs-cover '+(logo?'is-logo':'')+'\"'+bg+'><img decoding=\"async\" loading=\"eager\" src=\"'+esc(img)+'\" alt=\"'+esc(e.t)+'\"><span class=\"fs-cs-cover-tag\">'+esc(e.on)+'<\/span><\/div><div class=\"fs-cs-event-body\"><h3>'+esc(e.t)+'<\/h3><div class=\"fs-cs-meta-line\"><span class=\"fs-cs-country\">'+esc(e.cc||\"--\")+'<\/span><span>'+esc(e.loc||e.city||e.cn||\"Evento oficial\")+'<\/span><\/div><div class=\"fs-cs-tags\"><span class=\"fs-cs-tag gold\">'+esc(actual(e)===\"past\"?\"Pasado\":\"Pr\u00f3ximo\")+'<\/span><span class=\"fs-cs-tag\">'+esc(e.type||\"Evento\")+'<\/span><\/div><div class=\"fs-cs-prize\"><b>Premio<\/b>'+esc(prize(e))+'<\/div><div class=\"fs-cs-date-row\"><span>'+esc(e.date||e.start||\"Fecha oficial\")+'<\/span><span class=\"fs-cs-days\">'+esc(days(e))+'<\/span><\/div><\/div><\/a>';}\n  function renderPages(totalPages){pages.innerHTML=\"\";if(totalPages<=1)return;function add(label,page,active,disabled){var b=document.createElement(\"button\");b.type=\"button\";b.textContent=label;b.disabled=!!disabled;if(active)b.className=\"is-active\";b.addEventListener(\"click\",function(e){e.preventDefault();state.page=page;render();});pages.appendChild(b);}add(\"Anterior\",Math.max(1,state.page-1),false,state.page===1);var start=Math.max(1,state.page-2),end=Math.min(totalPages,start+4);start=Math.max(1,end-4);for(var i=start;i<=end;i++)add(String(i),i,i===state.page,false);add(\"Siguiente\",Math.min(totalPages,state.page+1),false,state.page===totalPages);}\n  function render(){var list=sorted(events.filter(match));var total=list.length;var totalPages=Math.max(1,Math.ceil(total\/state.pageSize));if(state.page>totalPages)state.page=totalPages;grid.innerHTML=list.slice((state.page-1)*state.pageSize,state.page*state.pageSize).map(card).join(\"\");if(count)count.textContent=total+(total===1?\" evento encontrado\":\" eventos encontrados\");if(pageState)pageState.textContent=total?\"P\u00e1gina \"+state.page+\" de \"+totalPages:\"\";if(empty)empty.classList.toggle(\"is-visible\",total===0);if(loading)loading.style.display=\"none\";renderPages(totalPages);}\n  root.querySelectorAll(\"[data-status]\").forEach(function(b){b.addEventListener(\"click\",function(e){e.preventDefault();state.status=b.getAttribute(\"data-status\")||\"upcoming\";state.page=1;root.querySelectorAll(\"[data-status]\").forEach(function(x){x.classList.toggle(\"is-active\",x===b);});render();});});\n  Object.keys(filters).forEach(function(k){if(!filters[k])return;filters[k].addEventListener(\"input\",function(){state.page=1;render();});filters[k].addEventListener(\"change\",function(){state.page=1;render();});});\n  var reset=root.querySelector(\"[data-reset]\");if(reset)reset.addEventListener(\"click\",function(e){e.preventDefault();Object.keys(filters).forEach(function(k){if(filters[k])filters[k].value=\"\";});state.page=1;render();});\n  root.querySelectorAll(\"[data-quick]\").forEach(function(b){b.addEventListener(\"click\",function(e){e.preventDefault();if(filters.country)filters.country.value=b.getAttribute(\"data-quick\")===\"ES\"?\"ES\":\"\";if(filters.province)filters.province.value=\"\";if(filters.city)filters.city.value=\"\";state.page=1;render();});});\n  root.querySelectorAll(\"[data-quick-city]\").forEach(function(b){b.addEventListener(\"click\",function(e){e.preventDefault();if(filters.q)filters.q.value=b.getAttribute(\"data-quick-city\")||\"\";state.page=1;render();});});\n  root.dataset.fsSafeSearch = \"true\";\n  render();\n }\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", bootChampionshipSearch);\n else bootChampionshipSearch();\n window.addEventListener(\"load\", bootChampionshipSearch, {once:true});\n})();\n<\/script>\n<!-- fs-championships-fit-clean-v1 -->\n\n\n<!-- fs-global-media-text-autofit-v1 -->\n<script id=\"fs-merge-round2-js-v1\">\n(function(){\n  \"use strict\";\n\n  \/* origen: c636990249 - interacciones globales genericas:\n     - abre\/cierra el menu flotante (.fs-floating-menu) y sus ramas (.fs-menu-branch)\n     - flechas de carrusel (.fs-prev \/ .fs-next dentro de [data-carousel])\n     - motor del buscador de campeonatos (#buscador-campeonatos), lee sus datos de un\n       <script id=\"fs-cs-data\"> JSON embebido POR PAGINA -- el motor es generico, el\n       dato vive aparte, por lo que no hay riesgo de mezclar contenido entre paginas *\/\n  if (!window.__fsGlobalInteractionsSafeV2) {\n    window.__fsGlobalInteractionsSafeV2 = true;\n\n    document.addEventListener(\"click\", function(event){\n      var summary = event.target && event.target.closest ? event.target.closest(\".fs-floating-menu > summary\") : null;\n      if (summary) {\n        var menu = summary.parentElement;\n        if (menu && menu.tagName === \"DETAILS\") {\n          event.preventDefault();\n          menu.open = !menu.open;\n        }\n        return;\n      }\n      var branchSummary = event.target && event.target.closest ? event.target.closest(\".fs-menu-branch > summary\") : null;\n      if (branchSummary) {\n        var branch = branchSummary.parentElement;\n        if (branch && branch.tagName === \"DETAILS\") {\n          event.preventDefault();\n          event.stopPropagation();\n          branch.open = !branch.open;\n        }\n        return;\n      }\n      var prev = event.target && event.target.closest ? event.target.closest(\"[data-carousel] .fs-prev\") : null;\n      var next = event.target && event.target.closest ? event.target.closest(\"[data-carousel] .fs-next\") : null;\n      if (!prev && !next) return;\n      var carousel = (prev || next).closest(\"[data-carousel]\");\n      var track = carousel && carousel.querySelector(\".fs-carousel-track\");\n      var slides = carousel ? carousel.querySelectorAll(\".fs-carousel-slide\") : [];\n      if (!track || !slides.length) return;\n      event.preventDefault();\n      event.stopPropagation();\n      var index = Number(carousel.dataset.fsSafeIndex || \"0\") || 0;\n      index = (index + (next ? 1 : -1) + slides.length) % slides.length;\n      carousel.dataset.fsSafeIndex = String(index);\n      track.style.transform = \"translateX(\" + (-index * 100) + \"%)\";\n    }, false);\n\n    function bootChampionshipSearch(){\n      var root = document.getElementById(\"buscador-campeonatos\");\n      if (!root || root.dataset.fsSafeSearch === \"true\") return;\n      var dataEl = document.getElementById(\"fs-cs-data\");\n      var grid = root.querySelector(\"[data-grid]\");\n      var pages = root.querySelector(\"[data-pages]\");\n      var count = root.querySelector(\"[data-count]\");\n      var pageState = root.querySelector(\"[data-page-state]\");\n      var empty = root.querySelector(\"[data-empty]\");\n      var loading = root.querySelector(\"[data-loading]\");\n      if (!dataEl || !grid || !pages) return;\n      var raw;\n      try { raw = JSON.parse(dataEl.textContent || \"{}\"); } catch(error) { return; }\n      var orgs = raw.orgs || {};\n      var today = new Date();\n      today = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n      function mapEvents(list){\n        return (list || []).map(function(x){\n          var org = orgs[x[3]] || [x[3], x[2]];\n          return {t:x[0]||\"\",u:x[1]||\"#\",img:x[2]||\"\",org:x[3]||\"\",on:org[0]||x[3]||\"\",logo:org[1]||\"\",cc:x[4]||\"\",cn:x[5]||\"\",city:x[6]||\"\",prov:x[7]||\"\",loc:x[8]||\"\",start:x[9]||\"\",date:x[10]||\"\",days:x[11],status:x[12]||\"\",type:x[13]||\"\",pk:x[14]||\"unknown\",prize:x[15]||\"\",color:x[16]||\"#111\"};\n        });\n      }\n      var events = mapEvents(raw.events);\n      var fsCsFullLoadState = 0;\n      function ensureFullThenRender(){\n        if (fsCsFullLoadState === 2 || !raw.fullDataUrl) { render(); return; }\n        if (fsCsFullLoadState === 1) return;\n        fsCsFullLoadState = 1;\n        if (loading) loading.style.display = \"\";\n        fetch(raw.fullDataUrl).then(function(r){ return r.text(); }).then(function(text){\n          var fullData = JSON.parse(text);\n          if (fullData.orgs) { Object.keys(fullData.orgs).forEach(function(k){ orgs[k] = fullData.orgs[k]; }); }\n          events = mapEvents(fullData.events);\n          fsCsFullLoadState = 2;\n          render();\n        }).catch(function(){ fsCsFullLoadState = 0; render(); });\n      }\n      var filters = {q:root.querySelector('[data-filter=\"q\"]'),org:root.querySelector('[data-filter=\"org\"]'),country:root.querySelector('[data-filter=\"country\"]'),province:root.querySelector('[data-filter=\"province\"]'),city:root.querySelector('[data-filter=\"city\"]'),type:root.querySelector('[data-filter=\"type\"]'),prize:root.querySelector('[data-filter=\"prize\"]'),sort:root.querySelector('[data-filter=\"sort\"]')};\n      var state = {status:\"upcoming\",page:1,pageSize:24};\n      function norm(v){return String(v||\"\").toLowerCase().normalize(\"NFD\").replace(new RegExp(\"[\" + String.fromCharCode(92) + \"u0300-\" + String.fromCharCode(92) + \"u036f]\", \"g\"), \"\").replace(new RegExp(String.fromCharCode(92) + \"s+\", \"g\"), \" \").trim();}\n      function esc(v){return String(v==null?\"\":v).replace(\/[&<>\"']\/g,function(c){return {\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#039;\"}[c];});}\n      function val(k){return filters[k]?filters[k].value:\"\";}\n      function actual(e){var p=String(e.start||\"\").split(\"-\");if(p.length===3){var d=new Date(Number(p[0]),Number(p[1])-1,Number(p[2]));return d<today?\"past\":\"upcoming\";}return e.status||\"upcoming\";}\n      function match(e){var q=norm(val(\"q\"));var text=norm([e.t,e.on,e.cn,e.cc,e.city,e.prov,e.loc,e.type,e.prize,e.pk].join(\" \"));var org=val(\"org\"),country=val(\"country\"),province=val(\"province\"),city=val(\"city\"),type=val(\"type\"),prizeVal=val(\"prize\");if(actual(e)!==state.status)return false;if(q ? text.indexOf(q)===-1 : false)return false;if(org ? e.org!==org : false)return false;if(country ? norm([e.cc,e.cn].join(\" \")).indexOf(norm(country))===-1 : false)return false;if(province ? norm(e.prov).indexOf(norm(province))===-1 : false)return false;if(city ? norm(e.city).indexOf(norm(city))===-1 : false)return false;if(type ? norm(e.type).indexOf(norm(type))===-1 : false)return false;if(prizeVal ? e.pk!==prizeVal : false)return false;return true;}\n      function sorted(list){var mode=val(\"sort\");return list.slice().sort(function(a,b){if(mode===\"name\")return a.t.localeCompare(b.t);if(mode===\"city\")return (a.city||a.loc).localeCompare(b.city||b.loc);if(mode===\"federation\")return (a.on||\"\").localeCompare(b.on||\"\");var at=a.start?Date.parse(a.start):8640000000000000,bt=b.start?Date.parse(b.start):8640000000000000;return state.status===\"past\"?bt-at:at-bt;});}\n      function days(e){if(e.days===\"\"||e.days==null||isNaN(Number(e.days)))return \"Fecha por confirmar\";var n=Number(e.days);if(actual(e)===\"past\")return Math.abs(n)+\" dias\";if(n===0)return \"hoy\";if(n===1)return \"1 dia\";return n+\" dias\";}\n      function prize(e){return e.prize || (e.pk===\"ranking\"?\"Ranking oficial. Premios no publicados en el resumen.\":\"Premios no publicados en el resumen oficial.\");}\n\n      function card(e){var img=e.img||e.logo||\"\";var logo=!e.img||e.img===e.logo;var bg=(logo ? e.color : false)?' style=\"background:linear-gradient(135deg,'+esc(e.color)+',#111)\"':\"\";return '<a class=\"fs-cs-event-card\" href=\"'+esc(e.u)+'\" target=\"_blank\" rel=\"noopener\"><div class=\"fs-cs-cover '+(logo?'is-logo':'')+'\"'+bg+'><img decoding=\"async\" loading=\"lazy\" src=\"'+esc(img)+'\" alt=\"'+esc(e.t)+'\"><span class=\"fs-cs-cover-tag\">'+esc(e.on)+'<\/span><\/div><div class=\"fs-cs-event-body\"><h3>'+esc(e.t)+'<\/h3><div class=\"fs-cs-meta-line\"><span class=\"fs-cs-country\">'+esc(e.cc||\"--\")+'<\/span><span>'+esc(e.loc||e.city||e.cn||\"Evento oficial\")+'<\/span><\/div><div class=\"fs-cs-tags\"><span class=\"fs-cs-tag gold\">'+esc(actual(e)===\"past\"?\"Pasado\":\"Pr\u00f3ximo\")+'<\/span><span class=\"fs-cs-tag\">'+esc(e.type||\"Evento\")+'<\/span><\/div><div class=\"fs-cs-prize\"><b>Premio<\/b>'+esc(prize(e))+'<\/div><div class=\"fs-cs-date-row\"><span>'+esc(e.date||e.start||\"Fecha oficial\")+'<\/span><span class=\"fs-cs-days\">'+esc(days(e))+'<\/span><\/div><\/div><\/a>';}\n      function renderPages(totalPages){pages.innerHTML=\"\";if(totalPages<=1)return;function add(label,page,active,disabled){var b=document.createElement(\"button\");b.type=\"button\";b.textContent=label;b.disabled=!!disabled;if(active)b.className=\"is-active\";b.addEventListener(\"click\",function(e){e.preventDefault();state.page=page;render();});pages.appendChild(b);}add(\"Anterior\",Math.max(1,state.page-1),false,state.page===1);var start=Math.max(1,state.page-2),end=Math.min(totalPages,start+4);start=Math.max(1,end-4);for(var i=start;i<=end;i++)add(String(i),i,i===state.page,false);add(\"Siguiente\",Math.min(totalPages,state.page+1),false,state.page===totalPages);}\n      function render(){var list=sorted(events.filter(match));var total=list.length;var totalPages=Math.max(1,Math.ceil(total\/state.pageSize));if(state.page>totalPages)state.page=totalPages;grid.innerHTML=list.slice((state.page-1)*state.pageSize,state.page*state.pageSize).map(card).join(\"\");if(count)count.textContent=total+(total===1?\" evento encontrado\":\" eventos encontrados\");if(pageState)pageState.textContent=total?\"P\u00e1gina \"+state.page+\" de \"+totalPages:\"\";if(empty)empty.classList.toggle(\"is-visible\",total===0);if(loading)loading.style.display=\"none\";renderPages(totalPages);}\n      root.querySelectorAll(\"[data-status]\").forEach(function(b){b.addEventListener(\"click\",function(e){e.preventDefault();state.status=b.getAttribute(\"data-status\")||\"upcoming\";state.page=1;root.querySelectorAll(\"[data-status]\").forEach(function(x){x.classList.toggle(\"is-active\",x===b);});render();});});\n      Object.keys(filters).forEach(function(k){if(!filters[k])return;filters[k].addEventListener(\"input\",function(){state.page=1;ensureFullThenRender();});filters[k].addEventListener(\"change\",function(){state.page=1;ensureFullThenRender();});});\n      var reset=root.querySelector(\"[data-reset]\");if(reset)reset.addEventListener(\"click\",function(e){e.preventDefault();Object.keys(filters).forEach(function(k){if(filters[k])filters[k].value=\"\";});state.page=1;render();});\n      root.querySelectorAll(\"[data-quick]\").forEach(function(b){b.addEventListener(\"click\",function(e){e.preventDefault();if(filters.country)filters.country.value=b.getAttribute(\"data-quick\")===\"ES\"?\"ES\":\"\";if(filters.province)filters.province.value=\"\";if(filters.city)filters.city.value=\"\";state.page=1;render();});});\n      root.querySelectorAll(\"[data-quick-city]\").forEach(function(b){b.addEventListener(\"click\",function(e){e.preventDefault();if(filters.q)filters.q.value=b.getAttribute(\"data-quick-city\")||\"\";state.page=1;ensureFullThenRender();});});\n      root.dataset.fsSafeSearch = \"true\";\n      render();\n    }\n    if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", bootChampionshipSearch);\n    else bootChampionshipSearch();\n    window.addEventListener(\"load\", bootChampionshipSearch, {once:true});\n  }\n\n  \/* origen: 635a90b87b - scroll suave a anclas de horarios (.fs-schedule-link[href^=\"#\"]) *\/\n  (function scheduleAnchors(){\n    function init(){\n      document.querySelectorAll('.fs-schedule-link[href^=\"#\"]').forEach(function(link){\n        if(link.dataset.fsScheduleReady==='1')return;\n        link.dataset.fsScheduleReady='1';\n        link.addEventListener('click',function(e){\n          var target=document.querySelector(link.getAttribute('href'));\n          if(!target)return;\n          e.preventDefault();\n          target.scrollIntoView({behavior:'smooth',block:'start'});\n          try{history.pushState(null,'',link.getAttribute('href'));}catch(err){}\n        });\n      });\n    }\n    if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);\n    else init();\n  })();\n\n  \/* origen: 893dcfc3ae - garantiza que .fs-contact-actions \/ .fs-contact-choice queden al\n     final del formulario de contacto (evita que el reordenado dinamico del formulario los\n     deje en medio) *\/\n  if (!window.__fsContactFormFooterEnforcerSafe) {\n    window.__fsContactFormFooterEnforcerSafe = true;\n    function placeFooter(form){\n      if (!form || !form.querySelectorAll) return;\n      var actions = form.querySelector(\".fs-contact-actions\") || form.querySelector(\".fs-actions\");\n      var choice = form.querySelector(\".fs-contact-choice\");\n      if (actions && actions.parentNode === form && actions.nextElementSibling && actions.nextElementSibling !== choice) {\n        form.appendChild(actions);\n      }\n      if (choice && choice.parentNode === form && choice.nextElementSibling) {\n        form.appendChild(choice);\n      }\n    }\n    function scanFooters(){\n      document.querySelectorAll(\"form.fs-contact-form, .fs-contact-modal form, .fs-form-disclosure form, .fsbjj form.fs-form\").forEach(placeFooter);\n    }\n    document.addEventListener(\"change\", function(event){\n      var form = event.target && event.target.closest ? event.target.closest(\"form\") : null;\n      if (form) window.setTimeout(function(){ placeFooter(form); }, 40);\n    }, true);\n    if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", scanFooters);\n    else scanFooters();\n    window.addEventListener(\"load\", scanFooters, {once:true});\n  }\n\n  \/* origen: e186ccec01 - texto\/estado del boton de envio segun modo (WhatsApp vs email) y\n     segun si el checkbox de consentimiento esta marcado. Respeta la botonera de eleccion\n     (.fs-contact-choice) -- NO la oculta ni la fuerza, Marcelo confirmo que debe conservarse. *\/\n  if (!window.__fsSubmitModeLabelFix) {\n    window.__fsSubmitModeLabelFix = true;\n    function fixSubmitLabels(){\n      document.querySelectorAll('form.fs-contact-form, .fs-contact-modal form').forEach(function(form){\n        var submit = form.querySelector('.fs-contact-submit');\n        if (!submit) return;\n        var emailMode = form.getAttribute('data-fs-submit-mode') === 'email';\n        submit.textContent = emailMode ? 'Enviar email' : 'Enviar WhatsApp';\n        var consent = form.querySelector('[name=\"consentimiento\"]');\n        if (consent) {\n          submit.disabled = !consent.checked;\n          submit.setAttribute('aria-disabled', submit.disabled ? 'true' : 'false');\n        }\n      });\n    }\n    document.addEventListener('click', function(){ setTimeout(fixSubmitLabels, 90); }, true);\n    document.addEventListener('change', fixSubmitLabels, true);\n    document.addEventListener('input', fixSubmitLabels, true);\n    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', fixSubmitLabels);\n    else fixSubmitLabels();\n    window.addEventListener('load', fixSubmitLabels, { once:true });\n  }\n\n  \/* origen: ee8c24a4c8 - envuelve formularios .fsbjj form.fs-form en un <details> colapsable\n     (no toca los que ya viven dentro de .fs-form-disclosure) *\/\n  if (!window.__fsCollapsibleFormsReady) {\n    window.__fsCollapsibleFormsReady = true;\n    function titleFor(form){\n      var section = form.closest(\"section\");\n      var heading = section && section.querySelector(\"h2,h3\");\n      var submit = form.querySelector('button[type=\"submit\"],input[type=\"submit\"]');\n      var text = heading ? heading.textContent.trim() : \"\";\n      if (!text && submit) text = submit.textContent || submit.value || \"\";\n      return text || \"Formulario\";\n    }\n    function makeCollapsible(){\n      document.querySelectorAll(\".fsbjj form.fs-form\").forEach(function(form){\n        if (form.dataset.fsCollapsibleReady === \"true\") return;\n        if (form.closest(\".fs-form-disclosure\")) return;\n        form.dataset.fsCollapsibleReady = \"true\";\n        var details = document.createElement(\"details\");\n        details.className = \"fs-form-disclosure\";\n        var summary = document.createElement(\"summary\");\n        summary.textContent = titleFor(form);\n        form.parentNode.insertBefore(details, form);\n        details.appendChild(summary);\n        details.appendChild(form);\n      });\n    }\n    if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", makeCollapsible);\n    else makeCollapsible();\n    window.addEventListener(\"load\", makeCollapsible, {once:true});\n  }\n\n  \/* origen: 59f89a4f69 - recorta el credito de Kadence en el footer nativo despues del guion *\/\n  (function trimKadenceCredit(){\n    function trimKadenceCreditAfterDash(){\n      document.querySelectorAll('.site-footer .footer-html-inner p, .site-footer .site-info p').forEach(function(item){\n        var text = (item.textContent || '').replace(new RegExp(String.fromCharCode(92) + \"s+\", \"g\"), \" \").trim();\n        if (!text.includes('Club Free Style BJJ') || !text.includes(' - ')) return;\n        item.textContent = text.split(' - ')[0].trim();\n      });\n    }\n    trimKadenceCreditAfterDash();\n    document.addEventListener('DOMContentLoaded', trimKadenceCreditAfterDash);\n    window.addEventListener('load', trimKadenceCreditAfterDash);\n  })();\n\n})();\n\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Club Free Style BJJ Menu Inicio Clases Colegios Salesianos Paseo San Buenaventura Proyecto Liga escolar Campeonatos Tienda Contacto Salesianos Paseo BJJ en Salesianos San Miguel del Arcangel. Centro operativo del proyecto extraescolar y sede de entrenamiento para adultos, con tatami amplio y grupos diferenciados. Adultos Gi y No-Gi Adultos Gi y No-Gi en Salesianos Paseo&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-6973","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/clubfreestylebjj.com\/index.php\/wp-json\/wp\/v2\/pages\/6973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clubfreestylebjj.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/clubfreestylebjj.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/clubfreestylebjj.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/clubfreestylebjj.com\/index.php\/wp-json\/wp\/v2\/comments?post=6973"}],"version-history":[{"count":0,"href":"https:\/\/clubfreestylebjj.com\/index.php\/wp-json\/wp\/v2\/pages\/6973\/revisions"}],"wp:attachment":[{"href":"https:\/\/clubfreestylebjj.com\/index.php\/wp-json\/wp\/v2\/media?parent=6973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}