!function(u,t){"use strict";var c,o="YYYY-MM-DD",h=86400,d=loftoceanRoomReservationUtilsData.i18nText;function m(t){return void 0===t||t.getTime||(t=new Date),Math.floor(t.getTime()/h/1e3)*h}c=m(""),t.loftoceanRoomReservationUtils=function(t){this.setData(t),this.setDisabledDates()},t.loftoceanDatePickerValidate={instance:!1,defaultDates:!1,checkDefaultDates:function(t,a){if(!1!==this.defaultDates)return this.defaultDates;for(var e=0,i=0,n=t.clone(),s=null;e++<365;){var r=this.checkDate(n,{startDate:null,endDate:null});if(!r[0]||r[1]&&r[1].split(" ").includes("checkin-unavailable"))n.add("1","day");else{i=0,s=n.clone().add("1","day");for(var l={startDate:n,endDate:null};i++<365;){var u=this.checkDate(s,l);if(!(!u[0]||u[1]&&u[1].split(" ").includes("checkout-unavailable")))return this.defaultDates={checkin:n,checkout:s},this.defaultDates;s.add("1","day")}n.add("1","day")}}return this.defaultDates={checkin:t,checkout:a},this.defaultDates},checkDate:function(t,a){if(0==this.instance&&(this.instance=new loftoceanRoomReservationUtils({unavailableDates:loftoceanRoomReservationUtilsData.allRoomsUnavailableDates,priceList:{}})),t=t.format(o),void 0===a||null===a.startDate&&null!==a.endDate)return[!0,"",""];var e=void 0!==a&&null!==a.startDate&&null===a.endDate,i=new Date(t),n="day"+i.getDay(),s=m(i),r=[],l=[],t=!1,i=this.instance.getMatchedBookingRule(s),t=e&&this.instance.getMatchedBookingRule(m(new Date(a.startDate.format(o))));return!1!==i&&(i.checkin&&i.checkin.length&&i.checkin.includes(n)&&(r.push("no-checkin","checkin-unavailable"),l.push(d.noCheckin)),e?i.checkout&&i.checkout.length&&i.checkout.includes(n)&&(r.push("no-checkout","checkout-unavailable"),l.push(d.noCheckout)):i.in_advance&&((i=i.in_advance).min&&(s-c)/h<i.min&&r.push("disabled","checkin-unavailable"),i.max&&(s-c)/h>i.max&&(r.push("checkin-unavailable"),void 0!==a&&null!==a.startDate&&null===a.endDate||r.push("disabled")))),!1!==t&&e&&t.stay_length&&(e=m(new Date(a.startDate.format(o))),a="day"+a.startDate.day(),e<s&&(t=t.stay_length,e=(s-e)/h,t[a]&&(t[a].min&&e<t[a].min&&(r.push("minimal-stay-unavailable","checkout-unavailable"),l.push(t[a].min+d.minimum)),t[a].max&&e>t[a].max&&(r.push("off","disabled","maximal-stay-unavailable","checkout-unavailable"),l.push(t[a].max+d.maximum))))),[!0,r.length?r.join(" "):"",l.length?l.join(", "):""]}},loftoceanRoomReservationUtils.prototype={data:{},disabledStartDates:[],disabledEndDates:[],setData:function(t){this.data=t},checkTaxes:function(t,a){var e;this.data.isTaxEnabled&&(this.data.taxIncluded?(e=this.calculateIncludedTax(t),a.tax=this.checkOutputNumberFormat(e.totalTax),a.taxDetails=e.taxDetails):(e=this.calculateExcludeTax(t),a.tax=this.checkOutputNumberFormat(e.totalTax),a.taxDetails=e.taxDetails,a.beforeTax=a.totalPrice,a.totalPrice=this.checkOutputNumberFormat(add(a.totalOriginalPrice,e.totalTax),!0)))},calculateIncludedTax:function(t){var a,e=this.add(this.data.currencySettings.precision,2),i=this.data.taxRate,n=[],s=t;if(i.reversed_compound_rates&&i.reversed_compound_rates.length)for(var r=0;r<i.reversed_compound_rates.length;r++)a=s,s=this.multiplication(s,100/(100+i.reversed_compound_rates[r].rate)),s=Number(s).toFixed(e),n.unshift({tax:this.checkOutputNumberFormat(this.subtraction(a,s)),label:i.reversed_compound_rates[r].label});if(i.regular_rates&&i.regular_rates.length){for(var l=100,r=0;r<i.regular_rates.length;r++)l=this.add(l,i.regular_rates[r].rate);for(s=this.multiplication(s,100/l),s=Number(s).toFixed(e),--r;0<=r;r--)n.push({tax:this.checkOutputNumberFormat(this.multiplication(s,i.regular_rates[r].rate/100)),label:i.regular_rates[r].label})}return{totalTax:this.subtraction(t,s),taxDetails:n}},calculateExcludeTax:function(t){var a=this.data.taxRate,e=t,i=0,n=[];if(a.regular_rates&&a.regular_rates.length){for(var s,r=0;r<a.regular_rates.length;r++)s=this.multiplication(t,a.regular_rates[r].rate/100),n.push({tax:this.checkOutputNumberFormat(s),label:a.regular_rates[r].label}),i=this.add(i,s);e=this.add(t,i)}if(a.compound_rates&&a.compound_rates.length)for(var l,r=0;r<a.compound_rates.length;r++)l=this.multiplication(e,a.compound_rates[r].rate/100),i=this.add(i,l),e=this.add(e,l),n.push({tax:this.checkOutputNumberFormat(l),label:a.compound_rates[r].label});return{totalTax:i,taxDetails:n}},checkOutputNumberFormat:function(t,a){var e=0,i=0,n="";t=void 0!==t&&isNumber(t)?t:0;try{e=(""+t).split(".")[1].length}catch(t){e=0}if(t=Number(t).toFixed(e?Math.max(0,this.data.currencySettings.precision):0),t=(""+t).split("."),n=Number(t[0]),this.data.currencySettings.thousandSeparator&&1e3<(i=Number(t[0]))){for(n=(i+"").substr(-3),i=Math.floor(i/1e3);1e3<i;)n=(i+"").substr(-3)+this.data.currencySettings.thousandSeparator+n,i=Math.floor(i/1e3);0<i&&(n=i+this.data.currencySettings.thousandSeparator+n)}return 1<t.length&&0<Number(t[1])&&this.data.currencySettings.precision&&this.data.currencySettings.decimalSeparator&&(n+=this.data.currencySettings.decimalSeparator+t[1]),a?n:this.data.currency.left+n+this.data.currency.right},add:function(t,a){var e,i,n;try{e=(""+t).split(".")[1].length}catch(t){e=0}try{i=(""+a).split(".")[1].length}catch(t){i=0}return n=Math.max(e,i),((t*Math.pow(10,n)+a*Math.pow(10,n))/Math.pow(10,n)).toFixed(n)},subtraction:function(t,a){return this.add(t,-a)},multiplication:function(t,a){var e,i;try{e=(""+t).split(".")[1].length}catch(t){e=0}try{i=(""+a).split(".")[1].length}catch(t){i=0}return(t*Math.pow(10,e)*(a*Math.pow(10,i))/Math.pow(10,e+i)).toFixed(e+i)},setDisabledDates:function(){var e=this;u.each(this.data.priceList,function(t,a){("unavailable"==a.status||a.available_number<1)&&(e.disabledStartDates.push(a.start),e.disabledEndDates.push(a.end))})},showCheckinDates:function(a){if(a=a.format(o),this.disabledStartDates.includes(a))return[!1,"",""];var t=new Date(a),e="day"+t.getDay(),i=m(t),n=[],s=[],a=this.getMatchedBookingRule(i);if(!1!==a&&(a.in_advance&&((t=a.in_advance).min&&(i-c)/h<t.min&&n.push("disabled","checkin-unavailable"),t.max&&(i-c)/h>t.max&&n.push("checkin-unavailable")),a.checkin.length)){let t=a.checkin;t.includes(e)&&(n.push("no-checkin","checkin-unavailable"),s.push(d.noCheckin))}return[!0,n.length?n.join(" "):"",s.length?s.join(", "):""]},showCheckoutDates:function(t,a){if(t=t.format(o),this.disabledEndDates.includes(t)||!moment(a).isValid())return[!1,"",""];if(!moment(t).isAfter(a))return[!1,"",""];var e=a.clone(),i=moment(t);for(e.add("1","day");e.isBefore(i);){if(this.disabledStartDates.includes(e.format(o)))return[!1,"",""];e.add("1","day")}var n=new Date(t),s="day"+n.getDay(),r=m(n),l=[],u=[],c=m(new Date(a.format(o))),t=this.getMatchedBookingRule(c),n=this.getMatchedBookingRule(r);if(!1!==n&&n.checkout.length){let t=n.checkout;t.includes(s)&&(l.push("no-checkout","checkout-unavailable"),u.push(d.noCheckout))}return!1!==t&&t.stay_length&&(a="day"+a.day(),c<r&&(t=t.stay_length,c=(r-c)/h,t[a]&&(t[a].min&&c<t[a].min&&(l.push("minimal-stay-unavailable","checkout-unavailable"),u.push(t[a].min+d.minimum)),t[a].max&&c>t[a].max&&(l.push("off","disabled","maximal-stay-unavailable","checkout-unavailable"),u.push(t[a].max+d.maximum))))),[!0,l.length?l.join(" "):"",u.length?u.join(", "):""]},getEnabledExtraServiceList:function(s,r){if(this.data.hasCustomExtraServices){var l=[];return s=m(new Date(s)),r=m(new Date(r)),this.data.extraServices.forEach(function(a){if(""!==a.effective_time&&a.custom_effective_time_slots.length){var e=!0,i="activated"==a.effective_time;for(let t=0;t<a.custom_effective_time_slots.length;t++){var n=a.custom_effective_time_slots[t];if((!n.start_timestamp||n.start_timestamp<=s)&&(!n.end_timstamp||n.end_timstamp>=r)){i?l.push(u.extend({},a)):e=!1;break}}!i&&e&&l.push(u.extend({},a))}else l.push(u.extend({},a))}),l}return!1},getRoomLimitation:function(t,a){for(var e=!1,t=m(new Date(t)),i=m(new Date(a)),n=this.data.priceList,s=t;s<i;s+=h)n[s]&&"available"==n[s].status&&n[s].available_number&&(!1===e||Number(n[s].available_number)<e)&&(e=Number(n[s].available_number));return e},getMatchedBookingRule:function(c){if(this.data.unavailableDates&&this.data.unavailableDates.length){var o=-1,h=NaN,d=NaN;return this.data.unavailableDates.forEach(function(t,a){var e,i,n="custom"==t.type,s=n?parseInt(t.start,10):NaN,r=n?parseInt(t.end,10):NaN,l=isNaN(s),u=isNaN(r);(!n||(l||s<=c)&&(u||c<=r))&&(o<0?(o=a,h=s,d=r):!n||l&&u||h+"-"+d==s+"-"+r||(e=isNaN(h),i=isNaN(d),t=!l&&(e||h<=s),n=!u&&(i||r<d),(e&&i&&(!l||!u)||l&&e&&!i&&n||u&&i&&!e&&t||t&&n)&&(o=a,h=s,d=r)))}),-1<o&&this.data.unavailableDates[o]}return!1}}}(jQuery,window);