(function (){
'use strict';
var COOKIE_NAME='wc_facebook_signals_state';
var STATE_ACTIVE='active';
var STATE_HELD='held';
function setCookie(name, value, days){
var d=new Date();
d.setTime(d.getTime() + days * 86400000);
document.cookie =
name +
'=' +
encodeURIComponent(value) +
';expires=' +
d.toUTCString() +
';path=/;SameSite=Lax';
}
function getCookie(name){
var match=document.cookie.match(new RegExp('(?:^|;\\s*)' + name + '=([^;]*)')
);
return match ? decodeURIComponent(match[ 1 ]):null;
}
function updateState(state){
setCookie(COOKIE_NAME, state, 365);
var params=wc_facebook_signals_params;
return new Promise(function(resolve, reject){
var xhr=new XMLHttpRequest();
xhr.open('POST', params.ajax_url, true);
xhr.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded; charset=UTF-8'
);
xhr.onload=function (){
if(xhr.status >=200&&xhr.status < 300){
try {
var data=JSON.parse(xhr.responseText);
resolve(data);
} catch(e){
reject(e);
}}else{
reject(new Error('AJAX failed: ' + xhr.status) );
}};
xhr.onerror=function (){
reject(new Error('Network error') );
};
xhr.send('action=' +
encodeURIComponent(params.action) +
'&security=' +
encodeURIComponent(params.nonce) +
'&state=' +
encodeURIComponent(state)
);
});
}
function hold(){
return updateState(STATE_HELD);
}
function release(){
return updateState(STATE_ACTIVE).then(function(data){
if(window.FacebookSignals &&
window.FacebookSignals._held
){
return window.FacebookSignals.release().then(function (){
return data;
},
function (){
return data;
}
);
}
return data;
});
}
function getState(){
var val=getCookie(COOKIE_NAME);
if(val===null){
return null;
}
return val===STATE_ACTIVE ? STATE_ACTIVE:STATE_HELD;
}
window.fbwcsignal=window.fbwcsignal||{};
window.fbwcsignal.hold=hold;
window.fbwcsignal.release=release;
window.fbwcsignal.getState=getState;
})();
(function(){
'use strict';
var data=(typeof wc_facebook_pixel_data!=='undefined'&&wc_facebook_pixel_data) ?
wc_facebook_pixel_data :
{ eventQueue: [] };
window.wcFacebookPixelFiredEvents=window.wcFacebookPixelFiredEvents||{};
var firedEvents=window.wcFacebookPixelFiredEvents;
function isCachedPage(){
return window.__wc_fb_page_generated &&
(Math.floor(Date.now() / 1000) - window.__wc_fb_page_generated) > 1800;
}
function buildEventData(event){
return {
method: event.method||'track',
name: event.name,
params: event.params||{},
eventId: isCachedPage() ? null:(event.eventId||null)
};}
function shouldSkipEvent(eventId){
return eventId&&firedEvents[eventId];
}
function markEventFired(eventId){
if(eventId){
firedEvents[eventId]=true;
}}
function logWarning(message, data){
if(typeof console!=='undefined'&&console.warn){
console.warn('[FB Pixel]', message, data);
}}
function fireEvent(event){
var eventData=buildEventData(event);
if(shouldSkipEvent(eventData.eventId)){
return;
}
try {
var params=eventData.params;
if(window.FacebookSignals&&typeof window.FacebookSignals.trackEvent==='function'){
window.FacebookSignals.trackEvent(eventData.name, params, null, eventData.method, eventData.eventId);
}else{
if(typeof fbq!=='function'){
logWarning('fbq not available, skipping event:', eventData.name);
return;
}
if(eventData.eventId){
fbq(eventData.method, eventData.name, params, {eventID: eventData.eventId});
}else{
fbq(eventData.method, eventData.name, params);
}}
markEventFired(eventData.eventId);
} catch (e){
logWarning('Event error: ' + eventData.name, e);
}}
function fireQueuedEvents(){
var events=data.eventQueue;
if(!events||!Array.isArray(events)){
return;
}
for (var i=0; i < events.length; i++){
try {
fireEvent(events[i]);
} catch (e){
logWarning('fireQueuedEvents loop error:', e);
}}
data.eventQueue=[];
}
function processStoreApiEvent(eventData){
if(!eventData||!eventData.event){
return;
}
var params=eventData.params||{};
var event={
method: 'track',
name: eventData.event,
params: params,
eventId: params.event_id||null
};
fireEvent(event);
}
function getRequestUrl(input){
if(typeof input==='string'){
return input;
}
if(input&&typeof input.url==='string'){
return input.url;
}
return '';
}
function isStoreApiAddItemRequest(url){
return typeof url==='string' &&
(url.indexOf('/wc/store/v1/cart/add-item')!==-1 ||
url.indexOf('/wc/store/cart/add-item')!==-1);
}
function isStoreApiBatchRequest(url){
return typeof url==='string' &&
(url.indexOf('/wc/store/v1/batch')!==-1 ||
url.indexOf('/wc/store/batch')!==-1);
}
function processStoreApiResponseData(responseData){
if(!responseData||typeof responseData!=='object'){
return;
}
if(responseData.extensions&&responseData.extensions['facebook-for-woocommerce']){
processStoreApiEvent(responseData.extensions['facebook-for-woocommerce']);
}else if(Array.isArray(responseData.responses)){
for (var i=0; i < responseData.responses.length; i++){
var item=responseData.responses[i];
if(item&&item.body&&item.body.extensions&&item.body.extensions['facebook-for-woocommerce'] &&
item.status >=200&&item.status < 300){
processStoreApiEvent(item.body.extensions['facebook-for-woocommerce']);
}}
}}
function setupFetchInterceptor(){
var originalFetch=window.fetch;
if(!originalFetch){
return;
}
window.fetch=function(){
var args=arguments;
var url=getRequestUrl(args[0]);
var isAddToCartRequest=isStoreApiAddItemRequest(url);
var isBatchRequest=isStoreApiBatchRequest(url);
return originalFetch.apply(this, args).then(function(response){
if((isAddToCartRequest||isBatchRequest)&&response.ok){
response.clone().json().then(function(responseData){
processStoreApiResponseData(responseData);
}).catch(function(e){
logWarning('Store API JSON parse error:', e);
});
}
return response;
});
};}
function init(){
setupFetchInterceptor();
if(typeof fbq==='function'){
fireQueuedEvents();
return;
}
var _fbq=window.fbq;
Object.defineProperty(window, 'fbq', {
configurable: true,
enumerable: true,
get: function(){ return _fbq; },
set: function(value){
_fbq=value;
if(typeof value==='function'){
Object.defineProperty(window, 'fbq', {
configurable: true,
enumerable: true,
writable: true,
value: value
});
setTimeout(fireQueuedEvents, 0);
}}
});
}
if(document.readyState==='complete'){
init();
}else{
window.addEventListener('load', init);
}})();