{"version":3,"sources":["webpack:///./src/module/no-tracking.ts","webpack:///./src/module/google-analytics.ts","webpack:///./src/appConfig.ts","webpack:///./Web/Shared/Component/ContactForm/contact-form.ts","webpack:///./src/module/form.ts","webpack:///./Web/Contact/contact.ts","webpack:///./src/module/google-map.ts","webpack:///./src/module/dom.ts","webpack:///./Web/Shared/layout.ts","webpack:///./src/module/extensions.ts","webpack:///./src/module/zopim-live-chat.ts","webpack:///./src/images/contactDropPoint.png"],"names":["COOKIES_KEY","hasNoTrackingCookies","document","cookie","match","__webpack_require__","d","__webpack_exports__","setupGA","setEvent","setAdsConversion","trySetAdsConversion","_googleAdsConfig","undefined","googleAnalyticsId","googleAdsConfig","script","createElement","type","async","src","getElementsByTagName","appendChild","script2","textContent","Id","setTimeout","gtag","scrolled","querySelectorAll","forEach","elem","trackEventName","dataset","addEventListener","trackConversionName","eventName","eventCategory","eventLabel","event_category","event_label","value","conversionName","send_to","convertor","appConfig","__assign","JSON","parse","getElementById","googleMapSetting","apiKey","locations","position","lat","lng","url","zoom","center","styles","featureType","elementType","stylers","saturation","visibility","lightness","hue","setupContactForm","elementId","config","processing","combineToFormData","error","beforeSend","success","e","preventDefault","formElement","target","xhr","XMLHttpRequest","readyState","status","responseText","console","finally","onprogress","event","Math","round","loaded","total","toFixed","open","action","formData","FormData","length","log","obj","Object","keys","key","append","send","ajaxForm","querySelector","style","display","errorText","reset","google_analytics","layout","languageIsoCode","googleMapConfig","defer","window","initMap","map","google","maps","Map","scrollwheel","_i","_a","location_1","Marker","icon","contactDropPoint","addListener","this","contact_form","scrollToTop","c","documentElement","scrollTop","body","requestAnimationFrame","scrollTo","setupLayout","RequireObjectCoercible","MAX_SAFE_INTEGER","ToLength","zopimLiveChatId","O","TypeError","Number","pow","argument","len","isNaN","String","prototype","padStart","maxLength","fillString","S","intMaxLength","stringLength","filler","fillLen","fLen","remainingCodeUnits","slice","padEnd","encodeHtml","replace","camelCaseToRegularString","toLowerCase","firstCharUpperCase","charAt","toUpperCase","substring","Date","toDateString","getFullYear","getMonth","toString","getDate","todayStart","date","setHours","Array","groupBy","compareWith","a","b","datas","results","result","aData","pop","unshift","i","bData","splice","googleAdsId","hpLink","whatsApp","mapLink","liveChat","emailLink","contactForm","id","onload","zE","each","classList","toggle","add","remove","onscroll","pageYOffset","module","exports"],"mappings":"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","file":"4.7f4c6fee37d96bff8a9f.bundle.js","sourcesContent":["const COOKIES_KEY = 'noTracking';\r\n\r\nexport function setNoTrackingCookies() {\r\n document.cookie = `${COOKIES_KEY}expires=${new Date(\"2025-01-01\").toString()}`;\r\n console.log('No Tracking Cookies Settle!')\r\n}\r\n\r\nexport function hasNoTrackingCookies():boolean {\r\n return !!document.cookie.match(COOKIES_KEY);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { hasNoTrackingCookies } from './no-tracking';\r\n\r\ndeclare global {\r\n let gtag: (...args: any[]) => void\r\n}\r\ninterface GoogleAdsConfig {\r\n Id : string,\r\n convertor : {\r\n [name : string] : string,\r\n }\r\n}\r\n\r\nlet _googleAdsConfig : GoogleAdsConfig | undefined = undefined;\r\nexport function setupGA(googleAnalyticsId: string, googleAdsConfig?: GoogleAdsConfig ) {\r\n if(hasNoTrackingCookies()) return;\r\n let script = document.createElement('script') as HTMLScriptElement;\r\n script.type = 'text/javascript';\r\n script.async = true;\r\n script.src = `https://www.googletagmanager.com/gtag/js?id=${googleAnalyticsId}`;\r\n document.getElementsByTagName('head')[0].appendChild(script);\r\n \r\n // 因为它需要定义全局变量,所以不能再 ts 里面写. \r\n let script2 = document.createElement('script') as HTMLScriptElement;\r\n script2.type = 'text/javascript';\r\n script2.textContent = `\r\n window.dataLayer = window.dataLayer || [];\r\n function gtag(){dataLayer.push(arguments);}\r\n gtag('js', new Date()); \r\n gtag('config', '${ googleAnalyticsId }', {\r\n 'custom_map': {\r\n 'dimension1': 'scrolled'\r\n }\r\n });\r\n ${googleAdsConfig ? `gtag('config', '${googleAdsConfig.Id}');` : ''}\r\n `;\r\n document.getElementsByTagName('head')[0].appendChild(script2);\r\n\r\n setTimeout(()=>{\r\n gtag('event', 'scrolled_dimension', {\r\n 'scrolled': 'true'\r\n });\r\n },15000);\r\n \r\n document.querySelectorAll('.googleAnalyticsTracking').forEach(elem => {\r\n const trackEventName = elem.dataset['googleAnalyticsEvent'];\r\n elem.addEventListener('click', () => { \r\n setEvent(trackEventName);\r\n });\r\n }); \r\n if(googleAdsConfig){\r\n _googleAdsConfig = googleAdsConfig;\r\n document.querySelectorAll('.googleAdsTracking').forEach(elem => {\r\n const trackConversionName = elem.dataset['googleAdsConversion'];\r\n elem.addEventListener('click', () => { \r\n setAdsConversion(trackConversionName);\r\n });\r\n }); \r\n }\r\n}\r\n\r\nexport function setEvent(eventName:string, eventCategory?:string, eventLabel?:string ){\r\n if(hasNoTrackingCookies()) return;\r\n eventCategory = eventCategory || eventName;\r\n eventLabel = eventLabel || eventName;\r\n gtag('event', `event_${eventName}`, {\r\n 'event_category': `event_${eventCategory}`,\r\n 'event_label': `event_${eventLabel}`,\r\n 'value': 1\r\n });\r\n}\r\n\r\nexport function setAdsConversion(conversionName:string){\r\n if(hasNoTrackingCookies()) return;\r\n gtag('event', 'conversion', { 'send_to': `${_googleAdsConfig.Id}/${_googleAdsConfig.convertor[conversionName]}` });\r\n}\r\n\r\nexport function trySetAdsConversion(conversionName:string){\r\n if(_googleAdsConfig){\r\n setAdsConversion(conversionName);\r\n }\r\n}\r\n\r\n\r\n","export const appConfig = {\r\n ...JSON.parse((document.getElementById('inputHiddenForAppConfig') as HTMLInputElement).value),\r\n ...{\r\n \"googleMapSetting\": {\r\n \"apiKey\": \"AIzaSyBXFqHDAO2Jyo2V1w1W_VQYTV7L9Xic7X4\",\r\n \"locations\": [\r\n {\r\n \"position\": {\r\n \"lat\": 1.48758,\r\n \"lng\": 103.6609073\r\n },\r\n \"url\": \"https://www.google.com/maps/place/Metalforce/@@1.5231453,103.6823992,17z/data=!4m8!1m2!2m1!1sMetal+Force+Sdn+Bhd!3m4!1s0x31da724d4f9f410b:0xd0530c53e2fe730b!8m2!3d1.5255079!4d103.683224\"\r\n }\r\n ],\r\n \"zoom\":8,\r\n \"center\": {\r\n \"lat\": 1.5255133,\r\n \"lng\": 103.6810353\r\n },\r\n \"styles\": [\r\n {\r\n \"featureType\": \"administrative\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"administrative.province\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": -100\r\n },\r\n {\r\n \"lightness\": 65\r\n },\r\n {\r\n \"visibility\": \"on\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": -100\r\n },\r\n {\r\n \"lightness\": \"50\"\r\n },\r\n {\r\n \"visibility\": \"simplified\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"simplified\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.arterial\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": \"30\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.local\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": \"40\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": -100\r\n },\r\n {\r\n \"visibility\": \"simplified\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"hue\": \"#ffff00\"\r\n },\r\n {\r\n \"lightness\": -25\r\n },\r\n {\r\n \"saturation\": -97\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": -25\r\n },\r\n {\r\n \"saturation\": -100\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }\r\n\r\n}\r\n\r\n","import { ajaxForm } from \"../../../../src/module/form\";\r\nimport { setEvent, setAdsConversion } from \"../../../../src/module/google-analytics\";\r\n\r\nexport function setupContactForm(elementId : string){\r\n ajaxForm({\r\n elementId: elementId,\r\n beforeSend: () => { \r\n document.querySelector(`#${elementId} .buttonSubmit`).style.display = 'none';\r\n document.querySelector(`#${elementId} .buttonLoading`).style.display = 'block';\r\n },\r\n error: (errorText) => {\r\n document.querySelector(`#${elementId} .buttonSubmit`).style.display = 'none';\r\n document.querySelector(`#${elementId} .buttonLoading`).style.display = 'none';\r\n document.querySelector(`#${elementId} .buttonError`).style.display = 'block';\r\n console.log(errorText);\r\n },\r\n processing: () => {\r\n //upload percentage\r\n },\r\n success: () => {\r\n document.querySelector(`#${elementId} .buttonSubmit`).style.display = 'none';\r\n document.querySelector(`#${elementId} .buttonLoading`).style.display = 'none';\r\n document.querySelector(`#${elementId} .buttonError`).style.display = 'none';\r\n document.querySelector(`#${elementId} .buttonSuccess`).style.display = 'block';\r\n (document.getElementById(elementId) as HTMLFormElement).reset();\r\n setEvent('contactForm');\r\n setAdsConversion('contactForm');\r\n },\r\n finally: () => {\r\n //finish all job\r\n }\r\n });\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","\r\n// note : 不支持 input file 哦\r\nexport function localStorageForm(config: {\r\n elementId: string,\r\n localStorageKey: string,\r\n redirectUrl: string\r\n}): void {\r\n const { elementId, localStorageKey, redirectUrl } = config;\r\n const form = document.getElementById(elementId);\r\n form.addEventListener('submit', (e: Event) => {\r\n e.preventDefault();\r\n const formElement = e.target as HTMLFormElement;\r\n const formData = new FormData(formElement)\r\n let store: any = {};\r\n formData.forEach((value, key) => {\r\n store[key] = value;\r\n });\r\n localStorage.setItem(localStorageKey, JSON.stringify(store));\r\n location.href = redirectUrl;\r\n });\r\n}\r\n\r\nexport function formDataToObject(formElement: HTMLFormElement): any {\r\n const formData = new FormData(formElement);\r\n let result: any = {};\r\n formData.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n return result;\r\n}\r\n\r\n\r\nexport function ajaxForm(config: {\r\n elementId: string\r\n beforeSend: () => void\r\n success: (responseText: string) => void\r\n error: (responseText: string) => void\r\n finally: () => void\r\n processing?: (percent: number) => void\r\n combineToFormData?: { [propName : string] : any }[]\r\n}): void {\r\n config.processing = config.processing || function () { };\r\n config.combineToFormData = config.combineToFormData || [];\r\n const { elementId, error, beforeSend, success, processing, combineToFormData } = config;\r\n const form = document.getElementById(elementId);\r\n form.addEventListener('submit', (e: Event) => {\r\n e.preventDefault();\r\n const formElement = e.target as HTMLFormElement;\r\n beforeSend();\r\n var xhr = new XMLHttpRequest();\r\n xhr.addEventListener('readystatechange', () => {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 200) {\r\n success(xhr.responseText);\r\n }\r\n else {\r\n console.error({\r\n status: xhr.status,\r\n responseText: xhr.responseText\r\n });\r\n error(xhr.responseText);\r\n }\r\n config.finally();\r\n }\r\n });\r\n xhr.onprogress = function (event) {\r\n processing(+Math.round(event.loaded / event.total * 100).toFixed(0));\r\n };\r\n xhr.open(\"POST\", formElement.action, true);\r\n let formData = new FormData(formElement);\r\n if (combineToFormData.length > 0) {\r\n console.log(combineToFormData)\r\n combineToFormData.forEach(obj => {\r\n Object.keys(obj).forEach(key => {\r\n formData.append(key, obj[key]);\r\n });\r\n });\r\n }\r\n formData.forEach((value, key) => {\r\n console.log(key, value);\r\n });\r\n xhr.send(formData);\r\n });\r\n}\r\n","import './contact.scss';\r\nimport { setupLayout } from '../Shared/layout';\r\nimport { setupGoogleMap } from '../../src/module/google-map';\r\nimport { setupContactForm } from '../Shared/Component/ContactForm/contact-form';\r\nimport { appConfig } from '../../src/appConfig';\r\n\r\nsetupLayout();\r\n\r\nconst languageIsoCode = (document.getElementById('inputHiddenForPageLanguageIsoCode') as HTMLInputElement).value;\r\nconst googleMapConfig = {\r\n ...appConfig.googleMapSetting,\r\n ...{\r\n languageIsoCode\r\n }\r\n}\r\nsetupLayout();\r\nsetupGoogleMap(googleMapConfig);\r\nsetupContactForm('contactForm');\r\n","import * as mapIcon from '../images/contactDropPoint.png';\r\n\r\ndeclare global {\r\n interface Window {\r\n initMap: () => void\r\n }\r\n let google : any\r\n}\r\n\r\nexport function setupGoogleMap(config: {\r\n apiKey: string,\r\n languageIsoCode : string,\r\n locations : {\r\n position: {\r\n lat: number,\r\n lng: number\r\n },\r\n url: string\r\n }[],\r\n zoom:number,\r\n center : {\r\n lat: number,\r\n lng: number\r\n },\r\n styles : any[]\r\n}) {\r\n let script = document.createElement('script') as HTMLScriptElement;\r\n script.type = 'text/javascript'; \r\n script.async = true;\r\n script.defer = true; \r\n script.src = `https://maps.googleapis.com/maps/api/js?key=${config.apiKey}&callback=initMap&language=${config.languageIsoCode}`;\r\n document.getElementsByTagName('body')[0].appendChild(script);\r\n\r\n window.initMap = () => {\r\n document.querySelectorAll('#googleMap.googleMap').forEach(elem => {\r\n let map = new google.maps.Map(elem, {\r\n zoom: config.zoom,\r\n center: config.center,\r\n scrollwheel: false,\r\n styles: config.styles\r\n });\r\n\r\n for (let location of config.locations) {\r\n let marker = new google.maps.Marker({\r\n position: location.position,\r\n map: map,\r\n icon: mapIcon,\r\n url: location.url\r\n });\r\n\r\n marker.addListener('click', function () {\r\n window.open(this.url, '_blank');\r\n });\r\n }\r\n });\r\n }\r\n}","export function scrollToTop() {\r\n const c = document.documentElement.scrollTop || document.body.scrollTop;\r\n if (c > 0) {\r\n window.requestAnimationFrame(scrollToTop);\r\n window.scrollTo(0, c - c / 8);\r\n }\r\n}\r\n\r\nexport function animation(duration: number, action: (progress: number, isLast: boolean) => void) {\r\n let start: number | null = null;\r\n const animation = (timeStamp: number) => {\r\n if (!start) start = timeStamp;\r\n let runtime = timeStamp - start;\r\n let progress = runtime / duration;\r\n if (progress >= 1) {\r\n action(progress, true);\r\n }\r\n else {\r\n action(progress, false);\r\n window.requestAnimationFrame(animation);\r\n }\r\n }\r\n window.requestAnimationFrame(animation);\r\n}\r\n\r\nexport function slideDown(element: HTMLElement) {\r\n element.style.display = 'block';\r\n const height = element.clientHeight;\r\n element.style.height = '0';\r\n animation(300, (progress, isLast) => {\r\n if (isLast) {\r\n element.style.height = height + 'px';\r\n }\r\n else {\r\n element.style.height = (height * progress) + 'px';\r\n }\r\n });\r\n}\r\n\r\nexport function slideUp(element: HTMLElement) {\r\n const height = element.clientHeight;\r\n animation(300, (progress, isLast) => {\r\n if (isLast) {\r\n element.style.removeProperty('height');\r\n element.style.removeProperty('display');\r\n }\r\n else {\r\n element.style.height = (height - (height * progress)) + 'px';\r\n }\r\n });\r\n}\r\n\r\nexport function slideToggle(element: HTMLElement){\r\n let isOpen = window.getComputedStyle(element).display == 'block';\r\n if (isOpen) {\r\n slideUp(element);\r\n }\r\n else {\r\n slideDown(element);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { setupGA } from '../../src/module/google-analytics';\r\nimport { setupLiveChat } from '../../src/module/zopim-live-chat';\r\nimport { setupExtension } from '../../src/module/extensions';\r\nimport { appConfig } from '../../src/appConfig';\r\nimport { scrollToTop } from '../../src/module/dom';\r\nimport { setupContactForm } from './Component/ContactForm/contact-form';\r\n\r\nexport function setupLayout() {\r\n setupExtension();\r\n\r\n setupGA(appConfig.googleAnalyticsId, {\r\n Id: appConfig.googleAdsId,\r\n convertor: {\r\n 'hpLink': 'M-PpCK7h0n4QrPTKgwM',\r\n 'whatsApp': 'Ouf6CPWL0H8QrPTKgwM',\r\n 'mapLink': 'M-PpCK7h0n4QrPTKgwM',\r\n 'liveChat': '9E3SCL7j3X8QrPTKgwM',\r\n 'emailLink': 'scsECIzdwYYBEKz0yoMD',\r\n 'contactForm': 'bbTICPPfp4ABEKz0yoMD'\r\n }\r\n });\r\n setupLiveChat(appConfig.zopimLiveChatId);\r\n setupContactForm('footerForm');\r\n\r\n document.querySelectorAll(\".openButton\").forEach(each => {\r\n each.addEventListener(\"click\", function () {\r\n document.querySelectorAll(\".searchForm\").forEach(action => {\r\n action.classList.toggle(\"active\");\r\n });\r\n });\r\n });\r\n\r\n document.querySelector(\".menuButton\").addEventListener(\"click\", function () {\r\n document.querySelector(\".mobileNavigation\").classList.add(\"active\");\r\n document.querySelector(\".backgroundCover\").classList.add(\"active\");\r\n });\r\n\r\n document.querySelector(\".menuCloseButton\").addEventListener(\"click\", function () {\r\n document.querySelector(\".mobileNavigation\").classList.remove(\"active\");\r\n document.querySelector(\".backgroundCover\").classList.remove(\"active\");\r\n });\r\n\r\n document.querySelector(\".backgroundCover\").addEventListener(\"click\", function () {\r\n document.querySelector(\".mobileNavigation\").classList.remove(\"active\");\r\n document.querySelector(\".backgroundCover\").classList.remove(\"active\");\r\n });\r\n\r\n window.onscroll = function () {\r\n if (window.pageYOffset > 0) {\r\n document.querySelector(\"#returnBox\").classList.add(\"active\");\r\n } else {\r\n document.querySelector(\"#returnBox\").classList.remove(\"active\");\r\n }\r\n }\r\n\r\n document.querySelector(\"#returnBox\").addEventListener(\"click\", function () {\r\n scrollToTop();\r\n });\r\n}","declare global {\r\n interface Date {\r\n todayStart(): Date; \r\n toDateString(): string;\r\n } \r\n interface String {\r\n padStart(maxLength: number, fillString: string): string;\r\n padEnd(maxLength: number, fillString: string): string; \r\n encodeHtml(): string;\r\n camelCaseToRegularString(): string\r\n firstCharUpperCase(): string\r\n }\r\n interface Array {\r\n groupBy(compareWith?: CompareWith): T[][];\r\n }\r\n}\r\n\r\ntype CompareWith = (a: T, b: T) => boolean;\r\n\r\nexport function setupExtension() {\r\n\r\n const RequireObjectCoercible = (O: any) => {\r\n if (O === null || typeof O === 'undefined') {\r\n throw new TypeError(`\"this\" value must not be null or undefined`);\r\n }\r\n return O;\r\n };\r\n const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;\r\n const ToLength = (argument: any) => {\r\n const len = Number(argument);\r\n if (Number.isNaN(len) || len <= 0) { return 0; }\r\n if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }\r\n return len;\r\n };\r\n String.prototype.padStart = function padStart(maxLength: number, fillString :string = ' ') {\r\n const O = RequireObjectCoercible(this);\r\n const S = String(O);\r\n const intMaxLength = ToLength(maxLength);\r\n const stringLength = ToLength(S.length);\r\n if (intMaxLength <= stringLength) { return S; }\r\n let filler = typeof fillString === 'undefined' ? ' ' : String(fillString);\r\n if (filler === '') { return S; }\r\n const fillLen = intMaxLength - stringLength;\r\n while (filler.length < fillLen) {\r\n const fLen = filler.length;\r\n const remainingCodeUnits = fillLen - fLen;\r\n if (fLen > remainingCodeUnits) {\r\n filler += filler.slice(0, remainingCodeUnits);\r\n } else {\r\n filler += filler;\r\n }\r\n }\r\n const truncatedStringFiller = filler.slice(0, fillLen);\r\n return truncatedStringFiller + S;\r\n };\r\n\r\n String.prototype.padEnd = function padEnd(maxLength: number, fillString:string = ' ') {\r\n const O = RequireObjectCoercible(this);\r\n const S = String(O);\r\n const intMaxLength = ToLength(maxLength);\r\n const stringLength = ToLength(S.length);\r\n if (intMaxLength <= stringLength) { return S; }\r\n let filler = typeof fillString === 'undefined' ? ' ' : String(fillString);\r\n if (filler === '') { return S; }\r\n const fillLen = intMaxLength - stringLength;\r\n while (filler.length < fillLen) {\r\n const fLen = filler.length;\r\n const remainingCodeUnits = fillLen - fLen;\r\n if (fLen > remainingCodeUnits) {\r\n filler += filler.slice(0, remainingCodeUnits);\r\n } else {\r\n filler += filler;\r\n }\r\n }\r\n const truncatedStringFiller = filler.slice(0, fillLen);\r\n return S + truncatedStringFiller;\r\n };\r\n\r\n String.prototype.encodeHtml = function encodeHtml() {\r\n const value = this as string;\r\n return value.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"');\r\n }\r\n\r\n String.prototype.camelCaseToRegularString = function camelCaseToRegularString() {\r\n const value = this as string;\r\n return value.replace(/([A-Z])/g, ' $1').toLowerCase();\r\n }\r\n \r\n String.prototype.firstCharUpperCase = function () {\r\n return (this as string).charAt(0).toUpperCase() + this.substring(1);\r\n };\r\n\r\n Date.prototype.toDateString = function () {\r\n const date = this as Date;\r\n const yearStr = date.getFullYear();\r\n const monthStr = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const dateStr = date.getDate().toString().padStart(2, '0');\r\n return `${yearStr}-${monthStr}-${dateStr}`;\r\n };\r\n\r\n Date.prototype.todayStart = function () {\r\n const date = new Date(this);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n };\r\n\r\n Array.prototype.groupBy = function (compareWith: CompareWith = (a, b) => a === b) {\r\n const datas: any[] = [...this];\r\n const results: any[][] = [];\r\n while (datas.length > 0) {\r\n const result: any[] = [];\r\n const aData = datas.pop()!;\r\n result.unshift(aData);\r\n for (let i = datas.length - 1; i >= 0; i--) {\r\n const bData = datas[i];\r\n const match = compareWith(aData, bData);\r\n if (match) {\r\n result.unshift(bData);\r\n datas.splice(i, 1);\r\n }\r\n }\r\n results.unshift(result);\r\n }\r\n return results;\r\n };\r\n}\r\n","import { setEvent, trySetAdsConversion } from './google-analytics';\r\n\r\n\r\ndeclare global {\r\n interface Window {\r\n zE: any\r\n }\r\n}\r\n\r\nexport function setupLiveChat(zopimLiveChatId: string) {\r\n let script = document.createElement('script') as HTMLScriptElement;\r\n script.type = 'text/javascript';\r\n script.id = 'ze-snippet';\r\n script.src = `https://static.zdassets.com/ekr/snippet.js?key=${zopimLiveChatId}`;\r\n script.onload = () => {\r\n window.zE('webWidget:on', 'chat:start', () => {\r\n setEvent('liveChat');\r\n trySetAdsConversion('liveChat');\r\n })\r\n }\r\n document.getElementsByTagName('body')[0].appendChild(script);\r\n}\r\n","module.exports = \"/assets/dac873c837ca1bd05e460dbd344220d0.png\";"],"sourceRoot":""}