// Fallback functions for ad tracking - prevent errors if not defined if (typeof adTechTrackerInit !== 'function') { window.adTechTrackerInit = function() {}; } if (typeof tmfire !== 'function') { window.tmfire = function() {}; } $('.btn-to-top').css('bottom', '80px'); $(window).scroll(function() { var scroll = $(window).scrollTop(); if (scroll >= 500) { $('.btn-to-top').fadeIn(200); } else { $('.btn-to-top').fadeOut(200); } }); var language = "th"; var origin = window.location.origin; var urlAssets = origin + '/assets'; var salePageDomain = salepageModel.domain.domain; if(salePageDomain.includes('.local')){ urlAssets = 'http://assets.devgosalepage.local'; } $('body').append(''); $(document).ready(function() { $('.currency-format-2').each(function(index, item) { $(this).text(currency(language, formatNumber(item.innerText, 2))); }); }); var canTrackEvent = true; function setEventSocial(event, params={}){ var jsonData = JSON.parse(salepageModel.data); if (jsonData.facebook_pixel_type == 2) { let eventTime = Date.now(); salepageModel.social_code_track_man.forEach((element) => { if (element.social_code_type.name == "TrackMan") { var data = { "event_time": eventTime, "event_name": event } if (event == 'Purchase') { if (params.order_number) { var userData = $.cookie('user_data_' + params.order_number); userData = JSON.parse(userData); data['user_data'] = { "ph": userData.ph, "fn": userData.fn, "ct": userData.ct, "st": userData.st, "zp": userData.zp } } data['custom_data'] = { "currency": "thb", "value": params.purchase } } if (typeof tmfire === 'function') { tmfire(element.code, data); } } }); } else { if(salepageModel.social_code_facebook.length > 0){ if (jsonData.is_conversion_api_facebook) { let socialFacebook = salepageModel.social_code_facebook; // var endpoint = salepageModel.tenant_url+"/v1/salepage/social/trackfb"; var endpoint = 'https://qms-api.gosaasservices.app/api/v1/webhook/conversion'; if (salepageModel.tenant_url.includes('uatgosaasapi.co')) { endpoint = 'https://uat-qms-api.gosaasservices.app/api/v1/webhook/conversion'; } if (salepageModel.tenant_url.includes('devgosaasapi.co')) { endpoint = 'https://dev-qms-api.gosaasservices.app/api/v1/webhook/conversion'; } // event_id ตัวเดียวต่อ 1 event ใช้ร่วมทุก pixel เพราะ fbq ยิงไปทุก pixel ที่ init พร้อมกัน // (ต่างจาก ttq ที่ยิงแยก instance ได้ จึงสร้าง event_id ต่อ element) — Meta dedup ด้วยคู่ pixel_id + event_name + event_id let time = new Date(); var event_id = time.getTime().toString(); event_id += Math.floor(Math.random() * 100); socialFacebook.forEach((element) => { var params = { event_id: event_id, event_name: event, code: element.code, url: window.location.href, token: element.token, test_event_code: element.data ? JSON.parse(element.data).test_code : '' }; $.post(endpoint, params, function(response) { }); }); // ยิงฝั่ง browser คู่กันด้วย event_id เดียวกันให้ Meta dedup (เดิมสาขานี้ไม่ยิง fbq เลย) fbq('trackCustom', event, {}, {eventID: event_id}); } else { fbq('trackCustom', event); } } } if(salepageModel.social_code_line.length > 0 ){ let socialLine = salepageModel.social_code_line; socialLine.forEach((element) => { _lt('send', 'cv', {type: event},[element.code]); }); } } function setEventSocialTiktok(event){ var jsonData = JSON.parse(salepageModel.data); if (!canTrackEvent) { canTrackEvent = true; return; } if(salepageModel.social_code_tiktok.length > 0 ){ let socialTiktok = salepageModel.social_code_tiktok; var items = setItemsContent(); // var endpoint = salepageModel.tenant_url+"/v1/salepage/social/track"; var endpoint = 'https://qms-api.gosaasservices.app/api/v1/webhook/conversion-tiktok'; if (salepageModel.tenant_url.includes('uatgosaasapi.co')) { endpoint = 'https://uat-qms-api.gosaasservices.app/api/v1/webhook/conversion-tiktok'; } if (salepageModel.tenant_url.includes('devgosaasapi.co')) { endpoint = 'https://dev-qms-api.gosaasservices.app/api/v1/webhook/conversion-tiktok'; } socialTiktok.forEach((element, index) => { let time = new Date() var event_id = time.getTime().toString(); event_id += Math.floor(Math.random() * 100); event_id += index.toString(); if (jsonData.is_conversion_api_tiktok) { var params = { event_id: event_id, event_name: event, content_id: salepageModel.product_id, code: element.code, items: items, value: $('#order_total').val() ? $('#order_total').val() : salepageModel.product ? salepageModel.product.price : 0, url: window.location.href, token: element.token, test_event_code: element.data ? JSON.parse(element.data).test_code : '' }; $.post(endpoint, params, function(response) { }); } setTimeout(function() { if (['AddToCart', 'InitiateCheckout', 'PlaceAnOrder', 'ViewContent'].includes(event)) { if ($('#telephone').val()) { ttq.identify({ phone_number: $('#telephone').val().replace(/^0/,'+66'), }); } var trackData = { event_id: event_id, content_id: salepageModel.product_id, content_type: 'product', contents: items, quantity: 1, value: $('#order_total').val() ?? salepageModel.product.price, currency: 'THB' }; if (items.length) { if (items[0].content_id) { delete trackData.content_id; } if (items[0].quantity) { delete trackData.quantity; } if (items[0].content_type) { delete trackData.content_type; } } ttq.instance(element.code).track(event, trackData, {event_id: event_id}); } else { ttq.instance(element.code).track(event, { event_id: event_id }); } }, 1000); }); } } function setEventSocialConversion(params, items=[]){ const getEvent = { 1: 'Purchase', 2: 'CompleteRegistration' } if (!getEvent[salepageModel.salepage_type_id]) return; var jsonData = JSON.parse(salepageModel.data); var cookie = null; var cookieSalepagePurchase = null; if (params.order_number) { cookie = $.cookie('user_data_' + params.order_number); if (cookie) { cookie = JSON.parse(cookie); } cookieSalepagePurchase = $.cookie(`salepagePurchase-${params.order_number}`); if(cookieSalepagePurchase) return; $.cookie(`salepagePurchase-${params.order_number}`, true); } if (jsonData.facebook_pixel_type == 2) { if (salepageModel.salepage_type_id == 1) { setEventSocial(getEvent[salepageModel.salepage_type_id], params); } } else { if(salepageModel.social_code_facebook.length > 0 ){ var jsonData = JSON.parse(salepageModel.data); if (jsonData.is_conversion_api_facebook) { let socialFacebook = salepageModel.social_code_facebook; var endpoint = 'https://qms-api.gosaasservices.app/api/v1/webhook/conversion'; if (salepageModel.tenant_url.includes('uatgosaasapi.co')) { endpoint = 'https://uat-qms-api.gosaasservices.app/api/v1/webhook/conversion'; } if (salepageModel.tenant_url.includes('devgosaasapi.co')) { endpoint = 'https://dev-qms-api.gosaasservices.app/api/v1/webhook/conversion'; } // event_id ตัวเดียวต่อ 1 event ใช้ร่วมทุก pixel เพราะ fbq ยิงไปทุก pixel ที่ init พร้อมกัน // (ต่างจาก ttq ที่ยิงแยก instance ได้) — Meta dedup ด้วยคู่ pixel_id + event_name + event_id let time = new Date(); var event_id = time.getTime().toString(); event_id += Math.floor(Math.random() * 100); socialFacebook.forEach((element) => { var data = { event_id: event_id, event_name: getEvent[salepageModel.salepage_type_id], code: element.code, url: window.location.href, token: element.token, test_event_code: element.data ? JSON.parse(element.data).test_code : '' }; if (salepageModel.salepage_type_id == 1) { data.value = params.purchase ? params.purchase : 0; } $.post(endpoint, data, function(response) { }); }); // ยิงฝั่ง browser คู่กันด้วย event_id เดียวกัน — value ต้องตรงกับที่ส่งเข้า CAPI ด้านบน // (ใช้ fallback 0 แบบเดียวกัน) ไม่งั้น Meta จะได้ event คู่ที่มูลค่าไม่ตรงกัน setTimeout(function() { if (salepageModel.salepage_type_id == 1) { fbq('track', getEvent[salepageModel.salepage_type_id], {currency: "THB", value: params.purchase ? params.purchase : 0}, {eventID: event_id}); } else if (salepageModel.salepage_type_id == 2) { fbq('track', getEvent[salepageModel.salepage_type_id], {}, {eventID: event_id}); } }, 1000); } else { setTimeout(function() { if (salepageModel.salepage_type_id == 1) { fbq('track', getEvent[salepageModel.salepage_type_id], {currency: "THB", value: params.purchase}); } else if (salepageModel.salepage_type_id == 2) { fbq('track', getEvent[salepageModel.salepage_type_id]); } }, 1000); } } } if(salepageModel.social_code_tiktok.length > 0 ){ var jsonData = JSON.parse(salepageModel.data); let socialTiktok = salepageModel.social_code_tiktok; // var endpoint = salepageModel.tenant_url+"/v1/salepage/social/track"; var endpoint = 'https://qms-api.gosaasservices.app/api/v1/webhook/conversion-tiktok'; if (salepageModel.tenant_url.includes('uatgosaasapi.co')) { endpoint = 'https://uat-qms-api.gosaasservices.app/api/v1/webhook/conversion-tiktok'; } if (salepageModel.tenant_url.includes('devgosaasapi.co')) { endpoint = 'https://dev-qms-api.gosaasservices.app/api/v1/webhook/conversion-tiktok'; } socialTiktok.forEach((element, index) => { let time = new Date() var event_id = time.getTime().toString(); event_id += Math.floor(Math.random() * 100); event_id += index.toString(); if (jsonData.is_conversion_api_tiktok) { if (!items.length) { items.push({ id: salepageModel.product_id ? salepageModel.product_id : salepageModel.ref_code, ordered_quantity: 1, total: salepageModel.product ? salepageModel.product.price : 0, }); } items = items.map(({id,...rest}) => ({content_id:id,...rest})); var payload = { event_id: event_id, event_name: 'CompletePayment', telephone: cookie ? cookie.ph.replace(/^0/,'+66') : '', code: element.code, items: items, url: window.location.href, token: element.token, value: params.purchase ? params.purchase : 0, test_event_code: element.data ? JSON.parse(element.data).test_code : '' }; $.post(endpoint, payload, function(response) { }); } setTimeout(function() { var items = setItemsContent(); items = items.map(function(item) { delete item.content_type; delete item.currency; return item; }); ttq.identify({ phone_number: cookie ? cookie.ph.replace(/^0/,'+66') : '', }); ttq.instance(element.code).track('CompletePayment', { event_id: event_id, content_type: 'product', contents: items, value: params.purchase, currency: 'THB' }); }, 1000); }); } if(salepageModel.social_code_line.length > 0 ){ let socialLine = salepageModel.social_code_line; socialLine.forEach((element) => { _lt('send', 'cv', {type: 'Conversion'},[element.code]); }); } } function formatNumber(num, dialog) { var paramNumber = parseFloat(num); var decimal = (paramNumber - Math.floor(paramNumber)) !== 0 ? true : false; paramNumber = decimal ? paramNumber.toFixed(dialog) : paramNumber.toFixed(0); return paramNumber.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,') } function isFloat(n) { return Number(n) === n && n % 1 !== 0; } function currency(code, total) { let text = ''; switch (code) { case 'en': // English text = '$' + total; break; case 'vi': // Vietnam text = total + '₫'; break; case 'my': // Myanmar text = 'K' + total; break; case 'lo': // Lao text = total + '₭'; break; case 'km': // Cambodia text = total + '៛'; break; default: // 1 Thai text = total + ' ฿'; break; } return text; } function setItemsContent() { var items = []; if (!cartItem.length) { items.push({ id: salepageModel.product_id ? salepageModel.product_id : salepageModel.ref_code, ordered_quantity: 1, total: salepageModel.product ? salepageModel.product.price : 0, }); } else { cartItem.forEach((item) => { items.push({ content_id: item.id ? item.id : item.product_id, content_type: 'product', quantity: item.ordered_quantity, ordered_quantity: item.ordered_quantity, price: item.total, }); }); } items = items.map(({ordered_quantity,...rest}) => ({quantity:ordered_quantity,...rest})); items = items.map(({total,...rest}) => ({price:total,...rest})); items = items.map(({total, id, ...rest}) => { return rest; }); return items; } $(".btn-to-top").click(function(){ $("html, body").animate({ scrollTop: "0" }, 100); }); $('div.blur').click(function () { $(this).addClass('active'); }); $(function() { moment.locale('th', { months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split( '_' ), monthsShort: 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split( '_' ), monthsParseExact: true, weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), weekdaysParseExact: true, longDateFormat: { LT: 'H:mm', LTS: 'H:mm:ss', L: 'DD/MM/YYYY', LL: 'D MMMM YYYY', LLL: 'D MMMM YYYY เวลา H:mm', LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm', }, meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, isPM: function (input) { return input === 'หลังเที่ยง'; }, meridiem: function (hour, minute, isLower) { if (hour < 12) { return 'ก่อนเที่ยง'; } else { return 'หลังเที่ยง'; } }, calendar: { sameDay: '[วันนี้ เวลา] LT', nextDay: '[พรุ่งนี้ เวลา] LT', nextWeek: 'dddd[หน้า เวลา] LT', lastDay: '[เมื่อวานนี้ เวลา] LT', lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT', sameElse: 'L', }, relativeTime: { future: 'อีก %s', past: '%sที่แล้ว', s: 'ไม่กี่วินาที', ss: '%d วินาที', m: '1 นาที', mm: '%d นาที', h: '1 ชั่วโมง', hh: '%d ชั่วโมง', d: '1 วัน', dd: '%d วัน', w: '1 สัปดาห์', ww: '%d สัปดาห์', M: '1 เดือน', MM: '%d เดือน', y: '1 ปี', yy: '%d ปี', }, }); });