"use strict";(self.heliuxModules=self.heliuxModules||[]).push([[4435],{46575:(t,e,i)=>{var s=i(58480),r=i(80129),o=i(51113),n=i(78529);const a=!!window?.Granite?.author;var c=i(2371),h=i(73355),d=i(37376),m=i(37252),l=i(42033),u=i(92220),f=i(87587),p=i(11060),g=i(63645),b=i(24036);const S={selectors:{error:".formcontainer__errorMessage",errorText:".formcontainer__errorMessage-text",errorTpl:".formcontainer__errorTemplate",success:".formcontainer__successMessage",form:".formcontainer__form",inputs:".formcontainer__input",hpEmail:".formtext__hpemail",cdcNewsletterConfig:"cdc-newsletter-config",cdcNewsletterProfileData:'.formcontainer__input[name^="profile."]',formOptionsContainers:".formoptions__checkbox,.formoptions__radio",externalValidators:".externalvalidator__base"},elements:{externalValidators:".externalvalidator__base",activeError:".error:not(.isHidden)",formElement:".formelement__wrapper",formOptionsCheckedInput:".formoptions__input:checked",formOptionsHiddenInput:'input[type="hidden"]',additionalInputEl:t=>`input[type="hidden"][name="${t}"]`,formStepsContainer:".formstepscontainer__base"},classes:{formBaseLoading:"formcontainer__base--loading"},apiTypes:{passDataToNextPage:"passDataToNextPage"},subscribes:{change:t=>`form:${t}:input:change`,submit:t=>`form:${t}:submit`,standby:t=>`form:${t}:standby`,formError:t=>`form:${t}:error`,formSummaryData:t=>`form:${t}:formSummaryData`,resetValidation:t=>`form:${t}:resetValidation`},trackingEvents:{formStep:{triggers:[".formbutton .calltoaction__link","a:not(:disabled):not(.disabled)",'input:not(:disabled):not([type="hidden"])',"button:not(:disabled):not(.disabled)",".formoptions__trigger"],events:"focusin"}},publishes:{assignChildren:"form:assign:child",assignValidators:"form:assign:validators",formView:"form:view",formStep:"form:step",invalid:t=>`form:${t}:invalid`,valid:t=>`form:${t}:valid`,validate:t=>`form:${t}:validate`,submitFailed:t=>`form:${t}:submit:failed`,ciamUserProfileUpdate:"ciam:profile:update:submit"},unsubscribes:{all:t=>`form:${t}`},modifiers:{isHidden:"isHidden",formIsInitialised:"formcontainer__form--initialised"},urlParams:{success:"form-submission-success",error:"form-submission-error"},additionalInputsValues:{":oid":()=>(0,u.h)("user.details.userObjectId",(0,c.KA)(f.EF))},fetchSubmitTemplate:(t="POST",e=[],i={},s="same-origin")=>({method:t,mode:"cors",cache:"no-cache",credentials:s,headers:{...e,"Content-Type":"application/json"},redirect:"manual",referrer:window.location.href,body:JSON.stringify(i)}),multipartSubmitTemplate:(t="POST",e=[],i={},s="same-origin")=>({method:t,mode:"cors",cache:"no-cache",credentials:s,headers:{...e},redirect:"manual",referrer:window.location.href,body:i}),extraHeaders:{ciam:{Authorization:async()=>(0,g.XL)()},CiamTaxApi:{Authorization:async()=>(0,g.XL)()}},beforeSubmitActions:{winningMoments:async()=>{await window[b.v.instance].refreshLongLivedToken().catch((()=>{}))}},publishBeforeSubmit:{ExternalValidatorTaxApiAddress:{message:"external:validator:tax:api:address:on:submit",callbackMessage:"external:validator:tax:api:address:checked"},CiamTaxApi:[{message:"ciam:user:taxexemption:on:submit",callbackMessage:"ciam:user:taxexemption:on:user:updated",callbackFunction:(t,e)=>{if(e&&e.companyId){const i=t.querySelector('input[name="customer.id"]');i&&(i.value=e.companyId)}}}]},publishOnSuccess:{CiamTaxApi:["reRender::on::taxRequestSent"],ciam:["ciam:user:account:refreshed","reRender::on::accountRefreshed"]},apiCredentials:{winningMoments:"include"},formSummaryStore:"formSummary",tempUserStore:p.B,scrollIntoView:{behavior:"smooth",block:"center",inline:"nearest"},loadingSpinnerContainerOptions:{formContainer:"formContainer",highestParentSection:"highestParentSection",mainContent:"mainContent",wholePage:"wholePage"},loadingSpinnerElements:{highestParentSection:".main__baseWrapper > heliux-section",mainContentContainer:"main",pageBody:"body"},lodingSpinnerHideConditions:{redirectFlow:"redirectFlow"},redirectFlow:{storeName:"redirectFlow",noRedirectStatus:"No redirect",redirectingStatus:"Redirecting"},templates:{spinner:(t,e,i)=>`\n      <heliux-spinner data-visible="true" data-id="${t}"\n        class="heliuxspinner__withinContainer heliuxspinner__withinContainer--withOverlay ${e?"heliuxspinner__withinContainer--centered":""}"\n        style="${i}">\n      </heliux-spinner>\n    `},mapDataBeforeSubmit:{CiamTaxApi:t=>{const e={...t};Array.isArray(t?.certificateScope)&&(e.certificateScope=t.certificateScope[0]);const i=t?.coverage?.[0]?.jurisdiction;if(Array.isArray(i?.state)){const t=i.state.map((t=>({jurisdiction:{state:t,country:i.country}})));e.coverage=t}return e}}};class w extends s.ComponentBase{get formId(){return this.config.id||this.el.dataset.id}init(){this.logger=new m.V("FormContainer"),this.logger.log("form container initializing"),this.config={...S,...this.config},this.initLoadingSpinner(),(0,c.bC)(this.config.formSummaryStore),this.getElements(),this.standby=!1,this.waitFor=new Set,this.preSubmitOngoingEvents=0,this.defaultFormErrorMessage=this.errorContent&&this.errorContent.innerHTML,this.submitForm=this.submitForm.bind(this);const{additionalInputs:t}=this.config;t&&t.length&&this.setAdditionalInputs(),this.submitFormMutex=new r.eu,this.publishTrackingEvents(),this.isSuccess?(this.publishEventsOnSuccess(),this.showSuccess(),this.hideForm()):(this.isError&&this.showError(),this.errors={},this.errorsArr=[],this.touched=!1,this.scrollToErrorOn=!1,this.setBinds(),this.listeners(),this.addInitialisedClass(),this.childrenIds.forEach((t=>this.updateChildren(t))),this.assignExternalValidators(),this.scrollToErrorDebounce=(0,s.debounce)((()=>{this.touched&&this.scrollToError()}),100,!1))}getElements(){if(super.getElements(),this.errorContent=this.errorText||this.error,this.errorTpl){const{errorText:t}=this.config.selectors;this.errorTemplateText=this.errorTpl.content.querySelector(t)}}errorMessageWithFormat(t=""){return this.errorTpl&&t?(this.errorTemplateText.innerHTML=t,this.errorTpl.innerHTML):""}setBinds(){this.checkSubmit=this.checkSubmit.bind(this),this.addFormSummaryDataToStore=this.addFormSummaryDataToStore.bind(this),this.resetValidation=this.resetValidation.bind(this),this.addToWaitFor=this.addToWaitFor.bind(this),this.updateInputInfo=this.updateInputInfo.bind(this),this.handleErrorAfterSubmit=this.handleErrorAfterSubmit.bind(this)}resetValidation(){const{publishes:t}=this.config;this.errors=[],this.touched=!1,this.scrollToErrorOn=!1,(0,s.publish)(t.valid(this.formId))}addToWaitFor(t){this.waitFor.add(t.name)}listeners(){const{subscribes:t,apiTypes:e,endpoint:i}=this.config;this.form.addEventListener("submit",this.checkSubmit),i?.apiName===e.passDataToNextPage&&window.addEventListener("pagehide",(()=>{this.resetValidation(),this.resetFormSubmitState()}),!1),(0,s.subscribe)(t.submit(this.formId),this.checkSubmit),(0,s.subscribe)(t.standby(this.formId),this.addToWaitFor),(0,s.subscribe)(t.change(this.formId),this.updateInputInfo),(0,s.subscribe)(t.formSummaryData(this.formId),this.addFormSummaryDataToStore),(0,s.subscribe)(t.resetValidation(this.formId),this.resetValidation),(0,s.subscribe)(t.formError(this.formId),this.handleErrorAfterSubmit)}addInitialisedClass(){const{modifiers:t}=this.config;this.form.classList.add(t.formIsInitialised)}setAdditionalInputs(){const{additionalInputs:t,additionalInputsValues:e}=this.config,{additionalInputEl:i}=this.config.elements;t.filter((t=>!!e[t])).forEach((t=>{const s=e[t]();this.el.querySelector(i(t)).value=s}))}publishTrackingEvents(){const{adobeTracking:t,googleTracking:e}=this.config;if(!this.isSuccess&&(t||e)&&(this.formName=t?this.el.dataset.name:this.el.dataset.title,setTimeout((()=>(0,s.publish)(this.config.publishes.formView,{formName:this.formName,formId:this.formId})),400),t)){const{formStep:t}=this.config.trackingEvents,e=(0,d.F)(t.triggers,(()=>{this.el.removeEventListener(t.events,e),(0,s.publish)(this.config.publishes.formStep,{formName:this.formName,formId:this.formId,currentStep:0,totalSteps:this.totalSteps})}));this.el.addEventListener(t.events,e)}}get totalSteps(){const{formStepsContainer:t}=this.config.elements,e=this.el.querySelector(t);if(!e)return 1;const i=e.dataset.stepsNumber;return i>0?i:1}get childrenIds(){return Array.isArray(this.inputs)?this.inputs.map((t=>t.id)):[this.inputs.id]}get isSuccess(){return window.location.pathname.endsWith(`${this.config.urlParams.success}.html`)}get isError(){return window.location.pathname.endsWith(`${this.config.urlParams.error}.html`)}updateChildren(t){setTimeout((()=>{(0,s.publish)(this.config.publishes.assignChildren,{formId:this.formId,inputId:t})}),200)}assignExternalValidators(){setTimeout((()=>{(0,h.K)(this.externalValidators).forEach((t=>{(0,s.publish)(this.config.publishes.assignValidators,{formId:this.formId,validatorId:t.id})}))}),200)}scrollToError(){setTimeout((()=>{const{activeError:t,formElement:e}=this.config.elements,i=this.el.querySelector(t),s=i?i.closest(e):null;this.scrollToErrorOn&&s&&(s.scrollIntoView(this.config.scrollIntoView),this.scrollToErrorOn=!1)}),55)}updateInputInfo(t){const{name:e,isValid:i}=t,{valid:r,invalid:o}=this.config.publishes;i?delete this.errors[e]:this.errors[e]=t,this.hasErrors()?(this.scrollToErrorDebounce(),(0,s.publish)(o(this.formId))):(0,s.publish)(r(this.formId))}async checkSubmit(t){return this.touched?this.waitFor.size>0?this.waitForAndStandBy(t):(this.hasErrors()?t&&t.preventDefault&&t.preventDefault():this.finalSubmit(t),!0):(this.touched=!0,this.scrollToErrorOn=!0,(0,s.publish)(this.config.publishes.validate(this.formId),{}),setTimeout((()=>this.checkSubmit(t)),50))}async waitForAndStandBy(t){return new Promise((e=>{Array.from(this.waitFor).forEach((i=>{if(!this.hasErrors()){this.hideError();const r=(0,n.H)(this.form,!0,!1,!0),{errors:o}=this;(0,s.publish)(`${i}:submit`,{data:r,errors:o}),(0,s.subscribe)(i,(s=>{s.success&&this.waitFor.delete(i),0===this.waitFor.size&&(this.checkSubmit(t),e())}))}}))}))}showSuccess(t){const{isHidden:e}=this.config.modifiers;this.error&&this.error.classList.add(e),this.success&&(this.success.classList.remove(e),t&&(this.success.innerHTML=t))}showError(t=this.defaultFormErrorMessage){const{modifiers:{isHidden:e},publishes:{submitFailed:i}}=this.config,r=this.errorText&&t===this.defaultFormErrorMessage,o=!this.errorText&&t===this.defaultFormErrorMessage,n=r||o||this.errorText?t:this.errorMessageWithFormat(t);this.error&&(this.errorContent&&(this.errorContent.innerHTML=n),this.error.classList.remove(e),this.error.scrollIntoView(this.config.scrollIntoView)),this.success&&this.success.classList.add(e),(0,s.publish)(i(this.formId))}hideError(){const{isHidden:t}=this.config.modifiers;this.error&&this.error.classList.add(t)}hideForm(){const{modifiers:t}=this.config;this.form.classList.add(t.isHidden)}hasErrors(){return Object.keys(this.errors).length}handleHiddenFormOptionsInputs(){const{formOptionsCheckedInput:t,formOptionsHiddenInput:e}=this.config.elements;(0,h.K)(this.formOptionsContainers).forEach((i=>{const s=[...i.querySelectorAll(t)],r=[...i.querySelectorAll(e)];s.length&&r.forEach((t=>{t.disabled=!0}))}))}finalSubmit(){this.isNotABot()?(this.handleHiddenFormOptionsInputs(),this.waitForTrackingEvents().then((()=>this.submitForm()))):(this.showSuccess(),this.hideForm(),console.error("Honeypot/captcha triggered. Form has not been submitted."))}triggerPreSubmitExternalValidation(){const{publishBeforeSubmit:t,elements:e}=this.config,i=[...this.el.querySelectorAll(e.externalValidators)];let s=!1;return!!i.length&&(i.forEach((e=>{if(t&&t[e.dataset.type]){const{message:i,callbackMessage:r}=t[e.dataset.type];this.triggerPreSubmitPubSub(i,r),s=!0}})),s)}triggerPreSubmitAction(){const{publishBeforeSubmit:t,endpoint:e}=this.config;return!!(e&&e.apiName&&t&&t[e.apiName])&&(t[e.apiName].forEach((({message:t,callbackMessage:e,callbackFunction:i})=>{this.triggerPreSubmitPubSub(t,e,i)})),!0)}triggerPreSubmitPubSub(t,e,i){const r=(0,n.H)(this.form,!0,!1,!0),o=t=>{(0,s.unsubscribe)(e,o),this.preSubmitOngoingEvents-=1,t?.error?.skip?this.resetFormSubmitState():t?.error?this.handleErrorAfterSubmit(t.error):(i&&i(this.form,t),this.preSubmitOngoingEvents||this.triggerSubmitForm())};e&&(0,s.subscribe)(e,o),this.preSubmitOngoingEvents+=1,(0,s.publish)(t,{data:r,callbackMessage:e})}async submitForm(){this.triggerPreSubmitExternalValidation()||this.triggerPreSubmitAction()||this.triggerSubmitForm()}async triggerSubmitForm(){const t=await this.submitFormMutex.acquire();if(this.submitted)t();else{if(this.submitted=!0,this.config.postURL)return await this.submitFormToServletAsJSON(),void t();if(this.config.endpoint)return await this.submitFormToAPI(),void t();if(!1===this.config.triggerAction)return this.handleSuccessAfterSubmit({redirect:this.config.redirect}),void t();this.form.submit(),t()}}async postDataToServlet(t={}){const e=this.config.postURL;let i={};const s=await(0,l.m)();i=s?{"csrf-token":s}:{};const r=this.config.fetchSubmitTemplate("POST",i,t);return(await fetch(e,r)).json()}addParamsToUrl(t,e={}){const i="/"===t[0]?`${window.location.origin}${t}`:t,s=new URL(i),r=new URL(document.location).searchParams;return Object.entries(e).forEach((([t,e])=>{s.searchParams.set(t,e)})),"disabled"===r.get("wcmmode")&&s.searchParams.set("wcmmode","disabled"),s}savePageData(t={}){const e=JSON.stringify(t);this.getStorage().setItem("passDataToNextPage",e)}getStorage(){return sessionStorage}handlePageData(){const t=(0,n.H)(this.form,!1,!0,!0),{url:e}=this.config.endpoint;let i=this.config.redirect;return"urlParams"===e?i=this.addParamsToUrl(i,t).href:this.savePageData(t),{response:{status:200},redirect:i}}async postDataToAPI(t={}){const{apiName:e,method:i,extraHeaders:s={},url:r,multipart:n}=this.config.endpoint,a={...s,...await this.getExtraHeadersForAPI(e),...(0,o.Q)(t,this.config.captchaConfig)},c=this.config.beforeSubmitActions[e];c&&await c();const h=this.config.apiCredentials[e]||"same-origin",d=(n?this.config.multipartSubmitTemplate:this.config.fetchSubmitTemplate)(i,a,t,h);return await fetch(r,d).catch((t=>({error:t})))}async submitFormToAPI(){this.hideError();const{apiTypes:t}=this.config,{multipart:e,apiName:i}=this.config.endpoint;let s,r={};if(e)r=(t=>{const e=new FormData(t);return Array.from(e.entries()).filter((t=>t[0].match(/[:_].*/))).forEach((t=>e.delete(t[0]))),e})(this.form);else{const{collectionsAsStrings:t}=this.config.endpoint;r=(0,n.H)(this.form,!0,t,!0)}let o=this.config.redirect;if(i===t.passDataToNextPage){const t=this.handlePageData();s=t.response,o=t.redirect}else{const{mapDataBeforeSubmit:t}=this.config,e=t[i]?.(r)||r;s=await this.postDataToAPI(e)}const a=s.status,{additionalActions:c=[]}=this.config,h=a&&c.find((t=>t.statusRange[0]<=a&&t.statusRange[1]>=a));if(h){const{redirect:t,message:e}=h;this.handleSuccessAfterSubmit({redirect:t,message:e})}else s.status>=200&&s.status<300?this.handleSuccessAfterSubmit({redirect:o},r):this.handleErrorAfterSubmit()}async submitFormToServletAsJSON(){this.hideError();const t=(0,n.H)(this.form,!1),e=await this.postDataToServlet(t);e.success?this.handleSuccessAfterSubmit({redirect:e.redirect}):this.handleErrorAfterSubmit()}handleSuccessAfterSubmit(t={},e){this.publishEventsOnSuccess(),this.config.trackingSuccess&&this.config.publishes[this.config.trackingSuccess]&&(0,s.publish)(this.config.publishes[this.config.trackingSuccess],e),t?.redirect?this.waitForTrackingEvents(t.redirect).then((()=>{window.location=t.redirect})):(this.showSuccess(t?.message),this.hideForm())}handleErrorAfterSubmit(t){this.showError(t?.message),this.resetFormSubmitState()}resetFormSubmitState(){this.submitted=!1,this.touched=!1;const{valid:t}=this.config.publishes;(0,s.publish)(t(this.formId))}async getExtraHeadersForAPI(t){const e=this.config.extraHeaders[t];if(!e)return{};const i=Object.keys(e).map((async t=>{const i=await e[t]();return{[t]:i}}));return(await Promise.all(i)).reduce(((t,e)=>Object.assign(t,e)),{})}waitForTrackingEvents(){return new Promise((t=>{const e="adobeDataLayer";if(this.filterAndStoreFormSummaryData(),window[e]){const i=()=>{window[e].removeEventListener("formSubmitSuccess",i),t()};setTimeout(i,1e3),window[e].addEventListener("formSubmitSuccess",i)}else t()}))}filterAndStoreFormSummaryData(){const t=(0,n.H)(this.form,!1);Object.keys(t).forEach((e=>{"string"==typeof t[e]&&(t[e].includes("base64")||e.includes("password"))&&delete t[e]})),this.addFormSummaryDataToStore(t)}addFormSummaryDataToStore(t){const{formSummaryStore:e,saveToTempUser:i,tempUserStore:s}=this.config,r={...t},o=(0,c.KA)(e);if((0,c.bC)(e),i){const t=(0,c.KA)(s);(0,c.bC)(s),(0,c.KA)(s,{...t,...r})}(0,c.KA)(e,{...o,...r})}publishEventsOnSuccess(){const{endpoint:t,publishOnSuccess:e}=this.config;if(t&&t.apiName){const i=Object.keys(e).find((e=>e===t.apiName));i&&e[i].forEach((t=>(0,s.publish)(t)))}}isNotABot(){return this.honeypotEmpty()}honeypotEmpty(){return!(0,h.K)(this.hpEmail).some((t=>t&&t.value))}disconnectedCallback(){const{unsubscribes:t}=this.config;this.form.removeEventListener("submit",this.checkSubmit),(0,s.unsubscribeAll)(t.all(this.formId),!1)}get loadingSpinnerId(){return`${this.formId}-spinner`}initLoadingSpinner(){if(a)return;const{showLoadingSpinner:t,loadingSpinnerHideCondition:e}=this.config,{lodingSpinnerHideConditions:i,redirectFlow:s}=this.config;if(t){if(e===i.redirectFlow){const t=(0,c.KA)(s.storeName,{initialiser:this.name});if(t.initialiser!==this.name&&t.status===s.noRedirectStatus)return;t.subscribe((()=>{t.status===s.noRedirectStatus&&this.hideLoadingSpinner(),t.status===s.redirectingStatus&&this.showLoadingSpinner()}))}this.showLoadingSpinner()}}showLoadingSpinner(){const{loadingSpinnerCentered:t,loadingSpinnerContainer:e,loadingSpinnerContainerId:i}=this.config,{loadingSpinnerContainerOptions:s,loadingSpinnerElements:r}=this.config;let o="",n="";if(e===s.formContainer?o=this.el:e===s.highestParentSection?o=this.el.closest(r.highestParentSection):e===s.mainContent?o=document.querySelector(r.mainContentContainer):e===s.wholePage?(o=document.querySelector(r.pageBody),n="z-index: 100"):i&&(o=document.querySelector(`#${i}`)),o){const e=document.createRange().createContextualFragment(this.config.templates.spinner(this.loadingSpinnerId,t,n));this.spinnerNodeReference=Array.from(e.children)[0],o.appendChild(e)}}hideLoadingSpinner(){const{classes:t}=this.config;this.el.classList.remove(t.formBaseLoading),this.spinnerNodeReference.remove()}}(0,s.register)({FormContainer:w},0)}},t=>{t.O(0,[750,7694,4253],(()=>t(t.s=46575))),t.O()}]);