1window.console||(window.console={log(){}});class Utilities{#debug=!1;Init(){}ToBool(value){let result=!1;switch(value){case!0:case"true":case"True":case 1:case"1":case"on":case"On":case"yes":case"Yes":result=!0}return result}IsNumberKey(evt){let isNumber=!0,charCode=evt.which?evt.which:event.keyCode;return charCode>31&&(charCode<48||charCode>57)&&(isNumber=!1),isNumber}IsDesktop(width=1023){return window.innerWidth>width}IsiOS(){return["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"].includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}ZeroPadNumber(number,length){return String(number).padStart(length,"0")}CloneObject(obj){return JSON.parse(JSON.stringify(obj))}GenerateGuid(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,c=>(c^crypto.getRandomValues(new Uint8Array(1))[0]&15>>c/4).toString(16))}IsVisible(el){let isVisible=!0;if(("none"===el.style.display||"hidden"===el.style.visibility||"0"===el.style.opacity||0===el.offsetHeight&&0===el.offsetWidth)&&(isVisible=!1),isVisible&&"body"!==el.tagName.toLowerCase()){const parent=el.parentElement;isVisible=this.IsVisible(parent)}return isVisible}IsOnScreen=el=>{const rect=el.getBoundingClientRect();return rect.top>=0&&rect.left>=0&&rect.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&rect.right<=(window.innerWidth||document.documentElement.clientWidth)};IsNotNullOrEmpty(o){return null!=o&&""!==String(o).trim()}IsNullOrEmpty(o){return!this.IsNotNullOrEmpty(o)}StringToHTML(str){const t=document.createElement("template");return t.innerHTML=str,t.content}AddClass(list,className){list.forEach(listItem=>{listItem.classList.add(className)})}RemoveClass(list,className){list.forEach(listItem=>{listItem.classList.remove(className)})}GetUrlVars(){const entries=new URLSearchParams(window.location.search).entries(),params={};for(const entry of entries)params[entry[0]]=entry[1];return null==hdnz.debug&&(hdnz.debug="true"==params.hsDebug,hdnz.debug&&console.log("####### -- DEBUG MODE ENABLED -- #######")),params}GetAnchorTag(text){const id=text.toLowerCase().trim().replace(/\./g,"").replace(/\^/g,"").replace(/\$/g,"").replace(/\*/g,"").replace(/\+/g,"").replace(/\?/g,"").replace(/\(/g,"").replace(/\)/g,"").replace(/\[/g,"").replace(/\]/g,"").replace(/\//g,"").replace(/\|/g,"").replace(/\\/g,"").replace(/\s\s+/g," ").replace(/\s/g,"-").replace(/_/g,"-").replace(/,/g,"").replace(/!/g,"").replace(/;/g,"").replace(/'/g,"").replace(/:/g,"").replace(/=/g,"").replace(/@/g,"").replace(/#/g,"").replace(/"/g,"").replace(/â/g,"").replace(/%/g,"").replace(/&/g,"").replace(/~/g,""),anchor=document.createElement("a"),attribute=document.createAttribute("id");return attribute.value=id,anchor.setAttributeNode(attribute),anchor}ScrollTo(el,extraSpace){extraSpace=extraSpace||0;const offset=this.#ElementWindowOffset(el),header=document.getElementsByTagName("header")[0];let headerHeight=0;if(header){headerHeight="fixed"===getComputedStyle(header).position?header.offsetHeight:0}const top=offset.top-headerHeight-extraSpace;window.scroll({top:top,left:0,behavior:"smooth"})}#ElementWindowOffset(el){const rect=el.getBoundingClientRect(),scrollLeft=window.pageXOffset||document.documentElement.scrollLeft,scrollTop=window.pageYOffset||document.documentElement.scrollTop;return{top:rect.top+scrollTop,left:rect.left+scrollLeft}}Delay(ms){return new Promise(resolve=>setTimeout(resolve,ms))}Ordinalise(number){if(0===number)return"0";const suffixes=["th","st","nd","rd"],value=number%100;return`${number}${value>=11&&value<=13?suffixes[0]:suffixes[number%10]||suffixes[0]}`}Pluralise(word,amount){function simplePlural(word){return/y$/i.test(word)?word.replace(/y$/i,"ies"):/o$/i.test(word)?`${word}es`:/f$/i.test(word)?word.replace(/f$/i,"ves"):/fe$/i.test(word)?word.replace(/fe$/i,"ves"):`${word}s`}const autoPluralize=function(dictionary={},plural=simplePlural){return function(amount,word){return function(amount){return 1!==Math.abs(amount)}(amount)?dictionary[word]||plural(word):word}}({person:"people",child:"children",man:"men",woman:"women",mouse:"mice",radiu
1s:"radii",foot:"feet",tooth:"teeth",goose:"geese",loaf:"loaves",datum:"data",thief:"thieves",wolf:"wolves"});return autoPluralize(amount,word)}FormatNumber(pattern,number,zeroes=4){let formattedNumber="";switch(pattern){case"zeropad":formattedNumber=this.ZeroPadNumber(number,zeroes);break;case"float":case"decimal":formattedNumber=number.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2});break;case"percentage":case"%":formattedNumber=number.toLocaleString("en-US",{style:"percent",minimumFractionDigits:2});break;case"digit":formattedNumber=number.toLocaleString("en-US",{maximumFractionDigits:2});break;default:formattedNumber="Format type not valid"}return formattedNumber}FormatCurrency(amount,currency="dollar",float=0){let formattedCurrency="";switch(currency){case"dollar":case"usd":case"nzd":case"aud":case"peso":case"$":formattedCurrency=amount.toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:float,minimumFractionDigits:float});break;case"eur":case"euro":formattedCurrency=amount.toLocaleString("en-US",{style:"currency",currency:"EUR",minimumFractionDigits:float,minimumFractionDigits:float});break;case"gbp":case"pound":case"£":formattedCurrency=amount.toLocaleString("en-GB",{style:"currency",currency:"GBP",minimumFractionDigits:float,minimumFractionDigits:float});break;case"cny":case"rmb":case"yuan":case"¥":formattedCurrency=amount.toLocaleString("zh-CN",{style:"currency",currency:"CNY"});break;case"jpy":case"yen":case"¥":formattedCurrency=amount.toLocaleString("ja-JP",{style:"currency",currency:"JPY"});break;case"lyd":case"libyan dinar":formattedCurrency=amount.toLocaleString("ar-LY",{style:"currency",currency:"LYD"});break;default:formattedCurrency="Format type not valid"}return formattedCurrency}RemoveFromArray(arr,val){if(!Array.isArray(arr))return console.error("Error: RemoveFromArray recieved a wrong type of array:",arr),arr;var idx=arr.indexOf(val);return idx>-1&&arr.splice(idx,1),arr}RemoveAllFromArray(arr,val){const arrCount=arr.length;for(let i=0;i<arrCount;i++)arr[i]===val&&arr.splice(i,1);return arr}}window.hdnz.Utilities=new Utilities;class Cookies{Init(options={}){!0===hdnz.debug&&console.log("Cookies Initialised")}Get(cname){const name=`${cname}=`,ca=document.cookie.split(";");for(let i=0;i<ca.length;i++){const c=ca[i].trim();if(0===c.indexOf(name))return c.substring(name.length,c.length)}return""}Set(cname,cvalue,exdays){const d=new Date;d.setTime(d.getTime()+24*exdays*60*60*1e3);let cookie=`${cname}=${cvalue}; ${`expires=${d.toGMTString()}`}; path=/; domain=.spitwater.com.au; Secure; SameSite=Lax`;document.cookie=cookie}Erase(cname){document.cookie=`${cname}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.spitwater.com.au; Secure; SameSite=Lax`}}window.hdnz.Cookies=new Cookies;class FormTomSelect{constructor(){}static singleSelectTSConfig={plugins:{clear_button:{title:"Remove all selected options"}},persist:!1,create:!1,searchable:!1,hideSelected:!1};static singleSelectSimpleTSConfig={persist:!1,create:!1,closeAfterSelect:!0,allowEmptyOption:!1,selectOnTab:!1,searchable:!1,hideSelected:!1,hidePlaceholder:!0,maxOptions:null};static multiSelectTSConfig={plugins:{remove_button:{},checkbox_options:{checkedClassNames:["ts-checked"],uncheckedClassNames:["ts-unchecked"]}},persist:!1,create:!1,closeAfterSelect:!1,allowEmptyOption:!1,selectOnTab:!1,searchable:!1,hideSelected:!1,hidePlaceholder:!0,maxOptions:null,maxItems:5};static renderMultipleInstancesOfTomSelect(el,setting){el.forEach(element=>{const instance=new TomSelect(element,setting),selectedValues=element.getAttribute("data-selectedvalue").split(";").map(value=>value.trim());instance.setValue(selectedValues),0===Object.keys(instance.options).length&&(element.parentNode.classList.add("ts--inactive"),instance.isDisabled=!0)})}static renderNewQuoteTomSelects(el,setting){this.renderMultipleInstancesOfTomSelect(el,setting)}static getSelectedOptions(filterElements){return Array.from(filterElements).reduce((acc,filterType)=>{const param=filterType.name;let value;return"INPUT"===filterType.nodeName?"checkbox"===filterType.type&&filterType.checked?(value=filterType.value,acc[param]||(acc[param]=[]),acc[param].push(value)):"radio"===filterType.type&&filterType.checked?(value=filterType.value,acc[param]=value):"text"===filterType.type?(value=filterType.value.trim(),""!==value&&(acc[param]=value)):"date"==filterType.type&&filterType.value&&(
1acc[param]=Math.floor(new Date(filterType.value).getTime())):"SELECT"===filterType.nodeName&&filterType.selectedOptions.length>0&&(value=Array.from(filterType.selectedOptions).map(option=>option.value).filter(value=>""!==value).join(","),value.length>0&&(acc[param]=value)),acc},{})}static clearFilterOptions(filterContainer){const filterFields=filterContainer.querySelectorAll(".js-filter-field"),filters=this.getSelectedOptions(filterFields);for(const[key,value]of Object.entries(filters)){const input=filterContainer.querySelector(`[name=${key}]`);"text"==input.type||"date"==input.type?input.value="":input.tomselect.clear()}const activeDatePickers=hdnz.Events.DatePicker.activePickers;activeDatePickers&&activeDatePickers.forEach(datepicker=>{datepicker.clearSelection()})}static updatePageUrl(options,redirect=!0){const url=new URL(window.location.href),existingSearchParams=new URLSearchParams(url.search),newSearchParams=new URLSearchParams;for(let key in options)void 0===options[key]?existingSearchParams.delete(key):existingSearchParams.set(key,options[key]);const keysToDelete=[];for(let key of existingSearchParams.keys())options.hasOwnProperty(key)||keysToDelete.push(key);for(let key of keysToDelete)existingSearchParams.delete(key);for(let[key,value]of existingSearchParams.entries())newSearchParams.append(key,value);for(let key in options)options.hasOwnProperty(key)&&!existingSearchParams.has(key)&&newSearchParams.append(key,options[key]);url.search=newSearchParams.toString();let updatedUrl=url.toString();window.history.pushState({path:updatedUrl},"",updatedUrl),redirect&&(window.location.href=updatedUrl)}static applySearchParamsToFilters(filterElements,searchParams){filterElements.forEach(filterType=>{const param=filterType.getAttribute("name");if("SELECT"===filterType.nodeName){if(searchParams.has(param)){const paramValues=searchParams.get(param).split(",");if(null==filterType.tomselect){Array.from(filterType.options).filter(option=>paramValues.includes(option.value)).forEach(option=>{option.selected=!0})}else if(null==paramValues.length||null==paramValues.length)filterType.tomselect.setValue([paramValues]);else if(paramValues.length>0){let obj=paramValues.map(data=>data);filterType.tomselect.setValue(obj)}}}else if("INPUT"===filterType.nodeName)if("checkbox"===filterType.type){if(searchParams.has(param)){const value=filterType.value;searchParams.get(param).split(",").includes(value)&&(filterType.checked=!0)}}else if("text"===filterType.type){if(searchParams.has(param)){const value=searchParams.get(param);filterType.value=value}}else if("date"===filterType.type&&searchParams.has(param)){const value=searchParams.get(param),formattedDate=new Date(parseInt(value)).toISOString().split("T")[0];filterType.value=formattedDate}})}}class Modal{image_class="";#css='\n\t\t:root{\n\t\t\t--modal-background: #ffffff;\n --modal-shadow: 1px 1px 4px 0 rgb(0, 0, 0, 0.5);\n\t\t\t--modal-border: solid 1px;\n\t\t\t--modal-border-radius: 20px;\n\t\t\t--modal-color: #000000;\n\t\t\t--modal-close-background-color: transparent;\n\t\t\t--modal-close-background-hover-color: rgba(0, 0, 0, 0.2);\n\t\t\t--modal-close-color: #000000;\n\t\t\t--modal-error-color: #e6001e;\n\t\t\t--modal-warning-color: #ff7e26;\n --modal-video-close-color: #ffffff;\n --modal-spinner-color: var(--primary-1);\n\t\t\t--modal-x-icon: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJ4LWljb24iPgoJCTxsaW5lIHgxPSIxOCIgeTE9IjYiIHgyPS
1I2IiB5Mj0iMTgiPjwvbGluZT4KCQk8bGluZSB4MT0iNiIgeTE9IjYiIHgyPSIxOCIgeTI9IjE4Ij48L2xpbmU+Cgk8L3N2Zz4=)\n\t\t}\n\t\t\n\t\t.modal {\n\t\t\tposition: fixed;\n\t\t\tz-index: 10000;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\ttransform: translate(-50%, -50%);\n\t\t\twidth: 80%;\n\t\t\tmax-width: 400px;\n\t\t\tpadding: 32px 40px;\n\t\t\tbackground: var(--modal-background);\n\t\t\tborder: var(--modal-border);\n\t\t\tborder-radius: var(--modal-border-radius);\n\t\t\tbox-sizing: border-box;\n\t\t\tcolor: var(--modal-color);\n\t\t\tbox-shadow: var(--modal-shadow);\n max-height: 80%;\n overflow: auto;\n\t\t}\n\t\t\n\t\t.modal--confirm {}\n\t\t.modal--info {}\n\t\t.modal--interstitial {}\n\t\t\n\t\t.modal--error {\n\t\t\tborder-color: var(--modal-error-color);\n\t\t}\n\t\t\n\t\t.modal--warning {\n\t\t\tborder-color: var(--modal-warning-color);\n\t\t}\n\t\t\n\t\t.modal--error .modal__close {\n\t\t\tbackground-color: var(--modal-error-color);\n\t\t}\n\n\t\t.modal--warning .modal__close {\n\t\t\tbackground-color: var(--modal-warning-color);\n\t\t}\n\n\t\t.modal--interstitial .modal__close {\n\t\t\tdisplay:none;\n\t\t\tpointer-events:none;\n\t\t}\n\t\t.modal--video{\n background-color: var(--modal-background);\n line-height:0;\n max-width: calc(1920px + 80px);/* 80 = side padding */\n/* width:95%;*/\n }\n .modal__video video{\n width:100%;\n max-height: 60vh;\n cursor:pointer;\n }\n \n .video__play-button {\n margin: 0;\n border: 2px solid #fff;\n border-radius: 50%;\n position: absolute;\n z-index:10;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n height: 60px;\n width: 60px;\n box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.75);\n -webkit-box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.75);\n -moz-box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.75);\n cursor: pointer;\n }\n \n .video__play-button__icon{\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n fill: #fff;\n stroke: #fff;\n }\n\n .modal--imgzoom {\n max-width: 80vw;\n max-height: 80vh;\n }\n .modal--imgzoom__img-wrapper{\n width:100%;\n max-height: calc(80vh - 80px);\n text-align:center;\n }\n .modal--imgzoom__img-wrapper img {\n height: 100%;\n width: 100%;\n }\n\n .modal--imgzoom.landscape > .modal--imgzoom__img-wrapper > img {\n width: fit-content;\n max-width: 80%;\n max-height: inherit;\n }\n\n .modal--imgzoom.portrait > .modal--imgzoom__img-wrapper > img {\n max-height: inherit;\n width: auto;\n max-width:100%;\n }\n\n .modal--imgzoom.squared > .modal--imgzoom__img-wrapper > img {\n max-height: inherit;\n width: auto;\n max-width: 100%;\n }\n\n\t\t.modal__close {\n\t\t\tposition: absolute;\n\t\t\tright: 2px;\n\t\t\ttop: 2px;\n\t\t\tborder-radius: 100%;\n\t\t\twidth: 40px;\n\t\t\theight: 40px;\n\t\t\tcursor: pointer;\n\t\t\tbackground-color: var(--modal-close-background-color);\n\t\t\ttransition: background-color .2s linear;\n\t\t}\n\t\t\n\t\t.modal__close:hover{\n\t\t background-color: var(--modal-close-background-hover-color);\n\t\t}\n\t\t\n\t\t.modal__close:after {\n\t\t\tposition: absolute;\n\t\t\tcontent: "";\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\twidth:24px;\n\t\t\theight:24px;\n\t\t\ttransform: translate(-50%, -50%);\n\t\t\tbackground-color: var(--modal-close-color);\n\t\t\t-webkit-mask-image: var(--modal-x-icon);\n mask-image:var(--modal-x-icon);\n\t\t}\n\t\t\n\t\t.modal__message {\n\t\t\ttext-align:center;\n\t\t}\n\t\t\n\t\t.modal__actions {\n\t\t\tdisplay: flex;\n\t\t\tmargin-top: 16px;\n\t\t\tgap: 16px;\n\t\t\tjustify-content: center;\n\t\t}\n\t\t\n\t\t.modal__spinner {\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t\tborder: 2px solid var(--modal-spinner-color);\n\t\t\tborder-radius: 50%;\n animation: modal-spin 1.8s linear infinite;\n\t\t\tborder-bottom-color: transparent;\n z-index: 9999;\n margin: 0 auto;\n\t\t}\n\n @media screen and (max-width: 560px) {\n .modal {\n padding: 24px;\n }\n }\n\n @keyframes modal-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\t';constructor(){this.Init()}
1Init(){!0===hdnz.debug&&console.log("Modal Initialised");const _me=this,head=document.head;let styles=head.querySelector("#ModalStyle");null==styles&&(styles=document.createElement("style"),styles.type="text/css",styles.id="ModalStyle",styles.appendChild(document.createTextNode(_me.#css)),head.appendChild(styles)),DomReady(()=>{const video_buttons=document.querySelectorAll(".video__play-button");hdnz.Utilities.RemoveClass(video_buttons,"hidden")}),setTimeout(()=>{hdnz.Utilities||console.error("Modal Requires Utilities"),hdnz.Overlay||console.error("Modal Requires Overlay")},2e3)}#PrepopulateForm(form,defaults){for(const[key,value]of Object.entries(defaults)){const field=form.querySelector(`[name$=${key}`);field&&(field.focus(),field.value=value,field.blur())}}#InitHSForm(form_uuid,defaults,callbacks){const _me=this,modal=_me.BuildModal("","hs_form",[]);console.log("modal",modal);const modalActions=modal.querySelector(".modal__actions");hdnz.Spinner.InlineSpinner(!0,modalActions),document.body.append(modal),hbspt.forms.create({portalId:PORTAL_VARS.portal_id,formId:form_uuid,target:"#modal .modal__message",onFormReady:function(form){hdnz.Spinner.InlineSpinner(!1,modalActions),_me.#PrepopulateForm(form,defaults)}})}Form(type,form_uuid,defaults,callbacks={}){const _me=this;if(_me.Close(),hdnz.Overlay.Add(),"hs_form"===type)defaults&&(callbacks.onFormReady=function(form){_me.#PrepopulateForm(form,defaults)}),_me.#InitHSForm(form_uuid,defaults,callbacks);else console.log(`Modal Form of type "${type}" is not supported.`)}Show(message,type="alert",actions=[{label:"OK",style:"primary",events:[{onclick:"hdnz.Modal.Close()"}]}]){hdnz.Overlay.Add();const modal=this.BuildModal(message,type,actions);document.body.append(modal)}BuildModal(message,type="interstitial",actions=[]){const _me=this;let buttonActions="";const actionCount=actions.length;for(let i=0;i<actionCount;i++){let buttonData=actions[i],events=buttonData.events,thisButton=_me.#Templates.button,buttonEvents="";const eventCount=events.length;for(let j=0;j<eventCount;j++){let thisEvent=events[j];for(const[key,value]of Object.entries(thisEvent))buttonEvents+=`${key}="${value}" `}thisButton=thisButton.replace(/\[\[CLASS\]\]/g,buttonData.style),thisButton=thisButton.replace(/\[\[EVENTS\]\]/g,buttonEvents),thisButton=thisButton.replace(/\[\[LABEL\]\]/g,buttonData.label),buttonActions+=thisButton}let template=_me.#Templates.modal;if("interstitial"==type){message+=_me.#Templates.spinner}template=template.replace(/\[\[TYPE\]\]/g,type),template=template.replace(/\[\[MESSAGE\]\]/g,message),template=template.replace(/\[\[BUTTON_ACTIONS\]\]/g,buttonActions);return hdnz.Utilities.StringToHTML(template)}Close(){let el=document.getElementById("modal");el&&el.remove(),hdnz.Overlay.Remove()}Video(src,id,controls="controls",type="hubspot",poster=""){const _me=this;let video=null,playButton="";switch(console.log(type),type){case"hubspot":video=document.createElement("video"),video.setAttribute("controlslist","nodownload"),video.setAttribute("id",id);const videoControls=document.createAttribute(controls);video.setAttributeNode(videoControls),"no-controls"==controls&&(video.setAttribute("onclick",`hdnz.Modal.PlayPauseVideo('${id}')`),playButton=hdnz.Utilities.StringToHTML(_me.#Templates.playbutton.replace(/\[\[VIDEO_ID\]\]/g,id)));const source=document.createElement("source");source.setAttribute("src",src),video.append(source,"Your browser does not support the video tag.");break;case"youtube":_me.#RenderYoutubeVideoModal(src,id);break;case"vimeo":_me.#RenderVimeoVideoModal(src,id);break;default:console.log(`'${type}' videos are not yet`)}if(null!==video){let template=_me.#Templates.video;template=template.replace(/\[\[TYPE\]\]/g,"video");const modalHtml=hdnz.Utilities.StringToHTML(template);modalHtml.querySelector(".modal__video").append(video),""!==playButton&&modalHtml.querySelector(".modal__video").append(playButton),hdnz.Overlay.Add(),document.body.append(modalHtml),video.play()}}#RenderYoutubeVideoModal(src,id){const _me=this,videoIdMatch=src.match(/(?:youtube\.com\/(?:[^/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?/\s]{11})/);if(videoIdMatch){let videoId=videoIdMatch[1];console.log(videoId);const youTubeScriptTag=document.createElement("script");youTubeScriptTag.src="https://www.youtube.com/iframe_api";const firstScriptTag=document.getElementsByTagName("script")[0];firstScriptTag.parentNode.insertBefore(youTubeScriptTag,firstScriptTag);let template=_me.#Templates.customvideo;template=template.replace(/\[\[TYPE\]\]/g,"video"),template=template.replace(/\[\[ID\]\]/g,id);const modalHtml=hdnz.Utilities.StringToHTML(template);hdnz.Overlay.Add(),document.body.append(modalHtml);let YTinteval=setInterval(function(){"undefined"!=typeof YT&&YT.loaded&&(new YT.Player(`custom-popup-inner-${id}`,{height:"500px",width:"100%",videoId:videoId,playerVars:{playsinline:1}}),clearInterval(YTinteval))},50)}else console.error("Invalid YouTube URL")}#RenderVimeoVideoModal(videoLink,id){console.log(videoLink);
1const videoIdMatch=videoLink.match(/(?:vimeo\.com\/|video\/)(\d+)/);let template=this.#Templates.customvideo;template=template.replace(/\[\[TYPE\]\]/g,"video"),template=template.replace(/\[\[ID\]\]/g,id);const modalHtml=hdnz.Utilities.StringToHTML(template);if(hdnz.Overlay.Add(),document.body.append(modalHtml),videoIdMatch){let videoId=videoIdMatch[1];console.log(videoId);let Vimeointeval=setInterval(function(){if("undefined"!=typeof Vimeo){new Vimeo.Player(`custom-popup-inner-${id}`,{id:videoId});clearInterval(Vimeointeval)}},50)}else console.error("Invalid Vimeo URL")}PlayPauseVideo(videoid){const video=document.getElementById(videoid);if(void 0!==video){const video_btn=document.getElementById(`play-${videoid}`);video.paused?(video.play(),video_btn.style.visibility="hidden"):(video.pause(),video_btn.style.visibility="visible")}}ImageZoom(el){const _me=this,src=el.getAttribute("src"),img=new Image;img.src=src;let image_class="";img.onload=function(){const width=img.width,height=img.height;image_class=width<height?"portrait":width>height?"landscape":"squared";let zoomer=_me.#Templates.image;zoomer=zoomer.replace(/class='modal modal--imgzoom'/g,`class='modal modal--imgzoom ${image_class}'`),zoomer=zoomer.replace(/\[\[SRC\]\]/g,src),zoomer=hdnz.Utilities.StringToHTML(zoomer),hdnz.Overlay.Add(),document.body.append(zoomer)}}#Templates={button:"<button class='button [[CLASS]]' [[EVENTS]]>[[LABEL]]</button>
1",spinner:"<div class='modal__spinner'></div>",modal:"<div id='modal' class='modal modal--[[TYPE]]' role='dialog'>\n <div class='modal__close' onclick='hdnz.Modal.Close();'></div>\n <div class='modal__message'>\n <p>[[MESSAGE]]<p>\n </div> \n <div class='modal__actions'>[[BUTTON_ACTIONS]]</div>\n </div>",video:"<div id='modal' class='modal modal--[[TYPE]]' role='dialog'>\n <div class='modal__close' onclick='hdnz.Modal.Close();'></div>\n <div class='modal__video'></div> \n </div>",customvideo:"<div id='modal' class='modal modal--[[TYPE]]' role='dialog'>\n <div class='modal__close' onclick='hdnz.Modal.Close();'></div>\n <div id=\"custom-popup-inner-[[ID]]\" class='modal__video--[[ID]]'></div> \n </div>",playbutton:'<figure class="video__play-button" id="play-[[VIDEO_ID]]" onclick="hdnz.Modal.PlayPauseVideo(\'[[VIDEO_ID]]\')" style="visibility:hidden;">\n <svg xmlns="http://www.w3.org/2000/svg" width="24"\n height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"\n stroke-linecap="round" stroke-linejoin="round" class="video__play-button__icon">\n <polygon points="5 3 19 12 5 21 5 3"></polygon>\n </svg>\n </figure>',image:"\"<div id='modal' class='modal modal--imgzoom' role='dialog'> <div class='modal__close' onClick='hdnz.Modal.Close();'></div> <div class='modal--imgzoom__img-wrapper'><img src=[[SRC]]></div> </div>\","}}window.hdnz.Modal=new Modal;class Overlay{#css="\n :root{\n --overlay-background: rgba(0, 0, 0, .3);\n }\n \n body.no-scroll {\n overflow: hidden;\n }\n\n .overlay {\n background: var(--overlay-background);\n position: fixed;\n z-index: 9999;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n ";constructor(){this.Init({})}Init(options={}){const _me=this,head=document.head;let styles=head.querySelector("#OverlayStyle");null==styles&&(styles=document.createElement("style"),styles.type="text/css",styles.id="OverlayStyle",styles.appendChild(document.createTextNode(_me.#css)),head.appendChild(styles)),setTimeout(()=>{hdnz.Utilities||console.error("Overlay Requires Utilities")},2e3)}Add(){const _me=this;let overlay=document.getElementById("overlay");overlay||(overlay=hdnz.Utilities.StringToHTML(_me.#Templates.overlay),document.body.appendChild(overlay),document.body.classList.add("no-scroll"))}Remove(){let overlay=document.getElementById("overlay");overlay&&(overlay.remove(),document.body.classList.remove("no-scroll"))}#Templates={overlay:"<div id='overlay' class='overlay'></div>"}}window.hdnz.Overlay=new Overlay;class Spinner{#css="\n\n :root{\n --spinner-color: #fec00f;\n }\n\n .spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--spinner-color);\n border-bottom-color: transparent!important;\n border-radius: 50%;\n animation: spin 1.8s linear infinite;\n z-index: 9999;\n }\n\n .spinner--page{\n width:56px;\n height:56px;\n border-width: 8px;\n position: fixed;\n top: calc(50% - 28px);\n left: calc(50% - 28px);\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n ";constructor(){this.Init()}Init(options={}){const _me=this;!0===hdnz.debug&&console.log("Spinner Initialised");const head=document.head;let styles=head.querySelector("#SpinnerStyle");null==styles&&(styles=document.createElement("style"),styles.type="text/css",styles.id="SpinnerStyle",styles.appendChild(document.createTextNode(_me.#css)),head.appendChild(styles)),setTimeout(()=>{hdnz.Utilities||console.error("Spinner Requires Utilities"),hdnz.Overlay||console.error("Spinner Requires Overlay")},2e3)}InlineSpinner(add,target,id="inline",cssClass=""){if(add){let spinner=this.#Templates.spinner;const classes=`spinner--inline ${cssClass}`;spinner=spinner.replace(/\[\[CLASSES\]\]/g,classes),spinner=spinner.replace(/\[\[ID\]\]/g,id),spinner=hdnz.Utilities.StringToHTML(spinner),target.appendChild(spinner)}else{const classes=`.spinner--inline ${cssClass}`.trim().replace(" ",".");document.querySelector(classes).remove()}}PageSpinner(add,id="page",cssClass=""){if(add){let spinner=this.#Templates.spinner;const classes=`spinner--page ${cssClass}`;spinner=spinner.replace(/\[\[CLASSES\]\]/g,classes),spinner=spinner.replace(/\[\[ID\]\]/g,id),spinner=hdnz.Utilities.StringToHTML(spinner),hdnz.Overlay.Add(),document.body.appendChild(spinner)}else{document.getElementById(`${id}-spinner`).remove(),hdnz.Overlay.Remove()}}
1#Templates={spinner:"<div class='spinner [[CLASSES]]' id='[[ID]]-spinner'></div>"}}window.hdnz.Spinner=new Spinner;class Validation{#css="\n\t\t:root{\n\t\t\t--validation-color: #ffffff;\n\t\t\t--validation-background-color: #e6001e;\n\t\t}\n\n .req:after {\n content: \"*\";\n color: var(--validation-background-color);\n }\n .validation {\n background-color: var(--validation-background-color);\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\n z-index: 999;\n border-radius: 5px;\n box-shadow: 0px 2px 3px 0px rgb(0 0 0 / 75%);\n -webkit-box-shadow: 0px 2px 3px 0px rgb(0 0 0 / 75%);\n -moz-box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.75);\n padding: 6px 10px;\n }\n\n .validation:after {\n content: '';\n position: absolute;\n right: 24px;\n top: -8px;\n width: 0px;\n height: 0px;\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid var(--validation-background-color);\n }\n\n .validation_message {\n color: var(--validation-color) !important;\n font-size: 0.7rem;\n margin:0;\n }\n\n fieldset+.validation,\n .input-wrapper.checkbox .validation {\n right: auto;\n left: 0;\n }\n\n fieldset+.validation:after,\n .input-wrapper.checkbox .validation:after {\n right: auto;\n left: 24px;\n }\n\n input[type=text].error,\n input[type=email].error,\n input[type=password].error,\n input[type=tel].error,\n input[type=number].error,\n input[type=file].error,\n input[type=date].error,\n select.error,\n textarea.error {\n border-color: var(--validation-background-color) !important;\n }\n\n\t";constructor(){this.Init()}Init(options={}){const _me=this;!0===hdnz.debug&&console.log("Validation Initialised");const head=document.head;let styles=head.querySelector("#ValidationStyle");null==styles&&(styles=document.createElement("style"),styles.type="text/css",styles.id="ValidationStyle",styles.appendChild(document.createTextNode(_me.#css)),head.appendChild(styles)),setTimeout(()=>{hdnz.Utilities||console.error("Validation Requires Utilities")},2e3)}UpdateValidationListeners(form){let fieldsToValidate;fieldsToValidate=form?form.querySelectorAll(".js-validate"):document.querySelectorAll(".js-validate");const _me=this;fieldsToValidate.forEach(item=>{if("fieldset"==item.nodeName.toLocaleLowerCase()){item.querySelectorAll("input").forEach(fs=>{fs.removeEventListener("focus",_me.#RemoveValidation)})}else item.removeEventListener("focus",_me.#RemoveValidation)}),fieldsToValidate.forEach(item=>{if("fieldset"==item.nodeName.toLocaleLowerCase()){item.querySelectorAll("input").forEach(fs=>{fs.addEventListener("change",_me.#RemoveValidation)})}else item.addEventListener("focus",_me.#RemoveValidation)})}#RemoveValidation(e){!function RemoveValidationFromTarget(target){const fieldset=target.closest("fieldset");if(null!=fieldset){if(fieldset.classList.contains("error")){const nextSibling=fieldset.nextElementSibling;nextSibling.classList.contains("validation")&&nextSibling.remove(),fieldset.classList.remove("error")}}else if(target.classList.contains("error")){const nextSibling=target.nextElementSibling;nextSibling.classList.contains("validation")&&nextSibling.remove(),target.classList.remove("error")}const parentError=target.closest(".error");parentError&&RemoveValidationFromTarget(parentError)}(e.target)}ValidateFields(elements){const _me=this,fieldCount=elements.length;let isValid=!0;if(fieldCount>0)for(let i=0;i<fieldCount;i++){const this_field=elements[i];if(hdnz.Utilities.IsVisible(this_field)){const field_required=this_field.classList.contains("js-required");switch(this_field.type){case"text":field_required&&""==this_field.value.trim()&&(isValid=_me.#AddValidationMessage(isValid,this_field,"Field is required."));break;case"email":field_required?""==this_field.value.trim()?isValid=_me.#AddValidationMessage(isValid,this_field,"Email is required."):_me.#IsEmail(this_field.value)||(isValid=_me.#AddValidationMessage(isValid,this_field,"Please enter a valid email.")):""==this_field.value.trim()||_me.#IsEmail(this_field.value)||(isValid=this.#AddValidationMessage(isValid,this_field,"Please enter a valid email."));break;case"checkbox":field_required&&!this_field.checked&&(isValid=this.#AddValidationMessage(isValid,this_field,"Selection is required."));break;case"fieldset":const options=this_field.querySelectorAll("input").length;if(0==this_field.querySelectorAll("input:checked").length){let message="Select at least 1 option.";1==options&&(message="Selection is required."),isValid=_me.#AddValidationMessage(isValid,this_field,message)}break;case"radio":field_required&&!this_field.checked&&(isValid=_me.#AddValidationMessage(isValid,this_field,"Selection is required."));break;case"tel":field_required?""==this_field.value.trim()?isValid=_me.#AddValidationMessage(isValid,this_field,"Phone number is required."):_me.#IsPhoneNumber(this_field.value)||(isValid=_me.#AddValidationMessage(isValid,this_field,"Please enter a phone number.")):""==this_field.value.trim()||_me.#IsPhoneNumber(this_field.value)||(isValid=_me.#AddValidationMessage(isValid,this_field,"Please enter a phone number."));break;case"select-one":field_required&&""==this_field.value.trim()&&(isValid=_me.#AddValidationMessage(isValid,this_field,"Please make a selection."));break;case"date":field_required?""==this_field.value.trim()?isValid=_me.#AddValidationMessage(isValid,this_field,"Please enter a valid date."):_me.#IsDate(this_field.value)||(isValid=_me.#AddValidationMessage(isValid,this_field,"Please enter a valid date.")):""==this_field.value.trim()||_me.#IsDate(this_field.value)||(isValid=_me.#AddValidationMessage(isValid,this_field,"Please enter a valid date."));break;default:console.error("'"+this_field.type+"[name="+this_field.name+"]' field type is required but there is no validation for it."),isValid=!1,alert("Sorry there was a problem validating the form. The booking cannot be made.")}}}return isValid}#AddValidationMessage(isValid,field,message){const _me=this;if(isValid){isValid=!1;let offset=parseInt(document.querySelector(".js-body-wrapper").style.marginTop);offset=isNaN(offset)?80:offset+24,hdnz.Utilities.ScrollTo(field,offset)}if(!field.classList.contains("error")){let validation=_me.#Templates.validation;validation=validation.replace(/\[\[MESSAGE\]\]/g,message),validation=hdnz.Utilities.StringToHTML(validation),field.classList.add("error"),field.after(validation)}return isValid}#IsEmail(email){return/^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,6})+$/.test(email)}#IsDate(dateValue){const date=new Date(dateValue);return date instanceof Date&&!isNaN(date)}#IsPhoneNumber(number){let result=!0;return((number=(number=number.replace(/\s+/g,"")).replace(/\-/g,"").replace(/\(/,"").replace(/\)/g,"").replace(/\+/g,"")).length<6||isNaN(number))&&(result=!1),result}#Templates={validation:"<div class='validation'> <p class='validation_message'>[[MESSAGE]]</p> </div>"}}window.hdnz.Validation=new Validation;class XHR{#requestController=null;#requestSignal=null;Init(options={}){!0===hdnz.debug&&console.log("XHR Initialised")}Get(url,callback,abortable=!1){const _me=this;let headers=new Headers;headers.append("Content-Type","application/json");const options={method:"GET",headers:headers};abortable&&(_me.#AbortRequests(),options.signal=_me.#requestSignal),_me.#FetchRequest(options,url,callback)}Post(data,url,callback,abortable=!1){const _me=this;let headers=new Headers;headers.append("Content-Type","application/json");const options={method:"POST",headers:headers,body:JSON.stringify(data)};abortable&&(_me.#AbortRequests(),options.signal=_me.#requestSignal),_me.#FetchRequest(options,url,callback)}#FetchRequest(options,url,callback){fetch(url,options).then(response=>response.json()).then(result=>{callback(result.payload)}).catch(error=>console.log("error",error))}#AbortRequests(){const _me=this;_me.#requestController&&_me.#requestController.abort(),_me.#requestController=new AbortController,_me.#requestSignal=this.#requestController.signal}}window.hdnz.XHR=new XHR;class SiteSearch{Init(){}SetupSiteSearch(){const _me=this,searchInput=document.querySelector(".js-search-wrapper"),searchIcon=document.querySelector(".js-search-input-icon"),searchCloseIcon=document.querySelector(".js-search-input-close-icon"),searchResultsWrapper=document.querySelector(".js-search-results-wrapper"),searchFieldInput=document.querySelector(".js-menu-search"),navigationMenuWrapper=document.querySelector(".js-menu-outer-wrapper"),navigationMenu=document.querySelector(".js__header-menu"),hamburgerIcon=document.querySelector(".js-
1hamburger");searchInput&&(searchIcon.addEventListener("click",()=>{searchInput.classList.toggle("menu__search-wrapper--hidden"),searchIcon.classList.toggle("nav-standard__search-icon--hidden"),searchCloseIcon.classList.toggle("menu__search-x--hidden"),!hdnz.Utilities.IsDesktop()&&navigationMenuWrapper.classList.contains("active")&&(navigationMenuWrapper.classList.remove("expanded"),setTimeout(()=>{navigationMenuWrapper.classList.remove("active")},100),navigationMenu.classList.add("menu__list-wrapper--hidden"),hamburgerIcon.classList.remove("active"),document.body.classList.remove("no-scroll"))}),searchCloseIcon.addEventListener("click",()=>{searchInput.classList.toggle("menu__search-wrapper--hidden"),searchIcon.classList.toggle("nav-standard__search-icon--hidden"),searchCloseIcon.classList.toggle("menu__search-x--hidden")}),searchFieldInput.addEventListener("keyup",e=>{""===e.target.value&&(searchResultsWrapper.style.display="none")}),document.querySelectorAll(".js-search-wrapper").forEach(el=>{_me.#HsSearch(el)}))}#HsSearch(_instance){const KEYS_TAB="Tab",KEYS_ESC="Esc",KEYS_ESCAPE="Escape",KEYS_UP="Up",KEYS_ARROW_UP="ArrowUp",KEYS_DOWN="Down",KEYS_ARROW_DOWN="ArrowDown";let searchTerm="";const searchForm=_instance,searchField=_instance.querySelector(".js-menu-search"),searchResults=_instance.querySelector(".js-search-results-wrapper"),emptySearchResults=function(){searchResults.innerHTML="<li class=\"menu__search-results-title\" id='results-for'>Results:</li>",searchField.focus(),searchForm.classList.remove("hs-search-field--open")},getSearchResults=function(){const request=new XMLHttpRequest,requestUrl=`${PORTAL_VARS.site_root}/_hcms/search?&term=${encodeURIComponent(searchTerm)}&limit=${encodeURIComponent(3)}&autocomplete=true&analytics=true&${function(){const formParams=[],form=_instance.querySelector("form");for(let i=0;i<form.querySelectorAll("input[type=hidden]").length;i++){const e=form.querySelectorAll("input[type=hidden]")[i];"limit"!==e.name&&formParams.push(`${encodeURIComponent(e.name)}=${encodeURIComponent(e.value)}`)}return formParams.join("&")}()}`;request.open("GET",requestUrl,!0),request.onload=function(){if(request.status>=200&&request.status<400){const data=JSON.parse(request.responseText);data.total>0?(!function(response){const items=[];items.push(`<li class="menu__search-results-title" id='results-for'>Results for "${response.searchTerm}"</li>`),response.results.forEach((val,index)=>{items.push(`<li id='result${index}'><a class="menu__search-results-item-link" href='${val.url}'>${val.title}</a></li>`)}),items.length>=1&&(searchResults.style.display="block"),emptySearchResults(),searchResults.innerHTML=items.join(""),searchForm.classList.add("hs-search-field--open")}(data),trapFocus()):emptySearchResults()}else console.error("Server reached, error retrieving results.")},request.onerror=function(){console.error("Could not reach the server.")},request.send()},trapFocus=function(){const tabbable=[];tabbable.push(searchField);const tabbables=searchResults.getElementsByTagName("A");for(let i=0;i<tabbables.length;i++)tabbable.push(tabbables[i]);const firstTabbable=tabbable[0],lastTabbable=tabbable[tabbable.length-1];searchForm.addEventListener("keydown",e=>{switch(e.key){case KEYS_TAB:!function(e){e.target!=lastTabbable||e.shiftKey?e.target==firstTabbable&&e.shiftKey&&(e.preventDefault(),lastTabbable.focus()):(e.preventDefault(),firstTabbable.focus())}(e);break;case KEYS_ESC:case KEYS_ESCAPE:emptySearchResults();break;case KEYS_UP:case KEYS_ARROW_UP:!function(e){e.preventDefault(),e.target==firstTabbable?lastTabbable.focus():tabbable.forEach(el=>{el==e.target&&tabbable[tabbable.indexOf(el)-1].focus()})}(e);break;case KEYS_DOWN:case KEYS_ARROW_DOWN:!function(e){e.preventDefault(),e.target==lastTabbable?firstTabbable.focus():tabbable.forEach(el=>{el==e.target&&tabbable[tabbable.indexOf(el)+1].focus()})}(e)}})},isSearchTermPresent=function(func,wait,immediate){let timeout;return function(){const context=this,args=arguments,callNow=immediate&&!timeout;clearTimeout(timeout),timeout=setTimeout(function(){timeout=null,immediate||func.apply(context,args)},wait||200),callNow&&func.apply(context,args)}}(()=>{searchTerm=searchField.value,searchTerm.length>2?getSearchResults():0==searchTerm.length&&emptySearchResults()},250);searchField.addEventListener("input",e=>{searchTerm!=searchField.value&&isSearchTermPresent()})}}window.hdnz.SiteSearch=new SiteSearch;
1class Favourites{#display=null;#cookieName=PORTAL_VARS.cookie_prefix+"favourites";#favouriteCount=0;#collection=[];#apiRoot=PORTAL_VARS.api_root;#release=PORTAL_VARS.release;#contactId=0;#timeoutId=null;#buttonTimeouts=new WeakMap;constructor(){this.#display=document.querySelector("#FavouritesHeart .js-favourite-count");const contactid=parseInt(this.#display.dataset.contactid);this.#contactId=isNaN(contactid)?0:contactid}Init(options={}){const _me=this;if(window.hdnz.Cookies)_me.#Load(_me);else{let interval=setInterval(()=>{window.hdnz.Cookies&&(_me.#Load(_me),clearInterval(interval))},50)}}SyncFavourite(productId,action,button,productName,contactId){const _me=this,favouriteImage=button.querySelector(".js-favourite-image"),removeButton=document.getElementById(`removeFavourite-${productId}`),{favourite_id:favourite_id}=removeButton?.dataset||{};if(!productId)return void console.warn("Product ID not found.");const existingTimeout=_me.#buttonTimeouts.get(button);existingTimeout&&clearTimeout(existingTimeout),button.classList.add("disabled"),favouriteImage.style.display="none",hdnz.Spinner.InlineSpinner(!0,button);const timeoutId=setTimeout(()=>{"remove"===action&&favourite_id&&(window.hdnz.Favourites.Remove(favourite_id,productId),_me.IsProductFavourite()),"add"===action&&(window.hdnz.Favourites.Add(productId,productName,contactId),_me.IsProductFavourite()),button.classList.remove("disabled"),favouriteImage.style.display="inline",hdnz.Spinner.InlineSpinner(!1,button),_me.#buttonTimeouts.delete(button)},1e3);_me.#buttonTimeouts.set(button,timeoutId)}IsProductFavourite(){let collection=hdnz.Favourites.GetCollection();const products=document.querySelectorAll(".js-product-favourite");products.length&&products.forEach(product=>{let favourite_element_id=product.dataset.product_id;const add_button=product.querySelector(".js-add-favourite"),remove_button=product.querySelector(".js-remove-favourite");collection.includes(favourite_element_id)?(remove_button.style.display="flex",add_button.style.display="none"):(remove_button.style.display="none",add_button.style.display="flex")})}#Load(instance){const _me=instance,cookie=hdnz.Cookies.Get(_me.#cookieName);""!==cookie?_me.#collection=JSON.parse(cookie):hdnz.Cookies.Set(_me.#cookieName,JSON.stringify(_me.#collection),365),instance.#UpdateDisplay()}#UpdateDisplay(){const collectionCount=this.#collection.length;this.#display.textContent=collectionCount,this.#Sync()}Add(productId,productName,contactId){const _me=this;_me.#collection.indexOf(productId)<0?(_me.#collection.push(productId),hdnz.Cookies.Set(_me.#cookieName,JSON.stringify(_me.#collection),365),_me.#UpdateDisplay(),_me.CreateFavouriteRecord(productId,productName,contactId)):console.log("ID is already here")}Remove(favouriteId,productId){this.#collection;const newCollection=hdnz.Utilities.RemoveFromArray(this.#collection,productId.toString());this.#collection=newCollection,hdnz.Cookies.Set(this.#cookieName,JSON.stringify(newCollection),365),this.#UpdateDisplay(),this.DeleteFavouriteRecord(favouriteId)}GetCollection(){return this.#collection}CreateFavouriteRecord(productId,productName,contactId){const currentDateTime=new Date,formattedDateTime=`${currentDateTime.getDate().toString().padStart(2,"0")}/${(currentDateTime.getMonth()+1).toString().padStart(2,"0")}/${currentDateTime.getFullYear()} ${currentDateTime.getHours().toString().padStart(2,"0")}:${currentDateTime.getMinutes().toString().padStart(2,"0")}:${currentDateTime.getSeconds().toString().padStart(2,"0")}`,headers=new Headers;headers.append("Content-Type","application/json");const frontendData={do:"CreateFavourite",payload:{objectTypeId:"2-41274501",inputs:[{properties:{favourite_name:productName+" from Website on "+formattedDateTime},associations:[{to:{id:contactId},types:[{associationCategory:"USER_DEFINED",associationTypeId:102}]},{to:{id:productId},types:[{associationCategory:"USER_DEFINED",associationTypeId:104}]}]}]}},options={method:"POST",redirect:"follow",headers:headers,body:JSON.stringify(frontendData)},url=PORTAL_VARS.api_root+"favourites_"+PORTAL_VARS.release;return new Promise((resolve,reject)=>{resolve(fetch(url,options).then(response=>response.json()).then(returnData=>{if("OK"==returnData.status){const removeFavouriteBtn=document.getElementById(`removeFavourite-${productId}`);removeFavouriteBtn&&(removeFavouriteBtn.dataset.favourite_id=returnData.payload.response.results[0].id)}})),reject(new Error("Client-side error from fetch request."))})}DeleteFavouriteRecord(favouriteId){const headers=new Headers;headers.append("Content-Type","application/json");const frontendData={do:"DeleteFavourite",payload:{objectTypeId:"2-41274501",id:favouriteId}},options={method:"POST",redirect:"follow",headers:headers,body:JSON.stringify(frontendData)},url=PORTAL_VARS.api_root+"favourites_"+PORTAL_VARS.release;return new Promise((resolve,reject)=>{resolve(fetch(url,options).then(response=>response.json()).then(returnData=>returnData)),reject(new Error("Client-side error from fetch request."))})}Clear(){this.#collection=[],this.#UpdateDisplay()}#Sync(){const _me=this;if(_me.#contactId>0){_me.#contactId,_me.#collection,_me.#apiRoot,_me.#release}}SyncComplete(result){hdnz.Cookies.Set(this.#cookieName,JSON.stringify(this.#collection),365),console.log(result.updatedCollection)}
1isFavourite(productId){return this.#collection.includes(productId)}PopulateCollection(itemsIdsArray){const _me=this;itemsIdsArray.forEach(item=>{_me.#collection.push(item)}),hdnz.Cookies.Set(_me.#cookieName,JSON.stringify(_me.#collection),365),_me.#UpdateDisplay()}}window.hdnz.Favourites=new Favourites,window.hdnz.Favourites.Init();class CustomEvents{#apiRoot=PORTAL_VARS.api_root;#release=PORTAL_VARS.release;constructor(){this.Init()}Init(){const _me=this,trackablePages=document.querySelector(".js-tracked-page");trackablePages&&_me.#SendPageViewEventCompletion(trackablePages.dataset)}SendButtonClickCompletion(payloadData){const{click_type:click_type,id:id,city:city,country:country}=payloadData,headers=new Headers;headers.append("Content-Type","application/json");const frontendData={do:"SaveButtonClick",payload:{eventName:"pe47418537_dealer_detail_clicks",properties:{hs_page_url:window.location.href,hs_country:country,hs_city:city,click_source:click_type},objectId:id}},options={method:"POST",redirect:"follow",headers:headers,body:JSON.stringify(frontendData)},url=this.#apiRoot+"custom-events_"+this.#release;return new Promise((resolve,reject)=>{resolve(fetch(url,options).then(response=>response.json()).then(returnData=>returnData)),reject(new Error("Client-side error from fetch request."))})}#SendPageViewEventCompletion(payloadData){const{id:id,city:city,country:country}=payloadData,headers=new Headers;headers.append("Content-Type","application/json");const frontendData={do:"SavePageView",payload:{eventName:"pe47418537_dealer_detail_page_views",properties:{hs_page_url:window.location.href,hs_country:country,hs_city:city},objectId:id}},options={method:"POST",redirect:"follow",headers:headers,body:JSON.stringify(frontendData)},url=this.#apiRoot+"custom-events_"+this.#release;return new Promise((resolve,reject)=>{resolve(fetch(url,options).then(response=>response.json()).then(returnData=>returnData)),reject(new Error("Client-side error from fetch request."))})}}window.hdnz.CustomEvents=new CustomEvents;class Variants{#apiRoot=PORTAL_VARS.api_root;#release=PORTAL_VARS.release;constructor(){this.Init()}Init(){}FetchItemsByIds(idsArray){const headers=new Headers;headers.append("Content-Type","application/json");const frontendData={do:"GetItemsByIds",payload:{ids:idsArray}},options={method:"POST",redirect:"follow",headers:headers,body:JSON.stringify(frontendData)},url=this.#apiRoot+"variants_"+this.#release;return new Promise((resolve,reject)=>{fetch(url,options).then(response=>response.json()).then(returnData=>{"OK"===returnData.status?resolve(returnData.payload.items):reject(new Error(returnData.message||"Server returned an error"))}).catch(error=>{reject(error)})})}}window.hdnz.Variants=new Variants; 2//# sourceURL=https://47418537.fs1.hubspotusercontent-ap1.net/hubfs/47418537/hub_generated/template_assets/1/185210040129/1780468759595/template_main.js
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.