{"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:///./src/module/dom.ts","webpack:///./Web/Shared/layout.ts","webpack:///./src/module/extensions.ts","webpack:///./src/module/zopim-live-chat.ts","webpack:///./Web/Product/product.ts"],"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","scrollToTop","c","documentElement","scrollTop","body","window","requestAnimationFrame","scrollTo","setupLayout","RequireObjectCoercible","MAX_SAFE_INTEGER","ToLength","zopimLiveChatId","O","TypeError","Number","pow","argument","len","isNaN","String","prototype","padStart","maxLength","fillString","this","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","contact_form","each","classList","toggle","add","remove","onscroll","pageYOffset","r","_Shared_layout__WEBPACK_IMPORTED_MODULE_1__","jquery__WEBPACK_IMPORTED_MODULE_2__","owlCarousel","dots","nav","responsiveClass","responsive","0","items","421","769","1025","1365","click","next","slideDown","children","focus"],"mappings":"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","file":"1.1b83467a26b592bd6fa0.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","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","import './product.scss';\r\nimport { setupLayout } from '../Shared/layout';\r\nimport * as $ from 'jquery';\r\nimport 'owl.carousel/dist/owl.carousel';\r\n\r\nsetupLayout();\r\n\r\n$(\"#partsCarousel\").owlCarousel({\r\n dots: false,\r\n nav: true,\r\n responsiveClass: true,\r\n responsive: {\r\n 0: {\r\n items: 1\r\n },\r\n 421: {\r\n items: 2\r\n },\r\n 769: {\r\n items: 3\r\n },\r\n 1025: {\r\n items: 4\r\n },\r\n 1365: {\r\n items: 5\r\n }\r\n }\r\n});\r\n\r\n$(\"#searchMoreButton\").click(function () {\r\n var elem = $(this).next();\r\n elem.slideDown();\r\n setTimeout(function () {\r\n elem.children().focus();\r\n }, 1000)\r\n});\r\n\r\ndocument\r\n .querySelector(\".sidebarButton\")\r\n .addEventListener(\"click\", function () {\r\n document.querySelector(\".categoryBox\").classList.add(\"active\");\r\n document.querySelector(\".categoryBackgroundCover\").classList.add(\"active\");\r\n });\r\n\r\ndocument.querySelector(\".quitBtn\").addEventListener(\"click\", function () {\r\n document.querySelector(\".categoryBox\").classList.remove(\"active\");\r\n document.querySelector(\".categoryBackgroundCover\").classList.remove(\"active\");\r\n});\r\n\r\ndocument\r\n .querySelector(\".categoryBackgroundCover\")\r\n .addEventListener(\"click\", function () {\r\n document.querySelector(\".categoryBox\").classList.remove(\"active\");\r\n document.querySelector(\".categoryBackgroundCover\").classList.remove(\"active\");\r\n });\r\n\r\n"],"sourceRoot":""}