{"version":3,"sources":["webpack:///./src/appConfig.ts","webpack:///./src/module/session-record.ts","webpack:///./Web/LandingPage/landing-page.ts","webpack:///./Web/Shared/Component/EnquiryForm/enquiry-form.ts","webpack:///./src/module/form.ts"],"names":["appConfig","JSON","parse","document","getElementById","value","sessionRecordId","script","Course","location","host","startsWith","createElement","type","textContent","getElementsByTagName","appendChild","setTimeout","handleScroll","window","removeEventListener","gtag","send_to","googleAnalyticsId","event_category","googleAnalytics4Id","fbq","addEventListener","Array","from","querySelectorAll","href","EnquiryFormType","setupEnquiryForm","elementId","beforeSend","querySelector","style","display","error","errorText","console","log","processing","success","reset","event_label","finally","ajaxForm","config","combineToFormData","e","preventDefault","formElement","target","xhr","XMLHttpRequest","readyState","status","responseText","onprogress","event","Math","round","loaded","total","toFixed","open","action","formData","FormData","length","forEach","obj","Object","keys","key","append","send"],"mappings":"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","file":"20.a4820a46ce146f5c6b35.bundle.js","sourcesContent":["export const appConfig: {\r\n facebookAppId: string;\r\n facebookPixelId: string;\r\n googleAnalyticsId: string;\r\n googleAnalytics4Id: string;\r\n sessionRecordId: string;\r\n googleAdsId: string;\r\n googleMapApiKey: string;\r\n googleMapStyles: any[];\r\n addThisId: string;\r\n} = {\r\n ...JSON.parse((document.getElementById('inputHiddenForAppConfig') as HTMLInputElement).value)\r\n}\r\n\r\n","export function setupSessionRecord(sessionRecordId: string) {\r\n let script = document.createElement('script') as HTMLScriptElement;\r\n script.type = 'text/javascript';\r\n script.textContent = `\r\n(function() {\r\nwindow.__insp = window.__insp || [];\r\n__insp.push(['wid', ${sessionRecordId}]);\r\nvar ldinsp = function(){\r\nif(typeof window.__inspld != \"undefined\") return; window.__inspld = 1; var insp = document.createElement('script'); insp.type = 'text/javascript'; insp.async = true; insp.id = \"inspsync\"; insp.src = ('https:' == document.location.protocol ? 'https' : 'http') + '://cdn.inspectlet.com/inspectlet.js?wid=${sessionRecordId}&r=' + Math.floor(new Date().getTime()/3600000); var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(insp, x); };\r\nsetTimeout(ldinsp, 0);\r\n})();\r\n`;\r\n document.getElementsByTagName('body')[0].appendChild(script);\r\n}","import './landing-page.scss';\r\n//import { setupGA } from '../../src/module/google-analytics';\r\nimport { appConfig } from '../../src/appConfig';\r\n//import { setupPixel } from '../../src/module/facebook-pixel';\r\n//import * as $ from 'jquery';\r\nimport { setupEnquiryForm, EnquiryFormType } from '../Shared/Component/EnquiryForm/enquiry-form';\r\nimport { setupSessionRecord } from '../../src/module/session-record';\r\n\r\n//setupGA(appConfig.googleAnalyticsId, {\r\n// Id: appConfig.googleAdsId,\r\n// convertor: {\r\n// 'landingPageForm': 'KeGoCO2l7tIBEKWb9voC'\r\n// }\r\n//});\r\n//setupPixel(appConfig.facebookPixelId);\r\nsetupEnquiryForm(EnquiryFormType.Course);\r\n\r\nif (location.host.startsWith('192.168') || location.host.startsWith('localhost')) {\r\n // skip\r\n}\r\nelse {\r\n setupSessionRecord(appConfig.sessionRecordId);\r\n}\r\n\r\n// 10 秒后 scroll 就不算 bounce rate\r\nsetTimeout(() => {\r\n const handleScroll = () => {\r\n window.removeEventListener('scroll', handleScroll);\r\n gtag('event', 'scroll', {\r\n send_to: appConfig.googleAnalyticsId,\r\n event_category: 'engagement'\r\n });\r\n gtag('event', 'scroll', {\r\n send_to: appConfig.googleAnalytics4Id\r\n });\r\n fbq('trackCustom', 'scroll');\r\n }\r\n window.addEventListener('scroll', handleScroll);\r\n}, 10000);\r\n\r\n// ga tracking\r\nconst links = Array.from(document.querySelectorAll('a'));\r\nfor (const link of links) {\r\n if (link.href.startsWith('https://api.whatsapp.com')) {\r\n link.addEventListener('click', () => {\r\n gtag('event', 'whatsapp', {\r\n send_to: appConfig.googleAnalyticsId,\r\n event_category: 'engagement'\r\n });\r\n gtag('event', 'generate_lead', {\r\n send_to: appConfig.googleAnalytics4Id\r\n });\r\n gtag('event', 'whatsapp', {\r\n send_to: appConfig.googleAnalytics4Id\r\n });\r\n fbq('track', 'Contact');\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n//document.querySelector('#js-introductionVideoLink').addEventListener('click', () => {\r\n// gtag('event', 'play_video', {\r\n// send_to: appConfig.googleAnalyticsId,\r\n// event_category: 'engagement',\r\n// event_label: 'Introduction'\r\n// });\r\n\r\n// // note 解忧: ga4 video 会自动 track 的, 如果确定它会自动 track 这里就可以洗掉了\r\n// gtag('event', 'play_video', {\r\n// send_to: appConfig.googleAnalytics4Id,\r\n// name: 'Introduction'\r\n// });\r\n\r\n// // TODO now\r\n// // note 解忧: fb 就不 track 了, 感觉没有合适的 event 也不太重要\r\n//});\r\n\r\n\r\n\r\n\r\n//$(document).ready(function () {\r\n// const postData = {\r\n// action: 'newEnquiry',\r\n// module: 'simtrain',\r\n// uid: 'dev',\r\n// token: '78723jk12b413jkb4133129u312',\r\n// // date: '2018-01-01',\r\n// parentName: '',\r\n// // parentIC: '871215-23-9999',\r\n// parentHP: '',\r\n// // parentEmail: 'dev5@simitgroup.com',\r\n// // parentOccupation: 'software Engineer',\r\n// studentName: '-',\r\n// // studentDOB: '2017-01-01',\r\n// // studentGender: 'Male',\r\n// // studentRaces: 'Chinese',\r\n// // studentReligion: 'Buddism',\r\n// // studentSchool: 'SEK.MEN.MOUNT AUSTIN',\r\n// // houseName: 'House',\r\n// // houseStreet1: '11, Jalan Molek 1/5B',\r\n// // houseStreet2: 'Taman Molet',\r\n// // houseStreet3: '81100 Johor Bahru',\r\n// // houseStreet4: 'Johor',\r\n// // housePostcode: '81100',\r\n// // houseCity: 'Taman Molek',\r\n// attendBefore: 'N',\r\n// // attendPlace: 'School 1',\r\n// branchCode: '',\r\n// knowUsFromCode: 'Facebook',\r\n// remark: ''\r\n// }\r\n\r\n// $(\"form button\").click(function () {\r\n// var name = $(\"#name\").val();\r\n// var hp = $(\"#hp\").val();\r\n// var location = $(\"#location\").val();\r\n// var message = $(\"#message\").val();\r\n\r\n// if (name != \"\" && hp != \"\" && location != \"\" && message != \"\") {\r\n// jQuery('.myFormDefault').hide();\r\n// jQuery('.myFormLoading').show();\r\n\r\n// postData.parentName = name;\r\n// postData.parentHP = hp;\r\n// postData.branchCode = location;\r\n// postData.remark = message;\r\n\r\n// $.ajax({\r\n// cache: false,\r\n// //url: 'https://portal.klceducation.asia/d/klcdev/api.php',\r\n// //url: 'https://portal.klceducation.asia/s/klc/api.php',\r\n// //url: 'https://languagecentre.klceducation.asia/landing-page/enquiry',\r\n// url: 'http://192.168.1.152:61547/landing-page/enquiry',\r\n// dataType: 'json',\r\n// type: 'POST',\r\n// data: postData,\r\n// async: 1,\r\n// success: (json) => {\r\n// if (json.status == \"OK\") {\r\n// jQuery('.myFormLoading').hide();\r\n// jQuery('.myFormError').hide();\r\n// jQuery('.myFormSuccess').show();\r\n// jQuery('input,textarea,select').val('');\r\n// gtag_formSubmitted2(location);\r\n// }\r\n// else if (json.status == \"Failed\") {\r\n// alert(\"Failed, please resubmit or refresh.\")\r\n// jQuery('.myFormLoading').hide();\r\n// jQuery('.myFormError').show();\r\n// }\r\n// }\r\n// });\r\n// }\r\n// })\r\n\r\n// $('form').ajaxForm();\r\n\r\n// var scrolled = false;\r\n// $(window).scroll(function () {\r\n// if (!scrolled) {\r\n// scrollDimension();\r\n// scrolled = true;\r\n// }\r\n// });\r\n\r\n//});\r\n","import { ajaxForm } from \"../../../../src/module/form\";\r\nimport { appConfig } from '../../../../src/appConfig';\r\n\r\ndeclare let fbq: (...args: any[]) => void\r\n\r\nexport enum EnquiryFormType {\r\n General = 'General',\r\n Course = 'Course',\r\n Franchise = 'Franchise',\r\n Camp = 'Camp'\r\n}\r\n\r\nexport function setupEnquiryForm(type: EnquiryFormType) {\r\n const elementId = 'enquiryForm';\r\n\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 document.querySelector(`#${elementId} .buttonError`).style.display = 'none';\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 gtag('event', 'enquiry', {\r\n send_to: appConfig.googleAnalyticsId,\r\n event_category: 'engagement',\r\n event_label: type\r\n });\r\n gtag('event', 'generate_lead', {\r\n send_to: appConfig.googleAnalytics4Id\r\n });\r\n gtag('event', 'enquiry', {\r\n send_to: appConfig.googleAnalytics4Id,\r\n type\r\n });\r\n fbq('trackCustom', `${type}Enquiry`);\r\n },\r\n finally: () => {\r\n //finish all job\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"],"sourceRoot":""}