{"id":97885,"date":"2026-09-11T17:57:06","date_gmt":"2026-09-11T15:57:06","guid":{"rendered":"https:\/\/bno-travel.com\/hotellit-dubai\/"},"modified":"2026-09-15T15:10:34","modified_gmt":"2026-09-15T13:10:34","slug":"hotellit-dubai","status":"publish","type":"page","link":"https:\/\/bno-travel.com\/fi\/hotellit-dubai\/","title":{"rendered":"Hotellit Dubaissa \u2013 l\u00f6yd\u00e4 hotelli ja tutustu alueisiin | BNO Travel"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"97885\" class=\"elementor elementor-97885 elementor-97229\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fdce33a e-flex e-con-boxed e-con e-parent\" data-id=\"fdce33a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c61e35b elementor-widget elementor-widget-html\" data-id=\"c61e35b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n  .bno-dubai-page,\r\n  .bno-dubai-page * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .bno-dubai-page {\r\n    --bno-navy: #0C1A38;\r\n    --bno-blue: #1769aa;\r\n    --bno-soft: #f4f7fb;\r\n    --bno-border: #dfe5ed;\r\n    --bno-text: #202938;\r\n    --bno-muted: #5c687b;\r\n    --bno-radius: 22px;\r\n  }\r\n\r\n  .bno-dubai-page .bno-shell {\r\n    width: min(1180px, calc(100% - 36px));\r\n    margin: 0 auto;\r\n  }\r\n\r\n  .bno-dubai-page .bno-section {\r\n    padding: 76px 0;\r\n  }\r\n\r\n  .bno-dubai-page .bno-section--soft {\r\n    background: #f5f7fa;\r\n  }\r\n\r\n  .bno-dubai-page .bno-section--light {\r\n    background: #fff;\r\n  }\r\n\r\n  .bno-dubai-page .bno-eyebrow {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    margin-bottom: 14px;\r\n    font-size: 13px;\r\n    line-height: 1.2;\r\n    font-weight: 700;\r\n    letter-spacing: .04em;\r\n    text-transform: uppercase;\r\n    color: #1769aa;\r\n  }\r\n\r\n  .bno-dubai-page .bno-section-heading {\r\n    max-width: 760px;\r\n    margin-bottom: 38px;\r\n  }\r\n\r\n  .bno-dubai-page .bno-section-heading h2 {\r\n    margin: 0 0 15px;\r\n    font-size: clamp(30px, 4vw, 46px);\r\n    line-height: 1.08;\r\n    color: #182238;\r\n  }\r\n\r\n  .bno-dubai-page .bno-section-heading p {\r\n    margin: 0;\r\n    font-size: 17px;\r\n    line-height: 1.7;\r\n    color: var(--bno-muted);\r\n  }\r\n\r\n  .bno-dubai-page .bno-actions {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 12px;\r\n    margin-top: 26px;\r\n  }\r\n\r\n  .bno-dubai-page .bno-btn {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    min-height: 52px;\r\n    padding: 0 22px;\r\n    border-radius: 12px;\r\n    text-decoration: none;\r\n    font-weight: 700;\r\n    transition: .2s ease;\r\n  }\r\n\r\n  .bno-dubai-page .bno-btn--primary {\r\n    color: #fff;\r\n    background: var(--bno-navy);\r\n    border: 1px solid var(--bno-navy);\r\n  }\r\n\r\n  .bno-dubai-page .bno-btn--primary:hover {\r\n    transform: translateY(-1px);\r\n    opacity: .94;\r\n  }\r\n\r\n  .bno-dubai-page .bno-btn--secondary {\r\n    color: var(--bno-navy);\r\n    background: rgba(255,255,255,.96);\r\n    border: 1px solid rgba(12,26,56,.22);\r\n  }\r\n\r\n  \/* HERO *\/\r\n  .bno-dubai-hero {\r\n    position: relative;\r\n    min-height: 590px;\r\n    display: flex;\r\n    align-items: flex-end;\r\n    overflow: hidden;\r\n    color: #fff;\r\n    background:\r\n      radial-gradient(circle at 78% 25%, rgba(29,181,220,.55), transparent 34%),\r\n      radial-gradient(circle at 65% 80%, rgba(237,166,77,.25), transparent 36%),\r\n      linear-gradient(135deg, #0b2c52 0%, #0C1A38 54%, #10294d 100%);\r\n  }\r\n\r\n  \/*\r\n    N\u00e5r du har URL-en til Dubai-bildet du allerede bruker,\r\n    legg den inn som et ekstra background-image her.\r\n  *\/\r\n\r\n  .bno-dubai-hero::after {\r\n    content: \"\";\r\n    position: absolute;\r\n    inset: 0;\r\n    background:\r\n      linear-gradient(90deg, rgba(5,14,31,.70) 0%, rgba(5,14,31,.37) 55%, rgba(5,14,31,.12) 100%);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .bno-dubai-hero .bno-shell {\r\n    position: relative;\r\n    z-index: 2;\r\n  }\r\n\r\n  .bno-dubai-hero__content {\r\n    max-width: 800px;\r\n    padding: 110px 0 76px;\r\n  }\r\n\r\n  .bno-dubai-hero .bno-eyebrow {\r\n    color: #fff;\r\n    background: rgba(255,255,255,.14);\r\n    border: 1px solid rgba(255,255,255,.25);\r\n    backdrop-filter: blur(8px);\r\n    padding: 9px 13px;\r\n    border-radius: 999px;\r\n  }\r\n\r\n  .bno-dubai-hero h1 {\r\n    margin: 7px 0 20px;\r\n    max-width: 830px;\r\n    font-size: clamp(42px, 6vw, 72px);\r\n    line-height: .99;\r\n    letter-spacing: -.025em;\r\n    color: #fff;\r\n  }\r\n\r\n  .bno-dubai-hero .bno-lead {\r\n    margin: 0;\r\n    max-width: 690px;\r\n    font-size: clamp(18px, 2vw, 21px);\r\n    line-height: 1.6;\r\n    color: rgba(255,255,255,.92);\r\n  }\r\n\r\n  .bno-dubai-hero .bno-btn--primary {\r\n    background: #fff;\r\n    color: var(--bno-navy);\r\n    border-color: #fff;\r\n  }\r\n\r\n  .bno-dubai-hero .bno-btn--secondary {\r\n    background: rgba(12,26,56,.35);\r\n    color: #fff;\r\n    border-color: rgba(255,255,255,.42);\r\n    backdrop-filter: blur(8px);\r\n  }\r\n\r\n  \/* INTRO *\/\r\n  .bno-dubai-intro__grid {\r\n    display: grid;\r\n    grid-template-columns: 1.35fr .65fr;\r\n    gap: 54px;\r\n    align-items: start;\r\n  }\r\n\r\n  .bno-dubai-intro__text p {\r\n    margin: 0 0 18px;\r\n    font-size: 17px;\r\n    line-height: 1.75;\r\n    color: var(--bno-muted);\r\n  }\r\n\r\n  .bno-dubai-highlights {\r\n    display: grid;\r\n    gap: 12px;\r\n  }\r\n\r\n  .bno-dubai-highlight {\r\n    padding: 20px;\r\n    background: var(--bno-soft);\r\n    border: 1px solid var(--bno-border);\r\n    border-radius: 16px;\r\n  }\r\n\r\n  .bno-dubai-highlight strong {\r\n    display: block;\r\n    color: var(--bno-navy);\r\n    margin-bottom: 5px;\r\n    font-size: 16px;\r\n  }\r\n\r\n  .bno-dubai-highlight span {\r\n    color: var(--bno-muted);\r\n    line-height: 1.5;\r\n  }\r\n\r\n  \/* GENERELLE KORT *\/\r\n  .bno-dubai-info-grid {\r\n    display: grid;\r\n    grid-template-columns: repeat(3, 1fr);\r\n    gap: 18px;\r\n  }\r\n\r\n  .bno-dubai-info-card {\r\n    padding: 26px;\r\n    border: 1px solid var(--bno-border);\r\n    border-radius: 18px;\r\n    background: #fff;\r\n  }\r\n\r\n  .bno-dubai-info-card h3 {\r\n    margin: 0 0 11px;\r\n    font-size: 20px;\r\n    color: var(--bno-navy);\r\n  }\r\n\r\n  .bno-dubai-info-card p {\r\n    margin: 0;\r\n    color: var(--bno-muted);\r\n    line-height: 1.65;\r\n  }\r\n\r\n  \/* EDITORIAL *\/\r\n  .bno-dubai-editorial {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 50px;\r\n    align-items: center;\r\n  }\r\n\r\n  .bno-dubai-editorial__content p {\r\n    color: var(--bno-muted);\r\n    font-size: 17px;\r\n    line-height: 1.72;\r\n  }\r\n\r\n  .bno-dubai-editorial__media {\r\n    min-height: 460px;\r\n    border-radius: 24px;\r\n    overflow: hidden;\r\n    background:\r\n      radial-gradient(circle at 70% 25%, #33b8d8 0%, transparent 38%),\r\n      linear-gradient(145deg, #0f4774, #0C1A38);\r\n    display: flex;\r\n    align-items: flex-end;\r\n    padding: 28px;\r\n  }\r\n\r\n  .bno-dubai-editorial__media span {\r\n    color: #fff;\r\n    font-size: 28px;\r\n    font-weight: 750;\r\n  }\r\n\r\n  \/* CTA *\/\r\n  .bno-dubai-cta-box {\r\n    display: grid;\r\n    grid-template-columns: 1fr auto;\r\n    gap: 30px;\r\n    align-items: center;\r\n    padding: 40px;\r\n    background: var(--bno-navy);\r\n    border-radius: 24px;\r\n    color: #fff;\r\n  }\r\n\r\n  .bno-dubai-cta-box h2 {\r\n    margin: 4px 0 12px;\r\n    color: #fff;\r\n    font-size: clamp(28px, 4vw, 42px);\r\n  }\r\n\r\n  .bno-dubai-cta-box p {\r\n    margin: 0;\r\n    max-width: 720px;\r\n    color: rgba(255,255,255,.78);\r\n    line-height: 1.6;\r\n  }\r\n\r\n  .bno-dubai-cta-box .bno-eyebrow {\r\n    color: #8bd8ef;\r\n  }\r\n\r\n  .bno-dubai-cta-box .bno-btn--primary {\r\n    background: #fff;\r\n    color: var(--bno-navy);\r\n    border-color: #fff;\r\n    white-space: nowrap;\r\n  }\r\n\r\n  @media (max-width: 900px) {\r\n    .bno-dubai-page .bno-section {\r\n      padding: 58px 0;\r\n    }\r\n\r\n    .bno-dubai-intro__grid,\r\n    .bno-dubai-editorial,\r\n    .bno-dubai-cta-box {\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .bno-dubai-info-grid {\r\n      grid-template-columns: repeat(2, 1fr);\r\n    }\r\n\r\n    .bno-dubai-hero {\r\n      min-height: 520px;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 620px) {\r\n    .bno-dubai-page .bno-shell {\r\n      width: min(100% - 24px, 1180px);\r\n    }\r\n\r\n    .bno-dubai-info-grid {\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .bno-dubai-hero__content {\r\n      padding: 90px 0 52px;\r\n    }\r\n\r\n    .bno-dubai-cta-box {\r\n      padding: 28px 22px;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<div class=\"bno-dubai-page\">\r\n\r\n<section class=\"bno-dubai-hero\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-dubai-hero__content\">\r\n\r\n      <span class=\"bno-eyebrow\">\r\n        Dubai \u00b7 Yhdistyneet arabiemiirikunnat\r\n      <\/span>\r\n\r\n      <h1>\r\n        Hotellit Dubaissa \u2013 l\u00f6yd\u00e4 matkallesi sopiva majoitus\r\n      <\/h1>\r\n\r\n      <p class=\"bno-lead\">\r\n        Tutustu hotelleihin Downtown Dubaista ja Business Baysta aina\r\n        Dubai Marinaan, Jumeirahiin ja Dubai Creekin ymp\u00e4rist\u00f6\u00f6n asti.\r\n        Katso hotellit, huonetyypit ja sijainnit ennen kuin varaus\r\n        avautuu BNO Travelissa.\r\n      <\/p>\r\n\r\n      <div class=\"bno-actions\">\r\n        <a href=\"#hoteller\" class=\"bno-btn bno-btn--primary\">\r\n          Katso hotellit\r\n        <\/a>\r\n\r\n        <a href=\"#omrader\" class=\"bno-btn bno-btn--secondary\">\r\n          Tutustu Dubaihin\r\n        <\/a>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fdf128e elementor-widget elementor-widget-html\" data-id=\"fdf128e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section class=\"bno-section bno-section--light bno-dubai-intro\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-dubai-intro__grid\">\r\n\r\n      <div class=\"bno-dubai-intro__text\">\r\n\r\n        <span class=\"bno-eyebrow\">\r\n          Majoitus Dubaissa\r\n        <\/span>\r\n\r\n        <div class=\"bno-section-heading\">\r\n          <h2>\r\n            Kaupunkiel\u00e4m\u00e4st\u00e4 ja ostoksista rannoille ja lomakeskuksiin\r\n          <\/h2>\r\n        <\/div>\r\n\r\n        <p>\r\n          Dubai koostuu useista selv\u00e4sti erilaisista alueista, ja majoituspaikan\r\n          sijainnilla on suuri vaikutus matkakokemukseen. Downtown Dubai\r\n          ja Business Bay sopivat sinulle, jos haluat modernia kaupunkiel\u00e4m\u00e4\u00e4,\r\n          ravintoloita ja tunnettuja n\u00e4ht\u00e4vyyksi\u00e4 l\u00e4helle. Dubai Marina\r\n          ja Jumeirah puolestaan tarjoavat lyhyemm\u00e4n matkan rannalle,\r\n          rantakaduille ja meren \u00e4\u00e4relle.\r\n        <\/p>\r\n\r\n        <p>\r\n          BNO Travel kokoaa laajan valikoiman hotelleja ja huoneistohotelleja\r\n          Dubaissa. Voit tutustua vaihtoehtoihin, vertailla sijainteja ja\r\n          hotellitietoja sek\u00e4 tarkastella saatavilla olevia huonetyyppej\u00e4\r\n          ennen kuin t\u00e4ysi varauspalvelu avautuu.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-highlights\">\r\n\r\n        <div class=\"bno-dubai-highlight\">\r\n          <strong>Kaupunki ja ranta<\/strong>\r\n          <span>\r\n            Yhdist\u00e4 ostokset, ravintolat ja n\u00e4ht\u00e4vyydet rantael\u00e4m\u00e4\u00e4n ja\r\n            rentoihin p\u00e4iviin meren \u00e4\u00e4rell\u00e4.\r\n          <\/span>\r\n        <\/div>\r\n\r\n        <div class=\"bno-dubai-highlight\">\r\n          <strong>Monipuoliset alueet<\/strong>\r\n          <span>\r\n            Valitse esimerkiksi Downtownin, Business Bayn, Dubai Marinan,\r\n            Jumeirahin ja Dubai Creekin v\u00e4lilt\u00e4.\r\n          <\/span>\r\n        <\/div>\r\n\r\n        <div class=\"bno-dubai-highlight\">\r\n          <strong>Hotelleja erilaisiin matkoihin<\/strong>\r\n          <span>\r\n            L\u00f6yd\u00e4 vaihtoehtoja pariskunnille, perheille, liikematkoille\r\n            ja pidempiin oleskeluihin.\r\n          <\/span>\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d483d7 elementor-widget elementor-widget-html\" data-id=\"6d483d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"hoteller\" class=\"bno-section bno-section--soft bno-stays-preview\" data-bno-stays-preview data-api-base=\"https:\/\/bno-api-duffel-staging.onrender.com\" data-destination=\"dubai\" data-lang=\"fi\" data-initial-count=\"12\" data-page-size=\"200\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-section-heading\">\r\n      <span class=\"bno-eyebrow\">\r\n        Hotellit Dubaissa\r\n      <\/span>\r\n\r\n      <h2>\r\n        L\u00f6yd\u00e4 majoitukseesi sopiva hotelli\r\n      <\/h2>\r\n\r\n      <p>\r\n        Tutustu Dubain hotelleihin ja katso kuvat, sijainti,\r\n        hotellitiedot ja asiakasarviot.\r\n        Lis\u00e4\u00e4 tietoja ja varausmahdollisuus avautuvat pian.\r\n      <\/p>\r\n    <\/div>\r\n\r\n\r\n    <!-- FILTERS -->\r\n\r\n    <div class=\"bno-stays-toolbar\">\r\n\r\n      <div class=\"bno-stays-count\" data-result-count aria-live=\"polite\">\r\n        Ladataan hotelleja \u2026\r\n      <\/div>\r\n\r\n\r\n      <div class=\"bno-stays-filters\">\r\n\r\n        <label class=\"bno-stays-field\">\r\n          <span>Hae hotelleja<\/span>\r\n\r\n          <input\r\n            type=\"search\"\r\n            placeholder=\"Hotellin nimi tai alue\"\r\n            autocomplete=\"off\"\r\n            data-hotel-search\r\n          >\r\n        <\/label>\r\n\r\n\r\n        <label class=\"bno-stays-field\" data-area-field>\r\n          <span>Alue<\/span>\r\n\r\n          <select data-area-filter>\r\n            <option value=\"\">\r\n              Kaikki alueet\r\n            <\/option>\r\n          <\/select>\r\n        <\/label>\r\n\r\n\r\n        <label class=\"bno-stays-field\">\r\n          <span>T\u00e4hdet<\/span>\r\n\r\n          <select data-star-filter>\r\n            <option value=\"\">\r\n              Kaikki\r\n            <\/option>\r\n\r\n            <option value=\"5\">\r\n              5 t\u00e4hte\u00e4\r\n            <\/option>\r\n\r\n            <option value=\"4\">\r\n              4 t\u00e4hte\u00e4 tai enemm\u00e4n\r\n            <\/option>\r\n\r\n            <option value=\"3\">\r\n              3 t\u00e4hte\u00e4 tai enemm\u00e4n\r\n            <\/option>\r\n          <\/select>\r\n        <\/label>\r\n\r\n      <\/div>\r\n\r\n\r\n      <!-- MOBILE LIST \/ MAP -->\r\n\r\n      <div class=\"bno-stays-mobile-switch\">\r\n\r\n        <button type=\"button\" class=\"is-active\" data-show-list>\r\n          Lista\r\n        <\/button>\r\n\r\n        <button type=\"button\" data-show-map>\r\n          Kartta\r\n        <\/button>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <!-- LIST + MAP -->\r\n\r\n    <div class=\"bno-stays-layout\">\r\n\r\n      <div class=\"bno-stays-list-column\" data-list-column>\r\n\r\n        <div class=\"bno-stays-status\" data-status role=\"status\" aria-live=\"polite\">\r\n          Ladataan hotelleja \u2026\r\n        <\/div>\r\n\r\n\r\n        <div class=\"bno-stays-list\" data-hotel-list><\/div>\r\n\r\n\r\n        <div class=\"bno-stays-more-wrap\" data-more-wrap hidden>\r\n\r\n          <button type=\"button\" class=\"bno-stays-more\" data-more>\r\n            N\u00e4yt\u00e4 lis\u00e4\u00e4 hotelleja\r\n          <\/button>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"bno-stays-map-column\" data-map-column>\r\n\r\n        <div class=\"bno-stays-map-card\">\r\n\r\n          <div id=\"bno-dubai-map\" class=\"bno-stays-map\"><\/div>\r\n\r\n\r\n          <div class=\"bno-stays-map-note\" data-map-note>\r\n            Ladataan hotellien sijainteja \u2026\r\n          <\/div>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n\r\n  <!-- HOTEL MODAL -->\r\n\r\n  <div class=\"bno-stays-modal\" data-hotel-modal hidden>\r\n\r\n    <div class=\"bno-stays-modal__backdrop\" data-modal-close><\/div>\r\n\r\n\r\n    <div class=\"bno-stays-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Hotellitiedot\">\r\n\r\n      <button type=\"button\" class=\"bno-stays-modal__close\" data-modal-close aria-label=\"Sulje\">\r\n        \u00d7\r\n      <\/button>\r\n\r\n\r\n      <div data-modal-content><\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<style>\r\n\r\n\/* =========================================================\r\n   BNO STAYS PREVIEW\r\n   ========================================================= *\/\r\n\r\n.bno-stays-preview {\r\n  --bno-navy: #0C1A38;\r\n  --bno-blue: #1769aa;\r\n  --bno-border: #dce3ec;\r\n  --bno-muted: #627087;\r\n}\r\n\r\n.bno-stays-preview *,\r\n.bno-stays-preview *::before,\r\n.bno-stays-preview *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n.bno-stays-preview [hidden] {\r\n  display: none !important;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   TOOLBAR\r\n   ========================================================= *\/\r\n\r\n.bno-stays-toolbar {\r\n  margin-bottom: 26px;\r\n}\r\n\r\n.bno-stays-count {\r\n  margin-bottom: 17px;\r\n\r\n  color: #172238;\r\n\r\n  font-size: 15px;\r\n  font-weight: 750;\r\n}\r\n\r\n.bno-stays-filters {\r\n  display: grid;\r\n\r\n  grid-template-columns:\r\n    1.35fr\r\n    .95fr\r\n    .75fr;\r\n\r\n  gap: 12px;\r\n}\r\n\r\n.bno-stays-field {\r\n  display: flex;\r\n  flex-direction: column;\r\n\r\n  gap: 7px;\r\n}\r\n\r\n.bno-stays-field span {\r\n  color: #59667a;\r\n\r\n  font-size: 12px;\r\n  font-weight: 750;\r\n}\r\n\r\n.bno-stays-field input,\r\n.bno-stays-field select {\r\n  width: 100%;\r\n  height: 49px;\r\n\r\n  padding: 0 14px;\r\n\r\n  border: 1px solid #d3dce7;\r\n  border-radius: 11px;\r\n\r\n  background: #fff;\r\n\r\n  color: #182238;\r\n\r\n  font: inherit;\r\n\r\n  outline: none;\r\n}\r\n\r\n.bno-stays-field input:focus,\r\n.bno-stays-field select:focus {\r\n  border-color: #587ba9;\r\n\r\n  box-shadow:\r\n    0 0 0 3px rgba(23,105,170,.08);\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   LAYOUT\r\n   ========================================================= *\/\r\n\r\n.bno-stays-layout {\r\n  display: grid;\r\n\r\n  grid-template-columns:\r\n    minmax(0,1.05fr)\r\n    minmax(400px,.95fr);\r\n\r\n  gap: 24px;\r\n\r\n  align-items: start;\r\n}\r\n\r\n.bno-stays-list {\r\n  display: grid;\r\n\r\n  gap: 15px;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   HOTEL CARD\r\n   ========================================================= *\/\r\n\r\n.bno-stays-hotel {\r\n  display: grid;\r\n\r\n  grid-template-columns:\r\n    215px\r\n    minmax(0,1fr);\r\n\r\n  min-height: 225px;\r\n\r\n  overflow: hidden;\r\n\r\n  background: #fff;\r\n\r\n  border: 1px solid #dce3ec;\r\n  border-radius: 17px;\r\n\r\n  transition:\r\n    transform .2s ease,\r\n    box-shadow .2s ease,\r\n    border-color .2s ease;\r\n}\r\n\r\n.bno-stays-hotel:hover {\r\n  transform: translateY(-2px);\r\n\r\n  box-shadow:\r\n    0 12px 30px rgba(12,26,56,.08);\r\n}\r\n\r\n.bno-stays-hotel.is-map-active {\r\n  border-color: #1769aa;\r\n\r\n  box-shadow:\r\n    0 0 0 2px rgba(23,105,170,.13);\r\n}\r\n\r\n\r\n\/* IMAGE *\/\r\n\r\n.bno-stays-hotel__image {\r\n  position: relative;\r\n\r\n  min-height: 225px;\r\n\r\n  overflow: hidden;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n      #d9e4ed,\r\n      #c4d2de\r\n    );\r\n}\r\n\r\n.bno-stays-hotel__image img {\r\n  position: absolute;\r\n  inset: 0;\r\n\r\n  width: 100%;\r\n  height: 100%;\r\n\r\n  object-fit: cover;\r\n}\r\n\r\n.bno-stays-image-placeholder {\r\n  position: absolute;\r\n  inset: 0;\r\n\r\n  display: flex;\r\n\r\n  align-items: center;\r\n  justify-content: center;\r\n\r\n  padding: 25px;\r\n\r\n  color: #647289;\r\n\r\n  text-align: center;\r\n\r\n  font-size: 13px;\r\n  font-weight: 700;\r\n}\r\n\r\n.bno-stays-badge {\r\n  position: absolute;\r\n\r\n  z-index: 3;\r\n\r\n  top: 12px;\r\n  left: 12px;\r\n\r\n  padding: 7px 10px;\r\n\r\n  border-radius: 999px;\r\n\r\n  background: rgba(255,255,255,.96);\r\n\r\n  color: #344158;\r\n\r\n  font-size: 11px;\r\n  font-weight: 800;\r\n\r\n  box-shadow:\r\n    0 2px 10px rgba(12,26,56,.08);\r\n}\r\n\r\n\r\n\/* BODY *\/\r\n\r\n.bno-stays-hotel__body {\r\n  display: flex;\r\n  flex-direction: column;\r\n\r\n  min-width: 0;\r\n\r\n  padding: 20px 21px;\r\n}\r\n\r\n.bno-stays-stars {\r\n  min-height: 19px;\r\n\r\n  color: #c98513;\r\n\r\n  font-size: 14px;\r\n\r\n  letter-spacing: 1px;\r\n}\r\n\r\n.bno-stays-hotel h3 {\r\n  margin: 5px 0 7px;\r\n\r\n  color: #172238;\r\n\r\n  font-size: 21px;\r\n  line-height: 1.26;\r\n}\r\n\r\n.bno-stays-location {\r\n  margin-bottom: 10px;\r\n\r\n  color: #667288;\r\n\r\n  font-size: 13px;\r\n}\r\n\r\n.bno-stays-rating {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n\r\n  align-items: center;\r\n\r\n  gap: 8px;\r\n\r\n  margin-bottom: 10px;\r\n}\r\n\r\n.bno-stays-score {\r\n  display: inline-flex;\r\n\r\n  align-items: center;\r\n  justify-content: center;\r\n\r\n  min-width: 38px;\r\n  height: 29px;\r\n\r\n  padding: 0 8px;\r\n\r\n  border-radius: 8px;\r\n\r\n  background: #0C1A38;\r\n\r\n  color: #fff;\r\n\r\n  font-size: 12px;\r\n  font-weight: 800;\r\n}\r\n\r\n.bno-stays-review-count {\r\n  color: #697589;\r\n\r\n  font-size: 12px;\r\n}\r\n\r\n.bno-stays-description {\r\n  display: -webkit-box;\r\n\r\n  overflow: hidden;\r\n\r\n  margin: 0 0 16px;\r\n\r\n  color: #58667b;\r\n\r\n  font-size: 14px;\r\n  line-height: 1.55;\r\n\r\n  -webkit-box-orient: vertical;\r\n  -webkit-line-clamp: 3;\r\n}\r\n\r\n.bno-stays-hotel__actions {\r\n  display: flex;\r\n\r\n  align-items: center;\r\n  justify-content: space-between;\r\n\r\n  gap: 14px;\r\n\r\n  margin-top: auto;\r\n}\r\n\r\n.bno-stays-small-status {\r\n  color: #687589;\r\n\r\n  font-size: 12px;\r\n}\r\n\r\n.bno-stays-open {\r\n  min-height: 43px;\r\n\r\n  padding: 0 16px;\r\n\r\n  border: 0;\r\n  border-radius: 10px;\r\n\r\n  background: #0C1A38;\r\n\r\n  color: #fff;\r\n\r\n  font: inherit;\r\n  font-size: 13px;\r\n  font-weight: 750;\r\n\r\n  cursor: pointer;\r\n}\r\n\r\n.bno-stays-open:hover {\r\n  opacity: .93;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   STATUS\r\n   ========================================================= *\/\r\n\r\n.bno-stays-status {\r\n  margin-bottom: 15px;\r\n\r\n  padding: 16px 17px;\r\n\r\n  border: 1px solid #dce3ec;\r\n  border-radius: 12px;\r\n\r\n  background: #fff;\r\n\r\n  color: #607087;\r\n\r\n  line-height: 1.55;\r\n}\r\n\r\n.bno-stays-status:empty {\r\n  display: none;\r\n}\r\n\r\n.bno-stays-status.is-error {\r\n  border-color: #efc7c7;\r\n\r\n  background: #fff7f7;\r\n\r\n  color: #933b3b;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MAP\r\n   ========================================================= *\/\r\n\r\n.bno-stays-map-column {\r\n  position: sticky;\r\n\r\n  top: 100px;\r\n}\r\n\r\n.bno-stays-map-card {\r\n  position: relative;\r\n\r\n  height: min(72vh,720px);\r\n  min-height: 520px;\r\n\r\n  overflow: hidden;\r\n\r\n  border: 1px solid #dce3ec;\r\n  border-radius: 18px;\r\n\r\n  background: #e5ebf0;\r\n}\r\n\r\n.bno-stays-map {\r\n  position: absolute;\r\n\r\n  inset: 0;\r\n\r\n  z-index: 1;\r\n}\r\n\r\n.bno-stays-map-note {\r\n  position: absolute;\r\n\r\n  z-index: 500;\r\n\r\n  right: 14px;\r\n  bottom: 14px;\r\n  left: 14px;\r\n\r\n  padding: 11px 13px;\r\n\r\n  border-radius: 10px;\r\n\r\n  background: rgba(255,255,255,.95);\r\n\r\n  color: #526176;\r\n\r\n  font-size: 12px;\r\n\r\n  box-shadow:\r\n    0 5px 18px rgba(12,26,56,.10);\r\n}\r\n\r\n\r\n\/* NORMAL MAP MARKER *\/\r\n\r\n.bno-stays-map-marker {\r\n  display: flex;\r\n\r\n  align-items: center;\r\n  justify-content: center;\r\n\r\n  width: 34px;\r\n  height: 34px;\r\n\r\n  border: 3px solid #fff;\r\n  border-radius: 50%;\r\n\r\n  background: #0C1A38;\r\n\r\n  color: #fff;\r\n\r\n  font-size: 12px;\r\n  font-weight: 800;\r\n\r\n  box-shadow:\r\n    0 3px 13px rgba(12,26,56,.30);\r\n}\r\n\r\n\r\n\/* PRICE MARKER - READY FOR LATER *\/\r\n\r\n.bno-stays-price-marker {\r\n  display: inline-flex;\r\n\r\n  align-items: center;\r\n  justify-content: center;\r\n\r\n  min-width: 78px;\r\n  height: 34px;\r\n\r\n  padding: 0 10px;\r\n\r\n  border: 2px solid #fff;\r\n  border-radius: 999px;\r\n\r\n  background: #0C1A38;\r\n\r\n  color: #fff;\r\n\r\n  white-space: nowrap;\r\n\r\n  font-size: 11px;\r\n  font-weight: 800;\r\n\r\n  box-shadow:\r\n    0 3px 13px rgba(12,26,56,.28);\r\n}\r\n\r\n\r\n\/* POPUP *\/\r\n\r\n.bno-stays-map-popup {\r\n  min-width: 190px;\r\n}\r\n\r\n.bno-stays-map-popup strong {\r\n  display: block;\r\n\r\n  margin-bottom: 5px;\r\n\r\n  color: #172238;\r\n\r\n  font-size: 13px;\r\n  line-height: 1.35;\r\n}\r\n\r\n.bno-stays-map-popup span {\r\n  display: block;\r\n\r\n  color: #657287;\r\n\r\n  font-size: 12px;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   SHOW MORE\r\n   ========================================================= *\/\r\n\r\n.bno-stays-more-wrap {\r\n  display: flex;\r\n\r\n  justify-content: center;\r\n\r\n  padding-top: 25px;\r\n}\r\n\r\n.bno-stays-more {\r\n  min-width: 210px;\r\n  min-height: 49px;\r\n\r\n  padding: 0 20px;\r\n\r\n  border: 1px solid #0C1A38;\r\n  border-radius: 11px;\r\n\r\n  background: #fff;\r\n\r\n  color: #0C1A38;\r\n\r\n  font: inherit;\r\n  font-weight: 750;\r\n\r\n  cursor: pointer;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MOBILE SWITCH\r\n   ========================================================= *\/\r\n\r\n.bno-stays-mobile-switch {\r\n  display: none;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MODAL\r\n   ========================================================= *\/\r\n\r\n.bno-stays-modal {\r\n  position: fixed;\r\n\r\n  inset: 0;\r\n\r\n  z-index: 999999;\r\n}\r\n\r\n.bno-stays-modal__backdrop {\r\n  position: absolute;\r\n\r\n  inset: 0;\r\n\r\n  background: rgba(5,14,31,.64);\r\n\r\n  backdrop-filter: blur(3px);\r\n}\r\n\r\n.bno-stays-modal__dialog {\r\n  position: absolute;\r\n\r\n  z-index: 2;\r\n\r\n  top: 3vh;\r\n  bottom: 3vh;\r\n  left: 50%;\r\n\r\n  width: min(\r\n    1060px,\r\n    calc(100% - 28px)\r\n  );\r\n\r\n  overflow-y: auto;\r\n\r\n  padding: 28px;\r\n\r\n  transform: translateX(-50%);\r\n\r\n  border-radius: 22px;\r\n\r\n  background: #fff;\r\n\r\n  box-shadow:\r\n    0 30px 90px rgba(0,0,0,.25);\r\n}\r\n\r\n.bno-stays-modal__close {\r\n  position: sticky;\r\n\r\n  z-index: 20;\r\n\r\n  top: 0;\r\n\r\n  float: right;\r\n\r\n  width: 44px;\r\n  height: 44px;\r\n\r\n  margin: 0 0 -44px;\r\n\r\n  border: 0;\r\n  border-radius: 50%;\r\n\r\n  background: #0C1A38;\r\n\r\n  color: #fff;\r\n\r\n  font-size: 27px;\r\n  line-height: 1;\r\n\r\n  cursor: pointer;\r\n}\r\n\r\n\r\n\/* MODAL HEADER *\/\r\n\r\n.bno-stays-modal-title h2 {\r\n  max-width: 850px;\r\n\r\n  margin: 6px 60px 9px 0;\r\n\r\n  color: #172238;\r\n\r\n  font-size: clamp(\r\n    29px,\r\n    4vw,\r\n    43px\r\n  );\r\n\r\n  line-height: 1.12;\r\n}\r\n\r\n.bno-stays-modal-meta {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n\r\n  align-items: center;\r\n\r\n  gap: 10px;\r\n\r\n  margin-bottom: 24px;\r\n\r\n  color: #667288;\r\n}\r\n\r\n.bno-stays-modal-stars {\r\n  color: #c98513;\r\n\r\n  letter-spacing: 1px;\r\n}\r\n\r\n\r\n\/* GALLERY *\/\r\n\r\n.bno-stays-gallery {\r\n  display: grid;\r\n\r\n  grid-template-columns:\r\n    2fr\r\n    1fr\r\n    1fr;\r\n\r\n  grid-template-rows:\r\n    190px\r\n    190px;\r\n\r\n  gap: 7px;\r\n\r\n  margin-bottom: 30px;\r\n\r\n  overflow: hidden;\r\n\r\n  border-radius: 17px;\r\n\r\n  background: #e8edf2;\r\n}\r\n\r\n.bno-stays-gallery figure {\r\n  position: relative;\r\n\r\n  min-width: 0;\r\n\r\n  margin: 0;\r\n\r\n  overflow: hidden;\r\n\r\n  background: #e7ebf0;\r\n}\r\n\r\n.bno-stays-gallery figure:first-child {\r\n  grid-row:\r\n    1 \/ 3;\r\n}\r\n\r\n.bno-stays-gallery img {\r\n  width: 100%;\r\n  height: 100%;\r\n\r\n  object-fit: cover;\r\n}\r\n\r\n\r\n\/* MODAL BODY *\/\r\n\r\n.bno-stays-modal-grid {\r\n  display: grid;\r\n\r\n  grid-template-columns:\r\n    minmax(0,1fr)\r\n    285px;\r\n\r\n  gap: 38px;\r\n\r\n  align-items: start;\r\n}\r\n\r\n.bno-stays-modal-copy h3 {\r\n  margin: 0 0 12px;\r\n\r\n  color: #172238;\r\n\r\n  font-size: 23px;\r\n}\r\n\r\n.bno-stays-modal-copy p {\r\n  margin: 0;\r\n\r\n  color: #58667a;\r\n\r\n  line-height: 1.72;\r\n\r\n  white-space: pre-line;\r\n}\r\n\r\n.bno-stays-modal-side {\r\n  padding: 20px;\r\n\r\n  border-radius: 15px;\r\n\r\n  background: #f3f6f9;\r\n}\r\n\r\n.bno-stays-modal-side strong {\r\n  display: block;\r\n\r\n  margin-bottom: 8px;\r\n\r\n  color: #172238;\r\n}\r\n\r\n.bno-stays-modal-address {\r\n  color: #5d6a7d;\r\n\r\n  font-size: 13px;\r\n  line-height: 1.6;\r\n}\r\n\r\n\r\n\/* ROOMS COMING *\/\r\n\r\n.bno-stays-room-coming {\r\n  margin-top: 38px;\r\n\r\n  padding-top: 28px;\r\n\r\n  border-top:\r\n    1px solid #dfe5ec;\r\n}\r\n\r\n.bno-stays-room-coming h3 {\r\n  margin: 5px 0 12px;\r\n\r\n  color: #172238;\r\n\r\n  font-size: 23px;\r\n}\r\n\r\n.bno-stays-room-coming-box {\r\n  padding: 18px;\r\n\r\n  border-radius: 12px;\r\n\r\n  background: #f3f6f9;\r\n\r\n  color: #5e6c80;\r\n\r\n  line-height: 1.6;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   RESPONSIVE\r\n   ========================================================= *\/\r\n\r\n@media (max-width: 900px) {\r\n\r\n  .bno-stays-filters {\r\n    grid-template-columns:\r\n      1fr\r\n      1fr;\r\n  }\r\n\r\n  .bno-stays-field:first-child {\r\n    grid-column:\r\n      1 \/ 3;\r\n  }\r\n\r\n  .bno-stays-layout {\r\n    grid-template-columns:\r\n      1fr;\r\n  }\r\n\r\n  .bno-stays-map-column {\r\n    display: none;\r\n\r\n    position: static;\r\n  }\r\n\r\n  .bno-stays-map-column.is-mobile-active {\r\n    display: block;\r\n  }\r\n\r\n  .bno-stays-list-column.is-mobile-hidden {\r\n    display: none;\r\n  }\r\n\r\n  .bno-stays-mobile-switch {\r\n    display: flex;\r\n\r\n    gap: 7px;\r\n\r\n    margin-top: 15px;\r\n  }\r\n\r\n  .bno-stays-mobile-switch button {\r\n    flex: 1;\r\n\r\n    min-height: 43px;\r\n\r\n    border: 1px solid #ccd6e2;\r\n    border-radius: 9px;\r\n\r\n    background: #fff;\r\n\r\n    color: #526176;\r\n\r\n    font-weight: 700;\r\n\r\n    cursor: pointer;\r\n  }\r\n\r\n  .bno-stays-mobile-switch button.is-active {\r\n    border-color: #0C1A38;\r\n\r\n    background: #0C1A38;\r\n\r\n    color: #fff;\r\n  }\r\n\r\n  .bno-stays-map-card {\r\n    height: 65vh;\r\n\r\n    min-height: 450px;\r\n  }\r\n\r\n}\r\n\r\n\r\n@media (max-width: 650px) {\r\n\r\n  .bno-stays-filters {\r\n    grid-template-columns:\r\n      1fr;\r\n  }\r\n\r\n  .bno-stays-field:first-child {\r\n    grid-column: auto;\r\n  }\r\n\r\n  .bno-stays-hotel {\r\n    grid-template-columns:\r\n      1fr;\r\n  }\r\n\r\n  .bno-stays-hotel__image {\r\n    min-height: 240px;\r\n  }\r\n\r\n  .bno-stays-hotel__actions {\r\n    align-items: stretch;\r\n    flex-direction: column;\r\n  }\r\n\r\n  .bno-stays-open {\r\n    width: 100%;\r\n  }\r\n\r\n  .bno-stays-modal__dialog {\r\n    top: 8px;\r\n    bottom: 8px;\r\n\r\n    padding: 19px;\r\n\r\n    border-radius: 16px;\r\n  }\r\n\r\n  .bno-stays-gallery {\r\n    grid-template-columns:\r\n      1fr\r\n      1fr;\r\n\r\n    grid-template-rows:\r\n      235px\r\n      130px;\r\n  }\r\n\r\n  .bno-stays-gallery figure:first-child {\r\n    grid-column:\r\n      1 \/ 3;\r\n\r\n    grid-row: auto;\r\n  }\r\n\r\n  .bno-stays-gallery figure:nth-child(n+4) {\r\n    display: none;\r\n  }\r\n\r\n  .bno-stays-modal-grid {\r\n    grid-template-columns:\r\n      1fr;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n<script>\r\n(function () {\r\n\r\n  const section =\r\n    document.querySelector(\r\n      '[data-bno-stays-preview]'\r\n    );\r\n\r\n  if (\r\n    !section ||\r\n    section.dataset.initialized === '1'\r\n  ) {\r\n    return;\r\n  }\r\n\r\n  section.dataset.initialized = '1';\r\n\r\n\r\n  \/* =======================================================\r\n     CONFIG\r\n     ======================================================= *\/\r\n\r\n  const apiBase =\r\n    String(\r\n      section.dataset.apiBase || ''\r\n    ).replace(\/\\\/+$\/, '');\r\n\r\n  const destination =\r\n    String(\r\n      section.dataset.destination || 'dubai'\r\n    )\r\n      .trim()\r\n      .toLowerCase();\r\n\r\n  const lang =\r\n    String(\r\n      section.dataset.lang || 'fi'\r\n    ).trim();\r\n\r\n  const initialCount =\r\n    Number(\r\n      section.dataset.initialCount || 12\r\n    );\r\n\r\n  const pageSize =\r\n    Number(\r\n      section.dataset.pageSize || 200\r\n    );\r\n\r\n\r\n  \/* =======================================================\r\n     ELEMENTS\r\n     ======================================================= *\/\r\n\r\n  const listEl =\r\n    section.querySelector(\r\n      '[data-hotel-list]'\r\n    );\r\n\r\n  const statusEl =\r\n    section.querySelector(\r\n      '[data-status]'\r\n    );\r\n\r\n  const countEl =\r\n    section.querySelector(\r\n      '[data-result-count]'\r\n    );\r\n\r\n  const searchInput =\r\n    section.querySelector(\r\n      '[data-hotel-search]'\r\n    );\r\n\r\n  const areaFilter =\r\n    section.querySelector(\r\n      '[data-area-filter]'\r\n    );\r\n\r\n  const areaField =\r\n    section.querySelector(\r\n      '[data-area-field]'\r\n    );\r\n\r\n  const starFilter =\r\n    section.querySelector(\r\n      '[data-star-filter]'\r\n    );\r\n\r\n  const moreWrap =\r\n    section.querySelector(\r\n      '[data-more-wrap]'\r\n    );\r\n\r\n  const moreButton =\r\n    section.querySelector(\r\n      '[data-more]'\r\n    );\r\n\r\n  const mapColumn =\r\n    section.querySelector(\r\n      '[data-map-column]'\r\n    );\r\n\r\n  const listColumn =\r\n    section.querySelector(\r\n      '[data-list-column]'\r\n    );\r\n\r\n  const showMapButton =\r\n    section.querySelector(\r\n      '[data-show-map]'\r\n    );\r\n\r\n  const showListButton =\r\n    section.querySelector(\r\n      '[data-show-list]'\r\n    );\r\n\r\n  const mapNote =\r\n    section.querySelector(\r\n      '[data-map-note]'\r\n    );\r\n\r\n  const modal =\r\n    section.querySelector(\r\n      '[data-hotel-modal]'\r\n    );\r\n\r\n  const modalContent =\r\n    section.querySelector(\r\n      '[data-modal-content]'\r\n    );\r\n\r\n\r\n  \/* =======================================================\r\n     STATE\r\n     ======================================================= *\/\r\n\r\n  let allHotels = [];\r\n\r\n  let visibleCount =\r\n    initialCount;\r\n\r\n  let map = null;\r\n\r\n  let markerRecords = [];\r\n\r\n  let leafletPromise = null;\r\n\r\n  let oldOverflow = '';\r\n\r\n\r\n  \/* =======================================================\r\n     HELPERS\r\n     ======================================================= *\/\r\n\r\n  function esc(value) {\r\n\r\n    return String(\r\n      value == null ? '' : value\r\n    )\r\n      .replace(\/&\/g, '&amp;')\r\n      .replace(\/<\/g, '&lt;')\r\n      .replace(\/>\/g, '&gt;')\r\n      .replace(\/\"\/g, '&quot;')\r\n      .replace(\/'\/g, '&#039;');\r\n\r\n  }\r\n\r\n\r\n  function clean(value) {\r\n\r\n    return String(\r\n      value == null ? '' : value\r\n    ).trim();\r\n\r\n  }\r\n\r\n\r\n  function numberOrNull(value) {\r\n\r\n    if (\r\n      value === null ||\r\n      value === undefined ||\r\n      value === ''\r\n    ) {\r\n      return null;\r\n    }\r\n\r\n    const parsed =\r\n      Number(value);\r\n\r\n    return Number.isFinite(parsed)\r\n      ? parsed\r\n      : null;\r\n\r\n  }\r\n\r\n\r\n  function normalizePhoto(photo) {\r\n\r\n    if (!photo) {\r\n      return '';\r\n    }\r\n\r\n    if (\r\n      typeof photo === 'string'\r\n    ) {\r\n      return clean(photo);\r\n    }\r\n\r\n    return clean(\r\n      photo.url ||\r\n      photo.src ||\r\n      photo.href ||\r\n      photo.image_url ||\r\n      photo.imageUrl ||\r\n      ''\r\n    );\r\n\r\n  }\r\n\r\n\r\n  function normalizePhotos(value) {\r\n\r\n    if (\r\n      !Array.isArray(value)\r\n    ) {\r\n      return [];\r\n    }\r\n\r\n    return value\r\n      .map(normalizePhoto)\r\n      .filter(Boolean);\r\n\r\n  }\r\n\r\n\r\n  function addressPart(\r\n    address,\r\n    keys\r\n  ) {\r\n\r\n    if (\r\n      !address ||\r\n      typeof address !== 'object'\r\n    ) {\r\n      return '';\r\n    }\r\n\r\n    for (\r\n      const key of keys\r\n    ) {\r\n\r\n      const value =\r\n        clean(\r\n          address[key]\r\n        );\r\n\r\n      if (value) {\r\n        return value;\r\n      }\r\n\r\n    }\r\n\r\n    return '';\r\n\r\n  }\r\n\r\n\r\n  function formatAddress(address) {\r\n\r\n    if (!address) {\r\n      return '';\r\n    }\r\n\r\n    if (\r\n      typeof address === 'string'\r\n    ) {\r\n      return clean(address);\r\n    }\r\n\r\n    const parts = [\r\n\r\n      addressPart(\r\n        address,\r\n        [\r\n          'line_one',\r\n          'line1',\r\n          'address_line_1'\r\n        ]\r\n      ),\r\n\r\n      addressPart(\r\n        address,\r\n        [\r\n          'line_two',\r\n          'line2',\r\n          'address_line_2'\r\n        ]\r\n      ),\r\n\r\n      addressPart(\r\n        address,\r\n        [\r\n          'postal_code',\r\n          'postalCode'\r\n        ]\r\n      ),\r\n\r\n      addressPart(\r\n        address,\r\n        [\r\n          'city_name',\r\n          'city'\r\n        ]\r\n      ),\r\n\r\n      addressPart(\r\n        address,\r\n        [\r\n          'region',\r\n          'state'\r\n        ]\r\n      )\r\n\r\n    ]\r\n      .filter(Boolean);\r\n\r\n    return Array.from(\r\n      new Set(parts)\r\n    ).join(', ');\r\n\r\n  }\r\n\r\n\r\n  function getArea(address) {\r\n\r\n    if (\r\n      !address ||\r\n      typeof address !== 'object'\r\n    ) {\r\n      return '';\r\n    }\r\n\r\n    return clean(\r\n      address.neighbourhood ||\r\n      address.neighborhood ||\r\n      address.district ||\r\n      address.area ||\r\n      address.line_two ||\r\n      address.line2 ||\r\n      ''\r\n    );\r\n\r\n  }\r\n\r\n\r\n  function normalizeHotel(raw) {\r\n\r\n    const photos =\r\n      normalizePhotos(\r\n        raw.photos\r\n      );\r\n\r\n    \/*\r\n      priceText er med allerede n\u00e5, men inventory-endepunktet\r\n      returnerer ikke pris per i dag.\r\n\r\n      N\u00e5r vi senere kobler resultatet mot et faktisk priss\u00f8k,\r\n      kan backend returnere eksempelvis:\r\n      priceText: \"1 895 kr\"\r\n\r\n      Da g\u00e5r kartet automatisk over til prisbobler ved zoom >= 12.\r\n    *\/\r\n\r\n    const priceText =\r\n      clean(\r\n        raw.priceText ||\r\n        raw.fromPriceText ||\r\n        raw.lowestPriceText ||\r\n        ''\r\n      );\r\n\r\n    return {\r\n\r\n      id:\r\n        clean(\r\n          raw.id\r\n        ),\r\n\r\n      name:\r\n        clean(\r\n          raw.name\r\n        ) || 'Hotelli',\r\n\r\n      description:\r\n        clean(\r\n          raw.description\r\n        ),\r\n\r\n      rating:\r\n        numberOrNull(\r\n          raw.rating\r\n        ),\r\n\r\n      reviewScore:\r\n        numberOrNull(\r\n          raw.reviewScore\r\n        ),\r\n\r\n      reviewCount:\r\n        numberOrNull(\r\n          raw.reviewCount\r\n        ),\r\n\r\n      photos,\r\n\r\n      coverImage:\r\n        photos[0] || '',\r\n\r\n      latitude:\r\n        numberOrNull(\r\n          raw.latitude\r\n        ),\r\n\r\n      longitude:\r\n        numberOrNull(\r\n          raw.longitude\r\n        ),\r\n\r\n      addressRaw:\r\n        raw.address || null,\r\n\r\n      address:\r\n        formatAddress(\r\n          raw.address\r\n        ),\r\n\r\n      area:\r\n        getArea(\r\n          raw.address\r\n        ),\r\n\r\n      priceText\r\n\r\n    };\r\n\r\n  }\r\n\r\n\r\n  function renderStars(value) {\r\n\r\n    if (!value) {\r\n      return '';\r\n    }\r\n\r\n    const count =\r\n      Math.max(\r\n        1,\r\n        Math.min(\r\n          5,\r\n          Math.round(value)\r\n        )\r\n      );\r\n\r\n    return '\u2605'.repeat(count);\r\n\r\n  }\r\n\r\n\r\n  function setStatus(\r\n    text,\r\n    isError\r\n  ) {\r\n\r\n    statusEl.textContent =\r\n      text || '';\r\n\r\n    statusEl.classList.toggle(\r\n      'is-error',\r\n      Boolean(isError)\r\n    );\r\n\r\n  }\r\n\r\n\r\n  \/* =======================================================\r\n     API\r\n     ======================================================= *\/\r\n\r\n  async function fetchInventoryPage(\r\n    after\r\n  ) {\r\n\r\n    const url =\r\n      new URL(\r\n        apiBase +\r\n        '\/api\/stays\/inventory-page\/' +\r\n        encodeURIComponent(destination)\r\n      );\r\n\r\n\r\n    url.searchParams.set(\r\n      'limit',\r\n      String(pageSize)\r\n    );\r\n\r\n\r\n    \/*\r\n      Viktig:\r\n      send spr\u00e5k til BNO API.\r\n    *\/\r\n\r\n    url.searchParams.set(\r\n      'lang',\r\n      lang\r\n    );\r\n\r\n\r\n    if (after) {\r\n\r\n      url.searchParams.set(\r\n        'after',\r\n        after\r\n      );\r\n\r\n    }\r\n\r\n\r\n    const response =\r\n      await fetch(\r\n        url.toString(),\r\n        {\r\n          method: 'GET',\r\n\r\n          headers: {\r\n            Accept:\r\n              'application\/json'\r\n          }\r\n        }\r\n      );\r\n\r\n\r\n    let json;\r\n\r\n\r\n    try {\r\n\r\n      json =\r\n        await response.json();\r\n\r\n    } catch (error) {\r\n\r\n      throw new Error(\r\n        'Virheellinen vastaus palvelimelta.'\r\n      );\r\n\r\n    }\r\n\r\n\r\n    if (!response.ok) {\r\n\r\n      throw new Error(\r\n        json?.detail ||\r\n        json?.error ||\r\n        (\r\n          'HTTP ' +\r\n          response.status\r\n        )\r\n      );\r\n\r\n    }\r\n\r\n\r\n    if (\r\n      !json ||\r\n      json.ok !== true ||\r\n      !Array.isArray(json.data)\r\n    ) {\r\n\r\n      throw new Error(\r\n        'Odottamaton vastaus palvelimelta.'\r\n      );\r\n\r\n    }\r\n\r\n\r\n    return json;\r\n\r\n  }\r\n\r\n\r\n  async function loadInventory() {\r\n\r\n    try {\r\n\r\n      setStatus(\r\n        'Ladataan hotelleja Dubaissa \u2026',\r\n        false\r\n      );\r\n\r\n\r\n      const byId =\r\n        new Map();\r\n\r\n      let after = '';\r\n\r\n      let pages = 0;\r\n\r\n\r\n      do {\r\n\r\n        pages += 1;\r\n\r\n\r\n        if (pages > 1) {\r\n\r\n          setStatus(\r\n            'Ladataan lis\u00e4\u00e4 hotelleja \u2026',\r\n            false\r\n          );\r\n\r\n        }\r\n\r\n\r\n        const response =\r\n          await fetchInventoryPage(\r\n            after\r\n          );\r\n\r\n\r\n        response.data\r\n          .map(normalizeHotel)\r\n          .filter(\r\n            hotel =>\r\n              hotel.id &&\r\n              hotel.name\r\n          )\r\n          .forEach(\r\n            hotel => {\r\n\r\n              byId.set(\r\n                hotel.id,\r\n                hotel\r\n              );\r\n\r\n            }\r\n          );\r\n\r\n\r\n        allHotels =\r\n          Array.from(\r\n            byId.values()\r\n          );\r\n\r\n\r\n        updateAreaFilter();\r\n\r\n        render();\r\n\r\n\r\n        after =\r\n          clean(\r\n            response\r\n              ?.pagination\r\n              ?.nextAfter\r\n          );\r\n\r\n\r\n        \/*\r\n          Safety.\r\n          Dubai skal normalt ikke trenge mange sider\r\n          n\u00e5r limit=200.\r\n        *\/\r\n\r\n        if (pages >= 10) {\r\n          break;\r\n        }\r\n\r\n\r\n      } while (after);\r\n\r\n\r\n      setStatus(\r\n        '',\r\n        false\r\n      );\r\n\r\n\r\n      updateAreaFilter();\r\n\r\n      render();\r\n\r\n\r\n    } catch (error) {\r\n\r\n      console.error(\r\n        '[BNO STAYS]',\r\n        error\r\n      );\r\n\r\n\r\n      setStatus(\r\n        'Hotelleja ei voitu ladata juuri nyt. Yrit\u00e4 hetken kuluttua uudelleen.',\r\n        true\r\n      );\r\n\r\n\r\n      countEl.textContent =\r\n        'Hotelleja ei voitu ladata';\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n  \/* =======================================================\r\n     FILTERS\r\n     ======================================================= *\/\r\n\r\n  function updateAreaFilter() {\r\n\r\n    const selected =\r\n      areaFilter.value;\r\n\r\n\r\n    const areas =\r\n      Array.from(\r\n        new Set(\r\n          allHotels\r\n            .map(\r\n              hotel =>\r\n                hotel.area\r\n            )\r\n            .filter(\r\n              area =>\r\n                area &&\r\n                area.toLowerCase() !== 'dubai'\r\n            )\r\n        )\r\n      )\r\n        .sort(\r\n          (a,b) =>\r\n            a.localeCompare(\r\n              b,\r\n              'fi'\r\n            )\r\n        );\r\n\r\n\r\n    areaFilter.innerHTML =\r\n      '<option value=\"\">Kaikki alueet<\/option>' +\r\n\r\n      areas\r\n        .map(\r\n          area => (\r\n            '<option value=\"' +\r\n            esc(area) +\r\n            '\">' +\r\n            esc(area) +\r\n            '<\/option>'\r\n          )\r\n        )\r\n        .join('');\r\n\r\n\r\n    if (\r\n      areas.includes(selected)\r\n    ) {\r\n      areaFilter.value =\r\n        selected;\r\n    }\r\n\r\n\r\n    \/*\r\n      Hvis vi ikke f\u00e5r gode omr\u00e5defelter fra kilden,\r\n      skjuler vi omr\u00e5de-filteret fremfor \u00e5 vise\r\n      et filter som ikke gj\u00f8r noe.\r\n    *\/\r\n\r\n    areaField.hidden =\r\n      areas.length < 2;\r\n\r\n  }\r\n\r\n\r\n  function getFilteredHotels() {\r\n\r\n    const query =\r\n      clean(\r\n        searchInput.value\r\n      ).toLowerCase();\r\n\r\n\r\n    const selectedArea =\r\n      clean(\r\n        areaFilter.value\r\n      );\r\n\r\n\r\n    const minimumStars =\r\n      Number(\r\n        starFilter.value || 0\r\n      );\r\n\r\n\r\n    return allHotels.filter(\r\n      hotel => {\r\n\r\n\r\n        if (query) {\r\n\r\n          const haystack =\r\n            [\r\n              hotel.name,\r\n              hotel.description,\r\n              hotel.area,\r\n              hotel.address\r\n            ]\r\n              .join(' ')\r\n              .toLowerCase();\r\n\r\n\r\n          if (\r\n            !haystack.includes(\r\n              query\r\n            )\r\n          ) {\r\n            return false;\r\n          }\r\n\r\n        }\r\n\r\n\r\n        if (\r\n          selectedArea &&\r\n          hotel.area !== selectedArea\r\n        ) {\r\n          return false;\r\n        }\r\n\r\n\r\n        if (\r\n          minimumStars &&\r\n          (\r\n            !hotel.rating ||\r\n            hotel.rating < minimumStars\r\n          )\r\n        ) {\r\n          return false;\r\n        }\r\n\r\n\r\n        return true;\r\n\r\n      }\r\n    );\r\n\r\n  }\r\n\r\n\r\n  \/* =======================================================\r\n     HOTEL CARD\r\n     ======================================================= *\/\r\n\r\n  function hotelCard(\r\n    hotel\r\n  ) {\r\n\r\n    const stars =\r\n      renderStars(\r\n        hotel.rating\r\n      );\r\n\r\n\r\n    const imageHtml =\r\n\r\n      hotel.coverImage\r\n\r\n        ? (\r\n          '<img ' + 'src=\"' + esc(hotel.coverImage) + '\" ' + 'alt=\"' + esc(hotel.name) + '\" ' + 'loading=\"lazy\"' + '>'\r\n        )\r\n\r\n        : (\r\n          '<div class=\"bno-stays-image-placeholder\">' +\r\n            'Kuva tulossa pian' +\r\n          '<\/div>'\r\n        );\r\n\r\n\r\n    const reviewHtml =\r\n\r\n      hotel.reviewScore !== null\r\n\r\n        ? (\r\n          '<div class=\"bno-stays-rating\">' +\r\n\r\n            '<span class=\"bno-stays-score\">' +\r\n              esc(\r\n                hotel.reviewScore.toFixed(1)\r\n              ) +\r\n            '<\/span>' +\r\n\r\n            (\r\n              hotel.reviewCount !== null\r\n\r\n                ? (\r\n                  '<span class=\"bno-stays-review-count\">' +\r\n                    esc(\r\n                      hotel.reviewCount\r\n                    ) +\r\n                    ' arvostelua' +\r\n                  '<\/span>'\r\n                )\r\n\r\n                : ''\r\n            ) +\r\n\r\n          '<\/div>'\r\n        )\r\n\r\n        : '';\r\n\r\n\r\n    return (\r\n\r\n      '<article ' + 'class=\"bno-stays-hotel\" ' + 'data-hotel-id=\"' + esc(hotel.id) + '\">' +\r\n\r\n\r\n        '<div class=\"bno-stays-hotel__image\">' +\r\n\r\n          '<span class=\"bno-stays-badge\">' +\r\n            'Tulossa pian' +\r\n          '<\/span>' +\r\n\r\n          imageHtml +\r\n\r\n        '<\/div>' +\r\n\r\n\r\n        '<div class=\"bno-stays-hotel__body\">' +\r\n\r\n\r\n          '<div class=\"bno-stays-stars\">' +\r\n            esc(stars) +\r\n          '<\/div>' +\r\n\r\n\r\n          '<h3>' +\r\n            esc(hotel.name) +\r\n          '<\/h3>' +\r\n\r\n\r\n          (\r\n            hotel.area ||\r\n            hotel.address\r\n\r\n              ? (\r\n                '<div class=\"bno-stays-location\">' +\r\n                  esc(\r\n                    hotel.area ||\r\n                    hotel.address\r\n                  ) +\r\n                '<\/div>'\r\n              )\r\n\r\n              : ''\r\n          ) +\r\n\r\n\r\n          reviewHtml +\r\n\r\n\r\n          (\r\n            hotel.description\r\n\r\n              ? (\r\n                '<p class=\"bno-stays-description\">' +\r\n                  esc(hotel.description) +\r\n                '<\/p>'\r\n              )\r\n\r\n              : ''\r\n          ) +\r\n\r\n\r\n          '<div class=\"bno-stays-hotel__actions\">' +\r\n\r\n            '<span class=\"bno-stays-small-status\">' +\r\n              'Hotellitiedot' +\r\n            '<\/span>' +\r\n\r\n            '<button ' + 'type=\"button\" ' + 'class=\"bno-stays-open\" ' + 'data-open-hotel=\"' + esc(hotel.id) + '\">' +\r\n              'Katso hotelli' +\r\n            '<\/button>' +\r\n\r\n          '<\/div>' +\r\n\r\n\r\n        '<\/div>' +\r\n\r\n\r\n      '<\/article>'\r\n\r\n    );\r\n\r\n  }\r\n\r\n\r\n  \/* =======================================================\r\n     RENDER\r\n     ======================================================= *\/\r\n\r\n  function render() {\r\n\r\n    const filtered =\r\n      getFilteredHotels();\r\n\r\n\r\n    const visible =\r\n      filtered.slice(\r\n        0,\r\n        visibleCount\r\n      );\r\n\r\n\r\n    countEl.textContent =\r\n\r\n      filtered.length === 1\r\n\r\n        ? '1 hotelli'\r\n\r\n        : (\r\n          filtered.length +\r\n          ' hotellia'\r\n        );\r\n\r\n\r\n    listEl.innerHTML =\r\n\r\n      visible.length\r\n\r\n        ? visible\r\n            .map(hotelCard)\r\n            .join('')\r\n\r\n        : (\r\n          '<div class=\"bno-stays-status\">' +\r\n            'Hakua vastaavia hotelleja ei l\u00f6ytynyt.' +\r\n          '<\/div>'\r\n        );\r\n\r\n\r\n    moreWrap.hidden =\r\n      visible.length >=\r\n      filtered.length;\r\n\r\n\r\n    updateMapMarkers(\r\n      visible\r\n    );\r\n\r\n  }\r\n\r\n\r\n  \/* =======================================================\r\n     LEAFLET\r\n     ======================================================= *\/\r\n\r\n  function ensureLeaflet() {\r\n\r\n    if (\r\n      window.L &&\r\n      window.L.map\r\n    ) {\r\n      return Promise.resolve();\r\n    }\r\n\r\n\r\n    if (leafletPromise) {\r\n      return leafletPromise;\r\n    }\r\n\r\n\r\n    leafletPromise =\r\n      new Promise(\r\n        function(\r\n          resolve,\r\n          reject\r\n        ) {\r\n\r\n\r\n          if (\r\n            !document.querySelector(\r\n              'link[data-bno-leaflet]'\r\n            )\r\n          ) {\r\n\r\n            const link =\r\n              document.createElement(\r\n                'link'\r\n              );\r\n\r\n            link.rel =\r\n              'stylesheet';\r\n\r\n            link.href =\r\n              'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css';\r\n\r\n            link.dataset.bnoLeaflet =\r\n              '1';\r\n\r\n            document.head.appendChild(\r\n              link\r\n            );\r\n\r\n          }\r\n\r\n\r\n          if (\r\n            window.L &&\r\n            window.L.map\r\n          ) {\r\n\r\n            resolve();\r\n\r\n            return;\r\n\r\n          }\r\n\r\n\r\n          let script =\r\n            document.querySelector(\r\n              'script[data-bno-leaflet]'\r\n            );\r\n\r\n\r\n          if (script) {\r\n\r\n            script.addEventListaner(\r\n              'load',\r\n              resolve,\r\n              { once: true }\r\n            );\r\n\r\n            script.addEventListaner(\r\n              'error',\r\n              reject,\r\n              { once: true }\r\n            );\r\n\r\n            return;\r\n\r\n          }\r\n\r\n\r\n          script =\r\n            document.createElement(\r\n              'script'\r\n            );\r\n\r\n          script.src =\r\n            'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js';\r\n\r\n          script.dataset.bnoLeaflet =\r\n            '1';\r\n\r\n          script.onload =\r\n            resolve;\r\n\r\n          script.onerror =\r\n            reject;\r\n\r\n          document.head.appendChild(\r\n            script\r\n          );\r\n\r\n        }\r\n      );\r\n\r\n\r\n    return leafletPromise;\r\n\r\n  }\r\n\r\n\r\n  async function ensureMap() {\r\n\r\n    if (map) {\r\n      return map;\r\n    }\r\n\r\n\r\n    try {\r\n\r\n      await ensureLeaflet();\r\n\r\n\r\n      map =\r\n        window.L.map(\r\n          'bno-dubai-map',\r\n          {\r\n            scrollWheelZoom:\r\n              false\r\n          }\r\n        );\r\n\r\n\r\n      map.setView(\r\n        [\r\n          25.2048,\r\n          55.2708\r\n        ],\r\n        10\r\n      );\r\n\r\n\r\n      window.L\r\n        .tileLayer(\r\n          'https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png',\r\n          {\r\n            maxZoom: 19,\r\n\r\n            attribution:\r\n              '&copy; OpenStreetMap contributors'\r\n          }\r\n        )\r\n        .addTo(map);\r\n\r\n\r\n      \/*\r\n        N\u00e5r priser senere finnes p\u00e5 hotellobjektene,\r\n        oppdaterer vi mark\u00f8rene automatisk ved zoom.\r\n      *\/\r\n\r\n      map.on(\r\n        'zoomend',\r\n        refreshMarkerIcons\r\n      );\r\n\r\n\r\n      return map;\r\n\r\n\r\n    } catch (error) {\r\n\r\n      console.error(\r\n        '[BNO MAP]',\r\n        error\r\n      );\r\n\r\n\r\n      mapNote.textContent =\r\n        'Karttaa ei voitu ladata.';\r\n\r\n\r\n      return null;\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n  function markerHtml(\r\n    hotel,\r\n    index\r\n  ) {\r\n\r\n    const zoom =\r\n      map\r\n        ? map.getZoom()\r\n        : 10;\r\n\r\n\r\n    if (\r\n      zoom >= 12 &&\r\n      hotel.priceText\r\n    ) {\r\n\r\n      return (\r\n        '<div class=\"bno-stays-price-marker\">' +\r\n          esc(\r\n            hotel.priceText\r\n          ) +\r\n        '<\/div>'\r\n      );\r\n\r\n    }\r\n\r\n\r\n    return (\r\n      '<div class=\"bno-stays-map-marker\">' +\r\n        (index + 1) +\r\n      '<\/div>'\r\n    );\r\n\r\n  }\r\n\r\n\r\n  function markerIcon(\r\n    hotel,\r\n    index\r\n  ) {\r\n\r\n    const usePrice =\r\n      map &&\r\n      map.getZoom() >= 12 &&\r\n      hotel.priceText;\r\n\r\n\r\n    return window.L.divIcon(\r\n      {\r\n\r\n        className: '',\r\n\r\n        html:\r\n          markerHtml(\r\n            hotel,\r\n            index\r\n          ),\r\n\r\n        iconSize:\r\n          usePrice\r\n            ? [82,34]\r\n            : [34,34],\r\n\r\n        iconAnchor:\r\n          usePrice\r\n            ? [41,17]\r\n            : [17,17],\r\n\r\n        popupAnchor:\r\n          [0,-19]\r\n\r\n      }\r\n    );\r\n\r\n  }\r\n\r\n\r\n  function refreshMarkerIcons() {\r\n\r\n    markerRecords.forEach(\r\n      function(record) {\r\n\r\n        record.marker.setIcon(\r\n          markerIcon(\r\n            record.hotel,\r\n            record.index\r\n          )\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n  }\r\n\r\n\r\n  function clearMarkers() {\r\n\r\n    if (!map) {\r\n      return;\r\n    }\r\n\r\n\r\n    markerRecords.forEach(\r\n      function(record) {\r\n\r\n        map.removeLayer(\r\n          record.marker\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n\r\n    markerRecords = [];\r\n\r\n  }\r\n\r\n\r\n  async function updateMapMarkers(\r\n    hotels\r\n  ) {\r\n\r\n    const hotelMap =\r\n      await ensureMap();\r\n\r\n\r\n    if (!hotelMap) {\r\n      return;\r\n    }\r\n\r\n\r\n    clearMarkers();\r\n\r\n\r\n    const withCoordinates =\r\n      hotels.filter(\r\n        hotel =>\r\n          hotel.latitude !== null &&\r\n          hotel.longitude !== null\r\n      );\r\n\r\n\r\n    if (\r\n      withCoordinates.length === 0\r\n    ) {\r\n\r\n      mapNote.style.display =\r\n        'block';\r\n\r\n      mapNote.textContent =\r\n        allHotels.length\r\n          ? 'N\u00e4ytett\u00e4vien hotellien sijainti ei ole saatavilla kartalla.'\r\n          : 'Hotellien sijainnit n\u00e4kyv\u00e4t t\u00e4ss\u00e4, kun hotellit on ladattu.';\r\n\r\n\r\n      hotelMap.setView(\r\n        [\r\n          25.2048,\r\n          55.2708\r\n        ],\r\n        10\r\n      );\r\n\r\n\r\n      return;\r\n\r\n    }\r\n\r\n\r\n    mapNote.style.display =\r\n      'none';\r\n\r\n\r\n    const bounds = [];\r\n\r\n\r\n    withCoordinates.forEach(\r\n      function(\r\n        hotel,\r\n        index\r\n      ) {\r\n\r\n\r\n        const marker =\r\n          window.L.marker(\r\n            [\r\n              hotel.latitude,\r\n              hotel.longitude\r\n            ],\r\n            {\r\n              icon:\r\n                markerIcon(\r\n                  hotel,\r\n                  index\r\n                )\r\n            }\r\n          );\r\n\r\n\r\n        marker.addTo(\r\n          hotelMap\r\n        );\r\n\r\n\r\n        marker.bindPopup(\r\n\r\n          '<div class=\"bno-stays-map-popup\">' +\r\n\r\n            '<strong>' +\r\n              esc(\r\n                hotel.name\r\n              ) +\r\n            '<\/strong>' +\r\n\r\n            '<span>' +\r\n              esc(\r\n                hotel.area ||\r\n                hotel.address ||\r\n                'Dubai'\r\n              ) +\r\n            '<\/span>' +\r\n\r\n            (\r\n              hotel.priceText\r\n\r\n                ? (\r\n                  '<span style=\"margin-top:6px;font-weight:800;color:#0C1A38;\">' +\r\n                    esc(\r\n                      hotel.priceText\r\n                    ) +\r\n                  '<\/span>'\r\n                )\r\n\r\n                : ''\r\n            ) +\r\n\r\n          '<\/div>'\r\n\r\n        );\r\n\r\n\r\n        marker.on(\r\n          'click',\r\n          function () {\r\n\r\n\r\n            section\r\n              .querySelectorAll(\r\n                '.bno-stays-hotel'\r\n              )\r\n              .forEach(\r\n                function(card) {\r\n\r\n                  card.classList.remove(\r\n                    'is-map-active'\r\n                  );\r\n\r\n                }\r\n              );\r\n\r\n\r\n            section\r\n              .querySelectorAll(\r\n                '.bno-stays-hotel'\r\n              )\r\n              .forEach(\r\n                function(card) {\r\n\r\n                  if (\r\n                    card.dataset.hotelId ===\r\n                    hotel.id\r\n                  ) {\r\n\r\n                    card.classList.add(\r\n                      'is-map-active'\r\n                    );\r\n\r\n                  }\r\n\r\n                }\r\n              );\r\n\r\n          }\r\n        );\r\n\r\n\r\n        markerRecords.push(\r\n          {\r\n            marker,\r\n            hotel,\r\n            index\r\n          }\r\n        );\r\n\r\n\r\n        bounds.push(\r\n          [\r\n            hotel.latitude,\r\n            hotel.longitude\r\n          ]\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n\r\n    if (\r\n      bounds.length === 1\r\n    ) {\r\n\r\n      hotelMap.setView(\r\n        bounds[0],\r\n        14\r\n      );\r\n\r\n    } else {\r\n\r\n      hotelMap.fitBounds(\r\n        bounds,\r\n        {\r\n          padding:\r\n            [35,35],\r\n\r\n          maxZoom:\r\n            14\r\n        }\r\n      );\r\n\r\n    }\r\n\r\n  }\r\n\r\n\r\n  \/* =======================================================\r\n     MODAL\r\n     ======================================================= *\/\r\n\r\n  function renderGallery(\r\n    hotel\r\n  ) {\r\n\r\n    const images =\r\n      hotel.photos\r\n        .slice(\r\n          0,\r\n          5\r\n        );\r\n\r\n\r\n    if (\r\n      !images.length\r\n    ) {\r\n      return '';\r\n    }\r\n\r\n\r\n    return (\r\n\r\n      '<div class=\"bno-stays-gallery\">' +\r\n\r\n        images\r\n          .map(\r\n            function(image) {\r\n\r\n              return (\r\n\r\n                '<figure>' +\r\n\r\n                  '<img ' + 'src=\"' + esc(image) + '\" ' + 'alt=\"' + esc(hotel.name) + '\">' +\r\n\r\n                '<\/figure>'\r\n\r\n              );\r\n\r\n            }\r\n          )\r\n          .join('') +\r\n\r\n      '<\/div>'\r\n\r\n    );\r\n\r\n  }\r\n\r\n\r\n  function openHotel(\r\n    hotel\r\n  ) {\r\n\r\n    const stars =\r\n      renderStars(\r\n        hotel.rating\r\n      );\r\n\r\n\r\n    const scoreHtml =\r\n\r\n      hotel.reviewScore !== null\r\n\r\n        ? (\r\n          '<span class=\"bno-stays-score\">' +\r\n            esc(\r\n              hotel.reviewScore.toFixed(1)\r\n            ) +\r\n          '<\/span>'\r\n        )\r\n\r\n        : '';\r\n\r\n\r\n    const reviewCountHtml =\r\n\r\n      hotel.reviewCount !== null\r\n\r\n        ? (\r\n          '<span>' +\r\n            esc(\r\n              hotel.reviewCount\r\n            ) +\r\n            ' arvostelua' +\r\n          '<\/span>'\r\n        )\r\n\r\n        : '';\r\n\r\n\r\n    const sideHtml =\r\n\r\n      hotel.address\r\n\r\n        ? (\r\n          '<aside class=\"bno-stays-modal-side\">' +\r\n\r\n            '<strong>Osoite<\/strong>' +\r\n\r\n            '<div class=\"bno-stays-modal-address\">' +\r\n              esc(\r\n                hotel.address\r\n              ) +\r\n            '<\/div>' +\r\n\r\n          '<\/aside>'\r\n        )\r\n\r\n        : '';\r\n\r\n\r\n    modalContent.innerHTML =\r\n\r\n      '<div class=\"bno-stays-modal-title\">' +\r\n\r\n        '<span class=\"bno-eyebrow\">' +\r\n          esc(\r\n            hotel.area ||\r\n            'Dubai'\r\n          ) +\r\n        '<\/span>' +\r\n\r\n        '<h2>' +\r\n          esc(\r\n            hotel.name\r\n          ) +\r\n        '<\/h2>' +\r\n\r\n        '<div class=\"bno-stays-modal-meta\">' +\r\n\r\n          (\r\n            stars\r\n\r\n              ? (\r\n                '<span class=\"bno-stays-modal-stars\">' +\r\n                  esc(stars) +\r\n                '<\/span>'\r\n              )\r\n\r\n              : ''\r\n          ) +\r\n\r\n          scoreHtml +\r\n\r\n          reviewCountHtml +\r\n\r\n        '<\/div>' +\r\n\r\n      '<\/div>' +\r\n\r\n\r\n      renderGallery(\r\n        hotel\r\n      ) +\r\n\r\n\r\n      '<div class=\"bno-stays-modal-grid\">' +\r\n\r\n        '<div class=\"bno-stays-modal-copy\">' +\r\n\r\n          '<h3>Tietoa hotellista<\/h3>' +\r\n\r\n          '<p>' +\r\n            esc(\r\n              hotel.description ||\r\n              'Lis\u00e4tietoja hotellista tulossa pian.'\r\n            ) +\r\n          '<\/p>' +\r\n\r\n        '<\/div>' +\r\n\r\n        sideHtml +\r\n\r\n      '<\/div>' +\r\n\r\n\r\n      '<div class=\"bno-stays-room-coming\">' +\r\n\r\n        '<span class=\"bno-eyebrow\">' +\r\n          'Huoneet ja majoitus' +\r\n        '<\/span>' +\r\n\r\n        '<h3>Huonetyypit<\/h3>' +\r\n\r\n        '<div class=\"bno-stays-room-coming-box\">' +\r\n          'Huonetyypit, hinnat ja saatavuus avautuvat pian.' +\r\n        '<\/div>' +\r\n\r\n      '<\/div>';\r\n\r\n\r\n    oldOverflow =\r\n      document.documentElement.style.overflow;\r\n\r\n\r\n    document.documentElement.style.overflow =\r\n      'hidden';\r\n\r\n\r\n    modal.hidden =\r\n      false;\r\n\r\n  }\r\n\r\n\r\n  function closeModal() {\r\n\r\n    modal.hidden =\r\n      true;\r\n\r\n\r\n    document.documentElement.style.overflow =\r\n      oldOverflow;\r\n\r\n  }\r\n\r\n\r\n  \/* =======================================================\r\n     EVENTS\r\n     ======================================================= *\/\r\n\r\n  listEl.addEventListaner(\r\n    'click',\r\n    function(event) {\r\n\r\n      const button =\r\n        event.target.closest(\r\n          '[data-open-hotel]'\r\n        );\r\n\r\n\r\n      if (!button) {\r\n        return;\r\n      }\r\n\r\n\r\n      const hotel =\r\n        allHotels.find(\r\n          hotel =>\r\n            hotel.id ===\r\n            button.dataset.openHotel\r\n        );\r\n\r\n\r\n      if (hotel) {\r\n\r\n        openHotel(\r\n          hotel\r\n        );\r\n\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n  section\r\n    .querySelectorAll(\r\n      '[data-modal-close]'\r\n    )\r\n    .forEach(\r\n      function(element) {\r\n\r\n        element.addEventListaner(\r\n          'click',\r\n          closeModal\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n\r\n  document.addEventListaner(\r\n    'keydown',\r\n    function(event) {\r\n\r\n      if (\r\n        event.key === 'Escape' &&\r\n        !modal.hidden\r\n      ) {\r\n\r\n        closeModal();\r\n\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n  searchInput.addEventListaner(\r\n    'input',\r\n    function() {\r\n\r\n      visibleCount =\r\n        initialCount;\r\n\r\n      render();\r\n\r\n    }\r\n  );\r\n\r\n\r\n  areaFilter.addEventListaner(\r\n    'change',\r\n    function() {\r\n\r\n      visibleCount =\r\n        initialCount;\r\n\r\n      render();\r\n\r\n    }\r\n  );\r\n\r\n\r\n  starFilter.addEventListaner(\r\n    'change',\r\n    function() {\r\n\r\n      visibleCount =\r\n        initialCount;\r\n\r\n      render();\r\n\r\n    }\r\n  );\r\n\r\n\r\n  moreButton.addEventListaner(\r\n    'click',\r\n    function() {\r\n\r\n      visibleCount +=\r\n        initialCount;\r\n\r\n      render();\r\n\r\n    }\r\n  );\r\n\r\n\r\n  showListButton.addEventListaner(\r\n    'click',\r\n    function() {\r\n\r\n      listColumn.classList.remove(\r\n        'is-mobile-hidden'\r\n      );\r\n\r\n      mapColumn.classList.remove(\r\n        'is-mobile-active'\r\n      );\r\n\r\n      showListButton.classList.add(\r\n        'is-active'\r\n      );\r\n\r\n      showMapButton.classList.remove(\r\n        'is-active'\r\n      );\r\n\r\n    }\r\n  );\r\n\r\n\r\n  showMapButton.addEventListaner(\r\n    'click',\r\n    async function() {\r\n\r\n      listColumn.classList.add(\r\n        'is-mobile-hidden'\r\n      );\r\n\r\n      mapColumn.classList.add(\r\n        'is-mobile-active'\r\n      );\r\n\r\n      showMapButton.classList.add(\r\n        'is-active'\r\n      );\r\n\r\n      showListButton.classList.remove(\r\n        'is-active'\r\n      );\r\n\r\n\r\n      const hotelMap =\r\n        await ensureMap();\r\n\r\n\r\n      setTimeout(\r\n        function() {\r\n\r\n          if (hotelMap) {\r\n\r\n            hotelMap.invalidateSize();\r\n\r\n          }\r\n\r\n        },\r\n        120\r\n      );\r\n\r\n    }\r\n  );\r\n\r\n\r\n  \/* =======================================================\r\n     START\r\n     ======================================================= *\/\r\n\r\n  ensureMap();\r\n\r\n  loadInventory();\r\n\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-58ba70a elementor-widget elementor-widget-html\" data-id=\"58ba70a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"omrader\" class=\"bno-section bno-section--light\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-section-heading\">\r\n\r\n      <span class=\"bno-eyebrow\">\r\n        Miss\u00e4 kannattaa majoittua?\r\n      <\/span>\r\n\r\n      <h2>\r\n        Tutustu Dubain suosituimpiin alueisiin\r\n      <\/h2>\r\n\r\n      <p>\r\n        Dubai tarjoaa hyvin erilaisia kaupunginosia ja lomakohteita.\r\n        Valitse alue sen mukaan, etsitk\u00f6 ensisijaisesti kaupunkiel\u00e4m\u00e4\u00e4,\r\n        ostoksia, rantaa, ravintoloita vai rauhallisempaa tukikohtaa.\r\n      <\/p>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"bno-dubai-info-grid\">\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Downtown Dubai<\/h3>\r\n        <p>\r\n          Keskeinen valinta, kun haluat l\u00e4helle Burj Khalifaa, Dubai Mallia,\r\n          ravintoloita ja modernia kaupunkiel\u00e4m\u00e4\u00e4.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Business Bay<\/h3>\r\n        <p>\r\n          Moderni alue aivan Downtownin tuntumassa, jossa on hotelleja,\r\n          ravintoloita, pilvenpiirt\u00e4ji\u00e4 ja hyv\u00e4t yhteydet muualle kaupunkiin.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Dubai Marina & JBR<\/h3>\r\n        <p>\r\n          Hyv\u00e4 vaihtoehto matkailijoille, jotka haluavat rantakadun,\r\n          rannan, ravintoloita ja vilkkaan alueen my\u00f6s iltaisin.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Jumeirah<\/h3>\r\n        <p>\r\n          Jumeirahin rannikkoalueilla yhdistyv\u00e4t ranta, hotellit,\r\n          ravintolat ja helppo p\u00e4\u00e4sy moniin Dubain tunnetuimpiin\r\n          el\u00e4myksiin.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Dubai Creek & Deira<\/h3>\r\n        <p>\r\n          T\u00e4\u00e4ll\u00e4 moderni Dubai kohtaa kaupungin vanhempia kauppa-alueita,\r\n          markkinoita ja Dubai Creekin ymp\u00e4rist\u00f6n.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Palm Jumeirah<\/h3>\r\n        <p>\r\n          Palm Jumeirah tunnetaan erityisesti lomakeskuksista,\r\n          rantahotelleista ja lomista, joissa hotelli on\r\n          t\u00e4rke\u00e4 osa itse matkaa.\r\n        <\/p>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3242af7 elementor-widget elementor-widget-html\" data-id=\"3242af7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section class=\"bno-section bno-section--soft\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-dubai-editorial\">\r\n\r\n      <div class=\"bno-dubai-editorial__content\">\r\n\r\n        <span class=\"bno-eyebrow\">\r\n          Koe Dubai\r\n        <\/span>\r\n\r\n        <div class=\"bno-section-heading\">\r\n          <h2>\r\n            Enemm\u00e4n kuin pelkk\u00e4 hotelliy\u00f6pyminen\r\n          <\/h2>\r\n        <\/div>\r\n\r\n        <p>\r\n          Dubaissa voi yhdist\u00e4\u00e4 hyvin erilaisia lomakokemuksia samaan\r\n          matkaan. Aloita p\u00e4iv\u00e4 rannalla, viet\u00e4 iltap\u00e4iv\u00e4 ostoksilla\r\n          tai n\u00e4ht\u00e4vyyksi\u00e4 katsellen ja p\u00e4\u00e4t\u00e4 ilta ravintolassa,\r\n          josta avautuu n\u00e4kym\u00e4 kaupungin yli.\r\n        <\/p>\r\n\r\n        <p>\r\n          Perheille on tarjolla rantoja, puistoja ja aktiviteetteja,\r\n          kun taas pariskunnat ja yst\u00e4v\u00e4porukat voivat yhdist\u00e4\u00e4 hotellimajoituksen\r\n          ravintoloihin, ostoksiin, rantaklubeihin, veneretkiin ja el\u00e4myksiin\r\n          kaupungissa sek\u00e4 sen ulkopuolella.\r\n        <\/p>\r\n\r\n        <div class=\"bno-actions\">\r\n          <a href=\"#praktisk\" class=\"bno-btn bno-btn--primary\">\r\n            Katso k\u00e4yt\u00e4nn\u00f6n tiedot\r\n          <\/a>\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-editorial__media\">\r\n        <span>\r\n          Dubai\r\n        <\/span>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c2c24b1 elementor-widget elementor-widget-html\" data-id=\"c2c24b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"praktisk\" class=\"bno-section bno-section--light\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-section-heading\">\r\n\r\n      <span class=\"bno-eyebrow\">\r\n        K\u00e4yt\u00e4nn\u00f6n tietoa\r\n      <\/span>\r\n\r\n      <h2>\r\n        Hyv\u00e4 tiet\u00e4\u00e4 ennen Dubain-matkaa\r\n      <\/h2>\r\n\r\n      <p>\r\n        Alueen valinta, liikkuminen ja matkustusajankohta vaikuttavat paljon\r\n        siihen, millaiseksi Dubai-kokemuksesi muodostuu.\r\n      <\/p>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"bno-dubai-info-grid\">\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Lentoasema<\/h3>\r\n        <p>\r\n          Dubai International Airport on kansainv\u00e4listen matkailijoiden t\u00e4rkein\r\n          lentoasema. Et\u00e4isyys hotellille vaihtelee huomattavasti sen\r\n          mukaan, mill\u00e4 alueella majoitut.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Liikkuminen<\/h3>\r\n        <p>\r\n          Metro, taksit ja vuokra-auto helpottavat liikkumista alueiden v\u00e4lill\u00e4.\r\n          Joillakin Dubain alueilla n\u00e4ht\u00e4vyydet ja ravintolat ovat\r\n          k\u00e4velymatkan p\u00e4\u00e4ss\u00e4 hotellista.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Ilmasto<\/h3>\r\n        <p>\r\n          Dubaissa on l\u00e4mmin ilmasto suuren osan vuodesta. Kes\u00e4kuukaudet\r\n          voivat olla eritt\u00e4in kuumia, kun taas muut vuodenajat sopivat\r\n          paremmin ulkoiluun ja rantael\u00e4m\u00e4\u00e4n.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Valuutta<\/h3>\r\n        <p>\r\n          Paikallinen valuutta on Yhdistyneiden arabiemiirikuntien dirhami (AED).\r\n          Korttimaksaminen on yleist\u00e4 hotelleissa, ravintoloissa, ostoskeskuksissa\r\n          ja monissa muissa paikoissa.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Kaupunki vai ranta?<\/h3>\r\n        <p>\r\n          Downtown ja Business Bay sopivat hyvin kaupunkilomaan, kun taas\r\n          Dubai Marina, JBR, Jumeirah ja Palm Jumeirah tarjoavat\r\n          helpomman p\u00e4\u00e4syn rannalle ja meren \u00e4\u00e4relle.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-dubai-info-card\">\r\n        <h3>Valitse alue ensin<\/h3>\r\n        <p>\r\n          Dubai on maantieteellisesti laaja. Siksi kannattaa mietti\u00e4 etuk\u00e4teen,\r\n          mitk\u00e4 el\u00e4mykset ovat sinulle t\u00e4rkeimpi\u00e4, ennen kuin valitset\r\n          matkaasi parhaiten sopivan hotellin ja alueen.\r\n        <\/p>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-20e8cfe elementor-widget elementor-widget-html\" data-id=\"20e8cfe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section class=\"bno-section bno-section--soft\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-dubai-cta-box\">\r\n\r\n      <div>\r\n\r\n        <span class=\"bno-eyebrow\">\r\n          Hotellit Dubaissa\r\n        <\/span>\r\n\r\n        <h2>\r\n          L\u00f6yd\u00e4 matkallesi sopiva alue ja hotelli\r\n        <\/h2>\r\n\r\n        <p>\r\n          Tutustu hotelleihin, vertaile sijainteja ja avaa hotellin tiedot.\r\n          Hinnat ja saatavuus tulevat n\u00e4kyviin, kun Dubai-hotellien\r\n          varaus avautuu BNO Travelissa.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-actions\">\r\n        <a href=\"#hoteller\" class=\"bno-btn bno-btn--primary\">\r\n          Katso hotellit\r\n        <\/a>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\r\n\r\n<\/div>\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>L\u00f6yd\u00e4 hotelleja Dubaissa kuvien, karttojen, asiakasarvioiden ja huonetyyppien avulla. Tutustu Downtowniin, Marinaan, Jumeirahiin, Business Bayhin ja muihin alueisiin BNO Travelissa.<\/p>\n","protected":false},"author":260013438,"featured_media":97073,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"footnotes":"","_yoast_wpseo_title":"","_yoast_wpseo_metadesc":"","_yoast_wpseo_focuskw":"","rank_math_title":"Hotellit Dubaissa | Vertaile hotelleja | BNO Travel","rank_math_description":"Hotellit Dubaissa: Vertaile sijaintia, huonetyyppej\u00e4, palveluja ja hotellitietoja. Tutustu majoituksiin ja suunnittele matkasi BNO Travelin avulla.","rank_math_focus_keyword":"Hotellit Dubaissa","_dpc-meta-title":"","_dpc-meta-description":"","_dpc-keyword":""},"class_list":["post-97885","page","type-page","status-publish","has-post-thumbnail","hentry"],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PgDuwj-psN","jetpack-related-posts":[{"id":97987,"url":"https:\/\/bno-travel.com\/is\/hotel-i-dubai\/","url_meta":{"origin":97885,"position":0},"title":"H\u00f3tel \u00ed D\u00faba\u00ed \u2013 finndu h\u00f3tel og sv\u00e6\u00f0i | BNO Travel","author":"Jan Terje \u00c5s","date":"11.9.2026","format":false,"excerpt":"Finndu h\u00f3tel \u00ed D\u00faba\u00ed me\u00f0 myndum, kortum, ums\u00f6gnum gesta og herbergistegundum. Sko\u00f0a\u00f0u Downtown, Marina, Jumeirah, Business Bay og fleiri sv\u00e6\u00f0i me\u00f0 BNO Travel.","rel":"","context":"Samankaltainen artikkeli","block_context":{"text":"Samankaltainen artikkeli","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":98089,"url":"https:\/\/bno-travel.com\/nl\/hoteller-i-dubai\/","url_meta":{"origin":97885,"position":1},"title":"Hotels in Dubai \u2013 vind hotels en gebieden | BNO Travel","author":"Jan Terje \u00c5s","date":"11.9.2026","format":false,"excerpt":"Vind hotels in Dubai met foto's, kaarten, gastenbeoordelingen en kamertypes. Ontdek Downtown, Marina, Jumeirah, Business Bay en meer gebieden met BNO Travel.","rel":"","context":"Samankaltainen artikkeli","block_context":{"text":"Samankaltainen artikkeli","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":97229,"url":"https:\/\/bno-travel.com\/hoteller-i-dubai\/","url_meta":{"origin":97885,"position":2},"title":"Hoteller i Dubai \u2013 finn hotell og omr\u00e5der | BNO Travel","author":"Jan Terje \u00c5s","date":"11.9.2026","format":false,"excerpt":"Finn hoteller i Dubai med bilder, kart, gjestevurderinger og romtyper. Utforsk Downtown, Marina, Jumeirah, Business Bay og flere omr\u00e5der med BNO Travel.","rel":"","context":"Samankaltainen artikkeli","block_context":{"text":"Samankaltainen artikkeli","link":""},"img":{"alt_text":"Hoteller i Dubai \u2013 Jumeirah Beach og Dubais skyline ved solnedgang","src":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":97726,"url":"https:\/\/bno-travel.com\/en\/hotels-in-dubai\/","url_meta":{"origin":97885,"position":3},"title":"Hotels in Dubai \u2013 find hotels and areas | BNO Travel","author":"Jan Terje \u00c5s","date":"11.9.2026","format":false,"excerpt":"Find hotels in Dubai with photos, maps, guest reviews and room types. Explore Downtown, Marina, Jumeirah, Business Bay and more areas with BNO Travel.","rel":"","context":"Samankaltainen artikkeli","block_context":{"text":"Samankaltainen artikkeli","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":97834,"url":"https:\/\/bno-travel.com\/da\/hoteller-i-dubai\/","url_meta":{"origin":97885,"position":4},"title":"Hoteller i Dubai \u2013 find hoteller og omr\u00e5der | BNO Travel","author":"Jan Terje \u00c5s","date":"11.9.2026","format":false,"excerpt":"Find hoteller i Dubai med billeder, kort, g\u00e6steanmeldelser og v\u00e6relsestyper. Udforsk Downtown, Marina, Jumeirah, Business Bay og flere omr\u00e5der hos BNO Travel.","rel":"","context":"Samankaltainen artikkeli","block_context":{"text":"Samankaltainen artikkeli","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":98295,"url":"https:\/\/bno-travel.com\/sv\/hotell-i-dubai\/","url_meta":{"origin":97885,"position":5},"title":"Hotell i Dubai \u2013 hitta hotell och omr\u00e5den | BNO Travel","author":"Jan Terje \u00c5s","date":"11.9.2026","format":false,"excerpt":"Hitta hotell i Dubai med bilder, kartor, g\u00e4strecensioner och rumstyper. Utforska Downtown, Marina, Jumeirah, Business Bay och fler omr\u00e5den med BNO Travel.","rel":"","context":"Samankaltainen artikkeli","block_context":{"text":"Samankaltainen artikkeli","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/09\/AdobeStock_624418872.jpeg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/pages\/97885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/users\/260013438"}],"replies":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/comments?post=97885"}],"version-history":[{"count":1,"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/pages\/97885\/revisions"}],"predecessor-version":[{"id":97886,"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/pages\/97885\/revisions\/97886"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/media\/97073"}],"wp:attachment":[{"href":"https:\/\/bno-travel.com\/fi\/wp-json\/wp\/v2\/media?parent=97885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}