{"id":4324,"date":"2026-07-09T11:54:21","date_gmt":"2026-07-09T11:54:21","guid":{"rendered":"https:\/\/darkgreen-loris-304448.hostingersite.com\/?page_id=4324"},"modified":"2026-10-08T20:51:48","modified_gmt":"2026-10-08T20:51:48","slug":"book-your-flight","status":"publish","type":"page","link":"https:\/\/hansjet.com\/de\/book-your-flight\/","title":{"rendered":"Buchen Sie Ihren Flug"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"4324\" class=\"elementor elementor-4324\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f044cb3 e-con-full e-flex e-con e-parent\" data-id=\"f044cb3\" 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-fd34c22 e-con-full e-flex e-con e-child\" data-id=\"fd34c22\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7257a68 elementor-widget elementor-widget-html\" data-id=\"7257a68\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* ===== TOKENS ===== *\/\n#hj-charter,#hj-charter *,#hj-charter *::before,#hj-charter *::after{margin:0;padding:0;box-sizing:border-box}\n#hj-charter{\n  --ink:#151515;--paper:#fff;--line:#e3e3e0;--mute:#6f6f6b;--faint:#a6a6a2;--ph:#8a8a86;--wash:#f2f2f0;\n  --accent:#9a9a96;--orange:#e3692c;--r:8px;\n  --f:'Nunito',system-ui,sans-serif;--f-serif:'Francisco Serial',Georgia,serif;\n  \/* full bleed break out so Elementor column padding never squeezes the layout *\/\n  position:relative;left:50%;right:50%;width:100vw;margin-left:-50vw;margin-right:-50vw;\n  display:grid;grid-template-columns:42fr 58fr;min-height:100vh;min-height:100dvh;\n  background:var(--paper);color:var(--ink);font-family:var(--f);font-weight:200;\n  -webkit-font-smoothing:antialiased;text-align:left;\n}\n#hj-charter button,#hj-charter input,#hj-charter textarea{font-family:var(--f);font-weight:200;color:inherit}\n#hj-charter button{background:none;border:0;cursor:pointer;text-align:inherit}\n#hj-charter a{color:inherit;text-decoration:none}\n#hj-charter svg{display:block;fill:none;stroke:currentColor;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}\n#hj-charter :focus-visible{outline:2px solid var(--ink);outline-offset:3px}\n#hj-charter .vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n\n\/* ===== LEFT PANEL (black, sticky) ===== *\/\n#hj-charter .side{\n  background:#000;color:#fff;position:sticky;top:0;align-self:start;\n  height:100vh;height:100dvh;display:flex;flex-direction:column;\n  padding:2rem clamp(24px,5vw,72px) 2.5rem;overflow:hidden;isolation:isolate;\n}\n\/* blurred photo behind the black panel, same look as the site menu *\/\n#hj-charter .side::before{\n  content:\"\";position:absolute;inset:-60px;z-index:-2;\n  background:#050507 url(\"https:\/\/hansjet.com\/wp-content\/uploads\/2026\/09\/private_jet_europe_cheap4-scaled.png\") center\/cover no-repeat;\n  filter:blur(20px);transform:scale(1.08);\n}\n#hj-charter .side::after{content:\"\";position:absolute;inset:0;z-index:-1;background:rgba(5,5,7,.72)}\n#hj-charter .side-logo img{height:49px;width:auto;display:block}\n#hj-charter .side-body{margin-top:clamp(2.2rem,6vh,4.5rem);max-width:34rem;container-type:inline-size}\n#hj-charter .side h1 .nw{white-space:nowrap}\n#hj-charter .side h1{\n  font-family:var(--f-serif)!important;font-weight:400;font-size:clamp(1.25rem,2.3vw,2.3rem);font-size:clamp(1.25rem,7cqi,2.5rem);\n  line-height:1.12;letter-spacing:.06em;text-transform:uppercase;color:#fff;\n}\n#hj-charter .side-sub{margin-top:1rem;font-size:1.05rem;line-height:1.5;color:rgba(255,255,255,.72)}\n#hj-charter .steps{list-style:none;margin-top:clamp(2.2rem,6vh,3.6rem);display:flex;flex-direction:column;gap:2.2rem}\n#hj-charter .step{display:flex;flex-direction:column;gap:.45rem;color:rgba(255,255,255,.34);transition:color .5s var(--ease)}\n#hj-charter .step svg{width:26px;height:26px;margin-bottom:.35rem}\n#hj-charter .step-t{font-size:1.45rem;line-height:1.2;font-weight:200}\n#hj-charter .step-d{font-size:1rem;line-height:1.4;font-weight:500}\n#hj-charter .step.on{color:#fff}\n#hj-charter .contact{display:flex;flex-direction:column;gap:.45rem;margin-top:2.2rem;color:#fff}\n#hj-charter .contact>svg{width:24px;height:24px;margin-bottom:.35rem}\n#hj-charter .contact-l{display:flex;flex-direction:column;gap:.35rem;margin-top:.2rem}\n#hj-charter .contact-l a{color:rgba(255,255,255,.78);text-decoration:none;font-size:1rem;font-weight:500;line-height:1.4;width:max-content;border-bottom:1px solid rgba(255,255,255,.28);transition:color .2s,border-color .2s}\n#hj-charter .contact-l a:hover{color:#fff;border-bottom-color:#fff}\n#hj-charter .memb{display:flex;flex-direction:column;gap:.45rem;margin-top:2.2rem;color:rgba(255,255,255,.72);text-decoration:none;transition:color .3s}\n#hj-charter .memb>svg{width:26px;height:26px;margin-bottom:.35rem;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}\n#hj-charter .memb .step-d{display:inline-flex;align-items:center;gap:.5rem;text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}\n#hj-charter .memb-go{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;transition:transform .3s}\n#hj-charter .memb:hover{color:#fff}\n#hj-charter .memb:hover .memb-go{transform:translateX(3px)}\n#hj-charter .step.done{color:rgba(255,255,255,.62)}\n\n\/* ===== RIGHT PANEL ===== *\/\n#hj-charter .main{padding:0 clamp(20px,5vw,72px);min-width:0}\n#hj-charter .wrap{width:100%;max-width:520px;margin:0 auto;padding:4.6rem 0 3rem}\n#hj-charter .topbar{display:flex;align-items:center;justify-content:space-between;margin-bottom:2.4rem}\n#hj-charter .back{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;margin-left:-6px}\n#hj-charter .back svg{width:20px;height:20px}\n#hj-charter .startover{font-size:.82rem;font-weight:500;border-bottom:1px solid var(--ink);padding-bottom:1px;line-height:1.2}\n\n\/* tabs *\/\n#hj-charter .tabs{display:grid;grid-template-columns:repeat(3,1fr);border-bottom:1px solid var(--line);margin-bottom:.4rem}\n#hj-charter .tab{font-size:1.3rem;line-height:1;padding:.2rem 0 1rem;color:var(--faint);border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .3s,border-color .3s}\n#hj-charter .tab:hover{color:var(--ink)}\n#hj-charter .tab[aria-selected=true]{color:var(--ink);border-bottom-color:var(--accent)}\n\n\/* fields *\/\n#hj-charter .route{position:relative}\n#hj-charter .field{\n  width:100%;display:grid;grid-template-columns:1fr auto;grid-template-rows:auto auto auto;\n  column-gap:1rem;align-items:center;padding:1.1rem 0 1.05rem;border-bottom:1px solid var(--line);\n  text-align:left;transition:background .2s;\n}\n#hj-charter .field .lab{grid-column:1;font-size:.8rem;font-weight:500;color:var(--mute);line-height:1.4}\n#hj-charter .field .val{grid-column:1;font-size:clamp(1.65rem,2.6vw,2.05rem);line-height:1.2;color:var(--ink);font-weight:200}\n#hj-charter .field .lab.acc{color:var(--orange)}\n#hj-charter .field .val.ph{color:var(--ph)}\n#hj-charter .field .val.pick{display:inline-flex;align-items:center;gap:.7rem}\n#hj-charter .field .val.pick svg{width:22px;height:22px;flex:none;color:var(--mute);transform:rotate(90deg)}\n#hj-charter .field .sub{grid-column:1;font-size:.92rem;font-weight:500;color:var(--mute);line-height:1.4}\n#hj-charter .field .code{grid-column:2;grid-row:2;display:inline-flex;align-items:center;gap:.5rem;font-size:1.5rem;color:var(--mute);margin-right:2px}\n#hj-charter .field .code svg{width:13px;height:9px;stroke-width:2;color:var(--ink)}\n#hj-charter .field .ic{grid-column:2;grid-row:2;width:20px;height:20px;color:var(--ink)}\n#hj-charter .field:hover .val:not(.ph){color:#000}\n#hj-charter .swap{\n  position:absolute;right:34px;top:50%;transform:translateY(-50%);z-index:2;width:44px;height:44px;border-radius:50%;\n  background:#fff;color:var(--orange);display:flex;align-items:center;justify-content:center;transition:transform .5s var(--ease),opacity .2s;\n}\n#hj-charter .swap svg{width:24px;height:24px;stroke-width:1.7}\n#hj-charter .swap:hover{opacity:.75}\n#hj-charter .route.open .swap{display:none}\n#hj-charter .swap.spin{transform:translateY(-50%) rotate(180deg)}\n#hj-charter .leg-h{display:flex;align-items:center;justify-content:space-between;margin-top:1.8rem;font-size:.82rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--ink)}\n#hj-charter .leg-h button{font-size:.8rem;font-weight:500;letter-spacing:0;text-transform:none;border-bottom:1px solid var(--mute);color:var(--mute);line-height:1.2}\n#hj-charter .two{display:grid;grid-template-columns:1fr 1fr;column-gap:1.4rem}\n#hj-charter .addleg{margin-top:1.4rem;font-size:1rem;font-weight:500;display:inline-flex;align-items:center;gap:.6rem}\n#hj-charter .addleg svg{width:18px;height:18px}\n\n\/* cta *\/\n#hj-charter .cta{\n  width:100%;margin-top:1.6rem;min-height:68px;padding:0 1.5rem;border-radius:var(--r);background:#000;color:#fff;\n  display:flex;align-items:center;justify-content:space-between;gap:1rem;font-size:1.05rem;font-weight:500;line-height:1.3;transition:background .25s;\n}\n#hj-charter .cta svg{width:22px;height:22px;flex:none;stroke-width:1.8}\n#hj-charter .cta:hover{background:#2b2b2b}\n#hj-charter .cta[disabled]{opacity:.45;cursor:not-allowed}\n#hj-charter .cta-ghost{background:#fff;color:var(--ink);border:1px solid var(--line)}\n#hj-charter .cta-ghost:hover{background:var(--wash)}\n\n\/* steps 2 and 3 *\/\n#hj-charter .h2{font-family:var(--f-serif)!important;font-weight:400;font-size:clamp(1.5rem,2.3vw,1.9rem);letter-spacing:.06em;text-transform:uppercase;line-height:1.15;margin-bottom:.6rem}\n#hj-charter .lead{font-size:1.05rem;line-height:1.55;color:var(--mute);font-weight:500;margin-bottom:1.6rem}\n#hj-charter .pax{display:flex;align-items:center;justify-content:space-between;padding:1.1rem 0;border-bottom:1px solid var(--line)}\n#hj-charter .pax .lab{font-size:.8rem;font-weight:500;color:var(--mute);display:block}\n#hj-charter .pax .num{font-size:2rem;line-height:1.2}\n#hj-charter .stepper{display:flex;gap:.7rem}\n#hj-charter .stepper button{width:44px;height:44px;border:1px solid var(--line);border-radius:50%;display:flex;align-items:center;justify-content:center;transition:border-color .2s,background .2s}\n#hj-charter .stepper button:hover:not([disabled]){border-color:var(--ink)}\n#hj-charter .stepper button[disabled]{opacity:.35;cursor:not-allowed}\n#hj-charter .stepper svg{width:16px;height:16px;stroke-width:1.6}\n#hj-charter .cards{display:flex;flex-direction:column;gap:.9rem;margin-top:1.6rem}\n#hj-charter .card{display:block;width:100%;padding:1.3rem 1.4rem;border:1px solid var(--line);border-radius:var(--r);transition:border-color .25s,background .25s}\n#hj-charter .card:hover{border-color:#bdbdb8}\n#hj-charter .card[aria-checked=true]{border-color:var(--ink);background:var(--wash)}\n#hj-charter .card-t{display:flex;align-items:center;justify-content:space-between;font-size:1.45rem;line-height:1.2}\n#hj-charter .card-t .tag{font-size:.74rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--accent)}\n#hj-charter .card-d{margin-top:.5rem;font-size:.98rem;line-height:1.5;font-weight:500;color:var(--mute)}\n#hj-charter .inp{display:block;padding:1.05rem 0 .95rem;border-bottom:1px solid var(--line)}\n#hj-charter .inp:focus-within{border-bottom-color:var(--ink)}\n#hj-charter .inp .lab{display:block;font-size:.8rem;font-weight:500;color:var(--mute);line-height:1.4}\n#hj-charter .inp input,#hj-charter .inp textarea{width:100%;border:0;outline:0;background:transparent;font-size:1.45rem;line-height:1.35;padding:.15rem 0;resize:none;border-radius:0}\n#hj-charter .inp input::placeholder,#hj-charter .inp textarea::placeholder{color:var(--ph)}\n#hj-charter .inp.err{border-bottom-color:#b3402a}\n#hj-charter .inp.more{margin-top:1.6rem;padding-top:0;border-bottom-color:var(--ink)}\n#hj-charter .inp.more .lab{text-transform:uppercase;letter-spacing:.06em;color:var(--ink);font-size:.78rem}\n#hj-charter .inp.more textarea{font-size:1.05rem;padding:.55rem 0 .3rem;min-height:3.2em}\n#hj-charter .errmsg{font-size:.85rem;font-weight:500;color:#b3402a;margin-top:.5rem;min-height:1em}\n#hj-charter .sum{margin:1.6rem 0 .4rem;padding:1.2rem 1.3rem;background:var(--wash);border-radius:var(--r);font-size:.98rem;line-height:1.6;font-weight:500}\n#hj-charter .sum b{font-weight:500;display:block;font-size:.76rem;letter-spacing:.14em;text-transform:uppercase;color:var(--mute);margin-bottom:.4rem}\n#hj-charter .sum p+p{margin-top:.55rem}\n#hj-charter .trav{margin-top:0}\n#hj-charter .prow{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1.35rem 0;border-bottom:1px solid var(--line)}\n#hj-charter .prow.split{display:grid;grid-template-columns:1fr 1fr;column-gap:2.5rem}\n#hj-charter .prow .half{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-width:0}\n#hj-charter .tt{font-size:1.6rem;line-height:1.2;color:var(--ink);font-weight:200}\n#hj-charter .tt small{display:block;font-size:.78rem;font-weight:500;color:var(--mute);margin-top:.15rem}\n#hj-charter .cnt{display:flex;align-items:center;gap:1rem}\n#hj-charter .cnt button{width:30px;height:30px;display:flex;align-items:center;justify-content:center;color:var(--ink)}\n#hj-charter .cnt button svg{width:18px;height:18px;stroke-width:1.5}\n#hj-charter .cnt button[disabled]{color:var(--line);cursor:not-allowed}\n#hj-charter .cnt .n{font-size:1.6rem;line-height:1;min-width:1.2ch;text-align:center;color:var(--ink)}\n#hj-charter .cnt .n.z{color:var(--ph)}\n#hj-charter .petbtn{width:100%;text-align:left}\n#hj-charter .petbtn .go{display:flex;align-items:center;gap:1rem}\n#hj-charter .petbtn .go svg{width:18px;height:18px;stroke-width:1.6;transition:transform .25s}\n#hj-charter .petbtn[aria-expanded=true] .go svg{transform:rotate(90deg)}\n#hj-charter .petpanel{padding:1.1rem 0 1.2rem;border-bottom:1px solid var(--line)}\n#hj-charter .petpanel .prow{padding:.4rem 0;border-bottom:0}\n#hj-charter .petpanel .tt{font-size:1.15rem}\n#hj-charter .petpanel p{font-size:.88rem;font-weight:500;color:var(--mute);line-height:1.5;margin-top:.6rem}\n#hj-charter .flag{font-size:1.15em;line-height:1;display:inline-block;width:1.35em;text-align:center;flex:none}\n#hj-charter .flag-img{width:20px;height:15px;border-radius:2px;object-fit:cover;box-shadow:0 0 0 1px rgba(0,0,0,.08);flex:none;display:inline-block}\n#hj-charter .field .code .flag,#hj-charter .field .code .flag-img{font-size:1.05rem;margin-right:.1rem}\n#hj-charter .ap-ic .flag{font-size:1.25rem;width:20px}\n#hj-charter .ap-sel{width:18px;height:18px;flex:none;color:var(--ink);display:flex}\n#hj-charter .ap-sel svg{width:18px;height:18px}\n#hj-charter .ph-row{display:flex;align-items:center;gap:.9rem}\n#hj-charter .ccbtn{display:inline-flex;align-items:center;gap:.45rem;flex:none;font-size:1.45rem;line-height:1.35;padding:.15rem .9rem .15rem 0;border-right:1px solid var(--line);color:var(--ink)}\n#hj-charter .ccbtn .flag{font-size:1.3rem}\n#hj-charter .ccbtn svg{width:12px;height:12px;stroke-width:1.8;color:var(--mute);transform:rotate(90deg);transition:transform .25s}\n#hj-charter .ccbtn[aria-expanded=true] svg{transform:rotate(-90deg)}\n#hj-charter .ph-row input{flex:1;min-width:0}\n#hj-charter .ccpanel{border-bottom:1px solid var(--line);padding:.9rem 0 .6rem}\n#hj-charter .ccpanel .sh-search input{font-size:1.05rem}\n#hj-charter .cc-list{max-height:260px;overflow-y:auto;margin-top:.6rem;overscroll-behavior:contain}\n#hj-charter .cc-row{width:100%;display:flex;align-items:center;gap:.8rem;padding:.6rem .5rem;border-radius:8px;font-size:1.05rem;color:var(--ink)}\n#hj-charter .cc-row:hover,#hj-charter .cc-row.sel{background:var(--wash)}\n#hj-charter .cc-n{flex:1;min-width:0}\n#hj-charter .cc-d{color:var(--mute);font-size:.95rem}\n#hj-charter .needmsg{margin-top:.7rem;font-size:.85rem;font-weight:500;color:var(--mute);line-height:1.5}\n#hj-charter .fine{margin-top:1rem;font-size:.85rem;line-height:1.5;color:var(--mute);font-weight:500}\n#hj-charter .done-box{padding-top:1rem}\n\n\/* ===== INLINE PANEL (opens under the field, same page) ===== *\/\n#hj-charter .panel{border-bottom:1px solid var(--line);padding:.3rem 0 1.2rem}\n#hj-charter .sh-head{display:flex;align-items:center;gap:1rem;border-bottom:1px solid var(--line);padding-bottom:.9rem;flex:none}\n#hj-charter .sh-search{flex:1;display:flex;align-items:center;gap:.8rem;min-width:0}\n#hj-charter .sh-search input{flex:1;min-width:0;border:0;outline:0;background:transparent;font-size:1.25rem;line-height:1.3;padding:.2rem 0;border-radius:0}\n#hj-charter .sh-search input::placeholder{color:var(--ph)}\n#hj-charter .sh-search svg{width:20px;height:20px;color:var(--mute);flex:none}\n#hj-charter .sh-title{flex:1;font-size:1.25rem;line-height:1.3}\n#hj-charter .sh-x{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;flex:none;margin-right:-6px}\n#hj-charter .sh-x svg{width:18px;height:18px;stroke-width:1.8}\n#hj-charter .sh-body{max-height:min(460px,60vh);overflow-y:auto;overscroll-behavior:contain;padding:1rem 0 .4rem;-webkit-overflow-scrolling:touch}\n#hj-charter .panel .sh-body.free{max-height:none;overflow:visible}\n#hj-charter .sh-cap{font-size:.95rem;font-weight:500;color:var(--mute);margin-bottom:.7rem}\n#hj-charter .ap-row{width:100%;display:flex;align-items:center;gap:1rem;padding:.8rem .7rem;margin:0 -.7rem;width:calc(100% + 1.4rem);border-radius:8px;transition:background .15s}\n#hj-charter .ap-row:hover,#hj-charter .ap-row.act{background:var(--wash)}\n#hj-charter .ap-row.sel{background:var(--wash)}\n#hj-charter .ap-ic{width:20px;height:20px;flex:none;color:var(--mute);display:flex}\n#hj-charter .ap-row.sel .ap-ic{color:var(--ink)}\n#hj-charter .ap-ic svg{width:20px;height:20px}\n#hj-charter .ap-main{flex:1;min-width:0;display:flex;flex-direction:column}\n#hj-charter .ap-city{font-size:1.3rem;line-height:1.3;color:var(--ink)}\n#hj-charter .ap-city b{font-weight:500}\n#hj-charter .ap-name{font-size:.88rem;font-weight:500;color:var(--mute);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n#hj-charter .ap-code{font-size:1rem;color:var(--mute);flex:none;padding-right:.2rem}\n#hj-charter .none{font-size:1.05rem;line-height:1.5;color:var(--mute);font-weight:500;padding:.6rem 0}\n\/* calendar *\/\n#hj-charter .dow{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-size:.78rem;font-weight:500;color:var(--mute);padding:.7rem 0 .6rem;border-bottom:1px solid var(--line);flex:none}\n#hj-charter .mon{margin-bottom:1.8rem}\n#hj-charter .mon-t{font-size:1.15rem;margin-bottom:.7rem}\n#hj-charter .grid{display:grid;grid-template-columns:repeat(7,1fr);row-gap:4px}\n#hj-charter .day{height:46px;display:flex;align-items:center;justify-content:center;font-size:1.05rem;border-radius:50%;margin:0 auto;width:46px;transition:background .15s}\n#hj-charter .day:hover:not([disabled]):not(.sel){background:var(--wash)}\n#hj-charter .day[disabled]{color:#cfcfcb;cursor:not-allowed}\n#hj-charter .day.today{box-shadow:inset 0 0 0 1px var(--line)}\n#hj-charter .day.rng{background:var(--wash);border-radius:0;width:100%}\n#hj-charter .day.sel{background:#000;color:#fff;font-weight:500}\n\/* time *\/\n#hj-charter .tl{display:flex;flex-direction:column}\n#hj-charter .trow{display:flex;justify-content:space-between;align-items:center;padding:1rem .7rem;margin:0 -.7rem;border-radius:8px;font-size:1.25rem;transition:background .15s}\n#hj-charter .trow small{font-size:.9rem;font-weight:500;color:var(--mute)}\n#hj-charter .trow:hover,#hj-charter .trow.sel{background:var(--wash)}\n#hj-charter .trow.sel svg{color:var(--ink);width:18px;height:18px}\n#hj-charter .hrs{display:grid;grid-template-columns:repeat(4,1fr);gap:.6rem;margin-top:.6rem}\n#hj-charter .hr{border:1px solid var(--line);border-radius:var(--r);padding:.8rem 0;text-align:center!important;font-size:1.05rem;transition:border-color .2s,background .2s}\n#hj-charter .hr:hover{border-color:var(--ink)}\n#hj-charter .hr.sel{background:#000;color:#fff;border-color:#000;font-weight:500}\n\n\/* ===== MOBILE ===== *\/\n@media(max-width:900px){\n  #hj-charter{grid-template-columns:1fr}\n  #hj-charter .side{position:relative;height:auto;padding:1.4rem 20px 1.6rem}\n  #hj-charter .side-logo img{height:28px}\n  #hj-charter .side-body{margin-top:1.6rem;max-width:none}\n  #hj-charter .side h1{font-size:clamp(1.25rem,7cqi,1.9rem)}\n  #hj-charter .side-sub{font-size:.98rem;margin-top:.6rem}\n  #hj-charter .steps{flex-direction:row;gap:0;margin-top:1.5rem}\n  #hj-charter .step{flex:1;gap:.3rem;border-top:2px solid currentColor;padding-top:.7rem;margin-right:.7rem}\n  #hj-charter .step:last-child{margin-right:0}\n  #hj-charter .step svg,#hj-charter .step-d{display:none}\n  #hj-charter .memb{flex-direction:row;flex-wrap:wrap;align-items:center;gap:.4rem;margin-top:1.2rem;padding-top:0;border-top:0}\n  #hj-charter .memb>svg{display:none}\n  #hj-charter .contact{margin-top:1.3rem;gap:.3rem}\n  #hj-charter .contact>svg{display:none}\n  #hj-charter .contact .step-t{font-size:.95rem;font-weight:500}\n  #hj-charter .contact-l{flex-direction:row;flex-wrap:wrap;gap:.35rem 1rem}\n  #hj-charter .contact-l a{font-size:.92rem}\n  #hj-charter .memb .step-t{font-size:.95rem;font-weight:500}\n  #hj-charter .memb .step-d{display:inline-flex;font-size:.95rem}\n  #hj-charter .step-t{font-size:.95rem}\n  #hj-charter .wrap{padding:1.6rem 0 3rem}\n  #hj-charter .topbar{margin-bottom:1.6rem}\n  #hj-charter .swap{right:28px}\n  #hj-charter .tab{font-size:1.1rem}\n  #hj-charter .prow.split{grid-template-columns:1fr;row-gap:1.35rem}\n  #hj-charter .tt,#hj-charter .cnt .n{font-size:1.4rem}\n}\n@media(prefers-reduced-motion:reduce){\n  #hj-charter .swap{transition:none}\n}\n<\/style>\n\n<div id=\"hj-charter\">\n  <!-- ===== LEFT PANEL ===== -->\n  <aside class=\"side\">\n    <a class=\"side-logo\" href=\"https:\/\/hansjet.com\/\" aria-label=\"Hans Jet home\"><img decoding=\"async\" src=\"https:\/\/hansjet.com\/wp-content\/uploads\/2026\/05\/Hans-Jet-Logos1.png\" alt=\"Hans Jet\"><\/a>\n    <div class=\"side-body\">\n      <h1><span class=\"nw\">Book your on demand<\/span><br><span class=\"nw\">charter flight<\/span><\/h1>\n      <p class=\"side-sub\">From route to request in a few simple taps.<\/p>\n      <ol class=\"steps\" aria-label=\"Progress\">\n        <li class=\"step on\" data-s=\"1\">\n          <!-- Pilatus PC-12 icon (top view: propeller, straight wing, tailplane) -->\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8.5 2.4h7\"\/><path d=\"M12 3.4c1 0 1.5.9 1.5 2v9l-.45 4.8h-2.1L10.5 14.4v-9c0-1.1.5-2 1.5-2z\"\/><path d=\"M13.5 8.9l8 1.5v2.1l-8-1.2M10.5 8.9l-8 1.5v2.1l8-1.2\"\/><path d=\"M13.1 19.2l3.5 1v1.3l-3.7-.5M10.9 19.2l-3.5 1v1.3l3.7-.5\"\/><\/svg>\n          <span class=\"step-t\">Plan your trip<\/span>\n          <span class=\"step-d\">Pick your airports, dates and times.<\/span>\n        <\/li>\n      <\/ol>\n      <a class=\"memb\" href=\"https:\/\/hansjet.com\/private-jet-membership\/\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"5.5\" width=\"19\" height=\"13\" rx=\"2\"\/><path d=\"M2.5 9.5h19M6 14.5h5\"\/><\/svg>\n        <span class=\"step-t\">Curious about our membership?<\/span>\n        <span class=\"step-d\">Check it here<svg class=\"memb-go\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg><\/span>\n      <\/a>\n      <div class=\"contact\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M21 16.4v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 1.1 3.6 2 2 0 0 1 3.1 1.4h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L7.1 9.2a16 16 0 0 0 6 6l1.2-1.2a2 2 0 0 1 2.1-.5c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.8 2.2z\"\/><\/svg>\n        <span class=\"step-t\">Call us or message us on WhatsApp<\/span>\n        <span class=\"contact-l\">\n          <a href=\"tel:+43720262601\">+43 720 262 601<\/a>\n          <a href=\"mailto:sales@hansjet.com\">sales@hansjet.com<\/a>\n        <\/span>\n      <\/div>\n    <\/div>\n  <\/aside>\n\n  <!-- ===== RIGHT PANEL ===== -->\n  <main class=\"main\">\n    <div class=\"wrap\">\n      <div class=\"topbar\">\n        <button type=\"button\" class=\"back\" data-act=\"back\" aria-label=\"Go back\"><svg viewBox=\"0 0 24 24\"><path d=\"M19 12H5M11 5l-7 7 7 7\"\/><\/svg><\/button>\n        <button type=\"button\" class=\"startover\" data-act=\"reset\">Start over<\/button>\n      <\/div>\n      <div id=\"hjcView\" class=\"view\"><\/div>\n    <\/div>\n  <\/main>\n<\/div>\n\n<script>\n(function(){\n  var root=document.getElementById('hj-charter');\n  if(!root||root.getAttribute('data-ready'))return;\n  root.setAttribute('data-ready','1');\n\n  \/* ===== CONFIG ===== *\/\n  var CONFIG={\n    \/\/ The WordPress snippet (hans-jet-charter-mailer.php) creates this address\n    endpoint:'\/wp-json\/hansjet\/v1\/charter',\n    \/\/ Contact details printed in the PDFs and shown in error messages\n    contactEmail:'sales@hansjet.com',\n    contactPhone:'+43 720 262 601',\n    contactWeb:'hansjet.com',\n    tagline:'Europe\u2019s first private turboprop membership',\n    \/\/ PDF tools: jsPDF is loaded only when someone presses Send\n    jspdfUrl:'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js',\n    \/\/ The same self hosted font files the website already uses\n    fonts:{\n      light:'https:\/\/hansjet.com\/wp-content\/uploads\/2026\/06\/Nunito-ExtraLight-1.ttf',\n      medium:'https:\/\/hansjet.com\/wp-content\/uploads\/2026\/09\/Nunito-Medium.ttf',\n      serif:'https:\/\/hansjet.com\/wp-content\/uploads\/2026\/09\/Francisco-Serial-Regular.ttf'\n    },\n    logo:'https:\/\/hansjet.com\/wp-content\/uploads\/2026\/05\/Hans-Jet-Logos1.png'\n  };\n  var T0=Date.now();\n\n  \/* ===== EUROPEAN AIRPORTS: City|Airport|Code|Country|Also serves (comma list) ===== *\/\n  var RAW=[\n  'Malta|Malta International Airport|MLA|Malta|',\n  'Paris|Le Bourget|LBG|France|',\n  'Paris|Charles de Gaulle|CDG|France|',\n  'Paris|Orly|ORY|France|',\n  'Paris|Beauvais Tille|BVA|France|',\n  'London|Biggin Hill|BQH|United Kingdom|',\n  'London|Luton|LTN|United Kingdom|',\n  'London|Farnborough|FAB|United Kingdom|',\n  'London|Stansted|STN|United Kingdom|',\n  'London|Northolt|NHT|United Kingdom|',\n  'London|City Airport|LCY|United Kingdom|',\n  'London|Heathrow|LHR|United Kingdom|',\n  'London|Gatwick|LGW|United Kingdom|',\n  'London|Oxford Airport|OXF|United Kingdom|',\n  'Geneva|Geneva Airport|GVA|Switzerland|Lausanne,Chamonix,Verbier',\n  'Nice|Nice C\u00f4te d\\'Azur|NCE|France|Monaco,Monte Carlo,French Riviera,Cote d Azur',\n  'Cannes|Cannes Mandelieu|CEQ|France|Cote d Azur,French Riviera',\n  'Saint-Tropez|La M\u00f4le Saint-Tropez|LTT|France|La Mole,Cote d Azur',\n  'Olbia|Olbia Costa Smeralda|OLB|Italy|Sardinia,Porto Cervo,Costa Smeralda',\n  'Chamb\u00e9ry|Chamb\u00e9ry Savoie Mont Blanc|CMF|France|Courchevel,Meribel,Alps',\n  'Gstaad|Saanen Airport|LSGK|Switzerland|Saanen',\n  'Courchevel|Courchevel Altiport|CVF|France|Alps,Three Valleys',\n  'M\u00e9ribel|M\u00e9ribel Altiport|MFX|France|Alps,Three Valleys',\n  'Meg\u00e8ve|Meg\u00e8ve Altiport|MVV|France|Alps',\n  'Annecy|Annecy Haute-Savoie|NCY|France|',\n  'Grenoble|Grenoble Alpes Is\u00e8re|GNB|France|',\n  'Lyon|Lyon Saint-Exup\u00e9ry|LYS|France|',\n  'Marseille|Marseille Provence|MRS|France|Provence',\n  'Toulon|Toulon Hy\u00e8res|TLN|France|Hyeres,Porquerolles',\n  'Le Castellet|Paul Ricard|CTT|France|',\n  'Toulouse|Toulouse Blagnac|TLS|France|',\n  'Bordeaux|Bordeaux M\u00e9rignac|BOD|France|',\n  'Biarritz|Biarritz Pays Basque|BIQ|France|Basque Coast',\n  'Nantes|Nantes Atlantique|NTE|France|',\n  'Strasbourg|Strasbourg Entzheim|SXB|France|',\n  'Lille|Lille Lesquin|LIL|France|',\n  'Montpellier|Montpellier M\u00e9diterran\u00e9e|MPL|France|',\n  'Deauville|Normandie Airport|DOL|France|Normandy',\n  'Le Touquet|Le Touquet C\u00f4te d\\'Opale|LTQ|France|',\n  'Dinard|Dinard Bretagne|DNR|France|Brittany',\n  'La Rochelle|La Rochelle \u00cele de R\u00e9|LRH|France|',\n  'Avignon|Avignon Provence|AVN|France|Provence',\n  'Perpignan|Perpignan Rivesaltes|PGF|France|',\n  'Ajaccio|Ajaccio Napol\u00e9on Bonaparte|AJA|France|Corsica',\n  'Bastia|Bastia Poretta|BIA|France|Corsica',\n  'Calvi|Calvi Sainte-Catherine|CLY|France|Corsica',\n  'Figari|Figari Sud Corse|FSC|France|Corsica,Porto Vecchio,Bonifacio',\n  'Zurich|Zurich Airport|ZRH|Switzerland|',\n  'Basel|EuroAirport Basel Mulhouse Freiburg|BSL|Switzerland|Mulhouse,Freiburg',\n  'Bern|Bern Belp|BRN|Switzerland|',\n  'Sion|Sion Airport|SIR|Switzerland|Crans Montana,Verbier',\n  'St. Moritz|Samedan Engadin|SMV|Switzerland|Samedan,Engadin',\n  'Lugano|Lugano Agno|LUG|Switzerland|',\n  'Milan|Linate|LIN|Italy|Milano,Lake Como',\n  'Milan|Malpensa|MXP|Italy|Milano,Lake Como',\n  'Milan|Bergamo Orio al Serio|BGY|Italy|Milano',\n  'Rome|Ciampino|CIA|Italy|Roma',\n  'Rome|Fiumicino|FCO|Italy|Roma',\n  'Venice|Marco Polo|VCE|Italy|Venezia,Cortina d Ampezzo',\n  'Treviso|Treviso Sant\\'Angelo|TSF|Italy|Venice,Cortina d Ampezzo',\n  'Florence|Florence Peretola|FLR|Italy|Firenze,Tuscany',\n  'Pisa|Pisa Galilei|PSA|Italy|Tuscany',\n  'Naples|Naples Capodichino|NAP|Italy|Napoli,Capri,Amalfi,Sorrento',\n  'Genoa|Genoa Cristoforo Colombo|GOA|Italy|Genova,Portofino',\n  'Turin|Turin Caselle|TRN|Italy|Torino',\n  'Bologna|Bologna Marconi|BLQ|Italy|',\n  'Verona|Verona Villafranca|VRN|Italy|Lake Garda',\n  'Rimini|Rimini Fellini|RMI|Italy|',\n  'Trieste|Trieste Friuli Venezia Giulia|TRS|Italy|',\n  'Parma|Parma Verdi|PMF|Italy|',\n  'Aosta|Aosta Corrado Gex|AOT|Italy|Courmayeur',\n  'Bari|Bari Karol Wojty\u0142a|BRI|Italy|Puglia,Apulia',\n  'Brindisi|Brindisi Salento|BDS|Italy|Puglia,Apulia',\n  'Cagliari|Cagliari Elmas|CAG|Italy|Sardinia',\n  'Alghero|Alghero Fertilia|AHO|Italy|Sardinia',\n  'Catania|Catania Fontanarossa|CTA|Italy|Sicily,Taormina',\n  'Palermo|Palermo Falcone Borsellino|PMO|Italy|Sicily',\n  'Madrid|Madrid Barajas|MAD|Spain|',\n  'Barcelona|Barcelona El Prat|BCN|Spain|',\n  'Palma de Mallorca|Palma de Mallorca|PMI|Spain|Mallorca,Majorca',\n  'Ibiza|Ibiza Airport|IBZ|Spain|',\n  'Menorca|Menorca Airport|MAH|Spain|Minorca',\n  'M\u00e1laga|M\u00e1laga Costa del Sol|AGP|Spain|Marbella,Costa del Sol',\n  'Seville|Seville San Pablo|SVQ|Spain|Sevilla',\n  'Valencia|Valencia Manises|VLC|Spain|',\n  'Alicante|Alicante Elche|ALC|Spain|',\n  'Bilbao|Bilbao Airport|BIO|Spain|',\n  'Girona|Girona Costa Brava|GRO|Spain|Costa Brava',\n  'Jerez|Jerez de la Frontera|XRY|Spain|',\n  'Santander|Santander Seve Ballesteros|SDR|Spain|',\n  'Santiago de Compostela|Rosal\u00eda de Castro|SCQ|Spain|',\n  'Tenerife|Tenerife South|TFS|Spain|Canary Islands',\n  'Gran Canaria|Gran Canaria Airport|LPA|Spain|Canary Islands,Las Palmas',\n  'Lanzarote|Lanzarote Airport|ACE|Spain|Canary Islands',\n  'Fuerteventura|Fuerteventura Airport|FUE|Spain|Canary Islands',\n  'Andorra|La Seu d\\'Urgell Andorra|LEU|Spain|Andorra',\n  'Gibraltar|Gibraltar Airport|GIB|Gibraltar|',\n  'Lisbon|Humberto Delgado|LIS|Portugal|Lisboa',\n  'Cascais|Cascais Tires|CAT|Portugal|Lisbon',\n  'Porto|Francisco S\u00e1 Carneiro|OPO|Portugal|',\n  'Faro|Faro Airport|FAO|Portugal|Algarve',\n  'Funchal|Madeira Airport|FNC|Portugal|Madeira',\n  'Ponta Delgada|Jo\u00e3o Paulo II|PDL|Portugal|Azores',\n  'Berlin|Brandenburg|BER|Germany|',\n  'Munich|Munich Airport|MUC|Germany|M\u00fcnchen',\n  'Frankfurt|Frankfurt Airport|FRA|Germany|',\n  'Hamburg|Hamburg Airport|HAM|Germany|',\n  'D\u00fcsseldorf|D\u00fcsseldorf Airport|DUS|Germany|Dusseldorf',\n  'Cologne|Cologne Bonn|CGN|Germany|K\u00f6ln,Koln',\n  'Stuttgart|Stuttgart Airport|STR|Germany|',\n  'Nuremberg|Nuremberg Airport|NUE|Germany|N\u00fcrnberg',\n  'Hanover|Hanover Airport|HAJ|Germany|Hannover',\n  'Leipzig|Leipzig Halle|LEJ|Germany|',\n  'Dresden|Dresden Airport|DRS|Germany|',\n  'Bremen|Bremen Airport|BRE|Germany|',\n  'Dortmund|Dortmund Airport|DTM|Germany|',\n  'M\u00fcnster|M\u00fcnster Osnabr\u00fcck|FMO|Germany|Munster',\n  'Paderborn|Paderborn Lippstadt|PAD|Germany|',\n  'Karlsruhe|Karlsruhe Baden Baden|FKB|Germany|Baden Baden',\n  'Friedrichshafen|Friedrichshafen Airport|FDH|Germany|Lake Constance',\n  'Sylt|Sylt Airport|GWT|Germany|Westerland',\n  'Vienna|Vienna Schwechat|VIE|Austria|Wien',\n  'Salzburg|Salzburg Airport|SZG|Austria|',\n  'Innsbruck|Innsbruck Airport|INN|Austria|Tyrol,Kitzbuhel',\n  'Graz|Graz Airport|GRZ|Austria|',\n  'Linz|Linz Airport|LNZ|Austria|',\n  'Klagenfurt|Klagenfurt Airport|KLU|Austria|',\n  'Amsterdam|Amsterdam Schiphol|AMS|Netherlands|',\n  'Rotterdam|Rotterdam The Hague|RTM|Netherlands|The Hague',\n  'Eindhoven|Eindhoven Airport|EIN|Netherlands|',\n  'Maastricht|Maastricht Aachen|MST|Netherlands|',\n  'Groningen|Groningen Eelde|GRQ|Netherlands|',\n  'Brussels|Brussels Airport|BRU|Belgium|Bruxelles',\n  'Antwerp|Antwerp Airport|ANR|Belgium|',\n  'Ostend|Ostend Bruges|OST|Belgium|Bruges',\n  'Li\u00e8ge|Li\u00e8ge Airport|LGG|Belgium|Liege',\n  'Charleroi|Brussels South Charleroi|CRL|Belgium|',\n  'Luxembourg|Findel|LUX|Luxembourg|',\n  'Dublin|Dublin Airport|DUB|Ireland|',\n  'Shannon|Shannon Airport|SNN|Ireland|',\n  'Cork|Cork Airport|ORK|Ireland|',\n  'Edinburgh|Edinburgh Airport|EDI|United Kingdom|Scotland',\n  'Glasgow|Glasgow Airport|GLA|United Kingdom|Scotland',\n  'Aberdeen|Aberdeen Airport|ABZ|United Kingdom|Scotland',\n  'Manchester|Manchester Airport|MAN|United Kingdom|',\n  'Birmingham|Birmingham Airport|BHX|United Kingdom|',\n  'Bristol|Bristol Airport|BRS|United Kingdom|',\n  'Southampton|Southampton Airport|SOU|United Kingdom|',\n  'Cambridge|Cambridge Airport|CBG|United Kingdom|',\n  'Newcastle|Newcastle Airport|NCL|United Kingdom|',\n  'Leeds|Leeds Bradford|LBA|United Kingdom|',\n  'Belfast|George Best City|BHD|United Kingdom|Northern Ireland',\n  'Jersey|Jersey Airport|JER|Jersey|Channel Islands',\n  'Guernsey|Guernsey Airport|GCI|Guernsey|Channel Islands',\n  'Isle of Man|Ronaldsway|IOM|Isle of Man|',\n  'Copenhagen|Copenhagen Kastrup|CPH|Denmark|K\u00f8benhavn',\n  'Billund|Billund Airport|BLL|Denmark|',\n  'Aalborg|Aalborg Airport|AAL|Denmark|',\n  'Aarhus|Aarhus Airport|AAR|Denmark|',\n  'Stockholm|Arlanda|ARN|Sweden|',\n  'Stockholm|Bromma|BMA|Sweden|',\n  'Gothenburg|G\u00f6teborg Landvetter|GOT|Sweden|G\u00f6teborg',\n  'Malm\u00f6|Malm\u00f6 Airport|MMX|Sweden|Malmo',\n  'Oslo|Oslo Gardermoen|OSL|Norway|',\n  'Bergen|Bergen Flesland|BGO|Norway|',\n  'Stavanger|Stavanger Sola|SVG|Norway|',\n  'Trondheim|Trondheim V\u00e6rnes|TRD|Norway|',\n  'Troms\u00f8|Troms\u00f8 Airport|TOS|Norway|Tromso',\n  'Helsinki|Helsinki Vantaa|HEL|Finland|',\n  'Reykjavik|Keflavik|KEF|Iceland|',\n  'Warsaw|Warsaw Chopin|WAW|Poland|Warszawa',\n  'Krakow|Krakow Balice|KRK|Poland|Krak\u00f3w',\n  'Gdansk|Gdansk Lech Walesa|GDN|Poland|Gda\u0144sk',\n  'Wroclaw|Wroclaw Copernicus|WRO|Poland|Wroc\u0142aw',\n  'Katowice|Katowice Pyrzowice|KTW|Poland|',\n  'Poznan|Poznan Lawica|POZ|Poland|Pozna\u0144',\n  'Prague|V\u00e1clav Havel|PRG|Czech Republic|Praha',\n  'Brno|Brno Tu\u0159any|BRQ|Czech Republic|',\n  'Karlovy Vary|Karlovy Vary Airport|KLV|Czech Republic|Carlsbad',\n  'Budapest|Liszt Ferenc|BUD|Hungary|',\n  'Bratislava|\u0160tef\u00e1nik|BTS|Slovakia|',\n  'Bucharest|Henri Coand\u0103|OTP|Romania|Bucure\u0219ti',\n  'Cluj Napoca|Cluj Napoca Airport|CLJ|Romania|',\n  'Sofia|Sofia Airport|SOF|Bulgaria|',\n  'Varna|Varna Airport|VAR|Bulgaria|',\n  'Burgas|Burgas Airport|BOJ|Bulgaria|',\n  'Zagreb|Zagreb Franjo Tu\u0111man|ZAG|Croatia|',\n  'Split|Split Airport|SPU|Croatia|Dalmatia',\n  'Dubrovnik|Dubrovnik \u010cilipi|DBV|Croatia|Dalmatia',\n  'Pula|Pula Airport|PUY|Croatia|Istria',\n  'Zadar|Zadar Airport|ZAD|Croatia|Dalmatia',\n  'Bra\u010d|Bra\u010d Airport|BWK|Croatia|Bol,Dalmatia',\n  'Ljubljana|Jo\u017ee Pu\u010dnik|LJU|Slovenia|',\n  'Belgrade|Nikola Tesla|BEG|Serbia|Beograd',\n  'Sarajevo|Sarajevo Airport|SJJ|Bosnia and Herzegovina|',\n  'Tivat|Tivat Airport|TIV|Montenegro|Kotor,Budva',\n  'Podgorica|Podgorica Airport|TGD|Montenegro|',\n  'Tirana|Tirana Rinas|TIA|Albania|',\n  'Skopje|Skopje Airport|SKP|North Macedonia|',\n  'Pristina|Pristina Adem Jashari|PRN|Kosovo|',\n  'Tallinn|Lennart Meri|TLL|Estonia|',\n  'Riga|Riga Airport|RIX|Latvia|',\n  'Vilnius|Vilnius Airport|VNO|Lithuania|',\n  'Chisinau|Chisinau Airport|KIV|Moldova|Chi\u0219in\u0103u',\n  'Athens|Eleftherios Venizelos|ATH|Greece|',\n  'Mykonos|Mykonos Airport|JMK|Greece|',\n  'Santorini|Santorini Airport|JTR|Greece|Thira',\n  'Rhodes|Rhodes Airport|RHO|Greece|',\n  'Corfu|Corfu Airport|CFU|Greece|',\n  'Heraklion|Heraklion Crete|HER|Greece|Crete',\n  'Chania|Chania Crete|CHQ|Greece|Crete',\n  'Thessaloniki|Thessaloniki Makedonia|SKG|Greece|',\n  'Kos|Kos Airport|KGS|Greece|',\n  'Zakynthos|Zakynthos Airport|ZTH|Greece|Zante',\n  'Paros|Paros Airport|PAS|Greece|',\n  'Naxos|Naxos Airport|JNX|Greece|',\n  'Skiathos|Skiathos Airport|JSI|Greece|',\n  'Kefalonia|Kefalonia Airport|EFL|Greece|Cephalonia',\n  'Larnaca|Larnaca Airport|LCA|Cyprus|Cyprus',\n  'Paphos|Paphos Airport|PFO|Cyprus|Cyprus',\n  'Istanbul|Istanbul Airport|IST|Turkey|',\n  'Istanbul|Sabiha G\u00f6k\u00e7en|SAW|Turkey|',\n  'Bodrum|Milas Bodrum|BJV|Turkey|',\n  'Antalya|Antalya Airport|AYT|Turkey|',\n  'Dalaman|Dalaman Airport|DLM|Turkey|',\n  'Izmir|Adnan Menderes|ADB|Turkey|\u0130zmir',\n  'Ankara|Esenbo\u011fa|ESB|Turkey|'\n  ];\n  var POPULAR=['MLA','LBG','BQH','GVA','NCE','OLB','CMF','LSGK','LTT','CEQ'];\n\n  var AP={},LIST=[];\n  function norm(s){return (s||'').normalize('NFD').replace(\/[\u0300-\u036f]\/g,'').toLowerCase().replace(\/[-.,']\/g,' ').replace(\/\\s+\/g,' ').trim();}\n  RAW.forEach(function(r){\n    var p=r.split('|');\n    var o={city:p[0],airport:p[1],code:p[2],country:p[3],alias:p[4]?p[4].split(','):[]};\n    o.n={city:norm(o.city),airport:norm(o.airport),code:o.code.toLowerCase(),country:norm(o.country),alias:norm(o.alias.join(' '))};\n    AP[o.code]=o;LIST.push(o);\n  });\n\n  \/* ===== COUNTRIES (flags and dialling codes) ===== *\/\n  var ISO={'Albania':'al','Andorra':'ad','Austria':'at','Belgium':'be','Bosnia and Herzegovina':'ba','Bulgaria':'bg','Croatia':'hr','Cyprus':'cy','Czech Republic':'cz','Czechia':'cz','Denmark':'dk','Estonia':'ee','Finland':'fi','France':'fr','Germany':'de','Gibraltar':'gi','Greece':'gr','Guernsey':'gg','Hungary':'hu','Iceland':'is','Ireland':'ie','Isle of Man':'im','Italy':'it','Jersey':'je','Kosovo':'xk','Latvia':'lv','Liechtenstein':'li','Lithuania':'lt','Luxembourg':'lu','Malta':'mt','Moldova':'md','Monaco':'mc','Montenegro':'me','Netherlands':'nl','North Macedonia':'mk','Norway':'no','Poland':'pl','Portugal':'pt','Romania':'ro','San Marino':'sm','Serbia':'rs','Slovakia':'sk','Slovenia':'si','Spain':'es','Sweden':'se','Switzerland':'ch','Turkey':'tr','Ukraine':'ua','United Kingdom':'gb'};\n  var CC=[\n    ['mt','Malta','356'],['at','Austria','43'],['fr','France','33'],['gb','United Kingdom','44'],['it','Italy','39'],['ch','Switzerland','41'],['de','Germany','49'],['mc','Monaco','377'],['es','Spain','34'],\n    ['al','Albania','355'],['ad','Andorra','376'],['be','Belgium','32'],['ba','Bosnia and Herzegovina','387'],['bg','Bulgaria','359'],['hr','Croatia','385'],['cy','Cyprus','357'],['cz','Czechia','420'],['dk','Denmark','45'],['ee','Estonia','372'],['fi','Finland','358'],['gi','Gibraltar','350'],['gr','Greece','30'],['gg','Guernsey','44'],['hu','Hungary','36'],['is','Iceland','354'],['ie','Ireland','353'],['im','Isle of Man','44'],['je','Jersey','44'],['xk','Kosovo','383'],['lv','Latvia','371'],['li','Liechtenstein','423'],['lt','Lithuania','370'],['lu','Luxembourg','352'],['md','Moldova','373'],['me','Montenegro','382'],['nl','Netherlands','31'],['mk','North Macedonia','389'],['no','Norway','47'],['pl','Poland','48'],['pt','Portugal','351'],['ro','Romania','40'],['sm','San Marino','378'],['rs','Serbia','381'],['sk','Slovakia','421'],['si','Slovenia','386'],['se','Sweden','46'],['tr','Turkey','90'],['ua','Ukraine','380'],['va','Vatican City','379'],\n    ['us','United States','1'],['ca','Canada','1'],['ae','United Arab Emirates','971'],['sa','Saudi Arabia','966'],['qa','Qatar','974'],['kw','Kuwait','965'],['bh','Bahrain','973'],['om','Oman','968'],['il','Israel','972'],['lb','Lebanon','961'],['jo','Jordan','962'],['eg','Egypt','20'],['ma','Morocco','212'],['tn','Tunisia','216'],['za','South Africa','27'],['ng','Nigeria','234'],['ke','Kenya','254'],['in','India','91'],['cn','China','86'],['hk','Hong Kong','852'],['jp','Japan','81'],['kr','South Korea','82'],['sg','Singapore','65'],['th','Thailand','66'],['au','Australia','61'],['nz','New Zealand','64'],['br','Brazil','55'],['ar','Argentina','54'],['mx','Mexico','52'],['ge','Georgia','995'],['am','Armenia','374'],['az','Azerbaijan','994'],['kz','Kazakhstan','7']\n  ];\n  var CCI={};CC.forEach(function(c){CCI[c[0]]=c;});\n  var EMOJI=(function(){try{var c=document.createElement('canvas');c.width=c.height=24;var x=c.getContext('2d');x.textBaseline='top';x.font='18px sans-serif';x.fillText('\\uD83C\\uDDEB\\uD83C\\uDDF7',0,0);var d=x.getImageData(0,0,24,24).data;for(var i=0;i<d.length;i+=4){if(d[i+3]>40&&(Math.abs(d[i]-d[i+1])>30||Math.abs(d[i+1]-d[i+2])>30))return true;}return false;}catch(e){return true;}})();\n  function flag(iso){\n    if(!iso)return '';\n    if(EMOJI){var A=0x1F1E6,u=iso.toUpperCase();return '<span class=\"flag\" aria-hidden=\"true\">'+String.fromCodePoint(A+u.charCodeAt(0)-65,A+u.charCodeAt(1)-65)+'<\/span>';}\n    return '<img loading=\"lazy\" decoding=\"async\" class=\"flag-img\" src=\"https:\/\/flagcdn.com\/w40\/'+iso+'.png\" width=\"20\" height=\"15\" alt=\"\" loading=\"lazy\">';\n  }\n  function guessCC(){\n    var L=(navigator.languages||[navigator.language||'']);\n    for(var i=0;i<L.length;i++){var m=\/-([A-Za-z]{2})$\/.exec(L[i]||'');if(m&&CCI[m[1].toLowerCase()])return m[1].toLowerCase();}\n    return 'mt';\n  }\n\n  \/* ===== ICONS ===== *\/\n  var IC={\n    plane:'<svg viewBox=\"0 0 24 24\"><path d=\"M21 16v-2l-8-5V3.5a1.5 1.5 0 0 0-3 0V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5z\"\/><\/svg>',\n    check:'<svg viewBox=\"0 0 24 24\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"\/><\/svg>',\n    chev:'<svg viewBox=\"0 0 12 8\"><path d=\"M1 1.5l5 5 5-5\"\/><\/svg>',\n    cal:'<svg class=\"ic\" viewBox=\"0 0 24 24\"><rect x=\"3.5\" y=\"5\" width=\"17\" height=\"15\" rx=\"2.5\"\/><path d=\"M3.5 10h17M8 3v4M16 3v4\"\/><\/svg>',\n    arrow:'<svg viewBox=\"0 0 24 24\"><path d=\"M4 12h16M13 5l7 7-7 7\"\/><\/svg>',\n    x:'<svg viewBox=\"0 0 24 24\"><path d=\"M5 5l14 14M19 5L5 19\"\/><\/svg>',\n    search:'<svg viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"6.5\"\/><path d=\"M16 16l4.5 4.5\"\/><\/svg>',\n    swap:'<svg viewBox=\"0 0 24 24\"><path d=\"M8 20V4M3.5 8.5 8 4l4.5 4.5M16 4v16M11.5 15.5 16 20l4.5-4.5\"\/><\/svg>',\n    chev:'<svg viewBox=\"0 0 24 24\"><path d=\"M9 5l7 7-7 7\"\/><\/svg>',\n    plus:'<svg viewBox=\"0 0 24 24\"><path d=\"M12 5v14M5 12h14\"\/><\/svg>',\n    minus:'<svg viewBox=\"0 0 24 24\"><path d=\"M5 12h14\"\/><\/svg>'\n  };\n\n  \/* ===== STATE ===== *\/\n  function blankLeg(from){return {from:from||'',to:'',date:'',time:'any'};}\n  var S;\n  \/* Departure airport guessed from the visitor's time zone: no permission popup, no tracking,\n     accurate to the country (or the main city for countries with one time zone per city) *\/\n  var TZ_AP={'Europe\/Malta':'MLA','Europe\/Paris':'LBG','Europe\/London':'BQH','Europe\/Vienna':'VIE','Europe\/Zurich':'ZRH','Europe\/Busingen':'ZRH','Europe\/Vaduz':'ZRH',\n    'Europe\/Rome':'CIA','Europe\/Vatican':'CIA','Europe\/San_Marino':'RMI','Europe\/Berlin':'BER','Europe\/Madrid':'MAD','Europe\/Andorra':'BCN','Europe\/Lisbon':'LIS',\n    'Europe\/Amsterdam':'AMS','Europe\/Brussels':'BRU','Europe\/Luxembourg':'LUX','Europe\/Monaco':'NCE','Europe\/Dublin':'DUB','Europe\/Prague':'PRG','Europe\/Warsaw':'WAW',\n    'Europe\/Budapest':'BUD','Europe\/Athens':'ATH','Europe\/Istanbul':'IST','Europe\/Stockholm':'ARN','Europe\/Oslo':'OSL','Europe\/Copenhagen':'CPH','Europe\/Helsinki':'HEL',\n    'Europe\/Zagreb':'ZAG','Europe\/Ljubljana':'LJU','Europe\/Belgrade':'BEG','Europe\/Bucharest':'OTP','Europe\/Sofia':'SOF','Europe\/Bratislava':'BTS','Europe\/Tallinn':'TLL',\n    'Europe\/Riga':'RIX','Europe\/Vilnius':'VNO','Europe\/Gibraltar':'GIB','Europe\/Podgorica':'TGD','Europe\/Sarajevo':'SJJ','Europe\/Skopje':'SKP','Europe\/Tirane':'TIA',\n    'Asia\/Nicosia':'LCA','Europe\/Nicosia':'LCA','Asia\/Famagusta':'LCA','Atlantic\/Reykjavik':'KEF','Europe\/Chisinau':'KIV','Europe\/Isle_of_Man':'IOM','Europe\/Jersey':'JER','Europe\/Guernsey':'GCI'};\n  function guessHome(){try{var c=TZ_AP[Intl.DateTimeFormat().resolvedOptions().timeZone];return c&&AP[c]?c:'';}catch(e){return '';}}\n  function reset(){\n    S={step:1,mode:'oneway',legs:[{from:guessHome(),to:'',date:'',time:'any'}],ret:{date:'',time:'any'},adults:2,infants:0,pets:0,petsOpen:false,cc:guessCC(),ccOpen:false,contact:{name:'',email:'',phone:'',notes:''},sent:false};\n    try{\n      var q=new URLSearchParams(location.search),f=(q.get('from')||'').toUpperCase(),t=(q.get('to')||'').toUpperCase(),m=q.get('mode');\n      if(AP[f])S.legs[0].from=f; if(AP[t])S.legs[0].to=t;\n      if(m==='oneway'||m==='round'||m==='multi')S.mode=m;\n      if(S.mode==='multi'&&S.legs.length<2)S.legs.push(blankLeg(S.legs[0].to));\n    }catch(e){}\n  }\n  reset();\n\n  \/* ===== HELPERS ===== *\/\n  function esc(s){return String(s==null?'':s).replace(\/[&<>\"']\/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c];});}\n  function pad(n){return n<10?'0'+n:''+n;}\n  function iso(d){return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate());}\n  var TODAY=iso(new Date());\n  function parse(s){var p=s.split('-');return new Date(+p[0],+p[1]-1,+p[2]);}\n  function fmtDate(s){return parse(s).toLocaleDateString('en-GB',{weekday:'short',day:'numeric',month:'short',year:'numeric'});}\n  var WINDOWS={any:['Any time',''],early:['Early morning','05:00 to 08:00'],morning:['Morning','08:00 to 12:00'],afternoon:['Afternoon','12:00 to 17:00'],evening:['Evening','17:00 to 22:00']};\n  function fmtTime(t){return WINDOWS[t]?(t==='any'?'Any time':WINDOWS[t][0]+', '+WINDOWS[t][1]):t;}\n  function place(code){var a=AP[code];return a?a.city+', '+a.code:'';}\n  function $(s,c){return (c||root).querySelector(s);}\n  var view=$('#hjcView');\n  function panelIn(){return $('#hjcSheetIn');}\n  var PANEL='<div class=\"panel\"><div id=\"hjcSheetIn\"><\/div><\/div>';\n\n  \/* ===== STEP 1 ===== *\/\n  function airportField(i,which){\n    var a=AP[S.legs[i][which]],lab=which==='from'?'From':'To';\n    var open=SH.type==='airport'&&SH.ctx.leg===i&&SH.ctx.which===which;\n    return '<button type=\"button\" class=\"field\" data-act=\"airport\" data-leg=\"'+i+'\" data-which=\"'+which+'\" aria-expanded=\"'+open+'\">'\n      +'<span class=\"lab acc\">'+lab+'<\/span>'\n      +(a?'<span class=\"val\">'+esc(a.city)+'<\/span><span class=\"sub\">'+esc(a.airport)+'<\/span><span class=\"code\">'+flag(ISO[a.country])+a.code+IC.chev+'<\/span>'\n         :'<span class=\"val ph pick\">'+IC.plane+'Pick a city<\/span><span class=\"code\">'+IC.chev+'<\/span>')\n      +'<\/button>'+(open?PANEL:'');\n  }\n  function dateField(lab,leg,val){\n    var open=SH.type==='date'&&String(SH.ctx.leg)===String(leg);\n    return '<button type=\"button\" class=\"field\" data-act=\"date\" data-leg=\"'+leg+'\" aria-expanded=\"'+open+'\"><span class=\"lab acc\">'+lab+'<\/span><span class=\"val'+(val?'':' ph')+'\">'+(val?esc(fmtDate(val)):'Pick a date')+'<\/span>'+IC.cal+'<\/button>'+(open?PANEL:'');\n  }\n  function timeField(leg,val){\n    var open=SH.type==='time'&&String(SH.ctx.leg)===String(leg);\n    return '<button type=\"button\" class=\"field\" data-act=\"time\" data-leg=\"'+leg+'\" aria-expanded=\"'+open+'\"><span class=\"lab acc\">Preferred time (optional)<\/span><span class=\"val'+(val==='any'?' ph':'')+'\">'+esc(fmtTime(val))+'<\/span><span class=\"code\">'+IC.chev+'<\/span><\/button>'+(open?PANEL:'');\n  }\n  function routeBlock(i){\n    return '<div class=\"route'+(SH.type==='airport'&&SH.ctx.leg===i?' open':'')+'\">'+airportField(i,'from')+airportField(i,'to')\n      +'<button type=\"button\" class=\"swap\" data-act=\"swap\" data-leg=\"'+i+'\" aria-label=\"Swap airports\">'+IC.swap+'<\/button><\/div>';\n  }\n  function need(){\n    var L=S.legs,i;\n    for(i=0;i<L.length;i++){\n      if(!L[i].from)return {label:'Step '+(i+1)+': Select departure airport',act:'airport',leg:i,which:'from'};\n      if(!L[i].to)return {label:'Step '+(i+1)+': Select destination',act:'airport',leg:i,which:'to'};\n      if(!L[i].date)return {label:'Step '+(i+1)+': Select '+(i===0?'departure date':'date'),act:'date',leg:i};\n    }\n    if(S.mode==='round'&&!S.ret.date)return {label:'Step 2: Select return date',act:'date',leg:'ret'};\n    return null;\n  }\n  function renderStep1(){\n    var h='<div class=\"tabs\" role=\"tablist\" aria-label=\"Trip type\">'\n      +[['oneway','One Way'],['round','Round Trip'],['multi','Multi City']].map(function(t){\n        return '<button type=\"button\" role=\"tab\" class=\"tab\" data-act=\"mode\" data-mode=\"'+t[0]+'\" aria-selected=\"'+(S.mode===t[0])+'\">'+t[1]+'<\/button>';\n      }).join('')+'<\/div>';\n    if(S.mode==='multi'){\n      S.legs.forEach(function(l,i){\n        h+='<div class=\"leg-h\"><span>Flight '+(i+1)+'<\/span>'+(i>1?'<button type=\"button\" data-act=\"rmleg\" data-leg=\"'+i+'\">Remove<\/button>':'')+'<\/div>'\n          +routeBlock(i)\n          +'<div class=\"two\">'+dateField('Date',i,l.date)+timeField(i,l.time)+'<\/div>';\n      });\n      if(S.legs.length<5)h+='<button type=\"button\" class=\"addleg\" data-act=\"addleg\">'+IC.plus+'Add another flight<\/button>';\n    }else{\n      h+=routeBlock(0)+dateField('Depart',0,S.legs[0].date)+timeField(0,S.legs[0].time);\n      if(S.mode==='round')h+=dateField('Return','ret',S.ret.date)+timeField('ret',S.ret.time);\n    }\n    var n=need();\n    h+='<button type=\"button\" class=\"cta\" data-act=\"next1\"><span>'+(n?esc(n.label):'Continue to your details')+'<\/span>'+IC.arrow+'<\/button>';\n    return h;\n  }\n\n  \/* ===== STEP 2 (details) ===== *\/\n  function summaryLines(){\n    var out=[],L=S.legs;\n    L.forEach(function(l,i){\n      out.push((S.mode==='multi'?'Flight '+(i+1)+', from ':S.mode==='round'?'Outbound from ':'From ')+place(l.from)+' to '+place(l.to)+(l.date?' on '+fmtDate(l.date):'')+(l.time!=='any'?', '+fmtTime(l.time):''));\n    });\n    if(S.mode==='round')out.push('Return from '+place(L[0].to)+' to '+place(L[0].from)+(S.ret.date?' on '+fmtDate(S.ret.date):'')+(S.ret.time!=='any'?', '+fmtTime(S.ret.time):''));\n    return out;\n  }\n  function plural(n,one,many){return n+' '+(n===1?one:many);}\n  function paxText(){\n    var t=plural(S.adults,'adult','adults');\n    if(S.infants)t+=', '+plural(S.infants,'infant','infants');\n    if(S.pets)t+=', '+plural(S.pets,'pet','pets');\n    return t;\n  }\n  function counter(key,min,max,label){\n    var v=S[key];\n    return '<div class=\"cnt\"><button type=\"button\" data-act=\"cnt\" data-k=\"'+key+'\" data-d=\"-1\" aria-label=\"Fewer '+label+'\"'+(v<=min?' disabled':'')+'>'+IC.minus+'<\/button>'\n      +'<span class=\"n'+(v?'':' z')+'\" aria-live=\"polite\">'+v+'<\/span>'\n      +'<button type=\"button\" data-act=\"cnt\" data-k=\"'+key+'\" data-d=\"1\" aria-label=\"More '+label+'\"'+(v>=max?' disabled':'')+'>'+IC.plus+'<\/button><\/div>';\n  }\n  var LIM={adults:[1,19],infants:[0,8],pets:[0,4]};\n  function travHtml(){\n    return '<div class=\"trav\">'\n      +'<div class=\"prow\"><div class=\"tt\">Adult<small>Ages 2+<\/small><\/div>'+counter('adults',1,19,'adults')+'<\/div>'\n      +'<div class=\"prow split\"><div class=\"half\"><div class=\"tt\">Infants<\/div>'+counter('infants',0,Math.min(8,S.adults),'infants')+'<\/div>'\n      +'<button type=\"button\" class=\"half petbtn\" data-act=\"pets\" aria-expanded=\"'+S.petsOpen+'\"><span class=\"tt\">Pets<\/span><span class=\"go\"><span class=\"cnt\"><span class=\"n'+(S.pets?'':' z')+'\">'+S.pets+'<\/span><\/span>'+IC.chev+'<\/span><\/button><\/div>'\n      +(S.petsOpen?'<div class=\"petpanel\"><div class=\"prow\"><div class=\"tt\">Pets on board<\/div>'+counter('pets',0,4,'pets')+'<\/div><\/div>':'')\n      +'<\/div>';\n  }\n  function phoneOk(v){return (v.replace(\/\\D\/g,'').length>=6);}\n  function mailOk(v){return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(v);}\n  function formReady(){var c=S.contact;return !!c.name.trim()&&mailOk(c.email.trim())&&phoneOk(c.phone);}\n  function syncSend(){\n    var b=$('[data-act=send]'),n=$('#hjcNeed');if(!b)return;\n    var ok=formReady();if(!b.classList.contains('busy'))b.disabled=!ok;if(n)n.hidden=ok;\n  }\n  function dial(){return (CCI[S.cc]||CCI.mt)[2];}\n  function fullPhone(){\n    var v=(S.contact.phone||'').trim();if(!v)return '';\n    if(v.charAt(0)==='+')return v;\n    if(v.indexOf('00')===0)return '+'+v.slice(2);\n    if(!\/^(it|sm|va)$\/.test(S.cc))v=v.replace(\/^0+\/,'');\n    return '+'+dial()+' '+v;\n  }\n  function ccRows(q){\n    var nq=norm(q),h='';\n    CC.forEach(function(c){\n      if(nq&&norm(c[1]).indexOf(nq)<0&&('+'+c[2]).indexOf(q.replace(\/\\s\/g,''))!==0&&c[0]!==nq)return;\n      h+='<button type=\"button\" class=\"cc-row'+(c[0]===S.cc?' sel':'')+'\" data-act=\"ccpick\" data-iso=\"'+c[0]+'\">'+flag(c[0])+'<span class=\"cc-n\">'+esc(c[1])+'<\/span><span class=\"cc-d\">+'+c[2]+'<\/span><\/button>';\n    });\n    return h||'<p class=\"none\">No country found.<\/p>';\n  }\n  function phoneHtml(){\n    var c=CCI[S.cc]||CCI.mt;\n    return '<div class=\"inp phone\" id=\"hjcL3\"><label class=\"lab\" for=\"hjcP\">Phone<\/label>'\n      +'<div class=\"ph-row\"><button type=\"button\" class=\"ccbtn\" data-act=\"cc\" aria-expanded=\"'+S.ccOpen+'\" aria-label=\"Country code, '+esc(c[1])+' +'+c[2]+'\">'+flag(c[0])+'<span>+'+c[2]+'<\/span>'+IC.chev+'<\/button>'\n      +'<input id=\"hjcP\" type=\"tel\" maxlength=\"24\" autocomplete=\"tel-national\" inputmode=\"tel\" value=\"'+esc(S.contact.phone)+'\" placeholder=\"Phone number\"><\/div><\/div>'\n      +(S.ccOpen?'<div class=\"ccpanel\"><div class=\"sh-search\">'+IC.search+'<input id=\"hjcCQ\" type=\"text\" placeholder=\"Search country or code\" autocomplete=\"off\" aria-label=\"Search country or code\"><\/div><div class=\"cc-list\" id=\"hjcCL\">'+ccRows('')+'<\/div><\/div>':'');\n  }\n  function renderStep2(){\n    if(S.sent)return '<div class=\"done-box\"><h2 class=\"h2\">Request sent<\/h2><p class=\"lead\">Thank you, '+esc(S.contact.name.split(' ')[0]||'')+'. Hans Jet has received your request, reference '+esc(refPretty(S.ref))+'. A confirmation email is on its way to '+esc(S.contact.email)+'. If it does not arrive within a few minutes, please check your spam folder.<\/p><div class=\"sum\"><b>Your trip<\/b>'+summaryLines().map(function(t){return '<p>'+esc(t)+'<\/p>';}).join('')+'<\/div>'\n      +(S.pdfUrl?'<a class=\"cta cta-ghost\" href=\"'+S.pdfUrl+'\" download=\"Hans Jet charter request '+esc(refPretty(S.ref))+'.pdf\" style=\"text-decoration:none\"><span>Download your confirmation<\/span>'+IC.arrow+'<\/a>':'')\n      +'<button type=\"button\" class=\"cta cta-ghost\" data-act=\"reset\"><span>Plan another trip<\/span>'+IC.arrow+'<\/button><\/div>';\n    var c=S.contact;\n    return '<h2 class=\"h2\">Your details<\/h2>'\n      +'<p class=\"lead\">Tell Hans Jet who is flying and how to reach you.<\/p>'\n      +'<div class=\"sum\"><b>Your trip<\/b>'+summaryLines().map(function(t){return '<p>'+esc(t)+'<\/p>';}).join('')+'<\/div>'\n      +'<label class=\"inp\" id=\"hjcL1\"><span class=\"lab\">Full name<\/span><input id=\"hjcN\" type=\"text\" maxlength=\"80\" autocomplete=\"name\" value=\"'+esc(c.name)+'\" placeholder=\"Your name\"><\/label>'\n      +'<label class=\"inp\" id=\"hjcL2\"><span class=\"lab\">Email<\/span><input id=\"hjcE\" type=\"email\" maxlength=\"120\" autocomplete=\"email\" inputmode=\"email\" value=\"'+esc(c.email)+'\" placeholder=\"name@email.com\"><\/label>'\n      +phoneHtml()\n      +travHtml()\n      +'<label class=\"inp more\"><span class=\"lab\">Anything else we should know<\/span><textarea id=\"hjcM\" rows=\"2\" maxlength=\"600\" placeholder=\"Additional Requests (Pets on Board, Catering, Ground Transfers)\">'+esc(c.notes)+'<\/textarea><\/label>'\n      +'<div style=\"position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden\" aria-hidden=\"true\"><label>Leave this field empty<input id=\"hjcHp\" type=\"text\" tabindex=\"-1\" autocomplete=\"off\"><\/label><\/div>'\n      +'<p class=\"errmsg\" id=\"hjcErr\" role=\"alert\"><\/p>'\n      +'<button type=\"button\" class=\"cta\" data-act=\"send\"'+(formReady()?'':' disabled')+'><span>Send request to Hans Jet<\/span>'+IC.arrow+'<\/button>'\n      +'<p class=\"needmsg\" id=\"hjcNeed\"'+(formReady()?' hidden':'')+'>Add your name, email and phone number to send your request.<\/p>'\n      +'<p class=\"fine\">By sending this request you agree that Hans Jet may contact you about your trip.<\/p>';\n  }\n\n  \/* ===== RENDER ===== *\/\n  function render(keepScroll){\n    var html=S.step===1?renderStep1():renderStep2();\n    view.innerHTML=html;\n    if(!keepScroll){view.style.animation='none';void view.offsetWidth;view.style.animation='';}\n    [].forEach.call(root.querySelectorAll('.step'),function(el){\n      var n=+el.getAttribute('data-s');\n      el.classList.toggle('on',n===S.step);el.classList.toggle('done',n<S.step);\n      if(n===S.step)el.setAttribute('aria-current','step');else el.removeAttribute('aria-current');\n    });\n    root.querySelector('.back').style.visibility='visible';\n    if(!keepScroll){var r=root.getBoundingClientRect();if(r.top<0)window.scrollTo({top:window.pageYOffset+r.top,behavior:'smooth'});}\n  }\n\n  \/* ===== INLINE PANEL (expands under the field, no overlay) ===== *\/\n  var SH={type:null,ctx:null,active:-1,items:[]};\n  function keepVisible(body,el){\n    var b=body.getBoundingClientRect(),r=el.getBoundingClientRect();\n    if(r.top<b.top)body.scrollTop-=b.top-r.top;else if(r.bottom>b.bottom)body.scrollTop+=r.bottom-b.bottom;\n  }\n  function showPanel(){\n    render(true);\n    if(SH.type==='airport')buildAirport();else if(SH.type==='date')buildCalendar();else buildTime();\n    var p=panelIn();if(!p)return;\n    p=p.parentNode;\n    if(p.scrollIntoView)p.scrollIntoView({block:'nearest'});\n    var i=$('#hjcQ');if(i){i.focus({preventScroll:true});}\n  }\n  function openSheet(type,ctx){\n    if(SH.type===type&&JSON.stringify(SH.ctx)===JSON.stringify(ctx)){closeSheet();return;}\n    SH.type=type;SH.ctx=ctx;showPanel();\n  }\n  function closeSheet(){\n    if(!SH.type)return;\n    var t=SH.type,c=SH.ctx;SH.type=null;SH.ctx=null;\n    render(true);\n    var q='[data-act=\"'+t+'\"][data-leg=\"'+c.leg+'\"]'+(c.which?'[data-which=\"'+c.which+'\"]':'');\n    var el=view.querySelector(q);if(el)el.focus({preventScroll:true});\n  }\n  function xBtn(){return '<button type=\"button\" class=\"sh-x\" data-act=\"close\" aria-label=\"Close\">'+IC.x+'<\/button>';}\n\n  \/* ----- airport search ----- *\/\n  function wordStart(s,q){return (' '+s).indexOf(' '+q)>-1;}\n  function rank(o,q){\n    var n=o.n;\n    if(n.city.indexOf(q)===0)return 0;\n    if(wordStart(n.alias,q))return 1;\n    if(q.length===1)return 99;\n    if(n.code.indexOf(q)===0)return 2;\n    if(wordStart(n.airport,q))return 3;\n    if(wordStart(n.city,q))return 4;\n    if(n.country.indexOf(q)===0)return 5;\n    if((n.city+' '+n.airport+' '+n.alias).indexOf(q)>-1)return 6;\n    return 99;\n  }\n  function hint(o,q){\n    for(var i=0;i<o.alias.length;i++){if(wordStart(norm(o.alias[i]),q)&&o.n.city.indexOf(q)!==0)return o.alias[i];}\n    return '';\n  }\n  function hl(city,q){\n    var nq=norm(q);\n    if(nq&&norm(city).indexOf(nq)===0){var k=Math.min(q.trim().length,city.length);return '<b>'+esc(city.slice(0,k))+'<\/b>'+esc(city.slice(k));}\n    return esc(city);\n  }\n  function apRow(o,q,sel,h){\n    return '<button type=\"button\" class=\"ap-row'+(sel?' sel':'')+'\" role=\"option\" aria-selected=\"'+(sel?'true':'false')+'\" data-act=\"pick\" data-code=\"'+o.code+'\">'\n      +'<span class=\"ap-ic\">'+(flag(ISO[o.country])||IC.plane)+'<\/span>'\n      +'<span class=\"ap-main\"><span class=\"ap-city\">'+hl(o.city,q)+'<\/span><span class=\"ap-name\">'+esc(o.airport)+', '+esc(o.country)+(h?'. Serves '+esc(h):'')+'<\/span><\/span>'\n      +'<span class=\"ap-code\">'+o.code+'<\/span>'+(sel?'<span class=\"ap-sel\">'+IC.check+'<\/span>':'')+'<\/button>';\n  }\n  function buildAirport(){\n    panelIn().innerHTML='<div class=\"sh-head\"><div class=\"sh-search\">'+IC.search+'<input id=\"hjcQ\" type=\"text\" placeholder=\"Search by city or airport\" autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\" role=\"combobox\" aria-expanded=\"true\" aria-controls=\"hjcList\" aria-label=\"Search by city or airport\"><\/div>'+xBtn()+'<\/div><div class=\"sh-body\" id=\"hjcList\" role=\"listbox\"><\/div><div class=\"vh\" aria-live=\"polite\" id=\"hjcLive\"><\/div>';\n    fillAirports('');\n    var inp=$('#hjcQ');\n    inp.addEventListener('input',function(){fillAirports(inp.value);});\n    inp.addEventListener('keydown',function(e){\n      if(e.key==='ArrowDown'){e.preventDefault();moveActive(1);}\n      else if(e.key==='ArrowUp'){e.preventDefault();moveActive(-1);}\n      else if(e.key==='Enter'){e.preventDefault();var b=SH.items[SH.active>=0?SH.active:0];if(b)b.click();}\n    });\n  }\n  function fillAirports(q){\n    var l=SH.ctx.leg,w=SH.ctx.which,cur=S.legs[l][w],other=S.legs[l][w==='from'?'to':'from'];\n    var nq=norm(q),body=$('#hjcList'),h='',count=0;\n    if(!nq){\n      h+='<p class=\"sh-cap\">Popular Destinations<\/p>';\n      POPULAR.forEach(function(c){if(c===other)return;h+=apRow(AP[c],'',c===cur,'');count++;});\n      h+='<p class=\"sh-cap\" style=\"margin-top:1.4rem\">Type a city, airport or code to see all European airports.<\/p>';\n    }else{\n      var res=[];\n      LIST.forEach(function(o){if(o.code===other)return;var r=rank(o,nq);if(r<99)res.push({o:o,r:r});});\n      res.sort(function(a,b){var pa=POPULAR.indexOf(a.o.code),pb=POPULAR.indexOf(b.o.code);pa=pa<0?99:pa;pb=pb<0?99:pb;return a.r-b.r||pa-pb||(a.o.city<b.o.city?-1:a.o.city>b.o.city?1:(a.o.airport<b.o.airport?-1:1));});\n      res.forEach(function(x){h+=apRow(x.o,q,x.o.code===cur,x.r===1?hint(x.o,nq):'');});\n      count=res.length;\n      if(!count)h='<p class=\"none\">No airport found for \"'+esc(q.trim())+'\". Try a nearby city or the airport code.<\/p>';\n    }\n    body.innerHTML=h;body.scrollTop=0;\n    SH.items=[].slice.call(body.querySelectorAll('.ap-row'));SH.active=-1;\n    var live=$('#hjcLive');if(live)live.textContent=count+' airport'+(count===1?'':'s')+' available';\n  }\n  function moveActive(d){\n    if(!SH.items.length)return;\n    SH.active=(SH.active+d+SH.items.length)%SH.items.length;\n    SH.items.forEach(function(b,i){b.classList.toggle('act',i===SH.active);});\n    keepVisible($('#hjcList'),SH.items[SH.active]);\n  }\n\n  \/* ----- calendar ----- *\/\n  function ctxDate(){var c=SH.ctx;return c.leg==='ret'?S.ret.date:S.legs[c.leg].date;}\n  function minDate(){\n    var c=SH.ctx;\n    if(c.leg==='ret')return S.legs[0].date||TODAY;\n    if(c.leg>0&&S.legs[c.leg-1].date)return S.legs[c.leg-1].date;\n    return TODAY;\n  }\n  function buildCalendar(){\n    var c=SH.ctx,min=minDate(),dep=S.mode==='round'?S.legs[0].date:'',ret=S.mode==='round'?S.ret.date:'';\n    var title=c.leg==='ret'?'Select return date':(S.mode==='multi'?'Step '+(c.leg+1)+': Select date':'Select departure date');\n    var now=new Date(),start=new Date(now.getFullYear(),now.getMonth(),1),h='';\n    for(var m=0;m<13;m++){\n      var d0=new Date(start.getFullYear(),start.getMonth()+m,1),days=new Date(d0.getFullYear(),d0.getMonth()+1,0).getDate(),off=(d0.getDay()+6)%7;\n      h+='<section class=\"mon\"><h3 class=\"mon-t\" style=\"font-weight:200\">'+d0.toLocaleDateString('en-GB',{month:'long',year:'numeric'})+'<\/h3><div class=\"grid\">';\n      for(var b=0;b<off;b++)h+='<span><\/span>';\n      for(var d=1;d<=days;d++){\n        var s=iso(new Date(d0.getFullYear(),d0.getMonth(),d)),cls='day',dis=s<min;\n        if(s===TODAY)cls+=' today';\n        if(s===dep||s===ret)cls+=' sel';\n        else if(dep&&ret&&s>dep&&s<ret)cls+=' rng';\n        h+='<button type=\"button\" class=\"'+cls+'\" data-act=\"day\" data-date=\"'+s+'\"'+(dis?' disabled':'')+' aria-label=\"'+esc(fmtDate(s))+'\"'+((s===ctxDate())?' aria-pressed=\"true\"':'')+'>'+d+'<\/button>';\n      }\n      h+='<\/div><\/section>';\n    }\n    var pn=panelIn();\n    pn.innerHTML='<div class=\"sh-head\"><span class=\"sh-title\">'+esc(title)+'<\/span>'+xBtn()+'<\/div><div class=\"dow\" aria-hidden=\"true\"><span>Mon<\/span><span>Tue<\/span><span>Wed<\/span><span>Thu<\/span><span>Fri<\/span><span>Sat<\/span><span>Sun<\/span><\/div><div class=\"sh-body\" id=\"hjcCal\">'+h+'<\/div>';\n    \/\/ mark the date being edited as selected in non round modes too\n    var cur=ctxDate();\n    if(cur&&S.mode!=='round'){var el=pn.querySelector('[data-date=\"'+cur+'\"]');if(el)el.classList.add('sel');}\n    \/\/ bring the selected (or first available) month into view inside the panel\n    var body=$('#hjcCal'),tgt=pn.querySelector('.day.sel')||(dep&&pn.querySelector('[data-date=\"'+dep+'\"]'));\n    if(tgt&&body){body.scrollTop=tgt.getBoundingClientRect().top-body.getBoundingClientRect().top+body.scrollTop-60;}\n  }\n\n  \/* ----- time ----- *\/\n  function buildTime(){\n    var cur=SH.ctx.leg==='ret'?S.ret.time:S.legs[SH.ctx.leg].time,h='<div class=\"tl\">';\n    ['any','early','morning','afternoon','evening'].forEach(function(k){\n      h+='<button type=\"button\" class=\"trow'+(cur===k?' sel':'')+'\" data-act=\"settime\" data-v=\"'+k+'\"><span>'+WINDOWS[k][0]+(WINDOWS[k][1]?' <small>'+WINDOWS[k][1]+'<\/small>':'')+'<\/span>'+(cur===k?IC.check:'')+'<\/button>';\n    });\n    h+='<\/div><p class=\"sh-cap\" style=\"margin-top:1.6rem\">Or choose an exact departure time<\/p><div class=\"hrs\">';\n    for(var i=5;i<=22;i++){var t=pad(i)+':00';h+='<button type=\"button\" class=\"hr'+(cur===t?' sel':'')+'\" data-act=\"settime\" data-v=\"'+t+'\">'+t+'<\/button>';}\n    h+='<\/div>';\n    panelIn().innerHTML='<div class=\"sh-head\"><span class=\"sh-title\">Preferred departure time<\/span>'+xBtn()+'<\/div><div class=\"sh-body free\">'+h+'<\/div>';\n  }\n\n  \/* ===== PDF (built in the browser with jsPDF, in the Hans Jet fonts) ===== *\/\n  var PDFX={ready:null,f:{},logo:null};\n  \/* reference = HJ + date + time to the second (Malta time) + 2 random characters,\n     so two requests sent in the same second still get different references *\/\n  function makeRef(){\n    var d=new Date(),t='',a='ABCDEFGHJKLMNPQRSTUVWXYZ23456789',r='',i;\n    try{\n      var P={};new Intl.DateTimeFormat('en-GB',{timeZone:'Europe\/Malta',year:'2-digit',month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit',second:'2-digit',hourCycle:'h23'})\n        .formatToParts(d).forEach(function(x){P[x.type]=x.value;});\n      t=P.year+P.month+P.day+P.hour+P.minute+P.second;\n    }catch(e){}\n    if(!\/^\\d{12}$\/.test(t))t=String(d.getFullYear()).slice(2)+pad(d.getMonth()+1)+pad(d.getDate())+pad(d.getHours())+pad(d.getMinutes())+pad(d.getSeconds());\n    for(i=0;i<2;i++)r+=a.charAt(Math.floor(Math.random()*a.length));\n    return 'HJ'+t+r;\n  }\n  function refPretty(r){return r?r.slice(0,2)+' '+r.slice(2,8)+' '+r.slice(8,14)+' '+r.slice(14):'';}\n  function loadScript(src){\n    return new Promise(function(res,rej){\n      if(window.jspdf&&window.jspdf.jsPDF)return res();\n      var s=document.createElement('script');s.src=src;s.async=true;s.onload=res;s.onerror=function(){rej(new Error('pdf library'));};\n      document.head.appendChild(s);\n    });\n  }\n  function b64FromBuf(buf){\n    var b=new Uint8Array(buf),s='',i,CH=0x8000;\n    for(i=0;i<b.length;i+=CH)s+=String.fromCharCode.apply(null,b.subarray(i,i+CH));\n    return btoa(s);\n  }\n  function getFont(url){return fetch(url).then(function(r){if(!r.ok)throw 0;return r.arrayBuffer();}).then(b64FromBuf).catch(function(){return null;});}\n  function logoFrom(src,cors){\n    return new Promise(function(res){\n      if(!src){res(null);return;}\n      var im=new Image();if(cors)im.crossOrigin='anonymous';\n      im.onload=function(){try{\n        var w=im.naturalWidth,h=im.naturalHeight;if(!w||!h){res(null);return;}\n        var c=document.createElement('canvas');c.width=w;c.height=h;var x=c.getContext('2d');x.drawImage(im,0,0);\n        \/* crop the transparent margin so the logo sits exactly where it should *\/\n        var d=x.getImageData(0,0,w,h).data,x0=w,y0=h,x1=-1,y1=-1,X,Y;\n        for(Y=0;Y<h;Y++)for(X=0;X<w;X++)if(d[(Y*w+X)*4+3]>12){if(X<x0)x0=X;if(X>x1)x1=X;if(Y<y0)y0=Y;if(Y>y1)y1=Y;}\n        if(x1<0){res(null);return;}\n        var cw=x1-x0+1,ch=y1-y0+1,o=document.createElement('canvas');o.width=cw;o.height=ch;\n        o.getContext('2d').drawImage(c,x0,y0,cw,ch,0,0,cw,ch);\n        res({data:o.toDataURL('image\/png'),w:cw,h:ch});\n      }catch(e){res(null);}};\n      im.onerror=function(){res(null);};im.src=src;\n    });\n  }\n  function getLogo(url){\n    var side=document.querySelector('#hj-charter .side-logo img'),alt=side?side.currentSrc||side.src:'';\n    return logoFrom(url,true).then(function(r){return r||logoFrom(url,false);})\n      .then(function(r){return r||(alt&&alt!==url?logoFrom(alt,true):null);});\n  }\n  function prepPdf(){\n    if(PDFX.ready)return PDFX.ready;\n    PDFX.ready=Promise.all([loadScript(CONFIG.jspdfUrl),getFont(CONFIG.fonts.light),getFont(CONFIG.fonts.medium),getFont(CONFIG.fonts.serif),getLogo(CONFIG.logo)])\n      .then(function(r){PDFX.f={light:r[1],medium:r[2],serif:r[3]};PDFX.logo=r[4];});\n    PDFX.ready.catch(function(){PDFX.ready=null;});\n    return PDFX.ready;\n  }\n  function flightList(){\n    var L=S.legs,out=[];\n    if(S.mode==='multi'){L.forEach(function(l,i){out.push({lab:'FLIGHT '+(i+1),from:l.from,to:l.to,date:l.date,time:l.time});});}\n    else if(S.mode==='round'){\n      out.push({lab:'OUTBOUND',from:L[0].from,to:L[0].to,date:L[0].date,time:L[0].time});\n      out.push({lab:'RETURN',from:L[0].to,to:L[0].from,date:S.ret.date,time:S.ret.time});\n    }else out.push({lab:'FLIGHT',from:L[0].from,to:L[0].to,date:L[0].date,time:L[0].time});\n    return out;\n  }\n  function buildPdf(kind,ref){\n    var J=window.jspdf.jsPDF,doc=new J({unit:'mm',format:'a4',compress:true});\n    var F={light:'helvetica',medium:'helvetica',serif:'times'},ST={light:'normal',medium:'bold',serif:'normal'};\n    [['light','HJNunitoLight'],['medium','HJNunitoMedium'],['serif','HJFranciscoSerial']].forEach(function(p){\n      var b=PDFX.f[p[0]];if(!b)return;\n      try{doc.addFileToVFS(p[1]+'.ttf',b);doc.addFont(p[1]+'.ttf',p[1],'normal');F[p[0]]=p[1];ST[p[0]]='normal';}catch(e){}\n    });\n    var INK=[21,21,21],MUTE=[111,111,107],FAINT=[166,166,162],LINE=[227,227,224],WHITE=[255,255,255];\n    var ML=20,MR=190,y=0;\n    function font(k){doc.setFont(F[k],ST[k]);}\n    function T(t,x,yy,o){o=o||{};font(o.f||'light');doc.setFontSize(o.s||10);var c=o.c||INK;doc.setTextColor(c[0],c[1],c[2]);var op={};if(o.cs)op.charSpace=o.cs;if(o.a)op.align=o.a;doc.text(String(t),x,yy,op);}\n    function W(t,s,f){font(f||'light');doc.setFontSize(s);return doc.getTextWidth(String(t));}\n    function fit(t,maxW,s,f,min){while(s>(min||8)&&W(t,s,f)>maxW)s-=.5;return s;}\n    function hair(yy,x1,x2,c){c=c||LINE;doc.setDrawColor(c[0],c[1],c[2]);doc.setLineWidth(.2);doc.line(x1||ML,yy,x2||MR,yy);}\n    var first=(S.contact.name||'').split(' ')[0]||'';\n    var now=new Date().toLocaleString('en-GB',{day:'2-digit',month:'short',year:'numeric',hour:'2-digit',minute:'2-digit'});\n\n    \/* header band *\/\n    doc.setFillColor(0,0,0);doc.rect(0,0,210,48,'F');\n    if(PDFX.logo){var lh=10,lw=lh*PDFX.logo.w\/PDFX.logo.h;if(lw>48){lw=48;lh=lw*PDFX.logo.h\/PDFX.logo.w;}doc.addImage(PDFX.logo.data,'PNG',ML,9,lw,lh);}\n    else T('HANS JET',ML,19,{f:'serif',s:16,c:WHITE,cs:.8});\n    T('REFERENCE',MR,13,{f:'medium',s:7,c:[150,150,150],a:'right'});\n    T(refPretty(ref),MR,19,{f:'light',s:12,c:WHITE,a:'right'});\n    T(kind==='internal'?'NEW CHARTER REQUEST':'REQUEST CONFIRMATION',ML,34,{f:'serif',s:21,c:WHITE,cs:.5});\n    T(kind==='internal'?'Received '+now:'Thank you'+(first?', '+first:'')+'. Hans Jet has received your request.',ML,41,{f:'light',s:10,c:[205,205,205]});\n    y=60;\n\n    function need(h){if(y+h>268){doc.addPage();y=26;}}\n    function sect(label){need(16);T(label,ML,y,{f:'medium',s:7,c:MUTE,cs:.4});hair(y+3);y+=11;}\n\n    \/* trip *\/\n    sect('TRIP');\n    flightList().forEach(function(f){\n      need(36);\n      var A=AP[f.from]||{city:'',airport:'',code:''},B=AP[f.to]||{city:'',airport:'',code:''};\n      T(f.lab,ML,y,{f:'medium',s:7,c:MUTE,cs:.35});\n      var s1=fit(A.city,62,19,'light',11),s2=fit(B.city,62,19,'light',11);\n      T(A.city,ML,y+8,{f:'light',s:s1});\n      T(B.city,116,y+8,{f:'light',s:s2});\n      T(A.airport+', '+A.code,ML,y+13.5,{f:'medium',s:8.5,c:MUTE});\n      T(B.airport+', '+B.code,116,y+13.5,{f:'medium',s:8.5,c:MUTE});\n      doc.setDrawColor(FAINT[0],FAINT[1],FAINT[2]);doc.setLineWidth(.3);\n      doc.line(92,y+5.5,108,y+5.5);doc.line(105,y+3.5,108,y+5.5);doc.line(105,y+7.5,108,y+5.5);\n      T('DATE',ML,y+21,{f:'medium',s:6.5,c:MUTE,cs:.35});\n      T('PREFERRED TIME',116,y+21,{f:'medium',s:6.5,c:MUTE,cs:.35});\n      T(f.date?fmtDate(f.date):'To be confirmed',ML,y+26.5,{f:'light',s:11});\n      T(fmtTime(f.time),116,y+26.5,{f:'light',s:11});\n      hair(y+31);y+=36;\n    });\n\n    \/* details *\/\n    y+=1;sect('DETAILS');\n    var modeName={oneway:'One way',round:'Round trip',multi:'Multi city'}[S.mode];\n    var rows=[[['NAME',S.contact.name],['EMAIL',S.contact.email]],[['PHONE',fullPhone()||'Not given'],['PASSENGERS',paxText()]],[['TRIP TYPE',modeName],['RECEIVED',now]]];\n    rows.forEach(function(r){\n      need(16);\n      r.forEach(function(c,i){var x=i?116:ML;T(c[0],x,y,{f:'medium',s:6.5,c:MUTE,cs:.35});T(c[1],x,y+6.5,{f:'light',s:fit(c[1],72,12,'light',8)});});\n      y+=15;\n    });\n    if(S.contact.notes){\n      y+=1;sect('ANYTHING ELSE WE SHOULD KNOW');\n      font('light');doc.setFontSize(10);\n      doc.splitTextToSize(S.contact.notes,170).slice(0,12).forEach(function(line){need(6);T(line,ML,y,{f:'light',s:10,c:INK});y+=5.2;});\n      y+=4;\n    }\n    if(kind==='customer'){\n      y+=1;sect('WHAT HAPPENS NEXT');\n      font('light');doc.setFontSize(10);\n      doc.splitTextToSize('A member of the Hans Jet team will review your request and come back to you. If anything changes, reply to the email this PDF came with, or contact Hans Jet using the details below.',170).forEach(function(line){need(6);T(line,ML,y,{f:'light',s:10});y+=5.2;});\n    }\n\n    \/* footer on every page *\/\n    var n=doc.getNumberOfPages(),p;\n    for(p=1;p<=n;p++){\n      doc.setPage(p);\n      hair(277);\n      T('HANS JET',ML,284,{f:'serif',s:9,cs:.5});\n      T(CONFIG.tagline,ML,289,{f:'light',s:7.5,c:MUTE});\n      T(CONFIG.contactPhone,MR,282,{f:'light',s:8,c:MUTE,a:'right'});\n      T(CONFIG.contactEmail,MR,286,{f:'light',s:8,c:MUTE,a:'right'});\n      T(CONFIG.contactWeb,MR,290,{f:'light',s:8,c:MUTE,a:'right'});\n    }\n    var uri=doc.output('datauristring');\n    return {b64:uri.split('base64,')[1],url:URL.createObjectURL(doc.output('blob'))};\n  }\n\n  \/* ===== ACTIONS ===== *\/\n  function legRef(v){return v==='ret'?'ret':+v;}\n  function clearLater(i){\n    \/\/ keep dates in order: wipe any later date that is now earlier than this one\n    var d=S.legs[i].date;\n    for(var j=i+1;j<S.legs.length;j++){if(S.legs[j].date&&S.legs[j].date<d)S.legs[j].date='';}\n    if(S.mode==='round'&&i===0&&S.ret.date&&S.ret.date<d)S.ret.date='';\n  }\n  var actions={\n    back:function(){if(S.step>1){S.step--;render();}else if(history.length>1){history.back();}else{location.href='https:\/\/hansjet.com\/';}},\n    reset:function(){reset();render();},\n    mode:function(t){\n      var m=t.getAttribute('data-mode');if(m===S.mode)return;\n      S.mode=m;\n      if(m==='multi'){if(S.legs.length<2)S.legs.push(blankLeg(S.legs[0].to));}\n      else{S.legs=[S.legs[0]];}\n      render(true);\n    },\n    swap:function(t){\n      var l=S.legs[+t.getAttribute('data-leg')],x=l.from;l.from=l.to;l.to=x;\n      t.classList.add('spin');\n      setTimeout(function(){render(true);},320);\n    },\n    airport:function(t){openSheet('airport',{leg:+t.getAttribute('data-leg'),which:t.getAttribute('data-which')});},\n    date:function(t){openSheet('date',{leg:legRef(t.getAttribute('data-leg'))});},\n    time:function(t){openSheet('time',{leg:legRef(t.getAttribute('data-leg'))});},\n    addleg:function(){var last=S.legs[S.legs.length-1];S.legs.push(blankLeg(last.to));render(true);},\n    rmleg:function(t){S.legs.splice(+t.getAttribute('data-leg'),1);render(true);},\n    close:function(){closeSheet();},\n    pick:function(t){\n      var c=SH.ctx,code=t.getAttribute('data-code'),l=S.legs[c.leg];\n      l[c.which]=code;\n      if(S.mode==='multi'&&c.which==='to'&&S.legs[c.leg+1]&&!S.legs[c.leg+1].from)S.legs[c.leg+1].from=code;\n      closeSheet();\n    },\n    day:function(t){\n      var c=SH.ctx,d=t.getAttribute('data-date');\n      if(c.leg==='ret'){S.ret.date=d;closeSheet();return;}\n      S.legs[c.leg].date=d;clearLater(c.leg);\n      if(S.mode==='round'&&c.leg===0&&!S.ret.date){\n        SH.ctx={leg:'ret'};showPanel();   \/\/ move straight on to the return date\n        return;\n      }\n      closeSheet();\n    },\n    settime:function(t){\n      var c=SH.ctx,v=t.getAttribute('data-v');\n      if(c.leg==='ret')S.ret.time=v;else S.legs[c.leg].time=v;\n      closeSheet();\n    },\n    next1:function(){\n      var n=need();\n      if(n){\n        if(n.act==='airport')openSheet('airport',{leg:n.leg,which:n.which});\n        else openSheet('date',{leg:n.leg});\n        return;\n      }\n      S.step=2;render();\n      prepPdf().catch(function(){});   \/\/ warm up the PDF tools while the visitor types\n    },\n    cnt:function(t){\n      var k=t.getAttribute('data-k'),d=+t.getAttribute('data-d'),L=LIM[k],max=k==='infants'?Math.min(L[1],S.adults):L[1];\n      S[k]=Math.max(L[0],Math.min(max,S[k]+d));\n      if(S.infants>S.adults)S.infants=S.adults;\n      render(true);\n    },\n    pets:function(){S.petsOpen=!S.petsOpen;render(true);},\n    cc:function(){S.ccOpen=!S.ccOpen;render(true);if(S.ccOpen){var q=$('#hjcCQ');if(q)q.focus({preventScroll:true});}},\n    ccpick:function(t){S.cc=t.getAttribute('data-iso');S.ccOpen=false;render(true);var p=$('#hjcP');if(p)p.focus({preventScroll:true});},\n    send:function(){\n      var c=S.contact;\n      c.name=$('#hjcN').value.trim();c.email=$('#hjcE').value.trim();c.phone=$('#hjcP').value.trim();c.notes=$('#hjcM').value.trim();\n      var err=$('#hjcErr'),hp=$('#hjcHp')?$('#hjcHp').value:'';\n      var okN=!!c.name,okM=mailOk(c.email),okP=phoneOk(c.phone);\n      $('#hjcL1').classList.toggle('err',!okN);$('#hjcL2').classList.toggle('err',!okM);$('#hjcL3').classList.toggle('err',!okP);\n      if(!okN||!okM||!okP){err.textContent=!okN?'Please add your name.':!okM?'Please add a valid email address.':'Please add a phone number.';syncSend();return;}\n      err.textContent='';\n      var btn=$('[data-act=send]'),lab=btn.querySelector('span'),orig=lab.textContent;\n      btn.disabled=true;btn.classList.add('busy');lab.textContent='Preparing your request';\n      var ref=makeRef(),elapsed=Date.now()-T0,pdfs=null;\n      \/\/ build both PDFs; if the PDF tools cannot load, still send the request without them\n      prepPdf().then(function(){\n        pdfs={internal:buildPdf('internal',ref),customer:buildPdf('customer',ref)};\n      }).catch(function(){pdfs=null;}).then(function(){\n        lab.textContent='Sending';\n        var body={ref:ref,name:c.name,email:c.email,phone:fullPhone(),notes:c.notes,pax:S.adults,adults:S.adults,infants:S.infants,pets:S.pets,paxText:paxText(),mode:S.mode,route:place(S.legs[0].from)+' to '+place(S.legs[0].to)+(S.mode==='multi'&&S.legs.length>1?' and more':''),lines:summaryLines(),hp:hp,elapsed:elapsed,\n          pdfInternal:pdfs?pdfs.internal.b64:'',pdfCustomer:pdfs?pdfs.customer.b64:''};\n        return fetch(CONFIG.endpoint,{method:'POST',headers:{'Content-Type':'application\/json'},credentials:'same-origin',body:JSON.stringify(body)})\n          .then(function(r){return r.json().catch(function(){return {};}).then(function(j){if(!r.ok||!j.ok)throw new Error('send');return j;});});\n      }).then(function(){\n        S.ref=ref;S.pdfUrl=pdfs?pdfs.customer.url:'';S.sent=true;render();\n      }).catch(function(){\n        btn.classList.remove('busy');btn.disabled=false;lab.textContent=orig;\n        err.textContent='We could not send your request just now. Please try again, or email '+CONFIG.contactEmail+'.';\n      });\n    }\n  };\n\n  root.addEventListener('click',function(e){\n    var t=e.target.closest('[data-act]');if(!t||!root.contains(t))return;\n    var name=t.getAttribute('data-act'),a=actions[name];\n    if(!a)return;\n    if(!\/^(airport|date|time|pick|day|settime|close)$\/.test(name)){SH.type=null;SH.ctx=null;}\n    e.preventDefault();a(t);\n  });\n  root.addEventListener('input',function(e){\n    var id=e.target.id,F={hjcN:'name',hjcE:'email',hjcP:'phone',hjcM:'notes'};\n    if(id==='hjcCQ'){var L=$('#hjcCL');if(L){L.innerHTML=ccRows(e.target.value);L.scrollTop=0;}return;}\n    if(!F[id])return;\n    S.contact[F[id]]=e.target.value;\n    var l=e.target.closest('.inp');if(l)l.classList.remove('err');\n    syncSend();\n  });\n  document.addEventListener('keydown',function(e){if(e.key==='Escape'&&SH.type)closeSheet();});\n\n  render(true);\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c0962c4 e-grid e-con-boxed e-con e-parent\" data-id=\"c0962c4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\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 on demandcharter flight From route to request in a few simple taps. Plan your trip Pick your airports, dates and times. Curious about our membership? Check it here Call us or message us on WhatsApp +43 720 262 601 sales@hansjet.com Start over<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"content-type":"","_crwl_schema":[],"crwl_noindex":"","footnotes":""},"class_list":["post-4324","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/hansjet.com\/de\/wp-json\/wp\/v2\/pages\/4324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hansjet.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/hansjet.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/hansjet.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hansjet.com\/de\/wp-json\/wp\/v2\/comments?post=4324"}],"version-history":[{"count":244,"href":"https:\/\/hansjet.com\/de\/wp-json\/wp\/v2\/pages\/4324\/revisions"}],"predecessor-version":[{"id":9803,"href":"https:\/\/hansjet.com\/de\/wp-json\/wp\/v2\/pages\/4324\/revisions\/9803"}],"wp:attachment":[{"href":"https:\/\/hansjet.com\/de\/wp-json\/wp\/v2\/media?parent=4324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}