{"version":3,"file":"js/6618-d74798b0f33e472ce631-v10.js","mappings":"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","sources":["webpack:///./app/javascript/legacy/views/carousels/ImageCarouselGallery.js","webpack:///./app/javascript/legacy/views/carousels/ImageCarousel.js","webpack:///./app/javascript/legacy/views/listings/EmailSignupModals.js","webpack:///./app/javascript/legacy/lib/GoogleMapsAPI.js","webpack:///./app/javascript/legacy/lib/LotLines.js","webpack:///./app/javascript/components/GoogleMap/estately-map-styles.js","webpack:///./app/javascript/legacy/views/listings/GoogleMap.js","webpack:///./app/javascript/legacy/views/listings/InfoModals.js","webpack:///./app/javascript/legacy/views/listings/InfoPopover.js","webpack:///./app/javascript/legacy/views/listings/LastCheckedTimeStamp.js","webpack:///./app/javascript/legacy/views/listings/ListingNavigation.js","webpack:///./app/javascript/legacy/views/listings/ListTrac.js","webpack:///./app/javascript/legacy/views/listings/MonthlyCostEstimate.js","webpack:///./app/javascript/legacy/views/listings/ReportProblemForm.js","webpack:///./app/javascript/legacy/lib/SaveHideAPI.js","webpack:///./app/javascript/legacy/views/listings/SaveHideListing.js","webpack:///./app/javascript/legacy/views/listings/ShowingRequestCheckoutModal.js","webpack:///./app/javascript/legacy/views/listings/ShowingRequestForms.js","webpack:///./app/javascript/legacy/views/listings/SmoothScroller.js","webpack:///./app/javascript/legacy/pages/ListingPage.js","webpack:///./app/javascript/lib/polyfills/halveStringBlock.js","webpack:///./app/javascript/legacy/views/carousels/CardCarousel.js","webpack:///./app/javascript/legacy/views/carousels/CarouselScroller.js","webpack:///./app/javascript/legacy/views/carousels/ListingCardCarousel.js"],"sourcesContent":["import $ from 'legacy/vendor/jquery.custom'\n\nimport CarouselScroller from 'legacy/views/carousels/CarouselScroller'\n\nexport default class ImageCarouselGallery {\n currentPage = 0\n\n constructor($carousel, totalImages) {\n this.$carousel = $carousel\n this.totalImages = totalImages\n this.$clickedElm = null\n this.$modal = $('.js-image-carousel-gallery')\n this.$counter = this.$modal.find('.image-carousel-gallery-counter')\n }\n\n createDOM() {\n requestAnimationFrame(() => {\n // Clone carousel content\n const $scrollerContent = this.$carousel.find('.carousel-scroller-wrapper').clone()\n $scrollerContent.attr({ role: 'region', 'aria-label': 'carousel' })\n\n const srOnlyText = 'This is a carousel with property images. Use the previous and next buttons to navigate.'\n $scrollerContent.find('p.sr-only').text(srOnlyText)\n\n $scrollerContent.find('.js-carousel-scroller > li')\n .attr('role', 'group')\n .attr('aria-label', index => `${index + 1} of ${this.totalImages}`)\n\n // Change it for the gallery\n $scrollerContent.find('.js-carousel-scroller > li > img')\n .removeAttr('sizes')\n .removeAttr('src')\n .removeAttr('srcset')\n .removeAttr('role')\n .attr('data-expand', 50)\n .attr('class', 'js-lazyload')\n .attr('alt', (_, value) => value.replace(' Opens carousel modal', ''))\n\n // Insert into the modal\n this.$modal.find('.modal-body:empty').append($scrollerContent)\n\n // Set up data\n this.scroller = new CarouselScroller(this.$modal)\n\n // Attach events\n this.$modal\n .on(CarouselScroller.EVENTS.ITEM_CHANGE, () => this.updateCounter())\n .on('show.bs.modal hide.bs.modal', this.toggleKeyboardEvents)\n .on('hidden.bs.modal', () => {\n if (this.$clickedElm) this.$clickedElm.focus()\n\n this.$clickedElm = null\n })\n })\n }\n\n setClickedElm($clickedElm) {\n this.$clickedElm = $clickedElm || null\n }\n\n toggleKeyboardEvents = (modalEvent) => {\n $(window)[modalEvent.type === 'show' ? 'on' : 'off']('keydown.gallery', (event) => {\n // eslint-disable-next-line default-case\n switch (event.key) {\n case 'Escape': this.$modal.modal('hide'); break\n case 'ArrowLeft': this.scroller.prev({ smooth: false }); event.preventDefault(); break\n case 'ArrowRight': this.scroller.next({ smooth: false }); event.preventDefault(); break\n }\n })\n }\n\n // TODO: This duplicates ImageCarousel; should dedupe\n updateCounter() {\n requestAnimationFrame(() => {\n const currentItemNumber = this.scroller.lastItemInViewport + 1\n const currentItemIsImage = currentItemNumber <= this.totalImages\n const imageNumber = Math.min(currentItemNumber, this.totalImages)\n\n this.$counter\n .text(`${imageNumber} of ${this.totalImages}`)\n .toggleClass('in', currentItemIsImage) // Hide counter on CTA Page\n\n // Set aria-hidden: true/false when cycling images through modal\n $(this.$imageListItem).each((_, el) => {\n if ($(el).attr('aria-hidden') === 'false') {\n $(el).attr('aria-hidden', true)\n $(el).find('img').attr('tabindex', '-1')\n }\n })\n $(this.$imageListItem[currentItemNumber - 1]).attr('aria-hidden', false)\n $(this.$imageListItem[currentItemNumber - 1]).find('img').attr('tabindex', '0')\n\n this.setCtaBtnTabIndexAttribute(currentItemNumber)\n })\n }\n\n openTo({ image: imgIndex }) {\n requestAnimationFrame(() => {\n const destinationImage =\n this.$modal.find('.carousel-scroller > li').get(imgIndex)\n this.$imageListItem = this.$modal.find('.js-carousel-scroller li')\n\n this.$modal.modal('show')\n this.scroller.onResize()\n\n if (destinationImage) destinationImage.scrollIntoView({ block: 'center' })\n\n this.$imageListItem.find(\"[tabindex='0']\").each(function removeTabindex() {\n $(this).attr('tabindex', '-1')\n })\n\n // Set aria-hidden: true/false for images displaying off/on modal on load\n $(this.$imageListItem).each(function setAria(index) {\n const isImageOnModal = (index === imgIndex)\n $(this).attr('aria-hidden', !isImageOnModal)\n $(this).find('img').attr('tabindex', !isImageOnModal ? '-1' : '0')\n })\n\n this.currentPage = imgIndex + 1\n })\n }\n\n setCtaBtnTabIndexAttribute(currentItemNumber) {\n // Set tabindex: -1/0 when cycling images through modal\n const itemLength = $(this.$imageListItem).length\n const $ctaSlideBtn = $(this.$imageListItem[itemLength - 1]).find('button')\n\n if (currentItemNumber === itemLength) {\n $ctaSlideBtn.attr('tabindex', 0)\n return\n }\n\n $ctaSlideBtn.attr('tabindex', -1)\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport CarouselScroller from './CarouselScroller'\nimport ImageCarouselGallery from './ImageCarouselGallery'\n\n\nexport default class ImageCarousel {\n hadFirstInteraction = false\n\n constructor() {\n this.$clickedElm = null // when an image is clicked, we need to store it to set focus on it on close\n\n // Set up data\n this.$carousel = $('.js-image-carousel')\n this.$counter = this.$carousel.find('.image-carousel-counter')\n this.$carouselTiles = this.$carousel.find('.js-carousel-scroller li')\n\n this.scroller = new CarouselScroller(this.$carousel)\n\n this.totalImages = this.scroller.totalItems\n\n if (this.$carousel.find('.image-carousel-cta').length) this.totalImages -= 1\n\n\n // Attach Events\n\n const interactionEvents = ['click', 'touchstart', 'pointerdown', 'wheel', 'keydown']\n interactionEvents.forEach(event => this.$carousel[0].addEventListener(\n event,\n this.onFirstInteraction,\n { once: true, passive: true },\n ))\n\n this.$carousel\n .on('click', '.js-carousel-scroller > li:not(.image-carousel-cta)', this.onImageClick)\n .on('keydown', '.js-carousel-scroller > li:not(.image-carousel-cta)', this.onImageKeyDown)\n .on('keyup', '.js-carousel-scroller > li:not(.image-carousel-cta)', this.onImageKeyUp)\n .on(CarouselScroller.EVENTS.ITEM_CHANGE, () => this.updateCounter())\n\n\n // Render\n\n // Only update the counter if there’s more than one image per page\n if (this.totalImages > this.scroller.totalPages) {\n this.updateCounter()\n } else {\n this.setImageAccessibilityAttributes()\n this.setCtaBtnTabIndexAttribute()\n }\n }\n\n onFirstInteraction = () => {\n if (this.hadFirstInteraction) return\n\n this.hadFirstInteraction = true\n\n this.gallery = new ImageCarouselGallery(this.$carousel, this.totalImages)\n this.gallery.createDOM()\n }\n\n onImageClick = (event) => {\n this.$clickedElm = $(event.currentTarget)\n\n this.gallery.setClickedElm(this.$clickedElm.find('img'))\n this.gallery.openTo({ image: this.$clickedElm.index() })\n }\n\n onImageKeyDown = (event) => {\n // Prevent default scrolling action of space on keydown\n if (event.key === ' ') event.preventDefault()\n }\n\n onImageKeyUp = (event) => {\n // Enable space/return “clicks” (e.g. keyboard navigation)\n if (event.key === ' ' || event.key === 'Enter') this.onImageClick(event)\n }\n\n updateCounter() {\n requestAnimationFrame(() => {\n const currentItemNumber = this.scroller.lastItemInViewport + 1\n const iscurrentItemImage = currentItemNumber <= this.totalImages\n const imageNumber = Math.min(currentItemNumber, this.totalImages)\n\n this.$counter\n .text(`${imageNumber} of ${this.totalImages}`)\n .toggleClass('in', iscurrentItemImage) // Hide counter on CTA Page\n\n this.setImageAccessibilityAttributes(currentItemNumber, this.scroller.firstItemInViewport)\n this.setCtaBtnTabIndexAttribute(currentItemNumber)\n })\n }\n\n setImageAccessibilityAttributes(slideNumber = 0, firstItem = 0) {\n $(this.$carouselTiles).each(function setAria(index) {\n // Set aria-hidden: false for listings with 1 image\n if (!slideNumber && !firstItem) {\n $(this).attr('aria-hidden', false)\n return\n }\n\n // Set aria-hidden: true/false for images displaying off/on screen\n const ariaHiddenValue = ((index < slideNumber) && (index >= firstItem))\n\n $(this).attr('aria-hidden', !ariaHiddenValue)\n $(this).find('img').attr('tabindex', !ariaHiddenValue ? '-1' : '0')\n })\n }\n\n setCtaBtnTabIndexAttribute(slideNumber = 0) {\n const itemLength = $(this.$carouselTiles).length\n const $ctaSlideBtn = $(this.$carouselTiles[itemLength - 1]).find('button')\n\n $(this.$carouselTiles).each((index) => {\n // Set tabindex: 0 to CTA button for listings with 1 image\n if (!slideNumber) {\n $ctaSlideBtn.attr('tabindex', 0)\n return\n }\n\n // Set tabindex: -1/0 to CTA button when CTA slide is in viewport\n const isImageOnScreen = (index === itemLength - 1) && (slideNumber === itemLength)\n\n if (isImageOnScreen) {\n $ctaSlideBtn.attr('tabindex', 0)\n return\n }\n\n $ctaSlideBtn.attr('tabindex', -1)\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nexport default class EmailSignupModals extends ComponentLoader {\n static initialize() {\n $('.js-email-signup-modal').on('submit', 'form', this.onSubmit)\n }\n\n static onSubmit = async (event) => {\n event.preventDefault()\n\n const $modal = $(event.delegateTarget)\n const $form = $(event.target)\n\n try {\n await $.post($form[0].action, $form.serialize())\n\n window.estately.data.is_user_logged_in = true\n $modal.trigger(EstatelyEvents.STATE_CHANGE.LOGIN)\n\n if ($modal[0].id === 'saved-property-modal') {\n $modal.trigger(EstatelyEvents.STATE_CHANGE.PROPERTY_SAVE)\n }\n\n $modal.on('hidden.bs.modal', () => $modal.remove())\n } catch (response) {\n const errors = JSON.parse(response.responseText)\n $modal.find('.js-form-errors')\n .html(errors.join('
'))\n .removeClass('hide')\n }\n }\n}\n","export default class GoogleMapsAPI {\n static googleJS() {\n if (!this.promise) {\n this.promise = new Promise((resolve) => {\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.async = true\n script.src = window.estately.googleMapsSrc\n script.onload = () => resolve(window.google)\n\n document.body.appendChild(script)\n })\n }\n\n return this.promise\n }\n\n static async setStreetViewToMapCenter(streetview, map) {\n const google = await this.googleJS()\n const distance = 100\n const service = new google.maps.StreetViewService()\n\n return new Promise((resolve, reject) => {\n service.getPanoramaByLocation(map.getCenter(), distance, (data, status) => {\n if (status === google.maps.StreetViewStatus.OK) {\n const newpoint = data.location.latLng\n const heading = google.maps.geometry.spherical.computeHeading(newpoint, map.getCenter())\n\n streetview.setPosition(newpoint)\n streetview.setPov({ heading, zoom: 1, pitch: 0 })\n\n resolve(status)\n } else {\n streetview.setPosition(map.getCenter())\n reject(status)\n }\n })\n })\n }\n}\n","import GoogleMapsAPI from 'legacy/lib/GoogleMapsAPI'\n\nexport default class LotLines {\n static STYLES = {\n default: {\n fillColor: 'transparent',\n strokeColor: '#999', // Matches $dark-gray\n strokeOpacity: 0.3,\n strokeWeight: 1,\n },\n\n satellite: {\n fillColor: 'transparent',\n strokeColor: 'white',\n strokeOpacity: 0.3,\n strokeWeight: 2,\n },\n\n featuredLotOverride: {\n strokeColor: '#336FEE', // Matches $estately-electric-blue\n strokeOpacity: 1,\n zIndex: 1,\n },\n }\n\n static MIN_ZOOM_LEVEL = 17\n static MAX_FEATURES = 3000\n\n static initialize = (map, featuredLotPosition) => {\n this.map = map\n this.featuredLotPosition = featuredLotPosition\n\n this.map.setTilt(0) // Disable tilt by default; lot lines don’t display well\n this.resetStyles()\n\n this.map.addListener('maptypeid_changed', () => this.resetStyles())\n }\n\n static resetStyles = () => {\n this.map.data.setStyle(this.map.mapTypeId === 'hybrid' ? LotLines.STYLES.satellite : LotLines.STYLES.default)\n }\n\n static clearLotLines = () => {\n this.map.data.forEach((lotLine) => {\n this.map.data.remove(lotLine)\n })\n }\n\n static render = (newGeoJson) => {\n this.map.data.toGeoJson((oldGeoJSON) => {\n if (oldGeoJSON.features && oldGeoJSON.features.length < LotLines.MAX_FEATURES) {\n // Filter out existing data\n // eslint-disable-next-line no-param-reassign\n newGeoJson.features = newGeoJson.features.filter(feature => !oldGeoJSON.features.includes(feature))\n } else {\n this.clearLotLines()\n }\n\n this.map.data.addGeoJson(newGeoJson, { idPropertyName: 'id' })\n\n this.highlightFeaturedLot()\n })\n }\n\n static highlightFeaturedLot = async () => {\n const google = await GoogleMapsAPI.googleJS()\n\n this.map.data.forEach((lotLine) => {\n const polygons = lotLine.getGeometry().getArray()\n\n // HACK: Using .some() to return early as soon as we find the featured lot line\n polygons.some((polygonPaths) => {\n const lotPolygon = new google.maps.Polygon({\n paths: polygonPaths.getAt(0).getArray(),\n })\n\n const isFeaturedLot = google.maps.geometry.poly.containsLocation(this.featuredLotPosition, lotPolygon)\n\n if (isFeaturedLot) {\n this.map.data.overrideStyle(lotLine, LotLines.STYLES.featuredLotOverride)\n }\n\n return isFeaturedLot\n })\n })\n }\n}\n","const estatelyMapStyles = [{\n featureType: 'landscape.natural',\n elementType: 'geometry.fill',\n stylers: [{\n color: '#EFE9D6',\n }],\n}, {\n featureType: 'poi.medical',\n elementType: 'geometry',\n stylers: [{\n color: '#FBD3DA',\n }],\n}, {\n featureType: 'poi.park',\n elementType: 'geometry',\n stylers: [{\n color: '#BDE6AB',\n }],\n}, {\n featureType: 'road.highway',\n elementType: 'geometry.fill',\n stylers: [{\n color: '#FFE15F',\n }],\n}, {\n featureType: 'road.highway',\n elementType: 'geometry.stroke',\n stylers: [{\n color: '#EFD151',\n }],\n}, {\n featureType: 'transit.station.airport',\n elementType: 'geometry.fill',\n stylers: [{\n color: '#CFB2DB',\n }],\n}, {\n featureType: 'water',\n elementType: 'geometry',\n stylers: [{\n color: '#A2DAF2',\n }],\n}]\n\nexport default estatelyMapStyles\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport GoogleMapsAPI from 'legacy/lib/GoogleMapsAPI'\nimport LotLines from 'legacy/lib/LotLines'\nimport { onceInView } from 'legacy/lib/lazy-loading'\n\nimport estatelyMapStyles from 'components/GoogleMap/estately-map-styles'\n\nexport default class GoogleMap extends ComponentLoader {\n static initialize() {\n const $el = $('#js-google-map')\n this.$mapModal = $el.find('#js-google-map-modal')\n this.$mapThumbnail = $el.find('.js-google-map-thumbnail')\n this.$mapUI = $el.find('.js-google-map-ui')\n this.$googleMap = $el.find('.js-google-map-container')\n this.$viewControls = $el.find('.js-google-map-controls')\n\n this.addressLatLong = {\n lat: this.$googleMap.data('lat'),\n lng: this.$googleMap.data('lng'),\n }\n\n this.$mapThumbnail.on('click', this.$googleMap, this.onThumbnailClick)\n this.$viewControls.on('change', this.onViewControlChange)\n\n this.$mapModal.on({\n 'show.bs.modal': this.onModalShow,\n 'shown.bs.modal': this.onModalShown,\n 'hide.bs.modal': this.onModalHide,\n })\n\n // Lazy-load the map\n onceInView($el, () => this.loadMap())\n }\n\n static get mapType() {\n return this.$viewControls.find('input:radio:checked').val()\n }\n\n static onThumbnailClick = (event) => {\n // Ignore taps on view controls\n if (this.$viewControls.has(event.target).length) return\n\n this.$mapModal.modal('show')\n }\n\n static onViewControlChange = async () => {\n const map = await this.loadMap()\n\n this.$viewControls.find('.focus').removeClass('focus') // Fix .focus sticking\n\n if (this.mapType === 'streetview') {\n this.$mapModal.modal('show')\n this.streetView.setVisible(true)\n } else {\n this.streetView.setVisible(false)\n map.setMapTypeId(this.mapType)\n }\n }\n\n static onModalShow = () => {\n this.$mapUI.detach().appendTo(this.$mapModal.find('.modal-body'))\n\n if (this.mapType !== 'streetview') delete this.map // Force map to redraw; fixes Safari issue #20278\n\n this.toggleFullScreenMapUI(true)\n }\n\n static onModalHide = () => {\n if (this.streetView.visible) {\n this.$viewControls.find('input[value=\"roadmap\"]').click()\n }\n\n this.$mapUI.detach().appendTo(this.$mapThumbnail)\n\n this.toggleFullScreenMapUI(false)\n }\n\n static async loadMap() {\n if (this.map) return this.map\n\n const google = await GoogleMapsAPI.googleJS()\n\n this.map = new google.maps.Map(this.$googleMap.get(0), {\n center: this.addressLatLong,\n mapTypeControl: false,\n mapTypeId: this.mapType,\n fullscreenControl: false,\n zoomControl: false,\n zoomControlOptions: {\n position: google.maps.ControlPosition.TOP_RIGHT,\n },\n rotateControl: false,\n rotateControlOptions: {\n position: google.maps.ControlPosition.TOP_RIGHT,\n },\n zoom: 13,\n panControl: false,\n streetViewControl: false,\n gestureHandling: 'none', // Disable dragging/scrollwheel-zooming\n styles: estatelyMapStyles,\n })\n\n this.marker = new google.maps.Marker({\n position: this.addressLatLong,\n map: this.map,\n clickable: false,\n })\n\n try {\n this.streetView = this.map.getStreetView()\n this.streetView.setOptions({\n enableCloseButton: false,\n fullscreenControl: false,\n zoomControl: false,\n addressControl: false,\n motionTrackingControl: false,\n })\n\n await GoogleMapsAPI.setStreetViewToMapCenter(this.streetView, this.map)\n } catch {\n this.$viewControls\n .find('.btn-group .btn:has(input[value=\"streetview\"])')\n .attr('disabled', 'disabled')\n }\n\n LotLines.initialize(this.map, this.marker.getPosition())\n\n return this.map\n }\n\n static async toggleFullScreenMapUI(isFullScreen) {\n const map = await this.loadMap()\n const google = await GoogleMapsAPI.googleJS()\n\n const supportsPinchZoom = window.matchMedia('(pointer: coarse) and (hover: none)').matches\n\n map.set('zoomControl', isFullScreen && !supportsPinchZoom)\n map.set('rotateControl', isFullScreen)\n map.set('gestureHandling', isFullScreen ? 'greedy' : 'none') // enable dragging/touch gestures\n map.panTo(this.addressLatLong)\n\n google.maps.event.trigger(map, 'resize')\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class InfoModals extends ComponentLoader {\n static mount() {\n $(document).on('click.estately.info-modal', '[data-toggle=\"info-modal\"]', this.onClick)\n }\n\n static onClick = (event) => {\n const button = event.currentTarget\n const $template = $(button.dataset.template)\n const content = $template.html() || button.title\n const title = $template.data('title') || button.textContent.trim()\n\n const $modal = $('#js-info-modal')\n $modal.find('.modal-title').html(title)\n $modal.find('.modal-body').html(content)\n $modal.modal('show')\n\n $modal.on('hidden.bs.modal', () => { button.focus() })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class InfoPopover extends ComponentLoader {\n static mount() {\n $(document).on('click', '[data-toggle=\"popover\"]', this.onClick)\n }\n\n static onClick = (event) => {\n const $popoverButton = $(event.currentTarget)\n $popoverButton.popover('toggle')\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport { timeSinceDate } from 'legacy/views/global/TimeSinceDate'\n\nclass LastCheckedTimeStamp extends ComponentLoader {\n static mount() {\n $(document).one('lazybeforeunveil', '.js-last-checked-at', this.fetchAndRender)\n }\n\n static async fetchAndRender() {\n this.mlsId = $('.js-listing-data').data('mls-acronym')\n this.$el = $('.js-last-checked-at')\n\n try {\n const response = await $.get(`/api/v3/mlses/${window.estately.data.property.mls.acronym}`, {\n fields: { mls: ['lastCheckedAt'] },\n })\n\n const { data } = JSON.parse(response)\n\n const lastCheckedAt = new Date(data.attributes.lastCheckedAt)\n const timeSinceLastChecked = timeSinceDate(lastCheckedAt)\n\n this.$el.text(`${timeSinceLastChecked} ago`)\n } catch {\n this.$el.text('unable to check')\n }\n }\n}\n\nexport default LastCheckedTimeStamp\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class ListingNavigation extends ComponentLoader {\n static STORAGE_KEY = 'listingNavigation'\n\n static mount() {\n const storage = JSON.parse(localStorage.getItem(this.STORAGE_KEY)) || {}\n\n this.state = {\n loading: true,\n\n currentSlug: window.estately.data.property.id,\n slugs: storage.slugs || [],\n source: storage.source,\n sourceURL: storage.sourceURL || '/',\n\n pendingLink: null,\n }\n }\n\n static async initialize() {\n this.$listingNavigation = $('.js-listing-navigation')\n this.$listingJumplinks = $('.js-jumplinks')\n\n this.$listingNavigation.on('click', 'a', this.onNavigationClick)\n this.$listingJumplinks.on('click', 'a', this.onJumplinkClick)\n\n this.highlightJumplinks()\n\n const dataAlreadyLoaded = this.state.slugs.includes(this.state.currentSlug)\n\n if (dataAlreadyLoaded) {\n this.setState({ loading: false })\n } else {\n this.fetchListingSlugs()\n }\n }\n\n static onNavigationClick = (event) => {\n const link = event.currentTarget\n\n if (link.dataset.ref !== 'back-to-results') {\n if (this.state.loading) this.setState({ pendingLink: link })\n if (this.state.loading || link.attributes.disabled) event.preventDefault()\n }\n }\n\n static onJumplinkClick = (event) => {\n const $link = $(event.currentTarget)\n const headerHeight = $link.closest('nav.js-jumplinks').height()\n\n // variable name `--scroll-padding` should match the scroll-padding-top in html's css\n $('html').css('--scroll-padding', `${headerHeight}px`)\n\n $('.selected-jumplink').removeClass('selected-jumplink')\n $link.addClass('selected-jumplink')\n }\n\n static setState(state = {}) {\n this.state = { ...this.state, ...state }\n\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify({\n slugs: this.state.slugs,\n source: this.state.source,\n sourceURL: this.state.sourceURL,\n }))\n\n this.render()\n }\n\n static async fetchListingSlugs() {\n try {\n const location = this.$listingNavigation.data('location')\n const state = this.$listingNavigation.data('state')\n const response = await $.get('/api/v3/search', { location, state })\n const slugs = response.data.map(property => property.id)\n\n // If current listing isn’t present in the list, add it as the first element.\n if (!slugs.includes(this.state.currentSlug)) {\n slugs.unshift(this.state.currentSlug)\n }\n\n this.setState({\n slugs,\n loading: false,\n source: 'generated-search',\n sourceURL: response.links.permalink.href,\n })\n } catch {\n this.setState({ loading: false })\n }\n }\n\n static hrefs() {\n const i = this.state.slugs.indexOf(this.state.currentSlug)\n const prev = i === 0 ? this.state.slugs.length - 1 : i - 1\n const next = i === this.state.slugs.length - 1 ? 0 : i + 1\n\n return {\n prev: this.state.slugs[prev],\n 'back-to-results': this.state.sourceURL,\n next: this.state.slugs[next],\n }\n }\n\n static render() {\n const prevNextLinks = this.$listingNavigation.find('a[data-ref=\"prev\"], a[data-ref=\"next\"]').get()\n const disablePrevNext = !this.state.loading && this.state.slugs.length < 2\n const hrefs = this.hrefs()\n\n prevNextLinks.forEach((link) => {\n const $link = $(link)\n const isPending = link === this.state.pendingLink\n\n // Set href\n $link.attr('href', hrefs[link.dataset.ref])\n\n // Toggle spinners\n $link.find('.svg-icon-spinner').toggleClass('hidden', !isPending)\n $link.find('.svg-icon-chevron-right, .svg-icon-chevron-left').toggleClass('hidden', isPending)\n\n // Enable/disable\n if (!this.state.loading) {\n link.removeAttribute('role') // Remove button role\n $link.attr('disabled', disablePrevNext)\n if (disablePrevNext) $link.removeAttr('href')\n }\n })\n\n // Replace “more results” link with the user’s saved search\n if (this.state.source === 'user-search') {\n this.$listingNavigation.find('a[data-ref=\"back-to-results\"]').attr('href', this.state.sourceURL)\n }\n\n if (this.state.pendingLink && !this.state.loading) {\n this.state.pendingLink.click()\n this.setState({ pendingLink: null })\n }\n }\n\n static highlightJumplinks() {\n const OFFSET_ADJUSTMENT_ON_LINK_CLICK = 5\n const debounce = this.debounce\n const automaticHorizontalScrollOnMobile = this.automaticHorizontalScrollOnMobile\n\n const $header = $('.js-jumplinks')\n const $jumpLinks = $($header).find('.jumplinks-list li a')\n const headerHeight = $header.outerHeight()\n const $sections = $('.jumplink-section')\n let lastActiveLink = null\n\n const updateSelectedJumpLink = () => {\n const scrollTop = $(window).scrollTop() + headerHeight\n let currentSection = null\n\n $sections.each(function updateSectionClass() {\n const $section = $(this)\n const sectionTop = $section.offset().top - OFFSET_ADJUSTMENT_ON_LINK_CLICK\n const sectionBottom = sectionTop + $section.outerHeight()\n\n if (sectionTop <= scrollTop && sectionBottom > scrollTop) {\n currentSection = $section\n }\n })\n\n if (currentSection) {\n const currentSectionId = `#${currentSection.attr('id')}`\n const $activeLink = $(`a[href=\"${currentSectionId}\"]`)\n\n if ($activeLink?.length && $activeLink[0] !== lastActiveLink) {\n $jumpLinks.removeClass('selected-jumplink')\n $activeLink.addClass('selected-jumplink')\n\n if (window.estately.data.is_mobile) {\n automaticHorizontalScrollOnMobile($header, $activeLink)\n }\n }\n\n lastActiveLink = $activeLink[0]\n return\n }\n\n $jumpLinks.removeClass('selected-jumplink')\n lastActiveLink = null\n }\n\n $(window).on('scroll', debounce(updateSelectedJumpLink))\n }\n\n\n static debounce = (callback, wait = 100) => {\n let timeoutId = null\n return (...args) => {\n window.clearTimeout(timeoutId)\n timeoutId = window.setTimeout(() => {\n callback(...args)\n }, wait)\n }\n }\n\n static automaticHorizontalScrollOnMobile = (header, link) => {\n const headerScrollLeft = header.scrollLeft()\n const linkLeftOffset = link.position().left + headerScrollLeft\n const linkWidth = link.outerWidth()\n const headerWidth = header.outerWidth()\n const isLinkOutOfView = linkLeftOffset < headerScrollLeft || linkLeftOffset + linkWidth > headerScrollLeft + headerWidth\n\n if (isLinkOutOfView) {\n const scrollLeft = linkLeftOffset - (headerWidth / 2) + (linkWidth / 2)\n header.stop().animate({ scrollLeft }, 250)\n }\n }\n}\n","import ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class ListTrac extends ComponentLoader {\n static async mount() {\n // Wait until succesful load\n await window.estately.listTrac.loaded\n\n /* eslint-disable no-underscore-dangle */\n window._LT._trackEvent(window._eventType.view,\n window.estately.data.property.ln,\n window.estately.data.property.zip)\n /* eslint-enable */\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class MonthlyCostEstimate extends ComponentLoader {\n static initialize() {\n if (!$('#monthly-cost-estimate').length) return\n\n $('.js-monthly-cost-estimate-anchor').on('click', () => {\n const stickyHeader = $('.js-jumplinks')[0]\n const stickyHeaderHeight = stickyHeader.offsetHeight\n\n // variable name `--scroll-padding` should match the scroll-padding-top in html's css\n $('html').css('--scroll-padding', `${stickyHeaderHeight}px`)\n })\n\n $('.js-mortgage-calculator-modal').on('show.bs.modal', async () => {\n const { default: MortgageCalculatorModal } = await import('packs/views/listings/lazy/MortgageCalculatorModal')\n MortgageCalculatorModal.lazyLoad()\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class ReportProblemFrom extends ComponentLoader {\n static initialize() {\n this.$form = $('#js-report-problem-form')\n\n this.$form.on('submit', this.onSubmit)\n }\n\n static onSubmit = async (event) => {\n event.preventDefault()\n\n this.$form.find('.error').hide()\n\n try {\n await $.post('/property_issues', this.$form.serialize())\n\n this.$form.find('.success').show()\n this.$form.find('.form-group').hide()\n } catch {\n this.$form.find('.error').show()\n }\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport redirectToSignupUrl from 'legacy/lib/redirect-to-signup-url'\n\nasync function request(type, url, data) {\n try {\n return await $.ajax({\n url,\n type,\n data,\n beforeSend(xhr) {\n xhr.setRequestHeader('Accept', 'application/json, text/javascript, */*')\n },\n statusCode: {\n 401() { redirectToSignupUrl('save_property') },\n },\n })\n } catch (error) {\n if (error.status === 304) return // eslint-disable-line consistent-return\n\n throw new Error(error)\n }\n}\n\nconst SaveHideAPI = {\n save: id => request('POST', '/saved_properties', { property_id: id }),\n hide: id => request('POST', '/trashed_properties', { property_id: id }),\n unsave: id => request('DELETE', `/saved_properties/${id}`),\n unhide: id => request('DELETE', `/trashed_properties/${id}`),\n}\n\nexport default SaveHideAPI\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\nimport SaveHideAPI from 'legacy/lib/SaveHideAPI'\n\nexport default class SaveHideListing extends ComponentLoader {\n static async initialize() {\n $('.js-save').on('click', this.onSaveClick)\n $('.js-trash').on('click', this.onTrashClick)\n $(document).on(EstatelyEvents.STATE_CHANGE.PROPERTY_SAVE, this.onOutsideSave)\n\n const { property } = await $.getJSON(`/map/properties/${window.estately.data.property.id}`)\n\n this.setState({\n saved: property.saved,\n trashed: property.trashed,\n })\n }\n\n static setState(state) {\n this.state = { ...this.state, ...state }\n this.render()\n }\n\n static onSaveClick = (event) => {\n event.preventDefault()\n event.target.blur()\n\n if (this.state.saved) {\n this.unsave()\n } else {\n this.save()\n }\n }\n\n static onTrashClick = (event) => {\n event.preventDefault()\n event.target.blur()\n\n if (this.state.trashed) {\n this.unhide()\n } else {\n this.hide()\n }\n }\n\n // Saved through other means, like a showing request\n static onOutsideSave = () => {\n this.setState({ saved: true, trashed: false })\n }\n\n static save() {\n SaveHideAPI.save(window.estately.data.property.id)\n this.setState({ saved: true, trashed: false })\n }\n\n static unsave() {\n SaveHideAPI.unsave(window.estately.data.property.id)\n this.setState({ saved: false })\n }\n\n static hide() {\n SaveHideAPI.hide(window.estately.data.property.id)\n this.setState({ saved: false, trashed: true })\n }\n\n static unhide() {\n SaveHideAPI.unhide(window.estately.data.property.id)\n this.setState({ trashed: false })\n }\n\n static render() {\n /* eslint-disable space-in-parens */\n requestAnimationFrame(() => {\n const $context = $('#page-container')\n $context.find('.js-property-not-saved' ).toggleClass('hidden', this.state.saved )\n $context.find('.js-property-saved' ).toggleClass('hidden', !this.state.saved )\n $context.find('.js-property-not-trashed').toggleClass('hidden', this.state.trashed)\n $context.find('.js-property-trashed' ).toggleClass('hidden', !this.state.trashed)\n })\n /* eslint-enable space-in-parens */\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class ShowingRequestCheckoutModal extends ComponentLoader {\n static initialize() {\n this.$clickedElm = null\n\n $(document).on('click', '.js-open-showing-request-checkout', this.onOpenClick)\n }\n\n static onOpenClick = (event) => {\n const datePicker = new FormData($('.js-date-carousel')[0])\n\n this.$clickedElm = $(event.currentTarget)\n\n const tourData = {\n date: datePicker.get('date'),\n tourType: datePicker.get('tour-type'),\n\n ...event.currentTarget.dataset,\n }\n\n this.fetchAndUpdateModal(tourData)\n }\n\n static renderCurrentStep() {\n this.$steps.addClass('hidden')\n this.$currentStep = this.$steps.eq(this.currentStepIndex)\n this.$currentStep\n .removeClass('hidden')\n }\n\n static onNextStepClick = () => {\n const currentStepIsValid = this.$currentStep.find('input').toArray().every(input => input.reportValidity())\n if (!currentStepIsValid) return\n\n this.currentStepIndex += 1\n this.renderCurrentStep()\n }\n\n static async fetchAndUpdateModal({\n date, source, tourType,\n }) {\n if (!this.$modal) {\n const content = await $.get(\n `/properties/${window.estately.data.property.id}/showing_request_checkout/new`,\n {},\n )\n\n this.$modal = $(content).appendTo(document.body)\n this.$modal\n .on('click', '.js-checkout-next', this.onNextStepClick)\n .on('hidden.bs.modal', () => {\n if (this.$clickedElm) this.$clickedElm.focus()\n\n this.$clickedElm = null\n })\n }\n\n this.$modal.find('.js-checkout-date').val(date)\n this.$modal.find('.js-checkout-tour-type').val(tourType)\n this.$modal.find('.js-showing-request-form').attr('data-cta', source)\n\n this.currentStepIndex = 0\n this.$steps = this.$modal.find('.js-checkout-step')\n\n this.$modal.modal('show')\n this.renderCurrentStep()\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\nimport { oneLine } from 'common-tags'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nexport default class ShowingRequestForm extends ComponentLoader {\n static mount() {\n $(document).on('submit', '.js-showing-request-form', this.onSubmit)\n }\n\n static onSubmit = async (event) => {\n event.preventDefault()\n\n const $form = $(event.currentTarget)\n const $errors = $form.find('.js-showing-request-errors')\n const $submitButton = $form.find('[type=submit]')\n\n $submitButton.prop('disabled', true)\n $errors.hide()\n\n try {\n await $.post($form.prop('action'), $form.serialize())\n } catch (xhr) {\n $submitButton.prop('disabled', false)\n return void $errors.html(this.formattedErrors(xhr)).show()\n }\n\n window.estately.data.is_user_logged_in = true\n\n $(document)\n .trigger(EstatelyEvents.STATE_CHANGE.LOGIN)\n .trigger(EstatelyEvents.STATE_CHANGE.SHOWING_REQUEST)\n .trigger(EstatelyEvents.STATE_CHANGE.PROPERTY_SAVE)\n }\n\n static formattedErrors(xhr) {\n try {\n const { errors } = xhr.responseJSON\n\n if (xhr.status === 500) throw new Error('Server error')\n if (!errors) throw new Error('Response has no errors object')\n\n return oneLine`\n \n `\n } catch (e) {\n return oneLine`\n We were unable to process your showing request.\n If you continue to have problems, you can schedule a showing via phone\n by calling us at 1-800-341-8685.\n We apologize for the inconvenience.\n `\n }\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class SmoothScroller extends ComponentLoader {\n static mount() {\n $(document).on('click', '.js-scroll-page-with-vertical-offset', this.onScrollPageClick)\n }\n\n static onScrollPageClick = (event) => {\n event.preventDefault()\n\n const $destination = $(event.currentTarget.attributes.href.value)\n const $modal = $destination.closest('.modal.in')\n const $scroller = $modal.length ? $modal : $('html,body')\n const margin = parseInt($destination.css('margin-top'), 10) || 40\n\n $scroller.filter(':not(:animated)').animate({\n scrollTop: $destination[0].getBoundingClientRect().top + $scroller[0].scrollTop - margin,\n }, 1000)\n }\n}\n","import DefaultPage from 'legacy/pages/DefaultPage'\nimport $ from 'legacy/vendor/jquery.custom'\n\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\nimport { lazyLoadWhenInView } from 'legacy/lib/lazy-loading'\n\nimport CardCarousel from 'legacy/views/carousels/CardCarousel'\nimport ImageCarousel from 'legacy/views/carousels/ImageCarousel'\nimport ListingCardCarousel from 'legacy/views/carousels/ListingCardCarousel'\n\nimport EmailSignupModals from 'legacy/views/listings/EmailSignupModals'\nimport GoogleMap from 'legacy/views/listings/GoogleMap'\nimport InfoModals from 'legacy/views/listings/InfoModals'\nimport InfoPopover from 'legacy/views/listings/InfoPopover'\nimport LastCheckedTimeStamp from 'legacy/views/listings/LastCheckedTimeStamp'\nimport ListingNavigation from 'legacy/views/listings/ListingNavigation'\nimport ListTrac from 'legacy/views/listings/ListTrac'\nimport MonthlyCostEstimate from 'legacy/views/listings/MonthlyCostEstimate'\nimport ReportProblemForm from 'legacy/views/listings/ReportProblemForm'\nimport SaveHideListing from 'legacy/views/listings/SaveHideListing'\nimport ShowingRequestCheckoutModal from 'legacy/views/listings/ShowingRequestCheckoutModal'\nimport ShowingRequestForms from 'legacy/views/listings/ShowingRequestForms'\nimport SmoothScroller from 'legacy/views/listings/SmoothScroller'\nimport halveStringBlock from 'lib/polyfills/halveStringBlock'\n\nexport default class ListingPage extends DefaultPage {\n static childComponents = [\n ...super.childComponents,\n EmailSignupModals,\n GoogleMap,\n InfoModals,\n InfoPopover,\n LastCheckedTimeStamp,\n ListingCardCarousel,\n ListingNavigation,\n ListTrac,\n MonthlyCostEstimate,\n ReportProblemForm,\n SaveHideListing,\n ShowingRequestCheckoutModal,\n ShowingRequestForms,\n SmoothScroller,\n ]\n\n static initialize() {\n super.initialize()\n\n lazyLoadWhenInView('.js-commute-time', () => import('packs/views/listings/lazy/CommuteTime'))\n lazyLoadWhenInView('.js-notes', () => import('packs/views/listings/lazy/Notes'))\n lazyLoadWhenInView('.js-sale-history', () => import('packs/views/listings/lazy/SaleHistory'))\n lazyLoadWhenInView('.js-schools-accordion', () => import('packs/views/listings/lazy/GreatSchools'))\n\n $(document)\n .on(EstatelyEvents.STATE_CHANGE.LOGIN, this.onLogin)\n .on(EstatelyEvents.STATE_CHANGE.SHOWING_REQUEST, this.onShowingRequest)\n .on('click', '.js-showing-request-phone-link', this.onPhoneLinkClick)\n\n CardCarousel.bind('.js-date-carousel')\n this.imageCarousel = new ImageCarousel('.js-image-carousel')\n\n this.setupYouSeemInterestedPopupWhenIdle()\n this.setupGeneralInquiryForm()\n this.setupListingDescriptionReadMore()\n }\n\n static onLogin = () => {\n $('.js-logged-out').remove()\n $('.js-logged-in').removeClass('hide hidden')\n }\n\n static onShowingRequest = () => {\n $('.js-hide-from-users-with-showing').remove()\n $('.js-show-to-users-with-showing').removeClass('hidden')\n $('.js-invisible-with-showing').addClass('invisible')\n $('.js-show-to-users-with-showing h2').focus()\n\n if ($('.finish-schedule-tour-modal')) {\n $('.js-schedule-tour-header h1').text('We’ll be in touch soon!')\n }\n }\n\n static onPhoneLinkClick = () => {\n $.post('/properties_from_mobile_calls', {\n property: window.estately.data.property.id,\n })\n }\n\n static setupYouSeemInterestedPopupWhenIdle() {\n // Popup isn’t available on all listing pages\n if (!$('#you-seem-interested-popup').length) return\n\n requestIdleCallback(async () => {\n const { default: YouSeemInterestedPopup } = await import('packs/views/listings/lazy/YouSeemInterestedPopup')\n YouSeemInterestedPopup.lazyLoad()\n })\n }\n\n static setupGeneralInquiryForm() {\n if (!$('#general-inquiry-form').length) return\n\n requestIdleCallback(async () => {\n const { default: GeneralInquiryForm } = await import('packs/views/listings/lazy/GeneralInquiryForm')\n GeneralInquiryForm.lazyLoad()\n })\n }\n\n static setupListingDescriptionReadMore() {\n const readMore = 'Read more'\n const readless = 'Read less'\n const $listingSection = $('.listing-grid-description-section')\n const $listingDescription = $('#js-listing-description')\n const description = halveStringBlock($listingDescription.html())\n const ariaId = 'listing-description-text'\n const moreIcon = $listingDescription.data().readmoreicon\n const lessIcon = $listingDescription.data().readlessicon\n\n $listingDescription.attr({ id: ariaId, 'data-is-text-visible': false })\n\n $listingDescription.html([\n `${description[0]}`,\n `${description[1]}`,\n ])\n\n function onClick(event) {\n event.preventDefault()\n\n const $readMoreElement = $(`a[name=\"${readMore}\"]`)\n const isExpanded = $($listingDescription).attr('data-is-text-visible') === 'true'\n\n $listingDescription.attr('data-is-text-visible', !isExpanded)\n $readMoreElement.attr({ 'aria-expanded': !isExpanded })\n\n // Toggle classes between Read more and Read less tags\n if (!isExpanded) {\n $readMoreElement.find('.button-title').html(readless)\n $readMoreElement.find('.button-icon').html(lessIcon)\n $($listingDescription).addClass('listing-description-expanded').removeClass('listing-description')\n } else {\n $readMoreElement.find('.button-title').html(readMore)\n $readMoreElement.find('.button-icon').html(moreIcon)\n $($listingDescription).addClass('listing-description').removeClass('listing-description-expanded')\n }\n }\n\n /* eslint-disable max-len */\n const readMoreLink = `\n \n ${readMore}\n \n ${moreIcon}\n \n \n `\n /* eslint-enable max-len */\n\n $($listingSection).on('click', '.read-more-link', onClick)\n $(readMoreLink).insertAfter($listingDescription)\n }\n}\n","export default function halveStringBlock(str) {\n const mid = Math.floor(str.length / 2)\n let i = mid - 1\n let j = mid\n let sep = mid\n\n while (j < str.length) {\n if (str[i] === '.') { sep = i + 1; break }\n if (str[j] === '.') { sep = j + 1; break }\n i -= 1\n j += 1\n }\n\n return [str.slice(0, sep), str.slice(sep)]\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport CarouselScroller from 'legacy/views/carousels/CarouselScroller'\n\nexport default class CardCarousel {\n static bind(selector) {\n return new CardCarousel(selector)\n }\n\n constructor(el) {\n this.$carousel = $(el)\n\n if (!this.$carousel.length) return\n\n this.$dots = this.$carousel.find('.carousel-dots')\n this.scroller = new CarouselScroller(this.$carousel)\n\n this.$carousel\n .on(CarouselScroller.EVENTS.PAGE_CHANGE, () => this.renderActiveDot())\n .on(CarouselScroller.EVENTS.TOTAL_PAGES_CHANGE, () => this.renderDots())\n .on('click', '.dot', this.onDotClick)\n\n this.renderDots()\n }\n\n onDotClick = ({ currentTarget: dot }) => {\n this.scroller.scrollToPage($(dot).parent().index())\n }\n\n onPageChange = () => {\n this.renderActiveDot()\n }\n\n renderDots() {\n requestAnimationFrame(() => {\n const totalDots = this.scroller.totalPages\n this.$dots.toggleClass('hidden', totalDots <= 1)\n\n if (totalDots <= 1) return\n\n this.$dots.empty()\n\n for (let i = 0; i < totalDots; i += 1) {\n this.$dots.append(\n `
  • \n \n
  • `,\n )\n }\n\n this.renderActiveDot()\n })\n }\n\n renderActiveDot() {\n requestAnimationFrame(() => {\n const previouslyActive = this.$dots.find('.dot.active')\n previouslyActive.removeClass('active')\n previouslyActive.removeAttr('aria-current')\n\n const currentlyActive = this.$dots.find(`.dot:eq(${this.scroller.currentPage})`)\n currentlyActive.addClass('active')\n currentlyActive.attr('aria-current', 'true')\n\n this.updateAccessibilityAttributes()\n })\n }\n\n updateAccessibilityAttributes = () => {\n const carouselScroller = this.$carousel.find('.js-carousel-scroller')[0]\n const liItems = Array.from(carouselScroller.querySelectorAll('li'))\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const isIntersecting = entry.isIntersecting\n this.updateAriaHidden(entry.target, isIntersecting)\n this.updateTabIndex(entry.target, isIntersecting)\n })\n }, { threshold: 0.5 })\n\n liItems.forEach((item) => {\n observer.observe(item)\n })\n }\n\n updateAriaHidden = (target, isIntersecting) => {\n $(target).attr('aria-hidden', !isIntersecting)\n }\n\n updateTabIndex = (target, isIntersecting) => {\n const focusableElements = target.querySelectorAll(`\n a[href],\n button:not([disabled]),\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n [tabindex]:not([disabled]):not([tabindex=\"-1\"])\n `)\n\n focusableElements.forEach((element) => {\n $(element).attr('tabindex', isIntersecting ? '0' : '-1')\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\n\nexport function lastClosestIndex(collection, target) {\n return collection.lastIndexOf(collection.reduce((bestFit, x) => (\n Math.abs(x - target) < Math.abs(bestFit - target) ? x : bestFit\n )))\n}\nexport function firstClosestIndex(collection, target) {\n return collection.indexOf(collection.reduce((bestFit, x) => (\n Math.abs(x - target) < Math.abs(bestFit - target) ? x : bestFit\n )))\n}\n\nexport default class CarouselScroller {\n static smoothScrollSpeed = 400\n\n static EVENTS = {\n ITEM_CHANGE: 'change.lastItemInViewport',\n PAGE_CHANGE: 'change.currentPage',\n TOTAL_PAGES_CHANGE: 'change.totalPages',\n }\n\n scroller = null // DOM Element\n $scroller = null // jQuery Element\n\n lastItemInViewport = 0\n firstItemInViewport = 0\n currentPage = 0\n itemEndPoints = [] // Coordinates for the end of each list item\n itemStartPoints = [] // Coordinates for the beginning of each list item\n pageStartPoints = [] // Coordinates for the start of each “page”\n maxScrollLeft = 0 // The max we can scroll to (without “rubber-banding”)\n scrollerWidth = 0\n\n // TODO: Remove this when browser support improves\n // See https://caniuse.com/#feat=mdn-api_scrolltooptions_behavior\n nativeSmoothingSupported = ('scrollBehavior' in document.documentElement.style);\n\n get totalPages() { return this.pageStartPoints.length }\n\n constructor(el) {\n // Set up data\n this.$scroller = $(el).find('.js-carousel-scroller')\n this.scroller = this.$scroller.get(0)\n this.$buttons = $(el).find('.carousel-button')\n this.totalItems = this.scroller.children.length\n\n this.updateMetrics()\n\n\n // Attach Events\n\n $(window).on('resize', this.onResize)\n\n this.$scroller\n .on('scroll', this.onScroll)\n .on(CarouselScroller.EVENTS.PAGE_CHANGE, () => this.renderButtonStates())\n .on(CarouselScroller.EVENTS.TOTAL_PAGES_CHANGE, () => this.renderButtons())\n\n if (!this.nativeSmoothingSupported) {\n ['touchstart', 'pointerdown', 'wheel'].forEach((event) => {\n this.scroller.addEventListener(event, this.cancelAnimation, { passive: true })\n })\n }\n\n this.$buttons.on('click', this.onButtonClick)\n\n\n // Render\n\n this.renderButtons()\n }\n\n next = ({ smooth = true } = {}) => this.move({ direction: 1, smooth })\n prev = ({ smooth = true } = {}) => this.move({ direction: -1, smooth })\n\n scrollToPage(i, { smooth = true } = {}) {\n const target = this.pageStartPoints[i]\n this.scrollTo(target, { smooth })\n }\n\n\n // ---------------------------------------------------------------------\n // Private methods\n // ---------------------------------------------------------------------\n\n onButtonClick = ({ currentTarget: button }) => {\n // call this.next() / .prev()\n this[button.dataset.direction]()\n }\n\n onResize = () => {\n requestAnimationFrame(() => this.updateMetrics())\n }\n\n onScroll = () => {\n requestAnimationFrame(() => this.updateClosestItemAndPage())\n }\n\n renderButtons() {\n requestAnimationFrame(() => {\n this.$buttons.toggleClass('hidden', this.totalPages <= 1)\n this.renderButtonStates()\n })\n }\n\n renderButtonStates() {\n requestAnimationFrame(() => {\n const [prev, next] = this.$buttons.get()\n\n prev.disabled = this.currentPage <= 0\n next.disabled = this.currentPage >= this.totalPages - 1\n })\n }\n\n cancelAnimation = () => {\n this.$scroller.stop()\n }\n\n updateClosestItemAndPage() {\n const scrollStart = this.scroller.scrollLeft\n const scrollEnd = scrollStart + this.scrollerWidth\n const closestPage = lastClosestIndex(this.pageStartPoints, scrollStart)\n const closestItem = lastClosestIndex(this.itemEndPoints, scrollEnd)\n const firstItem = firstClosestIndex(this.itemStartPoints, scrollStart)\n\n if (closestPage !== this.currentPage) {\n this.currentPage = closestPage\n this.$scroller.trigger(CarouselScroller.EVENTS.PAGE_CHANGE, {\n currentPage: this.currentPage,\n })\n }\n\n if (closestItem !== this.lastItemInViewport) {\n this.lastItemInViewport = closestItem\n this.$scroller.trigger(CarouselScroller.EVENTS.ITEM_CHANGE, {\n lastItemInViewport: this.lastItemInViewport,\n })\n }\n\n if (firstItem !== this.firstItemInViewport) {\n this.firstItemInViewport = firstItem\n }\n }\n\n updateMetrics() {\n const prevTotalPages = this.totalPages\n\n // Reset\n this.itemEndPoints = []\n this.itemStartPoints = []\n this.pageStartPoints = []\n\n // Record Metrics\n this.scrollerWidth = this.scroller.clientWidth\n this.maxScrollLeft = this.scroller.scrollWidth - this.scrollerWidth\n\n\n // Recalculate start/end points for items and pages\n // ------------------------------------------------\n\n const children = [...this.scroller.children]\n\n // NOTE: We have to be careful here, to reduce reflow/layout thrashing\n // See: https://gist.github.com/paulirish/5d52fb081b3570c81e3a\n children.forEach((item) => {\n const start = item.offsetLeft\n const end = start + item.offsetWidth\n const hasSnapPoint = !window.getComputedStyle(item).scrollSnapAlign?.endsWith('none')\n\n if (hasSnapPoint && start < this.maxScrollLeft) {\n this.pageStartPoints.push(start)\n }\n\n this.itemEndPoints.push(end)\n this.itemStartPoints.push(start)\n })\n\n this.pageStartPoints.push(this.maxScrollLeft)\n\n // ------------------------------------------------\n\n if (this.totalPages !== prevTotalPages) {\n this.$scroller.trigger(CarouselScroller.EVENTS.TOTAL_PAGES_CHANGE)\n }\n\n this.updateClosestItemAndPage()\n }\n\n // direction = 1 (next) or -1 (prev)\n move({ direction = 1, smooth = true }) {\n let nextPage = this.currentPage + direction\n\n // Looping\n if (nextPage < 0) nextPage = this.totalPages - 1\n if (nextPage >= this.totalPages) nextPage = 0\n\n this.scrollToPage(nextPage, { smooth })\n }\n\n scrollTo(x, { smooth = true } = {}) {\n const scrollLeft = Math.min(x, this.maxScrollLeft)\n\n if (this.nativeSmoothingSupported || !smooth) {\n this.scroller.scrollTo({ left: scrollLeft, behavior: smooth ? 'smooth' : 'auto' })\n return\n }\n\n this.cancelAnimation()\n this.$scroller.animate({ scrollLeft }, CarouselScroller.smoothScrollSpeed)\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nimport CardCarousel from 'legacy/views/carousels/CardCarousel'\n\nexport default class ListingCardCarousel extends ComponentLoader {\n static initialize() {\n $('.js-listing-card-carousel').one(EstatelyEvents.AJAX_CONTENT.LOADED, this.onCarouselFetched)\n }\n\n static onCarouselFetched = (event) => {\n event.currentTarget\n .querySelectorAll('.js-card-carousel')\n .forEach((carousel) => {\n CardCarousel.bind(carousel)\n this.onClickToListingCard(carousel)\n })\n }\n\n static onClickToListingCard = (carousel) => {\n $(carousel).find('.listing-card').on('click', (event) => {\n window.location.href = event.currentTarget.dataset.path\n })\n }\n}\n"],"names":["ImageCarouselGallery","constructor","$carousel","totalImages","_defineProperty","modalEvent","$","window","type","event","key","this","$modal","modal","scroller","prev","smooth","preventDefault","next","$clickedElm","$counter","find","createDOM","requestAnimationFrame","$scrollerContent","clone","attr","role","text","index","removeAttr","_","value","replace","append","CarouselScroller","on","EVENTS","ITEM_CHANGE","updateCounter","toggleKeyboardEvents","focus","setClickedElm","currentItemNumber","lastItemInViewport","currentItemIsImage","imageNumber","Math","min","toggleClass","$imageListItem","each","el","setCtaBtnTabIndexAttribute","openTo","_ref","image","imgIndex","destinationImage","get","onResize","scrollIntoView","block","isImageOnModal","currentPage","itemLength","length","$ctaSlideBtn","ImageCarousel","hadFirstInteraction","gallery","currentTarget","onImageClick","$carouselTiles","totalItems","forEach","addEventListener","onFirstInteraction","once","passive","onImageKeyDown","onImageKeyUp","totalPages","setImageAccessibilityAttributes","iscurrentItemImage","firstItemInViewport","slideNumber","arguments","undefined","firstItem","ariaHiddenValue","EmailSignupModals","ComponentLoader","initialize","onSubmit","async","delegateTarget","$form","target","post","action","serialize","estately","data","is_user_logged_in","trigger","EstatelyEvents","STATE_CHANGE","LOGIN","id","PROPERTY_SAVE","remove","response","errors","JSON","parse","responseText","html","join","removeClass","GoogleMapsAPI","googleJS","promise","Promise","resolve","script","document","createElement","src","googleMapsSrc","onload","google","body","appendChild","setStreetViewToMapCenter","streetview","map","service","maps","StreetViewService","reject","getPanoramaByLocation","getCenter","status","StreetViewStatus","OK","newpoint","location","latLng","heading","geometry","spherical","computeHeading","setPosition","setPov","zoom","pitch","LotLines","_LotLines","default","fillColor","strokeColor","strokeOpacity","strokeWeight","satellite","featuredLotOverride","zIndex","featuredLotPosition","setTilt","resetStyles","addListener","setStyle","mapTypeId","STYLES","lotLine","newGeoJson","toGeoJson","oldGeoJSON","features","MAX_FEATURES","filter","feature","includes","clearLotLines","addGeoJson","idPropertyName","highlightFeaturedLot","getGeometry","getArray","some","polygonPaths","lotPolygon","Polygon","paths","getAt","isFeaturedLot","poly","containsLocation","overrideStyle","featureType","elementType","stylers","color","GoogleMap","$el","$mapModal","$mapThumbnail","$mapUI","$googleMap","$viewControls","addressLatLong","lat","lng","onThumbnailClick","onViewControlChange","onModalShow","onModalShown","onModalHide","onceInView","loadMap","mapType","val","Map","center","mapTypeControl","fullscreenControl","zoomControl","zoomControlOptions","position","ControlPosition","TOP_RIGHT","rotateControl","rotateControlOptions","panControl","streetViewControl","gestureHandling","styles","estatelyMapStyles","marker","Marker","clickable","streetView","getStreetView","setOptions","enableCloseButton","addressControl","motionTrackingControl","getPosition","toggleFullScreenMapUI","isFullScreen","supportsPinchZoom","matchMedia","matches","set","panTo","_GoogleMap","has","setVisible","setMapTypeId","detach","appendTo","visible","click","InfoModals","mount","onClick","button","$template","dataset","template","content","title","textContent","trim","InfoPopover","popover","LastCheckedTimeStamp","one","fetchAndRender","mlsId","property","mls","acronym","fields","lastCheckedAt","Date","attributes","timeSinceLastChecked","timeSinceDate","ListingNavigation","storage","localStorage","getItem","STORAGE_KEY","state","loading","currentSlug","slugs","source","sourceURL","pendingLink","$listingNavigation","$listingJumplinks","onNavigationClick","onJumplinkClick","highlightJumplinks","setState","fetchListingSlugs","setItem","stringify","render","unshift","links","permalink","href","hrefs","i","indexOf","prevNextLinks","disablePrevNext","link","$link","isPending","ref","removeAttribute","debounce","automaticHorizontalScrollOnMobile","$header","$jumpLinks","headerHeight","outerHeight","$sections","lastActiveLink","updateSelectedJumpLink","scrollTop","currentSection","$section","sectionTop","offset","top","sectionBottom","currentSectionId","$activeLink","addClass","is_mobile","_ListingNavigation","disabled","closest","height","css","callback","wait","timeoutId","_len","args","Array","_key","clearTimeout","setTimeout","header","headerScrollLeft","scrollLeft","linkLeftOffset","left","linkWidth","outerWidth","headerWidth","stop","animate","ListTrac","listTrac","loaded","_LT","_trackEvent","_eventType","view","ln","zip","MonthlyCostEstimate","stickyHeaderHeight","offsetHeight","MortgageCalculatorModal","lazyLoad","ReportProblemFrom","_ReportProblemFrom","hide","show","request","url","ajax","beforeSend","xhr","setRequestHeader","statusCode","redirectToSignupUrl","error","Error","property_id","SaveHideListing","onSaveClick","onTrashClick","onOutsideSave","getJSON","saved","trashed","save","SaveHideAPI","unsave","unhide","$context","_SaveHideListing","blur","ShowingRequestCheckoutModal","onOpenClick","renderCurrentStep","$steps","$currentStep","eq","currentStepIndex","fetchAndUpdateModal","date","tourType","onNextStepClick","_ShowingRequestCheckoutModal","datePicker","FormData","tourData","toArray","every","input","reportValidity","ShowingRequestForm","formattedErrors","responseJSON","oneLine","Object","values","e","_ShowingRequestForm","$errors","$submitButton","prop","SHOWING_REQUEST","SmoothScroller","onScrollPageClick","$destination","$scroller","margin","parseInt","getBoundingClientRect","ListingPage","DefaultPage","super","lazyLoadWhenInView","onLogin","onShowingRequest","onPhoneLinkClick","CardCarousel","bind","imageCarousel","setupYouSeemInterestedPopupWhenIdle","setupGeneralInquiryForm","setupListingDescriptionReadMore","requestIdleCallback","YouSeemInterestedPopup","GeneralInquiryForm","readMore","$listingSection","$listingDescription","description","str","mid","floor","j","sep","slice","halveStringBlock","ariaId","moreIcon","readmoreicon","lessIcon","readlessicon","readMoreLink","$readMoreElement","isExpanded","insertAfter","_superPropGet","_ListingPage","ListingCardCarousel","ReportProblemForm","ShowingRequestForms","selector","dot","scrollToPage","parent","renderActiveDot","carouselScroller","liItems","from","querySelectorAll","observer","IntersectionObserver","entries","entry","isIntersecting","updateAriaHidden","updateTabIndex","threshold","item","observe","element","$dots","PAGE_CHANGE","TOTAL_PAGES_CHANGE","renderDots","onDotClick","totalDots","empty","previouslyActive","currentlyActive","updateAccessibilityAttributes","lastClosestIndex","collection","lastIndexOf","reduce","bestFit","x","abs","pageStartPoints","_this","documentElement","style","move","direction","updateMetrics","updateClosestItemAndPage","$buttons","children","onScroll","renderButtonStates","renderButtons","nativeSmoothingSupported","cancelAnimation","onButtonClick","scrollTo","scrollStart","scrollEnd","scrollerWidth","closestPage","closestItem","itemEndPoints","itemStartPoints","prevTotalPages","clientWidth","maxScrollLeft","scrollWidth","start","offsetLeft","end","offsetWidth","getComputedStyle","scrollSnapAlign","endsWith","push","_ref2","nextPage","smoothScrollSpeed","behavior","AJAX_CONTENT","LOADED","onCarouselFetched","_ListingCardCarousel","carousel","onClickToListingCard","path"],"sourceRoot":""}