{"id":10408,"date":"2026-06-04T14:40:51","date_gmt":"2026-06-04T09:10:51","guid":{"rendered":"https:\/\/medusabungalow.com\/book-direct-availability\/"},"modified":"2026-08-07T23:08:58","modified_gmt":"2026-08-07T17:38:58","slug":"book-direct-availability","status":"publish","type":"page","link":"https:\/\/medusabungalow.com\/de\/book-direct-availability\/","title":{"rendered":"Book Direct \u2014 Check Availability"},"content":{"rendered":"<div id=\"mbc-benefits\" style=\"max-width:900px;margin:0 auto 28px;padding:22px 26px;background:#151310;border:1px solid rgba(201,169,110,.3);border-radius:4px;font-family:Raleway,sans-serif;color:#e8e0d0\">\n<h2 style=\"font-family:Cormorant Garamond,serif;font-size:26px;font-weight:400;color:#fff;margin:0 0 6px\">Book direct with the house \u2014 no platform fees<\/h2>\n<p style=\"font-size:14px;line-height:1.7;color:rgba(235,228,215,.8);margin:0 0 18px\">The calendar below shows our real price for every night. Booking here means no platform mark-ups \u2014 and these benefits, included:<\/p>\n<div style=\"font-size:10px;letter-spacing:2px;text-transform:uppercase;color:#c9a96e;margin-bottom:8px\">Your direct-booking benefits<\/div>\n<ul style=\"list-style:none;padding:0;margin:0 0 18px;font-size:14px;line-height:1.9;color:#e8e0d0\">\n<li>Returning guests &amp; early birds (booking 30+ days ahead): <strong style=\"color:#c9a96e\">10% off<\/strong><\/li>\n<li>Stays of 7+ nights: <strong style=\"color:#c9a96e\">15% off<\/strong> &nbsp;\u00b7&nbsp; Stays of 28+ nights: <strong style=\"color:#c9a96e\">25% off<\/strong><\/li>\n<li>Last-minute open dates: <strong style=\"color:#c9a96e\">up to 20% off<\/strong> \u2014 ask us on WhatsApp<\/li>\n<\/ul>\n<div style=\"font-size:10px;letter-spacing:2px;text-transform:uppercase;color:#c9a96e;margin-bottom:8px\">Included with every direct booking <span style=\"text-transform:none;letter-spacing:0;color:rgba(235,228,215,.5);font-size:12px\">\u2014 our thank-you for skipping the middleman<\/span><\/div>\n<ul style=\"list-style:none;padding:0;margin:0 0 16px;font-size:14px;line-height:1.9;color:#e8e0d0\">\n<li>Floating breakfast on your first morning<\/li>\n<li>Galle town pickup<\/li>\n<li>Late checkout to 2 PM when the calendar allows<\/li>\n<\/ul>\n<p style=\"font-size:12px;color:rgba(235,228,215,.5);margin:0\">Prices in USD, per villa per night. One discount applies per stay \u2014 we will always give you the best one.<\/p>\n<\/div>\n<div id=\"mbc-wrap\">\n  <div id=\"mbc-loading\" style=\"text-align:center;padding:40px;color:#c9a96e\"><div class=\"mbc-spin\"><\/div><p>Loading availability...<\/p><\/div>\n  <div id=\"mbc-app\" data-no-translation style=\"display:none\">\n    <div id=\"mbc-nav\" style=\"display:flex;align-items:center;justify-content:center;gap:18px;margin:0 0 16px\">\n      <button type=\"button\" id=\"mbc-prev\" aria-label=\"Previous months\">&#8249;<\/button>\n      <span id=\"mbc-navlabel\"><\/span>\n      <button type=\"button\" id=\"mbc-next\" aria-label=\"Next months\">&#8250;<\/button>\n    <\/div>\n    <div id=\"mbc-grids\"><\/div>\n    <a id=\"mbc-card\" href=\"#\" aria-disabled=\"true\" data-off=\"1\" style=\"display:block;text-align:center;margin:14px 0 20px;background:#c9a96e;color:#1a1916;padding:15px 28px;text-decoration:none;font-size:11px;letter-spacing:2px;text-transform:uppercase;border-radius:2px;opacity:.45;pointer-events:none;transition:all .3s\">Select your dates first<\/a>\n    <div id=\"mbc-sel\" style=\"display:none;background:#1a1916;border:1px solid rgba(201,169,110,.3);padding:20px 24px;margin-bottom:20px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:16px\">\n      <div><div id=\"mbc-dtext\" style=\"font-family:'Cormorant Garamond',serif;font-size:20px;color:#fff;font-weight:300\"><\/div><div id=\"mbc-ntext\" style=\"font-size:10px;letter-spacing:2px;color:rgba(201,169,110,.7);text-transform:uppercase;margin-top:4px\"><\/div><div id=\"mbc-ptext\" style=\"font-size:13px;color:#c9a96e;margin-top:4px\"><\/div><\/div>\n      \n      <a id=\"mbc-wa\" href=\"#\" target=\"_blank\" style=\"background:#25D366;color:#fff;padding:13px 28px;text-decoration:none;font-size:10px;letter-spacing:2px;text-transform:uppercase;display:inline-flex;align-items:center;gap:6px;transition:all .3s\">\ud83d\udcf1 Enquire on WhatsApp<\/a>\n    <\/div>\n    <div style=\"display:flex;gap:20px;flex-wrap:wrap;margin-bottom:12px\">\n      <span style=\"display:flex;align-items:center;gap:6px;font-size:10px;color:rgba(235,228,215,.5);letter-spacing:1px\"><span style=\"width:10px;height:10px;background:rgba(201,169,110,.15);border:1px solid rgba(201,169,110,.3);display:inline-block\"><\/span>Available<\/span>\n      <span style=\"display:flex;align-items:center;gap:6px;font-size:10px;color:rgba(235,228,215,.5);letter-spacing:1px\"><span style=\"width:10px;height:10px;background:rgba(180,40,40,.5);display:inline-block\"><\/span>Booked<\/span>\n      <span style=\"display:flex;align-items:center;gap:6px;font-size:10px;color:rgba(235,228,215,.5);letter-spacing:1px\"><span style=\"width:10px;height:10px;background:#c9a96e;display:inline-block\"><\/span>Your selection<\/span>\n    <\/div>\n    <p style=\"font-size:11px;color:rgba(235,228,215,.3);margin-top:0\">Select check-in then check-out. Price in USD per villa\/per night.<\/p>\n  <\/div>\n<\/div>\n<style>\n#mbc-grids{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:20px;margin-bottom:24px}\n#mbc-nav button{background:transparent;border:1px solid rgba(201,169,110,.5);color:#c9a96e;width:38px;height:38px;font-size:18px;line-height:1;cursor:pointer;border-radius:2px;transition:all .2s}\n#mbc-nav button:hover:not(:disabled){background:#c9a96e;color:#0f0e0c}\n#mbc-nav button:disabled{opacity:.28;cursor:not-allowed}\n#mbc-navlabel{font-family:\"Cinzel\",serif;font-size:12px;letter-spacing:2px;color:#c9a96e;text-transform:uppercase;min-width:170px;text-align:center}\n.mbc-spin{width:36px;height:36px;border:3px solid rgba(201,169,110,.2);border-top-color:#c9a96e;border-radius:50%;animation:mbcS .8s linear infinite;margin:0 auto 12px}\n@keyframes mbcS{to{transform:rotate(360deg)}}\n.mbc-month{background:#1a1916;border:1px solid rgba(201,169,110,.12);padding:14px}\n.mbc-mhdr{font-family:\"Cinzel\",serif;font-size:10px;letter-spacing:3px;color:#c9a96e;text-align:center;padding-bottom:10px;text-transform:uppercase}\n.mbc-wds,.mbc-dys{display:grid;grid-template-columns:repeat(7,1fr);gap:1px}\n.mbc-wd{font-size:8px;text-align:center;color:rgba(201,169,110,.4);letter-spacing:1.5px;padding:3px 0}\n.mbc-d{aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:11px;cursor:pointer;color:rgba(235,228,215,.8);transition:all .12s;border-radius:1px}\n.mbc-pr{font-size:8px;line-height:1.1;color:rgba(201,169,110,.9);margin-top:1px}\n.mbc-d:hover:not(.mb):not(.mp){background:rgba(201,169,110,.2)}\n.mb{background:rgba(180,40,40,.3);color:rgba(235,228,215,.25);cursor:not-allowed;text-decoration:line-through}\n.mp{color:rgba(235,228,215,.18);cursor:not-allowed}\n.ms{background:#c9a96e!important;color:#0f0e0c!important;font-weight:700}\n.mr{background:rgba(201,169,110,.2)}\n.me{cursor:default}\n<\/style>\n<script>\n(function(){\n  var WA='+94777705398',PRICE=220,MONTHS=4;\n  var blocked=[],prices={},sel={s:null,e:null};\n  var winStart=null,minMonth=null,maxMonth=null;\n  function pad(n){return n<10?'0'+n:n;}\n  function fd(d){return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate());}\n  function fh(d){var m=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];return d.getDate()+' '+m[d.getMonth()]+' '+d.getFullYear();}\n  function diff(a,b){return Math.round((b-a)\/86400000);}\n  function isB(d){return blocked.indexOf(fd(d))!==-1;}\n  function isP(d){var t=new Date();t.setHours(0,0,0,0);return d<t;}\n  function inR(d){return sel.s&&sel.e&&d>sel.s&&d<sel.e;}\n  function hasB(a,b){var d=new Date(a);d.setDate(d.getDate()+1);while(d<b){if(isB(d))return true;d.setDate(d.getDate()+1);}return false;}\nfunction firstOfMonth(d){return new Date(d.getFullYear(),d.getMonth(),1);}\n  function addMonths(d,n){return new Date(d.getFullYear(),d.getMonth()+n,1);}\n  function winSize(){return (window.matchMedia&&window.matchMedia('(max-width:768px)').matches)?1:3;}\n  function computeBounds(){\n    var now=new Date();minMonth=new Date(now.getFullYear(),now.getMonth(),1);\n    var maxk=null;Object.keys(prices||{}).forEach(function(k){var ym=(''+k).slice(0,7);if(!maxk||ym>maxk)maxk=ym;});\n    if(maxk){maxMonth=new Date(+maxk.slice(0,4),(+maxk.slice(5,7))-1,1);}else{maxMonth=addMonths(minMonth,3);}\n    if(maxMonth<minMonth)maxMonth=new Date(minMonth);\n    winStart=new Date(minMonth);\n  }\n  function clampWin(){if(!winStart)winStart=new Date(minMonth);if(winStart<minMonth)winStart=new Date(minMonth);if(winStart>maxMonth)winStart=new Date(maxMonth);}\n  function renderNav(){\n    var prev=document.getElementById('mbc-prev'),next=document.getElementById('mbc-next'),lab=document.getElementById('mbc-navlabel');\n    if(!prev||!next)return;\n    var ws=winSize();\n    prev.disabled=(winStart<=minMonth);\n    next.disabled=(addMonths(winStart,ws)>maxMonth);\n    var mns=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\n    var lastShown=addMonths(winStart,ws-1);if(lastShown>maxMonth)lastShown=new Date(maxMonth);\n    if(lab){if(fd(winStart)===fd(lastShown)){lab.textContent=mns[winStart.getMonth()]+' '+winStart.getFullYear();}else{lab.textContent=mns[winStart.getMonth()]+' '+winStart.getFullYear()+' - '+mns[lastShown.getMonth()]+' '+lastShown.getFullYear();}}\n  }\n  function goPrev(){winStart=addMonths(winStart,-winSize());if(winStart<minMonth)winStart=new Date(minMonth);render();}\n  function goNext(){var ws=winSize(),cand=addMonths(winStart,ws);if(cand>maxMonth)return;winStart=cand;render();}\n  function bindNav(){var prev=document.getElementById('mbc-prev'),next=document.getElementById('mbc-next');if(prev)prev.addEventListener('click',goPrev);if(next)next.addEventListener('click',goNext);var rt;window.addEventListener('resize',function(){clearTimeout(rt);rt=setTimeout(function(){if(minMonth)render();},200);});}\n  function buildM(y,m){\n    var div=document.createElement('div');div.className='mbc-month';\n    var mns=(location.pathname.indexOf('\/de\/')===0?['Januar','Februar','M\\u00e4rz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember']:['January','February','March','April','May','June','July','August','September','October','November','December']);\n    var h=document.createElement('div');h.className='mbc-mhdr';h.textContent=mns[m]+' '+y;div.appendChild(h);\n    var wd=document.createElement('div');wd.className='mbc-wds';\n    (location.pathname.indexOf('\/de\/')===0?['Mo','Di','Mi','Do','Fr','Sa','So']:['Mo','Tu','We','Th','Fr','Sa','Su']).forEach(function(x){var s=document.createElement('div');s.className='mbc-wd';s.textContent=x;wd.appendChild(s);});\n    div.appendChild(wd);\n    var ds=document.createElement('div');ds.className='mbc-dys';\n    var f=new Date(y,m,1).getDay();f=f===0?6:f-1;\n    for(var i=0;i<f;i++){var e=document.createElement('div');e.className='mbc-d me';ds.appendChild(e);}\n    var tot=new Date(y,m+1,0).getDate();\n    for(var day=1;day<=tot;day++){\n      var d=new Date(y,m,day),s=document.createElement('div');s.className='mbc-d';s.textContent=day;s.dataset.dt=fd(d);\n      if(isP(d))s.classList.add('mp');\n      else if(isB(d))s.classList.add('mb');\n      else{\n        var pr=prices[fd(d)];if(typeof pr==='number'&&pr>0){s.innerHTML='<span>'+day+'<\/span><span class=\"mbc-pr\">$'+pr+'<\/span>';}\n        if(sel.s&&fd(d)===fd(sel.s))s.classList.add('ms');\n        else if(sel.e&&fd(d)===fd(sel.e))s.classList.add('ms');\n        else if(inR(d))s.classList.add('mr');\n        s.addEventListener('click',function(){click(new Date(this.dataset.dt+'T12:00:00'));});\n      }\n      ds.appendChild(s);\n    }\n    div.appendChild(ds);return div;\n  }\n  function click(d){\n    if(!sel.s||(sel.s&&sel.e)){sel.s=d;sel.e=null;}\n    else{\n      if(d<=sel.s){sel.s=d;sel.e=null;}\n      else if(hasB(sel.s,d)){alert('Some dates in this range are already booked. Please choose different dates.');sel.s=d;sel.e=null;}\n      else{sel.e=d;}\n    }\n    render();updSel();\n  }\n  function render(){\n    var c=document.getElementById('mbc-grids');c.innerHTML='';\n    if(!minMonth)computeBounds();clampWin();\n    var ws=winSize(),m=new Date(winStart);\n    for(var i=0;i<ws;i++){if(m>maxMonth)break;c.appendChild(buildM(m.getFullYear(),m.getMonth()));m=addMonths(m,1);}\n    renderNav();\n  }\n  function updSel(){\n    var el=document.getElementById('mbc-sel');\n    if(!sel.s||!sel.e){el.style.display='none';var _c=document.getElementById('mbc-card');if(_c){_c.textContent='Select your dates first';_c.setAttribute('href','#');_c.setAttribute('aria-disabled','true');_c.style.opacity='.45';_c.style.pointerEvents='none';}return;}\n    el.style.display='flex';\n    var ni=diff(sel.s,sel.e),tot=0,dd=new Date(sel.s);for(var k=0;k<ni;k++){var dp=prices[fd(dd)];tot+=(typeof dp==='number'&&dp>0)?dp:PRICE;dd.setDate(dd.getDate()+1);}\n    document.getElementById('mbc-dtext').textContent=fh(sel.s)+' \u2192 '+fh(sel.e);\n    document.getElementById('mbc-ntext').textContent=ni+' night'+(ni!==1?'s':'');\n    document.getElementById('mbc-ptext').textContent='From $'+tot.toLocaleString()+' USD (full villa)';\n    var msg='Hello! I would like to book Medusa Bungalow:\\n\\nCheck-in: '+fh(sel.s)+'\\nCheck-out: '+fh(sel.e)+'\\n'+ni+' nights\\n\\nPlease confirm availability and send booking details. Thank you!';\n    document.getElementById('mbc-wa').href='https:\/\/wa.me\/'+WA.replace(\/\\D\/g,'')+'?text='+encodeURIComponent(msg);\n    var ci=fd(new Date(sel.s)),co=fd(new Date(sel.e));\n    document.getElementById('mbc-card').href='https:\/\/medusa-ceo-staging-7u7x.onrender.com\/book\/checkout?checkin='+ci+'&checkout='+co;document.getElementById('mbc-card').textContent='\ud83d\udcb3 Book & Pay by Card';document.getElementById('mbc-card').setAttribute('aria-disabled','false');document.getElementById('mbc-card').style.opacity='1';document.getElementById('mbc-card').style.pointerEvents='auto';\n    document.getElementById('mbc-card').removeAttribute('target');\n  }\n  function preselectFromUrl(){\n    try{\n      var q=new URLSearchParams(location.search), ci=q.get('checkin'), co=q.get('checkout');\n      if(!ci||!co||!\/^\\d{4}-\\d{2}-\\d{2}$\/.test(ci)||!\/^\\d{4}-\\d{2}-\\d{2}$\/.test(co)) return;\n      var d1=new Date(ci+'T12:00:00'), d2=new Date(co+'T12:00:00');\n      if(!(d2>d1)||isP(d1)||isB(d1)||hasB(d1,d2)) return;\n      if(d1<minMonth||firstOfMonth(d1)>maxMonth) return;\n      sel.s=d1; sel.e=d2; winStart=firstOfMonth(d1); clampWin(); render(); updSel();\n      var app=document.getElementById('mbc-app'); if(app&&app.scrollIntoView) app.scrollIntoView({behavior:'smooth',block:'start'});\n    }catch(e){}\n  }\n  \/* MZ-CAL-RESILIENCE: the feed is healthy but can take ~4s (Render cold start).\n     A bare fetch() has no timeout, so the old .catch() dropped guests to the\n     WhatsApp fallback on any transient failure. Generous abort + one retry, and\n     never paint a payload that arrived empty. *\/\n  var MZ_API='https:\/\/medusabungalow.com\/wp-json\/medusa\/v1\/availability';\n  function mzGrab(ms){\n    var ctl = (window.AbortController ? new AbortController() : null);\n    var t = ctl ? setTimeout(function(){ try{ ctl.abort(); }catch(e){} }, ms) : null;\n    return fetch(MZ_API, ctl ? {signal:ctl.signal} : undefined).then(function(r){\n      if(t) clearTimeout(t);\n      if(!r.ok) throw new Error('HTTP '+r.status);\n      return r.json();\n    }, function(err){ if(t) clearTimeout(t); throw err; });\n  }\n  function mzPaint(d){\n    if(!d || !d.prices || !Object.keys(d.prices).length) throw new Error('empty feed');\n    blocked=d.blocked||[];prices=(d&&d.prices)||{};\n    document.getElementById('mbc-loading').style.display='none';\n    document.getElementById('mbc-app').style.display='block';\n    computeBounds();render();updSel();bindNav();preselectFromUrl();\n  }\n  mzGrab(15000).then(mzPaint).catch(function(){\n    return new Promise(function(res){ setTimeout(res,1200); }).then(function(){ return mzGrab(15000).then(mzPaint); });\n  }).catch(function(){\n    document.getElementById('mbc-loading').innerHTML='<p style=\"color:rgba(235,228,215,.4);text-align:center\">Could not load calendar. <a href=\"https:\/\/wa.me\/94777705398\" style=\"color:#c9a96e\">Message us on WhatsApp<\/a> to check availability.';\n  });\n})();\n<\/script>","protected":false},"excerpt":{"rendered":"<p>Book direct with the house \u2014 no platform fees The calendar below shows our real price for every night. Booking here means no platform mark-ups \u2014 and these benefits, included: Your direct-booking benefits Returning guests &amp; early birds (booking 30+ days ahead): 10% off Stays of 7+ nights: 15% off &nbsp;\u00b7&nbsp; Stays of 28+ nights: [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-10408","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/medusabungalow.com\/de\/wp-json\/wp\/v2\/pages\/10408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/medusabungalow.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/medusabungalow.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/medusabungalow.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/medusabungalow.com\/de\/wp-json\/wp\/v2\/comments?post=10408"}],"version-history":[{"count":2,"href":"https:\/\/medusabungalow.com\/de\/wp-json\/wp\/v2\/pages\/10408\/revisions"}],"predecessor-version":[{"id":10661,"href":"https:\/\/medusabungalow.com\/de\/wp-json\/wp\/v2\/pages\/10408\/revisions\/10661"}],"wp:attachment":[{"href":"https:\/\/medusabungalow.com\/de\/wp-json\/wp\/v2\/media?parent=10408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}