{"version":3,"file":"frontend-Cb7XI074.js","sources":["../assets/js/components/header.js","../assets/js/components/space-archive.js","../assets/js/components/post-archive.js","../assets/js/components/notification-bar.js","../assets/js/components/gravityforms.js","../assets/js/frontend.js"],"sourcesContent":["export function headerInit() {\n\tdocument.addEventListener( 'DOMContentLoaded', function() {\n\t\t// Header open logic\n\t\tconst openMobileHeader = () => {\n\t\t\tdocument.getElementById( 'site-navigation' ).classList.toggle( 'active' );\n\t\t\tdocument.getElementById( 'mobile-nav-close' ).focus();\n\t\t};\n\t\tconst closeMobileHeader = () => {\n\t\t\tdocument.getElementById( 'site-navigation' ).classList.toggle( 'active' );\n\t\t\tdocument.getElementById( 'mobile-nav-open' ).focus();\n\t\t};\n\n\t\tdocument.getElementById( 'mobile-nav-open' ).addEventListener( 'click', openMobileHeader );\n\t\tdocument.getElementById( 'mobile-nav-close' ).addEventListener( 'click', closeMobileHeader );\n\n\t\t// Header scroll logic\n\t\tlet prevScroll = window.scrollY;\n\t\tconst header = document.querySelector( 'header' );\n\t\tconst top = header.offsetTop + 130;\n\n\t\twindow.onscroll = () => {\n\t\t\tconst currentScroll = window.scrollY;\n\n\t\t\tif ( currentScroll >= top ) {\n\t\t\t\theader.classList.add( 'sticky' );\n\t\t\t} else {\n\t\t\t\theader.classList.remove( 'sticky' );\n\t\t\t}\n\n\t\t\tif ( prevScroll >= currentScroll ) {\n\t\t\t\theader.style.top = '0';\n\t\t\t} else {\n\t\t\t\theader.style.top = '-300px';\n\t\t\t}\n\n\t\t\tprevScroll = currentScroll;\n\t\t};\n\n\t\tconst search = document.getElementById( 'header-search' );\n\t\tconst searchLabel = search.getElementsByClassName( 'site-header-menu-search-label' )[ 0 ];\n\t\tconst searchInput = search.getElementsByClassName( 'search-field' )[ 0 ];\n\t\tconst searchSubmit = search.getElementsByClassName( 'search-submit' )[ 0 ];\n\t\tconst searchClose = search.getElementsByClassName( 'search-close' )[ 0 ];\n\n\t\tconst openSearch = () => {\n\t\t\tsearch.classList.add( 'search__open' );\n\t\t\tsearchInput.focus();\n\t\t\tif ( ! searchInput.value ) {\n\t\t\t\tsearchLabel.style.display = 'none';\n\t\t\t} else {\n\t\t\t\tsearchLabel.style.display = 'block';\n\t\t\t}\n\t\t};\n\n\t\tconst closeSearch = () => {\n\t\t\tsearch.classList.remove( 'search__open' );\n\t\t\tsearchLabel.style.display = 'flex';\n\t\t};\n\n\t\tsearchLabel.onclick = function( e ) {\n\t\t\te.preventDefault();\n\t\t\tif ( search.classList.contains( 'search__open' ) ) {\n\t\t\t\tsearchSubmit.click();\n\t\t\t} else {\n\t\t\t\topenSearch();\n\t\t\t}\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tsearchInput.onclick = function( e ) {\n\t\t\topenSearch();\n\t\t\te.stopPropagation();\n\t\t};\n\t\tsearchInput.onkeydown = function( e ) {\n\t\t\tif ( ( e.key === 'Backspace' || e.key === 'Delete' ) && searchInput.value.length <= 1 ) {\n\t\t\t\tsearchLabel.style.display = 'none';\n\t\t\t} else {\n\t\t\t\tsearchLabel.style.display = 'block';\n\t\t\t}\n\t\t};\n\t\tsearchInput.onkeyup = function() {\n\t\t\tif ( searchInput.value.length === 0 ) {\n\t\t\t\tsearchLabel.style.display = 'none';\n\t\t\t} else {\n\t\t\t\tsearchLabel.style.display = 'block';\n\t\t\t}\n\t\t};\n\t\tsearchSubmit.onclick = function( e ) {\n\t\t\tif ( ! search.classList.contains( 'search__open' ) ) {\n\t\t\t\te.preventDefault();\n\t\t\t\topenSearch();\n\t\t\t}\n\t\t\te.stopPropagation();\n\t\t};\n\t\tsearchClose.onclick = function() {\n\t\t\tcloseSearch();\n\t\t};\n\n\t\tdocument.addEventListener( 'click', function() {\n\t\t\tif ( window.innerWidth > 767 && document.getSelection().toString().length === 0 ) {\n\t\t\t\tcloseSearch();\n\t\t\t}\n\t\t} );\n\t\tdocument.addEventListener( 'keydown', function( e ) {\n\t\t\tif ( e.code === 'Escape' ) {\n\t\t\t\tcloseSearch();\n\t\t\t}\n\t\t} );\n\n\t\t// Focus trapping example taken from: https://medium.com/@im_rahul/focus-trapping-looping-b3ee658e5177\n\t\tfunction MobileMenuKeyboardHandler( e ) {\n\t\t\t/// Get all links from menu.\n\t\t\tconst menuLinks = document.getElementById( 'site-navigation' ).getElementsByTagName( 'a' );\n\n\t\t\tif ( menuLinks ) {\n\t\t\t\t// Nav close button.\n\t\t\t\tconst navCloseButton = document.getElementById( 'mobile-nav-close' );\n\n\t\t\t\t// Get last link from menu.\n\t\t\t\tconst lastLinkInMenuIndex = menuLinks.length - 1;\n\n\t\t\t\t// Get last link from menu.\n\t\t\t\tconst lastLinkInMenu = menuLinks[ lastLinkInMenuIndex ];\n\n\t\t\t\tif ( e.key === 'Tab' ) {\n\t\t\t\t\t// Rotate Focus\n\t\t\t\t\t// eslint-disable-next-line @wordpress/no-global-active-element\n\t\t\t\t\tif ( e.shiftKey && document.activeElement === navCloseButton ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tlastLinkInMenu.focus();\n\t\t\t\t\t\t// eslint-disable-next-line @wordpress/no-global-active-element\n\t\t\t\t\t} else if ( ! e.shiftKey && document.activeElement === lastLinkInMenu ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tnavCloseButton.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener( 'keydown', MobileMenuKeyboardHandler );\n\n\t\tfunction handleAriaRole() {\n\t\t\t// When DOM is loaded role attribute will be added to navigation.\n\t\t\tif ( window.innerWidth < 768 ) {\n\t\t\t\tdocument.getElementById( 'site-navigation' ).setAttribute( 'role', 'dialog' );\n\t\t\t\tdocument.getElementById( 'site-navigation' ).setAttribute( 'aria-modal', 'true' );\n\t\t\t}\n\n\t\t\t// Handle resizing and based on the screen size,\n\t\t\t// role will be added or removed from navigation.\n\t\t\taddEventListener( 'resize', () => {\n\t\t\t\tif ( window.innerWidth < 768 ) {\n\t\t\t\t\tdocument.getElementById( 'site-navigation' ).setAttribute( 'role', 'dialog' );\n\t\t\t\t\tdocument.getElementById( 'site-navigation' ).setAttribute( 'aria-modal', 'true' );\n\t\t\t\t} else {\n\t\t\t\t\tdocument.getElementById( 'site-navigation' ).removeAttribute( 'role', 'dialog' );\n\t\t\t\t\tdocument.getElementById( 'site-navigation' ).removeAttribute( 'aria-modal', 'true' );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\thandleAriaRole();\n\n\t\t// Language switcher.\n\t\tconst langToggle = document.querySelector( '#site-header-menu-lang__toggle' );\n\t\tconst toggleArrow = langToggle.lastElementChild;\n\t\tconst langMenuPanel = document.querySelector( '#site-header-menu-lang__panel' );\n\n\t\tconst toggleLanguageMenu = () => {\n\t\t\tif ( langToggle.hasAttribute( 'aria-controls' ) ) {\n\t\t\t\tlangToggle.removeAttribute( 'aria-controls' );\n\t\t\t} else {\n\t\t\t\tlangToggle.setAttribute( 'aria-controls', 'site-header-menu-lang__panel' );\n\t\t\t}\n\n\t\t\ttoggleArrow.classList.toggle( 'reversed' );\n\t\t\tlangMenuPanel.classList.toggle( 'visible' );\n\n\t\t\tif ( langMenuPanel.classList.contains( 'visible' ) ) {\n\t\t\t\tlangToggle.setAttribute( 'aria-expanded', 'true' );\n\t\t\t\tlangMenuPanel.querySelector( '.site-header-menu-lang__panel-list-item a' ).focus();\n\t\t\t} else {\n\t\t\t\tlangToggle.setAttribute( 'aria-expanded', 'false' );\n\t\t\t\tlangToggle.focus();\n\t\t\t}\n\t\t};\n\n\t\t// Event listener for click and keyboard.\n\t\tlangToggle.addEventListener( 'click', toggleLanguageMenu );\n\t\tlangToggle.addEventListener( 'keydown', ( event ) => {\n\t\t\tif ( event.key === 'Enter' ) {\n\t\t\t\ttoggleLanguageMenu();\n\t\t\t}\n\t\t} );\n\n\t\t// Close the language menu with Escape key\n\t\tdocument.addEventListener( 'keydown', ( event ) => {\n\t\t\tif ( event.key === 'Escape' && langMenuPanel.classList.contains( 'visible' ) ) {\n\t\t\t\ttoggleLanguageMenu();\n\t\t\t\tlangToggle.focus();\n\t\t\t}\n\t\t} );\n\n\t\t// Focus trap for the language menu.\n\t\tconst focusableElements = Array.from( langMenuPanel.querySelectorAll( 'a, button' ) );\n\t\tfocusableElements.unshift( langToggle );\n\t\tconst firstFocusableElement = focusableElements[ 0 ];\n\t\tconst lastFocusableElement = focusableElements[ focusableElements.length - 1 ];\n\n\t\tlangMenuPanel.addEventListener( 'keydown', ( event ) => {\n\t\t\tconst activeElement = langMenuPanel.ownerDocument.activeElement;\n\n\t\t\tif ( event.key === 'Tab' ) {\n\t\t\t\tif ( event.shiftKey ) { // Shift + Tab\n\t\t\t\t\tif ( activeElement === firstFocusableElement ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tlastFocusableElement.focus();\n\t\t\t\t\t}\n\t\t\t\t} else if ( ! event.shiftKey && activeElement === lastFocusableElement ) { // Tab\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tfirstFocusableElement.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n","export function spaceArchiveInit() {\n\tdocument.addEventListener( 'DOMContentLoaded', function() {\n\t\t// Don't run this script if not in correct archive page\n\t\tif ( ! document.querySelector( '.post-type-archive-space' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterSelection = document.querySelector( '.archive-space-filter-selection' );\n\n\t\tconst displayFilterSelection = () => {\n\t\t// Hide selection element if there are no filters selected\n\t\t\tif ( filterSelection.innerHTML.trim() === '' ) {\n\t\t\t\tfilterSelection.classList.remove( 'active' );\n\t\t\t} else {\n\t\t\t\tfilterSelection.classList.add( 'active' );\n\t\t\t}\n\t\t};\n\n\t\tconst openAreaCounter = async ( el ) => {\n\t\t\tconst hidden = el.target.ariaExpanded === 'true';\n\t\t\tdocument.querySelector( '.archive-space-areacounter' ).classList.toggle( 'active' );\n\t\t\tel.target.ariaExpanded = hidden ? 'false' : 'true';\n\t\t\tdocument.querySelector( '#areacounter-content' ).ariaHidden = hidden ? 'true' : 'false';\n\n\t\t\tif ( document.querySelector( '#areacounter-content' ).hidden === true ) {\n\t\t\t\tdocument.querySelector( '#areacounter-content' ).hidden = false;\n\t\t\t} else {\n\t\t\t\tdocument.querySelector( '#areacounter-content' ).hidden = true;\n\t\t\t}\n\t\t};\n\n\t\tdocument.querySelector( '#archive-space-areacounter-btn' ).addEventListener( 'click', openAreaCounter );\n\n\t\tconst archiveDropDowns = document.querySelectorAll( '.archive-space-dropdown' );\n\n\t\tconst countArea = ( el ) => {\n\t\t\t// Values for calculations\n\t\t\tconst openOfficeVal = 17;\n\t\t\tconst roomOfficeVal = 31;\n\t\t\tconst combinationOfficeVal = 11.5;\n\n\t\t\tlet openOfficeResult;\n\t\t\tlet roomOfficeResult;\n\t\t\tlet combinationOfficeResult;\n\n\t\t\tconst personelAmount = document.querySelector( '#personel-amount' );\n\t\t\tconst squareMeters = document.querySelector( '#square-meters-amount' );\n\n\t\t\tif ( el.target.id === 'personel-amount' ) {\n\t\t\t\tsquareMeters.value = 0;\n\n\t\t\t\tconst unit = ' m²';\n\n\t\t\t\topenOfficeResult = parseInt( personelAmount.value * openOfficeVal ) + unit;\n\t\t\t\troomOfficeResult = parseInt( personelAmount.value * roomOfficeVal ) + unit;\n\t\t\t\tcombinationOfficeResult = parseInt( personelAmount.value * combinationOfficeVal ) + unit;\n\n\t\t\t\tdocument.querySelector( '#areacounter-result-header' ).innerHTML = window.recommendedSpaceStr;\n\t\t\t} else {\n\t\t\t\tpersonelAmount.value = 0;\n\n\t\t\t\topenOfficeResult = parseInt( squareMeters.value / openOfficeVal );\n\t\t\t\troomOfficeResult = parseInt( squareMeters.value / roomOfficeVal );\n\t\t\t\tcombinationOfficeResult = parseInt( squareMeters.value / combinationOfficeVal );\n\n\t\t\t\tdocument.querySelector( '#areacounter-result-header' ).innerHTML = window.recommendedPersonnelStr;\n\t\t\t}\n\n\t\t\tdocument.querySelector( '#open-office' ).value = `${ openOfficeResult }`;\n\t\t\tdocument.querySelector( '#room-office' ).value = `${ roomOfficeResult }`;\n\t\t\tdocument.querySelector( '#combination-office' ).value = `${ combinationOfficeResult }`;\n\t\t};\n\n\t\tdocument.querySelector( '#personel-amount' ).addEventListener( 'input', countArea );\n\t\tdocument.querySelector( '#square-meters-amount' ).addEventListener( 'input', countArea );\n\n\t\tconst mapParams = ( element ) => {\n\t\t\tif ( element.checked ) {\n\t\t\t\treturn element.value;\n\t\t\t}\n\t\t};\n\n\t\tconst resetForms = ( element ) => {\n\t\t\tif ( element.name === 'all' ) {\n\t\t\t\telement.disabled = true;\n\t\t\t\telement.checked = true;\n\t\t\t} else {\n\t\t\t\telement.checked = false;\n\t\t\t}\n\t\t\tdocument.getElementsByClassName( 'archive-space-misc-show-list' )[ 0 ].click();\n\t\t};\n\n\t\tconst fetchData = async () => {\n\t\t\tdocument.querySelector( '.archive-space-items-overlay' ).classList.add( 'active' );\n\n\t\t\tconst types = [ ...document.querySelectorAll( '[data-term=\"space-type\"]' ) ].filter( ( item ) => item.checked && item.value !== '' ).map( mapParams );\n\t\t\tconst locations = [ ...document.querySelectorAll( '[data-term=\"space-location\"]' ) ].filter( ( item ) => item.checked && item.value !== '' ).map( mapParams );\n\t\t\tconst squareMeters = [ ...document.querySelectorAll( '[data-term=\"space-square-metres\"]' ) ].filter( ( item ) => item.checked && item.value !== '' ).map( mapParams );\n\n\t\t\tconst groupByPremise = document.getElementById( 'group-spaces' ).checked;\n\n\t\t\tconst paramType = types.length > 0 ? `space_type=${ types.join( ',' ) }` : '';\n\t\t\tconst paramLocation = locations.length > 0 ? `space_location=${ locations.join( ',' ) }` : '';\n\t\t\tconst paramSquareMeters = squareMeters.length > 0 ? `space_square_metres=${ squareMeters.join( ',' ) }` : '';\n\t\t\tconst paramGroupByPremise = groupByPremise === true ? `group=true` : '';\n\n\t\t\tconst lang = document.getElementsByTagName( 'html' )[ 0 ].attributes.lang.value;\n\n\t\t\tconst paramLang = `space_lang=${ lang }`;\n\n\t\t\tconst params = `${ [ paramType, paramLocation, paramSquareMeters, paramGroupByPremise, paramLang ].filter( Boolean ).join( '&' ) }`;\n\n\t\t\tconst fetchUrl = `${ window.location.origin }/wp-json/wp-exove/v2/space/${ params !== '' ? '?' + params : '' }`;\n\n\t\t\tawait fetch( fetchUrl )\n\t\t\t\t.then( ( res ) => {\n\t\t\t\t\treturn res.json();\n\t\t\t\t} )\n\t\t\t\t.then( ( data ) => {\n\t\t\t\t\tdocument.querySelector( '#archive-space-list' ).innerHTML = data.html;\n\t\t\t\t\tdocument.querySelector( '#spaces-count' ).innerHTML = document.querySelector( '.archive-space-items-container' ).dataset.count;\n\t\t\t\t\tdocument.querySelector( '#spaces-count + span' ).innerHTML = document.querySelector( '.archive-space-misc-count' ).dataset[ groupByPremise ? 'premiseLabel' : 'spaceLabel' ];\n\t\t\t\t} )\n\t\t\t\t.finally( () => {\n\t\t\t\t\tdocument.querySelector( '.archive-space-items-overlay' ).classList.remove( 'active' );\n\t\t\t\t} );\n\n\t\t\tconst slugUrl = lang !== 'fi' ? `/${ lang.split( '-' )[ 0 ] }/${ window.postType }/` : `/${ window.postType }/`;\n\t\t\tconst newUrl = window.location.protocol + '//' + window.location.host + slugUrl + ( params !== '' ? '?' + params : '' );\n\t\t\twindow.history.pushState( { path: newUrl }, document.title, newUrl );\n\t\t\twindow.dispatchEvent( new Event( 'popstate' ) );\n\t\t};\n\n\t\tconst onInputChange = ( el ) => {\n\t\t\tif ( el.target.id.startsWith( 'all' ) ) {\n\t\t\t\tif ( el.target.checked ) {\n\t\t\t\t\tel.target.disabled = true;\n\t\t\t\t}\n\n\t\t\t\tdocument.querySelectorAll( `[data-term=\"${ el.target.dataset.term }\"]` ).forEach( ( item ) => {\n\t\t\t\t\tif ( item.id !== `all-${ el.target.dataset.term }` && item.checked ) {\n\t\t\t\t\t\titem.checked = false;\n\n\t\t\t\t\t\t// Add extra letter for square meter slug to prevent ID syntax error\n\t\t\t\t\t\tconst newValue = el.target.dataset.term === 'space-square-metres' ? 'a' + item.value : item.value;\n\n\t\t\t\t\t\tdocument.querySelector( `#filter-selection-${ newValue }` ).remove();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else if ( [ ...document.querySelectorAll( `[data-term=\"${ el.target.dataset.term }\"]` ) ].filter( ( item ) => item.id !== `#all-${ el.target.dataset.term }` ).every( ( item ) => ! item.checked ) ) {\n\t\t\t\tdocument.querySelector( `#all-${ el.target.dataset.term }` ).checked = true;\n\t\t\t} else {\n\t\t\t\tdocument.querySelector( `#all-${ el.target.dataset.term }` ).checked = false;\n\t\t\t\tdocument.querySelector( `#all-${ el.target.dataset.term }` ).disabled = false;\n\t\t\t}\n\n\t\t\t// Add extra letter for square meter slug to prevent ID syntax error\n\t\t\tconst newValue = el.target.dataset.term === 'space-square-metres' ? 'a' + el.target.value : el.target.value;\n\n\t\t\tif ( ! el.target.id.startsWith( 'all' ) ) {\n\t\t\t\tif ( el.target.checked ) {\n\t\t\t\t\tlet newSelection = `