{"id":1241,"date":"2023-10-30T14:50:15","date_gmt":"2023-10-30T13:50:15","guid":{"rendered":"https:\/\/ferienhaus-ilsenburg-harz.de\/book-now\/"},"modified":"2026-10-28T08:41:08","modified_gmt":"2026-10-28T07:41:08","slug":"book-now","status":"publish","type":"page","link":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/book-now\/","title":{"rendered":"Book Now"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1241\" class=\"elementor elementor-1241 elementor-713\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ee4581d e-con-full e-flex e-con e-child\" data-id=\"ee4581d\" 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-aaaf79b e-con-full e-flex e-con e-child\" data-id=\"aaaf79b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-b36789e e-con-full e-flex e-con e-child\" data-id=\"b36789e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ef724be elementor-widget elementor-widget-heading\" data-id=\"ef724be\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Book Your Dream Vacation in Ilsenburg in the Harz Mountains<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0a0f1dc elementor-widget elementor-widget-text-editor\" data-id=\"0a0f1dc\" data-element_type=\"widget\" data-e-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<p class=\"p1\">Enjoy your next vacation in the picturesque greenery of the Ilse Valley in one of our luxurious chalets.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ab18b6f elementor-widget elementor-widget-image\" data-id=\"ab18b6f\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"2000\" height=\"400\" src=\"https:\/\/ferienhaus-ilsenburg-harz.de\/wp-content\/uploads\/2023\/08\/chalets-clouds.png\" class=\"attachment-full size-full wp-image-1246\" alt=\"Clouds in the Ilsetal - Chalets zum Ilsetal\" srcset=\"https:\/\/ferienhaus-ilsenburg-harz.de\/wp-content\/uploads\/2023\/08\/chalets-clouds.png 2000w, https:\/\/ferienhaus-ilsenburg-harz.de\/wp-content\/uploads\/2023\/08\/chalets-clouds-300x60.png 300w, https:\/\/ferienhaus-ilsenburg-harz.de\/wp-content\/uploads\/2023\/08\/chalets-clouds-1024x205.png 1024w, https:\/\/ferienhaus-ilsenburg-harz.de\/wp-content\/uploads\/2023\/08\/chalets-clouds-768x154.png 768w, https:\/\/ferienhaus-ilsenburg-harz.de\/wp-content\/uploads\/2023\/08\/chalets-clouds-1536x307.png 1536w\" sizes=\"(max-width: 2000px) 100vw, 2000px\" \/>\t\t\t\t\t\t\t\t\t\t\t\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-dea946f e-flex e-con-boxed e-con e-parent\" data-id=\"dea946f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-224379b e-con-full e-flex e-con e-child\" data-id=\"224379b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-da4d06b elementor-widget elementor-widget-html\" data-id=\"da4d06b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n<!--\nILSENBURG BUCHUNGSALTERNATIVEN V11\n\nVilla Ottilienruh\nChalets zum Ilsetal\nLandh\u00e4user Ilsenburg\n\nNEU:\n- Herkunftswebseite automatisch erkennen\n- Freundlicher Hinweis auf der Zielseite\n- Reisedaten mit Aufenthalt und G\u00e4sten anzeigen\n- Hinweis auf den Weiter-Button\n- easybooking Ersatzlink nur bei \u00dcbernahmefehler\n\nBESTEHENDE FUNKTIONEN:\n- Live Verf\u00fcgbarkeitsabfrage\n- Unterkunftsbeschreibung\n- Personenanzahl\n- Voraussichtlicher Gesamtpreis\n- Galeriebilder\n- Eigene Unterkunftswebseiten verlinken\n- Reisedaten per URL \u00fcbertragen\n- Automatisches Scrollen\n-->\n\n<div id=\"ils-live-check\" hidden=\"\">\n  <div class=\"ils-check-box\">\n\n    <h2>Discover our other accommodations<\/h2>\n\n    <p id=\"ils-check-intro\" class=\"ils-check-intro\"><\/p>\n\n    <div id=\"ils-check-dates\"><\/div>\n    <div id=\"ils-check-results\"><\/div>\n\n    <p class=\"ils-check-note\">\n      Offers are requested via easybooking.\n      Displayed prices may differ from the final\n      booking price. The information in the booking\n      system is binding.\n    <\/p> \n\n  <\/div>\n<\/div>\n\n<!-- HINWEIS AUF DER ZIELWEBSEITE -->\n\n<div id=\"ils-transfer-box\" hidden=\"\">\n\n  <div class=\"ils-transfer-heading\">\n    <span class=\"ils-transfer-icon\">\u2713<\/span>\n    <strong>\n      Welcome! Your travel dates have been applied.\n    <\/strong> \n  <\/div>\n\n  <p id=\"ils-transfer-origin\"><\/p>\n\n  <div id=\"ils-transfer-details\"><\/div>\n\n  <p id=\"ils-transfer-status\"><\/p>\n\n  <a id=\"ils-transfer-fallback\" href=\"#\" target=\"_blank\" rel=\"noopener noreferrer\" hidden=\"\">\n     Open alternative booking search \u2192\n  <\/a>\n\n<\/div>\n\n<style>\n\n\/* =====================================\n   ALTERNATIVEN WIDGET\n===================================== *\/\n\n#ils-live-check[hidden],\n#ils-transfer-box[hidden],\n#ils-live-check [hidden],\n#ils-transfer-box [hidden] {\n  display: none !important;\n}\n\n#ils-live-check,\n#ils-transfer-box {\n  font-family: inherit;\n  box-sizing: border-box;\n}\n\n#ils-live-check *,\n#ils-transfer-box * {\n  box-sizing: border-box;\n}\n\n#ils-live-check {\n  width: 100%;\n  max-width: 1100px;\n  margin: 25px auto;\n  color: #252525;\n  scroll-margin-top: 105px;\n}\n\n#ils-live-check .ils-check-box {\n  padding: 28px;\n  background: #ffffff;\n  border: 1px solid #e2e6e3;\n  border-radius: 14px;\n}\n\n#ils-live-check h2 {\n  font-size: 25px;\n  line-height: 1.35;\n  color: #222222;\n  margin: 0 0 12px;\n}\n\n#ils-live-check .ils-check-intro {\n  font-size: 15px;\n  line-height: 1.7;\n  color: #555555;\n  margin: 0 0 20px;\n}\n\n#ils-live-check .ils-check-dates {\n  background: #edf3ef;\n  border-radius: 9px;\n  padding: 15px 18px;\n  margin-bottom: 20px;\n  color: #283b35;\n  font-size: 14px;\n  line-height: 1.7;\n}\n\n#ils-live-check .ils-check-card {\n  border: 1px solid #e4e8e5;\n  background: #fafbfa;\n  border-radius: 12px;\n  padding: 20px;\n  margin-bottom: 15px;\n}\n\n#ils-live-check .ils-check-card-inner {\n  display: flex;\n  align-items: flex-start;\n  gap: 22px;\n}\n\n#ils-live-check .ils-check-image-wrap {\n  width: 225px;\n  height: 190px;\n  flex-shrink: 0;\n  background: #eef1ee;\n  border-radius: 9px;\n  overflow: hidden;\n}\n\n#ils-live-check .ils-check-image-wrap[hidden] {\n  display: none !important;\n}\n\n#ils-live-check .ils-check-image {\n  display: block;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n\n#ils-live-check .ils-check-info {\n  flex: 1;\n  min-width: 0;\n}\n\n#ils-live-check .ils-check-card h3 {\n  font-size: 21px;\n  line-height: 1.35;\n  color: #222222;\n  margin: 0 0 9px;\n}\n\n#ils-live-check .ils-check-badge {\n  display: inline-block;\n  padding: 6px 11px;\n  border-radius: 20px;\n  background: #eeeeee;\n  color: #555555;\n  font-size: 12px;\n  font-weight: 600;\n}\n\n#ils-live-check .ils-check-badge.available {\n  background: #e3f3e7;\n  color: #22643a;\n}\n\n#ils-live-check .ils-check-badge.unavailable {\n  background: #f7e9e9;\n  color: #963838;\n}\n\n#ils-live-check .ils-check-category {\n  margin: 13px 0 8px;\n  font-size: 16px;\n  font-weight: 600;\n}\n\n#ils-live-check .ils-check-persons {\n  font-size: 13px;\n  color: #555555;\n  margin-bottom: 8px;\n}\n\n#ils-live-check .ils-check-price {\n  margin-top: 14px;\n  color: #283b35;\n  font-size: 25px;\n  line-height: 1.25;\n  font-weight: 700;\n}\n\n#ils-live-check .ils-check-price-note {\n  display: block;\n  font-size: 11px;\n  font-weight: 400;\n  color: #777777;\n  margin-top: 3px;\n}\n\n#ils-live-check .ils-check-description {\n  margin-top: 12px;\n  font-size: 13px;\n  line-height: 1.7;\n  color: #555555;\n}\n\n#ils-live-check .ils-check-more {\n  display: inline-block;\n  margin-top: 7px;\n  padding: 0;\n  border: none;\n  background: none;\n  font: inherit;\n  font-size: 13px;\n  font-weight: 600;\n  color: #283b35;\n  text-decoration: underline;\n  cursor: pointer;\n}\n\n#ils-live-check .ils-check-details {\n  margin-top: 12px;\n  font-size: 13px;\n  line-height: 1.6;\n  color: #666666;\n}\n\n#ils-live-check .ils-check-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  margin-top: 17px;\n  padding: 13px 20px;\n  background: #283b35;\n  color: #ffffff !important;\n  border-radius: 7px;\n  text-decoration: none !important;\n  font-size: 14px;\n  font-weight: 600;\n  transition: background .2s ease;\n}\n\n#ils-live-check .ils-check-button:hover {\n  background: #425b51;\n  color: #ffffff !important;\n}\n\n#ils-live-check .ils-check-note {\n  margin: 16px 0 0;\n  font-size: 12px;\n  line-height: 1.6;\n  color: #777777;\n}\n\n\/* =====================================\n   NEUER TRANSFER HINWEIS\n===================================== *\/\n\n#ils-transfer-box {\n  width: 100%;\n  max-width: 1100px;\n  margin: 18px auto 25px;\n  padding: 22px 24px;\n  background: #edf4ef;\n  border: 1px solid #d0e0d5;\n  border-radius: 11px;\n  color: #283b35;\n  font-size: 14px;\n  line-height: 1.7;\n}\n\n#ils-transfer-box .ils-transfer-heading {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  margin-bottom: 10px;\n}\n\n#ils-transfer-box .ils-transfer-heading strong {\n  font-size: 16px;\n  font-weight: 700;\n}\n\n#ils-transfer-box .ils-transfer-icon {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 26px;\n  height: 26px;\n  flex-shrink: 0;\n  background: #28774b;\n  color: #ffffff;\n  border-radius: 50%;\n  font-size: 16px;\n  font-weight: 700;\n}\n\n#ils-transfer-origin {\n  margin: 8px 0 15px !important;\n}\n\n#ils-transfer-details {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 9px 20px;\n  margin: 13px 0;\n  padding: 12px 15px;\n  background: rgba(255,255,255,.7);\n  border-radius: 7px;\n  font-size: 14px;\n}\n\n#ils-transfer-details .ils-transfer-detail {\n  display: inline-flex;\n  align-items: center;\n  gap: 7px;\n}\n\n#ils-transfer-status {\n  margin: 12px 0 0 !important;\n  font-weight: 600;\n}\n\n#ils-transfer-fallback {\n  display: inline-block;\n  margin-top: 12px;\n  color: #283b35;\n  font-size: 13px;\n  text-decoration: underline;\n  font-weight: 600;\n}\n\n\/* =====================================\n   MOBIL\n===================================== *\/\n\n@media(max-width:700px) {\n\n  #ils-live-check {\n    scroll-margin-top: 75px;\n  }\n\n  #ils-live-check .ils-check-box {\n    padding: 18px;\n  }\n\n  #ils-live-check h2 {\n    font-size: 21px;\n  }\n\n  #ils-live-check .ils-check-card {\n    padding: 16px;\n  }\n\n  #ils-live-check .ils-check-card-inner {\n    display: block;\n  }\n\n  #ils-live-check .ils-check-image-wrap {\n    width: 100%;\n    height: 210px;\n    margin-bottom: 16px;\n  }\n\n  #ils-live-check .ils-check-button {\n    width: 100%;\n    text-align: center;\n  }\n\n  #ils-transfer-box {\n    padding: 17px;\n    margin: 15px auto;\n  }\n\n  #ils-transfer-details {\n    display: block;\n  }\n\n  #ils-transfer-details .ils-transfer-detail {\n    display: flex;\n    margin: 7px 0;\n  }\n\n  #ils-transfer-box .ils-transfer-heading strong {\n    font-size: 15px;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  \/* =====================================\n     EINSTELLUNGEN\n  ===================================== *\/\n\n  const AUTO_SCROLL = true;\n  const SCROLL_DELAY = 900;\n  const CHECK_DELAY = 350;\n\n  const SHOW_IMAGES = true;\n  const SHOW_PRICES = true;\n  const DESCRIPTION_LENGTH = 250;\n\n  const DEBUG = false;\n\n  const API =\n    \"https:\/\/www.easy-booking.at\/easybooking\/index.php\/api\/searchCatAvailability\/\";\n\n  const IMAGE_HOST =\n    \"https:\/\/images.cdn-easybooking.cloud\";\n\n  \/* =====================================\n     UNTERK\u00dcNFTE\n  ===================================== *\/\n\n  const properties = [\n    {\n      id: \"villa\",\n      name: \"Villa Ottilienruh\",\n      domain: \"design-villa-ottilienruh.de\",\n      customerId: 10632,\n      serialNo: \"6154-7728-1794\",\n      url: \"https:\/\/www.design-villa-ottilienruh.de\/buchen\/\"\n    },\n    {\n      id: \"chalets\",\n      name: \"Chalets zum Ilsetal\",\n      domain: \"ferienhaus-ilsenburg-harz.de\",\n      customerId: 10633,\n      serialNo: \"8771-3107-9221\",\n      url: \"https:\/\/ferienhaus-ilsenburg-harz.de\/buchen\/\"\n    },\n    {\n      id: \"landhaeuser\",\n      name: \"Landh\u00e4user Ilsenburg\",\n      domain: \"landhaeuser-ilsenburg-harz.de\",\n      customerId: 11170,\n      serialNo: \"6788-8518-2224\",\n      url: \"https:\/\/www.landhaeuser-ilsenburg-harz.de\/buchen\/\"\n    }\n  ];\n\n  const root = document.getElementById(\n    \"ils-live-check\"\n  );\n\n  if (!root) return;\n\n  const hostname = location.hostname\n    .toLowerCase()\n    .replace(\/^www\\.\/, \"\");\n\n  const current = properties.find(\n    p => p.domain === hostname\n  );\n\n  if (!current) return;\n\n  const alternatives = properties.filter(\n    p => p.id !== current.id\n  );\n\n  function log() {\n    if (DEBUG) {\n      console.log(\"[Ilsenburg V11]\", ...arguments);\n    }\n  }\n\n  function make(tag, className, text) {\n    const el = document.createElement(tag);\n\n    if (className) el.className = className;\n    if (text !== undefined) el.textContent = text;\n\n    return el;\n  }\n\n  \/* =====================================\n     DATUMSFUNKTIONEN\n  ===================================== *\/\n\n  function validISO(iso) {\n    if (!\/^\\d{4}-\\d{2}-\\d{2}$\/.test(iso)) {\n      return \"\";\n    }\n\n    const d = new Date(iso + \"T12:00:00\");\n\n    if (isNaN(d.getTime())) return \"\";\n\n    const formatted =\n      d.getFullYear() + \"-\" +\n      String(d.getMonth() + 1).padStart(2, \"0\") +\n      \"-\" +\n      String(d.getDate()).padStart(2, \"0\");\n\n    return formatted === iso ? iso : \"\";\n  }\n\n  function toISO(value) {\n    const v = String(value || \"\").trim();\n\n    const match = v.match(\n      \/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$\/\n    );\n\n    if (match) {\n      return validISO(\n        match[3] + \"-\" + match[2] + \"-\" + match[1]\n      );\n    }\n\n    return validISO(v);\n  }\n\n  function toGerman(iso) {\n    if (!validISO(iso)) return \"\";\n\n    const a = iso.split(\"-\");\n\n    return a[2] + \".\" + a[1] + \".\" + a[0];\n  }\n\n  function bookingContainer() {\n    return document.getElementById(\n      \"ebFrontEndFrame\"\n    );\n  }\n\n  function readBookingData() {\n    const booking = bookingContainer();\n\n    if (!booking) return null;\n\n    function field(name) {\n      const el = booking.querySelector(\n        '[name=\"' + name + '\"]'\n      );\n\n      return el ? el.value : \"\";\n    }\n\n    const arrivalISO = toISO(\n      field(\"arrivalDate\")\n    );\n\n    const departureISO = toISO(\n      field(\"departureDate\")\n    );\n\n    const adults = Number(field(\"numAdults\"));\n    const children = Number(field(\"numChildren\"));\n    const rooms = Number(field(\"numRooms\"));\n\n    if (\n      !arrivalISO ||\n      !departureISO ||\n      departureISO <= arrivalISO ||\n      !Number.isInteger(adults) ||\n      adults < 1 ||\n      !Number.isInteger(children) ||\n      children < 0 ||\n      !Number.isInteger(rooms) ||\n      rooms < 1\n    ) {\n      return null;\n    }\n\n    return {\n      arrivalISO,\n      departureISO,\n      adults,\n      children,\n      rooms\n    };\n  }\n\n  \/* =====================================\n     WEITERLEITUNG ZU EIGENER WEBSEITE\n  ===================================== *\/\n\n  function websiteBookingLink(property, data) {\n    if (!data) return property.url;\n\n    const url = new URL(property.url);\n\n    url.searchParams.set(\n      \"ils_arrival\",\n      data.arrivalISO\n    );\n\n    url.searchParams.set(\n      \"ils_departure\",\n      data.departureISO\n    );\n\n    url.searchParams.set(\n      \"ils_adults\",\n      String(data.adults)\n    );\n\n    url.searchParams.set(\n      \"ils_children\",\n      String(data.children)\n    );\n\n    url.searchParams.set(\n      \"ils_rooms\",\n      String(data.rooms)\n    );\n\n    \/*\n      NEU:\n      Herkunft der Buchungsanfrage\n      wird ebenfalls \u00fcbertragen.\n    *\/\n\n    url.searchParams.set(\n      \"ils_from\",\n      current.id\n    );\n\n    return url.href;\n  }\n\n  function easybookingDirectLink(property, data) {\n    if (!data || data.rooms !== 1) {\n      return property.url;\n    }\n\n    return (\n      \"https:\/\/www.easy-booking.at\/bookingengine2\/#\" +\n      property.customerId + \"\/2\/\" +\n      property.serialNo + \"\/\" +\n      data.arrivalISO + \"\/\" +\n      data.departureISO + \"\/\" +\n      data.adults + \"\/\" +\n      data.children\n    );\n  }\n\n  function readTransferredData() {\n    const params = new URLSearchParams(\n      location.search\n    );\n\n    if (!params.has(\"ils_arrival\")) {\n      return null;\n    }\n\n    const arrivalISO = toISO(\n      params.get(\"ils_arrival\")\n    );\n\n    const departureISO = toISO(\n      params.get(\"ils_departure\")\n    );\n\n    const adults = Number(\n      params.get(\"ils_adults\")\n    );\n\n    const children = Number(\n      params.get(\"ils_children\")\n    );\n\n    const rooms = Number(\n      params.get(\"ils_rooms\") || \"1\"\n    );\n\n    if (\n      !arrivalISO ||\n      !departureISO ||\n      departureISO <= arrivalISO ||\n      !Number.isInteger(adults) ||\n      adults < 1 ||\n      !Number.isInteger(children) ||\n      children < 0 ||\n      !Number.isInteger(rooms) ||\n      rooms < 1\n    ) {\n      return null;\n    }\n\n    return {\n      arrivalISO,\n      departureISO,\n      adults,\n      children,\n      rooms,\n      from: params.get(\"ils_from\") || \"\"\n    };\n  }\n\n  \/* =====================================\n     FORMULARDATEN EINTRAGEN\n  ===================================== *\/\n\n  function setFieldValue(field, value) {\n    if (!field) return false;\n\n    const text = String(value);\n\n    if (field.value !== text) {\n      const prototype =\n        field instanceof HTMLSelectElement\n          ? HTMLSelectElement.prototype\n          : HTMLInputElement.prototype;\n\n      const setter = Object.getOwnPropertyDescriptor(\n        prototype,\n        \"value\"\n      )?.set;\n\n      if (setter) {\n        setter.call(field, text);\n      } else {\n        field.value = text;\n      }\n\n      field.dispatchEvent(\n        new Event(\"input\", { bubbles: true })\n      );\n\n      field.dispatchEvent(\n        new Event(\"change\", { bubbles: true })\n      );\n    }\n\n    return field.value === text;\n  }\n\n  function transferToBooking(data) {\n    const booking = bookingContainer();\n\n    if (!booking) return false;\n\n    const arrival = booking.querySelector(\n      '[name=\"arrivalDate\"]'\n    );\n\n    const departure = booking.querySelector(\n      '[name=\"departureDate\"]'\n    );\n\n    const adults = booking.querySelector(\n      '[name=\"numAdults\"]'\n    );\n\n    const children = booking.querySelector(\n      '[name=\"numChildren\"]'\n    );\n\n    const rooms = booking.querySelector(\n      '[name=\"numRooms\"]'\n    );\n\n    if (\n      !arrival ||\n      !departure ||\n      !adults ||\n      !children\n    ) {\n      return false;\n    }\n\n    function dateValue(field, iso) {\n      return field.type === \"date\"\n        ? iso\n        : toGerman(iso);\n    }\n\n    const okArrival = setFieldValue(\n      arrival,\n      dateValue(arrival, data.arrivalISO)\n    );\n\n    const okDeparture = setFieldValue(\n      departure,\n      dateValue(departure, data.departureISO)\n    );\n\n    const okAdults = setFieldValue(\n      adults,\n      data.adults\n    );\n\n    const okChildren = setFieldValue(\n      children,\n      data.children\n    );\n\n    const okRooms = rooms\n      ? setFieldValue(rooms, data.rooms)\n      : data.rooms === 1;\n\n    return (\n      okArrival &&\n      okDeparture &&\n      okAdults &&\n      okChildren &&\n      okRooms\n    );\n  }\n\n  \/* =====================================\n     NEUER HINWEIS AUF DER ZIELWEBSEITE\n  ===================================== *\/\n\n  function initializeTransferredBooking() {\n    const data = readTransferredData();\n\n    if (!data) return;\n\n    const box = document.getElementById(\n      \"ils-transfer-box\"\n    );\n\n    const origin = document.getElementById(\n      \"ils-transfer-origin\"\n    );\n\n    const details = document.getElementById(\n      \"ils-transfer-details\"\n    );\n\n    const status = document.getElementById(\n      \"ils-transfer-status\"\n    );\n\n    const fallback = document.getElementById(\n      \"ils-transfer-fallback\"\n    );\n\n    if (\n      !box ||\n      !origin ||\n      !details ||\n      !status ||\n      !fallback\n    ) {\n      return;\n    }\n\n    \/*\n      HERKUNFT ERKENNEN\n    *\/\n\n    const sourceProperty = properties.find(\n      p => p.id === data.from && p.id !== current.id\n    );\n\n    if (sourceProperty) {\n      origin.textContent =\n        \"Ihre Reisedaten wurden automatisch von \" +\n        \"unserer Webseite \u201e\" +\n        sourceProperty.name +\n        \"\u201c \u00fcbernommen.\";\n    } else {\n      origin.textContent =\n        \"Ihre ausgew\u00e4hlten Reisedaten wurden \" +\n        \"an diese Buchungsseite \u00fcbergeben.\";\n    }\n\n    \/*\n      REISEDATEN ANZEIGEN\n    *\/\n\n    details.replaceChildren();\n\n    const dateDetail = make(\n      \"span\",\n      \"ils-transfer-detail\",\n      \"\ud83d\udcc5 \" +\n      toGerman(data.arrivalISO) +\n      \" bis \" +\n      toGerman(data.departureISO)\n    );\n\n    const guestDetail = make(\n      \"span\",\n      \"ils-transfer-detail\",\n      \"\ud83d\udc65 \" +\n      data.adults +\n      \" Erwachsene \u00b7 \" +\n      data.children +\n      \" Kinder\"\n    );\n\n    details.append(\n      dateDetail,\n      guestDetail\n    );\n\n    \/*\n      AUSWEICHLINK VORBEREITEN\n    *\/\n\n    fallback.href = easybookingDirectLink(\n      current,\n      data\n    );\n\n    fallback.hidden = true;\n\n    status.textContent =\n      \"Ihre Buchungsmaske wird vorbereitet ...\";\n\n    \/*\n      HINWEIS \u00dcBER DEM BUCHUNGSTOOL\n      PLATZIEREN\n    *\/\n\n    const booking = bookingContainer();\n\n    if (booking && booking.parentElement) {\n      booking.parentElement.insertBefore(\n        box,\n        booking\n      );\n    }\n\n    box.hidden = false;\n    \/* =====================================\n   AUTO SCROLL ZUR BUCHUNGSMASKE\n   NUR BEI WEITERLEITUNG\n===================================== *\/\n\nlet transferScrollDone = false;\n\nfunction scrollToBooking() {\n\n  if (transferScrollDone) return;\n\n  const booking = document.getElementById(\n    \"ebFrontEndFrame\"\n  );\n\n  if (!booking || !box) return;\n\n  \/*\n    Warten, bis easybooking seine\n    Buchungsmaske aufgebaut hat.\n  *\/\n\n  const ready =\n    booking.querySelector('[name=\"arrivalDate\"]') &&\n    booking.querySelector('[name=\"departureDate\"]');\n\n  if (!ready) return;\n\n  transferScrollDone = true;\n\n  \/*\n    Den gr\u00fcnen Hinweis oben anzeigen.\n    Darunter folgt direkt die Buchungsmaske.\n  *\/\n\n  const offset = window.innerWidth <= 700\n    ? 100\n    : 110;\n\n  setTimeout(function () {\n\n    const position =\n      box.getBoundingClientRect().top +\n      window.scrollY -\n      offset;\n\n    window.scrollTo({\n      top: Math.max(0, position),\n      behavior: \"smooth\"\n    });\n\n  }, 650);\n}\n\n\/*\n  Mehrfach kurz pr\u00fcfen, da easybooking\n  zeitversetzt l\u00e4dt.\n*\/\n\nlet scrollAttempts = 0;\n\nconst transferScrollTimer = setInterval(function () {\n\n  scrollAttempts++;\n\n  scrollToBooking();\n\n  if (transferScrollDone || scrollAttempts >= 30) {\n    clearInterval(transferScrollTimer);\n  }\n\n}, 250);\n\n    \/*\n      FORMULARFELDER \u00dcBERNEHMEN\n    *\/\n\n    let attempts = 0;\n    let completed = false;\n\n    function apply() {\n      if (completed) return;\n\n      attempts++;\n\n      const success = transferToBooking(data);\n\n      if (success) {\n        completed = true;\n\n        status.textContent =\n          \"Klicken Sie jetzt einfach auf \u201eWeiter\u201c, \" +\n          \"um die verf\u00fcgbaren Unterk\u00fcnfte f\u00fcr \" +\n          \"Ihren Reisezeitraum anzuzeigen.\";\n\n        fallback.hidden = true;\n\n        log(\n          \"Reisedaten \u00fcbernommen:\",\n          data\n        );\n\n        return;\n      }\n\n      if (attempts >= 40) {\n        completed = true;\n\n        status.textContent =\n          \"Die automatische \u00dcbernahme konnte \" +\n          \"nicht vollst\u00e4ndig best\u00e4tigt werden. \" +\n          \"Bitte pr\u00fcfen Sie Ihre Reisedaten \" +\n          \"oder \u00f6ffnen Sie die alternative Buchungssuche.\";\n\n        fallback.hidden = false;\n      }\n    }\n\n    apply();\n\n    if (!completed) {\n      const interval = setInterval(function () {\n        apply();\n\n        if (completed) {\n          clearInterval(interval);\n        }\n      }, 300);\n    }\n  }\n\n  \/* =====================================\n     INDIVIDUELLE TEXTE\n  ===================================== *\/\n\n  const introTexts = {\n    villa:\n      \"Leider haben wir in der Villa Ottilienruh \" +\n      \"f\u00fcr Ihren gew\u00fcnschten Reisezeitraum kein \" +\n      \"passendes Angebot gefunden. Vielleicht \" +\n      \"sind die Chalets zum Ilsetal oder die \" +\n      \"Landh\u00e4user Ilsenburg eine Alternative.\",\n\n    chalets:\n      \"Leider haben wir in unseren Chalets zum \" +\n      \"Ilsetal f\u00fcr Ihren gew\u00fcnschten Reisezeitraum \" +\n      \"kein passendes Angebot gefunden. Vielleicht \" +\n      \"finden Sie in der Villa Ottilienruh oder \" +\n      \"den Landh\u00e4usern Ilsenburg eine passende \" +\n      \"Unterkunft.\",\n\n    landhaeuser:\n      \"Leider haben wir in unseren Landh\u00e4usern \" +\n      \"Ilsenburg f\u00fcr Ihren gew\u00fcnschten Reisezeitraum \" +\n      \"kein passendes Angebot gefunden. Vielleicht \" +\n      \"sind die Villa Ottilienruh oder die Chalets \" +\n      \"zum Ilsetal eine passende Alternative.\"\n  };\n\n  const intro = document.getElementById(\n    \"ils-check-intro\"\n  );\n\n  if (intro) {\n    intro.textContent =\n      introTexts[current.id] || \"\";\n  }\n\n  \/* =====================================\n     PREIS UND BESCHREIBUNG\n  ===================================== *\/\n\n  function formatPrice(price) {\n    return new Intl.NumberFormat(\"de-DE\", {\n      style: \"currency\",\n      currency: \"EUR\"\n    }).format(price);\n  }\n\n  function getPrice(cat) {\n    const raw = cat?.priceDetails?.totalPrice;\n\n    if (\n      raw === null ||\n      raw === undefined ||\n      raw === \"\"\n    ) {\n      return null;\n    }\n\n    const price = Number(raw);\n\n    return Number.isFinite(price) && price > 0\n      ? price\n      : null;\n  }\n\n  function cleanDescription(html) {\n    if (typeof html !== \"string\") {\n      return \"\";\n    }\n\n    const doc = new DOMParser().parseFromString(\n      html,\n      \"text\/html\"\n    );\n\n    doc.querySelectorAll(\n      \"script,style,iframe,object,embed,template\"\n    ).forEach(el => el.remove());\n\n    return (doc.body.textContent || \"\")\n      .replace(\/\\s+\/g, \" \")\n      .trim();\n  }\n\n  \/* =====================================\n     BILDER\n  ===================================== *\/\n\n  function safeUrl(value) {\n    if (typeof value !== \"string\") return \"\";\n\n    try {\n      const url = new URL(value);\n\n      if (url.protocol !== \"https:\") return \"\";\n\n      const host = url.hostname.toLowerCase();\n\n      if (\n        host === \"images.cdn-easybooking.cloud\" ||\n        host.endsWith(\".cdn-easybooking.cloud\") ||\n        host === \"easy-booking.at\" ||\n        host.endsWith(\".easy-booking.at\")\n      ) {\n        return url.href;\n      }\n    } catch (e) {}\n\n    return \"\";\n  }\n\n  function imageCandidates(path) {\n    if (typeof path !== \"string\") return [];\n\n    const value = path.trim();\n    if (!value) return [];\n\n    const urls = [];\n\n    function add(url) {\n      const safe = safeUrl(url);\n\n      if (safe && !urls.includes(safe)) {\n        urls.push(safe);\n      }\n    }\n\n    if (value.startsWith(\"https:\/\/\")) {\n      add(value);\n      return urls;\n    }\n\n    if (value.startsWith(\"\/\/\")) {\n      add(\"https:\" + value);\n      return urls;\n    }\n\n    if (value.startsWith(\"\/cdn-migration\/\")) {\n      add(\n        IMAGE_HOST +\n        value.replace(\/^\\\/cdn-migration\/, \"\")\n      );\n    }\n\n    if (value.startsWith(\"\/\")) {\n      add(IMAGE_HOST + value);\n    } else {\n      add(IMAGE_HOST + \"\/\" + value);\n    }\n\n    return urls;\n  }\n\n  function categoryImages(cat) {\n    if (!SHOW_IMAGES || !cat) return [];\n\n    const galleries = [];\n\n    if (Array.isArray(cat.catPic)) {\n      galleries.push(cat.catPic);\n    }\n\n    if (Array.isArray(cat.rooms)) {\n      cat.rooms.forEach(room => {\n        if (Array.isArray(room?.catPic)) {\n          galleries.push(room.catPic);\n        }\n      });\n    }\n\n    const urls = [];\n\n    galleries.forEach(gallery => {\n      const pictures = gallery\n        .filter(pic => pic && typeof pic === \"object\")\n        .slice()\n        .sort(\n          (a, b) =>\n            Number(a.egp_sortOrder || 0) -\n            Number(b.egp_sortOrder || 0)\n        );\n\n      pictures.forEach(pic => {\n        [\n          pic.egp_cdnFullUrl,\n          pic.egp_picCdnFullUrl,\n          pic.egp_picPath\n        ].forEach(path => {\n          imageCandidates(path).forEach(url => {\n            if (!urls.includes(url)) {\n              urls.push(url);\n            }\n          });\n        });\n      });\n    });\n\n    return urls;\n  }\n\n  \/* =====================================\n     VERF\u00dcGBARKEIT\n  ===================================== *\/\n\n  function analyzeResponse(response, rooms) {\n    if (\n      !response ||\n      !Array.isArray(response.catArr)\n    ) {\n      return {\n        status: \"unknown\",\n        message:\n          \"Die Antwort konnte nicht ausgewertet werden.\"\n      };\n    }\n\n    if (rooms !== 1) {\n      return {\n        status: \"unknown\",\n        message:\n          \"Mehrere Zimmer bitte direkt \" +\n          \"im Buchungssystem pr\u00fcfen.\"\n      };\n    }\n\n    if (response.errorMsg) {\n      return {\n        status: \"unavailable\",\n        message:\n          \"Kein passendes Angebot f\u00fcr diesen Zeitraum.\"\n      };\n    }\n\n    const offers = response.catArr\n      .filter(cat =>\n        Number(cat.roomCount) > 0 &&\n        Array.isArray(cat.rooms) &&\n        cat.rooms.length > 0\n      )\n      .map(cat => ({\n        name: cat.catName || \"Unterkunft\",\n        price: getPrice(cat),\n        minPersons: Number(cat.minPersons),\n        maxPersons: Number(cat.maxPersons),\n        description: cleanDescription(cat.desc),\n        images: categoryImages(cat)\n      }));\n\n    if (!offers.length) {\n      return {\n        status: \"unknown\",\n        message:\n          \"Keine eindeutig auswertbaren \" +\n          \"Buchungsangebote gefunden.\"\n      };\n    }\n\n    offers.sort((a, b) => {\n      if (a.price === null && b.price === null) {\n        return 0;\n      }\n\n      if (a.price === null) return 1;\n      if (b.price === null) return -1;\n\n      return a.price - b.price;\n    });\n\n    return {\n      status: \"available\",\n      count: offers.length,\n      cheapest: offers[0]\n    };\n  }\n\n  async function fetchAvailability(\n    property,\n    data,\n    signal\n  ) {\n    const params = new URLSearchParams({\n      customerId: String(property.customerId),\n      numAdults: String(data.adults),\n      numChildren: String(data.children),\n      arrivalDate: data.arrivalISO,\n      departureDate: data.departureISO,\n      localeId: \"2\",\n      catId: \"false\",\n      roomId: \"false\"\n    });\n\n    const response = await fetch(\n      API + property.customerId + \"\/2\",\n      {\n        method: \"POST\",\n        mode: \"cors\",\n        credentials: \"omit\",\n        headers: {\n          \"Content-Type\":\n            \"application\/x-www-form-urlencoded;charset=UTF-8\"\n        },\n        body: params.toString(),\n        signal\n      }\n    );\n\n    if (!response.ok) {\n      throw new Error(\n        \"HTTP \" + response.status\n      );\n    }\n\n    return analyzeResponse(\n      await response.json(),\n      data.rooms\n    );\n  }\n\n  \/* =====================================\n     KARTEN ERSTELLEN\n  ===================================== *\/\n\n  const cards = new Map();\n\n  function createCards() {\n    const container = document.getElementById(\n      \"ils-check-results\"\n    );\n\n    if (!container) return;\n\n    container.replaceChildren();\n    cards.clear();\n\n    alternatives.forEach(property => {\n      const article = make(\n        \"article\",\n        \"ils-check-card\"\n      );\n\n      const inner = make(\n        \"div\",\n        \"ils-check-card-inner\"\n      );\n\n      const imageWrap = make(\n        \"div\",\n        \"ils-check-image-wrap\"\n      );\n\n      imageWrap.hidden = true;\n\n      const image = make(\n        \"img\",\n        \"ils-check-image\"\n      );\n\n      image.alt = \"\";\n      image.decoding = \"async\";\n\n      imageWrap.appendChild(image);\n\n      const info = make(\n        \"div\",\n        \"ils-check-info\"\n      );\n\n      const title = make(\n        \"h3\",\n        \"\",\n        property.name\n      );\n\n      const badge = make(\n        \"span\",\n        \"ils-check-badge\",\n        \"Wird gepr\u00fcft ...\"\n      );\n\n      const category = make(\n        \"div\",\n        \"ils-check-category\"\n      );\n\n      const persons = make(\n        \"div\",\n        \"ils-check-persons\"\n      );\n\n      const price = make(\n        \"div\",\n        \"ils-check-price\"\n      );\n\n      const priceNote = make(\n        \"span\",\n        \"ils-check-price-note\"\n      );\n\n      const description = make(\n        \"div\",\n        \"ils-check-description\"\n      );\n\n      description.hidden = true;\n\n      const more = make(\n        \"button\",\n        \"ils-check-more\",\n        \"Mehr anzeigen\"\n      );\n\n      more.type = \"button\";\n      more.hidden = true;\n\n      more.addEventListener(\"click\", function () {\n        const expanded =\n          more.getAttribute(\"aria-expanded\") === \"true\";\n\n        more.setAttribute(\n          \"aria-expanded\",\n          String(!expanded)\n        );\n\n        description.textContent = expanded\n          ? more.dataset.shortText\n          : more.dataset.fullText;\n\n        more.textContent = expanded\n          ? \"Mehr anzeigen\"\n          : \"Weniger anzeigen\";\n      });\n\n      const details = make(\n        \"div\",\n        \"ils-check-details\"\n      );\n\n      const button = make(\n        \"a\",\n        \"ils-check-button\",\n        \"Unterkunft ansehen & buchen \u2192\"\n      );\n\n      button.href = property.url;\n      button.target = \"_self\";\n\n      info.append(\n        title,\n        badge,\n        category,\n        persons,\n        price,\n        priceNote,\n        description,\n        more,\n        details,\n        button\n      );\n\n      inner.append(imageWrap, info);\n      article.appendChild(inner);\n      container.appendChild(article);\n\n      cards.set(property.id, {\n        property,\n        imageWrap,\n        image,\n        badge,\n        category,\n        persons,\n        price,\n        priceNote,\n        description,\n        more,\n        details,\n        button,\n        imageToken: 0\n      });\n    });\n  }\n\n  function clearCard(card) {\n    card.imageToken++;\n\n    card.imageWrap.hidden = true;\n    card.image.removeAttribute(\"src\");\n\n    card.category.textContent = \"\";\n    card.persons.textContent = \"\";\n    card.price.textContent = \"\";\n    card.priceNote.textContent = \"\";\n\n    card.description.textContent = \"\";\n    card.description.hidden = true;\n\n    card.more.hidden = true;\n    card.more.textContent = \"Mehr anzeigen\";\n    card.more.setAttribute(\"aria-expanded\", \"false\");\n  }\n\n  function loadImage(card, urls) {\n    const token = ++card.imageToken;\n\n    if (!SHOW_IMAGES || !urls?.length) return;\n\n    let index = 0;\n\n    function tryNext() {\n      if (token !== card.imageToken) return;\n      if (index >= urls.length) return;\n\n      const url = urls[index++];\n      const probe = new Image();\n\n      probe.onload = function () {\n        if (token !== card.imageToken) return;\n\n        card.image.src = url;\n        card.imageWrap.hidden = false;\n      };\n\n      probe.onerror = tryNext;\n      probe.src = url;\n    }\n\n    tryNext();\n  }\n\n  function renderDescription(card, text) {\n    if (!text) return;\n\n    card.description.hidden = false;\n\n    if (text.length <= DESCRIPTION_LENGTH) {\n      card.description.textContent = text;\n      return;\n    }\n\n    let short = text.slice(0, DESCRIPTION_LENGTH);\n    const space = short.lastIndexOf(\" \");\n\n    if (space > 100) {\n      short = short.slice(0, space);\n    }\n\n    short += \" \u2026\";\n\n    card.description.textContent = short;\n    card.more.dataset.shortText = short;\n    card.more.dataset.fullText = text;\n    card.more.hidden = false;\n    card.more.setAttribute(\"aria-expanded\", \"false\");\n  }\n\n  function setLoading(card) {\n    clearCard(card);\n\n    card.badge.className = \"ils-check-badge\";\n    card.badge.textContent = \"Wird gepr\u00fcft ...\";\n\n    card.details.textContent =\n      \"Wir suchen nach passenden Angeboten.\";\n  }\n\n  function showResult(card, result) {\n    clearCard(card);\n\n    card.badge.className = \"ils-check-badge\";\n\n    if (result.status === \"available\") {\n      const offer = result.cheapest;\n\n      card.badge.classList.add(\"available\");\n      card.badge.textContent = \"Angebote gefunden\";\n\n      card.category.textContent = offer.name;\n\n      if (\n        Number.isFinite(offer.minPersons) &&\n        Number.isFinite(offer.maxPersons) &&\n        offer.maxPersons > 0\n      ) {\n        card.persons.textContent =\n          \"F\u00fcr \" + offer.minPersons +\n          \" bis \" + offer.maxPersons + \" Personen\";\n      }\n\n      if (SHOW_PRICES && offer.price !== null) {\n        card.price.textContent =\n          formatPrice(offer.price);\n\n        card.priceNote.textContent =\n          \"Voraussichtlicher Gesamtpreis\";\n      }\n\n      renderDescription(card, offer.description);\n\n      card.details.textContent =\n        result.count +\n        \" passende Unterkunftskategorien gefunden.\";\n\n      loadImage(card, offer.images);\n\n    } else if (result.status === \"unavailable\") {\n      card.badge.classList.add(\"unavailable\");\n\n      card.badge.textContent =\n        \"Kein passendes Angebot\";\n\n      card.details.textContent =\n        result.message;\n\n    } else {\n      card.badge.textContent = \"Bitte pr\u00fcfen\";\n      card.details.textContent = result.message;\n    }\n  }\n\n  function showError(card) {\n    clearCard(card);\n\n    card.badge.className = \"ils-check-badge\";\n    card.badge.textContent = \"Pr\u00fcfung nicht m\u00f6glich\";\n\n    card.details.textContent =\n      \"Bitte die Angebote direkt im \" +\n      \"Buchungssystem pr\u00fcfen.\";\n  }\n\n  \/* =====================================\n     REISEDATEN ANZEIGEN\n  ===================================== *\/\n\n  function renderDates(data) {\n    const target = document.getElementById(\n      \"ils-check-dates\"\n    );\n\n    if (!target) return;\n\n    const text = data\n      ? \"Anreise: \" + toGerman(data.arrivalISO) +\n        \" | Abreise: \" + toGerman(data.departureISO) +\n        \" | \" + data.adults + \" Erwachsene\" +\n        \" | \" + data.children + \" Kinder\"\n      : \"Reisedaten konnten nicht \u00fcbernommen werden.\";\n\n    target.replaceChildren(\n      make(\"div\", \"ils-check-dates\", text)\n    );\n  }\n\n  \/* =====================================\n     SCROLLEN\n  ===================================== *\/\n\n  let lastScrolledSearch = \"\";\n  let scrollTimer = null;\n\n  function autoScroll(searchKey) {\n    if (\n      !AUTO_SCROLL ||\n      !searchKey ||\n      searchKey === lastScrolledSearch\n    ) {\n      return;\n    }\n\n    if (scrollTimer !== null) {\n      clearTimeout(scrollTimer);\n    }\n\n    scrollTimer = setTimeout(function () {\n      scrollTimer = null;\n\n      if (root.hidden || !root.isConnected) {\n        return;\n      }\n\n      lastScrolledSearch = searchKey;\n\n      const reduced = window.matchMedia(\n        \"(prefers-reduced-motion: reduce)\"\n      ).matches;\n\n      const offset =\n        window.innerWidth <= 700 ? 75 : 105;\n\n      const top =\n        root.getBoundingClientRect().top +\n        window.scrollY -\n        offset;\n\n      window.scrollTo({\n        top: Math.max(0, top),\n        behavior: reduced ? \"auto\" : \"smooth\"\n      });\n\n    }, SCROLL_DELAY);\n  }\n\n  \/* =====================================\n     SUCHABLAUF\n  ===================================== *\/\n\n  let controller = null;\n  let lastKey = \"\";\n  let timer = null;\n\n  async function runSearch(data) {\n    if (controller) {\n      controller.abort();\n    }\n\n    controller = new AbortController();\n\n    const signal = controller.signal;\n\n    for (const card of cards.values()) {\n      setLoading(card);\n\n      card.button.href = websiteBookingLink(\n        card.property,\n        data\n      );\n    }\n\n    await Promise.all(\n      Array.from(cards.values()).map(async card => {\n        try {\n          const result = await fetchAvailability(\n            card.property,\n            data,\n            signal\n          );\n\n          if (!signal.aborted) {\n            showResult(card, result);\n          }\n\n        } catch (error) {\n          if (!signal.aborted) {\n            log(error);\n            showError(card);\n          }\n        }\n      })\n    );\n  }\n\n  function hasNoOfferMessage() {\n    const booking = bookingContainer();\n\n    if (!booking) return false;\n\n    return (\n      (booking.innerText || \"\")\n        .replace(\/\\s+\/g, \" \")\n        .toLowerCase()\n        .includes(\n          \"leider wird zu ihrem wunschtermin kein passendes angebot gefunden\"\n        )\n    );\n  }\n\n  function check() {\n    const noOffer = hasNoOfferMessage();\n\n    if (!noOffer) {\n      root.hidden = true;\n      lastKey = \"\";\n\n      if (scrollTimer !== null) {\n        clearTimeout(scrollTimer);\n        scrollTimer = null;\n      }\n\n      if (controller) {\n        controller.abort();\n        controller = null;\n      }\n\n      return;\n    }\n\n    const data = readBookingData();\n    const key = data ? JSON.stringify(data) : \"\";\n\n    const wasHidden = root.hidden;\n\n    root.hidden = false;\n\n    if (key !== lastKey || wasHidden) {\n      lastKey = key;\n\n      renderDates(data);\n\n      if (data) {\n        runSearch(data);\n      } else {\n        if (controller) {\n          controller.abort();\n          controller = null;\n        }\n\n        for (const card of cards.values()) {\n          showError(card);\n\n          card.button.href =\n            card.property.url;\n        }\n      }\n    }\n\n    if (\n      data &&\n      (wasHidden || key !== lastScrolledSearch)\n    ) {\n      autoScroll(key);\n    }\n  }\n\n  function scheduleCheck() {\n    if (timer !== null) {\n      clearTimeout(timer);\n    }\n\n    timer = setTimeout(function () {\n      timer = null;\n      check();\n    }, CHECK_DELAY);\n  }\n\n  \/* =====================================\n     INITIALISIERUNG\n  ===================================== *\/\n\n  function init() {\n    createCards();\n\n    \/*\n      \u00dcbertragene Daten entgegennehmen\n      und neuen Hinweis aufbauen.\n    *\/\n\n    initializeTransferredBooking();\n\n    const booking = bookingContainer();\n\n    if (!booking) {\n      log(\"easybooking Container fehlt\");\n      return;\n    }\n\n    const observer = new MutationObserver(\n      scheduleCheck\n    );\n\n    observer.observe(booking, {\n      subtree: true,\n      childList: true,\n      characterData: true,\n      attributes: true,\n      attributeFilter: [\n        \"class\",\n        \"style\",\n        \"hidden\"\n      ]\n    });\n\n    document.addEventListener(\n      \"change\",\n      function (event) {\n        if (\n          event.target.closest &&\n          event.target.closest(\"#ebFrontEndFrame\")\n        ) {\n          scheduleCheck();\n        }\n      }\n    );\n\n    check();\n\n    log(\n      \"Ilsenburg V11 aktiv:\",\n      current.name\n    );\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\n      \"DOMContentLoaded\",\n      init,\n      { once: true }\n    );\n  } else {\n    init();\n  }\n\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-053252f elementor-widget elementor-widget-html\" data-id=\"053252f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t <div id=\"ebFrontEndFrame\"><\/div>\n <script src=\"\/\/www.easy-booking.at\/bookingengine2\/js\/jquery.easybooking.frontend.js\"><\/script>\n <script>\n \tfunction ebFrontendLoadedCheck() {\n \t\tif (typeof jQuery != \"undefined\") {\n \t\t\tif (jQuery.fn.ebFrontEnd) {\n \t\t\t\tjQuery(\"#ebFrontEndFrame\").ebFrontEnd({\n \t\t\t\t\tcustomerId: 10633,\n \t\t\t\t\tserialNo: \"8771-3107-9221\",\n \t\t\t\t\tlocaleId: 2,\n \t\t\t\t\tframeId: \"ebFrontEndPlugin\",\n \t\t\t\t\tscrollOffset: 0,\n \t\t\t\t\tadultOnly: false,\n \t\t\t\t\tgtmDL: \"dataLayer\",\n \t\t\t\t\thideFilters: \"on\",\n \t\t\t\t\tdisableScroll: false,\n \t\t\t\t\tsource: \"\",\n \t\t\t\t\tcollapsedExtras: false\n \t\t\t\t});\n \t\t\t} else {\n \t\t\t\tsetTimeout(ebFrontendLoadedCheck, 200);\n \t\t\t}\n \t\t} else {\n \t\t\tsetTimeout(ebFrontendLoadedCheck, 200);\n \t\t}\n \t}\n \tebFrontendLoadedCheck();\n <\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\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>Book Your Dream Vacation in Ilsenburg in the Harz Mountains Enjoy your next vacation in the picturesque greenery of the Ilse Valley in one of our luxurious chalets. Discover our other accommodations Offers are requested via easybooking. Displayed prices may differ from the final booking price. The information in the booking system is binding. \u2713 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1241","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/wp-json\/wp\/v2\/pages\/1241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/wp-json\/wp\/v2\/comments?post=1241"}],"version-history":[{"count":1,"href":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/wp-json\/wp\/v2\/pages\/1241\/revisions"}],"predecessor-version":[{"id":1247,"href":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/wp-json\/wp\/v2\/pages\/1241\/revisions\/1247"}],"wp:attachment":[{"href":"https:\/\/ferienhaus-ilsenburg-harz.de\/en\/wp-json\/wp\/v2\/media?parent=1241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}