Deprecated: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in /home/go529591/public_html/wp-content/plugins/obs-geniki-taxidromiki/obs-geniki-taxidromiki.php on line 55
Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the obs-geniki-taxidromiki domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/go529591/public_html/wp-includes/functions.php on line 6131
Warning: Cannot modify header information - headers already sent by (output started at /home/go529591/public_html/wp-content/plugins/obs-geniki-taxidromiki/obs-geniki-taxidromiki.php:55) in /home/go529591/public_html/wp-content/plugins/wp-fastest-cache/wpFastestCache.php on line 299
// source --> https://www.golden-a.gr/wp-content/plugins/pixelyoursite-pro/dist/scripts/public.js?ver=12.4.1.1
/* global pysOptions */
! function ($, options) {
if (options.debug) {
console.log('PYS:', options);
}
var uniqueId = {};
var firstVisit = false;
var isTrackEventForGA = [];
var isAdsLoad = false;
let gtm_variables = {};
let gtm_datalayername = "dynamicVariable";
var domain = '';
if(options.hasOwnProperty("track_cookie_for_subdomains") && options.track_cookie_for_subdomains) {
domain = getRootDomain(true);
}
/**
* Resolve parameter value based on mode (static or dynamic)
*
* @param {Object|string} param - Parameter object with { value, selector } or string value
* @returns {string|null} - Resolved value
*/
function resolveParamValue(param, key = '') {
// 1️⃣ null / undefined - skip this parameter
if (param === null || param === undefined) {
return null;
}
// 2️⃣ primitive
if (typeof param !== 'object') {
return param;
}
// 3️⃣ array
if (Array.isArray(param)) {
return param.map(item => resolveParamValue(item, key));
}
// 4️⃣ NEW FORMAT OBJECT (config-object)
const isConfigObject =
('value' in param || 'selector' in param || 'dynamic' in param || 'input_type' in param) &&
Object.keys(param).every(k =>
['value','selector','dynamic','input_type','name'].includes(k)
);
if (isConfigObject) {
// STATIC MODE
const isStatic =
!param.dynamic ||
!param.selector ||
param.selector.trim() === '';
if (isStatic) {
let value = param.value ?? null;
if (param.input_type === "float" || param.input_type === "int") {
value = extractNumericValue(
value,
param.input_type === "int"
);
}
return value;
}
// DYNAMIC MODE
try {
const el = document.querySelector(param.selector);
if (!el) return null;
let value =
el.value ??
el.innerText ??
el.textContent ??
el.getAttribute("content") ??
el.getAttribute("data-value") ??
null;
if (param.input_type === "float" || param.input_type === "int") {
value = extractNumericValue(
value,
param.input_type === "int"
);
}
return value;
} catch {
return null;
}
}
// 5️⃣ Plain object (recursive traversal) - filter out null/undefined values
return Object.fromEntries(
Object.entries(param)
.map(([k, v]) => [k, resolveParamValue(v, k)])
.filter(([k, v]) => v !== null && v !== undefined)
);
}
function extractNumericValue(value, isInt=false) {
if (value === null || value === undefined) {
return null;
}
if (isInt) {
return parseInt(value);
}
return parseFloat(value);
}
var loadTags = [];
var dummyPinterest = function () {
/**
* Public API
*/
return {
tag: function() {
return "pinterest";
},
isEnabled: function () {},
disable: function () {},
loadPixel: function () {},
fireEvent: function (name, data) {
return false;
},
onAdSenseEvent: function (event) {},
onClickEvent: function (params) {},
onWatchVideo: function (params) {},
onCommentEvent: function (event) {},
onFormEvent: function (params) {},
onDownloadEvent: function (params) {},
onWooAddToCartOnButtonEvent: function (product_id) {},
onWooAddToCartOnSingleEvent: function (product_id, qty, product_type, is_external, $form) {},
onWooRemoveFromCartEvent: function (cart_item_hash) {},
onWooAffiliateEvent: function (product_id) {},
onWooPayPalEvent: function (event) {},
onEddAddToCartOnButtonEvent: function (download_id, price_index, qty) {},
onEddRemoveFromCartEvent: function (item) {},
onPageScroll: function (event) {},
onTime: function (event) {
},
}
}();
var dummyBing = function () {
/**
* Public API
*/
return {
tag: function() {
return "bing";
},
isEnabled: function () {},
disable: function () {},
loadPixel: function () {},
fireEvent: function (name, data) {
return false;
},
onAdSenseEvent: function (event) {},
onClickEvent: function (params) {},
onWatchVideo: function (params) {},
onCommentEvent: function (event) {},
onFormEvent: function (params) {},
onDownloadEvent: function (params) {},
onWooAddToCartOnButtonEvent: function (product_id) {},
onWooAddToCartOnSingleEvent: function (product_id, qty, product_type, is_external, $form) {},
onWooRemoveFromCartEvent: function (cart_item_hash) {},
onWooAffiliateEvent: function (product_id) {},
onWooPayPalEvent: function (event) {},
onEddAddToCartOnButtonEvent: function (download_id, price_index, qty) {},
onEddRemoveFromCartEvent: function (item) {},
onPageScroll: function (event) {},
onTime: function (event) {
},
}
}();
var dummyReddit = function () {
/**
* Public API
*/
return {
tag: function () {
return "reddit";
},
isEnabled: function () {
},
disable: function () {
},
loadPixel: function () {
},
fireEvent: function ( name, data ) {
return false;
},
onAdSenseEvent: function ( event ) {
},
onClickEvent: function ( params ) {
},
onWatchVideo: function ( params ) {
},
onCommentEvent: function ( event ) {
},
onFormEvent: function ( params ) {
},
onDownloadEvent: function ( params ) {
},
onWooAddToCartOnButtonEvent: function ( product_id ) {
},
onWooAddToCartOnSingleEvent: function ( product_id, qty, product_type, is_external, $form ) {
},
onWooRemoveFromCartEvent: function ( cart_item_hash ) {
},
onWooAffiliateEvent: function ( product_id ) {
},
onWooPayPalEvent: function ( event ) {
},
onEddAddToCartOnButtonEvent: function ( download_id, price_index, qty ) {
},
onEddRemoveFromCartEvent: function ( item ) {
},
onPageScroll: function ( event ) {
},
onTime: function ( event ) {
},
}
}();
var Utils = function (options) {
var Pinterest = dummyPinterest;
var Bing = dummyBing;
var Reddit = dummyReddit;
var gtag_loaded = false;
var gtm_loaded = false;
let isNewSession = checkSession();
let dataLayerName = 'dataLayerPYS';
let GTMdataLayerName = 'dataLayer';
function loadPixels() {
if (!options.gdpr.all_disabled_by_api) {
if (!options.gdpr.tiktok_disabled_by_api) {
TikTok.loadPixel();
}
if (!options.gdpr.facebook_disabled_by_api) {
Facebook.loadPixel();
}
if (!options.gdpr.analytics_disabled_by_api) {
Analytics.loadPixel();
}
if (!options.gdpr.google_ads_disabled_by_api) {
GAds.loadPixel();
}
if (!options.gdpr.analytics_disabled_by_api) {
GTM.loadPixel();
}
if (!options.gdpr.pinterest_disabled_by_api) {
Pinterest.loadPixel();
}
if (!options.gdpr.bing_disabled_by_api) {
Bing.loadPixel();
}
if (!options.gdpr.reddit_disabled_by_api) {
Reddit.loadPixel();
}
}
if (options.gdpr.consent_magic_integration_enabled && typeof CS_Data !== "undefined") {
if (typeof CS_Data.cs_google_analytics_consent_mode !== "undefined" && CS_Data.cs_google_analytics_consent_mode == 1) {
Analytics.loadPixel();
}
if (typeof CS_Data.cs_google_ads_consent_mode !== "undefined" && CS_Data.cs_google_ads_consent_mode == 1 ) {
GAds.loadPixel();
}
}
}
/**
* WATCHVIDEO UTILS
*/
function isJSApiAttrEnabled(url) {
return url.indexOf('enablejsapi') > -1;
}
function isOriginAttrEnabled(url) {
return url.indexOf('origin') > -1;
}
// Returns key/value pairs of percentages: number of seconds to achieve
function getVideoCompletionMarks(duration) {
var marks = {};
var points = [0, 10, 50, 90, 100];
for (var i = 0; i < points.length; i++) {
var _point = points[i];
var _mark = _point + '%';
var _time = duration * _point / 100;
if (_point === 100) {
_time = _time - 1;
}
// 10% => 123
marks[_mark] = Math.floor(_time);
}
return marks;
}
// Determine if the element is a YouTube video or not
function tagIsYouTubeVideo(tag) {
var src = tag.src || '';
return src.indexOf('youtube.com/embed/') > -1 || src.indexOf('youtube.com/v/') > -1;
}
function tagIsYouTubeAsyncVideo(tag) {
if(tag.src && tag.src.indexOf("data:image") !== -1) return false; // video is loaded
var keys = Object.keys(tag.dataset);
for(var i = 0;i -1) {
var src = tag.dataset[keys[i]];
return src.indexOf('youtube.com/embed/') > -1 || src.indexOf('youtube.com/v/') > -1;
}
}
return false; //not find src
}
// Turn embed objects into iframe objects and ensure they have the right parameters
function normalizeYouTubeIframe(tag) {
var loc = window.location;
var a = document.createElement('a');
a.href = tag.src;
a.hostname = 'www.youtube.com';
a.protocol = loc.protocol;
var tmpPathname = a.pathname.charAt(0) === '/' ? a.pathname : '/' + a.pathname; // IE10 shim
if (!isJSApiAttrEnabled(a.search)) {
a.search = (a.search.length > 0 ? a.search + '&' : '') + 'enablejsapi=1';
}
// for security reasons, YouTube wants an origin parameter set that matches our hostname
if (!isOriginAttrEnabled(a.search) && loc.hostname.indexOf('localhost') === -1) {
var port = loc.port ? ':' + loc.port : '';
var origin = loc.protocol + '%2F%2F' + loc.hostname + port;
a.search = a.search + '&origin=' + origin;
}
if (tag.type === 'application/x-shockwave-flash') {
var newIframe = document.createElement('iframe');
newIframe.height = tag.height;
newIframe.width = tag.width;
tmpPathname = tmpPathname.replace('/v/', '/embed/');
tag.parentNode.parentNode.replaceChild(newIframe, tag.parentNode);
tag = newIframe;
}
a.pathname = tmpPathname;
if (tag.src !== a.href + a.hash) {
tag.src = a.href + a.hash;
}
return tag;
}
// Add event handlers for events emitted by the YouTube API
function addYouTubeEvents(iframe) {
var player = YT.get(iframe.id);
if (!player) {
player = new YT.Player(iframe, {});
}
if (typeof iframe.pauseFlag === 'undefined') {
iframe.pauseFlag = false;
player.addEventListener('onStateChange', function (evt) {
onYouTubePlayerStateChange(evt, iframe);
});
}
}
function addDynYouTubeVideos(el) {
// We only bind to iFrames with a YouTube URL with the enablejsapi=1 and
// origin=<> parameters
if (el.tagName === 'IFRAME'
&& tagIsYouTubeVideo(el)
&& isJSApiAttrEnabled(el.src)
&& isOriginAttrEnabled(el.src))
{
addYouTubeEvents(el);
}
}
// Event handler for events emitted from the YouTube API
function onYouTubePlayerStateChange(evt, iframe) {
var stateIndex = evt.data;
var player = evt.target;
var targetVideoUrl = player.getVideoUrl();
var targetVideoId = targetVideoUrl.match(/[?&]v=([^]*)/)[1]; // Extract the ID
var playerState = player.getPlayerState();
var marks = getVideoCompletionMarks(player.getDuration());
iframe.playTracker = iframe.playTracker || {};
if (playerState === YT.PlayerState.PLAYING && !iframe.timer) {
clearInterval(iframe.timer);
// check every second to see if we've hit any of our percentage viewed marks
iframe.timer = setInterval(function () {
checkYouTubeCompletion(player, marks, iframe.videoId);
}, 1000);
} else {
clearInterval(iframe.timer);
iframe.timer = false;
}
// playlist edge-case handler
if (stateIndex === YT.PlayerState.PLAYING) {
iframe.playTracker[targetVideoId] = true;
iframe.videoId = targetVideoId;
iframe.pauseFlag = false;
}
if (!iframe.playTracker[iframe.videoId]) {
return false; // this video hasn't started yet, so this is spam
}
if (stateIndex === YT.PlayerState.PAUSED) {
if (!iframe.pauseFlag) {
iframe.pauseFlag = true;
} else {
return false; // we don't want to fire consecutive pause events
}
}
}
// Trigger event if YouTube video mark was reached
function checkYouTubeCompletion(player, marks, videoId) {
var currentTime = player.getCurrentTime();
player[videoId] = player[videoId] || {};
for (var key in marks) {
if (marks[key] <= currentTime && !player[videoId][key]) {
player[videoId][key] = true;
var data = player.getVideoData();
if (key === '0%') {
key = 'play';
}
var params = {
video_type: 'youtube',
video_id: videoId,
video_title: data.title,
};
let disable_watch_video = [];
//Custom
if ( options.triggerEventTypes.hasOwnProperty( "video_view" ) ) {
Object.entries( options.triggerEventTypes.video_view ).forEach( function ( [ trigger_id, triggers ] ) {
triggers.forEach( function ( trigger ) {
if ( trigger.type === 'youtube' && trigger.rule === videoId ) {
let pixels = Object.keys( options.triggerEvents[ trigger_id ] );
for ( let i = 0; i < pixels.length; i++ ) {
let event = Utils.clone( options.triggerEvents[ trigger_id ][ pixels[ i ] ] );
if ( trigger.disable_watch_video ) {
disable_watch_video.push( pixels[ i ] );
}
if ( currentTime >= marks[ trigger.value ] ) {
if (pixels[i] !== 'reddit') {
event.params["progress"] = key;
Utils.copyProperties( params, event.params );
}
if ( event.fired !== true ) {
if ( Utils.isEventInTimeWindow( event.name, event, 'dyn_' + pixels[ i ] + '_' + trigger_id ) ) {
event = Utils.getFormFilledData( event );
getPixelBySlag( pixels[ i ] ).fireEvent( event.name, event );
options.triggerEvents[ trigger_id ][ pixels[ i ] ].fired = true;
}
}
}
}
}
} )
} )
}
// Auto
if( options.automatic.enable_video
&& options.automatic.enable_youtube
&& options.dynamicEvents.hasOwnProperty("automatic_event_video")
) {
var pixels = Object.keys(options.dynamicEvents.automatic_event_video);
for (var i = 0; i < pixels.length; i++) {
if ( disable_watch_video.includes( pixels[ i ] ) ) {
continue;
}
var event = Utils.clone(options.dynamicEvents.automatic_event_video[pixels[i]]);
if ( pixels[ i ] !== 'reddit' ) {
event.params[ "progress" ] = key;
Utils.copyProperties(params, event.params)
}
if ( pixels[i] === 'tiktok' || pixels[i] === 'reddit' ) {
var time_trigger = event.automatic_event_video_trigger;
if ( currentTime >= marks[time_trigger] && event.fired !== true ) {
getPixelBySlag(pixels[i]).onWatchVideo(event);
//tiktok and reddit watch video fire once
options.dynamicEvents.automatic_event_video[pixels[i]].fired = true;
}
} else {
Utils.copyProperties(Utils.getRequestParams(), event.params);
getPixelBySlag(pixels[i]).onWatchVideo(event);
}
}
}
if(key == "play") {
$.each(options.triggerEventTypes, function (triggerType, events) {
$.each(events, function (eventId, triggers) {
switch (triggerType) {
case 'video_play':
Utils.fireTriggerEvent(eventId);
break;
}
});
});
}
}
}
}
// Determine if the element is a Vimeo video or not
function tagIsVimeoVideo(tag) {
var src = tag.src || '';
return src.indexOf('player.vimeo.com/video/') > -1;
}
function tagIsAsincVimeoVideo(tag) {
if(tag.src) return false; // video is loaded
var keys = Object.keys(tag.dataset);
for(var i = 0;i -1) {
var src = tag.dataset[keys[i]];
return src.indexOf('player.vimeo.com/video/') > -1;
}
}
return false; //not find src
}
function attachVimeoPlayerToTag(tag) {
var player = new Vimeo.Player(tag);
player.getDuration().then(function (pl,seconds) {
pl.pysMarks = getVideoCompletionMarks(seconds);
}.bind(null,player));
player.getVideoTitle().then(function (pl,title) {
pl.pysVideoTitle = title;
}.bind(null,player));
player.getVideoId().then(function (pl,id) {
pl.pysVideoId = id;
}.bind(null,player));
player.pysCompletedMarks = {};
player.on('play', function () {
if (this.pysTimer) {
return;
}
clearInterval(this.pysTimer);
var player = this;
this.pysTimer = setInterval(function () {
checkVimeoCompletion(player);
}, 1000);
});
player.on('pause', function () {
clearInterval(this.pysTimer);
this.pysTimer = false;
});
player.on('ended', function () {
clearInterval(this.pysTimer);
this.pysTimer = false;
});
}
// Trigger event if Vimeo video mark was reached
function checkVimeoCompletion(player) {
player.getCurrentTime().then(function (seconds) {
for (var key in player.pysMarks) {
if (player.pysMarks[key] <= seconds && !player.pysCompletedMarks[key]) {
player.pysCompletedMarks[key] = true;
if (key === '0%') {
key = 'play';
}
var params = {
video_type: 'vimeo',
video_id: player.pysVideoId,
video_title: player.pysVideoTitle,
};
let disable_watch_video = [];
//Custom
if ( options.triggerEventTypes.hasOwnProperty( "video_view" ) ) {
Object.entries( options.triggerEventTypes.video_view ).forEach( function ( [ trigger_id, triggers ] ) {
triggers.forEach( function ( trigger ) {
if ( trigger.type === 'vimeo' && trigger.rule == player.pysVideoId ) {
let pixels = Object.keys( options.triggerEvents[ trigger_id ] );
for ( let i = 0; i < pixels.length; i++ ) {
let event = Utils.clone( options.triggerEvents[ trigger_id ][ pixels[ i ] ] );
if ( trigger.disable_watch_video ) {
disable_watch_video.push( pixels[ i ] );
}
if ( seconds >= player.pysMarks[ trigger.value ] ) {
if ( pixels[ i ] !== 'reddit' ) {
event.params[ "progress" ] = key;
Utils.copyProperties( params, event.params );
}
if ( event.fired !== true ) {
if ( Utils.isEventInTimeWindow( event.name, event, 'dyn_' + pixels[ i ] + '_' + trigger_id ) ) {
event = Utils.getFormFilledData( event );
getPixelBySlag( pixels[ i ] ).fireEvent( event.name, event );
options.triggerEvents[ trigger_id ][ pixels[ i ] ].fired = true;
}
}
}
}
}
} )
} )
}
// Auto
if(options.automatic.enable_video
&& options.automatic.enable_vimeo
&& options.dynamicEvents.hasOwnProperty("automatic_event_video")
) {
var pixels = Object.keys(options.dynamicEvents.automatic_event_video);
for (var i = 0; i < pixels.length; i++) {
if ( disable_watch_video.includes( pixels[ i ] ) ) {
continue;
}
var event = Utils.clone(options.dynamicEvents.automatic_event_video[pixels[i]]);
if ( pixels[i] !== 'reddit' ) {
event.params["progress"] = key;
Utils.copyProperties(params, event.params);
}
if ( pixels[i] === 'tiktok' || pixels[i] === 'reddit' ) {
var time_trigger = event.automatic_event_video_trigger;
if ( seconds >= player.pysMarks[time_trigger] && event.fired !== true ) {
getPixelBySlag(pixels[i]).onWatchVideo(event);
//tiktok and reddit watch video fire once
options.dynamicEvents.automatic_event_video[pixels[i]].fired = true;
}
} else {
Utils.copyProperties(Utils.getRequestParams(), event.params);
getPixelBySlag(pixels[i]).onWatchVideo(event);
}
}
}
if(key == "play") {
$.each(options.triggerEventTypes, function (triggerType, events) {
$.each(events, function (eventId, triggers) {
switch (triggerType) {
case 'video_play':
Utils.fireTriggerEvent(eventId);
break;
}
});
});
}
}
}
});
}
/**
* COOKIES UTILS
*/
var utmTerms = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content' ,'utm_term'];
var utmId = ['fbadid', 'gadid', 'padid', 'bingid'];
var requestParams = [];
function getDomain(url) {
url = url.replace(/(https?:\/\/)?(www.)?/i, '');
if (url.indexOf('/') !== -1) {
return url.split('/')[0];
}
return url;
}
function checkSession() {
if( Cookies.get('pys_start_session') === undefined ||
Cookies.get('pys_session_limit') === undefined) {
firstVisit = true;
return true
}
return false
}
function getTrafficSource() {
try {
let referrer = document.referrer.toString(),
source;
let direct = referrer.length === 0;
let internal = direct ? false : referrer.indexOf(options.siteUrl) === 0;
let external = !direct && !internal;
if (external === false) {
source = 'direct';
} else {
source = referrer;
}
if (source !== 'direct') {
// leave only domain (Issue #70)
return getDomain(source);
} else {
return source;
}
} catch (e) {
console.error(e);
return 'direct';
}
}
/**
* Return query variables object with where property name is query variable
* and property value is query variable value.
*/
function getQueryVars() {
try {
var result = {},
tmp = [];
window.location.search
.substr(1)
.split("&")
.forEach(function (item) {
tmp = item.split('=');
if (tmp.length > 1) {
result[tmp[0]] = tmp[1];
}
});
return result;
} catch (e) {
console.error(e);
return {};
}
}
function getLandingPageValue() {
let name = "pys_landing_page"
if(options.visit_data_model === "last_visit") {
name = "last_pys_landing_page"
}
if(Cookies.get(name) && Cookies.get(name) !== "undefined") {
return Cookies.get(name);
}
else if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.TrafficLanding){
return options.tracking_analytics.TrafficLanding;
} else{
return "";
}
}
function getTrafficSourceValue() {
let name = "pysTrafficSource"
if(options.visit_data_model === "last_visit") {
name = "last_pysTrafficSource"
}
if(Cookies.get(name) && Cookies.get(name) !== "undefined") {
return Cookies.get(name);
}
else if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.TrafficSource){
return options.tracking_analytics.TrafficSource;
} else{
return "";
}
}
/**
* Handle alternative GCLID parameter for Safari compatibility
* Creates _gcl_aw cookie when alternative parameter is detected and _gcl_aw doesn't exist
*/
function handleAlternativeGclid() {
// Check if alternative GCLID is enabled
if (!options.GATags || !options.GATags.gclid_alternative_enabled || !options.GATags.gclid_alternative_param) {
return;
}
// GDPR consent checks - stop if any consent filter blocks it
if (options.gdpr.all_disabled_by_api) {
return;
}
if (options.gdpr.analytics_disabled_by_api) {
return;
}
if (options.cookie.disabled_all_cookie) {
return;
}
if (options.cookie.disabled_google_alternative_id) {
return;
}
const alternativeParam = options.GATags.gclid_alternative_param;
const queryVars = getQueryVars();
// Check if alternative parameter exists in URL
if (queryVars[alternativeParam]) {
const gclidValue = queryVars[alternativeParam];
// Only create _gcl_aw cookie if it doesn't exist
if (!Cookies.get('_gcl_aw')) {
// Create _gcl_aw cookie with the alternative parameter value in Google's format
// Format: GCL.{timestamp}.{gclid_value}
const timestamp = Math.floor(Date.now() / 1000);
const cookieValue = 'GCL.' + timestamp + '.' + gclidValue;
// Set cookie for 90 days (Google's standard)
const expires = new Date();
expires.setTime(expires.getTime() + (90 * 24 * 60 * 60 * 1000));
Cookies.set('_gcl_aw', cookieValue, {
expires: expires,
path: '/',
domain: domain
});
if (options.debug) {
console.log('PYS: Created _gcl_aw cookie from alternative parameter:', alternativeParam, '=', gclidValue);
}
}
}
}
function getUTMId(useLast = false) {
try {
let cookiePrefix = 'pys_'
let terms = [];
if (useLast) {
cookiePrefix = 'last_pys_'
}
$.each(utmId, function (index, name) {
if (Cookies.get(cookiePrefix + name)) {
terms[name] = Cookies.get(cookiePrefix + name)
}
else if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.TrafficUtmsId[name]) {
terms[name] = filterEmails(options.tracking_analytics.TrafficUtmsId[name])
}
});
return terms;
} catch (e) {
console.error(e);
return [];
}
}
/**
* Return UTM terms from request query variables or from cookies.
*/
function getUTMs(useLast = false) {
try {
let cookiePrefix = 'pys_'
if(useLast) {
cookiePrefix = 'last_pys_'
}
let terms = [];
$.each(utmTerms, function (index, name) {
if (Cookies.get(cookiePrefix + name)) {
let value = Cookies.get(cookiePrefix + name);
terms[name] = filterEmails(value); // do not allow email in request params (Issue #70)
}
else if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.TrafficUtms[name]) {
terms[name] = filterEmails(options.tracking_analytics.TrafficUtms[name])
}
});
return terms;
} catch (e) {
console.error(e);
return [];
}
}
function getDateTime() {
var dateTime = new Array();
var date = new Date(),
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
months = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'
],
hours = ['00-01', '01-02', '02-03', '03-04', '04-05', '05-06', '06-07', '07-08',
'08-09', '09-10', '10-11', '11-12', '12-13', '13-14', '14-15', '15-16', '16-17',
'17-18', '18-19', '19-20', '20-21', '21-22', '22-23', '23-24'
];
dateTime.push(hours[date.getHours()]);
dateTime.push(days[date.getDay()]);
dateTime.push(months[date.getMonth()]);
return dateTime;
}
function filterEmails(value) {
return Utils.validateEmail(value) ? undefined : value;
}
/**
* PUBLIC API
*/
return {
PRODUCT_SIMPLE : 0,
PRODUCT_VARIABLE : 1,
PRODUCT_BUNDLE : 2,
PRODUCT_GROUPED : 3,
utmTerms : utmTerms,
utmId : utmId,
isNewSession: checkSession(),
setHidePixelCookie: function(){
let refresh_after_consent = false;
if ( !firstVisit && options.gdpr.consent_magic_integration_enabled && window.CS_Data !== undefined && window.CS_Data.cs_refresh_after_consent) {
refresh_after_consent = true;
}
if( !refresh_after_consent && !firstVisit) return false;
const url_parts = window.location.href;
const url_params = new URLSearchParams(window.location.search);
const matchingPixels = ["facebook", "ga", "gtm", "google_ads", "bing", "pinterest", "tiktok", "reddit"];
$.each(matchingPixels, function (index, slug) {
var module = getPixelBySlag(slug);
if (module && module.isEnabled()) {
const fullUrl = window.location.href;
$.each(module.getHidePixel(), function (index, hide_info) {
for (const item of hide_info.hide_tag_contain) {
if (item && fullUrl.includes(item)) {
let hideTagTimeInMilliseconds = hide_info.hide_tag_time * 60 * 60 * 1000;
let expiresTime = new Date().getTime() + hideTagTimeInMilliseconds;
Cookies.set('hide_tag_' + hide_info.pixel, true, { expires: new Date(expiresTime), path: '/' });
break;
}
}
});
}
});
},
hideMatchingPixel: function(pixelValue, slug) {
if(Cookies.get('hide_tag_'+pixelValue))
{
return true;
}
return false;
},
validateEmail: function (email) {
var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(email);
},
fireEventForAllPixel:function(functionName,events){
if (events.hasOwnProperty(Facebook.tag()))
Facebook[functionName](events[Facebook.tag()]);
if (events.hasOwnProperty(Analytics.tag()))
Analytics[functionName](events[Analytics.tag()]);
if (events.hasOwnProperty(GAds.tag()))
GAds[functionName](events[GAds.tag()]);
if (events.hasOwnProperty(Pinterest.tag()))
Pinterest[functionName](events[Pinterest.tag()]);
if (events.hasOwnProperty(Bing.tag()))
Bing[functionName](events[Bing.tag()]);
if (events.hasOwnProperty(TikTok.tag()))
TikTok[functionName](events[TikTok.tag()]);
if (events.hasOwnProperty(Reddit.tag()))
Reddit[functionName](events[Reddit.tag()]);
if (events.hasOwnProperty(GTM.tag()))
GTM[functionName](events[GTM.tag()]);
},
getQueryValue:function (name){
return getQueryVars()[name];
},
filterEmails: function (value) {
return filterEmails(value);
},
setupPinterestObject: function () {
Pinterest = window.pys.Pinterest || Pinterest;
return Pinterest;
},
setupBingObject: function () {
Bing = window.pys.Bing || Bing;
return Bing;
},
setupRedditObject: function () {
Reddit = window.pys.Reddit || Reddit;
return Reddit;
},
// Clone all object members to another and return it
copyProperties: function (from, to) {
for (var key in from) {
if("function" == typeof from[key]) {
continue;
}
to[key] = from[key];
}
return to;
},
/**
* Generate unique ID
*/
generateUniqueId : function (event) {
if(event.eventID.length == 0 ||
(!event.isVariationTrigger &&
(event.type == "static" && options.ajaxForServerStaticEvent ||
event.type !== "static" && options.ajaxForServerEvent)
)
) {
let idKey = event.hasOwnProperty('custom_event_post_id') ? event.custom_event_post_id : event.e_id;
if (!uniqueId.hasOwnProperty(idKey)) {
uniqueId[idKey] = pys_generate_token();
}
return uniqueId[idKey];
}
else if(event.eventID.length !== 0)
{
return event.eventID;
}
},
// Flatten object for sendBeacon compatibility
flattenObject: function (obj, prefix = '', res = {}) {
for (const [key, value] of Object.entries(obj)) {
const prefixedKey = prefix
? (Array.isArray(obj) ? `${prefix}[${key}]` : `${prefix}[${key}]`)
: key;
if (value !== null && typeof value === 'object' && !(value instanceof File)) {
this.flattenObject(value, prefixedKey, res);
} else {
res[prefixedKey] = value;
}
}
return res;
},
sendServerAjaxRequest: function ( url, data ) {
// Check if we should use REST API for TikTok or Facebook
if (data.action === 'pys_tiktok_api_event' && window.pysTikTokRest) {
// Use TikTok REST API
this.sendRestAPIRequest(data, 'tiktok');
return;
}
if (data.action === 'pys_api_event' && data.pixel === 'facebook' && window.pysFacebookRest) {
// Use Facebook REST API
this.sendRestAPIRequest(data, 'facebook');
return;
}
// Check if sendBeacon is enabled and supported
if (options.useSendBeacon && navigator.sendBeacon) {
try {
// Flatten the data object for sendBeacon compatibility
const flattenedData = this.flattenObject(data);
const formData = new URLSearchParams();
// Convert flattened data to URLSearchParams
for (const [key, value] of Object.entries(flattenedData)) {
if (value !== null && value !== undefined) {
formData.append(key, value);
}
}
// Try to send using sendBeacon
const success = navigator.sendBeacon(url, formData);
if (success) {
return; // Successfully sent via sendBeacon
}
} catch (e) {
// If sendBeacon fails, fall back to jQuery.ajax
if (options.debug) {
console.log('PYS: sendBeacon failed, falling back to jQuery.ajax:', e);
}
}
}
// Fallback to jQuery.ajax
jQuery.ajax( {
type: 'POST',
url: url,
data: data,
headers: {
'Cache-Control': 'no-cache'
},
success: function () {
},
} );
},
// Send event via REST API (unified function for TikTok, Facebook, and other platforms)
// Replaces the old sendTikTokRestAPIRequest and sendFacebookRestAPIRequest functions
sendRestAPIRequest: function (data, platform) {
let restApiUrl;
// Get platform-specific REST API configuration
switch (platform) {
case 'tiktok':
restApiUrl = window.pysTikTokRest ? window.pysTikTokRest.restApiUrl : '/wp-json/pys-tiktok/v1/event';
break;
case 'facebook':
restApiUrl = window.pysFacebookRest ? window.pysFacebookRest.restApiUrl : '/wp-json/pys-facebook/v1/event';
break;
case 'pinterest':
restApiUrl = window.pysPinterestRest ? window.pysPinterestRest.restApiUrl : '/wp-json/pys-pinterest/v1/event';
break;
default:
console.error('PYS: Unknown platform for REST API:', platform);
this.sendAjaxFallback(data);
return;
}
// Prepare data for REST API
const restApiData = {
event: data.event,
event_slug: data.event_slug,
data: JSON.stringify(data.data || {}),
ids: JSON.stringify(data.ids || []),
eventID: data.event_id || data.eventID || '',
woo_order: data.woo_order || '0',
edd_order: data.edd_order || '0'
};
// Try to send using sendBeacon first (if enabled)
if (options.useSendBeacon && navigator.sendBeacon) {
try {
const formData = new URLSearchParams();
for (const [key, value] of Object.entries(restApiData)) {
formData.append(key, value);
}
if (navigator.sendBeacon(restApiUrl, formData)) {
return;
}
} catch (e) {
// sendBeacon failed, continue to fetch
}
}
// Try to send using fetch with REST API
if (window.fetch) {
const headers = {
'Content-Type': 'application/json'
};
fetch(restApiUrl, {
method: 'POST',
headers: headers,
body: JSON.stringify(restApiData)
})
.then(response => {
if (!response.ok) {
throw new Error(platform + ' REST API request failed: ' + response.status);
}
})
.catch(error => {
// Fallback to AJAX if REST API fails
if (options.debug) {
console.log('PYS: ' + platform + ' REST API failed, falling back to AJAX:', error);
}
this.sendAjaxFallback(data);
});
} else {
// Fallback to AJAX if fetch is not supported
this.sendAjaxFallback(data);
}
},
// Fallback AJAX method
sendAjaxFallback: function (data) {
jQuery.ajax({
type: 'POST',
url: options.ajaxUrl,
data: data,
headers: {
'Cache-Control': 'no-cache'
},
success: function () {
},
});
},
clone: function(obj) {
var copy;
// Handle the 3 simple types, and null or undefined
if (null == obj || "object" != typeof obj) return obj;
// Handle Date
if (obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Handle Array
if (obj instanceof Array) {
copy = [];
for (var i = 0, len = obj.length; i < len; i++) {
if("function" == typeof obj[i]) {
continue;
}
copy[i] = Utils.clone(obj[i]);
}
return copy;
}
// Handle Object
if (obj instanceof Object) {
copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) {
if("function" == typeof obj[attr]) {
continue;
}
copy[attr] = Utils.clone(obj[attr]);
}
}
return copy;
}
return obj;
},
// Returns array of elements with given tag name
getTagsAsArray: function (tag) {
return [].slice.call(document.getElementsByTagName(tag));
},
initializeVideoAPIs: function (options) {
let trigger_has_video_YT, trigger_has_video_Vimeo = false;
if (options.hasOwnProperty('automatic') && options.automatic.enable_video) {
if ( options.triggerEventTypes.hasOwnProperty( "video_view" ) ) {
Object.entries( options.triggerEventTypes.video_view ).forEach( function ( [ trigger_id, triggers ] ) {
triggers.forEach( function ( trigger ) {
if (trigger.type === 'youtube') {
trigger_has_video_YT = true;
}
if(trigger.type === 'vimeo'){
trigger_has_video_Vimeo = true;
}
});
});
}
if (
options.hasOwnProperty('enable_automatic_events') &&
options.enable_automatic_events
) {
if (options.automatic.enable_youtube || trigger_has_video_YT) {
Utils.initYouTubeAPI();
}
if (options.automatic.enable_vimeo || trigger_has_video_Vimeo) {
Utils.initVimeoAPI();
}
}
}
},
/**
* Load and initialize YouTube API
*
* @link: https://developers.google.com/youtube/iframe_api_reference
*/
initYouTubeAPI: function () {
// maybe load YouTube JS API
if (typeof window.YT === 'undefined') {
var tag = document.createElement('script');
tag.src = '//www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
}
// initialize when API is ready
if ( typeof window.onYouTubeIframeAPIReady !== 'function' ) {
window.onYouTubeIframeAPIReady = function () {
// collect all possible YouTube tags
var potentialVideos = Utils.getTagsAsArray( 'iframe' ).concat( Utils.getTagsAsArray( 'embed' ) );
// turn videos into trackable videos with events
for ( var i = 0; i < potentialVideos.length; i++ ) {
var video = potentialVideos[ i ];
if ( tagIsYouTubeVideo( video ) ) {
var iframe = normalizeYouTubeIframe( video );
addYouTubeEvents( iframe );
} else if ( tagIsYouTubeAsyncVideo( video ) ){
video.addEventListener( "load", function ( evt ) {
var iframe = normalizeYouTubeIframe( evt.currentTarget );
addYouTubeEvents( iframe );
} );
}
}
var targets = document.querySelectorAll( '.elementor-widget-video .elementor-wrapper' );
const config = {
attributes: false,
childList: true,
subtree: true
};
const callback = function ( mutationsList, observer ) {
for ( let mutation of mutationsList ) {
if ( mutation.type === 'childList' ) {
for ( var m = 0; m < mutation.addedNodes.length; m++ ) {
addDynYouTubeVideos( mutation.addedNodes[ m ] );
}
}
}
};
// observe elementator widget-video and add event when it add iframe
for ( var i = 0; i < targets.length; i++ ) {
const observer = new MutationObserver( callback );
observer.observe( targets[ i ], config );//maybe remove before add
}
}
}
},
/**
* Load and initialize Vimeo API
*
* @link: https://github.com/vimeo/player.js
*/
initVimeoAPI: function () {
$(document).ready(function () {
var potentialVideos = Utils.getTagsAsArray('iframe').concat(Utils.getTagsAsArray('embed'));
for (var i = 0; i < potentialVideos.length; i++) {
var tag = potentialVideos[i];
if (tagIsVimeoVideo(tag)) {
var nextElementHasClass = $(tag).closest('.elementor-widget-video').find('.elementor-custom-embed-image-overlay');
if(nextElementHasClass.length > 0) {
tag.addEventListener("load", function() {
attachVimeoPlayerToTag(this);
});
}
else {
attachVimeoPlayerToTag(tag);
}
} else {
if (tagIsAsincVimeoVideo(tag)) {
tag.addEventListener("load", function(evt) {
attachVimeoPlayerToTag(evt.currentTarget);
});
}
}
}
});
},
manageCookies: function () {
// Handle alternative GCLID parameter for Safari compatibility
handleAlternativeGclid();
if (options.gdpr.cookiebot_integration_enabled && typeof Cookiebot !== 'undefined') {
if (Cookiebot.consented === false && !Cookiebot.consent['marketing'] && !Cookiebot.consent['statistics']) {
return;
}
}
let cm_consent_not_expressed = false;
if ( options.gdpr.consent_magic_integration_enabled && window.CS_Data !== undefined && window.CS_Data.cs_refresh_after_consent == 1 ) {
if ( Cookies.get( 'cs_viewed_cookie_policy' ) === undefined ) {
cm_consent_not_expressed = true;
}
}
if( !cm_consent_not_expressed && isNewSession && !options.cookie.disabled_all_cookie && !options.cookie.disabled_start_session_cookie) {
let duration = options.last_visit_duration * 60000
var now = new Date();
now.setTime(now.getTime() + duration);
Cookies.set('pys_session_limit', true,{ expires: now, path: '/',domain: domain })
Cookies.set('pys_start_session', true,{ path: '/',domain: domain });
Utils.setHidePixelCookie();
}
if (!Cookies.get('pbid') && Facebook.isEnabled() && options.ajaxForServerEvent) {
jQuery.ajax({
url: options.ajaxUrl,
dataType: 'json',
data: {
action: 'pys_get_pbid'
},
success: function (res) {
if (res.data && res.data.pbid != false && options.send_external_id) {
if(!(options.cookie.disabled_all_cookie || options.cookie.externalID_disabled_by_api)){
var expires = parseInt(options.external_id_expire || 180);
Cookies.set('pbid', res.data.pbid, { expires: expires,path: '/',domain: domain });
}
if(options.hasOwnProperty('facebook')) {
options.facebook.advancedMatching = {
...options.facebook.advancedMatching, // распыляем текущие значения advancedMatching
external_id: res.data.pbid
};
}
}
}
});
} else if (Cookies.get('pbid') && Facebook.isEnabled()){
if(options.hasOwnProperty('facebook')) {
options.facebook.advancedMatching = {
...options.facebook.advancedMatching,
external_id: Cookies.get('pbid')
};
}
}
let expires = parseInt(options.cookie_duration); // days
let queryVars = getQueryVars();
let landing = window.location.href.split('?')[0];
try {
// save data for first visit
if(Cookies.get('pys_first_visit') === undefined && (!options.cookie.disabled_all_cookie)) {
if(!options.cookie.disabled_first_visit_cookie)
{
Cookies.set('pys_first_visit', true, { expires: expires, path: '/',domain: domain });
}
else {
Cookies.remove('pys_first_visit', { path: '/',domain: domain } )
}
if(!options.cookie.disabled_trafficsource_cookie)
{
Cookies.set('pysTrafficSource', getTrafficSource(), { expires: expires,path: '/',domain: domain });
}
else {
Cookies.remove('pysTrafficSource', { path: '/',domain: domain })
}
if(!options.cookie.disabled_landing_page_cookie && options.enable_lading_page_param)
{
Cookies.set('pys_landing_page',landing,{ expires: expires,path: '/',domain: domain });
}
else {
Cookies.remove('pys_landing_page', { path: '/',domain: domain })
}
if(!options.cookie.disabled_utmTerms_cookie)
{
$.each(utmTerms, function (index, name) {
if (queryVars.hasOwnProperty(name)) {
Cookies.set('pys_' + name, queryVars[name], { expires: expires,path: '/',domain: domain });
} else {
Cookies.remove('pys_' + name, { path: '/',domain: domain })
}
});
}
else {
$.each(utmTerms, function (index, name) {
Cookies.remove('pys_' + name, { path: '/',domain: domain })
});
}
if(!options.cookie.disabled_utmId_cookie)
{
$.each(utmId,function(index,name) {
if (queryVars.hasOwnProperty(name)) {
Cookies.set('pys_' + name, queryVars[name], { expires: expires,path: '/',domain: domain });
} else {
Cookies.remove('pys_' + name, { path: '/',domain: domain })
}
})
}
else {
$.each(utmId, function (index, name) {
Cookies.remove('pys_' + name, { path: '/',domain: domain })
});
}
}
// save data for last visit if it new session
if(isNewSession && (!options.cookie.disabled_all_cookie)) {
if(!options.cookie.disabled_trafficsource_cookie)
{
Cookies.set('last_pysTrafficSource', getTrafficSource(), { expires: expires,path: '/',domain: domain });
}
else {
Cookies.remove('last_pysTrafficSource', { path: '/',domain: domain })
}
if(!options.cookie.disabled_landing_page_cookie && options.enable_lading_page_param)
{
Cookies.set('last_pys_landing_page',landing,{ expires: expires,path: '/',domain: domain });
}
else {
Cookies.remove('last_pys_landing_page', { path: '/',domain: domain })
}
if(!options.cookie.disabled_utmTerms_cookie)
{
$.each(utmTerms, function (index, name) {
if (queryVars.hasOwnProperty(name)) {
Cookies.set('last_pys_' + name, queryVars[name], { expires: expires,path: '/',domain: domain });
}
});
}
else {
$.each(utmTerms, function (index, name) {
Cookies.remove('last_pys_' + name, { path: '/',domain: domain })
});
}
if(!options.cookie.disabled_utmId_cookie)
{
$.each(utmId,function(index,name) {
if (queryVars.hasOwnProperty(name)) {
Cookies.set('last_pys_' + name, queryVars[name], { expires: expires,path: '/',domain: domain });
}
})
}
else {
$.each(utmId, function (index, name) {
Cookies.remove('last_pys_' + name, { path: '/',domain: domain })
});
}
}
if(options.cookie.disabled_start_session_cookie) {
Cookies.remove('pys_start_session', { path: '/',domain: domain })
Cookies.remove('pys_session_limit', { path: '/',domain: domain })
}
if(options.cookie.disabled_all_cookie)
{
Cookies.remove('pys_first_visit', { path: '/',domain: domain })
Cookies.remove('pysTrafficSource', { path: '/',domain: domain })
Cookies.remove('pys_landing_page', { path: '/',domain: domain })
Cookies.remove('last_pys_landing_page', { path: '/',domain: domain })
Cookies.remove('last_pysTrafficSource', { path: '/',domain: domain })
Cookies.remove('pys_start_session', { path: '/',domain: domain })
Cookies.remove('pys_session_limit', { path: '/',domain: domain })
$.each(Utils.utmTerms, function (index, name) {
Cookies.remove('pys_' + name, { path: '/',domain: domain })
});
$.each(Utils.utmId,function(index,name) {
Cookies.remove('pys_' + name, { path: '/',domain: domain })
})
$.each(Utils.utmTerms, function (index, name) {
Cookies.remove('last_pys_' + name, { path: '/',domain: domain })
});
$.each(Utils.utmId,function(index,name) {
Cookies.remove('last_pys_' + name, { path: '/',domain: domain })
});
}
} catch (e) {
console.error(e);
}
},
initializeRequestParams: function () {
if (options.trackTrafficSource) {
requestParams.traffic_source = getTrafficSourceValue();
}
if (options.trackUTMs) {
var utms = getUTMs(options.visit_data_model === "last_visit");
$.each(utmTerms, function (index, term) {
if (term in utms) {
requestParams[term] = utms[term];
}
});
}
var dateTime = getDateTime();
if(options.enable_event_time_param) {
requestParams.event_hour = dateTime[0];
}
if(options.enable_event_day_param) {
requestParams.event_day = dateTime[1];
}
if(options.enable_event_month_param) {
requestParams.event_month = dateTime[2];
}
if(options.enable_lading_page_param){
requestParams.landing_page = getLandingPageValue();
}
},
getRequestParams: function () {
return requestParams;
},
/**
* DOWNLOAD DOCS
*/
getLinkExtension: function (link) {
// Remove anchor, query string and everything before last slash
link = link.substring(0, (link.indexOf("#") === -1) ? link.length : link.indexOf("#"));
link = link.substring(0, (link.indexOf("?") === -1) ? link.length : link.indexOf("?"));
link = link.substring(link.lastIndexOf("/") + 1, link.length);
// If there's a period left in the URL, then there's a extension
if (link.length > 0 && link.indexOf('.') !== -1) {
link = link.substring(link.lastIndexOf(".") + 1); // Remove everything but what's after the first period
return link;
} else {
return "";
}
},
getLinkFilename: function (link) {
// Remove anchor, query string and everything before last slash
link = link.substring(0, (link.indexOf("#") === -1) ? link.length : link.indexOf("#"));
link = link.substring(0, (link.indexOf("?") === -1) ? link.length : link.indexOf("?"));
link = link.substring(link.lastIndexOf("/") + 1, link.length);
// If there's a period left in the URL, then there's a extension
if (link.length > 0 && link.indexOf('.') !== -1) {
return link;
} else {
return "";
}
},
/**
* CUSTOM EVENTS
*/
setupMouseOverClickEvents: function (eventId, triggers) {
// Non-default binding used to avoid situations when some code in external js
// stopping events propagation, eg. returns false, and our handler will never called
document.addEventListener('mouseover', function(event) {
var matchedElements = Array.from(document.querySelectorAll(triggers));
var clickedElement = event.target;
var closestMatch = clickedElement.closest(triggers);
if (matchedElements.includes(clickedElement) || closestMatch){
if (event.target.classList.contains('pys-mouse-over-' + eventId)) {
return true;
} else {
event.target.classList.add('pys-mouse-over-' + eventId);
}
Utils.fireTriggerEvent(eventId);
}
});
},
setupFormFieldEvents: function (eventId, triggers) {
triggers.forEach(function(trigger) {
let eventType = 'input';
if (['checkbox', 'radio', 'select'].includes(trigger.type)) {
eventType = 'change';
} else if (['text', 'email', 'tel'].includes(trigger.type)) {
eventType = 'blur';
}
const form = document.querySelector(trigger.form);
if (!form) return;
const field = form.querySelector(trigger.field); // ищем поле ТОЛЬКО внутри формы
if (!field) return;
field.addEventListener(eventType, function (event) {
Utils.fireTriggerEvent(eventId);
}, true);
});
},
setupCSSClickEvents: function (eventId, triggers) {
// Non-default binding used to avoid situations when some code in external js
// stopping events propagation, eg. returns false, and our handler will never called
// add event to document to support dyn class
document.addEventListener('click', function(event) {
let matchedElements = Array.from(document.querySelectorAll(triggers)),
clickedElement = event.target,
closestMatch = clickedElement.closest(triggers);
if (matchedElements.includes(clickedElement) || closestMatch){
Utils.fireTriggerEvent(eventId);
}
}, true);
},
setupURLClickEvents: function () {
if( !options.triggerEventTypes.hasOwnProperty('url_click') ) {
return;
}
// Non-default binding used to avoid situations when some code in external js
// stopping events propagation, eg. returns false, and our handler will never called
document.addEventListener('click', function(event) {
let anchor = event.target.closest('a');
if (anchor) {
var url = anchor.getAttribute('href');
if (url) {
Object.entries(options.triggerEventTypes.url_click).forEach(function ([eventId, triggers]) {
triggers.forEach(function (trigger) {
if (Utils.compareUrl(url, trigger.value, trigger.rule)) {
Utils.fireTriggerEvent(eventId);
}
});
});
}
}
}, true);
},
removeUrlDomain(url) {
if(url.indexOf("/#") > -1) {
url = url.substring(0, url.indexOf("/#"));
}
return url.replace('http://','')
.replace('https://','')
.replace('www.','')
.trim()
.replace(/^\/+/g, '')
},
compareUrl: function(base,url,rule){
if(url == "*" || url == '') return true;
base = Utils.removeUrlDomain(base)
url = Utils.removeUrlDomain(url)
if(rule == 'match') {
return url == base;
} else {
return base.indexOf(url) !== -1
}
},
setupScrollPosEvents: function (eventId, triggers) {
var scrollPosThresholds = {},
docHeight = $(document).height() - $(window).height();
// convert % to absolute positions
$.each(triggers, function (index, scrollPos) {
// convert % to pixels
scrollPos = docHeight * scrollPos / 100;
scrollPos = Math.round(scrollPos);
scrollPosThresholds[scrollPos] = eventId;
});
$(document).on("scroll",function () {
var scrollPos = $(window).scrollTop();
$.each(scrollPosThresholds, function (threshold, eventId) {
// position has not reached yes
if (scrollPos <= threshold) {
return true;
}
// fire event only once
if (eventId === null) {
return true;
} else {
scrollPosThresholds[threshold] = null;
}
Utils.fireTriggerEvent(eventId);
});
});
},
setupCommentEvents : function (eventId,triggers) {
$('form.comment-form').on("submit",function () {
Utils.fireTriggerEvent(eventId);
});
},
setupEmailLinkEvents: function ( events ) {
$( document ).on( 'click', 'a', function ( event ) {
let anchor = event.target.closest('a');
if (anchor) {
let url = anchor.getAttribute('href');
if (url && (url.startsWith('mailto:') || url.startsWith('tel:'))) {
let sendEventIds = [],
disabled_for_pixels = [],
disabled_email_action = false;
$.each(events, function (eventId, trigger_group) {
url = url.replace('mailto:', '').replace('tel:', '');
trigger_group.forEach(function (triggers) {
triggers.rules.forEach(function (trigger) {
if (Utils.compareUrl(url, trigger.value, trigger.rule)) {
sendEventIds.push(eventId);
if (triggers.hasOwnProperty('disabled_email_link') && triggers.disabled_email_link) {
disabled_email_action = true;
if (options.triggerEvents.hasOwnProperty(eventId)) {
disabled_for_pixels.push(...Object.keys(options.triggerEvents[eventId]));
}
}
}
});
})
})
if (sendEventIds.length > 0) {
sendEventIds.forEach(function (sendEventId) {
Utils.fireTriggerEvent(sendEventId);
})
}
setupEmailLinks(disabled_for_pixels);
}
}
} )
},
/**
* Events
*/
isEventInTimeWindow: function (eventName, event, prefix) {
if(event.hasOwnProperty("hasTimeWindow") && event.hasTimeWindow) {
var cookieName = prefix+"_"+eventName;
var now = new Date().getTime();
if(Cookies.get(cookieName) !== undefined) {
var lastTimeFire = Cookies.get(cookieName);
var fireTime = event.timeWindow * 60*60*1000;
if( now - lastTimeFire > fireTime) {
Cookies.set(cookieName,now, { expires: event.timeWindow / 24.0, path: '/'} );
} else {
return false;
}
} else {
Cookies.set(cookieName,now, { expires: event.timeWindow / 24.0, path: '/'} );
}
}
return true
},
fireTriggerEvent: function (eventId) {
if (!options.triggerEvents.hasOwnProperty(eventId)) {
return;
}
var event = {};
var events = options.triggerEvents[eventId];
if (events.hasOwnProperty('facebook')) {
event = events.facebook;
if(Utils.isEventInTimeWindow(event.name,event,"dyn_facebook_"+eventId)) {
event = Utils.getFormFilledData(event);
Facebook.fireEvent(event.name, event);
}
}
if (events.hasOwnProperty('ga')) {
event = events.ga;
if(Utils.isEventInTimeWindow(event.name,event,"dyn_ga_"+eventId)) {
event = Utils.getFormFilledData(event);
Analytics.fireEvent(event.name, event);
}
}
if (events.hasOwnProperty('google_ads')) {
event = events.google_ads;
if(Utils.isEventInTimeWindow(event.name,event,"dyn_google_ads_"+eventId)) {
event = Utils.getFormFilledData(event);
GAds.fireEvent(event.name, event);
}
}
if (events.hasOwnProperty('pinterest')) {
event = events.pinterest;
if(Utils.isEventInTimeWindow(event.name,event,"dyn_pinterest_"+eventId)) {
event = Utils.getFormFilledData(event);
Pinterest.fireEvent(event.name, event);;
}
}
if (events.hasOwnProperty('bing')) {
event = events.bing;
if(Utils.isEventInTimeWindow(event.name,event,"dyn_bing_"+eventId)) {
event = Utils.getFormFilledData(event);
Bing.fireEvent(event.name, event);;
}
}
if (events.hasOwnProperty('tiktok')) {
event = events.tiktok;
if(Utils.isEventInTimeWindow(event.name,event,"dyn_tiktok_"+eventId)) {
event = Utils.getFormFilledData(event);
TikTok.fireEvent(event.name, event);
}
}
if (events.hasOwnProperty('reddit')) {
event = events.reddit;
if(Utils.isEventInTimeWindow(event.name,event,"dyn_reddit_"+eventId)) {
event = Utils.getFormFilledData(event);
Reddit.fireEvent(event.name, event);
}
}
if (events.hasOwnProperty('gtm')) {
event = events.gtm;
if(Utils.isEventInTimeWindow(event.name,event,"dyn_gtm_"+eventId)) {
event = Utils.getFormFilledData(event);
GTM.fireEvent(event.name, event);
}
}
},
isFirstPurchaseFire: function ($eventName,orderId,pixel) {
if(Cookies.get("pys_"+$eventName+"_order_id_"+pixel) == orderId) {
return false;
} else {
Cookies.set("pys_"+$eventName+"_order_id_"+pixel, orderId, { expires: 1,path: '/' });
}
return true;
},
fireStaticEvents: function (pixel, timeout = 0) {
if (options.staticEvents.hasOwnProperty(pixel)) {
$.each(options.staticEvents[pixel], function (eventId, events) {
//skip purchase event if this order was fired
if( options.woo.hasOwnProperty('woo_purchase_on_transaction') &&
options.woo.woo_purchase_on_transaction &&
(eventId === "woo_purchase" || eventId === "woo_purchase_category") ) {
if(!Utils.isFirstPurchaseFire(eventId,events[0].woo_order,pixel)) {
return;
}
}
if( options.edd.hasOwnProperty('edd_purchase_on_transaction') &&
options.edd.edd_purchase_on_transaction &&
(eventId === "edd_purchase" || eventId === "edd_purchase_category") ) {
if(!Utils.isFirstPurchaseFire(eventId,events[0].edd_order,pixel)) {
return;
}
}
$.each(events, function (index, event) {
event.fired = event.fired || false;
if (!event.fired && Utils.isEventInTimeWindow(event.name,event,'static_' + pixel+"_")) {
event = Utils.getFormFilledData(event);
var fired = false;
// fire event
if ( pixel === 'tiktok' ) {
setTimeout(function() {
getPixelBySlag(pixel).fireEvent(event.name, event);
}, timeout * 500);
timeout++;
} else {
getPixelBySlag(pixel).fireEvent(event.name, event);
}
// prevent event double event firing
event.fired = fired;
}
});
});
}
},
/**
* Load tag's JS
*
* @link: https://developers.google.com/analytics/devguides/collection/gtagjs/
* @link: https://developers.google.com/analytics/devguides/collection/gtagjs/custom-dims-mets
*/
loadGoogleTag: function (id) {
if (!gtag_loaded) {
let dataLayerName = this.dataLayerName;
if(options.hasOwnProperty('GATags')){
switch (options.GATags.ga_datalayer_type) {
case 'default':
dataLayerName = 'dataLayerPYS';
break;
case 'custom':
dataLayerName = options.GATags.ga_datalayer_name;
break;
default:
dataLayerName = 'dataLayer';
}
}
this.dataLayerName = dataLayerName;
(function (window, document, src) {
var a = document.createElement('script'),
m = document.getElementsByTagName('script')[0];
a.async = 1;
a.src = src;
m.parentNode.insertBefore(a, m);
})(window, document, '//www.googletagmanager.com/gtag/js?id=' + id+'&l='+this.dataLayerName);
window[dataLayerName] = window[dataLayerName] || [];
window.gtag = window.gtag || function gtag() {
window[dataLayerName].push(arguments);
};
if ( options.google_consent_mode ) {
let data = {};
data[ 'analytics_storage' ] = options.gdpr.analytics_storage.enabled ? options.gdpr.analytics_storage.value : 'granted';
data[ 'ad_storage' ] = options.gdpr.ad_storage.enabled ? options.gdpr.ad_storage.value : 'granted';
data[ 'ad_user_data' ] = options.gdpr.ad_user_data.enabled ? options.gdpr.ad_user_data.value : 'granted';
data[ 'ad_personalization' ] = options.gdpr.ad_personalization.enabled ? options.gdpr.ad_personalization.value : 'granted';
this.loadDefaultConsent( 'consent', 'default', data );
}
gtag('js', new Date());
gtag_loaded = true;
}
},
loadDefaultConsent: function() {
window[ this.dataLayerName ].push( arguments );
},
loadGTMScript: function (id = '') {
const domain = options.gtm.gtm_container_domain ?? 'www.googletagmanager.com';
const loader = options.gtm.gtm_container_identifier ?? 'gtm';
const gtm_auth = options.gtm.gtm_auth ?? ''; // Set this if needed
const gtm_preview = options.gtm.gtm_preview ?? ''; // Set this if needed
const datalayer_name = options.gtm.gtm_dataLayer_name ?? 'dataLayer';
window[ datalayer_name ] = window[ datalayer_name ] || [];
window.gtag = window.gtag || function gtag() {
window[ datalayer_name ].push( arguments );
};
if ( options.google_consent_mode ) {
let data = {};
data[ 'analytics_storage' ] = options.gdpr.analytics_storage.enabled ? options.gdpr.analytics_storage.value : 'granted';
data[ 'ad_storage' ] = options.gdpr.ad_storage.enabled ? options.gdpr.ad_storage.value : 'granted';
data[ 'ad_user_data' ] = options.gdpr.ad_user_data.enabled ? options.gdpr.ad_user_data.value : 'granted';
data[ 'ad_personalization' ] = options.gdpr.ad_personalization.enabled ? options.gdpr.ad_personalization.value : 'granted';
this.GTMdataLayerName = datalayer_name;
this.loadDefaultGTMConsent( 'consent', 'default', data );
}
(function(w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
const f = d.getElementsByTagName(s)[0];
const j = d.createElement(s);
const dl = l !== 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://' + domain + '/' + loader + '.js?id=' + i + dl;
if (gtm_auth && gtm_preview) {
j.src += '>m_auth=' + gtm_auth + '>m_preview=' + gtm_preview + '>m_cookies_win=x';
}
f.parentNode.insertBefore(j, f);
})(window, document, 'script', datalayer_name, id);
},
loadDefaultGTMConsent: function() {
window[ this.GTMdataLayerName ].push( arguments );
},
/**
* GDPR
*/
loadPixels: function () {
if (options.gdpr.ajax_enabled && !options.gdpr.consent_magic_integration_enabled) {
// retrieves actual PYS GDPR filters values which allow to avoid cache issues
$.get({
url: options.ajaxUrl,
dataType: 'json',
data: {
action: 'pys_get_gdpr_filters_values'
},
success: function (res) {
if (res.success) {
options.gdpr.all_disabled_by_api = res.data.all_disabled_by_api;
options.gdpr.facebook_disabled_by_api = res.data.facebook_disabled_by_api;
options.gdpr.tiktok_disabled_by_api = res.data.tiktok_disabled_by_api;
options.gdpr.analytics_disabled_by_api = res.data.analytics_disabled_by_api;
options.gdpr.google_ads_disabled_by_api = res.data.google_ads_disabled_by_api;
options.gdpr.pinterest_disabled_by_api = res.data.pinterest_disabled_by_api;
options.gdpr.bing_disabled_by_api = res.data.bing_disabled_by_api;
options.gdpr.reddit_disabled_by_api = res.data.reddit_disabled_by_api;
options.cookie.externalID_disabled_by_api = res.data.externalID_disabled_by_api;
options.cookie.disabled_all_cookie = res.data.disabled_all_cookie;
options.cookie.disabled_advanced_form_data_cookie = res.data.disabled_advanced_form_data_cookie;
options.cookie.disabled_landing_page_cookie = res.data.disabled_landing_page_cookie || !options.enable_lading_page_param;
options.cookie.disabled_first_visit_cookie = res.data.disabled_first_visit_cookie;
options.cookie.disabled_trafficsource_cookie = res.data.disabled_trafficsource_cookie;
options.cookie.disabled_utmTerms_cookie = res.data.disabled_utmTerms_cookie;
options.cookie.disabled_utmId_cookie = res.data.disabled_utmId_cookie;
}
loadPixels();
}
});
} else {
loadPixels();
}
},
consentGiven: function (pixel) {
/**
* Cookiebot
*/
if (options.gdpr.cookiebot_integration_enabled && typeof Cookiebot !== 'undefined') {
var cookiebot_consent_category = options.gdpr['cookiebot_' + pixel + '_consent_category'];
if (options.gdpr[pixel + '_prior_consent_enabled']) {
if (Cookiebot.consented === true || Cookiebot.consent[cookiebot_consent_category]) {
return true;
}
} else {
if (Cookiebot.consent[cookiebot_consent_category]) {
return true;
}
}
return false;
}
/**
* Cookie Notice
*/
if (options.gdpr.cookie_notice_integration_enabled && typeof cnArgs !== 'undefined') {
var cn_cookie = Cookies.get(cnArgs.cookieName);
if (options.gdpr[pixel + '_prior_consent_enabled']) {
if (typeof cn_cookie === 'undefined' || cn_cookie === 'true') {
return true;
}
} else {
if (cn_cookie === 'true') {
return true;
}
}
return false;
}
/**
* Cookie Law Info
*/
if (options.gdpr.cookie_law_info_integration_enabled) {
var cli_cookie = Cookies.get('cookieyes-consent') ?? Cookies.get('wt_consent') ?? Cookies.get('viewed_cookie_policy');
if (options.gdpr[pixel + '_prior_consent_enabled']) {
if (typeof cli_cookie === 'undefined') return true;
if (
cli_cookie &&
(cli_cookie === Cookies.get('cookieyes-consent') || cli_cookie === Cookies.get('wt_consent'))
) {
if (getCookieYes('analytics') === 'yes') {
return true;
}
} else if (cli_cookie && cli_cookie === Cookies.get('viewed_cookie_policy')) {
if (Cookies.get('viewed_cookie_policy') === 'yes') {
return true;
}
}
} else {
if (
cli_cookie &&
(cli_cookie === Cookies.get('cookieyes-consent') || cli_cookie === Cookies.get('wt_consent'))
) {
if (getCookieYes('analytics') === 'yes') {
return true;
}
} else if (cli_cookie && cli_cookie === Cookies.get('viewed_cookie_policy')) {
if (Cookies.get('viewed_cookie_policy') === 'yes') {
return true;
}
}
}
return false;
}
/**
* ConsentMagic
*/
if (options.gdpr.consent_magic_integration_enabled && typeof CS_Data !== "undefined" ) {
let test_prefix = CS_Data.test_prefix;
if (
( ( typeof CS_Data.cs_google_consent_mode_enabled !== "undefined" && CS_Data.cs_google_consent_mode_enabled == 1 ) && ( pixel == 'analytics' || pixel == 'google_ads' ) )
|| ( typeof CS_Data.cs_meta_ldu_mode !== "undefined" && CS_Data.cs_meta_ldu_mode && pixel == 'facebook' )
|| ( typeof CS_Data.cs_reddit_ldu_mode !== "undefined" && CS_Data.cs_reddit_ldu_mode && pixel == 'reddit' )
|| ( typeof CS_Data.cs_bing_consent_mode !== "undefined" && CS_Data.cs_bing_consent_mode.ad_storage.enabled && pixel == 'bing' )
) {
if ( CS_Data.cs_cache_enabled == 0 || ( CS_Data.cs_cache_enabled == 1 && window.CS_Cache && window.CS_Cache.check_status ) ) {
return true;
} else {
return false;
}
}
if( pixel == 'facebook' && ( CS_Data.cs_script_cat.facebook == 0 || CS_Data.cs_script_cat.facebook == CS_Data.cs_necessary_cat_id ) ) {
return true;
} else if( pixel == 'bing' && ( CS_Data.cs_script_cat.bing == 0 || CS_Data.cs_script_cat.bing == CS_Data.cs_necessary_cat_id ) ) {
return true;
} else if( pixel == 'analytics' && ( CS_Data.cs_script_cat.analytics == 0 || CS_Data.cs_script_cat.analytics == CS_Data.cs_necessary_cat_id ) ) {
return true;
} else if( pixel == 'google_ads' && ( CS_Data.cs_script_cat.gads == 0 || CS_Data.cs_script_cat.gads == CS_Data.cs_necessary_cat_id ) ) {
return true;
} else if( pixel == 'pinterest' && ( CS_Data.cs_script_cat.pinterest == 0 || CS_Data.cs_script_cat.pinterest == CS_Data.cs_necessary_cat_id ) ) {
return true;
} else if( pixel == 'tiktok' && ( CS_Data.cs_script_cat.tiktok == 0 || CS_Data.cs_script_cat.tiktok == CS_Data.cs_necessary_cat_id ) ) {
return true;
} else if( pixel == 'reddit' && ( CS_Data.cs_script_cat?.reddit == 0 || CS_Data.cs_script_cat?.reddit == CS_Data.cs_necessary_cat_id ) ) {
return true;
}
let substring = "cs_enabled_cookie_term",
theCookies = document.cookie.split( ';' );
for ( let i = 1; i <= theCookies.length; i++ ) {
if ( theCookies[ i - 1 ].indexOf( substring ) !== -1 ) {
let categoryCookie = theCookies[ i - 1 ].replace( 'cs_enabled_cookie_term' + test_prefix + '_', '' );
categoryCookie = Number( categoryCookie.replace( /\D+/g, "" ) );
let cs_cookie_val = Cookies.get( 'cs_enabled_cookie_term' + test_prefix + '_' + categoryCookie );
if ( categoryCookie === CS_Data.cs_script_cat.facebook && pixel == 'facebook' ) {
return cs_cookie_val == 'yes';
} else if ( categoryCookie === CS_Data.cs_script_cat.bing && pixel == 'bing' ) {
return cs_cookie_val == 'yes';
} else if ( categoryCookie === CS_Data.cs_script_cat.analytics && pixel == 'analytics' ) {
return cs_cookie_val == 'yes';
} else if ( categoryCookie === CS_Data.cs_script_cat.gads && pixel == 'google_ads' ) {
return cs_cookie_val == 'yes';
} else if ( categoryCookie === CS_Data.cs_script_cat.pinterest && pixel == 'pinterest' ) {
return cs_cookie_val == 'yes';
} else if ( categoryCookie === CS_Data.cs_script_cat.tiktok && pixel == 'tiktok' ) {
return cs_cookie_val == 'yes';
} else if ( categoryCookie === CS_Data.cs_script_cat?.reddit && pixel == 'reddit' ) {
return cs_cookie_val == 'yes';
}
}
}
return false;
}
/**
* Real Cookie Banner
*/
if (options.gdpr.real_cookie_banner_integration_enabled) {
var consentApi = window.consentApi;
if (consentApi) {
switch (pixel) {
case "analytics":
return consentApi.consentSync("http", "_ga", "*").cookieOptIn;
case "facebook":
return consentApi.consentSync("http", "_fbp", "*").cookieOptIn;
case "pinterest":
return consentApi.consentSync("http", "_pinterest_sess", ".pinterest.com").cookieOptIn;
case "bing":
return consentApi.consentSync("http", "_uetsid", "*").cookieOptIn;
case "google_ads":
return consentApi.consentSync("http", "1P_JAR", ".google.com").cookieOptIn;
case 'tiktok':
return consentApi.consentSync("http", "tt_webid_v2", ".tiktok.com").cookieOptIn;
default:
return true;
}
}
}
return true;
},
setupGdprCallbacks: function () {
let isConcent = false;
/**
* Cookiebot
*/
if ( options.gdpr.cookiebot_integration_enabled && typeof Cookiebot !== 'undefined' ) {
isConcent = true;
window.addEventListener( "CookiebotOnConsentReady", function () {
let consent = {
facebook: true,
ga: true,
google_ads: true,
tiktok: true,
bing: true,
pinterest: true,
gtm: true,
};
Utils.initializeVideoAPIs( options );
Utils.manageCookies();
if ( Cookiebot.consent.marketing ) {
Facebook.loadPixel();
Bing.loadPixel();
Pinterest.loadPixel();
GAds.loadPixel();
TikTok.loadPixel();
consent.facebook = true;
consent.bing = true;
consent.google_ads = true;
consent.pinterest = true;
consent.tiktok = true;
}
if ( Cookiebot.consent.statistics ) {
Analytics.loadPixel();
consent.ga = true;
consent.gtm = true;
}
if ( !Cookiebot.consent.marketing ) {
Facebook.disable();
Pinterest.disable();
Bing.disable()
GAds.disable();
TikTok.disable();
consent.facebook = false;
consent.bing = false;
consent.google_ads = false;
consent.pinterest = false;
consent.tiktok = false;
}
if ( !Cookiebot.consent.statistics ) {
Analytics.disable();
consent.ga = false;
consent.gtm = false;
}
Utils.setupGDPRData( consent );
} );
}
/**
* Cookie Notice
*/
if ( options.gdpr.cookie_notice_integration_enabled ) {
isConcent = true;
$( document ).onFirst( 'click', '.cn-set-cookie', function () {
let consent = {};
if ( $( this ).data( 'cookie-set' ) === 'accept' ) {
Utils.initializeVideoAPIs( options );
Facebook.loadPixel();
Analytics.loadPixel();
GAds.loadPixel();
Pinterest.loadPixel();
Bing.loadPixel();
TikTok.loadPixel();
consent = {
facebook: true,
ga: true,
google_ads: true,
tiktok: true,
bing: true,
pinterest: true,
gtm: true,
};
} else {
Facebook.disable();
Analytics.disable();
GAds.disable();
Pinterest.disable();
Bing.disable();
TikTok.disable();
consent = {
facebook: false,
ga: false,
google_ads: false,
tiktok: false,
bing: false,
pinterest: false,
gtm: false,
};
}
Utils.setupGDPRData( consent );
} );
$( document ).onFirst( 'click', '.cn-revoke-cookie', function () {
Facebook.disable();
Analytics.disable();
GAds.disable();
Pinterest.disable();
Bing.disable();
TikTok.disable();
let consent = {
facebook: false,
ga: false,
google_ads: false,
tiktok: false,
bing: false,
pinterest: false,
gtm: false,
};
Utils.setupGDPRData( consent );
} );
}
/**
* Cookie Law Info
*/
if ( options.gdpr.cookie_law_info_integration_enabled ) {
isConcent = true;
$( document ).onFirst( 'click', '#wt-cli-accept-all-btn,#cookie_action_close_header, .cky-btn-accept', function () {
Utils.initializeVideoAPIs( options );
setTimeout( function () {
let cli_cookie = Cookies.get( 'cookieyes-consent' ) ?? Cookies.get( 'wt_consent' ) ?? Cookies.get( 'viewed_cookie_policy' );
if ( typeof cli_cookie !== 'undefined' ) {
if (
cli_cookie &&
(cli_cookie === Cookies.get('cookieyes-consent') || cli_cookie === Cookies.get('wt_consent'))
) {
if (getCookieYes('analytics') === 'yes') {
Utils.manageCookies();
}
} else if ( cli_cookie === Cookies.get( 'viewed_cookie_policy' ) && cli_cookie == 'yes' ) {
Utils.manageCookies();
}
}
}, 1000 )
Facebook.loadPixel();
Analytics.loadPixel();
GAds.loadPixel();
Pinterest.loadPixel();
Bing.loadPixel();
TikTok.loadPixel();
let consent = {
facebook: true,
ga: true,
google_ads: true,
tiktok: true,
bing: true,
pinterest: true,
gtm: true,
};
Utils.setupGDPRData( consent );
} );
$( document ).onFirst( 'click', '#cookie_action_close_header_reject, .cky-btn-reject', function () {
Facebook.disable();
Analytics.disable();
GAds.disable();
Pinterest.disable();
Bing.disable();
TikTok.disable();
let consent = {
facebook: false,
ga: false,
google_ads: false,
tiktok: false,
bing: false,
pinterest: false,
gtm: false,
};
Utils.setupGDPRData( consent );
} );
}
/**
* ConsentMagic
*/
if ( options.gdpr.consent_magic_integration_enabled && typeof CS_Data !== "undefined" ) {
isConcent = true;
let test_prefix = CS_Data.test_prefix,
cs_refresh_after_consent = false,
substring = "cs_enabled_cookie_term";
if ( CS_Data.cs_refresh_after_consent == 1 ) {
cs_refresh_after_consent = CS_Data.cs_refresh_after_consent;
}
let consent_actions = function () {
let theCookies = document.cookie.split( ';' );
let consent = {
facebook: true,
ga: true,
google_ads: true,
tiktok: true,
bing: true,
pinterest: true,
gtm: true,
reddit: true,
};
for ( let i = 1; i <= theCookies.length; i++ ) {
if ( theCookies[ i - 1 ].indexOf( substring ) !== -1 ) {
let categoryCookie = theCookies[ i - 1 ].replace( 'cs_enabled_cookie_term' + test_prefix + '_', '' );
categoryCookie = Number( categoryCookie.replace( /\D+/g, "" ) );
let cs_cookie_val = Cookies.get( 'cs_enabled_cookie_term' + test_prefix + '_' + categoryCookie );
if ( cs_cookie_val == 'yes' ) {
Utils.initializeVideoAPIs( options );
if ( ( categoryCookie === CS_Data.cs_script_cat.facebook ) || ( typeof CS_Data.cs_meta_ldu_mode !== "undefined" && CS_Data.cs_meta_ldu_mode ) ) {
Facebook.loadPixel();
}
if ( categoryCookie === CS_Data.cs_script_cat.bing || ( typeof CS_Data.cs_bing_consent_mode !== "undefined" && CS_Data.cs_bing_consent_mode.ad_storage.enabled ) ) {
Bing.loadPixel();
}
if ( categoryCookie === CS_Data.cs_script_cat.analytics || ( typeof CS_Data.cs_google_analytics_consent_mode !== "undefined" && CS_Data.cs_google_analytics_consent_mode == 1 ) ) {
Analytics.loadPixel();
}
if ( categoryCookie === CS_Data.cs_script_cat.gads || ( typeof CS_Data.cs_google_ads_consent_mode !== "undefined" && CS_Data.cs_google_ads_consent_mode == 1 ) ) {
GAds.loadPixel();
}
if ( categoryCookie === CS_Data.cs_script_cat.pinterest ) {
Pinterest.loadPixel();
}
if ( categoryCookie === CS_Data.cs_script_cat.tiktok ) {
TikTok.loadPixel();
}
if ( ( categoryCookie === CS_Data.cs_script_cat.reddit ) || ( typeof CS_Data.cs_reddit_ldu_mode !== "undefined" && CS_Data.cs_reddit_ldu_mode ) ) {
Reddit.loadPixel();
}
} else {
if ( ( categoryCookie === CS_Data.cs_script_cat.facebook ) && ( typeof CS_Data.cs_meta_ldu_mode == "undefined" || !CS_Data.cs_meta_ldu_mode ) ) {
Facebook.disable();
consent.facebook = false;
}
if ( categoryCookie === CS_Data.cs_script_cat.bing && ( typeof CS_Data.cs_bing_consent_mode == "undefined" || !CS_Data.cs_bing_consent_mode.ad_storage.enabled ) ) {
Bing.disable();
consent.bing = false;
}
if ( categoryCookie === CS_Data.cs_script_cat.analytics && ( typeof CS_Data.cs_google_analytics_consent_mode == "undefined" || CS_Data.cs_google_analytics_consent_mode == 0 ) ) {
Analytics.disable();
consent.ga = false;
consent.gtm = false;
}
if ( categoryCookie === CS_Data.cs_script_cat.gads && ( typeof CS_Data.cs_google_ads_consent_mode == "undefined" || CS_Data.cs_google_ads_consent_mode == 0 ) ) {
GAds.disable();
consent.google_ads = false;
}
if ( categoryCookie === CS_Data.cs_script_cat.pinterest ) {
Pinterest.disable();
consent.pinterest = false;
}
if ( categoryCookie === CS_Data.cs_script_cat.tiktok ) {
TikTok.disable();
consent.tiktok = false;
}
if ( ( categoryCookie === CS_Data.cs_script_cat.reddit ) && ( typeof CS_Data.cs_reddit_ldu_mode == "undefined" || !CS_Data.cs_reddit_ldu_mode ) ) {
Reddit.disable();
consent.reddit = false;
}
}
if ( Cookies.get( 'cs_enabled_advanced_matching' ) == 'yes' ) {
Facebook.loadPixel();
}
}
}
Utils.setupGDPRData( consent );
}
if ( !cs_refresh_after_consent ) {
consent_actions();
$( document ).on( 'click', '.cs_action_btn', function ( e ) {
e.preventDefault();
let consent = {
facebook: true,
ga: true,
google_ads: true,
tiktok: true,
bing: true,
pinterest: true,
gtm: true,
reddit: true,
};
let elm = $( this ),
button_action = elm.attr( 'data-cs_action' );
if ( button_action === 'allow_all' ) {
Utils.initializeVideoAPIs( options );
Facebook.loadPixel();
Bing.loadPixel();
Analytics.loadPixel();
GAds.loadPixel();
Pinterest.loadPixel();
TikTok.loadPixel();
Reddit.loadPixel();
consent.facebook = true;
consent.bing = true;
consent.ga = true;
consent.google_ads = true;
consent.pinterest = true;
consent.tiktok = true;
consent.reddit = true;
consent.gtm = true;
Utils.setupGDPRData( consent );
} else if ( button_action === 'disable_all' ) {
if (typeof CS_Data.cs_meta_ldu_mode == "undefined" || CS_Data.cs_meta_ldu_mode == 0 ) {
Facebook.disable();
consent.facebook = false;
}
if (typeof CS_Data.cs_bing_consent_mode == "undefined" || CS_Data.cs_bing_consent_mode.ad_storage.enabled == 0 ) {
Bing.disable();
consent.bing = false;
}
if ( typeof CS_Data.cs_google_analytics_consent_mode == "undefined" || CS_Data.cs_google_analytics_consent_mode == 0 ) {
Analytics.disable();
consent.ga = false;
consent.gtm = false;
}
if ( typeof CS_Data.cs_google_ads_consent_mode == "undefined" || CS_Data.cs_google_ads_consent_mode == 0 ) {
GAds.disable();
consent.google_ads = false;
}
if ( typeof CS_Data.cs_reddit_ldu_mode == "undefined" || CS_Data.cs_reddit_ldu_mode == 0 ) {
Reddit.disable();
consent.reddit = false;
}
Pinterest.disable();
TikTok.disable();
consent.pinterest = false;
consent.tiktok = false;
Utils.setupGDPRData( consent );
} else if ( button_action === 'cs_confirm' ) {
consent_actions();
}
} );
}
}
/**
* Real Cookie Banner
*/
if ( options.gdpr.real_cookie_banner_integration_enabled ) {
isConcent = true;
let consentApi = window.consentApi;
if ( consentApi ) {
consentApi.consent( "http", "_ga", "*" )
.then( Analytics.loadPixel.bind( Analytics ), Analytics.disable.bind( Analytics ) );
consentApi.consent( "http", "1P_JAR", ".google.com" )
.then( GAds.loadPixel.bind( GAds ), GAds.disable.bind( GAds ) );
consentApi.consent( "http", "_fbp", "*" )
.then( Facebook.loadPixel.bind( Facebook ), Facebook.disable.bind( Facebook ) );
consentApi.consent( "http", "_pinterest_sess", ".pinterest.com" )
.then( Pinterest.loadPixel.bind( Pinterest ), Pinterest.disable.bind( Pinterest ) );
consentApi.consent( "http", "_uetsid", "*" )
.then( Bing.loadPixel.bind( Bing ), Bing.disable.bind( Bing ) );
consentApi.consent( "http", "tt_webid_v2", ".tiktok.com" )
.then( TikTok.loadPixel.bind( TikTok ), TikTok.disable.bind( TikTok ) );
let consent = {
facebook: true,
ga: true,
google_ads: true,
tiktok: true,
bing: true,
pinterest: true,
gtm: true,
};
if (!consentApi.consentSync("http", "_ga", "*").cookieOptIn) {
consent.ga = false;
consent.gtm = false;
}
if (!consentApi.consentSync("http", "_fbp", "*").cookieOptIn) {
consent.facebook = false;
}
if (!consentApi.consentSync("http", "_pinterest_sess", ".pinterest.com").cookieOptIn) {
consent.pinterest = false;
}
if (!consentApi.consentSync("http", "_uetsid", "*").cookieOptIn) {
consent.bing = false;
}
if (!consentApi.consentSync("http", "1P_JAR", ".google.com").cookieOptIn) {
consent.google_ads = false;
}
if (!consentApi.consentSync("http", "tt_webid_v2", ".tiktok.com").cookieOptIn) {
consent.tiktok = false;
}
Utils.setupGDPRData( consent );
// load WatchVideo event APIs for Auto
/**
* Real Cookie Banner.
*/
if ( options.hasOwnProperty( 'automatic' ) && options.automatic.enable_video && options.automatic.enable_youtube ) {
consentApi.consent( "http", "CONSENT", ".youtube.com" ).then( Utils.initYouTubeAPI );
}
if ( options.hasOwnProperty( 'automatic' ) && options.automatic.enable_video && options.automatic.enable_vimeo ) {
consentApi.consent( "http", "player", ".vimeo.com" ).then( Utils.initVimeoAPI );
}
}
}
if ( !isConcent ) {
Utils.initializeVideoAPIs( options );
}
},
setupGDPRData: function ( consent ) {
consent = window.btoa( JSON.stringify( consent ) );
Cookies.set( 'pys_consent', consent, { expires: 365, path: '/', domain: domain } );
},
/**
* Enrich
*/
isCheckoutPage: function () {
return $('body').hasClass('woocommerce-checkout') || document.querySelector('.woocommerce-checkout') ||
$('body').hasClass('edd-checkout');
},
addCheckoutFields : function() {
var utm = "";
var utms = getUTMs()
$.each(utmTerms, function (index, name) {
if(index > 0) {
utm+="|";
}
utm+=name+":"+utms[name];
});
var utmIdList = "";
var utmsIds = getUTMId()
$.each(utmId, function (index, name) {
if(index > 0) {
utmIdList+="|";
}
utmIdList+=name+":"+utmsIds[name];
});
var utmIdListLast = "";
var utmsIdsLast = getUTMId(true)
$.each(utmId, function (index, name) {
if(index > 0) {
utmIdListLast+="|";
}
utmIdListLast+=name+":"+utmsIdsLast[name];
});
var utmLast = "";
var utmsLast = getUTMs(true)
$.each(utmTerms, function (index, name) {
if(index > 0) {
utmLast+="|";
}
utmLast+=name+":"+utmsLast[name];
});
var dateTime = getDateTime();
var landing = Cookies.get('pys_landing_page');
var lastLanding = Cookies.get('last_pys_landing_page');
var trafic = Cookies.get('pysTrafficSource');
var lastTrafic = Cookies.get('last_pysTrafficSource');
var $form = null;
if($('body').hasClass('woocommerce-checkout')) {
$form = $("form.woocommerce-checkout");
} else {
$form = $("#edd_purchase_form");
}
var inputs = {'pys_utm':utm,
'pys_utm_id':utmIdList,
'pys_browser_time':dateTime.join("|"),
'pys_landing':landing,
'pys_source':trafic,
'pys_order_type': $(".wcf-optin-form").length > 0 ? "wcf-optin" : "normal",
'last_pys_landing':lastLanding,
'last_pys_source':lastTrafic,
'last_pys_utm':utmLast,
'last_pys_utm_id':utmIdListLast,
}
Object.keys(inputs).forEach(function(key,index) {
$form.append(" ");
});
},
/**
* Advanced From Data
*/
saveAdvancedFormData: function ( email, phone, firstName, lastName, override = true ) {
if ( !options.cookie.disabled_advanced_form_data_cookie ) {
let data = Utils.getAdvancedFormData();
// Ensure data["address"] is an object
if ( email != null ) {
if ( !override ) {
if ( typeof data[ "email" ] === 'undefined' || !data[ "email" ] ) {
data[ "email" ] = email;
}
} else {
data[ "email" ] = email;
}
if ( typeof data[ "emails" ] === 'object' ) {
if ( override ) {
data[ "emails" ] = [ email, ...Object.values( data[ "emails" ] ) ];
} else {
data[ "emails" ] = [ ...Object.values( data[ "emails" ] ), email ];
}
} else {
data[ "emails" ] = [ email ];
}
data[ "emails" ] = [ ...new Set( data[ "emails" ] ) ];
data[ "emails" ] = data[ "emails" ].slice( 0, 3 );
}
if ( phone != null ) {
if ( !override ) {
if ( typeof data[ "phone" ] === 'undefined' || !data[ "phone" ] ) {
data[ "phone" ] = phone;
}
} else {
data[ "phone" ] = phone;
}
if ( typeof data[ "phones" ] === 'object' ) {
if ( override ) {
data[ "phones" ] = [ phone, ...Object.values( data[ "phones" ] ) ];
} else {
data[ "phones" ] = [ ...Object.values( data[ "phones" ] ), phone ];
}
} else {
data[ "phones" ] = [ phone ];
}
data[ "phones" ] = [ ...new Set( data[ "phones" ] ) ];
data[ "phones" ] = data[ "phones" ].slice( 0, 3 );
}
if ( firstName != null ) {
if ( !override ) {
if ( typeof data[ "first_name" ] === 'undefined' || !data[ "first_name" ] ) {
data[ "first_name" ] = firstName;
}
} else {
data[ "first_name" ] = firstName;
}
if ( typeof data[ "fns" ] === 'object' ) {
if ( override ) {
data[ "fns" ] = [ firstName, ...Object.values( data[ "fns" ] ) ];
} else {
data[ "fns" ] = [ ...Object.values( data[ "fns" ] ), firstName ];
}
} else {
data[ "fns" ] = [ firstName ];
}
data[ "fns" ] = [ ...new Set( data[ "fns" ] ) ];
data[ "fns" ] = data[ "fns" ].slice( 0, 2 );
}
if ( lastName != null ) {
if ( !override ) {
if ( typeof data[ "last_name" ] === 'undefined' || !data[ "last_name" ] ) {
data[ "last_name" ] = lastName;
}
} else {
data[ "last_name" ] = lastName;
}
if ( typeof data[ "lns" ] === 'object' ) {
if ( override ) {
data[ "lns" ] = [ lastName, ...Object.values( data[ "lns" ] ) ];
} else {
data[ "lns" ] = [ ...Object.values( data[ "fns" ] ), lastName ];
}
} else {
data[ "lns" ] = [ lastName ];
}
data[ "lns" ] = [ ...new Set( data[ "lns" ] ) ];
data[ "lns" ] = data[ "lns" ].slice( 0, 2 );
}
Cookies.set( 'pys_advanced_form_data', JSON.stringify( data ), { expires: 300,path: '/',domain: domain } );
} else {
Cookies.remove( 'pys_advanced_form_data', { path: '/',domain: domain } )
}
if(GTM.isEnabled()){
GTM.updateEnhancedConversionData();
}
if(Analytics.isEnabled()){
Analytics.updateEnhancedConversionData();
} else if ( GAds.isEnabled() ) {
GAds.updateEnhancedConversionData();
}
},
getAdvancedMergeFormData: function (allways_provided_data = false) {
const advanced = Utils.getAdvancedFormData();
let mergedData = {},
limit = options.tracking_analytics.use_multiple_provided_data || allways_provided_data ? 3 : 1,
address_limit = options.tracking_analytics.use_multiple_provided_data || allways_provided_data ? 2 : 1;
if ( options.tracking_analytics.use_encoding_provided_data || allways_provided_data) {
mergedData.sha256_email_address = [];
mergedData.sha256_phone_number = [];
mergedData.address = [];
if ( options.tracking_analytics.hasOwnProperty( "userData" ) ) {
if ( options.tracking_analytics.userData.hasOwnProperty( "emails" ) && Object.keys( options.tracking_analytics.userData.emails ).length > 0 ) {
Object.keys( options.tracking_analytics.userData.emails ).forEach( ( key ) => {
mergedData.sha256_email_address.push( sha256( options.tracking_analytics.userData.emails[ key ] ) );
} )
}
if ( options.tracking_analytics.userData.hasOwnProperty( "phones" ) && Object.keys( options.tracking_analytics.userData.phones ).length > 0 ) {
Object.keys( options.tracking_analytics.userData.phones ).forEach( ( key ) => {
mergedData.sha256_phone_number.push( sha256( options.tracking_analytics.userData.phones[ key ] ) );
} )
}
if ( options.tracking_analytics.userData.hasOwnProperty( "addresses" ) && Object.keys( options.tracking_analytics.userData.addresses ).length > 0 ) {
Object.keys( options.tracking_analytics.userData.addresses ).forEach( ( key ) => {
let address = Object.assign( {}, options.tracking_analytics.userData.addresses[ key ] );
if ( address.first_name ) {
address.sha256_first_name = address.first_name !== '' ? sha256( address.first_name ) : '';
delete address.first_name;
}
if ( address.last_name ) {
address.sha256_last_name = address.last_name !== '' ? sha256( address.last_name ) : '';
delete address.last_name;
}
mergedData.address.push( address );
} )
}
}
let data_persistency = options.data_persistency;
//emails
if ( advanced.emails && Object.keys( advanced.emails ).length > 0 ) {
Object.keys( advanced.emails ).forEach( ( key ) => {
if ( data_persistency === 'recent_data' ) {
mergedData.sha256_email_address.push( sha256( advanced.emails[ key ] ) );
} else {
mergedData.sha256_email_address.unshift( sha256( advanced.emails[ key ] ) );
}
} )
}
if ( advanced.email && advanced.email !== '' ) {
if ( data_persistency === 'recent_data' ) {
mergedData.sha256_email_address.push( sha256( advanced.email ) );
} else {
mergedData.sha256_email_address.unshift( sha256( advanced.email ) );
}
}
mergedData.sha256_email_address = [ ...new Set( mergedData.sha256_email_address ) ];
mergedData.sha256_email_address = mergedData.sha256_email_address.slice( 0, limit );
//phones
if ( advanced.phones && Object.keys( advanced.phones ).length > 0 ) {
Object.keys( advanced.phones ).forEach( ( key ) => {
if ( data_persistency === 'recent_data' ) {
mergedData.sha256_phone_number.push( sha256( advanced.phones[ key ] ) );
} else {
mergedData.sha256_phone_number.unshift( sha256( advanced.phones[ key ] ) );
}
} )
}
if ( advanced.phone && advanced.phone !== '' ) {
if ( data_persistency === 'recent_data' ) {
mergedData.sha256_phone_number.push( sha256( advanced.phone ) );
} else {
mergedData.sha256_phone_number.unshift( sha256( advanced.phone ) );
}
}
mergedData.sha256_phone_number = [ ...new Set( mergedData.sha256_phone_number ) ];
mergedData.sha256_phone_number = mergedData.sha256_phone_number.slice( 0, limit );
//first and last names
if ( advanced.fns && Object.keys( advanced.fns ).length > 0 ) {
Object.entries( advanced.fns ).forEach( ( item ) => {
if ( mergedData.address.length < address_limit ) {
let first_name = item[ 1 ];
let last_name = ( advanced.lns && Object.keys( advanced.lns ).length > 0 ) ? ( advanced.lns[ item[ 0 ] ] ? advanced.lns[ item[ 0 ] ] : advanced.lns[ 0 ] ) : '';
let address = {
sha256_first_name: first_name !== '' ? sha256( first_name ) : '',
sha256_last_name: last_name !== '' ? sha256( last_name ) : '',
// Add other address properties here if they exist in advanced
};
mergedData.address.push( address );
}
} )
}
if ( advanced.first_name || advanced.last_name ) {
if ( mergedData.address.length < address_limit ) {
let address = {
sha256_first_name: advanced.first_name !== '' ? sha256( advanced.first_name ) : '',
sha256_last_name: advanced.last_name !== '' ? sha256( advanced.last_name ) : '',
// Add other address properties here if they exist in advanced
};
mergedData.address.push( address );
}
}
} else {
mergedData.email = [];
mergedData.phone_number = [];
mergedData.address = [];
if ( options.tracking_analytics.hasOwnProperty( "userData" ) ) {
if ( options.tracking_analytics.userData.hasOwnProperty( "emails" ) && Object.keys( options.tracking_analytics.userData.emails ).length > 0 ) {
Object.keys( options.tracking_analytics.userData.emails ).forEach( ( key ) => {
mergedData.email.push( options.tracking_analytics.userData.emails[ key ] );
} )
}
if ( options.tracking_analytics.userData.hasOwnProperty( "phones" ) && Object.keys( options.tracking_analytics.userData.phones ).length > 0 ) {
Object.keys( options.tracking_analytics.userData.phones ).forEach( ( key ) => {
mergedData.phone_number.push( options.tracking_analytics.userData.phones[ key ] );
} )
}
if ( options.tracking_analytics.userData.hasOwnProperty( "addresses" ) && Object.keys( options.tracking_analytics.userData.addresses ).length > 0 ) {
Object.keys( options.tracking_analytics.userData.addresses ).forEach( ( key ) => {
mergedData.address.push( options.tracking_analytics.userData.addresses[ key ] );
} )
}
}
let data_persistency = options.data_persistency;
//emails
if ( advanced.emails && Object.keys( advanced.emails ).length > 0 ) {
Object.keys( advanced.emails ).forEach( ( key ) => {
if ( data_persistency === 'recent_data' ) {
mergedData.email.push( advanced.emails[ key ] );
} else {
mergedData.email.unshift( advanced.emails[ key ] );
}
} )
}
if ( advanced.email && advanced.email !== '' ) {
if ( data_persistency === 'recent_data' ) {
mergedData.email.push( advanced.email );
} else {
mergedData.email.unshift( advanced.email );
}
}
mergedData.email = [ ...new Set( mergedData.email ) ];
mergedData.email = mergedData.email.slice( 0, limit );
//phones
if ( advanced.phones && Object.keys( advanced.phones ).length > 0 ) {
Object.keys( advanced.phones ).forEach( ( key ) => {
if ( data_persistency === 'recent_data' ) {
mergedData.phone_number.push( advanced.phones[ key ] );
} else {
mergedData.phone_number.unshift( advanced.phones[ key ] );
}
} )
}
if ( advanced.phone && advanced.phone !== '' ) {
if ( data_persistency === 'recent_data' ) {
mergedData.phone_number.push( advanced.phone );
} else {
mergedData.phone_number.unshift( advanced.phone );
}
}
mergedData.phone_number = [ ...new Set( mergedData.phone_number ) ];
mergedData.phone_number = mergedData.phone_number.slice( 0, limit );
//first and last names
if ( advanced.fns && Object.keys( advanced.fns ).length > 0 ) {
Object.entries( advanced.fns ).forEach( ( item ) => {
if ( mergedData.address.length < address_limit ) {
let first_name = item[ 1 ];
let last_name = ( advanced.lns && Object.keys( advanced.lns ).length > 0 ) ? ( advanced.lns[ item[ 0 ] ] ? advanced.lns[ item[ 0 ] ] : advanced.lns[ 0 ] ) : '';
let address = {
first_name: first_name || '',
last_name: last_name || '',
// Add other address properties here if they exist in advanced
};
mergedData.address.push( address );
}
} )
}
if ( advanced.first_name || advanced.last_name ) {
if ( mergedData.address.length < address_limit ) {
let address = {
first_name: advanced.first_name || '',
last_name: advanced.last_name || '',
// Add other address properties here if they exist in advanced
};
mergedData.address.push( address );
}
}
}
Utils.removeEmptyProperties( mergedData );
return mergedData;
},
removeEmptyProperties : function(obj) {
if (obj.hasOwnProperty('address')) {
// Проходим по каждому массиву в 'address'
for (let i = 0; i < obj['address'].length; i++) {
let address1 = obj['address'][i];
// Сравниваем с каждым другим массивом в 'address'
for (let j = i + 1; j < obj['address'].length; j++) {
let address2 = obj['address'][j];
// Если находим дублирующиеся свойства, удаляем их из address2
for (let prop in address1) {
if (address1[prop] === address2[prop]) {
delete address2[prop];
}
}
}
}
}
for (let key in obj) {
if (obj[key] === null || obj[key] === undefined || obj[key] === '') {
delete obj[key];
} else if (Array.isArray(obj[key])) {
obj[key] = [...new Set(obj[key])]; // Удаление дубликатов из массива
obj[key] = obj[key].filter(item => item !== null && item !== undefined && item !== '');
// Обработка объектов внутри массивов
obj[key] = obj[key].map(item => {
if (item === null) {
return; // Пропускаем null элементы
} else if (Array.isArray(item)) {
return this.removeEmptyProperties(item);
} else if (typeof item === 'object') {
let cleanedItem = this.removeEmptyProperties(item);
if (Object.keys(cleanedItem).length > 0) {
return cleanedItem;
}
} else {
return item;
}
});
// Удаляем пустые объекты и null из массива
obj[key] = obj[key].filter(item => item !== undefined && !(typeof item === 'object' && Object.keys(item).length === 0));
if (obj[key].length === 0) {
delete obj[key];
}
} else if (typeof obj[key] === 'object') {
this.removeEmptyProperties(obj[key]);
if (Object.keys(obj[key]).length === 0) {
delete obj[key];
}
}
}
return obj;
},
getAdvancedFormData: function () {
let dataStr = Cookies.get("pys_advanced_form_data");
if(dataStr === undefined) {
return {'first_name':"",'last_name':"",'email':"",'phone':"",'fns':[],'lns':[],'emails':[],'phones':[]};
} else {
return JSON.parse(dataStr);
}
},
getFormFilledData: function ( event ) {
// First, resolve static/dynamic parameters
if (event.params && Object.keys(event.params).length > 0) {
Object.entries(event.params).forEach(([key, value]) => {
// Resolve parameter value (static or dynamic)
const resolvedValue = resolveParamValue(value, key);
if (resolvedValue !== null) {
event.params[key] = resolvedValue;
}
else {
delete event.params[key];
}
});
}
// Then, handle dynamic fields from cookies (existing logic)
if ( Object.keys(options.track_dynamic_fields).length > 0 && Object.keys(event.params).length > 0 ) {
Object.entries(event.params).forEach((item) => {
if ( options.track_dynamic_fields.hasOwnProperty(item[0]) ) {
let fieldData = Cookies.get('pys_dyn_field_' + item[1] );
if(fieldData !== undefined && fieldData !== '') {
event.params[item[0]] = fieldData;
} else {
delete event.params[item[0]];
}
}
})
}
return event;
}
};
}(options);
var TikTok = function (options) {
var initialized = false;
function fireEvent(name, event) {
if(typeof window.pys_event_data_filter === "function" && window.pys_disable_event_filter(name,'tiktok')) {
return;
}
var data = event.params;
var ids = event.pixelIds.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'tiktok');
})
var params = {};
Utils.copyProperties(data, params);
params.eventID = Utils.generateUniqueId(event);
if(ids.length > 0){
TikTok.fireEventAPI(name, event, params);
}
ids.forEach(function(pixelId){
if (options.debug) {
console.log('[TikTok] ' + name, params,"pixel_id",pixelId);
}
ttq.instance(pixelId).track(name,params)
});
var customEvent = new CustomEvent('tiktok_event_sent', {
detail: {
eventName: name,
params: params,
pixel_ids: ids
}
});
window.dispatchEvent(customEvent);
}
return {
tag: function() {
return "tiktok";
},
isEnabled: function () {
return options.hasOwnProperty('tiktok');
},
getHidePixel: function(){
if(this.isEnabled() && options.tiktok.hasOwnProperty('hide_pixels'))
{
return options.tiktok.hide_pixels;
}
return [];
},
disable: function () {
initialized = false;
},
loadPixel:function () {
if (initialized || !this.isEnabled() || !Utils.consentGiven('tiktok')) {
return;
}
for (var i = 0; i < options.tiktok.pixelIds.length; i++) {
var trackingId = options.tiktok.pixelIds[i];
if (!Utils.hideMatchingPixel(trackingId, 'tiktok')) {
!function (w, d, t) {
w.TiktokAnalyticsObject=t;
var ttq=w[t]=w[t]||[];
ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"];
ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};
for(var i=0;i 0) {
advancedMatching = options.tiktok.advanced_matching;
if(!advancedMatching.hasOwnProperty("external_id")){
if (Cookies.get('pbid')) {
advancedMatching["external_id"] = Cookies.get('pbid');
}
}
else if(advancedMatching.hasOwnProperty("external_id") && advancedMatching.external_id != Cookies.get('pbid'))
{
advancedMatching["external_id"] = Cookies.get('pbid') ? Cookies.get('pbid') : advancedMatching.external_id;
}
ttq.instance(pixelId).identify(advancedMatching)
}
});
initialized = true;
if (options.staticEvents.hasOwnProperty('tiktok')) {
var timeout = 1;
setTimeout(function (timeout) {
Utils.fireStaticEvents('tiktok', timeout);
}, 1500, timeout)
}
},
fireEvent: function (name, data) {
if (!initialized || !this.isEnabled()) {
return false;
}
data.delay = data.delay || 0;
if (data.delay === 0) {
fireEvent(name, data);
} else {
setTimeout(function (name, params) {
fireEvent(name, params);
}, data.delay * 1000, name, data);
}
return true;
},
fireEventAPI: function (name, event, params) {
var ids = event.pixelIds.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'tiktok');
})
var notCachedEventsIds = new Array();
var isAddToCartFromJs = options.woo.hasOwnProperty("addToCartCatchMethod")
&& options.woo.addToCartCatchMethod === "add_cart_js";
if(!isAddToCartFromJs) {
notCachedEventsIds.push('woo_add_to_cart_on_button_click')
}
if(options.tiktok.serverApiEnabled) {
if(!notCachedEventsIds.includes(event.e_id)) {
var isApiDisabled = options.gdpr.all_disabled_by_api ||
options.gdpr.tiktok_disabled_by_api ||
options.gdpr.cookiebot_integration_enabled ||
options.gdpr.cookie_notice_integration_enabled ||
options.gdpr.consent_magic_integration_enabled ||
options.gdpr.cookie_law_info_integration_enabled;
// Update eventID
// send event from server if they were block by gdpr or need send with delay
if( options.ajaxForServerEvent || isApiDisabled || event.delay > 0 || event.type !== "static" ){
var json = {
action: 'pys_tiktok_api_event',
pixel: TikTok.tag(),
event: name,
event_slug: event.e_id,
ids: ids,
data:params,
url:window.location.href,
event_id:params.eventID,
ajax_event:options.ajax_event
};
let delay = 0;
try {
if (sessionStorage) {
Object.keys(sessionStorage)
.filter(key => key.startsWith('wc_fragments_'))
.forEach((key) => {
let value = sessionStorage.getItem(key);
if (event.e_id === 'woo_add_to_cart_on_button_click') {
delay = 2000;
}
});
}
} catch (error) {
console.error('sessionStorage is not accessible:', error);
}
if(event.hasOwnProperty('woo_order')) {
json['woo_order'] = event.woo_order;
}
if(event.hasOwnProperty('edd_order')) {
json['edd_order'] = event.edd_order;
}
if (event.e_id === "automatic_event_internal_link" || event.e_id === "automatic_event_outbound_link" || name == 'PageView') {
delay = delay === 0 ? 500 : delay;
setTimeout(() => Utils.sendServerAjaxRequest(options.ajaxUrl, json), delay);
} else if (event.type != 'static') {
setTimeout(() => Utils.sendServerAjaxRequest(options.ajaxUrl, json), delay);
}
if ( ( event.type == 'static' && options.ajaxForServerStaticEvent ) || ( event.hasOwnProperty( 'ajaxFire' ) && event.ajaxFire ) ) {
setTimeout( () => Utils.sendServerAjaxRequest( options.ajaxUrl, json ), delay );
}
}
}
}
},
onClickEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAddToCartOnSingleEvent: function (product_id, qty, product_type, is_external, $form) {
window.pysWooProductData = window.pysWooProductData || [];
if (!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty(this.tag())) {
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()]);
Utils.copyProperties(window.pysWooProductData[product_id][this.tag()]['params'], event.params);
// maybe customize value option
if (options.woo.addToCartOnButtonValueEnabled && options.woo.addToCartOnButtonValueOption !== 'global') {
if (product_type === Utils.PRODUCT_BUNDLE) {
var data = $(".bundle_form .bundle_data").data("bundle_form_data");
var items_sum = getBundlePriceOnSingleProduct(data);
event.params.value = (parseFloat(data.base_price) + items_sum) * qty;
} else {
event.params.value = event.params.value * qty;
}
}
event.params.quantity = qty;
this.fireEvent(event.name, event);
}
}
},
onWooAddToCartOnButtonEvent: function (product_id) {
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty(this.tag())) {
var productData = window.pysWooProductData[product_id][this.tag()]
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()])
Utils.copyProperties(productData['params'], event.params)
event.pixelIds = productData['pixelIds'];
this.fireEvent(event.name, event);
}
}
},
onEddAddToCartOnButtonEvent : function (download_id, price_index, qty) {
if(!options.dynamicEvents.edd_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
var event = Utils.clone(options.dynamicEvents.edd_add_to_cart_on_button_click[this.tag()]);
if (window.pysEddProductData.hasOwnProperty(download_id)) {
var index;
if (price_index) {
index = download_id + '_' + price_index;
} else {
index = download_id;
}
if (window.pysEddProductData[download_id].hasOwnProperty(index)) {
if (window.pysEddProductData[download_id][index].hasOwnProperty(this.tag())) {
Utils.copyProperties(window.pysEddProductData[download_id][index][this.tag()].params, event.params);
this.fireEvent(event.name,event);
}
}
}
},
onPageScroll: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
onWatchVideo: function (event) {
if (initialized && this.isEnabled() && !event.fired) {
this.fireEvent(event.name, event);
}
},
onCommentEvent: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
onAdSenseEvent: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
onTime: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
}
}(options);
var Facebook = function (options) {
var defaultEventTypes = [
'PageView',
'ViewContent',
'Search',
'AddToCart',
'AddToWishlist',
'InitiateCheckout',
'AddPaymentInfo',
'Purchase',
'Lead',
'Subscribe',
'CustomizeProduct',
'FindLocation',
'StartTrial',
'SubmitApplication',
'Schedule',
'Contact',
'Donate'
];
var notCachedEventsIds = new Array();
var isAddToCartFromJs = options.woo.hasOwnProperty("addToCartCatchMethod")
&& options.woo.addToCartCatchMethod === "add_cart_js";
if(!isAddToCartFromJs) {
notCachedEventsIds.push('woo_add_to_cart_on_button_click')
}
var initialized = false;
var genereateFbp = function (){
return !Cookies.get('_fbp') ? 'fb.1.'+Date.now()+'.'+Math.floor(1000000000 + Math.random() * 9000000000) : Cookies.get('_fbp');
};
var genereateFbc = function (){
return getUrlParameter('fbclid') ? 'fb.1.'+Date.now()+'.'+getUrlParameter('fbclid') : ''
};
var configuredPixels = new Array();
function fireEvent(name, event) {
if(typeof window.pys_event_data_filter === "function" && window.pys_disable_event_filter(name,'facebook')) {
return;
}
var data = event.params;
var ids = event.pixelIds.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'facebook');
});
var actionType = defaultEventTypes.includes(name) ? 'trackSingle' : 'trackSingleCustom';
var params = {};
Utils.copyProperties(data, params);
Utils.copyProperties(Utils.getRequestParams(), params);
Utils.copyProperties(Utils.getRequestParams(), data);
params = Facebook.filterParams(params);
if(options.facebook.serverApiEnabled) {
if(event.e_id === "woo_remove_from_cart" ) {
Facebook.updateEventId(event.name);
event.eventID = Facebook.getEventId(event.name);
} else if(!notCachedEventsIds.includes(event.e_id)) {
var isApiDisabled = options.gdpr.all_disabled_by_api ||
options.gdpr.facebook_disabled_by_api ||
options.gdpr.cookiebot_integration_enabled ||
options.gdpr.cookie_notice_integration_enabled ||
options.gdpr.consent_magic_integration_enabled ||
options.gdpr.cookie_law_info_integration_enabled;
// Update eventID
event.eventID = Utils.generateUniqueId(event);
if(Cookies.get('_fbp')){
params._fbp = Cookies.get('_fbp');
}
if(Cookies.get('_fbc')){
params._fbc = Cookies.get('_fbc');
}
// send event from server if they was bloc by gdpr or need send with delay
if( options.ajaxForServerEvent || isApiDisabled ){
var json = {
action: 'pys_api_event',
pixel: 'facebook',
event: name,
event_slug: event.e_id,
ids: ids,
data:params,
url:window.location.href,
eventID:event.eventID,
ajax_event:options.ajax_event
};
if(event.hasOwnProperty('woo_order')) {
json['woo_order'] = event.woo_order;
}
if(event.hasOwnProperty('edd_order')) {
json['edd_order'] = event.edd_order;
}
let delay = 0;
try {
if (sessionStorage) {
Object.keys(sessionStorage)
.filter(key => key.startsWith('wc_fragments_'))
.forEach((key) => {
let value = sessionStorage.getItem(key);
if (event.e_id === 'woo_add_to_cart_on_button_click') {
delay = 2000;
}
});
}
} catch (error) {
console.error('sessionStorage is not accessible:', error);
}
if (event.e_id === "automatic_event_internal_link" || event.e_id === "automatic_event_outbound_link") {
delay = delay === 0 ? 500 : delay;
setTimeout(() => Utils.sendServerAjaxRequest(options.ajaxUrl, json), delay);
} else if (event.type != 'static') {
setTimeout(() => Utils.sendServerAjaxRequest(options.ajaxUrl, json), delay);
}
if ( ( event.type == 'static' && options.ajaxForServerStaticEvent ) || ( event.hasOwnProperty( 'ajaxFire' ) && event.ajaxFire ) ) {
setTimeout( () => Utils.sendServerAjaxRequest( options.ajaxUrl, json ), delay );
}
}
if( event.e_id !== "automatic_event_signup" && name == "CompleteRegistration" && options.facebook.wooCRSendFromServer ) {
return;
}
}
}
delete params._fbp;
delete params._fbc;
if (options.debug) {
console.log('[Facebook] ' + name, params,"pixel_ids",ids,"eventID",event.eventID);
}
// fire event for each pixel id
ids.forEach(function (pixelId) {
// add eventID for deduplicate events @see https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events/
var args = {};
if(options.facebook.serverApiEnabled && event.hasOwnProperty('eventID')) {
args.eventID = event.eventID;
}
Facebook.maybeInitPixel(pixelId);
fbq(actionType,pixelId, name, params,args);
});
var customEvent = new CustomEvent('facebook_event_sent', {
detail: {
eventName: name,
params: params,
pixel_ids: ids
}
});
window.dispatchEvent(customEvent);
}
/**
* Public API
*/
return {
tag: function() {
return "facebook";
},
isEnabled: function () {
return options.hasOwnProperty('facebook');
},
getHidePixel: function(){
if(this.isEnabled() && options.facebook.hasOwnProperty('hide_pixels'))
{
return options.facebook.hide_pixels;
}
return [];
},
initEventIdCookies: function (key) {
var ids = {};
ids[key] = pys_generate_token(36)
Cookies.set('pys_fb_event_id', JSON.stringify(ids), {path: '/',domain: domain});
},
updateEventId:function(key) {
var cooData = Cookies.get("pys_fb_event_id")
if(cooData === undefined) {
this.initEventIdCookies(key);
} else {
var data = JSON.parse(cooData);
data[key] = pys_generate_token(36);
Cookies.set('pys_fb_event_id', JSON.stringify(data), {path: '/',domain: domain} );
}
},
getEventId:function (key) {
var data = Cookies.get("pys_fb_event_id");
if(data === undefined) {
this.initEventIdCookies(key);
data = Cookies.get("pys_fb_event_id");
}
return JSON.parse(data)[key];
},
disable: function () {
initialized = false;
},
filterParams: function (params) {
var filteredParams = {};
if (options.facebook.hasOwnProperty('enabled_medical') && options.facebook.enabled_medical && options.facebook.hasOwnProperty('do_not_track_medical_param')) {
// Remove empty strings from the array
options.facebook.do_not_track_medical_param = options.facebook.do_not_track_medical_param.filter(Boolean);
for (const key in params) {
if (Array.isArray(options.facebook.do_not_track_medical_param)) {
if (!options.facebook.do_not_track_medical_param.includes(key)) {
filteredParams[key] = params[key];
}
}
}
}
else {
Utils.copyProperties(params, filteredParams);
}
return filteredParams;
},
/**
* Load pixel's JS
*/
loadPixel: function () {
if (initialized || !this.isEnabled() || !Utils.consentGiven('facebook')) {
return;
}
! function (f, b, e, v, n, t, s) {
if (f.fbq) return;
n = f.fbq = function () {
n.callMethod ?
n.callMethod.apply(n, arguments) : n.queue.push(arguments)
};
if (!f._fbq) f._fbq = n;
n.push = n;
n.loaded = !0;
n.version = '2.0';
n.agent = 'dvpixelyoursite';
n.queue = [];
t = b.createElement(e);
t.async = !0;
t.src = v;
s = b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t, s)
}(window,
document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
let expires = parseInt(options.cookie_duration);
if(!Cookies.get('_fbp')) {
Cookies.set('_fbp',genereateFbp(), { expires: expires,path: '/',domain: domain });
}
if(getUrlParameter('fbclid')) {
Cookies.set('_fbc',genereateFbc(), { expires: expires,path: '/',domain: domain });
}
var ids = options.facebook.pixelIds.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'facebook');
});
// initialize default pixel
ids.forEach(function (pixelId) {
Facebook.maybeInitPixel(pixelId);
});
initialized = true;
Utils.fireStaticEvents('facebook');
},
advancedMatching: function () {
if(options.facebook.advancedMatchingEnabled) {
let advancedMatchingForm = Utils.getAdvancedFormData();
let advancedMatching = {};
if(Object.keys(options.facebook.advancedMatching).length > 0) {
advancedMatching = options.facebook.advancedMatching;
}
if(!advancedMatching.hasOwnProperty("em")
&& advancedMatchingForm.hasOwnProperty("email") && advancedMatchingForm["email"].length > 0) {
advancedMatching["em"] = advancedMatchingForm["email"];
}
if(!advancedMatching.hasOwnProperty("ph")
&& advancedMatchingForm.hasOwnProperty("phone") && advancedMatchingForm["phone"].length > 0) {
advancedMatching["ph"] = advancedMatchingForm["phone"];
}
if(!advancedMatching.hasOwnProperty("fn")
&& advancedMatchingForm.hasOwnProperty("first_name") && advancedMatchingForm["first_name"].length > 0) {
advancedMatching["fn"] = advancedMatchingForm["first_name"];
}
if(!advancedMatching.hasOwnProperty("ln")
&& advancedMatchingForm.hasOwnProperty("last_name") && advancedMatchingForm["last_name"].length > 0) {
advancedMatching["ln"] = advancedMatchingForm["last_name"];
}
if(!advancedMatching.hasOwnProperty("external_id")){
if (Cookies.get('pbid')) {
advancedMatching["external_id"] = Cookies.get('pbid');
}
}
else if(advancedMatching.hasOwnProperty("external_id") && advancedMatching.external_id != Cookies.get('pbid'))
{
advancedMatching["external_id"] = Cookies.get('pbid') ? Cookies.get('pbid') : advancedMatching.external_id;
}
if(Object.keys(advancedMatching).length > 0) {
return advancedMatching;
}
}
return false
},
maybeInitPixel: function(pixelId) {
if(configuredPixels.includes(pixelId)) return;
if (options.facebook.removeMetadata || Utils.hideMatchingPixel(pixelId, this.tag())) {
fbq('set', 'autoConfig', false, pixelId);
}
let advancedMatching = Facebook.advancedMatching();
if ( +options.facebook.meta_ldu === 1 ) {
fbq( 'dataProcessingOptions', [ 'LDU' ], 0, 0 );
}
if (options.gdpr.consent_magic_integration_enabled && typeof CS_Data !== "undefined") {
if(!advancedMatching) {
fbq('init', pixelId);
} else {
var test_prefix = CS_Data.test_prefix;
var cs_advanced_matching = Cookies.get('cs_enabled_advanced_matching'+test_prefix);
if (jQuery('#cs_enabled_advanced_matching'+test_prefix).length > 0) {
if (cs_advanced_matching == 'yes') {
fbq('init', pixelId, advancedMatching);
} else {
fbq('init', pixelId);
}
} else {
fbq('init', pixelId, advancedMatching);
}
}
} else {
if(!advancedMatching) {
fbq('init', pixelId);
} else {
fbq('init', pixelId, advancedMatching);
}
}
configuredPixels.push(pixelId);
},
fireEvent: function (name, data) {
if (!initialized || !this.isEnabled()) {
return false;
}
data.delay = data.delay || 0;
data.params = data.params || {};
if (data.delay === 0) {
fireEvent(name, data);
} else {
setTimeout(function (name, params) {
fireEvent(name, params);
}, data.delay * 1000, name, data);
}
return true;
},
onAdSenseEvent: function (event) {
this.fireEvent(event.name, event);
},
onClickEvent: function (event) {
this.fireEvent(event.name, event);
},
onWatchVideo: function (event) {
this.fireEvent(event.name, event);
},
onCommentEvent: function (event) {
this.fireEvent(event.name, event);
},
onFormEvent: function (event) {
this.fireEvent(event.name, event);
},
onDownloadEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAddToCartOnButtonEvent: function (product_id) {
window.pysWooProductData = window.pysWooProductData || [];
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('facebook')) {
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()])
Utils.copyProperties(window.pysWooProductData[product_id]['facebook']['params'], event.params)
event.pixelIds = window.pysWooProductData[product_id]['facebook']['pixelIds'];
this.fireEvent(event.name, event);
}
}
},
onWooAddToCartOnSingleEvent: function (product_id, qty, product_type, is_external, $form) {
window.pysWooProductData = window.pysWooProductData || [];
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
if (product_type === Utils.PRODUCT_VARIABLE && !options.facebook.wooVariableAsSimple) {
product_id = parseInt($form.find('input[name="variation_id"]').val());
}
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('facebook')) {
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click.facebook);
Utils.copyProperties(window.pysWooProductData[product_id]['facebook']['params'], event.params);
var groupValue = 0;
if(product_type === Utils.PRODUCT_GROUPED ) {
$form.find(".woocommerce-grouped-product-list .qty").each(function(index){
var childId = $(this).attr('name').replaceAll("quantity[","").replaceAll("]","");
var quantity = parseInt($(this).val());
if(isNaN(quantity)) {
quantity = 0;
}
var childItem = window.pysWooProductData[product_id]['facebook'].grouped[childId];
if(quantity == 0) {
event.params.content_ids.forEach(function(el,index,array) {
if(el == childItem.content_id) {
array.splice(index, 1);
}
});
}
if(event.params.hasOwnProperty('contents')) {
event.params.contents.forEach(function(el,index,array) {
if(el.id == childItem.content_id) {
if(quantity > 0){
el.quantity = quantity;
} else {
array.splice(index, 1);
}
}
});
}
groupValue += childItem.price * quantity;
});
if(groupValue == 0) return; // skip if no items selected
}
// maybe customize value option
if (options.woo.addToCartOnButtonValueEnabled && options.woo.addToCartOnButtonValueOption !== 'global') {
if(product_type === Utils.PRODUCT_GROUPED) {
event.params.value = groupValue;
} else if(product_type === Utils.PRODUCT_BUNDLE) {
var data = $(".bundle_form .bundle_data").data("bundle_form_data");
var items_sum = getBundlePriceOnSingleProduct(data);
event.params.value = (parseFloat(data.base_price) + items_sum )* qty;
} else {
event.params.value = event.params.value * qty;
}
}
// only when non Facebook for WooCommerce logic used
if (event.params.hasOwnProperty('contents') && product_type !== Utils.PRODUCT_GROUPED) {
event.params.contents[0].quantity = qty;
}
var event_name = is_external ? options.woo.affiliateEventName : event.name;
this.fireEvent(event_name, event);
}
}
},
onWooRemoveFromCartEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAffiliateEvent: function (product_id) {
if(!options.dynamicEvents.woo_affiliate.hasOwnProperty(this.tag()))
return;
var event = Utils.clone(options.dynamicEvents.woo_affiliate[this.tag()]);
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('facebook')) {
Utils.copyProperties(window.pysWooProductData[product_id][this.tag()].params, event.params)
this.fireEvent(options.woo.affiliateEventName, event);
}
}
},
onWooPayPalEvent: function (event) {
this.fireEvent(event.name, event);
},
onEddAddToCartOnButtonEvent: function (download_id, price_index, qty) {
if(!options.dynamicEvents.edd_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
var event = Utils.clone(options.dynamicEvents.edd_add_to_cart_on_button_click[this.tag()]);
if (window.pysEddProductData.hasOwnProperty(download_id)) {
var index;
if (price_index) {
index = download_id + '_' + price_index;
} else {
index = download_id;
}
if (window.pysEddProductData[download_id].hasOwnProperty(index)) {
if (window.pysEddProductData[download_id][index].hasOwnProperty('facebook')) {
Utils.copyProperties(window.pysEddProductData[download_id][index]['facebook']["params"], event.params)
// maybe customize value option
if (options.edd.addToCartOnButtonValueEnabled && options.edd.addToCartOnButtonValueOption !== 'global') {
event.params.value = event.params.value * qty;
}
// update contents qty param
var contents = event.params.contents;
contents[0].quantity = qty;
event.params.contents = contents;
this.fireEvent(event.name,event);
}
}
}
},
onEddRemoveFromCartEvent: function (event) {
this.fireEvent(event.name, event);
},
onPageScroll: function (event) {
this.fireEvent(event.name, event);
},
onTime: function (event) {
this.fireEvent(event.name, event);
},
};
}(options);
var Analytics = function (options) {
var initialized = false;
var isAllowEnhancedConversions = false;
/**
* Fires event
*
* @link: https://developers.google.com/analytics/devguides/collection/gtagjs/sending-data
* @link: https://developers.google.com/analytics/devguides/collection/gtagjs/events
* @link: https://developers.google.com/gtagjs/reference/event
* @link: https://developers.google.com/gtagjs/reference/parameter
*
* @link: https://developers.google.com/analytics/devguides/collection/gtagjs/custom-dims-mets
*
* @param name
* @param data
*/
function fireEvent(name, event) {
if(typeof window.pys_event_data_filter === "function" && window.pys_disable_event_filter(name,'ga')) {
return;
}
var eventParams = event.params;
var valuesArray = Object.values(event.trackingIds);
var ids = valuesArray.filter(function (pixelId) {
return loadTags.some(loadTag => pixelId.startsWith(loadTag)) && !Utils.hideMatchingPixel(pixelId, 'ga') && !Utils.hideMatchingPixel(pixelId, 'google_ads');
})
// Generate unique event_id for deduplication
eventParams.event_id = Utils.generateUniqueId(event);
event.eventID = Utils.generateUniqueId(event);
Utils.copyProperties(Utils.getRequestParams(), eventParams);
var copyParams = Utils.copyProperties(eventParams, {}); // copy params because mapParamsTov4 can modify it
var params = mapParamsTov4(ids,name,copyParams)
var _fireEvent = function (tracking_ids,name,params) {
params['send_to'] = tracking_ids;
if (options.debug) {
console.log('[Google Analytics #' + tracking_ids + '] ' + name, params);
}
// Send via gtag
gtag('event', name, params);
var customEvent = new CustomEvent('gtag_event_sent', {
detail: {
eventName: name,
params: params,
pixel_ids: tracking_ids
}
});
window.dispatchEvent(customEvent);
};
delete params.analytics_storage;
delete params.ad_storage;
delete params.ad_user_data;
delete params.ad_personalization;
if(options.hasOwnProperty('google_ads')){
var conversion_event_name = event.e_id;
switch ( conversion_event_name ) {
case "woo_add_to_cart_on_cart_page":
case "woo_add_to_cart_on_checkout_page":
case "woo_add_to_cart_on_button_click":
conversion_event_name = 'woo_add_to_cart';
break;
case "edd_add_to_cart_on_cart_page":
case "edd_add_to_cart_on_checkout_page":
case "edd_add_to_cart_on_button_click":
conversion_event_name = 'edd_add_to_cart';
break;
case "automatic_event_adsense":
case "automatic_event_comment":
case "automatic_event_download":
case "automatic_event_email_link":
case "automatic_event_form":
case "automatic_event_internal_link":
case "automatic_event_outbound_link":
case "automatic_event_scroll":
case "automatic_event_tel_link":
case "automatic_event_time_on_page":
case "automatic_event_video":
conversion_event_name = 'automatic_event';
break;
}
if ( conversion_event_name !== 'automatic_event' &&
typeof options.google_ads[conversion_event_name + '_conversion_track'] !== 'undefined' ) {
const conversionTrack = options.google_ads[ conversion_event_name + '_conversion_track' ];
if ( conversionTrack === 'conversion' ) {
ids = ids.map(id => id.split('/')[0])
}
}
}
_fireEvent(ids, name, params);
if(event.hasOwnProperty('unify') && event.unify){
isTrackEventForGA.push(name);
}
}
function normalizeEventName(eventName) {
var matches = {
ViewContent: 'view_item',
AddToCart: 'add_to_cart',
AddToWishList: 'add_to_wishlist',
InitiateCheckout: 'begin_checkout',
Purchase: 'purchase',
Lead: 'generate_lead',
CompleteRegistration: 'sign_up',
AddPaymentInfo: 'set_checkout_option'
};
return matches.hasOwnProperty(eventName) ? matches[eventName] : eventName;
}
function mapParamsTov4(tag,name,param) {
//GA4 automatically collects a number of parameters for all events
var hasGA4Tag = false;
// end
if (Array.isArray(tag)) {
hasGA4Tag = tag.some(function (element) {
return isv4(element);
});
} else if(isv4(tag)) {
// tag является строкой и соответствует GA4
hasGA4Tag = true;
}
if(hasGA4Tag) {
delete param.event_category;
delete param.event_label;
delete param.ecomm_prodid;
delete param.ecomm_pagetype;
delete param.ecomm_totalvalue;
if(name === 'search') {
param['search'] = param.search_term;
delete param.search_term;
delete param.dynx_itemid;
delete param.dynx_pagetype;
delete param.dynx_totalvalue;
}
}
return param;
}
function isv4(tag) {
return tag.indexOf('G') === 0;
}
/**
* Public API
*/
return {
tag: function() {
return "ga";
},
isEnabled: function () {
return options.hasOwnProperty('ga');
},
getHidePixel: function(){
if(this.isEnabled() && options.ga.hasOwnProperty('hide_pixels'))
{
return options.ga.hide_pixels;
}
return [];
},
disable: function () {
initialized = false;
},
updateEnhancedConversionData : function () {
if (!initialized || !this.isEnabled()) {
return;
}
if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.hasOwnProperty("userDataEnable") && options.tracking_analytics.userDataEnable) {
var advanced = Utils.getAdvancedMergeFormData();
if (Object.keys(advanced).length > 0) {
gtag('set', 'user_data', advanced);
}
}
},
loadPixel: function () {
if (initialized || !this.isEnabled() || !Utils.consentGiven('analytics')) {
return;
}
for (var i = 0; i < options.ga.trackingIds.length; i++) {
var trackingId = options.ga.trackingIds[i];
if (!Utils.hideMatchingPixel(trackingId, 'ga')) {
Utils.loadGoogleTag(trackingId);
break;
}
}
if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.hasOwnProperty("userDataEnable") && options.tracking_analytics.userDataEnable){
var advanced = Utils.getAdvancedMergeFormData();
if(Object.keys(advanced).length > 0){
gtag('set', 'user_data', advanced);
}
}
var config = {};
if(options.user_id && options.user_id != 0) {
config.user_id = options.user_id;
}
config.url_passthrough = options.ga.url_passthrough;
// Cross-Domain tracking
if (options.ga.crossDomainEnabled) {
config.linker = {
accept_incoming: options.ga.crossDomainAcceptIncoming,
domains: options.ga.crossDomainDomains
};
}
var ids = options.ga.trackingIds.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'ga');
});
loadTags.push(...ids);
ids.forEach(function (trackingId,index) {
var obj = options.ga.isDebugEnabled;
var searchValue = "index_"+index;
var config_for_tag = Object.assign({}, config);
config_for_tag.debug_mode = false;
config_for_tag.send_page_view = !options.ga.custom_page_view_event;
for (var key in obj) {
if (obj[key] === searchValue) {
config_for_tag.debug_mode = true;
break;
}
}
if(!config_for_tag.debug_mode)
{
delete config_for_tag.debug_mode;
}
if(isv4(trackingId)) {
if(options.ga.disableAdvertisingPersonalization) {
config_for_tag.allow_ad_personalization_signals = false
}
}
if(options.ga.hasOwnProperty('additionalConfig')){
if(options.ga.additionalConfig.hasOwnProperty(trackingId) && options.ga.additionalConfig[trackingId]){
config_for_tag.first_party_collection = options.ga.additionalConfig[trackingId].first_party_collection;
}
}
if(options.ga.hasOwnProperty('serverContainerUrls')){
if(options.ga.serverContainerUrls.hasOwnProperty(trackingId) && options.ga.serverContainerUrls[trackingId].enable_server_container != false){
if(options.ga.serverContainerUrls[trackingId].server_container_url != ''){
config_for_tag.server_container_url = options.ga.serverContainerUrls[trackingId].server_container_url;
}
if(options.ga.serverContainerUrls[trackingId].transport_url != ''){
config_for_tag.transport_url = options.ga.serverContainerUrls[trackingId].transport_url;
}
}
}
if (options.gdpr.cookiebot_integration_enabled && typeof Cookiebot !== 'undefined') {
var cookiebot_consent_category = options.gdpr['cookiebot_analytics_consent_category'];
if (options.gdpr['analytics_prior_consent_enabled']) {
if (Cookiebot.consented === true && Cookiebot.consent[cookiebot_consent_category]) {
gtag('config', trackingId, config_for_tag);
}
} else {
if (Cookiebot.consent[cookiebot_consent_category]) {
gtag('config', trackingId, config_for_tag);
}
}
}
else
{
gtag('config', trackingId, config_for_tag);
}
});
if(!isAdsLoad && GAds.isEnabled() && options.google_ads.conversion_ids.length > 0 && Utils.consentGiven('google_ads')) {
for (var i = 0; i < options.google_ads.conversion_ids.length; i++) {
var trackingId = options.google_ads.conversion_ids[i];
if (!Utils.hideMatchingPixel(trackingId, 'google_ads')) {
Utils.loadGoogleTag(trackingId);
break;
}
}
var ids = options.google_ads.conversion_ids.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'google_ads');
});
loadTags.push(...ids);
// configure conversion ids
ids.forEach(function (conversion_id,index) {
gtag('config', conversion_id);
if(options.google_ads.enhanced_conversion.includes("index_"+index)) {
isAllowEnhancedConversions = true
gtag('config', conversion_id,{ 'allow_enhanced_conversions':true });
}
});
isAdsLoad = true;
}
initialized = true;
Utils.fireStaticEvents('ga');
$( document).trigger( "analytics_initialized")
},
fireEvent: function (name, data) {
if (!initialized || !this.isEnabled()) {
return false;
}
data.delay = data.delay || 0;
data.params = data.params || {};
if (data.delay === 0) {
fireEvent(name, data);
} else {
setTimeout(function (name, params) {
fireEvent(name, params);
}, data.delay * 1000, name, data);
}
return true;
},
onAdSenseEvent: function (event) {
this.fireEvent(event.name, event);
},
onClickEvent: function (event) {
this.fireEvent(event.name, event);
},
onWatchVideo: function (event) {
if(!event.hasOwnProperty("youtube_disabled")
|| !event.youtube_disabled
|| event.params.video_type !== "youtube") {
this.fireEvent(event.name, event);
}
},
onCommentEvent: function (event) {
this.fireEvent(event.name, event);
},
onFormEvent: function (event) {
this.fireEvent(event.name, event);
},
onDownloadEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAddToCartOnButtonEvent: function (product_id, prod_info = null) {
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('ga')) {
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()]);
Utils.copyProperties(window.pysWooProductData[product_id]['ga'].params, event.params)
event.trackingIds = window.pysWooProductData[product_id]['ga']['trackingIds'];
if(prod_info)
{
if(prod_info['pys_list_name_productlist_id'])
{
event.params.items[0]['item_list_id'] = prod_info['pys_list_name_productlist_id']
}
if(prod_info['pys_list_name_productlist_name'])
{
event.params.items[0]['item_list_name'] =prod_info['pys_list_name_productlist_name']
}
}
this.fireEvent(event.name, event);
}
}
},
onWooAddToCartOnSingleEvent: function (product_id, qty, product_type, is_external, $form, prod_info) {
window.pysWooProductData = window.pysWooProductData || [];
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()]);
if (product_type === Utils.PRODUCT_VARIABLE && !options.ga.wooVariableAsSimple) {
product_id = parseInt($form.find('input[name="variation_id"]').val());
}
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('ga')) {
Utils.copyProperties(window.pysWooProductData[product_id]['ga'].params, event.params);
if(product_type === Utils.PRODUCT_GROUPED ) {
var groupValue = 0;
$form.find(".woocommerce-grouped-product-list .qty").each(function(index){
var childId = $(this).attr('name').replaceAll("quantity[","").replaceAll("]","");
var quantity = parseInt($(this).val());
if(isNaN(quantity)) {
quantity = 0;
}
var childItem = window.pysWooProductData[product_id]['ga'].grouped[childId];
event.params.items.forEach(function(el,index,array) {
if(el.id == childItem.content_id) {
if(quantity > 0){
el.quantity = quantity;
el.price = childItem.price;
} else {
array.splice(index, 1);
}
}
});
groupValue += childItem.price * quantity;
});
if(options.woo.addToCartOnButtonValueEnabled &&
options.woo.addToCartOnButtonValueOption !== 'global' &&
event.params.hasOwnProperty('value')) {
event.params.value = groupValue;
}
if(groupValue == 0) return; // skip if no items selected
} else {
// update items qty param
event.params.items[0].quantity = qty;
}
// maybe customize value option
if (options.woo.addToCartOnButtonValueEnabled &&
options.woo.addToCartOnButtonValueOption !== 'global' &&
product_type !== Utils.PRODUCT_GROUPED)
{
if(event.params.hasOwnProperty('value')) {
event.params.value = event.params.items[0].price * qty;
}
}
if(prod_info)
{
if(prod_info['pys_list_name_productlist_id'])
{
event.params.items[0]['item_list_id'] = prod_info['pys_list_name_productlist_id']
}
if(prod_info['pys_list_name_productlist_name'])
{
event.params.items[0]['item_list_name'] =prod_info['pys_list_name_productlist_name']
}
}
var eventName = is_external ? options.woo.affiliateEventName : event.name;
eventName = normalizeEventName(eventName);
this.fireEvent(eventName, event);
}
}
},
onWooCheckoutProgressStep: function (event) {
this.fireEvent(event.name, event);
},
onWooSelectContent: function (event) {
const select_prod_list = {};
if (event.params.items[0].item_list_name !== undefined) {
select_prod_list.list_name = event.params.items[0].item_list_name;
}
if (event.params.items[0].item_list_id !== undefined) {
select_prod_list.list_id = event.params.items[0].item_list_id;
}
const url = new URL(window.location.href);
select_prod_list.url = url.origin + url.pathname;
Cookies.set('select_prod_list', JSON.stringify(select_prod_list), { expires: 1,path: '/' });
this.fireEvent(event.name, event);
},
onWooRemoveFromCartEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAffiliateEvent: function (product_id) {
if(!options.dynamicEvents.woo_affiliate.hasOwnProperty(this.tag()))
return;
var event = options.dynamicEvents.woo_affiliate[this.tag()];
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('ga')) {
event = Utils.clone(event );
Utils.copyProperties(window.pysWooProductData[product_id][this.tag()], event.params)
this.fireEvent(normalizeEventName(options.woo.affiliateEventName), event);
}
}
},
onWooPayPalEvent: function (event) {
this.fireEvent(event.name, event);
},
onEddAddToCartOnButtonEvent: function (download_id, price_index, qty) {
if(!options.dynamicEvents.edd_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
var event = Utils.clone(options.dynamicEvents.edd_add_to_cart_on_button_click[this.tag()]);
if (window.pysEddProductData.hasOwnProperty(download_id)) {
var index;
if (price_index) {
index = download_id + '_' + price_index;
} else {
index = download_id;
}
if (window.pysEddProductData[download_id].hasOwnProperty(index)) {
if (window.pysEddProductData[download_id][index].hasOwnProperty('ga')) {
Utils.copyProperties(window.pysEddProductData[download_id][index]['ga'].params, event.params);
// update items qty param
event.params.items[0].quantity = qty;
this.fireEvent(event.name,event);
}
}
}
},
onEddRemoveFromCartEvent: function (event) {
this.fireEvent(event.name, event);
},
onPageScroll: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
onTime: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
};
}(options);
var GAds = function (options) {
var initialized = false;
var isAllowEnhancedConversions = false
/**
* Fires event
*
* @link: https://developers.google.com/analytics/devguides/collection/gtagjs/sending-data
* @link: https://developers.google.com/analytics/devguides/collection/gtagjs/events
* @link: https://developers.google.com/gtagjs/reference/event
* @link: https://developers.google.com/gtagjs/reference/parameter
*/
function fireEvent(name, data) {
if(typeof window.pys_event_data_filter === "function" && window.pys_disable_event_filter(event_name,'google_ads')) {
return;
}
var _params = Utils.copyProperties(data.params,{});
_params.event_id = Utils.generateUniqueId(data);
var ids = data.ids.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'google_ads');
});
var conversionIds = data.hasOwnProperty('conversion_ids') ? data.conversion_ids.filter(function (conversion_id) {
return !Utils.hideMatchingPixel(conversion_id, 'google_ads');
}) : [];
var conversion_labels = data.hasOwnProperty('conversion_labels') ? data.conversion_labels.filter(function (conversion_label) {
conversion_id = conversion_label.split('/')[0];
return !Utils.hideMatchingPixel(conversion_id, 'google_ads');
}) : [];
Utils.copyProperties(Utils.getRequestParams(), _params);
var _fireEvent = function (conversion_id,event_name) {
params = Utils.copyProperties(_params, { send_to: conversion_id });
if("conversion" === event_name) {
delete params.items;
delete params.ecomm_pagetype;
delete params.ecomm_prodid;
delete params.ecomm_totalvalue;
}
if (options.debug) {
console.log('[Google Ads #' + conversion_id + '] ' + event_name, params);
}
gtag('event', event_name, params);
var customEvent = new CustomEvent('gtag_event_sent', {
detail: {
eventName: event_name,
params: params,
pixel_ids: conversion_id
}
});
window.dispatchEvent(customEvent);
};
if ( conversion_labels.length > 0 ) {
ids = conversion_labels;
if ( !isTrackEventForGA.includes( name ) ) {
_fireEvent( ids, name );
}
} else {
var conversion_event_name = data.e_id;
switch ( conversion_event_name ) {
case "woo_add_to_cart_on_cart_page":
case "woo_add_to_cart_on_checkout_page":
case "woo_add_to_cart_on_button_click":
conversion_event_name = 'woo_add_to_cart';
break;
case "edd_add_to_cart_on_cart_page":
case "edd_add_to_cart_on_checkout_page":
case "edd_add_to_cart_on_button_click":
conversion_event_name = 'edd_add_to_cart';
break;
case "automatic_event_adsense":
case "automatic_event_comment":
case "automatic_event_download":
case "automatic_event_email_link":
case "automatic_event_form":
case "automatic_event_internal_link":
case "automatic_event_outbound_link":
case "automatic_event_scroll":
case "automatic_event_tel_link":
case "automatic_event_time_on_page":
case "automatic_event_video":
conversion_event_name = 'automatic_event';
break;
}
if ( ids.length ) {
if ( conversion_event_name !== 'automatic_event' && options.hasOwnProperty('google_ads') && options.google_ads[ conversion_event_name + '_conversion_track' ] ) {
const conversionTrack = options.google_ads[ conversion_event_name + '_conversion_track' ];
if ( conversionTrack === 'conversion' ) {
_fireEvent( ids, "conversion" );
ids = conversionIds;
}
}
} else {
ids = conversionIds;
}
if ( !isTrackEventForGA.includes( name ) ) {
_fireEvent( ids, name );
}
}
}
function normalizeEventName(eventName) {
var matches = {
ViewContent: 'view_item',
AddToCart: 'add_to_cart',
AddToWishList: 'add_to_wishlist',
InitiateCheckout: 'begin_checkout',
Purchase: 'purchase',
Lead: 'generate_lead',
CompleteRegistration: 'sign_up',
AddPaymentInfo: 'set_checkout_option'
};
return matches.hasOwnProperty(eventName) ? matches[eventName] : eventName;
}
/**
* Public API
*/
return {
tag: function() {
return "google_ads";
},
isEnabled: function () {
return options.hasOwnProperty('google_ads');
},
getHidePixel: function(){
if(this.isEnabled() && options.google_ads.hasOwnProperty('hide_pixels'))
{
return options.google_ads.hide_pixels;
}
return [];
},
disable: function () {
initialized = false;
},
updateEnhancedConversionData : function () {
if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.hasOwnProperty("userDataEnable") && options.tracking_analytics.userDataEnable){
var advanced = Utils.getAdvancedMergeFormData()
gtag('set', 'user_data', advanced);
}
},
loadPixel: function () {
if (initialized || !this.isEnabled() || !Utils.consentGiven('google_ads')) {
return;
}
var ids = options.google_ads.conversion_ids.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'google_ads');
});
loadTags.push(...ids);
if(!isAdsLoad && options.google_ads.conversion_ids.length > 0){
for (var i = 0; i < options.google_ads.conversion_ids.length; i++) {
var trackingId = options.google_ads.conversion_ids[i];
if (!Utils.hideMatchingPixel(trackingId, 'google_ads')) {
Utils.loadGoogleTag(trackingId);
break;
}
}
// configure conversion ids
ids.forEach(function (conversion_id,index) {
let config = {};
if(options.google_ads.enhanced_conversion.includes("index_"+index)) {
isAllowEnhancedConversions = true;
config.allow_enhanced_conversions = true
}
// Cross-Domain tracking
if (options.google_ads.crossDomainEnabled) {
config.linker = {
accept_incoming: options.google_ads.crossDomainAcceptIncoming,
domains: options.google_ads.crossDomainDomains
};
}
gtag('config', conversion_id, config );
if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.hasOwnProperty("userDataEnable") && options.tracking_analytics.userDataEnableuserDataEnable){
var advanced = Utils.getAdvancedMergeFormData()
gtag('set', 'user_data', advanced);
}
});
isAdsLoad = true;
}
initialized = true;
Utils.fireStaticEvents('google_ads');
},
fireEvent: function (name, data) {
if (!initialized || !this.isEnabled()) {
return false;
}
data.delay = data.delay || 0;
data.params = data.params || {};
data.ids = data.ids || [];
data.conversion_labels = data.conversion_labels || [];
if (data.delay === 0) {
fireEvent(name, data);
} else {
setTimeout(function (name, data) {
fireEvent(name, data);
}, data.delay * 1000, name, data);
}
return true;
},
onAdSenseEvent: function (event) {
this.fireEvent(event.name, event);
},
onClickEvent: function (action, params) {
//disabled
},
onWatchVideo: function (event) {
this.fireEvent(event.name, event);
},
onCommentEvent: function (event) {
this.fireEvent(event.name, event);
},
onFormEvent: function (event) {
this.fireEvent(event.name, event);
},
onDownloadEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAddToCartOnButtonEvent: function (product_id) {
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('google_ads')) {
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()])
Utils.copyProperties(window.pysWooProductData[product_id]['google_ads']['params'].params, event.params)
event["ids"] = window.pysWooProductData[product_id]['google_ads']['ids']
event["conversion_labels"] = window.pysWooProductData[product_id]['google_ads']['conversion_labels']
this.fireEvent(event.name, event);
}
}
},
onWooAddToCartOnSingleEvent: function (product_id, qty, product_type, is_external, $form) {
window.pysWooProductData = window.pysWooProductData || [];
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()]);
if (product_type === Utils.PRODUCT_VARIABLE && !options.google_ads.wooVariableAsSimple) {
product_id = parseInt($form.find('input[name="variation_id"]').val());
}
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('google_ads')) {
Utils.copyProperties(window.pysWooProductData[product_id]['google_ads']["params"], event.params);
event["ids"] = window.pysWooProductData[product_id]['google_ads']['ids']
event["conversion_labels"] = window.pysWooProductData[product_id]['google_ads']['conversion_labels']
var groupValue = 0;
if(product_type === Utils.PRODUCT_GROUPED ) {
$form.find(".woocommerce-grouped-product-list .qty").each(function(index){
var childId = $(this).attr('name').replaceAll("quantity[","").replaceAll("]","");
var quantity = parseInt($(this).val());
if(isNaN(quantity)) {
quantity = 0;
}
var childItem = window.pysWooProductData[product_id]['google_ads'].grouped[childId];
if(options.woo.addToCartOnButtonValueEnabled &&
options.woo.addToCartOnButtonValueOption !== 'global') {
event.params.items.forEach(function(el,index,array) {
if(el.id == childItem.content_id) {
if(quantity > 0){
el.quantity = quantity;
el.price = childItem.price;
} else {
array.splice(index, 1);
}
}
});
}
groupValue += childItem.price * quantity;
});
if(groupValue == 0) return;
event.params.value = groupValue;
} else {
// update items qty param
event.params.items[0].quantity = qty;
}
// maybe customize value option
if (options.woo.addToCartOnButtonValueEnabled &&
options.woo.addToCartOnButtonValueOption !== 'global' &&
product_type !== Utils.PRODUCT_GROUPED) {
event.params.value = event.params.value * qty;
}
var eventName = is_external ? options.woo.affiliateEventName : event.name;
eventName = normalizeEventName(eventName);
this.fireEvent(eventName, event);
}
}
},
onWooRemoveFromCartEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAffiliateEvent: function (product_id) {
if(!options.dynamicEvents.woo_affiliate.hasOwnProperty(this.tag()))
return;
var event = options.dynamicEvents.woo_affiliate[this.tag()];
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('google_ads')) {
event = Utils.clone(event)
Utils.copyProperties(window.pysWooProductData[product_id][this.tag()], event.params)
this.fireEvent(normalizeEventName(options.woo.affiliateEventName), event);
}
}
},
onWooPayPalEvent: function (event) {
this.fireEvent(event.name, event);
},
onEddAddToCartOnButtonEvent: function (download_id, price_index, qty) {
if(!options.dynamicEvents.edd_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
var event = options.dynamicEvents.edd_add_to_cart_on_button_click[this.tag()];
if (window.pysEddProductData.hasOwnProperty(download_id)) {
var index;
if (price_index) {
index = download_id + '_' + price_index;
} else {
index = download_id;
}
if (window.pysEddProductData[download_id].hasOwnProperty(index)) {
if (window.pysEddProductData[download_id][index].hasOwnProperty('google_ads')) {
event = Utils.clone(event)
Utils.copyProperties(window.pysEddProductData[download_id][index]['google_ads']['params'], event.params);
event.ids = window.pysEddProductData[download_id][index]['google_ads']['ids']
// update items qty param
//params.items[0].quantity = qty;
this.fireEvent(event.name, event);
}
}
}
},
onEddRemoveFromCartEvent: function (event) {
this.fireEvent(event.name, event);
},
onPageScroll: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
onTime: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
};
}(options);
var GTM = function (options) {
var initialized = false;
var datalayer_name = 'dataLayer';
/*
* @param name
* @param data
*/
function fireEvent(name, event) {
if(typeof window.pys_event_data_filter === "function" && window.pys_disable_event_filter(name,'gtm')) {
return;
}
var eventParams = event.params;
var data = event.params;
var valuesArray = Object.values(event.trackingIds);
var ids = valuesArray.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'gtm');
})
Utils.copyProperties(Utils.getRequestParams(), eventParams);
var _fireEvent = function (tracking_id,name,params, event=null) {
var eventData = {};
var ContainerCodeHasTag = !options.gtm.gtm_just_data_layer && tracking_id.length > 0;
if(ContainerCodeHasTag) {
params['send_to'] = tracking_id;
}
else if(!options.gtm.gtm_just_data_layer){
return
}
if (params.hasOwnProperty('ecommerce')) {
eventData.ecommerce = params.ecommerce;
delete params.ecommerce;
}
var automatedParams = { ...params };
[params['manualName'], 'manualName', 'triggerType'].forEach(key => delete automatedParams[key]);
if(event && (!event.hasOwnProperty('hasAutoParam') || (event.hasOwnProperty('hasAutoParam') && event.hasAutoParam))) {
eventData.automatedParameters = automatedParams;
}
// Move custom parameters to eventData
if (params.hasOwnProperty(params['manualName'])) {
eventData[params['manualName']] = params[params['manualName']];
delete params[params['manualName']];
}
['manualName','triggerType'].forEach(key => {
if (params.hasOwnProperty(key)) {
eventData[key] = params[key];
delete params[key];
}
});
eventData.manualDataLayer = options.gtm.gtm_dataLayer_name ?? 'dataLayer';
eventData.event = name;
if (options.debug) {
if (ContainerCodeHasTag){
console.log('[Google GTM #' + tracking_id + '] ' + name, eventData);
}
else {
console.log('[Google GTM push to "'+datalayer_name+'"] ' + name, eventData);
}
}
window[datalayer_name].push(eventData);
var customEvent = new CustomEvent('gtm_event_sent', {
detail: {
eventName: name,
params: eventData,
pixel_ids: tracking_id
}
});
window.dispatchEvent(customEvent);
};
var copyParams = Utils.copyProperties(eventParams, {}); // copy params because mapParamsToGTM can modify it
var params = mapParamsToGTM(ids,name,copyParams)
params.event_id = Utils.generateUniqueId(event);
_fireEvent(ids, name, params, event);
}
function normalizeEventName(eventName) {
var matches = {
ViewContent: 'view_item',
AddToCart: 'add_to_cart',
AddToWishList: 'add_to_wishlist',
InitiateCheckout: 'begin_checkout',
Purchase: 'purchase',
Lead: 'generate_lead',
CompleteRegistration: 'sign_up',
AddPaymentInfo: 'set_checkout_option'
};
return matches.hasOwnProperty(eventName) ? matches[eventName] : eventName;
}
function mapParamsToGTM(tag,name,param) {
var hasGTM = false;
// end
if (Array.isArray(tag)) {
hasGTM = tag.some(function (element) {
return isGTM(element);
});
} else if(isGTM(tag)) {
hasGTM = true;
}
if(hasGTM) {
delete param.event_category;
delete param.event_label;
delete param.analytics_storage;
delete param.ad_storage;
delete param.ad_user_data;
delete param.ad_personalization;
if(name === 'search') {
param['search'] = param.search_term;
delete param.search_term;
delete param.dynx_itemid;
delete param.dynx_pagetype;
delete param.dynx_totalvalue;
}
}
return param;
}
function isGTM(tag) {
return tag.indexOf('GTM') === 0;
}
/**
* Public API
*/
return {
tag: function() {
return "gtm";
},
isEnabled: function () {
return options.hasOwnProperty('gtm');
},
getHidePixel: function(){
if(this.isEnabled() && options.gtm.hasOwnProperty('hide_pixels'))
{
return options.gtm.hide_pixels;
}
return [];
},
disable: function () {
initialized = false;
},
updateEnhancedConversionData : function () {
if (!initialized || !this.isEnabled()) {
return;
}
if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.hasOwnProperty("userDataEnable") && options.tracking_analytics.userDataEnable) {
var advanced = Utils.getAdvancedMergeFormData(true);
if (Object.keys(advanced).length > 0) {
window[datalayer_name].push({'user_data' : advanced});
}
}
},
loadPixel: function () {
if (initialized || !this.isEnabled() || !Utils.consentGiven('analytics')) {
return;
}
datalayer_name = options.gtm.gtm_dataLayer_name ?? 'dataLayer';
for (var i = 0; i < options.gtm.trackingIds.length; i++) {
var trackingId = options.gtm.trackingIds[i];
if (!Utils.hideMatchingPixel(trackingId, 'gtm') && !options.gtm.gtm_just_data_layer) {
console.log('[PYS] Google Tag Manager container code loaded');
Utils.loadGTMScript(trackingId);
break;
}
}
if(options.gtm.gtm_just_data_layer) {
console.warn && console.warn("[PYS] Google Tag Manager container code placement set to OFF !!!");
console.warn && console.warn("[PYS] Data layer codes are active but GTM container must be loaded using custom coding !!!");
if(options.gtm.trackingIds.length == 0){
Utils.loadGTMScript();
}
}
if(options.hasOwnProperty("tracking_analytics") && options.tracking_analytics.hasOwnProperty("userDataEnable") && options.tracking_analytics.userDataEnable){
var advanced = Utils.getAdvancedMergeFormData(true);
if(Object.keys(advanced).length > 0){
window[datalayer_name].push({'user_data' : advanced});
}
}
var config = {};
if(options.user_id && options.user_id != 0) {
config.user_id = options.user_id;
}
// Cross-Domain tracking
var ids = options.gtm.trackingIds.filter(function (pixelId) {
return !Utils.hideMatchingPixel(pixelId, 'gtm');
});
initialized = true;
Utils.fireStaticEvents('gtm');
},
fireEvent: function (name, data) {
if (!initialized || !this.isEnabled()) {
return false;
}
data.delay = data.delay || 0;
data.params = data.params || {};
if (data.delay === 0) {
fireEvent(name, data);
} else {
setTimeout(function (name, params) {
fireEvent(name, params);
}, data.delay * 1000, name, data);
}
return true;
},
onAdSenseEvent: function (event) {
this.fireEvent(event.name, event);
},
onClickEvent: function (event) {
this.fireEvent(event.name, event);
},
onWatchVideo: function (event) {
if(!event.hasOwnProperty("youtube_disabled")
|| !event.youtube_disabled
|| event.params.video_type !== "youtube") {
this.fireEvent(event.name, event);
}
},
onCommentEvent: function (event) {
this.fireEvent(event.name, event);
},
onFormEvent: function (event) {
this.fireEvent(event.name, event);
},
onDownloadEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAddToCartOnButtonEvent: function (product_id, prod_info = null) {
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('gtm')) {
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()]);
Utils.copyProperties(window.pysWooProductData[product_id]['gtm'].params, event.params)
event.trackingIds = window.pysWooProductData[product_id]['gtm']['trackingIds'];
if(prod_info)
{
item = event.params.hasOwnProperty('ecommerce') ? event.params.ecommerce.items[0] : event.params.items[0];
if(prod_info['pys_list_name_productlist_id'])
{
item['item_list_id'] = prod_info['pys_list_name_productlist_id']
}
if(prod_info['pys_list_name_productlist_name'])
{
item['item_list_name'] =prod_info['pys_list_name_productlist_name']
}
}
this.fireEvent(event.name, event);
}
}
},
onWooAddToCartOnSingleEvent: function (product_id, qty, product_type, is_external, $form, prod_info) {
window.pysWooProductData = window.pysWooProductData || [];
if(!options.dynamicEvents.woo_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
var event = Utils.clone(options.dynamicEvents.woo_add_to_cart_on_button_click[this.tag()]);
if (product_type === Utils.PRODUCT_VARIABLE && !options.gtm.wooVariableAsSimple) {
product_id = parseInt($form.find('input[name="variation_id"]').val());
}
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('gtm')) {
Utils.copyProperties(window.pysWooProductData[product_id]['gtm'].params, event.params);
params = event.params.hasOwnProperty('ecommerce') ? event.params.ecommerce : event.params;
if(product_type === Utils.PRODUCT_GROUPED ) {
var groupValue = 0;
$form.find(".woocommerce-grouped-product-list .qty").each(function(index){
var childId = $(this).attr('name').replaceAll("quantity[","").replaceAll("]","");
var quantity = parseInt($(this).val());
if(isNaN(quantity)) {
quantity = 0;
}
var childItem = window.pysWooProductData[product_id]['gtm'].grouped[childId];
params.items.forEach(function(el,index,array) {
if(el.id == childItem.content_id) {
if(quantity > 0){
el.quantity = quantity;
el.price = childItem.price;
} else {
array.splice(index, 1);
}
}
});
groupValue += childItem.price * quantity;
});
if(options.woo.addToCartOnButtonValueEnabled &&
options.woo.addToCartOnButtonValueOption !== 'global' &&
params.hasOwnProperty('value')) {
params.value = groupValue;
}
if(groupValue == 0) return; // skip if no items selected
} else {
// update items qty param
params.items[0].quantity = qty;
}
// maybe customize value option
if (options.woo.addToCartOnButtonValueEnabled &&
options.woo.addToCartOnButtonValueOption !== 'global' &&
product_type !== Utils.PRODUCT_GROUPED)
{
if(params.hasOwnProperty('value')) {
params.value = params.items[0].price * qty;
}
}
if(prod_info)
{
if(prod_info['pys_list_name_productlist_id'])
{
params.items[0]['item_list_id'] = prod_info['pys_list_name_productlist_id']
}
if(prod_info['pys_list_name_productlist_name'])
{
params.items[0]['item_list_name'] =prod_info['pys_list_name_productlist_name']
}
}
var eventName = is_external ? options.woo.affiliateEventName : event.name;
eventName = normalizeEventName(eventName);
this.fireEvent(eventName, event);
}
}
},
onWooCheckoutProgressStep: function (event) {
this.fireEvent(event.name, event);
},
onWooSelectContent: function (event) {
const select_prod_list = {};
if (event.params.items[0].item_list_name !== undefined) {
select_prod_list.list_name = event.params.items[0].item_list_name;
}
if (event.params.items[0].item_list_id !== undefined) {
select_prod_list.list_id = event.params.items[0].item_list_id;
}
const url = new URL(window.location.href);
select_prod_list.url = url.origin + url.pathname;
Cookies.set('select_prod_list', JSON.stringify(select_prod_list), { expires: 1,path: '/' });
this.fireEvent(event.name, event);
},
onWooRemoveFromCartEvent: function (event) {
this.fireEvent(event.name, event);
},
onWooAffiliateEvent: function (product_id) {
if(!options.dynamicEvents.woo_affiliate.hasOwnProperty(this.tag()))
return;
var event = options.dynamicEvents.woo_affiliate[this.tag()];
if (window.pysWooProductData.hasOwnProperty(product_id)) {
if (window.pysWooProductData[product_id].hasOwnProperty('gtm')) {
event = Utils.clone(event );
Utils.copyProperties(window.pysWooProductData[product_id][this.tag()], event.params)
this.fireEvent(normalizeEventName(options.woo.affiliateEventName), event);
}
}
},
onWooPayPalEvent: function (event) {
this.fireEvent(event.name, event);
},
onEddAddToCartOnButtonEvent: function (download_id, price_index, qty) {
if(!options.dynamicEvents.edd_add_to_cart_on_button_click.hasOwnProperty(this.tag()))
return;
var event = Utils.clone(options.dynamicEvents.edd_add_to_cart_on_button_click[this.tag()]);
if (window.pysEddProductData.hasOwnProperty(download_id)) {
var index;
if (price_index) {
index = download_id + '_' + price_index;
} else {
index = download_id;
}
if (window.pysEddProductData[download_id].hasOwnProperty(index)) {
if (window.pysEddProductData[download_id][index].hasOwnProperty('gtm')) {
Utils.copyProperties(window.pysEddProductData[download_id][index]['gtm'].params, event.params);
item = event.params.hasOwnProperty('ecommerce') ? event.params.ecommerce.items[0] : event.params.items[0];
// update items qty param
item.quantity = qty;
this.fireEvent(event.name,event);
}
}
}
},
onEddRemoveFromCartEvent: function (event) {
this.fireEvent(event.name, event);
},
onPageScroll: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
onTime: function (event) {
if (initialized && this.isEnabled()) {
this.fireEvent(event.name, event);
}
},
};
}(options);
var getPixelBySlag = function getPixelBySlag(slug) {
switch (slug) {
case "facebook": return window.pys.Facebook;
case "ga": return window.pys.Analytics;
case "gtm": return window.pys.GTM;
case "google_ads": return window.pys.GAds;
case "bing": return window.pys.Bing;
case "pinterest": return window.pys.Pinterest;
case "tiktok": return window.pys.TikTok;
case "reddit": return window.pys.Reddit;
}
}
window.pys = window.pys || {};
window.pys.Facebook = Facebook;
window.pys.Analytics = Analytics;
window.pys.GAds = GAds;
window.pys.GTM = GTM;
window.pys.Utils = Utils;
window.pys.TikTok = TikTok;
window.pys.getPixelBySlag = getPixelBySlag;
// Export getPixelBySlag globally for backward compatibility
window.getPixelBySlag = getPixelBySlag;
$(document).ready(function () {
if(Cookies.get('form_track'))
{
Cookies.remove('form_track')
}
if($("#pys_late_event").length > 0) {
var dirAttr = $("#pys_late_event").attr("dir");
if (dirAttr) {
try {
var events = JSON.parse(dirAttr);
} catch (e) {
console.warn("Invalid JSON in pys_late_event dir attribute:", e);
}
} else {
console.warn("pys_late_event dir attribute is undefined or empty");
}
if (events) {
for (var platform in events) {
if (events.hasOwnProperty(platform)) {
var platformEvents = events[platform];
platformEvents.forEach(function (event) {
var eventData = {};
eventData[event.e_id] = [event];
if (options.staticEvents.hasOwnProperty(platform)) {
Object.assign(options.staticEvents[platform], eventData);
} else {
options.staticEvents[platform] = eventData;
}
});
}
}
}
}
var Pinterest = Utils.setupPinterestObject();
var Bing = Utils.setupBingObject();
var Reddit = Utils.setupRedditObject();
if(options.hasOwnProperty('cookie'))
{
if(options.cookie.externalID_disabled_by_api || options.cookie.disabled_all_cookie)
{
Cookies.remove('pbid')
}
if(options.cookie.disabled_advanced_form_data_cookie || options.cookie.disabled_all_cookie)
{
Cookies.remove('pys_advanced_form_data')
}
if(options.cookie.disabled_landing_page_cookie || !options.enable_lading_page_param || options.cookie.disabled_all_cookie)
{
Cookies.remove('pys_landing_page', { path: '/',domain: domain })
Cookies.remove('last_pys_landing_page', { path: '/',domain: domain })
}
if(options.cookie.disabled_trafficsource_cookie || options.cookie.disabled_all_cookie)
{
Cookies.remove('pysTrafficSource', { path: '/',domain: domain })
Cookies.remove('last_pysTrafficSource', { path: '/',domain: domain })
}
if(options.cookie.disabled_first_visit_cookie || options.cookie.disabled_all_cookie)
{
Cookies.remove('pys_first_visit', { path: '/',domain: domain })
}
if(options.cookie.disabled_utmTerms_cookie || options.cookie.disabled_all_cookie)
{
$.each(Utils.utmTerms, function (index, name) {
Cookies.remove('pys_' + name, { path: '/',domain: domain })
});
$.each(Utils.utmTerms, function (index, name) {
Cookies.remove('last_pys_' + name, { path: '/',domain: domain })
});
}
if(options.cookie.disabled_utmId_cookie || options.cookie.disabled_all_cookie)
{
$.each(Utils.utmId,function(index,name) {
Cookies.remove('pys_' + name, { path: '/',domain: domain })
})
$.each(Utils.utmId,function(index,name) {
Cookies.remove('last_pys_' + name, { path: '/',domain: domain })
});
}
}
if (options.gdpr.cookie_law_info_integration_enabled) {
var cli_cookie = Cookies.get('cookieyes-consent') ?? Cookies.get('wt_consent') ?? Cookies.get('viewed_cookie_policy');
if (typeof cli_cookie !== 'undefined') {
if (cli_cookie === Cookies.get('cookieyes-consent') || cli_cookie === Cookies.get('wt_consent')) {
if (getCookieYes('analytics') === 'yes') {
Utils.manageCookies();
}
} else if (cli_cookie === Cookies.get('viewed_cookie_policy') && cli_cookie == 'yes') {
Utils.manageCookies();
}
}
}
if ( options.gdpr.consent_magic_integration_enabled && typeof CS_Data !== "undefined" ) {
if ( CS_Data.cs_script_cat.pys == CS_Data.cs_necessary_cat_id || CS_Data.cs_script_cat.pys == 0 ) {
Utils.manageCookies();
} else if ( Cookies.get( 'cs_enabled_cookie_term' + CS_Data.test_prefix + '_' + CS_Data.cs_script_cat.pys ) == 'yes' ) {
Utils.manageCookies();
}
} else {
Utils.manageCookies();
}
Utils.initializeRequestParams();
Utils.setupGdprCallbacks();
if ( options.enable_auto_save_advance_matching ) {
let override = options.data_persistency == 'recent_data';
//Setup Advanced Form Data
if ( options.advance_matching_form.enable_advance_matching_forms ) {
$( document ).on( "blur", "input[type='email']", function () {
let email = $( this ).val().trim().toLowerCase();
if ( Utils.validateEmail( email ) ) {
Utils.saveAdvancedFormData( email, null, null, null, override );
}
} )
$( document ).on( "blur", "input[type='tel']", function () {
let phone = $( this ).val().trim().replace( /\D/g, "" );
if ( phone.length > 5 ) {
Utils.saveAdvancedFormData( null, phone, null, null, override );
}
} )
$( document ).on( "blur", "input[type='text']", function () {
let name;
if ( $( this ).attr( "name" ) && $( this ).attr( "name" ) != '' ) {
name = $( this ).attr( "name" ).trim()
}
if ( name && options.advance_matching_form.advance_matching_fn_names.includes( name ) ) {
let value = $( this ).val().trim();
if ( value.length > 0 ) {
Utils.saveAdvancedFormData( null, null, value, null, override );
}
}
if ( name && options.advance_matching_form.advance_matching_ln_names.includes( name ) ) {
let value = $( this ).val().trim();
if ( value.length > 0 ) {
Utils.saveAdvancedFormData( null, null, null, value, override );
}
}
if ( name && options.advance_matching_form.advance_matching_tel_names.includes( name ) ) {
let value = $( this ).val().trim();
if ( value.length > 0 ) {
Utils.saveAdvancedFormData( null, value, null, null, override );
}
}
if ( name && options.advance_matching_form.advance_matching_em_names.includes( name ) ) {
let email = $( this ).val().trim().toLowerCase();
if ( Utils.validateEmail( email ) ) {
Utils.saveAdvancedFormData( email, null, null, null, false );
}
}
} )
}
//Setup Advanced Url Data
if ( Object.keys( options.advance_matching_url ).length > 0 && options.advance_matching_url.enable_advance_matching_url ) {
const url_params = new URLSearchParams( window.location.search );
url_params.forEach( ( value, key ) => {
if ( options.advance_matching_url.advance_matching_fn_names.includes( key ) ) {
Utils.saveAdvancedFormData( null, null, value.trim(), null, override );
}
if ( options.advance_matching_url.advance_matching_ln_names.includes( key ) ) {
Utils.saveAdvancedFormData( null, null, null, value.trim(), override );
}
if ( options.advance_matching_url.advance_matching_tel_names.includes( key ) ) {
Utils.saveAdvancedFormData( null, value.trim(), null, null, override );
}
if ( options.advance_matching_url.advance_matching_em_names.includes( key ) ) {
let email = value.trim().toLowerCase()
if ( Utils.validateEmail( email ) ) {
Utils.saveAdvancedFormData( email, null, null, null, override );
}
}
} );
}
}
// setup Click Event
if (
options.dynamicEvents.hasOwnProperty("automatic_event_internal_link") ||
options.dynamicEvents.hasOwnProperty("automatic_event_outbound_link") ||
options.dynamicEvents.hasOwnProperty("automatic_event_tel_link") ||
options.dynamicEvents.hasOwnProperty("automatic_event_email_link") ||
options.dynamicEvents.hasOwnProperty("automatic_event_download")
) {
$(document).onFirst('click', 'a, button, input[type="button"], input[type="submit"]', function (e) {
var $elem = $(this);
// Download
if(options.dynamicEvents.hasOwnProperty("automatic_event_download")) {
var isFired = false;
if ($elem.is('a')) {
var href = $elem.attr('href');
if (typeof href !== "string") {
return;
}
href = href.trim();
var extension = Utils.getLinkExtension(href);
var track_download = false;
if (extension.length > 0) {
if(options.dynamicEvents.hasOwnProperty("automatic_event_download") ) {
var pixels = Object.keys(options.dynamicEvents.automatic_event_download);
for (var i = 0; i < pixels.length; i++) {
var event = Utils.clone(options.dynamicEvents.automatic_event_download[pixels[i]]);
var extensions = event.extensions;
if (extensions.includes(extension)) {
if(pixels[i] == "tiktok" || pixels[i] == "reddit") {
getPixelBySlag(pixels[i]).fireEvent(event.name, event);
} else {
if (options.enable_remove_download_url_param) {
href = href.split('?')[0];
}
event.params.download_url = href;
event.params.download_type = extension;
event.params.download_name = Utils.getLinkFilename(href);
getPixelBySlag(pixels[i]).onDownloadEvent(event);
}
isFired = true;
}
}
}
}
}
if(isFired) { // prevent duplicate events on the same element
return;
}
}
if (!e.hasOwnProperty('originalEvent')) {
return;
}
if($elem.hasClass("add_to_cart_button") ||
$elem.hasClass("single_add_to_cart_button") ) { // add_to_cart_button fire in woo
return;
}
if(options.dynamicEvents.hasOwnProperty("wcf_add_to_cart_on_next_step_click")
&& $elem.hasClass("wcf-next-step-link")) {
return;// add_to_cart_button fire in woo cf
}
if(options.dynamicEvents.hasOwnProperty("wcf_add_to_cart_on_bump_click")
&& $elem.hasClass("wcf-bump-order-cb")) {
return;// add_to_cart_button fire in woo cf
}
if($elem.hasClass("remove_from_cart_button") ) { // cancel remove from cart
return;
}
if($elem.hasClass("remove") ) { // cancel remove from cart
if($elem.parents('.cart_item').length || $elem.parents('.mini_cart_item').length)
return;
}
if($elem.attr("name") == "update_cart" || $elem.attr("name") == "apply_coupon") { // cancel update cart or coupon button
return;
}
if ($elem.hasClass('pys_block')) {
return; // avoiding fake double clicks from Affiliate event
}
var text = "";
var target_url = "";
var linkType = "Internal Click";
if ($elem.is('a')) {
var href = $elem.attr('href');
// fixes #112
if (typeof href !== "string") {
return;
}
href = href.trim();
text = $elem.contents().filter(function() {
return this.nodeType === 3; // Фильтруем только текстовые узлы
}).text().trim();
if(options.enable_remove_target_url_param) {
target_url = href.split('?')[0];
} else {
target_url = href
}
//Email Event
if ( href.startsWith( 'mailto:' ) ) {
if ( options.triggerEventTypes.hasOwnProperty( "email_link" ) ) {
return;
} else {
setupEmailLinks();
}
return; // not fire next
}
// Phone
if (href.startsWith('tel:')) {
if(options.dynamicEvents.hasOwnProperty("automatic_event_tel_link")) {
var pixels = Object.keys(options.dynamicEvents.automatic_event_tel_link);
for(var i = 0;i 0) {
var isOverGoogleAd = false;
$(document)
.on('mouseover', 'ins > ins > iframe', function () {
isOverGoogleAd = true;
})
.on('mouseout', 'iframe', function () {
isOverGoogleAd = false;
});
$(window)
.on( "blur",function () {
if (isOverGoogleAd) {
$.each(options.triggerEventTypes, function (triggerType, events) {
$.each(events, function (eventId, triggers) {
switch (triggerType) {
case 'ad_sense_click':
Utils.fireTriggerEvent(eventId);
break;
}
});
});
}
})
.trigger("focus");
}
// page scroll event
if (options.dynamicEvents.hasOwnProperty("automatic_event_scroll")
) {
var singlePageScroll = function () {
var docHeight = $(document).height() - $(window).height();
var isFired = false;
if (options.dynamicEvents.hasOwnProperty("automatic_event_scroll")) {
var pixels = Object.keys(options.dynamicEvents.automatic_event_scroll);
for(var i = 0;i {
let form_id = $( event.target ).attr( 'data-formid' ),
sendEventId = null,
disabled_form_action = false,
form_submit_mode = 'both';
if ( options.triggerEventTypes.hasOwnProperty( 'wpforms' ) ) {
$.each( options.triggerEventTypes.wpforms, function ( eventId, triggers ) {
$.each( triggers, function ( index, trigger ) {
$.each( trigger.forms, function ( i, value ) {
if ( value == form_id ) {
sendEventId = eventId;
disabled_form_action = trigger.disabled_form_action;
form_submit_mode = trigger.form_submit_mode || 'both';
}
} )
} );
} );
}
if ( sendEventId != null && ( form_submit_mode === 'both' || form_submit_mode === 'ajax_only' ) ) {
Utils.fireTriggerEvent( sendEventId );
}
sendFormAction( $( event.target ), form_id, sendEventId, disabled_form_action, form_submit_mode );
} )
$( document ).on( 'frmFormComplete', function ( event, form, response ) {
const form_id = $( form ).find( 'input[name="form_id"]' ).val();
let sendEventId = null,
disabled_form_action = false,
form_submit_mode = 'both';
if ( options.triggerEventTypes.hasOwnProperty( 'formidable' ) ) {
$.each( options.triggerEventTypes.formidable, function ( eventId, triggers ) {
$.each( triggers, function ( index, trigger ) {
$.each( trigger.forms, function ( i, value ) {
if ( value == form_id ) {
disabled_form_action = trigger.disabled_form_action;
sendEventId = eventId;
form_submit_mode = trigger.form_submit_mode || 'both';
}
} )
} );
} );
}
if ( sendEventId != null && ( form_submit_mode === 'both' || form_submit_mode === 'ajax_only' ) ) {
Utils.fireTriggerEvent( sendEventId );
}
sendFormAction( $( event.target ), form_id, sendEventId, disabled_form_action, form_submit_mode );
} );
// Ninja Forms
$( document ).onFirst( 'nfFormSubmitResponse', function ( event, data ) {
const form_id = data.response.data.form_id;
let sendEventId = null,
disabled_form_action = false,
form_submit_mode = 'both';
if ( options.triggerEventTypes.hasOwnProperty( 'ninjaform' ) ) {
$.each( options.triggerEventTypes.ninjaform, function ( eventId, triggers ) {
$.each( triggers, function ( index, trigger ) {
$.each( trigger.forms, function ( i, value ) {
if ( value == form_id ) {
disabled_form_action = trigger.disabled_form_action;
sendEventId = eventId;
form_submit_mode = trigger.form_submit_mode || 'both';
}
} )
} );
} );
}
if ( sendEventId != null && ( form_submit_mode === 'both' || form_submit_mode === 'ajax_only' ) ) {
Utils.fireTriggerEvent( sendEventId );
}
sendFormAction( $( event.target ), form_id, sendEventId, disabled_form_action, form_submit_mode );
} );
$(document).on('fluentform_submission_success', function ( event, data ) {
if(!data || !data.form){
return;
}
let $form = data.form; // Submitted form
let config = data.config; // Form configuration
let response = data.response; // Server response
let $formItem = $form;
let form_id = config.id;
let sendEventId = null,
disabled_form_action = false,
form_submit_mode = 'both';
if ( options.triggerEventTypes.hasOwnProperty( 'fluentform' ) ) {
$.each( options.triggerEventTypes.fluentform, function ( eventId, triggers ) {
$.each( triggers, function ( index, trigger ) {
$.each( trigger.forms, function ( i, value ) {
if ( value == form_id ) {
disabled_form_action = trigger.disabled_form_action;
sendEventId = eventId;
form_submit_mode = trigger.form_submit_mode || 'both';
}
} )
} );
} );
}
if ( sendEventId != null && ( form_submit_mode === 'both' || form_submit_mode === 'ajax_only' ) ) {
Utils.fireTriggerEvent( sendEventId );
}
sendFormAction( $( event.target ), form_id, sendEventId, disabled_form_action, form_submit_mode );
} );
//WSForm
$( document ).on( 'wsf-submit-complete', ( event, form_object, form_id ) => {
let sendEventId = null,
disabled_form_action = false,
form_submit_mode = 'both';
if ( options.triggerEventTypes.hasOwnProperty( 'wsform' ) ) {
$.each( options.triggerEventTypes.wsform, function ( eventId, triggers ) {
$.each( triggers, function ( index, trigger ) {
$.each( trigger.forms, function ( i, value ) {
if ( value == form_id ) {
disabled_form_action = trigger.disabled_form_action;
sendEventId = eventId;
form_submit_mode = trigger.form_submit_mode || 'both';
}
} )
} );
} );
}
if ( sendEventId != null && ( form_submit_mode === 'both' || form_submit_mode === 'ajax_only' ) ) {
Utils.fireTriggerEvent( sendEventId );
}
sendFormAction( $( event.target ), form_id, sendEventId, disabled_form_action, form_submit_mode );
} )
// Elementor Forms
let forms = document.querySelectorAll( '.elementor-form' );
// Apply the observer to each form
forms.forEach( function ( form ) {
observeElementorForm( form );
} );
// watching Elementor Popup forms
let observer = new MutationObserver( function ( mutationsList, observer ) {
for ( let i = 0; i < mutationsList.length; i++ ) {
let popupForm = document.querySelector( '[class*="elementor-popup"] form' );
if ( popupForm ) {
observeElementorForm( popupForm );
observer.disconnect();
break;
}
}
} );
observer.observe( document.body, { childList: true, subtree: true } );
// load pixel APIs
Utils.loadPixels();
// setup Enrich content
if(Utils.isCheckoutPage()) {
Utils.addCheckoutFields();
}
if(options.woo.hasOwnProperty('woo_view_content_variation_is_selected') && options.woo.woo_view_content_variation_is_selected) {
handleWooViewContentVariation()
}
});
function handleWooViewContentVariation() {
var form = $('form.variations_form');
form.on('change', 'select', function() {
var selectedAttributes = {};
form.find('select').each(function() {
var attributeName = $(this).data('attribute_name') || $(this).attr('name');
var attributeValue = $(this).val();
if (attributeValue) {
selectedAttributes[attributeName] = attributeValue;
}
});
$.ajax({
url: options.ajaxUrl,
type: 'POST',
data: {
action: 'get_variation_info',
product_id: form.data('product_id'), // Передаем ID основного товара
attributes: selectedAttributes
},
success: function(response) {
if (response.success) {
$.each(response.data, function(slug) {
$.each(response.data[slug], function(index, event) {
event.isVariationTrigger = true;
getPixelBySlag(slug).fireEvent(event.name, event);
});
});
} else {
console.log('Error retrieving data:', response.data);
}
}
});
});
}
var sendFormAction = function (form_target, formId, customEventId = null, disabled = false, form_submit_mode = 'both'){
// Check submit mode - skip automatic event if reload_only
if (disabled == true || form_submit_mode === 'reload_only' ) {
return;
}
var params = {
form_id: formId,
text: form_target.find('[type="submit"]').is('input') ? form_target.find('[type="submit"]').val() :
form_target.find('.forminator-button-submit').text() != '' ? form_target.find('.forminator-button-submit').text() :
form_target.find('[type="submit"]').text()
};
if (options.dynamicEvents.hasOwnProperty("automatic_event_form")) {
var pixels = Object.keys(options.dynamicEvents.automatic_event_form);
for (var i = 0; i < pixels.length; i++) {
if ( disabled && customEventId && typeof options.triggerEvents[customEventId][pixels[i]] !== 'undefined') {
continue;
}
var event = options.dynamicEvents.automatic_event_form[pixels[i]];
if (pixels[i] === "tiktok" || pixels[i] === "reddit") {
getPixelBySlag(pixels[i]).fireEvent(event.name, event);
} else {
Utils.copyProperties(params, event.params)
Utils.copyProperties(Utils.getRequestParams(), event.params);
getPixelBySlag(pixels[i]).onFormEvent(event);
}
}
}
}
var setupEmailLinks = function ( disabled_for_pixels = [] ) {
if ( options.dynamicEvents.hasOwnProperty( "automatic_event_email_link" ) ) {
var pixels = Object.keys( options.dynamicEvents.automatic_event_email_link );
for ( var i = 0; i < pixels.length; i++ ) {
if ( disabled_for_pixels.indexOf(pixels[ i ]) === -1 ) {
var event = Utils.clone( options.dynamicEvents.automatic_event_email_link[ pixels[ i ] ] );
if ( pixels[ i ] !== 'tiktok' && pixels[ i ] !== 'reddit' ) {
Utils.copyProperties( Utils.getRequestParams(), event.params );
}
getPixelBySlag( pixels[ i ] ).fireEvent( event.name, event );
}
}
}
}
//Elementor Forms Observer
var observeElementorForm = function ( form ) {
let observer = new MutationObserver( function ( mutations ) {
for ( let i = 0; i < mutations.length; i++ ) {
let mutation = mutations[ i ];
if ( mutation.type === 'childList' || mutation.type === 'attributes' ) {
if ( $( form ).find( '.elementor-message-success' ).length > 0 ) {
let form_id = $( form ).attr( 'id' );
if ( !form_id ) {
form_id = $( form ).find( 'input[name="form_id"]' ).val();
}
let sendEventId = null,
disabled_form_action = false,
form_submit_mode = 'both';
if ( options.triggerEventTypes.hasOwnProperty( 'elementor_form' ) ) {
$.each( options.triggerEventTypes.elementor_form, function ( eventId, triggers ) {
$.each( triggers, function ( index, trigger ) {
$.each( trigger.forms, function ( i, value ) {
if ( value == form_id ) {
disabled_form_action = trigger.disabled_form_action;
sendEventId = eventId;
form_submit_mode = trigger.form_submit_mode || 'both';
}
})
} );
} );
}
if ( sendEventId != null && ( form_submit_mode === 'both' || form_submit_mode === 'ajax_only' ) ) {
Utils.fireTriggerEvent( sendEventId );
}
sendFormAction( $( event.target ), form_id, sendEventId, disabled_form_action, form_submit_mode );
observer.disconnect();
break;
}
}
}
} );
// Start observing the form for changes
observer.observe( form, {
attributes: true,
childList: true,
subtree: true
} );
}
}(jQuery, pysOptions);
function pys_generate_token() {
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
}
function getBundlePriceOnSingleProduct(data) {
var items_sum = 0;
jQuery(".bundle_form .bundled_product").each(function(index){
var id = jQuery(this).find(".cart").data("bundled_item_id");
var item_price = data.prices[id];
var item_quantity = jQuery(this).find(".bundled_qty").val();
if(!jQuery(this).hasClass("bundled_item_optional") ||
jQuery(this).find(".bundled_product_optional_checkbox input").prop('checked')) {
items_sum += item_price*item_quantity;
}
});
return items_sum;
}
function getUrlParameter(sParam) {
var sPageURL = window.location.search.substring(1),
sURLVariables = sPageURL.split('&'),
sParameterName,
i;
for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] === sParam) {
return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
}
}
return false;
};
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
function getCookieYes(key) {
const cookiesObj = document.cookie
.split(";")
.reduce((ac, cv) => {
const [k, v] = cv.split("=");
if (k && v) ac[k.trim()] = v;
return ac;
}, {});
const consentCookie = cookiesObj["cookieyes-consent"] || cookiesObj["wt_consent"];
if (!consentCookie) return undefined;
const { [key]: value } = consentCookie
.split(",")
.reduce((obj, pair) => {
const [k, v] = pair.split(":");
if (k && v) obj[k] = v;
return obj;
}, {});
return value;
}
function getRootDomain(useSubdomain = false) {
const hostname = window.location.hostname; // Get the current hostname
// Check if tldjs is defined before using it
if (typeof tldjs === "undefined") {
console.warn("tldjs is not defined");
return hostname; // Return hostname as a fallback
}
const rootDomain = tldjs.getDomain(hostname); // Use tldjs to extract the root domain
// Return the root domain with or without a leading dot based on useSubdomain
return rootDomain ? (useSubdomain ? '.' + rootDomain : rootDomain) : hostname;
};
// source --> https://www.golden-a.gr/wp-content/themes/woodmart/js/libs/device.min.js?ver=8.4.1
!function(s){var n,i="",r=(screen.width&&(width=screen.width||"",height=screen.height||"",i+=width+" x "+height),navigator.appVersion),e=navigator.userAgent,o=navigator.appName,a=""+parseFloat(navigator.appVersion),d=parseInt(navigator.appVersion,10),t=(-1!=(t=e.indexOf("Opera"))&&(o="Opera",a=e.substring(t+6),-1!=(t=e.indexOf("Version")))&&(a=e.substring(t+8)),-1!=(t=e.indexOf("OPR"))?(o="Opera",a=e.substring(t+4)):-1!=(t=e.indexOf("Edge"))?(o="Edge",a=e.substring(t+5)):-1!=(t=e.indexOf("Edg"))?(o="Microsoft Edge",a=e.substring(t+4)):-1!=(t=e.indexOf("MSIE"))?(o="Internet",a=e.substring(t+5)):-1!=(t=e.indexOf("Chrome"))?(o="Chrome",a=e.substring(t+7)):-1!=(t=e.indexOf("Safari"))?(o="Safari",a=e.substring(t+7),-1!=(t=e.indexOf("Version"))&&(a=e.substring(t+8))):-1!=(t=e.indexOf("Firefox"))?(o="Firefox",a=e.substring(t+8)):-1!=e.indexOf("Trident/")?(o="Internet",a=e.substring(e.indexOf("rv:")+3)):(f=e.lastIndexOf(" ")+1)<(t=e.lastIndexOf("/"))&&(o=e.substring(f,t),a=e.substring(t+1),o.toLowerCase()==o.toUpperCase())&&(o=navigator.appName),-1!=(f=(a=-1!=(f=(a=-1!=(f=a.indexOf(";"))?a.substring(0,f):a).indexOf(" "))?a.substring(0,f):a).indexOf(")"))&&(a=a.substring(0,f)),d=parseInt(""+a,10),isNaN(d)&&(a=""+parseFloat(navigator.appVersion),d=parseInt(navigator.appVersion,10)),/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(r)),w="-",O=[{s:"Windows 10",r:/(Windows 10.0|Windows NT 10.0)/},{s:"Windows 8.1",r:/(Windows 8.1|Windows NT 6.3)/},{s:"Windows 8",r:/(Windows 8|Windows NT 6.2)/},{s:"Windows 7",r:/(Windows 7|Windows NT 6.1)/},{s:"Windows Vista",r:/Windows NT 6.0/},{s:"Windows Server 2003",r:/Windows NT 5.2/},{s:"Windows XP",r:/(Windows NT 5.1|Windows XP)/},{s:"Windows 2000",r:/(Windows NT 5.0|Windows 2000)/},{s:"Windows ME",r:/(Win 9x 4.90|Windows ME)/},{s:"Windows 98",r:/(Windows 98|Win98)/},{s:"Windows 95",r:/(Windows 95|Win95|Windows_95)/},{s:"Windows NT 4.0",r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},{s:"Windows CE",r:/Windows CE/},{s:"Windows 3.11",r:/Win16/},{s:"Android",r:/Android/},{s:"Open BSD",r:/OpenBSD/},{s:"Sun OS",r:/SunOS/},{s:"Chrome OS",r:/CrOS/},{s:"Linux",r:/(Linux|X11(?!.*CrOS))/},{s:"iOS",r:/(iPhone|iPad|iPod)/},{s:"Mac OS X",r:/Mac OS X/},{s:"Mac OS",r:/(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},{s:"QNX",r:/QNX/},{s:"UNIX",r:/UNIX/},{s:"BeOS",r:/BeOS/},{s:"OS/2",r:/OS\/2/},{s:"Search Bot",r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}];for(n in O){var W=O[n];if(W.r.test(e)){w=W.s;break}}var c="-";switch(/Windows/.test(w)&&(c=/Windows (.*)/.exec(w)[1],w="Windows"),w){case"Mac OS":case"Mac OS X":case"Android":c=/(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\.\_\d]+)/.exec(e)[1];break;case"iOS":c=(c=/OS (\d+)_(\d+)_?(\d+)?/.exec(r))[1]+"."+c[2]+"."+(0|c[3])}var g,f="no check";"undefined"!=typeof swfobject&&(f=0<(g=swfobject.getFlashPlayerVersion()).major?g.major+"."+g.minor+" r"+g.release:"-"),s.jscd={screen:i,browser:o,browserVersion:a,browserMajorVersion:d,mobile:t,os:w,osVersion:c,flashVersion:f}}(this),function(){var s=jQuery("html");s.addClass("browser-"+jscd.browser.replaceAll(" ","-")),s.addClass("platform-"+jscd.os)}();
// source --> https://www.golden-a.gr/wp-content/themes/woodmart/js/scripts/global/scrollBar.min.js?ver=8.4.1
const htmlElement=document.getElementsByTagName("html")[0],windowWidth=window.innerWidth,userAgent=navigator.userAgent;let shouldCalculateScrollbar=1024htmlElement.offsetWidth;if(userAgent.includes("Chrome")){const a=userAgent.match(/Chrome\/(\d+)/);if(a){const b=parseInt(a[1],10);145<=b&&(shouldCalculateScrollbar=!1)}}if(shouldCalculateScrollbar){const c=window.innerWidth-htmlElement.offsetWidth,d=document.createElement("style");d.textContent=`:root {--wd-scroll-w: ${c}px;}`,document.head.appendChild(d)};