{"id":84472,"date":"2026-02-23T12:51:18","date_gmt":"2026-02-23T11:51:18","guid":{"rendered":"https:\/\/ejuniper.com\/?page_id=84472"},"modified":"2026-04-30T12:25:55","modified_gmt":"2026-04-30T11:25:55","slug":"events","status":"publish","type":"page","link":"https:\/\/ejuniper.com\/en\/events\/","title":{"rendered":"Events"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"84472\" class=\"elementor 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 attends the leading international tourism trade shows. Our team of professionals will be there to assist you personally and show you the best online distribution strategies for your business.<\/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>Choose the one that interests you most and get in touch with us:<\/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-1184ee5 e-con-full e-flex e-con e-parent\" data-id=\"1184ee5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-85e6766 e-con-full e-flex e-con e-child\" data-id=\"85e6766\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bc69cec elementor-widget elementor-widget-html\" data-id=\"bc69cec\" 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-3215938 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-html\" data-id=\"3215938\" 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=\"Search\" \/>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1b312cc elementor-widget elementor-widget-html\" data-id=\"1b312cc\" 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 attends the leading international tourism trade shows. Our team of professionals will be there to assist you personally and show you the best online distribution strategies for your business. Choose the one that interests you most and get in touch with us: 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-84472","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 Travel Technology<\/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\/en\/events\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Events Juniper Travel Technology\" \/>\n<meta property=\"og:description\" content=\"Events Juniper attends the leading international tourism trade shows. Our team of professionals will be there to assist you personally and show you the best online distribution strategies for your business. Choose the one that interests you most and get in touch with us: Link Link [formulario_pardot_events_EN] [formulario_pardot_events_ES] Events Editor Loading\u2026\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ejuniper.com\/en\/events\/\" \/>\n<meta property=\"og:site_name\" content=\"Juniper Travel Technology\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-30T11:25:55+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/events\\\/\",\"url\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/events\\\/\",\"name\":\"Events Juniper Travel Technology\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/#website\"},\"datePublished\":\"2026-02-23T11:51:18+00:00\",\"dateModified\":\"2026-04-30T11:25:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/events\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ejuniper.com\\\/en\\\/events\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/events\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Events\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/\",\"name\":\"https:\\\/\\\/ejuniper.com\\\/\",\"description\":\"Redefining Travel with Innovative Technology\",\"publisher\":{\"@id\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/#organization\",\"name\":\"Juniper Travel Technology\",\"url\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ejuniper.com\\\/en\\\/#\\\/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\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/juniper\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Events Juniper Travel Technology","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\/en\/events\/","og_locale":"en_US","og_type":"article","og_title":"Events Juniper Travel Technology","og_description":"Events Juniper attends the leading international tourism trade shows. Our team of professionals will be there to assist you personally and show you the best online distribution strategies for your business. Choose the one that interests you most and get in touch with us: Link Link [formulario_pardot_events_EN] [formulario_pardot_events_ES] Events Editor Loading\u2026","og_url":"https:\/\/ejuniper.com\/en\/events\/","og_site_name":"Juniper Travel Technology","article_modified_time":"2026-04-30T11:25:55+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/ejuniper.com\/en\/events\/","url":"https:\/\/ejuniper.com\/en\/events\/","name":"Events Juniper Travel Technology","isPartOf":{"@id":"https:\/\/ejuniper.com\/en\/#website"},"datePublished":"2026-02-23T11:51:18+00:00","dateModified":"2026-04-30T11:25:55+00:00","breadcrumb":{"@id":"https:\/\/ejuniper.com\/en\/events\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ejuniper.com\/en\/events\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ejuniper.com\/en\/events\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ejuniper.com\/en\/"},{"@type":"ListItem","position":2,"name":"Events"}]},{"@type":"WebSite","@id":"https:\/\/ejuniper.com\/en\/#website","url":"https:\/\/ejuniper.com\/en\/","name":"https:\/\/ejuniper.com\/","description":"Redefining Travel with Innovative Technology","publisher":{"@id":"https:\/\/ejuniper.com\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ejuniper.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ejuniper.com\/en\/#organization","name":"Juniper Travel Technology","url":"https:\/\/ejuniper.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ejuniper.com\/en\/#\/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\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/juniper\/"]}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/ejuniper.com\/en\/wp-json\/wp\/v2\/pages\/84472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ejuniper.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ejuniper.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ejuniper.com\/en\/wp-json\/wp\/v2\/users\/46"}],"replies":[{"embeddable":true,"href":"https:\/\/ejuniper.com\/en\/wp-json\/wp\/v2\/comments?post=84472"}],"version-history":[{"count":189,"href":"https:\/\/ejuniper.com\/en\/wp-json\/wp\/v2\/pages\/84472\/revisions"}],"predecessor-version":[{"id":87375,"href":"https:\/\/ejuniper.com\/en\/wp-json\/wp\/v2\/pages\/84472\/revisions\/87375"}],"wp:attachment":[{"href":"https:\/\/ejuniper.com\/en\/wp-json\/wp\/v2\/media?parent=84472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}