{"version":3,"sources":["bower_components/js-cookie/src/js.cookie.js","js/eden-rock.js"],"names":["factory","registeredInModuleLoader","define","amd","exports","module","OldCookies","window","Cookies","api","noConflict","extend","i","result","arguments","length","attributes","key","decode","s","replace","decodeURIComponent","init","converter","set","value","document","path","defaults","expires","Date","toUTCString","JSON","stringify","test","e","write","encodeURIComponent","String","escape","stringifiedAttributes","attributeName","split","cookie","get","json","jar","cookies","parts","slice","join","charAt","name","read","parse","getJSON","remove","withConverter","inlineSVGs","inputValue","selectorString","$","each","$img","this","imgID","attr","imgClass","imgURL","indexOf","data","$svg","find","removeAttr","replaceWith","initCookieMessage","on","removeClass","addClass","initHeader","stickHeader","stuck","pageYOffset","stickAtOffset","$header","stuckClass","headerMenuOpenClass","$navToggle","toggleClass","newSize","initFooter","setTimeout","trigger","animate","scrollTop","offset","top","initNavigation","stopScrolling","preventDefault","recordScrollable","scrollHeight","clientHeight","allowUp","allowDown","lastY","originalEvent","pageY","stopScrollPropagation","up","down","stopPropagation","off","initSubNavigation","Foundation","MediaQuery","is","item","closest","hasClass","initSliders","buildSliders","slick","slickOptions","slider","tabWatcher","onChange","prev","outerHeight","count","total","dots","append","parents","btn","div","parent","showLess","text","initialized","destroySliders","config","pdfMode","prevArrow","nextArrow","printWatcher","isPrint","initDatePickers","easepickButtons","nextMonthButton","prevMonthButton","resetButton","fn","easepick","options","isPending","date","rangeInfo","str","format","settings","pending","some","range","first","last","isUnavailable","unavailable","existing","Object","assign","element","css","lang","culture","zIndex","plugins","locale","nextMonth","previousMonth","AmpPlugin","darkMode","KbdPlugin","unitIndex","dayIndex","html","availabilityCalendar","openButtonText","LockPlugin","minDate","filter","minDays","inseparable","RangePlugin","tooltipNumber","num","one","unit","other","unitPlural","setup","picker","detail","view","target","textContent","substring","classList","add","ep","create","initMaps","leaflet","markers","isMarkerValid","mapSettings","inside","padding","mapBounds","bounds","map","L","maxZoom","zoom","zoomSnap","zoomDelta","center","scrollWheelZoom","maxBoundsViscosity","maxBounds","attributionControl","zoomControl","gestureHandling","gestureHandlingOptions","duration","fitBounds","setMinZoom","getBoundsZoom","defaultZoom","setZoom","setView","control","position","addTo","imageOverlay","markerIcons","default","icon","iconUrl","iconSize","iconAnchor","defaultSelected","branded","airport","beach","gasStation","hike","hospital","pharmacy","restaurant","shopping","viewPoint","watersports","markerCluster","markerClusterGroup","showCoverageOnHover","maxClusterRadius","iconCreateFunction","cluster","divIcon","_childCount","className","point","poiCluster","forEach","marker","lat","lon","type","id","addLayer","popup","autoPanPaddingTopLeft","autoPanPaddingBottomRight","setContent","bindPopup","setIcon","popupHeight","_container","offsetHeight","mapHeight","style","minHeight","popupPixels","project","getLatLng","popupSouthWest","unproject","x","offsetLeft","y","popupNorthEast","offsetTop","popupBounds","LatLngBounds","extendedBounds","setMaxBounds","_adjustPan","invalidateSize","eachLayer","layer","setOpacity","valid","_resize","_validateMarkers","MarkerCluster","getAllChildMarkers","closePopup","Marker","$key","$map","$markers","concat","toArray","selectedKey","val","initPropertyListing","removeEmpty","obj","fromEntries","entries","v","Array","isArray","writeQueryString","datePicker","startDate","getStartDate","endDate","getEndDate","minPrice","maxPrice","categories","Multiselect","getValues","facilities","locations","rooms","fromDate","toDate","searchParams","URLSearchParams","keys","valueItem","searchParamsStr","toString","newUrl","location","origin","pathname","href","history","pushState","readQueryString","search","getAll","prop","setValues","setStartDate","clear","setEndDate","filterProperties","writeQs","selectedMaxPrice","disabled","parseInt","selectedMinPrice","filterName","selectedName","filterMinPrice","filterMaxPrice","filterCategories","selectedCategories","filterFacilities","selectedFacilities","filterLocations","selectedLocations","filterRooms","selectedRooms","filterArrivalDate","selectedArrivalDate","filterDepartureDate","selectedDepartureDate","favourites","localStorage","getItem","villas","villa","price","disabledDates","every","term","toLowerCase","includes","from","dd","start","end","selectedView","villaVisibility","numVisibleVillas","not","$propertyListingMap","c","startsWith","wrapper","offCanvas","height","setUTCHours","addEventListener","event","state","initContactForm","form","arrivalDate","departureDate","toISOString","initFavourites","addOrRemove","exists","splice","push","setItem","updateState","lovedVillasButtonText","lovedVillasButton","favouriteButtons","initHero","videoMobile","videoDesktop","innerWidth","initIntro","initGallery","el","slidesToShow","slidesToScroll","arrows","infinite","autoplayVideos","outerWidth","$slides","slide","currentSlide","video","load","pause","videos","modal","scroll","innerHeight","initRatesTables","debounce","clearTimeout","timer","$tabs","width","draggable","mobileFirst","nextSlide","click","activeTab","index","initVideos","next","iframe","play","initYourStay","arrivalDay","arrivalMonth","departureDay","departureMonth","grid","calendars","inline","monthYearFormatter","Intl","DateTimeFormat","year","month","getDate","hash","scrollTo","foundation","ready","params","configObj","configJson","getElementById","siteConfig","innerText","callbacks","mq","matchMedia","onchange","callback","matches","onload","tab","observer","MutationObserver","mutationList","mutation","contains","observe","attributeFilter","multiselect","checked","querySelectorAll","values","clearSelection","selector","CSS","emitChangeEvent","CustomEvent","bubbles","cancelable","dispatchEvent","selectAll","unchecked","multiselects","selectAllButton","querySelector","clearSelectionButton","ev","open","fieldset","bounding","getBoundingClientRect","bottom","relatedTarget","isOutside"],"mappings":"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","file":"eden-rock.js","sourcesContent":["/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t// character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","// prevent scroll\nif (location.hash) {\n window.scrollTo(0, 0);\n setTimeout(function () {\n window.scrollTo(0, 0);\n }, 1);\n}\n\n$(document).foundation();\n\n$(document).ready(function () {\n inlineSVGs(['.header__icons img']);\n initCookieMessage();\n initHeader();\n initFooter();\n initNavigation();\n initSubNavigation();\n initSliders();\n initDatePickers();\n initMaps();\n Multiselect.init();\n initPropertyListing();\n initContactForm();\n initFavourites();\n initHero();\n initIntro();\n initGallery();\n initRatesTables();\n initVideos();\n initYourStay();\n});\n\nvar config = (function () {\n var params = new URLSearchParams(window.location.search);\n\n // default config\n var configObj = {\n culture: 'en-GB',\n availabilityCalendar: {\n unit: 'night',\n unitPlural: 'nights',\n openButtonText: 'Open calendar'\n },\n pdfMode: params.get('pdf') === 'true'\n }\n\n var configJson = document.getElementById('site-config');\n\n if (configJson) {\n var siteConfig = JSON.parse(configJson.innerText);\n Object.assign(configObj, siteConfig);\n\n // specify language cultures if not set\n if (configObj.culture === 'fr') {\n configObj.culture === 'fr-FR'\n }\n if (configObj.culture === 'en') {\n configObj.culture === 'en-GB'\n }\n }\n\n return configObj;\n})();\n\nvar printWatcher = (function () {\n var callbacks = [];\n // check for print media query\n var mq = window.matchMedia('print');\n // execute callbacks on media query change\n // chrome and edge fire this a lot, future callbacks using these methods may need debouncing\n mq.onchange = function () {\n callbacks.forEach(function (callback) {\n callback(mq.matches);\n });\n };\n // execute callbacks on page load\n window.onload = function () {\n callbacks.forEach(function (callback) {\n callback(mq.matches);\n });\n };\n // push registered callbacks into collection\n return {\n onChange: function (callback) {\n callbacks.push(callback);\n }\n };\n})();\n\nvar tabWatcher = (function () {\n return {\n onChange: function (el, callback) {\n // check if element is in a tab.\n var tab = el.closest('.tabs-panel');\n if (tab) {\n // Foundation's tab API is tied to the tab bar, not the tab content, this is a workaround.\n var observer = new MutationObserver(function (mutationList) {\n mutationList.forEach(function (mutation) {\n if (mutation.attributeName === 'class' && mutation.target.classList.contains('is-active')) {\n callback();\n }\n });\n });\n // watch for the tab content class change\n observer.observe(tab, { attributes: true, attributeFilter: ['class'] });\n }\n }\n };\n})();\n\n// https://stackoverflow.com/questions/24933430/img-src-svg-changing-the-fill-color\nfunction inlineSVGs(inputValue) {\n var selectorString = '';\n if (typeof inputValue === 'object') {\n selectorString = inputValue.join(',');\n } else {\n selectorString = inputValue;\n }\n\n $(selectorString).each(function () {\n var $img = $(this);\n var imgID = $img.attr('id');\n var imgClass = $img.attr('class');\n var imgURL = $img.attr('src');\n\n if (imgURL.indexOf('.svg') > -1) {\n $.get(\n imgURL,\n function (data) {\n // Get the SVG tag, ignore the rest\n var $svg = $(data).find('svg');\n\n // Add replaced image's ID to the new SVG\n if (typeof imgID !== 'undefined') {\n $svg = $svg.attr('id', imgID);\n }\n // Add replaced image's classes to the new SVG\n if (typeof imgClass !== 'undefined') {\n $svg = $svg.attr('class', imgClass + ' replaced-svg');\n }\n\n // Remove any invalid XML tags as per http://validator.w3.org\n $svg = $svg.removeAttr('xmlns:a');\n\n // Check if the viewport is set, if the viewport is not set the SVG wont't scale.\n if (!$svg.attr('viewBox') && $svg.attr('height') && $svg.attr('width')) {\n $svg.attr('viewBox', '0 0 ' + $svg.attr('height') + ' ' + $svg.attr('width'));\n }\n\n // Replace image with new SVG\n $img.replaceWith($svg);\n },\n 'xml'\n );\n }\n });\n}\n\nfunction initCookieMessage() {\n // check if cookie message has already been accepted\n if (Cookies.get('cookie-message') === 'accepted') {\n return;\n }\n\n // initialise the cookie message\n $('.cookie')\n .on('click', function () {\n // set cookie to confirm message was accepted\n Cookies.set('cookie-message', 'accepted', { expires: 30 });\n\n // hide message\n $(this).removeClass('cookie--active');\n })\n .addClass('cookie--active');\n}\n\nfunction initHeader() {\n var stickAtOffset = 25;\n var stuck = false;\n var stuckClass = 'header--stuck';\n var headerMenuOpenClass = 'header--menu-open';\n\n var $header = $('header.header');\n var $navToggle = $('#navigation-toggle');\n\n function stickHeader() {\n if (stuck === false && window.pageYOffset > stickAtOffset) {\n stuck = true;\n $header.addClass(stuckClass);\n } else if (stuck === true && window.pageYOffset < stickAtOffset) {\n stuck = false;\n $header.removeClass(stuckClass);\n }\n }\n\n stickHeader();\n\n $(window).on('scroll', function () {\n stickHeader();\n });\n\n $navToggle.on('toggled.zf.responsiveToggle', function () {\n $header.toggleClass(headerMenuOpenClass);\n\n });\n\n $(window).on('changed.zf.mediaquery', function (e, newSize) {\n if (newSize === 'large') {\n $header.removeClass(headerMenuOpenClass);\n }\n });\n}\n\nfunction initFooter() {\n // fix the sticky book now button when the footer \"about\" menu is opened\n $('.footer__links button[data-toggle=\"footer-links\"]').on('click', function () {\n setTimeout(function () {\n $(window).trigger('resize');\n // Scroll to the bottom to reveal the full menu\n $('html, body').animate({ scrollTop: $('#footer-links').offset().top + 120 * 1 }, 500);\n }, 100);\n });\n}\n\nfunction initNavigation() {\n // stop body from scrolling when burger menu or property filters are open (copied from Foundation off-canvas)\n var stopScrolling = function (e) {\n e.preventDefault();\n };\n\n var recordScrollable = function (e) {\n if (this.scrollHeight !== this.clientHeight) {\n if (this.scrollTop === 0) {\n this.scrollTop = 1;\n }\n if (this.scrollTop === this.scrollHeight - this.clientHeight) {\n this.scrollTop = this.scrollHeight - this.clientHeight - 1;\n }\n }\n this.allowUp = this.scrollTop > 0;\n this.allowDown = this.scrollTop < this.scrollHeight - this.clientHeight;\n this.lastY = e.originalEvent.pageY;\n };\n\n var stopScrollPropagation = function (e) {\n var up = e.pageY < this.lastY;\n var down = !up;\n this.lastY = e.pageY;\n\n if ((up && this.allowUp) || (down && this.allowDown)) {\n e.stopPropagation();\n } else {\n e.preventDefault();\n }\n };\n\n $('body')\n .on('on.zf.toggler', function () {\n $(this).on('touchmove', stopScrolling);\n $('#navigation')\n .on('touchstart', recordScrollable)\n .on('touchmove', stopScrollPropagation);\n })\n .on('off.zf.toggler', function () {\n $(this).off('touchmove', stopScrolling);\n $('#navigation')\n .off('touchstart', recordScrollable)\n .off('touchmove', stopScrollPropagation);\n });\n}\n\nfunction initSubNavigation() {\n // toggle sub navigation dropdown on mobile\n if (Foundation.MediaQuery.is('small') || Foundation.MediaQuery.is('medium')) {\n $('.sub-navigation__list .sub-navigation__item').on('click', function (e) {\n var item = $(this);\n\n item.closest('.sub-navigation__list').toggleClass('sub-navigation__list--active');\n\n if (item.hasClass('is-active')) {\n e.preventDefault();\n return false;\n }\n });\n }\n}\n\nfunction initSliders() {\n // turn off entirely for PDF generation, to avoid empty pages at the end\n if (config.pdfMode) {\n return;\n }\n\n var slickOptions = {\n prevArrow: '',\n nextArrow: ''\n };\n\n var initialized = false;\n\n function buildSliders() {\n $('[data-slick]').slick(slickOptions).each(function () {\n var slider = $(this);\n\n // recalculate slider position if shown in a tab\n tabWatcher.onChange(this, function () {\n slider.slick('setPosition');\n });\n });\n\n $('.slider__scroll').on('click', function () {\n // scroll down to main content\n $('html, body').animate(\n {\n scrollTop: $(this)\n .prev('.slider')\n .outerHeight()\n },\n 500\n );\n });\n\n // Manual pagination for this module\n $('.grid-feature-text-image-paged').each(function () {\n var slider = $(this).find('.grid-feature-text-image-paged__slider');\n var count = 0;\n var total = slider.find('.grid-feature-text-image-paged__slide').length;\n\n if (total > 1) {\n slider.find('.grid-feature-text-image-paged__slide').each(function () {\n if (slider.data('dots')) {\n var dots = '
';\n for (var i = 0; i < total; i++) {\n if (count === i) {\n dots += '';\n } else {\n dots += '';\n }\n }\n dots += '
';\n\n $(this)\n .find('.grid-feature-text-image-paged__text.small-12')\n .append(dots);\n }\n\n count++;\n });\n }\n });\n\n $('.grid-feature-text-image-paged__prev').on('click', function () {\n $(this)\n .parents('.grid-feature-text-image-paged__slider')\n .slick('slickPrev');\n });\n\n $('.grid-feature-text-image-paged__next').on('click', function () {\n $(this)\n .parents('.grid-feature-text-image-paged__slider')\n .slick('slickNext');\n });\n\n $('.grid-feature-text-image-paged__dots button').on('click', function () {\n $(this)\n .parents('.grid-feature-text-image-paged__slider')\n .slick('slickGoTo', $(this).data('goto'));\n });\n\n // toggle second intro text block\n $('.grid-feature-text-image-paged__more button').on('click', function () {\n var btn = $(this);\n var div = btn.parent('.grid-feature-text-image-paged__more');\n var showLess = !div.hasClass('grid-feature-text-image-paged__more--less');\n div.prev('.grid-feature-text-image-paged__text').toggleClass('grid-feature-text-image-paged__text--more');\n div.toggleClass('grid-feature-text-image-paged__more--less');\n btn.text(showLess ? btn.data('less') : btn.data('more'));\n });\n\n initialized = true;\n }\n\n function destroySliders() {\n if (initialized) {\n $('[data-slick]').slick('unslick');\n initialized = false;\n }\n }\n\n printWatcher.onChange(function (isPrint) {\n if (isPrint) {\n destroySliders();\n } else {\n buildSliders();\n }\n });\n}\n\nfunction initDatePickers() {\n var easepickButtons = {\n nextMonthButton: '',\n prevMonthButton: '',\n resetButton: ''\n };\n\n $.fn.easepick = function (options) {\n var existing = $(this).data(\"_easepick\");\n if (existing) {\n return existing;\n }\n\n var settings = Object.assign({\n element: this[0],\n css: ['/assets/eden-rock-vendor.css'],\n lang: config.culture,\n format: 'DD/MM/YYYY',\n zIndex: 200,\n pending: [],\n unavailable: [],\n plugins: [\n 'RangePlugin',\n 'LockPlugin',\n 'KbdPlugin',\n 'AmpPlugin'\n ],\n locale: {\n nextMonth: easepickButtons.nextMonthButton,\n previousMonth: easepickButtons.prevMonthButton,\n resetButton: easepickButtons.resetButton\n },\n AmpPlugin: {\n resetButton: true,\n darkMode: false\n },\n KbdPlugin: {\n unitIndex: 0,\n dayIndex: 0,\n html: '\\\n \\\n \\\n '\n },\n LockPlugin: {\n minDate: new Date(),\n filter: function (date) {\n return isPending(date) || isUnavailable(date);\n },\n minDays: 2,\n inseparable: true\n },\n RangePlugin: {\n tooltipNumber: function (num) {\n return num - 1;\n },\n locale: {\n one: config.availabilityCalendar.unit,\n other: config.availabilityCalendar.unitPlural,\n }\n },\n setup: function (picker) {\n picker.on('view', function (e) {\n var rangeInfo = {};\n if (e.detail.view === 'CalendarDayName') {\n e.detail.target.textContent = e.detail.target.textContent.substring(0, 2);\n }\n if (e.detail.view === 'CalendarDay') {\n if (isUnavailable(e.detail.date, rangeInfo)) {\n if (rangeInfo.first === rangeInfo.last) {\n e.detail.target.classList.add('unavailable');\n } else {\n if (rangeInfo.first) {\n e.detail.target.classList.add('unavailable-first');\n }\n if (rangeInfo.last) {\n e.detail.target.classList.add('unavailable-last');\n }\n }\n }\n if (isPending(e.detail.date, rangeInfo)) {\n if (rangeInfo.first === rangeInfo.last) {\n e.detail.target.classList.add('pending');\n } else {\n if (rangeInfo.first) {\n e.detail.target.classList.add('pending-first');\n }\n if (rangeInfo.last) {\n e.detail.target.classList.add('pending-last');\n }\n }\n }\n }\n });\n }\n }, options);\n\n function isPending(date, rangeInfo) {\n var str = date ? date.format('YYYY-MM-DD') : null;\n return settings.pending.some(function (range) {\n if (rangeInfo) {\n if (str == range[0]) {\n rangeInfo.first = true;\n }\n if (str == range[1]) {\n rangeInfo.last = true;\n }\n return str >= range[0] && str <= range[1];\n }\n return str > range[0] && str < range[1];\n });\n }\n\n function isUnavailable(date, rangeInfo) {\n var str = date ? date.format('YYYY-MM-DD') : null;\n return settings.unavailable.some(function (range) {\n if (rangeInfo) {\n if (str == range[0]) {\n rangeInfo.first = true;\n }\n if (str == range[1]) {\n rangeInfo.last = true;\n }\n return str >= range[0] && str <= range[1];\n }\n return str > range[0] && str < range[1];\n });\n }\n\n var ep = new easepick.create(settings);\n $(this).data(\"_easepick\", ep);\n return ep;\n }\n}\n\nfunction initMaps() {\n $.fn.leaflet = function (markers, isMarkerValid) {\n var mapSettings = this.data('map')\n var inside = false;\n var padding = inside ? [100, 100] : [-250, -250];\n\n // this could be slightly different to the image bounds, but for now its set to the same\n var mapBounds = mapSettings.bounds;\n\n var map = L.map(this[0], {\n maxZoom: 16,\n zoom: 13,\n zoomSnap: 1,\n zoomDelta: 1,\n center: mapSettings.center,\n scrollWheelZoom: false,\n maxBoundsViscosity: 1,\n maxBounds: mapBounds,\n attributionControl: false,\n zoomControl: false,\n gestureHandling: true,\n gestureHandlingOptions: {\n duration: 0\n }\n });\n\n map.fitBounds(mapBounds);\n\n map.setMinZoom(map.getBoundsZoom(mapBounds, inside));\n\n var defaultZoom = map.getBoundsZoom(mapBounds, inside, padding);\n\n map.setZoom(defaultZoom);\n\n map.setView(mapSettings.center, defaultZoom);\n\n L.control\n .zoom({ position: 'bottomright' })\n .addTo(map);\n\n L.imageOverlay(mapSettings.map, mapSettings.bounds).addTo(map);\n\n var markerIcons = {\n default: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/pin-default.svg',\n iconSize: [20, 30],\n iconAnchor: [10, 30]\n }),\n defaultSelected: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/pin-selected.svg',\n iconSize: [20, 30],\n iconAnchor: [10, 30]\n }),\n branded: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/pin-branded.svg',\n iconSize: [46, 66],\n iconAnchor: [23, 66]\n }),\n airport: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-airport.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n beach: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-beach.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n gasStation: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-gas-station.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n hike: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-hike.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n hospital: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-hospital.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n pharmacy: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-pharmacy.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n restaurant: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-restaurant.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n shopping: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-shopping.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n viewPoint: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-view-point.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n }),\n watersports: L.icon({\n iconUrl: '/assets/img/eden-rock/maps/poi-watersports.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15]\n })\n }\n\n var markerCluster = L.markerClusterGroup({\n showCoverageOnHover: false,\n maxClusterRadius: 80,\n iconCreateFunction: function (cluster) {\n return L.divIcon({\n html: cluster._childCount,\n className: 'marker-cluster',\n iconSize: L.point(30, 44)\n });\n }\n });\n\n var poiCluster = L.markerClusterGroup({\n showCoverageOnHover: false,\n maxClusterRadius: 40,\n iconCreateFunction: function (cluster) {\n return L.divIcon({\n html: cluster._childCount,\n className: 'marker-cluster marker-cluster--poi',\n iconSize: L.point(30, 30)\n });\n }\n });\n\n markers.forEach(function (options) {\n options.icon = options.icon || 'default';\n\n var marker = L.marker([options.position.lat, options.position.lon], {\n type: options.icon,\n icon: markerIcons[options.icon]\n });\n\n marker.id = options.id;\n marker.data = options.data || {};\n\n // cluster markers except branded\n if (options.icon == 'branded') {\n marker.addTo(map);\n } else if (options.icon == 'default') {\n markerCluster.addLayer(marker);\n } else {\n poiCluster.addLayer(marker);\n }\n\n if (options.popup) {\n var popup = L.popup({\n offset: [0, -24],\n autoPanPaddingTopLeft: [40, 0],\n autoPanPaddingBottomRight: [0, 100]\n });\n\n popup.setContent(options.popup[0]);\n\n marker.bindPopup(popup);\n\n marker.on('popupopen', function (e) {\n if (marker.options.icon == 'default') {\n marker.setIcon(markerIcons['defaultSelected']);\n }\n\n // on mobile increase the map height to fit the whole popup\n var popupHeight = e.popup._container.offsetHeight;\n\n var mapHeight = map._container.offsetHeight;\n\n if (popupHeight > mapHeight) {\n map._container.style.minHeight = popupHeight + 40 + 'px';\n }\n\n // make sure that map bounds are big enough to fit popup as well\n var popupPixels = map.project(e.popup.getLatLng());\n\n var popupSouthWest = map.unproject([popupPixels.x - e.popup._container.offsetLeft, popupPixels.y]);\n\n var popupNorthEast = map.unproject([popupPixels.x + e.popup._container.offsetLeft, popupPixels.y + e.popup._container.offsetTop - 40]);\n\n var popupBounds = new L.LatLngBounds(popupSouthWest, popupNorthEast);\n\n var extendedBounds = new L.LatLngBounds(mapBounds).extend(popupBounds);\n\n map.setMaxBounds(extendedBounds);\n\n e.popup._adjustPan();\n });\n\n marker.on('popupclose', function (e) {\n if (marker.options.icon == 'default') {\n marker.setIcon(markerIcons['default']);\n }\n\n // reset back to normal map bounds\n map._container.style.minHeight = null;\n\n map.setMaxBounds(mapBounds);\n\n map.invalidateSize();\n });\n }\n });\n\n map.addLayer(markerCluster);\n\n map.addLayer(poiCluster);\n\n map.eachLayer(function (layer) {\n layer.on('unspiderfied', function (e) {\n e.cluster.setOpacity(e.cluster.valid ? 1 : 0.5);\n });\n });\n\n map._resize = function () {\n map.invalidateSize({ animate: false });\n defaultZoom = map.getBoundsZoom(mapBounds, inside, padding);\n map.setMinZoom(map.getBoundsZoom(mapBounds, inside));\n map.setView(mapSettings.center, defaultZoom);\n };\n\n map._validateMarkers = function () {\n if (isMarkerValid) {\n map.eachLayer(function (layer) {\n if (layer instanceof L.MarkerCluster) {\n // filter markers within the cluster\n var markers = layer.getAllChildMarkers();\n\n layer.valid = markers.length == 0;\n\n markers.forEach(function (marker) {\n var valid = isMarkerValid(marker);\n marker.closePopup();\n marker.setOpacity(valid ? 1 : 0.5);\n layer.valid = layer.valid || valid;\n });\n\n // set cluster opacity if all markers are invalid\n layer.setOpacity(layer.valid ? 1 : 0.5);\n } else if (layer instanceof L.Marker) {\n var valid = isMarkerValid(layer);\n layer.closePopup();\n layer.setOpacity(valid ? 1 : 0.5);\n }\n });\n }\n };\n\n // re-evaluate the validity of the clusters on zoom\n map.on('zoomend', function () {\n map._validateMarkers();\n });\n\n return map;\n }\n\n $('.property-map').each(function () {\n var $key = $(this).find('.property-map__key');\n var $map = $(this).find('.property-map__map');\n var $markers = $(this).find('.property-map__marker');\n\n var markers = $map.data('map').markers || [];\n\n // get markers with popups\n if ($markers.length) {\n markers = markers.concat($markers.map(function () {\n return {\n icon: $(this).data('icon'),\n position: $(this).data('position'),\n popup: $(this)\n };\n }).toArray());\n }\n\n var selectedKey = null;\n\n // initialize map\n var map = $map.leaflet(markers, function (marker) {\n return marker.id == 'eden-rock' || !selectedKey || marker.options.type == selectedKey;\n });\n\n if ($key.length) {\n // update map on key change\n $key.on('change', function () {\n selectedKey = $(this).find('input[name=\"key\"]:checked').val();\n map._validateMarkers();\n });\n }\n\n // recalculate map size on print\n printWatcher.onChange(function () {\n map._resize();\n });\n\n // recalculate map size on tab change\n tabWatcher.onChange($(this)[0], function () {\n map._resize();\n });\n });\n}\n\nfunction initPropertyListing() {\n if ($('.property-listing').length === 0) {\n return;\n }\n\n function removeEmpty(obj) {\n return Object.fromEntries(Object.entries(obj).filter(function (v) {\n return v[1] != null && v[1] != '' && (!Array.isArray(v[1]) || v[1].length > 0);\n }));\n }\n\n function writeQueryString() {\n var datePicker = $('.property-listing__filters-datepicker').easepick();\n var startDate = datePicker.getStartDate();\n var endDate = datePicker.getEndDate();\n\n var data = {\n view: $('.property-listing__views input[name=\"property-listing-view\"]:checked').val(),\n name: $('.property-listing__filters-field[name=\"villa-name\"]').val(),\n minPrice: $('.property-listing__filters-dropdown[name=\"min-price\"]').val(),\n maxPrice: $('.property-listing__filters-dropdown[name=\"max-price\"]').val(),\n categories: Multiselect.getValues($('.property-listing__filters-multiselect[data-name=\"categories\"]')[0]),\n facilities: Multiselect.getValues($('.property-listing__filters-multiselect[data-name=\"facilities\"]')[0]),\n locations: Multiselect.getValues($('.property-listing__filters-multiselect[data-name=\"locations\"]')[0]),\n rooms: Multiselect.getValues($('.property-listing__filters-multiselect[data-name=\"rooms\"]')[0]),\n fromDate: startDate && startDate.format('YYYY-MM-DD'),\n toDate: endDate && endDate.format('YYYY-MM-DD')\n };\n\n // defaults\n if (data.view == \"list\") {\n data.view = null;\n }\n\n data = removeEmpty(data);\n\n var searchParams = new URLSearchParams();\n\n Object.keys(data).forEach(function (key) {\n var value = data[key];\n if (Array.isArray(value)) {\n value.forEach(function (valueItem) {\n searchParams.append(key, valueItem);\n });\n } else {\n searchParams.append(key, value);\n }\n });\n\n var searchParamsStr = searchParams.toString();\n\n var newUrl = window.location.origin + window.location.pathname;\n\n if (searchParamsStr.length > 0) {\n newUrl += '?' + searchParamsStr;\n }\n\n // so we can identify this is a property listing popstate event\n data[\"source\"] = \"property listing\";\n\n if (newUrl != window.location.href) {\n window.history.pushState(data, '', newUrl);\n }\n }\n\n function readQueryString(data) {\n var searchParams = new URLSearchParams(window.location.search);\n\n var data = data || {\n view: searchParams.get(\"view\"),\n name: searchParams.get(\"name\"),\n minPrice: searchParams.get(\"minPrice\"),\n maxPrice: searchParams.get(\"maxPrice\"),\n categories: searchParams.getAll(\"categories\"),\n facilities: searchParams.getAll(\"facilities\"),\n locations: searchParams.getAll(\"locations\"),\n rooms: searchParams.getAll(\"rooms\"),\n fromDate: searchParams.get(\"fromDate\"),\n toDate: searchParams.get(\"toDate\")\n };\n\n $('.property-listing__views input[name=\"property-listing-view\"][value=\"' + (data.view || \"list\") + '\"]').prop('checked', true);\n $('.property-listing__filters-field[name=\"villa-name\"]').val(data.name);\n $('.property-listing__filters-dropdown[name=\"min-price\"]').val(data.minPrice);\n $('.property-listing__filters-dropdown[name=\"max-price\"]').val(data.maxPrice);\n Multiselect.setValues($('.property-listing__filters-multiselect[data-name=\"categories\"]')[0], data.categories || []);\n Multiselect.setValues($('.property-listing__filters-multiselect[data-name=\"facilities\"]')[0], data.facilities || []);\n Multiselect.setValues($('.property-listing__filters-multiselect[data-name=\"locations\"]')[0], data.locations || []);\n Multiselect.setValues($('.property-listing__filters-multiselect[data-name=\"rooms\"]')[0], data.rooms || []);\n\n var datePicker = $('.property-listing__filters-datepicker').easepick();\n\n if (data.fromDate) {\n datePicker.setStartDate(new Date(data.fromDate));\n } else if (datePicker.getStartDate() != null) {\n datePicker.clear();\n }\n\n if (data.toDate) {\n datePicker.setEndDate(new Date(data.toDate));\n } else if (datePicker.getEndDate() != null) {\n datePicker.clear();\n }\n }\n\n var villaVisibility = {};\n\n var selectedName = $('.property-listing__filters-field[name=\"villa-name\"]');\n var selectedMinPrice = $('.property-listing__filters-dropdown[name=\"min-price\"]');\n var selectedMaxPrice = $('.property-listing__filters-dropdown[name=\"max-price\"]');\n var selectedCategories = $('.property-listing__filters-multiselect[data-name=\"categories\"]');\n var selectedFacilities = $('.property-listing__filters-multiselect[data-name=\"facilities\"]');\n var selectedLocations = $('.property-listing__filters-multiselect[data-name=\"locations\"]');\n var selectedRooms = $('.property-listing__filters-multiselect[data-name=\"rooms\"]');\n\n var selectedArrivalDate = null;\n var selectedDepartureDate = null;\n\n var map = null;\n\n var $propertyListingMap = $('#property-listing-map');\n\n if ($propertyListingMap.length > 0) {\n var markers = $propertyListingMap.data('map').markers || [];\n\n // map markers\n markers = markers.concat($('.property-listing__map-marker').map(function () {\n return {\n id: $(this).data('id'),\n icon: $(this).data('icon'),\n position: $(this).data('position'),\n popup: $(this)\n };\n }).toArray());\n\n // initialize map\n map = $propertyListingMap.leaflet(markers, function (marker) {\n return marker.id == 'eden-rock' || villaVisibility[marker.id];\n });\n }\n\n var selectedView = $('.property-listing__views input[name=\"property-listing-view\"]:checked').val();\n\n // change view after selecting view option\n $('.property-listing__views input[name=\"property-listing-view\"]').on('change', function () {\n // set the selected view\n selectedView = $(this).val();\n\n // replace old listing class with new one\n $('.property-listing')[0].className = $('.property-listing')[0].className.split(' ').map(function (c) {\n return c.startsWith('property-listing--') ? 'property-listing--' + selectedView : c;\n }).join(' ');\n\n writeQueryString();\n\n // trigger resize event\n $('.property-listing__wrapper').trigger('resized');\n\n if (map && selectedView == 'map') {\n map._resize();\n }\n });\n\n // trigger resize event\n $('.property-listing__filters').on('opened.zf.offcanvas closed.zf.offcanvas', function () {\n $('.property-listing__wrapper').trigger('resized');\n });\n\n $('.property-listing__wrapper').on('resized', function () {\n // make sure the off canvas wrapper is at least the height of the filter pane\n var wrapper = $(this);\n var offCanvas = wrapper.find('.property-listing__filters');\n wrapper.css('min-height', offCanvas.height() + 30);\n\n // resize the map\n if (map) {\n map.invalidateSize();\n }\n });\n\n var picker = $('.property-listing__filters-datepicker').easepick();\n\n picker.on('select', function (e) {\n selectedArrivalDate = e.detail.start;\n selectedDepartureDate = e.detail.end;\n\t\t\n\t\tselectedArrivalDate.setUTCHours(0);\n\t\tselectedDepartureDate.setUTCHours(0);\n\t\t\n filterProperties(true);\n });\n\n picker.on('clear', function () {\n selectedArrivalDate = null;\n selectedDepartureDate = null;\n filterProperties(true);\n });\n\n function filterProperties(writeQs) {\n writeQs && writeQueryString();\n\n // prevent invalid max price\n selectedMaxPrice.find('option').each(function () {\n var disabled = parseInt($(this).val()) < parseInt(selectedMinPrice.val());\n $(this).prop('disabled', disabled);\n $(this).prop('selected', !disabled && $(this).is(':selected'));\n });\n\n // get selected filters\n var filterName = selectedName.val();\n var filterMinPrice = parseInt(selectedMinPrice.val() || '0');\n var filterMaxPrice = parseInt(selectedMaxPrice.val() || '0');\n var filterCategories = Multiselect.getValues(selectedCategories[0]);\n var filterFacilities = Multiselect.getValues(selectedFacilities[0]);\n var filterLocations = Multiselect.getValues(selectedLocations[0]);\n var filterRooms = Multiselect.getValues(selectedRooms[0]);\n var filterArrivalDate = selectedArrivalDate;\n var filterDepartureDate = selectedDepartureDate;\n\n var favourites = JSON.parse(window.localStorage.getItem('favourites')) || [];\n\n // apply filters to all listed villas\n var villas = $('.property-listing__item');\n\n villas.each(function () {\n var villa = $(this);\n\n var valid = true;\n\n var id = villa.data('id');\n var name = villa.data('name');\n var price = villa.data('price');\n var categories = villa.data('categories').split(',');\n var facilities = villa.data('facilities').split(',');\n var location = villa.data('location').split(',');\n var rooms = villa.data('rooms').toString().split(',');\n var disabledDates = villa.data('disabled-dates');\n\n if (filterName && name) {\n valid = filterName.split(' ').every(function (term) {\n return name.toLowerCase().includes(term.toLowerCase());\n });\n }\n\n if (valid && ((filterMinPrice && price < filterMinPrice) || (filterMaxPrice && price > filterMaxPrice))) {\n valid = false;\n }\n\n if (valid && filterCategories && filterCategories.length > 0 && categories) {\n valid = Array.from(categories).some(function (x) { return filterCategories.includes(x); });\n }\n\n if (valid && filterFacilities && filterFacilities.length > 0 && facilities) {\n valid = filterFacilities.every(function (x) { return facilities.includes(x); });\n }\n\n if (valid && filterLocations && filterLocations.length > 0 && location) {\n valid = Array.from(location).some(function (x) { return filterLocations.includes(x); });\n }\n\n if (valid && filterRooms && filterRooms.length > 0 && rooms) {\n valid = Array.from(rooms).some(function (x) { return filterRooms.includes(x); });\n }\n\n if (valid && filterArrivalDate && filterDepartureDate && disabledDates && disabledDates.length > 0) {\n // check that villa doesn't have disabled periods during the selected arrival and departure dates\n disabledDates.forEach(function (dd) {\n var startDate = new Date(dd.start + 'T00:00');\n var endDate = new Date(dd.end + 'T00:00');\n\n if (\n (filterArrivalDate >= startDate && filterArrivalDate < endDate) ||\n (filterDepartureDate > startDate && filterDepartureDate <= endDate) ||\n (filterArrivalDate < startDate && filterDepartureDate > endDate)\n ) {\n valid = false;\n }\n });\n }\n\n if (selectedView === 'loved') {\n valid = favourites.includes(id);\n }\n\n // toggle visibility class based on filter checks\n villa.toggleClass('property-listing__item--hidden', !valid);\n\n villaVisibility[id] = valid;\n });\n\n // update map markers\n if (map) {\n map._validateMarkers();\n }\n\n // get the number of valid items\n var numVisibleVillas = villas.not('.property-listing__item--hidden').length;\n\n // show message when no matches have been found\n $('.no-results').removeClass('no-results--active');\n\n if (numVisibleVillas === 0) {\n $('.no-results--' + selectedView).addClass('no-results--active');\n }\n }\n\n $('.property-listing__views input[name=\"property-listing-view\"], .property-listing__filters-field, .property-listing__filters-dropdown, .property-listing__filters-multiselect').on('change', function () {\n filterProperties(true);\n });\n\n window.addEventListener(\"popstate\", function (event) {\n if (event.state && event.state[\"source\"] == \"property listing\") {\n readQueryString(event.state);\n }\n });\n\n readQueryString();\n\n filterProperties(false);\n}\n\nfunction initContactForm() {\n $('.contact-form__date input').each(function () {\n var form = $(this).closest('form');\n var arrivalDate = form.find('input[name=\"arrivalDate\"]');\n var departureDate = form.find('input[name=\"departureDate\"]');\n\n var picker = $(this).easepick({\n RangePlugin: {\n startDate: arrivalDate.val(),\n endDate: departureDate.val()\n }\n });\n\n picker.on('select', function (e) {\n arrivalDate.val(e.detail.start.toISOString());\n departureDate.val(e.detail.end.toISOString());\n });\n\n picker.on('clear', function () {\n arrivalDate.val(null);\n departureDate.val(null);\n });\n });\n}\n\nfunction initFavourites() {\n var favourites = JSON.parse(localStorage.getItem('favourites')) || [];\n var favouriteButtons = $('[data-favourite]');\n var lovedVillasButton = $('header .loved-villas-button');\n var lovedVillasButtonText = lovedVillasButton.find('.loved-villas-button__count');\n\n favouriteButtons.on('click', function (e) {\n e.preventDefault();\n // get id from data attr\n var id = $(this).data('favourite');\n // update loved villas list\n addOrRemove(id);\n // update button states\n updateState();\n });\n\n function addOrRemove(id) {\n // check if it exists in the list\n var exists = favourites.includes(id);\n // remove if exists, else add\n if (exists) {\n favourites.splice(favourites.indexOf(id), 1);\n } else {\n favourites.push(id);\n }\n // update array in localstorage\n localStorage.setItem('favourites', JSON.stringify(favourites));\n }\n\n function updateState() {\n // update loved villas button\n lovedVillasButtonText.html(favourites.length + ' ');\n lovedVillasButton.toggleClass('toggled', !!favourites.length);\n // update favourite buttons\n favouriteButtons.each(function () {\n var id = $(this).data('favourite');\n $(this).toggleClass('toggled', favourites.includes(id));\n });\n }\n\n updateState();\n}\n\nfunction initHero() {\n var videoMobile = $('.mobile-hero-video')\n var videoDesktop = $('.desktop-hero-video')\n if (window.innerWidth > 640) {\n videoDesktop.attr('src', videoDesktop.data('src'))\n } else {\n videoMobile.attr('src', videoMobile.data('src'))\n }\n}\n\nfunction initIntro() {\n // toggle second intro text block\n $('.intro__more button').on('click', function () {\n var btn = $(this);\n var div = btn.parent('.intro__more');\n var showLess = !div.hasClass('intro__more--less');\n\n div.prev('.intro__text').toggleClass('intro__text--more');\n div.toggleClass('intro__more--less');\n\n btn.text(showLess ? btn.data('less') : btn.data('more'));\n });\n}\n\nfunction initGallery() {\n $('.gallery-modal')\n .on('open.zf.reveal', function (e) {\n $('body').addClass('gallery-modal-open');\n\n $(this)\n .find('img[data-src]')\n .each(function (i, el) {\n $(el)\n .attr('src', $(el).data('src'))\n .removeAttr('data-src');\n });\n\n $(this)\n .find('iframe[data-src]')\n .each(function (i, el) {\n $(el).attr('src', $(el).data('src'));\n });\n\n var slider = $(this).find('.slider');\n\n slider\n .not('.slick-initialized')\n .slick({\n slidesToShow: 1,\n slidesToScroll: 1,\n arrows: true,\n infinite: false,\n prevArrow: '',\n nextArrow: ''\n })\n .slick('slickFilter', ':not(.hide)')\n .on('afterChange', function (e) {\n var slick = $(this).slick('getSlick');\n\n var autoplayVideos = $(window).outerWidth() >= 900;\n\n slick.$slides.each(function (i, slide) {\n if (i === slick.currentSlide) {\n // start video on current slide\n if (autoplayVideos) {\n var video = $(slide).find('video.mejs__player');\n\n if (video.length > 0) {\n video.data('mediaelementplayer').load();\n }\n }\n } else {\n // pause video on hidden slide\n var video = $(slide).find('video.mejs__player');\n\n if (video.length > 0) {\n video.data('mediaelementplayer').pause();\n }\n }\n });\n });\n\n var videos = slider.find('video.mejs__player');\n\n if (videos.length > 0) {\n videos.data('mediaelementplayer').load();\n }\n\n slider.slick('slickGoTo', $(this).data('start-slide-index') || 0, true);\n\n slider.slick('refresh');\n\n $(this).trigger('resizeme.zf.trigger');\n })\n .on('closed.zf.reveal', function (e) {\n $('body').removeClass('gallery-modal-open');\n $(this)\n .find('iframe[data-src]')\n .attr('src', '');\n });\n\n $('[data-open][data-slide-index]').on('click', function (e) {\n var modal = $('#' + $(this).data('open'));\n modal.data('start-slide-index', $(this).data('slide-index'));\n });\n\n // show images on mobile when they come into view\n $('.small-gallery img[data-scroll]').on('scrollme.zf.trigger', function (e, target, scroll) {\n if (target.offset().top - 100 > scroll + window.innerHeight) {\n // still out of view\n return;\n }\n // coming into view, so load image\n target.off('scrollme.zf.trigger');\n });\n\n var scrollTop = $(window).scrollTop();\n\n $('.small-gallery img[data-scroll]').each(function () {\n var el = $(this);\n el.trigger('scrollme.zf.trigger', [el, scrollTop]);\n });\n}\n\nfunction initRatesTables() {\n var timer;\n\n function debounce(target) {\n clearTimeout(timer);\n timer = setTimeout(target, 250);\n }\n\n var $tabs = $('.rates [data-tabs]');\n\n if ($tabs.length) {\n $(window).on('load resize orientationchange', function () {\n // debounce to avoid initializing slick multiple times\n debounce(function () {\n // get each set of rate table tabs\n $tabs.each(function () {\n if ($(window).width() < 1024) {\n // ensure slick is not already initialized\n if (!$(this).hasClass('slick-initialized')) {\n // initialize slick\n var slider = $(this).slick({\n arrows: true,\n draggable: true,\n infinite: false,\n mobileFirst: true,\n slidesToShow: 1\n });\n\n // select tab on slide change\n slider.on('beforeChange', function (e, slick, currentSlide, nextSlide) {\n slick.$slides.get(nextSlide).click();\n });\n\n // get current rate table tab\n var activeTab = $('.rates [data-tabs-content=\"' + $(this).prop('id') + '\"] .is-active');\n\n // set slick slide to current tab\n if (activeTab) {\n $(this).slick('slickGoTo', activeTab.index());\n }\n }\n } else if ($(this).hasClass('slick-initialized')) {\n $(this).slick('unslick');\n }\n });\n });\n });\n }\n}\n\nfunction initVideos() {\n // start video when clicking play button\n $('.video__play').on('click', function () {\n var btn = $(this);\n var wrapper = btn.closest('.video__wrapper');\n var video = btn.next('.video__video').find('video');\n var iframe = btn.next('.video__video').find('iframe');\n\n if (video.length === 1) {\n video.get(0).play();\n } else if (iframe.length === 1) {\n iframe.attr('src', iframe.data('src'));\n }\n\n wrapper.addClass('video__wrapper--playing');\n });\n}\n\nfunction initYourStay() {\n $('.your-stay').each(function () {\n var el = $(this);\n\n var arrivalDate = el.find('.enquiry-form__field--arrive');\n var arrivalDay = el.find('.enquiry-form__output--arrive .enquiry-form__output__day');\n var arrivalMonth = el.find('.enquiry-form__output--arrive .enquiry-form__output__month-year');\n\n var departureDate = el.find('.enquiry-form__field--depart');\n var departureDay = el.find('.enquiry-form__output--depart .enquiry-form__output__day');\n var departureMonth = el.find('.enquiry-form__output--depart .enquiry-form__output__month-year');\n\n var datePicker = el.parent().find('.inline-datepicker');\n\n var picker = datePicker.easepick({\n grid: 2,\n calendars: 4,\n inline: true,\n pending: datePicker.data('pending') || [],\n unavailable: datePicker.data('unavailable') || [],\n AmpPlugin: {\n resetButton: false,\n darkMode: false\n }\n });\n\n picker.on('select', function (e) {\n el.removeClass('hide');\n\n var monthYearFormatter = new Intl.DateTimeFormat(config.culture, {\n year: 'numeric',\n month: 'long'\n });\n\n arrivalDate.val(e.detail.start.toISOString());\n arrivalDay.text(e.detail.start.getDate());\n arrivalMonth.text(monthYearFormatter.format(e.detail.start));\n\n departureDate.val(e.detail.end.toISOString());\n departureDay.text(e.detail.end.getDate());\n departureMonth.text(monthYearFormatter.format(e.detail.end));\n });\n });\n}\n\nvar Multiselect = (function () {\n function getValues(multiselect) {\n if (multiselect) {\n var checked = multiselect.querySelectorAll('input[type=checkbox]:checked');\n return Array.from(checked).map(function (e) {\n return e.value;\n });\n }\n }\n\n function setValues(multiselect, values) {\n if (multiselect) {\n clearSelection(multiselect);\n\n var selector = values.map(function (value) {\n return 'input[type=checkbox][value=\"' + CSS.escape(value) + '\"]';\n }).join(',');\n\n if (selector) {\n multiselect.querySelectorAll(selector).forEach(function (e) {\n e.checked = true;\n });\n }\n }\n }\n\n function emitChangeEvent(multiselect) {\n var event = new CustomEvent('change', {\n bubbles: false,\n cancelable: false,\n detail: {\n getValues: function () {\n return getValues(multiselect);\n }\n }\n });\n\n multiselect.dispatchEvent(event);\n }\n\n function selectAll(multiselect) {\n var unchecked = multiselect.querySelectorAll('input[type=checkbox]:not(:checked)');\n if (unchecked.length > 0) {\n unchecked.forEach(function (e) {\n e.checked = true;\n });\n }\n }\n\n function clearSelection(multiselect) {\n var checked = multiselect.querySelectorAll('input[type=checkbox]:checked');\n if (checked.length > 0) {\n checked.forEach(function (e) {\n e.checked = false;\n });\n }\n }\n\n function init() {\n var multiselects = document.querySelectorAll('.er-multiselect');\n\n multiselects.forEach(function (e, i) {\n // setup select all and clear buttons\n var selectAllButton = e.querySelector('.er-multiselect__button--select-all');\n if (selectAllButton) {\n selectAllButton.addEventListener('click', function () {\n selectAll(e);\n emitChangeEvent(e);\n });\n }\n\n var clearSelectionButton = e.querySelector('.er-multiselect__button--clear');\n if (clearSelectionButton) {\n clearSelectionButton.addEventListener('click', function () {\n clearSelection(e);\n emitChangeEvent(e);\n });\n }\n\n // bubble up change events\n e.querySelectorAll('input[type=checkbox]').forEach(function (item) {\n item.addEventListener('change', function (ev) {\n ev.detail = {\n getValues: function () {\n return getValues(e);\n }\n };\n });\n });\n\n // handle window overflow\n e.addEventListener('toggle', function (ev) {\n if (e.open) {\n var fieldset = e.querySelector('fieldset');\n var bounding = fieldset.getBoundingClientRect();\n if (bounding.top + bounding.height > window.innerHeight) {\n fieldset.style.bottom = e.offsetHeight + 'px';\n }\n }\n });\n\n // handle de-focus\n e.addEventListener('focusout', function (ev) {\n if (e.open && ev.relatedTarget && e != ev.relatedTarget && !e.contains(ev.relatedTarget)) {\n e.open = false;\n }\n });\n });\n\n // handle de-focus when clicking outside\n document.addEventListener('click', function (ev) {\n var target = ev.relatedTarget || ev.target;\n var isOutside = target.closest('.er-multiselect') == null;\n\n if (isOutside) {\n multiselects.forEach(function (e, i) {\n e.open = false;\n });\n }\n });\n }\n\n return {\n init: init,\n getValues: getValues,\n setValues: setValues,\n selectAll: selectAll,\n clearSelection: clearSelection\n };\n})();"],"sourceRoot":"/source/"}