{"id":6231,"date":"2025-03-28T12:24:09","date_gmt":"2025-03-28T11:24:09","guid":{"rendered":"https:\/\/idelive.com\/?page_id=6231"},"modified":"2026-03-31T12:50:22","modified_gmt":"2026-03-31T10:50:22","slug":"politica-de-cancelacion","status":"publish","type":"page","link":"https:\/\/idelive.com\/de\/politica-de-cancelacion\/","title":{"rendered":"STORNIERUNGSBEDINGUNGEN"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"6231\" class=\"elementor elementor-6231\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-section elementor-top-section elementor-element elementor-element-7a9ba6d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7a9ba6d\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-de3c5c0\" data-id=\"de3c5c0\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b3fb325 elementor-widget elementor-widget-heading\" data-id=\"b3fb325\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Stornierungsbedingungen<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd9fcef elementor-widget elementor-widget-text-editor\" data-id=\"cd9fcef\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 style=\"text-align: left;\"><strong>Buchungen<\/strong><\/h2><p style=\"text-align: justify;\">Stornierungen best\u00e4tigter Buchungen, die einer Anzahlung von 200 \u20ac und einer Vertragsverwaltungsgeb\u00fchr von 100 \u20ac entsprechen, sind nicht erstattungsf\u00e4hig.<\/p><h2 style=\"text-align: left;\"><strong>Vertrags\u00e4nderungen und Stornierungen<\/strong><\/h2><p style=\"text-align: justify;\">Sie k\u00f6nnen Ihren Unterkunftsvertrag straffrei k\u00fcndigen, sofern Sie mindestens 32 Tage dort gewohnt haben und die K\u00fcndigung mindestens 30 Tage vor Monatsende (\u00fcber link.idelive.com\/checkout) einreichen. Zum K\u00fcndigungstermin m\u00fcssen Sie die Unterkunft sauber und bezugsfertig hinterlassen. Die Schl\u00fcssel werden Ihnen dann zur\u00fcckgegeben, und die Unterkunft wird vor der R\u00fcckerstattung der Kaution \u00fcberpr\u00fcft.<\/p><p style=\"text-align: justify;\">Die Unterkunft ist nur zur vor\u00fcbergehenden, nicht dauerhaften Nutzung bestimmt. Jede unvereinbare Nutzung (z. B. Anmeldung an der Adresse, Nutzung als Wohnsitz, Verlust des gew\u00f6hnlichen Aufenthalts oder sonstige Anzeichen f\u00fcr einen dauerhaften Aufenthalt) kann zur sofortigen K\u00fcndigung ohne R\u00fcckerstattung und ohne rechtliche Haftung f\u00fchren.<\/p><p style=\"text-align: justify;\">Aufenthalte sind auf eine maximale Dauer von 11 Monaten begrenzt; das Enddatum wird automatisch ab dem angegebenen Anreisedatum berechnet.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c235be8 elementor-widget elementor-widget-html\" data-id=\"c235be8\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n  <meta charset=\"UTF-8\">\r\n  <title>IDELIVE Chat<\/title>\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\r\n\r\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n\r\n  <style>\r\n    * {\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    :root {\r\n  --accent: #7D7D7D; \/* Gris para acento *\/\r\n  --bg1: #B0B0B0; \/* Gris para fondo del t\u00edtulo *\/\r\n  --bg2: #D3D3D3; \/* Gris m\u00e1s claro *\/\r\n  --panel: rgba(189, 189, 189, 0.18); \/* Gris suave para panel *\/\r\n  --stroke: rgba(189, 189, 189, 0.28); \/* Gris para borde *\/\r\n  --shadow: 0 20px 60px rgba(0, 0, 0, 0.18);\r\n  --text: #333333; \/* Gris oscuro para el texto *\/\r\n  --bubble: rgba(200, 200, 200, 0.72); \/* Gris claro para los mensajes del bot *\/\r\n  --bubbleStroke: rgba(200, 200, 200, 0.55); \/* Gris m\u00e1s tenue para borde de burbuja *\/\r\n}\r\n\r\n    body {\r\n      margin: 0;\r\n      padding: 0;\r\n      font-family: \"Montserrat\", sans-serif;\r\n    }\r\n\r\n    \/* ===== Bot\u00f3n Flotante ===== *\/\r\n    .chat-button {\r\n      position: fixed;\r\n      bottom: 80px;\r\n      right: 25px;\r\n      background: transparent;\r\n      border-radius: 50%;\r\n      width: 60px;\r\n      height: 60px;\r\n      display: flex;\r\n      justify-content: center;\r\n      align-items: center;\r\n      cursor: pointer;\r\n      z-index: 10000;\r\n      transition: opacity 0.3s ease, transform 0.2s ease;\r\n      filter: drop-shadow(0 10px 10px rgba(0.80, 0.80, 0.80, 0.60));\r\n    }\r\n    \r\n    .message a {\r\n  display: inline-block;\r\n  margin-top: 4px;\r\n  padding: 6px 10px;\r\n  border-radius: 8px;\r\n  background: rgba(0, 0, 0, 0.08);\r\n  color: #2f5cff;\r\n  text-decoration: none;\r\n  font-size: 11px;\r\n  line-height: 1.2;\r\n  max-width: 100%;\r\n}\r\n.link-center {\r\n  display: flex;\r\n  justify-content: center;\r\n  margin: 10px 0 6px;\r\n}\r\n\r\n.message a.chat-link-btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  min-width: 110px;\r\n  padding: 7px 14px;\r\n  border-radius: 10px;\r\n  background: rgba(255, 255, 255, 0.45);\r\n  color: #4a4a4a;\r\n  text-decoration: none;\r\n  font-size: 11px;\r\n  font-weight: 600;\r\n  line-height: 1.2;\r\n  text-align: center;\r\n  border: 1px solid rgba(0, 0, 0, 0.06);\r\n}\r\n\r\n.message a.chat-link-btn:hover {\r\n  background: rgba(255, 255, 255, 0.62);\r\n}\r\n\r\n.chat-separator {\r\n  border: 0;\r\n  height: 1px;\r\n  margin: 12px 0;\r\n  background: linear-gradient(\r\n    to right,\r\n    rgba(0,0,0,0),\r\n    rgba(0,0,0,0.18),\r\n    rgba(0,0,0,0)\r\n  );\r\n}\r\n.message a:hover {\r\n  background: rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n.bot-message a {\r\n  background: rgba(0, 0, 0, 0.06);\r\n}\r\n\r\n    .chat-button:active { transform: scale(0.9); }\r\n\r\n   .chat-button {\r\n  overflow: hidden; \/* Recorta lo que se salga *\/\r\n}\r\n\r\n.chat-button img {\r\n  width: 100%;\r\n  height: 100%;\r\n  object-fit: cover; \/* Ajusta la imagen al c\u00edrculo *\/\r\n  border-radius: 50%;\r\n}\r\n\r\n    \/* ===== Chat App Container ===== *\/\r\n    .chat-app {\r\n      position: fixed;\r\n      bottom: 80px;\r\n      right: 16px;\r\n      width: 280px;\r\n      height: 400px;\r\n      border-radius: 16px;\r\n      overflow: hidden;\r\n      background: var(--panel);\r\n      border: 1px solid var(--stroke);\r\n      box-shadow: var(--shadow);\r\n      backdrop-filter: blur(18px) saturate(160%);\r\n      -webkit-backdrop-filter: blur(18px) saturate(160%);\r\n      display: flex;\r\n      flex-direction: column;\r\n      \r\n      \/* Estado Inicial (Oculto abajo) *\/\r\n      transform: translateY(120%);\r\n      opacity: 0;\r\n      pointer-events: none;\r\n      transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.1), opacity 0.3s ease;\r\n      z-index: 9999;\r\n    }\r\n\r\n    .chat-app.open {\r\n      transform: translateY(0);\r\n      opacity: 1;\r\n      pointer-events: auto;\r\n    }\r\n\r\n    \/* ===== Header ===== *\/\r\n    .chat-header {\r\n  padding: 10px 14px;\r\n  background: linear-gradient(135deg, rgba(189, 189, 189, 0.85), rgba(169, 169, 169, 0.78)); \/* Fondo gris *\/\r\n  color: #fff;\r\n  border-bottom: 1px solid rgba(200, 200, 200, 0.25); \/* Gris m\u00e1s suave *\/\r\n}\r\n\r\n    .chat-header .title {\r\n      font-size: 14px;\r\n      font-weight: 700;\r\n      text-align: center;\r\n      margin: 0;\r\n    }\r\n\r\n    .chat-header .session { display: none; }\r\n\r\n    \/* ===== Body ===== *\/\r\n    .chat-body {\r\n      flex: 1;\r\n      padding: 10px;\r\n      overflow-y: auto;\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 8px;\r\n      background: linear-gradient(180deg, rgba(255, 255, 255, .10), rgba(255, 255, 255, .06));\r\n    }\r\n    .chat-body {\r\n  overflow-y: auto;\r\n\r\n  \/* Firefox *\/\r\n  scrollbar-width: none;\r\n\r\n  \/* IE y Edge antiguos *\/\r\n  -ms-overflow-style: none;\r\n}\r\n\r\n.chat-body::-webkit-scrollbar {\r\n  display: none; \/* Chrome, Safari *\/\r\n}\r\n\r\n    \/* ===== Messages ===== *\/\r\n    .message {\r\n      max-width: 88%;\r\n      padding: 8px 12px;\r\n      border-radius: 15px;\r\n      font-size: 12px;\r\n      line-height: 1.3;\r\n      word-wrap: break-word;\r\n      animation: fadeIn .22s ease;\r\n      \r\n    }\r\n    .bot-row {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n}\r\n\r\n.bot-avatar {\r\n  width: 28px;\r\n  height: 28px;\r\n  border-radius: 50%;\r\n  object-fit: cover;\r\n  flex-shrink: 0;\r\n  margin-top: 2px;\r\n}\r\n\r\n.bot-row .bot-message {\r\n  align-self: unset;\r\n  max-width: calc(100% - 40px);\r\n}\r\n\r\n    .message img {\r\n      max-width: 100%;\r\n      border-radius: 8px;\r\n      margin-bottom: 4px;\r\n      display: block;\r\n    }\r\n    .message {\r\n  white-space: normal;\r\n  overflow-wrap: anywhere;\r\n  word-break: break-word;\r\n}\r\n\r\n.message a {\r\n  color: #2f5cff;\r\n  text-decoration: underline;\r\n  word-break: break-word;\r\n}\r\n\r\n.message strong {\r\n  font-weight: 700;\r\n}\r\n\r\n.message ul {\r\n  margin: 6px 0 0 16px;\r\n  padding: 0;\r\n}\r\n\r\n.message li {\r\n  margin: 4px 0;\r\n}\r\n\r\n.message img {\r\n  max-width: 100%;\r\n  border-radius: 8px;\r\n  margin-bottom: 6px;\r\n  display: block;\r\n}\r\n\r\n.bot-message,\r\n.user-message {\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n.user-message {\r\n  align-self: flex-end;\r\n  color: #fff;\r\n  background: linear-gradient(135deg, #6b6b6b, #8a8a8a);\r\n  border: 1px solid rgba(255, 255, 255, 0.12);\r\n  border-bottom-right-radius: 4px;\r\n}\r\n\r\n    .bot-message {\r\n  align-self: flex-start;\r\n  color: var(--text);\r\n  background: var(--bubble); \/* Fondo gris claro para los mensajes del bot *\/\r\n  border: 1px solid var(--bubbleStroke); \/* Borde gris m\u00e1s tenue *\/\r\n  border-bottom-left-radius: 4px;\r\n}\r\n    \r\n\r\n    \/* ===== Typing indicator ===== *\/\r\n    .typing {\r\n      align-self: flex-start;\r\n      display: flex;\r\n      gap: 4px;\r\n      padding: 10px 14px;\r\n      background: var(--bubble);\r\n      border-radius: 15px;\r\n      border-bottom-left-radius: 4px;\r\n    }\r\n    .typing span {\r\n      width: 6px; height: 6px;\r\n      background: rgba(0, 0, 0, .4);\r\n      border-radius: 50%;\r\n      animation: blink 1.4s infinite both;\r\n    }\r\n    .typing span:nth-child(2) { animation-delay: .2s; }\r\n    .typing span:nth-child(3) { animation-delay: .4s; }\r\n\r\n    @keyframes blink { 0%, 100% { opacity: .2; } 20% { opacity: 1; } }\r\n\r\n    \/* ===== Input Bar ===== *\/\r\n    .chat-input {\r\n  padding: 10px;\r\n   background: rgba(169, 169, 169, 1); \/* Fondo opaco *\/\r\n  background: rgba(169, 169, 169, 1); \/* Fondo opaco *\/\r\n}\r\n\r\n    .input-shell {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 6px 10px;\r\n      border-radius: 20px;\r\n      background: rgba(255, 255, 255, 10.7);\r\n      border: 1px solid rgba(255, 255, 255, .5);\r\n    }\r\n\r\n    .chat-input input {\r\n      flex: 1;\r\n      border: none;\r\n      outline: none;\r\n      background: rgba(169, 169, 169, 0.05); \/* Fondo m\u00e1s tenue y gris oscuro *\/\r\n      font-size: 12px;\r\n      color: var(--text);\r\n    }\r\n    \r\n    \r\n    \/* Desplazar el bot\u00f3n solo en m\u00f3viles *\/\r\n@media (max-width: 767px) {\r\n  .chat-button {\r\n    right: 4px;  \/* Desplaza el bot\u00f3n un poco m\u00e1s a la derecha *\/\r\n  }\r\n}\r\n\/* Asegurarse de que el bot\u00f3n flotante est\u00e9 encima del chat *\/\r\n.chat-button {\r\n  z-index: 10001;  \/* Asegura que est\u00e9 sobre el chat *\/\r\n}\r\n\r\n    .send-btn {\r\n      width: 30px; height: 30px;\r\n      border: none; border-radius: 50%;\r\n       background: #7D7D7D; \/* Gris para el bot\u00f3n de enviar *\/\r\n      cursor: pointer;\r\n      display: flex; justify-content: center; align-items: center;\r\n    }\r\n\r\n    .send-btn svg {\r\n  width: 16px;\r\n  height: 16px;\r\n  fill: #fff;\r\n}\r\n\r\n    @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }\r\n  <\/style>\r\n<\/head>\r\n\r\n<body data-rsssl=1 data-rsssl=\"1\">\r\n\r\n  <div class=\"chat-button\" id=\"chat-toggle\">\r\n  <img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\" alt=\"chat\" \/>\r\n<\/div>\r\n\r\n  <div class=\"chat-app\" id=\"chat-app\">\r\n    <div class=\"chat-header\">\r\n      <div class=\"title\"><\/div>\r\n      <div id=\"session-id\" class=\"session\"><\/div>\r\n    <\/div>\r\n\r\n    <div id=\"chat-container\" class=\"chat-body\"><\/div>\r\n\r\n    <div class=\"chat-input\">\r\n      <div class=\"input-shell\">\r\n        <input type=\"text\" id=\"message-box\" placeholder=\"Escribe tu mensaje\u2026\" autocomplete=\"off\">\r\n        <button class=\"send-btn\" id=\"send-btn\" aria-label=\"Enviar\">\r\n          <svg viewbox=\"0 0 24 24\"><path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"\/><\/svg>\r\n        <\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <script>\r\n    const chatToggleBtn = document.getElementById(\"chat-toggle\");\r\n    const chatApp = document.getElementById(\"chat-app\");\r\n    const chat = document.getElementById(\"chat-container\");\r\n    const input = document.getElementById(\"message-box\");\r\n    const sendBtn = document.getElementById(\"send-btn\");\r\n    const sessionId = \"session-\" + Date.now();\r\n    let typingBubble = null;\r\n\r\n    \/* --- L\u00d3GICA DE APERTURA Y CIERRE (Clic fuera) --- *\/\r\n\r\n    chatToggleBtn.addEventListener(\"click\", (e) => {\r\n      e.stopPropagation();\r\n      chatApp.classList.add(\"open\");\r\n      chatToggleBtn.style.opacity = \"0\";\r\n      \/\/ Esperamos el fade out para quitar el bot\u00f3n del flujo\r\n      setTimeout(() => { chatToggleBtn.style.display = \"none\"; }, 300);\r\n    });\r\n\r\n    document.addEventListener(\"click\", (e) => {\r\n      if (chatApp.classList.contains(\"open\") && !chatApp.contains(e.target)) {\r\n        chatApp.classList.remove(\"open\");\r\n        \/\/ Restaurar bot\u00f3n despu\u00e9s de que el chat baje\r\n        setTimeout(() => {\r\n          chatToggleBtn.style.display = \"flex\";\r\n          setTimeout(() => { chatToggleBtn.style.opacity = \"1\"; }, 10);\r\n        }, 400);\r\n      }\r\n    });\r\n\r\n    \/* --- FUNCIONES DE LIMPIEZA Y RENDERIZADO (Originales) --- *\/\r\n\r\n    function sanitizeText(str){\r\n      str = String(str ?? \"\").replace(\/<br\\s*\\\/?>\/gi, \"\\n\");\r\n      str = str.replace(\/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F]\/g, \"\");\r\n      str = str.replace(\/[\\uE000-\\uF8FF]\/g, \"\");\r\n      return str.replace(\/\\uFFFD\/g, \"\");\r\n    }\r\n\r\n    function escapeHtml(str){\r\n      return str.replace(\/&\/g,\"&amp;\").replace(\/<\/g,\"&lt;\").replace(\/>\/g,\"&gt;\").replace(\/\"\/g,\"&quot;\").replace(\/'\/g,\"&#039;\");\r\n    }\r\n\r\n    function renderMarkdown(text){\r\n  let safe = sanitizeText(text);\r\n\r\n  \/\/ Normaliza saltos\r\n  safe = safe\r\n    .replace(\/\\\\n\/g, \"\\n\")\r\n    .replace(\/\\\\t\/g, \"\\t\")\r\n    .replace(\/\\r\\n\/g, \"\\n\")\r\n    .replace(\/\\r\/g, \"\\n\");\r\n\r\n  \/\/ Escapa HTML\r\n  safe = escapeHtml(safe);\r\n\r\n  const linkPlaceholders = [];\r\n  const saveLink = (url, label = \"Abrir enlace\") => {\r\n    const cleanUrl = url.replace(\/&amp;\/g, \"&\");\r\n    const html = `<div class=\"link-center\"><a href=\"${cleanUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"chat-link-btn\">${label}<\/a><\/div>`;\r\n    const token = `%%LINK_${linkPlaceholders.length}%%`;\r\n    linkPlaceholders.push({ token, html });\r\n    return token;\r\n  };\r\n\r\n  \/\/ Negritas\r\n  safe = safe.replace(\/\\*\\*(.*?)\\*\\*\/g, \"<strong>$1<\/strong>\");\r\n\r\n  \/\/ Convierte l\u00edneas separadoras tipo ---\r\n  safe = safe.replace(\/^\\s*---\\s*$\/gm, \"%%HR%%\");\r\n\r\n  \/\/ Elimina textos redundantes antes de enlaces de reserva\r\n  safe = safe.replace(\/Reserva aqui:\\s*\/gi, \"\");\r\n  safe = safe.replace(\/Reserva aqu\u00ed:\\s*\/gi, \"\");\r\n  safe = safe.replace(\/Enlace de reserva:\\s*\/gi, \"\");\r\n  safe = safe.replace(\/\ud83d\udd17\\s*Enlace de reserva:\\s*\/gi, \"\");\r\n\r\n  \/\/ Links markdown [texto](url)\r\n  safe = safe.replace(\r\n    \/\\[([^\\]]+)\\]\\((https?:\\\/\\\/[^\\s)]+)\\)\/g,\r\n    (match, textLabel, url) => {\r\n      let label = textLabel.trim();\r\n\r\n      if (url.includes(\"typeform\")) label = \"Reserva\";\r\n      else if (url.includes(\"youtube\")) label = \"Ver video\";\r\n      else if (url.includes(\"details-stay\")) label = \"Ver detalles\";\r\n         else if (url.includes(\"available\")) label = \"Ver disponibilidad\";\r\n else if (url.includes(\"checkout\")) label = \"Checkout\";\r\n  else if (url.includes(\"waiting\")) label = \"Lista de espera\";\r\n  else if (url.includes(\"https:\/\/idelive.com\/\")) label = \"Idelive\";\r\n    else if (url.includes(\"switch\")) label = \"Switch\";\r\n  else if (url.includes(\"switch\")) label = \"Switch\";\r\n  else if (url.includes(\"guests\")) label = \"Cita en oficina\";\r\n      return saveLink(url, label);\r\n    }\r\n  );\r\n\r\n  \/\/ Links entre <https:\/\/...>\r\n  safe = safe.replace(\r\n    \/&lt;(https?:\\\/\\\/.*?)&gt;\/g,\r\n    (match, url) => {\r\n      let label = \"Abrir enlace\";\r\n\r\n      if (url.includes(\"typeform\")) label = \"Reservar\";\r\n      else if (url.includes(\"youtube\")) label = \"Ver video\";\r\n      else if (url.includes(\"idealive\")) label = \"Ver detalles\";\r\n\r\n      return saveLink(url, label);\r\n    }\r\n  );\r\n\r\n  \/\/ URLs planas en una l\u00ednea sola\r\n  safe = safe.replace(\r\n    \/(^|[\\n\\s])((https?:\\\/\\\/[^\\s<]+))\/g,\r\n    (match, prefix, fullUrl) => {\r\n      let label = \"Abrir enlace\";\r\n\r\n      if (fullUrl.includes(\"typeform\")) label = \"Reservar\";\r\n      else if (fullUrl.includes(\"youtube\")) label = \"Ver video\";\r\n      else if (fullUrl.includes(\"idealive\")) label = \"Ver detalles\";\r\n\r\n      return `${prefix}${saveLink(fullUrl, label)}`;\r\n    }\r\n  );\r\n\r\n  \/\/ Listas con \"- \"\r\n  safe = safe.replace(\/(?:^|\\n)- (.*?)(?=\\n|$)\/g, \"<li>$1<\/li>\");\r\n  safe = safe.replace(\/(<li>.*?<\\\/li>)\/gs, \"<ul>$1<\/ul>\");\r\n  safe = safe.replace(\/<\\\/ul>\\s*<ul>\/g, \"\");\r\nsafe = safe.replace(\/\ud83d\udc49\\s*\/g, \"\");\r\n\/\/ Limpieza de placeholders y l\u00edneas no deseadas\r\nsafe = safe\r\n  .replace(\/^.*\ud83d\udcce.*$\/gim, \"\")\r\n  .replace(\/^.*\ud83d\udcf8\\s*Fotos.*$\/gim, \"\")\r\n  .replace(\/^\\s*[-\u2022]\\s*\\[[^\\]]+\\]\\(\\)\\s*$\/gim, \"\")\r\n  .replace(\/^\\s*\\[[^\\]]+\\]\\(\\)\\s*$\/gim, \"\")\r\n  .replace(\/^\\s*[\ud83d\udcce\ud83d\udcf8]\\s*$\/gim, \"\")\r\n  .replace(\/\\n{3,}\/g, \"\\n\\n\");\r\n  \/\/ Saltos de l\u00ednea\r\n  safe = safe.replace(\/\\n\/g, \"<br>\");\r\n\r\n  \/\/ Restaurar separadores\r\n  safe = safe.replace(\/%%HR%%\/g, '<hr class=\"chat-separator\">');\r\n\r\n  \/\/ Restaurar enlaces al final para que no se vuelvan a procesar\r\n  linkPlaceholders.forEach(item => {\r\n    safe = safe.replace(item.token, item.html);\r\n  });\r\n\r\n  \/\/ Limpieza opcional de <br> sobrantes alrededor de botones y hr\r\n  safe = safe\r\n    .replace(\/(<br>\\s*)+(<div class=\"link-center\">)\/g, \"$2\")\r\n    .replace(\/(<\\\/div>)(\\s*<br>)+\/g, \"$1\")\r\n    .replace(\/(<br>\\s*)+(<hr class=\"chat-separator\">)\/g, \"$2\")\r\n    .replace(\/(<hr class=\"chat-separator\">)(\\s*<br>)+\/g, \"$1\");\r\n\r\n  return safe;\r\n}\r\n\r\n    \/* --- INTERFAZ --- *\/\r\n\r\n    function showTyping(){\r\n      if(typingBubble) return;\r\n      typingBubble = document.createElement(\"div\");\r\n      typingBubble.className = \"typing\";\r\n      typingBubble.innerHTML = \"<span><\/span><span><\/span><span><\/span>\";\r\n      chat.appendChild(typingBubble);\r\n      chat.scrollTop = chat.scrollHeight;\r\n    }\r\n\r\n    function hideTyping(){\r\n      if(typingBubble){ typingBubble.remove(); typingBubble = null; }\r\n    }\r\n\r\n   function addMessage(text, type){\r\n  const rawText = String(text ?? \"\");\r\n\r\n  const imageRegex = \/(https?:\\\/\\\/(?:lh3\\.googleusercontent\\.com\\\/d\\\/[A-Za-z0-9_-]+|[^\\s]+?\\.(?:jpg|jpeg|png|gif|webp)(?:\\?[^\\s]+)?))\/gi;\r\n  const images = rawText.match(imageRegex) || [];\r\n\r\n  let cleanText = rawText.replace(imageRegex, \"\").trim();\r\n\r\n  const div = document.createElement(\"div\");\r\n  div.className = \"message \" + (type === \"user\" ? \"user-message\" : \"bot-message\");\r\n\r\n  images.forEach(url => {\r\n    const img = document.createElement(\"img\");\r\n    img.src = url;\r\n    img.alt = \"Imagen\";\r\n    img.loading = \"lazy\";\r\n    div.appendChild(img);\r\n  });\r\n\r\n  if (cleanText || (!images.length && !cleanText)) {\r\n    const textDiv = document.createElement(\"div\");\r\n    textDiv.innerHTML = renderMarkdown(cleanText || rawText);\r\n    div.appendChild(textDiv);\r\n  }\r\n\r\n  if(type === \"bot\"){\r\n    const row = document.createElement(\"div\");\r\n    row.className = \"bot-row\";\r\n\r\n    const avatar = document.createElement(\"img\");\r\n    avatar.className = \"bot-avatar\";\r\n    avatar.src = \"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\";\r\n    avatar.alt = \"Avatar bot\";\r\n\r\n    row.appendChild(avatar);\r\n    row.appendChild(div);\r\n    chat.appendChild(row);\r\n  } else {\r\n    chat.appendChild(div);\r\n  }\r\n\r\n  chat.scrollTop = chat.scrollHeight;\r\n}\r\n\r\n    \/* --- ENV\u00cdO DE MENSAJES --- *\/\r\n\r\nasync function sendMessage(){\r\n  const msg = input.value.trim();\r\n  if(!msg) return;\r\n\r\n  input.value = \"\";\r\n  addMessage(msg, \"user\");\r\n  showTyping();\r\n\r\n  try {\r\n    const response = await fetch(\"https:\/\/n8n.srv965472.hstgr.cloud\/webhook\/87cc5e12-4f11-4f4c-82d6-a80f3f9323c8\", {\r\n      method: \"POST\",\r\n      headers: { \"Content-Type\": \"application\/json\" },\r\n      body: JSON.stringify({ sessionId, message: msg })\r\n    });\r\n\r\n    if (!response.ok) {\r\n      const errorText = await response.text();\r\n      throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n    }\r\n\r\n    const data = await response.json();\r\n    hideTyping();\r\n\r\n    const reply =\r\n      data?.reply ??\r\n      data?.output ??\r\n      data?.data?.reply ??\r\n      (Array.isArray(data) ? data[0]?.reply || data[0]?.output : null);\r\n\r\n    if (reply) {\r\n      addMessage(reply, \"bot\");\r\n    } else {\r\n      console.log(\"Respuesta sin reply:\", data);\r\n      addMessage(\"\u26a0\ufe0f Sin respuesta del servidor\", \"bot\");\r\n    }\r\n  } catch (err) {\r\n    hideTyping();\r\n    console.error(\"Error en fetch:\", err);\r\n    addMessage(\"\u274c Error de conexi\u00f3n\", \"bot\");\r\n  }\r\n}\r\n    sendBtn.addEventListener(\"click\", sendMessage);\r\n    input.addEventListener(\"keydown\", e => { if(e.key === \"Enter\") sendMessage(); });\r\n\r\n    \/\/ Bienvenida\r\n    addMessage(\"\ud83d\udc4b **Bienvenido a IDELIVE**\\nEstoy aqu\u00ed para ayudarte a comenzar tu aventura.\", \"bot\");\r\n  <\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Cancellation policy Bookings Cancellations of confirmed bookings, which are equivalent to a \u20ac200 deposit and a \u20ac100 contract management fee, are non-refundable. Contract changes and cancellations You can cancel your accommodation service contract without penalty, provided you have stayed for at least 32 days and give at least 30 days&#8217; notice before the end of [&hellip;]<\/p>","protected":false},"author":57,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-6231","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Pol\u00edtica de cancelaci\u00f3n - Idelive<\/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:\/\/idelive.com\/de\/politica-de-cancelacion\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pol\u00edtica de cancelaci\u00f3n - Idelive\" \/>\n<meta property=\"og:description\" content=\"Cancellation policy Bookings Cancellations of confirmed bookings, which are equivalent to a \u20ac200 deposit and a \u20ac100 contract management fee, are non-refundable. Contract changes and cancellations You can cancel your accommodation service contract without penalty, provided you have stayed for at least 32 days and give at least 30 days&#8217; notice before the end of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/idelive.com\/de\/politica-de-cancelacion\/\" \/>\n<meta property=\"og:site_name\" content=\"Idelive\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-31T10:50:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"2\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/idelive.com\/politica-de-cancelacion\/\",\"url\":\"https:\/\/idelive.com\/politica-de-cancelacion\/\",\"name\":\"Pol\u00edtica de cancelaci\u00f3n - Idelive\",\"isPartOf\":{\"@id\":\"https:\/\/idelive.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/idelive.com\/politica-de-cancelacion\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/idelive.com\/politica-de-cancelacion\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\",\"datePublished\":\"2025-03-28T11:24:09+00:00\",\"dateModified\":\"2026-03-31T10:50:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/idelive.com\/politica-de-cancelacion\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/idelive.com\/politica-de-cancelacion\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/idelive.com\/politica-de-cancelacion\/#primaryimage\",\"url\":\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\",\"contentUrl\":\"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/idelive.com\/politica-de-cancelacion\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/idelive.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pol\u00edtica de cancelaci\u00f3n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/idelive.com\/#website\",\"url\":\"https:\/\/idelive.com\/\",\"name\":\"Idelive\",\"description\":\"Private Residences\",\"publisher\":{\"@id\":\"https:\/\/idelive.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/idelive.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/idelive.com\/#organization\",\"name\":\"Idelive\",\"url\":\"https:\/\/idelive.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/idelive.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/idelive.com\/wp-content\/uploads\/2022\/10\/cropped-Only-Square.png\",\"contentUrl\":\"https:\/\/idelive.com\/wp-content\/uploads\/2022\/10\/cropped-Only-Square.png\",\"width\":512,\"height\":512,\"caption\":\"Idelive\"},\"image\":{\"@id\":\"https:\/\/idelive.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pol\u00edtica de cancelaci\u00f3n - Idelive","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:\/\/idelive.com\/de\/politica-de-cancelacion\/","og_locale":"de_DE","og_type":"article","og_title":"Pol\u00edtica de cancelaci\u00f3n - Idelive","og_description":"Cancellation policy Bookings Cancellations of confirmed bookings, which are equivalent to a \u20ac200 deposit and a \u20ac100 contract management fee, are non-refundable. Contract changes and cancellations You can cancel your accommodation service contract without penalty, provided you have stayed for at least 32 days and give at least 30 days&#8217; notice before the end of [&hellip;]","og_url":"https:\/\/idelive.com\/de\/politica-de-cancelacion\/","og_site_name":"Idelive","article_modified_time":"2026-03-31T10:50:22+00:00","og_image":[{"url":"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"2\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/idelive.com\/politica-de-cancelacion\/","url":"https:\/\/idelive.com\/politica-de-cancelacion\/","name":"Pol\u00edtica de cancelaci\u00f3n - Idelive","isPartOf":{"@id":"https:\/\/idelive.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/idelive.com\/politica-de-cancelacion\/#primaryimage"},"image":{"@id":"https:\/\/idelive.com\/politica-de-cancelacion\/#primaryimage"},"thumbnailUrl":"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp","datePublished":"2025-03-28T11:24:09+00:00","dateModified":"2026-03-31T10:50:22+00:00","breadcrumb":{"@id":"https:\/\/idelive.com\/politica-de-cancelacion\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/idelive.com\/politica-de-cancelacion\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/idelive.com\/politica-de-cancelacion\/#primaryimage","url":"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp","contentUrl":"https:\/\/lh3.googleusercontent.com\/d\/1iiDxNA7P9_6zTChQswArq9ZSwcTGqkbp"},{"@type":"BreadcrumbList","@id":"https:\/\/idelive.com\/politica-de-cancelacion\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/idelive.com\/"},{"@type":"ListItem","position":2,"name":"Pol\u00edtica de cancelaci\u00f3n"}]},{"@type":"WebSite","@id":"https:\/\/idelive.com\/#website","url":"https:\/\/idelive.com\/","name":"Idelive","description":"Private Residences","publisher":{"@id":"https:\/\/idelive.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/idelive.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/idelive.com\/#organization","name":"Idelive","url":"https:\/\/idelive.com\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/idelive.com\/#\/schema\/logo\/image\/","url":"https:\/\/idelive.com\/wp-content\/uploads\/2022\/10\/cropped-Only-Square.png","contentUrl":"https:\/\/idelive.com\/wp-content\/uploads\/2022\/10\/cropped-Only-Square.png","width":512,"height":512,"caption":"Idelive"},"image":{"@id":"https:\/\/idelive.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/idelive.com\/de\/wp-json\/wp\/v2\/pages\/6231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/idelive.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/idelive.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/idelive.com\/de\/wp-json\/wp\/v2\/users\/57"}],"replies":[{"embeddable":true,"href":"https:\/\/idelive.com\/de\/wp-json\/wp\/v2\/comments?post=6231"}],"version-history":[{"count":20,"href":"https:\/\/idelive.com\/de\/wp-json\/wp\/v2\/pages\/6231\/revisions"}],"predecessor-version":[{"id":7671,"href":"https:\/\/idelive.com\/de\/wp-json\/wp\/v2\/pages\/6231\/revisions\/7671"}],"wp:attachment":[{"href":"https:\/\/idelive.com\/de\/wp-json\/wp\/v2\/media?parent=6231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}