{"id":87132,"date":"2026-02-23T12:51:18","date_gmt":"2026-02-23T11:51:18","guid":{"rendered":"https:\/\/ejuniper.com\/events\/"},"modified":"2026-04-30T14:41:38","modified_gmt":"2026-04-30T13:41:38","slug":"events","status":"publish","type":"page","link":"https:\/\/ejuniper.com\/es\/events\/","title":{"rendered":"Events"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"87132\" class=\"elementor elementor-87132 elementor-84472\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3c59075 e-con-full e-flex e-con e-parent\" data-id=\"3c59075\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-6a8c6d0 e-con-full e-flex e-con e-child\" data-id=\"6a8c6d0\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-f4f1a74 e-con-full e-flex e-con e-child\" data-id=\"f4f1a74\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-82b3403 elementor-widget elementor-widget-heading\" data-id=\"82b3403\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Events<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-419c086 elementor-widget elementor-widget-text-editor\" data-id=\"419c086\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Juniper asiste a las principales ferias internacionales de turismo. Nuestro equipo de profesionales estar\u00e1 all\u00ed para atenderte personalmente y mostrarte las mejores estrategias de distribuci\u00f3n online para tu negocio.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-271bcdc elementor-widget elementor-widget-text-editor\" data-id=\"271bcdc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Elige la feria que m\u00e1s te interese y ponte en contacto con nosotros:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-74c1842 e-con-full elementor-hidden-desktop elementor-hidden-laptop elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-child\" data-id=\"74c1842\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-eb27c17 simply-link elementor-widget elementor-widget-heading\" data-id=\"eb27c17\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/ejuniper.com\/\">Link<\/a><\/p>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5d0cf8b simply-link elementor-widget elementor-widget-heading\" data-id=\"5d0cf8b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/ejuniper.com\/\">Link<\/a><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9cfd4fe e-con-full e-flex e-con e-child\" data-id=\"9cfd4fe\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-386d01a e-con-full e-flex e-con e-parent\" data-id=\"386d01a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-56ec280 e-con-full e-flex e-con e-child\" data-id=\"56ec280\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0198e5e elementor-widget elementor-widget-html\" data-id=\"0198e5e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"events-forms-bank\">\n  <div class=\"events-form-bank-item events-form-bank-item-en\">\n    [formulario_pardot_events_EN]\n  <\/div>\n\n  <div class=\"events-form-bank-item events-form-bank-item-es\">\n    [formulario_pardot_events_ES]\n  <\/div>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86c18c2 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-html\" data-id=\"86c18c2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n.events-search-wrap{\n  width:100% !important;\n  max-width:100% !important;\n}\n\ninput#eventsSearch.events-search{\n  display:block !important;\n  box-sizing:border-box !important;\n  font-family:\"Montserrat\", sans-serif !important;\n  font-size:16px !important;\n  border:1px solid #A7A7A7 !important;\n  border-radius:50px !important;\n  padding:10px 15px !important;\n  background:#fff !important;\n  color:#1D1E1B !important;\n  outline:none !important;\n  width:280px !important;\n  max-width:100% !important;\n  box-shadow:none !important;\n}\n\ninput#eventsSearch.events-search::placeholder{\n  color:#9a9a9a !important;\n}\n\ninput#eventsSearch.events-search:focus{\n  border-color:#1D1E1B !important;\n}\n\ninput#eventsSearch.events-search::-webkit-search-cancel-button{\n  -webkit-appearance:none;\n  appearance:none;\n  width:18px;\n  height:18px;\n  cursor:pointer;\n  background-color:#1D1E1B;\n  -webkit-mask-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.3 5.7a1 1 0 0 0-1.4 0L12 10.6 7.1 5.7A1 1 0 0 0 5.7 7.1L10.6 12l-4.9 4.9a1 1 0 1 0 1.4 1.4L12 13.4l4.9 4.9a1 1 0 0 0 1.4-1.4L13.4 12l4.9-4.9a1 1 0 0 0 0-1.4z'\/%3E%3C\/svg%3E\");\n  -webkit-mask-repeat:no-repeat;\n  -webkit-mask-position:center;\n}\n\n@media (max-width:767px){\n  .events-search-wrap{\n    width:100% !important;\n  }\n\n  input#eventsSearch.events-search{\n    width:100% !important;\n    max-width:100% !important;\n  }\n}\n<\/style>\n\n<div class=\"events-search-wrap\">\n  <input id=\"eventsSearch\" class=\"events-search\" type=\"search\" placeholder=\"Buscar\" \/>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6897d77 elementor-widget elementor-widget-html\" data-id=\"6897d77\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n\n<style>\n:root{\n  --text:#1d1e1b;\n  --shadow:0 0 25px 0 rgba(8,59,160,0.2);\n  --shadowHover:0 0 10px 0 rgba(8,59,160,0.2);\n  --radius:32px;\n}\n\n.events-wrap{\n  width:100%;\n  box-sizing:border-box;\n  font-family:\"Montserrat\",sans-serif;\n  color:var(--text);\n}\n\n\/* GRID *\/\n.events-grid{\n  display:grid;\n  gap:24px;\n  align-items:stretch;\n  grid-auto-rows:auto;\n}\n\n\/* desktop grande *\/\n@media (min-width:1400px){\n  .events-grid{ grid-template-columns:repeat(4,1fr); }\n}\n\n\/* port\u00e1til *\/\n@media (min-width:992px) and (max-width:1399.98px){\n  .events-grid{ grid-template-columns:repeat(3,1fr); }\n}\n\n\/* tablet *\/\n@media (min-width:768px) and (max-width:991.98px){\n  .events-grid{ grid-template-columns:repeat(2,1fr); }\n}\n\n\/* m\u00f3vil *\/\n@media (max-width:767.98px){\n  .events-grid{ grid-template-columns:1fr; }\n}\n\n\/* CARD *\/\n.event-card{\n  position:relative;\n  background:#fff;\n  border-radius:var(--radius);\n  box-shadow:var(--shadowHover);\n  overflow:hidden;\n  display:flex;\n  flex-direction:column;\n  align-self:stretch;\n  transition:box-shadow .25s ease;\n  transform:translateZ(0);\n  cursor:pointer;\n}\n.event-card:hover{ box-shadow:var(--shadow); }\n.event-card-inner{ height:100%; display:flex; flex-direction:column; }\n\n.event-img{\n  height:160px;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  overflow:hidden;\n  box-sizing:border-box;\n}\n\n.event-img-logo{\n  display:block;\n  max-width:180px !important;\n  max-height:100px !important;\n  width:auto;\n  height:auto;\n  object-fit:contain;\n}\n\n.event-info{\n  padding:12px 24px 24px 24px;\n  min-height:150px;\n  display:flex;\n  flex-direction:column;\n  flex:1;\n}\n\n.event-name{\n  font-size:22px;\n  font-weight:600;\n  line-height:1.25;\n  margin:0;\n  color:var(--text);\n}\n\n.event-row{\n  display:flex;\n  align-items:center;\n  gap:8px;\n  margin-top:8px;\n}\n\n.event-meta{\n  font-size:12px;\n  font-weight:500;\n  margin:0;\n}\n\n.event-meta-wrap{ margin-top:auto; }\n\n\/* STAND *\/\n.event-stand{\n  display:inline-block;\n  padding:4px 8px;\n  border-radius:4px;\n  border:1px solid #ebebeb;\n  font-size:12px;\n  font-weight:500;\n  margin-top:6px;\n  color:#ee0700;\n}\n\n.event-icon{ font-size:16px; color:#d70000; }\n\n.event-card.is-past .event-icon{ color:#9a9a9a; }\n.event-card.is-past .event-img{ filter:grayscale(1); }\n.event-card.is-past{ cursor:default; }\n.event-card.is-past:hover{ box-shadow:var(--shadowHover); }\n\n\/* Separator *\/\n.events-separator{\n  grid-column:1 \/ -1;\n  align-self:start;\n  display:flex;\n  align-items:center;\n  gap:16px;\n  margin:0;\n  padding:36px 0;\n}\n.events-separator::before,\n.events-separator::after{\n  content:\"\";\n  height:1px;\n  background:#ddd;\n  flex:1;\n}\n.events-separator span{\n  font-size:14px;\n  font-weight:600;\n  color:#777;\n  white-space:nowrap;\n}\n\n\/* CTA *\/\n.event-cta{\n  position:absolute;\n  top:16px;\n  left:16px;\n  height:32px;\n  width:32px;\n  background:#F0F4FF;\n  border-radius:999px;\n  display:flex;\n  align-items:center;\n  justify-content:flex-start;\n  overflow:hidden;\n  transition:width .3s ease;\n  pointer-events:none;\n}\n\n.event-cta-icon{\n  width:32px;\n  height:32px;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  flex-shrink:0;\n}\n\n.event-cta-icon .material-symbols-outlined{\n  font-size:16px;\n  color:#000000;\n  display:block;\n  line-height:1;\n  font-variation-settings:\"wght\" 600;\n}\n\n.event-cta-text{\n  white-space:nowrap;\n  margin-left:8px;\n  margin-right:14px;\n  font-size:14px;\n  font-weight:600;\n  color:#000000;\n  opacity:0;\n  transition:opacity .2s ease;\n}\n\n.event-card:hover .event-cta{ width:240px; }\n.event-card:hover .event-cta-text{ opacity:1; }\n.event-card.is-past .event-cta{ display:none !important; }\n\n\/* Close icon *\/\n.event-close{ display:none; }\n.event-close .material-symbols-outlined{ font-size:22px; }\n\n\/* Form slot *\/\n.event-form-slot{ display:none; padding:0 24px 24px; }\n\n\/* Banco de formularios:\n   oculto visualmente pero renderizado para que el shortcode se inicialice *\/\n.events-forms-bank{\n  position:absolute !important;\n  left:-99999px !important;\n  top:auto !important;\n  width:1px !important;\n  height:1px !important;\n  overflow:hidden !important;\n  opacity:0 !important;\n  pointer-events:none !important;\n}\n\n.events-form-bank-item{\n  display:block;\n}\n\n\/* MODAL *\/\n.events-modal-backdrop{\n  position:fixed;\n  inset:0;\n  z-index:99999;\n  display:flex;\n  justify-content:center;\n  align-items:center;\n  padding:40px;\n  background:rgba(0,0,0,0);\n  backdrop-filter:blur(0);\n  animation:backdropIn 900ms cubic-bezier(.16,1,.3,1) forwards;\n  overflow:auto;\n}\n\n@keyframes backdropIn{\n  to{\n    background:rgba(0,0,0,.28);\n    backdrop-filter:blur(6px);\n  }\n}\n\n.events-modal{\n  width:min(960px,94vw);\n  background:#fff;\n  border-radius:36px;\n  box-shadow:0 40px 80px rgba(0,0,0,.35);\n  transform:translateX(120vw);\n  opacity:0;\n  animation:modalSlideIn 1400ms cubic-bezier(.16,1,.3,1) forwards;\n}\n\n@keyframes modalSlideIn{\n  0%{ transform:translateX(120vw); opacity:0; }\n  60%{ transform:translateX(20px); opacity:.95; }\n  100%{ transform:translateX(0); opacity:1; }\n}\n\n.events-modal .event-card{\n  overflow:visible;\n  box-shadow:none;\n  border-radius:36px;\n  cursor:default;\n}\n\n.events-modal .event-card-inner{\n  height:auto !important;\n}\n\n.events-modal .event-cta{ display:none !important; }\n\n.events-modal .event-close{\n  display:block !important;\n  position:absolute;\n  top:24px;\n  right:24px;\n  z-index:10;\n}\n\n.events-modal .event-form-slot{\n  display:block !important;\n  padding:0 !important;\n}\n\n.events-modal .event-img{\n  width:300px;\n  height:120px;\n  border-radius:16px;\n  border:1px solid #e5e5e5;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  overflow:hidden;\n  box-sizing:border-box;\n  padding:10px;\n}\n\n.events-modal .event-img-logo{\n  max-width:100%;\n  max-height:100%;\n  width:auto;\n  height:auto;\n  object-fit:contain;\n}\n\n\/* Modal layout *\/\n@media (min-width:768px){\n  .events-modal .event-card-inner{\n    display:grid;\n    grid-template-columns:300px 1fr;\n    gap:24px;\n    padding:24px;\n  }\n  .events-modal .event-form-slot{\n    grid-column:1 \/ -1;\n  }\n}\n\n@media (max-width:767px){\n  .events-modal .event-card-inner{\n    display:flex;\n    flex-direction:column;\n    gap:16px;\n    padding:24px;\n  }\n  .events-modal .event-img{\n    display:none;\n  }\n}\n\n.events-modal .event-info{\n  min-height:auto;\n  padding:0;\n  flex:0;\n}\n\n.events-modal .event-meta-wrap{\n  margin-top:0;\n}\n\n.events-modal .event-stand{\n  margin-top:4px;\n}\n\n.events-modal .event-row{\n  margin-top:6px;\n}\n\n.events-modal .event-row-country-date{\n  display:grid;\n  grid-template-columns:16px 120px 1fr;\n  align-items:center;\n  column-gap:8px;\n  width:100%;\n}\n\n.events-modal .event-row-country-date > .material-symbols-outlined{\n  width:16px;\n  justify-self:start;\n}\n\n.events-modal .event-row-country-date > .event-meta{\n  overflow:hidden;\n  text-overflow:ellipsis;\n  white-space:nowrap;\n}\n\n.events-modal .event-row-country-date > .event-date-inline{\n  grid-column:3;\n  display:flex;\n  align-items:center;\n  gap:6px;\n  white-space:nowrap;\n  justify-self:start;\n}\n\n.events-modal .event-info{\n  display:grid;\n  grid-template-rows:auto auto;\n  row-gap:16px;\n}\n\n.events-modal .event-meta-wrap{\n  margin-top:0;\n}\n<\/style>\n\n<div class=\"events-wrap\">\n  <div id=\"eventsStatus\" class=\"events-status\">Loading\u2026<\/div>\n  <div id=\"eventsGrid\" class=\"events-grid\"><\/div>\n<\/div>\n\n<script>\n(async function () {\n  const DATA_URL = \"https:\/\/ejuniper.com\/events\/events-list.json\";\n\n  const statusEl = document.getElementById(\"eventsStatus\");\n  const gridEl   = document.getElementById(\"eventsGrid\");\n\n  function getLang() {\n    const path = window.location.pathname.toLowerCase();\n    if (path === \"\/es\" || path.startsWith(\"\/es\/\")) return \"es\";\n    return \"en\";\n  }\n\n  const lang = getLang();\n\n  const i18n = {\n    en: {\n      loading: \"Loading\u2026\",\n      noEvents: \"No events found.\",\n      pastEvents: \"Past events\",\n      cta: \"Ask for an appointment\"\n    },\n    es: {\n      loading: \"Cargando\u2026\",\n      noEvents: \"No se encontraron eventos.\",\n      pastEvents: \"Eventos pasados\",\n      cta: \"Solicitar una cita\"\n    }\n  };\n\n  statusEl.textContent = i18n[lang].loading;\n\n  function esc(s) {\n    return String(s ?? \"\")\n      .replace(\/&\/g, \"&amp;\")\n      .replace(\/<\/g, \"&lt;\")\n      .replace(\/>\/g, \"&gt;\")\n      .replace(\/\"\/g, \"&quot;\")\n      .replace(\/'\/g, \"&#039;\");\n  }\n\n  function parseUSDate(str) {\n    if (!str) return null;\n    const parts = String(str).split(\"\/\");\n    if (parts.length !== 3) return null;\n\n    const mm = Number(parts[0]);\n    const dd = Number(parts[1]);\n    const yyyy = Number(parts[2]);\n\n    if (!mm || !dd || !yyyy) return null;\n    return new Date(yyyy, mm - 1, dd);\n  }\n\n  function isPastEvent(ev) {\n    const end = parseUSDate(ev.fecha_fin);\n    if (!end) return false;\n    const today = new Date();\n    today.setHours(0,0,0,0);\n    return end < today;\n  }\n\nfunction getEventName(ev) {\n  return lang === \"es\"\n    ? (ev.nombre_es || ev.nombre_en || ev.nombre || \"\")\n    : (ev.nombre_en || ev.nombre_es || ev.nombre || \"\");\n}\n\n  function getEventCountry(ev) {\n    return lang === \"es\"\n      ? (ev.pais_es || ev.pais_en || \"\")\n      : (ev.pais_en || ev.pais_es || \"\");\n  }\n\n  function getEventCity(ev) {\n    return lang === \"es\"\n      ? (ev.ciudad_es || ev.ciudad_en || \"\")\n      : (ev.ciudad_en || ev.ciudad_es || \"\");\n  }\n\nfunction formatDate(str) {\n  const d = parseUSDate(str);\n  if (!d) return str || \"\";\n\n  const day = String(d.getDate()).padStart(2,\"0\");\n  const month = String(d.getMonth()+1).padStart(2,\"0\");\n  const year = d.getFullYear();\n\n  if (lang === \"es\") {\n    return day + \"\/\" + month + \"\/\" + year;   \/\/ 27\/04\/2026\n  } else {\n    return month + \"\/\" + day + \"\/\" + year;   \/\/ 04\/27\/2026\n  }\n}\n\n  function formatDateRange(start, end) {\n    const startTxt = formatDate(start);\n    const endTxt = formatDate(end);\n    return startTxt === endTxt ? startTxt : (startTxt + \" - \" + endTxt);\n  }\n\n  function renderCard(ev) {\n    const name = getEventName(ev);\n    const country = getEventCountry(ev);\n    const city = getEventCity(ev);\n    const dateRange = formatDateRange(ev.fecha_inicio, ev.fecha_fin);\n\n    const card = document.createElement(\"div\");\n    card.className = \"event-card\";\n    card.dataset.eventName = name;\n    card.dataset.eventId = ev.id || \"\";\n\n    if (isPastEvent(ev)) card.classList.add(\"is-past\");\n\n    card.innerHTML = `\n      <div class=\"event-card-inner\">\n        <div class=\"event-close\">\n          <span class=\"material-symbols-outlined\">close<\/span>\n        <\/div>\n\n        <div class=\"event-cta\">\n          <div class=\"event-cta-icon\">\n            <span class=\"material-symbols-outlined\">east<\/span>\n          <\/div>\n          <div class=\"event-cta-text\">${esc(i18n[lang].cta)}<\/div>\n        <\/div>\n\n        <div class=\"event-img\">\n          ${ev.imagen_src\n            ? `<img decoding=\"async\" class=\"event-img-logo\" src=\"${esc(ev.imagen_src)}\" alt=\"${esc(name)} logo\">`\n            : ``\n          }\n        <\/div>\n\n        <div class=\"event-info\">\n          <div>\n            <div class=\"event-name\">${esc(name)}<\/div>\n            ${ev.stand ? `<div class=\"event-stand\">${esc(ev.stand)}<\/div>` : \"\"}\n          <\/div>\n\n          <div class=\"event-meta-wrap\">\n            <div class=\"event-row\" data-label=\"country\">\n              <span class=\"material-symbols-outlined event-icon\">public<\/span>\n              <p class=\"event-meta\">${esc(country)}<\/p>\n            <\/div>\n\n            <div class=\"event-row\">\n              <span class=\"material-symbols-outlined event-icon\">location_on<\/span>\n              <p class=\"event-meta\">${esc(city)}<\/p>\n            <\/div>\n\n            <div class=\"event-row\">\n              <span class=\"material-symbols-outlined event-icon\">calendar_today<\/span>\n              <p class=\"event-meta\">${esc(dateRange)}<\/p>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"event-form-slot\"><\/div>\n      <\/div>\n    `;\n    return card;\n  }\n\n  function renderEvents(list) {\n    list = list.slice().sort((a,b) => {\n      const pa = isPastEvent(a);\n      const pb = isPastEvent(b);\n      if (pa !== pb) return pa ? 1 : -1;\n\n      const da = parseUSDate(a.fecha_inicio) || new Date(0);\n      const db = parseUSDate(b.fecha_inicio) || new Date(0);\n      return da - db;\n    });\n\n    gridEl.innerHTML = \"\";\n    let separatorInserted = false;\n\n    list.forEach((ev) => {\n      if (!separatorInserted && isPastEvent(ev)) {\n        const sep = document.createElement(\"div\");\n        sep.className = \"events-separator\";\n        sep.innerHTML = `<span>${esc(i18n[lang].pastEvents)}<\/span>`;\n        gridEl.appendChild(sep);\n        separatorInserted = true;\n      }\n      gridEl.appendChild(renderCard(ev));\n    });\n\n    statusEl.textContent = list.length ? \"\" : i18n[lang].noEvents;\n    equalizeCardHeights();\n  }\n\n  function equalizeCardHeights() {\n    const cards = Array.from(gridEl.querySelectorAll(\".event-card\"));\n    if (!cards.length) return;\n    cards.forEach((c) => c.style.height = \"auto\");\n    let max = 0;\n    cards.forEach((c) => { max = Math.max(max, c.offsetHeight); });\n    cards.forEach((c) => { c.style.height = max + \"px\"; });\n  }\n\n  \/\/ ===== FORM HELPERS =====\n  function getBankForm() {\n    return lang === \"es\"\n      ? document.querySelector(\".events-form-bank-item-es\")\n      : document.querySelector(\".events-form-bank-item-en\");\n  }\n\n  function setEventNameInContainer(container, name) {\n    if (!container) return;\n\n    const hidden =\n      container.querySelector('input[name=\"event_name\"]') ||\n      container.querySelector(\"#event_name\");\n\n    if (hidden) hidden.value = name || \"\";\n  }\n\n  function mountFormInSlot(slot, eventName) {\n    if (!slot) return;\n\n    const bankForm = getBankForm();\n    if (!bankForm) {\n      console.warn(\"No se encontr\u00f3 el formulario del idioma actual:\", lang);\n      return;\n    }\n\n    setEventNameInContainer(bankForm, eventName);\n\n    slot.innerHTML = \"\";\n    slot.appendChild(bankForm);\n  }\n\n  function restoreFormsBank() {\n    const bank = document.querySelector(\".events-forms-bank\");\n    if (!bank) return;\n\n    const enForm = document.querySelector(\".events-form-bank-item-en\");\n    const esForm = document.querySelector(\".events-form-bank-item-es\");\n\n    if (enForm && enForm.parentElement !== bank) bank.appendChild(enForm);\n    if (esForm && esForm.parentElement !== bank) bank.appendChild(esForm);\n  }\n\n  \/\/ ===== MODAL =====\n  let modalBackdrop = null;\n\n  function closeModal() {\n    if (!modalBackdrop) return;\n\n    restoreFormsBank();\n\n    modalBackdrop.remove();\n    modalBackdrop = null;\n  }\n\n  function openModalFromCard(card) {\n    if (card.classList.contains(\"is-past\")) return;\n\n    closeModal();\n\n    modalBackdrop = document.createElement(\"div\");\n    modalBackdrop.className = \"events-modal-backdrop\";\n\n    const modal = document.createElement(\"div\");\n    modal.className = \"events-modal\";\n\n    const clone = card.cloneNode(true);\n\n    (function mergeCountryAndDateInModal(){\n      const metaWrap = clone.querySelector(\".event-meta-wrap\");\n      if (!metaWrap) return;\n\n      const rows = metaWrap.querySelectorAll(\":scope > .event-row\");\n      if (rows.length < 3) return;\n\n      const countryRow = rows[0];\n      const dateRow    = rows[2];\n\n      const dateInline = document.createElement(\"div\");\n      dateInline.className = \"event-date-inline\";\n      dateInline.innerHTML = dateRow.innerHTML;\n\n      dateRow.remove();\n\n      countryRow.classList.add(\"event-row-country-date\");\n      countryRow.appendChild(dateInline);\n    })();\n\n    clone.style.height = \"auto\";\n\n    modal.appendChild(clone);\n    modalBackdrop.appendChild(modal);\n    document.body.appendChild(modalBackdrop);\n\n    const slot = clone.querySelector(\".event-form-slot\");\n    mountFormInSlot(slot, card.dataset.eventName || \"\");\n\n    modalBackdrop.addEventListener(\"click\", (e) => {\n      if (e.target === modalBackdrop) closeModal();\n    });\n\n    clone.addEventListener(\"click\", (e) => {\n      const closeBtn = e.target.closest(\".event-close\");\n      if (closeBtn) {\n        e.stopPropagation();\n        closeModal();\n      }\n    });\n\n    modal.addEventListener(\"click\", (e) => e.stopPropagation());\n  }\n\n  \/\/ ===== LOAD =====\n  try {\n    const r = await fetch(DATA_URL, { cache: \"no-store\" });\n    if (!r.ok) throw new Error(\"HTTP \" + r.status);\n\n    const data = await r.json();\n    const events = Array.isArray(data.events) ? data.events.slice() : [];\n    const allEvents = events.slice();\n\n    renderEvents(allEvents);\n\n    const searchEl = document.getElementById(\"eventsSearch\");\n\n    function norm(s) {\n      return String(s ?? \"\")\n        .toLowerCase()\n        .normalize(\"NFD\")\n        .replace(\/[\\u0300-\\u036f]\/g, \"\")\n        .trim();\n    }\n\n    function buildHaystack(ev) {\n      return norm([\n        ev.nombre,\n        ev.nombre_en,\n        ev.nombre_es,\n        ev.stand,\n        ev.pais_en,\n        ev.pais_es,\n        ev.ciudad_en,\n        ev.ciudad_es,\n        ev.fecha_inicio,\n        ev.fecha_fin,\n        formatDate(ev.fecha_inicio),\n        formatDate(ev.fecha_fin),\n        formatDateRange(ev.fecha_inicio, ev.fecha_fin)\n      ].filter(Boolean).join(\" \"));\n    }\n\n    function applySearch() {\n      const q = norm(searchEl?.value || \"\");\n      closeModal();\n\n      if (!q) {\n        renderEvents(allEvents);\n        return;\n      }\n\n      const filtered = allEvents.filter(ev => buildHaystack(ev).includes(q));\n      renderEvents(filtered);\n    }\n\n    if (searchEl) {\n      searchEl.addEventListener(\"input\", applySearch);\n      searchEl.addEventListener(\"search\", applySearch);\n      applySearch();\n    } else {\n      console.warn(\"No se encontr\u00f3 #eventsSearch en el DOM.\");\n    }\n\n    gridEl.addEventListener(\"click\", (e) => {\n      const card = e.target.closest(\".event-card\");\n      if (!card) return;\n      openModalFromCard(card);\n    });\n\n    window.addEventListener(\"keydown\", (e) => {\n      if (e.key === \"Escape\") closeModal();\n    });\n\n    let resizeTimer;\n    window.addEventListener(\"resize\", () => {\n      clearTimeout(resizeTimer);\n      resizeTimer = setTimeout(() => {\n        equalizeCardHeights();\n      }, 150);\n    });\n\n  } catch (e) {\n    statusEl.textContent = \"ERROR: \" + (e && e.message ? e.message : String(e));\n    console.error(e);\n  }\n  \n\/\/ \u2500\u2500\u2500 Deep-link: abre modal por ?event=id \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction openEventById(id) {\n  if (!id) return;\n\n  const cards = Array.from(gridEl.querySelectorAll(\".event-card:not(.is-past)\"));\n  const target = cards.find(card => card.dataset.eventId === id);\n\n  if (target) {\n    target.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n    setTimeout(() => openModalFromCard(target), 400);\n  }\n}\n\nconst urlParams = new URLSearchParams(window.location.search);\nconst eventId = urlParams.get(\"event\");\nif (eventId) openEventById(eventId);\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Events Juniper asiste a las principales ferias internacionales de turismo. Nuestro equipo de profesionales estar\u00e1 all\u00ed para atenderte personalmente y mostrarte las mejores estrategias de distribuci\u00f3n online para tu negocio. Elige la feria que m\u00e1s te interese y ponte en contacto con nosotros: Link Link [formulario_pardot_events_EN] [formulario_pardot_events_ES] Events Editor Loading\u2026<\/p>\n","protected":false},"author":46,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"class_list":["post-87132","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Events Juniper<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ejuniper.com\/es\/events\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Events Juniper\" \/>\n<meta property=\"og:description\" content=\"Events Juniper asiste a las principales ferias internacionales de turismo. Nuestro equipo de profesionales estar\u00e1 all\u00ed para atenderte personalmente y mostrarte las mejores estrategias de distribuci\u00f3n online para tu negocio. Elige la feria que m\u00e1s te interese y ponte en contacto con nosotros: Link Link [formulario_pardot_events_EN] [formulario_pardot_events_ES] Events Editor Loading\u2026\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ejuniper.com\/es\/events\/\" \/>\n<meta property=\"og:site_name\" content=\"Juniper\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-30T13:41:38+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/events\\\/\",\"url\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/events\\\/\",\"name\":\"Events Juniper\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/#website\"},\"datePublished\":\"2026-02-23T11:51:18+00:00\",\"dateModified\":\"2026-04-30T13:41:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/events\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ejuniper.com\\\/es\\\/events\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/events\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Events\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/\",\"name\":\"https:\\\/\\\/ejuniper.com\\\/\",\"description\":\"Redefining Travel with Innovative Technology\",\"publisher\":{\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/#organization\",\"name\":\"Juniper Travel Technology\",\"url\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/ejuniper.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/juniper-2-1.svg\",\"contentUrl\":\"https:\\\/\\\/ejuniper.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/juniper-2-1.svg\",\"width\":48,\"height\":48,\"caption\":\"Juniper Travel Technology\"},\"image\":{\"@id\":\"https:\\\/\\\/ejuniper.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/juniper\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Events Juniper","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ejuniper.com\/es\/events\/","og_locale":"es_ES","og_type":"article","og_title":"Events Juniper","og_description":"Events Juniper asiste a las principales ferias internacionales de turismo. Nuestro equipo de profesionales estar\u00e1 all\u00ed para atenderte personalmente y mostrarte las mejores estrategias de distribuci\u00f3n online para tu negocio. Elige la feria que m\u00e1s te interese y ponte en contacto con nosotros: Link Link [formulario_pardot_events_EN] [formulario_pardot_events_ES] Events Editor Loading\u2026","og_url":"https:\/\/ejuniper.com\/es\/events\/","og_site_name":"Juniper","article_modified_time":"2026-04-30T13:41:38+00:00","twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/ejuniper.com\/es\/events\/","url":"https:\/\/ejuniper.com\/es\/events\/","name":"Events Juniper","isPartOf":{"@id":"https:\/\/ejuniper.com\/es\/#website"},"datePublished":"2026-02-23T11:51:18+00:00","dateModified":"2026-04-30T13:41:38+00:00","breadcrumb":{"@id":"https:\/\/ejuniper.com\/es\/events\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ejuniper.com\/es\/events\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ejuniper.com\/es\/events\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Inicio","item":"https:\/\/ejuniper.com\/es\/"},{"@type":"ListItem","position":2,"name":"Events"}]},{"@type":"WebSite","@id":"https:\/\/ejuniper.com\/es\/#website","url":"https:\/\/ejuniper.com\/es\/","name":"https:\/\/ejuniper.com\/","description":"Redefining Travel with Innovative Technology","publisher":{"@id":"https:\/\/ejuniper.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ejuniper.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/ejuniper.com\/es\/#organization","name":"Juniper Travel Technology","url":"https:\/\/ejuniper.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/ejuniper.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/ejuniper.com\/wp-content\/uploads\/2024\/11\/juniper-2-1.svg","contentUrl":"https:\/\/ejuniper.com\/wp-content\/uploads\/2024\/11\/juniper-2-1.svg","width":48,"height":48,"caption":"Juniper Travel Technology"},"image":{"@id":"https:\/\/ejuniper.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/juniper\/"]}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/ejuniper.com\/es\/wp-json\/wp\/v2\/pages\/87132","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ejuniper.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ejuniper.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ejuniper.com\/es\/wp-json\/wp\/v2\/users\/46"}],"replies":[{"embeddable":true,"href":"https:\/\/ejuniper.com\/es\/wp-json\/wp\/v2\/comments?post=87132"}],"version-history":[{"count":36,"href":"https:\/\/ejuniper.com\/es\/wp-json\/wp\/v2\/pages\/87132\/revisions"}],"predecessor-version":[{"id":87384,"href":"https:\/\/ejuniper.com\/es\/wp-json\/wp\/v2\/pages\/87132\/revisions\/87384"}],"wp:attachment":[{"href":"https:\/\/ejuniper.com\/es\/wp-json\/wp\/v2\/media?parent=87132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}