{"version":3,"sources":["webpack:///external \"jQuery\"","webpack:///./src/scripts/header.js","webpack:///./src/scripts/alt-gray-white.js","webpack:///./src/scripts/superscripts.js","webpack:///./src/scripts/typography.js","webpack:///./src/scripts/layout.js","webpack:///./src/scripts/cards.js","webpack:///./src/scripts/toggle.js","webpack:///./src/scripts/alert-banner.js","webpack:///./src/scripts/blog.js","webpack:///./src/scripts/browse-by-topic.js","webpack:///./src/scripts/comp-feature-highlight.js","webpack:///./src/scripts/comparison-module.js","webpack:///./src/scripts/comparison-table.js","webpack:///./src/scripts/checkmark-lists.js","webpack:///./src/scripts/full-width-cta-banner.js","webpack:///./src/scripts/main-navigation.js","webpack:///./src/scripts/marketo-form.js","webpack:///./src/scripts/to-top.js","webpack:///./src/scripts/keyboard-focus.js","webpack:///./src/scripts/social-share.js","webpack:///./src/scripts/polyfills.js","webpack:///./src/scripts/scrolling.js","webpack:///./src/scripts/dialog-focus-restore.js","webpack:///./src/scripts/modal.js","webpack:///./src/scripts/helpers.js","webpack:///./src/scripts/footer.js","webpack:///./src/scripts/site-search/helpers.js","webpack:///./src/scripts/site-search/search-constants.js","webpack:///./src/scripts/site-search/search-tracker.js","webpack:///./src/scripts/loading-spinner.js","webpack:///./src/scripts/ada.js","webpack:///./src/scripts/site-search/site-search.js","webpack:///./src/scripts/site-search/inline-search.js","webpack:///./src/scripts/abstract-modal.js","webpack:///./src/scripts/mobile-menu.js","webpack:///./src/scripts/browser-detection.js","webpack:///./src/scripts/analytics.js","webpack:///./src/scripts/modal-iframe.js","webpack:///./src/scripts/bookings.js","webpack:///./src/scripts/add-ie-banner.js","webpack:///./src/scripts/faq.js","webpack:///./src/scripts/glia-analytics.js","webpack:///./src/scripts/modal-login.js","webpack:///./src/scripts/modal-video.js","webpack:///./src/scripts/predictive-search-faq.js","webpack:///./src/scripts/client-testimonials.js","webpack:///./src/scripts/ie11.js","webpack:///./src/scripts/gallery.js","webpack:///./src/scripts/security-center.js","webpack:///./src/scripts/location-map.js"],"names":["module","exports","jQuery","header","document","querySelector","body","classList","contains","window","IntersectionObserver","content","entries","isIntersecting","add","remove","threshold","rootMargin","observe","isWhite","sections","Array","from","querySelectorAll","filter","el","forEach","component","className","addEventListener","requestIdleCallback","sup","innerHTML","replace","specialCharacters","option","match","innerText","nonUnicodeCharacters","characters","split","map","c","isNaN","push","length","unshift","flat","join","cachedLineHeight","getLineHeight","isSingleLine","parseInt","getComputedStyle","lineHeight","useCachedLineHeight","height","offsetHeight","Math","abs","getStartedText","prevHeight","p","heading","parentElement","words","regex","RegExp","slice","ceil","isPageBuilder","kentico","pageBuilder","selectors","ignoreSelectors","removeChild","text","textContent","trim","closest","childElementCount","firstElementChild","windowResizeTimer","isResizing","handleResizeComplete","clearTimeout","setTimeout","group","dataset","count","wrapper","buttons","toggleBg","targets","value","undefined","Object","defineProperty","set","v","button","find","b","click","get","targetId","target","getElementById","console","warn","tabIndex","setAttribute","inactiveButton","toggle","id","dispatchEvent","Event","bubbles","alertSessionVal","name","cookie","getCookie","alert","alertid","close","stickyMap","hasAttribute","headerHeight","style","top","blogItems","loadMorePostsBtn","browseByOptions","handleOptionSelection","e","optionId","currentTarget","loadAjaxBlogs","card","handleLoadMoreBtn","pageNumber","generateBlogItem","categoryId","postTitle","postBody","postUrl","imageUrl","imageAltText","tag","post","createElement","href","isArray","cat","img","appendChild","ajaxSuccess","data","anyCards","blogs","Blogs","i","item","CategoryId","PostTitle","BodyTeaser","NodeAliasPath","Image","ImageAltText","IsMore","url","resultsCount","$","ajax","dataType","done","fail","load","innerWidth","handleToggleClick","currentToggleBtn","prevSibling","previousElementSibling","prevSiblingIsActive","toggleExpanded","getAttribute","feature","boxColumn","boxColumnCards","remainder","moduleContainers","productToggles","handleToggleSelection","activeClasses","checkedBtnLabels","currentModuleContainer","checkedRadioBtns","productItems","checkedBtn","offsetParent","product","moduleContainer","productToggle","select","moreFeatures","cells","visibleRows","selectedItem","cell","comparisonTable","headerCells","thTotalItems","thWidthTotal","th","clientWidth","updateThColWidth","setProductTypeColumnWidths","list","li","currentOffset","paragraphs","refresh","minLeft","maxRight","getBoundingClientRect","left","html","right","offset","round","ResizeObserver","prevWidth","hasInitialized","width","contentRect","resizeTimer","fwCtaBannerContainer","intFwBannerContainer","invisibleDuplicateContent","rows","CtaRow","fwCtaBannerColums","firstColumn","secondColumn","ctaContent","insertAdjacentHTML","preventDefault","stopPropagation","expanded","mktoForms","config","script","marketoFormEls","totalForms","formsRendered","mktoFormConfig","podId","munchkinId","formIds","formEl","Number","reduce","acc","nextFormId","indexOf","src","type","onload","MktoForms2","whenRendered","form","mktoForm","message","redirectUrl","getFormElem","concat","removeAttribute","styleSheets","ss","ownerNode","disabled","mktoForms2BaseStyle","mktoForms2ThemeStyle","destyleMktoForm","redirect","onSuccess","location","hide","node","parentNode","rando","Date","getTime","random","labelEl","forEl","htmlFor","createUniqueInputIds","formId","loadForm","bind","loadFormCb","formEls","shift","mktoFormChain","rootElement","documentElement","toTop","scrollTo","behavior","passive","key","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","s","this","call","nodeType","includes","searchElement","scrollbarWidth","getScrollbarWidth","hasStickyHeader","scrollPosition","outer","visibility","overflow","msOverflowStyle","inner","offsetWidth","disableScroll","pageYOffset","paddingRight","enableScroll","registerFocusRestoreDialog","WeakMap","MutationObserver","registered","previousFocus","ev","dialog","localName","has","realShowModal","showModal","savedFocus","activeElement","wasFocus","focus","defaultOptions","trigger","isTriggerLink","title","addCloseButton","observer","open","initializedModals","WeakSet","initModal","modal","opts","modalEl","assign","isDialog","tagName","dialogPolyfill","registerDialog","focusTrap","createFocusTrap","initialFocus","fallbackFocus","preventScroll","isOpen","activate","scrollTop","onOpen","shouldEnableScroll","deactivate","onClose","modalId","modalName","closestEl","titleEl","decodeURIComponent","parent","prepend","HTMLHeadingElement","closeButton","closeTriggers","mouseDownTarget","isEscape","attributes","attributeFilter","upperFirst","str","charAt","toUpperCase","getUrlParameter","search","substring","scrollToContainer","urlHash","clientHeight","elWithHashIdOffset","yOffset","attr","val","canvas","init","imgLoaded","drawCanvas","throttledDrawCanvas","func","inThrottle","limit","context","args","apply","throttle","drawTimer","isInView","dpr","devicePixelRatio","ctx","getContext","clearRect","size","canvasSize","newWidth","getImgSize","drawImage","readyState","resultCategories","path","cssClassName","topResultStyleIds","createResultsTitle","isBestBet","query","actions","freeze","GET_RESULTS","NO_RESULTS","SUGGESTED_TERM","UNSATISFACTORY_RESULTS","SearchTracker","manager","fireEvent","track","insertFeedbackElements","setFeedbackText","sendFeedback","show","options","callback","action","eventParams","callbackTimeout","minCallbackTimeout","gtag","dataLayer","arguments","hasCalled","hasReachedMinTimeout","fn","params","event_callback","event_timeout","keys","timeout","forceTrackEvent","currentQuery","toLowerCase","hasTrackedQuery","hasTrackedNoResults","hasTrackedSuggestedTerm","hasOwnProperty","search_term","trackEvent","queryTrackingTimeout","feedback","searchSettings","settings","feedbackTitle","feedbackText","feedbackButtonText","feedbackSentText","t","feedbackButton","feedbackSent","hasSubmittedFeedback","eventConfig","loadMoreIsLoadingText","isVisible","hasMoreResults","contentWrapper","Spinner","shouldAttach","strokeWidth","color","spinner","sizeOuter","sizeInner","attach","isAttached","visibilityState","HTMLElement","display","createScreenReaderText","sr","counter","children","image","selector","getAttributeNames","newEl","replaceChild","replaceTags","searchEntireDocument","searchEl","labelId","descriptionId","hasLabel","hasDescription","label","description","transformAriaLabels","childList","subtree","reducedMotionMediaQuery","matchMedia","shouldReduceMotion","prefersReducedMotion","requestFrame","requestAnimationFrame","addListener","SiteSearch","results","bestBetResults","noResults","noInput","announcer","loadMoreText","triggers","resultsWrapper","input","bestBetWrapper","tracker","loadMore","reset","error","links","shouldControlScroll","CustomEvent","delay","blur","isLoadMore","hasQuery","minCharacters","seed","ch","h1","h2","charCodeAt","imul","String","generateId","hasError","topResults","pageNum","resetOnClose","URL","origin","pathname","searchParams","getSettings","JSON","parse","a","fetch","response","json","suggestedTerms","termWrapper","iterationDelay","term","index","animationDelay","mobileSize","suggestionsVisible","adjustOffset","marginTop","sentinal","intersectionObserver","resizeObserver","unobserve","noResultsText","loadMoreButton","resultsTitle","insertBefore","bestBetTitle","createBestBetLinksWrapper","bg","topShadow","marginRight","createAndPositionFixedElements","elements","first","last","link","hash","headerOffset","scrollY","floor","scrollX","runAnimationCallbacks","preventCallbacks","handleReducedMotion","shiftKey","focusTimer","isLoading","startLoading","loadingSpinnerDelay","queryLower","debounceTime","debounceTimeInitial","abort","AbortController","signal","status","has_results","totalPages","queryId","nodeId","self","topResultElements","createDocumentFragment","r","subtitle","resultCss","createTextNode","head","result","titleWrapper","subtitleEl","category","contentEl","createTopResult","resultElements","resultElement","pageName","hostname","categoryEl","urlEl","protocol","createResult","addLinks","isInitial","hasResults","hasTopResults","hasNoResults","Promise","resolve","errorContent","hasInput","searchBoxId","searchId","noResultsElement","errorElement","isHovering","activeIndex","prevResults","cachedResults","abortController","hasInitialResultsAfterFocus","setIsLoading","addResults","isValid","ok","isCurrentQuery","handleError","filterResults","cacheResults","searchTimer","clearResultsTimer","backspacePressed","isLoadingTimer","isLoadingPromise","clearResults","append","every","numResults","resultsFragment","role","icon","scrollToResults","cacheKeys","inlineSearchScrollToResults","resultsBottom","bottom","innerHeight","activeElementWasChangedByMouse","activeIndexBeforeMouseout","setActiveElement","isKeyboard","numElements","isActive","scrollHeight","scrollIntoView","block","prevIndex","element","handleModalBtnLink","modalTarget","spaceBarTriggerAbstractModal","modalBtnLink","modalSelectors","main","mobileMenuOpen","topNav","menuButton","hasAlert","transitionTimer","positionHeader","preventAnimation","transform","closeMobileMenu","forceClose","wrapperTransitionTimer","device","os","windows","test","navigator","platform","mac","ios","userAgent","maxTouchPoints","android","browser","chrome","edge","firefox","safari","ie","documentMode","isMobile","operatingSystems","browsers","setDevice","defaultEventName","eventName","eventCallback","fireImmediately","customParams","callbackWithTimeout","initIframeModal","setIframeModalVars","iframeDelay","hasDelay","modalContent","titleText","iframeWrapper","iframe","modalOptions","iframeModal","modalTitle","bannerAdded","initBookingOptions","bookingAttributeUrl","bookingModal","bookingDelay","bookingTitle","isAgentSpecificPage","agentName","page","firstName","lastName","startsWith","parts","booking_page","is_agent","agent_name","faqParamVal","topicParamVal","subTopicParamVal","accordionFAQ","accordionFAQCards","browseFAQAccordion","browseFAQCards","browseByTopicNavAccordion","browseBySubTopicNavBtns","expandFirstVisibleFaq","collapseAllFaqs","expandNavTopic","topicParam","topicBtn","topicCollapse","hideAllBrowseFaqs","faqs","faq","filterBrowseFAQsByTopic","topic","filterBrowseFAQsBySubTopic","subtopic","faqTopic","faqSubTopic","handleSubTopicNav","currentSubTopic","subTopicParent","subTopic","param","shouldScroll","faqCollapseBtn","expandedFaqId","expandFaqItem","topicNavFaqDisplay","subTopicBtn","on","expandedItem","navTopic","formatDuration","startTimeISO","startTime","formatted","durationMS","initGlia","sm","getApi","version","then","glia","EVENTS","ENGAGEMENT_START","engagement","chat_type","startingMedia","ENGAGEMENT_END","chat_duration","createdAt","accounts","migrationStatus","isBeforeMigration","isMigrationActive","isMigrationComplete","businessUserRequiresMigrationCheck","currentBusinessUser","currentBusinessUserLoginUrl","usernameInput","shouldAutofocusLogin","businessQ2LoginUrl","businessFiservLoginUrl","hasInitializedBusiness","hasBusinessScriptError","queueBusinessSubmit","hasTracked","submitForm","loginButton","setFormCanSubmit","canSubmit","submitButton","handleLoginError","shouldEnableSubmit","isBusiness","app","scriptSrc","q2LoginUrl","submittedUsername","EBC","RemoteLogin","applicationPath","routingTransit","usernameId","passwordId","submitCallback","errorCallback","fiservOnSubmitFn","onsubmit","onerror","currentScript","initBusinessRemoteLogin","hasErrors","field","validateFields","userName","stopImmediatePropagation","routeBusinessUserLogin","disableLoginTracking","trackLogin","isRetry","username","isQ2User","isMigrated","defaultAccountType","localStorage","getItem","accountTypeToggle","saveAccountTypeWrapper","saveAccountTypeCheckbox","isValidAccountType","updateDefaultAccountTypeBox","accountType","checked","accountTypeResizeObserver","disconnect","marginBottom","setItem","removeItem","loginUrlParameter","timer","transitionProperty","supportsKeepAlive","Request","stringify","method","keepalive","headers","Accept","sendBeacon","tooltip","willShow","modalTrigger","dataTarget","play","contentWindow","postMessage","defaultParams","enablejsapi","rel","modestbranding","one","noResultsTextEl","predictiveSearch","autoComplete","source","questions","cache","sort","placeHolder","debounce","searchEngine","resultsList","render","container","destination","position","maxResults","highlight","resultItem","slick","dots","arrows","slidesToShow","slidesToScroll","updateSVGs","galleries","gallery","galleryEl","enabled","lightGallery","plugins","lgZoom","lgThumbnail","lgVideo","licenseKey","enableDrag","getCaptionFromTitleOrAlt","speed","newWrapper","wrap","contents","unwrap","unwrapGalleryItems","listing","loadMoreWrapper","endpoint","currentPage","errorMessage","res","refreshPostListing","before","posts","areMorePostsAvailable","fragment","headline","teaser","imgWrapper","alt","createArticleCard","locationMapEl","markers","circle","fremontStyledMapType","locationsData","urlLocationParam","urlSearchParam","isMapZoomed","infoWindowInitialized","$locationMap","$locations","$locationsSearchBtn","$locationResetBtn","$locationsGeoLocatorBtn","$locationListingBtns","$locationDetailBranchAddress","$locationListingSearchInput","$locationDetailsSearch","$locationDetailsSearchInput","$noSearchResults","normalMarkerIcon","activeMarkerIcon","gmarkers","fremontCA","lat","lng","initializeMap","google","maps","Map","zoom","center","mapTypeControl","streetViewControl","styleGoogleMap","domElement","locationData","marker","Marker","markerID","j","setIcon","infoWindow","setContent","$element","event","getDiv","mapTypes","setMapTypeId","orderByRadiusDistance","filteredLocations","radius","numLocationWithinRadius","filteredLocationsByDistance","ld","locationPosition","getPosition","distance","geometry","spherical","computeDistanceBetween","setMap","hideAllMapMarkers","setVisible","showMapMarkersByRadius","milesAway","milesAwayRounded","lbd","$parent","detach","appendTo","removeClass","searchByZipRadius","radiusVal","zipCitySearchVal","geocoder","geocode","address","toString","addClass","setCenter","setZoom","Circle","strokeColor","strokeOpacity","strokeWeight","fillOpacity","fillColor","showResetBtn","handleGeoLocationError","browserHasGeolocation","pos","setPosition","displayCurrentGeolocation","geolocation","getCurrentPosition","coords","latitude","longitude","animation","Animation","DROP","removeDistanceFromCurrentLocation","getCenter","redirectFromDetailsWithParam","searchContainer","searchVal","locationPageUrl","resetMap","each","removeAttr","nlo","StyledMapType","elementType","stylers","featureType","css","setInterval","infoWindowOpen","getMap","Geocoder","InfoWindow","pixelOffset","Size","$listingBtn","btnAddress","locationInfoHtml","hasClass","not","branchAddress","infoWindowContent","$locationElement","is","activateLocation","detailPageLocation","$locationDetailGeoLocatorBtn","$locationDetailSearchBtn"],"mappings":"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","file":"scripts/main.99dbff400f0038067153.js","sourcesContent":["module.exports = jQuery;","const header = document.querySelector('#header');\r\n\r\nif (header && document.body.classList.contains('homepage')) {\r\n if (window.IntersectionObserver) {\r\n const content = document.querySelector('#main section, #main div');\r\n\r\n if (content) {\r\n const observer = new IntersectionObserver(\r\n entries => {\r\n if (entries[0].isIntersecting) {\r\n header.classList.add('no-bg');\r\n } else {\r\n header.classList.remove('no-bg');\r\n }\r\n\r\n header.classList.add('loaded');\r\n },\r\n { threshold: 1, rootMargin: '15px 0px 0px 0px' }\r\n );\r\n\r\n observer.observe(content);\r\n }\r\n } else {\r\n header.classList.add('loaded');\r\n }\r\n}\r\n","const sections = Array.from(\r\n document.querySelectorAll('main > div, main > section')\r\n).filter(\r\n el =>\r\n !el.classList.contains('ignore-alt-bg') &&\r\n !el.classList.contains('component-placeholder')\r\n);\r\n\r\nfunction shouldSetBackgrounds() {\r\n if (document.body.classList.contains('no-alt-bg')) return false;\r\n\r\n return document.body.classList.contains('landing-page')\r\n ? document.body.classList.contains('alt-section-bg')\r\n : !document.querySelector('div[class*=\"blog-\"], section[class*=\"blog-\"]');\r\n}\r\n\r\nfunction setAlternateGrayBackground() {\r\n let isWhite = false;\r\n\r\n sections.forEach(component => {\r\n isWhite = !isWhite;\r\n\r\n if (component.classList.contains('continue-alt-bg')) {\r\n isWhite = false;\r\n return;\r\n }\r\n\r\n if (component.classList.contains('bg-white')) {\r\n isWhite = true;\r\n } else if (component.classList.contains('bg-gray-100')) {\r\n isWhite = false;\r\n }\r\n\r\n const className = isWhite ? 'bg-white' : 'bg-gray-100';\r\n component.classList.add(className);\r\n });\r\n}\r\n\r\nif (shouldSetBackgrounds()) {\r\n setAlternateGrayBackground();\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n window.requestIdleCallback(() => {\r\n document.body.classList.remove('initializing');\r\n });\r\n});\r\n\r\nif (document.body.classList.contains('KenticoAdmin')) {\r\n document.body.classList.remove('initializing');\r\n}\r\n","// Use interstate font for registered symbols\r\ndocument.querySelectorAll('sup').forEach(sup => {\r\n sup.innerHTML = sup.innerHTML.replace(\r\n /(®|®)/g,\r\n '$1'\r\n );\r\n});\r\n\r\n// Replace tags in select boxes with unicode characters\r\nconst specialCharacters = {\r\n '+': '⁺',\r\n '*': '*'\r\n};\r\n\r\ndocument.querySelectorAll('select option').forEach(option => {\r\n const match = option.innerText.match(/(.*)<\\/sup>/);\r\n\r\n if (match) {\r\n const nonUnicodeCharacters = [];\r\n let characters = match[1]\r\n .split(/,?/)\r\n .map(c => {\r\n if (!isNaN(c)) {\r\n return `&sup${c}`;\r\n }\r\n\r\n if (specialCharacters[c]) {\r\n nonUnicodeCharacters.push(c);\r\n }\r\n\r\n return specialCharacters[c] || c;\r\n })\r\n .filter(c => c);\r\n\r\n if (nonUnicodeCharacters.length) {\r\n characters.unshift(nonUnicodeCharacters);\r\n characters = characters.flat();\r\n }\r\n\r\n option.innerHTML = option.innerText.replace(match[0], characters.join(' '));\r\n }\r\n});\r\n","// Adds a line break to 'get started' boxes\r\n// when the text only takes up a single line\r\nconst isSingleLine = (() => {\r\n let cachedLineHeight = null;\r\n\r\n const getLineHeight = el => {\r\n return parseInt(window.getComputedStyle(el).lineHeight);\r\n };\r\n\r\n return (el, useCachedLineHeight = true) => {\r\n if (!el) {\r\n return false;\r\n }\r\n\r\n if (useCachedLineHeight && !cachedLineHeight) {\r\n cachedLineHeight = getLineHeight(el);\r\n }\r\n\r\n const lineHeight =\r\n useCachedLineHeight && cachedLineHeight ? cachedLineHeight : getLineHeight(el);\r\n const height = el.offsetHeight;\r\n\r\n return Math.abs(height - lineHeight) < 2;\r\n };\r\n})();\r\n\r\nconst getStartedText = Array.from(document.querySelectorAll('.get-started .card p'));\r\nlet prevHeight = null;\r\n\r\nfor (let text of getStartedText) {\r\n const height = text.offsetHeight;\r\n\r\n if (!prevHeight || height === prevHeight) {\r\n prevHeight = height;\r\n } else {\r\n getStartedText.forEach(p => {\r\n if (!p.innerHTML || p.classList.contains('single-line') || p.querySelector('br')) {\r\n return;\r\n }\r\n\r\n if (isSingleLine(p)) {\r\n const heading = p.parentElement.querySelector('h3');\r\n\r\n if (heading && !isSingleLine(heading, false)) {\r\n return;\r\n }\r\n\r\n const words = p.innerText.split(' ');\r\n\r\n if (words.length >= 5) {\r\n const regex = new RegExp(\r\n `(${words.slice(0, Math.ceil(words.length / 2)).join(' ')})`\r\n );\r\n p.innerHTML = p.innerHTML.replace(regex, '$1
');\r\n }\r\n }\r\n });\r\n\r\n break;\r\n }\r\n}\r\n\r\n// Temporarily hide post meta until\r\n// component is updated to make optional\r\ndocument.querySelector('.blog-article .post-meta')?.remove();\r\n","// Prevent empty content areas from\r\n// creating inconsistent whitespace\r\nconst isPageBuilder =\r\n !!window.kentico?.pageBuilder ||\r\n document.body.classList.contains('KenticoAdminPageBuilder');\r\n\r\nconst selectors = [\r\n '.section-content',\r\n '.section-bottom',\r\n '.content-section > .content-wrapper'\r\n].join(',');\r\n\r\nconst ignoreSelectors = [\r\n '.show-empty-content',\r\n '.mkto-form-wrapper',\r\n 'form',\r\n 'img',\r\n 'video',\r\n 'iframe',\r\n 'audio',\r\n 'svg',\r\n 'script',\r\n 'style'\r\n].join(',');\r\n\r\nif (!isPageBuilder) {\r\n document\r\n .querySelectorAll('.hidden-content-section')\r\n .forEach(el => el.parentElement.removeChild(el));\r\n}\r\n\r\ndocument.querySelectorAll(selectors).forEach(el => {\r\n const text = el.textContent.trim();\r\n if (text) return;\r\n\r\n // Don't remove empty element if it contains elements that\r\n // still need to be initialized, aren't expected to contain\r\n // text, or if section property specifically allows empty content\r\n if (el.querySelector(ignoreSelectors) || el.closest('.show-empty-content')) {\r\n return;\r\n }\r\n\r\n // Multicolumn sections with empty body content\r\n if (!text && !isPageBuilder && el.querySelector('.content-row')) {\r\n el.parentElement.removeChild(el);\r\n return;\r\n }\r\n\r\n // Other elements with empty content\r\n if (\r\n !text &&\r\n !isPageBuilder &&\r\n !el.classList.contains('has-page-builder') &&\r\n el.childElementCount < 2 &&\r\n !el.firstElementChild?.childElementCount\r\n ) {\r\n el.parentElement.removeChild(el);\r\n }\r\n});\r\n\r\n// Adds CSS class to body while\r\n// the window is being resized\r\nlet windowResizeTimer = null;\r\nlet isResizing = false;\r\n\r\nfunction handleResizeComplete() {\r\n isResizing = false;\r\n document.body.classList.remove('resizing');\r\n}\r\n\r\nwindow.addEventListener('resize', () => {\r\n clearTimeout(windowResizeTimer);\r\n\r\n if (!isResizing) {\r\n isResizing = true;\r\n document.body.classList.add('resizing');\r\n }\r\n\r\n windowResizeTimer = setTimeout(handleResizeComplete, 70);\r\n});\r\n","document.querySelectorAll('.card-group').forEach(group => {\r\n group.dataset.count = group.querySelectorAll('.card').length;\r\n});\r\n","document.querySelectorAll('.toggle-wrapper').forEach(wrapper => {\r\n const buttons = wrapper.querySelectorAll('.toggle-button');\r\n const toggleBg = wrapper.querySelector('.toggle-bg');\r\n const targets = [];\r\n\r\n if (!buttons.length) return;\r\n\r\n let value = undefined;\r\n\r\n Object.defineProperty(wrapper, 'value', {\r\n set: v => {\r\n const button = Array.from(buttons).find(b => b.value === v);\r\n button?.click();\r\n value = button?.value;\r\n },\r\n get: () => value\r\n });\r\n\r\n buttons.forEach(button => {\r\n const targetId = button.dataset.target;\r\n let target = null;\r\n\r\n if (targetId) {\r\n target = document.getElementById(button.dataset.target);\r\n\r\n if (target) {\r\n targets.push(target);\r\n } else {\r\n console.warn(`Toggle element not found: ${targetId ?? 'No target'} `);\r\n }\r\n }\r\n\r\n if (button.classList.contains('active')) {\r\n value = button.value;\r\n button.tabIndex = -1;\r\n if (target) target.classList.add('active');\r\n }\r\n\r\n button.addEventListener('click', () => {\r\n value = button.value;\r\n button.classList.add('active');\r\n button.setAttribute('aria-pressed', 'true');\r\n button.tabIndex = -1;\r\n\r\n const inactiveButton = button === buttons[0] ? buttons[1] : buttons[0];\r\n inactiveButton.classList.remove('active');\r\n inactiveButton.setAttribute('aria-pressed', 'false');\r\n inactiveButton.tabIndex = 0;\r\n\r\n toggleBg?.classList.toggle('right', button === buttons[1]);\r\n\r\n if (target) {\r\n targets.forEach(el => el.classList.toggle('active', el.id === targetId));\r\n }\r\n\r\n wrapper.dispatchEvent(\r\n new Event('change', {\r\n bubbles: true\r\n })\r\n );\r\n });\r\n });\r\n});\r\n","function getCookie(name) {\r\n const match = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`));\r\n\r\n if (match) {\r\n return match[2];\r\n }\r\n}\r\n\r\nconst alertSessionVal = getCookie('alert_session');\r\n\r\ndocument.querySelectorAll('.alert-bar').forEach(alert => {\r\n const id = alert.dataset.alertid;\r\n\r\n alert.classList.toggle('d-none', id && alertSessionVal === id);\r\n\r\n const close = alert.querySelector('.alert-close-btn');\r\n\r\n if (close) {\r\n close.addEventListener('click', () => {\r\n if (id) {\r\n document.cookie = `alert_session=${id}; expires=Fri, 31 Dec 9999 23:59:59 GMT`;\r\n }\r\n\r\n alert.parentElement.removeChild(alert);\r\n\r\n if (!document.querySelector('.alert-bar')) {\r\n document\r\n .querySelectorAll('.has-alert')\r\n .forEach(el => el.classList.remove('has-alert'));\r\n\r\n const stickyMap = document.querySelector('.locations-map .sticky-map');\r\n\r\n if (stickyMap?.hasAttribute('style')) {\r\n const headerHeight = document.querySelector('#header')?.offsetHeight ?? 0;\r\n stickyMap.style.top = `${headerHeight}px`;\r\n }\r\n }\r\n });\r\n }\r\n});\r\n","const blogItems = document.querySelector('#blog-items');\r\nconst loadMorePostsBtn = document.querySelector('#loadMorePosts');\r\nconst browseByOptions = document.querySelectorAll('.browse-by-category input');\r\n\r\nfunction handleOptionSelection(e) {\r\n const option = e.currentTarget;\r\n const optionId = option.id;\r\n\r\n blogItems.innerHTML = '';\r\n loadMorePostsBtn.classList.remove('d-none');\r\n loadAjaxBlogs(0, optionId);\r\n\r\n // var blogListCards = document.querySelectorAll('.blog-list-grid .card');\r\n var blogListCards = document.querySelectorAll('.blog-list-grid .tile');\r\n\r\n blogListCards.forEach(function (card) {\r\n if (optionId === 'all-articles') {\r\n // reset\r\n card.classList.remove('d-none');\r\n } else if (card.classList.contains(optionId)) {\r\n card.classList.remove('d-none');\r\n } else {\r\n card.classList.add('d-none');\r\n }\r\n });\r\n}\r\n\r\nfunction handleLoadMoreBtn() {\r\n loadAjaxBlogs(window.pageNumber + 1);\r\n}\r\n\r\nfunction defaultAllArticles() {\r\n browseByOptions[0].setAttribute('checked', '');\r\n browseByOptions[0].parentElement.classList.add('active');\r\n}\r\n\r\nfunction generateBlogItem(\r\n categoryId = [],\r\n postTitle,\r\n postBody,\r\n postUrl,\r\n imageUrl,\r\n imageAltText\r\n) {\r\n // Set up post tile\r\n const tag = postUrl ? 'a' : 'div';\r\n const post = document.createElement(tag);\r\n post.className = 'tile';\r\n\r\n if (postUrl) {\r\n post.href = postUrl;\r\n }\r\n\r\n if (Array.isArray(categoryId)) {\r\n categoryId.forEach(cat => post.classList.add(cat));\r\n }\r\n\r\n // Add thumbnail\r\n imageUrl = imageUrl?.trim();\r\n\r\n if (imageUrl) {\r\n const img = document.createElement('div');\r\n img.className = 'tile-image';\r\n img.innerHTML = `\r\n \"${imageAltText}\"\r\n `.trim();\r\n\r\n post.appendChild(img);\r\n }\r\n\r\n const content = document.createElement('div');\r\n content.className = 'tile-content';\r\n content.innerHTML = `\r\n
\r\n

${postTitle}

\r\n
\r\n
\r\n

${postBody}

\r\n
\r\n `;\r\n\r\n post.appendChild(content);\r\n\r\n return post;\r\n}\r\n\r\nfunction ajaxSuccess(data) {\r\n var anyCards = false;\r\n var blogs = data.Blogs;\r\n for (var i in blogs) {\r\n anyCards = true;\r\n var item = blogs[i];\r\n var post = generateBlogItem(\r\n item.CategoryId,\r\n item.PostTitle,\r\n item.BodyTeaser,\r\n item.NodeAliasPath,\r\n item.Image,\r\n item.ImageAltText,\r\n ''\r\n );\r\n\r\n blogItems.appendChild(post);\r\n }\r\n\r\n if (anyCards === false || data.IsMore === false) {\r\n loadMorePostsBtn.classList.add('d-none');\r\n }\r\n\r\n blogItems.dataset.count = blogItems.childElementCount;\r\n}\r\n\r\nfunction loadAjaxBlogs(pageNumber, optionId) {\r\n window.pageNumber = pageNumber;\r\n\r\n if (typeof optionId !== 'undefined') window.categoryId = optionId;\r\n const url = `/apis/BlogListingApi/Blogs/${pageNumber}?cat=${window.categoryId}&count=${window.resultsCount}`;\r\n $.ajax({\r\n url,\r\n dataType: 'json'\r\n })\r\n .done(ajaxSuccess)\r\n .fail(function () {});\r\n}\r\n\r\nfunction load() {\r\n window.resultsCount = 8;\r\n\r\n if (window.innerWidth >= 992) {\r\n window.resultsCount = 8;\r\n } else if (window.innerWidth >= 768 && window.innerWidth < 992) {\r\n window.resultsCount = 4;\r\n } else if (window.innerWidth < 768) {\r\n window.resultsCount = 4;\r\n }\r\n\r\n blogItems.innerHTML = '';\r\n loadAjaxBlogs(0, '');\r\n\r\n if (loadMorePostsBtn !== null) {\r\n loadMorePostsBtn.addEventListener('click', handleLoadMoreBtn);\r\n }\r\n\r\n if (browseByOptions.length > 0) {\r\n // browse by category filter\r\n browseByOptions.forEach(function (option) {\r\n option.addEventListener('click', handleOptionSelection);\r\n });\r\n\r\n defaultAllArticles();\r\n }\r\n}\r\n\r\nwindow.resultsCount = 8;\r\nwindow.addEventListener('load', () => {\r\n if (blogItems) {\r\n load();\r\n }\r\n});\r\n","function handleToggleClick (e) {\r\n const currentToggleBtn = e.currentTarget;\r\n const prevSibling = currentToggleBtn.previousElementSibling;\r\n\r\n const prevSiblingIsActive = prevSibling.classList.contains('active');\r\n const toggleExpanded = currentToggleBtn.getAttribute('aria-expanded');\r\n\r\n if (prevSiblingIsActive) {\r\n prevSibling.classList.remove('active');\r\n } else {\r\n prevSibling.classList.add('active');\r\n }\r\n\r\n // accessibility: set state of dropdown section\r\n toggleExpanded === 'true'\r\n ? currentToggleBtn.setAttribute('aria-expanded', 'false')\r\n : currentToggleBtn.setAttribute('aria-expanded', 'true');\r\n}\r\n\r\n// get all toggles\r\nconst dropdownToggles = document.querySelectorAll('.topic-toggle');\r\ndropdownToggles.forEach(function (button) {\r\n button.addEventListener('click', handleToggleClick);\r\n});\r\n","const featureBoxes = document.querySelectorAll('.full-width-feature-highlights-content-boxes');\r\n\r\nfeatureBoxes.forEach(function (feature) {\r\n const boxColumn = feature.querySelector('.box-columns');\r\n const boxColumnCards = feature.querySelectorAll('.box-columns .card').length;\r\n const remainder = boxColumnCards % 2;\r\n\r\n if (boxColumnCards > 3 && remainder === 0) {\r\n boxColumn.classList.add('even');\r\n } else if (boxColumnCards > 3 && remainder === 1) {\r\n boxColumn.classList.add('odd');\r\n }\r\n});\r\n","const moduleContainers = document.querySelectorAll('.comparison-module');\r\nconst productToggles = document.querySelectorAll('.comparison-module input');\r\n\r\nfunction displayDefault() {\r\n moduleContainers.forEach(function (moduleContainer) {\r\n let activeClasses = '';\r\n const checkedRadioBtns = moduleContainer.querySelectorAll('input:checked');\r\n\r\n checkedRadioBtns.forEach(function (checkedBtn) {\r\n activeClasses += '.' + checkedBtn.id;\r\n });\r\n\r\n // show selected\r\n const productsToShow = moduleContainer.querySelectorAll(activeClasses);\r\n productsToShow.forEach(function (product) {\r\n product.classList.remove('d-none');\r\n });\r\n });\r\n\r\n document.querySelector('.comparison-disclosure')?.classList.remove('d-none');\r\n}\r\n\r\nfunction handleToggleSelection(e) {\r\n let activeClasses = '',\r\n checkedBtnLabels = '';\r\n\r\n const clickedInput = e.currentTarget;\r\n const currentModuleContainer = clickedInput.closest('.comparison-module');\r\n const checkedRadioBtns = currentModuleContainer.querySelectorAll(\r\n 'input:checked'\r\n );\r\n const productItems = currentModuleContainer.querySelectorAll('.product-item');\r\n\r\n checkedRadioBtns.forEach(function (checkedBtn) {\r\n activeClasses += '.' + checkedBtn.id;\r\n\r\n // build screen reader alert message\r\n checkedRadioBtns[checkedRadioBtns.length - 1] === checkedBtn\r\n ? (checkedBtnLabels += checkedBtn.offsetParent.innerText)\r\n : (checkedBtnLabels += checkedBtn.offsetParent.innerText + ', ');\r\n });\r\n\r\n // set screen reader alert message\r\n const messageEl = currentModuleContainer.querySelector('#visibleProducts');\r\n messageEl.innerHTML = checkedBtnLabels + ' currently selected product types';\r\n\r\n // hide all\r\n productItems.forEach(function (product) {\r\n product.classList.add('d-none');\r\n });\r\n\r\n // show selected\r\n const productsToShow = currentModuleContainer.querySelectorAll(activeClasses);\r\n productsToShow.forEach(function (product) {\r\n product.classList.remove('d-none');\r\n });\r\n}\r\n\r\ndisplayDefault();\r\n\r\nproductToggles.forEach(function (productToggle) {\r\n productToggle.addEventListener('click', handleToggleSelection);\r\n});\r\n","const select = document.querySelector('.comparison-table select');\r\nconst moreFeatures = document.querySelector('.more-features');\r\nconst cells = document.querySelectorAll(\r\n '.comparison-table tr:not(.more-features) td:not(.invisible)'\r\n);\r\nconst visibleRows = document.querySelectorAll(\r\n '.comparison-table tbody tr:not(.more-features):not(.learn-more-links)'\r\n).length;\r\n\r\nfunction hideSeeMoreFeatures() {\r\n if (visibleRows <= 4) {\r\n moreFeatures.classList.add('d-none');\r\n }\r\n}\r\n\r\nfunction handleCellVisibility() {\r\n const currentWidth = window.innerWidth;\r\n\r\n if (currentWidth > 991) {\r\n cells.forEach(function (cell) {\r\n cell.classList.add('d-lg-table-cell');\r\n });\r\n }\r\n}\r\n\r\n// update to prevent column(s) expanding when 'see more features' is expanded on desktop\r\nfunction setProductTypeColumnWidths() {\r\n const comparisonTable = document.querySelector('.comparison-table');\r\n\r\n if (comparisonTable !== null) {\r\n const headerCells = comparisonTable.querySelectorAll(\r\n '.desktop th:not(:first-of-type):not(.invisible)'\r\n );\r\n\r\n if (headerCells.length > 0) {\r\n const thTotalItems = headerCells.length;\r\n let thWidthTotal = 0;\r\n\r\n // get total width of select header cells\r\n headerCells.forEach(function (th) {\r\n thWidthTotal += th.clientWidth;\r\n });\r\n\r\n // set width of each header cell\r\n const updateThColWidth = thWidthTotal / thTotalItems;\r\n headerCells.forEach(function (th) {\r\n th.setAttribute('style', 'width: ' + updateThColWidth + 'px');\r\n });\r\n }\r\n }\r\n}\r\n\r\nif (select !== null) {\r\n select.addEventListener('change', function (e) {\r\n var selectedItem = e.currentTarget.value;\r\n\r\n cells.forEach(cell => {\r\n if (!cell.classList.contains('th')) {\r\n if (cell.classList.contains(selectedItem)) {\r\n cell.classList.remove('d-none');\r\n } else {\r\n cell.classList.add('d-none');\r\n }\r\n }\r\n });\r\n });\r\n}\r\n\r\nif (cells.length) {\r\n window.addEventListener('resize', handleCellVisibility);\r\n\r\n document.addEventListener('DOMContentLoaded', () => {\r\n setProductTypeColumnWidths();\r\n visibleRows ? hideSeeMoreFeatures() : '';\r\n });\r\n}\r\n","document.querySelectorAll('.checkmark-list.two-col').forEach(list => {\r\n const li = list.querySelector('li');\r\n\r\n if (!li) {\r\n return;\r\n }\r\n\r\n let currentOffset = 0;\r\n const paragraphs = list.querySelectorAll('.text > p');\r\n\r\n const refresh = () => {\r\n let minLeft = null;\r\n let maxRight = 0;\r\n\r\n paragraphs.forEach(p => {\r\n if (minLeft === null) {\r\n minLeft = li.getBoundingClientRect().left - currentOffset;\r\n }\r\n\r\n const html = p.innerHTML;\r\n p.innerHTML = `${html}`;\r\n\r\n const right =\r\n p.firstElementChild.getBoundingClientRect().right - currentOffset;\r\n\r\n if (right > maxRight) {\r\n maxRight = right;\r\n }\r\n\r\n p.innerHTML = html;\r\n });\r\n\r\n if (minLeft && maxRight) {\r\n let offset = (window.innerWidth - maxRight - minLeft) / 2;\r\n\r\n if (!isNaN(offset)) {\r\n offset = Math.round(offset);\r\n\r\n if (offset !== currentOffset) {\r\n list.style.left = `${offset}px`;\r\n currentOffset = offset;\r\n }\r\n } else {\r\n list.style.left = null;\r\n }\r\n } else {\r\n list.style.left = null;\r\n }\r\n };\r\n\r\n if (window.ResizeObserver) {\r\n let prevWidth = null;\r\n let hasInitialized = false;\r\n\r\n const observer = new ResizeObserver(entries => {\r\n const { width } = entries[0].contentRect;\r\n\r\n if (\r\n hasInitialized &&\r\n (!prevWidth || width !== prevWidth) &&\r\n window.innerWidth >= 767\r\n ) {\r\n prevWidth = width;\r\n refresh();\r\n }\r\n\r\n if (!hasInitialized) {\r\n hasInitialized = true;\r\n }\r\n });\r\n\r\n observer.observe(list);\r\n refresh();\r\n list.classList.remove('hidden');\r\n } else {\r\n refresh();\r\n list.classList.remove('hidden');\r\n\r\n let resizeTimer = null;\r\n\r\n window.addEventListener('resize', () => {\r\n clearTimeout(resizeTimer);\r\n\r\n if (window.innerWidth >= 767) {\r\n resizeTimer = setTimeout(refresh, 50);\r\n }\r\n });\r\n }\r\n});\r\n","\r\nconst fwCtaBannerContainer = document.querySelector('.component-full-width-cta-banner');\r\nconst intFwBannerContainer = document.querySelector('.interior-full-width-banner');\r\n\r\nfunction invisibleDuplicateContent(rows) {\r\n rows.forEach(function (CtaRow) {\r\n const fwCtaBannerColums = CtaRow.querySelectorAll('div[class^=\"col\"]');\r\n const firstColumn = fwCtaBannerColums[0];\r\n const secondColumn = fwCtaBannerColums[1];\r\n\r\n const ctaContent = firstColumn.innerHTML;\r\n\r\n // (╯°□°)╯︵ ┻━┻\r\n // hack to address height of CTA container in mobile\r\n secondColumn.classList.add('invisible'); // hide, remove from accessibility tree\r\n secondColumn.classList.add('py-5');\r\n secondColumn.insertAdjacentHTML('afterbegin', ctaContent)\r\n });\r\n}\r\n\r\nif (fwCtaBannerContainer) {\r\n const fwCtaBannerContainerRows = document.querySelectorAll('.component-full-width-cta-banner .row');\r\n invisibleDuplicateContent(fwCtaBannerContainerRows);\r\n}\r\n\r\nif (intFwBannerContainer) {\r\n const intFwBannerContainerRows = document.querySelectorAll('.interior-full-width-banner .row');\r\n invisibleDuplicateContent(intFwBannerContainerRows);\r\n}\r\n","document\r\n .querySelectorAll('.main-nav .toggle-submenu-button')\r\n .forEach(button => {\r\n button.addEventListener('click', e => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const expanded =\r\n button.getAttribute('aria-expanded') === 'true' ? 'false' : 'true';\r\n\r\n button.setAttribute('aria-expanded', expanded);\r\n button.parentElement.setAttribute('data-expanded', expanded);\r\n });\r\n });\r\n","const marketoFormEls = Array.from(document.querySelectorAll('.mkto-form[data-formId]'));\r\nconst totalForms = marketoFormEls.length;\r\nlet formsRendered = 0;\r\n\r\n/* config area - replace with your instance values */\r\n\r\nconst mktoFormConfig = {\r\n podId: '//app-sj06.marketo.com',\r\n munchkinId: '614-UNR-911',\r\n formIds: getUniqueFormIds(marketoFormEls)\r\n};\r\n\r\nif (totalForms) {\r\n addMarketoScript(mktoFormConfig);\r\n}\r\n\r\n/* ---- FUNCTIONS ---- */\r\n\r\nfunction addMarketoScript(config) {\r\n const script = document.createElement('script');\r\n script.src = `${config.podId}/js/forms2/js/forms2.min.js`;\r\n script.type = 'text/javascript';\r\n script.onload = () => {\r\n mktoFormChain(config);\r\n };\r\n document.body.appendChild(script);\r\n}\r\n\r\nfunction mktoFormChain(config) {\r\n MktoForms2.whenRendered(form => {\r\n formsRendered++;\r\n destyleMktoForm(form);\r\n onFormSubmit(form);\r\n /* fix inter-form label bug */\r\n createUniqueInputIds(form);\r\n });\r\n\r\n /* chain, ensuring only one #mktoForm_nnn exists at a time */\r\n config.formIds.forEach(formId => {\r\n const loadForm = MktoForms2.loadForm.bind(\r\n MktoForms2,\r\n config.podId,\r\n config.munchkinId,\r\n formId\r\n );\r\n\r\n const formEls = marketoFormEls.filter(\r\n el => Number(el.getAttribute('data-formId')) === formId\r\n );\r\n\r\n (function loadFormCb(formEls) {\r\n const formEl = formEls.shift();\r\n formEl.id = 'mktoForm_' + formId;\r\n\r\n loadForm(() => {\r\n formEl.id = '';\r\n if (formEls.length) {\r\n loadFormCb(formEls);\r\n }\r\n });\r\n })(formEls);\r\n });\r\n}\r\n\r\nfunction onFormSubmit(mktoForm) {\r\n const formEl = mktoForm.getFormElem()[0];\r\n const message = formEl.dataset.message?.trim() || 'Thank you for signing up!';\r\n const redirectUrl = formEl.dataset.redirect?.trim() || null;\r\n mktoForm.onSuccess(() => {\r\n if (redirectUrl) {\r\n location.href = redirectUrl;\r\n } else {\r\n mktoForm.getFormElem().hide();\r\n const node = document.createElement('div');\r\n node.classList.add('mkto-message-wrapper');\r\n node.innerHTML = `\r\n \r\n ${message}\r\n \r\n `;\r\n formEl.parentNode.appendChild(node);\r\n }\r\n\r\n // Return false to prevent the submission handler from taking the lead to the follow up url\r\n return false;\r\n });\r\n}\r\n\r\nfunction destyleMktoForm(mktoForm) {\r\n const formEl = mktoForm.getFormElem()[0];\r\n\r\n // remove element styles from
and children\r\n const styledEls = Array.from(formEl.querySelectorAll('[style]')).concat(formEl);\r\n styledEls.forEach(el => {\r\n el.removeAttribute('style');\r\n });\r\n\r\n const styleSheets = Array.from(document.styleSheets);\r\n styleSheets.forEach(ss => {\r\n if (formEl.contains(ss.ownerNode)) {\r\n ss.disabled = true;\r\n }\r\n /* disable remote stylesheets only after last form is rendered\r\n to avoid marketo timeout issue https://blog.teknkl.com/whats-the-deal-with-mktostyleloaded-div/ */\r\n if (\r\n formsRendered === totalForms &&\r\n [mktoForms2BaseStyle, mktoForms2ThemeStyle].indexOf(ss.ownerNode) != -1\r\n ) {\r\n ss.disabled = true;\r\n }\r\n });\r\n\r\n // makes forms visible\r\n if (formsRendered === totalForms) {\r\n marketoFormEls.forEach(form => {\r\n form.setAttribute('data-styles-ready', 'true');\r\n });\r\n }\r\n\r\n formEl.querySelector('button[type=\"submit\"]').classList.add('btn', 'btn-primary');\r\n}\r\n\r\nfunction createUniqueInputIds(mktoForm) {\r\n const formEl = mktoForm.getFormElem()[0],\r\n rando = '_' + new Date().getTime() + Math.random();\r\n\r\n formEl.querySelectorAll('label[for]').forEach(labelEl => {\r\n const forEl = formEl.querySelector('[id=\"' + labelEl.htmlFor + '\"]');\r\n if (forEl) {\r\n labelEl.htmlFor = forEl.id = forEl.id + rando;\r\n }\r\n });\r\n}\r\n\r\nfunction getUniqueFormIds(mktoForms) {\r\n return mktoForms\r\n .map(formEl => Number(formEl.getAttribute('data-formId')))\r\n .reduce((acc, nextFormId) => {\r\n if (acc.indexOf(nextFormId) == -1) {\r\n acc.push(nextFormId);\r\n }\r\n return acc;\r\n }, []);\r\n}\r\n","const rootElement = document.documentElement;\r\nconst toTop = document.querySelector('#scrollToTop');\r\n\r\nfunction handleScrollToTop() {\r\n rootElement.scrollTo({\r\n top: 0,\r\n left: 0,\r\n behavior: 'smooth'\r\n });\r\n}\r\n\r\nif (toTop) {\r\n toTop.addEventListener('click', handleScrollToTop);\r\n}\r\n","document.body.addEventListener('mousedown', () => {\r\n document.body.classList.add('using-mouse');\r\n}, { passive: true });\r\n\r\ndocument.body.addEventListener('keydown', e => {\r\n if (e.key === 'Tab') {\r\n document.body.classList.remove('using-mouse');\r\n }\r\n}, { passive: true });\r\n","if (\r\n document.querySelector('.a2a_kit') &&\r\n !document.querySelector('script[src$=\"addtoany.js\"]')\r\n) {\r\n const el = document.createElement('script');\r\n el.src = '/content/js/addtoany.js';\r\n document.body.appendChild(el);\r\n}\r\n","import 'requestidlecallback-polyfill';\r\nimport 'whatwg-fetch';\r\nimport 'intersection-observer';\r\n\r\n// Element.closest()\r\n// npm https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\r\nif (!Element.prototype.matches) {\r\n Element.prototype.matches =\r\n Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\r\n}\r\n\r\nif (!Element.prototype.closest) {\r\n Element.prototype.closest = function (s) {\r\n var el = this;\r\n\r\n do {\r\n if (Element.prototype.matches.call(el, s)) return el;\r\n el = el.parentElement || el.parentNode;\r\n } while (el !== null && el.nodeType === 1);\r\n return null;\r\n };\r\n}\r\n\r\nif (!Array.prototype.includes) {\r\n Array.prototype.includes = function (searchElement) {\r\n return !!~this.indexOf(searchElement);\r\n };\r\n}\r\n","const scrollbarWidth = getScrollbarWidth();\r\nconst header = document.querySelector('#header, .header-section');\r\nconst hasStickyHeader =\r\n header?.id === 'header' || header?.classList.contains('fixed-header');\r\n\r\nlet scrollPosition = 0;\r\n\r\nexport function getScrollbarWidth() {\r\n const outer = document.createElement('div');\r\n outer.style.visibility = 'hidden';\r\n outer.style.overflow = 'scroll';\r\n outer.style.msOverflowStyle = 'scrollbar';\r\n document.body.appendChild(outer);\r\n\r\n const inner = document.createElement('div');\r\n outer.appendChild(inner);\r\n\r\n const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\r\n outer.parentNode.removeChild(outer);\r\n\r\n return scrollbarWidth;\r\n}\r\n\r\nexport function disableScroll() {\r\n if (document.documentElement.classList.contains('disable-scroll')) {\r\n return;\r\n }\r\n\r\n scrollPosition = window.pageYOffset;\r\n document.documentElement.classList.add('disable-scroll');\r\n document.body.classList.add('disable-scroll');\r\n document.body.style.top = `-${scrollPosition}px`;\r\n\r\n if (scrollbarWidth) {\r\n document.body.style.paddingRight = `${scrollbarWidth}px`;\r\n\r\n if (header && hasStickyHeader) {\r\n header.style.right = `${scrollbarWidth}px`;\r\n }\r\n }\r\n}\r\n\r\nexport function enableScroll() {\r\n document.body.classList.remove('disable-scroll');\r\n document.documentElement.classList.remove('disable-scroll');\r\n document.body.style.top = null;\r\n document.body.style.paddingRight = null;\r\n document.body.style.height = null;\r\n\r\n if (header) {\r\n header.style.right = null;\r\n }\r\n\r\n window.scrollTo({ top: scrollPosition, behavior: 'instant' });\r\n scrollPosition = 0;\r\n}\r\n","/**\r\n * Updates the passed dialog to retain focus and restore it when the dialog is closed. Won't\r\n * upgrade a dialog more than once. Supports IE11+ and is a no-op otherwise.\r\n * https://gist.github.com/samthor/babe9fad4a65625b301ba482dad284d1\r\n */\r\nexport const registerFocusRestoreDialog = (function () {\r\n if (!window.WeakMap || !window.MutationObserver) {\r\n return function () {};\r\n }\r\n const registered = new WeakMap();\r\n\r\n let previousFocus = null;\r\n document.addEventListener(\r\n 'focusout',\r\n function (ev) {\r\n previousFocus = ev.target;\r\n },\r\n true\r\n );\r\n\r\n return function registerFocusRestoreDialog(dialog) {\r\n if (dialog.localName !== 'dialog') {\r\n console.warn('The element is not a dialog', dialog);\r\n return;\r\n }\r\n if (registered.has(dialog)) {\r\n return;\r\n }\r\n registered.set(dialog, null);\r\n\r\n const realShowModal = dialog.showModal;\r\n dialog.showModal = function () {\r\n let savedFocus = document.activeElement;\r\n if (savedFocus === document || savedFocus === document.body) {\r\n savedFocus = previousFocus;\r\n }\r\n registered.set(dialog, savedFocus);\r\n realShowModal.call(this);\r\n };\r\n\r\n dialog.addEventListener('close', function () {\r\n const savedFocus = registered.get(dialog);\r\n if (document.contains(savedFocus)) {\r\n const wasFocus = document.activeElement;\r\n savedFocus.focus();\r\n if (document.activeElement !== savedFocus) {\r\n wasFocus.focus(); // restore focus, we couldn't focus saved\r\n }\r\n }\r\n registered.set(dialog, null);\r\n });\r\n };\r\n})();\r\n","import { disableScroll, enableScroll } from './scrolling';\r\nimport { createFocusTrap } from 'focus-trap';\r\nimport { uniqueId } from 'lodash';\r\nimport dialogPolyfill from 'dialog-polyfill';\r\nimport { registerFocusRestoreDialog } from './dialog-focus-restore';\r\n\r\nconst defaultOptions = {\r\n trigger: null,\r\n isTriggerLink: false,\r\n title: null,\r\n addCloseButton: true\r\n};\r\n\r\nconst observer = new MutationObserver(([{ target: modal }]) => {\r\n if (modal.open) disableScroll();\r\n});\r\n\r\nconst initializedModals = new WeakSet();\r\n\r\nexport default function initModal(modal, opts = {}) {\r\n if (typeof modal === 'string') {\r\n modal = modal.trim();\r\n\r\n let modalEl = null;\r\n\r\n if (modal[0] !== '#' && modal[0] !== '.') {\r\n modalEl = document.querySelector(`[data-modal=\"${modal}\"]`);\r\n }\r\n\r\n // If modal not found in data attribute, we query using\r\n // the string as a selector. We use bitwise right shift as a\r\n // quick way to confirm the selector doesn't start with a number\r\n if (!modalEl && !(modal[0] >> 0)) {\r\n try {\r\n modalEl = document.querySelector(modal);\r\n } catch {\r\n console.warn('Modal not found', modal);\r\n return;\r\n }\r\n }\r\n\r\n modal = modalEl;\r\n }\r\n\r\n if (!modal) {\r\n console.warn('Modal not found', modal);\r\n return;\r\n }\r\n\r\n if (initializedModals.has(modal)) return;\r\n initializedModals.add(modal);\r\n\r\n opts = Object.assign({}, defaultOptions, opts);\r\n\r\n const content = modal.querySelector('.fb-modal-content');\r\n const isDialog = modal.tagName === 'DIALOG';\r\n\r\n if (isDialog) {\r\n dialogPolyfill.registerDialog(modal);\r\n registerFocusRestoreDialog(modal);\r\n }\r\n\r\n // If the modal doesn't contain any focusable elements, we\r\n // have focus-trap default to focusing the modal wrapper\r\n if (!isDialog) modal.tabIndex = '-1';\r\n\r\n const focusTrap = isDialog\r\n ? null\r\n : createFocusTrap(modal, {\r\n initialFocus: opts.initialFocus || modal,\r\n fallbackFocus: modal,\r\n preventScroll: true\r\n });\r\n\r\n let isOpen = false;\r\n\r\n const open = e => {\r\n if (isOpen) return;\r\n if (opts.isTriggerLink && e) {\r\n e.preventDefault();\r\n }\r\n isOpen = true;\r\n document.body.classList.add('fb-modal-open');\r\n modal.classList.add('open');\r\n disableScroll();\r\n\r\n if (isDialog) {\r\n modal.showModal?.();\r\n modal.focus();\r\n } else {\r\n focusTrap.activate();\r\n }\r\n\r\n modal.scrollTop = 0;\r\n opts.onOpen?.();\r\n };\r\n\r\n const close = (shouldEnableScroll = true) => {\r\n if (!isOpen) return;\r\n isOpen = false;\r\n modal.classList.remove('open');\r\n document.body.classList.remove('fb-modal-open');\r\n\r\n if (isDialog) {\r\n modal.close?.();\r\n } else {\r\n focusTrap.deactivate();\r\n if (shouldEnableScroll) enableScroll();\r\n }\r\n\r\n opts.onClose?.();\r\n };\r\n\r\n // One or more elements or selectors can be passed in\r\n // to automatically set which buttons or elements\r\n // should open the modal window when clicked\r\n let { trigger } = opts;\r\n\r\n if (trigger) {\r\n if (trigger instanceof Element) trigger = [trigger];\r\n if (typeof trigger === 'string') {\r\n trigger = document.querySelectorAll(trigger);\r\n }\r\n\r\n trigger.forEach?.(el => {\r\n if (typeof el === 'string') {\r\n el = document.querySelector(el);\r\n }\r\n\r\n el?.addEventListener('click', open);\r\n });\r\n }\r\n\r\n // Triggers can also be set by using\r\n // an HTML attribute: \"data-open-modal\"\r\n const { modal: modalId, name: modalName } = modal.dataset;\r\n const selectors = [];\r\n\r\n if (modalId) selectors.push(`[data-open-modal=\"${modalId}\" i]`);\r\n if (modalName) selectors.push(`[data-open-modal=\"${modalName}\" i]`);\r\n\r\n if (selectors.length) {\r\n document.addEventListener('click', e => {\r\n const closestEl = e.target.closest(selectors.join(','));\r\n if (closestEl) {\r\n opts.isTriggerLink = closestEl.tagName === 'A';\r\n open(e);\r\n }\r\n });\r\n }\r\n\r\n // Add title bar\r\n let titleEl =\r\n modal.querySelector('.fb-modal-title') ?? modal.querySelector('.fb-modal-top');\r\n\r\n if (!titleEl && opts.title) {\r\n titleEl = document.createElement('h2');\r\n titleEl.className = 'fb-modal-title';\r\n titleEl.innerText = decodeURIComponent(opts.title);\r\n\r\n const parent = content ?? modal;\r\n parent.prepend(titleEl);\r\n }\r\n\r\n if (titleEl && !titleEl.textContent.trim()) {\r\n titleEl.remove();\r\n titleEl = null;\r\n }\r\n\r\n if (\r\n titleEl &&\r\n !modal.hasAttribute('aria-labelledby') &&\r\n !modal.hasAttribute('aria-label')\r\n ) {\r\n if (!(titleEl instanceof HTMLHeadingElement)) {\r\n titleEl = titleEl.querySelector('h1, h2, h3, h4') ?? titleEl;\r\n }\r\n\r\n titleEl.id ||= uniqueId('modal-title-');\r\n modal.setAttribute('aria-labelledby', titleEl.id);\r\n }\r\n\r\n // Close modal when close button is clicked\r\n if (!modal.querySelector('.close-button') && opts.addCloseButton) {\r\n const closeButton = document.createElement('button');\r\n closeButton.className = 'close-button';\r\n closeButton.innerHTML = 'Close';\r\n\r\n const parent = content ?? modal;\r\n parent.prepend(closeButton);\r\n }\r\n\r\n const closeTriggers = modal.querySelectorAll('.close-button');\r\n\r\n closeTriggers.forEach(button => {\r\n button.addEventListener('click', close);\r\n });\r\n\r\n if (!closeTriggers.length) {\r\n modal.classList.add('no-close-button');\r\n }\r\n\r\n // Close modal when user clicks outside the content area\r\n let mouseDownTarget = null;\r\n\r\n content?.addEventListener('click', e => e.stopPropagation());\r\n\r\n modal.addEventListener('mousedown', e => {\r\n if (window.innerWidth <= 500) return;\r\n mouseDownTarget = e.target;\r\n });\r\n\r\n modal.addEventListener('click', () => {\r\n if (mouseDownTarget === modal) close();\r\n mouseDownTarget = null;\r\n });\r\n\r\n // Close modal when escape key is pressed\r\n window.addEventListener('keydown', e => {\r\n const isOpen = modal.open || modal.classList.contains('open');\r\n const isEscape = e.key === 'Esc' || e.key === 'Escape';\r\n if (isOpen && isEscape) close();\r\n });\r\n\r\n if (isDialog) {\r\n // There is no native 'open' event on dialog elements so\r\n // we listen for changes to the dialog's open attribute\r\n observer.observe(modal, { attributes: true, attributeFilter: ['open'] });\r\n } else {\r\n modal.setAttribute('aria-modal', true);\r\n\r\n if (!modal.hasAttribute('role')) {\r\n modal.setAttribute('role', 'dialog');\r\n }\r\n }\r\n\r\n // Reset state when native dialog close event fires\r\n modal.addEventListener('close', () => {\r\n mouseDownTarget = null;\r\n enableScroll();\r\n });\r\n\r\n return { open, close };\r\n}\r\n\r\n// Modals can be initialized with HTML attribute: \"data-modal\"\r\ndocument.querySelectorAll('[data-modal]').forEach(initModal);\r\n","export function upperFirst(str) {\r\n if (typeof str !== 'string') {\r\n return '';\r\n }\r\n\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\nexport function getUrlParameter(name) {\r\n return window.location.search\r\n .substring(1)\r\n .split('&')\r\n .find(s => s.split('=')[0] === name)\r\n ?.split('=')[1]\r\n ?.trim();\r\n}\r\n\r\nexport function scrollToContainer(urlHash) {\r\n if (urlHash.match(/\\?/)) {\r\n return;\r\n }\r\n\r\n const headerHeight = document.querySelector('#header').clientHeight;\r\n const el = document.querySelector(urlHash);\r\n\r\n if (!el) {\r\n return;\r\n }\r\n\r\n const elWithHashIdOffset = el.getBoundingClientRect().top;\r\n const yOffset = elWithHashIdOffset - headerHeight;\r\n\r\n if (elWithHashIdOffset) {\r\n setTimeout(() => {\r\n window.scrollTo(0, yOffset);\r\n }, 0);\r\n }\r\n}\r\n\r\nexport function throttle(func, limit = 50) {\r\n let inThrottle;\r\n\r\n return function (...args) {\r\n const context = this;\r\n\r\n if (!inThrottle) {\r\n func.apply(context, args);\r\n inThrottle = true;\r\n setTimeout(() => (inThrottle = false), limit);\r\n }\r\n };\r\n}\r\n\r\nexport function isPageBuilder() {\r\n return document.body.classList.contains('KenticoAdminPageBuilder');\r\n}\r\n\r\nexport function createElement(type, attributes) {\r\n const el = document.createElement(type);\r\n Object.entries(attributes).forEach(([key, value]) => {\r\n if (key === 'attributes') {\r\n value.forEach(([attr, val]) => el.setAttribute(attr, val));\r\n } else {\r\n el[key] = value;\r\n }\r\n });\r\n\r\n return el;\r\n}\r\n","import { throttle } from './helpers';\r\n\r\nconst canvas = document.querySelector('#footer-canvas');\r\n\r\nfunction init() {\r\n if (!canvas) return;\r\n\r\n const img = new Image();\r\n let imgLoaded = false;\r\n\r\n img.onload = () => {\r\n imgLoaded = true;\r\n drawCanvas();\r\n };\r\n\r\n img.src = '/Content/breakout-fremont-bank/dist/images/fremont-map.svg';\r\n\r\n function getImgSize(canvasSize) {\r\n let width = canvasSize.width;\r\n let height = (width * img.height) / img.width;\r\n\r\n if (height < canvasSize.height) {\r\n const newWidth = (canvasSize.height * img.width) / img.height;\r\n\r\n if (newWidth >= canvasSize.width) {\r\n width = newWidth;\r\n height = canvasSize.height;\r\n } else {\r\n height = canvasSize.height * 1.5;\r\n width = (height * img.width) / img.height;\r\n }\r\n }\r\n\r\n return { width, height };\r\n }\r\n\r\n function drawCanvas() {\r\n if (!imgLoaded) return;\r\n\r\n const dpr = window.devicePixelRatio || 1;\r\n const ctx = canvas.getContext('2d');\r\n const width = canvas.parentElement.offsetWidth;\r\n const height = canvas.parentElement.offsetHeight;\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n canvas.width = width * dpr;\r\n canvas.height = height * dpr;\r\n canvas.style.width = width + 'px';\r\n canvas.style.height = height + 'px';\r\n\r\n const size = getImgSize({ width, height });\r\n ctx.drawImage(img, 0, 0, size.width * dpr, size.height * dpr);\r\n }\r\n\r\n drawCanvas();\r\n\r\n const throttledDrawCanvas = throttle(drawCanvas);\r\n let drawTimer = null;\r\n let isInView = false;\r\n\r\n if (window.IntersectionObserver) {\r\n const observer = new IntersectionObserver(([{ isIntersecting }]) => {\r\n isInView = isIntersecting;\r\n });\r\n\r\n observer.observe(canvas);\r\n }\r\n\r\n window.addEventListener('resize', () => {\r\n clearTimeout(drawTimer);\r\n if (isInView) throttledDrawCanvas();\r\n drawTimer = setTimeout(drawCanvas, 100);\r\n });\r\n}\r\n\r\nif (document.readyState === 'complete') {\r\n init();\r\n} else {\r\n document.addEventListener('DOMContentLoaded', init);\r\n}\r\n","import { getScrollbarWidth } from '../scrolling';\r\n\r\n// Create an HTMLLinkElement for a given result\r\nexport function createResult({\r\n content,\r\n resultElement,\r\n category,\r\n path: url,\r\n pageName: name\r\n}) {\r\n if (resultElement) {\r\n return resultElement;\r\n }\r\n\r\n url = url.toLowerCase();\r\n\r\n const el = document.createElement('a');\r\n el.className = 'search-result';\r\n el.href = url;\r\n\r\n const top = document.createElement('div');\r\n top.className = 'search-result-top';\r\n\r\n const title = document.createElement('strong');\r\n title.className = 'search-result-title';\r\n title.innerText = name ?? `${location.hostname}${url}`;\r\n top.appendChild(title);\r\n\r\n // If no category data was passed from API, we\r\n // attempt to find a category label from the URL\r\n category ??= resultCategories.find(({ path }) => {\r\n const regex = new RegExp(`^${path}`, 'i');\r\n return url.match(regex);\r\n });\r\n\r\n if (category) {\r\n const categoryEl = document.createElement('div');\r\n\r\n categoryEl.classList.add('search-result-category');\r\n categoryEl.classList.add(category.cssClassName);\r\n categoryEl.innerText = category.text.trim();\r\n\r\n top.appendChild(categoryEl);\r\n }\r\n\r\n el.appendChild(top);\r\n\r\n content = content?.trim();\r\n\r\n if (content) {\r\n const text = document.createElement('p');\r\n text.innerHTML = content;\r\n el.appendChild(text);\r\n }\r\n\r\n const urlEl = document.createElement('div');\r\n urlEl.className = 'search-result-url';\r\n urlEl.innerText = `${location.protocol}//${location.hostname}${url}`;\r\n el.appendChild(urlEl);\r\n\r\n return el;\r\n}\r\n\r\nconst resultCategories = [\r\n { path: '/personal', text: 'Personal Banking', cssClassName: 'personal' },\r\n { path: '/business', text: 'Business Banking', cssClassName: 'business' },\r\n {\r\n path: '/wealth-management',\r\n text: 'Wealth Management',\r\n cssClassName: 'wealth-management'\r\n },\r\n { path: '/why-choose-us', text: 'About Fremont Bank', cssClassName: 'about' },\r\n {\r\n path: '/resource-center',\r\n text: 'Resource Center',\r\n cssClassName: 'resource-center'\r\n }\r\n];\r\n\r\n// Create top search result elements\r\nexport function createTopResult({\r\n nodeId,\r\n title,\r\n subtitle,\r\n content,\r\n resultCss,\r\n cssClassName: className\r\n}) {\r\n // Add inline CSS\r\n if (resultCss && !topResultStyleIds.includes(nodeId)) {\r\n const style = document.createElement('style');\r\n style.setAttribute('type', 'text/css');\r\n style.appendChild(document.createTextNode(`\\n${resultCss}\\n`));\r\n\r\n document.head.appendChild(style);\r\n topResultStyleIds.push(nodeId);\r\n }\r\n\r\n // Generate reult markup\r\n const result = document.createElement('div');\r\n result.className = 'best-bet-search-result';\r\n\r\n const top = document.createElement('div');\r\n top.className = 'search-result-top';\r\n\r\n const titleWrapper = document.createElement('div');\r\n\r\n const titleEl = document.createElement('strong');\r\n titleEl.className = 'search-result-title';\r\n titleEl.innerText = title;\r\n titleWrapper.appendChild(titleEl);\r\n\r\n subtitle = subtitle?.trim();\r\n\r\n if (subtitle) {\r\n const subtitleEl = document.createElement('div');\r\n subtitleEl.className = 'search-result-subtitle';\r\n subtitleEl.innerText = subtitle;\r\n titleWrapper.appendChild(subtitleEl);\r\n }\r\n\r\n top.appendChild(titleWrapper);\r\n\r\n const category = document.createElement('div');\r\n category.className = 'search-result-category best-bet';\r\n category.innerText = 'Top result';\r\n top.appendChild(category);\r\n\r\n const contentEl = document.createElement('div');\r\n contentEl.classList.add('search-result-content');\r\n contentEl.innerHTML = content;\r\n\r\n if (className) {\r\n contentEl.classList.add(className);\r\n }\r\n\r\n result.appendChild(top);\r\n result.appendChild(contentEl);\r\n\r\n return result;\r\n}\r\n\r\n// Best bet results can contain custom inline CSS to\r\n// for that particular result that gets append\r\n// to the DOM. We keep track of which results we have\r\n// appended CSS for to avoid adding duplicated style tags\r\nconst topResultStyleIds = [];\r\n\r\n// Create best bet and regular search result headlines\r\nexport function createResultsTitle(isBestBet) {\r\n const el = document.createElement('div');\r\n el.className = 'search-results-headline';\r\n\r\n const text = document.createElement('span');\r\n text.className = 'text';\r\n\r\n if (isBestBet) {\r\n el.classList.add('best-bet');\r\n text.innerText = 'Top search results:';\r\n } else {\r\n text.innerText = 'Search results for:';\r\n }\r\n\r\n el.appendChild(text);\r\n\r\n const query = document.createElement('span');\r\n query.className = 'query';\r\n\r\n el.appendChild(query);\r\n\r\n return { el, text, query };\r\n}\r\n\r\n// Create load more results button element\r\nexport function createLoadMoreButton(text) {\r\n const button = document.createElement('button');\r\n button.className = 'btn btn-outline-primary large search-load-more';\r\n button.innerText = text;\r\n\r\n return button;\r\n}\r\n\r\n// Create best bet search results wrapper\r\nexport function createBestBetWrapper() {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'best-bet-results-wrapper';\r\n\r\n return wrapper;\r\n}\r\n\r\n// Create best best bet links wrapper\r\nexport function createBestBetLinksWrapper() {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'best-bet-results';\r\n\r\n return wrapper;\r\n}\r\n\r\n// Creates animation elements and adjusts position of\r\n// elements and close button to account for scrollbars\r\nexport function createAndPositionFixedElements(closeButton) {\r\n const bg = document.createElement('div');\r\n bg.className = 'search-bg';\r\n\r\n const topShadow = document.createElement('div');\r\n topShadow.className = 'search-top-shadow';\r\n\r\n const scrollbarWidth = getScrollbarWidth();\r\n\r\n if (scrollbarWidth) {\r\n const offset = `${scrollbarWidth}px`;\r\n\r\n bg.style.right = offset;\r\n closeButton.style.marginRight = offset;\r\n topShadow.style.right = offset;\r\n }\r\n\r\n return { bg, topShadow };\r\n}\r\n\r\n// We cache results of search queries to prevent\r\n// redundant API calls. This function generates an\r\n// ID for a specific query. This allows us to ignore\r\n// punctuation, capitalization and whitespace when caching.\r\n// Original hash function: https://stackoverflow.com/a/52171480\r\nexport function generateId(str, seed = 0) {\r\n str = str\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]/gi, '');\r\n\r\n let h1 = 0xdeadbeef ^ seed;\r\n let h2 = 0x41c6ce57 ^ seed;\r\n\r\n for (let i = 0, ch; i < str.length; i++) {\r\n ch = str.charCodeAt(i);\r\n h1 = Math.imul(h1 ^ ch, 2654435761);\r\n h2 = Math.imul(h2 ^ ch, 1597334677);\r\n }\r\n\r\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\r\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\r\n\r\n return String(4294967296 * (2097151 & h2) + (h1 >>> 0));\r\n}\r\n","export const baseEndpoint = '/apis/searchapi/search';\r\nexport const baseSettingsEndpoint = '/apis/searchapi/settings';\r\n","import { snakeCase } from 'lodash';\r\n\r\nconst actions = Object.freeze({\r\n GET_RESULTS: 'search',\r\n NO_RESULTS: 'no_search_results',\r\n SUGGESTED_TERM: 'click_suggested_search',\r\n UNSATISFACTORY_RESULTS: 'click_unsatisfactory_search'\r\n});\r\n\r\nexport default class SearchTracker {\r\n #trackTimer = null;\r\n #feedbackButtonText = 'Let us know';\r\n\r\n constructor(manager) {\r\n this.manager = manager;\r\n\r\n this.fireEvent = this.fireEvent.bind(this);\r\n this.track = this.track.bind(this);\r\n this.insertFeedbackElements = this.insertFeedbackElements.bind(this);\r\n this.setFeedbackText = this.setFeedbackText.bind(this);\r\n this.sendFeedback = this.sendFeedback.bind(this);\r\n this.refresh = this.refresh.bind(this);\r\n this.show = this.show.bind(this);\r\n this.hide = this.hide.bind(this);\r\n\r\n this.#initElements();\r\n }\r\n\r\n /////////////////////////////////////\r\n // Search tracking actions\r\n /////////////////////////////////////\r\n\r\n static get actions() {\r\n return actions;\r\n }\r\n\r\n /////////////////////////////////////\r\n // Public methods\r\n /////////////////////////////////////\r\n\r\n fireEvent(options, callback) {\r\n const {\r\n action,\r\n eventParams = {},\r\n callbackTimeout = 2000,\r\n minCallbackTimeout\r\n } = options;\r\n\r\n const gtag =\r\n window.gtag ||\r\n function () {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push(arguments);\r\n };\r\n\r\n // Even though GTM allows callbackTimeout parameter,\r\n // we manually add a timeout in case GTM didn't load\r\n const callbackWithTimeout = () => {\r\n let hasCalled = false;\r\n let hasReachedMinTimeout = isNaN(minCallbackTimeout) || minCallbackTimeout === 0;\r\n\r\n const fn = () => {\r\n if (callback && !hasCalled) {\r\n hasCalled = true;\r\n\r\n if (hasReachedMinTimeout) {\r\n callback();\r\n }\r\n }\r\n };\r\n\r\n setTimeout(fn, callbackTimeout);\r\n\r\n if (!hasReachedMinTimeout) {\r\n setTimeout(() => {\r\n hasReachedMinTimeout = true;\r\n\r\n if (hasCalled && callback) {\r\n callback();\r\n }\r\n }, minCallbackTimeout);\r\n }\r\n\r\n return fn;\r\n };\r\n\r\n requestIdleCallback(\r\n () => {\r\n const params = {\r\n event_callback: callbackWithTimeout(),\r\n event_timeout: callbackTimeout\r\n };\r\n\r\n Object.keys(eventParams).forEach(key => {\r\n params[snakeCase(key)] = eventParams[key];\r\n });\r\n\r\n gtag('event', action, params);\r\n },\r\n { timeout: 5000 }\r\n );\r\n }\r\n\r\n track(action = SearchTracker.actions.GET_RESULTS, eventParams, forceTrackEvent) {\r\n eventParams ??= {};\r\n\r\n if (!forceTrackEvent) {\r\n clearTimeout(this.#trackTimer);\r\n }\r\n\r\n const data = this.manager.currentQuery;\r\n const query = data.query?.trim().toLowerCase();\r\n\r\n if (\r\n !data ||\r\n !query ||\r\n (action === actions.GET_RESULTS && data.hasTrackedQuery) ||\r\n (action === actions.NO_RESULTS && data.hasTrackedNoResults) ||\r\n (action === actions.SUGGESTED_TERM && data.hasTrackedSuggestedTerm)\r\n ) {\r\n return;\r\n }\r\n\r\n if (!eventParams.hasOwnProperty('search_term')) {\r\n eventParams.search_term = query;\r\n }\r\n\r\n const trackEvent = () => {\r\n if (action === actions.GET_RESULTS) {\r\n data.hasTrackedQuery = true;\r\n } else if (action === actions.NO_RESULTS) {\r\n data.hasTrackedNoResults = true;\r\n } else if (action === actions.SUGGESTED_TERM) {\r\n data.hasTrackedSuggestedTerm = true;\r\n }\r\n\r\n this.fireEvent({ action, eventParams });\r\n };\r\n\r\n if (forceTrackEvent) {\r\n trackEvent();\r\n } else {\r\n this.#trackTimer = setTimeout(trackEvent, this.manager.queryTrackingTimeout);\r\n }\r\n }\r\n\r\n insertFeedbackElements(parentElement) {\r\n parentElement.appendChild(this.feedback);\r\n }\r\n\r\n setFeedbackText(searchSettings) {\r\n const settings = searchSettings ?? this.manager.searchSettings ?? {};\r\n\r\n if (!settings) {\r\n return;\r\n }\r\n\r\n let {\r\n feedbackTitle = 'Didn’t find what you were looking for?',\r\n feedbackText = 'Your feedback will help us provide a better search experience.',\r\n feedbackButtonText = 'Let us know',\r\n feedbackSentText = 'Thank you for your feedback'\r\n } = settings;\r\n\r\n // Before feedback sent\r\n this.feedbackTitle.innerText = feedbackTitle;\r\n this.feedbackText.innerHTML = feedbackText\r\n .split(/\\n+/)\r\n .map(t => {\r\n t = t.trim();\r\n return t ? `

${t}

` : null;\r\n })\r\n .filter(t => t)\r\n .join('\\n');\r\n\r\n this.#feedbackButtonText = feedbackButtonText.trim();\r\n this.feedbackButton.innerText = this.#feedbackButtonText;\r\n\r\n // After feedback sent\r\n feedbackSentText = feedbackSentText.trim();\r\n\r\n if (feedbackSentText) {\r\n this.feedbackSentText.innerText = feedbackSentText;\r\n this.feedbackSent.appendChild(this.feedbackSentText);\r\n } else {\r\n this.feedbackSent.removeChild(this.feedbackSentText);\r\n }\r\n }\r\n\r\n sendFeedback(query) {\r\n const data = this.manager.currentQuery;\r\n\r\n if (!query || typeof query !== 'string') {\r\n query = data?.query;\r\n }\r\n\r\n query = query?.trim();\r\n\r\n if (!data || data.hasSubmittedFeedback || !query) {\r\n return;\r\n }\r\n\r\n data.hasSubmittedFeedback = true;\r\n\r\n const eventConfig = {\r\n action: actions.UNSATISFACTORY_RESULTS,\r\n minCallbackTimeout: 500,\r\n eventParams: {\r\n search_term: query.toLowerCase()\r\n }\r\n };\r\n\r\n this.feedbackButton.classList.add('loading');\r\n this.feedbackButton.innerText = this.manager.loadMoreIsLoadingText;\r\n\r\n this.fireEvent(eventConfig, () => {\r\n this.feedback.classList.add('submitted');\r\n });\r\n }\r\n\r\n refresh(isVisible) {\r\n if (isVisible === undefined) {\r\n const query = this.manager.currentQuery;\r\n isVisible = !query?.hasMoreResults && !query?.hasSubmittedFeedback;\r\n }\r\n\r\n this.feedback.classList.remove('submitted');\r\n this.feedbackButton.classList.remove('loading');\r\n this.feedbackButton.innerText = this.#feedbackButtonText;\r\n\r\n if (isVisible) {\r\n this.feedback.classList.add('visible');\r\n } else {\r\n this.feedback.classList.remove('visible');\r\n }\r\n }\r\n\r\n show() {\r\n this.refresh(true);\r\n }\r\n\r\n hide() {\r\n this.refresh(false);\r\n }\r\n\r\n /////////////////////////////////////\r\n // Private methods\r\n /////////////////////////////////////\r\n\r\n #initElements() {\r\n this.feedback = document.createElement('div');\r\n this.feedback.className = 'search-feedback-wrapper';\r\n\r\n // Elements displayed before feedback\r\n // for a given query has been sent\r\n const sendFeedback = document.createElement('div');\r\n sendFeedback.className = 'search-feedback';\r\n\r\n this.feedbackTitle = document.createElement('div');\r\n this.feedbackTitle.className = 'search-feedback-title';\r\n sendFeedback.appendChild(this.feedbackTitle);\r\n\r\n this.feedbackText = document.createElement('div');\r\n this.feedbackText.className = 'search-feedback-text';\r\n sendFeedback.appendChild(this.feedbackText);\r\n\r\n this.feedbackButton = document.createElement('button');\r\n this.feedbackButton.className = 'btn btn-outline-primary search-feedback-button';\r\n this.feedbackButton.addEventListener('click', this.sendFeedback);\r\n sendFeedback.appendChild(this.feedbackButton);\r\n\r\n // Elements displayed after feedback has been sent\r\n this.feedbackSent = document.createElement('div');\r\n this.feedbackSent.className = 'search-feedback-sent';\r\n this.feedbackSent.innerHTML = `\r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.feedbackSentText = document.createElement('p');\r\n this.feedbackSent.appendChild(this.feedbackSentText);\r\n\r\n const contentWrapper = document.createElement('div');\r\n contentWrapper.className = 'search-feedback-content';\r\n contentWrapper.appendChild(sendFeedback);\r\n contentWrapper.appendChild(this.feedbackSent);\r\n this.feedback.appendChild(contentWrapper);\r\n\r\n this.setFeedbackText();\r\n }\r\n}\r\n","export default class Spinner {\r\n constructor({\r\n className,\r\n parent,\r\n shouldAttach = true,\r\n strokeWidth = 3,\r\n size = 50,\r\n color\r\n }) {\r\n this.spinner = document.createElement('div');\r\n this.spinner.className = `spinner ${className || ''}`.trim();\r\n\r\n const sizeOuter = `${size}px`;\r\n this.spinner.style.width = sizeOuter;\r\n this.spinner.style.height = sizeOuter;\r\n\r\n const sizeInner = (size * 100) / 40 - (size * 20) / 100;\r\n\r\n this.spinner.innerHTML = `\r\n \r\n \r\n \r\n `;\r\n\r\n if (color) {\r\n this.spinner.style.color = color;\r\n }\r\n\r\n this.isVisible = false;\r\n this.show = this.show.bind(this);\r\n this.hide = this.hide.bind(this);\r\n this.attach = this.attach.bind(this);\r\n this.remove = this.remove.bind(this);\r\n\r\n this.parent = typeof parent === 'string' ? document.querySelector(parent) : parent;\r\n\r\n if (this.parent && shouldAttach) {\r\n this.attach();\r\n }\r\n\r\n document.addEventListener('visibilitychange', () => {\r\n if (this.isVisible && this.isAttached) {\r\n if (document.visibilityState === 'visible') {\r\n this.spinner.classList.remove('paused');\r\n } else {\r\n this.spinner.classList.add('paused');\r\n }\r\n }\r\n });\r\n }\r\n\r\n attach(parent = this.parent) {\r\n if (typeof parent === 'string') {\r\n parent = document.querySelector(parent);\r\n }\r\n\r\n if (parent instanceof HTMLElement && (parent !== this.parent || !this.isAttached)) {\r\n this.isAttached = true;\r\n this.parent.appendChild(this.spinner);\r\n }\r\n }\r\n\r\n show(parent) {\r\n this.attach(parent);\r\n this.spinner.classList.add('visible');\r\n\r\n if (this.isAttached) {\r\n this.isVisible = true;\r\n this.spinner.style.display = 'block';\r\n }\r\n }\r\n\r\n hide() {\r\n this.isVisible = false;\r\n this.spinner.classList.remove('visible');\r\n this.spinner.style.display = 'none';\r\n }\r\n\r\n remove() {\r\n if (this.isAttached) {\r\n this.isAttached = false;\r\n this.isVisible = false;\r\n this.spinner.parentElement.removeChild(this.spinner);\r\n }\r\n }\r\n}\r\n","function createScreenReaderText(el, text) {\r\n if (typeof el === 'string') {\r\n el = document.querySelector(el);\r\n }\r\n\r\n if (!el) {\r\n return;\r\n }\r\n\r\n const sr = document.createElement('span');\r\n sr.className = 'sr-only';\r\n sr.innerText = text;\r\n\r\n el.appendChild(sr);\r\n}\r\n\r\nfunction replaceTags(selector, tagName) {\r\n if (!Element.prototype.getAttributeNames) {\r\n return;\r\n }\r\n\r\n document.querySelectorAll(selector).forEach(function (el) {\r\n var newEl = document.createElement(tagName);\r\n\r\n el.getAttributeNames().forEach(function (attr) {\r\n newEl.setAttribute(attr, el.getAttribute(attr));\r\n });\r\n\r\n newEl.innerHTML = el.innerHTML;\r\n\r\n el.parentElement.replaceChild(newEl, el);\r\n });\r\n}\r\n\r\nlet counter = 0;\r\n\r\nfunction transformAriaLabels(selector, searchEntireDocument) {\r\n selector = [selector + '[aria-labelledby]', selector + '[aria-describedby]'].join(', ');\r\n\r\n document.querySelectorAll(selector).forEach(function (el) {\r\n var searchEl = searchEntireDocument ? document : el;\r\n var labelId = el.getAttribute('aria-labelledby');\r\n var descriptionId = el.getAttribute('aria-describedby');\r\n var hasLabel = false;\r\n var hasDescription = false;\r\n\r\n if (descriptionId && descriptionId === labelId) {\r\n descriptionId = null;\r\n el.removeAttribute('aria-describedby');\r\n }\r\n\r\n if (labelId) {\r\n var label = searchEl.querySelector('#' + labelId);\r\n\r\n if (label) {\r\n counter++;\r\n hasLabel = true;\r\n labelId += '-fb-' + counter;\r\n\r\n label.id = labelId;\r\n el.setAttribute('aria-labelledby', labelId);\r\n } else {\r\n el.removeAttribute('aria-labelledby');\r\n }\r\n }\r\n\r\n if (descriptionId) {\r\n var description = searchEl.querySelector('#' + descriptionId);\r\n\r\n if (description) {\r\n counter++;\r\n hasDescription = true;\r\n descriptionId += '-fb-' + counter;\r\n\r\n description.id = descriptionId;\r\n el.setAttribute('aria-describedby', descriptionId);\r\n } else {\r\n el.removeAttribute('aria-describedby');\r\n }\r\n }\r\n\r\n if (!hasLabel && !hasDescription) {\r\n el.setAttribute('aria-hidden', 'true');\r\n }\r\n });\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n if (window.kentico?.pageBuilder) {\r\n return;\r\n }\r\n\r\n // Empty elements can also cause layout shift,\r\n // so we prioritize transforming these first\r\n const emptySelectors = [\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n '.interior-split-banner',\r\n '.description > p',\r\n '.section-top p',\r\n '.cta-banner',\r\n '.media-body p',\r\n '.card-body p'\r\n ];\r\n\r\n document.querySelectorAll(emptySelectors.join(', ')).forEach(el => {\r\n if (!el.textContent.trim() && !el.children.length) {\r\n el.parentElement.removeChild(el);\r\n }\r\n });\r\n\r\n // Defer additional accessibility transformations\r\n // until the rest of the page has finished rendering\r\n window.requestIdleCallback(() => {\r\n // Images with no alt tags\r\n document\r\n .querySelectorAll('img:not([alt])')\r\n .forEach(image => image.setAttribute('alt', ''));\r\n\r\n // Capitalized text in paragraph tags\r\n replaceTags('p.lead.section-header', 'span');\r\n\r\n // Ensure unique IDs for icon labels/descriptions\r\n transformAriaLabels('.svg-icon');\r\n });\r\n\r\n // Add screen reader text\r\n createScreenReaderText(\r\n '.wealth-hero-links a[href*=\"fbinvestmentservices.com\"]',\r\n 'FB Investment Services - opens in a new tab'\r\n );\r\n createScreenReaderText(\r\n '.wealth-hero-links a[href*=\"brokercheck.finra.org\"]',\r\n 'BrokerCheck, check the background of this investment professional - opens in a new tab.'\r\n );\r\n\r\n // Add attributes to Google's recaptcha\r\n const form = document.querySelector('.form-widget-form');\r\n\r\n if (form) {\r\n const observer = new MutationObserver(() => {\r\n setTimeout(() => {\r\n document.querySelectorAll('.g-recaptcha-response').forEach(item => {\r\n item.setAttribute('aria-hidden', 'true');\r\n item.setAttribute('aria-label', 'Do not use');\r\n item.setAttribute('aria-readonly', 'true');\r\n });\r\n }, 200);\r\n });\r\n\r\n observer.observe(form, { childList: true, subtree: true });\r\n }\r\n});\r\n\r\n// Prefers reduced motion\r\nexport const reducedMotionMediaQuery = window.matchMedia(\r\n '(prefers-reduced-motion: reduce)'\r\n);\r\n\r\nlet shouldReduceMotion = reducedMotionMediaQuery.matches;\r\n\r\nif (reducedMotionMediaQuery?.addEventListener) {\r\n reducedMotionMediaQuery.addEventListener('change', () => {\r\n shouldReduceMotion = reducedMotionMediaQuery.matches;\r\n });\r\n} else if (reducedMotionMediaQuery?.addListener) {\r\n reducedMotionMediaQuery.addListener(() => {\r\n shouldReduceMotion = reducedMotionMediaQuery.matches;\r\n });\r\n}\r\n\r\nexport function prefersReducedMotion() {\r\n return shouldReduceMotion;\r\n}\r\n\r\n// Disable requestAnimationFrame when\r\n// the user prefers reduced motion\r\nexport function requestFrame(callback) {\r\n if (!callback) {\r\n return;\r\n }\r\n\r\n if (shouldReduceMotion) {\r\n setTimeout(callback, 0);\r\n } else {\r\n requestAnimationFrame(callback, 0);\r\n }\r\n}\r\n","import {\r\n createResult,\r\n createTopResult,\r\n createResultsTitle,\r\n createLoadMoreButton,\r\n createBestBetWrapper,\r\n createBestBetLinksWrapper,\r\n generateId,\r\n createAndPositionFixedElements\r\n} from './helpers';\r\nimport { baseEndpoint, baseSettingsEndpoint } from './search-constants';\r\nimport SearchTracker from './search-tracker';\r\nimport { disableScroll, enableScroll, getScrollbarWidth } from '../scrolling';\r\nimport Spinner from '../loading-spinner';\r\nimport { prefersReducedMotion, reducedMotionMediaQuery, requestFrame } from '../ada';\r\n\r\nclass SiteSearch {\r\n /////////////////////////////////////\r\n // Public fields\r\n /////////////////////////////////////\r\n\r\n debounceTime = 120;\r\n debounceTimeInitial = 350;\r\n queryTrackingTimeout = 2000;\r\n loadingSpinnerDelay = 200;\r\n minCharacters = 2;\r\n resetOnClose = true;\r\n mobileSize = 890;\r\n\r\n /////////////////////////////////////\r\n // Private fields\r\n /////////////////////////////////////\r\n\r\n #settings = {};\r\n #isOpen = false;\r\n #hasInitialSearch = false;\r\n #transitionCount = 0;\r\n #queryId = null;\r\n #data = {};\r\n #searchTimer = null;\r\n #loadingTimer = null;\r\n #openCallbacks = [];\r\n #openCompleteCallbacks = [];\r\n #closeCallbacks = [];\r\n #closeCompleteCallbacks = [];\r\n #focusElements = {};\r\n #returnFocusElement = null;\r\n #resultsOffset = null;\r\n #abortController = null;\r\n #errorElement = null;\r\n #hasError = false;\r\n #scrollbarWidth = 0;\r\n #scrollDisabledExternally = true;\r\n\r\n constructor({\r\n wrapper,\r\n trigger,\r\n close,\r\n results,\r\n bestBetResults,\r\n noResults,\r\n noInput,\r\n announcer,\r\n search = 'input[type=\"search\"]',\r\n loadMoreText = 'Load more results',\r\n loadMoreIsLoadingText = 'Loading'\r\n }) {\r\n this.wrapper = document.querySelector(wrapper);\r\n this.triggers = document.querySelectorAll(trigger);\r\n this.closeButton = document.querySelector(close);\r\n this.resultsWrapper = document.querySelector(results);\r\n this.noResults = document.querySelector(noResults);\r\n this.noInput = document.querySelector(noInput);\r\n this.input = this.wrapper?.querySelector(search);\r\n this.announcer = document.querySelector(announcer);\r\n\r\n if (bestBetResults) {\r\n this.bestBetWrapper = document.querySelector(bestBetResults);\r\n }\r\n\r\n if (\r\n !this.wrapper ||\r\n !this.triggers.length ||\r\n !this.closeButton ||\r\n !this.resultsWrapper ||\r\n !this.input ||\r\n !this.noResults ||\r\n !this.noInput\r\n ) {\r\n console.error('Required search elements not found.');\r\n return;\r\n }\r\n\r\n this.tracker = new SearchTracker(this);\r\n this.spinner = new Spinner({ parent: this.wrapper });\r\n this.loadMoreText = loadMoreText;\r\n this.loadMoreIsLoadingText = loadMoreIsLoadingText;\r\n this.#scrollbarWidth = getScrollbarWidth();\r\n\r\n // Bind instance methods to this\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n this.search = this.search.bind(this);\r\n this.loadMore = this.loadMore.bind(this);\r\n this.reset = this.reset.bind(this);\r\n\r\n this.#initElements();\r\n this.#initSettings();\r\n this.#initAccessibility();\r\n this.#initEventListeners();\r\n }\r\n\r\n /////////////////////////////////////\r\n // Computed properties\r\n /////////////////////////////////////\r\n\r\n get query() {\r\n return this.#data[this.#queryId]?.query ?? '';\r\n }\r\n\r\n get results() {\r\n return this.#data[this.#queryId]?.links ?? [];\r\n }\r\n\r\n get currentQuery() {\r\n return this.#data[this.#queryId] ?? null;\r\n }\r\n\r\n get cachedResults() {\r\n return this.#data;\r\n }\r\n\r\n get isOpen() {\r\n return this.#isOpen;\r\n }\r\n\r\n get data() {\r\n return this.#data;\r\n }\r\n\r\n get searchSettings() {\r\n return this.#settings;\r\n }\r\n\r\n get shouldControlScroll() {\r\n return (\r\n !this.#scrollDisabledExternally &&\r\n !document.body.classList.contains('mobile-menu-open') &&\r\n !document.body.classList.contains('overlay-open')\r\n );\r\n }\r\n\r\n /////////////////////////////////////\r\n // Public methods\r\n /////////////////////////////////////\r\n\r\n open(trigger) {\r\n if (this.#isOpen) {\r\n return;\r\n }\r\n\r\n this.#isOpen = true;\r\n this.#scrollDisabledExternally = document.body.classList.contains('disable-scroll');\r\n this.#transitionCount = 0;\r\n this.#returnFocusElement = document.activeElement ?? this.triggers[0];\r\n this.wrapper.setAttribute('aria-hidden', 'false');\r\n this.#openCallbacks.forEach(c => c());\r\n\r\n if (this.shouldControlScroll) {\r\n disableScroll();\r\n }\r\n\r\n const triggerEl = trigger ?? window;\r\n\r\n triggerEl.dispatchEvent(\r\n new CustomEvent('globalsearchopen', {\r\n bubbles: true\r\n })\r\n );\r\n\r\n requestFrame(() => {\r\n this.wrapper.classList.add('animating');\r\n this.wrapper.classList.add('open');\r\n\r\n const delay = prefersReducedMotion() ? 0 : 500;\r\n setTimeout(() => this.input.focus(), delay);\r\n\r\n if (prefersReducedMotion()) {\r\n this.#openCompleteCallbacks.forEach(c => c());\r\n }\r\n });\r\n }\r\n\r\n close() {\r\n if (!this.#isOpen) {\r\n return;\r\n }\r\n\r\n this.#isOpen = false;\r\n this.#transitionCount = 0;\r\n this.wrapper.setAttribute('aria-hidden', 'true');\r\n this.noResults.setAttribute('aria-hidden', 'true');\r\n this.noInput.setAttribute('aria-hidden', 'true');\r\n\r\n if (this.input === document.activeElement) {\r\n this.input.parentElement.classList.add('has-focus');\r\n }\r\n\r\n this.#returnFocusElement?.focus();\r\n this.#returnFocusElement?.blur();\r\n this.#updateStatus();\r\n this.#closeCallbacks.forEach(c => c());\r\n\r\n if (this.shouldControlScroll) {\r\n enableScroll();\r\n }\r\n\r\n this.closeButton.dispatchEvent(\r\n new CustomEvent('globalsearchclose', {\r\n bubbles: true\r\n })\r\n );\r\n\r\n requestFrame(() => {\r\n this.wrapper.classList.add('animating');\r\n this.wrapper.classList.remove('open');\r\n\r\n if (prefersReducedMotion()) {\r\n this.#closeCompleteCallbacks.forEach(c => c());\r\n }\r\n });\r\n }\r\n\r\n search(query, isLoadMore) {\r\n clearTimeout(this.#searchTimer);\r\n\r\n query = query?.trim() ?? '';\r\n const hasQuery = query && query.length >= this.minCharacters;\r\n\r\n if (!hasQuery || (query.toLowerCase() === this.query.toLowerCase() && !isLoadMore)) {\r\n this.#setHasInput(hasQuery);\r\n\r\n if (!hasQuery) {\r\n this.#queryId = '';\r\n\r\n if (!isLoadMore) {\r\n this.wrapper.scrollTop = 0;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const id = generateId(query);\r\n this.#queryId = id;\r\n\r\n if (!isLoadMore) {\r\n this.wrapper.scrollTop = 0;\r\n }\r\n\r\n // Return cached results if this is a duplicate query\r\n if (!isLoadMore && this.#data[id] && !this.#data[id].hasError) {\r\n this.#updateLinks(id, this.#data[id].links, this.#data[id].topResults);\r\n this.#setHasInput(true);\r\n return;\r\n }\r\n\r\n this.#setIsLoading(true);\r\n\r\n if (!isLoadMore || !this.#data[id]) {\r\n this.#data[id] = {\r\n query,\r\n id,\r\n links: [],\r\n topResults: [],\r\n pageNum: 1,\r\n hasMoreResults: true,\r\n hasSubmittedFeedback: false,\r\n hasTrackedQuery: false,\r\n hasTrackedNoResults: false,\r\n hasTrackedSuggestedTerm: false\r\n };\r\n }\r\n\r\n this.#fetchResults(this.#data[id], isLoadMore);\r\n }\r\n\r\n loadMore() {\r\n const currentQuery = this.#data[this.#queryId];\r\n\r\n if (!currentQuery) {\r\n return;\r\n }\r\n\r\n currentQuery.pageNum++;\r\n\r\n this.search(currentQuery.query, true);\r\n }\r\n\r\n reset() {\r\n if (this.resetOnClose || prefersReducedMotion()) {\r\n this.#queryId = '';\r\n this.input.value = '';\r\n this.#data = {};\r\n this.#hasInitialSearch = false;\r\n this.wrapper.classList.remove('has-query');\r\n this.wrapper.classList.remove('results-open');\r\n this.resultsWrapper.innerHTML = '';\r\n this.bestBetResults.innerHTML = '';\r\n this.bestBetWrapper.classList.remove('hidden');\r\n this.bestBetWrapper.setAttribute('aria-hidden', 'true');\r\n this.resultsWrapper.classList.remove('hidden');\r\n this.wrapper.classList.remove('results-visible');\r\n this.wrapper.classList.remove('no-results');\r\n this.wrapper.classList.remove('no-input');\r\n this.wrapper.classList.remove('save-state');\r\n this.noInput.setAttribute('aria-hidden', 'true');\r\n this.#updateStatus();\r\n } else {\r\n this.wrapper.classList.add('save-state');\r\n }\r\n\r\n this.wrapper.classList.remove('open');\r\n this.wrapper.classList.remove('animating');\r\n this.#removeErrors();\r\n }\r\n\r\n /////////////////////////////////////\r\n // Private methods\r\n /////////////////////////////////////\r\n\r\n #getSearchEndpoint(query, pageNum = 1) {\r\n const url = new URL(baseEndpoint.replace(/\\/$/, ''), window.location.origin);\r\n url.pathname += `/${pageNum}`;\r\n url.searchParams.set('q', query);\r\n if (this.searchSettings.id) url.searchParams.set('s', this.searchSettings.id);\r\n return url.href;\r\n }\r\n\r\n #getSettingsEndpoint() {\r\n const url = new URL(baseSettingsEndpoint.replace(/\\/$/, ''), window.location.origin);\r\n if (this.searchSettings.id) url.searchParams.set('s', this.searchSettings.id);\r\n return url.href;\r\n }\r\n\r\n ////////////////////////////\r\n // Dynamic search settings\r\n ////////////////////////////\r\n\r\n #initSettings() {\r\n const getSettings = () => {\r\n // First check if settings have been added inline to avoid making request\r\n const settings = document.querySelector('#global-search-settings');\r\n\r\n if (settings) {\r\n try {\r\n this.#settings = JSON.parse(settings.textContent);\r\n this.#initNoResultsText();\r\n this.#initSuggestedSearchTerms();\r\n this.tracker.setFeedbackText();\r\n return;\r\n } catch {\r\n console.warn('Invalid inline search settings JSON');\r\n }\r\n }\r\n\r\n // Fetch settings from API if not found inline\r\n requestIdleCallback(async () => {\r\n try {\r\n const response = await fetch(this.#getSettingsEndpoint());\r\n const json = await response.json();\r\n\r\n if (typeof json !== 'object') {\r\n return;\r\n }\r\n\r\n this.#settings = json;\r\n this.#initNoResultsText();\r\n this.#initSuggestedSearchTerms();\r\n this.tracker.setFeedbackText();\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n });\r\n };\r\n\r\n if (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', getSettings);\r\n } else {\r\n getSettings();\r\n }\r\n }\r\n\r\n #initSuggestedSearchTerms() {\r\n const { suggestedTerms } = this.#settings;\r\n\r\n if (!suggestedTerms?.length) {\r\n this.resultsWrapper.classList.add('no-suggested-terms');\r\n return;\r\n }\r\n\r\n const termWrapper = document.createElement('ul');\r\n termWrapper.className = 'suggested-search-terms';\r\n\r\n const baseDelay = 400;\r\n const iterationDelay = suggestedTerms.length > 5 ? 120 : 170;\r\n const buttons = [];\r\n\r\n suggestedTerms.forEach((term, index) => {\r\n term = term?.trim();\r\n\r\n if (!term) {\r\n return;\r\n }\r\n\r\n const li = document.createElement('li');\r\n const button = document.createElement('button');\r\n buttons.push(button);\r\n\r\n button.className = 'search-term';\r\n button.innerHTML = `Search for ${term}`;\r\n\r\n const delay = baseDelay + iterationDelay * index;\r\n button.style.animationDelay = `${delay}ms`;\r\n\r\n if (this.input.id) {\r\n button.setAttribute('aria-controls', this.input.id);\r\n }\r\n\r\n button.addEventListener('click', e => {\r\n e.preventDefault();\r\n\r\n if (window.innerWidth > this.mobileSize) {\r\n button.classList.add('search-term-clicked');\r\n this.input.focus();\r\n } else {\r\n this.input.blur();\r\n }\r\n\r\n this.input.value = term;\r\n this.search(term);\r\n this.tracker.track(SearchTracker.actions.SUGGESTED_TERM, null, true);\r\n });\r\n\r\n button.addEventListener('mousedown', e => e.preventDefault());\r\n button.addEventListener('mouseleave', () => {\r\n button.classList.remove('search-term-clicked');\r\n });\r\n\r\n li.appendChild(button);\r\n termWrapper.appendChild(li);\r\n });\r\n\r\n requestFrame(() => {\r\n this.input.parentElement.parentElement.appendChild(termWrapper);\r\n\r\n // Add intersection observer to hide suggested searches\r\n // when the results box has scrolled\r\n requestIdleCallback(() => {\r\n let suggestionsVisible = true;\r\n this.#setFocusElements();\r\n\r\n // In order to prevent hidden results from\r\n // preventing clicks on results, we set\r\n // the suggestion wrapper's position to\r\n // absolute when hidden and adjust the\r\n // results offset accordingly\r\n const adjustOffset = () => {\r\n this.#resultsOffset = termWrapper.offsetHeight;\r\n this.contentWrapper.style.marginTop = `${this.#resultsOffset}px`;\r\n };\r\n\r\n adjustOffset();\r\n\r\n // Element used to check if user has scrolled\r\n const sentinal = document.createElement('div');\r\n sentinal.classList.add('search-scroll-sentinal');\r\n this.wrapper.appendChild(sentinal);\r\n\r\n const intersectionObserver = new IntersectionObserver(entries => {\r\n suggestionsVisible = entries[0].isIntersecting;\r\n\r\n requestFrame(() => {\r\n if (suggestionsVisible) {\r\n termWrapper.classList.remove('hidden');\r\n } else {\r\n termWrapper.classList.add('hidden');\r\n }\r\n\r\n buttons.forEach(button => {\r\n if (suggestionsVisible) {\r\n button.setAttribute('tabindex', '0');\r\n button.setAttribute('aria-hidden', 'false');\r\n } else {\r\n button.setAttribute('tabindex', '-1');\r\n button.setAttribute('aria-hidden', 'true');\r\n\r\n if (document.activeElement === button) {\r\n button.blur();\r\n }\r\n }\r\n });\r\n });\r\n });\r\n\r\n // Adjust position when if height changes\r\n let resizeObserver = null;\r\n\r\n // ResizeObserver isn't supported by IE\r\n if (window.ResizeObserver) {\r\n resizeObserver = new ResizeObserver(adjustOffset);\r\n }\r\n\r\n this.#openCompleteCallbacks.push(() => {\r\n requestFrame(() => {\r\n intersectionObserver.observe(sentinal);\r\n resizeObserver?.observe(termWrapper);\r\n });\r\n });\r\n\r\n this.#closeCompleteCallbacks.push(() => {\r\n intersectionObserver.unobserve(sentinal);\r\n resizeObserver?.unobserve(termWrapper);\r\n termWrapper.classList.remove('hidden');\r\n });\r\n });\r\n });\r\n }\r\n\r\n #initNoResultsText() {\r\n const noResultsText = (\r\n this.#settings.noResultsText ??\r\n `We weren't able to find any search results that matched your query`\r\n )?.trim();\r\n\r\n if (noResultsText) {\r\n this.noResults.innerHTML = `\r\n No Results Found\r\n ${noResultsText}\r\n `;\r\n }\r\n }\r\n\r\n ////////////////////////////\r\n // UI Elements\r\n ////////////////////////////\r\n\r\n #initElements() {\r\n // Results content\r\n this.contentWrapper = this.resultsWrapper.parentElement;\r\n\r\n // Load more button\r\n this.loadMoreButton = createLoadMoreButton(this.loadMoreText);\r\n\r\n // Results title text\r\n this.resultsTitle = createResultsTitle();\r\n this.contentWrapper.insertBefore(this.resultsTitle.el, this.resultsWrapper);\r\n\r\n // Best bet search results\r\n if (!this.bestBetWrapper) {\r\n this.bestBetWrapper = createBestBetWrapper();\r\n this.contentWrapper.insertBefore(this.bestBetWrapper, this.resultsTitle.el);\r\n }\r\n\r\n this.bestBetTitle = createResultsTitle(true);\r\n this.bestBetWrapper.appendChild(this.bestBetTitle.el);\r\n\r\n this.bestBetResults = createBestBetLinksWrapper();\r\n this.bestBetWrapper.appendChild(this.bestBetResults);\r\n\r\n // Search feedback tracking\r\n this.tracker.insertFeedbackElements(this.contentWrapper);\r\n\r\n // Animation and background elements\r\n const { topShadow, bg } = createAndPositionFixedElements(this.closeButton);\r\n\r\n this.contentWrapper.appendChild(topShadow);\r\n this.wrapper.appendChild(bg);\r\n this.bg = bg;\r\n }\r\n\r\n #initAccessibility() {\r\n this.wrapper.setAttribute('role', 'dialog');\r\n this.wrapper.setAttribute('aria-modal', 'true');\r\n this.wrapper.setAttribute('aria-hidden', 'true');\r\n }\r\n\r\n #setFocusElements() {\r\n setTimeout(() => {\r\n requestIdleCallback(() => {\r\n const elements = this.wrapper.querySelectorAll(\r\n 'a, button:not([disabled]), input[type=\"search\"]'\r\n );\r\n\r\n if (elements.length) {\r\n this.#focusElements.first = elements[0];\r\n this.#focusElements.last = elements[elements.length - 1];\r\n } else {\r\n this.#focusElements = {};\r\n }\r\n });\r\n }, 50);\r\n }\r\n\r\n #initEventListeners() {\r\n // Prevent search form from reloading page\r\n this.wrapper\r\n .querySelector('form')\r\n ?.addEventListener('submit', e => e.preventDefault());\r\n\r\n // Open when triggers are clicked\r\n this.triggers.forEach(trigger => {\r\n trigger.addEventListener('click', () => {\r\n if (!this.#isOpen) {\r\n this.open(trigger);\r\n\r\n setTimeout(() => {\r\n trigger.blur();\r\n this.input.focus();\r\n }, 10);\r\n }\r\n });\r\n });\r\n\r\n // Close when close button is clicked\r\n this.closeButton.addEventListener('mousedown', e => e.preventDefault());\r\n this.closeButton.addEventListener('click', e => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n this.close();\r\n });\r\n\r\n // Close when escape key is pressed\r\n document.addEventListener('keydown', e => {\r\n if (this.#isOpen && (e.key === 'Esc' || e.key === 'Escape')) {\r\n this.close();\r\n }\r\n });\r\n\r\n // Prevent overscroll when virtual keyboard opens\r\n this.wrapper.addEventListener(\r\n 'touchmove',\r\n e => {\r\n if (this.isOpen && !this.currentQuery) {\r\n e.preventDefault();\r\n }\r\n },\r\n { passive: false }\r\n );\r\n\r\n // If the user clicks a result for the same page they're\r\n // already on, close the search modal instead of reloading\r\n this.wrapper.addEventListener('click', e => {\r\n const link = e.target.closest('a');\r\n if (!link?.href) return;\r\n\r\n try {\r\n const url = new URL(link.href.toLowerCase());\r\n\r\n if (\r\n url.origin === window.location.origin &&\r\n url.pathname === window.location.pathname.toLowerCase()\r\n ) {\r\n e.preventDefault();\r\n const target = url.hash ? document.querySelector(url.hash) : null;\r\n this.close();\r\n window.dispatchEvent(new CustomEvent('mobilemenubeforeclose'));\r\n // closeMobileMenu();\r\n\r\n if (target) {\r\n const header = document.querySelector('#header');\r\n const headerOffset = header ? header.offsetHeight + 20 : 0;\r\n const scrollY = Math.floor(\r\n target.getBoundingClientRect().top + window.scrollY - headerOffset\r\n );\r\n window.scrollTo(window.scrollX, scrollY);\r\n }\r\n }\r\n } catch {} // eslint-disable-line no-empty\r\n });\r\n\r\n // Only hide modal after overlays are done animating.\r\n // IE 11 and iOS Safari don't support TransitionEvent.pseudoElement\r\n // so instead we only fire this handler when the count of\r\n // events is even, meaning both :before and :after have finished.\r\n const runAnimationCallbacks = preventCallbacks => {\r\n this.wrapper.classList.remove('animating');\r\n\r\n if (!this.#isOpen) {\r\n document.activeElement?.blur();\r\n\r\n if (!preventCallbacks) {\r\n this.#closeCompleteCallbacks.forEach(c => c());\r\n }\r\n\r\n this.reset();\r\n } else if (!preventCallbacks) {\r\n this.#openCompleteCallbacks.forEach(c => c());\r\n }\r\n };\r\n\r\n this.bg.addEventListener('transitionend', () => {\r\n this.#transitionCount++;\r\n\r\n if (this.#transitionCount >= 2) {\r\n runAnimationCallbacks();\r\n }\r\n });\r\n\r\n if (reducedMotionMediaQuery?.addEventListener) {\r\n reducedMotionMediaQuery.addEventListener('change', () => {\r\n if (!this.#isOpen) {\r\n this.reset();\r\n this.#transitionCount = 0;\r\n } else {\r\n this.#transitionCount = 2;\r\n }\r\n });\r\n }\r\n\r\n const handleReducedMotion = () => {\r\n if (prefersReducedMotion()) {\r\n runAnimationCallbacks(true);\r\n }\r\n };\r\n\r\n this.#openCompleteCallbacks.push(handleReducedMotion);\r\n this.#closeCompleteCallbacks.push(handleReducedMotion);\r\n\r\n // Search when the user enters a query\r\n this.input.addEventListener('input', e => {\r\n this.#debouncedSearch(e.target.value);\r\n });\r\n\r\n this.input.addEventListener('keydown', e => {\r\n if (e.key === 'Esc' || e.key === 'Escape') {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n // Load additional results\r\n this.loadMoreButton.addEventListener('click', this.loadMore);\r\n\r\n // Trap focus inside modal\r\n this.#setFocusElements();\r\n this.wrapper.addEventListener('keydown', e => {\r\n if (!this.#isOpen || e.key !== 'Tab') {\r\n return;\r\n }\r\n\r\n if (e.shiftKey) {\r\n if (document.activeElement === this.#focusElements.first) {\r\n this.#focusElements.last?.focus();\r\n e.preventDefault();\r\n }\r\n } else {\r\n if (document.activeElement === this.#focusElements.last) {\r\n this.#focusElements.first?.focus();\r\n e.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n // Keep input field focus styles if the user\r\n // uses alt + tab to switch away from the page\r\n let focusTimer = null;\r\n\r\n window.addEventListener('blur', () => {\r\n if (this.#isOpen && this.input === document.activeElement) {\r\n this.input.parentElement.classList.add('has-focus');\r\n }\r\n });\r\n\r\n window.addEventListener('focus', () => {\r\n if (this.#isOpen) {\r\n clearTimeout(focusTimer);\r\n\r\n focusTimer = setTimeout(() => {\r\n this.input.parentElement.classList.remove('has-focus');\r\n }, 30);\r\n }\r\n });\r\n\r\n this.#closeCompleteCallbacks.push(() => {\r\n this.input.parentElement.classList.remove('has-focus');\r\n });\r\n }\r\n\r\n ////////////////////////////\r\n // Fetch results\r\n ////////////////////////////\r\n\r\n #setIsLoading(isLoading) {\r\n clearTimeout(this.#loadingTimer);\r\n\r\n if (isLoading) {\r\n const startLoading = () => {\r\n this.wrapper.classList.add('loading');\r\n this.loadMoreButton.classList.add('loading');\r\n this.loadMoreButton.innerText = this.loadMoreIsLoadingText;\r\n this.loadMoreButton.disabled = true;\r\n this.spinner.show();\r\n };\r\n\r\n if (!this.#hasInitialSearch && window.innerWidth > this.mobileSize) {\r\n startLoading();\r\n } else {\r\n const delay = prefersReducedMotion() ? 0 : this.loadingSpinnerDelay;\r\n this.#loadingTimer = setTimeout(startLoading, delay);\r\n }\r\n } else {\r\n this.wrapper.classList.remove('loading');\r\n this.loadMoreButton.classList.remove('loading');\r\n this.loadMoreButton.innerText = this.loadMoreText;\r\n this.loadMoreButton.disabled = false;\r\n this.spinner.hide();\r\n }\r\n }\r\n\r\n #debouncedSearch(query) {\r\n clearTimeout(this.#searchTimer);\r\n\r\n const queryLower = query.toLowerCase();\r\n const isDuplicate = !!Object.keys(this.#data).find(key => {\r\n return this.#data[key].query.toLowerCase() === queryLower;\r\n });\r\n\r\n if (isDuplicate) {\r\n this.search(query);\r\n return;\r\n }\r\n\r\n const delay = this.#hasInitialSearch ? this.debounceTime : this.debounceTimeInitial;\r\n this.#searchTimer = setTimeout(() => this.search(query), delay);\r\n }\r\n\r\n async #fetchResults(data, isLoadMore) {\r\n if (!data?.query || !data?.id) {\r\n console.error('Invalid data, unable to search');\r\n return;\r\n }\r\n\r\n // Cancel previously sent fetch requests\r\n this.#abortController?.abort();\r\n\r\n if (window.AbortController) {\r\n this.#abortController = new AbortController();\r\n }\r\n\r\n const { pageNum = 1, query, id } = data;\r\n\r\n try {\r\n const response = await fetch(this.#getSearchEndpoint(query, pageNum), {\r\n signal: this.#abortController?.signal\r\n });\r\n\r\n if (response.status !== 200) {\r\n this.#handleApiError();\r\n return;\r\n }\r\n\r\n const json = await response.json();\r\n\r\n this.#abortController = null;\r\n\r\n if (this.#data[id]) {\r\n this.#removeErrors();\r\n\r\n if (!json?.results.length && !json?.topResults.length) {\r\n if (this.#queryId === id) {\r\n if (this.#hasInitialSearch) {\r\n this.#setNoResults();\r\n this.#setIsLoading(false);\r\n } else {\r\n this.#animateInitialSearch(true);\r\n }\r\n }\r\n\r\n this.#updateStatus();\r\n\r\n this.tracker.track(SearchTracker.actions.GET_RESULTS, {\r\n search_term: query,\r\n has_results: false\r\n });\r\n\r\n return;\r\n }\r\n\r\n this.#data[id].totalPages =\r\n json?.totalPages && !isNaN(json?.totalPages) ? json.totalPages : 1;\r\n\r\n this.#updateLinks(id, json.results, json.topResults, isLoadMore);\r\n\r\n this.tracker.track(SearchTracker.actions.GET_RESULTS, {\r\n search_term: query,\r\n has_results: true\r\n });\r\n }\r\n } catch (e) {\r\n if (e.name === 'AbortError') {\r\n return;\r\n }\r\n\r\n console.error(e);\r\n this.#handleApiError();\r\n }\r\n }\r\n\r\n #updateStatus() {\r\n if (!this.announcer) return;\r\n if (!this.isOpen) {\r\n this.announcer.innerText = '';\r\n return;\r\n }\r\n\r\n this.announcer.innerText =\r\n this.results.length === 1\r\n ? `1 search result found`\r\n : `${this.results.length} search results found`;\r\n }\r\n\r\n #updateLinks(queryId, results, topResults, isLoadMore) {\r\n const data = this.#data[queryId];\r\n\r\n if (!data) return;\r\n\r\n if (!results || !Array.isArray(results)) {\r\n console.error('Invalid search results', results);\r\n return;\r\n }\r\n\r\n data.links = data.links.concat(results);\r\n\r\n // Remove duplicates\r\n data.links = data.links\r\n .map(i => i.nodeId)\r\n .filter((value, index, self) => self.indexOf(value) === index)\r\n .map(id => data.links.find(({ nodeId }) => id === nodeId));\r\n\r\n data.hasMoreResults = data.pageNum < data.totalPages;\r\n\r\n // If new query has been run, still cache\r\n // the results but don't update the list\r\n if (this.#queryId !== queryId) {\r\n return;\r\n }\r\n\r\n this.#updateStatus();\r\n\r\n // Generate best bet result elements\r\n const topResultElements = document.createDocumentFragment();\r\n data.topResults = Array.isArray(topResults) ? topResults : [];\r\n data.topResults.forEach(r => topResultElements.appendChild(createTopResult(r)));\r\n\r\n // Generate search result element\r\n const resultElements = document.createDocumentFragment();\r\n data.links.forEach(r => resultElements.appendChild(createResult(r)));\r\n\r\n const addLinks = isInitial => {\r\n const hasResults = !!data.links.length;\r\n const hasTopResults = !!data.topResults.length;\r\n\r\n this.resultsTitle.query.innerText = data.query;\r\n\r\n if (!hasResults && !hasTopResults) {\r\n this.#setNoResults();\r\n return;\r\n }\r\n\r\n // this.noResults.style.display = 'none';\r\n this.noResults.setAttribute('aria-hidden', 'true');\r\n\r\n // Best bet results\r\n this.bestBetResults.innerHTML = '';\r\n\r\n if (hasTopResults) {\r\n this.bestBetWrapper.classList.remove('hidden');\r\n this.bestBetWrapper.setAttribute('aria-hidden', 'false');\r\n this.bestBetResults.appendChild(topResultElements);\r\n } else {\r\n this.bestBetWrapper.classList.add('hidden');\r\n this.bestBetWrapper.setAttribute('aria-hidden', 'true');\r\n }\r\n\r\n // Regular search results\r\n this.loadMoreButton.parentElement?.removeChild(this.loadMoreButton);\r\n this.resultsWrapper.innerHTML = '';\r\n\r\n if (!hasResults) {\r\n this.resultsWrapper.classList.add('hidden');\r\n this.resultsWrapper.setAttribute('aria-hidden', 'true');\r\n this.tracker.refresh(true);\r\n\r\n // If we get here it means there are no regular\r\n // results, but there ARE best bet results\r\n this.wrapper.classList.add('only-top-results');\r\n return;\r\n }\r\n\r\n if (data.hasMoreResults) {\r\n resultElements.appendChild(this.loadMoreButton);\r\n }\r\n\r\n this.tracker.refresh();\r\n this.wrapper.classList.remove('only-top-results');\r\n this.resultsWrapper.classList.remove('hidden');\r\n this.resultsWrapper.setAttribute('aria-hidden', 'false');\r\n this.resultsWrapper.appendChild(resultElements);\r\n\r\n this.wrapper.classList.remove('no-results');\r\n this.#setHasInput(true);\r\n if (\r\n !isLoadMore &&\r\n !isInitial &&\r\n !isNaN(this.#resultsOffset) &&\r\n this.wrapper.scrollTop > this.#resultsOffset\r\n ) {\r\n this.wrapper.scrollTop = this.#resultsOffset - 20;\r\n }\r\n };\r\n\r\n if (!this.#hasInitialSearch) {\r\n addLinks(true);\r\n this.#animateInitialSearch();\r\n } else {\r\n requestFrame(() => {\r\n addLinks(false);\r\n this.#setIsLoading(false);\r\n this.#setFocusElements();\r\n });\r\n }\r\n }\r\n\r\n #animateInitialSearch(hasNoResults) {\r\n if (this.#hasInitialSearch) {\r\n return Promise.resolve();\r\n }\r\n\r\n this.#hasInitialSearch = true;\r\n\r\n return new Promise(resolve => {\r\n setTimeout(() => {\r\n requestFrame(() => {\r\n this.wrapper.classList.add('has-query');\r\n\r\n const delay =\r\n window.innerWidth > this.mobileSize && !prefersReducedMotion() ? 1000 : 0;\r\n\r\n setTimeout(() => {\r\n this.wrapper.classList.add('results-open');\r\n\r\n requestFrame(() => {\r\n this.#setIsLoading(false);\r\n this.wrapper.classList.add('results-visible');\r\n\r\n if (!this.input.value.trim()) {\r\n this.#setHasInput(false);\r\n } else if (hasNoResults) {\r\n this.#setNoResults();\r\n }\r\n\r\n this.#setFocusElements();\r\n\r\n resolve();\r\n });\r\n }, delay);\r\n });\r\n }, 10);\r\n });\r\n }\r\n\r\n async #handleApiError() {\r\n if (this.#hasError) {\r\n return;\r\n }\r\n\r\n this.#hasError = true;\r\n\r\n if (!this.#errorElement) {\r\n this.#errorElement = document.createElement('div');\r\n this.#errorElement.className = 'search-error-wrapper';\r\n\r\n const errorContent = document.createElement('div');\r\n errorContent.className = 'search-error';\r\n errorContent.innerText = 'Unable to fetch search results, please try again later.';\r\n\r\n this.#errorElement.appendChild(errorContent);\r\n }\r\n\r\n this.resultsWrapper.innerHTML = '';\r\n this.bestBetResults.innerHTML = '';\r\n this.wrapper.classList.add('has-error');\r\n\r\n if (this.currentQuery) {\r\n this.currentQuery.hasError = true;\r\n }\r\n\r\n if (!this.#hasInitialSearch) {\r\n await this.#animateInitialSearch();\r\n }\r\n\r\n this.contentWrapper.insertBefore(\r\n this.#errorElement,\r\n this.contentWrapper.firstElementChild\r\n );\r\n\r\n this.#setIsLoading(false);\r\n }\r\n\r\n #removeErrors() {\r\n if (!this.#hasError || !this.#errorElement) {\r\n return;\r\n }\r\n\r\n if (this.currentQuery) {\r\n this.currentQuery.hasError = false;\r\n }\r\n\r\n this.#hasError = false;\r\n this.wrapper.classList.remove('has-error');\r\n this.#errorElement.parentElement.removeChild(this.#errorElement);\r\n }\r\n\r\n #setNoResults() {\r\n this.resultsWrapper.innerHTML = '';\r\n this.bestBetResults.innerHTML = '';\r\n this.wrapper.classList.add('no-results');\r\n this.wrapper.classList.remove('no-input', 'only-top-results');\r\n this.noResults.setAttribute('aria-hidden', 'false');\r\n\r\n if (this.currentQuery) {\r\n this.currentQuery.hasMoreResults = false;\r\n }\r\n\r\n this.tracker.refresh();\r\n this.tracker.track(SearchTracker.actions.NO_RESULTS);\r\n }\r\n\r\n #setHasInput(hasInput) {\r\n if (hasInput) {\r\n this.wrapper.classList.remove('no-input');\r\n this.noInput.setAttribute('aria-hidden', 'true');\r\n } else {\r\n this.resultsWrapper.innerHTML = '';\r\n this.bestBetResults.innerHTML = '';\r\n this.wrapper.classList.remove('no-results');\r\n this.wrapper.classList.add('no-input');\r\n this.noInput.setAttribute('aria-hidden', 'false');\r\n }\r\n }\r\n}\r\n\r\nrequestIdleCallback(() => {\r\n document\r\n .querySelectorAll('.search-crawler-exclude')\r\n .forEach(el => el.classList.remove('search-crawler-exclude'));\r\n});\r\n\r\nnew SiteSearch({\r\n wrapper: '#site-search-wrapper',\r\n trigger: '.search-trigger',\r\n close: '#close-search',\r\n results: '#search-results-wrapper',\r\n bestBetResults: '#best-bet-results-wrapper',\r\n noResults: '#search-results-empty',\r\n noInput: '#search-input-empty',\r\n announcer: '#search-announcer'\r\n});\r\n","import { baseEndpoint } from './search-constants';\r\nimport Spinner from '../loading-spinner';\r\nimport { uniqueId } from 'lodash';\r\n\r\nconst debounceTime = 120;\r\nconst clearDelay = 200;\r\nconst spinnerShowDelay = 200;\r\nconst minSpinnerTime = 250;\r\nconst maxCachedResults = 30;\r\nconst minCharacters = 2;\r\nconst shouldScrollToResults = true;\r\n\r\ndocument.querySelectorAll('.inline-search-wrapper').forEach(wrapper => {\r\n const searchBoxId = uniqueId();\r\n const input = wrapper.querySelector('.inline-search-input');\r\n const resultsWrapper = wrapper.querySelector('.inline-search-results-wrapper');\r\n const announcer = wrapper.querySelector('.inline-search-announcer');\r\n\r\n if (!input || !resultsWrapper || !announcer) {\r\n console.warn('Inline search wrapper missing required elements');\r\n return;\r\n }\r\n\r\n resultsWrapper.innerHTML = '';\r\n\r\n const spinner = new Spinner({\r\n parent: input.parentElement,\r\n size: 15,\r\n strokeWidth: 6\r\n });\r\n\r\n const url = new URL(baseEndpoint.replace(/\\/$/, ''), window.location.origin);\r\n const searchId = wrapper.dataset.search;\r\n if (searchId) url.searchParams.set('s', searchId);\r\n\r\n // No results message element\r\n const noResultsText = wrapper.dataset.noResultsText || 'No results found';\r\n wrapper.removeAttribute('data-no-results-text');\r\n\r\n const noResultsElement = document.createElement('div');\r\n noResultsElement.className = 'inline-search-message inline-search-no-results';\r\n noResultsElement.innerText = noResultsText;\r\n\r\n // Error message element\r\n const errorElement = document.createElement('div');\r\n errorElement.className = 'inline-search-message inline-search-result-error';\r\n errorElement.innerText = 'Something went wrong, please try again later';\r\n\r\n ////////////////////////////\r\n // Search\r\n ////////////////////////////\r\n\r\n let isOpen = false;\r\n let isHovering = false;\r\n\r\n let activeIndex = null;\r\n let resultElements = [];\r\n let prevResults = [];\r\n\r\n let cachedResults = {};\r\n let currentQuery = '';\r\n let abortController = null;\r\n\r\n let hasInitialResultsAfterFocus = false;\r\n\r\n const search = async query => {\r\n if (query === currentQuery) return;\r\n currentQuery = query;\r\n\r\n // Use cached results if found\r\n if (cachedResults[query]) {\r\n setIsLoading(false, query);\r\n addResults(cachedResults[query]);\r\n return;\r\n }\r\n\r\n // Cancel previous request\r\n if (window.AbortController) {\r\n abortController?.abort();\r\n abortController = new AbortController();\r\n }\r\n\r\n url.searchParams.set('q', query);\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n const response = await fetch(url.href, {\r\n signal: abortController?.signal\r\n });\r\n\r\n const data = await response.json();\r\n const isValid = response.ok && Array.isArray(data?.results);\r\n const isCurrentQuery = query === currentQuery;\r\n\r\n if (!isValid) {\r\n if (isCurrentQuery) handleError();\r\n return;\r\n }\r\n\r\n const results = filterResults(data.results);\r\n\r\n cacheResults(query, results);\r\n\r\n if (isCurrentQuery) {\r\n await setIsLoading(false, query);\r\n addResults(results);\r\n }\r\n } catch (e) {\r\n if (e.name === 'AbortError') return;\r\n if (query === currentQuery) setIsLoading(false, query);\r\n\r\n console.error(e);\r\n handleError();\r\n }\r\n };\r\n\r\n let searchTimer = null;\r\n let clearResultsTimer = null;\r\n\r\n // When the input empty, unless the user typed\r\n // backspace, we delay clearing the results to\r\n // avoid flickering as the user is typing\r\n let backspacePressed = false;\r\n\r\n const debouncedSearch = () => {\r\n clearTimeout(searchTimer);\r\n clearTimeout(clearResultsTimer);\r\n\r\n resultsWrapper.classList.remove('force-hidden');\r\n\r\n const query = input.value.trim().toLowerCase();\r\n\r\n if (query.length < minCharacters) {\r\n if (!backspacePressed && currentQuery.length >= minCharacters) {\r\n clearResultsTimer = setTimeout(clearResults, clearDelay);\r\n } else {\r\n clearResults();\r\n }\r\n\r\n backspacePressed = false;\r\n currentQuery = query;\r\n abortController?.abort();\r\n\r\n return;\r\n }\r\n\r\n searchTimer = setTimeout(() => search(query), debounceTime);\r\n };\r\n\r\n ////////////////////////////\r\n // Result helpers\r\n ////////////////////////////\r\n\r\n let isLoadingTimer = null;\r\n let isLoadingPromise = null;\r\n\r\n const setIsLoading = async (isLoading, query = null) => {\r\n if (isLoading) {\r\n // Only show spinner after reaching spinnerShowDelay threshold\r\n if (isLoadingTimer === null) {\r\n isLoadingTimer = setTimeout(() => {\r\n wrapper.classList.add('loading');\r\n spinner.show();\r\n isLoadingTimer = null;\r\n\r\n // Once spinner is shown, ensure it stays visible for\r\n // at least minSpinnerTime milliseconds to avoid flickering\r\n if (isLoadingPromise === null) {\r\n isLoadingPromise = new Promise(resolve => {\r\n setTimeout(() => {\r\n resolve();\r\n isLoadingPromise = null;\r\n }, minSpinnerTime);\r\n });\r\n }\r\n }, spinnerShowDelay);\r\n }\r\n } else {\r\n clearTimeout(isLoadingTimer);\r\n await isLoadingPromise;\r\n\r\n if (query !== null && query !== currentQuery) {\r\n return;\r\n }\r\n\r\n wrapper.classList.remove('loading');\r\n spinner.hide();\r\n }\r\n };\r\n\r\n const clearResults = () => {\r\n activeIndex = null;\r\n resultElements = [];\r\n prevResults = [];\r\n resultsWrapper.innerHTML = '';\r\n announcer.innerText = 'Cleared search results.';\r\n input.setAttribute('aria-expanded', false);\r\n resultsWrapper.classList.remove('force-hidden');\r\n };\r\n\r\n const announceResults = numResults => {\r\n announcer.innerText =\r\n numResults === 1 ? '1 search result found.' : `${numResults} search results found.`;\r\n };\r\n\r\n const addResults = results => {\r\n resultsWrapper.classList.remove('force-hidden');\r\n resultsWrapper.removeAttribute('aria-activedescendant');\r\n\r\n input.setAttribute('aria-expanded', currentQuery.length >= minCharacters);\r\n\r\n if (!Array.isArray(results) || !results.length) {\r\n activeIndex = null;\r\n resultElements = [];\r\n prevResults = [];\r\n resultsWrapper.innerHTML = '';\r\n resultsWrapper.append(noResultsElement);\r\n announcer.innerText = 'No search results found.';\r\n return;\r\n }\r\n\r\n // If results are the same as previous query, do not re-render\r\n const isSameResults =\r\n prevResults.length !== 0 &&\r\n results.length === prevResults.length &&\r\n results.every((r, i) => {\r\n return r.pageName === prevResults[i].pageName && r.path === prevResults[i].path;\r\n });\r\n\r\n if (isSameResults) return;\r\n\r\n resultElements = [];\r\n activeIndex = null;\r\n prevResults = results;\r\n\r\n announceResults(results.length);\r\n\r\n const resultsFragment = document.createDocumentFragment();\r\n\r\n results.forEach((result, i) => {\r\n const el = document.createElement('a');\r\n\r\n el.innerText = result.pageName;\r\n el.href = result.path.toLowerCase();\r\n el.id = `inline-search-item-${searchBoxId}-${i}`;\r\n el.className = 'inline-search-result';\r\n el.tabIndex = -1;\r\n el.role = 'option';\r\n el.setAttribute('aria-selected', false);\r\n el.setAttribute('aria-setsize', results.length);\r\n el.setAttribute('aria-posinset', i + 1);\r\n\r\n const icon = document.createElement('span');\r\n icon.className = 'inline-search-result-icon';\r\n el.prepend(icon);\r\n\r\n resultElements.push(el);\r\n resultsFragment.append(el);\r\n });\r\n\r\n resultsWrapper.innerHTML = '';\r\n resultsWrapper.scrollTop = 0;\r\n resultsWrapper.append(resultsFragment);\r\n\r\n if (!hasInitialResultsAfterFocus) {\r\n hasInitialResultsAfterFocus = true;\r\n scrollToResults();\r\n }\r\n };\r\n\r\n const filterResults = results => {\r\n return Array.isArray(results) ? results.filter(r => !!r.pageName && !!r.path) : [];\r\n };\r\n\r\n const cacheResults = (query, results) => {\r\n const cacheKeys = Object.keys(cachedResults);\r\n\r\n // Delete half of the cached results if the cache is full\r\n if (cacheKeys.length >= maxCachedResults) {\r\n for (let i = 0; i < Math.floor(cacheKeys.length / 2); i++) {\r\n delete cachedResults[cacheKeys[i]];\r\n }\r\n }\r\n\r\n cachedResults[query] = results;\r\n };\r\n\r\n const handleError = () => {\r\n resultsWrapper.innerHTML = '';\r\n resultsWrapper.append(errorElement);\r\n\r\n resultsWrapper.removeAttribute('aria-activedescendant');\r\n resultsWrapper.classList.remove('force-hidden');\r\n\r\n announcer.innerText = 'An error occurred while searching.';\r\n };\r\n\r\n const scrollToResults = () => {\r\n const shouldScroll =\r\n typeof window.inlineSearchScrollToResults === 'boolean'\r\n ? window.inlineSearchScrollToResults\r\n : shouldScrollToResults;\r\n\r\n if (!shouldScroll || !isOpen) return;\r\n\r\n const { bottom: resultsBottom } = resultsWrapper.getBoundingClientRect();\r\n\r\n if (resultsBottom > window.innerHeight) {\r\n window.scrollTo({\r\n top: window.scrollY + resultsBottom - window.innerHeight + 12,\r\n behavior: 'smooth'\r\n });\r\n }\r\n };\r\n\r\n ////////////////////////////\r\n // Keyboard navigation\r\n ////////////////////////////\r\n\r\n let activeElementWasChangedByMouse = false;\r\n let activeIndexBeforeMouseout = null;\r\n\r\n const setActiveElement = (index, isKeyboard = true) => {\r\n const numElements = resultElements.length;\r\n const hasQuery = currentQuery.length >= minCharacters;\r\n\r\n input.setAttribute('aria-expanded', hasQuery);\r\n\r\n if (index === null || !numElements) {\r\n if (activeElementWasChangedByMouse) {\r\n activeIndexBeforeMouseout = activeIndex;\r\n }\r\n\r\n if (hasQuery && !numElements) {\r\n resultsWrapper.classList.remove('force-hidden');\r\n }\r\n\r\n activeIndex = null;\r\n\r\n resultsWrapper.removeAttribute('aria-activedescendant');\r\n resultElements.forEach(el => {\r\n el.classList.remove('active');\r\n el.setAttribute('aria-selected', false);\r\n });\r\n\r\n return;\r\n }\r\n\r\n resultsWrapper.classList.remove('force-hidden');\r\n\r\n index = ((index % numElements) + numElements) % numElements;\r\n\r\n activeElementWasChangedByMouse = !isKeyboard;\r\n\r\n resultElements.forEach((el, i) => {\r\n const isActive = i === index;\r\n\r\n el.classList.toggle('active', isActive);\r\n el.setAttribute('aria-selected', isActive);\r\n\r\n if (isActive) {\r\n // The parent element of the results is a scrollable div.\r\n // If the element is out of view, we need to scroll it into view\r\n if (isKeyboard) {\r\n if (i === 0) {\r\n resultsWrapper.scrollTop = 0;\r\n } else if (i === numElements - 1) {\r\n resultsWrapper.scrollTop = resultsWrapper.scrollHeight;\r\n } else {\r\n el.scrollIntoView({ behavior: 'instant', block: 'nearest' });\r\n }\r\n }\r\n\r\n // Set aria-activedescendant attribute to this element\r\n if (el.id) {\r\n resultsWrapper.setAttribute('aria-activedescendant', el.id);\r\n } else {\r\n resultsWrapper.removeAttribute('aria-activedescendant');\r\n }\r\n }\r\n });\r\n\r\n activeIndex = index;\r\n };\r\n\r\n document.addEventListener('keydown', e => {\r\n if (!isOpen && !isHovering) return;\r\n\r\n const prevIndex = activeElementWasChangedByMouse\r\n ? activeIndexBeforeMouseout\r\n : activeIndex;\r\n\r\n switch (e.key) {\r\n case 'Escape':\r\n if (currentQuery.length >= minCharacters) {\r\n resultsWrapper.classList.add('force-hidden');\r\n input.setAttribute('aria-expanded', false);\r\n }\r\n\r\n break;\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n setActiveElement((prevIndex ?? 0) - 1);\r\n break;\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n setActiveElement(prevIndex === null ? 0 : prevIndex + 1);\r\n break;\r\n case 'Enter':\r\n e.preventDefault();\r\n\r\n if (activeIndex !== null) {\r\n resultElements[activeIndex]?.click();\r\n }\r\n\r\n break;\r\n }\r\n });\r\n\r\n ////////////////////////////\r\n // Events\r\n ////////////////////////////\r\n\r\n // Prevent form submission\r\n wrapper.querySelectorAll('form').forEach(form => {\r\n form.addEventListener('submit', e => e.preventDefault());\r\n });\r\n\r\n // Search after the user stops typing for debounceTime milliseconds\r\n input.addEventListener('input', debouncedSearch);\r\n\r\n // Unhide results when input is focused\r\n input.addEventListener('focus', () => {\r\n isOpen = true;\r\n resultsWrapper.classList.remove('force-hidden');\r\n\r\n const hasQuery = currentQuery.length >= minCharacters;\r\n\r\n input.setAttribute('aria-expanded', hasQuery);\r\n\r\n if (hasQuery && activeIndex !== null && resultElements[activeIndex]) {\r\n resultsWrapper.setAttribute(\r\n 'aria-activedescendant',\r\n resultElements[activeIndex].id\r\n );\r\n }\r\n\r\n if (resultElements.length) {\r\n hasInitialResultsAfterFocus = true;\r\n scrollToResults();\r\n }\r\n });\r\n\r\n input.addEventListener('blur', () => {\r\n isOpen = false;\r\n isHovering = false;\r\n hasInitialResultsAfterFocus = false;\r\n input.setAttribute('aria-expanded', false);\r\n resultsWrapper.removeAttribute('aria-activedescendant');\r\n });\r\n\r\n // Hide results without delay when user clears input\r\n input.addEventListener('keydown', e => {\r\n if (e.key === 'Backspace') backspacePressed = true;\r\n });\r\n\r\n // Prevent input from losing focus when clicking on results wrapper\r\n resultsWrapper.addEventListener('mousedown', e => e.preventDefault());\r\n\r\n // Set active element when hovering over results\r\n resultsWrapper.addEventListener('mouseover', e => {\r\n const element = e.target.closest('.inline-search-result');\r\n if (!element) return;\r\n\r\n const index = resultElements.indexOf(element);\r\n if (index !== -1) setActiveElement(index, false);\r\n });\r\n\r\n resultsWrapper.addEventListener('mouseenter', () => (isHovering = true));\r\n resultsWrapper.addEventListener('mouseleave', () => {\r\n isHovering = false;\r\n\r\n if (activeElementWasChangedByMouse) {\r\n setActiveElement(null, false);\r\n }\r\n });\r\n});\r\n","import $ from 'jquery';\r\n\r\nfunction spaceBarTriggerAbstractModal(modalTarget) {\r\n $(modalTarget).modal();\r\n}\r\n\r\nfunction handleModalBtnLink(e) {\r\n const modalBtnLink = e.currentTarget;\r\n const modalTarget = modalBtnLink.dataset.target;\r\n\r\n // ally: handle with `role=\"button\"`\r\n if (e.key === ' ') {\r\n e.preventDefault(); // prevent space bar vertical scroll\r\n spaceBarTriggerAbstractModal(modalTarget); // trigger modal on SPACEBAR\r\n }\r\n}\r\n\r\nconst modalBtnLinks = document.querySelectorAll('.modal-button-link');\r\n\r\nmodalBtnLinks.forEach(function (modalBtnLink) {\r\n modalBtnLink.addEventListener('keydown', handleModalBtnLink);\r\n});\r\n\r\n// Allow triggering modal from links without the data-target attribute\r\nconst modalSelectors = ['abstractModal', 'requestFormModal']\r\n .map(s => `a[href*='${s}']`)\r\n .join(', ');\r\n\r\ndocument.querySelectorAll(modalSelectors).forEach(link => {\r\n if (link.classList.contains('btn')) {\r\n const button = document.createElement('button');\r\n button.dataset.toggle = 'modal';\r\n button.dataset.target = link.getAttribute('href');\r\n button.innerHTML = link.innerHTML;\r\n button.className = link.className;\r\n\r\n link.parentElement.replaceChild(button, link);\r\n } else if (!link.getAttribute('data-target')) {\r\n link.setAttribute('role', 'button');\r\n link.dataset.toggle = 'modal';\r\n link.dataset.target = link.getAttribute('href');\r\n }\r\n});\r\n","import { disableScroll, enableScroll, getScrollbarWidth } from './scrolling';\r\n\r\nlet mobileMenuOpen = false;\r\nconst wrapper = document.querySelector('#main-nav-wrapper');\r\nconst topNav = document.querySelector('.main-navigation > .navbar-wrapper');\r\nconst header = document.querySelector('.main-navigation .logo');\r\nconst menuButton = document.querySelector('.mobile-menu-toggle');\r\nconst scrollbarWidth = getScrollbarWidth();\r\n\r\nconst hasAlert = (() => {\r\n const main = document.querySelector('#main');\r\n const checkAlert = () => main.classList.contains('has-alert');\r\n\r\n if (!checkAlert) {\r\n return () => false;\r\n } else {\r\n return checkAlert;\r\n }\r\n})();\r\n\r\nlet transitionTimer = null;\r\n\r\nfunction positionHeader(preventAnimation) {\r\n if (hasAlert()) {\r\n const { top } = topNav.getBoundingClientRect();\r\n clearTimeout(transitionTimer);\r\n\r\n if (preventAnimation) {\r\n header.classList.add('no-transition');\r\n }\r\n\r\n if (top > 0) {\r\n header.style.transform = `translateY(${-top}px)`;\r\n } else {\r\n header.classList.add('fixed');\r\n }\r\n\r\n transitionTimer = setTimeout(() => {\r\n header.classList.remove('no-transition');\r\n }, 400);\r\n } else {\r\n header.style.transform = null;\r\n header.classList.add('fixed');\r\n }\r\n}\r\n\r\nexport function openMobileMenu() {\r\n if (!wrapper || !menuButton) return;\r\n if (!mobileMenuOpen) {\r\n mobileMenuOpen = true;\r\n\r\n menuButton.dispatchEvent(\r\n new CustomEvent('mobilemenuopen', {\r\n bubbles: true\r\n })\r\n );\r\n\r\n menuButton.setAttribute('aria-expanded', 'true');\r\n\r\n setTimeout(() => {\r\n requestAnimationFrame(() => {\r\n document.body.classList.add('mobile-menu-open');\r\n positionHeader();\r\n disableScroll();\r\n wrapper.style.right = null;\r\n });\r\n }, 5);\r\n }\r\n}\r\n\r\nexport function closeMobileMenu(forceClose) {\r\n if (!wrapper || !menuButton) return;\r\n if (mobileMenuOpen || forceClose) {\r\n mobileMenuOpen = false;\r\n\r\n menuButton.dispatchEvent(\r\n new CustomEvent('mobilemenuclose', {\r\n bubbles: true\r\n })\r\n );\r\n\r\n enableScroll();\r\n\r\n menuButton.setAttribute('aria-expanded', 'false');\r\n header.style.transform = null;\r\n header.classList.remove('fixed');\r\n\r\n if (scrollbarWidth) {\r\n wrapper.style.right = `${-scrollbarWidth}px`;\r\n }\r\n\r\n document.body.classList.remove('mobile-menu-open');\r\n header.style.transform = null;\r\n }\r\n}\r\n\r\nlet wrapperTransitionTimer = null;\r\n\r\nfunction toggleMobileMenu() {\r\n clearTimeout(wrapperTransitionTimer);\r\n\r\n wrapper.classList.add('animating');\r\n\r\n if (mobileMenuOpen) {\r\n closeMobileMenu();\r\n } else {\r\n openMobileMenu();\r\n }\r\n}\r\n\r\nmenuButton?.addEventListener('click', toggleMobileMenu);\r\nwindow.addEventListener('mobilemenubeforeclose', () => closeMobileMenu());\r\n\r\nwrapper?.addEventListener('transitionstart', () => {\r\n clearTimeout(wrapperTransitionTimer);\r\n wrapper.classList.add('animating');\r\n});\r\n\r\nwrapper?.addEventListener('transitionend', () => {\r\n clearTimeout(wrapperTransitionTimer);\r\n\r\n wrapperTransitionTimer = setTimeout(() => {\r\n wrapper.classList.remove('animating');\r\n }, 30);\r\n});\r\n\r\nlet resizeTimer = null;\r\n\r\nfunction handleResizeComplete() {\r\n if (mobileMenuOpen) {\r\n if (window.innerWidth <= 991) {\r\n positionHeader(true);\r\n } else {\r\n closeMobileMenu(true);\r\n }\r\n }\r\n}\r\n\r\nwindow?.addEventListener('resize', () => {\r\n clearTimeout(resizeTimer);\r\n resizeTimer = setTimeout(handleResizeComplete, 70);\r\n});\r\n","const device = {\r\n os: {\r\n windows: /^Win/i.test(navigator.platform),\r\n mac: /^Mac/i.test(navigator.platform),\r\n ios:\r\n /iPhone|iPad|iPod/i.test(navigator.platform) ||\r\n (/Macintosh/.test(navigator.userAgent) && navigator.maxTouchPoints > 0),\r\n android: /Android/i.test(navigator.userAgent) || /webOS/i.test(navigator.userAgent)\r\n },\r\n\r\n browser: {\r\n chrome: !!window.chrome && !/\\bEdg/i.test(navigator.userAgent),\r\n edge: /\\bEdg/i.test(navigator.userAgent),\r\n firefox: /Firefox/i.test(navigator.userAgent),\r\n safari: !window.chrome && /Safari/i.test(navigator.userAgent),\r\n ie: !!window.document.documentMode\r\n },\r\n\r\n get isMobile() {\r\n return this.os.ios || this.os.android;\r\n },\r\n\r\n get isDesktop() {\r\n return !this.isMobile;\r\n }\r\n};\r\n\r\nconst operatingSystems = Object.keys(device.os);\r\nconst browsers = Object.keys(device.browser);\r\nconst setDevice = (name, value) => {\r\n document.body.classList.add(value);\r\n document.cookie = `${name}=${value}; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/;`;\r\n};\r\n\r\nfor (let key of operatingSystems) {\r\n if (device.os[key]) {\r\n setDevice('device_os', key);\r\n break;\r\n }\r\n}\r\n\r\nfor (let key of browsers) {\r\n if (device.browser[key]) {\r\n setDevice('device_browser', key);\r\n break;\r\n }\r\n}\r\n\r\nexport default device;\r\n\r\nif (device.os.ios || device.os.android) {\r\n document.body.classList.add('is-mobile');\r\n const selector = device.os.android ? 'a.ios, a.macintosh' : 'a.android';\r\n\r\n document.querySelectorAll(selector).forEach(link => {\r\n link.parentElement?.removeChild(link);\r\n });\r\n} else {\r\n document.body.classList.add('is-desktop');\r\n}\r\n","import { snakeCase } from 'lodash';\r\n\r\nexport class Tracker {\r\n #defaultEventName = 'generic_event';\r\n\r\n constructor(defaultEventName) {\r\n if (defaultEventName) {\r\n this.#defaultEventName = defaultEventName;\r\n }\r\n\r\n this.track = this.track.bind(this);\r\n }\r\n\r\n track(eventName = this.#defaultEventName, eventParams = {}, eventCallback) {\r\n const {\r\n callback = eventCallback,\r\n timeout = 2000,\r\n minCallbackTimeout,\r\n fireImmediately = false,\r\n ...customParams\r\n } = eventParams;\r\n\r\n const gtag =\r\n window.gtag ||\r\n function () {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push(arguments);\r\n };\r\n\r\n const callbackWithTimeout = () => {\r\n let hasCalled = false;\r\n let hasReachedMinTimeout = isNaN(minCallbackTimeout) || minCallbackTimeout === 0;\r\n\r\n const fn = () => {\r\n if (callback && !hasCalled) {\r\n hasCalled = true;\r\n\r\n if (hasReachedMinTimeout) {\r\n callback();\r\n }\r\n }\r\n };\r\n\r\n setTimeout(fn, timeout);\r\n\r\n if (!hasReachedMinTimeout) {\r\n setTimeout(() => {\r\n hasReachedMinTimeout = true;\r\n\r\n if (hasCalled && callback) {\r\n callback();\r\n }\r\n }, minCallbackTimeout);\r\n }\r\n\r\n return fn;\r\n };\r\n\r\n const fireEvent = () => {\r\n const params = {\r\n event_callback: callbackWithTimeout(),\r\n event_timeout: timeout\r\n };\r\n\r\n Object.keys(customParams).forEach(key => {\r\n params[snakeCase(key)] = customParams[key];\r\n });\r\n\r\n gtag('event', eventName, params);\r\n };\r\n\r\n if (fireImmediately) {\r\n fireEvent();\r\n } else {\r\n requestIdleCallback(fireEvent, { timeout: 5000 });\r\n }\r\n }\r\n}\r\n\r\nconst tracker = new Tracker();\r\n\r\nexport default tracker;\r\n","import { uniqueId } from 'lodash';\r\nimport { createElement } from './helpers';\r\nimport initModal from './modal';\r\n\r\nconst DEFAULT_INIT_DELAY = 250;\r\n\r\nexport function initIframeModal(trigger, opts = {}) {\r\n const { url, title, iframeDelay, hasDelay } = setIframeModalVars(trigger, opts);\r\n if (!url) {\r\n console.warn('Iframe url not found');\r\n return;\r\n }\r\n\r\n const id = uniqueId();\r\n const labelId = `iframe-modal-title-${id}`;\r\n const wrapper = createElement('dialog', {\r\n id: `iframe-modal-${id}`,\r\n className: 'fb-modal-wrapper iframe-modal-wrapper'\r\n });\r\n const modal = createElement('div', { className: 'fb-modal' });\r\n const modalContent = createElement('div', { className: 'fb-modal-content' });\r\n const titleEl = createElement('div', { className: 'fb-modal-top' });\r\n const titleText = createElement('span', { id: labelId, innerText: title });\r\n const closeButton = createElement('button', {\r\n className: 'close-button',\r\n innerHTML: 'Close'\r\n });\r\n const iframeWrapper = createElement('div', { className: 'iframe-wrapper' });\r\n const iframe = createElement('iframe', {\r\n className: 'modal-iframe',\r\n attributes: [\r\n ['scrolling', 'yes'],\r\n [!hasDelay ? 'src' : 'data-src', url]\r\n ]\r\n });\r\n\r\n titleEl.appendChild(titleText);\r\n titleEl.appendChild(closeButton);\r\n iframeWrapper.appendChild(iframe);\r\n modalContent.appendChild(titleEl);\r\n modalContent.appendChild(iframeWrapper);\r\n modal.appendChild(modalContent);\r\n wrapper.appendChild(modal);\r\n document.body.appendChild(wrapper);\r\n\r\n if (hasDelay) {\r\n setTimeout(() => {\r\n iframe.setAttribute('src', url);\r\n iframe.removeAttribute('data-src');\r\n }, iframeDelay);\r\n }\r\n\r\n const modalOptions = {\r\n trigger,\r\n isTriggerLink: trigger.tagName === 'A',\r\n addCloseButton: false,\r\n onOpen: opts.onOpen,\r\n onClose: opts.onClose\r\n };\r\n\r\n return initModal(wrapper, modalOptions);\r\n}\r\n\r\nfunction setIframeModalVars(trigger, opts) {\r\n const url = opts.url ?? trigger.dataset.iframeModal;\r\n const title = opts.title ?? trigger.dataset.modalTitle ?? trigger.innerText;\r\n let iframeDelay = opts.iframeDelay ?? trigger.dataset.iframeDelay;\r\n iframeDelay = parseInt(iframeDelay ?? DEFAULT_INIT_DELAY);\r\n const hasDelay = !isNaN(iframeDelay) && iframeDelay > 0;\r\n\r\n trigger.removeAttribute('data-iframe-delay');\r\n trigger.removeAttribute('data-modal-title');\r\n\r\n return { url, title, iframeDelay, hasDelay };\r\n}\r\n\r\ndocument.querySelectorAll('[data-iframe-modal]').forEach(initIframeModal);\r\n","import tracker from './analytics';\r\nimport { getUrlParameter, upperFirst } from './helpers';\r\nimport { initIframeModal } from './modal-iframe';\r\nimport device from './browser-detection';\r\nimport addInternetExplorerBanner from './add-ie-banner';\r\n\r\nlet bannerAdded = false;\r\n\r\nfunction initBookingOptions(button) {\r\n const bookingAttributeUrl = button.dataset.bookingModal;\r\n const iframeDelay = button.dataset.bookingDelay;\r\n\r\n let url = bookingAttributeUrl;\r\n let title = button.dataset.bookingTitle?.trim() ?? 'Schedule an appointment';\r\n let isAgentSpecificPage = false;\r\n let agentName = null;\r\n\r\n // Allow overwriting booking data\r\n // attributes with URL parameters\r\n const params = { page: getUrlParameter('booking') };\r\n\r\n if (params.page) {\r\n isAgentSpecificPage = true;\r\n params.firstName = getUrlParameter('firstname');\r\n params.lastName = getUrlParameter('lastname');\r\n\r\n if (params.page.startsWith('http')) {\r\n url = params.page;\r\n } else {\r\n // Attempt to retrieve the correct part of the\r\n // URL if the URL isn't formatted correctly\r\n if (params.page.includes('/')) {\r\n params.page = params.page.replace(\r\n /(.*calendar\\/|^\\/)?([^/]+)(\\/bookings.*\\/?)?/,\r\n '$2'\r\n );\r\n\r\n if (params.page.includes('/')) {\r\n const parts = params.page.split('/');\r\n params.page = parts.find(s => s.includes('@')) ?? url;\r\n }\r\n }\r\n\r\n // Booking page URLs contain an @ sign and\r\n // a domain. If one is not present in the\r\n // URL we default to fremontbank.com\r\n if (!params.page.includes('@')) {\r\n params.page += '@fremontbank.com';\r\n }\r\n\r\n url = `https://outlook.office365.com/owa/calendar/${params.page}/bookings/`;\r\n\r\n // Replace modal title with the agent's name\r\n if (params.firstName) {\r\n params.firstName = upperFirst(params.firstName);\r\n params.lastName = upperFirst(params.lastName);\r\n\r\n agentName = decodeURIComponent(`${params.firstName} ${params.lastName}`).trim();\r\n\r\n if (agentName) {\r\n title = `Schedule an appointment with ${agentName}`;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (device.browser.ie && !bannerAdded) {\r\n addInternetExplorerBanner();\r\n bannerAdded = true;\r\n }\r\n\r\n if (url) {\r\n url = url.replace(/http:/g, 'https:');\r\n }\r\n\r\n if (title) {\r\n title = decodeURIComponent(title);\r\n }\r\n\r\n button.removeAttribute('data-booking-delay');\r\n button.removeAttribute('data-booking-modal');\r\n button.removeAttribute('data-booking-title');\r\n\r\n function onOpen() {\r\n tracker.track('booking_open', {\r\n booking_page: url,\r\n is_agent: isAgentSpecificPage,\r\n agent_name: isAgentSpecificPage ? agentName ?? 'Unknown Agent' : undefined\r\n });\r\n }\r\n\r\n return { title, url, iframeDelay, onOpen };\r\n}\r\n\r\nfunction init() {\r\n requestIdleCallback(() => {\r\n document.querySelectorAll('[data-booking-modal]').forEach(el => {\r\n const modalOptions = initBookingOptions(el);\r\n initIframeModal(el, modalOptions);\r\n });\r\n });\r\n}\r\n\r\nif (document.readyState === 'complete') {\r\n init();\r\n} else {\r\n document.addEventListener('DOMContentLoaded', init);\r\n}\r\n","export default function addInternetExplorerBanner() {\r\n $('main').prepend(``);\r\n}\r\n","import { scrollToContainer, getUrlParameter } from './helpers';\r\n\r\nlet faqParamVal, topicParamVal, subTopicParamVal;\r\n\r\nconst accordionFAQ = document.querySelector('#accordionFAQ');\r\nconst accordionFAQCards = accordionFAQ ? accordionFAQ.querySelectorAll('.card') : '';\r\n\r\nconst browseFAQAccordion = document.querySelector('#accordionBrowseFAQ');\r\nconst browseFAQCards = browseFAQAccordion\r\n ? browseFAQAccordion.querySelectorAll('.card')\r\n : '';\r\n\r\nconst browseByTopicNavAccordion = document.querySelector('#accordionBrowseByTopicNav');\r\nconst browseBySubTopicNavBtns = browseByTopicNavAccordion\r\n ? browseByTopicNavAccordion.querySelectorAll('button.sub-topic')\r\n : '';\r\n\r\nfunction expandFaqItem(param, shouldScroll = true) {\r\n const faqCollapseBtn = document.querySelector('button[id=\"btn-' + param + '-faq\"]');\r\n faqCollapseBtn ? faqCollapseBtn.click() : '';\r\n\r\n const expandedFaqId = '#id-' + param + '-faq';\r\n\r\n if (shouldScroll) {\r\n scrollToContainer(expandedFaqId);\r\n }\r\n}\r\n\r\nfunction expandFirstFaq() {\r\n if (accordionFAQCards) {\r\n accordionFAQCards[0].querySelector('button').classList.remove('collapsed');\r\n accordionFAQCards[0].querySelector('button').setAttribute('aria-expanded', 'true');\r\n accordionFAQCards[0].querySelector('.collapse').classList.add('show');\r\n }\r\n}\r\n\r\nfunction expandFirstVisibleFaq() {\r\n const visibleCards = [...browseFAQCards].filter(\r\n card => !card.classList.contains('d-none')\r\n );\r\n\r\n visibleCards.forEach(function (card, index) {\r\n if (index === 0) {\r\n card.querySelector('button').classList.remove('collapsed');\r\n card.querySelector('button').setAttribute('aria-expanded', 'true');\r\n card.querySelector('.collapse').classList.add('show');\r\n }\r\n });\r\n}\r\n\r\nfunction collapseAllFaqs() {\r\n browseFAQCards.forEach(function (card) {\r\n card.querySelector('button').classList.add('collapsed');\r\n card.querySelector('button').setAttribute('aria-expanded', 'false');\r\n card.querySelector('.collapse').classList.remove('show');\r\n });\r\n}\r\n\r\nfunction expandNavTopic(topicParam) {\r\n const topicBtn = document.querySelector(\r\n `.browse-by-topic-nav-item button[data-topic=\"${topicParam}\"]`\r\n );\r\n\r\n const topicCollapse = document.querySelector(\r\n `.browse-by-topic-nav-item .collapse[data-topic=\"${topicParam}\"]`\r\n );\r\n\r\n if (!topicBtn || !topicCollapse) {\r\n return;\r\n }\r\n\r\n topicBtn.classList.remove('collapsed');\r\n topicBtn.setAttribute('aria-expanded', 'true');\r\n topicCollapse.classList.add('show');\r\n}\r\n\r\nfunction hideAllBrowseFaqs(faqs) {\r\n faqs.forEach(function (faq) {\r\n faq.classList.add('d-none');\r\n });\r\n}\r\n\r\nfunction showAllBrowseFAQsByTopic() {\r\n if (browseFAQAccordion) {\r\n const faqs = browseFAQAccordion.querySelectorAll('.card');\r\n faqs.forEach(function (faq) {\r\n faq.classList.remove('d-none');\r\n });\r\n }\r\n}\r\n\r\nfunction filterBrowseFAQsByTopic(topic) {\r\n if (browseFAQAccordion) {\r\n hideAllBrowseFaqs(browseFAQCards);\r\n\r\n browseFAQCards.forEach(function (faq) {\r\n const faqTopic = faq.getAttribute('data-topic');\r\n\r\n if (faqTopic === topic) {\r\n faq.classList.remove('d-none');\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction filterBrowseFAQsBySubTopic(topic, subtopic) {\r\n if (browseFAQAccordion) {\r\n hideAllBrowseFaqs(browseFAQCards);\r\n\r\n browseFAQCards.forEach(function (faq) {\r\n const faqTopic = faq.getAttribute('data-topic');\r\n const faqSubTopic = faq.getAttribute('data-subtopic');\r\n\r\n if (faqTopic === topic && faqSubTopic === subtopic) {\r\n faq.classList.remove('d-none');\r\n }\r\n });\r\n\r\n // expandFirstVisibleFaq();\r\n }\r\n}\r\n\r\nfunction topicNavFaqDisplay(topic, subTopic, shouldScroll = true) {\r\n // scrollToContainer('#browseByTopic');\r\n if (shouldScroll) {\r\n scrollToContainer('#faq-topic-list');\r\n }\r\n\r\n collapseAllFaqs();\r\n\r\n if (subTopic) {\r\n filterBrowseFAQsBySubTopic(topic, subTopic);\r\n } else if (topic) {\r\n filterBrowseFAQsByTopic(topic);\r\n }\r\n\r\n expandFirstVisibleFaq();\r\n expandNavTopic(topic);\r\n}\r\n\r\nfunction handleSubTopicNav(e) {\r\n const currentSubTopic = e.currentTarget;\r\n const subTopicParent = currentSubTopic.getAttribute('data-topic');\r\n const subTopic = currentSubTopic.getAttribute('data-subtopic');\r\n\r\n if (subTopicParent !== '' && subTopic !== '') {\r\n filterBrowseFAQsBySubTopic(subTopicParent, subTopic);\r\n }\r\n\r\n expandFirstVisibleFaq();\r\n}\r\n\r\nwindow.addEventListener('load', function () {\r\n faqParamVal = getUrlParameter('faq');\r\n topicParamVal = getUrlParameter('topic');\r\n subTopicParamVal = getUrlParameter('subtopic');\r\n\r\n // urlHash !== '' ? scrollToContainer(urlHash) : '';\r\n\r\n faqParamVal !== undefined ? expandFaqItem(faqParamVal) : '';\r\n\r\n topicParamVal !== undefined\r\n ? topicNavFaqDisplay(topicParamVal, subTopicParamVal, false)\r\n : '';\r\n\r\n // no params, expand first faq item\r\n window.location.href.indexOf('?') == -1 ? expandFirstFaq() : '';\r\n});\r\n\r\nif (browseBySubTopicNavBtns) {\r\n browseBySubTopicNavBtns.forEach(function (subTopicBtn) {\r\n subTopicBtn.addEventListener('click', handleSubTopicNav);\r\n });\r\n}\r\n\r\n$(browseByTopicNavAccordion).on('shown.bs.collapse', () => {\r\n const expandedItem = browseByTopicNavAccordion.querySelector(\r\n 'button[aria-expanded=\"true\"]'\r\n );\r\n const navTopic = expandedItem.getAttribute('data-topic');\r\n expandedItem ? filterBrowseFAQsByTopic(navTopic) : '';\r\n expandFirstVisibleFaq();\r\n});\r\n\r\n$(browseByTopicNavAccordion).on('hidden.bs.collapse', () => {\r\n collapseAllFaqs();\r\n\r\n // show all browse faq topics\r\n const expandedItem = browseByTopicNavAccordion.querySelector(\r\n 'button[aria-expanded=\"true\"]'\r\n );\r\n expandedItem === null ? showAllBrowseFAQsByTopic() : '';\r\n});\r\n","import tracker from './analytics';\r\n\r\ninitGlia();\r\n\r\nfunction initGlia() {\r\n if (!window.sm) {\r\n const script = document.querySelector('script[src*=\"salemove_integration.js\"]');\r\n\r\n if (script) script.addEventListener('load', initGlia);\r\n\r\n return;\r\n }\r\n\r\n window.sm.getApi({ version: 'v1' }).then(function (glia) {\r\n glia.addEventListener(glia.EVENTS.ENGAGEMENT_START, function (engagement) {\r\n tracker.track('glia_chat_start', { chat_type: engagement.startingMedia });\r\n });\r\n\r\n glia.addEventListener(glia.EVENTS.ENGAGEMENT_END, function (engagement) {\r\n tracker.track('glia_chat_end', {\r\n chat_type: engagement.startingMedia,\r\n chat_duration: formatDuration(engagement.createdAt)\r\n });\r\n });\r\n });\r\n}\r\n\r\nfunction formatDuration(startTimeISO) {\r\n const startTime = new Date(startTimeISO);\r\n const endTime = new Date();\r\n const MS_IN_MINUTE = 1000 * 60;\r\n let formatted = '';\r\n let durationMS = endTime - startTime;\r\n\r\n if (durationMS >= MS_IN_MINUTE) {\r\n formatted += `${Math.floor(durationMS / MS_IN_MINUTE)}m `;\r\n durationMS %= MS_IN_MINUTE;\r\n }\r\n\r\n formatted += `${Math.floor(durationMS / 1000)}s`;\r\n return formatted;\r\n}\r\n","import initModal from './modal';\r\nimport { getUrlParameter } from './helpers';\r\nimport tracker from './analytics';\r\n\r\nconst migrationApiEndpoint = '/apis/onlinebankingapi/ismigrated';\r\nconst accounts = {\r\n PERSONAL: 'personal',\r\n BUSINESS: 'business'\r\n};\r\n\r\nconst modal = document.querySelector('#login-modal');\r\n\r\n/////////////////////////////////////\r\n// BOB Migration Status\r\n/////////////////////////////////////\r\n\r\nconst migrationStatus = modal.dataset.migrationStatus.trim().toLowerCase();\r\n\r\nconst isBeforeMigration = migrationStatus === 'before';\r\nconst isMigrationActive = migrationStatus === 'active';\r\nconst isMigrationComplete = migrationStatus === 'complete';\r\n\r\nlet businessUserRequiresMigrationCheck = isMigrationActive;\r\nlet currentBusinessUser = null;\r\nlet currentBusinessUserLoginUrl = null;\r\n\r\nmodal.removeAttribute('data-migration-status');\r\n\r\n/////////////////////////////////////\r\n// Open modal\r\n/////////////////////////////////////\r\n\r\nlet usernameInput = null;\r\n\r\nconst { open } = initModal(modal, {\r\n trigger: '.open-login-modal',\r\n onOpen() {\r\n if (window.shouldAutofocusLogin === undefined || window.shouldAutofocusLogin) {\r\n setTimeout(() => usernameInput?.focus(), 0);\r\n }\r\n }\r\n});\r\n\r\n/////////////////////////////////////\r\n// Forms\r\n/////////////////////////////////////\r\n\r\nlet businessQ2LoginUrl = '';\r\nlet businessFiservLoginUrl = '';\r\nlet hasInitializedBusiness = false;\r\nlet hasBusinessScriptError = false;\r\nlet queueBusinessSubmit = false;\r\nlet hasTracked = false;\r\n\r\ndocument.querySelectorAll('#personal-login-form, #business-login-form').forEach(form => {\r\n const isBusiness = form.id === 'business-login-form';\r\n\r\n if (isBusiness && !isMigrationComplete) {\r\n initBusinessRemoteLogin(form);\r\n }\r\n\r\n form.addEventListener(\r\n 'submit',\r\n e => {\r\n const canSubmit =\r\n form.hasAttribute('data-programmatic-submit') ||\r\n !form.hasAttribute('data-loading');\r\n\r\n if (!canSubmit || !validateFields(form)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n return;\r\n }\r\n\r\n form.removeAttribute('data-programmatic-submit');\r\n\r\n const userName = form.querySelector('.login-username');\r\n\r\n setFormCanSubmit(form, false);\r\n\r\n if (isBusiness && !isMigrationComplete) {\r\n if (hasBusinessScriptError) {\r\n // If the remote login script failed to load we\r\n // forward the user to the login page as a fallback\r\n if (businessFiservLoginUrl) {\r\n window.location.href = businessFiservLoginUrl;\r\n } else {\r\n console.error('Cannot find business login URL');\r\n }\r\n } else if (!hasInitializedBusiness) {\r\n // If the user logs in before the remote login\r\n // script has finished loading, we queue the\r\n // submission and fire it after the script inits\r\n queueBusinessSubmit = true;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n return;\r\n }\r\n\r\n if (isMigrationActive && businessUserRequiresMigrationCheck) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n routeBusinessUserLogin(form);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // Only track login if Google Tag Manager is loaded\r\n if (!window.disableLoginTracking && 'google_tag_data' in window && !hasTracked) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n trackLogin(userName?.value, form);\r\n }\r\n },\r\n true // Use capture to ensure handler runs before onsubmit\r\n );\r\n});\r\n\r\nfunction validateFields(form) {\r\n let hasErrors = false;\r\n\r\n form.querySelectorAll('.login-form-field-wrapper').forEach(field => {\r\n const input = field.querySelector('.login-form-input');\r\n const error = field.querySelector('.login-form-error');\r\n\r\n if (!input || !error) return;\r\n\r\n if (input.value.trim()) {\r\n input.setAttribute('aria-invalid', false);\r\n error.classList.remove('visible');\r\n error.setAttribute('aria-hidden', true);\r\n } else {\r\n hasErrors = true;\r\n input.setAttribute('aria-invalid', true);\r\n error.classList.add('visible');\r\n error.setAttribute('aria-hidden', false);\r\n }\r\n });\r\n\r\n return !hasErrors;\r\n}\r\n\r\nfunction submitForm(form) {\r\n form.setAttribute('data-programmatic-submit', 'true');\r\n\r\n // Calling form.submit() doesn't fire event listeners,\r\n // so instead we programmatically click the submit button\r\n const loginButton = form.querySelector('.login-button');\r\n\r\n // Ensure button is enabled so that click is triggered\r\n // The submit handler will disable the button again. We\r\n // don't reenable it here because it would fire after the\r\n // submit handler and might be in the incorrect state.\r\n loginButton.disabled = false;\r\n loginButton.click();\r\n}\r\n\r\nfunction setFormCanSubmit(form, canSubmit) {\r\n const submitButton = form.querySelector('.login-button');\r\n\r\n if (canSubmit) {\r\n form.removeAttribute('data-loading');\r\n submitButton?.removeAttribute('disabled');\r\n submitButton?.classList.remove('loading');\r\n } else {\r\n form.setAttribute('data-loading', 'true');\r\n submitButton?.setAttribute('disabled', true);\r\n submitButton?.classList.add('loading');\r\n }\r\n}\r\n\r\nfunction handleLoginError(form, shouldEnableSubmit = true) {\r\n businessUserRequiresMigrationCheck = true;\r\n currentBusinessUserLoginUrl = null;\r\n form.removeAttribute('data-programmatic-submit');\r\n\r\n const error = form.querySelector('.login-form-general-error');\r\n\r\n error?.classList.remove('hidden');\r\n error?.setAttribute('aria-hidden', false);\r\n\r\n if (shouldEnableSubmit) {\r\n setFormCanSubmit(form, true);\r\n }\r\n}\r\n\r\n// Loads and inits business online banking script\r\nfunction initBusinessRemoteLogin(form) {\r\n const url = form.action || '';\r\n const { app = '', script: scriptSrc = '', q2LoginUrl = '' } = form.dataset;\r\n\r\n form.removeAttribute('data-type');\r\n form.removeAttribute('data-app');\r\n form.removeAttribute('data-script');\r\n form.removeAttribute('data-q2-login-url');\r\n\r\n businessQ2LoginUrl = q2LoginUrl.trim();\r\n businessFiservLoginUrl = url.trim();\r\n\r\n form.removeAttribute('action');\r\n\r\n if (!scriptSrc.trim()) {\r\n console.error('Business remote login script not found');\r\n return;\r\n }\r\n\r\n let submittedUsername = null;\r\n\r\n const handleLoad = () => {\r\n hasInitializedBusiness = true;\r\n\r\n new EBC.RemoteLogin({\r\n applicationPath: app.trim(),\r\n routingTransit: '121107882',\r\n formId: 'business-login-form',\r\n usernameId: 'login-username-business',\r\n passwordId: 'login-password-business',\r\n submitCallback: () => {\r\n submittedUsername = form.querySelector('.login-username').value.trim();\r\n },\r\n errorCallback: () => {\r\n if (isMigrationActive && submittedUsername !== currentBusinessUser) {\r\n return;\r\n }\r\n\r\n if (isBeforeMigration && businessFiservLoginUrl) {\r\n window.location.href = businessFiservLoginUrl;\r\n } else if (isMigrationActive && currentBusinessUserLoginUrl) {\r\n window.location.href = currentBusinessUserLoginUrl;\r\n } else {\r\n handleLoginError(form);\r\n }\r\n }\r\n });\r\n\r\n fiservOnSubmitFn = form.onsubmit;\r\n\r\n // During migration prevent Fiserv submit handler\r\n // from firing until we've checked the user's status\r\n if (isMigrationActive) form.onsubmit = null;\r\n\r\n if (queueBusinessSubmit) {\r\n queueBusinessSubmit = false;\r\n submitForm(form);\r\n }\r\n };\r\n\r\n const handleError = (\r\n error,\r\n message = 'Unable to load business remote login script'\r\n ) => {\r\n hasBusinessScriptError = true;\r\n console.error(message, scriptSrc, error);\r\n };\r\n\r\n try {\r\n const script = document.createElement('script');\r\n script.src = scriptSrc;\r\n script.onload = handleLoad;\r\n script.onerror = handleError;\r\n\r\n if (document.currentScript) {\r\n document.currentScript.parentNode.insertBefore(script, document.currentScript);\r\n } else {\r\n document.body.appendChild(script);\r\n }\r\n } catch (error) {\r\n handleError(error);\r\n }\r\n}\r\n\r\n/////////////////////////////////////\r\n// BOB Migration API\r\n/////////////////////////////////////\r\n\r\nlet fiservOnSubmitFn = null;\r\n\r\nasync function routeBusinessUserLogin(form, isRetry) {\r\n const usernameInput = form.querySelector('.login-username');\r\n const username = usernameInput.value.trim();\r\n\r\n currentBusinessUser = username;\r\n\r\n try {\r\n // Check if user has been migrated\r\n const url = new URL(migrationApiEndpoint, window.location.origin);\r\n url.searchParams.append('user', username);\r\n\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n const isQ2User = data?.isMigrated ?? true;\r\n\r\n if (username === currentBusinessUser) {\r\n // Update form to point to correct website\r\n if (isQ2User) {\r\n currentBusinessUserLoginUrl = businessQ2LoginUrl;\r\n form.action = businessQ2LoginUrl;\r\n form.onsubmit = null;\r\n usernameInput.name = 'user_id';\r\n } else {\r\n currentBusinessUserLoginUrl = businessFiservLoginUrl;\r\n form.removeAttribute('action');\r\n form.onsubmit = fiservOnSubmitFn;\r\n usernameInput.name = 'username';\r\n }\r\n\r\n // Set flag to prevent multiple checks and resubmit form\r\n businessUserRequiresMigrationCheck = false;\r\n submitForm(form);\r\n }\r\n } catch (e) {\r\n if (!isRetry) {\r\n setTimeout(() => routeBusinessUserLogin(form, true), 300);\r\n return;\r\n }\r\n\r\n console.error(e);\r\n\r\n if (username === currentBusinessUser) {\r\n handleLoginError(form);\r\n }\r\n }\r\n}\r\n\r\n/////////////////////////////////////\r\n// Account type toggles\r\n/////////////////////////////////////\r\n\r\nlet defaultAccountType = localStorage.getItem('default-account-type');\r\n\r\nconst accountTypeToggle = modal.querySelector('#account-type-toggle');\r\nconst saveAccountTypeWrapper = modal.querySelector('.save-account-type');\r\nconst saveAccountTypeCheckbox = saveAccountTypeWrapper?.querySelector('input');\r\n\r\nfunction isValidAccountType(type) {\r\n return type === accounts.PERSONAL || type === accounts.BUSINESS;\r\n}\r\n\r\nfunction updateDefaultAccountTypeBox(accountType) {\r\n if (!accountTypeToggle || !saveAccountTypeCheckbox) {\r\n return;\r\n }\r\n\r\n if (!isValidAccountType(accountType)) {\r\n modal.classList.remove('save-account-type-visible');\r\n return;\r\n }\r\n\r\n saveAccountTypeCheckbox.checked = accountType === defaultAccountType;\r\n\r\n const label = saveAccountTypeWrapper.querySelector('label');\r\n label.innerHTML = `Set ${accountType} online banking as your default login`;\r\n}\r\n\r\nupdateDefaultAccountTypeBox(defaultAccountType);\r\n\r\nif (accountTypeToggle && isValidAccountType(defaultAccountType)) {\r\n accountTypeToggle.value = defaultAccountType;\r\n}\r\n\r\nusernameInput = accountTypeToggle\r\n ? modal.querySelector('.login-form-panel.active .login-username')\r\n : modal.querySelector('.login-form-panel .login-username');\r\n\r\nlet accountTypeResizeObserver = null;\r\n\r\nif (accountTypeToggle) {\r\n accountTypeToggle.addEventListener('change', () => {\r\n updateDefaultAccountTypeBox(accountTypeToggle.value);\r\n modal.classList.add('save-account-type-visible');\r\n\r\n if (accountTypeResizeObserver) {\r\n accountTypeResizeObserver.disconnect();\r\n saveAccountTypeWrapper.style.marginBottom = null;\r\n }\r\n\r\n usernameInput = modal.querySelector('.login-form-panel.active .login-username');\r\n });\r\n\r\n saveAccountTypeCheckbox.addEventListener('change', () => {\r\n if (saveAccountTypeCheckbox.checked) {\r\n defaultAccountType = accountTypeToggle.value;\r\n localStorage.setItem('default-account-type', accountTypeToggle.value);\r\n } else if (defaultAccountType === accountTypeToggle.value) {\r\n defaultAccountType = null;\r\n localStorage.removeItem('default-account-type');\r\n }\r\n });\r\n}\r\n\r\n// Open the modal if immediately if login URL\r\n// parameter equals an account type or \"true\"\r\nlet loginUrlParameter = getUrlParameter('login')?.toLowerCase();\r\n\r\nif (loginUrlParameter) {\r\n if (accountTypeToggle && isValidAccountType(loginUrlParameter)) {\r\n accountTypeToggle.value = loginUrlParameter;\r\n open();\r\n } else if (loginUrlParameter === 'true') {\r\n open();\r\n }\r\n}\r\n\r\nif (saveAccountTypeWrapper && window.ResizeObserver) {\r\n let timer = null;\r\n\r\n accountTypeResizeObserver = new ResizeObserver(([{ contentRect }]) => {\r\n const height = Math.round(contentRect.height);\r\n saveAccountTypeWrapper.style.transitionProperty = 'none';\r\n saveAccountTypeWrapper.style.marginBottom = `-${height}px`;\r\n\r\n clearTimeout(timer);\r\n\r\n timer = setTimeout(() => {\r\n saveAccountTypeWrapper.style.transitionProperty = null;\r\n }, 10);\r\n });\r\n\r\n accountTypeResizeObserver.observe(saveAccountTypeWrapper);\r\n}\r\n\r\n/////////////////////////////////////\r\n// Show/hide password\r\n/////////////////////////////////////\r\n\r\nmodal.querySelectorAll('.password-input').forEach(wrapper => {\r\n const input = wrapper.querySelector('.login-password');\r\n const button = wrapper.querySelector('.toggle-password');\r\n\r\n if (!input || !button) return;\r\n\r\n const tooltip = button.querySelector('.fb-tooltip');\r\n\r\n button.addEventListener('click', () => {\r\n const willShow = input.type === 'password';\r\n\r\n wrapper.classList.toggle('password-visible', willShow);\r\n input.type = willShow ? 'text' : 'password';\r\n button.setAttribute('aria-checked', willShow);\r\n\r\n if (tooltip) {\r\n tooltip.innerText = willShow ? 'Hide password' : 'Show password';\r\n }\r\n });\r\n});\r\n\r\n/////////////////////////////////////\r\n// Analytics\r\n/////////////////////////////////////\r\n\r\nasync function trackLogin(userName, form) {\r\n if (hasTracked) return;\r\n\r\n hasTracked = true;\r\n\r\n tracker.track('login', {\r\n username: userName,\r\n fireImmediately: true,\r\n timeout: 500,\r\n callback: () => submitForm(form)\r\n });\r\n\r\n const supportsKeepAlive = window.Request && 'keepalive' in new Request('');\r\n const url = '/apis/activityapi/accountlogin';\r\n const body = JSON.stringify({ userName });\r\n\r\n try {\r\n if (supportsKeepAlive) {\r\n fetch(url, {\r\n body,\r\n method: 'post',\r\n keepalive: true,\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n } else if ('sendBeacon' in navigator) {\r\n navigator.sendBeacon(url, body);\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n}\r\n","import $ from 'jquery';\r\n\r\nconst videoModalTriggers = document.querySelectorAll('.video-container');\r\n\r\nvideoModalTriggers.forEach(function (modalTrigger) {\r\n const dataTarget = modalTrigger.dataset.target;\r\n const modal = $(dataTarget);\r\n const iframe = modal.find('iframe');\r\n\r\n if (!iframe.length) {\r\n return;\r\n }\r\n\r\n const src = iframe.attr('data-src');\r\n\r\n const play = () => {\r\n iframe[0].contentWindow.postMessage(\r\n '{\"event\":\"command\", \"func\":\"playVideo\", \"args\":\"\"}',\r\n '*'\r\n );\r\n };\r\n\r\n const pause = () => {\r\n iframe[0].contentWindow.postMessage(\r\n '{\"event\":\"command\", \"func\":\"pauseVideo\", \"args\":\"\"}',\r\n '*'\r\n );\r\n };\r\n\r\n if (src) {\r\n let parts = src.split('?');\r\n let url = parts[0];\r\n\r\n const params = (parts[1] ?? '').split('&');\r\n\r\n const addParam = (name, value) => {\r\n const regex = new RegExp(name, 'i');\r\n\r\n if (!params.find(p => regex.test(p))) {\r\n params.push(`${name}=${value}`);\r\n }\r\n };\r\n\r\n const defaultParams = {\r\n enablejsapi: 1,\r\n rel: 0,\r\n modestbranding: 1\r\n };\r\n\r\n Object.keys(defaultParams).forEach(key => {\r\n addParam(key, defaultParams[key]);\r\n });\r\n\r\n url += `?${params.join('&')}`;\r\n\r\n $(modalTrigger).one('click', () => {\r\n iframe.attr('src', url);\r\n iframe.on('load', () => {\r\n play();\r\n modal.on('shown.bs.modal', play);\r\n });\r\n });\r\n }\r\n\r\n modal.on('hide.bs.modal', pause);\r\n});\r\n","const noResultsTextEl = document.querySelector('#no-results-text');\r\nconst noResultsText = noResultsTextEl ? noResultsTextEl.textContent : '';\r\n\r\nconst predictiveSearch = document.querySelector('.predictive-search');\r\nconst autoCompleteInput = predictiveSearch\r\n ? predictiveSearch.querySelector('#autoComplete')\r\n : '';\r\n\r\nif (autoCompleteInput) {\r\n new autoComplete({\r\n data: {\r\n // Data src [Array, Function, Async] | (REQUIRED)\r\n src: async () => {\r\n // API key token\r\n const token = '';\r\n\r\n // User search query\r\n const query = document.querySelector('#autoComplete').value;\r\n\r\n // Fetch External Data Source\r\n const source = await fetch(`/apis/FaqSearchApi/search?key=${token}&q=${query}`);\r\n //const source = await fetch('templates-data/data.json');\r\n\r\n // Format data into JSON\r\n const data = await source.json();\r\n\r\n // Return Fetched data\r\n return data.questions;\r\n },\r\n key: ['question'],\r\n cache: false\r\n },\r\n sort: (a, b) => {\r\n // Sort rendered results ascendingly | (Optional)\r\n if (a.match < b.match) return -1;\r\n if (a.match > b.match) return 1;\r\n return 0;\r\n },\r\n placeHolder: 'Enter your search term', // Place Holder text | (Optional)\r\n selector: '#autoComplete', // Input field selector | (Optional)\r\n threshold: 0, // Min. Chars length to start Engine | (Optional)\r\n debounce: 300, // Post duration for engine to start | (Optional)\r\n searchEngine: 'strict', // Search Engine type/mode | (Optional)\r\n resultsList: {\r\n // Rendered results list object | (Optional)\r\n render: true,\r\n /* if set to false, add an eventListener to the selector for event type\r\n \"autoComplete\" to handle the result */\r\n container: source => {\r\n source.setAttribute('id', 'autoComplete_results');\r\n source.setAttribute('class', 'list-unstyled text-left');\r\n },\r\n destination: document.querySelector('#autoComplete'),\r\n position: 'afterend',\r\n element: 'ul'\r\n },\r\n maxResults: 5, // Max. number of rendered results | (Optional)\r\n highlight: true, // Highlight matching results | (Optional)\r\n resultItem: {\r\n // Rendered result item | (Optional)\r\n content: (data, source) => {\r\n // const faqParam = '?faq=' + data.value.id;\r\n // const param = faqParam;\r\n // source.innerHTML =\r\n // \"\" + data.match + '';\r\n const url = data.value.url.replace(/([^:])\\/{2,}/g, '$1/');\r\n source.innerHTML = `${data.match}`;\r\n },\r\n element: 'li' // Action script on noResults | (Optional)\r\n },\r\n noResults: () => {\r\n // Action script on noResults | (Optional)\r\n const result = document.createElement('li');\r\n result.setAttribute('class', 'no_result');\r\n result.setAttribute('tabindex', '1');\r\n result.innerHTML = noResultsText;\r\n document.querySelector('#autoComplete_results').appendChild(result);\r\n }\r\n // onSelection: feedback => {\r\n // // Action script onSelection event | (Optional)\r\n // const faqId = feedback.selection.value.id;\r\n // const param = '?faq=' + faqId;\r\n // window.location.href = faqDetailUrl + param;\r\n // }\r\n });\r\n}\r\n","import $ from 'jquery';\r\n\r\n$('.slick-testimonials').slick?.({\r\n dots: true,\r\n arrows: false,\r\n slidesToShow: 1,\r\n slidesToScroll: 1\r\n});\r\n","import device from './browser-detection';\r\nimport updateSVGs from 'svg4everybody';\r\n\r\nif (device.browser.ie) {\r\n updateSVGs();\r\n}\r\n","import lightGallery from 'lightgallery';\r\nimport lgThumbnail from 'lightgallery/plugins/thumbnail';\r\nimport lgZoom from 'lightgallery/plugins/zoom';\r\nimport lgVideo from 'lightgallery/plugins/video';\r\nimport $ from 'jquery';\r\n\r\nconst galleries = document.querySelectorAll('.light-gallery-wrapper');\r\nif (galleries) {\r\n galleries.forEach(gallery => {\r\n if (gallery.dataset.enabled.toLowerCase() == 'true') {\r\n initGallery(gallery);\r\n } else {\r\n window.addEventListener('DOMContentLoaded', () => {\r\n unwrapGalleryItems(gallery);\r\n });\r\n }\r\n });\r\n}\r\n\r\nfunction initGallery(galleryEl) {\r\n lightGallery(galleryEl, {\r\n plugins: [lgZoom, lgThumbnail, lgVideo],\r\n selector: '.gallery-item',\r\n licenseKey: 'b72a17f2-0ba4-4550-800d-9907373e2018',\r\n enableDrag: false,\r\n getCaptionFromTitleOrAlt: false,\r\n speed: 500\r\n });\r\n}\r\n\r\nfunction unwrapGalleryItems(gallery) {\r\n const items = gallery.querySelectorAll('.gallery-item');\r\n items.forEach(item => {\r\n const newWrapper = document.createElement('div');\r\n newWrapper.classList.add('gallery-item');\r\n $(item).wrap(newWrapper).contents().unwrap();\r\n });\r\n}\r\n","// Load more articles\r\ndocument.querySelectorAll('.sc-blog-listing').forEach(wrapper => {\r\n const listing = wrapper.querySelector('.sc-blog-listing-cards');\r\n const loadMoreWrapper = wrapper.querySelector('.load-more-wrapper');\r\n const loadMoreButton = wrapper.querySelector('.sc-load-more');\r\n\r\n if (!listing || !loadMoreButton) return;\r\n\r\n const endpoint = '/apis/securitycenterapi/getarticlecards';\r\n const loadMoreText = loadMoreButton.innerText;\r\n\r\n const category = wrapper.dataset.category;\r\n wrapper.removeAttribute('data-category');\r\n\r\n let currentPage = 0;\r\n let isLoading = false;\r\n let errorMessage = null;\r\n\r\n async function fetchPosts() {\r\n if (isLoading) return;\r\n\r\n isLoading = true;\r\n\r\n const url = new URL(endpoint, window.location.origin);\r\n url.searchParams.set('page', currentPage);\r\n\r\n if (category) {\r\n url.searchParams.set('category', category);\r\n } else {\r\n url.searchParams.set('path', window.location.pathname);\r\n }\r\n\r\n loadMoreButton.disabled = true;\r\n loadMoreButton.innerText = 'Loading...';\r\n\r\n try {\r\n const res = await fetch(url);\r\n const data = (await res.json()) ?? {};\r\n\r\n currentPage++;\r\n\r\n refreshPostListing(data);\r\n\r\n isLoading = false;\r\n } catch (error) {\r\n console.error('Failed to fetch posts', error);\r\n\r\n if (!errorMessage) {\r\n errorMessage = document.createElement('div');\r\n errorMessage.className = 'message message-error sc-load-more-error';\r\n errorMessage.innerText = 'Something went wrong, please try again later';\r\n loadMoreButton.before(errorMessage);\r\n }\r\n\r\n loadMoreButton.disabled = false;\r\n loadMoreButton.innerText = loadMoreText;\r\n\r\n isLoading = false;\r\n }\r\n }\r\n\r\n loadMoreButton.addEventListener('click', fetchPosts);\r\n\r\n function refreshPostListing(data) {\r\n const { posts, areMorePostsAvailable } = data;\r\n\r\n if (!areMorePostsAvailable || !posts.length) {\r\n if (loadMoreWrapper) {\r\n loadMoreWrapper.remove();\r\n } else {\r\n loadMoreButton.remove();\r\n }\r\n }\r\n\r\n const fragment = document.createDocumentFragment();\r\n\r\n posts.forEach(post => {\r\n const card = createArticleCard(post);\r\n if (card) fragment.append(card);\r\n });\r\n\r\n listing.append(fragment);\r\n\r\n errorMessage?.remove();\r\n\r\n if (areMorePostsAvailable) {\r\n loadMoreButton.disabled = false;\r\n loadMoreButton.innerText = loadMoreText;\r\n }\r\n }\r\n\r\n function createArticleCard({ url, headline, teaser, image }) {\r\n if (!url || !headline) return null;\r\n\r\n const wrapper = document.createElement('a');\r\n wrapper.className = 'tile';\r\n wrapper.href = url;\r\n\r\n if (image) {\r\n const imgWrapper = document.createElement('div');\r\n imgWrapper.className = 'tile-image';\r\n\r\n const img = document.createElement('img');\r\n img.src = image;\r\n img.alt = '';\r\n\r\n imgWrapper.append(img);\r\n wrapper.append(imgWrapper);\r\n }\r\n\r\n const content = document.createElement('div');\r\n content.className = 'tile-content';\r\n\r\n const top = document.createElement('div');\r\n top.className = 'tile-top';\r\n\r\n const title = document.createElement('h3');\r\n title.innerText = headline;\r\n\r\n top.append(title);\r\n content.append(top);\r\n\r\n if (teaser) {\r\n const text = document.createElement('div');\r\n text.className = 'tile-text';\r\n\r\n // Strip out any existing HTML and add paragraphs\r\n teaser = teaser\r\n .trim()\r\n .replace(/

/g, '')\r\n .replace(/<\\/p>/g, '\\n')\r\n .replace(/<[^>]*>/g, '')\r\n .trim()\r\n .split('\\n')\r\n .map(p => `

${p.trim()}

`)\r\n .join('');\r\n\r\n text.innerHTML = teaser;\r\n\r\n content.append(text);\r\n }\r\n\r\n wrapper.append(content);\r\n\r\n return wrapper;\r\n }\r\n});\r\n","import $ from 'jquery';\r\nimport { getUrlParameter } from './helpers';\r\n\r\nconst locationMapEl = document.querySelector('#location-map');\r\n\r\nif (locationMapEl) {\r\n const urlLocationParam = getUrlParameter('location');\r\n const urlSearchParam = getUrlParameter('search');\r\n let isMapZoomed = false;\r\n let infoWindowInitialized = false;\r\n\r\n const $locationMap = $('#location-map');\r\n const $locations = $('[data-location]');\r\n const $locationsSearchBtn = $('#btn-locations-search');\r\n const $locationResetBtn = $('#btn-location-reset');\r\n const $locationsGeoLocatorBtn = $('#locations-geo-locator');\r\n const $locationListingBtns = $('.location-listings button');\r\n const $locationDetailBranchAddress = $('#location-branch-address');\r\n const $locationListingSearchInput = $('#location-listing-search #search-zipcode');\r\n const $locationDetailsSearch = $('#location-details-search');\r\n const $locationDetailsSearchInput = $('#location-details-search #search-zipcode');\r\n const $noSearchResults = $('.location-listings #no-search-results');\r\n const normalMarkerIcon = '/FremontBank/media/images/icons/icon-location-default-sm.png';\r\n const activeMarkerIcon = '/FremontBank/media/images/icons/icon-location-active-sm.png';\r\n\r\n // declare map objects\r\n const gmarkers = [];\r\n let map, markers, circle, fremontStyledMapType;\r\n\r\n // declare object for storing location data, elements, and markers\r\n let locationsData;\r\n const fremontCA = { lat: 37.548271, lng: -121.988571 };\r\n\r\n function initializeMap() {\r\n map = new google.maps.Map($locationMap.get(0), {\r\n zoom: 9,\r\n center: fremontCA,\r\n mapTypeControl: false,\r\n streetViewControl: false\r\n });\r\n\r\n styleGoogleMap();\r\n\r\n // create a marker for each location and add it to the map\r\n markers = $locations\r\n .map(function (index, domElement) {\r\n var locationData = $(domElement).data('location');\r\n\r\n var marker = new google.maps.Marker({\r\n position: locationData.position,\r\n map: map,\r\n icon: normalMarkerIcon,\r\n markerID: index\r\n // animation: google.maps.Animation.DROP\r\n });\r\n\r\n //When marker is clicked, display info window with location's info\r\n marker.addListener('click', function (e) {\r\n for (var j = 0; j < markers.length; j++) {\r\n markers[j].setIcon(normalMarkerIcon);\r\n }\r\n this.setIcon(activeMarkerIcon);\r\n\r\n infoWindow.setContent($(domElement).find('.location-info').html());\r\n infoWindow.open(map, marker);\r\n });\r\n\r\n gmarkers.push(marker);\r\n\r\n return marker;\r\n })\r\n .get();\r\n\r\n // Assign locations data\r\n locationsData = $locations\r\n .map(function (index, domElement) {\r\n return {\r\n data: $(domElement).data('location'),\r\n $element: $(domElement),\r\n marker: markers[index]\r\n };\r\n })\r\n .get();\r\n\r\n // Add missing alt tags to map images\r\n google.maps.event.addListener(map, 'tilesloaded', () => {\r\n map\r\n .getDiv()\r\n .querySelectorAll('img:not([alt])')\r\n .forEach(image => image.setAttribute('alt', ''));\r\n });\r\n }\r\n\r\n function styledMapSettings() {\r\n fremontStyledMapType = new google.maps.StyledMapType(\r\n [\r\n {\r\n elementType: 'geometry',\r\n stylers: [\r\n {\r\n color: '#f5f5f5'\r\n }\r\n ]\r\n },\r\n {\r\n elementType: 'labels.icon',\r\n stylers: [\r\n {\r\n visibility: 'off'\r\n }\r\n ]\r\n },\r\n {\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#616161'\r\n }\r\n ]\r\n },\r\n {\r\n elementType: 'labels.text.stroke',\r\n stylers: [\r\n {\r\n color: '#f5f5f5'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'administrative.land_parcel',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#bdbdbd'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'poi',\r\n elementType: 'geometry',\r\n stylers: [\r\n {\r\n color: '#eeeeee'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'poi',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#757575'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'poi.park',\r\n elementType: 'geometry',\r\n stylers: [\r\n {\r\n color: '#e5e5e5'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'poi.park',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#9e9e9e'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'road',\r\n elementType: 'geometry',\r\n stylers: [\r\n {\r\n color: '#ffffff'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'road.arterial',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#757575'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'road.highway',\r\n elementType: 'geometry',\r\n stylers: [\r\n {\r\n color: '#dadada'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'road.highway',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#616161'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'road.local',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#9e9e9e'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'transit.line',\r\n elementType: 'geometry',\r\n stylers: [\r\n {\r\n color: '#e5e5e5'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'transit.station',\r\n elementType: 'geometry',\r\n stylers: [\r\n {\r\n color: '#eeeeee'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'water',\r\n elementType: 'geometry',\r\n stylers: [\r\n {\r\n color: '#c9c9c9'\r\n }\r\n ]\r\n },\r\n {\r\n featureType: 'water',\r\n elementType: 'labels.text.fill',\r\n stylers: [\r\n {\r\n color: '#9e9e9e'\r\n }\r\n ]\r\n }\r\n ],\r\n { name: 'Fremont Bank Styled Map' }\r\n );\r\n }\r\n\r\n function styleGoogleMap() {\r\n map.mapTypes.set('fremont_styled_map', fremontStyledMapType);\r\n map.setMapTypeId('fremont_styled_map');\r\n }\r\n\r\n function registerEnterKeyOnSearchInput() {\r\n $($locationListingSearchInput).on('keydown', function (e) {\r\n if (e.key === 'Enter') {\r\n searchByZipRadius();\r\n }\r\n });\r\n }\r\n\r\n function handleListingItemBtn(e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const $listingBtn = $(e.currentTarget);\r\n const btnAddress = $listingBtn.data('address');\r\n const locationInfoHtml = $listingBtn.find('.location-info').html();\r\n\r\n if ($listingBtn.hasClass('active')) {\r\n $listingBtn.removeClass('active');\r\n return;\r\n }\r\n\r\n // state\r\n $locationListingBtns.not($listingBtn).removeClass('active');\r\n $listingBtn.addClass('active');\r\n\r\n activateLocation($listingBtn, btnAddress, locationInfoHtml);\r\n\r\n // update flag\r\n isMapZoomed = true;\r\n }\r\n\r\n function handleInfoWindowAfterClose() {\r\n setInterval(function () {\r\n const infoWindowOpen = infoWindow.getMap() ? true : false;\r\n\r\n if (!infoWindowOpen) {\r\n for (var j = 0; j < markers.length; j++) {\r\n markers[j].setIcon(normalMarkerIcon);\r\n }\r\n }\r\n\r\n // reset map if infoWindow is closed & `isMapZoomed` flag is `true`\r\n if (infoWindowInitialized && !infoWindowOpen && isMapZoomed) {\r\n resetMap();\r\n }\r\n }, 1000);\r\n }\r\n\r\n function handleUrlParameters() {\r\n // `search` parameter\r\n urlSearchParam !== undefined ? displayCurrentGeolocation() : initializeMap();\r\n\r\n // `location` parameter\r\n if (urlLocationParam !== undefined) {\r\n $locationListingSearchInput.val(urlLocationParam);\r\n setTimeout(() => {\r\n $locationsSearchBtn.trigger('click');\r\n }, 0);\r\n } else {\r\n initializeMap();\r\n }\r\n }\r\n\r\n function showNoSearchResultsMessage() {\r\n if ($noSearchResults) {\r\n $noSearchResults.removeClass('d-none');\r\n }\r\n }\r\n\r\n function showMapMarkersByRadius(position, radius, filteredLocationsByDistance) {\r\n for (var i = 0; i < gmarkers.length; i++) {\r\n if (\r\n google.maps.geometry.spherical.computeDistanceBetween(\r\n gmarkers[i].getPosition(),\r\n position\r\n ) < radius\r\n ) {\r\n filteredLocationsByDistance.forEach(ld => {\r\n if (ld.locationPosition === gmarkers[i].getPosition()) {\r\n gmarkers[i].setVisible(true);\r\n gmarkers[i].setMap(map);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n function orderByRadiusDistance(position, filteredLocations, radius) {\r\n let numLocationWithinRadius = 0;\r\n\r\n // Sort all filtered locations\r\n var filteredLocationsByDistance = filteredLocations\r\n .map(ld => {\r\n return {\r\n $element: ld.$element,\r\n locationPosition: ld.marker.getPosition(),\r\n distance: google.maps.geometry.spherical.computeDistanceBetween(\r\n position,\r\n ld.marker.getPosition()\r\n )\r\n };\r\n })\r\n .sort((a, b) => a.distance - b.distance);\r\n\r\n if (radius > 0) {\r\n /* show filtered results within radius */\r\n hideAllLocations();\r\n hideAllMapMarkers(position);\r\n showMapMarkersByRadius(position, radius, filteredLocationsByDistance);\r\n\r\n // show location if within radius search\r\n filteredLocationsByDistance.forEach(ld => {\r\n const milesAway = ld.distance * 0.00062137;\r\n const milesAwayRounded = Math.round(milesAway * 10) / 10;\r\n const locationElement = ld.$element[0];\r\n const locationDistanceFrom = locationElement.querySelector('.distance-from');\r\n\r\n locationDistanceFrom.innerHTML = milesAwayRounded + ' miles away';\r\n\r\n if (ld.distance < radius) {\r\n ld.$element.show();\r\n numLocationWithinRadius++;\r\n }\r\n });\r\n\r\n // Detach and re-append locations in order of distance\r\n filteredLocationsByDistance.forEach(lbd => {\r\n var $parent = lbd.$element.parent();\r\n lbd.$element.detach().appendTo($parent);\r\n });\r\n\r\n $('.location-listings ul').scrollTop(0);\r\n\r\n if (numLocationWithinRadius === 0) {\r\n showNoSearchResultsMessage();\r\n }\r\n\r\n // Set location list info text\r\n // screenReaderAnnouncement();\r\n }\r\n }\r\n\r\n function searchByZipRadius(urlLocationParam) {\r\n var radius = 25; // 25 miles\r\n var radiusVal = parseInt(radius, 10) * 1600;\r\n\r\n var zipCitySearchVal =\r\n urlLocationParam !== undefined\r\n ? urlLocationParam\r\n : $($locationListingSearchInput).val();\r\n\r\n if (urlLocationParam !== undefined) {\r\n $($locationListingSearchInput).val(urlLocationParam);\r\n }\r\n\r\n if (zipCitySearchVal !== '') {\r\n $('.location-search .invalid-feedback').removeClass('d-block');\r\n\r\n geocoder.geocode(\r\n { address: zipCitySearchVal.toString() },\r\n function (results, status) {\r\n if (status == 'OK') {\r\n // reset\r\n infoWindow.close(); // close infoWindow if open\r\n $locationListingBtns.removeClass('active'); // remove state on branch listing if active\r\n if ($noSearchResults) {\r\n $noSearchResults.addClass('d-none');\r\n } // hide no results message\r\n\r\n var position = results[0].geometry.location;\r\n\r\n for (var i = 0; i < gmarkers.length; i++) {\r\n gmarkers[i].setMap(map);\r\n }\r\n\r\n map.setCenter(position);\r\n map.setZoom(10);\r\n\r\n if (circle) {\r\n circle.setMap(null);\r\n }\r\n\r\n circle = new google.maps.Circle({\r\n center: position,\r\n radius: radiusVal,\r\n strokeColor: '#d19700',\r\n strokeOpacity: 0.8,\r\n strokeWeight: 1,\r\n fillOpacity: 0.1,\r\n fillColor: '#008080',\r\n map: map\r\n });\r\n\r\n // Order locations by distance from position\r\n orderByRadiusDistance(position, locationsData, radiusVal);\r\n\r\n showResetBtn();\r\n } else {\r\n $('.location-search .invalid-feedback').addClass('d-block');\r\n }\r\n }\r\n );\r\n } else {\r\n $('.location-search .invalid-feedback').addClass('d-block');\r\n }\r\n }\r\n\r\n function activateLocation($listingBtn, branchAddress, infoWindowContent) {\r\n if (branchAddress) {\r\n geocoder.geocode({ address: branchAddress }, function (results, status) {\r\n if (status == 'OK') {\r\n var position = results[0].geometry.location;\r\n map.setCenter(position);\r\n map.setZoom(11);\r\n\r\n const $locationElement = $listingBtn.parent();\r\n const currentLocationData = locationsData.filter(locationData =>\r\n locationData.$element.is($locationElement)\r\n )[0];\r\n const marker = currentLocationData.marker;\r\n\r\n for (var i = 0; i < gmarkers.length; i++) {\r\n gmarkers[i].setIcon(normalMarkerIcon);\r\n\r\n if (gmarkers[i] === marker) {\r\n gmarkers[i].setIcon(activeMarkerIcon);\r\n }\r\n }\r\n\r\n if (infoWindowContent !== null) {\r\n infoWindow.setPosition(position);\r\n infoWindow.setContent(infoWindowContent);\r\n infoWindow.open(map);\r\n infoWindowInitialized = true;\r\n }\r\n\r\n styleGoogleMap();\r\n showResetBtn();\r\n } else {\r\n alert('Geocode was not successful for the following reason: ' + status);\r\n }\r\n });\r\n }\r\n }\r\n\r\n function detailPageLocation(branchAddress) {\r\n if (branchAddress) {\r\n geocoder.geocode({ address: branchAddress }, function (results, status) {\r\n if (status == 'OK') {\r\n var position = results[0].geometry.location;\r\n\r\n map = new google.maps.Map($locationMap.get(0), {\r\n zoom: 14,\r\n center: position,\r\n mapTypeControl: false,\r\n streetViewControl: false\r\n });\r\n\r\n styleGoogleMap();\r\n\r\n var marker = new google.maps.Marker({\r\n position: position,\r\n map: map,\r\n icon: activeMarkerIcon,\r\n animation: google.maps.Animation.DROP\r\n });\r\n\r\n showResetBtn();\r\n } else {\r\n alert('Geocode was not successful for the following reason: ' + status);\r\n }\r\n });\r\n }\r\n }\r\n\r\n function handleGeoLocationError(browserHasGeolocation, infoWindow, pos) {\r\n const errorFailedMsg =\r\n '
Error: The Geolocation service failed.

Geographic location will only display when user has allowed location sharing in his or her browser.
';\r\n const errorBrowserNotSupported =\r\n '
Error: Your browser doesn\\'t support geolocation.
';\r\n\r\n infoWindow.setPosition(pos);\r\n infoWindow.setContent(\r\n browserHasGeolocation ? errorFailedMsg : errorBrowserNotSupported\r\n );\r\n infoWindow.open(map);\r\n }\r\n\r\n function displayCurrentGeolocation() {\r\n if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(\r\n function (position) {\r\n var pos = {\r\n lat: position.coords.latitude,\r\n lng: position.coords.longitude\r\n };\r\n\r\n map = new google.maps.Map($locationMap.get(0), {\r\n zoom: 12,\r\n center: pos,\r\n mapTypeControl: false,\r\n streetViewControl: false\r\n });\r\n\r\n styleGoogleMap();\r\n\r\n var marker = new google.maps.Marker({\r\n position: pos,\r\n map: map,\r\n icon: activeMarkerIcon,\r\n animation: google.maps.Animation.DROP\r\n });\r\n\r\n showResetBtn();\r\n removeDistanceFromCurrentLocation();\r\n },\r\n function () {\r\n handleGeoLocationError(true, infoWindow, map.getCenter());\r\n }\r\n );\r\n } else {\r\n // Browser doesn't support Geolocation\r\n handleGeoLocationError(false, infoWindow, map.getCenter());\r\n }\r\n }\r\n\r\n function redirectFromDetailsWithParam(searchContainer, searchVal, locationPageUrl) {\r\n if (searchVal !== '') {\r\n window.location.href = locationPageUrl + '?location=' + searchVal;\r\n } else {\r\n searchContainer.find('.invalid-feedback').addClass('d-block');\r\n }\r\n }\r\n\r\n function hideAllLocations() {\r\n locationsData.forEach(ld => {\r\n ld.$element.hide();\r\n });\r\n }\r\n\r\n function hideAllMapMarkers() {\r\n for (var i = 0; i < gmarkers.length; i++) {\r\n gmarkers[i].setMap(null);\r\n }\r\n }\r\n\r\n function showResetBtn() {\r\n $locationResetBtn.addClass('d-none').addClass('d-inline-block');\r\n }\r\n\r\n function setMobileStickyMap() {\r\n const headerHeight = $('header').height();\r\n $('.sticky-map').css('top', headerHeight + 'px');\r\n }\r\n\r\n function removeDistanceFromCurrentLocation() {\r\n const distanceFrom = document.querySelectorAll('.location-listings .distance-from');\r\n distanceFrom.forEach(function (item) {\r\n item.innerHTML = '';\r\n });\r\n }\r\n\r\n function resetMap() {\r\n initializeMap(); // init map\r\n\r\n $($locationListingSearchInput).val(''); // clear search textbox value\r\n $locationResetBtn // hide reset button\r\n .removeClass('d-inline-block')\r\n .addClass('d-none');\r\n\r\n removeDistanceFromCurrentLocation();\r\n\r\n $locationListingBtns.removeClass('active'); // remove active state\r\n $('.location-listings li').each(function () {\r\n // show all listings\r\n $(this).removeAttr('style');\r\n });\r\n\r\n const newLocationObject = locationsData\r\n .map(ld => {\r\n return {\r\n data: ld.data.location,\r\n $element: ld.$element\r\n };\r\n })\r\n .sort((a, b) => {\r\n // sort alphabetically\r\n if (a.data < b.data) {\r\n return -1;\r\n }\r\n if (a.data > b.data) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n // Detach and re-append locations alphabetically\r\n newLocationObject.forEach(nlo => {\r\n var $parent = nlo.$element.parent();\r\n nlo.$element.detach().appendTo($parent);\r\n });\r\n\r\n if ($noSearchResults) {\r\n $noSearchResults.addClass('d-none'); // hide no results message\r\n }\r\n\r\n isMapZoomed = false; // reset zoom flag\r\n }\r\n\r\n // setup, initialization, event listeners\r\n if (locationMapEl) {\r\n styledMapSettings();\r\n registerEnterKeyOnSearchInput();\r\n setMobileStickyMap();\r\n handleInfoWindowAfterClose();\r\n handleUrlParameters();\r\n\r\n var geocoder = new google.maps.Geocoder();\r\n\r\n // single info window for displaying branch information when markers are clicked\r\n var infoWindow = new google.maps.InfoWindow({\r\n pixelOffset: new google.maps.Size(130, 20)\r\n });\r\n\r\n // register change event on location controls\r\n $locationsSearchBtn.on('click', function () {\r\n searchByZipRadius();\r\n });\r\n $locationsGeoLocatorBtn.on('click', displayCurrentGeolocation);\r\n $locationResetBtn.on('click', resetMap);\r\n }\r\n\r\n // events\r\n $locationListingBtns.on('click', handleListingItemBtn);\r\n\r\n document.addEventListener('DOMContentLoaded', function () {\r\n // location detail: zoom to branch on load\r\n if ($locationDetailBranchAddress) {\r\n const branchAddress = $locationDetailBranchAddress.data('branch-address');\r\n if (branchAddress) {\r\n detailPageLocation(branchAddress);\r\n }\r\n }\r\n\r\n // location detail: geo locator and search clicks\r\n if ($locationDetailsSearch) {\r\n const $locationDetailGeoLocatorBtn = $locationDetailsSearch.find(\r\n '#locations-detail-geo-locator'\r\n );\r\n const $locationDetailSearchBtn = $locationDetailsSearch.find(\r\n '#btn-locations-detail-search'\r\n );\r\n const locationPageUrl = $locationDetailGeoLocatorBtn.data('location-page');\r\n\r\n if (locationPageUrl) {\r\n $locationDetailGeoLocatorBtn.on('click', function () {\r\n window.location.href = locationPageUrl + '?search=geo-locator';\r\n });\r\n\r\n $locationDetailsSearchInput.on('keydown', function (e) {\r\n if (e.key === 'Enter') {\r\n const searchVal = $locationDetailsSearchInput.val();\r\n redirectFromDetailsWithParam(\r\n $locationDetailsSearch,\r\n searchVal,\r\n locationPageUrl\r\n );\r\n }\r\n });\r\n\r\n $locationDetailSearchBtn.on('click', function () {\r\n const searchVal = $locationDetailsSearchInput.val();\r\n redirectFromDetailsWithParam(\r\n $locationDetailsSearch,\r\n searchVal,\r\n locationPageUrl\r\n );\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Prevent closing branch box after\r\n // clicking details button\r\n $('.location-listings button a').on('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n location.href = $(this).attr('href');\r\n });\r\n}\r\n"],"sourceRoot":""}